This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[inseparable changes from patch from perl5.003_10 to perl5.003_11]
authorPerl 5 Porters <perl5-porters@africa.nicoh.com>
Fri, 6 Dec 1996 06:56:00 +0000 (18:56 +1200)
committerChip Salzenberg <chip@atlantic.net>
Fri, 6 Dec 1996 06:56:00 +0000 (18:56 +1200)
 CORE LANGUAGE CHANGES

Subject: Fix precedence problems with subs as uniops or listops
From: Chip Salzenberg <chip@atlantic.net>
Files: perly.c perly.c.diff perly.h perly.y

Subject: Don't reset $. on open()
From: Chip Salzenberg <chip@atlantic.net>
Files: pp_sys.c

Subject: Support *glob{IO} (eventually deprecate *glob{FILEHANDLE})
From: Chip Salzenberg <chip@atlantic.net>
Files: pod/perlref.pod pp_hot.c sv.c

Subject: Don't let expression context force return context
From: Chip Salzenberg <chip@atlantic.net>
Files: op.c

Subject: Properly convert "1E2" et al to IV/UV
From: Chip Salzenberg <chip@atlantic.net>
Files: doio.c sv.c

Subject: Fix modulo operator in UV realm
From: Chip Salzenberg <chip@atlantic.net>
Files: pp.c

Subject: Fix stat(_) after stat(HANDLE)
From: Chip Salzenberg <chip@atlantic.net>
Files: pp_sys.c

Subject: Fix: s/// and "$x =~ $y" under 'use locale'
From: Chip Salzenberg <chip@atlantic.net>
Files: op.c toke.c

 LIBRARY AND EXTENSIONS

Subject: {in,ob}structive pods
Date: Sat, 30 Nov 1996 09:52:57 -0700
From: Tom Christiansen <tchrist@mox.perl.com>
Files: MANIFEST lib/Class/Template.pm lib/File/stat.pm lib/Net/hostent.pm lib/Net/netent.pm lib/Net/protoent.pm lib/Net/servent.pm lib/Time/gmtime.pm lib/Time/localtime.pm lib/Time/tm.pm lib/User/grent.pm lib/User/pwent.pm

    These "should" be ready for inclusion in 5.004, although I'd like to
    update Class::Template's doc for legibility.  Dean, may we please have
    your permission to include this in the distribution?

    (I did look a bit into using Class::MethodMaker, but it seemed
    a bit complicated.)

    I know: these all look remarkably similar on the inside.  I keep trying
    to find a way to abstract out some of it.  Hopefully, they're reasonably
    legible at least in code, if not in docs. :-)

    Chip/Tim, please check the stat function for proper use of Symbol.

    thanks,

    --tom

    #!/bin/sh
    # This is a shell archive (produced by GNU sharutils 4.2).
    # To extract the files from this archive, save it to some FILE, remove
    # everything before the `!/bin/sh' line above, then type `sh FILE'.
    #
    # Made on 1996-11-30 09:52 MST by <tchrist@toy.perl.com>.
    # Source directory was `/home/tchrist/hack'.
    #
    # Existing files will *not* be overwritten unless `-c' is specified.
    #
    # This shar contains:
    # length mode       name
    # ------ ---------- ------------------------------------------
    #   5024 -rw-r--r-- obstructs/Class/Template.pm
    #   2782 -rw-r--r-- obstructs/File/stat.pm
    #   3961 -rw-r--r-- obstructs/Net/hostent.pm
    #   4435 -rw-r--r-- obstructs/Net/netent.pm
    #   2973 -rw-r--r-- obstructs/Net/protoent.pm
    #   3424 -rw-r--r-- obstructs/Net/servent.pm
    #   2476 -rw-r--r-- obstructs/Time/gmtime.pm
    #   2307 -rw-r--r-- obstructs/Time/localtime.pm
    #    622 -rw-r--r-- obstructs/Time/tm.pm
    #   2848 -rw-r--r-- obstructs/User/grent.pm
    #   2899 -rw-r--r-- obstructs/User/pwent.pm
    #
    save_IFS="${IFS}"
    IFS="${IFS}:"
    gettext_dir=FAILED
    locale_dir=FAILED
    first_param="$1"
    for dir in $PATH
    do
      if test "$gettext_dir" = FAILED && test -f $dir/gettext \
         && ($dir/gettext --version >/dev/null 2>&1)
      then
        set `$dir/gettext --version 2>&1`
        if test "$3" = GNU
        then
          gettext_dir=$dir
        fi
      fi
      if test "$locale_dir" = FAILED && test -f $dir/shar \
         && ($dir/shar --print-text-domain-dir >/dev/null 2>&1)
      then
        locale_dir=`$dir/shar --print-text-domain-dir`
      fi
    done
    IFS="$save_IFS"
    if test "$locale_dir" = FAILED || test "$gettext_dir" = FAILED
    then
      echo=echo
    else
      TEXTDOMAINDIR=$locale_dir
      export TEXTDOMAINDIR
      TEXTDOMAIN=sharutils
      export TEXTDOMAIN
      echo="$gettext_dir/gettext -s"
    fi
    touch -am 1231235999 $$.touch >/dev/null 2>&1
    if test ! -f 1231235999 && test -f $$.touch; then
      shar_touch=touch
    else
      shar_touch=:
      echo
      $echo 'WARNING: not restoring timestamps.  Consider getting and'
      $echo "installing GNU \`touch', distributed in GNU File Utilities..."
      echo
    fi
    rm -f 1231235999 $$.touch
    #
    if mkdir _sh24166; then
      $echo 'x -' 'creating lock directory'
    else
      $echo 'failed to create lock directory'
      exit 1
    fi
    # ============= obstructs/Class/Template.pm ==============
    if test ! -d 'obstructs'; then
      $echo 'x -' 'creating directory' 'obstructs'
      mkdir 'obstructs'
    fi
    if test ! -d 'obstructs/Class'; then
      $echo 'x -' 'creating directory' 'obstructs/Class'
      mkdir 'obstructs/Class'
    fi
    if test -f 'obstructs/Class/Template.pm' && test "$first_param" != -c; then
      $echo 'x -' SKIPPING 'obstructs/Class/Template.pm' '(file already exists)'
    else
      $echo 'x -' extracting 'obstructs/Class/Template.pm' '(text)'
      sed 's/^X//' << 'SHAR_EOF' > 'obstructs/Class/Template.pm' &&
    package Class::Template;
    require 5.000;
    require Exporter;
    X
    @ISA = qw(Exporter);
    @EXPORT = qw(members struct);
    use strict;
    X
    # Template.pm   --- struct/member template builder
    #   12mar95
    #   Dean Roehrich
    #
    # changes/bugs fixed since 28nov94 version:
    #  - podified
    # changes/bugs fixed since 21nov94 version:
    #  - Fixed examples.
    # changes/bugs fixed since 02sep94 version:
    #  - Moved to Class::Template.
    # changes/bugs fixed since 20feb94 version:
    #  - Updated to be a more proper module.
    #  - Added "use strict".
    #  - Bug in build_methods, was using @var when @$var needed.
    #  - Now using my() rather than local().
    #
    # Uses perl5 classes to create nested data types.
    # This is offered as one implementation of Tom Christiansen's "structs.pl"
    # idea.
    X
    =head1 NAME
    X
    Class::Template - struct/member template builder
    X
    =head1 EXAMPLES
    X
    =item * Example 1
    X
    X use Class::Template;
    X
    X struct( rusage => {
    X ru_utime => timeval,
    X ru_stime => timeval,
    X });
    X
    X struct( timeval => [
    X tv_secs  => '$',
    X tv_usecs => '$',
    X ]);
    X
    X my $s = new rusage;
    X
    =item * Example 2
    X
    X package OBJ;
    X use Class::Template;
    X
    X members OBJ {
    X 'a' => '$',
    X 'b' => '$',
    X };
    X
    X members OBJ2 {
    X 'd' => '@',
    X 'c' => '$',
    X };
    X
    X package OBJ2; @ISA = (OBJ);
    X
    X sub new {
    X my $r = InitMembers( &OBJ::InitMembers() );
    X bless $r;
    X }
    X
    =head1 NOTES
    X
    Use '%' if the member should point to an anonymous hash.  Use '@' if the
    member should point to an anonymous array.
    X
    When using % and @ the method requires one argument for the key or index
    into the hash or array.
    X
    Prefix the %, @, or $ with '*' to indicate you want to retrieve pointers to
    the values rather than the values themselves.
    X
    =cut
    X
    Var: {
    X $Class::Template::print = 0;
    X sub printem { $Class::Template::print++ }
    }
    X
    X
    sub struct {
    X my( $struct, $ref ) = @_;
    X my @methods = ();
    X my %refs = ();
    X my %arrays = ();
    X my %hashes = ();
    X my $out = '';
    X
    X $out = "{\n  package $struct;\n  sub new {\n";
    X parse_fields( $ref, \$out, \@methods, \%refs, \%arrays, \%hashes, 0 );
    X $out .= "      bless \$r;\n  }\n";
    X build_methods( $ref, \$out, \@methods, \%refs, \%arrays, \%hashes );
    X $out .= "}\n1;\n";
    X
    X ( $Class::Template::print ) ? print( $out ) : eval $out;
    }
    X
    sub members {
    X my( $pkg, $ref ) = @_;
    X my @methods = ();
    X my %refs = ();
    X my %arrays = ();
    X my %hashes = ();
    X my $out = '';
    X
    X $out = "{\n  package $pkg;\n  sub InitMembers {\n";
    X parse_fields( $ref, \$out, \@methods, \%refs, \%arrays, \%hashes, 1 );
    X $out .= "      bless \$r;\n  }\n";
    X build_methods( $ref, \$out, \@methods, \%refs, \%arrays, \%hashes );
    X $out .= "}\n1;\n";
    X
    X ( $Class::Template::print ) ? print( $out ) : eval $out;
    }
    X
    X
    sub parse_fields {
    X my( $ref, $out, $methods, $refs, $arrays, $hashes, $member ) = @_;
    X my $type = ref $ref;
    X my @keys;
    X my $val;
    X my $cnt = 0;
    X my $idx = 0;
    X my( $cmt, $n );
    X
    X if( $type eq 'HASH' ){
    X if( $member ){
    X $$out .= "      my(\$r) = \@_ ? shift : {};\n";
    X }
    X else{
    X $$out .= "      my(\$r) = {};\n";
    X }
    X @keys = keys %$ref;
    X foreach (@keys){
    X $val = $ref->{$_};
    X if( $val =~ /^\*(.)/ ){
    X $refs->{$_}++;
    X $val = $1;
    X }
    X if( $val eq '@' ){
    X $$out .= "      \$r->{'$_'} = [];\n";
    X $arrays->{$_}++;
    X }
    X elsif( $val eq '%' ){
    X $$out .= "      \$r->{'$_'} = {};\n";
    X $hashes->{$_}++;
    X }
    X elsif( $val ne '$' ){
    X $$out .= "      \$r->{'$_'} = \&${val}::new();\n";
    X }
    X else{
    X $$out .= "      \$r->{'$_'} = undef;\n";
    X }
    X push( @$methods, $_ );
    X }
    X }
    X elsif( $type eq 'ARRAY' ){
    X if( $member ){
    X $$out .= "      my(\$r) = \@_ ? shift : [];\n";
    X }
    X else{
    X $$out .= "      my(\$r) = [];\n";
    X }
    X while( $idx < @$ref ){
    X $n = $ref->[$idx];
    X push( @$methods, $n );
    X $val = $ref->[$idx+1];
    X $cmt = "# $n";
    X if( $val =~ /^\*(.)/ ){
    X $refs->{$n}++;
    X $val = $1;
    X }
    X if( $val eq '@' ){
    X $$out .= "      \$r->[$cnt] = []; $cmt\n";
    X $arrays->{$n}++;
    X }
    X elsif( $val eq '%' ){
    X $$out .= "      \$r->[$cnt] = {}; $cmt\n";
    X $hashes->{$n}++;
    X }
    X elsif( $val ne '$' ){
    X $$out .= "      \$r->[$cnt] = \&${val}::new();\n";
    X }
    X else{
    X $$out .= "      \$r->[$cnt] = undef; $cmt\n";
    X }
    X ++$cnt;
    X $idx += 2;
    X }
    X }
    }
    X
    X
    sub build_methods {
    X my( $ref, $out, $methods, $refs, $arrays, $hashes ) = @_;
    X my $type = ref $ref;
    X my $elem = '';
    X my $cnt = 0;
    X my( $pre, $pst, $cmt, $idx );
    X
    X foreach (@$methods){
    X $pre = $pst = $cmt = $idx = '';
    X if( defined $refs->{$_} ){
    X $pre = "\\(";
    X $pst = ")";
    X $cmt = " # returns ref";
    X }
    X $$out .= "  sub $_ {$cmt\n      my \$r = shift;\n";
    X if( $type eq 'ARRAY' ){
    X $elem = "[$cnt]";
    X ++$cnt;
    X }
    X elsif( $type eq 'HASH' ){
    X $elem = "{'$_'}";
    X }
    X if( defined $arrays->{$_} ){
    X $$out .= "      my \$i;\n";
    X $$out .= "      \@_ ? (\$i = shift) : return \$r->$elem;\n";
    X $idx = "->[\$i]";
    X }
    X elsif( defined $hashes->{$_} ){
    X $$out .= "      my \$i;\n";
    X $$out .= "      \@_ ? (\$i = shift) : return \$r->$elem;\n";
    X $idx = "->{\$i}";
    X }
    X $$out .= "      \@_ ? (\$r->$elem$idx = shift) : $pre\$r->$elem$idx$pst;\n";
    X $$out .= "  }\n";
    X }
    }
    X
    1;
    SHAR_EOF
      $shar_touch -am 1108060296 'obstructs/Class/Template.pm' &&
      chmod 0644 'obstructs/Class/Template.pm' ||
      $echo 'restore of' 'obstructs/Class/Template.pm' 'failed'
      if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
      && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
        md5sum -c << SHAR_EOF >/dev/null 2>&1 \
        || $echo 'obstructs/Class/Template.pm:' 'MD5 check failed'
    4ccfb1ef6cb0ef795d19325556a78797  obstructs/Class/Template.pm
    SHAR_EOF
      else
        shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'obstructs/Class/Template.pm'`"
        test 5024 -eq "$shar_count" ||
        $echo 'obstructs/Class/Template.pm:' 'original size' '5024,' 'current size' "$shar_count!"
      fi
    fi
    # ============= obstructs/File/stat.pm ==============
    if test ! -d 'obstructs/File'; then
      $echo 'x -' 'creating directory' 'obstructs/File'
      mkdir 'obstructs/File'
    fi
    if test -f 'obstructs/File/stat.pm' && test "$first_param" != -c; then
      $echo 'x -' SKIPPING 'obstructs/File/stat.pm' '(file already exists)'
    else
      $echo 'x -' extracting 'obstructs/File/stat.pm' '(text)'
      sed 's/^X//' << 'SHAR_EOF' > 'obstructs/File/stat.pm' &&
    package File::stat;
    use strict;
    X
    BEGIN {
    X    use Exporter   ();
    X    use vars       qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
    X    @ISA         = qw(Exporter);
    X    @EXPORT      = qw(stat lstat);
    X    @EXPORT_OK   = qw( $st_dev    $st_ino    $st_mode
    X        $st_nlink   $st_uid    $st_gid
    X        $st_rdev    $st_size
    X        $st_atime   $st_mtime  $st_ctime
    X        $st_blksize $st_blocks
    X     );
    X    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
    }
    use vars      @EXPORT_OK;
    X
    use Class::Template qw(struct);
    struct 'File::stat' => [
    X     map { $_ => '$' } qw{
    X  dev ino mode nlink uid gid rdev size
    X  atime mtime ctime blksize blocks
    X     }
    ];
    X
    sub populate (@) {
    X    return unless @_;
    X    my $stob = new();
    X    @$stob = (
    X $st_dev, $st_ino, $st_mode, $st_nlink, $st_uid, $st_gid, $st_rdev,
    X        $st_size, $st_atime, $st_mtime, $st_ctime, $st_blksize, $st_blocks )
    X     = @_;
    X    return $stob;
    }
    X
    sub lstat (*)  { populate(CORE::lstat(shift)) }
    X
    sub stat ($) {
    X    my $arg = shift;
    X    my $st = populate(CORE::stat $arg);
    X    return $st if $st;
    X    no strict 'refs';
    X    require Symbol;
    X    return populate(CORE::stat \*{Symbol::qualify($arg)});
    }
    X
    1;
    __END__
    X
    =head1 NAME
    X
    File::stat.pm - by-name interface to Perl's built-in stat() functions
    X
    =head1 SYNOPSIS
    X
    X use File::stat;
    X $st = stat($file) or die "No $file: $!";
    X if ( ($st->mode & 0111) && $st->nlink > 1) ) {
    X     print "$file is executable with lotsa links\n";
    X }
    X
    X use File::stat qw(:FIELDS);
    X stat($file) or die "No $file: $!";
    X if ( ($st_mode & 0111) && $st_nlink > 1) ) {
    X     print "$file is executable with lotsa links\n";
    X }
    X
    =head1 DESCRIPTION
    X
    This module's default exports override the core stat()
    and lstat() functions, replacing them with versions that return
    "File::stat" objects.  This object has methods that
    return the similarly named structure field name from the
    stat(2) function; namely,
    dev,
    ino,
    mode,
    nlink,
    uid,
    gid,
    rdev,
    size,
    atime,
    mtime,
    ctime,
    blksize,
    and
    blocks.
    X
    You may also import all the structure fields directly into your namespace
    as regular variables using the :FIELDS import tag.  (Note that this still
    overrides your stat() and lstat() functions.)  Access these fields as
    variables named with a preceding C<st_> in front their method names.
    Thus, C<$stat_obj-E<gt>dev()> corresponds to $st_dev if you import
    the fields.
    X
    To access this functionality without the core overrides,
    pass the C<use> an empty import list, and then access
    function functions with their full qualified names.
    On the other hand, the built-ins are still available
    via the C<CORE::> pseudo-package.
    X
    =head1 NOTE
    X
    While this class is currently implemented using the Class::Template
    module to build a struct-like class, you shouldn't rely upon this.
    X
    =head1 AUTHOR
    X
    Tom Christiansen
    SHAR_EOF
      $shar_touch -am 1129130296 'obstructs/File/stat.pm' &&
      chmod 0644 'obstructs/File/stat.pm' ||
      $echo 'restore of' 'obstructs/File/stat.pm' 'failed'
      if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
      && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
        md5sum -c << SHAR_EOF >/dev/null 2>&1 \
        || $echo 'obstructs/File/stat.pm:' 'MD5 check failed'
    4d121fbb2e918b7f35c2b6fa2df6ffed  obstructs/File/stat.pm
    SHAR_EOF
      else
        shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'obstructs/File/stat.pm'`"
        test 2782 -eq "$shar_count" ||
        $echo 'obstructs/File/stat.pm:' 'original size' '2782,' 'current size' "$shar_count!"
      fi
    fi
    # ============= obstructs/Net/hostent.pm ==============
    if test ! -d 'obstructs/Net'; then
      $echo 'x -' 'creating directory' 'obstructs/Net'
      mkdir 'obstructs/Net'
    fi
    if test -f 'obstructs/Net/hostent.pm' && test "$first_param" != -c; then
      $echo 'x -' SKIPPING 'obstructs/Net/hostent.pm' '(file already exists)'
    else
      $echo 'x -' extracting 'obstructs/Net/hostent.pm' '(text)'
      sed 's/^X//' << 'SHAR_EOF' > 'obstructs/Net/hostent.pm' &&
    package Net::hostent;
    use strict;
    X
    BEGIN {
    X    use Exporter   ();
    X    use vars       qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
    X    @ISA         = qw(Exporter);
    X    @EXPORT      = qw(gethostbyname gethostbyaddr gethost);
    X    @EXPORT_OK   = qw(
    X $h_name      @h_aliases
    X $h_addrtype  $h_length
    X @h_addr_list  $h_addr
    X    );
    X    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
    }
    use vars      @EXPORT_OK;
    X
    use Class::Template qw(struct);
    struct 'Net::hostent' => [
    X   name => '$',
    X   aliases => '@',
    X   addrtype => '$',
    X   'length' => '$',
    X   addr_list => '@',
    ];
    X
    sub addr { shift->addr_list->[0] }
    X
    sub populate (@) {
    X    return unless @_;
    X    my $hob = new();
    X    $h_name   =    $hob->[0]           = $_[0];
    X    @h_aliases  = @{ $hob->[1] } = split ' ', $_[1];
    X    $h_addrtype  =    $hob->[2]       = $_[2];
    X    $h_length  =    $hob->[3]       = $_[3];
    X    $h_addr   =                             $_[4];
    X    @h_addr_list = @{ $hob->[4] } =          @_[ (4 .. $#_) ];
    X    return $hob;
    }
    X
    sub gethostbyname ($)  { populate(CORE::gethostbyname(shift)) }
    X
    sub gethostbyaddr ($;$) {
    X    my ($addr, $addrtype);
    X    $addr = shift;
    X    require Socket unless @_;
    X    $addrtype = @_ ? shift : Socket::AF_INET();
    X    populate(CORE::gethostbyaddr($addr, $addrtype))
    }
    X
    sub gethost($) {
    X    if ($_[0] =~ /^\d+(?:\.\d+(?:\.\d+(?:\.\d+)?)?)?$/) {
    X require Socket;
    X &gethostbyaddr(Socket::inet_aton(shift));
    X    } else {
    X &gethostbyname;
    X    }
    }
    X
    1;
    __END__
    X
    =head1 NAME
    X
    Net::hostent - by-name interface to Perl's built-in gethost*() functions
    X
    =head1 SYNOPSIS
    X
    X use Net::hostnet;
    X
    =head1 DESCRIPTION
    X
    This module's default exports override the core gethostbyname() and
    gethostbyaddr() functions, replacing them with versions that return
    "Net::hostent" objects.  This object has methods that return the similarly
    named structure field name from the C's hostent structure from F<netdb.h>;
    namely name, aliases, addrtype, length, and addresses.  The aliases and
    addresses methods return array reference, the rest scalars.  The addr
    method is equivalent to the zeroth element in the addresses array
    reference.
    X
    You may also import all the structure fields directly into your namespace
    as regular variables using the :FIELDS import tag.  (Note that this still
    overrides your core functions.)  Access these fields as variables named
    with a preceding C<h_>.  Thus, C<$host_obj-E<gt>name()> corresponds to
    $h_name if you import the fields.  Array references are available as
    regular array variables, so for example C<@{ $host_obj-E<gt>aliases()
    }> would be simply @h_aliases.
    X
    The gethost() funtion is a simple front-end that forwards a numeric
    argument to gethostbyaddr() by way of Socket::inet_aton, and the rest
    to gethostbyname().
    X
    To access this functionality without the core overrides,
    pass the C<use> an empty import list, and then access
    function functions with their full qualified names.
    On the other hand, the built-ins are still available
    via the C<CORE::> pseudo-package.
    X
    =head1 EXAMPLES
    X
    X use Net::hostent;
    X use Socket;
    X
    X @ARGV = ('netscape.com') unless @ARGV;
    X
    X for $host ( @ARGV ) {
    X
    X    unless ($h = gethost($host)) {
    X warn "$0: no such host: $host\n";
    X next;
    X    }
    X
    X    printf "\n%s is %s%s\n",
    X     $host,
    X     lc($h->name) eq lc($host) ? "" : "*really* ",
    X     $h->name;
    X
    X    print "\taliases are ", join(", ", @{$h->aliases}), "\n"
    X if @{$h->aliases};
    X
    X    if ( @{$h->addr_list} > 1 ) {
    X my $i;
    X for $addr ( @{$h->addr_list} ) {
    X     printf "\taddr #%d is [%s]\n", $i++, inet_ntoa($addr);
    X }
    X    } else {
    X printf "\taddress is [%s]\n", inet_ntoa($h->addr);
    X    }
    X
    X    if ($h = gethostbyaddr($h->addr)) {
    X if (lc($h->name) ne lc($host)) {
    X     printf "\tThat addr reverses to host %s!\n", $h->name;
    X     $host = $h->name;
    X     redo;
    X }
    X    }
    X }
    X
    =head1 NOTE
    X
    While this class is currently implemented using the Class::Template
    module to build a struct-like class, you shouldn't rely upon this.
    X
    =head1 AUTHOR
    X
    Tom Christiansen
    SHAR_EOF
      $shar_touch -am 1129133896 'obstructs/Net/hostent.pm' &&
      chmod 0644 'obstructs/Net/hostent.pm' ||
      $echo 'restore of' 'obstructs/Net/hostent.pm' 'failed'
      if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
      && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
        md5sum -c << SHAR_EOF >/dev/null 2>&1 \
        || $echo 'obstructs/Net/hostent.pm:' 'MD5 check failed'
    27e11c684fe0e621da0109fa7ecef0d9  obstructs/Net/hostent.pm
    SHAR_EOF
      else
        shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'obstructs/Net/hostent.pm'`"
        test 3961 -eq "$shar_count" ||
        $echo 'obstructs/Net/hostent.pm:' 'original size' '3961,' 'current size' "$shar_count!"
      fi
    fi
    # ============= obstructs/Net/netent.pm ==============
    if test -f 'obstructs/Net/netent.pm' && test "$first_param" != -c; then
      $echo 'x -' SKIPPING 'obstructs/Net/netent.pm' '(file already exists)'
    else
      $echo 'x -' extracting 'obstructs/Net/netent.pm' '(text)'
      sed 's/^X//' << 'SHAR_EOF' > 'obstructs/Net/netent.pm' &&
    package Net::netent;
    use strict;
    X
    BEGIN {
    X    use Exporter   ();
    X    use vars       qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
    X    @ISA         = qw(Exporter);
    X    @EXPORT      = qw(getnetbyname getnetbyaddr getnet);
    X    @EXPORT_OK   = qw(
    X $n_name      @n_aliases
    X $n_addrtype  $n_net
    X    );
    X    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
    }
    use vars      @EXPORT_OK;
    X
    use Class::Template qw(struct);
    struct 'Net::netent' => [
    X   name => '$',
    X   aliases => '@',
    X   addrtype => '$',
    X   net => '$',
    ];
    X
    sub populate (@) {
    X    return unless @_;
    X    my $nob = new();
    X    $n_name   =    $nob->[0]           = $_[0];
    X    @n_aliases  = @{ $nob->[1] } = split ' ', $_[1];
    X    $n_addrtype  =    $nob->[2]       = $_[2];
    X    $n_net  =    $nob->[3]       = $_[3];
    X    return $nob;
    }
    X
    sub getnetbyname ($)  { populate(CORE::getnetbyname(shift)) }
    X
    sub getnetbyaddr ($;$) {
    X    my ($net, $addrtype);
    X    $net = shift;
    X    require Socket if @_;
    X    $addrtype = @_ ? shift : Socket::AF_INET();
    X    populate(CORE::getnetbyaddr($net, $addrtype))
    }
    X
    sub getnet($) {
    X    if ($_[0] =~ /^\d+(?:\.\d+(?:\.\d+(?:\.\d+)?)?)?$/) {
    X require Socket;
    X &getnetbyaddr(Socket::inet_aton(shift));
    X    } else {
    X &getnetbyname;
    X    }
    }
    X
    1;
    __END__
    X
    =head1 NAME
    X
    Net::netent - by-name interface to Perl's built-in getnet*() functions
    X
    =head1 SYNOPSIS
    X
    X use Net::netent qw(:FIELDS);
    X getnetbyname("loopback")  or die "bad net";
    X printf "%s is %08X\n", $n_name, $n_net;
    X
    X use Net::netent;
    X
    X $n = getnetbyname("loopback")  or die "bad net";
    X { # there's gotta be a better way, eh?
    X     @bytes = unpack("C4", pack("N", $n->net));
    X     shift @bytes while @bytes && $bytes[0] == 0;
    X }
    X printf "%s is %08X [%d.%d.%d.%d]\n", $n->name, $n->net, @bytes;
    X
    =head1 DESCRIPTION
    X
    This module's default exports override the core getnetbyname() and
    getnetbyaddr() functions, replacing them with versions that return
    "Net::netent" objects.  This object has methods that return the similarly
    named structure field name from the C's netent structure from F<netdb.h>;
    namely name, aliases, addrtype, and net.  The aliases
    method returns an array reference, the rest scalars.
    X
    You may also import all the structure fields directly into your namespace
    as regular variables using the :FIELDS import tag.  (Note that this still
    overrides your core functions.)  Access these fields as variables named
    with a preceding C<n_>.  Thus, C<$net_obj-E<gt>name()> corresponds to
    $n_name if you import the fields.  Array references are available as
    regular array variables, so for example C<@{ $net_obj-E<gt>aliases()
    }> would be simply @n_aliases.
    X
    The getnet() funtion is a simple front-end that forwards a numeric
    argument to getnetbyaddr(), and the rest
    to getnetbyname().
    X
    To access this functionality without the core overrides,
    pass the C<use> an empty import list, and then access
    function functions with their full qualified names.
    On the other hand, the built-ins are still available
    via the C<CORE::> pseudo-package.
    X
    =head1 EXAMPLES
    X
    The getnet() functions do this in the Perl core:
    X
    X    sv_setiv(sv, (I32)nent->n_net);
    X
    The gethost() functions do this in the Perl core:
    X
    X    sv_setpvn(sv, hent->h_addr, len);
    X
    That means that the address comes back in binary for the
    host functions, and as a regular perl integer for the net ones.
    This seems a bug, but here's how to deal with it:
    X
    X use strict;
    X use Socket;
    X use Net::netent;
    X
    X @ARGV = ('loopback') unless @ARGV;
    X
    X my($n, $net);
    X
    X for $net ( @ARGV ) {
    X
    X     unless ($n = getnetbyname($net)) {
    X  warn "$0: no such net: $net\n";
    X  next;
    X     }
    X
    X     printf "\n%s is %s%s\n",
    X      $net,
    X      lc($n->name) eq lc($net) ? "" : "*really* ",
    X      $n->name;
    X
    X     print "\taliases are ", join(", ", @{$n->aliases}), "\n"
    X  if @{$n->aliases};
    X
    X     # this is stupid; first, why is this not in binary?
    X     # second, why am i going through these convolutions
    X     # to make it looks right
    X     {
    X  my @a = unpack("C4", pack("N", $n->net));
    X  shift @a while @a && $a[0] == 0;
    X  printf "\taddr is %s [%d.%d.%d.%d]\n", $n->net, @a;
    X     }
    X
    X     if ($n = getnetbyaddr($n->net)) {
    X  if (lc($n->name) ne lc($net)) {
    X      printf "\tThat addr reverses to net %s!\n", $n->name;
    X      $net = $n->name;
    X      redo;
    X  }
    X     }
    X }
    X
    =head1 NOTE
    X
    While this class is currently implemented using the Class::Template
    module to build a struct-like class, you shouldn't rely upon this.
    X
    =head1 AUTHOR
    X
    Tom Christiansen
    SHAR_EOF
      $shar_touch -am 1130091396 'obstructs/Net/netent.pm' &&
      chmod 0644 'obstructs/Net/netent.pm' ||
      $echo 'restore of' 'obstructs/Net/netent.pm' 'failed'
      if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
      && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
        md5sum -c << SHAR_EOF >/dev/null 2>&1 \
        || $echo 'obstructs/Net/netent.pm:' 'MD5 check failed'
    e75ca81b142c8df118f1cdddc285f71a  obstructs/Net/netent.pm
    SHAR_EOF
      else
        shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'obstructs/Net/netent.pm'`"
        test 4435 -eq "$shar_count" ||
        $echo 'obstructs/Net/netent.pm:' 'original size' '4435,' 'current size' "$shar_count!"
      fi
    fi
    # ============= obstructs/Net/protoent.pm ==============
    if test -f 'obstructs/Net/protoent.pm' && test "$first_param" != -c; then
      $echo 'x -' SKIPPING 'obstructs/Net/protoent.pm' '(file already exists)'
    else
      $echo 'x -' extracting 'obstructs/Net/protoent.pm' '(text)'
      sed 's/^X//' << 'SHAR_EOF' > 'obstructs/Net/protoent.pm' &&
    package Net::protoent;
    use strict;
    X
    BEGIN {
    X    use Exporter   ();
    X    use vars       qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
    X    @ISA         = qw(Exporter);
    X    @EXPORT      = qw(getprotobyname getprotobynumber getprotoent);
    X    @EXPORT_OK   = qw( $p_name @p_aliases $p_proto );
    X    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
    }
    use vars      @EXPORT_OK;
    X
    use Class::Template qw(struct);
    struct 'Net::protoent' => [
    X   name => '$',
    X   aliases => '@',
    X   proto => '$',
    ];
    X
    sub populate (@) {
    X    return unless @_;
    X    my $pob = new();
    X    $p_name   =    $pob->[0]           = $_[0];
    X    @p_aliases  = @{ $pob->[1] } = split ' ', $_[1];
    X    $p_proto  =    $pob->[2]       = $_[2];
    X    return $pob;
    }
    X
    sub getprotoent      ( )  { populate(CORE::getprotoent()) }
    sub getprotobyname   ($)  { populate(CORE::getprotobyname(shift)) }
    sub getprotobynumber ($)  { populate(CORE::getprotobynumber(shift)) }
    X
    sub getproto ($;$) {
    X    no strict 'refs';
    X    return &{'getprotoby' . ($_[0]=~/^\d+$/ ? 'number' : 'name')}(@_);
    }
    X
    1;
    X
    __END__
    X
    =head1 NAME
    X
    Net::protoent - by-name interface to Perl's built-in getproto*() functions
    X
    =head1 SYNOPSIS
    X
    X use Net::protoent;
    X $p = getprotobyname(shift || 'tcp') || die "no proto";
    X printf "proto for %s is %d, aliases are %s\n",
    X    $p->name, $p->proto, "@{$p->aliases}";
    X
    X use Net::protoent qw(:FIELDS);
    X getprotobyname(shift || 'tcp') || die "no proto";
    X print "proto for $p_name is $p_proto, aliases are @p_aliases\n";
    X
    =head1 DESCRIPTION
    X
    This module's default exports override the core getprotoent(),
    getprotobyname(), and getnetbyport() functions, replacing them with
    versions that return "Net::protoent" objects.  They take default
    second arguments of "tcp".  This object has methods that return the
    similarly named structure field name from the C's protoent structure
    from F<netdb.h>; namely name, aliases, and proto.  The aliases method
    returns an array reference, the rest scalars.
    X
    You may also import all the structure fields directly into your namespace
    as regular variables using the :FIELDS import tag.  (Note that this still
    overrides your core functions.)  Access these fields as variables named
    with a preceding C<p_>.  Thus, C<$proto_obj-E<gt>name()> corresponds to
    $p_name if you import the fields.  Array references are available as
    regular array variables, so for example C<@{ $proto_obj-E<gt>aliases()
    }> would be simply @p_aliases.
    X
    The getproto() function is a simple front-end that forwards a numeric
    argument to getprotobyport(), and the rest to getprotobyname().
    X
    To access this functionality without the core overrides,
    pass the C<use> an empty import list, and then access
    function functions with their full qualified names.
    On the other hand, the built-ins are still available
    via the C<CORE::> pseudo-package.
    X
    =head1 NOTE
    X
    While this class is currently implemented using the Class::Template
    module to build a struct-like class, you shouldn't rely upon this.
    X
    =head1 AUTHOR
    X
    Tom Christiansen
    SHAR_EOF
      $shar_touch -am 1130095196 'obstructs/Net/protoent.pm' &&
      chmod 0644 'obstructs/Net/protoent.pm' ||
      $echo 'restore of' 'obstructs/Net/protoent.pm' 'failed'
      if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
      && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
        md5sum -c << SHAR_EOF >/dev/null 2>&1 \
        || $echo 'obstructs/Net/protoent.pm:' 'MD5 check failed'
    c8e24414a4b93b93dab2b257e15bdd38  obstructs/Net/protoent.pm
    SHAR_EOF
      else
        shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'obstructs/Net/protoent.pm'`"
        test 2973 -eq "$shar_count" ||
        $echo 'obstructs/Net/protoent.pm:' 'original size' '2973,' 'current size' "$shar_count!"
      fi
    fi
    # ============= obstructs/Net/servent.pm ==============
    if test -f 'obstructs/Net/servent.pm' && test "$first_param" != -c; then
      $echo 'x -' SKIPPING 'obstructs/Net/servent.pm' '(file already exists)'
    else
      $echo 'x -' extracting 'obstructs/Net/servent.pm' '(text)'
      sed 's/^X//' << 'SHAR_EOF' > 'obstructs/Net/servent.pm' &&
    package Net::servent;
    use strict;
    X
    BEGIN {
    X    use Exporter   ();
    X    use vars       qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
    X    @ISA         = qw(Exporter);
    X    @EXPORT      = qw(getservbyname getservbyport getservent getserv);
    X    @EXPORT_OK   = qw( $s_name @s_aliases $s_port $s_proto );
    X    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
    }
    use vars      @EXPORT_OK;
    X
    use Class::Template qw(struct);
    struct 'Net::servent' => [
    X   name => '$',
    X   aliases => '@',
    X   port => '$',
    X   proto => '$',
    ];
    X
    sub populate (@) {
    X    return unless @_;
    X    my $sob = new();
    X    $s_name   =    $sob->[0]           = $_[0];
    X    @s_aliases  = @{ $sob->[1] } = split ' ', $_[1];
    X    $s_port  =    $sob->[2]       = $_[2];
    X    $s_proto  =    $sob->[3]       = $_[3];
    X    return $sob;
    }
    X
    sub getservent    (   ) { populate(CORE::getservent()) }
    sub getservbyname ($;$) { populate(CORE::getservbyname(shift,shift||'tcp')) }
    sub getservbyport ($;$) { populate(CORE::getservbyport(shift,shift||'tcp')) }
    X
    sub getserv ($;$) {
    X    no strict 'refs';
    X    return &{'getservby' . ($_[0]=~/^\d+$/ ? 'port' : 'name')}(@_);
    }
    X
    1;
    X
    __END__
    X
    =head1 NAME
    X
    Net::servent - by-name interface to Perl's built-in getserv*() functions
    X
    =head1 SYNOPSIS
    X
    X use Net::servent;
    X $s = getservbyname(shift || 'ftp') || die "no service";
    X printf "port for %s is %s, aliases are %s\n",
    X    $s->name, $s->port, "@{$s->aliases}";
    X
    X use Net::servent qw(:FIELDS);
    X getservbyname(shift || 'ftp') || die "no service";
    X print "port for $s_name is $s_port, aliases are @s_aliases\n";
    X
    =head1 DESCRIPTION
    X
    This module's default exports override the core getservent(),
    getservbyname(), and
    getnetbyport() functions, replacing them with versions that return
    "Net::servent" objects.  They take default second arguments of "tcp".  This object has methods that return the similarly
    named structure field name from the C's servent structure from F<netdb.h>;
    namely name, aliases, port, and proto.  The aliases
    method returns an array reference, the rest scalars.
    X
    You may also import all the structure fields directly into your namespace
    as regular variables using the :FIELDS import tag.  (Note that this still
    overrides your core functions.)  Access these fields as variables named
    with a preceding C<n_>.  Thus, C<$serv_obj-E<gt>name()> corresponds to
    $s_name if you import the fields.  Array references are available as
    regular array variables, so for example C<@{ $serv_obj-E<gt>aliases()
    }> would be simply @s_aliases.
    X
    The getserv() function is a simple front-end that forwards a numeric
    argument to getservbyport(), and the rest to getservbyname().
    X
    To access this functionality without the core overrides,
    pass the C<use> an empty import list, and then access
    function functions with their full qualified names.
    On the other hand, the built-ins are still available
    via the C<CORE::> pseudo-package.
    X
    =head1 EXAMPLES
    X
    X use Net::servent qw(:FIELDS);
    X
    X while (@ARGV) {
    X     my ($service, $proto) = ((split m!/!, shift), 'tcp');
    X     my $valet = getserv($service, $proto);
    X     unless ($valet) {
    X         warn "$0: No service: $service/$proto\n"
    X         next;
    X     }
    X     printf "service $service/$proto is port %d\n", $valet->port;
    X     print "alias are @s_aliases\n" if @s_aliases;
    X }
    X
    =head1 NOTE
    X
    While this class is currently implemented using the Class::Template
    module to build a struct-like class, you shouldn't rely upon this.
    X
    =head1 AUTHOR
    X
    Tom Christiansen
    SHAR_EOF
      $shar_touch -am 1130094396 'obstructs/Net/servent.pm' &&
      chmod 0644 'obstructs/Net/servent.pm' ||
      $echo 'restore of' 'obstructs/Net/servent.pm' 'failed'
      if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
      && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
        md5sum -c << SHAR_EOF >/dev/null 2>&1 \
        || $echo 'obstructs/Net/servent.pm:' 'MD5 check failed'
    b09a8a3151b490a083236f84aae0e689  obstructs/Net/servent.pm
    SHAR_EOF
      else
        shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'obstructs/Net/servent.pm'`"
        test 3424 -eq "$shar_count" ||
        $echo 'obstructs/Net/servent.pm:' 'original size' '3424,' 'current size' "$shar_count!"
      fi
    fi
    # ============= obstructs/Time/gmtime.pm ==============
    if test ! -d 'obstructs/Time'; then
      $echo 'x -' 'creating directory' 'obstructs/Time'
      mkdir 'obstructs/Time'
    fi
    if test -f 'obstructs/Time/gmtime.pm' && test "$first_param" != -c; then
      $echo 'x -' SKIPPING 'obstructs/Time/gmtime.pm' '(file already exists)'
    else
      $echo 'x -' extracting 'obstructs/Time/gmtime.pm' '(text)'
      sed 's/^X//' << 'SHAR_EOF' > 'obstructs/Time/gmtime.pm' &&
    package Time::gmtime;
    use strict;
    use Time::tm;
    X
    BEGIN {
    X    use Exporter   ();
    X    use vars       qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
    X    @ISA         = qw(Exporter Time::tm);
    X    @EXPORT      = qw(gmtime gmctime);
    X    @EXPORT_OK   = qw(
    X $tm_sec $tm_min $tm_hour $tm_mday
    X $tm_mon $tm_year $tm_wday $tm_yday
    X $tm_isdst
    X     );
    X    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
    }
    use vars      @EXPORT_OK;
    X
    sub populate (@) {
    X    return unless @_;
    X    my $tmob = Time::tm->new();
    X    @$tmob = (
    X $tm_sec, $tm_min, $tm_hour, $tm_mday,
    X $tm_mon, $tm_year, $tm_wday, $tm_yday,
    X $tm_isdst )
    X     = @_;
    X    return $tmob;
    }
    X
    sub gmtime (;$)    { populate CORE::gmtime(shift||time)}
    sub gmctime (;$)   { scalar   CORE::gmtime(shift||time)}
    X
    1;
    __END__
    X
    =head1 NAME
    X
    Time::gmtime.pm - by-name interface to Perl's built-in gmtime() function
    X
    =head1 SYNOPSIS
    X
    X use Time::gmtime;
    X $gm = gmtime();
    X printf "The day in Greenwich is %s\n",
    X    (qw(Sun Mon Tue Wed Thu Fri Sat Sun))[ gm->wday() ];
    X
    X use Time::gmtime w(:FIELDS;
    X printf "The day in Greenwich is %s\n",
    X    (qw(Sun Mon Tue Wed Thu Fri Sat Sun))[ gm_wday() ];
    X
    X $now = gmctime();
    X
    X use Time::gmtime;
    X use File::stat;
    X $date_string = gmctime(stat($file)->mtime);
    X
    =head1 DESCRIPTION
    X
    This module's default exports override the core gmtime() function,
    replacing it with a version that returns "Time::tm" objects.
    This object has methods that return the similarly named structure field
    name from the C's tm structure from F<time.h>; namely sec, min, hour,
    mday, mon, year, wday, yday, and isdst.
    X
    You may also import all the structure fields directly into your namespace
    as regular variables using the :FIELDS import tag.  (Note that this
    still overrides your core functions.)  Access these fields as variables
    named with a preceding C<tm_> in front their method names.  Thus,
    C<$tm_obj-E<gt>mday()> corresponds to $tm_mday if you import the fields.
    X
    The gmctime() funtion provides a way of getting at the
    scalar sense of the original CORE::gmtime() function.
    X
    To access this functionality without the core overrides,
    pass the C<use> an empty import list, and then access
    function functions with their full qualified names.
    On the other hand, the built-ins are still available
    via the C<CORE::> pseudo-package.
    X
    =head1 NOTE
    X
    While this class is currently implemented using the Class::Template
    module to build a struct-like class, you shouldn't rely upon this.
    X
    =head1 AUTHOR
    X
    Tom Christiansen
    SHAR_EOF
      $shar_touch -am 1129132196 'obstructs/Time/gmtime.pm' &&
      chmod 0644 'obstructs/Time/gmtime.pm' ||
      $echo 'restore of' 'obstructs/Time/gmtime.pm' 'failed'
      if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
      && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
        md5sum -c << SHAR_EOF >/dev/null 2>&1 \
        || $echo 'obstructs/Time/gmtime.pm:' 'MD5 check failed'
    8617e4442d682c2bc444e12b612f98e2  obstructs/Time/gmtime.pm
    SHAR_EOF
      else
        shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'obstructs/Time/gmtime.pm'`"
        test 2476 -eq "$shar_count" ||
        $echo 'obstructs/Time/gmtime.pm:' 'original size' '2476,' 'current size' "$shar_count!"
      fi
    fi
    # ============= obstructs/Time/localtime.pm ==============
    if test -f 'obstructs/Time/localtime.pm' && test "$first_param" != -c; then
      $echo 'x -' SKIPPING 'obstructs/Time/localtime.pm' '(file already exists)'
    else
      $echo 'x -' extracting 'obstructs/Time/localtime.pm' '(text)'
      sed 's/^X//' << 'SHAR_EOF' > 'obstructs/Time/localtime.pm' &&
    package Time::localtime;
    use strict;
    use Time::tm;
    X
    BEGIN {
    X    use Exporter   ();
    X    use vars       qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
    X    @ISA         = qw(Exporter Time::tm);
    X    @EXPORT      = qw(localtime ctime);
    X    @EXPORT_OK   = qw(
    X $tm_sec $tm_min $tm_hour $tm_mday
    X $tm_mon $tm_year $tm_wday $tm_yday
    X $tm_isdst
    X     );
    X    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
    }
    use vars      @EXPORT_OK;
    X
    sub populate (@) {
    X    return unless @_;
    X    my $tmob = Time::tm->new();
    X    @$tmob = (
    X $tm_sec, $tm_min, $tm_hour, $tm_mday,
    X $tm_mon, $tm_year, $tm_wday, $tm_yday,
    X $tm_isdst )
    X     = @_;
    X    return $tmob;
    }
    X
    sub localtime (;$) { populate CORE::localtime(shift||time)}
    sub ctime (;$)     { scalar   CORE::localtime(shift||time) }
    X
    1;
    X
    __END__
    X
    =head1 NAME
    X
    Time::localtime.pm - by-name interface to Perl's built-in localtime() function
    X
    =head1 SYNOPSIS
    X
    X use Time::localtime;
    X printf "Year is %d\n", localtime->year() + 1900;
    X
    X $now = ctime();
    X
    X use Time::localtime;
    X use File::stat;
    X $date_string = ctime(stat($file)->mtime);
    X
    =head1 DESCRIPTION
    X
    This module's default exports override the core localtime() function,
    replacing it with a version that returns "Time::tm" objects.
    This object has methods that return the similarly named structure field
    name from the C's tm structure from F<time.h>; namely sec, min, hour,
    mday, mon, year, wday, yday, and isdst.
    X
    You may also import all the structure fields directly into your namespace
    as regular variables using the :FIELDS import tag.  (Note that this still
    overrides your core functions.)  Access these fields as
    variables named with a preceding C<tm_> in front their method names.
    Thus, C<$tm_obj-E<gt>mday()> corresponds to $tm_mday if you import
    the fields.
    X
    The ctime() funtion provides a way of getting at the
    scalar sense of the original CORE::localtime() function.
    X
    To access this functionality without the core overrides,
    pass the C<use> an empty import list, and then access
    function functions with their full qualified names.
    On the other hand, the built-ins are still available
    via the C<CORE::> pseudo-package.
    X
    =head1 NOTE
    X
    While this class is currently implemented using the Class::Template
    module to build a struct-like class, you shouldn't rely upon this.
    X
    =head1 AUTHOR
    X
    Tom Christiansen
    SHAR_EOF
      $shar_touch -am 1129132196 'obstructs/Time/localtime.pm' &&
      chmod 0644 'obstructs/Time/localtime.pm' ||
      $echo 'restore of' 'obstructs/Time/localtime.pm' 'failed'
      if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
      && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
        md5sum -c << SHAR_EOF >/dev/null 2>&1 \
        || $echo 'obstructs/Time/localtime.pm:' 'MD5 check failed'
    4f44256053f0573143e7f1b78e3db9b1  obstructs/Time/localtime.pm
    SHAR_EOF
      else
        shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'obstructs/Time/localtime.pm'`"
        test 2307 -eq "$shar_count" ||
        $echo 'obstructs/Time/localtime.pm:' 'original size' '2307,' 'current size' "$shar_count!"
      fi
    fi
    # ============= obstructs/Time/tm.pm ==============
    if test -f 'obstructs/Time/tm.pm' && test "$first_param" != -c; then
      $echo 'x -' SKIPPING 'obstructs/Time/tm.pm' '(file already exists)'
    else
      $echo 'x -' extracting 'obstructs/Time/tm.pm' '(text)'
      sed 's/^X//' << 'SHAR_EOF' > 'obstructs/Time/tm.pm' &&
    package Time::tm;
    use strict;
    X
    use Class::Template qw(struct);
    struct('Time::tm' => [
    X     map { $_ => '$' } qw{ sec min hour mday mon year wday yday isdst }
    ]);
    X
    1;
    __END__
    X
    =head1 NAME
    X
    Time::tm.pm - internal object used by Time::gmtime and Time::localtime
    X
    =head1 DESCRIPTION
    X
    This module is used internally as a base class by Time::localtime And
    Time::gmtime functions.  It creates a Time::tm struct object which is
    addressable just like's C's tm structure from F<time.h>; namely with sec,
    min, hour, mday, mon, year, wday, yday, and isdst.
    X
    This class is an internal interface only.
    X
    =head1 AUTHOR
    X
    Tom Christiansen
    SHAR_EOF
      $shar_touch -am 1129132696 'obstructs/Time/tm.pm' &&
      chmod 0644 'obstructs/Time/tm.pm' ||
      $echo 'restore of' 'obstructs/Time/tm.pm' 'failed'
      if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
      && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
        md5sum -c << SHAR_EOF >/dev/null 2>&1 \
        || $echo 'obstructs/Time/tm.pm:' 'MD5 check failed'
    02859f003106bb6eb92cc91bb9b37666  obstructs/Time/tm.pm
    SHAR_EOF
      else
        shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'obstructs/Time/tm.pm'`"
        test 622 -eq "$shar_count" ||
        $echo 'obstructs/Time/tm.pm:' 'original size' '622,' 'current size' "$shar_count!"
      fi
    fi
    # ============= obstructs/User/grent.pm ==============
    if test ! -d 'obstructs/User'; then
      $echo 'x -' 'creating directory' 'obstructs/User'
      mkdir 'obstructs/User'
    fi
    if test -f 'obstructs/User/grent.pm' && test "$first_param" != -c; then
      $echo 'x -' SKIPPING 'obstructs/User/grent.pm' '(file already exists)'
    else
      $echo 'x -' extracting 'obstructs/User/grent.pm' '(text)'
      sed 's/^X//' << 'SHAR_EOF' > 'obstructs/User/grent.pm' &&
    package User::grent;
    use strict;
    X
    BEGIN {
    X    use Exporter   ();
    X    use vars       qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
    X    @ISA         = qw(Exporter);
    X    @EXPORT      = qw(getgrent getgrgid getgrnam getgr);
    X    @EXPORT_OK   = qw($gr_name $gr_gid $gr_passwd $gr_mem @gr_members);
    X    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
    }
    use vars      @EXPORT_OK;
    X
    use Class::Template qw(struct);
    struct 'User::grent' => [
    X    name    => '$',
    X    passwd  => '$',
    X    gid     => '$',
    X    members => '@',
    ];
    X
    sub populate (@) {
    X    return unless @_;
    X    my $gob = new();
    X    ($gr_name, $gr_passwd, $gr_gid) = @$gob[0,1,2] = @_[0,1,2];
    X    @gr_members = @{$gob->[3]} = split ' ', $_[3];
    X    return $gob;
    }
    X
    sub getgrent ( ) { populate(CORE::getgrent()) }
    sub getgrnam ($) { populate(CORE::getgrnam(shift)) }
    sub getgrgid ($) { populate(CORE::getgrgid(shift)) }
    sub getgr    ($) { ($_[0] =~ /^\d+/) ? &getgrgid : &getgrnam }
    X
    1;
    __END__
    X
    =head1 NAME
    X
    User::grent.pm - by-name interface to Perl's built-in getgr*() functions
    X
    =head1 SYNOPSIS
    X
    X use User::grent;
    X $gr = getgrgid(0) or die "No group zero";
    X if ( $gr->name eq 'wheel' && @{$gr->members} > 1 ) {
    X     print "gid zero name wheel, with other members";
    X }
    X
    X use User::grent qw(:FIELDS;
    X getgrgid(0) or die "No group zero";
    X if ( $gr_name eq 'wheel' && @gr_members > 1 ) {
    X     print "gid zero name wheel, with other members";
    X }
    X
    X $gr = getgr($whoever);
    X
    =head1 DESCRIPTION
    X
    This module's default exports override the core getgrent(), getgruid(),
    and getgrnam() functions, replacing them with versions that return
    "User::grent" objects.  This object has methods that return the similarly
    named structure field name from the C's passwd structure from F<grp.h>;
    namely name, passwd, gid, and members (not mem).  The first three
    return scalars, the last an array reference.
    X
    You may also import all the structure fields directly into your namespace
    as regular variables using the :FIELDS import tag.  (Note that this still
    overrides your core functions.)  Access these fields as variables named
    with a preceding C<gr_>.  Thus, C<$group_obj-E<gt>gid()> corresponds
    to $gr_gid if you import the fields.  Array references are available as
    regular array variables, so C<@{ $group_obj-E<gt>members() }> would be
    simply @gr_members.
    X
    The getpw() funtion is a simple front-end that forwards
    a numeric argument to getpwuid() and the rest to getpwnam().
    X
    To access this functionality without the core overrides,
    pass the C<use> an empty import list, and then access
    function functions with their full qualified names.
    On the other hand, the built-ins are still available
    via the C<CORE::> pseudo-package.
    X
    =head1 NOTE
    X
    While this class is currently implemented using the Class::Template
    module to build a struct-like class, you shouldn't rely upon this.
    X
    =head1 AUTHOR
    X
    Tom Christiansen
    SHAR_EOF
      $shar_touch -am 1130094696 'obstructs/User/grent.pm' &&
      chmod 0644 'obstructs/User/grent.pm' ||
      $echo 'restore of' 'obstructs/User/grent.pm' 'failed'
      if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
      && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
        md5sum -c << SHAR_EOF >/dev/null 2>&1 \
        || $echo 'obstructs/User/grent.pm:' 'MD5 check failed'
    9fbf4010f722f9bc493657ec56f8ce5d  obstructs/User/grent.pm
    SHAR_EOF
      else
        shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'obstructs/User/grent.pm'`"
        test 2848 -eq "$shar_count" ||
        $echo 'obstructs/User/grent.pm:' 'original size' '2848,' 'current size' "$shar_count!"
      fi
    fi
    # ============= obstructs/User/pwent.pm ==============
    if test -f 'obstructs/User/pwent.pm' && test "$first_param" != -c; then
      $echo 'x -' SKIPPING 'obstructs/User/pwent.pm' '(file already exists)'
    else
      $echo 'x -' extracting 'obstructs/User/pwent.pm' '(text)'
      sed 's/^X//' << 'SHAR_EOF' > 'obstructs/User/pwent.pm' &&
    package User::pwent;
    use strict;
    X
    BEGIN {
    X    use Exporter   ();
    X    use vars       qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
    X    @ISA         = qw(Exporter);
    X    @EXPORT      = qw(getpwent getpwuid getpwnam getpw);
    X    @EXPORT_OK   = qw(
    X $pw_name   $pw_passwd  $pw_uid
    X $pw_gid    $pw_quota    $pw_comment
    X $pw_gecos  $pw_dir $pw_shell
    X    );
    X    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
    }
    use vars      @EXPORT_OK;
    X
    use Class::Template qw(struct);
    struct 'User::pwent' => [
    X    name    => '$',
    X    passwd  => '$',
    X    uid     => '$',
    X    gid     => '$',
    X    quota   => '$',
    X    comment => '$',
    X    gcos    => '$',
    X    dir     => '$',
    X    shell   => '$',
    ];
    X
    sub populate (@) {
    X    return unless @_;
    X    my $pwob = new();
    X
    X    ( $pw_name,   $pw_passwd,   $pw_uid,
    X      $pw_gid,    $pw_quota,    $pw_comment,
    X      $pw_gecos,  $pw_dir,      $pw_shell,   )  = @$pwob = @_;
    X
    X    return $pwob;
    }
    X
    sub getpwent ( ) { populate(CORE::getpwent()) }
    sub getpwnam ($) { populate(CORE::getpwnam(shift)) }
    sub getpwgid ($) { populate(CORE::getpwgid(shift)) }
    sub getpw    ($) { ($_[0] =~ /^\d+/) ? &getpwgid : &getpwnam }
    X
    1;
    __END__
    X
    =head1 NAME
    X
    User::pwent.pm - by-name interface to Perl's built-in getpw*() functions
    X
    =head1 SYNOPSIS
    X
    X use User::pwent;
    X $pw = getpwnam('daemon') or die "No daemon user";
    X if ( $pw->uid == 1 && $pw->dir =~ m#^/(bin|tmp)?$# ) {
    X     print "gid 1 on root dir";
    X }
    X
    X use User::pwent qw(:FIELDS);
    X getpwnam('daemon') or die "No daemon user";
    X if ( $pw_uid == 1 && $pw_dir =~ m#^/(bin|tmp)?$# ) {
    X     print "gid 1 on root dir";
    X }
    X
    X $pw = getpw($whoever);
    X
    =head1 DESCRIPTION
    X
    This module's default exports override the core getpwent(), getpwuid(),
    and getpwnam() functions, replacing them with versions that return
    "User::pwent" objects.  This object has methods that return the similarly
    named structure field name from the C's passwd structure from F<pwd.h>;
    namely name, passwd, uid, gid, quota, comment, gecos, dir, and shell.
    X
    You may also import all the structure fields directly into your namespace
    as regular variables using the :FIELDS import tag.  (Note that this still
    overrides your core functions.)  Access these fields as
    variables named with a preceding C<pw_> in front their method names.
    Thus, C<$passwd_obj-E<gt>shell()> corresponds to $pw_shell if you import
    the fields.
    X
    The getpw() funtion is a simple front-end that forwards
    a numeric argument to getpwuid() and the rest to getpwnam().
    X
    To access this functionality without the core overrides,
    pass the C<use> an empty import list, and then access
    function functions with their full qualified names.
    On the other hand, the built-ins are still available
    via the C<CORE::> pseudo-package.
    X
    =head1 NOTE
    X
    While this class is currently implemented using the Class::Template
    module to build a struct-like class, you shouldn't rely upon this.
    X
    =head1 AUTHOR
    X
    Tom Christiansen
    SHAR_EOF
      $shar_touch -am 1130094696 'obstructs/User/pwent.pm' &&
      chmod 0644 'obstructs/User/pwent.pm' ||
      $echo 'restore of' 'obstructs/User/pwent.pm' 'failed'
      if ( md5sum --help 2>&1 | grep 'sage: md5sum \[' ) >/dev/null 2>&1 \
      && ( md5sum --version 2>&1 | grep -v 'textutils 1.12' ) >/dev/null; then
        md5sum -c << SHAR_EOF >/dev/null 2>&1 \
        || $echo 'obstructs/User/pwent.pm:' 'MD5 check failed'
    905033d579b32729f95a760e013dbde4  obstructs/User/pwent.pm
    SHAR_EOF
      else
        shar_count="`LC_ALL= LC_CTYPE= LANG= wc -c < 'obstructs/User/pwent.pm'`"
        test 2899 -eq "$shar_count" ||
        $echo 'obstructs/User/pwent.pm:' 'original size' '2899,' 'current size' "$shar_count!"
      fi
    fi
    rm -fr _sh24166
    exit 0

    p5p-msgid: <199611301652.JAA24201@toy.perl.com>

Subject: FileHandle that 'ISA' IO::File
Date: Mon, 2 Dec 1996 17:18:02 GMT
From: Nick Ing-Simmons <nik@tiuk.ti.com>
Files: MANIFEST lib/FileHandle.pm

    Subject: FileHandle that 'is' and IO::File

    Andreas Koenig <k@anna.in-berlin.de> writes:
    >>>>>> Nick Ing-Simmons <nik@tiuk.ti.com> writes:
    >
    >  > The patch will serve till we can get derived version working.
    >
    >I'm putting much hope in the your patch, Nick, because I have another
    >problem pending. No test case yet, because I'm waiting for your
    >FileHandle.pm.
    >
    >I'll let you know more details as soon as I have a structured view of
    >the problem. Your patch will (hopefully) help me to get there,
    >
    >andreas

    Please try attached.

    Drop into lib/FileHandle.pm

    p5p-msgid: <199612021718.RAA04416@pluto>

Subject: 10+ debugger patch
Date: Sun, 1 Dec 1996 06:37:31 -0500 (EST)
From: Ilya Zakharevich <ilya@math.ohio-state.edu>
Files: lib/perl5db.pl perl.c pod/perldebug.pod

    Bugs corrected:
      perl.c
     a) Could have deadlocked debugging its own signal handler;
      lib/perl5db.pl
      pod/perldebug.pod
     b) Documentation (internal and POD) updated;
     c) NonStop now will not stop at end;
     d) variable names more meaningful now;
     e) Will not trace last line of itself now;
     f) Dumping of looong lines in a program (see Config.pm) interruptable;
     g) $@ not wiped by evalled expressions;

    While updating the docs I was forced to change some API (to make it
    documentable), which resulted in following improvements:

     frame & 4 recognized: more verbose output;
     frame changes style of TRACE;
     Non-interruptable lines have no `:' in the listing;
     frame outputs `require'd packages as well.
     added Options AutoTrace inhibit_exit

    Though this may look a lot, all the changes are not in the main flow
    of execution (in frills which are usually disabled), so I think they
    may be added even this late in the cycle. Documentation would be quite
    messy without these changes.

    As well as I know, the documentation is complete now, so one can
    _really_ write a new debugger from scratch.

    Enjoy,

    p5p-msgid: <199612011137.GAA10864@monk.mps.ohio-state.edu>

Subject: DB_File 1.07
From: Paul Marquess <pmarquess@bfsec.bt.co.uk>
Files: ext/DB_File/DB_File.pm ext/DB_File/DB_File.xs t/lib/db-btree.t t/lib/db-recno.t

Subject: DB_File 1.08
From: Paul Marquess <pmarquess@bfsec.bt.co.uk>
Files: ext/DB_File/DB_File.pm ext/DB_File/DB_File.xs

 OTHER CORE CHANGES

Subject: Eliminate spurious warning when splicing undefs
From: Chip Salzenberg <chip@atlantic.net>
Files: pp.c sv.h

Subject: Eliminate spurious warning from "x=" operator
From: Chip Salzenberg <chip@atlantic.net>
Files: op.c

Subject: Fix line numbers near control structures
From: Chip Salzenberg <chip@atlantic.net>
Files: op.c perly.c perly.c.diff perly.y proto.h

Subject: Don't let scalar unpack() underflow stack
From: Chip Salzenberg <chip@atlantic.net>
Files: pp.c

Subject: Fix core dump from precedence bug in "@foo" warning
From: Chip Salzenberg <chip@atlantic.net>
Files: toke.c

Subject: Move die() to utils.c; add varargs hack to croak()
From: Chip Salzenberg <chip@atlantic.net>
Files: pp_ctl.c util.c

Subject: Avoid memcmp() for magnitude test if it thinks char is signed
From: Chip Salzenberg <chip@atlantic.net>
Files: Configure config_H config_h.SH doop.c ext/SDBM_File/sdbm/pair.c ext/SDBM_File/sdbm/sdbm.h handy.h hv.c perl.h pp_hot.c proto.h regexec.c sv.c toke.c util.c

Subject: Fully paramaterize locales; disable all if NO_LOCALE
From: Chip Salzenberg <chip@atlantic.net>
Files: ext/POSIX/POSIX.xs op.c perl.h pp.c pp_sys.c sv.c util.c

 PORTABILITY AND TESTING

Subject: Bitwise op fix for Alpha
From: Chip Salzenberg <chip@atlantic.net>
Files: pp.c

Subject: VMS patches for 5.003_10
Date: Wed, 04 Dec 1996 16:40:12 -0500 (EST)
From: Charles Bailey <bailey@HMIVAX.HUMGEN.UPENN.EDU>
Files: EXTERN.h INTERN.h old_perl_exp.SH perl.c perl.h perl_exp.SH pp.c pp_ctl.c pp_sys.c proto.h sv.c toke.c util.c utils/perldoc.PL vms/config.vms vms/descrip.mms vms/gen_shrfls.pl vms/genconfig.pl vms/vmsish.h

    private-msgid: <01ICMALO8NMS001A1D@hmivax.humgen.upenn.edu>

80 files changed:
Changes
Configure
EXTERN.h
INSTALL
INTERN.h
MANIFEST
Makefile.SH
config_H
config_h.SH
doio.c
doop.c
embed.pl
ext/DB_File/DB_File.pm
ext/DB_File/DB_File.xs
ext/POSIX/POSIX.xs
ext/SDBM_File/sdbm/pair.c
ext/SDBM_File/sdbm/sdbm.h
handy.h
hv.c
hv.h
installperl
keywords.pl
lib/Class/Template.pm [new file with mode: 0644]
lib/ExtUtils/Embed.pm
lib/File/Path.pm
lib/File/stat.pm [new file with mode: 0644]
lib/FileHandle.pm [new file with mode: 0644]
lib/Net/hostent.pm [new file with mode: 0644]
lib/Net/netent.pm [new file with mode: 0644]
lib/Net/protoent.pm [new file with mode: 0644]
lib/Net/servent.pm [new file with mode: 0644]
lib/Pod/Text.pm
lib/Sys/Syslog.pm
lib/Time/gmtime.pm [new file with mode: 0644]
lib/Time/localtime.pm [new file with mode: 0644]
lib/Time/tm.pm [new file with mode: 0644]
lib/User/grent.pm [new file with mode: 0644]
lib/User/pwent.pm [new file with mode: 0644]
lib/perl5db.pl
lib/sigtrap.pm
lib/syslog.pl
old_embed.pl
old_perl_exp.SH
op.c
opcode.h
opcode.pl
patchlevel.h
perl.c
perl.h
perl_exp.SH
perly.c
perly.c.diff
perly.h
perly.y
pod/perldebug.pod
pod/perlfunc.pod
pod/perlobj.pod
pod/perlref.pod
pp.c
pp_ctl.c
pp_hot.c
pp_sys.c
proto.h
regexec.c
sv.c
sv.h
t/base/term.t
t/lib/db-btree.t
t/lib/db-recno.t
t/lib/filehand.t
t/lib/safe2.t
t/op/misc.t
toke.c
util.c
utils/perldoc.PL
vms/config.vms
vms/descrip.mms
vms/gen_shrfls.pl
vms/genconfig.pl
vms/vmsish.h

diff --git a/Changes b/Changes
index 9326ecf..51d876d 100644 (file)
--- a/Changes
+++ b/Changes
@@ -8,6 +8,173 @@ or in the .../src/5/0/unsupported directory for sub-version
 releases.)
 
 ----------------
+Version 5.003_11
+----------------
+
+This patch is (still) closing in on 5.004.  Nothing dramatic, lots of
+value.
+
+ CORE LANGUAGE CHANGES
+
+  Title:  "Fix precedence problems with subs as uniops or listops"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  perly.c perly.c.diff perly.h perly.y
+
+  Title:  "Don't reset $. on open()"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  pp_sys.c
+
+  Title:  "Support *glob{IO} (eventually deprecate *glob{FILEHANDLE})"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  pod/perlref.pod pp_hot.c sv.c
+
+  Title:  "Don't let expression context force return context"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  op.c
+
+  Title:  "Properly convert "1E2" et al to IV/UV"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  doio.c sv.c
+
+  Title:  "Fix modulo operator in UV realm"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  pp.c
+
+  Title:  "Fix stat(_) after stat(HANDLE)"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  pp_sys.c
+
+  Title:  "Fix: s/// and "$x =~ $y" under 'use locale'"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  op.c toke.c
+
+ OTHER CORE CHANGES
+
+  Title:  "Eliminate spurious warning when splicing undefs"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  pp.c sv.h
+
+  Title:  "Eliminate spurious warning from "x=" operator"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  op.c
+
+  Title:  "Fix line numbers near control structures"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  op.c perly.c perly.c.diff perly.y proto.h
+
+  Title:  "Don't let scalar unpack() underflow stack"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  pp.c
+
+  Title:  "Fix core dump from precedence bug in "@foo" warning"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  toke.c
+
+  Title:  "Move die() to utils.c; add varargs hack to croak()"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  pp_ctl.c util.c
+
+  Title:  "Avoid memcmp() for magnitude test if it thinks char is signed"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  Configure config_H config_h.SH doop.c
+          ext/SDBM_File/sdbm/pair.c ext/SDBM_File/sdbm/sdbm.h handy.h
+          hv.c perl.h pp_hot.c proto.h regexec.c sv.c toke.c util.c
+
+  Title:  "Less malloc in magic"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  mg.c
+
+  Title:  "Re: 5.003_09: PADTMP fix"
+   From:  Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID:  <199611281150.GAA06884@monk.mps.ohio-state.edu>
+   Date:  Thu, 28 Nov 1996 06:50:58 -0500 (EST)
+  Files:  pod/perlguts.pod
+
+  Title:  "Fully paramaterize locales; disable all if NO_LOCALE"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  ext/POSIX/POSIX.xs op.c perl.h pp.c pp_sys.c sv.c util.c
+
+ PORTABILITY AND TESTING
+
+  Title:  "Bitwise op fix for Alpha"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  pp.c
+
+  Title:  "hints/dgux.sh update"
+   From:  Roderick Schertler <roderick@gate.net>
+ Msg-ID:  <24178.849309616@eeyore.ibcinc.com>
+   Date:  Fri, 29 Nov 1996 18:20:16 -0500
+  Files:  hints/dgux.sh
+
+  Title:  "BUG in hints/hpux.sh"
+   From:  Jeff McDougal <jmcdo@cris.com>
+ Msg-ID:  <32A42C11.7FA2@cris.com>
+   Date:  Tue, 03 Dec 1996 08:33:05 -0500
+  Files:  hints/hpux.sh
+
+  Title:  "VMS patches for 5.003_10"
+   From:  Charles Bailey <bailey@HMIVAX.HUMGEN.UPENN.EDU>
+ Msg-ID:  <01ICMALO8NMS001A1D@hmivax.humgen.upenn.edu>
+   Date:  Wed, 04 Dec 1996 16:40:12 -0500 (EST)
+  Files:  EXTERN.h INTERN.h old_perl_exp.SH perl.c perl.h perl_exp.SH
+          pp.c pp_ctl.c pp_sys.c proto.h sv.c toke.c util.c
+          utils/perldoc.PL vms/config.vms vms/descrip.mms
+          vms/gen_shrfls.pl vms/genconfig.pl vms/vmsish.h
+
+  Title:  "_10+ under OS/2"
+   From:  Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID:  <199612011107.GAA10805@monk.mps.ohio-state.edu>
+   Date:  Sun, 1 Dec 1996 06:07:19 -0500 (EST)
+  Files:  malloc.c os2/diff.configure
+
+ LIBRARY AND EXTENSIONS
+
+  Title:  "{in,ob}structive pods"
+   From:  Tom Christiansen <tchrist@mox.perl.com>
+ Msg-ID:  <199611301652.JAA24201@toy.perl.com>
+   Date:  Sat, 30 Nov 1996 09:52:57 -0700
+  Files:  MANIFEST lib/Class/Template.pm lib/File/stat.pm
+          lib/Net/hostent.pm lib/Net/netent.pm lib/Net/protoent.pm
+          lib/Net/servent.pm lib/Time/gmtime.pm lib/Time/localtime.pm
+          lib/Time/tm.pm lib/User/grent.pm lib/User/pwent.pm
+
+  Title:  "FileHandle that 'ISA' IO::File"
+   From:  Nick Ing-Simmons <nik@tiuk.ti.com>
+ Msg-ID:  <199612021718.RAA04416@pluto>
+   Date:  Mon, 2 Dec 1996 17:18:02 GMT
+  Files:  MANIFEST lib/FileHandle.pm
+
+  Title:  "Make IO::File::import use its parameters"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  ext/IO/lib/IO/File.pm
+
+  Title:  "10+ debugger patch"
+   From:  Ilya Zakharevich <ilya@math.ohio-state.edu>
+ Msg-ID:  <199612011137.GAA10864@monk.mps.ohio-state.edu>
+   Date:  Sun, 1 Dec 1996 06:37:31 -0500 (EST)
+  Files:  lib/perl5db.pl perl.c pod/perldebug.pod
+
+  Title:  "Don't call CORE::close in file handle DESTROY method"
+   From:  Chip Salzenberg <chip@atlantic.net>
+  Files:  ext/IO/lib/IO/Handle.pm
+
+  Title:  "Re: Namespace cleanup: Does SDBM need binary compatibility?"
+   From:  Hallvard B Furuseth <h.b.furuseth@usit.uio.no>
+ Msg-ID:  <199612031445.PAA19056@bombur2.uio.no>
+   Date:  Tue, 3 Dec 1996 15:45:27 +0100 (MET)
+  Files:  ext/SDBM_File/sdbm/pair.h ext/SDBM_File/sdbm/sdbm.3
+
+  Title:  "DB_File 1.07"
+   From:  pmarquess@bfsec.bt.co.uk (Paul Marquess)
+  Files:  ext/DB_File/DB_File.pm ext/DB_File/DB_File.xs t/lib/db-btree.t
+          t/lib/db-recno.t
+
+  Title:  "DB_File 1.08"
+   From:  pmarquess@bfsec.bt.co.uk (Paul Marquess)
+  Files:  ext/DB_File/DB_File.pm ext/DB_File/DB_File.xs
+
+
+----------------
 Version 5.003_10
 ----------------
 
@@ -20,8 +187,8 @@ valuable changes, but nothing dramatic.
    From:  Chip Salzenberg <chip@atlantic.net>
   Files:  toke.c
 
-  Title:  "Make parens optional on [gs]ethost and [gs]et{pw,gr} function
-   From:  Chip Salzenberg <chip@atlantic.net>
+  Title:  "Make parens optional on [gs]ethost and [gs]et{pw,gr} functions
+   From:  John L. Allen <allen@gateway.grumman.com>
   Files:  toke.c
 
   Title:  "Fix syntax error with "$x [0]" and "$x {y}" and "@x {y}""
index a7d224c..f9bb490 100755 (executable)
--- a/Configure
+++ b/Configure
@@ -338,6 +338,7 @@ d_rename=''
 d_rmdir=''
 d_safebcpy=''
 d_safemcpy=''
+d_sanemcmp=''
 d_select=''
 d_sem=''
 d_semctl=''
@@ -2429,7 +2430,9 @@ else
        patchlevel=0
        subversion=0
 fi
-echo "(You have $package $baserev patchlevel $patchlevel subversion $subversion.)"
+$echo $n "(You have $package $baserev patchlevel $patchlevel" $c
+test 0 -eq "$subversion" || $echo $n " subversion $subversion" $c
+echo ".)"
 
 : set the prefixup variable, to restore leading tilda escape
 prefixup='case "$prefixexp" in
@@ -2447,9 +2450,13 @@ case "$archlib" in
                set dflt
                eval $prefixup
                ;;
-       *)      version=`LC_ALL=C;export LC_ALL;\
-                       echo $baserev $patchlevel $subversion | \
-                       $awk '{print $1 + $2/1000.0 + $3/100000.0}'`
+       *)      if test 0 -eq "$subversion"; then
+                       version=`echo $baserev $patchlevel | \
+                                $awk '{ printf "%d.%03d\n",$1,$2 }'`
+               else
+                       version=`echo $baserev $patchlevel $subversion | \
+                                $awk '{ printf "%d.%03d%02d\n",$1,$2,$3 }'`
+               fi
                dflt="$privlib/$archname/$version"
                ;;
        esac
@@ -6120,6 +6127,7 @@ main()
     handle = dlopen("./dyna.$dlext", mode) ;
     if (handle == NULL) {
         printf ("1\n") ;
+        fflush (stdout) ;
            exit(0);
     }
     symbol = dlsym(handle, "fred") ;
@@ -6128,13 +6136,15 @@ main()
         symbol = dlsym(handle, "_fred") ;
         if (symbol == NULL) {
             printf ("2\n") ;
+            fflush (stdout) ;
                exit(0);
                }
         printf ("3\n") ;
     }
     else
         printf ("4\n") ;
-       exit(0);
+    fflush (stdout) ;
+    exit(0);
 }
 EOM
        : Call the object file tmp-dyna.o in case dlext=o.
@@ -7033,6 +7043,60 @@ $rm -f foo.* safemcpy core
 set d_safemcpy
 eval $setvar
 
+: can memcmp be trusted to compare relative magnitude?
+val="$undef"
+case "$d_memcmp" in
+"$define")
+       echo " "
+       echo "Checking to see if memcmp() can compare relative magnitude..." >&4
+       $cat >foo.c <<EOCP
+#$i_memory I_MEMORY
+#$i_stdlib I_STDLIB
+#$i_string I_STRING
+#$i_unistd I_UNISTD
+EOCP
+       $cat >>foo.c <<'EOCP'
+#include <stdio.h>
+
+#ifdef I_MEMORY
+#  include <memory.h>
+#endif
+#ifdef I_STDLIB
+#  include <stdlib.h>
+#endif
+#ifdef I_STRING
+#  include <string.h>
+#else
+#  include <strings.h>
+#endif
+#ifdef I_UNISTD
+#  include <unistd.h>  /* Needed for NetBSD */
+#endif
+main()
+{
+char a = -1;
+char b = 0;
+if ((a < b) && memcmp(&a, &b, 1) < 0)
+       exit(1);
+exit(0);
+}
+EOCP
+       if $cc $ccflags $ldflags foo.c -o sanemcmp $libs >/dev/null 2>&1; then
+               if ./sanemcmp 2>/dev/null; then
+                       echo "Yes, it can."
+                       val="$define"
+               else
+                       echo "No, it can't (it uses signed chars)."
+               fi
+       else
+               echo "(I can't compile the test program, so we'll assume not...)"
+       fi
+       ;;
+esac
+$rm -f foo.* sanemcmp core
+set d_sanemcmp
+eval $setvar
+
 : see if select exists
 set select d_select
 eval $inlibc
@@ -8896,7 +8960,7 @@ main()
 }
 EOM
 echo " "
-if $cc $ccflags $ldflags -o ssize ssize.c $libs > /dev/null 2>&1  &&
+if $cc $ccflags $ldflags -o ssize ssize.c > /dev/null 2>&1  &&
                ./ssize > /dev/null 2>&1 ; then
        ssizetype=`./ssize`
        echo "I'll be using $ssizetype for functions returning a byte count." >&4
@@ -9829,6 +9893,7 @@ d_rewinddir='$d_rewinddir'
 d_rmdir='$d_rmdir'
 d_safebcpy='$d_safebcpy'
 d_safemcpy='$d_safemcpy'
+d_sanemcmp='$d_sanemcmp'
 d_seekdir='$d_seekdir'
 d_select='$d_select'
 d_sem='$d_sem'
index dedd379..5741fbf 100644 (file)
--- a/EXTERN.h
+++ b/EXTERN.h
  */
 #undef EXT
 #undef dEXT
+#undef EXTCONST
+#undef dEXTCONST
 #if defined(VMS) && !defined(__GNUC__)
 #  define EXT globalref
 #  define dEXT globaldef {"$GLOBAL_RW_VARS"} noshare
+#  define EXTCONST globalref
+#  define dEXTCONST globaldef {"$GLOBAL_RO_VARS"} readonly
 #else
 #  define EXT extern
 #  define dEXT
+#  define EXTCONST extern const
+#  define dEXTCONST const
 #endif
 
 #undef INIT
diff --git a/INSTALL b/INSTALL
index 97c72cf..325509b 100644 (file)
--- a/INSTALL
+++ b/INSTALL
@@ -11,6 +11,11 @@ The basic steps to build and install perl5 on a Unix system are:
        make
        make test
        make install
+       # possibly add these:
+       (cd /usr/include  && h2ph *.h sys/*.h)
+       cd pod; make html && mv *.html <www home dir>  && cd ..
+       cd pod; make tex  && <process the latex files> && cd ..
+
 
 Each of these is explained in further detail below.
 
index d89d2e6..76fff3b 100644 (file)
--- a/INTERN.h
+++ b/INTERN.h
  */
 #undef EXT
 #undef dEXT
+#undef EXTCONST
+#undef dEXTCONST
 #if defined(VMS) && !defined(__GNUC__)
 #  define EXT globaldef {"$GLOBAL_RW_VARS"} noshare
 #  define dEXT globaldef {"$GLOBAL_RW_VARS"} noshare
+#  define EXTCONST globaldef {"$GLOBAL_RO_VARS"} readonly
+#  define dEXTCONST globaldef {"$GLOBAL_RO_VARS"} readonly
 #else
 #  define EXT
 #  define dEXT
+#  define EXTCONST const
+#  define dEXTCONST const
 #endif
 
 #undef INIT
index 859da3c..6c267a1 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -100,9 +100,6 @@ ext/DynaLoader/dlutils.c    Dynamic loader utilities for dl_*.xs files
 ext/Fcntl/Fcntl.pm             Fcntl extension Perl module
 ext/Fcntl/Fcntl.xs             Fcntl extension external subroutines
 ext/Fcntl/Makefile.PL          Fcntl extension makefile writer
-ext/FileHandle/FileHandle.pm   FileHandle extension Perl module
-ext/FileHandle/FileHandle.xs   FileHandle extension external subroutines
-ext/FileHandle/Makefile.PL     FileHandle extension makefile writer
 ext/GDBM_File/GDBM_File.pm     GDBM extension Perl module
 ext/GDBM_File/GDBM_File.xs     GDBM extension external subroutines
 ext/GDBM_File/Makefile.PL      GDBM extension makefile writer
@@ -240,8 +237,8 @@ hints/next_3_0.sh   Hints for named architecture
 hints/next_4.sh                Hints for named architecture
 hints/opus.sh          Hints for named architecture
 hints/os2.sh           Hints for named architecture
-hints/qnx.sh           Hints for named architecture
 hints/powerux.sh       Hints for named architecture
+hints/qnx.sh           Hints for named architecture
 hints/sco.sh           Hints for named architecture
 hints/sco_2_3_0.sh     Hints for named architecture
 hints/sco_2_3_1.sh     Hints for named architecture
@@ -273,6 +270,7 @@ lib/AutoLoader.pm   Autoloader base class
 lib/AutoSplit.pm       A module to split up autoload functions
 lib/Benchmark.pm       A module to time pieces of code and such
 lib/Carp.pm            Error message base class
+lib/Class/Template.pm  Structure/member template builder; makes nested types
 lib/Cwd.pm             Various cwd routines (getcwd, fastcwd, chdir)
 lib/Devel/SelfStubber.pm Generate stubs for SelfLoader.pm
 lib/DirHandle.pm       like FileHandle only for directories
@@ -298,7 +296,9 @@ lib/File/CheckTree.pm       Perl module supporting wholesale file mode validation
 lib/File/Copy.pm       Emulation of cp command
 lib/File/Find.pm       Routines to do a find
 lib/File/Path.pm       A module to do things like `mkdir -p' and `rm -r'
+lib/File/stat.pm       Object-oriented wrapper around CORE::stat
 lib/FileCache.pm       Keep more files open than the system permits
+lib/FileHandle.pm      Backward-compatible front end to IO extension
 lib/FindBin.pm         Find name of currently executing program
 lib/Getopt/Long.pm     A module to fetch command options (GetOptions)
 lib/Getopt/Std.pm      A module to fetch command options (getopt, getopts)
@@ -309,6 +309,10 @@ lib/Math/BigFloat.pm       An arbitrary precision floating-point arithmetic package
 lib/Math/BigInt.pm     An arbitrary precision integer arithmetic package
 lib/Math/Complex.pm    A Complex package
 lib/Net/Ping.pm                Ping methods
+lib/Net/hostent.pm     Object-oriented wrapper around CORE::gethost*
+lib/Net/netent.pm      Object-oriented wrapper around CORE::getnet*
+lib/Net/protoent.pm    Object-oriented wrapper around CORE::getproto*
+lib/Net/servent.pm     Object-oriented wrapper around CORE::getserv*
 lib/Pod/Functions.pm   used by pod/splitpod
 lib/Pod/Text.pm                Convert POD data to formatted ASCII text
 lib/Search/Dict.pm     A module to do binary search on dictionaries
@@ -331,7 +335,12 @@ lib/Tie/Hash.pm            Base class for tied hashes
 lib/Tie/Scalar.pm      Base class for tied scalars
 lib/Tie/SubstrHash.pm  Compact hash for known key, value and table size
 lib/Time/Local.pm      Reverse translation of localtime, gmtime
+lib/Time/gmtime.pm     Object-oriented wrapper around CORE::gmtime
+lib/Time/localtime.pm  Object-oriented wrapper around CORE::localtime
+lib/Time/tm.pm         Perl implementation of "struct tm" for {gm,local}time
 lib/UNIVERSAL.pm       Base class for ALL classes.
+lib/User/grent.pm      Object-oriented wrapper around CORE::getgr*
+lib/User/pwent.pm      Object-oriented wrapper around CORE::getpw*
 lib/abbrev.pl          An abbreviation table builder
 lib/assert.pl          assertion and panic with stack trace
 lib/bigfloat.pl                An arbitrary precision floating point package
index 1a2d67d..81d6589 100755 (executable)
@@ -285,7 +285,7 @@ quantperl: $& perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
 # has been invoked correctly.
 
 suidperl: $& sperl$(OBJ_EXT) perlmain$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) ext.libs
-       $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o suidperl perlmain$(OBJ_EXT) sperl$(OBJ_EXT) $(LIBPERL) $(DYNALOADER) $(static_ext) `cat ext.libs` $(libs)
+       $(CC) $(LARGE) $(CLDFLAGS) $(CCDLFLAGS) -o suidperl perlmain$(OBJ_EXT) sperl$(OBJ_EXT) $(DYNALOADER) $(static_ext) $(LIBPERL) `cat ext.libs` $(libs)
 
 !NO!SUBS!
 
index dec1e75..6146ce8 100644 (file)
--- a/config_H
+++ b/config_H
  */
 /*#define HAS_SAFE_MEMCPY      / **/
 
+/* HAS_SANE_MEMCMP:
+ *     This symbol, if defined, indicates that the memcmp() routine is
+ *     available to compare memory blocks for relative magnitude. If this
+ *     symbol is not defined, and if HAS_MEMCMP is defined, then memcmp()
+ *     may be used only to compare memory blocks for equality.
+ */
+/*#define HAS_SANE_MEMCMP      / **/
+
 /* HAS_SELECT:
  *     This symbol, if defined, indicates that the select routine is
  *     available to select active file descriptors. If the timeout field
index 0a8bc62..d2ff19c 100755 (executable)
@@ -550,6 +550,14 @@ sed <<!GROK!THIS! >config.h -e 's!^#undef\(.*/\)\*!/\*#define\1 \*!' -e 's!^#un-
  */
 #$d_safemcpy HAS_SAFE_MEMCPY   /**/
 
+/* HAS_SANE_MEMCMP:
+ *     This symbol, if defined, indicates that the memcmp() routine is
+ *     available to compare memory blocks for relative magnitude. If this
+ *     symbol is not defined, and if HAS_MEMCMP is defined, then memcmp()
+ *     may be used only to compare memory blocks for equality.
+ */
+#$d_sanemcmp HAS_SANE_MEMCMP   /**/
+
 /* HAS_SELECT:
  *     This symbol, if defined, indicates that the select routine is
  *     available to select active file descriptors. If the timeout field
diff --git a/doio.c b/doio.c
index 38f7c0d..69cc891 100644 (file)
--- a/doio.c
+++ b/doio.c
@@ -742,56 +742,6 @@ Off_t length;              /* length to set file to */
 }
 #endif /* F_FREESP */
 
-I32
-looks_like_number(sv)
-SV *sv;
-{
-    register char *s;
-    register char *send;
-
-    if (!SvPOK(sv)) {
-       STRLEN len;
-       if (!SvPOKp(sv))
-           return TRUE;
-       s = SvPV(sv, len);
-       send = s + len;
-    }
-    else {
-       s = SvPVX(sv); 
-       send = s + SvCUR(sv);
-    }
-    while (isSPACE(*s))
-       s++;
-    if (s >= send)
-       return FALSE;
-    if (*s == '+' || *s == '-')
-       s++;
-    while (isDIGIT(*s))
-       s++;
-    if (s == send)
-       return TRUE;
-    if (*s == '.') 
-       s++;
-    else if (s == SvPVX(sv))
-       return FALSE;
-    while (isDIGIT(*s))
-       s++;
-    if (s == send)
-       return TRUE;
-    if (*s == 'e' || *s == 'E') {
-       s++;
-       if (*s == '+' || *s == '-')
-           s++;
-       while (isDIGIT(*s))
-           s++;
-    }
-    while (isSPACE(*s))
-       s++;
-    if (s >= send)
-       return TRUE;
-    return FALSE;
-}
-
 bool
 do_print(sv,fp)
 register SV *sv;
diff --git a/doop.c b/doop.c
index dd162de..836027e 100644 (file)
--- a/doop.c
+++ b/doop.c
 #include <signal.h>
 #endif
 
-#ifdef BUGGY_MSC
- #pragma function(memcmp)
-#endif /* BUGGY_MSC */
-
-#ifdef BUGGY_MSC
- #pragma intrinsic(memcmp)
-#endif /* BUGGY_MSC */
-
 I32
 do_trans(sv,arg)
 SV *sv;
@@ -507,7 +499,7 @@ register SV *sv;
                    goto nope;
                len -= rslen - 1;
                s -= rslen - 1;
-               if (memcmp(s, rsptr, rslen))
+               if (memNE(s, rsptr, rslen))
                    goto nope;
                count += rslen;
            }
index c535fe0..a1e77db 100755 (executable)
--- a/embed.pl
+++ b/embed.pl
@@ -1,5 +1,6 @@
 #!/usr/bin/perl
 
+unlink "embed.h";
 open(EM, ">embed.h") || die "Can't create embed.h: $!\n";
 
 print EM <<'END';
index f62de2e..ea77c32 100644 (file)
@@ -1,8 +1,13 @@
 # DB_File.pm -- Perl 5 interface to Berkeley DB 
 #
 # written by Paul Marquess (pmarquess@bfsec.bt.co.uk)
-# last modified 27th Nov 1996
-# version 1.06
+# last modified 3rd Dec 1996
+# version 1.08
+#
+#     Copyright (c) 1995, 1996 Paul Marquess. All rights reserved.
+#     This program is free software; you can redistribute it and/or
+#     modify it under the same terms as Perl itself.
+
 
 package DB_File::HASHINFO ;
 
@@ -26,13 +31,11 @@ sub TIEHASH
 {
     my $pkg = shift ;
 
-    bless {   'bsize'     => 0,
-              'ffactor'   => 0,
-              'nelem'     => 0,
-              'cachesize' => 0,
-              'hash'      => undef,
-              'lorder'    => 0,
-        }, $pkg ;
+    bless { VALID => { map {$_, 1} 
+                      qw( bsize ffactor nelem cachesize hash lorder)
+                    }, 
+           GOT   => {}
+          }, $pkg ;
 }
 
 
@@ -41,7 +44,7 @@ sub FETCH
     my $self  = shift ;
     my $key   = shift ;
 
-    return $self->{$key} if exists $self->{$key}  ;
+    return $self->{GOT}{$key} if exists $self->{VALID}{$key}  ;
 
     my $pkg = ref $self ;
     croak "${pkg}::FETCH - Unknown element '$key'" ;
@@ -54,9 +57,9 @@ sub STORE
     my $key   = shift ;
     my $value = shift ;
 
-    if ( exists $self->{$key} )
+    if ( exists $self->{VALID}{$key} )
     {
-        $self->{$key} = $value ;
+        $self->{GOT}{$key} = $value ;
         return ;
     }
     
@@ -69,9 +72,9 @@ sub DELETE
     my $self = shift ;
     my $key  = shift ;
 
-    if ( exists $self->{$key} )
+    if ( exists $self->{VALID}{$key} )
     {
-        delete $self->{$key} ;
+        delete $self->{GOT}{$key} ;
         return ;
     }
     
@@ -84,7 +87,7 @@ sub EXISTS
     my $self = shift ;
     my $key  = shift ;
 
-    exists $self->{$key} ;
+    exists $self->{VALID}{$key} ;
 }
 
 sub NotHere
@@ -110,14 +113,11 @@ sub TIEHASH
 {
     my $pkg = shift ;
 
-    bless {   'bval'      => 0,
-              'cachesize' => 0,
-              'psize'     => 0,
-              'flags'     => 0,
-              'lorder'    => 0,
-              'reclen'    => 0,
-              'bfname'    => "",
-            }, $pkg ;
+    bless { VALID => { map {$_, 1} 
+                      qw( bval cachesize psize flags lorder reclen bfname )
+                    },
+           GOT   => {},
+          }, $pkg ;
 }
 
 package DB_File::BTREEINFO ;
@@ -130,15 +130,12 @@ sub TIEHASH
 {
     my $pkg = shift ;
 
-    bless {   'flags'    => 0,
-              'cachesize'  => 0,
-              'maxkeypage' => 0,
-              'minkeypage' => 0,
-              'psize'      => 0,
-              'compare'    => undef,
-              'prefix'     => undef,
-              'lorder'     => 0,
-            }, $pkg ;
+    bless { VALID => { map {$_, 1} 
+                      qw( flags cachesize maxkeypage minkeypage psize 
+                          compare prefix lorder )
+                    },
+           GOT   => {},
+          }, $pkg ;
 }
 
 
@@ -149,7 +146,7 @@ use vars qw($VERSION @ISA @EXPORT $AUTOLOAD $DB_BTREE $DB_HASH $DB_RECNO) ;
 use Carp;
 
 
-$VERSION = "1.06" ;
+$VERSION = "1.08" ;
 
 #typedef enum { DB_BTREE, DB_HASH, DB_RECNO } DBTYPE;
 $DB_BTREE = new DB_File::BTREEINFO ;
@@ -462,7 +459,7 @@ values when you only want to change one. Here is an example:
      $a->{'cachesize'} =  12345 ;
      tie %y, 'DB_File', "filename", $flags, 0777, $a ;
 
-A few of the values need extra discussion here. When used, the C
+A few of the options need extra discussion here. When used, the C
 equivalent of the keys C<hash>, C<compare> and C<prefix> store pointers
 to C functions. In B<DB_File> these keys are used to store references
 to Perl subs. Below are templates for each of the subs:
@@ -497,6 +494,9 @@ to Perl subs. Below are templates for each of the subs:
 See L<Changing the BTREE sort order> for an example of using the
 C<compare> template.
 
+If you are using the DB_RECNO interface and you intend making use of
+C<bval>, you should check out L<The bval option>.
+
 =head2 Default Parameters
 
 It is possible to omit some or all of the final 4 parameters in the
@@ -893,6 +893,33 @@ negative indexes. The index -1 refers to the last element of the array,
 -2 the second last, and so on. Attempting to access an element before
 the start of the array will raise a fatal run-time error.
 
+=head2 The bval option
+
+The operation of the bval option warrants some discussion. Here is the
+definition of bval from the Berkeley DB 1.85 recno manual page:
+
+    The delimiting byte to be used to mark  the  end  of  a
+    record for variable-length records, and the pad charac-
+    ter for fixed-length records.  If no  value  is  speci-
+    fied,  newlines  (``\n'')  are  used to mark the end of
+    variable-length records and  fixed-length  records  are
+    padded with spaces.
+
+The second sentence is wrong. In actual fact bval will only default to
+C<"\n"> when the openinfo parameter in dbopen is NULL. If a non-NULL
+openinfo parameter is used at all, the value that happens to be in bval
+will be used. That means you always have to specify bval when making
+use of any of the options in the openinfo parameter. This documentation
+error will be fixed in the next release of Berkeley DB.
+
+That clarifies the situation with regards Berkeley DB itself. What
+about B<DB_File>? Well, the behavior defined in the quote above is
+quite useful, so B<DB_File> conforms it.
+
+That means that you can specify other options (e.g. cachesize) and
+still have bval default to C<"\n"> for variable length records, and
+space for fixed length records.
+
 =head2 A Simple Example
 
 Here is a simple example that uses RECNO.
@@ -1522,6 +1549,14 @@ is installed.
 
 Minor namespace cleanup: Localized C<PrintBtree>.
 
+=item 1.07
+
+Fixed bug with RECNO, where bval wasn't defaulting to "\n".
+
+=item 1.08
+
+Documented operation of bval.
+
 =back
 
 =head1 BUGS
index f7dc378..821eaae 100644 (file)
@@ -3,11 +3,15 @@
  DB_File.xs -- Perl 5 interface to Berkeley DB 
 
  written by Paul Marquess (pmarquess@bfsec.bt.co.uk)
- last modified 27th Nov 1996
- version 1.06
+ last modified 3rd Dec 1996
+ version 1.08
 
  All comments/suggestions/problems are welcome
 
+     Copyright (c) 1995, 1996 Paul Marquess. All rights reserved.
+     This program is free software; you can redistribute it and/or
+     modify it under the same terms as Perl itself.
+
  Changes:
        0.1 -   Initial Release
        0.2 -   No longer bombs out if dbopen returns an error.
@@ -28,6 +32,8 @@
        1.05 -  Added logic to allow prefix & hash types to be specified via
                Makefile.PL
        1.06 -  Minor namespace cleanup: Localized PrintBtree.
+       1.07 -  Fixed bug with RECNO, where bval wasn't defaulting to "\n". 
+       1.08 -  No change to DB_File.xs
 
 */
 
@@ -270,7 +276,7 @@ RECNOINFO * recno ;
     printf ("  psize     = %d\n", recno->psize) ;
     printf ("  lorder    = %d\n", recno->lorder) ;
     printf ("  reclen    = %d\n", recno->reclen) ;
-    printf ("  bval      = %d\n", recno->bval) ;
+    printf ("  bval      = %d 0x%x\n", recno->bval, recno->bval) ;
     printf ("  bfname    = %d [%s]\n", recno->bfname, recno->bfname) ;
 }
 
@@ -361,7 +367,11 @@ SV *   sv ;
         if (! SvROK(sv) )
             croak ("type parameter is not a reference") ;
 
-        action = (HV*)SvRV(sv);
+        svp  = hv_fetch( (HV*)SvRV(sv), "GOT", 3, FALSE) ;
+        if (svp && SvOK(*svp))
+            action  = (HV*) SvRV(*svp) ;
+       else
+           croak("internal error") ;
 
         if (sv_isa(sv, "DB_File::HASHINFO"))
         {
@@ -476,10 +486,12 @@ SV *   sv ;
            }
          
             svp = hv_fetch(action, "bfname", 6, FALSE); 
-            if (svp) {
+            if (svp && SvOK(*svp)) {
                char * ptr = SvPV(*svp,na) ;
-                info->recno.bfname = (char*) na ? ptr : 0 ;
+                info->recno.bfname = (char*) na ? ptr : NULL ;
            }
+           else
+               info->recno.bfname = NULL ;
 
             PrintRecno(info) ;
         }
index e4aa293..e5f9b2f 100644 (file)
@@ -2736,7 +2736,7 @@ setlocale(category, locale = 0)
     CODE:
        RETVAL = setlocale(category, locale);
        if (RETVAL) {
-#ifdef LC_CTYPE
+#ifdef USE_LOCALE_CTYPE
            if (category == LC_CTYPE
 #ifdef LC_ALL
                || category == LC_ALL
@@ -2752,8 +2752,8 @@ setlocale(category, locale = 0)
                    newctype = RETVAL;
                perl_new_ctype(newctype);
            }
-#endif /* LC_CTYPE */
-#ifdef LC_COLLATE
+#endif /* USE_LOCALE_CTYPE */
+#ifdef USE_LOCALE_COLLATE
            if (category == LC_COLLATE
 #ifdef LC_ALL
                || category == LC_ALL
@@ -2769,8 +2769,8 @@ setlocale(category, locale = 0)
                    newcoll = RETVAL;
                perl_new_collate(newcoll);
            }
-#endif /* LC_COLLATE */
-#ifdef LC_NUMERIC
+#endif /* USE_LOCALE_COLLATE */
+#ifdef USE_LOCALE_NUMERIC
            if (category == LC_NUMERIC
 #ifdef LC_ALL
                || category == LC_ALL
@@ -2786,7 +2786,7 @@ setlocale(category, locale = 0)
                    newnum = RETVAL;
                perl_new_numeric(newnum);
            }
-#endif /* LC_NUMERIC */
+#endif /* USE_LOCALE_NUMERIC */
        }
     OUTPUT:
        RETVAL
@@ -3102,7 +3102,7 @@ strtod(str)
        double num;
        char *unparsed;
     PPCODE:
-       NUMERIC_LOCAL();
+       SET_NUMERIC_LOCAL();
        num = strtod(str, &unparsed);
        PUSHs(sv_2mortal(newSVnv(num)));
        if (GIMME == G_ARRAY) {
index a02c73f..23bbfe9 100644 (file)
@@ -231,7 +231,7 @@ register int siz;
 
        for (i = 1; i < n; i += 2) {
                if (siz == off - ino[i] &&
-                   memcmp(key, pag + ino[i], siz) == 0)
+                   memEQ(key, pag + ino[i], siz))
                        return i;
                off = ino[i + 1];
        }
index 11967ec..c9b28f5 100644 (file)
@@ -185,10 +185,6 @@ extern long sdbm_hash proto((char *, int));
 #include <memory.h>
 #endif
 
-#if defined(mips) && defined(ultrix) && !defined(__STDC__)
-#   undef HAS_MEMCMP
-#endif
-
 #ifdef HAS_MEMCPY
 #  if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
 #    ifndef memcpy
@@ -222,24 +218,44 @@ extern long sdbm_hash proto((char *, int));
 #   endif
 #endif /* HAS_MEMSET */
 
-#ifdef HAS_MEMCMP
+#if defined(mips) && defined(ultrix) && !defined(__STDC__)
+#   undef HAS_MEMCMP
+#endif
+
+#if defined(HAS_MEMCMP) && defined(HAS_SANE_MEMCMP)
 #  if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
 #    ifndef memcmp
        extern int memcmp _((char*, char*, int));
 #    endif
 #  endif
+#  ifdef BUGGY_MSC
+  #  pragma function(memcmp)
+#  endif
 #else
 #   ifndef memcmp
-#      define memcmp   my_memcmp
+#      /* maybe we should have included the full embedding header... */
+#      ifdef NO_EMBED
+#          define memcmp my_memcmp
+#      else
+#          define memcmp Perl_my_memcmp
+#      endif
+       extern int memcmp _((char*, char*, int));
 #   endif
 #endif /* HAS_MEMCMP */
 
-/* we prefer bcmp slightly for comparisons that don't care about ordering */
 #ifndef HAS_BCMP
 #   ifndef bcmp
 #      define bcmp(s1,s2,l) memcmp(s1,s2,l)
 #   endif
-#endif /* HAS_BCMP */
+#endif /* !HAS_BCMP */
+
+#ifdef HAS_MEMCMP
+#  define memNE(s1,s2,l) (memcmp(s1,s2,l))
+#  define memEQ(s1,s2,l) (!memcmp(s1,s2,l))
+#else
+#  define memNE(s1,s2,l) (bcmp(s1,s2,l))
+#  define memEQ(s1,s2,l) (!bcmp(s1,s2,l))
+#endif
 
 #ifdef I_NETINET_IN
 #   include <netinet/in.h>
diff --git a/handy.h b/handy.h
index b6350a9..056bf2c 100644 (file)
--- a/handy.h
+++ b/handy.h
@@ -124,6 +124,14 @@ typedef unsigned short     U16;
 #define strnNE(s1,s2,l) (strncmp(s1,s2,l))
 #define strnEQ(s1,s2,l) (!strncmp(s1,s2,l))
 
+#ifdef HAS_MEMCMP
+#  define memNE(s1,s2,l) (memcmp(s1,s2,l))
+#  define memEQ(s1,s2,l) (!memcmp(s1,s2,l))
+#else
+#  define memNE(s1,s2,l) (bcmp(s1,s2,l))
+#  define memEQ(s1,s2,l) (!bcmp(s1,s2,l))
+#endif
+
 /*
  * Character classes.
  *
diff --git a/hv.c b/hv.c
index b25c2e2..0650123 100644 (file)
--- a/hv.c
+++ b/hv.c
@@ -127,7 +127,7 @@ I32 lval;
            continue;
        if (HeKLEN(entry) != klen)
            continue;
-       if (memcmp(HeKEY(entry),key,klen))      /* is this it? */
+       if (memNE(HeKEY(entry),key,klen))       /* is this it? */
            continue;
        return &HeVAL(entry);
     }
@@ -207,7 +207,7 @@ register U32 hash;
            continue;
        if (HeKLEN(entry) != klen)
            continue;
-       if (memcmp(HeKEY(entry),key,klen))      /* is this it? */
+       if (memNE(HeKEY(entry),key,klen))       /* is this it? */
            continue;
        return entry;
     }
@@ -271,7 +271,7 @@ register U32 hash;
            continue;
        if (HeKLEN(entry) != klen)
            continue;
-       if (memcmp(HeKEY(entry),key,klen))      /* is this it? */
+       if (memNE(HeKEY(entry),key,klen))       /* is this it? */
            continue;
        SvREFCNT_dec(HeVAL(entry));
        HeVAL(entry) = val;
@@ -344,7 +344,7 @@ register U32 hash;
            continue;
        if (HeKLEN(entry) != klen)
            continue;
-       if (memcmp(HeKEY(entry),key,klen))      /* is this it? */
+       if (memNE(HeKEY(entry),key,klen))       /* is this it? */
            continue;
        SvREFCNT_dec(HeVAL(entry));
        HeVAL(entry) = val;
@@ -411,7 +411,7 @@ I32 flags;
            continue;
        if (HeKLEN(entry) != klen)
            continue;
-       if (memcmp(HeKEY(entry),key,klen))      /* is this it? */
+       if (memNE(HeKEY(entry),key,klen))       /* is this it? */
            continue;
        *oentry = HeNEXT(entry);
        if (i && !*oentry)
@@ -473,7 +473,7 @@ U32 hash;
            continue;
        if (HeKLEN(entry) != klen)
            continue;
-       if (memcmp(HeKEY(entry),key,klen))      /* is this it? */
+       if (memNE(HeKEY(entry),key,klen))       /* is this it? */
            continue;
        *oentry = HeNEXT(entry);
        if (i && !*oentry)
@@ -527,7 +527,7 @@ U32 klen;
            continue;
        if (HeKLEN(entry) != klen)
            continue;
-       if (memcmp(HeKEY(entry),key,klen))      /* is this it? */
+       if (memNE(HeKEY(entry),key,klen))       /* is this it? */
            continue;
        return TRUE;
     }
@@ -574,7 +574,7 @@ U32 hash;
            continue;
        if (HeKLEN(entry) != klen)
            continue;
-       if (memcmp(HeKEY(entry),key,klen))      /* is this it? */
+       if (memNE(HeKEY(entry),key,klen))       /* is this it? */
            continue;
        return TRUE;
     }
@@ -1045,7 +1045,7 @@ U32 hash;
            continue;
        if (HeKLEN(entry) != len)
            continue;
-       if (memcmp(HeKEY(entry),str,len))               /* is this it? */
+       if (memNE(HeKEY(entry),str,len))        /* is this it? */
            continue;
        found = 1;
        if (--HeVAL(entry) == Nullsv) {
@@ -1092,7 +1092,7 @@ register U32 hash;
            continue;
        if (HeKLEN(entry) != len)
            continue;
-       if (memcmp(HeKEY(entry),str,len))               /* is this it? */
+       if (memNE(HeKEY(entry),str,len))        /* is this it? */
            continue;
        found = 1;
        break;
diff --git a/hv.h b/hv.h
index c8d8be6..5256eac 100644 (file)
--- a/hv.h
+++ b/hv.h
@@ -111,7 +111,7 @@ struct xpvhv {
 #define HeSVKEY_set(he,sv)     (HeKEY_sv(he) = sv)
 
 #define Nullhek Null(HEK*)
-#define HEK_BASESIZE           OFFSETOF(HEK, hek_key)
+#define HEK_BASESIZE           OFFSETOF(HEK, hek_key[0])
 #define HEK_HASH(hek)          (hek)->hek_hash
 #define HEK_LEN(hek)           (hek)->hek_len
 #define HEK_KEY(hek)           (hek)->hek_key
index a9082df..f4e6895 100755 (executable)
@@ -73,6 +73,7 @@ if ($d_dosuid && $>) { die "You must run as root to install suidperl\n"; }
 
 &safe_unlink("$installbin/perl$ver$exe_ext");
 &cmd("cp perl$exe_ext $installbin/perl$ver$exe_ext");
+&chmod(0755, "$installbin/perl$ver$exe_ext");
 
 &safe_unlink("$installbin/sperl$ver$exe_ext");
 if ($d_dosuid) {
index 086a109..595e875 100755 (executable)
@@ -1,5 +1,6 @@
 #!/usr/bin/perl
 
+unlink "keywords.h";
 open(KW, ">keywords.h") || die "Can't create keywords.h: $!\n";
 select KW;
 
diff --git a/lib/Class/Template.pm b/lib/Class/Template.pm
new file mode 100644 (file)
index 0000000..e45a5d3
--- /dev/null
@@ -0,0 +1,241 @@
+package Class::Template;
+require 5.000;
+require Exporter;
+
+@ISA = qw(Exporter);
+@EXPORT = qw(members struct);
+use strict;
+
+# Template.pm   --- struct/member template builder
+#   12mar95
+#   Dean Roehrich
+#
+# changes/bugs fixed since 28nov94 version:
+#  - podified
+# changes/bugs fixed since 21nov94 version:
+#  - Fixed examples.
+# changes/bugs fixed since 02sep94 version:
+#  - Moved to Class::Template.
+# changes/bugs fixed since 20feb94 version:
+#  - Updated to be a more proper module.
+#  - Added "use strict".
+#  - Bug in build_methods, was using @var when @$var needed.
+#  - Now using my() rather than local().
+#
+# Uses perl5 classes to create nested data types.
+# This is offered as one implementation of Tom Christiansen's "structs.pl"
+# idea.
+
+=head1 NAME
+
+Class::Template - struct/member template builder
+
+=head1 EXAMPLES
+
+=item * Example 1
+
+       use Class::Template;
+       
+       struct( rusage => {
+               ru_utime => timeval,
+               ru_stime => timeval,
+       });
+       
+       struct( timeval => [
+               tv_secs  => '$',
+               tv_usecs => '$',
+       ]);
+
+       my $s = new rusage;
+
+=item * Example 2
+
+       package OBJ;
+       use Class::Template;
+
+       members OBJ {
+               'a'     => '$',
+               'b'     => '$',
+       };
+
+       members OBJ2 {
+               'd'     => '@',
+               'c'     => '$',
+       };
+
+       package OBJ2; @ISA = (OBJ);
+
+       sub new {
+               my $r = InitMembers( &OBJ::InitMembers() );
+               bless $r;
+       }
+
+=head1 NOTES
+Use '%' if the member should point to an anonymous hash.  Use '@' if the
+member should point to an anonymous array.
+
+When using % and @ the method requires one argument for the key or index
+into the hash or array.
+
+Prefix the %, @, or $ with '*' to indicate you want to retrieve pointers to
+the values rather than the values themselves.
+
+=cut
+
+Var: {
+       $Class::Template::print = 0;
+       sub printem { $Class::Template::print++ }
+}
+
+
+sub struct {
+       my( $struct, $ref ) = @_;
+       my @methods = ();
+       my %refs = ();
+       my %arrays = ();
+       my %hashes = ();
+       my $out = '';
+
+       $out = "{\n  package $struct;\n  sub new {\n";
+       parse_fields( $ref, \$out, \@methods, \%refs, \%arrays, \%hashes, 0 );
+       $out .= "      bless \$r;\n  }\n";
+       build_methods( $ref, \$out, \@methods, \%refs, \%arrays, \%hashes );
+       $out .= "}\n1;\n";
+
+       ( $Class::Template::print ) ? print( $out ) : eval $out;
+}
+
+sub members {
+       my( $pkg, $ref ) = @_;
+       my @methods = ();
+       my %refs = ();
+       my %arrays = ();
+       my %hashes = ();
+       my $out = '';
+
+       $out = "{\n  package $pkg;\n  sub InitMembers {\n";
+       parse_fields( $ref, \$out, \@methods, \%refs, \%arrays, \%hashes, 1 );
+       $out .= "      bless \$r;\n  }\n";
+       build_methods( $ref, \$out, \@methods, \%refs, \%arrays, \%hashes );
+       $out .= "}\n1;\n";
+
+       ( $Class::Template::print ) ? print( $out ) : eval $out;
+}
+
+
+sub parse_fields {
+       my( $ref, $out, $methods, $refs, $arrays, $hashes, $member ) = @_;
+       my $type = ref $ref;
+       my @keys;
+       my $val;
+       my $cnt = 0;
+       my $idx = 0;
+       my( $cmt, $n );
+
+       if( $type eq 'HASH' ){
+               if( $member ){
+                       $$out .= "      my(\$r) = \@_ ? shift : {};\n";
+               }
+               else{
+                       $$out .= "      my(\$r) = {};\n";
+               }
+               @keys = keys %$ref;
+               foreach (@keys){
+                       $val = $ref->{$_};
+                       if( $val =~ /^\*(.)/ ){
+                               $refs->{$_}++;
+                               $val = $1;
+                       }
+                       if( $val eq '@' ){
+                               $$out .= "      \$r->{'$_'} = [];\n";
+                               $arrays->{$_}++;
+                       }
+                       elsif( $val eq '%' ){
+                               $$out .= "      \$r->{'$_'} = {};\n";
+                               $hashes->{$_}++;
+                       }
+                       elsif( $val ne '$' ){
+                               $$out .= "      \$r->{'$_'} = \&${val}::new();\n";
+                       }
+                       else{
+                               $$out .= "      \$r->{'$_'} = undef;\n";
+                       }
+                       push( @$methods, $_ );
+               }
+       }
+       elsif( $type eq 'ARRAY' ){
+               if( $member ){
+                       $$out .= "      my(\$r) = \@_ ? shift : [];\n";
+               }
+               else{
+                       $$out .= "      my(\$r) = [];\n";
+               }
+               while( $idx < @$ref ){
+                       $n = $ref->[$idx];
+                       push( @$methods, $n );
+                       $val = $ref->[$idx+1];
+                       $cmt = "# $n";
+                       if( $val =~ /^\*(.)/ ){
+                               $refs->{$n}++;
+                               $val = $1;
+                       }
+                       if( $val eq '@' ){
+                               $$out .= "      \$r->[$cnt] = []; $cmt\n";
+                               $arrays->{$n}++;
+                       }
+                       elsif( $val eq '%' ){
+                               $$out .= "      \$r->[$cnt] = {}; $cmt\n";
+                               $hashes->{$n}++;
+                       }
+                       elsif( $val ne '$' ){
+                               $$out .= "      \$r->[$cnt] = \&${val}::new();\n";
+                       }
+                       else{
+                               $$out .= "      \$r->[$cnt] = undef; $cmt\n";
+                       }
+                       ++$cnt;
+                       $idx += 2;
+               }
+       }
+}
+
+
+sub build_methods {
+       my( $ref, $out, $methods, $refs, $arrays, $hashes ) = @_;
+       my $type = ref $ref;
+       my $elem = '';
+       my $cnt = 0;
+       my( $pre, $pst, $cmt, $idx );
+
+       foreach (@$methods){
+               $pre = $pst = $cmt = $idx = '';
+               if( defined $refs->{$_} ){
+                       $pre = "\\(";
+                       $pst = ")";
+                       $cmt = " # returns ref";
+               }
+               $$out .= "  sub $_ {$cmt\n      my \$r = shift;\n";
+               if( $type eq 'ARRAY' ){
+                       $elem = "[$cnt]";
+                       ++$cnt;
+               }
+               elsif( $type eq 'HASH' ){
+                       $elem = "{'$_'}";
+               }
+               if( defined $arrays->{$_} ){
+                       $$out .= "      my \$i;\n";
+                       $$out .= "      \@_ ? (\$i = shift) : return \$r->$elem;\n";
+                       $idx = "->[\$i]";
+               }
+               elsif( defined $hashes->{$_} ){
+                       $$out .= "      my \$i;\n";
+                       $$out .= "      \@_ ? (\$i = shift) : return \$r->$elem;\n";
+                       $idx = "->{\$i}";
+               }
+               $$out .= "      \@_ ? (\$r->$elem$idx = shift) : $pre\$r->$elem$idx$pst;\n";
+               $$out .= "  }\n";
+       }
+}
+
+1;
index c4a3c68..fb2664c 100644 (file)
@@ -1,4 +1,4 @@
-# $Id: Embed.pm,v 1.18 1996/07/02 13:48:17 dougm Exp $
+# $Id: Embed.pm,v 1.21 1996/11/29 17:26:23 dougm Exp $
 require 5.002;
 
 package ExtUtils::Embed;
@@ -17,7 +17,7 @@ use vars qw(@ISA @EXPORT $VERSION
            );
 use strict;
 
-$VERSION = sprintf("%d.%02d", q$Revision: 1.18 $ =~ /(\d+)\.(\d+)/);
+$VERSION = sprintf("%d.%02d", q$Revision: 1.21 $ =~ /(\d+)\.(\d+)/);
 #for the namespace change
 $Devel::embed::VERSION = "99.99";
 
@@ -201,7 +201,7 @@ sub ldopts {
 
     my($extralibs, $bsloadlibs, $ldloadlibs, $ld_run_path) =
        $MM->ext(join ' ', 
-                $MM->catdir("-L$Config{archlib}", "CORE"), " -lperl", 
+                $MM->catdir("-L$Config{archlibexp}", "CORE"), " -lperl", 
                 @potential_libs);
 
     my $ld_or_bs = $bsloadlibs || $ldloadlibs;
@@ -419,11 +419,11 @@ conflict, the additional arguments will be part of the output.
 
 For including perl header files this function simply prints:
 
- -I$Config{archlib}/CORE  
+ -I$Config{archlibexp}/CORE  
 
 So, rather than having to say:
 
- perl -MConfig -e 'print "-I$Config{archlib}/CORE"'
+ perl -MConfig -e 'print "-I$Config{archlibexp}/CORE"'
 
 Just say:
 
index 62f3b50..2e35303 100644 (file)
@@ -156,7 +156,7 @@ sub rmtree {
            print "unlink $root\n" if $verbose;
            while (-e $root || -l $root) { # delete all versions under VMS
                (unlink($root) && ++$count)
-                   or carp "Can't unlink file $root: $!";
+                   or croak "Can't unlink file $root: $!";
            }
         }
     }
diff --git a/lib/File/stat.pm b/lib/File/stat.pm
new file mode 100644 (file)
index 0000000..581fbf3
--- /dev/null
@@ -0,0 +1,111 @@
+package File::stat;
+use strict;
+
+BEGIN { 
+    use Exporter   ();
+    use vars       qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+    @ISA         = qw(Exporter);
+    @EXPORT      = qw(stat lstat);
+    @EXPORT_OK   = qw( $st_dev    $st_ino    $st_mode 
+                      $st_nlink   $st_uid    $st_gid 
+                      $st_rdev    $st_size 
+                      $st_atime   $st_mtime  $st_ctime 
+                      $st_blksize $st_blocks
+                   );
+    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+}
+use vars      @EXPORT_OK;
+
+use Class::Template qw(struct);
+struct 'File::stat' => [
+     map { $_ => '$' } qw{
+        dev ino mode nlink uid gid rdev size
+        atime mtime ctime blksize blocks
+     }
+];
+
+sub populate (@) {
+    return unless @_;
+    my $stob = new();
+    @$stob = (
+       $st_dev, $st_ino, $st_mode, $st_nlink, $st_uid, $st_gid, $st_rdev,
+        $st_size, $st_atime, $st_mtime, $st_ctime, $st_blksize, $st_blocks ) 
+           = @_;
+    return $stob;
+} 
+
+sub lstat (*)  { populate(CORE::lstat(shift)) }
+
+sub stat ($) {
+    my $arg = shift;
+    my $st = populate(CORE::stat $arg);
+    return $st if $st;
+    no strict 'refs';
+    require Symbol;
+    return populate(CORE::stat \*{Symbol::qualify($arg)});
+}
+
+1;
+__END__
+
+=head1 NAME
+
+File::stat.pm - by-name interface to Perl's built-in stat() functions
+
+=head1 SYNOPSIS
+
+ use File::stat;
+ $st = stat($file) or die "No $file: $!";
+ if ( ($st->mode & 0111) && $st->nlink > 1) ) {
+     print "$file is executable with lotsa links\n";
+ } 
+
+ use File::stat qw(:FIELDS);
+ stat($file) or die "No $file: $!";
+ if ( ($st_mode & 0111) && $st_nlink > 1) ) {
+     print "$file is executable with lotsa links\n";
+ } 
+
+=head1 DESCRIPTION
+
+This module's default exports override the core stat() 
+and lstat() functions, replacing them with versions that return 
+"File::stat" objects.  This object has methods that
+return the similarly named structure field name from the
+stat(2) function; namely,
+dev,
+ino,
+mode,
+nlink,
+uid,
+gid,
+rdev,
+size,
+atime,
+mtime,
+ctime,
+blksize,
+and
+blocks.  
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag.  (Note that this still
+overrides your stat() and lstat() functions.)  Access these fields as
+variables named with a preceding C<st_> in front their method names.
+Thus, C<$stat_obj-E<gt>dev()> corresponds to $st_dev if you import
+the fields.
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Template
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
diff --git a/lib/FileHandle.pm b/lib/FileHandle.pm
new file mode 100644 (file)
index 0000000..b215147
--- /dev/null
@@ -0,0 +1,227 @@
+package FileHandle;
+
+require 5.003;
+use strict;
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK);
+
+$VERSION = "2.00";
+
+require IO::File;
+@ISA = qw(IO::File);
+
+@EXPORT = qw(_IOFBF _IOLBF _IONBF);
+
+@EXPORT_OK = qw(
+    pipe
+
+    autoflush
+    output_field_separator
+    output_record_separator
+    input_record_separator
+    input_line_number
+    format_page_number
+    format_lines_per_page
+    format_lines_left
+    format_name
+    format_top_name
+    format_line_break_characters
+    format_formfeed
+
+    print
+    printf
+    getline
+    getlines
+);
+
+#
+# Everything we're willing to export, we must first import.
+#
+import IO::Handle grep { !defined(&$_) } @EXPORT, @EXPORT_OK;
+
+#
+# Specialized importer for Fcntl magic.
+#
+sub import {
+    my $pkg = shift;
+    my $callpkg = caller;
+    Exporter::export $pkg, $callpkg, @_;
+
+    #
+    # If the Fcntl extension is available,
+    #  export its constants.
+    #
+    eval {
+       require Fcntl;
+       Exporter::export 'Fcntl', $callpkg;
+    };
+}
+
+################################################
+# This is the only exported function we define;
+# the rest come from other classes.
+#
+
+sub pipe {
+    my $r = new IO::Handle;
+    my $w = new IO::Handle;
+    CORE::pipe($r, $w) or return undef;
+    ($r, $w);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+FileHandle - supply object methods for filehandles
+
+=head1 SYNOPSIS
+
+    use FileHandle;
+
+    $fh = new FileHandle;
+    if ($fh->open "< file") {
+        print <$fh>;
+        $fh->close;
+    }
+
+    $fh = new FileHandle "> FOO";
+    if (defined $fh) {
+        print $fh "bar\n";
+        $fh->close;
+    }
+
+    $fh = new FileHandle "file", "r";
+    if (defined $fh) {
+        print <$fh>;
+        undef $fh;       # automatically closes the file
+    }
+
+    $fh = new FileHandle "file", O_WRONLY|O_APPEND;
+    if (defined $fh) {
+        print $fh "corge\n";
+        undef $fh;       # automatically closes the file
+    }
+
+    $pos = $fh->getpos;
+    $fh->setpos $pos;
+
+    $fh->setvbuf($buffer_var, _IOLBF, 1024);
+
+    ($readfh, $writefh) = FileHandle::pipe;
+
+    autoflush STDOUT 1;
+
+=head1 DESCRIPTION
+
+NOTE: This class is now a front-end to the IO::* classes.
+
+C<FileHandle::new> creates a C<FileHandle>, which is a reference to a
+newly created symbol (see the C<Symbol> package).  If it receives any
+parameters, they are passed to C<FileHandle::open>; if the open fails,
+the C<FileHandle> object is destroyed.  Otherwise, it is returned to
+the caller.
+
+C<FileHandle::new_from_fd> creates a C<FileHandle> like C<new> does.
+It requires two parameters, which are passed to C<FileHandle::fdopen>;
+if the fdopen fails, the C<FileHandle> object is destroyed.
+Otherwise, it is returned to the caller.
+
+C<FileHandle::open> accepts one parameter or two.  With one parameter,
+it is just a front end for the built-in C<open> function.  With two
+parameters, the first parameter is a filename that may include
+whitespace or other special characters, and the second parameter is
+the open mode, optionally followed by a file permission value.
+
+If C<FileHandle::open> receives a Perl mode string (">", "+<", etc.)
+or a POSIX fopen() mode string ("w", "r+", etc.), it uses the basic
+Perl C<open> operator.
+
+If C<FileHandle::open> is given a numeric mode, it passes that mode
+and the optional permissions value to the Perl C<sysopen> operator.
+For convenience, C<FileHandle::import> tries to import the O_XXX
+constants from the Fcntl module.  If dynamic loading is not available,
+this may fail, but the rest of FileHandle will still work.
+
+C<FileHandle::fdopen> is like C<open> except that its first parameter
+is not a filename but rather a file handle name, a FileHandle object,
+or a file descriptor number.
+
+If the C functions fgetpos() and fsetpos() are available, then
+C<FileHandle::getpos> returns an opaque value that represents the
+current position of the FileHandle, and C<FileHandle::setpos> uses
+that value to return to a previously visited position.
+
+If the C function setvbuf() is available, then C<FileHandle::setvbuf>
+sets the buffering policy for the FileHandle.  The calling sequence
+for the Perl function is the same as its C counterpart, including the
+macros C<_IOFBF>, C<_IOLBF>, and C<_IONBF>, except that the buffer
+parameter specifies a scalar variable to use as a buffer.  WARNING: A
+variable used as a buffer by C<FileHandle::setvbuf> must not be
+modified in any way until the FileHandle is closed or until
+C<FileHandle::setvbuf> is called again, or memory corruption may
+result!
+
+See L<perlfunc> for complete descriptions of each of the following
+supported C<FileHandle> methods, which are just front ends for the
+corresponding built-in functions:
+  
+    close
+    fileno
+    getc
+    gets
+    eof
+    clearerr
+    seek
+    tell
+
+See L<perlvar> for complete descriptions of each of the following
+supported C<FileHandle> methods:
+
+    autoflush
+    output_field_separator
+    output_record_separator
+    input_record_separator
+    input_line_number
+    format_page_number
+    format_lines_per_page
+    format_lines_left
+    format_name
+    format_top_name
+    format_line_break_characters
+    format_formfeed
+
+Furthermore, for doing normal I/O you might need these:
+
+=over 
+
+=item $fh->print
+
+See L<perlfunc/print>.
+
+=item $fh->printf
+
+See L<perlfunc/printf>.
+
+=item $fh->getline
+
+This works like <$fh> described in L<perlop/"I/O Operators">
+except that it's more readable and can be safely called in an
+array context but still returns just one line.
+
+=item $fh->getlines
+
+This works like <$fh> when called in an array context to
+read all the remaining lines in a file, except that it's more readable.
+It will also croak() if accidentally called in a scalar context.
+
+=back
+
+=head1 SEE ALSO
+
+The B<IO> extension,
+L<perlfunc>, 
+L<perlop/"I/O Operators">.
+
+=cut
diff --git a/lib/Net/hostent.pm b/lib/Net/hostent.pm
new file mode 100644 (file)
index 0000000..1eeaae3
--- /dev/null
@@ -0,0 +1,147 @@
+package Net::hostent;
+use strict;
+
+BEGIN { 
+    use Exporter   ();
+    use vars       qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+    @ISA         = qw(Exporter);
+    @EXPORT      = qw(gethostbyname gethostbyaddr gethost);
+    @EXPORT_OK   = qw(
+                       $h_name         @h_aliases
+                       $h_addrtype     $h_length
+                       @h_addr_list    $h_addr
+                  );
+    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+}
+use vars      @EXPORT_OK;
+
+use Class::Template qw(struct);
+struct 'Net::hostent' => [
+   name                => '$',
+   aliases     => '@',
+   addrtype    => '$',
+   'length'    => '$',
+   addr_list   => '@',
+];
+
+sub addr { shift->addr_list->[0] }
+
+sub populate (@) {
+    return unless @_;
+    my $hob = new();
+    $h_name     =    $hob->[0]              = $_[0];
+    @h_aliases  = @{ $hob->[1] } = split ' ', $_[1];
+    $h_addrtype  =    $hob->[2]             = $_[2];
+    $h_length   =    $hob->[3]              = $_[3];
+    $h_addr     =                             $_[4];
+    @h_addr_list = @{ $hob->[4] } =          @_[ (4 .. $#_) ];
+    return $hob;
+} 
+
+sub gethostbyname ($)  { populate(CORE::gethostbyname(shift)) } 
+
+sub gethostbyaddr ($;$) { 
+    my ($addr, $addrtype);
+    $addr = shift;
+    require Socket unless @_;
+    $addrtype = @_ ? shift : Socket::AF_INET();
+    populate(CORE::gethostbyaddr($addr, $addrtype)) 
+} 
+
+sub gethost($) {
+    if ($_[0] =~ /^\d+(?:\.\d+(?:\.\d+(?:\.\d+)?)?)?$/) {
+       require Socket;
+       &gethostbyaddr(Socket::inet_aton(shift));
+    } else {
+       &gethostbyname;
+    } 
+} 
+
+1;
+__END__
+
+=head1 NAME
+
+Net::hostent - by-name interface to Perl's built-in gethost*() functions
+
+=head1 SYNOPSIS
+
+ use Net::hostnet;
+
+=head1 DESCRIPTION
+
+This module's default exports override the core gethostbyname() and
+gethostbyaddr() functions, replacing them with versions that return
+"Net::hostent" objects.  This object has methods that return the similarly
+named structure field name from the C's hostent structure from F<netdb.h>;
+namely name, aliases, addrtype, length, and addresses.  The aliases and
+addresses methods return array reference, the rest scalars.  The addr
+method is equivalent to the zeroth element in the addresses array
+reference.
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag.  (Note that this still
+overrides your core functions.)  Access these fields as variables named
+with a preceding C<h_>.  Thus, C<$host_obj-E<gt>name()> corresponds to
+$h_name if you import the fields.  Array references are available as
+regular array variables, so for example C<@{ $host_obj-E<gt>aliases()
+}> would be simply @h_aliases.
+
+The gethost() funtion is a simple front-end that forwards a numeric
+argument to gethostbyaddr() by way of Socket::inet_aton, and the rest
+to gethostbyname().
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 EXAMPLES
+
+ use Net::hostent;
+ use Socket;
+
+ @ARGV = ('netscape.com') unless @ARGV;
+
+ for $host ( @ARGV ) {
+
+    unless ($h = gethost($host)) {
+       warn "$0: no such host: $host\n";
+       next;
+    }
+
+    printf "\n%s is %s%s\n", 
+           $host, 
+           lc($h->name) eq lc($host) ? "" : "*really* ",
+           $h->name;
+
+    print "\taliases are ", join(", ", @{$h->aliases}), "\n"
+               if @{$h->aliases};     
+
+    if ( @{$h->addr_list} > 1 ) { 
+       my $i;
+       for $addr ( @{$h->addr_list} ) {
+           printf "\taddr #%d is [%s]\n", $i++, inet_ntoa($addr);
+       } 
+    } else {
+       printf "\taddress is [%s]\n", inet_ntoa($h->addr);
+    } 
+
+    if ($h = gethostbyaddr($h->addr)) {
+       if (lc($h->name) ne lc($host)) {
+           printf "\tThat addr reverses to host %s!\n", $h->name;
+           $host = $h->name;
+           redo;
+       } 
+    }
+ }
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Template
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
diff --git a/lib/Net/netent.pm b/lib/Net/netent.pm
new file mode 100644 (file)
index 0000000..9f385b0
--- /dev/null
@@ -0,0 +1,165 @@
+package Net::netent;
+use strict;
+
+BEGIN { 
+    use Exporter   ();
+    use vars       qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+    @ISA         = qw(Exporter);
+    @EXPORT      = qw(getnetbyname getnetbyaddr getnet);
+    @EXPORT_OK   = qw(
+                       $n_name         @n_aliases
+                       $n_addrtype     $n_net
+                  );
+    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+}
+use vars      @EXPORT_OK;
+
+use Class::Template qw(struct);
+struct 'Net::netent' => [
+   name                => '$',
+   aliases     => '@',
+   addrtype    => '$',
+   net         => '$',
+];
+
+sub populate (@) {
+    return unless @_;
+    my $nob = new();
+    $n_name     =    $nob->[0]              = $_[0];
+    @n_aliases  = @{ $nob->[1] } = split ' ', $_[1];
+    $n_addrtype  =    $nob->[2]             = $_[2];
+    $n_net      =    $nob->[3]              = $_[3];
+    return $nob;
+} 
+
+sub getnetbyname ($)  { populate(CORE::getnetbyname(shift)) } 
+
+sub getnetbyaddr ($;$) { 
+    my ($net, $addrtype);
+    $net = shift;
+    require Socket if @_;
+    $addrtype = @_ ? shift : Socket::AF_INET();
+    populate(CORE::getnetbyaddr($net, $addrtype)) 
+} 
+
+sub getnet($) {
+    if ($_[0] =~ /^\d+(?:\.\d+(?:\.\d+(?:\.\d+)?)?)?$/) {
+       require Socket;
+       &getnetbyaddr(Socket::inet_aton(shift));
+    } else {
+       &getnetbyname;
+    } 
+} 
+
+1;
+__END__
+
+=head1 NAME
+
+Net::netent - by-name interface to Perl's built-in getnet*() functions
+
+=head1 SYNOPSIS
+
+ use Net::netent qw(:FIELDS);
+ getnetbyname("loopback")              or die "bad net";
+ printf "%s is %08X\n", $n_name, $n_net;
+
+ use Net::netent;
+
+ $n = getnetbyname("loopback")                 or die "bad net";
+ { # there's gotta be a better way, eh?
+     @bytes = unpack("C4", pack("N", $n->net));
+     shift @bytes while @bytes && $bytes[0] == 0;
+ }
+ printf "%s is %08X [%d.%d.%d.%d]\n", $n->name, $n->net, @bytes;
+
+=head1 DESCRIPTION
+
+This module's default exports override the core getnetbyname() and
+getnetbyaddr() functions, replacing them with versions that return
+"Net::netent" objects.  This object has methods that return the similarly
+named structure field name from the C's netent structure from F<netdb.h>;
+namely name, aliases, addrtype, and net.  The aliases 
+method returns an array reference, the rest scalars.  
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag.  (Note that this still
+overrides your core functions.)  Access these fields as variables named
+with a preceding C<n_>.  Thus, C<$net_obj-E<gt>name()> corresponds to
+$n_name if you import the fields.  Array references are available as
+regular array variables, so for example C<@{ $net_obj-E<gt>aliases()
+}> would be simply @n_aliases.
+
+The getnet() funtion is a simple front-end that forwards a numeric
+argument to getnetbyaddr(), and the rest
+to getnetbyname().
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 EXAMPLES
+
+The getnet() functions do this in the Perl core:
+
+    sv_setiv(sv, (I32)nent->n_net);
+
+The gethost() functions do this in the Perl core:
+
+    sv_setpvn(sv, hent->h_addr, len);
+
+That means that the address comes back in binary for the
+host functions, and as a regular perl integer for the net ones.
+This seems a bug, but here's how to deal with it:
+ use strict;
+ use Socket;
+ use Net::netent;
+ @ARGV = ('loopback') unless @ARGV;
+ my($n, $net);
+ for $net ( @ARGV ) {
+     unless ($n = getnetbyname($net)) {
+       warn "$0: no such net: $net\n";
+       next;
+     }
+     printf "\n%s is %s%s\n", 
+           $net, 
+           lc($n->name) eq lc($net) ? "" : "*really* ",
+           $n->name;
+     print "\taliases are ", join(", ", @{$n->aliases}), "\n"
+               if @{$n->aliases};     
+     # this is stupid; first, why is this not in binary?
+     # second, why am i going through these convolutions
+     # to make it looks right
+     {
+       my @a = unpack("C4", pack("N", $n->net));
+       shift @a while @a && $a[0] == 0;
+       printf "\taddr is %s [%d.%d.%d.%d]\n", $n->net, @a;
+     }
+     if ($n = getnetbyaddr($n->net)) {
+       if (lc($n->name) ne lc($net)) {
+           printf "\tThat addr reverses to net %s!\n", $n->name;
+           $net = $n->name;
+           redo;
+       } 
+     }
+ }
+=head1 NOTE
+
+While this class is currently implemented using the Class::Template
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
diff --git a/lib/Net/protoent.pm b/lib/Net/protoent.pm
new file mode 100644 (file)
index 0000000..ffd6acd
--- /dev/null
@@ -0,0 +1,92 @@
+package Net::protoent;
+use strict;
+
+BEGIN { 
+    use Exporter   ();
+    use vars       qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+    @ISA         = qw(Exporter);
+    @EXPORT      = qw(getprotobyname getprotobynumber getprotoent);
+    @EXPORT_OK   = qw( $p_name @p_aliases $p_proto );
+    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+}
+use vars      @EXPORT_OK;
+
+use Class::Template qw(struct);
+struct 'Net::protoent' => [
+   name                => '$',
+   aliases     => '@',
+   proto       => '$',
+];
+
+sub populate (@) {
+    return unless @_;
+    my $pob = new();
+    $p_name     =    $pob->[0]              = $_[0];
+    @p_aliases  = @{ $pob->[1] } = split ' ', $_[1];
+    $p_proto    =    $pob->[2]              = $_[2];
+    return $pob;
+} 
+
+sub getprotoent      ( )  { populate(CORE::getprotoent()) } 
+sub getprotobyname   ($)  { populate(CORE::getprotobyname(shift)) } 
+sub getprotobynumber ($)  { populate(CORE::getprotobynumber(shift)) } 
+
+sub getproto ($;$) {
+    no strict 'refs';
+    return &{'getprotoby' . ($_[0]=~/^\d+$/ ? 'number' : 'name')}(@_);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::protoent - by-name interface to Perl's built-in getproto*() functions
+
+=head1 SYNOPSIS
+
+ use Net::protoent;
+ $p = getprotobyname(shift || 'tcp') || die "no proto";
+ printf "proto for %s is %d, aliases are %s\n",
+    $p->name, $p->proto, "@{$p->aliases}";
+
+ use Net::protoent qw(:FIELDS);
+ getprotobyname(shift || 'tcp') || die "no proto";
+ print "proto for $p_name is $p_proto, aliases are @p_aliases\n";
+
+=head1 DESCRIPTION
+
+This module's default exports override the core getprotoent(),
+getprotobyname(), and getnetbyport() functions, replacing them with
+versions that return "Net::protoent" objects.  They take default
+second arguments of "tcp".  This object has methods that return the
+similarly named structure field name from the C's protoent structure
+from F<netdb.h>; namely name, aliases, and proto.  The aliases method
+returns an array reference, the rest scalars.
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag.  (Note that this still
+overrides your core functions.)  Access these fields as variables named
+with a preceding C<p_>.  Thus, C<$proto_obj-E<gt>name()> corresponds to
+$p_name if you import the fields.  Array references are available as
+regular array variables, so for example C<@{ $proto_obj-E<gt>aliases()
+}> would be simply @p_aliases.
+
+The getproto() function is a simple front-end that forwards a numeric
+argument to getprotobyport(), and the rest to getprotobyname().
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Template
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
diff --git a/lib/Net/servent.pm b/lib/Net/servent.pm
new file mode 100644 (file)
index 0000000..8c0fc13
--- /dev/null
@@ -0,0 +1,109 @@
+package Net::servent;
+use strict;
+
+BEGIN {
+    use Exporter   ();
+    use vars       qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+    @ISA         = qw(Exporter);
+    @EXPORT      = qw(getservbyname getservbyport getservent getserv);
+    @EXPORT_OK   = qw( $s_name @s_aliases $s_port $s_proto );
+    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+}
+use vars      @EXPORT_OK;
+
+use Class::Template qw(struct);
+struct 'Net::servent' => [
+   name                => '$',
+   aliases     => '@',
+   port                => '$',
+   proto       => '$',
+];
+
+sub populate (@) {
+    return unless @_;
+    my $sob = new();
+    $s_name     =    $sob->[0]              = $_[0];
+    @s_aliases  = @{ $sob->[1] } = split ' ', $_[1];
+    $s_port     =    $sob->[2]              = $_[2];
+    $s_proto    =    $sob->[3]              = $_[3];
+    return $sob;
+}
+
+sub getservent    (   ) { populate(CORE::getservent()) }
+sub getservbyname ($;$) { populate(CORE::getservbyname(shift,shift||'tcp')) }
+sub getservbyport ($;$) { populate(CORE::getservbyport(shift,shift||'tcp')) }
+
+sub getserv ($;$) {
+    no strict 'refs';
+    return &{'getservby' . ($_[0]=~/^\d+$/ ? 'port' : 'name')}(@_);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::servent - by-name interface to Perl's built-in getserv*() functions
+
+=head1 SYNOPSIS
+
+ use Net::servent;
+ $s = getservbyname(shift || 'ftp') || die "no service";
+ printf "port for %s is %s, aliases are %s\n",
+    $s->name, $s->port, "@{$s->aliases}";
+
+ use Net::servent qw(:FIELDS);
+ getservbyname(shift || 'ftp') || die "no service";
+ print "port for $s_name is $s_port, aliases are @s_aliases\n";
+
+=head1 DESCRIPTION
+
+This module's default exports override the core getservent(),
+getservbyname(), and
+getnetbyport() functions, replacing them with versions that return
+"Net::servent" objects.  They take default second arguments of "tcp".  This object has methods that return the similarly
+named structure field name from the C's servent structure from F<netdb.h>;
+namely name, aliases, port, and proto.  The aliases
+method returns an array reference, the rest scalars.
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag.  (Note that this still
+overrides your core functions.)  Access these fields as variables named
+with a preceding C<n_>.  Thus, C<$serv_obj-E<gt>name()> corresponds to
+$s_name if you import the fields.  Array references are available as
+regular array variables, so for example C<@{ $serv_obj-E<gt>aliases()
+}> would be simply @s_aliases.
+
+The getserv() function is a simple front-end that forwards a numeric
+argument to getservbyport(), and the rest to getservbyname().
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 EXAMPLES
+
+ use Net::servent qw(:FIELDS);
+
+ while (@ARGV) {
+     my ($service, $proto) = ((split m!/!, shift), 'tcp');
+     my $valet = getserv($service, $proto);
+     unless ($valet) {
+         warn "$0: No service: $service/$proto\n"
+         next;
+     }
+     printf "service $service/$proto is port %d\n", $valet->port;
+     print "alias are @s_aliases\n" if @s_aliases;
+ }
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Template
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
index 9998c48..c431728 100644 (file)
@@ -73,8 +73,8 @@ if($termcap and !$setuptermcap) {
 }
 
 $SCREEN = ($_[0] =~ /^-(\d+)/ && (shift, $1))
-       || ($ENV{TERMCAP} =~ /co#(\d+)/)[0]
        ||  $ENV{COLUMNS}
+       || ($ENV{TERMCAP} =~ /co#(\d+)/)[0]
        || (`stty -a 2>/dev/null` =~ /(\d+) columns/)[0]
        || 72;
 
index c524170..ee90127 100644 (file)
@@ -194,7 +194,7 @@ sub xlate {
     $name = uc $name;
     $name = "LOG_$name" unless $name =~ /^LOG_/;
     $name = "Sys::Syslog::$name";
-    eval(&$name) || -1;
+    defined &$name ? &$name : -1;
 }
 
 sub connect {
diff --git a/lib/Time/gmtime.pm b/lib/Time/gmtime.pm
new file mode 100644 (file)
index 0000000..35233f5
--- /dev/null
@@ -0,0 +1,87 @@
+package Time::gmtime;
+use strict;
+use Time::tm;
+
+BEGIN { 
+    use Exporter   ();
+    use vars       qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+    @ISA         = qw(Exporter Time::tm);
+    @EXPORT      = qw(gmtime gmctime);
+    @EXPORT_OK   = qw(  
+                       $tm_sec $tm_min $tm_hour $tm_mday 
+                       $tm_mon $tm_year $tm_wday $tm_yday 
+                       $tm_isdst
+                   );
+    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+}
+use vars      @EXPORT_OK;
+
+sub populate (@) {
+    return unless @_;
+    my $tmob = Time::tm->new();
+    @$tmob = (
+               $tm_sec, $tm_min, $tm_hour, $tm_mday, 
+               $tm_mon, $tm_year, $tm_wday, $tm_yday, 
+               $tm_isdst )
+           = @_;
+    return $tmob;
+} 
+
+sub gmtime (;$)    { populate CORE::gmtime(shift||time)}
+sub gmctime (;$)   { scalar   CORE::gmtime(shift||time)} 
+
+1;
+__END__
+
+=head1 NAME
+
+Time::gmtime.pm - by-name interface to Perl's built-in gmtime() function
+
+=head1 SYNOPSIS
+
+ use Time::gmtime;
+ $gm = gmtime();
+ printf "The day in Greenwich is %s\n", 
+    (qw(Sun Mon Tue Wed Thu Fri Sat Sun))[ gm->wday() ];
+
+ use Time::gmtime w(:FIELDS;
+ printf "The day in Greenwich is %s\n", 
+    (qw(Sun Mon Tue Wed Thu Fri Sat Sun))[ gm_wday() ];
+
+ $now = gmctime();
+
+ use Time::gmtime;
+ use File::stat;
+ $date_string = gmctime(stat($file)->mtime);
+
+=head1 DESCRIPTION
+
+This module's default exports override the core gmtime() function,
+replacing it with a version that returns "Time::tm" objects.
+This object has methods that return the similarly named structure field
+name from the C's tm structure from F<time.h>; namely sec, min, hour,
+mday, mon, year, wday, yday, and isdst.
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag.  (Note that this
+still overrides your core functions.)  Access these fields as variables
+named with a preceding C<tm_> in front their method names.  Thus,
+C<$tm_obj-E<gt>mday()> corresponds to $tm_mday if you import the fields.
+
+The gmctime() funtion provides a way of getting at the 
+scalar sense of the original CORE::gmtime() function.
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Template
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
diff --git a/lib/Time/localtime.pm b/lib/Time/localtime.pm
new file mode 100644 (file)
index 0000000..2e811e6
--- /dev/null
@@ -0,0 +1,83 @@
+package Time::localtime;
+use strict;
+use Time::tm;
+
+BEGIN { 
+    use Exporter   ();
+    use vars       qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+    @ISA         = qw(Exporter Time::tm);
+    @EXPORT      = qw(localtime ctime);
+    @EXPORT_OK   = qw(  
+                       $tm_sec $tm_min $tm_hour $tm_mday 
+                       $tm_mon $tm_year $tm_wday $tm_yday 
+                       $tm_isdst
+                   );
+    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+}
+use vars      @EXPORT_OK;
+
+sub populate (@) {
+    return unless @_;
+    my $tmob = Time::tm->new();
+    @$tmob = (
+               $tm_sec, $tm_min, $tm_hour, $tm_mday, 
+               $tm_mon, $tm_year, $tm_wday, $tm_yday, 
+               $tm_isdst )
+           = @_;
+    return $tmob;
+} 
+
+sub localtime (;$) { populate CORE::localtime(shift||time)}
+sub ctime (;$)     { scalar   CORE::localtime(shift||time) } 
+
+1;
+
+__END__
+
+=head1 NAME
+
+Time::localtime.pm - by-name interface to Perl's built-in localtime() function
+
+=head1 SYNOPSIS
+
+ use Time::localtime;
+ printf "Year is %d\n", localtime->year() + 1900;
+
+ $now = ctime();
+
+ use Time::localtime;
+ use File::stat;
+ $date_string = ctime(stat($file)->mtime);
+
+=head1 DESCRIPTION
+
+This module's default exports override the core localtime() function,
+replacing it with a version that returns "Time::tm" objects.
+This object has methods that return the similarly named structure field
+name from the C's tm structure from F<time.h>; namely sec, min, hour,
+mday, mon, year, wday, yday, and isdst.
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag.  (Note that this still
+overrides your core functions.)  Access these fields as
+variables named with a preceding C<tm_> in front their method names.
+Thus, C<$tm_obj-E<gt>mday()> corresponds to $tm_mday if you import
+the fields.
+
+The ctime() funtion provides a way of getting at the 
+scalar sense of the original CORE::localtime() function.
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Template
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
diff --git a/lib/Time/tm.pm b/lib/Time/tm.pm
new file mode 100644 (file)
index 0000000..87fc883
--- /dev/null
@@ -0,0 +1,27 @@
+package Time::tm;
+use strict;
+
+use Class::Template qw(struct);
+struct('Time::tm' => [
+     map { $_ => '$' } qw{ sec min hour mday mon year wday yday isdst }
+]);
+
+1;
+__END__
+
+=head1 NAME
+
+Time::tm.pm - internal object used by Time::gmtime and Time::localtime
+
+=head1 DESCRIPTION
+
+This module is used internally as a base class by Time::localtime And
+Time::gmtime functions.  It creates a Time::tm struct object which is
+addressable just like's C's tm structure from F<time.h>; namely with sec,
+min, hour, mday, mon, year, wday, yday, and isdst.
+
+This class is an internal interface only. 
+
+=head1 AUTHOR
+
+Tom Christiansen
diff --git a/lib/User/grent.pm b/lib/User/grent.pm
new file mode 100644 (file)
index 0000000..1185958
--- /dev/null
@@ -0,0 +1,91 @@
+package User::grent;
+use strict;
+
+BEGIN { 
+    use Exporter   ();
+    use vars       qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+    @ISA         = qw(Exporter);
+    @EXPORT      = qw(getgrent getgrgid getgrnam getgr);
+    @EXPORT_OK   = qw($gr_name $gr_gid $gr_passwd $gr_mem @gr_members);
+    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+}
+use vars      @EXPORT_OK;
+
+use Class::Template qw(struct);
+struct 'User::grent' => [
+    name    => '$',
+    passwd  => '$',
+    gid            => '$',
+    members => '@',
+];
+
+sub populate (@) {
+    return unless @_;
+    my $gob = new();
+    ($gr_name, $gr_passwd, $gr_gid) = @$gob[0,1,2] = @_[0,1,2];
+    @gr_members = @{$gob->[3]} = split ' ', $_[3];
+    return $gob;
+} 
+
+sub getgrent ( ) { populate(CORE::getgrent()) } 
+sub getgrnam ($) { populate(CORE::getgrnam(shift)) } 
+sub getgrgid ($) { populate(CORE::getgrgid(shift)) } 
+sub getgr    ($) { ($_[0] =~ /^\d+/) ? &getgrgid : &getgrnam } 
+
+1;
+__END__
+
+=head1 NAME
+
+User::grent.pm - by-name interface to Perl's built-in getgr*() functions
+
+=head1 SYNOPSIS
+
+ use User::grent;
+ $gr = getgrgid(0) or die "No group zero";
+ if ( $gr->name eq 'wheel' && @{$gr->members} > 1 ) {
+     print "gid zero name wheel, with other members";
+ } 
+
+ use User::grent qw(:FIELDS;
+ getgrgid(0) or die "No group zero";
+ if ( $gr_name eq 'wheel' && @gr_members > 1 ) {
+     print "gid zero name wheel, with other members";
+ } 
+
+ $gr = getgr($whoever);
+
+=head1 DESCRIPTION
+
+This module's default exports override the core getgrent(), getgruid(),
+and getgrnam() functions, replacing them with versions that return
+"User::grent" objects.  This object has methods that return the similarly
+named structure field name from the C's passwd structure from F<grp.h>; 
+namely name, passwd, gid, and members (not mem).  The first three
+return scalars, the last an array reference.
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag.  (Note that this still
+overrides your core functions.)  Access these fields as variables named
+with a preceding C<gr_>.  Thus, C<$group_obj-E<gt>gid()> corresponds
+to $gr_gid if you import the fields.  Array references are available as
+regular array variables, so C<@{ $group_obj-E<gt>members() }> would be
+simply @gr_members.
+
+The getpw() funtion is a simple front-end that forwards
+a numeric argument to getpwuid() and the rest to getpwnam().
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Template
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
diff --git a/lib/User/pwent.pm b/lib/User/pwent.pm
new file mode 100644 (file)
index 0000000..fd4eb4f
--- /dev/null
@@ -0,0 +1,101 @@
+package User::pwent;
+use strict;
+
+BEGIN { 
+    use Exporter   ();
+    use vars       qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+    @ISA         = qw(Exporter);
+    @EXPORT      = qw(getpwent getpwuid getpwnam getpw);
+    @EXPORT_OK   = qw(
+                       $pw_name   $pw_passwd   $pw_uid  
+                       $pw_gid    $pw_quota    $pw_comment
+                       $pw_gecos  $pw_dir      $pw_shell
+                  );
+    %EXPORT_TAGS = ( FIELDS => [ @EXPORT_OK, @EXPORT ] );
+}
+use vars      @EXPORT_OK;
+
+use Class::Template qw(struct);
+struct 'User::pwent' => [
+    name    => '$',
+    passwd  => '$',
+    uid            => '$',
+    gid            => '$',
+    quota   => '$',
+    comment => '$',
+    gcos    => '$',
+    dir            => '$',
+    shell   => '$',
+];
+
+sub populate (@) {
+    return unless @_;
+    my $pwob = new();
+
+    ( $pw_name,   $pw_passwd,   $pw_uid,  
+      $pw_gid,    $pw_quota,    $pw_comment,
+      $pw_gecos,  $pw_dir,      $pw_shell,   )         = @$pwob = @_;
+
+    return $pwob;
+} 
+
+sub getpwent ( ) { populate(CORE::getpwent()) } 
+sub getpwnam ($) { populate(CORE::getpwnam(shift)) } 
+sub getpwgid ($) { populate(CORE::getpwgid(shift)) } 
+sub getpw    ($) { ($_[0] =~ /^\d+/) ? &getpwgid : &getpwnam } 
+
+1;
+__END__
+
+=head1 NAME
+
+User::pwent.pm - by-name interface to Perl's built-in getpw*() functions
+
+=head1 SYNOPSIS
+
+ use User::pwent;
+ $pw = getpwnam('daemon') or die "No daemon user";
+ if ( $pw->uid == 1 && $pw->dir =~ m#^/(bin|tmp)?$# ) {
+     print "gid 1 on root dir";
+ } 
+
+ use User::pwent qw(:FIELDS);
+ getpwnam('daemon') or die "No daemon user";
+ if ( $pw_uid == 1 && $pw_dir =~ m#^/(bin|tmp)?$# ) {
+     print "gid 1 on root dir";
+ } 
+
+ $pw = getpw($whoever);
+
+=head1 DESCRIPTION
+
+This module's default exports override the core getpwent(), getpwuid(),
+and getpwnam() functions, replacing them with versions that return
+"User::pwent" objects.  This object has methods that return the similarly
+named structure field name from the C's passwd structure from F<pwd.h>; 
+namely name, passwd, uid, gid, quota, comment, gecos, dir, and shell.
+
+You may also import all the structure fields directly into your namespace
+as regular variables using the :FIELDS import tag.  (Note that this still
+overrides your core functions.)  Access these fields as
+variables named with a preceding C<pw_> in front their method names.
+Thus, C<$passwd_obj-E<gt>shell()> corresponds to $pw_shell if you import
+the fields.
+
+The getpw() funtion is a simple front-end that forwards
+a numeric argument to getpwuid() and the rest to getpwnam().
+
+To access this functionality without the core overrides,
+pass the C<use> an empty import list, and then access
+function functions with their full qualified names.
+On the other hand, the built-ins are still available
+via the C<CORE::> pseudo-package.
+
+=head1 NOTE
+
+While this class is currently implemented using the Class::Template
+module to build a struct-like class, you shouldn't rely upon this.
+
+=head1 AUTHOR
+
+Tom Christiansen
index 7f3756f..fcc30c6 100644 (file)
@@ -17,8 +17,8 @@ $header = "perl5db.pl patch level $VERSION";
 # This file is automatically included if you do perl -d.
 # It's probably not useful to include this yourself.
 #
-# Perl supplies the values for @line and %sub.  It effectively inserts
-# a &DB'DB(<linenum>); in front of every place that can have a
+# Perl supplies the values for %sub.  It effectively inserts
+# a &DB'DB(); in front of every place that can have a
 # breakpoint. Instead of a subroutine call it calls &DB::sub with
 # $DB::sub being the called subroutine. It also inserts a BEGIN
 # {require 'perl5db.pl'} before the first line.
@@ -45,7 +45,7 @@ $header = "perl5db.pl patch level $VERSION";
 # The scalar ${"_<$filename"} contains "_<$filename".
 #
 # Note that no subroutine call is possible until &DB::sub is defined
-# (for subroutines defined outside this file). In fact the same is
+# (for subroutines defined outside of the package DB). In fact the same is
 # true if $deep is not defined.
 #
 # $Log:        perldb.pl,v $
@@ -120,6 +120,9 @@ $header = "perl5db.pl patch level $VERSION";
 #      When restarting debugger breakpoints/actions persist.
 #     Buglet: When restarting debugger only one breakpoint/action per 
 #              autoloaded function persists.
+# Changes: 0.97: NonStop will not stop in at_exit().
+#      Option AutoTrace implemented.
+#      Trace printed differently if frames are printed too.
 
 ####################################################################
 
@@ -140,7 +143,7 @@ warn (                      # Do not ;-)
       @ARGS,
       $Carp::CarpLevel,
       $panic,
-      $first_time,
+      $second_time,
      ) if 0;
 
 # Command-line + PERLLIB:
@@ -154,10 +157,10 @@ $inhibit_exit = $option{PrintRet} = 1;
 
 @options     = qw(hashDepth arrayDepth DumpDBFiles DumpPackages 
                  compactDump veryCompact quote HighBit undefPrint
-                 globPrint PrintRet UsageOnly frame
+                 globPrint PrintRet UsageOnly frame AutoTrace
                  TTY noTTY ReadLine NonStop LineInfo
                  recallCommand ShellBang pager tkRunning
-                 signalLevel warnLevel dieLevel);
+                 signalLevel warnLevel dieLevel inhibit_exit);
 
 %optionVars    = (
                 hashDepth      => \$dumpvar::hashDepth,
@@ -169,7 +172,9 @@ $inhibit_exit = $option{PrintRet} = 1;
                 globPrint      => \$dumpvar::globPrint,
                 tkRunning      => \$readline::Tk_toloop,
                 UsageOnly      => \$dumpvar::usageOnly,     
-                 frame           => \$frame,
+                frame          => \$frame,
+                AutoTrace      => \$trace,
+                inhibit_exit   => \$inhibit_exit,
 );
 
 %optionAction  = (
@@ -317,15 +322,17 @@ if (defined &afterinit) { # May be defined in $rcfile
 ############################################################ Subroutines
 
 sub DB {
-    unless ($first_time++) {   # Do when-running init
-      if ($runnonstop) {               # Disable until signal
+    # _After_ the perl program is compiled, $single is set to 1:
+    if ($single and not $second_time++) {
+      if ($runnonstop) {       # Disable until signal
        for ($i=0; $i <= $#stack; ) {
            $stack[$i++] &= ~1;
        }
        $single = 0;
-       return;
+       # return;                       # Would not print trace!
       }
     }
+    $runnonstop = 0 if $single or $signal; # Disable it if interactive.
     &save;
     ($package, $filename, $line) = caller;
     $filename_ini = $filename;
@@ -341,7 +348,9 @@ sub DB {
            $dbline{$line} =~ s/;9($|\0)/$1/;
        }
     }
-    if ($single || $trace || $signal) {
+    my $was_signal = $signal;
+    $signal = 0;
+    if ($single || $trace || $was_signal) {
        $term || &setterm;
        if ($emacs) {
            $position = "\032\032$filename:$line:0\n";
@@ -353,25 +362,33 @@ sub DB {
            $after = ($dbline[$line] =~ /\n$/ ? '' : "\n");
            if (length($prefix) > 30) {
                $position = "$prefix$line):\n$line:\t$dbline[$line]$after";
-               print $LINEINFO $position;
                $prefix = "";
                $infix = ":\t";
            } else {
                $infix = "):\t";
                $position = "$prefix$line$infix$dbline[$line]$after";
+           }
+           if ($frame) {
+               print $LINEINFO ' ' x $#stack, "$line:\t$dbline[$line]$after";
+           } else {
                print $LINEINFO $position;
            }
            for ($i = $line + 1; $i <= $max && $dbline[$i] == 0; ++$i) { #{ vi
                last if $dbline[$i] =~ /^\s*[\;\}\#\n]/;
+               last if $signal;
                $after = ($dbline[$i] =~ /\n$/ ? '' : "\n");
                $incr_pos = "$prefix$i$infix$dbline[$i]$after";
-               print $LINEINFO $incr_pos;
                $position .= $incr_pos;
+               if ($frame) {
+                   print $LINEINFO ' ' x $#stack, "$i:\t$dbline[$i]$after";
+               } else {
+                   print $LINEINFO $incr_pos;
+               }
            }
        }
     }
     $evalarg = $action, &eval if $action;
-    if ($single || $signal) {
+    if ($single || $was_signal) {
        local $level = $level + 1;
        map {$evalarg = $_, &eval} @$pre;
        print $OUT $#stack . " levels deep in subroutine calls!\n"
@@ -528,7 +545,7 @@ sub DB {
                                $arrow = ($i==$line 
                                          and $filename eq $filename_ini) 
                                  ?  '==>' 
-                                   : ':' ;
+                                   : ($dbline[$i]+0 ? ':' : ' ') ;
                                $arrow .= 'b' if $stop;
                                $arrow .= 'a' if $action;
                                print $OUT "$i$arrow\t", $dbline[$i];
@@ -848,7 +865,7 @@ sub DB {
                        print $OUT "exec failed: $!\n";
                        last CMD; };
                    $cmd =~ /^T$/ && do {
-                       print_trace($OUT, 3); # skip DB print_trace dump_trace
+                       print_trace($OUT, 1); # skip DB
                        next CMD; };
                    $cmd =~ /^\/(.*)$/ && do {
                        $inpat = $1;
@@ -1030,7 +1047,11 @@ sub sub {
     if ($sub =~ /::AUTOLOAD$/) {
       $al = " for $ {$` . '::AUTOLOAD'}";
     }
-    print $LINEINFO ' ' x $#stack, "entering $sub$al\n" if $frame;
+    ($frame & 4 
+     ? ( (print $LINEINFO ' ' x $#stack, "in  "), 
+        # Why -1? But it works! :-(
+        print_trace($LINEINFO, -1, 1, 1, "$sub$al") )
+     : print $LINEINFO ' ' x $#stack, "entering $sub$al\n") if $frame;
     push(@stack, $single);
     $single &= 1;
     $single |= 4 if $#stack == $deep;
@@ -1039,14 +1060,20 @@ sub sub {
        $single |= pop(@stack);
        print ($OUT "list context return from $sub:\n"), dumpit( \@ret ),
          $doret = -2 if $doret eq $#stack;
-       print $LINEINFO ' ' x $#stack, "exited $sub$al\n" if $frame > 1;
+       ($frame & 4 
+        ? ( (print $LINEINFO ' ' x $#stack, "out "), 
+            print_trace($LINEINFO, -1, 1, 1, "$sub$al") )
+        : print $LINEINFO ' ' x $#stack, "exited $sub$al\n") if $frame & 2;
        @ret;
     } else {
        $ret = &$sub;
        $single |= pop(@stack);
        print ($OUT "scalar context return from $sub: "), dumpit( $ret ),
          $doret = -2 if $doret eq $#stack;
-       print $LINEINFO ' ' x $#stack, "exited $sub$al\n" if $frame > 1;
+       ($frame & 4 
+        ? ( (print $LINEINFO ' ' x $#stack, "out "), 
+             print_trace($LINEINFO, -1, 1, 1, "$sub$al") )
+        : print $LINEINFO ' ' x $#stack, "exited $sub$al\n") if $frame & 2;
        $ret;
     }
 }
@@ -1071,6 +1098,7 @@ sub eval {
        $^D = $od;
     }
     my $at = $@;
+    local $saved[0];           # Preserve the old value of $@
     eval "&DB::save";
     if ($at) {
        print $OUT $at;
@@ -1098,7 +1126,7 @@ sub postponed_sub {
     }
     return;
   }
-  print $OUT "In postponed_sub for `$subname'.\n";
+  #print $OUT "In postponed_sub for `$subname'.\n";
 }
 
 sub postponed {
@@ -1108,7 +1136,9 @@ sub postponed {
   local *dbline = shift;
   my $filename = $dbline;
   $filename =~ s/^_<//;
-  $signal = 1, print $OUT "'$filename' loaded...\n" if $break_on_load{$filename};
+  $signal = 1, print $OUT "'$filename' loaded...\n"
+    if $break_on_load{$filename};
+  print $LINEINFO ' ' x $#stack, "Package $filename.\n" if $frame;
   return unless %{$postponed_file{$filename}};
   $had_breakpoints{$filename}++;
   #%dbline = %{$postponed_file{$filename}}; # Cannot be done: unsufficient magic
@@ -1139,28 +1169,39 @@ sub dumpit {
     select ($savout);    
 }
 
+# Tied method do not create a context, so may get wrong message:
+
 sub print_trace {
   my $fh = shift;
-  my @sub = dump_trace(@_);
+  my @sub = dump_trace($_[0] + 1, $_[1]);
+  my $short = $_[2];           # Print short report, next one for sub name
   for ($i=0; $i <= $#sub; $i++) {
     last if $signal;
     local $" = ', ';
     my $args = defined $sub[$i]{args} 
     ? "(@{ $sub[$i]{args} })"
       : '' ;
-    $file = $sub[$i]{file} eq '-e' ? $sub[$i]{file} :
-      "file `$sub[$i]{file}'";
-    print $fh "$sub[$i]{context}$sub[$i]{sub}$args" .
-      " called from $file" . 
-       " line $sub[$i]{line}\n";
+    my $file = $sub[$i]{file};
+    $file = $file eq '-e' ? $file : "file `$file'" unless $short;
+    if ($short) {
+      my $sub = @_ >= 4 ? $_[3] : $sub[$i]{sub};
+      print $fh "$sub[$i]{context}=$sub$args from $file:$sub[$i]{line}\n";
+    } else {
+      print $fh "$sub[$i]{context} = $sub[$i]{sub}$args" .
+       " called from $file" . 
+         " line $sub[$i]{line}\n";
+    }
   }
 }
 
 sub dump_trace {
   my $skip = shift;
+  my $count = shift || 1e9;
+  $skip++;
+  $count += $skip;
   my ($p,$file,$line,$sub,$h,$args,$e,$r,@a,@sub,$context);
   for ($i = $skip; 
-       ($p,$file,$line,$sub,$h,$context,$e,$r) = caller($i); 
+       $i < $count and ($p,$file,$line,$sub,$h,$context,$e,$r) = caller($i); 
        $i++) {
     @a = ();
     for $arg (@args) {
@@ -1172,7 +1213,7 @@ sub dump_trace {
       s/([\0-\37\177])/sprintf("^%c",ord($1)^64)/eg;
       push(@a, $_);
     }
-    $context = $context ? '@ = ' : '$ = ';
+    $context = $context ? '@' : '$';
     $args = $h ? [@a] : undef;
     $e =~ s/\n\s*\;\s*\Z// if $e;
     $e =~ s/[\\\']/\\$1/g if $e;
@@ -1514,7 +1555,7 @@ w [line]  List window around line.
 f filename     Switch to viewing filename.
 /pattern/      Search forwards for pattern; final / is optional.
 ?pattern?      Search backwards for pattern; final ? is optional.
-L              List all breakpoints and actions for the current file.
+L              List all breakpoints and actions.
 S [[!]pattern] List subroutine names [not] matching pattern.
 t              Toggle trace mode.
 t expr         Trace through execution of expr.
@@ -1543,6 +1584,9 @@ O [opt[=val]] [opt\"val\"] [opt?]...
                be abbreviated.  Several options can be listed.
     recallCommand, ShellBang:  chars used to recall command or spawn shell;
     pager:                     program for output of \"|cmd\";
+    tkRunning:                 run Tk while prompting (with ReadLine);
+    signalLevel warnLevel dieLevel:    level of verbosity;
+    inhibit_exit               Allows stepping off the end of the script.
   The following options affect what happens with V, X, and x commands:
     arrayDepth, hashDepth:     print only first N elements ('' for all);
     compactDump, veryCompact:  change style of array and hash dump;
@@ -1550,10 +1594,9 @@ O [opt[=val]] [opt\"val\"] [opt?]...
     DumpDBFiles:               dump arrays holding debugged files;
     DumpPackages:              dump symbol tables of packages;
     quote, HighBit, undefPrint:        change style of string dump;
-    tkRunning:                 run Tk while prompting (with ReadLine);
-    signalLevel warnLevel dieLevel:    level of verbosity;
   Option PrintRet affects printing of return value after r command,
          frame    affects printing messages on entry and exit from subroutines.
+         AutoTrace affects printing messages on every possible breaking point.
                During startup options are initialized from \$ENV{PERLDB_OPTS}.
                You can put additional initialization options TTY, noTTY,
                ReadLine, and NonStop there.
@@ -1580,6 +1623,9 @@ command           Execute as a perl statement in current package.
 v              Show versions of loaded modules.
 R              Pure-man-restart of debugger, some of debugger state
                and command-line options may be lost.
+               Currently the following setting are preserved: 
+               history, breakpoints and actions, debugger Options 
+               and the following command-line options: -w, -I, -e.
 h [db_command] Get help [on a specific debugger command], enter |h to page.
 h h            Summary of debugger commands.
 q or ^D                Quit. Set \$DB::finished to 0 to debug global destruction.
@@ -1818,8 +1864,9 @@ sub end_report { print $OUT "Use `q' to quit and `R' to restart. `h q' for detai
 
 END {
   $finished = $inhibit_exit;   # So that some keys may be disabled.
-  $DB::single = !$exiting;     # Do not trace destructors on exit
-  DB::fake::at_exit() unless $exiting;
+  # Do not stop in at_exit() and destructors on exit:
+  $DB::single = !$exiting && !$runnonstop;
+  DB::fake::at_exit() unless $exiting or $runnonstop;
 }
 
 package DB::fake;
@@ -1828,4 +1875,6 @@ sub at_exit {
   "Debuggee terminated. Use `q' to quit and `R' to restart.";
 }
 
+package DB;                    # Do not trace this 1; below!
+
 1;
index ed5925b..c081123 100644 (file)
@@ -167,9 +167,9 @@ installed signals.
 
 =item B<stack-trace>
 
-The handler used for subsequently installed signals will output a Perl
-stack trace to STDERR and then tries to dump core.  This is the default
-signal handler.
+The handler used for subsequently installed signals outputs a Perl stack
+trace to STDERR and then tries to dump core.  This is the default signal
+handler.
 
 =item B<die>
 
@@ -186,7 +186,7 @@ assignment to an element of C<%SIG>.
 
 =head2 SIGNAL LISTS
 
-B<sigtrap> has two built-in lists of signals to trap.  They are:
+B<sigtrap> has a few built-in lists of signals to trap.  They are:
 
 =over 4
 
@@ -222,7 +222,7 @@ silently ignored.
 
 =item B<untrapped>
 
-This token tells B<sigtrap> only to install handlers for subsequently
+This token tells B<sigtrap> to install handlers only for subsequently
 listed signals which aren't already trapped or ignored.
 
 =item B<any>
@@ -232,9 +232,9 @@ listed signals.  This is the default behavior.
 
 =item I<signal>
 
-Any argument which looks like a signals name (that is,
-C</^[A-Z][A-Z0-9]*$/>) is taken as a signal name and indicates that
-B<sigtrap> should install a handler for it.
+Any argument which looks like a signal name (that is,
+C</^[A-Z][A-Z0-9]*$/>) indicates that B<sigtrap> should install a
+handler for that name.
 
 =item I<number>
 
index 8807ef0..9e03399 100644 (file)
@@ -143,7 +143,7 @@ sub xlate {
     $name = uc $name;
     $name = "LOG_$name" unless $name =~ /^LOG_/;
     $name = "syslog'$name";
-    eval(&$name) || -1;
+    defined &$name ? &$name : -1;
 }
 
 sub connect {
index eb3d306..9453feb 100755 (executable)
@@ -7,6 +7,7 @@
 # Perl with the EMBED feature enabled.
 #
 
+unlink "embed.h";
 open(EM, ">embed.h") || die "Can't create embed.h: $!\n";
 
 print EM <<'END';
index 637901b..123ae0c 100755 (executable)
@@ -32,8 +32,8 @@ perl_init_i18nl14n
 perl_new_collate
 perl_new_ctype
 perl_new_numeric
-perl_numeric_local
-perl_numeric_standard
+perl_set_numeric_local
+perl_set_numeric_standard
 perl_alloc
 perl_construct
 perl_destruct
diff --git a/op.c b/op.c
index 8527ccc..639454d 100644 (file)
--- a/op.c
+++ b/op.c
@@ -550,7 +550,8 @@ OP *op;
     OP *kid;
 
     /* assumes no premature commitment */
-    if (!op || (op->op_flags & OPf_KNOW) || error_count)
+    if (!op || (op->op_flags & OPf_KNOW) || op->op_type == OP_RETURN
+        || error_count)
        return op;
 
     op->op_flags &= ~OPf_LIST;
@@ -621,6 +622,8 @@ OP *op;
     default:
        if (!(opargs[op->op_type] & OA_FOLDCONST))
            break;
+       /* FALL THROUGH */
+    case OP_REPEAT:
        if (op->op_flags & OPf_STACKED)
            break;
        /* FALL THROUGH */
@@ -739,11 +742,6 @@ OP *op;
        op->op_ppaddr = ppaddr[OP_PREDEC];
        break;
 
-    case OP_REPEAT:
-       scalarvoid(cBINOP->op_first);
-       useless = op_desc[op->op_type];
-       break;
-
     case OP_OR:
     case OP_AND:
     case OP_COND_EXPR:
@@ -804,7 +802,8 @@ OP *op;
     OP *kid;
 
     /* assumes no premature commitment */
-    if (!op || (op->op_flags & OPf_KNOW) || error_count)
+    if (!op || (op->op_flags & OPf_KNOW) || op->op_type == OP_RETURN
+        || error_count)
        return op;
 
     op->op_flags |= (OPf_KNOW | OPf_LIST);
@@ -1305,15 +1304,12 @@ int full;
 }
 
 OP*
-block_end(line, floor, seq)
-int line;
-int floor;
+block_end(floor, seq)
+I32 floor;
 OP* seq;
 {
     int needblockscope = hints & HINT_BLOCK_SCOPE;
     OP* retval = scalarseq(seq);
-    if (copline > (line_t)line)
-       copline = line;
     LEAVE_SCOPE(floor);
     pad_reset_pending = FALSE;
     if (needblockscope)
@@ -1837,6 +1833,9 @@ I32 flags;
     pmop->op_flags = flags;
     pmop->op_private = 0 | (flags >> 8);
 
+    if (hints & HINT_LOCALE)
+       pmop->op_pmpermflags = (pmop->op_pmflags |= PMf_LOCALE);
+
     /* link into pm list */
     if (type != OP_TRANS && curstash) {
        pmop->op_pmnext = HvPMROOT(curstash);
@@ -3786,7 +3785,7 @@ OP *op;
     op = listkids(op);
 
     op->op_private = 0;
-#ifdef HAS_SETLOCALE
+#ifdef USE_LOCALE
     if (hints & HINT_LOCALE)
        op->op_private |= OPpLOCALE;
 #endif
@@ -3801,7 +3800,7 @@ OP *op;
     op = ck_fun(op);
 
     op->op_private = 0;
-#ifdef HAS_SETLOCALE
+#ifdef USE_LOCALE
     if (hints & HINT_LOCALE)
        op->op_private |= OPpLOCALE;
 #endif
@@ -3814,10 +3813,11 @@ ck_scmp(op)
 OP *op;
 {
     op->op_private = 0;
-#ifdef LC_COLLATE
+#ifdef USE_LOCALE
     if (hints & HINT_LOCALE)
        op->op_private |= OPpLOCALE;
 #endif
+
     return op;
 }
 
@@ -3924,7 +3924,7 @@ ck_sort(op)
 OP *op;
 {
     op->op_private = 0;
-#ifdef LC_COLLATE
+#ifdef USE_LOCALE
     if (hints & HINT_LOCALE)
        op->op_private |= OPpLOCALE;
 #endif
index 97b3034..f0b18d0 100644 (file)
--- a/opcode.h
+++ b/opcode.h
@@ -1867,8 +1867,8 @@ EXT OP * (*check[]) _((OP *op)) = {
        ck_scmp,        /* sgt */
        ck_scmp,        /* sle */
        ck_scmp,        /* sge */
-       ck_scmp,        /* seq */
-       ck_scmp,        /* sne */
+       ck_null,        /* seq */
+       ck_null,        /* sne */
        ck_scmp,        /* scmp */
        ck_bitop,       /* bit_and */
        ck_bitop,       /* bit_xor */
index d679d8a..3b3672d 100755 (executable)
--- a/opcode.pl
+++ b/opcode.pl
@@ -1,5 +1,6 @@
 #!/usr/bin/perl
 
+unlink "opcode.h";
 open(OC, ">opcode.h") || die "Can't create opcode.h: $!\n";
 select OC;
 
@@ -300,8 +301,8 @@ slt         string lt               ck_scmp         ifs     S S
 sgt            string gt               ck_scmp         ifs     S S
 sle            string le               ck_scmp         ifs     S S
 sge            string ge               ck_scmp         ifs     S S
-seq            string eq               ck_scmp         ifs     S S
-sne            string ne               ck_scmp         ifs     S S
+seq            string eq               ck_null         ifs     S S
+sne            string ne               ck_null         ifs     S S
 scmp           string comparison       ck_scmp         ifst    S S
 
 bit_and                bitwise and             ck_bitop        fst     S S
index a2abcc1..a047efb 100644 (file)
@@ -1,5 +1,5 @@
 #define PATCHLEVEL 3
-#define SUBVERSION 10
+#define SUBVERSION 11
 
 /*
        local_patches -- list of locally applied less-than-subversion patches.
diff --git a/perl.c b/perl.c
index 4777070..2544fd3 100644 (file)
--- a/perl.c
+++ b/perl.c
@@ -121,7 +121,7 @@ register PerlInterpreter *sv_interp;
 
     init_ids();
 
-    NUMERIC_STANDARD();
+    SET_NUMERIC_STANDARD();
 #if defined(SUBVERSION) && SUBVERSION > 0
     sprintf(patchlevel, "%7.5f",   (double) 5 
                                + ((double) PATCHLEVEL / (double) 1000)
@@ -826,8 +826,12 @@ I32 flags;         /* See G_* flags in cop.h */
     if (flags & G_ARRAY)
       myop.op_flags |= OPf_LIST;
 
-    if (perldb && curstash != debstash 
-         && (DBcv || (DBcv = GvCV(DBsub)))) /* to handle first BEGIN of -d */
+    if (perldb && curstash != debstash
+          /* Handle first BEGIN of -d. */
+         && (DBcv || (DBcv = GvCV(DBsub)))
+          /* Try harder, since this may have been a sighandler, thus
+           * curstash may be meaningless. */
+         && (SvTYPE(sv) != SVt_PVCV || CvSTASH((CV*)sv) != debstash))
        op->op_private |= OPpENTERSUB_DB;
 
     if (flags & G_EVAL) {
diff --git a/perl.h b/perl.h
index 16c119e..17402a4 100644 (file)
--- a/perl.h
+++ b/perl.h
@@ -20,8 +20,6 @@
 #undef NO_EMBED
 #define NO_EMBED
 #undef MULTIPLICITY
-#undef HIDEMYMALLOC
-#undef EMBEDMYMALLOC
 #undef USE_STDIO
 #define USE_STDIO
 #endif /* PERL_FOR_X2P */
 #include <ctype.h>
 #endif /* USE_NEXT_CTYPE */
 
-#ifdef I_LOCALE
-#include <locale.h>
-#endif
-
 #ifdef METHOD  /* Defined by OSF/1 v3.0 by ctype.h */
 #undef METHOD
 #endif
 
+#ifdef I_LOCALE
+#   include <locale.h>
+#endif
+
+#if !defined(NO_LOCALE) && defined(HAS_SETLOCALE)
+#   define USE_LOCALE
+#   if !defined(NO_LOCALE_COLLATE) && defined(LC_COLLATE) \
+       && defined(HAS_STRXFRM)
+#      define USE_LOCALE_COLLATE
+#   endif
+#   if !defined(NO_LOCALE_CTYPE) && defined(LC_CTYPE)
+#      define USE_LOCALE_CTYPE
+#   endif
+#   if !defined(NO_LOCALE_NUMERIC) && defined(LC_NUMERIC)
+#      define USE_LOCALE_NUMERIC
+#   endif
+#endif /* !NO_LOCALE && HAS_SETLOCALE */
+
 #include <setjmp.h>
 
 #ifdef I_SYS_PARAM
 #define strrchr rindex
 #endif
 
-#if defined(mips) && defined(ultrix) && !defined(__STDC__)
-#   undef HAS_MEMCMP
-#endif
-
 #ifdef I_MEMORY
 #  include <memory.h>
 #endif
 #   endif
 #endif /* HAS_MEMSET */
 
-#ifdef HAS_MEMCMP
-#  if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
-#    ifndef memcmp
-       extern int memcmp _((char*, char*, int));
-#    endif
-#  endif
-#else
-#   ifndef memcmp
-#      define memcmp   my_memcmp
-#   endif
-#endif /* HAS_MEMCMP */
-
 #if !defined(HAS_MEMMOVE) && !defined(memmove)
 #   if defined(HAS_BCOPY) && defined(HAS_SAFE_BCOPY)
 #      define memmove(d,s,l) bcopy(s,d,l)
 #   endif
 #endif
 
+#if defined(mips) && defined(ultrix) && !defined(__STDC__)
+#   undef HAS_MEMCMP
+#endif
+
+#if defined(HAS_MEMCMP) && defined(HAS_SANE_MEMCMP)
+#  if !defined(STANDARD_C) && !defined(I_STRING) && !defined(I_MEMORY)
+#    ifndef memcmp
+       extern int memcmp _((char*, char*, int));
+#    endif
+#  endif
+#  ifdef BUGGY_MSC
+  #  pragma function(memcmp)
+#  endif
+#else
+#   ifndef memcmp
+#      define memcmp   my_memcmp
+#   endif
+#endif /* HAS_MEMCMP && HAS_SANE_MEMCMP */
+
+#ifndef HAS_BCMP
+#   ifndef bcmp
+#      define bcmp(s1,s2,l) memcmp(s1,s2,l)
+#   endif
+#endif /* !HAS_BCMP */
+
 #ifdef I_NETINET_IN
 #   include <netinet/in.h>
 #endif
@@ -1342,7 +1363,7 @@ EXT SV  * psig_name[];
 /* fast case folding tables */
 
 #ifdef DOINIT
-EXT const unsigned char fold[] = {
+EXTCONST  unsigned char fold[] = {
        0,      1,      2,      3,      4,      5,      6,      7,
        8,      9,      10,     11,     12,     13,     14,     15,
        16,     17,     18,     19,     20,     21,     22,     23,
@@ -1876,7 +1897,7 @@ EXT MGVTBL vtbl_uvar =    {magic_getuvar,
                                magic_setuvar,
                                        0,      0,      0};
 
-#ifdef LC_COLLATE
+#ifdef USE_LOCALE_COLLATE
 EXT MGVTBL vtbl_collxfrm = {0,
                                magic_setcollxfrm,
                                        0,      0,      0};
@@ -1913,7 +1934,7 @@ EXT MGVTBL vtbl_bm;
 EXT MGVTBL vtbl_fm;
 EXT MGVTBL vtbl_uvar;
 
-#ifdef HAS_STRXFRM
+#ifdef USE_LOCALE_COLLATE
 EXT MGVTBL vtbl_collxfrm;
 #endif
 
@@ -2008,32 +2029,39 @@ enum {
   copy_amg,    neg_amg
 };
 #endif /* OVERLOAD */
-  
-#ifdef LC_COLLATE
+
+#ifdef USE_LOCALE_COLLATE
 EXT U32                collation_ix;           /* Collation generation index */
 EXT char *     collation_name;         /* Name of current collation */
 EXT bool       collation_standard INIT(TRUE); /* Assume simple collation */
 EXT Size_t     collxfrm_base;          /* Basic overhead in *xfrm() */
 EXT Size_t     collxfrm_mult INIT(2);  /* Expansion factor in *xfrm() */
-#endif /* LC_COLLATE */
+#endif /* USE_LOCALE_COLLATE */
 
-#ifdef LC_NUMERIC
+#ifdef USE_LOCALE_NUMERIC
 
 EXT char *     numeric_name;           /* Name of current numeric locale */
 EXT bool       numeric_standard INIT(TRUE); /* Assume simple numerics */
 EXT bool       numeric_local INIT(TRUE);    /* Assume local numerics */
 
-#define NUMERIC_STANDARD() \
-    STMT_START { if (! numeric_standard) perl_numeric_standard(); } STMT_END
-#define NUMERIC_LOCAL() \
-    STMT_START { if (! numeric_local) perl_numeric_local(); } STMT_END
+#define SET_NUMERIC_STANDARD() \
+    STMT_START {                               \
+       if (! numeric_standard)                 \
+           perl_set_numeric_standard();        \
+    } STMT_END
+
+#define SET_NUMERIC_LOCAL() \
+    STMT_START {                               \
+       if (! numeric_local)                    \
+           perl_set_numeric_local();           \
+    } STMT_END
 
-#else /* !LC_NUMERIC */
+#else /* !USE_LOCALE_NUMERIC */
 
-#define NUMERIC_STANDARD()  /**/
-#define NUMERIC_LOCAL()     /**/
+#define SET_NUMERIC_STANDARD()  /**/
+#define SET_NUMERIC_LOCAL()     /**/
 
-#endif /* !LC_NUMERIC */
+#endif /* !USE_LOCALE_NUMERIC */
 
 #if !defined(PERLIO_IS_STDIO) && defined(HAS_ATTRIBUTE)
 /* 
index 1753863..cef4d64 100755 (executable)
@@ -35,8 +35,8 @@ perl_init_i18nl14n
 perl_new_collate
 perl_new_ctype
 perl_new_numeric
-perl_numeric_local
-perl_numeric_standard
+perl_set_numeric_local
+perl_set_numeric_standard
 perl_alloc
 perl_construct
 perl_destruct
diff --git a/perly.c b/perly.c
index 280069f..3bcc237 100644 (file)
--- a/perly.c
+++ b/perly.c
@@ -12,6 +12,7 @@ dep()
     deprecate("\"do\" to call subroutines");
 }
 
+#line 16 "perly.c"
 #define YYERRCODE 256
 short yylhs[] = {                                        -1,
    40,    0,    7,    5,    8,    6,    9,    9,    9,   10,
@@ -56,15 +57,15 @@ short yydefred[] = {                                      1,
     9,   11,    0,   50,   51,   52,    0,    0,    0,   61,
     0,   14,    4,  151,    0,    0,  126,    0,  146,    0,
    59,   59,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,  158,  159,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,  158,  159,    0,
     0,    0,    0,    0,    0,    0,    0,   12,    0,    0,
     0,    0,    0,    0,    0,    0,    0,   10,    0,    0,
     0,    0,  116,  118,    0,    0,    0,    0,  152,    0,
    54,    0,   60,    0,    7,  167,  170,  169,  168,    0,
     0,    0,    0,    0,    0,    4,    0,    4,    0,    4,
     0,    4,    0,    4,    4,    0,    0,    0,    0,    0,
-  165,    0,  132,    0,    0,    0,    0,    0,  161,    0,
-    0,    0,    0,   74,    0,  141,    0,    0,    0,    0,
+  141,    0,    0,    0,    0,   74,    0,  165,    0,  132,
+    0,    0,    0,    0,    0,  161,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,  106,    0,  162,  163,
   164,  166,    0,    0,   37,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
@@ -72,8 +73,8 @@ short yydefred[] = {                                      1,
     0,    0,    0,    0,    0,    0,   13,    0,   53,   58,
     0,    0,    0,   72,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    4,  145,
-  147,    0,    0,    0,    0,    0,    0,  108,    0,  130,
-    0,    0,    0,  105,   28,    0,    0,   19,    0,    0,
+  147,    0,    0,    0,    0,    0,    0,    0,  108,    0,
+  130,    0,    0,  105,   28,    0,    0,   19,    0,    0,
     0,   63,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,   77,    0,
    78,    0,    0,    0,    0,    0,    0,    0,  128,    0,
@@ -94,619 +95,609 @@ short yydgoto[] = {                                       1,
     9,   66,   10,   17,   85,  337,   88,  313,    3,   11,
    12,   68,  272,  268,   70,   71,   72,   73,   74,   75,
    76,  278,   78,  279,  262,  265,  269,  281,  263,  266,
-  124,  204,   90,   79,  242,  181,  145,  276,   13,    2,
+  116,  204,   90,   79,  242,  181,  145,  276,   13,    2,
    14,   15,   16,
 };
 short yysindex[] = {                                      0,
-    0,    0, -118,    0,    0,    0,  -52,    0,    0,    0,
-    0,    0,  616,    0,    0,    0, -117, -225,  -12,    0,
- -219,    0,    0,    0,  -28,  -28,    0,   32,    0, 2245,
-    0,    0,   -7,   -6,    3,   22,  -35, 2245,   38,   44,
-   48,  -28, 1004, 1067, -196,    0,    0,  -28, 2245,  948,
- 1343, 2245, 2245, 2245, 2245, 2245, 1399,    0, 2245, 2245,
- 1455,  -28,  -28,  -28,  -28, 2245, -215,    0,  192, 3934,
-  -67,  -50,    0,    0,  -10,   71,   64,   81,    0,    4,
-    0, -114,    0, -115,    0,    0,    0,    0,    0, 2245,
-  115, 2245, 3934,    4, -114,    0,    4,    0,    4,    0,
-    4,    0,    4,    0,    0,  125, 3934,  126, 1518,  948,
-    0,  130,    0, 2305,  -24,   46,  -56, 2245,    0,   81,
-    0,  -67,   81,    0, 2245,    0, 2305,  -77,  -77,  -77,
-  -81,  -81,   83,  -21,  -77,  -77,    0,  -84,    0,    0,
-    0,    0, 2305,    4,    0, 2245, 2245, 2245, 2245, 2245,
2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245, 2245,
2245, 2245, 2245, 2245, 2245, 2245,    0,    0,  -17, 2245,
2245, 2245, 2245, 2245, 2245, 1794,    0, 2245,    0,    0,
-  -36, 2245,  -49,    0, 2245,  326, 2245,    4, 2245, -215,
2245, -215, 2245, -156, 2245, -156,  143, 1850,    0,    0,
-    0,   -2,   13,  140, 2245, 1906, 1969,    0,   58,    0,
-   81, 2245,   95,    0,    0, -164, -164,    0, -164, -164,
-109,    0,  -48, 2384, 2305, 2819,  941, 1031, 3934, 3894,
- 3965, 3724,  359,  435, 1190,  -77,  -77, 2245,    0, 2245,
-    0,  149,  -80,   21,  -65,   23,   82,   56,    0,    8,
- 3934,    0,    0,  136,    0,  155,    0, 2245,    0,    0,
- -164,    0,  167,    0,    0,  169,    0, -164,  172,  101,
-  174,    0,  185,    0,    0,  198,  192,    0,    0,  201,
-  202, 2245,    0,    0,    0,   11,    0,   17,    0,   19,
-    0,   84, 2245,  139, 2245,   69,   91, 2245,    0,  153,
-    0,  158,    0,  161,    0,    0,    0,  400,  101,  101,
-  101,    0,    0, 2245,  101, 2245,  101, 2245,  247,    0,
-    0,    0,    0,  105,    0, 1734,  175,    0,  261,    0,
-    0,    0,    0, -215, -215, -156,    0,  269, -156,  279,
- -215,  268,  101,    0,    0,    0,    0,    0,    0,  278,
-  101,    0,  101,    0, 1850, -215,    0, -156, -215,  300,
-    0,    0,    0,  101,    0,
+    0,    0, -178,    0,    0,    0,  -49,    0,    0,    0,
+    0,    0,  616,    0,    0,    0, -108, -233,    3,    0,
+ -230,    0,    0,    0,  -24,  -24,    0,   28,    0, 1899,
+    0,    0,  -17,  -12,  -11,  -10,  -35, 1899,   39,   54,
+   60,  992,  936,  -24, 1055, 1319, -217,    0,    0,  -24,
+ 1899, 1899, 1899, 1899, 1899, 1899, 1375,    0, 1899, 1899,
+ 1431,  -24,  -24,  -24,  -24, 1899, -161,    0,  277, 3829,
+  -69,  -42,    0,    0,   -4,   88,   89,   97,    0,   24,
+    0, -107,    0, -105,    0,    0,    0,    0,    0, 1899,
+  114, 1899,  328,   24, -107,    0,   24,    0,   24,    0,
+   24,    0,   24,    0,    0,  115, 3829,  133, 1490,  936,
+    0,  328,    0,  -69,   97,    0, 1899,    0,  137,    0,
+  328,  -19,   56,   19, 1899,    0,   97,   98,   98,   98,
+  -82,  -82,   93,  -21,   98,   98,    0,  -87,    0,    0,
+    0,    0,  328,   24,    0, 1899, 1899, 1899, 1899, 1899,
1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899, 1899,
1899, 1899, 1899, 1899, 1899, 1899,    0,    0,  -32, 1899,
1899, 1899, 1899, 1899, 1899, 1665,    0, 1899,    0,    0,
+   -8, 1899,  357,    0, 1899,   82, 1899,   24, 1899, -161,
1899, -161, 1899, -234, 1899, -234,  144, 1724,    0,    0,
+    0,    4,   11,  138, 1899,   97, 1780, 1836,    0,   61,
+    0, 1899,   96,    0,    0, -176, -176,    0, -176, -176,
 -95,    0,   21, 1092,  328,  373,  434,   92, 3829, 1204,
+ 3238, 3721, 2430,  815,  419,   98,   98, 1899,    0, 1899,
+    0,  173,  -80,   55,  -68,   57,  -54,   68,    0,    6,
+ 3829,    0,    0,  157,    0,  178,    0, 1899,    0,    0,
+ -176,    0,  181,    0,    0,  183,    0, -176,  190,  112,
+  209,    0,  231,    0,    0,  210,  277,    0,    0,  237,
+  224, 1899,    0,    0,    0,    9,    0,   15,    0,   17,
+    0,  105, 1899,  163, 1899,   81,  119, 1899,    0,  168,
+    0,  175,    0,  185,    0,    0,    0, 1146,  112,  112,
+  112,    0,    0, 1899,  112, 1899,  112, 1899,  279,    0,
+    0,    0,    0,  143,    0, 3863,  202,    0,  300,    0,
+    0,    0,    0, -161, -161, -234,    0,  321, -234,  326,
+ -161,  309,  112,    0,    0,    0,    0,    0,    0,  398,
+  112,    0,  112,    0, 1724, -161,    0, -234, -161,  336,
+    0,    0,    0,  112,    0,
 };
 short yyrindex[] = {                                      0,
     0,    0,  220,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0, 2453, 2118,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0, 3021,
- 3064,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,   65,    0,  -14,  -29,
- 3121, 3189,    0,    0, 2353, 2177,    0,  309,    0,    0,
-    0,  -33,    0,    0,    0,    0,    0,    0,    0, 2520,
-    0,    0,  843,    0,  230,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0, 1177,    0,    0,  319,
-    0, 2285,    0, 1241, 3121,    0,    0, 2520,    0, 2588,
-  496,  557, 2651,    0,    0,    0, 1692,  674, 3387, 3470,
-  110, 3299, 2719,    0, 3518, 3592,    0,    0,    0,    0,
-    0,    0, 2038,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0, 2159, 1989,    0,
+    0, 2799, 2867,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,   65,    0,  -25,  193,
+ 2910, 2954,    0,    0, 2225, 2048,    0,  333,    0,    0,
+    0,    2,    0,    0,    0,    0,    0,    0,    0, 2284,
+    0,    0, 3575,    0,  257,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0, 3017,    0,    0,  348,
+    0, 3642,  496,  557, 2395,    0,    0,    0, 2111,    0,
+ 3695, 2910,    0,    0, 2284,    0, 2520, 3065, 3103, 3190,
+  659, 2997, 2563,    0, 3301, 3354,    0,    0,    0,    0,
+    0,    0, 3741,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0, 2786,    0,    0,
-    0,  302,  892,    0,  319,    0, 2520,    0,  325,   65,
-    0,   65,    0,  164,    0,  164,    0,  312,    0,    0,
-    0,    0,  331,    0,    0,    0,    0,    0,    0,    0,
- 2886,    0, 2954,    0,    0,   10,   12,    0,   34,   53,
- 1047,    0,    0, 1185, 3811, 3827, 3719, 3767, 1294,    0,
- 1636, 1580, 1129, 3871,   -4, 3636, 3674,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
- 1572,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-   59,    0,    0,    0,    0,    0,    0,  333,    0,    0,
-    0,    0,    0,    0,    0,    0,   63,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0, 2631,    0,    0,
+    0,  331,  880,    0,  348,    0, 2284,    0,  352,   65,
+    0,   65,    0,  164,    0,  164,    0,  338,    0,    0,
+    0,    0,  358,    0,    0, 2674,    0,    0,    0,    0,
+    0,    0, 2718,    0,    0,  -22,   36,    0,   91,  110,
+  -33,    0,    0, 2573, 1267, 1531, 3476, 3521, 3675,    0,
+  -27, 3826, 3794, 1587,   -6, 3392, 3440,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,  319,    0,    0,
+ 3787,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+  134,    0,    0,    0,    0,    0,    0,  359,    0,    0,
+    0,    0,    0,    0,    0,    0,  155,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,  322,    0,    0,
-    0,    0,    0,    0,    0,  -23,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,  348,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,  349,    0,    0,
+    0,    0,    0,    0,    0, 1953,    0,    0,    0,    0,
     0,    0,    0,   65,   65,  164,    0,    0,  164,    0,
-   65,    0,    0,    0,    0,    0,    0,    0,    0,  892,
-    0,    0,    0,    0,  347,   65,    0,  164,   65,    0,
+   65,    0,    0,    0,    0,    0,    0,    0,    0,  880,
+    0,    0,    0,    0,  368,   65,    0,  164,   65,    0,
     0,    0,    0,    0,    0,
 };
 short yygindex[] = {                                      0,
-    0,    0,    0,   60,  -19,    0, 4247,  768,  -83,    0,
-    0,    0, -192,  -13, 3466, 2324,    0,    0,    0,    0,
-    0,  377,  955,    0,    0,  245, -173,   39,   75,  204,
-  -68, -168,  966,    0,    0,  313,  335,    0,    0,    0,
+    0,    0,    0,  136,  -29,    0, 4145,  680,  -78,    0,
+    0,    0, -193,  -13, 3266,  519,    0,    0,    0,    0,
+    0,  400,  885,    0,    0,  267, -196,   63,  124,  250,
+  -16, -167,   20,    0,    0,  320,  356,    0,    0,    0,
     0,    0,    0,
 };
-#define YYTABLESIZE 4435
+#define YYTABLESIZE 4333
 short yytable[] = {                                      69,
-   62,  183,  209,  274,  105,   23,   20,   62,  214,  170,
-  294,   68,  299,  170,   68,  207,  256,   91,   62,  213,
-   91,  184,  252,  172,  280,   57,   15,  301,   68,   68,
-  117,   82,   96,   98,   91,   91,   83,   84,  283,   83,
-  174,  152,  100,  134,   15,  152,   83,  138,  305,  210,
-   18,  320,   42,   83,   83,  171,  284,  321,   83,  322,
-  118,  102,  144,   68,   27,   18,  172,   21,   18,   91,
-   42,   92,  173,  240,   16,  255,  189,  108,  191,  300,
-  193,  302,  195,  109,  197,  198,   23,  110,   83,   57,
-   94,   95,   16,   17,   23,  202,  203,   27,  171,   41,
-   27,   27,   27,   43,   27,  238,   27,   27,  319,   27,
-  176,   17,  175,  254,  304,   23,   23,   41,  259,  270,
-  271,   15,  177,   27,  178,   23,   23,  327,   27,  329,
-  150,  151,  216,  217,  219,  220,  221,  222,  223,   80,
-  338,  182,  340,  349,   23,  180,  352,    4,    5,    6,
-  100,    7,    8,  100,  185,   27,  243,  244,  245,  246,
-  247,  248,  250,   20,  199,  362,  200,  100,  100,  206,
-  208,  203,  100,  212,  303,  261,  323,  217,   62,  282,
-  285,  217,  291,  328,  277,  293,  151,   27,  298,   27,
-   27,  286,  288,  290,  306,  307,   20,  344,  292,   20,
-   20,   20,  100,   20,   19,   20,   20,  309,   20,  310,
-  150,  151,  311,  314,  150,  151,    4,    5,    6,    2,
-    7,    8,   20,  312,  296,  315,  297,   20,   86,  150,
-  151,  166,  169,   87,  167,  168,  169,  316,  150,  151,
-  239,  317,   68,   68,   68,   68,  150,  151,   91,   91,
-   91,   91,   47,  350,   20,   47,   47,   47,  104,   47,
-  318,   47,   47,  325,   47,   68,   68,   83,   83,   83,
-   83,   91,   91,  150,  151,   91,   83,  330,   47,  324,
-   83,   83,  331,   47,  203,  332,   20,  343,   20,   20,
-   83,   83,  150,  151,   83,   83,   83,   83,   83,  345,
-   83,  346,  150,  151,  261,  150,  151,  150,  151,  351,
-   47,  150,  151,  150,  151,  150,  151,  150,  151,  353,
-   27,   27,   27,   27,   27,   27,  355,   27,   27,   27,
+   62,  280,  274,   62,  105,  214,  183,   64,  170,   20,
+   64,   62,  299,   90,   23,   15,   90,  256,   18,  213,
+  208,  172,   96,   82,  301,   64,   84,   98,  100,  102,
+   90,   90,  124,   15,   83,   90,   18,   83,  303,  125,
+  152,  270,  271,  134,  283,   91,  305,  138,  174,  320,
+  252,   83,   83,  171,  284,  321,   83,  322,  240,   64,
+   57,   83,  117,  118,   27,   90,  189,   92,  191,  126,
+  193,  172,  195,  184,  197,  198,   42,  210,  108,  294,
+  173,  139,  140,  141,  142,  319,   83,    4,    5,    6,
+  238,    7,    8,  109,   42,  202,  203,   27,   23,  110,
+   27,   27,   27,  171,   27,   23,   27,   27,  211,   27,
+   23,   23,   23,  300,   23,  302,  144,  338,  175,  340,
+  150,  151,  257,   27,   57,  258,  304,  176,   27,  205,
+  329,   16,  216,  217,  219,  220,  221,  222,  223,  327,
+  178,   18,  349,   21,  159,  352,   23,  177,   80,   16,
+   17,  182,  180,  185,  199,   27,  243,  244,  245,  246,
+  247,  248,  250,   20,  362,  254,   94,   95,   17,  282,
+  259,  203,  170,  200,   41,  261,  207,  217,  285,   62,
+  209,  217,  170,  212,  277,  291,  293,   27,  170,   27,
+   27,  286,   41,  288,  290,   43,   20,  323,  292,   20,
+   20,   20,  151,   20,  152,   20,   20,   19,   20,  150,
+  151,  328,  298,   15,  152,  306,  150,  151,  307,    2,
+  152,  309,   20,  310,  296,  239,  297,   20,  150,  151,
+  311,  169,   86,   68,  312,  344,   68,   87,   64,   64,
+   64,   64,  150,  151,   90,   90,   90,   90,  314,  316,
+   68,   68,   47,   90,   20,   47,   47,   47,  350,   47,
+  104,   47,   47,   64,   47,   83,   83,   83,   83,   90,
+   90,  315,   90,   90,   83,  150,  151,  317,   47,  324,
+   83,   83,  318,   47,  203,   68,   20,  325,   20,   20,
+   83,   83,  330,   83,   83,   83,   83,   83,   83,  331,
+  150,  151,  150,  151,  261,  150,  151,  150,  151,  332,
+   47,  150,  151,  150,  151,  150,  151,  150,  151,  343,
+   27,   27,   27,   27,   27,   27,  345,   27,   27,   27,
    27,   27,   27,   27,   27,   27,   27,   27,   27,   27,
-  364,   69,   47,   27,   27,   47,   27,   27,   27,   65,
-  150,  151,   57,   27,   27,   27,   27,   27,   27,  155,
-  153,   27,   27,  150,  151,   40,  257,   65,   27,  258,
-   38,  156,   27,   43,   27,   27,  150,  151,  150,  151,
-   40,  100,  100,  100,  100,  150,  151,   38,  159,   77,
-  100,  218,  342,  360,  100,  100,  100,  100,  273,  150,
-  151,   65,  357,    0,  100,  100,    0,  188,  100,  100,
-  100,  100,  100,    0,  100,  100,  170,    0,  100,   20,
-   20,   20,   20,   20,   20,    0,   20,   20,   20,   20,
-   20,   20,   20,   20,   20,   20,   20,   20,   20,    0,
-  333,    0,   20,   20,    0,   20,   20,   20,  152,  170,
-    0,    0,   20,   20,   20,   20,   20,   20,    0,    0,
-   20,   20,  159,  146,  147,  148,  149,   20,    0,    0,
+  346,   69,   47,   27,   27,   47,   27,   27,   27,   27,
+   27,  150,  151,  150,  151,   27,   27,   27,   27,   27,
+   27,  351,  153,   27,  150,  151,  353,  355,  154,  155,
+  156,  157,   27,   65,   27,   27,  364,  150,  151,   57,
+  156,  158,  160,  161,  162,  163,  164,  165,  155,  153,
+  166,   65,   40,  167,  168,  169,   38,  165,  156,   43,
+  166,  150,  151,  167,  168,  169,  166,   40,   38,  167,
+  168,  169,   77,  218,  188,  150,  151,  360,  170,   20,
+   20,   20,   20,   20,   20,   65,   20,   20,   20,   20,
+   20,   20,   20,   20,   20,   20,   20,   20,   20,  150,
+  151,  342,   20,   20,  273,   20,   20,   20,   20,   20,
+  152,    0,    0,    0,   20,   20,   20,   20,   20,   20,
+    0,    0,   20,  170,   68,   68,   68,   68,    0,    0,
     0,   20,    0,   20,   20,   47,   47,   47,   47,   47,
-   47,  152,   47,   47,   47,    0,  150,  151,   47,    0,
-  170,   47,   47,   47,   47,    0,    0,    0,   47,   47,
-    0,   47,   47,   47,    0,    0,    0,    0,   47,   47,
-   47,   47,   47,   47,    0,    0,   47,   47,    0,    0,
-    0,    0,  152,   47,  264,  170,  267,   47,  167,   47,
+   47,  255,   47,   47,   47,    0,    0,    0,   47,   68,
+   68,   47,   47,   47,   47,  152,    0,    0,   47,   47,
+    0,   47,   47,   47,   47,   47,    0,    0,    0,  170,
+   47,   47,   47,   47,   47,   47,    0,    0,   47,    0,
+    0,    0,  357,    0,  170,    0,    0,   47,  167,   47,
    47,  167,  167,  167,    0,  167,  151,  167,  167,  151,
-  167,    0,    0,    4,    5,    6,    0,    7,    8,    0,
-    0,    0,    0,  151,  151,    0,    0,  152,  151,  167,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-   65,   65,   65,   65,    0,    0,  151,    0,  151,  168,
+  167,  152,    0,   89,   89,  264,    0,  267,  146,  147,
+  148,  149,    0,  151,  151,  106,  152,    0,  151,  167,
+    0,  114,   89,  122,    0,    0,    0,    0,   89,    0,
+    0,    0,    0,  150,  151,    0,    0,    0,    0,    0,
+   89,   89,   89,   89,    0,    0,  151,    0,  151,  168,
     0,    0,  168,  168,  168,    0,  168,  110,  168,  168,
-  110,  168,    0,   65,   65,    0,  153,    0,    0,    0,
-  154,  155,  156,  157,  110,  110,    0,    0,  151,  110,
-  168,  167,    0,    0,  158,  160,  161,  162,  163,    0,
-  164,  165,    0,    0,  166,    0,    0,  167,  168,  169,
-    0,    0,    0,  154,  155,  156,  157,    0,   52,  110,
-    0,   62,   64,   48,    0,   57,    0,   65,   60,    0,
-   59,  163,    0,  164,  165,    0,    0,  166,  347,  348,
-  167,  168,  169,    0,   58,  354,    0,    0,    0,   63,
-  153,    0,  168,    0,  154,  155,  156,  157,    0,    0,
-  361,    0,    0,  363,    0,    0,    0,    0,  158,  160,
-  161,  162,  163,    0,  164,  165,   61,    0,  166,    0,
-    0,  167,  168,  169,   95,    0,    0,   95,    0,  154,
-  155,  156,  157,    0,    0,    0,    0,    0,    0,    0,
-    0,   95,   95,    0,    0,    0,   95,    0,   23,  164,
-  165,   53,    0,  166,    0,    0,  167,  168,  169,    0,
-    0,    0,  167,  167,  167,  167,  167,    0,  167,  167,
-  167,    0,    0,    0,  167,    0,   95,  151,  151,  151,
+  110,  168,    0,    0,   65,   65,   65,   65,    0,    0,
+    0,    0,    0,    0,  110,  110,  156,  157,  151,  110,
+  168,  167,    4,    5,    6,    0,    7,    8,  114,   65,
+   65,    0,  164,  165,    0,    0,  166,    0,    0,  167,
+  168,  169,    0,    0,    0,    0,    0,    0,   52,  110,
+    0,   62,   64,   50,    0,   57,    0,   65,   60,  154,
+   59,  156,  157,    4,    5,    6,    0,    7,    8,    0,
+    0,    0,    0,    0,   58,    0,    0,  164,  165,   63,
+    0,  166,  168,    0,  167,  168,  169,  241,    0,  347,
+  348,    0,    0,    0,    0,    0,  354,    0,    0,  100,
+    0,    0,  100,    0,    0,    0,   61,  156,  157,    0,
+    0,  361,    0,    0,  363,  275,  100,  100,    0,    0,
+    0,  100,    0,    0,  165,    0,    0,  166,    0,    0,
+  167,  168,  169,    0,    0,    0,    0,    0,   23,  165,
+    0,   53,  166,    0,    0,  167,  168,  169,    0,    0,
+    0,  100,  167,  167,  167,  167,  167,    0,  167,  167,
+  167,    0,    0,    0,  167,    0,    0,  151,  151,  151,
   151,    0,    0,    0,    0,  167,  151,  167,  167,  167,
-  151,  151,  151,  151,  167,  167,  167,  167,  167,  167,
-  151,  151,  167,  167,  151,  151,  151,  151,  151,  167,
+  167,  167,  151,  151,  151,  151,  167,  167,  167,  167,
+  167,  167,  151,  151,  167,  151,  151,  151,  151,  151,
   151,  151,    0,  167,  151,  167,  167,  151,  151,  151,
     0,    0,    0,  168,  168,  168,  168,  168,    0,  168,
   168,  168,    0,    0,    0,  168,    0,    0,  110,  110,
   110,  110,    0,    0,    0,    0,  168,  110,  168,  168,
-  168,  110,  110,  110,  110,  168,  168,  168,  168,  168,
-  168,  110,  110,  168,  168,  110,  110,  110,  110,  110,
-  168,  110,  110,    0,  168,  110,  168,  168,  110,  110,
+  168,  168,  168,  110,  110,  110,  110,  168,  168,  168,
+  168,  168,  168,  110,  110,  168,  110,  110,  110,  110,
+  110,  110,  110,    0,  168,  110,  168,  168,  110,  110,
   110,   22,   24,   25,   26,   27,   28,    0,   29,   30,
-   31,    0,    0,  143,   32,    0,  143,   33,   34,   35,
+   31,    0,    0,    0,   32,    0,    0,   33,   34,   35,
    36,    0,    0,    0,   37,   38,    0,   39,   40,   41,
-  143,  143,    0,    0,   42,   43,   44,   45,   46,   47,
-    0,    0,   49,   50,    0,    0,    0,    0,    0,   51,
-    0,    0,    0,   54,   47,   55,   56,   47,   47,   47,
-    0,   47,    0,   47,   47,  143,   47,    0,    0,    0,
-    0,    0,    0,    0,    0,   95,   95,   95,   95,    0,
-   47,    0,    0,    0,   95,   47,    0,    0,   95,   95,
-   95,   95,    0,    0,    0,    0,    0,    0,   95,   95,
-    0,    0,   95,   95,   95,   95,   95,    0,   95,   95,
-   52,    0,   47,   62,   64,   48,    0,   57,    0,   65,
-   60,   91,   59,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,  120,  123,    0,    0,  111,    0,    0,
-    0,   63,    0,  119,   47,  125,    0,   47,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,  139,  140,  141,
-  142,  170,    0,    0,    0,    0,   52,    0,   61,   62,
-   64,   48,    0,   57,  123,   65,   60,    0,   59,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,  152,    0,    0,    0,   63,    0,    0,
-   23,    0,  123,   53,    0,  205,  334,  335,  336,  211,
-    0,    0,  339,    0,  341,    0,    0,   64,    0,    0,
-   64,    0,    0,    0,   61,    0,    0,    0,    0,   52,
-    0,    0,   62,   64,   48,   64,   57,    0,   65,   60,
-  356,   59,    0,    0,  143,  143,  143,  143,  358,    0,
-  359,  170,    0,    0,    0,  116,   23,    0,    0,   53,
-   63,  365,    0,    0,    0,    0,  123,  143,  143,   64,
-    0,  123,    0,    0,    0,    0,    0,   47,   47,   47,
-   47,   47,   47,  152,   47,   47,   47,   61,    0,    0,
-   47,    0,    0,   47,   47,   47,   47,    0,    0,   87,
-   47,   47,   87,   47,   47,   47,    0,    0,    0,    0,
-   47,   47,   47,   47,   47,   47,   87,   87,   47,   47,
-    0,   87,   53,    0,    0,   47,    0,    0,    0,   47,
-    0,   47,   47,    0,  121,   25,   26,   27,   28,   87,
-   29,   30,   31,    0,    0,    0,   32,  138,    0,    0,
-  138,   87,    0,    0,    0,   88,    0,   38,   88,   39,
-   40,   41,    0,    0,  138,  138,   42,   43,   44,   45,
-   46,   47,   88,   88,   49,   50,  165,   88,    0,  166,
-    0,   51,  167,  168,  169,   54,    0,   55,   56,    0,
-  112,   25,   26,   27,   28,    0,   29,   30,   31,  138,
-    0,    0,   32,    0,    0,    0,    0,   88,    0,    0,
-  170,  131,    0,   38,  131,   39,   40,   41,    0,    0,
-    0,    0,   42,   43,   44,   45,   46,   47,  131,  131,
-   49,   50,    0,  131,    0,    0,    0,   51,    0,    0,
-    0,   54,  152,   55,   56,    0,    0,  156,   64,   64,
-   64,   64,    0,   24,   25,   26,   27,   28,    0,   29,
-   30,   31,    0,  131,   79,   32,  165,   79,    0,  166,
-    0,   64,  167,  168,  169,    0,   38,    0,   39,   40,
-   41,   79,   79,    0,    0,   42,   43,   44,   45,   46,
-   47,    0,    0,   49,   50,    0,    0,    0,    0,    0,
-   51,    0,    0,    0,   54,   52,   55,   56,   62,   64,
-   48,    0,   57,    0,   65,   60,   79,   59,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-   87,   87,   87,   87,    0,    0,   63,    0,    0,   87,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,   87,   87,    0,    0,   87,   87,   87,
-   87,   52,    0,   61,   62,   64,   48,    0,   57,  133,
-   65,   60,    0,   59,    0,    0,    0,    0,  138,  138,
-  138,  138,    0,    0,    0,    0,   88,   88,   88,   88,
-    0,    0,   63,    0,    0,   23,    0,    0,   53,    0,
-    0,  138,  138,    0,    0,    0,  156,  157,    0,   88,
-   88,    0,    0,   88,    0,    0,    0,   52,    0,   61,
-   62,   64,   48,    0,   57,  165,   65,   60,  166,   59,
-    0,  167,  168,  169,    0,    0,    0,    0,    0,    0,
-    0,    0,  131,  131,  131,  131,    0,    0,   63,    0,
-    0,  131,    0,    0,   53,  131,  131,    0,    0,    0,
-    0,    0,    0,    0,    0,  131,  131,    0,    0,  131,
-  131,  131,  131,  131,    0,   61,    0,  137,    0,    0,
-   52,    0,    0,   62,   64,   48,    0,   57,  201,   65,
-   60,    0,   59,    0,    0,   79,   79,   79,   79,    0,
+   42,   43,    0,    0,    0,  170,   44,   45,   46,   47,
+   48,   49,   47,    0,   51,   47,   47,   47,    0,   47,
+    0,   47,   47,   54,   47,   55,   56,  115,    0,    0,
+  100,  100,  100,  100,    0,  127,    0,  152,   47,  100,
+    0,    0,    0,   47,    0,  100,  100,  100,  100,    0,
+    0,    0,    0,    0,    0,  100,  100,    0,  100,  100,
+  100,  100,  100,  100,  100,    0,    0,  100,   52,    0,
+   47,   62,   64,   50,  115,   57,    0,   65,   60,    0,
+   59,    0,    0,    0,    0,    0,    0,    0,  334,  335,
+  336,    0,    0,    0,  339,    0,  341,    0,    0,   63,
+    0,  206,   47,    0,    0,   47,    0,    0,    0,  115,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-   53,   63,    0,    0,    0,    0,    0,    0,   79,   79,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,   24,
-   25,   26,   27,   28,    0,   29,   30,   31,   61,    0,
-    0,   32,   67,    0,    0,   67,    0,    0,    0,    0,
-   89,    0,   38,   89,   39,   40,   41,    0,    0,   67,
-   67,   42,   43,   44,   45,   46,   47,   89,   89,   49,
-   50,    0,   89,   53,    0,    0,   51,    0,    0,    0,
-   54,    0,   55,   56,    0,   24,   25,   26,   27,   28,
-    0,   29,   30,   31,   67,    0,    0,   32,    0,    0,
-    0,    0,   89,    0,    0,    0,   90,    0,   38,   90,
-   39,   40,   41,    0,    0,    0,    0,   42,   43,   44,
-   45,   46,   47,   90,   90,   49,   50,    0,   90,    0,
-    0,    0,   51,    0,    0,    0,   54,    0,   55,   56,
-    0,   24,   25,   26,   27,   28,    0,   29,   30,   31,
-    0,    0,    0,   32,    0,    0,    0,    0,   90,    0,
-    0,    0,  142,    0,   38,  142,   39,   40,   41,    0,
-    0,    0,    0,   42,   43,   44,   45,   46,   47,  142,
-  142,   49,   50,    0,  142,    0,    0,    0,   51,    0,
-    0,    0,   54,    0,   55,   56,    0,    0,    0,    0,
-    0,    0,    0,    0,   24,   25,   26,   27,   28,    0,
-   29,   30,   31,    0,  142,    0,   32,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  159,   38,    0,   39,
-   40,   41,    0,    0,    0,    0,   42,   43,   44,   45,
-   46,   47,    0,    0,   49,   50,    0,    0,    0,    0,
-    0,   51,    0,    0,  170,   54,   52,   55,   56,   62,
-   64,   48,    0,   57,  249,   65,   60,    0,   59,    0,
-    0,    0,    0,   67,   67,   67,   67,    0,    0,    0,
-    0,   89,   89,   89,   89,    0,  152,   63,    0,    0,
-   89,    0,    0,    0,    0,    0,   67,   67,    0,    0,
-    0,    0,    0,    0,   89,   89,    0,    0,   89,   89,
-   89,    0,   52,    0,   61,   62,   64,   48,    0,   57,
-    0,   65,   60,    0,   59,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,   90,   90,   90,
-   90,    0,    0,   63,    0,    0,   90,    0,    0,   53,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-   90,   90,    0,    0,   90,   90,    0,    0,   52,    0,
-   61,   62,   64,   48,    0,   57,  287,   65,   60,    0,
-   59,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,  142,  142,  142,  142,    0,    0,   63,
-    0,    0,  142,    0,    0,   53,  142,  142,    0,    0,
-    0,    0,    0,    0,    0,    0,  142,  142,    0,    0,
-  142,  142,  142,  142,  142,    0,   61,    0,    0,    0,
-    0,   52,    0,    0,   62,   64,   48,    0,   57,  289,
-   65,   60,    0,   59,  153,    0,    0,    0,  154,  155,
-  156,  157,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,   53,   63,  160,  161,  162,  163,    0,  164,  165,
+    0,    0,  356,    0,   52,    0,   61,   62,   64,   50,
+  358,   57,  359,   65,   60,    0,   59,    0,    0,    0,
+    0,    0,    0,  365,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,   63,    0,    0,   23,    0,
+    0,   53,    0,    0,    0,    0,  115,    0,    0,    0,
+    0,  115,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,   61,    0,    0,    0,    0,   52,    0,    0,
+   62,   64,   50,    0,   57,    0,   65,   60,    0,   59,
+    0,  154,  155,  156,  157,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,   23,    0,    0,   53,   63,  164,
+  165,    0,    0,  166,    0,    0,  167,  168,  169,    0,
+    0,    0,    0,    0,    0,   47,   47,   47,   47,   47,
+   47,    0,   47,   47,   47,   61,    0,    0,   47,    0,
+    0,   47,   47,   47,   47,    0,    0,    0,   47,   47,
+    0,   47,   47,   47,   47,   47,    0,    0,    0,    0,
+   47,   47,   47,   47,   47,   47,    0,   23,   47,    0,
+   53,    0,  170,    0,    0,    0,  333,   47,    0,   47,
+   47,    0,  113,   25,   26,   27,   28,   87,   29,   30,
+   31,    0,    0,    0,   32,    0,    0,    0,  159,    0,
+    0,    0,    0,    0,  152,   38,    0,   39,   40,   41,
+   42,   43,    0,    0,    0,    0,   44,   45,   46,   47,
+   48,   49,    0,    0,   51,    0,  170,    0,    0,    0,
+    0,    0,    0,   54,    0,   55,   56,    0,   24,   25,
+   26,   27,   28,    0,   29,   30,   31,    0,    0,    0,
+   32,  295,    0,    0,    0,    0,  159,    0,  152,    0,
+    0,   38,    0,   39,   40,   41,   42,   43,    0,    0,
+    0,    0,   44,   45,   46,   47,   48,   49,    0,    0,
+   51,    0,    0,    0,  170,    0,    0,    0,    0,   54,
+    0,   55,   56,    0,    0,    0,    0,   84,    0,    0,
+   84,  119,   25,   26,   27,   28,    0,   29,   30,   31,
+    0,    0,    0,   32,   84,   84,  152,    0,    0,   84,
+    0,    0,    0,    0,   38,    0,   39,   40,   41,   42,
+   43,    0,    0,    0,    0,   44,   45,   46,   47,   48,
+   49,   52,    0,   51,   62,   64,   50,    0,   57,   84,
+   65,   60,   54,   59,   55,   56,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,  123,  154,  155,
+  156,  157,   63,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,  160,  161,  162,  163,  164,  165,    0,    0,
+  166,    0,    0,  167,  168,  169,    0,   52,    0,   61,
+   62,   64,   50,    0,   57,  133,   65,   60,    0,   59,
+    0,    0,    0,    0,    0,    0,  153,    0,    0,    0,
+    0,    0,  154,  155,  156,  157,    0,    0,   63,    0,
+    0,    0,    0,    0,   53,  158,  160,  161,  162,  163,
+  164,  165,    0,    0,  166,    0,    0,  167,  168,  169,
+    0,    0,    0,   52,    0,   61,   62,   64,   50,    0,
+   57,    0,   65,   60,    0,   59,    0,    0,    0,    0,
+    0,    0,    0,    0,  153,    0,    0,    0,    0,    0,
+  154,  155,  156,  157,   63,    0,    0,    0,    0,    0,
+   53,    0,    0,  158,  160,  161,  162,  163,  164,  165,
     0,    0,  166,    0,    0,  167,  168,  169,    0,    0,
-   24,   25,   26,   27,   28,    0,   29,   30,   31,   61,
-    0,    0,   32,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,   38,    0,   39,   40,   41,  102,    0,
-    0,  102,   42,   43,   44,   45,   46,   47,    0,    0,
-   49,   50,    0,    0,   53,  102,  102,   51,    0,    0,
-  102,   54,    0,   55,   56,   22,   24,   25,   26,   27,
-   28,    0,   29,   30,   31,    0,    0,    0,   32,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,   38,
-  102,   39,   40,   41,    0,    0,    0,    0,   42,   43,
-   44,   45,   46,   47,    0,    0,   49,   50,    0,    0,
-    0,    0,    0,   51,    0,    0,    0,   54,  144,   55,
-   56,  144,   24,   25,   26,   27,   28,    0,   29,   30,
-   31,    0,    0,    0,   32,  144,  144,    0,    0,    0,
-  144,    0,    0,    0,    0,   38,    0,   39,   40,   41,
-    0,    0,    0,    0,   42,   43,   44,   45,   46,   47,
-    0,    0,   49,   50,    0,    0,    0,    0,  144,   51,
-  144,    0,    0,   54,    0,   55,   56,  127,    0,    0,
-  127,    0,    0,    0,    0,   24,   25,   26,   27,   28,
-    0,   29,   30,   31,  127,  127,    0,   32,    0,  127,
-  144,    0,    0,    0,    0,    0,    0,    0,   38,    0,
-   39,   40,   41,    0,    0,    0,    0,   42,   43,   44,
-   45,   46,   47,    0,    0,   49,   50,  127,    0,  127,
-    0,    0,   51,    0,    0,    0,   54,   52,   55,   56,
-   62,   64,   48,    0,   57,    0,   65,   60,    0,   59,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,  127,
-    0,    0,    0,    0,    0,    0,    0,    0,   63,  102,
-  102,  102,  102,    0,    0,    0,    0,    0,  102,    0,
-    0,    0,  102,  102,    0,  151,    0,    0,  151,    0,
-    0,    0,  102,  102,    0,   61,  102,  102,  102,  102,
-  102,    0,  151,  151,    0,    0,    0,  151,   89,   89,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-  106,    0,    0,    0,    0,   89,  115,    0,    0,    0,
-   53,   89,    0,  122,    0,  151,    0,  151,    0,    0,
-    0,    0,    0,    0,    0,   89,   89,   89,   89,  144,
-  144,  144,  144,  112,    0,  170,  112,    0,  144,    0,
-    0,    0,  144,  144,  144,  144,    0,  151,    0,    0,
-  112,  112,  144,  144,    0,  112,  144,  144,  144,  144,
-  144,    0,  144,  144,    0,    0,  144,  152,    0,  144,
-  144,  144,    0,  122,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,  112,    0,  112,    0,    0,  127,  127,
-  127,  127,    0,    0,    0,    0,    0,  127,    0,    0,
-    0,  127,  127,  127,  127,    0,    0,    0,    0,    0,
-    0,  127,  127,    0,  170,  127,  127,  127,  127,  127,
-    0,  127,  127,    0,    0,  127,    0,    0,  127,  127,
-  127,    0,  241,  137,    0,    0,  137,    0,    0,    0,
-    0,   24,   25,   26,   27,   28,  152,   29,   30,   31,
-  137,  137,    0,   32,    0,  137,    0,    0,    0,    0,
-  275,    0,    0,    0,   38,    0,   39,   40,   41,    0,
-    0,    0,    0,   42,   43,   44,   45,   46,   47,    0,
-    0,   49,   50,    0,    0,  137,    0,    0,   51,    0,
-    0,    0,   54,    0,   55,   56,  151,  151,  151,  151,
-  153,    0,    0,  153,    0,  151,    0,    0,    0,  151,
-  151,  151,  151,    0,    0,  137,    0,  153,  153,  151,
-  151,    0,  153,  151,  151,  151,  151,  151,    0,  151,
-  151,  156,  157,  151,    0,    0,  151,  151,  151,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,  164,
-  165,    0,  153,  166,    0,    0,  167,  168,  169,    0,
-    0,    0,    0,    0,  112,  112,  112,  112,  139,    0,
-    0,    0,    0,  112,    0,    0,    0,  112,  112,  112,
-  112,    0,  153,    0,    0,  139,  139,  112,  112,    0,
-  139,  112,  112,  112,  112,  112,    0,  112,  112,    0,
-    0,  112,    0,    0,  112,  112,  112,    0,  154,  155,
-  156,  157,    0,    0,    0,    0,    0,    0,  139,    0,
-  139,    0,    0,  160,  161,  162,  163,    0,  164,  165,
-    0,  154,  166,    0,    0,  167,  168,  169,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,  154,  154,
-  139,    0,    0,  154,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,  137,  137,  137,  137,    0,    0,
-    0,    0,    0,  137,    0,    0,    0,  137,  137,  137,
-  137,  154,    0,  154,    0,    0,    0,  137,  137,    0,
-    0,  137,  137,  137,  137,  137,    0,  137,  137,  104,
-    0,  137,  104,    0,  137,  137,  137,    0,    0,    0,
-    0,    0,    0,  154,    0,    0,  104,  104,    0,    0,
-    0,  104,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,  153,  153,  153,  153,    0,    0,    0,    0,    0,
-  153,    0,    0,    0,  153,  153,  153,  153,    0,    0,
-    0,  104,    0,    0,  153,  153,    0,    0,  153,  153,
-  153,  153,  153,    0,  153,  153,   66,    0,  153,   66,
-    0,  153,  153,  153,    0,    0,    0,    0,    0,    0,
-    0,  104,    0,   66,   66,    0,    0,    0,   66,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,  139,
-  139,  139,  139,    0,    0,    0,    0,    0,  139,    0,
-    0,    0,  139,  139,  139,  139,    0,    0,   66,    0,
-    0,    0,  139,  139,    0,    0,  139,  139,  139,  139,
-  139,    0,  139,  139,    0,    0,  139,    0,    0,  139,
-  139,  139,    0,    0,    0,    0,    0,    0,   66,  170,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,  154,  154,  154,  154,   69,    0,    0,    0,
-    0,  154,    0,    0,    0,  154,  154,  154,  154,    0,
-    0,  152,    0,   69,   69,  154,  154,    0,   69,  154,
-  154,  154,  154,  154,    0,  154,  154,    0,    0,  154,
-    0,    0,  154,  154,  154,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,   69,    0,   69,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-  104,  104,  104,  104,  103,    0,    0,  103,    0,  104,
-    0,    0,    0,  104,  104,  104,  104,    0,   69,    0,
-    0,  103,  103,  104,  104,    0,  103,  104,  104,  104,
-  104,  104,    0,  104,  104,    0,    0,  104,    0,    0,
-  104,  104,  104,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  103,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,   66,   66,   66,
-   66,  153,    0,    0,  153,    0,   66,    0,    0,    0,
-   66,   66,   66,   66,    0,    0,  103,    0,  153,  153,
-   66,   66,    0,  153,   66,   66,   66,   66,   66,    0,
-   66,   66,    0,    0,   66,    0,    0,   66,   66,   66,
-    0,    0,    0,  154,  140,  156,  157,  140,    0,    0,
-    0,    0,    0,  153,    0,    0,    0,    0,    0,    0,
-    0,  140,  140,  164,  165,    0,  140,  166,    0,    0,
-  167,  168,  169,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  140,   69,   69,   69,
-   69,  110,    0,    0,  110,    0,   69,    0,    0,    0,
-   69,   69,   69,   69,    0,    0,    0,    0,  110,  110,
-   69,   69,    0,  110,   69,   69,   69,   69,   69,    0,
-   69,   69,    0,    0,   69,    0,    0,   69,   69,   69,
+    0,   61,   52,  137,    0,   62,   64,   50,    0,   57,
+  201,   65,   60,    0,   59,    0,    0,    0,   84,   84,
+   84,   84,    0,    0,    0,    0,    0,   84,    0,    0,
+    0,    0,    0,   63,   84,    0,   53,    0,    0,    0,
+    0,    0,    0,   84,   84,    0,   84,   84,   84,   84,
+   84,   85,    0,    0,   85,   24,   25,   26,   27,   28,
+   61,   29,   30,   31,    0,    0,    0,   32,   85,   85,
+    0,    0,    0,   85,    0,    0,    0,    0,   38,    0,
+   39,   40,   41,   42,   43,    0,    0,    0,    0,   44,
+   45,   46,   47,   48,   49,   53,    0,   51,    0,    0,
+    0,    0,    0,   85,    0,    0,   54,   86,   55,   56,
+   86,   24,   25,   26,   27,   28,    0,   29,   30,   31,
+    0,    0,    0,   32,   86,   86,    0,    0,    0,   86,
+    0,    0,    0,    0,   38,    0,   39,   40,   41,   42,
+   43,    0,    0,    0,    0,   44,   45,   46,   47,   48,
+   49,    0,    0,   51,    0,    0,    0,    0,    0,   86,
+    0,    0,   54,    0,   55,   56,    0,   24,   25,   26,
+   27,   28,    0,   29,   30,   31,    0,   52,    0,   32,
+   62,   64,   50,    0,   57,  249,   65,   60,    0,   59,
+   38,    0,   39,   40,   41,   42,   43,    0,    0,    0,
+    0,   44,   45,   46,   47,   48,   49,    0,   63,   51,
+    0,    0,    0,    0,    0,    0,    0,    0,   54,    0,
+   55,   56,    0,    0,    0,    0,   24,   25,   26,   27,
+   28,    0,   29,   30,   31,   61,   52,    0,   32,   62,
+   64,   50,    0,   57,    0,   65,   60,    0,   59,   38,
+    0,   39,   40,   41,   42,   43,    0,    0,    0,    0,
+   44,   45,   46,   47,   48,   49,    0,   63,   51,    0,
+   53,    0,    0,    0,    0,    0,    0,   54,    0,   55,
+   56,    0,   85,   85,   85,   85,    0,    0,    0,    0,
+    0,   85,   52,    0,   61,   62,   64,   50,    0,   57,
+  287,   65,   60,    0,   59,    0,    0,   85,   85,    0,
+   85,   85,   85,   85,   85,    0,    0,    0,    0,    0,
+    0,    0,    0,   63,    0,    0,    0,    0,    0,   53,
+    0,    0,    0,    0,    0,    0,    0,    0,   86,   86,
+   86,   86,    0,    0,    0,    0,    0,   86,   52,    0,
+   61,   62,   64,   50,    0,   57,  289,   65,   60,    0,
+   59,    0,    0,   86,   86,    0,   86,   86,   86,   86,
+   86,    0,    0,    0,    0,    0,    0,    0,    0,   63,
+    0,    0,    0,    0,    0,   53,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,  110,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,  103,  103,  103,  103,  117,
-    0,    0,  117,    0,  103,    0,    0,    0,  103,  103,
-  103,  103,    0,    0,    0,    0,  117,  117,  103,  103,
-    0,  117,  103,  103,  103,  103,  103,    0,  103,  103,
-    0,    0,  103,    0,    0,  103,  103,  103,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,  117,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,  153,  153,  153,  153,    0,    0,    0,    0,
-    0,  153,    0,    0,    0,  153,  153,  153,  153,    0,
-    0,    0,    0,    0,    0,  153,  153,    0,    0,  153,
-  153,  153,  153,  153,    0,  153,  153,    0,    0,  153,
-    0,    0,  153,  153,  153,  140,  140,  140,  140,  101,
-    0,    0,  101,    0,  140,    0,    0,    0,  140,  140,
-  140,  140,    0,    0,    0,    0,  101,  101,  140,  140,
-    0,  101,  140,  140,  140,  140,  140,    0,  140,  140,
-    0,    0,  140,    0,    0,  140,  140,  140,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,  101,  110,  110,  110,  110,    0,    0,    0,    0,
-    0,  110,    0,    0,    0,  110,  110,  110,  110,    0,
-    0,    0,    0,    0,    0,  110,  110,    0,    0,  110,
-  110,  110,  110,  110,    0,  110,  110,   96,    0,  110,
-   96,    0,  110,  110,  110,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,   96,   96,    0,    0,    0,   96,
+    0,   24,   25,   26,   27,   28,   61,   29,   30,   31,
+    0,   52,    0,   32,   62,   64,   50,    0,   57,    0,
+   65,   60,    0,   59,   38,    0,   39,   40,   41,   42,
+   43,    0,    0,    0,    0,   44,   45,   46,   47,   48,
+   49,   53,   63,   51,    0,    0,    0,    0,    0,    0,
+    0,    0,   54,    0,   55,   56,    0,    0,    0,   22,
+   24,   25,   26,   27,   28,    0,   29,   30,   31,   61,
+    0,    0,   32,   91,    0,    0,   91,    0,    0,    0,
+    0,    0,    0,   38,    0,   39,   40,   41,   42,   43,
+   91,   91,    0,    0,   44,   45,   46,   47,   48,   49,
+    0,    0,   51,    0,   53,    0,    0,    0,    0,  144,
+    0,   54,  144,   55,   56,    0,   24,   25,   26,   27,
+   28,    0,   29,   30,   31,   91,  144,  144,   32,    0,
+    0,  144,    0,    0,    0,    0,    0,    0,    0,   38,
+    0,   39,   40,   41,   42,   43,    0,    0,    0,    0,
+   44,   45,   46,   47,   48,   49,    0,    0,   51,  144,
+    0,  144,    0,    0,    0,    0,    0,   54,  127,   55,
+   56,  127,   24,   25,   26,   27,   28,    0,   29,   30,
+   31,    0,    0,    0,   32,  127,  127,    0,    0,    0,
+  127,  144,    0,    0,    0,   38,    0,   39,   40,   41,
+   42,   43,    0,    0,    0,    0,   44,   45,   46,   47,
+   48,   49,    0,    0,   51,    0,    0,    0,  127,    0,
+  127,    0,    0,   54,    0,   55,   56,    0,    0,    0,
+    0,  151,    0,    0,  151,   24,   25,   26,   27,   28,
+    0,   29,   30,   31,    0,    0,    0,   32,  151,  151,
+  127,    0,    0,  151,    0,    0,    0,    0,   38,    0,
+   39,   40,   41,   42,   43,    0,    0,    0,    0,   44,
+   45,   46,   47,   48,   49,    0,    0,   51,    0,  137,
+    0,  151,  137,  151,    0,    0,   54,    0,   55,   56,
+    0,    0,    0,    0,    0,    0,  137,  137,    0,    0,
+    0,  137,    0,    0,   91,   91,   91,   91,    0,    0,
+    0,    0,    0,  151,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,    0,   91,
+   91,  137,   91,    0,    0,    0,    0,    0,    0,    0,
+  144,  144,  144,  144,    0,  112,    0,    0,  112,  144,
+    0,    0,    0,    0,    0,  144,  144,  144,  144,    0,
+    0,  137,  112,  112,    0,  144,  144,  112,  144,  144,
+  144,  144,  144,  144,  144,    0,    0,  144,    0,    0,
+  144,  144,  144,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,  112,    0,  112,    0,  127,
+  127,  127,  127,    0,  153,    0,    0,  153,  127,    0,
+    0,    0,    0,    0,  127,  127,  127,  127,    0,    0,
+    0,  153,  153,    0,  127,  127,  153,  127,  127,  127,
+  127,  127,  127,  127,    0,    0,  127,    0,    0,  127,
+  127,  127,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,  153,    0,    0,    0,
+    0,    0,  151,  151,  151,  151,    0,    0,    0,    0,
+    0,  151,    0,    0,    0,    0,    0,  151,  151,  151,
+  151,    0,    0,    0,    0,    0,  153,  151,  151,    0,
+  151,  151,  151,  151,  151,  151,  151,    0,    0,  151,
+    0,    0,  151,  151,  151,    0,    0,    0,    0,    0,
+  137,  137,  137,  137,    0,  154,    0,    0,    0,  137,
+    0,    0,    0,    0,    0,  137,  137,  137,  137,    0,
+    0,    0,  154,  154,    0,  137,  137,  154,  137,  137,
+  137,  137,  137,  137,  137,    0,    0,  137,    0,    0,
+  137,  137,  137,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,  154,    0,  154,    0,    0,
+    0,    0,    0,    0,    0,    0,  112,  112,  112,  112,
+    0,    0,    0,    0,    0,  112,    0,    0,    0,    0,
+    0,  112,  112,  112,  112,    0,    0,  154,    0,    0,
+  170,  112,  112,    0,  112,  112,  112,  112,  112,  112,
+  112,    0,    0,  112,    0,    0,  112,  112,  112,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-  117,  117,  117,  117,    0,    0,    0,    0,    0,  117,
-    0,    0,    0,  117,  117,  117,  117,    0,    0,   96,
-    0,    0,    0,  117,  117,    0,    0,  117,  117,  117,
-  117,  117,    0,  117,  117,   93,    0,  117,    0,    0,
-  117,  117,  117,  107,    0,    0,    0,    0,  114,    0,
-   97,    0,    0,   97,    0,    0,  127,  128,  129,  130,
-  131,  132,    0,    0,  135,  136,    0,   97,   97,    0,
-    0,  143,   97,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,  152,    0,    0,  153,  153,  153,  153,    0,
+  139,    0,    0,    0,  153,    0,    0,    0,    0,    0,
+  153,  153,  153,  153,    0,    0,    0,  139,  139,    0,
+  153,  153,  139,  153,  153,  153,  153,  153,  153,  153,
+    0,    0,  153,    0,    0,  153,  153,  153,    0,    0,
+    0,    0,    0,  104,    0,    0,  104,    0,    0,    0,
+  139,    0,  139,   88,    0,    0,   88,    0,    0,    0,
+  104,  104,    0,    0,    0,  104,    0,    0,    0,    0,
+   88,   88,    0,    0,    0,   88,    0,    0,    0,    0,
+    0,    0,  139,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,  104,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,   88,  154,  154,  154,  154,
+    0,   66,    0,    0,   66,  154,    0,    0,    0,    0,
+    0,  154,  154,  154,  154,  104,    0,    0,   66,   66,
+    0,  154,  154,   66,  154,  154,  154,  154,  154,  154,
+  154,    0,    0,  154,    0,    0,  154,  154,  154,    0,
+    0,    0,    0,    0,   69,    0,  154,  155,  156,  157,
+    0,    0,    0,   66,    0,    0,    0,    0,    0,    0,
+    0,   69,   69,  163,  164,  165,   69,    0,  166,    0,
+    0,  167,  168,  169,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,   66,    0,    0,    0,    0,  103,    0,
+    0,  103,    0,    0,   69,    0,   69,    0,    0,    0,
+    0,    0,    0,    0,    0,  103,  103,    0,    0,    0,
+  103,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,  139,  139,  139,  139,    0,   69,    0,    0,    0,
+  139,    0,    0,    0,    0,    0,  139,  139,  139,  139,
+  103,    0,    0,    0,    0,    0,  139,  139,    0,  139,
+  139,  139,  139,  139,  139,  139,    0,    0,  139,    0,
+    0,  139,  139,  139,  104,  104,  104,  104,    0,  140,
+  103,    0,  140,  104,   88,   88,   88,   88,    0,  104,
+  104,  104,  104,    0,    0,    0,  140,  140,    0,  104,
+  104,  140,  104,  104,  104,  104,  104,  104,  104,   88,
+   88,  104,   88,    0,  104,  104,  104,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,  186,   93,    0,
-    0,   93,   97,    0,    0,    0,    0,    0,    0,    0,
-  101,  101,  101,  101,    0,   93,   93,    0,    0,  101,
-   93,    0,    0,  101,  101,  101,  101,    0,    0,    0,
-    0,    0,    0,  101,  101,    0,    0,  101,  101,  101,
-  101,  101,    0,  101,  101,    0,    0,  101,    0,    0,
-   93,    0,    0,    0,    0,    0,    0,    0,  224,  225,
+    0,  140,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,   66,   66,   66,   66,    0,  153,    0,    0,
+  153,   66,    0,    0,    0,    0,    0,   66,   66,   66,
+   66,    0,    0,    0,  153,  153,    0,   66,   66,  153,
+   66,   66,   66,   66,   66,   66,   66,    0,    0,   66,
+    0,    0,   66,   66,   66,   69,   69,   69,   69,    0,
+  110,    0,    0,  110,   69,    0,    0,    0,    0,  153,
+   69,   69,   69,   69,    0,    0,    0,  110,  110,    0,
+   69,   69,  110,   69,   69,   69,   69,   69,   69,   69,
+    0,    0,   69,    0,    0,   69,   69,   69,    0,  103,
+  103,  103,  103,    0,  117,    0,    0,  117,  103,    0,
+    0,    0,  110,    0,  103,  103,  103,  103,    0,    0,
+    0,  117,  117,    0,  103,  103,  117,  103,  103,  103,
+  103,  103,  103,  103,    0,    0,  103,    0,    0,  103,
+  103,  103,    0,    0,    0,    0,    0,  101,    0,    0,
+  101,    0,    0,    0,    0,    0,  117,    0,    0,    0,
+    0,    0,    0,    0,  101,  101,    0,  138,    0,  101,
+  138,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+  140,  140,  140,  140,  138,  138,    0,    0,    0,  140,
+    0,    0,    0,    0,    0,  140,  140,  140,  140,  101,
+    0,    0,    0,    0,    0,  140,  140,    0,  140,  140,
+  140,  140,  140,  140,  140,   95,    0,  140,   95,  138,
+  140,  140,  140,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,   95,   95,    0,    0,    0,   95,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,  153,  153,
+  153,  153,    0,   96,    0,    0,   96,  153,    0,    0,
+    0,    0,    0,  153,  153,  153,  153,   95,    0,    0,
+   96,   96,    0,  153,  153,   96,  153,  153,  153,  153,
+  153,  153,  153,    0,    0,  153,    0,    0,  153,  153,
+  153,  110,  110,  110,  110,    0,    0,    0,    0,    0,
+  110,    0,    0,    0,    0,   96,  110,  110,  110,  110,
+    0,    0,    0,    0,    0,    0,  110,  110,    0,  110,
+  110,  110,  110,  110,  110,  110,    0,    0,  110,    0,
+    0,  110,  110,  110,    0,  117,  117,  117,  117,    0,
+   97,    0,    0,   97,  117,    0,    0,    0,    0,    0,
+  117,  117,  117,  117,    0,    0,    0,   97,   97,    0,
+  117,  117,   97,  117,  117,  117,  117,  117,  117,  117,
+    0,    0,  117,    0,    0,  117,  117,  117,  101,  101,
+  101,  101,    0,    0,    0,    0,    0,  101,    0,    0,
+    0,    0,   97,  101,  101,  101,  101,    0,  138,  138,
+  138,  138,    0,  101,  101,   93,  101,  101,  101,  101,
+  101,  101,  101,  107,    0,  101,    0,  112,    0,    0,
+  121,    0,    0,  138,  138,    0,    0,  128,  129,  130,
+  131,  132,    0,    0,  135,  136,    0,    0,  170,    0,
+    0,  143,    0,    0,    0,    0,   95,   95,   95,   95,
+    0,   93,    0,    0,   93,   95,    0,    0,    0,    0,
+    0,   95,   95,   95,   95,    0,    0,  186,   93,   93,
+  152,   95,   95,   93,   95,   95,   95,   95,   95,   95,
+   95,    0,    0,    0,   96,   96,   96,   96,    0,    0,
+    0,    0,    0,   96,    0,    0,    0,    0,    0,   96,
+   96,   96,   96,   93,   94,    0,    0,   94,    0,   96,
+   96,    0,   96,   96,   96,   96,   96,   96,   96,    0,
+    0,   94,   94,    0,    0,    0,   94,    0,  224,  225,
   226,  227,  228,  229,  230,  231,  232,  233,  234,  235,
-  236,  237,   94,    0,    0,   94,    0,    0,    0,    0,
-    0,    0,    0,  251,    0,    0,    0,    0,    0,   94,
-   94,    0,    0,    0,   94,    0,    0,    0,   96,   96,
-   96,   96,    0,    0,    0,    0,    0,   96,    0,    0,
-    0,   96,   96,   96,   96,    0,   92,    0,    0,   92,
-    0,   96,   96,    0,   94,   96,   96,   96,   96,   96,
-    0,   96,   96,   92,   92,    0,    0,    0,   92,    0,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,   80,    0,    0,   80,    0,    0,
-    0,    0,    0,  308,    0,    0,    0,    0,   92,    0,
-    0,   80,   80,    0,    0,    0,   80,    0,    0,    0,
+  236,  237,   92,    0,    0,   92,    0,    0,    0,    0,
+    0,    0,    0,  251,    0,    0,   94,    0,    0,   92,
+   92,    0,    0,    0,   92,    0,    0,    0,    0,    0,
     0,   97,   97,   97,   97,    0,    0,    0,    0,    0,
-   97,    0,    0,    0,   97,   97,   97,   97,    0,   81,
-  326,    0,   81,    0,   97,   97,   80,    0,   97,   97,
-   97,   97,   97,    0,   97,   97,   81,   81,    0,    0,
-    0,   81,    0,    0,    0,    0,    0,    0,    0,   93,
-   93,   93,   93,    0,    0,    0,    0,    0,   93,    0,
-    0,    0,   93,   93,   93,   93,    0,   82,    0,    0,
-   82,   81,   93,   93,  170,    0,   93,   93,   93,   93,
-   93,    0,   93,   93,   82,   82,    0,    0,    0,   82,
-    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  152,    0,    0,    0,
-    0,   84,    0,    0,   84,    0,    0,    0,    0,   82,
-    0,    0,    0,   94,   94,   94,   94,   85,   84,   84,
-   85,    0,   94,   84,    0,    0,   94,   94,   94,   94,
-    0,    0,    0,    0,   85,   85,   94,   94,    0,   85,
-   94,   94,   94,   94,   94,    0,   94,   94,    0,    0,
-    0,    0,    0,   84,    0,    0,    0,   92,   92,   92,
-   92,   86,    0,    0,   86,    0,   92,    0,    0,   85,
-   92,   92,   92,   92,    0,    0,    0,    0,   86,   86,
-   92,   92,    0,   86,   92,   92,   92,   92,   92,    0,
-   92,   92,    0,    0,    0,   80,   80,   80,   80,    0,
-    0,  295,    0,    0,   80,    0,  159,    0,   80,   80,
-   80,   80,    0,   86,    0,    0,    0,    0,   80,   80,
-    0,    0,   80,   80,   80,   80,   80,    0,   80,   80,
-    0,    0,    0,    0,  170,    0,    0,    0,    0,    0,
-   81,   81,   81,   81,    0,    0,  159,    0,    0,   81,
-    0,    0,    0,   81,   81,   81,   81,    0,  154,  155,
-  156,  157,    0,   81,   81,    0,  152,   81,   81,   81,
-   81,   81,    0,   81,  170,  162,  163,    0,  164,  165,
-    0,    0,  166,    0,    0,  167,  168,  169,   82,   82,
-   82,   82,    0,    0,    0,    0,    0,   82,    0,    0,
-    0,   82,   82,    0,   82,  170,  152,    0,    0,    0,
-    0,   82,   82,    0,    0,   82,   82,   82,   82,   82,
-    0,   82,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,   84,   84,   84,   84,    0,  152,    0,    0,
-    0,   84,    0,    0,    0,    0,   84,    0,   85,   85,
-   85,   85,    0,    0,    0,   84,   84,   85,    0,   84,
-   84,   84,   84,   84,    0,    0,    0,    0,    0,    0,
-    0,   85,   85,    0,    0,   85,   85,   85,   85,   85,
+   97,    0,    0,    0,    0,    0,   97,   97,   97,   97,
+   80,    0,    0,   80,   92,    0,   97,   97,    0,   97,
+   97,   97,   97,   97,   97,   97,    0,   80,   80,    0,
+    0,    0,   80,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,   81,    0,    0,   81,
+    0,    0,    0,  308,  154,  155,  156,  157,    0,    0,
+    0,    0,   80,   81,   81,    0,    0,    0,   81,  161,
+  162,  163,  164,  165,    0,    0,  166,    0,    0,  167,
+  168,  169,    0,    0,    0,    0,    0,    0,    0,    0,
+  326,   82,    0,    0,   82,    0,    0,    0,   81,    0,
+    0,    0,   93,   93,   93,   93,    0,    0,   82,   82,
+    0,   93,    0,   82,    0,    0,    0,   93,   93,   93,
+   93,    0,    0,    0,    0,    0,    0,   93,   93,    0,
+   93,   93,   93,   93,   93,   93,   93,    0,    0,    0,
+    0,    0,    0,   82,    0,  143,    0,    0,  143,    0,
+    0,    0,    0,    0,    0,   94,   94,   94,   94,    0,
+    0,    0,  143,  143,   94,    0,    0,  143,    0,    0,
+   94,   94,   94,   94,    0,    0,    0,    0,    0,    0,
+   94,   94,    0,   94,   94,   94,   94,   94,   94,   94,
+    0,    0,    0,   92,   92,   92,   92,  143,    0,    0,
+    0,    0,   92,    0,    0,    0,    0,    0,   92,   92,
+   92,   92,  142,    0,    0,  142,    0,    0,   92,   92,
+    0,   92,   92,   92,   92,   92,   92,   92,    0,  142,
+  142,    0,    0,    0,  142,    0,    0,    0,    0,    0,
+    0,   80,   80,   80,   80,   79,    0,    0,   79,    0,
+   80,    0,    0,    0,    0,    0,   80,   80,   80,   80,
+    0,    0,   79,   79,  142,  131,   80,   80,  131,   80,
+   80,   80,   80,   80,   80,   80,    0,   81,   81,   81,
+   81,    0,  131,  131,    0,    0,   81,  131,    0,    0,
+    0,    0,   81,   81,   81,   81,    0,   79,    0,    0,
+    0,    0,   81,   81,    0,   81,   81,   81,   81,   81,
+   81,  102,    0,    0,  102,    0,    0,  131,    0,    0,
+    0,    0,   82,   82,   82,   82,    0,    0,  102,  102,
+    0,   82,    0,  102,    0,    0,    0,   82,   82,    0,
+   82,  170,    0,    0,    0,    0,    0,   82,   82,    0,
+   82,   82,   82,   82,   82,   82,    0,   67,    0,    0,
+   67,    0,    0,  102,   87,    0,    0,   87,    0,    0,
+    0,    0,    0,  152,   67,   67,  143,  143,  143,  143,
+    0,   87,   87,    0,    0,  143,   87,    0,    0,    0,
+    0,  143,  143,    0,    0,    0,   89,    0,    0,   89,
+    0,  143,  143,    0,  143,  143,  143,  143,  143,   67,
+    0,    0,    0,   89,   89,    0,   87,    0,   89,    0,
+    0,  159,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,   86,   86,   86,   86,    0,    0,    0,    0,
-    0,   86,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,   86,   86,    0,    0,   86,
-   86,   86,   86,   86,  153,    0,    0,    0,  154,  155,
-  156,  157,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,  158,  160,  161,  162,  163,    0,  164,  165,
-    0,    0,  166,    0,    0,  167,  168,  169,    0,    0,
-    0,    0,    0,    0,  153,    0,    0,    0,  154,  155,
-  156,  157,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,  158,  160,  161,  162,  163,    0,  164,  165,
-    0,    0,  166,    0,    0,  167,  168,  169,    0,  154,
-  155,  156,  157,    0,    0,    0,    0,    0,    0,   67,
-    0,    0,    0,   81,    0,  161,  162,  163,    0,  164,
-  165,    0,    0,  166,    0,    0,  167,  168,  169,   97,
-   99,  101,  103,    0,    0,    0,    0,    0,    0,  113,
-    0,    0,    0,    0,    0,    0,    0,  126,    0,    0,
+    0,    0,    0,  142,  142,  142,  142,    0,   89,  170,
+    0,    0,  142,    0,    0,  159,    0,    0,  142,  142,
+    0,    0,    0,    0,    0,    0,    0,    0,  142,  142,
+    0,  142,  142,  142,  142,  142,   79,   79,   79,   79,
+    0,  152,    0,  170,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,  131,  131,  131,  131,
+    0,   79,   79,    0,    0,  131,    0,    0,    0,    0,
+    0,  131,  131,    0,    0,  152,    0,    0,    0,    0,
+    0,  131,  131,    0,  131,  131,  131,  131,  131,    0,
+    0,    0,    0,    0,    0,    0,    0,  154,  155,  156,
+  157,    0,  102,  102,  102,  102,    0,    0,    0,    0,
+    0,  102,    0,  162,  163,  164,  165,  102,  102,  166,
+    0,    0,  167,  168,  169,    0,    0,  102,  102,    0,
+  102,  102,  102,  102,  102,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,   67,   67,
+   67,   67,    0,    0,    0,   87,   87,   87,   87,    0,
+    0,    0,    0,    0,   87,    0,    0,    0,    0,    0,
+    0,    0,    0,   67,   67,    0,    0,    0,    0,    0,
+   87,   87,    0,   87,   87,   87,   87,   89,   89,   89,
+   89,    0,    0,    0,    0,    0,   89,    0,    0,  153,
+    0,    0,    0,    0,    0,  154,  155,  156,  157,    0,
+    0,    0,   89,   89,    0,   89,   89,   89,  158,  160,
+  161,  162,  163,  164,  165,    0,    0,  166,    0,    0,
+  167,  168,  169,  153,    0,    0,    0,    0,    0,  154,
+  155,  156,  157,    0,    0,    0,    0,   67,    0,    0,
+    0,   81,    0,  160,  161,  162,  163,  164,  165,    0,
+    0,  166,    0,    0,  167,  168,  169,   97,   99,  101,
+  103,    0,    0,    0,    0,    0,  111,    0,    0,  120,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,  179,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-  187,    0,    0,  190,    0,  192,    0,  194,    0,  196,
+    0,    0,    0,    0,  179,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,  187,    0,
+    0,  190,    0,  192,    0,  194,    0,  196,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
+    0,    0,    0,    0,    0,    0,    0,    0,  215,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-  215,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
     0,    0,    0,    0,    0,    0,    0,    0,    0,    0,
-    0,    0,    0,    0,    0,    0,    0,  253,    0,    0,
-    0,    0,    0,    0,  260,
+    0,    0,    0,    0,    0,  253,    0,    0,    0,    0,
+    0,    0,  260,
 };
 short yycheck[] = {                                      13,
-   36,   85,   59,  196,   40,  123,   59,   36,   93,   91,
-   59,   41,   93,   91,   44,   40,  185,   41,   36,   41,
-   44,   90,   59,   91,  198,   59,   41,   93,   58,   59,
-   44,  257,   40,   40,   58,   59,   41,  257,   41,   44,
-   91,  123,   40,   57,   59,  123,   59,   61,   41,  118,
-   41,   41,   41,   58,   59,  123,   44,   41,   63,   41,
-  257,   40,  278,   93,    0,    6,   91,    8,   59,   93,
-   59,   40,  123,   91,   41,  125,   96,   40,   98,   59,
-  100,   59,  102,   40,  104,  105,  123,   40,   93,  123,
-   31,   32,   59,   41,  123,  109,  110,   33,  123,   41,
-   36,   37,   38,   41,   40,  123,   42,   43,  282,   45,
-   40,   59,  123,  182,   59,  123,  123,   59,  187,  276,
-  277,   59,   59,   59,   44,  123,  123,   59,   64,  298,
-  295,  296,  146,  147,  148,  149,  150,  151,  152,  257,
-  314,  257,  316,  336,  123,  260,  339,  266,  267,  268,
-   41,  270,  271,   44,   40,   91,  170,  171,  172,  173,
-  174,  175,  176,    0,   40,  358,   41,   58,   59,   40,
-  125,  185,   63,   91,   93,  189,   93,  191,   36,  199,
-   41,  195,  125,   93,  198,   91,  296,  123,   40,  125,
-  126,  205,  206,  207,   59,   41,   33,   93,  212,   36,
-   37,   38,   93,   40,  257,   42,   43,   41,   45,   41,
-  295,  296,   41,   40,  295,  296,  266,  267,  268,    0,
-  270,  271,   59,  123,  238,   41,  240,   64,  257,  295,
-  296,  309,  314,  262,  312,  313,  314,   40,  295,  296,
-  258,   41,  272,  273,  274,  275,  295,  296,  272,  273,
-  274,  275,   33,  337,   91,   36,   37,   38,  294,   40,
-   59,   42,   43,  125,   45,  295,  296,  272,  273,  274,
-  275,  295,  296,  295,  296,  299,  281,  125,   59,  293,
-  285,  286,  125,   64,  298,  125,  123,   41,  125,  126,
-  295,  296,  295,  296,  299,  300,  301,  302,  303,  125,
-  305,   41,  295,  296,  318,  295,  296,  295,  296,   41,
-   91,  295,  296,  295,  296,  295,  296,  295,  296,   41,
-  256,  257,  258,  259,  260,  261,   59,  263,  264,  265,
+   36,  198,  196,   36,   40,   93,   85,   41,   91,   59,
+   44,   36,   93,   41,  123,   41,   44,  185,   41,   41,
+   40,   91,   40,  257,   93,   59,  257,   40,   40,   40,
+   58,   59,   46,   59,   41,   63,   59,   44,   93,  257,
+  123,  276,  277,   57,   41,   26,   41,   61,   91,   41,
+   59,   58,   59,  123,   44,   41,   63,   41,   91,   93,
+   59,   59,   43,   44,    0,   93,   96,   40,   98,   50,
+  100,   91,  102,   90,  104,  105,   41,   59,   40,   59,
+  123,   62,   63,   64,   65,  282,   93,  266,  267,  268,
+  123,  270,  271,   40,   59,  109,  110,   33,  123,   40,
+   36,   37,   38,  123,   40,  123,   42,   43,  125,   45,
+  123,  123,  123,   59,  123,   59,  278,  314,  123,  316,
+  297,  298,   41,   59,  123,   44,   59,   40,   64,  110,
+  298,   41,  146,  147,  148,  149,  150,  151,  152,   59,
+   44,    6,  336,    8,   63,  339,  123,   59,  257,   59,
+   41,  257,  260,   40,   40,   91,  170,  171,  172,  173,
+  174,  175,  176,    0,  358,  182,   31,   32,   59,  199,
+  187,  185,   91,   41,   41,  189,   40,  191,   41,   36,
+  125,  195,   91,   91,  198,  125,   91,  123,   91,  125,
+  126,  205,   59,  207,  208,   41,   33,   93,  212,   36,
+   37,   38,  298,   40,  123,   42,   43,  257,   45,  297,
+  298,   93,   40,   59,  123,   59,  297,  298,   41,    0,
+  123,   41,   59,   41,  238,  258,  240,   64,  297,  298,
+   41,  314,  257,   41,  123,   93,   44,  262,  272,  273,
+  274,  275,  297,  298,  272,  273,  274,  275,   40,   40,
+   58,   59,   33,  281,   91,   36,   37,   38,  337,   40,
+  296,   42,   43,  297,   45,  272,  273,  274,  275,  297,
+  298,   41,  300,  301,  281,  297,  298,   41,   59,  293,
+  287,  288,   59,   64,  298,   93,  123,  125,  125,  126,
+  297,  298,  125,  300,  301,  302,  303,  304,  305,  125,
+  297,  298,  297,  298,  318,  297,  298,  297,  298,  125,
+   91,  297,  298,  297,  298,  297,  298,  297,  298,   41,
+  256,  257,  258,  259,  260,  261,  125,  263,  264,  265,
   266,  267,  268,  269,  270,  271,  272,  273,  274,  275,
-   41,  355,  123,  279,  280,  126,  282,  283,  284,   41,
-  295,  296,  123,  289,  290,  291,  292,  293,  294,   41,
-   59,  297,  298,  295,  296,   41,   41,   59,  304,   44,
-   59,   41,  308,   41,  310,  311,  295,  296,  295,  296,
-   59,  272,  273,  274,  275,  295,  296,   41,   63,   13,
-  281,  147,  318,  355,  285,  286,  287,  288,  195,  295,
-  296,   93,  125,   -1,  295,  296,   -1,   95,  299,  300,
-  301,  302,  303,   -1,  305,  306,   91,   -1,  309,  256,
-  257,  258,  259,  260,  261,   -1,  263,  264,  265,  266,
-  267,  268,  269,  270,  271,  272,  273,  274,  275,   -1,
-   41,   -1,  279,  280,   -1,  282,  283,  284,  123,   91,
-   -1,   -1,  289,  290,  291,  292,  293,  294,   -1,   -1,
-  297,  298,   63,  272,  273,  274,  275,  304,   -1,   -1,
+   41,  355,  123,  279,  280,  126,  282,  283,  284,  285,
+  286,  297,  298,  297,  298,  291,  292,  293,  294,  295,
+  296,   41,  281,  299,  297,  298,   41,   59,  287,  288,
+  289,  290,  308,   41,  310,  311,   41,  297,  298,  123,
+  289,  300,  301,  302,  303,  304,  305,  306,   41,   59,
+  309,   59,   41,  312,  313,  314,   59,  306,   41,   41,
+  309,  297,  298,  312,  313,  314,  309,   59,   41,  312,
+  313,  314,   13,  147,   95,  297,  298,  355,   91,  256,
+  257,  258,  259,  260,  261,   93,  263,  264,  265,  266,
+  267,  268,  269,  270,  271,  272,  273,  274,  275,  297,
+  298,  318,  279,  280,  195,  282,  283,  284,  285,  286,
+  123,   -1,   -1,   -1,  291,  292,  293,  294,  295,  296,
+   -1,   -1,  299,   91,  272,  273,  274,  275,   -1,   -1,
    -1,  308,   -1,  310,  311,  256,  257,  258,  259,  260,
-  261,  123,  263,  264,  265,   -1,  295,  296,  269,   -1,
-   91,  272,  273,  274,  275,   -1,   -1,   -1,  279,  280,
-   -1,  282,  283,  284,   -1,   -1,   -1,   -1,  289,  290,
-  291,  292,  293,  294,   -1,   -1,  297,  298,   -1,   -1,
-   -1,   -1,  123,  304,  190,   91,  192,  308,   33,  310,
+  261,  125,  263,  264,  265,   -1,   -1,   -1,  269,  297,
+  298,  272,  273,  274,  275,  123,   -1,   -1,  279,  280,
+   -1,  282,  283,  284,  285,  286,   -1,   -1,   -1,   91,
+  291,  292,  293,  294,  295,  296,   -1,   -1,  299,   -1,
+   -1,   -1,  125,   -1,   91,   -1,   -1,  308,   33,  310,
   311,   36,   37,   38,   -1,   40,   41,   42,   43,   44,
-   45,   -1,   -1,  266,  267,  268,   -1,  270,  271,   -1,
-   -1,   -1,   -1,   58,   59,   -1,   -1,  123,   63,   64,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-  272,  273,  274,  275,   -1,   -1,   91,   -1,   93,   33,
+   45,  123,   -1,   25,   26,  190,   -1,  192,  272,  273,
+  274,  275,   -1,   58,   59,   37,  123,   -1,   63,   64,
+   -1,   43,   44,   45,   -1,   -1,   -1,   -1,   50,   -1,
+   -1,   -1,   -1,  297,  298,   -1,   -1,   -1,   -1,   -1,
+   62,   63,   64,   65,   -1,   -1,   91,   -1,   93,   33,
    -1,   -1,   36,   37,   38,   -1,   40,   41,   42,   43,
-   44,   45,   -1,  295,  296,   -1,  281,   -1,   -1,   -1,
-  285,  286,  287,  288,   58,   59,   -1,   -1,  123,   63,
-   64,  126,   -1,   -1,  299,  300,  301,  302,  303,   -1,
-  305,  306,   -1,   -1,  309,   -1,   -1,  312,  313,  314,
-   -1,   -1,   -1,  285,  286,  287,  288,   -1,   33,   93,
-   -1,   36,   37,   38,   -1,   40,   -1,   42,   43,   -1,
-   45,  303,   -1,  305,  306,   -1,   -1,  309,  334,  335,
-  312,  313,  314,   -1,   59,  341,   -1,   -1,   -1,   64,
-  281,   -1,  126,   -1,  285,  286,  287,  288,   -1,   -1,
-  356,   -1,   -1,  359,   -1,   -1,   -1,   -1,  299,  300,
-  301,  302,  303,   -1,  305,  306,   91,   -1,  309,   -1,
-   -1,  312,  313,  314,   41,   -1,   -1,   44,   -1,  285,
-  286,  287,  288,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   58,   59,   -1,   -1,   -1,   63,   -1,  123,  305,
-  306,  126,   -1,  309,   -1,   -1,  312,  313,  314,   -1,
-   -1,   -1,  257,  258,  259,  260,  261,   -1,  263,  264,
-  265,   -1,   -1,   -1,  269,   -1,   93,  272,  273,  274,
+   44,   45,   -1,   -1,  272,  273,  274,  275,   -1,   -1,
+   -1,   -1,   -1,   -1,   58,   59,  289,  290,  123,   63,
+   64,  126,  266,  267,  268,   -1,  270,  271,  110,  297,
+  298,   -1,  305,  306,   -1,   -1,  309,   -1,   -1,  312,
+  313,  314,   -1,   -1,   -1,   -1,   -1,   -1,   33,   93,
+   -1,   36,   37,   38,   -1,   40,   -1,   42,   43,  287,
+   45,  289,  290,  266,  267,  268,   -1,  270,  271,   -1,
+   -1,   -1,   -1,   -1,   59,   -1,   -1,  305,  306,   64,
+   -1,  309,  126,   -1,  312,  313,  314,  169,   -1,  334,
+  335,   -1,   -1,   -1,   -1,   -1,  341,   -1,   -1,   41,
+   -1,   -1,   44,   -1,   -1,   -1,   91,  289,  290,   -1,
+   -1,  356,   -1,   -1,  359,  197,   58,   59,   -1,   -1,
+   -1,   63,   -1,   -1,  306,   -1,   -1,  309,   -1,   -1,
+  312,  313,  314,   -1,   -1,   -1,   -1,   -1,  123,  306,
+   -1,  126,  309,   -1,   -1,  312,  313,  314,   -1,   -1,
+   -1,   93,  257,  258,  259,  260,  261,   -1,  263,  264,
+  265,   -1,   -1,   -1,  269,   -1,   -1,  272,  273,  274,
   275,   -1,   -1,   -1,   -1,  280,  281,  282,  283,  284,
   285,  286,  287,  288,  289,  290,  291,  292,  293,  294,
   295,  296,  297,  298,  299,  300,  301,  302,  303,  304,
@@ -718,362 +709,352 @@ short yycheck[] = {                                      13,
   294,  295,  296,  297,  298,  299,  300,  301,  302,  303,
   304,  305,  306,   -1,  308,  309,  310,  311,  312,  313,
   314,  256,  257,  258,  259,  260,  261,   -1,  263,  264,
-  265,   -1,   -1,   41,  269,   -1,   44,  272,  273,  274,
+  265,   -1,   -1,   -1,  269,   -1,   -1,  272,  273,  274,
   275,   -1,   -1,   -1,  279,  280,   -1,  282,  283,  284,
-   58,   59,   -1,   -1,  289,  290,  291,  292,  293,  294,
-   -1,   -1,  297,  298,   -1,   -1,   -1,   -1,   -1,  304,
-   -1,   -1,   -1,  308,   33,  310,  311,   36,   37,   38,
-   -1,   40,   -1,   42,   43,   93,   45,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,  272,  273,  274,  275,   -1,
-   59,   -1,   -1,   -1,  281,   64,   -1,   -1,  285,  286,
-  287,  288,   -1,   -1,   -1,   -1,   -1,   -1,  295,  296,
-   -1,   -1,  299,  300,  301,  302,  303,   -1,  305,  306,
-   33,   -1,   91,   36,   37,   38,   -1,   40,   -1,   42,
-   43,   26,   45,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   49,   50,   -1,   -1,   42,   -1,   -1,
-   -1,   64,   -1,   48,  123,   50,   -1,  126,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   62,   63,   64,
-   65,   91,   -1,   -1,   -1,   -1,   33,   -1,   91,   36,
-   37,   38,   -1,   40,   90,   42,   43,   -1,   45,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,  123,   -1,   -1,   -1,   64,   -1,   -1,
-  123,   -1,  118,  126,   -1,  110,  309,  310,  311,  125,
-   -1,   -1,  315,   -1,  317,   -1,   -1,   41,   -1,   -1,
-   44,   -1,   -1,   -1,   91,   -1,   -1,   -1,   -1,   33,
-   -1,   -1,   36,   37,   38,   59,   40,   -1,   42,   43,
-  343,   45,   -1,   -1,  272,  273,  274,  275,  351,   -1,
-  353,   91,   -1,   -1,   -1,   59,  123,   -1,   -1,  126,
-   64,  364,   -1,   -1,   -1,   -1,  182,  295,  296,   93,
-   -1,  187,   -1,   -1,   -1,   -1,   -1,  256,  257,  258,
-  259,  260,  261,  123,  263,  264,  265,   91,   -1,   -1,
-  269,   -1,   -1,  272,  273,  274,  275,   -1,   -1,   41,
-  279,  280,   44,  282,  283,  284,   -1,   -1,   -1,   -1,
-  289,  290,  291,  292,  293,  294,   58,   59,  297,  298,
-   -1,   63,  126,   -1,   -1,  304,   -1,   -1,   -1,  308,
-   -1,  310,  311,   -1,  257,  258,  259,  260,  261,  262,
-  263,  264,  265,   -1,   -1,   -1,  269,   41,   -1,   -1,
-   44,   93,   -1,   -1,   -1,   41,   -1,  280,   44,  282,
-  283,  284,   -1,   -1,   58,   59,  289,  290,  291,  292,
-  293,  294,   58,   59,  297,  298,  306,   63,   -1,  309,
-   -1,  304,  312,  313,  314,  308,   -1,  310,  311,   -1,
-  257,  258,  259,  260,  261,   -1,  263,  264,  265,   93,
-   -1,   -1,  269,   -1,   -1,   -1,   -1,   93,   -1,   -1,
-   91,   41,   -1,  280,   44,  282,  283,  284,   -1,   -1,
-   -1,   -1,  289,  290,  291,  292,  293,  294,   58,   59,
-  297,  298,   -1,   63,   -1,   -1,   -1,  304,   -1,   -1,
-   -1,  308,  123,  310,  311,   -1,   -1,  287,  272,  273,
-  274,  275,   -1,  257,  258,  259,  260,  261,   -1,  263,
-  264,  265,   -1,   93,   41,  269,  306,   44,   -1,  309,
-   -1,  295,  312,  313,  314,   -1,  280,   -1,  282,  283,
-  284,   58,   59,   -1,   -1,  289,  290,  291,  292,  293,
-  294,   -1,   -1,  297,  298,   -1,   -1,   -1,   -1,   -1,
-  304,   -1,   -1,   -1,  308,   33,  310,  311,   36,   37,
-   38,   -1,   40,   -1,   42,   43,   93,   45,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-  272,  273,  274,  275,   -1,   -1,   64,   -1,   -1,  281,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,  295,  296,   -1,   -1,  299,  300,  301,
-  302,   33,   -1,   91,   36,   37,   38,   -1,   40,   41,
-   42,   43,   -1,   45,   -1,   -1,   -1,   -1,  272,  273,
-  274,  275,   -1,   -1,   -1,   -1,  272,  273,  274,  275,
-   -1,   -1,   64,   -1,   -1,  123,   -1,   -1,  126,   -1,
-   -1,  295,  296,   -1,   -1,   -1,  287,  288,   -1,  295,
-  296,   -1,   -1,  299,   -1,   -1,   -1,   33,   -1,   91,
-   36,   37,   38,   -1,   40,  306,   42,   43,  309,   45,
-   -1,  312,  313,  314,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,  272,  273,  274,  275,   -1,   -1,   64,   -1,
-   -1,  281,   -1,   -1,  126,  285,  286,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,  295,  296,   -1,   -1,  299,
-  300,  301,  302,  303,   -1,   91,   -1,   93,   -1,   -1,
-   33,   -1,   -1,   36,   37,   38,   -1,   40,   41,   42,
-   43,   -1,   45,   -1,   -1,  272,  273,  274,  275,   -1,
+  285,  286,   -1,   -1,   -1,   91,  291,  292,  293,  294,
+  295,  296,   33,   -1,  299,   36,   37,   38,   -1,   40,
+   -1,   42,   43,  308,   45,  310,  311,   43,   -1,   -1,
+  272,  273,  274,  275,   -1,   51,   -1,  123,   59,  281,
+   -1,   -1,   -1,   64,   -1,  287,  288,  289,  290,   -1,
+   -1,   -1,   -1,   -1,   -1,  297,  298,   -1,  300,  301,
+  302,  303,  304,  305,  306,   -1,   -1,  309,   33,   -1,
+   91,   36,   37,   38,   90,   40,   -1,   42,   43,   -1,
+   45,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  309,  310,
+  311,   -1,   -1,   -1,  315,   -1,  317,   -1,   -1,   64,
+   -1,  117,  123,   -1,   -1,  126,   -1,   -1,   -1,  125,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-  126,   64,   -1,   -1,   -1,   -1,   -1,   -1,  295,  296,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  257,
-  258,  259,  260,  261,   -1,  263,  264,  265,   91,   -1,
-   -1,  269,   41,   -1,   -1,   44,   -1,   -1,   -1,   -1,
-   41,   -1,  280,   44,  282,  283,  284,   -1,   -1,   58,
-   59,  289,  290,  291,  292,  293,  294,   58,   59,  297,
-  298,   -1,   63,  126,   -1,   -1,  304,   -1,   -1,   -1,
-  308,   -1,  310,  311,   -1,  257,  258,  259,  260,  261,
-   -1,  263,  264,  265,   93,   -1,   -1,  269,   -1,   -1,
-   -1,   -1,   93,   -1,   -1,   -1,   41,   -1,  280,   44,
-  282,  283,  284,   -1,   -1,   -1,   -1,  289,  290,  291,
-  292,  293,  294,   58,   59,  297,  298,   -1,   63,   -1,
-   -1,   -1,  304,   -1,   -1,   -1,  308,   -1,  310,  311,
-   -1,  257,  258,  259,  260,  261,   -1,  263,  264,  265,
-   -1,   -1,   -1,  269,   -1,   -1,   -1,   -1,   93,   -1,
-   -1,   -1,   41,   -1,  280,   44,  282,  283,  284,   -1,
-   -1,   -1,   -1,  289,  290,  291,  292,  293,  294,   58,
-   59,  297,  298,   -1,   63,   -1,   -1,   -1,  304,   -1,
-   -1,   -1,  308,   -1,  310,  311,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,  257,  258,  259,  260,  261,   -1,
-  263,  264,  265,   -1,   93,   -1,  269,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   63,  280,   -1,  282,
-  283,  284,   -1,   -1,   -1,   -1,  289,  290,  291,  292,
-  293,  294,   -1,   -1,  297,  298,   -1,   -1,   -1,   -1,
-   -1,  304,   -1,   -1,   91,  308,   33,  310,  311,   36,
-   37,   38,   -1,   40,   41,   42,   43,   -1,   45,   -1,
-   -1,   -1,   -1,  272,  273,  274,  275,   -1,   -1,   -1,
-   -1,  272,  273,  274,  275,   -1,  123,   64,   -1,   -1,
-  281,   -1,   -1,   -1,   -1,   -1,  295,  296,   -1,   -1,
-   -1,   -1,   -1,   -1,  295,  296,   -1,   -1,  299,  300,
-  301,   -1,   33,   -1,   91,   36,   37,   38,   -1,   40,
-   -1,   42,   43,   -1,   45,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,  274,
-  275,   -1,   -1,   64,   -1,   -1,  281,   -1,   -1,  126,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-  295,  296,   -1,   -1,  299,  300,   -1,   -1,   33,   -1,
-   91,   36,   37,   38,   -1,   40,   41,   42,   43,   -1,
-   45,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,  272,  273,  274,  275,   -1,   -1,   64,
-   -1,   -1,  281,   -1,   -1,  126,  285,  286,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,  295,  296,   -1,   -1,
-  299,  300,  301,  302,  303,   -1,   91,   -1,   -1,   -1,
-   -1,   33,   -1,   -1,   36,   37,   38,   -1,   40,   41,
-   42,   43,   -1,   45,  281,   -1,   -1,   -1,  285,  286,
-  287,  288,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,  126,   64,  300,  301,  302,  303,   -1,  305,  306,
+   -1,   -1,  343,   -1,   33,   -1,   91,   36,   37,   38,
+  351,   40,  353,   42,   43,   -1,   45,   -1,   -1,   -1,
+   -1,   -1,   -1,  364,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   64,   -1,   -1,  123,   -1,
+   -1,  126,   -1,   -1,   -1,   -1,  182,   -1,   -1,   -1,
+   -1,  187,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   91,   -1,   -1,   -1,   -1,   33,   -1,   -1,
+   36,   37,   38,   -1,   40,   -1,   42,   43,   -1,   45,
+   -1,  287,  288,  289,  290,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,  123,   -1,   -1,  126,   64,  305,
+  306,   -1,   -1,  309,   -1,   -1,  312,  313,  314,   -1,
+   -1,   -1,   -1,   -1,   -1,  256,  257,  258,  259,  260,
+  261,   -1,  263,  264,  265,   91,   -1,   -1,  269,   -1,
+   -1,  272,  273,  274,  275,   -1,   -1,   -1,  279,  280,
+   -1,  282,  283,  284,  285,  286,   -1,   -1,   -1,   -1,
+  291,  292,  293,  294,  295,  296,   -1,  123,  299,   -1,
+  126,   -1,   91,   -1,   -1,   -1,   41,  308,   -1,  310,
+  311,   -1,  257,  258,  259,  260,  261,  262,  263,  264,
+  265,   -1,   -1,   -1,  269,   -1,   -1,   -1,   63,   -1,
+   -1,   -1,   -1,   -1,  123,  280,   -1,  282,  283,  284,
+  285,  286,   -1,   -1,   -1,   -1,  291,  292,  293,  294,
+  295,  296,   -1,   -1,  299,   -1,   91,   -1,   -1,   -1,
+   -1,   -1,   -1,  308,   -1,  310,  311,   -1,  257,  258,
+  259,  260,  261,   -1,  263,  264,  265,   -1,   -1,   -1,
+  269,   58,   -1,   -1,   -1,   -1,   63,   -1,  123,   -1,
+   -1,  280,   -1,  282,  283,  284,  285,  286,   -1,   -1,
+   -1,   -1,  291,  292,  293,  294,  295,  296,   -1,   -1,
+  299,   -1,   -1,   -1,   91,   -1,   -1,   -1,   -1,  308,
+   -1,  310,  311,   -1,   -1,   -1,   -1,   41,   -1,   -1,
+   44,  257,  258,  259,  260,  261,   -1,  263,  264,  265,
+   -1,   -1,   -1,  269,   58,   59,  123,   -1,   -1,   63,
+   -1,   -1,   -1,   -1,  280,   -1,  282,  283,  284,  285,
+  286,   -1,   -1,   -1,   -1,  291,  292,  293,  294,  295,
+  296,   33,   -1,  299,   36,   37,   38,   -1,   40,   93,
+   42,   43,  308,   45,  310,  311,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   59,  287,  288,
+  289,  290,   64,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,  301,  302,  303,  304,  305,  306,   -1,   -1,
+  309,   -1,   -1,  312,  313,  314,   -1,   33,   -1,   91,
+   36,   37,   38,   -1,   40,   41,   42,   43,   -1,   45,
+   -1,   -1,   -1,   -1,   -1,   -1,  281,   -1,   -1,   -1,
+   -1,   -1,  287,  288,  289,  290,   -1,   -1,   64,   -1,
+   -1,   -1,   -1,   -1,  126,  300,  301,  302,  303,  304,
+  305,  306,   -1,   -1,  309,   -1,   -1,  312,  313,  314,
+   -1,   -1,   -1,   33,   -1,   91,   36,   37,   38,   -1,
+   40,   -1,   42,   43,   -1,   45,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,  281,   -1,   -1,   -1,   -1,   -1,
+  287,  288,  289,  290,   64,   -1,   -1,   -1,   -1,   -1,
+  126,   -1,   -1,  300,  301,  302,  303,  304,  305,  306,
    -1,   -1,  309,   -1,   -1,  312,  313,  314,   -1,   -1,
+   -1,   91,   33,   93,   -1,   36,   37,   38,   -1,   40,
+   41,   42,   43,   -1,   45,   -1,   -1,   -1,  272,  273,
+  274,  275,   -1,   -1,   -1,   -1,   -1,  281,   -1,   -1,
+   -1,   -1,   -1,   64,  288,   -1,  126,   -1,   -1,   -1,
+   -1,   -1,   -1,  297,  298,   -1,  300,  301,  302,  303,
+  304,   41,   -1,   -1,   44,  257,  258,  259,  260,  261,
+   91,  263,  264,  265,   -1,   -1,   -1,  269,   58,   59,
+   -1,   -1,   -1,   63,   -1,   -1,   -1,   -1,  280,   -1,
+  282,  283,  284,  285,  286,   -1,   -1,   -1,   -1,  291,
+  292,  293,  294,  295,  296,  126,   -1,  299,   -1,   -1,
+   -1,   -1,   -1,   93,   -1,   -1,  308,   41,  310,  311,
+   44,  257,  258,  259,  260,  261,   -1,  263,  264,  265,
+   -1,   -1,   -1,  269,   58,   59,   -1,   -1,   -1,   63,
+   -1,   -1,   -1,   -1,  280,   -1,  282,  283,  284,  285,
+  286,   -1,   -1,   -1,   -1,  291,  292,  293,  294,  295,
+  296,   -1,   -1,  299,   -1,   -1,   -1,   -1,   -1,   93,
+   -1,   -1,  308,   -1,  310,  311,   -1,  257,  258,  259,
+  260,  261,   -1,  263,  264,  265,   -1,   33,   -1,  269,
+   36,   37,   38,   -1,   40,   41,   42,   43,   -1,   45,
+  280,   -1,  282,  283,  284,  285,  286,   -1,   -1,   -1,
+   -1,  291,  292,  293,  294,  295,  296,   -1,   64,  299,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  308,   -1,
+  310,  311,   -1,   -1,   -1,   -1,  257,  258,  259,  260,
+  261,   -1,  263,  264,  265,   91,   33,   -1,  269,   36,
+   37,   38,   -1,   40,   -1,   42,   43,   -1,   45,  280,
+   -1,  282,  283,  284,  285,  286,   -1,   -1,   -1,   -1,
+  291,  292,  293,  294,  295,  296,   -1,   64,  299,   -1,
+  126,   -1,   -1,   -1,   -1,   -1,   -1,  308,   -1,  310,
+  311,   -1,  272,  273,  274,  275,   -1,   -1,   -1,   -1,
+   -1,  281,   33,   -1,   91,   36,   37,   38,   -1,   40,
+   41,   42,   43,   -1,   45,   -1,   -1,  297,  298,   -1,
+  300,  301,  302,  303,  304,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   64,   -1,   -1,   -1,   -1,   -1,  126,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,
+  274,  275,   -1,   -1,   -1,   -1,   -1,  281,   33,   -1,
+   91,   36,   37,   38,   -1,   40,   41,   42,   43,   -1,
+   45,   -1,   -1,  297,  298,   -1,  300,  301,  302,  303,
+  304,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   64,
+   -1,   -1,   -1,   -1,   -1,  126,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,  257,  258,  259,  260,  261,   91,  263,  264,  265,
+   -1,   33,   -1,  269,   36,   37,   38,   -1,   40,   -1,
+   42,   43,   -1,   45,  280,   -1,  282,  283,  284,  285,
+  286,   -1,   -1,   -1,   -1,  291,  292,  293,  294,  295,
+  296,  126,   64,  299,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,  308,   -1,  310,  311,   -1,   -1,   -1,  256,
   257,  258,  259,  260,  261,   -1,  263,  264,  265,   91,
-   -1,   -1,  269,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,  280,   -1,  282,  283,  284,   41,   -1,
-   -1,   44,  289,  290,  291,  292,  293,  294,   -1,   -1,
-  297,  298,   -1,   -1,  126,   58,   59,  304,   -1,   -1,
-   63,  308,   -1,  310,  311,  256,  257,  258,  259,  260,
-  261,   -1,  263,  264,  265,   -1,   -1,   -1,  269,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  280,
-   93,  282,  283,  284,   -1,   -1,   -1,   -1,  289,  290,
-  291,  292,  293,  294,   -1,   -1,  297,  298,   -1,   -1,
-   -1,   -1,   -1,  304,   -1,   -1,   -1,  308,   41,  310,
+   -1,   -1,  269,   41,   -1,   -1,   44,   -1,   -1,   -1,
+   -1,   -1,   -1,  280,   -1,  282,  283,  284,  285,  286,
+   58,   59,   -1,   -1,  291,  292,  293,  294,  295,  296,
+   -1,   -1,  299,   -1,  126,   -1,   -1,   -1,   -1,   41,
+   -1,  308,   44,  310,  311,   -1,  257,  258,  259,  260,
+  261,   -1,  263,  264,  265,   93,   58,   59,  269,   -1,
+   -1,   63,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  280,
+   -1,  282,  283,  284,  285,  286,   -1,   -1,   -1,   -1,
+  291,  292,  293,  294,  295,  296,   -1,   -1,  299,   91,
+   -1,   93,   -1,   -1,   -1,   -1,   -1,  308,   41,  310,
   311,   44,  257,  258,  259,  260,  261,   -1,  263,  264,
   265,   -1,   -1,   -1,  269,   58,   59,   -1,   -1,   -1,
-   63,   -1,   -1,   -1,   -1,  280,   -1,  282,  283,  284,
-   -1,   -1,   -1,   -1,  289,  290,  291,  292,  293,  294,
-   -1,   -1,  297,  298,   -1,   -1,   -1,   -1,   91,  304,
-   93,   -1,   -1,  308,   -1,  310,  311,   41,   -1,   -1,
-   44,   -1,   -1,   -1,   -1,  257,  258,  259,  260,  261,
-   -1,  263,  264,  265,   58,   59,   -1,  269,   -1,   63,
-  123,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  280,   -1,
-  282,  283,  284,   -1,   -1,   -1,   -1,  289,  290,  291,
-  292,  293,  294,   -1,   -1,  297,  298,   91,   -1,   93,
-   -1,   -1,  304,   -1,   -1,   -1,  308,   33,  310,  311,
-   36,   37,   38,   -1,   40,   -1,   42,   43,   -1,   45,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  123,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   64,  272,
-  273,  274,  275,   -1,   -1,   -1,   -1,   -1,  281,   -1,
-   -1,   -1,  285,  286,   -1,   41,   -1,   -1,   44,   -1,
-   -1,   -1,  295,  296,   -1,   91,  299,  300,  301,  302,
-  303,   -1,   58,   59,   -1,   -1,   -1,   63,   25,   26,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   37,   -1,   -1,   -1,   -1,   42,   43,   -1,   -1,   -1,
-  126,   48,   -1,   50,   -1,   91,   -1,   93,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   62,   63,   64,   65,  272,
-  273,  274,  275,   41,   -1,   91,   44,   -1,  281,   -1,
-   -1,   -1,  285,  286,  287,  288,   -1,  123,   -1,   -1,
-   58,   59,  295,  296,   -1,   63,  299,  300,  301,  302,
-  303,   -1,  305,  306,   -1,   -1,  309,  123,   -1,  312,
-  313,  314,   -1,  110,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   91,   -1,   93,   -1,   -1,  272,  273,
-  274,  275,   -1,   -1,   -1,   -1,   -1,  281,   -1,   -1,
-   -1,  285,  286,  287,  288,   -1,   -1,   -1,   -1,   -1,
-   -1,  295,  296,   -1,   91,  299,  300,  301,  302,  303,
-   -1,  305,  306,   -1,   -1,  309,   -1,   -1,  312,  313,
-  314,   -1,  169,   41,   -1,   -1,   44,   -1,   -1,   -1,
-   -1,  257,  258,  259,  260,  261,  123,  263,  264,  265,
-   58,   59,   -1,  269,   -1,   63,   -1,   -1,   -1,   -1,
-  197,   -1,   -1,   -1,  280,   -1,  282,  283,  284,   -1,
-   -1,   -1,   -1,  289,  290,  291,  292,  293,  294,   -1,
-   -1,  297,  298,   -1,   -1,   93,   -1,   -1,  304,   -1,
-   -1,   -1,  308,   -1,  310,  311,  272,  273,  274,  275,
-   41,   -1,   -1,   44,   -1,  281,   -1,   -1,   -1,  285,
-  286,  287,  288,   -1,   -1,  123,   -1,   58,   59,  295,
-  296,   -1,   63,  299,  300,  301,  302,  303,   -1,  305,
-  306,  287,  288,  309,   -1,   -1,  312,  313,  314,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  305,
-  306,   -1,   93,  309,   -1,   -1,  312,  313,  314,   -1,
-   -1,   -1,   -1,   -1,  272,  273,  274,  275,   41,   -1,
-   -1,   -1,   -1,  281,   -1,   -1,   -1,  285,  286,  287,
-  288,   -1,  123,   -1,   -1,   58,   59,  295,  296,   -1,
-   63,  299,  300,  301,  302,  303,   -1,  305,  306,   -1,
-   -1,  309,   -1,   -1,  312,  313,  314,   -1,  285,  286,
-  287,  288,   -1,   -1,   -1,   -1,   -1,   -1,   91,   -1,
-   93,   -1,   -1,  300,  301,  302,  303,   -1,  305,  306,
-   -1,   41,  309,   -1,   -1,  312,  313,  314,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   58,   59,
-  123,   -1,   -1,   63,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,  272,  273,  274,  275,   -1,   -1,
-   -1,   -1,   -1,  281,   -1,   -1,   -1,  285,  286,  287,
-  288,   91,   -1,   93,   -1,   -1,   -1,  295,  296,   -1,
-   -1,  299,  300,  301,  302,  303,   -1,  305,  306,   41,
-   -1,  309,   44,   -1,  312,  313,  314,   -1,   -1,   -1,
-   -1,   -1,   -1,  123,   -1,   -1,   58,   59,   -1,   -1,
-   -1,   63,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,  272,  273,  274,  275,   -1,   -1,   -1,   -1,   -1,
-  281,   -1,   -1,   -1,  285,  286,  287,  288,   -1,   -1,
-   -1,   93,   -1,   -1,  295,  296,   -1,   -1,  299,  300,
-  301,  302,  303,   -1,  305,  306,   41,   -1,  309,   44,
-   -1,  312,  313,  314,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,  123,   -1,   58,   59,   -1,   -1,   -1,   63,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,
-  273,  274,  275,   -1,   -1,   -1,   -1,   -1,  281,   -1,
-   -1,   -1,  285,  286,  287,  288,   -1,   -1,   93,   -1,
-   -1,   -1,  295,  296,   -1,   -1,  299,  300,  301,  302,
-  303,   -1,  305,  306,   -1,   -1,  309,   -1,   -1,  312,
-  313,  314,   -1,   -1,   -1,   -1,   -1,   -1,  123,   91,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,  272,  273,  274,  275,   41,   -1,   -1,   -1,
-   -1,  281,   -1,   -1,   -1,  285,  286,  287,  288,   -1,
-   -1,  123,   -1,   58,   59,  295,  296,   -1,   63,  299,
-  300,  301,  302,  303,   -1,  305,  306,   -1,   -1,  309,
-   -1,   -1,  312,  313,  314,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   91,   -1,   93,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-  272,  273,  274,  275,   41,   -1,   -1,   44,   -1,  281,
-   -1,   -1,   -1,  285,  286,  287,  288,   -1,  123,   -1,
-   -1,   58,   59,  295,  296,   -1,   63,  299,  300,  301,
-  302,  303,   -1,  305,  306,   -1,   -1,  309,   -1,   -1,
+   63,  123,   -1,   -1,   -1,  280,   -1,  282,  283,  284,
+  285,  286,   -1,   -1,   -1,   -1,  291,  292,  293,  294,
+  295,  296,   -1,   -1,  299,   -1,   -1,   -1,   91,   -1,
+   93,   -1,   -1,  308,   -1,  310,  311,   -1,   -1,   -1,
+   -1,   41,   -1,   -1,   44,  257,  258,  259,  260,  261,
+   -1,  263,  264,  265,   -1,   -1,   -1,  269,   58,   59,
+  123,   -1,   -1,   63,   -1,   -1,   -1,   -1,  280,   -1,
+  282,  283,  284,  285,  286,   -1,   -1,   -1,   -1,  291,
+  292,  293,  294,  295,  296,   -1,   -1,  299,   -1,   41,
+   -1,   91,   44,   93,   -1,   -1,  308,   -1,  310,  311,
+   -1,   -1,   -1,   -1,   -1,   -1,   58,   59,   -1,   -1,
+   -1,   63,   -1,   -1,  272,  273,  274,  275,   -1,   -1,
+   -1,   -1,   -1,  123,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  297,
+  298,   93,  300,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  272,  273,  274,  275,   -1,   41,   -1,   -1,   44,  281,
+   -1,   -1,   -1,   -1,   -1,  287,  288,  289,  290,   -1,
+   -1,  123,   58,   59,   -1,  297,  298,   63,  300,  301,
+  302,  303,  304,  305,  306,   -1,   -1,  309,   -1,   -1,
   312,  313,  314,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   91,   -1,   93,   -1,  272,
+  273,  274,  275,   -1,   41,   -1,   -1,   44,  281,   -1,
+   -1,   -1,   -1,   -1,  287,  288,  289,  290,   -1,   -1,
+   -1,   58,   59,   -1,  297,  298,   63,  300,  301,  302,
+  303,  304,  305,  306,   -1,   -1,  309,   -1,   -1,  312,
+  313,  314,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   93,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,  274,
-  275,   41,   -1,   -1,   44,   -1,  281,   -1,   -1,   -1,
-  285,  286,  287,  288,   -1,   -1,  123,   -1,   58,   59,
-  295,  296,   -1,   63,  299,  300,  301,  302,  303,   -1,
-  305,  306,   -1,   -1,  309,   -1,   -1,  312,  313,  314,
-   -1,   -1,   -1,  285,   41,  287,  288,   44,   -1,   -1,
-   -1,   -1,   -1,   93,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   58,   59,  305,  306,   -1,   63,  309,   -1,   -1,
+   -1,   -1,  272,  273,  274,  275,   -1,   -1,   -1,   -1,
+   -1,  281,   -1,   -1,   -1,   -1,   -1,  287,  288,  289,
+  290,   -1,   -1,   -1,   -1,   -1,  123,  297,  298,   -1,
+  300,  301,  302,  303,  304,  305,  306,   -1,   -1,  309,
+   -1,   -1,  312,  313,  314,   -1,   -1,   -1,   -1,   -1,
+  272,  273,  274,  275,   -1,   41,   -1,   -1,   -1,  281,
+   -1,   -1,   -1,   -1,   -1,  287,  288,  289,  290,   -1,
+   -1,   -1,   58,   59,   -1,  297,  298,   63,  300,  301,
+  302,  303,  304,  305,  306,   -1,   -1,  309,   -1,   -1,
   312,  313,  314,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   91,   -1,   93,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,  274,  275,
+   -1,   -1,   -1,   -1,   -1,  281,   -1,   -1,   -1,   -1,
+   -1,  287,  288,  289,  290,   -1,   -1,  123,   -1,   -1,
+   91,  297,  298,   -1,  300,  301,  302,  303,  304,  305,
+  306,   -1,   -1,  309,   -1,   -1,  312,  313,  314,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   93,  272,  273,  274,
-  275,   41,   -1,   -1,   44,   -1,  281,   -1,   -1,   -1,
-  285,  286,  287,  288,   -1,   -1,   -1,   -1,   58,   59,
-  295,  296,   -1,   63,  299,  300,  301,  302,  303,   -1,
-  305,  306,   -1,   -1,  309,   -1,   -1,  312,  313,  314,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   93,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,  272,  273,  274,  275,   41,
-   -1,   -1,   44,   -1,  281,   -1,   -1,   -1,  285,  286,
-  287,  288,   -1,   -1,   -1,   -1,   58,   59,  295,  296,
-   -1,   63,  299,  300,  301,  302,  303,   -1,  305,  306,
+   -1,   -1,  123,   -1,   -1,  272,  273,  274,  275,   -1,
+   41,   -1,   -1,   -1,  281,   -1,   -1,   -1,   -1,   -1,
+  287,  288,  289,  290,   -1,   -1,   -1,   58,   59,   -1,
+  297,  298,   63,  300,  301,  302,  303,  304,  305,  306,
    -1,   -1,  309,   -1,   -1,  312,  313,  314,   -1,   -1,
+   -1,   -1,   -1,   41,   -1,   -1,   44,   -1,   -1,   -1,
+   91,   -1,   93,   41,   -1,   -1,   44,   -1,   -1,   -1,
+   58,   59,   -1,   -1,   -1,   63,   -1,   -1,   -1,   -1,
+   58,   59,   -1,   -1,   -1,   63,   -1,   -1,   -1,   -1,
+   -1,   -1,  123,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   93,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   93,  272,  273,  274,  275,
+   -1,   41,   -1,   -1,   44,  281,   -1,   -1,   -1,   -1,
+   -1,  287,  288,  289,  290,  123,   -1,   -1,   58,   59,
+   -1,  297,  298,   63,  300,  301,  302,  303,  304,  305,
+  306,   -1,   -1,  309,   -1,   -1,  312,  313,  314,   -1,
+   -1,   -1,   -1,   -1,   41,   -1,  287,  288,  289,  290,
+   -1,   -1,   -1,   93,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   58,   59,  304,  305,  306,   63,   -1,  309,   -1,
+   -1,  312,  313,  314,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   -1,  123,   -1,   -1,   -1,   -1,   41,   -1,
+   -1,   44,   -1,   -1,   91,   -1,   93,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   58,   59,   -1,   -1,   -1,
+   63,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,  272,  273,  274,  275,   -1,  123,   -1,   -1,   -1,
+  281,   -1,   -1,   -1,   -1,   -1,  287,  288,  289,  290,
+   93,   -1,   -1,   -1,   -1,   -1,  297,  298,   -1,  300,
+  301,  302,  303,  304,  305,  306,   -1,   -1,  309,   -1,
+   -1,  312,  313,  314,  272,  273,  274,  275,   -1,   41,
+  123,   -1,   44,  281,  272,  273,  274,  275,   -1,  287,
+  288,  289,  290,   -1,   -1,   -1,   58,   59,   -1,  297,
+  298,   63,  300,  301,  302,  303,  304,  305,  306,  297,
+  298,  309,  300,   -1,  312,  313,  314,   -1,   -1,   -1,
    -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
    -1,   93,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,  272,  273,  274,  275,   -1,   -1,   -1,   -1,
-   -1,  281,   -1,   -1,   -1,  285,  286,  287,  288,   -1,
-   -1,   -1,   -1,   -1,   -1,  295,  296,   -1,   -1,  299,
-  300,  301,  302,  303,   -1,  305,  306,   -1,   -1,  309,
-   -1,   -1,  312,  313,  314,  272,  273,  274,  275,   41,
-   -1,   -1,   44,   -1,  281,   -1,   -1,   -1,  285,  286,
-  287,  288,   -1,   -1,   -1,   -1,   58,   59,  295,  296,
-   -1,   63,  299,  300,  301,  302,  303,   -1,  305,  306,
-   -1,   -1,  309,   -1,   -1,  312,  313,  314,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   93,  272,  273,  274,  275,   -1,   -1,   -1,   -1,
-   -1,  281,   -1,   -1,   -1,  285,  286,  287,  288,   -1,
-   -1,   -1,   -1,   -1,   -1,  295,  296,   -1,   -1,  299,
-  300,  301,  302,  303,   -1,  305,  306,   41,   -1,  309,
-   44,   -1,  312,  313,  314,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   58,   59,   -1,   -1,   -1,   63,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-  272,  273,  274,  275,   -1,   -1,   -1,   -1,   -1,  281,
-   -1,   -1,   -1,  285,  286,  287,  288,   -1,   -1,   93,
-   -1,   -1,   -1,  295,  296,   -1,   -1,  299,  300,  301,
-  302,  303,   -1,  305,  306,   30,   -1,  309,   -1,   -1,
-  312,  313,  314,   38,   -1,   -1,   -1,   -1,   43,   -1,
-   41,   -1,   -1,   44,   -1,   -1,   51,   52,   53,   54,
-   55,   56,   -1,   -1,   59,   60,   -1,   58,   59,   -1,
-   -1,   66,   63,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   92,   41,   -1,
-   -1,   44,   93,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-  272,  273,  274,  275,   -1,   58,   59,   -1,   -1,  281,
-   63,   -1,   -1,  285,  286,  287,  288,   -1,   -1,   -1,
-   -1,   -1,   -1,  295,  296,   -1,   -1,  299,  300,  301,
-  302,  303,   -1,  305,  306,   -1,   -1,  309,   -1,   -1,
-   93,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  153,  154,
+   -1,   -1,  272,  273,  274,  275,   -1,   41,   -1,   -1,
+   44,  281,   -1,   -1,   -1,   -1,   -1,  287,  288,  289,
+  290,   -1,   -1,   -1,   58,   59,   -1,  297,  298,   63,
+  300,  301,  302,  303,  304,  305,  306,   -1,   -1,  309,
+   -1,   -1,  312,  313,  314,  272,  273,  274,  275,   -1,
+   41,   -1,   -1,   44,  281,   -1,   -1,   -1,   -1,   93,
+  287,  288,  289,  290,   -1,   -1,   -1,   58,   59,   -1,
+  297,  298,   63,  300,  301,  302,  303,  304,  305,  306,
+   -1,   -1,  309,   -1,   -1,  312,  313,  314,   -1,  272,
+  273,  274,  275,   -1,   41,   -1,   -1,   44,  281,   -1,
+   -1,   -1,   93,   -1,  287,  288,  289,  290,   -1,   -1,
+   -1,   58,   59,   -1,  297,  298,   63,  300,  301,  302,
+  303,  304,  305,  306,   -1,   -1,  309,   -1,   -1,  312,
+  313,  314,   -1,   -1,   -1,   -1,   -1,   41,   -1,   -1,
+   44,   -1,   -1,   -1,   -1,   -1,   93,   -1,   -1,   -1,
+   -1,   -1,   -1,   -1,   58,   59,   -1,   41,   -1,   63,
+   44,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+  272,  273,  274,  275,   58,   59,   -1,   -1,   -1,  281,
+   -1,   -1,   -1,   -1,   -1,  287,  288,  289,  290,   93,
+   -1,   -1,   -1,   -1,   -1,  297,  298,   -1,  300,  301,
+  302,  303,  304,  305,  306,   41,   -1,  309,   44,   93,
+  312,  313,  314,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
+   -1,   -1,   58,   59,   -1,   -1,   -1,   63,   -1,   -1,
+   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,  273,
+  274,  275,   -1,   41,   -1,   -1,   44,  281,   -1,   -1,
+   -1,   -1,   -1,  287,  288,  289,  290,   93,   -1,   -1,
+   58,   59,   -1,  297,  298,   63,  300,  301,  302,  303,
+  304,  305,  306,   -1,   -1,  309,   -1,   -1,  312,  313,
+  314,  272,  273,  274,  275,   -1,   -1,   -1,   -1,   -1,
+  281,   -1,   -1,   -1,   -1,   93,  287,  288,  289,  290,
+   -1,   -1,   -1,   -1,   -1,   -1,  297,  298,   -1,  300,
+  301,  302,  303,  304,  305,  306,   -1,   -1,  309,   -1,
+   -1,  312,  313,  314,   -1,  272,  273,  274,  275,   -1,
+   41,   -1,   -1,   44,  281,   -1,   -1,   -1,   -1,   -1,
+  287,  288,  289,  290,   -1,   -1,   -1,   58,   59,   -1,
+  297,  298,   63,  300,  301,  302,  303,  304,  305,  306,
+   -1,   -1,  309,   -1,   -1,  312,  313,  314,  272,  273,
+  274,  275,   -1,   -1,   -1,   -1,   -1,  281,   -1,   -1,
+   -1,   -1,   93,  287,  288,  289,  290,   -1,  272,  273,
+  274,  275,   -1,  297,  298,   30,  300,  301,  302,  303,
+  304,  305,  306,   38,   -1,  309,   -1,   42,   -1,   -1,
+   45,   -1,   -1,  297,  298,   -1,   -1,   52,   53,   54,
+   55,   56,   -1,   -1,   59,   60,   -1,   -1,   91,   -1,
+   -1,   66,   -1,   -1,   -1,   -1,  272,  273,  274,  275,
+   -1,   41,   -1,   -1,   44,  281,   -1,   -1,   -1,   -1,
+   -1,  287,  288,  289,  290,   -1,   -1,   92,   58,   59,
+  123,  297,  298,   63,  300,  301,  302,  303,  304,  305,
+  306,   -1,   -1,   -1,  272,  273,  274,  275,   -1,   -1,
+   -1,   -1,   -1,  281,   -1,   -1,   -1,   -1,   -1,  287,
+  288,  289,  290,   93,   41,   -1,   -1,   44,   -1,  297,
+  298,   -1,  300,  301,  302,  303,  304,  305,  306,   -1,
+   -1,   58,   59,   -1,   -1,   -1,   63,   -1,  153,  154,
   155,  156,  157,  158,  159,  160,  161,  162,  163,  164,
   165,  166,   41,   -1,   -1,   44,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,  178,   -1,   -1,   -1,   -1,   -1,   58,
-   59,   -1,   -1,   -1,   63,   -1,   -1,   -1,  272,  273,
-  274,  275,   -1,   -1,   -1,   -1,   -1,  281,   -1,   -1,
-   -1,  285,  286,  287,  288,   -1,   41,   -1,   -1,   44,
-   -1,  295,  296,   -1,   93,  299,  300,  301,  302,  303,
-   -1,  305,  306,   58,   59,   -1,   -1,   -1,   63,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   41,   -1,   -1,   44,   -1,   -1,
-   -1,   -1,   -1,  258,   -1,   -1,   -1,   -1,   93,   -1,
-   -1,   58,   59,   -1,   -1,   -1,   63,   -1,   -1,   -1,
+   -1,   -1,   -1,  178,   -1,   -1,   93,   -1,   -1,   58,
+   59,   -1,   -1,   -1,   63,   -1,   -1,   -1,   -1,   -1,
    -1,  272,  273,  274,  275,   -1,   -1,   -1,   -1,   -1,
-  281,   -1,   -1,   -1,  285,  286,  287,  288,   -1,   41,
-  295,   -1,   44,   -1,  295,  296,   93,   -1,  299,  300,
-  301,  302,  303,   -1,  305,  306,   58,   59,   -1,   -1,
-   -1,   63,   -1,   -1,   -1,   -1,   -1,   -1,   -1,  272,
-  273,  274,  275,   -1,   -1,   -1,   -1,   -1,  281,   -1,
-   -1,   -1,  285,  286,  287,  288,   -1,   41,   -1,   -1,
-   44,   93,  295,  296,   91,   -1,  299,  300,  301,  302,
-  303,   -1,  305,  306,   58,   59,   -1,   -1,   -1,   63,
-   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,   -1,
-   -1,   -1,   -1,   -1,   -1,   -1,  123,   -1,   -1,   -1,
-   -1,   41,   -1,   -1,   44,   -1,   -1,   -1,   -1,   93,
-   -1,   -1,   -1,  272,  273,  274,  275,   41,   58,   59,
-   44,   -1,  281,   63,   -1,   -1,  285,  286,  287,  288,
-   -1,   -1,   -1,   -1,   58,   59,  295,  296,   -1,   63,
-  299,  300,  301,  302,  303,   -1,  305,  306,   -1,   -1,
-   -1,   -1,   -1,   93,   -1,   -1,   -1,  272,  273,  274,
-  275,   41,   -1,   -1,   44,   -1,  281,   -1,   -1,   93,
-  285,  286,  287,  288,   -1,   -1,   -1,   -1,   58,   59,
-  295,  296,   -1,   63,  299,  300,  301,  302,  303,   -1,
-  305,  306,   -1,   -1,   -1,  272,  273,  274,  275,   -1,
-   -1,   58,   -1,   -1,  281,   -1,   63,   -1,  285,  286,
-  287,  288,   -1,   93,   -1,   -1,   -1,   -1,  295,  296,
-   -1,   -1,  299,  300,  301,  302,  303,   -1,  305,  306,
-   -1,   -1,   -1,   -1,   91,   -1,   -1,   -1,   -1,   -1,
-  272,  273,  274,  275,   -1,   -1,   63,   -1,   -1,  281,
-   -1,   -1,   -1,  285,  286,  287,  288,   -1,  285,  286,