#!/usr/bin/perl #line 2 "/usr/bin/par.pl" eval 'exec /usr/bin/perl -S $0 ${1+"$@"}' if 0; # not running under some shell # $File: //member/autrijus/PAR/script/par.pl $ $Author: autrijus $ # $Revision: #97 $ $Change: 9765 $ $DateTime: 2004/01/25 16:09:58 $ vim: expandtab shiftwidth=4 package __par_pl; # --- This script must not use any modules at compile time --- # use strict; #line 155 my ($par_temp, $progname, @tmpfile); END { if ($ENV{PAR_CLEAN}) { unlink @tmpfile; rmdir $par_temp; $par_temp =~ s{[^\\/]*[\\/]?$}{}; rmdir $par_temp; } } BEGIN { Internals::PAR::BOOT() if defined &Internals::PAR::BOOT; eval { if ($ENV{PAR_ARGV_0}) { @ARGV = map $ENV{"PAR_ARGV_$_"}, (1 .. $ENV{PAR_ARGC} - 1); $0 = $ENV{PAR_ARGV_0}; } my $quiet = !$ENV{PAR_DEBUG}; # fix $progname if invoked from PATH my %Config = ( path_sep => ($^O =~ /^MSWin/ ? ';' : ':'), _exe => ($^O =~ /^(?:MSWin|OS2|cygwin)/ ? '.exe' : ''), _delim => ($^O =~ /^MSWin|OS2/ ? '\\' : '/'), ); _par_init_env(); _set_progname(); _set_par_temp(); # Append ".exe" to $0 if it was missing $0 .= $Config{_exe} if $Config{_exe} and $progname =~ /\Q$Config{_exe}\E$/ and $0 !~ /\Q$Config{_exe}\E$/; # Magic string checking and extracting bundled modules {{{ my ($start_pos, $data_pos); { local $SIG{__WARN__} = sub {}; # Check file type, get start of data section {{{ open _FH, $progname or last; binmode(_FH); my $buf; seek _FH, -8, 2; read _FH, $buf, 8; last unless $buf eq "\nPAR.pm\n"; seek _FH, -12, 2; read _FH, $buf, 4; seek _FH, -12 - unpack("N", $buf), 2; read _FH, $buf, 4; $data_pos = (tell _FH) - 4; # }}} # Extracting each file into memory {{{ my %require_list; while ($buf eq "FILE") { read _FH, $buf, 4; read _FH, $buf, unpack("N", $buf); my $fullname = $buf; outs(qq(Unpacking file "$fullname"...)); my $crc = ( $fullname =~ s|^([a-f\d]{8})/|| ) ? $1 : undef; my ($basename, $ext) = ($buf =~ m|(?:.*/)?(.*)(\..*)|); read _FH, $buf, 4; read _FH, $buf, unpack("N", $buf); if (defined($ext) and $ext !~ /\.(?:pm|ix|al)$/i) { my ($out, $filename) = _tempfile($ext, $crc); if ($out) { binmode($out); print $out $buf; close $out; chmod 0755, $filename; } $PAR::Heavy::FullCache{$fullname} = $filename; $PAR::Heavy::FullCache{$filename} = $fullname; } elsif ( $fullname =~ m|^/?shlib/| and defined $ENV{PAR_TEMP} ) { # should be moved to _tempfile() my $filename = "$ENV{PAR_TEMP}/$basename$ext"; outs("SHLIB: $filename\n"); open my $out, '>', $filename or die $!; binmode($out); print $out $buf; close $out; } else { $require_list{$fullname} = $PAR::Heavy::ModuleCache{$fullname} = { buf => $buf, crc => $crc, name => $fullname, }; } read _FH, $buf, 4; } # }}} local @INC = (sub { my ($self, $module) = @_; return if ref $module or !$module; my $filename = delete $require_list{$module} || do { my $key; foreach (keys %require_list) { next unless /\Q$module\E$/; $key = $_; last; } delete $require_list{$key} if defined($key); } or return; $INC{$module} = "/loader/$filename/$module"; if ($ENV{PAR_CLEAN} and defined(&IO::File::new)) { my $fh = IO::File->new_tmpfile or die $!; binmode($fh); print $fh $filename->{buf}; seek($fh, 0, 0); return $fh; } else { my ($out, $name) = _tempfile('.pm', $filename->{crc}); if ($out) { binmode($out); print $out $filename->{buf}; close $out; } open my $fh, $name or die $!; binmode($fh); return $fh; } die "Bootstrapping failed: cannot find $module!\n"; }, @INC); # }}} # Now load all bundled files {{{ # initialize shared object processing require XSLoader; require PAR::Heavy; require Carp::Heavy; require Exporter::Heavy; PAR::Heavy::_init_dynaloader(); # now let's try getting helper modules from within require IO::File; # load rest of the group in while (my $filename = (sort keys %require_list)[0]) { require $filename unless $INC{$filename} or $filename =~ /BSDPAN/; delete $require_list{$filename}; } # }}} last unless $buf eq "PK\003\004"; $start_pos = (tell _FH) - 4; } # }}} # Argument processing {{{ my @par_args; my ($out, $bundle); $quiet = 0 unless $ENV{PAR_DEBUG}; # Don't swallow arguments for compiled executables without --par-options if (!$start_pos or ($ARGV[0] eq '--par-options' && shift)) { my %dist_cmd = qw( p blib_to_par i install_par u uninstall_par s sign_par v verify_par ); while (@ARGV) { $ARGV[0] =~ /^-([AIMOBbqpiusv])(.*)/ or last; if ($1 eq 'I') { unshift @INC, $2; } elsif ($1 eq 'M') { eval "use $2"; } elsif ($1 eq 'A') { unshift @par_args, $2; } elsif ($1 eq 'O') { $out = $2; } elsif ($1 eq 'b') { $bundle = 'site'; } elsif ($1 eq 'B') { $bundle = 'all'; } elsif ($1 eq 'q') { $quiet = 1; } shift(@ARGV); if (my $cmd = $dist_cmd{$1}) { delete $ENV{'PAR_TEMP'}; init_inc(); require PAR::Dist; &{"PAR::Dist::$cmd"}() unless @ARGV; &{"PAR::Dist::$cmd"}($_) for @ARGV; exit; } } } # XXX -- add --par-debug support! # }}} # Output mode (-O) handling {{{ if ($out) { require IO::File; require Archive::Zip; my $par = shift(@ARGV); my $zip = Archive::Zip->new($par) if defined($par); my %env = do { if ($zip and my $meta = $zip->contents('META.yml')) { $meta =~ s/.*^par:$//ms; $meta =~ s/^\S.*//ms; $meta =~ /^ ([^:]+): (.+)$/mg; } }; # Open input and output files {{{ local $/ = \4; if (defined $par) { open PAR, '<', $par or die "$!: $par"; binmode(PAR); die "$par is not a PAR file" unless eq "PK\003\004"; } my $fh = IO::File->new( $out, IO::File::O_CREAT() | IO::File::O_WRONLY() | IO::File::O_TRUNC(), 0777, ) or die $!; binmode($fh); $/ = (defined $data_pos) ? \$data_pos : undef; seek _FH, 0, 0; my $loader = scalar <_FH>; if (!$ENV{PAR_VERBATIM} and $loader =~ /^(?:#!|\@rem)/) { require PAR::Filter::PodStrip; PAR::Filter::PodStrip->new->apply(\$loader, $0) } foreach my $key (sort keys %env) { my $val = $env{$key} or next; $val = eval $val if $val =~ /^['"]/; my $magic = "__ENV_PAR_" . uc($key) . "__"; my $set = "PAR_" . uc($key) . "=$val"; $loader =~ s{$magic( +)}{ $magic . $set . (' ' x (length($1) - length($set))) }eg; } $fh->print($loader); $/ = undef; # }}} # Write bundled modules {{{ if ($bundle) { require PAR::Heavy; PAR::Heavy::_init_dynaloader(); init_inc(); require_modules(); my @inc = sort { length($b) <=> length($a) } grep { !/BSDPAN/ } grep { ($bundle ne 'site') or ($_ ne $Config::Config{archlibexp} and $_ ne $Config::Config{privlibexp}); } @INC; if ($Config{_delim} eq '\\') { s{\\}{/}g for @inc } my %files; /^_<(.+)$/ and $files{$1}++ for keys %::; $files{$_}++ for values %INC; my $lib_ext = $Config::Config{lib_ext}; my %written; foreach (sort keys %files) { my ($name, $file); foreach my $dir (@inc) { if ($name = $PAR::Heavy::FullCache{$_}) { $file = $_; last; } elsif (/^(\Q$dir\E\/(.*[^Cc]))\Z/i) { ($file, $name) = ($1, $2); last; } elsif (m!^/loader/[^/]+/(.*[^Cc])\Z!) { if (my $ref = $PAR::Heavy::ModuleCache{$1}) { ($file, $name) = ($ref, $1); last; } elsif (-f "$dir/$1") { ($file, $name) = ("$dir/$1", $1); last; } } } next unless defined $name and not $written{$name}++; next if !ref($file) and $file =~ /\.\Q$lib_ext\E$/; outs( join "", qq(Packing "), ref $file ? $file->{name} : $file, qq("...) ); my $content; if (ref($file)) { $content = $file->{buf}; } else { open FILE, "$file" or die "Can't open $file: $!"; binmode(FILE); $content = ; close FILE; PAR::Filter::PodStrip->new->apply(\$content, $file) if !$ENV{PAR_VERBATIM} and lc($name) =~ /\.(?:pm|ix|al)$/i; } outs(qq(Written as "$name")); $fh->print("FILE"); $fh->print(pack('N', length($name) + 9)); $fh->print(sprintf( "%08x/%s", Archive::Zip::computeCRC32($content), $name )); $fh->print(pack('N', length($content))); $fh->print($content); } } # }}} # Now write out the PAR and magic strings {{{ $zip->writeToFileHandle($fh) if $zip; $fh->print(pack('N', $fh->tell - length($loader))); $fh->print("\nPAR.pm\n"); $fh->close; chmod 0755, $out; # }}} exit; } # }}} # Prepare $0 into PAR file cache {{{ { last unless defined $start_pos; # Now load the PAR file and put it into PAR::LibCache {{{ require PAR; PAR::Heavy::_init_dynaloader(); require Archive::Zip; my $zip = Archive::Zip->new; my $fh = IO::File->new; $fh->fdopen(fileno(_FH), 'r') or die "$!: $@"; $zip->readFromFileHandle($fh) == Archive::Zip::AZ_OK() or die "$!: $@"; push @PAR::LibCache, $zip; $PAR::LibCache{$0} = $zip; $quiet = !$ENV{PAR_DEBUG}; outs(qq(\$ENV{PAR_TEMP} = "$ENV{PAR_TEMP}")); foreach my $member ( $zip->members ) { next if $member->isDirectory or !$ENV{PAR_TEMP}; my $member_name = $member->fileName; next unless $member_name =~ m{ ^ /?shlib/ (?:$Config::Config{version}/)? (?:$Config::Config{archname}/)? ([^/]+) $ }x; my $extract_name = $1; my $dest_name = File::Spec->catfile($ENV{PAR_TEMP}, $extract_name); $member->extractToFileNamed($dest_name); outs(qq(Extracting "$member_name" to "$dest_name")); } # }}} } # }}} # If there's no main.pl to run, show usage {{{ unless ($PAR::LibCache{$0}) { die << "." unless @ARGV; Usage: $0 [ -Alib.par ] [ -Idir ] [ -Mmodule ] [ src.par ] [ program.pl ] $0 [ -B|-b ] [-Ooutfile] src.par . $0 = shift(@ARGV); } # }}} sub require_modules { require lib; require DynaLoader; require integer; require strict; require warnings; require vars; require Carp; require Carp::Heavy; require Exporter::Heavy; require Exporter; require Fcntl; require Cwd; require File::Temp; require File::Spec; require XSLoader; require Config; require IO::File; require Compress::Zlib; require Archive::Zip; require PAR; require PAR::Heavy; require PAR::Dist; require PAR::Filter::PodStrip; } # The C version of this code appears in myldr/mktmpdir.c sub _set_par_temp { if ($ENV{PAR_TEMP} and $ENV{PAR_TEMP} =~ /(.+)/) { $par_temp = $1; return; } foreach my $path ( (map $ENV{$_}, qw( TMPDIR TEMP TMP )), qw( "C:\\TEMP /tmp . ) ) { next unless $path and -d $path and -w $path; my $username = defined(&Win32::LoginName) ? &Win32::LoginName() : $ENV{USERNAME} || $ENV{USER} || 'SYSTEM'; my $stmpdir = "$path$Config{_delim}par-$username"; mkdir $stmpdir, 0755; if (!$ENV{PAR_CLEAN} and my $mtime = (stat($progname))[9]) { my $ctx = eval { require Digest::SHA1; Digest::SHA1->new } || eval { require Digest::MD5; Digest::MD5->new }; if ($ctx and open(my $fh, "<$progname")) { binmode($fh); $ctx->addfile($fh); close($fh); } $stmpdir .= "$Config{_delim}cache-" . ( $ctx ? $ctx->hexdigest : $mtime ); } else { $ENV{PAR_CLEAN} = 1; $stmpdir .= "$Config{_delim}temp-$$"; } $ENV{PAR_TEMP} = $stmpdir; mkdir $stmpdir, 0755; last; } $par_temp = $1 if $ENV{PAR_TEMP} and $ENV{PAR_TEMP} =~ /(.+)/; } sub _tempfile { my ($ext, $crc) = @_; my ($fh, $filename); $filename = "$par_temp/$crc$ext"; if ($ENV{PAR_CLEAN}) { unlink $filename if -e $filename; push @tmpfile, $filename; } else { return (undef, $filename) if (-r $filename); } open $fh, '>', $filename or die $!; binmode($fh); return($fh, $filename); } sub _set_progname { if ($ENV{PAR_PROGNAME} and $ENV{PAR_PROGNAME} =~ /(.+)/) { $progname = $1; } return if -s ($progname ||= $0); if (-s "$progname$Config{_exe}") { $ENV{PAR_PROGNAME} = $progname = "$progname$Config{_exe}"; $0 .= $Config{_exe}; return $progname; } foreach my $dir (split /\Q$Config{path_sep}\E/, $ENV{PATH}) { $dir =~ s/\Q$Config{_delim}\E$//; (($progname = "$dir$Config{_delim}$progname$Config{_exe}"), last) if -s "$dir$Config{_delim}$progname$Config{_exe}"; (($progname = "$dir$Config{_delim}$progname"), last) if -s "$dir$Config{_delim}$progname"; } $ENV{PAR_PROGNAME} = $progname; } sub _par_init_env { return if $ENV{PAR_INITIALIZED}++; my $par_clean = "__ENV_PAR_CLEAN__ "; if ($ENV{PAR_TEMP}) { delete $ENV{PAR_CLEAN}; } elsif (!$ENV{PAR_CLEAN}) { my $value = substr($par_clean, 12 + length("CLEAN")); $ENV{PAR_CLEAN} = $1 if $value =~ /^PAR_CLEAN=(\S+)/; } } sub outs { warn("@_\n") unless $quiet } sub init_inc { require Config; push @INC, grep defined, map $Config::Config{$_}, qw( archlibexp privlibexp sitearchexp sitelibexp vendorarchexp vendorlibexp ); } ######################################################################## # The main package for script execution package main; require PAR; unshift @INC, \&PAR::find_par; PAR->import(@par_args); die qq(Can't open perl script "$0": No such file or directory\n) unless -e $0; do $0; die $@ if $@; }; $::__ERROR = $@ if $@; } die $::__ERROR if $::__ERROR; 1; #line 776 __END__ FILEd1a42b7f/AutoLoader.pm#line 1 "/usr/lib/perl5/5.8.0/AutoLoader.pm" package AutoLoader; use 5.006_001; our(@EXPORT, @EXPORT_OK, $VERSION); my $is_dosish; my $is_epoc; my $is_vms; my $is_macos; BEGIN { require Exporter; @EXPORT = @EXPORT = (); @EXPORT_OK = @EXPORT_OK = qw(AUTOLOAD); $is_dosish = $^O eq 'dos' || $^O eq 'os2' || $^O eq 'MSWin32' || $^O eq 'NetWare'; $is_epoc = $^O eq 'epoc'; $is_vms = $^O eq 'VMS'; $is_macos = $^O eq 'MacOS'; $VERSION = '5.59'; } AUTOLOAD { my $sub = $AUTOLOAD; my $filename; # Braces used to preserve $1 et al. { # Try to find the autoloaded file from the package-qualified # name of the sub. e.g., if the sub needed is # Getopt::Long::GetOptions(), then $INC{Getopt/Long.pm} is # something like '/usr/lib/perl5/Getopt/Long.pm', and the # autoload file is '/usr/lib/perl5/auto/Getopt/Long/GetOptions.al'. # # However, if @INC is a relative path, this might not work. If, # for example, @INC = ('lib'), then $INC{Getopt/Long.pm} is # 'lib/Getopt/Long.pm', and we want to require # 'auto/Getopt/Long/GetOptions.al' (without the leading 'lib'). # In this case, we simple prepend the 'auto/' and let the # C take care of the searching for us. my ($pkg,$func) = ($sub =~ /(.*)::([^:]+)$/); $pkg =~ s#::#/#g; if (defined($filename = $INC{"$pkg.pm"})) { if ($is_macos) { $pkg =~ tr#/#:#; $filename =~ s#^(.*)$pkg\.pm\z#$1auto:$pkg:$func.al#s; } else { $filename =~ s#^(.*)$pkg\.pm\z#$1auto/$pkg/$func.al#s; } # if the file exists, then make sure that it is a # a fully anchored path (i.e either '/usr/lib/auto/foo/bar.al', # or './lib/auto/foo/bar.al'. This avoids C searching # (and failing) to find the 'lib/auto/foo/bar.al' because it # looked for 'lib/lib/auto/foo/bar.al', given @INC = ('lib'). if (-r $filename) { unless ($filename =~ m|^/|s) { if ($is_dosish) { unless ($filename =~ m{^([a-z]:)?[\\/]}is) { if ($^O ne 'NetWare') { $filename = "./$filename"; } else { $filename = "$filename"; } } } elsif ($is_epoc) { unless ($filename =~ m{^([a-z?]:)?[\\/]}is) { $filename = "./$filename"; } } elsif ($is_vms) { # XXX todo by VMSmiths $filename = "./$filename"; } elsif (!$is_macos) { $filename = "./$filename"; } } } else { $filename = undef; } } unless (defined $filename) { # let C do the searching $filename = "auto/$sub.al"; $filename =~ s#::#/#g; } } my $save = $@; local $!; # Do not munge the value. eval { local $SIG{__DIE__}; require $filename }; if ($@) { if (substr($sub,-9) eq '::DESTROY') { *$sub = sub {}; } else { # The load might just have failed because the filename was too # long for some old SVR3 systems which treat long names as errors. # If we can succesfully truncate a long name then it's worth a go. # There is a slight risk that we could pick up the wrong file here # but autosplit should have warned about that when splitting. if ($filename =~ s/(\w{12,})\.al$/substr($1,0,11).".al"/e){ eval { local $SIG{__DIE__}; require $filename }; } if ($@){ $@ =~ s/ at .*\n//; my $error = $@; require Carp; Carp::croak($error); } } } $@ = $save; goto &$sub; } sub import { my $pkg = shift; my $callpkg = caller; # # Export symbols, but not by accident of inheritance. # if ($pkg eq 'AutoLoader') { local $Exporter::ExportLevel = 1; Exporter::import $pkg, @_; } # # Try to find the autosplit index file. Eg., if the call package # is POSIX, then $INC{POSIX.pm} is something like # '/usr/local/lib/perl5/POSIX.pm', and the autosplit index file is in # '/usr/local/lib/perl5/auto/POSIX/autosplit.ix', so we require that. # # However, if @INC is a relative path, this might not work. If, # for example, @INC = ('lib'), then # $INC{POSIX.pm} is 'lib/POSIX.pm', and we want to require # 'auto/POSIX/autosplit.ix' (without the leading 'lib'). # (my $calldir = $callpkg) =~ s#::#/#g; my $path = $INC{$calldir . '.pm'}; if (defined($path)) { # Try absolute path name. if ($is_macos) { (my $malldir = $calldir) =~ tr#/#:#; $path =~ s#^(.*)$malldir\.pm\z#$1auto:$malldir:autosplit.ix#s; } else { $path =~ s#^(.*)$calldir\.pm\z#$1auto/$calldir/autosplit.ix#; } eval { require $path; }; # If that failed, try relative path with normal @INC searching. if ($@) { $path ="auto/$calldir/autosplit.ix"; eval { require $path; }; } if ($@) { my $error = $@; require Carp; Carp::carp($error); } } } sub unimport { my $callpkg = caller; eval "package $callpkg; sub AUTOLOAD;"; } 1; __END__ #line 338 FILEc3e70214/Carp.pmA#line 1 "/usr/lib/perl5/5.8.0/Carp.pm" package Carp; our $VERSION = '1.01'; #line 105 # This package is heavily used. Be small. Be fast. Be good. # Comments added by Andy Wardley 09-Apr-98, based on an # _almost_ complete understanding of the package. Corrections and # comments are welcome. # The members of %Internal are packages that are internal to perl. # Carp will not report errors from within these packages if it # can. The members of %CarpInternal are internal to Perl's warning # system. Carp will not report errors from within these packages # either, and will not report calls *to* these packages for carp and # croak. They replace $CarpLevel, which is deprecated. The # $Max(EvalLen|(Arg(Len|Nums)) variables are used to specify how the eval # text and function arguments should be formatted when printed. $CarpInternal{Carp}++; $CarpInternal{warnings}++; $CarpLevel = 0; # How many extra package levels to skip on carp. # How many calls to skip on confess. # Reconciling these notions is hard, use # %Internal and %CarpInternal instead. $MaxEvalLen = 0; # How much eval '...text...' to show. 0 = all. $MaxArgLen = 64; # How much of each argument to print. 0 = all. $MaxArgNums = 8; # How many arguments to print. 0 = all. $Verbose = 0; # If true then make shortmess call longmess instead require Exporter; @ISA = ('Exporter'); @EXPORT = qw(confess croak carp); @EXPORT_OK = qw(cluck verbose longmess shortmess); @EXPORT_FAIL = qw(verbose); # hook to enable verbose mode # if the caller specifies verbose usage ("perl -MCarp=verbose script.pl") # then the following method will be called by the Exporter which knows # to do this thanks to @EXPORT_FAIL, above. $_[1] will contain the word # 'verbose'. sub export_fail { shift; $Verbose = shift if $_[0] eq 'verbose'; return @_; } # longmess() crawls all the way up the stack reporting on all the function # calls made. The error string, $error, is originally constructed from the # arguments passed into longmess() via confess(), cluck() or shortmess(). # This gets appended with the stack trace messages which are generated for # each function call on the stack. sub longmess { { local $@; require Carp::Heavy; } # XXX fix require to not clear $@? # Icky backwards compatibility wrapper. :-( my $call_pack = caller(); if ($Internal{$call_pack} or $CarpInternal{$call_pack}) { return longmess_heavy(@_); } else { local $CarpLevel = $CarpLevel + 1; return longmess_heavy(@_); } } # shortmess() is called by carp() and croak() to skip all the way up to # the top-level caller's package and report the error from there. confess() # and cluck() generate a full stack trace so they call longmess() to # generate that. In verbose mode shortmess() calls longmess() so # you always get a stack trace sub shortmess { # Short-circuit &longmess if called via multiple packages { local $@; require Carp::Heavy; } # XXX fix require to not clear $@? # Icky backwards compatibility wrapper. :-( my $call_pack = caller(); local @CARP_NOT = caller(); shortmess_heavy(@_); } # the following four functions call longmess() or shortmess() depending on # whether they should generate a full stack trace (confess() and cluck()) # or simply report the caller's package (croak() and carp()), respectively. # confess() and croak() die, carp() and cluck() warn. sub croak { die shortmess @_ } sub confess { die longmess @_ } sub carp { warn shortmess @_ } sub cluck { warn longmess @_ } 1; FILEe05a6a96/Carp/Heavy.pm#line 1 "/usr/lib/perl5/5.8.0/Carp/Heavy.pm" # Carp::Heavy uses some variables in common with Carp. package Carp; #line 9 # use strict; # not yet # On one line so MakeMaker will see it. use Carp; our $VERSION = $Carp::VERSION; our ($CarpLevel, $MaxArgNums, $MaxEvalLen, $MaxArgLen, $Verbose); sub caller_info { my $i = shift(@_) + 1; package DB; my %call_info; @call_info{ qw(pack file line sub has_args wantarray evaltext is_require) } = caller($i); unless (defined $call_info{pack}) { return (); } my $sub_name = Carp::get_subname(\%call_info); if ($call_info{has_args}) { my @args = map {Carp::format_arg($_)} @DB::args; if ($MaxArgNums and @args > $MaxArgNums) { # More than we want to show? $#args = $MaxArgNums; push @args, '...'; } # Push the args onto the subroutine $sub_name .= '(' . join (',', @args) . ')'; } $call_info{sub_name} = $sub_name; return wantarray() ? %call_info : \%call_info; } # Transform an argument to a function into a string. sub format_arg { my $arg = shift; if (not defined($arg)) { $arg = 'undef'; } elsif (ref($arg)) { $arg = defined($overload::VERSION) ? overload::StrVal($arg) : "$arg"; } $arg =~ s/'/\\'/g; $arg = str_len_trim($arg, $MaxArgLen); # Quote it? $arg = "'$arg'" unless $arg =~ /^-?[\d.]+\z/; # The following handling of "control chars" is direct from # the original code - I think it is broken on Unicode though. # Suggestions? $arg =~ s/([[:cntrl:]]|[[:^ascii:]])/sprintf("\\x{%x}",ord($1))/eg; return $arg; } # Takes an inheritance cache and a package and returns # an anon hash of known inheritances and anon array of # inheritances which consequences have not been figured # for. sub get_status { my $cache = shift; my $pkg = shift; $cache->{$pkg} ||= [{$pkg => $pkg}, [trusts_directly($pkg)]]; return @{$cache->{$pkg}}; } # Takes the info from caller() and figures out the name of # the sub/require/eval sub get_subname { my $info = shift; if (defined($info->{evaltext})) { my $eval = $info->{evaltext}; if ($info->{is_require}) { return "require $eval"; } else { $eval =~ s/([\\\'])/\\$1/g; return "eval '" . str_len_trim($eval, $MaxEvalLen) . "'"; } } return ($info->{sub} eq '(eval)') ? 'eval {...}' : $info->{sub}; } # Figures out what call (from the point of view of the caller) # the long error backtrace should start at. sub long_error_loc { my $i; my $lvl = $CarpLevel; { my $pkg = caller(++$i); unless(defined($pkg)) { # This *shouldn't* happen. if (%Internal) { local %Internal; $i = long_error_loc(); last; } else { # OK, now I am irritated. return 2; } } redo if $CarpInternal{$pkg}; redo unless 0 > --$lvl; redo if $Internal{$pkg}; } return $i - 1; } sub longmess_heavy { return @_ if ref($_[0]); # don't break references as exceptions my $i = long_error_loc(); return ret_backtrace($i, @_); } # Returns a full stack backtrace starting from where it is # told. sub ret_backtrace { my ($i, @error) = @_; my $mess; my $err = join '', @error; $i++; my $tid_msg = ''; if (defined &Thread::tid) { my $tid = Thread->self->tid; $tid_msg = " thread $tid" if $tid; } { if ($err =~ /\n$/) { # extra block to localise $1 etc $mess = $err; } else { my %i = caller_info($i); $mess = "$err at $i{file} line $i{line}$tid_msg\n"; }} while (my %i = caller_info(++$i)) { $mess .= "\t$i{sub_name} called at $i{file} line $i{line}$tid_msg\n"; } return $mess; } sub ret_summary { my ($i, @error) = @_; my $mess; my $err = join '', @error; $i++; my $tid_msg = ''; if (defined &Thread::tid) { my $tid = Thread->self->tid; $tid_msg = " thread $tid" if $tid; } my %i = caller_info($i); return "$err at $i{file} line $i{line}$tid_msg\n"; } sub short_error_loc { my $cache; my $i = 1; my $lvl = $CarpLevel; { my $called = caller($i++); my $caller = caller($i); return 0 unless defined($caller); # What happened? redo if $Internal{$caller}; redo if $CarpInternal{$called}; redo if trusts($called, $caller, $cache); redo if trusts($caller, $called, $cache); redo unless 0 > --$lvl; } return $i - 1; } sub shortmess_heavy { return longmess_heavy(@_) if $Verbose; return @_ if ref($_[0]); # don't break references as exceptions my $i = short_error_loc(); if ($i) { ret_summary($i, @_); } else { longmess_heavy(@_); } } # If a string is too long, trims it with ... sub str_len_trim { my $str = shift; my $max = shift || 0; if (2 < $max and $max < length($str)) { substr($str, $max - 3) = '...'; } return $str; } # Takes two packages and an optional cache. Says whether the # first inherits from the second. # # Recursive versions of this have to work to avoid certain # possible endless loops, and when following long chains of # inheritance are less efficient. sub trusts { my $child = shift; my $parent = shift; my $cache = shift || {}; my ($known, $partial) = get_status($cache, $child); # Figure out consequences until we have an answer while (@$partial and not exists $known->{$parent}) { my $anc = shift @$partial; next if exists $known->{$anc}; $known->{$anc}++; my ($anc_knows, $anc_partial) = get_status($cache, $anc); my @found = keys %$anc_knows; @$known{@found} = (); push @$partial, @$anc_partial; } return exists $known->{$parent}; } # Takes a package and gives a list of those trusted directly sub trusts_directly { my $class = shift; no strict 'refs'; no warnings 'once'; return @{"$class\::CARP_NOT"} ? @{"$class\::CARP_NOT"} : @{"$class\::ISA"}; } 1; FILE4febd417/Digest/base.pm#line 1 "/usr/lib/perl5/5.8.0/Digest/base.pm" package Digest::base; use strict; use vars qw($VERSION); $VERSION = "1.00"; # subclass is supposed to implement at least these sub new; sub clone; sub add; sub digest; sub reset { my $self = shift; $self->new(@_); # ugly } sub addfile { my ($self, $handle) = @_; my $n; my $buf = ""; while (($n = read($handle, $buf, 4*1024))) { $self->add($buf); } unless (defined $n) { require Carp; Carp::croak("Read failed: $!"); } $self; } sub add_bits { my $self = shift; my $bits; my $nbits; if (@_ == 1) { my $arg = shift; $bits = pack("B*", $arg); $nbits = length($arg); } else { ($bits, $nbits) = @_; } if (($nbits % 8) != 0) { require Carp; Carp::croak("Number of bits must be multiple of 8 for this algorithm"); } return $self->add(substr($bits, 0, $nbits/8)); } sub hexdigest { my $self = shift; return unpack("H*", $self->digest(@_)); } sub b64digest { my $self = shift; require MIME::Base64; my $b64 = MIME::Base64::encode($self->digest(@_), ""); $b64 =~ s/=+$//; return $b64; } 1; __END__ #line 101FILE2a1b4dac/Exporter.pm]#line 1 "/usr/lib/perl5/5.8.0/Exporter.pm" package Exporter; require 5.006; # Be lean. #use strict; #no strict 'refs'; our $Debug = 0; our $ExportLevel = 0; our $Verbose ||= 0; our $VERSION = '5.566'; $Carp::Internal{Exporter} = 1; sub as_heavy { require Exporter::Heavy; # Unfortunately, this does not work if the caller is aliased as *name = \&foo # Thus the need to create a lot of identical subroutines my $c = (caller(1))[3]; $c =~ s/.*:://; \&{"Exporter::Heavy::heavy_$c"}; } sub export { goto &{as_heavy()}; } sub import { my $pkg = shift; my $callpkg = caller($ExportLevel); # We *need* to treat @{"$pkg\::EXPORT_FAIL"} since Carp uses it :-( my($exports, $export_cache, $fail) = (\@{"$pkg\::EXPORT"}, \%{"$pkg\::EXPORT"}, \@{"$pkg\::EXPORT_FAIL"}); return export $pkg, $callpkg, @_ if $Verbose or $Debug or @$fail > 1; my $args = @_ or @_ = @$exports; local $_; if ($args and not %$export_cache) { s/^&//, $export_cache->{$_} = 1 foreach (@$exports, @{"$pkg\::EXPORT_OK"}); } my $heavy; # Try very hard not to use {} and hence have to enter scope on the foreach # We bomb out of the loop with last as soon as heavy is set. if ($args or $fail) { ($heavy = (/\W/ or $args and not exists $export_cache->{$_} or @$fail and $_ eq $fail->[0])) and last foreach (@_); } else { ($heavy = /\W/) and last foreach (@_); } return export $pkg, $callpkg, ($args ? @_ : ()) if $heavy; local $SIG{__WARN__} = sub {require Carp; &Carp::carp}; # shortcut for the common case of no type character *{"$callpkg\::$_"} = \&{"$pkg\::$_"} foreach @_; } # Default methods sub export_fail { my $self = shift; @_; } # Unfortunately, caller(1)[3] "does not work" if the caller is aliased as # *name = \&foo. Thus the need to create a lot of identical subroutines # Otherwise we could have aliased them to export(). sub export_to_level { goto &{as_heavy()}; } sub export_tags { goto &{as_heavy()}; } sub export_ok_tags { goto &{as_heavy()}; } sub require_version { goto &{as_heavy()}; } 1; __END__ #line 417 FILE3a75438c/Exporter/Heavy.pm#line 1 "/usr/lib/perl5/5.8.0/Exporter/Heavy.pm" package Exporter::Heavy; use strict; no strict 'refs'; # On one line so MakeMaker will see it. require Exporter; our $VERSION = $Exporter::VERSION; $Carp::Internal{"Exporter::Heavy"} = 1; our $Verbose; #line 24 # # We go to a lot of trouble not to 'require Carp' at file scope, # because Carp requires Exporter, and something has to give. # sub heavy_export { # First make import warnings look like they're coming from the "use". local $SIG{__WARN__} = sub { my $text = shift; if ($text =~ s/ at \S*Exporter\S*.pm line \d+.*\n//) { require Carp; local $Carp::CarpLevel = 1; # ignore package calling us too. Carp::carp($text); } else { warn $text; } }; local $SIG{__DIE__} = sub { require Carp; local $Carp::CarpLevel = 1; # ignore package calling us too. Carp::croak("$_[0]Illegal null symbol in \@${1}::EXPORT") if $_[0] =~ /^Unable to create sub named "(.*?)::"/; }; my($pkg, $callpkg, @imports) = @_; my($type, $sym, $oops); my($exports, $export_cache) = (\@{"${pkg}::EXPORT"}, \%{"${pkg}::EXPORT"}); if (@imports) { if (!%$export_cache) { s/^&// foreach @$exports; @{$export_cache}{@$exports} = (1) x @$exports; my $ok = \@{"${pkg}::EXPORT_OK"}; if (@$ok) { s/^&// foreach @$ok; @{$export_cache}{@$ok} = (1) x @$ok; } } if ($imports[0] =~ m#^[/!:]#){ my $tagsref = \%{"${pkg}::EXPORT_TAGS"}; my $tagdata; my %imports; my($remove, $spec, @names, @allexports); # negated first item implies starting with default set: unshift @imports, ':DEFAULT' if $imports[0] =~ m/^!/; foreach $spec (@imports){ $remove = $spec =~ s/^!//; if ($spec =~ s/^://){ if ($spec eq 'DEFAULT'){ @names = @$exports; } elsif ($tagdata = $tagsref->{$spec}) { @names = @$tagdata; } else { warn qq["$spec" is not defined in %${pkg}::EXPORT_TAGS]; ++$oops; next; } } elsif ($spec =~ m:^/(.*)/$:){ my $patn = $1; @allexports = keys %$export_cache unless @allexports; # only do keys once @names = grep(/$patn/, @allexports); # not anchored by default } else { @names = ($spec); # is a normal symbol name } warn "Import ".($remove ? "del":"add").": @names " if $Verbose; if ($remove) { foreach $sym (@names) { delete $imports{$sym} } } else { @imports{@names} = (1) x @names; } } @imports = keys %imports; } my @carp; foreach $sym (@imports) { if (!$export_cache->{$sym}) { if ($sym =~ m/^\d/) { $pkg->VERSION($sym); # inherit from UNIVERSAL # If the version number was the only thing specified # then we should act as if nothing was specified: if (@imports == 1) { @imports = @$exports; last; } # We need a way to emulate 'use Foo ()' but still # allow an easy version check: "use Foo 1.23, ''"; if (@imports == 2 and !$imports[1]) { @imports = (); last; } } elsif ($sym !~ s/^&// || !$export_cache->{$sym}) { # accumulate the non-exports push @carp, qq["$sym" is not exported by the $pkg module\n]; $oops++; } } } if ($oops) { require Carp; Carp::croak("@{carp}Can't continue after import errors"); } } else { @imports = @$exports; } my($fail, $fail_cache) = (\@{"${pkg}::EXPORT_FAIL"}, \%{"${pkg}::EXPORT_FAIL"}); if (@$fail) { if (!%$fail_cache) { # Build cache of symbols. Optimise the lookup by adding # barewords twice... both with and without a leading &. # (Technique could be applied to $export_cache at cost of memory) my @expanded = map { /^\w/ ? ($_, '&'.$_) : $_ } @$fail; warn "${pkg}::EXPORT_FAIL cached: @expanded" if $Verbose; @{$fail_cache}{@expanded} = (1) x @expanded; } my @failed; foreach $sym (@imports) { push(@failed, $sym) if $fail_cache->{$sym} } if (@failed) { @failed = $pkg->export_fail(@failed); foreach $sym (@failed) { require Carp; Carp::carp(qq["$sym" is not implemented by the $pkg module ], "on this architecture"); } if (@failed) { require Carp; Carp::croak("Can't continue after import errors"); } } } warn "Importing into $callpkg from $pkg: ", join(", ",sort @imports) if $Verbose; foreach $sym (@imports) { # shortcut for the common case of no type character (*{"${callpkg}::$sym"} = \&{"${pkg}::$sym"}, next) unless $sym =~ s/^(\W)//; $type = $1; *{"${callpkg}::$sym"} = $type eq '&' ? \&{"${pkg}::$sym"} : $type eq '$' ? \${"${pkg}::$sym"} : $type eq '@' ? \@{"${pkg}::$sym"} : $type eq '%' ? \%{"${pkg}::$sym"} : $type eq '*' ? *{"${pkg}::$sym"} : do { require Carp; Carp::croak("Can't export symbol: $type$sym") }; } } sub heavy_export_to_level { my $pkg = shift; my $level = shift; (undef) = shift; # XXX redundant arg my $callpkg = caller($level); $pkg->export($callpkg, @_); } # Utility functions sub _push_tags { my($pkg, $var, $syms) = @_; my @nontag = (); my $export_tags = \%{"${pkg}::EXPORT_TAGS"}; push(@{"${pkg}::$var"}, map { $export_tags->{$_} ? @{$export_tags->{$_}} : scalar(push(@nontag,$_),$_) } (@$syms) ? @$syms : keys %$export_tags); if (@nontag and $^W) { # This may change to a die one day require Carp; Carp::carp(join(", ", @nontag)." are not tags of $pkg"); } } sub heavy_require_version { my($self, $wanted) = @_; my $pkg = ref $self || $self; return ${pkg}->VERSION($wanted); } sub heavy_export_tags { _push_tags((caller)[0], "EXPORT", \@_); } sub heavy_export_ok_tags { _push_tags((caller)[0], "EXPORT_OK", \@_); } 1; FILEd71140dc/File/Basename.pm*#line 1 "/usr/lib/perl5/5.8.0/File/Basename.pm" package File::Basename; #line 125 ## use strict; # A bit of juggling to insure that C always works, since # File::Basename is used during the Perl build, when the re extension may # not be available. BEGIN { unless (eval { require re; }) { eval ' sub re::import { $^H |= 0x00100000; } ' } import re 'taint'; } use 5.006; use warnings; our(@ISA, @EXPORT, $VERSION, $Fileparse_fstype, $Fileparse_igncase); require Exporter; @ISA = qw(Exporter); @EXPORT = qw(fileparse fileparse_set_fstype basename dirname); $VERSION = "2.71"; # fileparse_set_fstype() - specify OS-based rules used in future # calls to routines in this package # # Currently recognized values: VMS, MSDOS, MacOS, AmigaOS, os2, RISCOS # Any other name uses Unix-style rules and is case-sensitive sub fileparse_set_fstype { my @old = ($Fileparse_fstype, $Fileparse_igncase); if (@_) { $Fileparse_fstype = $_[0]; $Fileparse_igncase = ($_[0] =~ /^(?:MacOS|VMS|AmigaOS|os2|RISCOS|MSWin32|MSDOS)/i); } wantarray ? @old : $old[0]; } # fileparse() - parse file specification # # Version 2.4 27-Sep-1996 Charles Bailey bailey@genetics.upenn.edu sub fileparse { my($fullname,@suffices) = @_; unless (defined $fullname) { require Carp; Carp::croak "fileparse(): need a valid pathname"; } my($fstype,$igncase) = ($Fileparse_fstype, $Fileparse_igncase); my($dirpath,$tail,$suffix,$basename); my($taint) = substr($fullname,0,0); # Is $fullname tainted? if ($fstype =~ /^VMS/i) { if ($fullname =~ m#/#) { $fstype = '' } # We're doing Unix emulation else { ($dirpath,$basename) = ($fullname =~ /^(.*[:>\]])?(.*)/s); $dirpath ||= ''; # should always be defined } } if ($fstype =~ /^MS(DOS|Win32)|epoc/i) { ($dirpath,$basename) = ($fullname =~ /^((?:.*[:\\\/])?)(.*)/s); $dirpath .= '.\\' unless $dirpath =~ /[\\\/]\z/; } elsif ($fstype =~ /^os2/i) { ($dirpath,$basename) = ($fullname =~ m#^((?:.*[:\\/])?)(.*)#s); $dirpath = './' unless $dirpath; # Can't be 0 $dirpath .= '/' unless $dirpath =~ m#[\\/]\z#; } elsif ($fstype =~ /^MacOS/si) { ($dirpath,$basename) = ($fullname =~ /^(.*:)?(.*)/s); $dirpath = ':' unless $dirpath; } elsif ($fstype =~ /^AmigaOS/i) { ($dirpath,$basename) = ($fullname =~ /(.*[:\/])?(.*)/s); $dirpath = './' unless $dirpath; } elsif ($fstype !~ /^VMS/i) { # default to Unix ($dirpath,$basename) = ($fullname =~ m#^(.*/)?(.*)#s); if ($^O eq 'VMS' and $fullname =~ m:^(/[^/]+/000000(/|$))(.*):) { # dev:[000000] is top of VMS tree, similar to Unix '/' # so strip it off and treat the rest as "normal" my $devspec = $1; my $remainder = $3; ($dirpath,$basename) = ($remainder =~ m#^(.*/)?(.*)#s); $dirpath ||= ''; # should always be defined $dirpath = $devspec.$dirpath; } $dirpath = './' unless $dirpath; } if (@suffices) { $tail = ''; foreach $suffix (@suffices) { my $pat = ($igncase ? '(?i)' : '') . "($suffix)\$"; if ($basename =~ s/$pat//s) { $taint .= substr($suffix,0,0); $tail = $1 . $tail; } } } $tail .= $taint if defined $tail; # avoid warning if $tail == undef wantarray ? ($basename .= $taint, $dirpath .= $taint, $tail) : ($basename .= $taint); } # basename() - returns first element of list returned by fileparse() sub basename { my($name) = shift; (fileparse($name, map("\Q$_\E",@_)))[0]; } # dirname() - returns device and directory portion of file specification # Behavior matches that of Unix dirname(1) exactly for Unix and MSDOS # filespecs except for names ending with a separator, e.g., "/xx/yy/". # This differs from the second element of the list returned # by fileparse() in that the trailing '/' (Unix) or '\' (MSDOS) (and # the last directory name if the filespec ends in a '/' or '\'), is lost. sub dirname { my($basename,$dirname) = fileparse($_[0]); my($fstype) = $Fileparse_fstype; if ($fstype =~ /VMS/i) { if ($_[0] =~ m#/#) { $fstype = '' } else { return $dirname || $ENV{DEFAULT} } } if ($fstype =~ /MacOS/i) { if( !length($basename) && $dirname !~ /^[^:]+:\z/) { $dirname =~ s/([^:]):\z/$1/s; ($basename,$dirname) = fileparse $dirname; } $dirname .= ":" unless $dirname =~ /:\z/; } elsif ($fstype =~ /MS(DOS|Win32)|os2/i) { $dirname =~ s/([^:])[\\\/]*\z/$1/; unless( length($basename) ) { ($basename,$dirname) = fileparse $dirname; $dirname =~ s/([^:])[\\\/]*\z/$1/; } } elsif ($fstype =~ /AmigaOS/i) { if ( $dirname =~ /:\z/) { return $dirname } chop $dirname; $dirname =~ s#[^:/]+\z## unless length($basename); } else { $dirname =~ s:(.)/*\z:$1:s; unless( length($basename) ) { local($File::Basename::Fileparse_fstype) = $fstype; ($basename,$dirname) = fileparse $dirname; $dirname =~ s:(.)/*\z:$1:s; } } $dirname; } fileparse_set_fstype $^O; 1; FILE7a8bf744/File/Copy.pm#line 1 "/usr/lib/perl5/5.8.0/File/Copy.pm" # File/Copy.pm. Written in 1994 by Aaron Sherman . This # source code has been placed in the public domain by the author. # Please be kind and preserve the documentation. # # Additions copyright 1996 by Charles Bailey. Permission is granted # to distribute the revised code under the same terms as Perl itself. package File::Copy; use 5.006; use strict; use warnings; use Carp; use File::Spec; use Config; our(@ISA, @EXPORT, @EXPORT_OK, $VERSION, $Too_Big, $Syscopy_is_copy); sub copy; sub syscopy; sub cp; sub mv; # Note that this module implements only *part* of the API defined by # the File/Copy.pm module of the File-Tools-2.0 package. However, that # package has not yet been updated to work with Perl 5.004, and so it # would be a Bad Thing for the CPAN module to grab it and replace this # module. Therefore, we set this module's version higher than 2.0. $VERSION = '2.05'; require Exporter; @ISA = qw(Exporter); @EXPORT = qw(copy move); @EXPORT_OK = qw(cp mv); $Too_Big = 1024 * 1024 * 2; my $macfiles; if ($^O eq 'MacOS') { $macfiles = eval { require Mac::MoreFiles }; warn 'Mac::MoreFiles could not be loaded; using non-native syscopy' if $^W; } sub _catname { my($from, $to) = @_; if (not defined &basename) { require File::Basename; import File::Basename 'basename'; } if ($^O eq 'MacOS') { # a partial dir name that's valid only in the cwd (e.g. 'tmp') $to = ':' . $to if $to !~ /:/; } return File::Spec->catfile($to, basename($from)); } sub copy { croak("Usage: copy(FROM, TO [, BUFFERSIZE]) ") unless(@_ == 2 || @_ == 3); my $from = shift; my $to = shift; my $from_a_handle = (ref($from) ? (ref($from) eq 'GLOB' || UNIVERSAL::isa($from, 'GLOB') || UNIVERSAL::isa($from, 'IO::Handle')) : (ref(\$from) eq 'GLOB')); my $to_a_handle = (ref($to) ? (ref($to) eq 'GLOB' || UNIVERSAL::isa($to, 'GLOB') || UNIVERSAL::isa($to, 'IO::Handle')) : (ref(\$to) eq 'GLOB')); if ($from eq $to) { # works for references, too croak("'$from' and '$to' are identical (not copied)"); } if ($Config{d_symlink} && $Config{d_readlink} && !($^O eq 'Win32' || $^O eq 'os2' || $^O eq 'vms')) { no warnings 'io'; # don't warn if -l on filehandle if ((-e $from && -l $from) || (-e $to && -l $to)) { my @fs = stat($from); my @ts = stat($to); if (@fs && @ts && $fs[0] == $ts[0] && $fs[1] == $ts[1]) { croak("'$from' and '$to' are identical (not copied)"); } } } if (!$from_a_handle && !$to_a_handle && -d $to && ! -d $from) { $to = _catname($from, $to); } if (defined &syscopy && !$Syscopy_is_copy && !$to_a_handle && !($from_a_handle && $^O eq 'os2' ) # OS/2 cannot handle handles && !($from_a_handle && $^O eq 'mpeix') # and neither can MPE/iX. && !($from_a_handle && $^O eq 'MSWin32') && !($from_a_handle && $^O eq 'MacOS') && !($from_a_handle && $^O eq 'NetWare') ) { return syscopy($from, $to); } my $closefrom = 0; my $closeto = 0; my ($size, $status, $r, $buf); local($\) = ''; my $from_h; if ($from_a_handle) { $from_h = $from; } else { $from = _protect($from) if $from =~ /^\s/s; $from_h = \do { local *FH }; open($from_h, "< $from\0") or goto fail_open1; binmode $from_h or die "($!,$^E)"; $closefrom = 1; } my $to_h; if ($to_a_handle) { $to_h = $to; } else { $to = _protect($to) if $to =~ /^\s/s; $to_h = \do { local *FH }; open($to_h,"> $to\0") or goto fail_open2; binmode $to_h or die "($!,$^E)"; $closeto = 1; } if (@_) { $size = shift(@_) + 0; croak("Bad buffer size for copy: $size\n") unless ($size > 0); } else { $size = tied(*$from_h) ? 0 : -s $from_h || 0; $size = 1024 if ($size < 512); $size = $Too_Big if ($size > $Too_Big); } $! = 0; for (;;) { my ($r, $w, $t); defined($r = sysread($from_h, $buf, $size)) or goto fail_inner; last unless $r; for ($w = 0; $w < $r; $w += $t) { $t = syswrite($to_h, $buf, $r - $w, $w) or goto fail_inner; } } close($to_h) || goto fail_open2 if $closeto; close($from_h) || goto fail_open1 if $closefrom; # Use this idiom to avoid uninitialized value warning. return 1; # All of these contortions try to preserve error messages... fail_inner: if ($closeto) { $status = $!; $! = 0; close $to_h; $! = $status unless $!; } fail_open2: if ($closefrom) { $status = $!; $! = 0; close $from_h; $! = $status unless $!; } fail_open1: return 0; } sub move { my($from,$to) = @_; my($copied,$fromsz,$tosz1,$tomt1,$tosz2,$tomt2,$sts,$ossts); if (-d $to && ! -d $from) { $to = _catname($from, $to); } ($tosz1,$tomt1) = (stat($to))[7,9]; $fromsz = -s $from; if ($^O eq 'os2' and defined $tosz1 and defined $fromsz) { # will not rename with overwrite unlink $to; } return 1 if rename $from, $to; ($sts,$ossts) = ($! + 0, $^E + 0); # Did rename return an error even though it succeeded, because $to # is on a remote NFS file system, and NFS lost the server's ack? return 1 if defined($fromsz) && !-e $from && # $from disappeared (($tosz2,$tomt2) = (stat($to))[7,9]) && # $to's there ($tosz1 != $tosz2 or $tomt1 != $tomt2) && # and changed $tosz2 == $fromsz; # it's all there ($tosz1,$tomt1) = (stat($to))[7,9]; # just in case rename did something return 1 if ($copied = copy($from,$to)) && unlink($from); ($tosz2,$tomt2) = ((stat($to))[7,9],0,0) if defined $tomt1; unlink($to) if !defined($tomt1) or $tomt1 != $tomt2 or $tosz1 != $tosz2; ($!,$^E) = ($sts,$ossts); return 0; } *cp = \© *mv = \&move; if ($^O eq 'MacOS') { *_protect = sub { MacPerl::MakeFSSpec($_[0]) }; } else { *_protect = sub { "./$_[0]" }; } # &syscopy is an XSUB under OS/2 unless (defined &syscopy) { if ($^O eq 'VMS') { *syscopy = \&rmscopy; } elsif ($^O eq 'mpeix') { *syscopy = sub { return 0 unless @_ == 2; # Use the MPE cp program in order to # preserve MPE file attributes. return system('/bin/cp', '-f', $_[0], $_[1]) == 0; }; } elsif ($^O eq 'MSWin32') { *syscopy = sub { return 0 unless @_ == 2; return Win32::CopyFile(@_, 1); }; } elsif ($macfiles) { *syscopy = sub { my($from, $to) = @_; my($dir, $toname); return 0 unless -e $from; if ($to =~ /(.*:)([^:]+):?$/) { ($dir, $toname) = ($1, $2); } else { ($dir, $toname) = (":", $to); } unlink($to); Mac::MoreFiles::FSpFileCopy($from, $dir, $toname, 1); }; } else { $Syscopy_is_copy = 1; *syscopy = \© } } 1; __END__ #line 443 FILE29a9b292/File/Find.pmU#line 1 "/usr/lib/perl5/5.8.0/File/Find.pm" package File::Find; use 5.006; use strict; use warnings; use warnings::register; our $VERSION = '1.04'; require Exporter; require Cwd; #line 383 our @ISA = qw(Exporter); our @EXPORT = qw(find finddepth); use strict; my $Is_VMS; my $Is_MacOS; require File::Basename; require File::Spec; # Should ideally be my() not our() but local() currently # refuses to operate on lexicals our %SLnkSeen; our ($wanted_callback, $avoid_nlink, $bydepth, $no_chdir, $follow, $follow_skip, $full_check, $untaint, $untaint_skip, $untaint_pat, $pre_process, $post_process, $dangling_symlinks); sub contract_name { my ($cdir,$fn) = @_; return substr($cdir,0,rindex($cdir,'/')) if $fn eq $File::Find::current_dir; $cdir = substr($cdir,0,rindex($cdir,'/')+1); $fn =~ s|^\./||; my $abs_name= $cdir . $fn; if (substr($fn,0,3) eq '../') { 1 while $abs_name =~ s!/[^/]*/\.\./!/!; } return $abs_name; } # return the absolute name of a directory or file sub contract_name_Mac { my ($cdir,$fn) = @_; my $abs_name; if ($fn =~ /^(:+)(.*)$/) { # valid pathname starting with a ':' my $colon_count = length ($1); if ($colon_count == 1) { $abs_name = $cdir . $2; return $abs_name; } else { # need to move up the tree, but # only if it's not a volume name for (my $i=1; $i<$colon_count; $i++) { unless ($cdir =~ /^[^:]+:$/) { # volume name $cdir =~ s/[^:]+:$//; } else { return undef; } } $abs_name = $cdir . $2; return $abs_name; } } else { # $fn may be a valid path to a directory or file or (dangling) # symlink, without a leading ':' if ( (-e $fn) || (-l $fn) ) { if ($fn =~ /^[^:]+:/) { # a volume name like DataHD:* return $fn; # $fn is already an absolute path } else { $abs_name = $cdir . $fn; return $abs_name; } } else { # argh!, $fn is not a valid directory/file return undef; } } } sub PathCombine($$) { my ($Base,$Name) = @_; my $AbsName; if ($Is_MacOS) { # $Name is the resolved symlink (always a full path on MacOS), # i.e. there's no need to call contract_name_Mac() $AbsName = $Name; # (simple) check for recursion if ( ( $Base =~ /^$AbsName/) && (-d $AbsName) ) { # recursion return undef; } } else { if (substr($Name,0,1) eq '/') { $AbsName= $Name; } else { $AbsName= contract_name($Base,$Name); } # (simple) check for recursion my $newlen= length($AbsName); if ($newlen <= length($Base)) { if (($newlen == length($Base) || substr($Base,$newlen,1) eq '/') && $AbsName eq substr($Base,0,$newlen)) { return undef; } } } return $AbsName; } sub Follow_SymLink($) { my ($AbsName) = @_; my ($NewName,$DEV, $INO); ($DEV, $INO)= lstat $AbsName; while (-l _) { if ($SLnkSeen{$DEV, $INO}++) { if ($follow_skip < 2) { die "$AbsName is encountered a second time"; } else { return undef; } } $NewName= PathCombine($AbsName, readlink($AbsName)); unless(defined $NewName) { if ($follow_skip < 2) { die "$AbsName is a recursive symbolic link"; } else { return undef; } } else { $AbsName= $NewName; } ($DEV, $INO) = lstat($AbsName); return undef unless defined $DEV; # dangling symbolic link } if ($full_check && defined $DEV && $SLnkSeen{$DEV, $INO}++) { if ( ($follow_skip < 1) || ((-d _) && ($follow_skip < 2)) ) { die "$AbsName encountered a second time"; } else { return undef; } } return $AbsName; } our($dir, $name, $fullname, $prune); sub _find_dir_symlnk($$$); sub _find_dir($$$); # check whether or not a scalar variable is tainted # (code straight from the Camel, 3rd ed., page 561) sub is_tainted_pp { my $arg = shift; my $nada = substr($arg, 0, 0); # zero-length local $@; eval { eval "# $nada" }; return length($@) != 0; } sub _find_opt { my $wanted = shift; die "invalid top directory" unless defined $_[0]; # This function must local()ize everything because callbacks may # call find() or finddepth() local %SLnkSeen; local ($wanted_callback, $avoid_nlink, $bydepth, $no_chdir, $follow, $follow_skip, $full_check, $untaint, $untaint_skip, $untaint_pat, $pre_process, $post_process, $dangling_symlinks); local($dir, $name, $fullname, $prune); my $cwd = $wanted->{bydepth} ? Cwd::fastcwd() : Cwd::getcwd(); my $cwd_untainted = $cwd; my $check_t_cwd = 1; $wanted_callback = $wanted->{wanted}; $bydepth = $wanted->{bydepth}; $pre_process = $wanted->{preprocess}; $post_process = $wanted->{postprocess}; $no_chdir = $wanted->{no_chdir}; $full_check = $wanted->{follow}; $follow = $full_check || $wanted->{follow_fast}; $follow_skip = $wanted->{follow_skip}; $untaint = $wanted->{untaint}; $untaint_pat = $wanted->{untaint_pattern}; $untaint_skip = $wanted->{untaint_skip}; $dangling_symlinks = $wanted->{dangling_symlinks}; # for compatibility reasons (find.pl, find2perl) local our ($topdir, $topdev, $topino, $topmode, $topnlink); # a symbolic link to a directory doesn't increase the link count $avoid_nlink = $follow || $File::Find::dont_use_nlink; my ($abs_dir, $Is_Dir); Proc_Top_Item: foreach my $TOP (@_) { my $top_item = $TOP; if ($Is_MacOS) { ($topdev,$topino,$topmode,$topnlink) = $follow ? stat $top_item : lstat $top_item; $top_item = ":$top_item" if ( (-d _) && ( $top_item !~ /:/ ) ); } else { $top_item =~ s|/\z|| unless $top_item eq '/'; ($topdev,$topino,$topmode,$topnlink) = $follow ? stat $top_item : lstat $top_item; } $Is_Dir= 0; if ($follow) { if ($Is_MacOS) { $cwd = "$cwd:" unless ($cwd =~ /:$/); # for safety if ($top_item eq $File::Find::current_dir) { $abs_dir = $cwd; } else { $abs_dir = contract_name_Mac($cwd, $top_item); unless (defined $abs_dir) { warnings::warnif "Can't determine absolute path for $top_item (No such file or directory)\n"; next Proc_Top_Item; } } } else { if (substr($top_item,0,1) eq '/') { $abs_dir = $top_item; } elsif ($top_item eq $File::Find::current_dir) { $abs_dir = $cwd; } else { # care about any ../ $abs_dir = contract_name("$cwd/",$top_item); } } $abs_dir= Follow_SymLink($abs_dir); unless (defined $abs_dir) { if ($dangling_symlinks) { if (ref $dangling_symlinks eq 'CODE') { $dangling_symlinks->($top_item, $cwd); } else { warnings::warnif "$top_item is a dangling symbolic link\n"; } } next Proc_Top_Item; } if (-d _) { _find_dir_symlnk($wanted, $abs_dir, $top_item); $Is_Dir= 1; } } else { # no follow $topdir = $top_item; unless (defined $topnlink) { warnings::warnif "Can't stat $top_item: $!\n"; next Proc_Top_Item; } if (-d _) { $top_item =~ s/\.dir\z// if $Is_VMS; _find_dir($wanted, $top_item, $topnlink); $Is_Dir= 1; } else { $abs_dir= $top_item; } } unless ($Is_Dir) { unless (($_,$dir) = File::Basename::fileparse($abs_dir)) { if ($Is_MacOS) { ($dir,$_) = (':', $top_item); # $File::Find::dir, $_ } else { ($dir,$_) = ('./', $top_item); } } $abs_dir = $dir; if (( $untaint ) && (is_tainted($dir) )) { ( $abs_dir ) = $dir =~ m|$untaint_pat|; unless (defined $abs_dir) { if ($untaint_skip == 0) { die "directory $dir is still tainted"; } else { next Proc_Top_Item; } } } unless ($no_chdir || chdir $abs_dir) { warnings::warnif "Couldn't chdir $abs_dir: $!\n"; next Proc_Top_Item; } $name = $abs_dir . $_; # $File::Find::name { $wanted_callback->() }; # protect against wild "next" } unless ( $no_chdir ) { if ( ($check_t_cwd) && (($untaint) && (is_tainted($cwd) )) ) { ( $cwd_untainted ) = $cwd =~ m|$untaint_pat|; unless (defined $cwd_untainted) { die "insecure cwd in find(depth)"; } $check_t_cwd = 0; } unless (chdir $cwd_untainted) { die "Can't cd to $cwd: $!\n"; } } } } # API: # $wanted # $p_dir : "parent directory" # $nlink : what came back from the stat # preconditions: # chdir (if not no_chdir) to dir sub _find_dir($$$) { my ($wanted, $p_dir, $nlink) = @_; my ($CdLvl,$Level) = (0,0); my @Stack; my @filenames; my ($subcount,$sub_nlink); my $SE= []; my $dir_name= $p_dir; my $dir_pref; my $dir_rel = $File::Find::current_dir; my $tainted = 0; my $no_nlink; if ($Is_MacOS) { $dir_pref= ($p_dir =~ /:$/) ? $p_dir : "$p_dir:"; # preface } else { $dir_pref= ( $p_dir eq '/' ? '/' : "$p_dir/" ); } local ($dir, $name, $prune, *DIR); unless ( $no_chdir || ($p_dir eq $File::Find::current_dir)) { my $udir = $p_dir; if (( $untaint ) && (is_tainted($p_dir) )) { ( $udir ) = $p_dir =~ m|$untaint_pat|; unless (defined $udir) { if ($untaint_skip == 0) { die "directory $p_dir is still tainted"; } else { return; } } } unless (chdir $udir) { warnings::warnif "Can't cd to $udir: $!\n"; return; } } # push the starting directory push @Stack,[$CdLvl,$p_dir,$dir_rel,-1] if $bydepth; if ($Is_MacOS) { $p_dir = $dir_pref; # ensure trailing ':' } while (defined $SE) { unless ($bydepth) { $dir= $p_dir; # $File::Find::dir $name= $dir_name; # $File::Find::name $_= ($no_chdir ? $dir_name : $dir_rel ); # $_ # prune may happen here $prune= 0; { $wanted_callback->() }; # protect against wild "next" next if $prune; } # change to that directory unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) { my $udir= $dir_rel; if ( ($untaint) && (($tainted) || ($tainted = is_tainted($dir_rel) )) ) { ( $udir ) = $dir_rel =~ m|$untaint_pat|; unless (defined $udir) { if ($untaint_skip == 0) { if ($Is_MacOS) { die "directory ($p_dir) $dir_rel is still tainted"; } else { die "directory (" . ($p_dir ne '/' ? $p_dir : '') . "/) $dir_rel is still tainted"; } } else { # $untaint_skip == 1 next; } } } unless (chdir $udir) { if ($Is_MacOS) { warnings::warnif "Can't cd to ($p_dir) $udir: $!\n"; } else { warnings::warnif "Can't cd to (" . ($p_dir ne '/' ? $p_dir : '') . "/) $udir: $!\n"; } next; } $CdLvl++; } if ($Is_MacOS) { $dir_name = "$dir_name:" unless ($dir_name =~ /:$/); } $dir= $dir_name; # $File::Find::dir # Get the list of files in the current directory. unless (opendir DIR, ($no_chdir ? $dir_name : $File::Find::current_dir)) { warnings::warnif "Can't opendir($dir_name): $!\n"; next; } @filenames = readdir DIR; closedir(DIR); @filenames = $pre_process->(@filenames) if $pre_process; push @Stack,[$CdLvl,$dir_name,"",-2] if $post_process; # default: use whatever was specifid # (if $nlink >= 2, and $avoid_nlink == 0, this will switch back) $no_nlink = $avoid_nlink; # if dir has wrong nlink count, force switch to slower stat method $no_nlink = 1 if ($nlink < 2); if ($nlink == 2 && !$no_nlink) { # This dir has no subdirectories. for my $FN (@filenames) { next if $FN =~ $File::Find::skip_pattern; $name = $dir_pref . $FN; # $File::Find::name $_ = ($no_chdir ? $name : $FN); # $_ { $wanted_callback->() }; # protect against wild "next" } } else { # This dir has subdirectories. $subcount = $nlink - 2; for my $FN (@filenames) { next if $FN =~ $File::Find::skip_pattern; if ($subcount > 0 || $no_nlink) { # Seen all the subdirs? # check for directoriness. # stat is faster for a file in the current directory $sub_nlink = (lstat ($no_chdir ? $dir_pref . $FN : $FN))[3]; if (-d _) { --$subcount; $FN =~ s/\.dir\z// if $Is_VMS; push @Stack,[$CdLvl,$dir_name,$FN,$sub_nlink]; } else { $name = $dir_pref . $FN; # $File::Find::name $_= ($no_chdir ? $name : $FN); # $_ { $wanted_callback->() }; # protect against wild "next" } } else { $name = $dir_pref . $FN; # $File::Find::name $_= ($no_chdir ? $name : $FN); # $_ { $wanted_callback->() }; # protect against wild "next" } } } } continue { while ( defined ($SE = pop @Stack) ) { ($Level, $p_dir, $dir_rel, $nlink) = @$SE; if ($CdLvl > $Level && !$no_chdir) { my $tmp; if ($Is_MacOS) { $tmp = (':' x ($CdLvl-$Level)) . ':'; } else { $tmp = join('/',('..') x ($CdLvl-$Level)); } die "Can't cd to $dir_name" . $tmp unless chdir ($tmp); $CdLvl = $Level; } if ($Is_MacOS) { # $pdir always has a trailing ':', except for the starting dir, # where $dir_rel eq ':' $dir_name = "$p_dir$dir_rel"; $dir_pref = "$dir_name:"; } else { $dir_name = ($p_dir eq '/' ? "/$dir_rel" : "$p_dir/$dir_rel"); $dir_pref = "$dir_name/"; } if ( $nlink == -2 ) { $name = $dir = $p_dir; # $File::Find::name / dir $_ = $File::Find::current_dir; $post_process->(); # End-of-directory processing } elsif ( $nlink < 0 ) { # must be finddepth, report dirname now $name = $dir_name; if ($Is_MacOS) { if ($dir_rel eq ':') { # must be the top dir, where we started $name =~ s|:$||; # $File::Find::name $p_dir = "$p_dir:" unless ($p_dir =~ /:$/); } $dir = $p_dir; # $File::Find::dir $_ = ($no_chdir ? $name : $dir_rel); # $_ } else { if ( substr($name,-2) eq '/.' ) { substr($name, length($name) == 2 ? -1 : -2) = ''; } $dir = $p_dir; $_ = ($no_chdir ? $dir_name : $dir_rel ); if ( substr($_,-2) eq '/.' ) { substr($_, length($_) == 2 ? -1 : -2) = ''; } } { $wanted_callback->() }; # protect against wild "next" } else { push @Stack,[$CdLvl,$p_dir,$dir_rel,-1] if $bydepth; last; } } } } # API: # $wanted # $dir_loc : absolute location of a dir # $p_dir : "parent directory" # preconditions: # chdir (if not no_chdir) to dir sub _find_dir_symlnk($$$) { my ($wanted, $dir_loc, $p_dir) = @_; # $dir_loc is the absolute directory my @Stack; my @filenames; my $new_loc; my $updir_loc = $dir_loc; # untainted parent directory my $SE = []; my $dir_name = $p_dir; my $dir_pref; my $loc_pref; my $dir_rel = $File::Find::current_dir; my $byd_flag; # flag for pending stack entry if $bydepth my $tainted = 0; my $ok = 1; if ($Is_MacOS) { $dir_pref = ($p_dir =~ /:$/) ? "$p_dir" : "$p_dir:"; $loc_pref = ($dir_loc =~ /:$/) ? "$dir_loc" : "$dir_loc:"; } else { $dir_pref = ( $p_dir eq '/' ? '/' : "$p_dir/" ); $loc_pref = ( $dir_loc eq '/' ? '/' : "$dir_loc/" ); } local ($dir, $name, $fullname, $prune, *DIR); unless ($no_chdir) { # untaint the topdir if (( $untaint ) && (is_tainted($dir_loc) )) { ( $updir_loc ) = $dir_loc =~ m|$untaint_pat|; # parent dir, now untainted # once untainted, $updir_loc is pushed on the stack (as parent directory); # hence, we don't need to untaint the parent directory every time we chdir # to it later unless (defined $updir_loc) { if ($untaint_skip == 0) { die "directory $dir_loc is still tainted"; } else { return; } } } $ok = chdir($updir_loc) unless ($p_dir eq $File::Find::current_dir); unless ($ok) { warnings::warnif "Can't cd to $updir_loc: $!\n"; return; } } push @Stack,[$dir_loc,$updir_loc,$p_dir,$dir_rel,-1] if $bydepth; if ($Is_MacOS) { $p_dir = $dir_pref; # ensure trailing ':' } while (defined $SE) { unless ($bydepth) { # change (back) to parent directory (always untainted) unless ($no_chdir) { unless (chdir $updir_loc) { warnings::warnif "Can't cd to $updir_loc: $!\n"; next; } } $dir= $p_dir; # $File::Find::dir $name= $dir_name; # $File::Find::name $_= ($no_chdir ? $dir_name : $dir_rel ); # $_ $fullname= $dir_loc; # $File::Find::fullname # prune may happen here $prune= 0; lstat($_); # make sure file tests with '_' work { $wanted_callback->() }; # protect against wild "next" next if $prune; } # change to that directory unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) { $updir_loc = $dir_loc; if ( ($untaint) && (($tainted) || ($tainted = is_tainted($dir_loc) )) ) { # untaint $dir_loc, what will be pushed on the stack as (untainted) parent dir ( $updir_loc ) = $dir_loc =~ m|$untaint_pat|; unless (defined $updir_loc) { if ($untaint_skip == 0) { die "directory $dir_loc is still tainted"; } else { next; } } } unless (chdir $updir_loc) { warnings::warnif "Can't cd to $updir_loc: $!\n"; next; } } if ($Is_MacOS) { $dir_name = "$dir_name:" unless ($dir_name =~ /:$/); } $dir = $dir_name; # $File::Find::dir # Get the list of files in the current directory. unless (opendir DIR, ($no_chdir ? $dir_loc : $File::Find::current_dir)) { warnings::warnif "Can't opendir($dir_loc): $!\n"; next; } @filenames = readdir DIR; closedir(DIR); for my $FN (@filenames) { next if $FN =~ $File::Find::skip_pattern; # follow symbolic links / do an lstat $new_loc = Follow_SymLink($loc_pref.$FN); # ignore if invalid symlink next unless defined $new_loc; if (-d _) { push @Stack,[$new_loc,$updir_loc,$dir_name,$FN,1]; } else { $fullname = $new_loc; # $File::Find::fullname $name = $dir_pref . $FN; # $File::Find::name $_ = ($no_chdir ? $name : $FN); # $_ { $wanted_callback->() }; # protect against wild "next" } } } continue { while (defined($SE = pop @Stack)) { ($dir_loc, $updir_loc, $p_dir, $dir_rel, $byd_flag) = @$SE; if ($Is_MacOS) { # $p_dir always has a trailing ':', except for the starting dir, # where $dir_rel eq ':' $dir_name = "$p_dir$dir_rel"; $dir_pref = "$dir_name:"; $loc_pref = ($dir_loc =~ /:$/) ? $dir_loc : "$dir_loc:"; } else { $dir_name = ($p_dir eq '/' ? "/$dir_rel" : "$p_dir/$dir_rel"); $dir_pref = "$dir_name/"; $loc_pref = "$dir_loc/"; } if ( $byd_flag < 0 ) { # must be finddepth, report dirname now unless ($no_chdir || ($dir_rel eq $File::Find::current_dir)) { unless (chdir $updir_loc) { # $updir_loc (parent dir) is always untainted warnings::warnif "Can't cd to $updir_loc: $!\n"; next; } } $fullname = $dir_loc; # $File::Find::fullname $name = $dir_name; # $File::Find::name if ($Is_MacOS) { if ($dir_rel eq ':') { # must be the top dir, where we started $name =~ s|:$||; # $File::Find::name $p_dir = "$p_dir:" unless ($p_dir =~ /:$/); } $dir = $p_dir; # $File::Find::dir $_ = ($no_chdir ? $name : $dir_rel); # $_ } else { if ( substr($name,-2) eq '/.' ) { substr($name, length($name) == 2 ? -1 : -2) = ''; # $File::Find::name } $dir = $p_dir; # $File::Find::dir $_ = ($no_chdir ? $dir_name : $dir_rel); # $_ if ( substr($_,-2) eq '/.' ) { substr($_, length($_) == 2 ? -1 : -2) = ''; } } lstat($_); # make sure file tests with '_' work { $wanted_callback->() }; # protect against wild "next" } else { push @Stack,[$dir_loc, $updir_loc, $p_dir, $dir_rel,-1] if $bydepth; last; } } } } sub wrap_wanted { my $wanted = shift; if ( ref($wanted) eq 'HASH' ) { if ( $wanted->{follow} || $wanted->{follow_fast}) { $wanted->{follow_skip} = 1 unless defined $wanted->{follow_skip}; } if ( $wanted->{untaint} ) { $wanted->{untaint_pattern} = $File::Find::untaint_pattern unless defined $wanted->{untaint_pattern}; $wanted->{untaint_skip} = 0 unless defined $wanted->{untaint_skip}; } return $wanted; } else { return { wanted => $wanted }; } } sub find { my $wanted = shift; _find_opt(wrap_wanted($wanted), @_); } sub finddepth { my $wanted = wrap_wanted(shift); $wanted->{bydepth} = 1; _find_opt($wanted, @_); } # default $File::Find::skip_pattern = qr/^\.{1,2}\z/; $File::Find::untaint_pattern = qr|^([-+@\w./]+)$|; # These are hard-coded for now, but may move to hint files. if ($^O eq 'VMS') { $Is_VMS = 1; $File::Find::dont_use_nlink = 1; } elsif ($^O eq 'MacOS') { $Is_MacOS = 1; $File::Find::dont_use_nlink = 1; $File::Find::skip_pattern = qr/^Icon\015\z/; $File::Find::untaint_pattern = qr|^(.+)$|; } # this _should_ work properly on all platforms # where File::Find can be expected to work $File::Find::current_dir = File::Spec->curdir || '.'; $File::Find::dont_use_nlink = 1 if $^O eq 'os2' || $^O eq 'dos' || $^O eq 'amigaos' || $^O eq 'MSWin32' || $^O eq 'cygwin' || $^O eq 'epoc' || $^O eq 'qnx' || $^O eq 'nto'; # Set dont_use_nlink in your hint file if your system's stat doesn't # report the number of links in a directory as an indication # of the number of files. # See, e.g. hints/machten.sh for MachTen 2.2. unless ($File::Find::dont_use_nlink) { require Config; $File::Find::dont_use_nlink = 1 if ($Config::Config{'dont_use_nlink'}); } # We need a function that checks if a scalar is tainted. Either use the # Scalar::Util module's tainted() function or our (slower) pure Perl # fallback is_tainted_pp() { local $@; eval { require Scalar::Util }; *is_tainted = $@ ? \&is_tainted_pp : \&Scalar::Util::tainted; } 1; FILE2512c43f/File/Path.pm#line 1 "/usr/lib/perl5/5.8.0/File/Path.pm" package File::Path; #line 102 use 5.006; use Carp; use File::Basename (); use Exporter (); use strict; use warnings; our $VERSION = "1.05"; our @ISA = qw( Exporter ); our @EXPORT = qw( mkpath rmtree ); my $Is_VMS = $^O eq 'VMS'; my $Is_MacOS = $^O eq 'MacOS'; # These OSes complain if you want to remove a file that you have no # write permission to: my $force_writeable = ($^O eq 'os2' || $^O eq 'dos' || $^O eq 'MSWin32' || $^O eq 'amigaos' || $^O eq 'MacOS' || $^O eq 'epoc'); sub mkpath { my($paths, $verbose, $mode) = @_; # $paths -- either a path string or ref to list of paths # $verbose -- optional print "mkdir $path" for each directory created # $mode -- optional permissions, defaults to 0777 local($")=$Is_MacOS ? ":" : "/"; $mode = 0777 unless defined($mode); $paths = [$paths] unless ref $paths; my(@created,$path); foreach $path (@$paths) { $path .= '/' if $^O eq 'os2' and $path =~ /^\w:\z/s; # feature of CRT # Logic wants Unix paths, so go with the flow. if ($Is_VMS) { next if $path eq '/'; $path = VMS::Filespec::unixify($path); if ($path =~ m:^(/[^/]+)/?\z:) { $path = $1.'/000000'; } } next if -d $path; my $parent = File::Basename::dirname($path); unless (-d $parent or $path eq $parent) { push(@created,mkpath($parent, $verbose, $mode)); } print "mkdir $path\n" if $verbose; unless (mkdir($path,$mode)) { my $e = $!; # allow for another process to have created it meanwhile croak "mkdir $path: $e" unless -d $path; } push(@created, $path); } @created; } sub rmtree { my($roots, $verbose, $safe) = @_; my(@files); my($count) = 0; $verbose ||= 0; $safe ||= 0; if ( defined($roots) && length($roots) ) { $roots = [$roots] unless ref $roots; } else { carp "No root path(s) specified\n"; return 0; } my($root); foreach $root (@{$roots}) { if ($Is_MacOS) { $root = ":$root" if $root !~ /:/; $root =~ s#([^:])\z#$1:#; } else { $root =~ s#/\z##; } (undef, undef, my $rp) = lstat $root or next; $rp &= 07777; # don't forget setuid, setgid, sticky bits if ( -d _ ) { # notabene: 0777 is for making readable in the first place, # it's also intended to change it to writable in case we have # to recurse in which case we are better than rm -rf for # subtrees with strange permissions chmod(0777, ($Is_VMS ? VMS::Filespec::fileify($root) : $root)) or carp "Can't make directory $root read+writeable: $!" unless $safe; if (opendir my $d, $root) { no strict 'refs'; if (!defined ${"\cTAINT"} or ${"\cTAINT"}) { # Blindly untaint dir names @files = map { /^(.*)$/s ; $1 } readdir $d; } else { @files = readdir $d; } closedir $d; } else { carp "Can't read $root: $!"; @files = (); } # Deleting large numbers of files from VMS Files-11 filesystems # is faster if done in reverse ASCIIbetical order @files = reverse @files if $Is_VMS; ($root = VMS::Filespec::unixify($root)) =~ s#\.dir\z## if $Is_VMS; if ($Is_MacOS) { @files = map("$root$_", @files); } else { @files = map("$root/$_", grep $_!~/^\.{1,2}\z/s,@files); } $count += rmtree(\@files,$verbose,$safe); if ($safe && ($Is_VMS ? !&VMS::Filespec::candelete($root) : !-w $root)) { print "skipped $root\n" if $verbose; next; } chmod 0777, $root or carp "Can't make directory $root writeable: $!" if $force_writeable; print "rmdir $root\n" if $verbose; if (rmdir $root) { ++$count; } else { carp "Can't remove directory $root: $!"; chmod($rp, ($Is_VMS ? VMS::Filespec::fileify($root) : $root)) or carp("and can't restore permissions to " . sprintf("0%o",$rp) . "\n"); } } else { if ($safe && ($Is_VMS ? !&VMS::Filespec::candelete($root) : !(-l $root || -w $root))) { print "skipped $root\n" if $verbose; next; } chmod 0666, $root or carp "Can't make file $root writeable: $!" if $force_writeable; print "unlink $root\n" if $verbose; # delete all versions under VMS for (;;) { unless (unlink $root) { carp "Can't unlink file $root: $!"; if ($force_writeable) { chmod $rp, $root or carp("and can't restore permissions to " . sprintf("0%o",$rp) . "\n"); } last; } ++$count; last unless $Is_VMS && lstat $root; } } } $count; } 1; FILEb5c84fc9/File/Spec.pm(#line 1 "/usr/lib/perl5/5.8.0/File/Spec.pm" package File::Spec; use strict; our(@ISA, $VERSION); $VERSION = 0.83 ; my %module = (MacOS => 'Mac', MSWin32 => 'Win32', os2 => 'OS2', VMS => 'VMS', epoc => 'Epoc', NetWare => 'Win32', # Yes, File::Spec::Win32 works on NetWare. dos => 'OS2', # Yes, File::Spec::OS2 works on DJGPP. cygwin => 'Cygwin'); my $module = $module{$^O} || 'Unix'; require "File/Spec/$module.pm"; @ISA = ("File::Spec::$module"); 1; __END__ #line 293FILEb9239034/File/Spec/Unix.pmi#line 1 "/usr/lib/perl5/5.8.0/File/Spec/Unix.pm" package File::Spec::Unix; use strict; our($VERSION); $VERSION = '1.4'; use Cwd; #line 36 sub canonpath { my ($self,$path) = @_; # Handle POSIX-style node names beginning with double slash (qnx, nto) # Handle network path names beginning with double slash (cygwin) # (POSIX says: "a pathname that begins with two successive slashes # may be interpreted in an implementation-defined manner, although # more than two leading slashes shall be treated as a single slash.") my $node = ''; if ( $^O =~ m/^(?:qnx|nto|cygwin)$/ && $path =~ s:^(//[^/]+)(/|\z):/:s ) { $node = $1; } # This used to be # $path =~ s|/+|/|g unless($^O eq 'cygwin'); # but that made tests 29, 30, 35, 46, and 213 (as of #13272) to fail # (Mainly because trailing "" directories didn't get stripped). # Why would cygwin avoid collapsing multiple slashes into one? --jhi $path =~ s|/+|/|g; # xx////xx -> xx/xx $path =~ s@(/\.)+(/|\Z(?!\n))@/@g; # xx/././xx -> xx/xx $path =~ s|^(\./)+||s unless $path eq "./"; # ./xx -> xx $path =~ s|^/(\.\./)+|/|s; # /../../xx -> xx $path =~ s|/\Z(?!\n)|| unless $path eq "/"; # xx/ -> xx return "$node$path"; } #line 71 sub catdir { my $self = shift; my @args = @_; foreach (@args) { # append a slash to each argument unless it has one there $_ .= "/" if $_ eq '' || substr($_,-1) ne "/"; } return $self->canonpath(join('', @args)); } #line 88 sub catfile { my $self = shift; my $file = pop @_; return $file unless @_; my $dir = $self->catdir(@_); $dir .= "/" unless substr($dir,-1) eq "/"; return $dir.$file; } #line 103 sub curdir { return "."; } #line 113 sub devnull { return "/dev/null"; } #line 123 sub rootdir { return "/"; } #line 140 my $tmpdir; sub tmpdir { return $tmpdir if defined $tmpdir; my @dirlist = ($ENV{TMPDIR}, "/tmp"); { no strict 'refs'; if (${"\cTAINT"}) { # Check for taint mode on perl >= 5.8.0 require Scalar::Util; shift @dirlist if Scalar::Util::tainted($ENV{TMPDIR}); } } foreach (@dirlist) { next unless defined && -d && -w _; $tmpdir = $_; last; } $tmpdir = '' unless defined $tmpdir; return $tmpdir; } #line 166 sub updir { return ".."; } #line 177 sub no_upwards { my $self = shift; return grep(!/^\.{1,2}\Z(?!\n)/s, @_); } #line 189 sub case_tolerant { return 0; } #line 203 sub file_name_is_absolute { my ($self,$file) = @_; return scalar($file =~ m:^/:s); } #line 214 sub path { my @path = split(':', $ENV{PATH}); foreach (@path) { $_ = '.' if $_ eq '' } return @path; } #line 226 sub join { my $self = shift; return $self->catfile(@_); } #line 251 sub splitpath { my ($self,$path, $nofile) = @_; my ($volume,$directory,$file) = ('','',''); if ( $nofile ) { $directory = $path; } else { $path =~ m|^ ( (?: .* / (?: \.\.?\Z(?!\n) )? )? ) ([^/]*) |xs; $directory = $1; $file = $2; } return ($volume,$directory,$file); } #line 293 sub splitdir { my ($self,$directories) = @_ ; # # split() likes to forget about trailing null fields, so here we # check to be sure that there will not be any before handling the # simple case. # if ( $directories !~ m|/\Z(?!\n)| ) { return split( m|/|, $directories ); } else { # # since there was a trailing separator, add a file name to the end, # then do the split, then replace it with ''. # my( @directories )= split( m|/|, "${directories}dummy" ) ; $directories[ $#directories ]= '' ; return @directories ; } } #line 324 sub catpath { my ($self,$volume,$directory,$file) = @_; if ( $directory ne '' && $file ne '' && substr( $directory, -1 ) ne '/' && substr( $file, 0, 1 ) ne '/' ) { $directory .= "/$file" ; } else { $directory .= $file ; } return $directory ; } #line 371 sub abs2rel { my($self,$path,$base) = @_; # Clean up $path if ( ! $self->file_name_is_absolute( $path ) ) { $path = $self->rel2abs( $path ) ; } else { $path = $self->canonpath( $path ) ; } # Figure out the effective $base and clean it up. if ( !defined( $base ) || $base eq '' ) { $base = cwd() ; } elsif ( ! $self->file_name_is_absolute( $base ) ) { $base = $self->rel2abs( $base ) ; } else { $base = $self->canonpath( $base ) ; } # Now, remove all leading components that are the same my @pathchunks = $self->splitdir( $path); my @basechunks = $self->splitdir( $base); while (@pathchunks && @basechunks && $pathchunks[0] eq $basechunks[0]) { shift @pathchunks ; shift @basechunks ; } $path = CORE::join( '/', @pathchunks ); $base = CORE::join( '/', @basechunks ); # $base now contains the directories the resulting relative path # must ascend out of before it can descend to $path_directory. So, # replace all names with $parentDir $base =~ s|[^/]+|..|g ; # Glue the two together, using a separator if necessary, and preventing an # empty result. if ( $path ne '' && $base ne '' ) { $path = "$base/$path" ; } else { $path = "$base$path" ; } return $self->canonpath( $path ) ; } #line 449 sub rel2abs { my ($self,$path,$base ) = @_; # Clean up $path if ( ! $self->file_name_is_absolute( $path ) ) { # Figure out the effective $base and clean it up. if ( !defined( $base ) || $base eq '' ) { $base = cwd() ; } elsif ( ! $self->file_name_is_absolute( $base ) ) { $base = $self->rel2abs( $base ) ; } else { $base = $self->canonpath( $base ) ; } # Glom them together $path = $self->catdir( $base, $path ) ; } return $self->canonpath( $path ) ; } #line 481 1; FILE5d739427/File/Temp.pm#line 1 "/usr/lib/perl5/5.8.0/File/Temp.pm" package File::Temp; #line 119 # 5.6.0 gives us S_IWOTH, S_IWGRP, our and auto-vivifying filehandls # People would like a version on 5.005 so give them what they want :-) use 5.005; use strict; use Carp; use File::Spec 0.8; use File::Path qw/ rmtree /; use Fcntl 1.03; use Errno; require VMS::Stdio if $^O eq 'VMS'; # Need the Symbol package if we are running older perl require Symbol if $] < 5.006; # use 'our' on v5.6.0 use vars qw($VERSION @EXPORT_OK %EXPORT_TAGS $DEBUG); $DEBUG = 0; # We are exporting functions use base qw/Exporter/; # Export list - to allow fine tuning of export table @EXPORT_OK = qw{ tempfile tempdir tmpnam tmpfile mktemp mkstemp mkstemps mkdtemp unlink0 }; # Groups of functions for export %EXPORT_TAGS = ( 'POSIX' => [qw/ tmpnam tmpfile /], 'mktemp' => [qw/ mktemp mkstemp mkstemps mkdtemp/], ); # add contents of these tags to @EXPORT Exporter::export_tags('POSIX','mktemp'); # Version number $VERSION = '0.13'; # This is a list of characters that can be used in random filenames my @CHARS = (qw/ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 _ /); # Maximum number of tries to make a temp file before failing use constant MAX_TRIES => 10; # Minimum number of X characters that should be in a template use constant MINX => 4; # Default template when no template supplied use constant TEMPXXX => 'X' x 10; # Constants for the security level use constant STANDARD => 0; use constant MEDIUM => 1; use constant HIGH => 2; # OPENFLAGS. If we defined the flag to use with Sysopen here this gives # us an optimisation when many temporary files are requested my $OPENFLAGS = O_CREAT | O_EXCL | O_RDWR; unless ($^O eq 'MacOS') { for my $oflag (qw/ FOLLOW BINARY LARGEFILE EXLOCK NOINHERIT /) { my ($bit, $func) = (0, "Fcntl::O_" . $oflag); no strict 'refs'; $OPENFLAGS |= $bit if eval { # Make sure that redefined die handlers do not cause problems # eg CGI::Carp local $SIG{__DIE__} = sub {}; local $SIG{__WARN__} = sub {}; $bit = &$func(); 1; }; } } # On some systems the O_TEMPORARY flag can be used to tell the OS # to automatically remove the file when it is closed. This is fine # in most cases but not if tempfile is called with UNLINK=>0 and # the filename is requested -- in the case where the filename is to # be passed to another routine. This happens on windows. We overcome # this by using a second open flags variable my $OPENTEMPFLAGS = $OPENFLAGS; unless ($^O eq 'MacOS') { for my $oflag (qw/ TEMPORARY /) { my ($bit, $func) = (0, "Fcntl::O_" . $oflag); no strict 'refs'; $OPENTEMPFLAGS |= $bit if eval { # Make sure that redefined die handlers do not cause problems # eg CGI::Carp local $SIG{__DIE__} = sub {}; local $SIG{__WARN__} = sub {}; $bit = &$func(); 1; }; } } # INTERNAL ROUTINES - not to be used outside of package # Generic routine for getting a temporary filename # modelled on OpenBSD _gettemp() in mktemp.c # The template must contain X's that are to be replaced # with the random values # Arguments: # TEMPLATE - string containing the XXXXX's that is converted # to a random filename and opened if required # Optionally, a hash can also be supplied containing specific options # "open" => if true open the temp file, else just return the name # default is 0 # "mkdir"=> if true, we are creating a temp directory rather than tempfile # default is 0 # "suffixlen" => number of characters at end of PATH to be ignored. # default is 0. # "unlink_on_close" => indicates that, if possible, the OS should remove # the file as soon as it is closed. Usually indicates # use of the O_TEMPORARY flag to sysopen. # Usually irrelevant on unix # Optionally a reference to a scalar can be passed into the function # On error this will be used to store the reason for the error # "ErrStr" => \$errstr # "open" and "mkdir" can not both be true # "unlink_on_close" is not used when "mkdir" is true. # The default options are equivalent to mktemp(). # Returns: # filehandle - open file handle (if called with doopen=1, else undef) # temp name - name of the temp file or directory # For example: # ($fh, $name) = _gettemp($template, "open" => 1); # for the current version, failures are associated with # stored in an error string and returned to give the reason whilst debugging # This routine is not called by any external function sub _gettemp { croak 'Usage: ($fh, $name) = _gettemp($template, OPTIONS);' unless scalar(@_) >= 1; # the internal error string - expect it to be overridden # Need this in case the caller decides not to supply us a value # need an anonymous scalar my $tempErrStr; # Default options my %options = ( "open" => 0, "mkdir" => 0, "suffixlen" => 0, "unlink_on_close" => 0, "ErrStr" => \$tempErrStr, ); # Read the template my $template = shift; if (ref($template)) { # Use a warning here since we have not yet merged ErrStr carp "File::Temp::_gettemp: template must not be a reference"; return (); } # Check that the number of entries on stack are even if (scalar(@_) % 2 != 0) { # Use a warning here since we have not yet merged ErrStr carp "File::Temp::_gettemp: Must have even number of options"; return (); } # Read the options and merge with defaults %options = (%options, @_) if @_; # Make sure the error string is set to undef ${$options{ErrStr}} = undef; # Can not open the file and make a directory in a single call if ($options{"open"} && $options{"mkdir"}) { ${$options{ErrStr}} = "doopen and domkdir can not both be true\n"; return (); } # Find the start of the end of the Xs (position of last X) # Substr starts from 0 my $start = length($template) - 1 - $options{"suffixlen"}; # Check that we have at least MINX x X (eg 'XXXX") at the end of the string # (taking suffixlen into account). Any fewer is insecure. # Do it using substr - no reason to use a pattern match since # we know where we are looking and what we are looking for if (substr($template, $start - MINX + 1, MINX) ne 'X' x MINX) { ${$options{ErrStr}} = "The template must contain at least ". MINX . " 'X' characters\n"; return (); } # Replace all the X at the end of the substring with a # random character or just all the XX at the end of a full string. # Do it as an if, since the suffix adjusts which section to replace # and suffixlen=0 returns nothing if used in the substr directly # and generate a full path from the template my $path = _replace_XX($template, $options{"suffixlen"}); # Split the path into constituent parts - eventually we need to check # whether the directory exists # We need to know whether we are making a temp directory # or a tempfile my ($volume, $directories, $file); my $parent; # parent directory if ($options{"mkdir"}) { # There is no filename at the end ($volume, $directories, $file) = File::Spec->splitpath( $path, 1); # The parent is then $directories without the last directory # Split the directory and put it back together again my @dirs = File::Spec->splitdir($directories); # If @dirs only has one entry (i.e. the directory template) that means # we are in the current directory if ($#dirs == 0) { $parent = File::Spec->curdir; } else { if ($^O eq 'VMS') { # need volume to avoid relative dir spec $parent = File::Spec->catdir($volume, @dirs[0..$#dirs-1]); $parent = 'sys$disk:[]' if $parent eq ''; } else { # Put it back together without the last one $parent = File::Spec->catdir(@dirs[0..$#dirs-1]); # ...and attach the volume (no filename) $parent = File::Spec->catpath($volume, $parent, ''); } } } else { # Get rid of the last filename (use File::Basename for this?) ($volume, $directories, $file) = File::Spec->splitpath( $path ); # Join up without the file part $parent = File::Spec->catpath($volume,$directories,''); # If $parent is empty replace with curdir $parent = File::Spec->curdir unless $directories ne ''; } # Check that the parent directories exist # Do this even for the case where we are simply returning a name # not a file -- no point returning a name that includes a directory # that does not exist or is not writable unless (-d $parent) { ${$options{ErrStr}} = "Parent directory ($parent) is not a directory"; return (); } unless (-w _) { ${$options{ErrStr}} = "Parent directory ($parent) is not writable\n"; return (); } # Check the stickiness of the directory and chown giveaway if required # If the directory is world writable the sticky bit # must be set if (File::Temp->safe_level == MEDIUM) { my $safeerr; unless (_is_safe($parent,\$safeerr)) { ${$options{ErrStr}} = "Parent directory ($parent) is not safe ($safeerr)"; return (); } } elsif (File::Temp->safe_level == HIGH) { my $safeerr; unless (_is_verysafe($parent, \$safeerr)) { ${$options{ErrStr}} = "Parent directory ($parent) is not safe ($safeerr)"; return (); } } # Now try MAX_TRIES time to open the file for (my $i = 0; $i < MAX_TRIES; $i++) { # Try to open the file if requested if ($options{"open"}) { my $fh; # If we are running before perl5.6.0 we can not auto-vivify if ($] < 5.006) { $fh = &Symbol::gensym; } # Try to make sure this will be marked close-on-exec # XXX: Win32 doesn't respect this, nor the proper fcntl, # but may have O_NOINHERIT. This may or may not be in Fcntl. local $^F = 2; # Store callers umask my $umask = umask(); # Set a known umask umask(066); # Attempt to open the file my $open_success = undef; if ( $^O eq 'VMS' and $options{"unlink_on_close"} ) { # make it auto delete on close by setting FAB$V_DLT bit $fh = VMS::Stdio::vmssysopen($path, $OPENFLAGS, 0600, 'fop=dlt'); $open_success = $fh; } else { my $flags = ( $options{"unlink_on_close"} ? $OPENTEMPFLAGS : $OPENFLAGS ); $open_success = sysopen($fh, $path, $flags, 0600); } if ( $open_success ) { # Reset umask umask($umask) if defined $umask; # Opened successfully - return file handle and name return ($fh, $path); } else { # Reset umask umask($umask) if defined $umask; # Error opening file - abort with error # if the reason was anything but EEXIST unless ($!{EEXIST}) { ${$options{ErrStr}} = "Could not create temp file $path: $!"; return (); } # Loop round for another try } } elsif ($options{"mkdir"}) { # Store callers umask my $umask = umask(); # Set a known umask umask(066); # Open the temp directory if (mkdir( $path, 0700)) { # created okay # Reset umask umask($umask) if defined $umask; return undef, $path; } else { # Reset umask umask($umask) if defined $umask; # Abort with error if the reason for failure was anything # except EEXIST unless ($!{EEXIST}) { ${$options{ErrStr}} = "Could not create directory $path: $!"; return (); } # Loop round for another try } } else { # Return true if the file can not be found # Directory has been checked previously return (undef, $path) unless -e $path; # Try again until MAX_TRIES } # Did not successfully open the tempfile/dir # so try again with a different set of random letters # No point in trying to increment unless we have only # 1 X say and the randomness could come up with the same # file MAX_TRIES in a row. # Store current attempt - in principal this implies that the # 3rd time around the open attempt that the first temp file # name could be generated again. Probably should store each # attempt and make sure that none are repeated my $original = $path; my $counter = 0; # Stop infinite loop my $MAX_GUESS = 50; do { # Generate new name from original template $path = _replace_XX($template, $options{"suffixlen"}); $counter++; } until ($path ne $original || $counter > $MAX_GUESS); # Check for out of control looping if ($counter > $MAX_GUESS) { ${$options{ErrStr}} = "Tried to get a new temp name different to the previous value $MAX_GUESS times.\nSomething wrong with template?? ($template)"; return (); } } # If we get here, we have run out of tries ${ $options{ErrStr} } = "Have exceeded the maximum number of attempts (" . MAX_TRIES . ") to open temp file/dir"; return (); } # Internal routine to return a random character from the # character list. Does not do an srand() since rand() # will do one automatically # No arguments. Return value is the random character # No longer called since _replace_XX runs a few percent faster if # I inline the code. This is important if we are creating thousands of # temporary files. sub _randchar { $CHARS[ int( rand( $#CHARS ) ) ]; } # Internal routine to replace the XXXX... with random characters # This has to be done by _gettemp() every time it fails to # open a temp file/dir # Arguments: $template (the template with XXX), # $ignore (number of characters at end to ignore) # Returns: modified template sub _replace_XX { croak 'Usage: _replace_XX($template, $ignore)' unless scalar(@_) == 2; my ($path, $ignore) = @_; # Do it as an if, since the suffix adjusts which section to replace # and suffixlen=0 returns nothing if used in the substr directly # Alternatively, could simply set $ignore to length($path)-1 # Don't want to always use substr when not required though. if ($ignore) { substr($path, 0, - $ignore) =~ s/X(?=X*\z)/$CHARS[ int( rand( $#CHARS ) ) ]/ge; } else { $path =~ s/X(?=X*\z)/$CHARS[ int( rand( $#CHARS ) ) ]/ge; } return $path; } # internal routine to check to see if the directory is safe # First checks to see if the directory is not owned by the # current user or root. Then checks to see if anyone else # can write to the directory and if so, checks to see if # it has the sticky bit set # Will not work on systems that do not support sticky bit #Args: directory path to check # Optionally: reference to scalar to contain error message # Returns true if the path is safe and false otherwise. # Returns undef if can not even run stat() on the path # This routine based on version written by Tom Christiansen # Presumably, by the time we actually attempt to create the # file or directory in this directory, it may not be safe # anymore... Have to run _is_safe directly after the open. sub _is_safe { my $path = shift; my $err_ref = shift; # Stat path my @info = stat($path); unless (scalar(@info)) { $$err_ref = "stat(path) returned no values"; return 0; }; return 1 if $^O eq 'VMS'; # owner delete control at file level # Check to see whether owner is neither superuser (or a system uid) nor me # Use the real uid from the $< variable # UID is in [4] if ($info[4] > File::Temp->top_system_uid() && $info[4] != $<) { Carp::cluck(sprintf "uid=$info[4] topuid=%s \$<=$< path='$path'", File::Temp->top_system_uid()); $$err_ref = "Directory owned neither by root nor the current user" if ref($err_ref); return 0; } # check whether group or other can write file # use 066 to detect either reading or writing # use 022 to check writability # Do it with S_IWOTH and S_IWGRP for portability (maybe) # mode is in info[2] if (($info[2] & &Fcntl::S_IWGRP) || # Is group writable? ($info[2] & &Fcntl::S_IWOTH) ) { # Is world writable? # Must be a directory unless (-d _) { $$err_ref = "Path ($path) is not a directory" if ref($err_ref); return 0; } # Must have sticky bit set unless (-k _) { $$err_ref = "Sticky bit not set on $path when dir is group|world writable" if ref($err_ref); return 0; } } return 1; } # Internal routine to check whether a directory is safe # for temp files. Safer than _is_safe since it checks for # the possibility of chown giveaway and if that is a possibility # checks each directory in the path to see if it is safe (with _is_safe) # If _PC_CHOWN_RESTRICTED is not set, does the full test of each # directory anyway. # Takes optional second arg as scalar ref to error reason sub _is_verysafe { # Need POSIX - but only want to bother if really necessary due to overhead require POSIX; my $path = shift; print "_is_verysafe testing $path\n" if $DEBUG; return 1 if $^O eq 'VMS'; # owner delete control at file level my $err_ref = shift; # Should Get the value of _PC_CHOWN_RESTRICTED if it is defined # and If it is not there do the extensive test my $chown_restricted; $chown_restricted = &POSIX::_PC_CHOWN_RESTRICTED() if eval { &POSIX::_PC_CHOWN_RESTRICTED(); 1}; # If chown_resticted is set to some value we should test it if (defined $chown_restricted) { # Return if the current directory is safe return _is_safe($path,$err_ref) if POSIX::sysconf( $chown_restricted ); } # To reach this point either, the _PC_CHOWN_RESTRICTED symbol # was not avialable or the symbol was there but chown giveaway # is allowed. Either way, we now have to test the entire tree for # safety. # Convert path to an absolute directory if required unless (File::Spec->file_name_is_absolute($path)) { $path = File::Spec->rel2abs($path); } # Split directory into components - assume no file my ($volume, $directories, undef) = File::Spec->splitpath( $path, 1); # Slightly less efficient than having a function in File::Spec # to chop off the end of a directory or even a function that # can handle ../ in a directory tree # Sometimes splitdir() returns a blank at the end # so we will probably check the bottom directory twice in some cases my @dirs = File::Spec->splitdir($directories); # Concatenate one less directory each time around foreach my $pos (0.. $#dirs) { # Get a directory name my $dir = File::Spec->catpath($volume, File::Spec->catdir(@dirs[0.. $#dirs - $pos]), '' ); print "TESTING DIR $dir\n" if $DEBUG; # Check the directory return 0 unless _is_safe($dir,$err_ref); } return 1; } # internal routine to determine whether unlink works on this # platform for files that are currently open. # Returns true if we can, false otherwise. # Currently WinNT, OS/2 and VMS can not unlink an opened file # On VMS this is because the O_EXCL flag is used to open the # temporary file. Currently I do not know enough about the issues # on VMS to decide whether O_EXCL is a requirement. sub _can_unlink_opened_file { if ($^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'VMS' || $^O eq 'dos' || $^O eq 'MacOS') { return 0; } else { return 1; } } # internal routine to decide which security levels are allowed # see safe_level() for more information on this # Controls whether the supplied security level is allowed # $cando = _can_do_level( $level ) sub _can_do_level { # Get security level my $level = shift; # Always have to be able to do STANDARD return 1 if $level == STANDARD; # Currently, the systems that can do HIGH or MEDIUM are identical if ( $^O eq 'MSWin32' || $^O eq 'os2' || $^O eq 'cygwin' || $^O eq 'dos' || $^O eq 'MacOS') { return 0; } else { return 1; } } # This routine sets up a deferred unlinking of a specified # filename and filehandle. It is used in the following cases: # - Called by unlink0 if an opened file can not be unlinked # - Called by tempfile() if files are to be removed on shutdown # - Called by tempdir() if directories are to be removed on shutdown # Arguments: # _deferred_unlink( $fh, $fname, $isdir ); # # - filehandle (so that it can be expclicitly closed if open # - filename (the thing we want to remove) # - isdir (flag to indicate that we are being given a directory) # [and hence no filehandle] # Status is not referred to since all the magic is done with an END block { # Will set up two lexical variables to contain all the files to be # removed. One array for files, another for directories # They will only exist in this block # This means we only have to set up a single END block to remove all files # @files_to_unlink contains an array ref with the filehandle and filename my (@files_to_unlink, @dirs_to_unlink); # Set up an end block to use these arrays END { # Files foreach my $file (@files_to_unlink) { # close the filehandle without checking its state # in order to make real sure that this is closed # if its already closed then I dont care about the answer # probably a better way to do this close($file->[0]); # file handle is [0] if (-f $file->[1]) { # file name is [1] unlink $file->[1] or warn "Error removing ".$file->[1]; } } # Dirs foreach my $dir (@dirs_to_unlink) { if (-d $dir) { rmtree($dir, $DEBUG, 1); } } } # This is the sub called to register a file for deferred unlinking # This could simply store the input parameters and defer everything # until the END block. For now we do a bit of checking at this # point in order to make sure that (1) we have a file/dir to delete # and (2) we have been called with the correct arguments. sub _deferred_unlink { croak 'Usage: _deferred_unlink($fh, $fname, $isdir)' unless scalar(@_) == 3; my ($fh, $fname, $isdir) = @_; warn "Setting up deferred removal of $fname\n" if $DEBUG; # If we have a directory, check that it is a directory if ($isdir) { if (-d $fname) { # Directory exists so store it # first on VMS turn []foo into [.foo] for rmtree $fname = VMS::Filespec::vmspath($fname) if $^O eq 'VMS'; push (@dirs_to_unlink, $fname); } else { carp "Request to remove directory $fname could not be completed since it does not exist!\n" if $^W; } } else { if (-f $fname) { # file exists so store handle and name for later removal push(@files_to_unlink, [$fh, $fname]); } else { carp "Request to remove file $fname could not be completed since it is not there!\n" if $^W; } } } } #line 978 sub tempfile { # Can not check for argument count since we can have any # number of args # Default options my %options = ( "DIR" => undef, # Directory prefix "SUFFIX" => '', # Template suffix "UNLINK" => 0, # Do not unlink file on exit "OPEN" => 1, # Open file ); # Check to see whether we have an odd or even number of arguments my $template = (scalar(@_) % 2 == 1 ? shift(@_) : undef); # Read the options and merge with defaults %options = (%options, @_) if @_; # First decision is whether or not to open the file if (! $options{"OPEN"}) { warn "tempfile(): temporary filename requested but not opened.\nPossibly unsafe, consider using tempfile() with OPEN set to true\n" if $^W; } if ($options{"DIR"} and $^O eq 'VMS') { # on VMS turn []foo into [.foo] for concatenation $options{"DIR"} = VMS::Filespec::vmspath($options{"DIR"}); } # Construct the template # Have a choice of trying to work around the mkstemp/mktemp/tmpnam etc # functions or simply constructing a template and using _gettemp() # explicitly. Go for the latter # First generate a template if not defined and prefix the directory # If no template must prefix the temp directory if (defined $template) { if ($options{"DIR"}) { $template = File::Spec->catfile($options{"DIR"}, $template); } } else { if ($options{"DIR"}) { $template = File::Spec->catfile($options{"DIR"}, TEMPXXX); } else { $template = File::Spec->catfile(File::Spec->tmpdir, TEMPXXX); } } # Now add a suffix $template .= $options{"SUFFIX"}; # Determine whether we should tell _gettemp to unlink the file # On unix this is irrelevant and can be worked out after the file is # opened (simply by unlinking the open filehandle). On Windows or VMS # we have to indicate temporary-ness when we open the file. In general # we only want a true temporary file if we are returning just the # filehandle - if the user wants the filename they probably do not # want the file to disappear as soon as they close it. # For this reason, tie unlink_on_close to the return context regardless # of OS. my $unlink_on_close = ( wantarray ? 0 : 1); # Create the file my ($fh, $path, $errstr); croak "Error in tempfile() using $template: $errstr" unless (($fh, $path) = _gettemp($template, "open" => $options{'OPEN'}, "mkdir"=> 0 , "unlink_on_close" => $unlink_on_close, "suffixlen" => length($options{'SUFFIX'}), "ErrStr" => \$errstr, ) ); # Set up an exit handler that can do whatever is right for the # system. This removes files at exit when requested explicitly or when # system is asked to unlink_on_close but is unable to do so because # of OS limitations. # The latter should be achieved by using a tied filehandle. # Do not check return status since this is all done with END blocks. _deferred_unlink($fh, $path, 0) if $options{"UNLINK"}; # Return if (wantarray()) { if ($options{'OPEN'}) { return ($fh, $path); } else { return (undef, $path); } } else { # Unlink the file. It is up to unlink0 to decide what to do with # this (whether to unlink now or to defer until later) unlink0($fh, $path) or croak "Error unlinking file $path using unlink0"; # Return just the filehandle. return $fh; } } #line 1148 # ' sub tempdir { # Can not check for argument count since we can have any # number of args # Default options my %options = ( "CLEANUP" => 0, # Remove directory on exit "DIR" => '', # Root directory "TMPDIR" => 0, # Use tempdir with template ); # Check to see whether we have an odd or even number of arguments my $template = (scalar(@_) % 2 == 1 ? shift(@_) : undef ); # Read the options and merge with defaults %options = (%options, @_) if @_; # Modify or generate the template # Deal with the DIR and TMPDIR options if (defined $template) { # Need to strip directory path if using DIR or TMPDIR if ($options{'TMPDIR'} || $options{'DIR'}) { # Strip parent directory from the filename # # There is no filename at the end $template = VMS::Filespec::vmspath($template) if $^O eq 'VMS'; my ($volume, $directories, undef) = File::Spec->splitpath( $template, 1); # Last directory is then our template $template = (File::Spec->splitdir($directories))[-1]; # Prepend the supplied directory or temp dir if ($options{"DIR"}) { $template = File::Spec->catdir($options{"DIR"}, $template); } elsif ($options{TMPDIR}) { # Prepend tmpdir $template = File::Spec->catdir(File::Spec->tmpdir, $template); } } } else { if ($options{"DIR"}) { $template = File::Spec->catdir($options{"DIR"}, TEMPXXX); } else { $template = File::Spec->catdir(File::Spec->tmpdir, TEMPXXX); } } # Create the directory my $tempdir; my $suffixlen = 0; if ($^O eq 'VMS') { # dir names can end in delimiters $template =~ m/([\.\]:>]+)$/; $suffixlen = length($1); } if ( ($^O eq 'MacOS') && (substr($template, -1) eq ':') ) { # dir name has a trailing ':' ++$suffixlen; } my $errstr; croak "Error in tempdir() using $template: $errstr" unless ((undef, $tempdir) = _gettemp($template, "open" => 0, "mkdir"=> 1 , "suffixlen" => $suffixlen, "ErrStr" => \$errstr, ) ); # Install exit handler; must be dynamic to get lexical if ( $options{'CLEANUP'} && -d $tempdir) { _deferred_unlink(undef, $tempdir, 1); } # Return the dir name return $tempdir; } #line 1268 sub mkstemp { croak "Usage: mkstemp(template)" if scalar(@_) != 1; my $template = shift; my ($fh, $path, $errstr); croak "Error in mkstemp using $template: $errstr" unless (($fh, $path) = _gettemp($template, "open" => 1, "mkdir"=> 0 , "suffixlen" => 0, "ErrStr" => \$errstr, ) ); if (wantarray()) { return ($fh, $path); } else { return $fh; } } #line 1309 sub mkstemps { croak "Usage: mkstemps(template, suffix)" if scalar(@_) != 2; my $template = shift; my $suffix = shift; $template .= $suffix; my ($fh, $path, $errstr); croak "Error in mkstemps using $template: $errstr" unless (($fh, $path) = _gettemp($template, "open" => 1, "mkdir"=> 0 , "suffixlen" => length($suffix), "ErrStr" => \$errstr, ) ); if (wantarray()) { return ($fh, $path); } else { return $fh; } } #line 1351 #' # for emacs sub mkdtemp { croak "Usage: mkdtemp(template)" if scalar(@_) != 1; my $template = shift; my $suffixlen = 0; if ($^O eq 'VMS') { # dir names can end in delimiters $template =~ m/([\.\]:>]+)$/; $suffixlen = length($1); } if ( ($^O eq 'MacOS') && (substr($template, -1) eq ':') ) { # dir name has a trailing ':' ++$suffixlen; } my ($junk, $tmpdir, $errstr); croak "Error creating temp directory from template $template\: $errstr" unless (($junk, $tmpdir) = _gettemp($template, "open" => 0, "mkdir"=> 1 , "suffixlen" => $suffixlen, "ErrStr" => \$errstr, ) ); return $tmpdir; } #line 1392 sub mktemp { croak "Usage: mktemp(template)" if scalar(@_) != 1; my $template = shift; my ($tmpname, $junk, $errstr); croak "Error getting name to temp file from template $template: $errstr" unless (($junk, $tmpname) = _gettemp($template, "open" => 0, "mkdir"=> 0 , "suffixlen" => 0, "ErrStr" => \$errstr, ) ); return $tmpname; } #line 1452 sub tmpnam { # Retrieve the temporary directory name my $tmpdir = File::Spec->tmpdir; croak "Error temporary directory is not writable" if $tmpdir eq ''; # Use a ten character template and append to tmpdir my $template = File::Spec->catfile($tmpdir, TEMPXXX); if (wantarray() ) { return mkstemp($template); } else { return mktemp($template); } } #line 1486 sub tmpfile { # Simply call tmpnam() in a list context my ($fh, $file) = tmpnam(); # Make sure file is removed when filehandle is closed # This will fail on NFS unlink0($fh, $file) or return undef; return $fh; } #line 1529 sub tempnam { croak 'Usage tempnam($dir, $prefix)' unless scalar(@_) == 2; my ($dir, $prefix) = @_; # Add a string to the prefix $prefix .= 'XXXXXXXX'; # Concatenate the directory to the file my $template = File::Spec->catfile($dir, $prefix); return mktemp($template); } #line 1591 sub unlink0 { croak 'Usage: unlink0(filehandle, filename)' unless scalar(@_) == 2; # Read args my ($fh, $path) = @_; warn "Unlinking $path using unlink0\n" if $DEBUG; # Stat the filehandle my @fh = stat $fh; if ($fh[3] > 1 && $^W) { carp "unlink0: fstat found too many links; SB=@fh" if $^W; } # Stat the path my @path = stat $path; unless (@path) { carp "unlink0: $path is gone already" if $^W; return; } # this is no longer a file, but may be a directory, or worse unless (-f _) { confess "panic: $path is no longer a file: SB=@fh"; } # Do comparison of each member of the array # On WinNT dev and rdev seem to be different # depending on whether it is a file or a handle. # Cannot simply compare all members of the stat return # Select the ones we can use my @okstat = (0..$#fh); # Use all by default if ($^O eq 'MSWin32') { @okstat = (1,2,3,4,5,7,8,9,10); } elsif ($^O eq 'os2') { @okstat = (0, 2..$#fh); } elsif ($^O eq 'VMS') { # device and file ID are sufficient @okstat = (0, 1); } elsif ($^O eq 'dos') { @okstat = (0,2..7,11..$#fh); } # Now compare each entry explicitly by number for (@okstat) { print "Comparing: $_ : $fh[$_] and $path[$_]\n" if $DEBUG; # Use eq rather than == since rdev, blksize, and blocks (6, 11, # and 12) will be '' on platforms that do not support them. This # is fine since we are only comparing integers. unless ($fh[$_] eq $path[$_]) { warn "Did not match $_ element of stat\n" if $DEBUG; return 0; } } # attempt remove the file (does not work on some platforms) if (_can_unlink_opened_file()) { # XXX: do *not* call this on a directory; possible race # resulting in recursive removal croak "unlink0: $path has become a directory!" if -d $path; unlink($path) or return 0; # Stat the filehandle @fh = stat $fh; print "Link count = $fh[3] \n" if $DEBUG; # Make sure that the link count is zero # - Cygwin provides deferred unlinking, however, # on Win9x the link count remains 1 # On NFS the link count may still be 1 but we cant know that # we are on NFS return ( $fh[3] == 0 or $^O eq 'cygwin' ? 1 : 0); } else { _deferred_unlink($fh, $path, 0); return 1; } } #line 1754 { # protect from using the variable itself my $LEVEL = STANDARD; sub safe_level { my $self = shift; if (@_) { my $level = shift; if (($level != STANDARD) && ($level != MEDIUM) && ($level != HIGH)) { carp "safe_level: Specified level ($level) not STANDARD, MEDIUM or HIGH - ignoring\n" if $^W; } else { # Dont allow this on perl 5.005 or earlier if ($] < 5.006 && $level != STANDARD) { # Cant do MEDIUM or HIGH checks croak "Currently requires perl 5.006 or newer to do the safe checks"; } # Check that we are allowed to change level # Silently ignore if we can not. $LEVEL = $level if _can_do_level($level); } } return $LEVEL; } } #line 1801 { my $TopSystemUID = 10; sub top_system_uid { my $self = shift; if (@_) { my $newuid = shift; croak "top_system_uid: UIDs should be numeric" unless $newuid =~ /^\d+$/s; $TopSystemUID = $newuid; } return $TopSystemUID; } } #line 1874 1; FILE25154f80/List/Util.pm6#line 1 "/usr/lib/perl5/5.8.0/List/Util.pm" # List::Util.pm # # Copyright (c) 1997-2001 Graham Barr . All rights reserved. # This program is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. package List::Util; require Exporter; require DynaLoader; our @ISA = qw(Exporter DynaLoader); our @EXPORT_OK = qw(first min max minstr maxstr reduce sum shuffle); our $VERSION = "1.07_00"; our $XS_VERSION = $VERSION; $VERSION = eval $VERSION; bootstrap List::Util $XS_VERSION; 1; __END__ #line 195 FILE0e3542dc/Scalar/Util.pma#line 1 "/usr/lib/perl5/5.8.0/Scalar/Util.pm" # Scalar::Util.pm # # Copyright (c) 1997-2001 Graham Barr . All rights reserved. # This program is free software; you can redistribute it and/or # modify it under the same terms as Perl itself. package Scalar::Util; require Exporter; require List::Util; # List::Util loads the XS our @ISA = qw(Exporter); our @EXPORT_OK = qw(blessed dualvar reftype weaken isweak tainted readonly openhandle); our $VERSION = $List::Util::VERSION; sub openhandle ($) { my $fh = shift; my $rt = reftype($fh) || ''; return defined(fileno($fh)) ? $fh : undef if $rt eq 'IO'; if (reftype(\$fh) eq 'GLOB') { # handle openhandle(*DATA) $fh = \(my $tmp=$fh); } elsif ($rt ne 'GLOB') { return undef; } (tied(*$fh) or defined(fileno($fh))) ? $fh : undef; } 1; __END__ #line 171 FILE8282b802/SelectSaver.pm#line 1 "/usr/lib/perl5/5.8.0/SelectSaver.pm" package SelectSaver; our $VERSION = '1.00'; #line 36 require 5.000; use Carp; use Symbol; sub new { @_ >= 1 && @_ <= 2 or croak 'usage: new SelectSaver [FILEHANDLE]'; my $fh = select; my $self = bless [$fh], $_[0]; select qualify($_[1], caller) if @_ > 1; $self; } sub DESTROY { my $this = $_[0]; select $$this[0]; } 1; FILEc7548358/Symbol.pme#line 1 "/usr/lib/perl5/5.8.0/Symbol.pm" package Symbol; #line 72 BEGIN { require 5.005; } require Exporter; @ISA = qw(Exporter); @EXPORT = qw(gensym ungensym qualify qualify_to_ref); @EXPORT_OK = qw(delete_package geniosym); $VERSION = 1.04; my $genpkg = "Symbol::"; my $genseq = 0; my %global = map {$_ => 1} qw(ARGV ARGVOUT ENV INC SIG STDERR STDIN STDOUT); # # Note that we never _copy_ the glob; we just make a ref to it. # If we did copy it, then SVf_FAKE would be set on the copy, and # glob-specific behaviors (e.g. C<*$ref = \&func>) wouldn't work. # sub gensym () { my $name = "GEN" . $genseq++; my $ref = \*{$genpkg . $name}; delete $$genpkg{$name}; $ref; } sub geniosym () { my $sym = gensym(); # force the IO slot to be filled select(select $sym); *$sym{IO}; } sub ungensym ($) {} sub qualify ($;$) { my ($name) = @_; if (!ref($name) && index($name, '::') == -1 && index($name, "'") == -1) { my $pkg; # Global names: special character, "^xyz", or other. if ($name =~ /^(([^a-z])|(\^[a-z_]+))\z/i || $global{$name}) { # RGS 2001-11-05 : translate leading ^X to control-char $name =~ s/^\^([a-z_])/'qq(\c'.$1.')'/eei; $pkg = "main"; } else { $pkg = (@_ > 1) ? $_[1] : caller; } $name = $pkg . "::" . $name; } $name; } sub qualify_to_ref ($;$) { return \*{ qualify $_[0], @_ > 1 ? $_[1] : caller }; } # # of Safe.pm lineage # sub delete_package ($) { my $pkg = shift; # expand to full symbol table name if needed unless ($pkg =~ /^main::.*::$/) { $pkg = "main$pkg" if $pkg =~ /^::/; $pkg = "main::$pkg" unless $pkg =~ /^main::/; $pkg .= '::' unless $pkg =~ /::$/; } my($stem, $leaf) = $pkg =~ m/(.*::)(\w+::)$/; my $stem_symtab = *{$stem}{HASH}; return unless defined $stem_symtab and exists $stem_symtab->{$leaf}; # free all the symbols in the package my $leaf_symtab = *{$stem_symtab->{$leaf}}{HASH}; foreach my $name (keys %$leaf_symtab) { undef *{$pkg . $name}; } # delete the symbol table %$leaf_symtab = (); delete $stem_symtab->{$leaf}; } 1; FILE15f95aeb/Time/Local.pm #line 1 "/usr/lib/perl5/5.8.0/Time/Local.pm" package Time::Local; use 5.006; require Exporter; use Carp; use Config; use strict; use integer; our $VERSION = '1.04'; our @ISA = qw( Exporter ); our @EXPORT = qw( timegm timelocal ); our @EXPORT_OK = qw( timegm_nocheck timelocal_nocheck ); my @MonthDays = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31); # Determine breakpoint for rolling century my $ThisYear = (localtime())[5]; my $Breakpoint = ($ThisYear + 50) % 100; my $NextCentury = $ThisYear - $ThisYear % 100; $NextCentury += 100 if $Breakpoint < 50; my $Century = $NextCentury - 100; my $SecOff = 0; my (%Options, %Cheat); my $MaxInt = ((1<<(8 * $Config{intsize} - 2))-1)*2 + 1; my $MaxDay = int(($MaxInt-43200)/86400)-1; # Determine the EPOC day for this machine my $Epoc = 0; if ($^O eq 'vos') { # work around posix-977 -- VOS doesn't handle dates in # the range 1970-1980. $Epoc = _daygm((0, 0, 0, 1, 0, 70, 4, 0)); } elsif ($^O eq 'MacOS') { no integer; $MaxDay *=2 if $^O eq 'MacOS'; # time_t unsigned ... quick hack? # MacOS time() is seconds since 1 Jan 1904, localtime # so we need to calculate an offset to apply later $Epoc = 693901; $SecOff = timelocal(localtime(0)) - timelocal(gmtime(0)); $Epoc += _daygm(gmtime(0)); } else { $Epoc = _daygm(gmtime(0)); } %Cheat=(); # clear the cache as epoc has changed sub _daygm { $_[3] + ($Cheat{pack("ss",@_[4,5])} ||= do { my $month = ($_[4] + 10) % 12; my $year = $_[5] + 1900 - $month/10; 365*$year + $year/4 - $year/100 + $year/400 + ($month*306 + 5)/10 - $Epoc }); } sub _timegm { my $sec = $SecOff + $_[0] + 60 * $_[1] + 3600 * $_[2]; no integer; $sec + 86400 * &_daygm; } sub timegm { my ($sec,$min,$hour,$mday,$month,$year) = @_; if ($year >= 1000) { $year -= 1900; } elsif ($year < 100 and $year >= 0) { $year += ($year > $Breakpoint) ? $Century : $NextCentury; } unless ($Options{no_range_check}) { if (abs($year) >= 0x7fff) { $year += 1900; croak "Cannot handle date ($sec, $min, $hour, $mday, $month, $year)"; } croak "Month '$month' out of range 0..11" if $month > 11 or $month < 0; my $md = $MonthDays[$month]; ++$md unless $month != 1 or $year % 4 or !($year % 400); croak "Day '$mday' out of range 1..$md" if $mday > $md or $mday < 1; croak "Hour '$hour' out of range 0..23" if $hour > 23 or $hour < 0; croak "Minute '$min' out of range 0..59" if $min > 59 or $min < 0; croak "Second '$sec' out of range 0..59" if $sec > 59 or $sec < 0; } my $days = _daygm(undef, undef, undef, $mday, $month, $year); unless ($Options{no_range_check} or abs($days) < $MaxDay) { $year += 1900; croak "Cannot handle date ($sec, $min, $hour, $mday, $month, $year)"; } $sec += $SecOff + 60*$min + 3600*$hour; no integer; $sec + 86400*$days; } sub timegm_nocheck { local $Options{no_range_check} = 1; &timegm; } sub timelocal { no integer; my $ref_t = &timegm; my $loc_t = _timegm(localtime($ref_t)); # Is there a timezone offset from GMT or are we done my $zone_off = $ref_t - $loc_t or return $loc_t; # Adjust for timezone $loc_t = $ref_t + $zone_off; # Are we close to a DST change or are we done my $dst_off = $ref_t - _timegm(localtime($loc_t)) or return $loc_t; # Adjust for DST change $loc_t + $dst_off; } sub timelocal_nocheck { local $Options{no_range_check} = 1; &timelocal; } 1; __END__ #line 255 FILEebcd47c1/base.pmw#line 1 "/usr/lib/perl5/5.8.0/base.pm" #line 44 package base; use 5.006_001; our $VERSION = "1.03"; sub import { my $class = shift; my $fields_base; my $pkg = caller(0); foreach my $base (@_) { next if $pkg->isa($base); my $vglob; if ($vglob = ${"$base\::"}{VERSION} and *$vglob{SCALAR}) { $$vglob = "-1, set by base.pm" unless defined $$vglob; } else { eval "require $base"; # Only ignore "Can't locate" errors from our eval require. # Other fatal errors (syntax etc) must be reported. die if $@ && $@ !~ /^Can't locate .*? at \(eval /; unless (%{"$base\::"}) { require Carp; Carp::croak("Base class package \"$base\" is empty.\n", "\t(Perhaps you need to 'use' the module ", "which defines that package first.)"); } ${"$base\::VERSION"} = "-1, set by base.pm" unless defined ${"$base\::VERSION"}; } push @{"$pkg\::ISA"}, $base; # A simple test like (defined %{"$base\::FIELDS"}) will # sometimes produce typo warnings because it would create # the hash if it was not present before. my $fglob; if ($fglob = ${"$base\::"}{"FIELDS"} and *$fglob{HASH}) { if ($fields_base) { require Carp; Carp::croak("Can't multiply inherit %FIELDS"); } else { $fields_base = $base; } } } if ($fields_base) { require fields; fields::inherit($pkg, $fields_base); } } 1; FILE0036d0fa/bytes.pm;#line 1 "/usr/lib/perl5/5.8.0/bytes.pm" package bytes; our $VERSION = '1.00'; $bytes::hint_bits = 0x00000008; sub import { $^H |= $bytes::hint_bits; } sub unimport { $^H &= ~$bytes::hint_bits; } sub AUTOLOAD { require "bytes_heavy.pl"; goto &$AUTOLOAD; } sub length ($); 1; __END__ #line 69 FILE78260289/constant.pm #line 1 "/usr/lib/perl5/5.8.0/constant.pm" package constant; use strict; use 5.006_00; use warnings::register; our($VERSION, %declared); $VERSION = '1.04'; #======================================================================= # Some names are evil choices. my %keywords = map +($_, 1), qw{ BEGIN INIT CHECK END DESTROY AUTOLOAD }; my %forced_into_main = map +($_, 1), qw{ STDIN STDOUT STDERR ARGV ARGVOUT ENV INC SIG }; my %forbidden = (%keywords, %forced_into_main); #======================================================================= # import() - import symbols into user's namespace # # What we actually do is define a function in the caller's namespace # which returns the value. The function we create will normally # be inlined as a constant, thereby avoiding further sub calling # overhead. #======================================================================= sub import { my $class = shift; return unless @_; # Ignore 'use constant;' my %constants = (); my $multiple = ref $_[0]; if ( $multiple ) { if (ref $_[0] ne 'HASH') { require Carp; Carp::croak("Invalid reference type '".ref(shift)."' not 'HASH'"); } %constants = %{+shift}; } else { $constants{+shift} = undef; } foreach my $name ( keys %constants ) { unless (defined $name) { require Carp; Carp::croak("Can't use undef as constant name"); } my $pkg = caller; # Normal constant name if ($name =~ /^_?[^\W_0-9]\w*\z/ and !$forbidden{$name}) { # Everything is okay # Name forced into main, but we're not in main. Fatal. } elsif ($forced_into_main{$name} and $pkg ne 'main') { require Carp; Carp::croak("Constant name '$name' is forced into main::"); # Starts with double underscore. Fatal. } elsif ($name =~ /^__/) { require Carp; Carp::croak("Constant name '$name' begins with '__'"); # Maybe the name is tolerable } elsif ($name =~ /^[A-Za-z_]\w*\z/) { # Then we'll warn only if you've asked for warnings if (warnings::enabled()) { if ($keywords{$name}) { warnings::warn("Constant name '$name' is a Perl keyword"); } elsif ($forced_into_main{$name}) { warnings::warn("Constant name '$name' is " . "forced into package main::"); } else { # Catch-all - what did I miss? If you get this error, # please let me know what your constant's name was. # Write to . Thanks! warnings::warn("Constant name '$name' has unknown problems"); } } # Looks like a boolean # use constant FRED == fred; } elsif ($name =~ /^[01]?\z/) { require Carp; if (@_) { Carp::croak("Constant name '$name' is invalid"); } else { Carp::croak("Constant name looks like boolean value"); } } else { # Must have bad characters require Carp; Carp::croak("Constant name '$name' has invalid characters"); } { no strict 'refs'; my $full_name = "${pkg}::$name"; $declared{$full_name}++; if ($multiple) { my $scalar = $constants{$name}; *$full_name = sub () { $scalar }; } else { if (@_ == 1) { my $scalar = $_[0]; *$full_name = sub () { $scalar }; } elsif (@_) { my @list = @_; *$full_name = sub () { @list }; } else { *$full_name = sub () { }; } } } } } 1; __END__ #line 346 FILE9fa6541c/Config.pm#line 1 "/usr/lib/perl5/5.8.0/i386-linux-thread-multi/Config.pm" package Config; use Exporter (); @EXPORT = qw(%Config); @EXPORT_OK = qw(myconfig config_sh config_vars); # Define our own import method to avoid pulling in the full Exporter: sub import { my $pkg = shift; @_ = @EXPORT unless @_; my @func = grep {$_ ne '%Config'} @_; local $Exporter::ExportLevel = 1; Exporter::import('Config', @func) if @func; return if @func == @_; my $callpkg = caller(0); *{"$callpkg\::Config"} = \%Config; } die "Perl lib version (v5.8.0) doesn't match executable version ($])" unless $^V; $^V eq v5.8.0 or die "Perl lib version (v5.8.0) doesn't match executable version (" . (sprintf "v%vd",$^V) . ")"; # This file was created by configpm when Perl was built. Any changes # made to this file will be lost the next time perl is built. ## ## This file was produced by running the Configure script. It holds all the ## definitions figured out by Configure. Should you modify one of these values, ## do not forget to propagate your changes by running "Configure -der". You may ## instead choose to run each of the .SH files by yourself, or "Configure -S". ## # ## Package name : perl5 ## Source directory : . ## Configuration time: Sun Sep 1 23:55:07 EDT 2002 ## Configured by : bhcompile ## Target system : linux daffy.perf.redhat.com 2.4.18-11smp #1 smp thu aug 15 06:41:59 edt 2002 i686 i686 i386 gnulinux # ## Configure command line arguments. #PERL_PATCHLEVEL= my $config_sh = <<'!END!'; archlibexp='/usr/lib/perl5/5.8.0/i386-linux-thread-multi' archname='i386-linux-thread-multi' cc='gcc' ccflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -I/usr/include/gdbm' cppflags='-D_REENTRANT -D_GNU_SOURCE -fno-strict-aliasing -I/usr/include/gdbm' dlsrc='dl_dlopen.xs' dynamic_ext='B ByteLoader Cwd DB_File Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call GDBM_File I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared' extensions='B ByteLoader Cwd DB_File Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call GDBM_File I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared Errno' installarchlib='/usr/lib/perl5/5.8.0/i386-linux-thread-multi' installprivlib='/usr/lib/perl5/5.8.0' libpth='/usr/local/lib /lib /usr/lib' libs='-lnsl -lgdbm -ldb -ldl -lm -lpthread -lc -lcrypt -lutil' osname='linux' osvers='2.4.18-11smp' prefix='/usr' privlibexp='/usr/lib/perl5/5.8.0' sharpbang='#!' shsharp='true' sig_name='ZERO HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS NUM32 NUM33 NUM34 RTMIN NUM36 NUM37 NUM38 NUM39 NUM40 NUM41 NUM42 NUM43 NUM44 NUM45 NUM46 NUM47 NUM48 NUM49 NUM50 NUM51 NUM52 NUM53 NUM54 NUM55 NUM56 NUM57 NUM58 NUM59 NUM60 NUM61 NUM62 RTMAX IOT CLD POLL UNUSED ' sig_num='0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 6 17 29 31 ' so='so' startsh='#!/bin/sh' static_ext=' ' Author='' CONFIG='true' Date='$Date' Header='' Id='$Id' Locker='' Log='$Log' Mcc='Mcc' PATCHLEVEL='8' PERL_API_REVISION='5' PERL_API_SUBVERSION='0' PERL_API_VERSION='8' PERL_CONFIG_SH='true' PERL_REVISION='5' PERL_SUBVERSION='0' PERL_VERSION='8' RCSfile='$RCSfile' Revision='$Revision' SUBVERSION='0' Source='' State='' _a='.a' _exe='' _o='.o' afs='false' afsroot='/afs' alignbytes='4' ansi2knr='' aphostname='' api_revision='5' api_subversion='0' api_version='8' api_versionstring='5.8.0' ar='ar' archlib='/usr/lib/perl5/5.8.0/i386-linux-thread-multi' archname64='' archobjs='' asctime_r_proto='REENTRANT_PROTO_B_SB' awk='awk' baserev='5.0' bash='' bin='/usr/bin' binexp='/usr/bin' bison='bison' byacc='byacc' byteorder='1234' c='' castflags='0' cat='cat' cccdlflags='-fpic' ccdlflags='-rdynamic -Wl,-rpath,/usr/lib/perl5/5.8.0/i386-linux-thread-multi/CORE' ccflags_uselargefiles='-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64' ccname='gcc' ccsymbols='__GNUC_MINOR__=2 __GNUC_PATCHLEVEL__=0 __GXX_ABI_VERSION=102 __NO_INLINE__=1 __STDC_HOSTED__=1 __gnu_linux__=1 __i386=1 __i386__=1 __linux=1 __linux__=1 __tune_i386__=1 __unix=1 __unix__=1 cpu=i386 machine=i386 system=posix' ccversion='' cf_by='bhcompile' cf_email='bhcompile@localhost.localdomain' cf_time='Sun Sep 1 23:55:07 EDT 2002' charsize='1' chgrp='' chmod='chmod' chown='' clocktype='clock_t' comm='comm' compress='' config_arg0='Configure' config_arg10='-Dvendorprefix=/usr' config_arg11='-Dsiteprefix=/usr' config_arg12='-Duseshrplib' config_arg13='-Dusethreads' config_arg14='-Duseithreads' config_arg15='-Duselargefiles' config_arg16='-Dd_dosuid' config_arg17='-Dd_semctl_semun' config_arg18='-Di_db' config_arg19='-Ui_ndbm' config_arg1='-des' config_arg20='-Di_gdbm' config_arg21='-Di_shadow' config_arg22='-Di_syslog' config_arg23='-Dman3ext=3pm' config_arg24='-Duseperlio' config_arg25='-Dinstallusrbinperl' config_arg26='-Ubincompat5005' config_arg27='-Uversiononly' config_arg28='-Dpager=/usr/bin/less -isr' config_arg2='-Doptimize=-O2 -march=i386 -mcpu=i686' config_arg3='-Dmyhostname=localhost' config_arg4='-Dperladmin=root@localhost' config_arg5='-Dcc=gcc' config_arg6='-Dcf_by=Red Hat, Inc.' config_arg7='-Dinstallprefix=/usr' config_arg8='-Dprefix=/usr' config_arg9='-Darchname=i386-linux' config_argc='28' config_args='-des -Doptimize=-O2 -march=i386 -mcpu=i686 -Dmyhostname=localhost -Dperladmin=root@localhost -Dcc=gcc -Dcf_by=Red Hat, Inc. -Dinstallprefix=/usr -Dprefix=/usr -Darchname=i386-linux -Dvendorprefix=/usr -Dsiteprefix=/usr -Duseshrplib -Dusethreads -Duseithreads -Duselargefiles -Dd_dosuid -Dd_semctl_semun -Di_db -Ui_ndbm -Di_gdbm -Di_shadow -Di_syslog -Dman3ext=3pm -Duseperlio -Dinstallusrbinperl -Ubincompat5005 -Uversiononly -Dpager=/usr/bin/less -isr' contains='grep' cp='cp' cpio='' cpp='cpp' cpp_stuff='42' cppccsymbols='__ELF__=1 __GNUC__=3 i386=1 linux=1 unix=1' cpplast='-' cppminus='-' cpprun='gcc -E' cppstdin='gcc -E' cppsymbols='_FILE_OFFSET_BITS=64 __GLIBC__=2 __GLIBC_MINOR__=3 __GNUC_MINOR__=2 __GNU_LIBRARY__=6 _GNU_SOURCE=1 _LARGEFILE64_SOURCE=1 _LARGEFILE_SOURCE=1 _POSIX_C_SOURCE=199506 _POSIX_SOURCE=1 _REENTRANT=1 __STDC__=1 __USE_BSD=1 __USE_FILE_OFFSET64=1 __USE_GNU=1 __USE_LARGEFILE=1 __USE_LARGEFILE64=1 __USE_MISC=1 __USE_POSIX=1 __USE_POSIX199309=1 __USE_POSIX199506=1 __USE_POSIX2=1 __USE_REENTRANT=1 __USE_SVID=1 __USE_UNIX98=1 __USE_XOPEN=1 __USE_XOPEN_EXTENDED=1 _XOPEN_SOURCE=600 _XOPEN_SOURCE_EXTENDED=1 __i386=1 __i386__=1 __linux=1 __linux__=1 __unix=1 __unix__=1' crypt_r_proto='REENTRANT_PROTO_B_CCS' cryptlib='' csh='csh' ctermid_r_proto='0' ctime_r_proto='REENTRANT_PROTO_B_SB' d_Gconvert='gcvt((x),(n),(b))' d_PRIEUldbl='define' d_PRIFUldbl='define' d_PRIGUldbl='define' d_PRIXU64='define' d_PRId64='define' d_PRIeldbl='define' d_PRIfldbl='define' d_PRIgldbl='define' d_PRIi64='define' d_PRIo64='define' d_PRIu64='define' d_PRIx64='define' d_SCNfldbl='define' d__fwalk='undef' d_access='define' d_accessx='undef' d_alarm='define' d_archlib='define' d_asctime_r='define' d_atolf='undef' d_atoll='define' d_attribut='define' d_bcmp='define' d_bcopy='define' d_bsd='undef' d_bsdgetpgrp='undef' d_bsdsetpgrp='undef' d_bzero='define' d_casti32='undef' d_castneg='define' d_charvspr='undef' d_chown='define' d_chroot='define' d_chsize='undef' d_class='undef' d_closedir='define' d_cmsghdr_s='define' d_const='define' d_crypt='define' d_crypt_r='define' d_csh='define' d_ctermid_r='undef' d_ctime_r='define' d_cuserid='define' d_dbl_dig='define' d_dbminitproto='undef' d_difftime='define' d_dirfd='define' d_dirnamlen='undef' d_dlerror='define' d_dlopen='define' d_dlsymun='undef' d_dosuid='define' d_drand48_r='define' d_drand48proto='define' d_dup2='define' d_eaccess='undef' d_endgrent='define' d_endgrent_r='undef' d_endhent='define' d_endhostent_r='undef' d_endnent='define' d_endnetent_r='undef' d_endpent='define' d_endprotoent_r='undef' d_endpwent='define' d_endpwent_r='undef' d_endsent='define' d_endservent_r='undef' d_eofnblk='define' d_eunice='undef' d_fchdir='define' d_fchmod='define' d_fchown='define' d_fcntl='define' d_fcntl_can_lock='define' d_fd_macros='define' d_fd_set='define' d_fds_bits='define' d_fgetpos='define' d_finite='define' d_finitel='define' d_flexfnam='define' d_flock='define' d_flockproto='define' d_fork='define' d_fp_class='undef' d_fpathconf='define' d_fpclass='undef' d_fpclassify='undef' d_fpclassl='undef' d_fpos64_t='undef' d_frexpl='define' d_fs_data_s='undef' d_fseeko='define' d_fsetpos='define' d_fstatfs='define' d_fstatvfs='define' d_fsync='define' d_ftello='define' d_ftime='undef' d_getcwd='define' d_getespwnam='undef' d_getfsstat='undef' d_getgrent='define' d_getgrent_r='define' d_getgrgid_r='define' d_getgrnam_r='define' d_getgrps='define' d_gethbyaddr='define' d_gethbyname='define' d_gethent='define' d_gethname='define' d_gethostbyaddr_r='undef' d_gethostbyname_r='define' d_gethostent_r='define' d_gethostprotos='define' d_getitimer='define' d_getlogin='define' d_getlogin_r='define' d_getmnt='undef' d_getmntent='define' d_getnbyaddr='define' d_getnbyname='define' d_getnent='define' d_getnetbyaddr_r='undef' d_getnetbyname_r='define' d_getnetent_r='define' d_getnetprotos='define' d_getpagsz='define' d_getpbyname='define' d_getpbynumber='define' d_getpent='define' d_getpgid='define' d_getpgrp2='undef' d_getpgrp='define' d_getppid='define' d_getprior='define' d_getprotobyname_r='define' d_getprotobynumber_r='define' d_getprotoent_r='define' d_getprotoprotos='define' d_getprpwnam='undef' d_getpwent='define' d_getpwent_r='define' d_getpwnam_r='define' d_getpwuid_r='define' d_getsbyname='define' d_getsbyport='define' d_getsent='define' d_getservbyname_r='define' d_getservbyport_r='define' d_getservent_r='define' d_getservprotos='define' d_getspnam='define' d_getspnam_r='define' d_gettimeod='define' d_gmtime_r='define' d_gnulibc='define' d_grpasswd='define' d_hasmntopt='define' d_htonl='define' d_index='undef' d_inetaton='define' d_int64_t='define' d_isascii='define' d_isfinite='undef' d_isinf='define' d_isnan='define' d_isnanl='define' d_killpg='define' d_lchown='define' d_ldbl_dig='define' d_link='define' d_localtime_r='define' d_locconv='define' d_lockf='define' d_longdbl='define' d_longlong='define' d_lseekproto='define' d_lstat='define' d_madvise='define' d_mblen='define' d_mbstowcs='define' d_mbtowc='define' d_memchr='define' d_memcmp='define' d_memcpy='define' d_memmove='define' d_memset='define' d_mkdir='define' d_mkdtemp='define' d_mkfifo='define' d_mkstemp='define' d_mkstemps='undef' d_mktime='define' d_mmap='define' d_modfl='define' d_modfl_pow32_bug='undef' d_mprotect='define' d_msg='define' d_msg_ctrunc='define' d_msg_dontroute='define' d_msg_oob='define' d_msg_peek='define' d_msg_proxy='define' d_msgctl='define' d_msgget='define' d_msghdr_s='define' d_msgrcv='define' d_msgsnd='define' d_msync='define' d_munmap='define' d_mymalloc='undef' d_nice='define' d_nl_langinfo='define' d_nv_preserves_uv='define' d_off64_t='define' d_old_pthread_create_joinable='undef' d_oldpthreads='undef' d_oldsock='undef' d_open3='define' d_pathconf='define' d_pause='define' d_perl_otherlibdirs='undef' d_phostname='undef' d_pipe='define' d_poll='define' d_portable='define' d_procselfexe='define' d_pthread_atfork='define' d_pthread_yield='define' d_pwage='undef' d_pwchange='undef' d_pwclass='undef' d_pwcomment='undef' d_pwexpire='undef' d_pwgecos='define' d_pwpasswd='define' d_pwquota='undef' d_qgcvt='define' d_quad='define' d_random_r='undef' d_readdir64_r='define' d_readdir='define' d_readdir_r='define' d_readlink='define' d_readv='define' d_recvmsg='define' d_rename='define' d_rewinddir='define' d_rmdir='define' d_safebcpy='undef' d_safemcpy='undef' d_sanemcmp='define' d_sbrkproto='define' d_sched_yield='define' d_scm_rights='define' d_seekdir='define' d_select='define' d_sem='define' d_semctl='define' d_semctl_semid_ds='define' d_semctl_semun='define' d_semget='define' d_semop='define' d_sendmsg='define' d_setegid='define' d_seteuid='define' d_setgrent='define' d_setgrent_r='undef' d_setgrps='define' d_sethent='define' d_sethostent_r='undef' d_setitimer='define' d_setlinebuf='define' d_setlocale='define' d_setlocale_r='undef' d_setnent='define' d_setnetent_r='undef' d_setpent='define' d_setpgid='define' d_setpgrp2='undef' d_setpgrp='define' d_setprior='define' d_setproctitle='undef' d_setprotoent_r='undef' d_setpwent='define' d_setpwent_r='undef' d_setregid='define' d_setresgid='define' d_setresuid='define' d_setreuid='define' d_setrgid='undef' d_setruid='undef' d_setsent='define' d_setservent_r='undef' d_setsid='define' d_setvbuf='define' d_sfio='undef' d_shm='define' d_shmat='define' d_shmatprototype='define' d_shmctl='define' d_shmdt='define' d_shmget='define' d_sigaction='define' d_sigprocmask='define' d_sigsetjmp='define' d_sockatmark='define' d_sockatmarkproto='define' d_socket='define' d_socklen_t='define' d_sockpair='define' d_socks5_init='undef' d_sqrtl='define' d_srand48_r='define' d_srandom_r='define' d_sresgproto='undef' d_sresuproto='undef' d_statblks='define' d_statfs_f_flags='undef' d_statfs_s='define' d_statvfs='define' d_stdio_cnt_lval='undef' d_stdio_ptr_lval='undef' d_stdio_ptr_lval_nochange_cnt='undef' d_stdio_ptr_lval_sets_cnt='undef' d_stdio_stream_array='undef' d_stdiobase='undef' d_stdstdio='undef' d_strchr='define' d_strcoll='define' d_strctcpy='define' d_strerrm='strerror(e)' d_strerror='define' d_strerror_r='define' d_strftime='define' d_strtod='define' d_strtol='define' d_strtold='define' d_strtoll='define' d_strtoq='define' d_strtoul='define' d_strtoull='define' d_strtouq='define' d_strxfrm='define' d_suidsafe='undef' d_symlink='define' d_syscall='define' d_syscallproto='define' d_sysconf='define' d_sysernlst='' d_syserrlst='define' d_system='define' d_tcgetpgrp='define' d_tcsetpgrp='define' d_telldir='define' d_telldirproto='define' d_time='define' d_times='define' d_tm_tm_gmtoff='define' d_tm_tm_zone='define' d_tmpnam_r='define' d_truncate='define' d_ttyname_r='define' d_tzname='define' d_u32align='define' d_ualarm='define' d_umask='define' d_uname='define' d_union_semun='undef' d_unordered='undef' d_usleep='define' d_usleepproto='define' d_ustat='define' d_vendorarch='define' d_vendorbin='define' d_vendorlib='define' d_vfork='undef' d_void_closedir='undef' d_voidsig='define' d_voidtty='' d_volatile='define' d_vprintf='define' d_wait4='define' d_waitpid='define' d_wcstombs='define' d_wctomb='define' d_writev='define' d_xenix='undef' date='date' db_hashtype='u_int32_t' db_prefixtype='size_t' db_version_major='4' db_version_minor='0' db_version_patch='14' defvoidused='15' direntrytype='struct dirent' dlext='so' doublesize='8' drand01='drand48()' drand48_r_proto='REENTRANT_PROTO_I_ST' eagain='EAGAIN' ebcdic='undef' echo='echo' egrep='egrep' emacs='' endgrent_r_proto='0' endhostent_r_proto='0' endnetent_r_proto='0' endprotoent_r_proto='0' endpwent_r_proto='0' endservent_r_proto='0' eunicefix=':' exe_ext='' expr='expr' extras='' fflushNULL='define' fflushall='undef' find='' firstmakefile='makefile' flex='' fpossize='16' fpostype='fpos_t' freetype='void' from=':' full_ar='/usr/bin/ar' full_csh='/bin/csh' full_sed='/bin/sed' gccosandvers='' gccversion='3.2 20020822 (Red Hat Linux Rawhide 3.2-5)' getgrent_r_proto='REENTRANT_PROTO_I_SBWR' getgrgid_r_proto='REENTRANT_PROTO_I_TSBWR' getgrnam_r_proto='REENTRANT_PROTO_I_CSBWR' gethostbyaddr_r_proto='0' gethostbyname_r_proto='REENTRANT_PROTO_I_CSBWRE' gethostent_r_proto='REENTRANT_PROTO_I_SBWRE' getlogin_r_proto='REENTRANT_PROTO_I_BW' getnetbyaddr_r_proto='0' getnetbyname_r_proto='REENTRANT_PROTO_I_CSBWRE' getnetent_r_proto='REENTRANT_PROTO_I_SBWRE' getprotobyname_r_proto='REENTRANT_PROTO_I_CSBWR' getprotobynumber_r_proto='REENTRANT_PROTO_I_ISBWR' getprotoent_r_proto='REENTRANT_PROTO_I_SBWR' getpwent_r_proto='REENTRANT_PROTO_I_SBWR' getpwnam_r_proto='REENTRANT_PROTO_I_CSBWR' getpwuid_r_proto='REENTRANT_PROTO_I_TSBWR' getservbyname_r_proto='REENTRANT_PROTO_I_CCSBWR' getservbyport_r_proto='REENTRANT_PROTO_I_ICSBWR' getservent_r_proto='REENTRANT_PROTO_I_SBWR' getspnam_r_proto='REENTRANT_PROTO_I_CSBWR' gidformat='"lu"' gidsign='1' gidsize='4' gidtype='gid_t' glibpth='/usr/shlib /lib /usr/lib /usr/lib/386 /lib/386 /usr/ccs/lib /usr/ucblib /usr/local/lib ' gmake='gmake' gmtime_r_proto='REENTRANT_PROTO_S_TS' gnulibc_version='2.2.92' grep='grep' groupcat='cat /etc/group' groupstype='gid_t' gzip='gzip' h_fcntl='false' h_sysfile='true' hint='recommended' hostcat='cat /etc/hosts' i16size='2' i16type='short' i32size='4' i32type='long' i64size='8' i64type='long long' i8size='1' i8type='char' i_arpainet='define' i_bsdioctl='' i_crypt='define' i_db='define' i_dbm='undef' i_dirent='define' i_dld='undef' i_dlfcn='define' i_fcntl='undef' i_float='define' i_fp='undef' i_fp_class='undef' i_gdbm='define' i_grp='define' i_ieeefp='undef' i_inttypes='define' i_langinfo='define' i_libutil='undef' i_limits='define' i_locale='define' i_machcthr='undef' i_malloc='define' i_math='define' i_memory='undef' i_mntent='define' i_ndbm='undef' i_netdb='define' i_neterrno='undef' i_netinettcp='define' i_niin='define' i_poll='define' i_prot='undef' i_pthread='define' i_pwd='define' i_rpcsvcdbm='undef' i_sfio='undef' i_sgtty='undef' i_shadow='define' i_socks='undef' i_stdarg='define' i_stddef='define' i_stdlib='define' i_string='define' i_sunmath='undef' i_sysaccess='undef' i_sysdir='define' i_sysfile='define' i_sysfilio='undef' i_sysin='undef' i_sysioctl='define' i_syslog='define' i_sysmman='define' i_sysmode='undef' i_sysmount='define' i_sysndir='undef' i_sysparam='define' i_sysresrc='define' i_syssecrt='undef' i_sysselct='define' i_syssockio='undef' i_sysstat='define' i_sysstatfs='define' i_sysstatvfs='define' i_systime='define' i_systimek='undef' i_systimes='define' i_systypes='define' i_sysuio='define' i_sysun='define' i_sysutsname='define' i_sysvfs='define' i_syswait='define' i_termio='undef' i_termios='define' i_time='define' i_unistd='define' i_ustat='define' i_utime='define' i_values='define' i_varargs='undef' i_varhdr='stdarg.h' i_vfork='undef' ignore_versioned_solibs='y' inc_version_list='5.6.1' inc_version_list_init='"5.6.1",0' incpath='' inews='' installbin='/usr/bin' installman1dir='/usr/share/man/man1' installman3dir='/usr/share/man/man3' installprefix='/usr' installprefixexp='/usr' installscript='/usr/bin' installsitearch='/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi' installsitebin='/usr/bin' installsitelib='/usr/lib/perl5/site_perl/5.8.0' installstyle='lib/perl5' installusrbinperl='define' installvendorarch='/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi' installvendorbin='/usr/bin' installvendorlib='/usr/lib/perl5/vendor_perl/5.8.0' intsize='4' issymlink='/usr/bin/test -h' ivdformat='"ld"' ivsize='4' ivtype='long' known_extensions='B ByteLoader Cwd DB_File Data/Dumper Devel/DProf Devel/PPPort Devel/Peek Digest/MD5 Encode Fcntl File/Glob Filter/Util/Call GDBM_File I18N/Langinfo IO IPC/SysV List/Util MIME/Base64 NDBM_File ODBM_File Opcode POSIX PerlIO/encoding PerlIO/scalar PerlIO/via SDBM_File Socket Storable Sys/Hostname Sys/Syslog Thread Time/HiRes Unicode/Normalize XS/APItest XS/Typemap attrs re threads threads/shared' ksh='' ld='gcc' lddlflags='-shared -L/usr/local/lib' ldflags=' -L/usr/local/lib' ldflags_uselargefiles='' ldlibpthname='LD_LIBRARY_PATH' less='less' lib_ext='.a' libc='/lib/libc-2.2.92.so' libperl='libperl.so' libsdirs=' /usr/lib /lib' libsfiles=' libnsl.so libgdbm.so libdb.so libdl.so libm.so libpthread.so libc.so libcrypt.so libutil.so' libsfound=' /usr/lib/libnsl.so /usr/lib/libgdbm.so /lib/libdb.so /usr/lib/libdl.so /usr/lib/libm.so /usr/lib/libpthread.so /usr/lib/libc.so /usr/lib/libcrypt.so /usr/lib/libutil.so' libspath=' /usr/local/lib /lib /usr/lib' libswanted='sfio socket bind inet nsl nm ndbm gdbm dbm db malloc dl dld ld sun m pthread c cposix posix ndir dir crypt sec ucb BSD PW x util' libswanted_uselargefiles='' line='' lint='' lkflags='' ln='ln' lns='/bin/ln -s' localtime_r_proto='REENTRANT_PROTO_S_TS' locincpth='/opt/local/include /usr/gnu/include /opt/gnu/include /usr/GNU/include /opt/GNU/include' loclibpth='/usr/local/lib /opt/local/lib /usr/gnu/lib /opt/gnu/lib /usr/GNU/lib /opt/GNU/lib' longdblsize='12' longlongsize='8' longsize='4' lp='' lpr='' ls='ls' lseeksize='8' lseektype='off_t' mail='' mailx='' make='make' make_set_make='#' mallocobj='' mallocsrc='' malloctype='void *' man1dir='/usr/share/man/man1' man1direxp='/usr/share/man/man1' man1ext='1' man3dir='/usr/share/man/man3' man3direxp='/usr/share/man/man3' man3ext='3pm' mips_type='' mkdir='mkdir' mmaptype='void *' modetype='mode_t' more='more' multiarch='undef' mv='' myarchname='i686-linux' mydomain='.localdomain' myhostname='localhost' myuname='linux daffy.perf.redhat.com 2.4.18-11smp #1 smp thu aug 15 06:41:59 edt 2002 i686 i686 i386 gnulinux ' n='-n' need_va_copy='undef' netdb_hlen_type='size_t' netdb_host_type='const void *' netdb_name_type='const char *' netdb_net_type='in_addr_t' nm='nm' nm_opt='' nm_so_opt='--dynamic' nonxs_ext='Errno' nroff='nroff' nvEUformat='"E"' nvFUformat='"F"' nvGUformat='"G"' nv_preserves_uv_bits='32' nveformat='"e"' nvfformat='"f"' nvgformat='"g"' nvsize='8' nvtype='double' o_nonblock='O_NONBLOCK' obj_ext='.o' old_pthread_create_joinable='' optimize='-O2 -march=i386 -mcpu=i686' orderlib='false' otherlibdirs=' ' package='perl5' pager='/usr/bin/less -isr' passcat='cat /etc/passwd' patchlevel='8' path_sep=':' perl5='/usr/bin/perl' perl='' perl_patchlevel='' perladmin='root@localhost' perllibs='-lnsl -ldl -lm -lpthread -lc -lcrypt -lutil' perlpath='/usr/bin/perl' pg='pg' phostname='' pidtype='pid_t' plibpth='' pm_apiversion='5.005' pmake='' pr='' prefixexp='/usr' privlib='/usr/lib/perl5/5.8.0' procselfexe='"/proc/self/exe"' prototype='define' ptrsize='4' quadkind='3' quadtype='long long' randbits='48' randfunc='drand48' random_r_proto='0' randseedtype='long' ranlib=':' rd_nodata='-1' readdir64_r_proto='REENTRANT_PROTO_I_TSR' readdir_r_proto='REENTRANT_PROTO_I_TSR' revision='5' rm='rm' rmail='' run='' runnm='false' sPRIEUldbl='"LE"' sPRIFUldbl='"LF"' sPRIGUldbl='"LG"' sPRIXU64='"LX"' sPRId64='"Ld"' sPRIeldbl='"Le"' sPRIfldbl='"Lf"' sPRIgldbl='"Lg"' sPRIi64='"Li"' sPRIo64='"Lo"' sPRIu64='"Lu"' sPRIx64='"Lx"' sSCNfldbl='"Lf"' sched_yield='sched_yield()' scriptdir='/usr/bin' scriptdirexp='/usr/bin' sed='sed' seedfunc='srand48' selectminbits='32' selecttype='fd_set *' sendmail='' setgrent_r_proto='0' sethostent_r_proto='0' setlocale_r_proto='0' setnetent_r_proto='0' setprotoent_r_proto='0' setpwent_r_proto='0' setservent_r_proto='0' sh='/bin/sh' shar='' shmattype='void *' shortsize='2' shrpenv='' sig_count='64' sig_name_init='"ZERO", "HUP", "INT", "QUIT", "ILL", "TRAP", "ABRT", "BUS", "FPE", "KILL", "USR1", "SEGV", "USR2", "PIPE", "ALRM", "TERM", "STKFLT", "CHLD", "CONT", "STOP", "TSTP", "TTIN", "TTOU", "URG", "XCPU", "XFSZ", "VTALRM", "PROF", "WINCH", "IO", "PWR", "SYS", "NUM32", "NUM33", "NUM34", "RTMIN", "NUM36", "NUM37", "NUM38", "NUM39", "NUM40", "NUM41", "NUM42", "NUM43", "NUM44", "NUM45", "NUM46", "NUM47", "NUM48", "NUM49", "NUM50", "NUM51", "NUM52", "NUM53", "NUM54", "NUM55", "NUM56", "NUM57", "NUM58", "NUM59", "NUM60", "NUM61", "NUM62", "RTMAX", "IOT", "CLD", "POLL", "UNUSED", 0' sig_num_init='0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 6, 17, 29, 31, 0' sig_size='68' signal_t='void' sitearch='/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi' sitearchexp='/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi' sitebin='/usr/bin' sitebinexp='/usr/bin' sitelib='/usr/lib/perl5/site_perl/5.8.0' sitelib_stem='/usr/lib/perl5/site_perl' sitelibexp='/usr/lib/perl5/site_perl/5.8.0' siteprefix='/usr' siteprefixexp='/usr' sizesize='4' sizetype='size_t' sleep='' smail='' sockethdr='' socketlib='' socksizetype='socklen_t' sort='sort' spackage='Perl5' spitshell='cat' srand48_r_proto='REENTRANT_PROTO_I_LS' srandom_r_proto='REENTRANT_PROTO_I_TS' src='.' ssizetype='ssize_t' startperl='#!/usr/bin/perl' stdchar='char' stdio_base='((fp)->_IO_read_base)' stdio_bufsiz='((fp)->_IO_read_end - (fp)->_IO_read_base)' stdio_cnt='((fp)->_IO_read_end - (fp)->_IO_read_ptr)' stdio_filbuf='' stdio_ptr='((fp)->_IO_read_ptr)' stdio_stream_array='' strerror_r_proto='REENTRANT_PROTO_B_IBW' strings='/usr/include/string.h' submit='' subversion='0' sysman='/usr/share/man/man1' tail='' tar='' targetarch='' tbl='' tee='' test='test' timeincl='/usr/include/sys/time.h /usr/include/time.h ' timetype='time_t' tmpnam_r_proto='REENTRANT_PROTO_B_B' to=':' touch='touch' tr='tr' trnl='\n' troff='' ttyname_r_proto='REENTRANT_PROTO_I_IBW' u16size='2' u16type='unsigned short' u32size='4' u32type='unsigned long' u64size='8' u64type='unsigned long long' u8size='1' u8type='unsigned char' uidformat='"lu"' uidsign='1' uidsize='4' uidtype='uid_t' uname='uname' uniq='uniq' uquadtype='unsigned long long' use5005threads='undef' use64bitall='undef' use64bitint='undef' usecrosscompile='undef' usedl='define' useithreads='define' uselargefiles='define' uselongdouble='undef' usemorebits='undef' usemultiplicity='define' usemymalloc='n' usenm='false' useopcode='true' useperlio='define' useposix='true' usereentrant='undef' usesfio='false' useshrplib='true' usesocks='undef' usethreads='define' usevendorprefix='define' usevfork='false' usrinc='/usr/include' uuname='' uvXUformat='"lX"' uvoformat='"lo"' uvsize='4' uvtype='unsigned long' uvuformat='"lu"' uvxformat='"lx"' vendorarch='/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi' vendorarchexp='/usr/lib/perl5/vendor_perl/5.8.0/i386-linux-thread-multi' vendorbin='/usr/bin' vendorbinexp='/usr/bin' vendorlib='/usr/lib/perl5/vendor_perl/5.8.0' vendorlib_stem='/usr/lib/perl5/vendor_perl' vendorlibexp='/usr/lib/perl5/vendor_perl/5.8.0' vendorprefix='/usr' vendorprefixexp='/usr' version='5.8.0' version_patchlevel_string='version 8 subversion 0' versiononly='undef' vi='' voidflags='15' xlibpth='/usr/lib/386 /lib/386' xs_apiversion='5.8.0' yacc='/usr/bin/byacc' yaccflags='' zcat='' zip='zip' !END! my $summary = <<'!END!'; Summary of my $package (revision $baserev $version_patchlevel_string) configuration: Platform: osname=$osname, osvers=$osvers, archname=$archname uname='$myuname' config_args='$config_args' hint=$hint, useposix=$useposix, d_sigaction=$d_sigaction usethreads=$usethreads use5005threads=$use5005threads useithreads=$useithreads usemultiplicity=$usemultiplicity useperlio=$useperlio d_sfio=$d_sfio uselargefiles=$uselargefiles usesocks=$usesocks use64bitint=$use64bitint use64bitall=$use64bitall uselongdouble=$uselongdouble usemymalloc=$usemymalloc, bincompat5005=undef Compiler: cc='$cc', ccflags ='$ccflags', optimize='$optimize', cppflags='$cppflags' ccversion='$ccversion', gccversion='$gccversion', gccosandvers='$gccosandvers' intsize=$intsize, longsize=$longsize, ptrsize=$ptrsize, doublesize=$doublesize, byteorder=$byteorder d_longlong=$d_longlong, longlongsize=$longlongsize, d_longdbl=$d_longdbl, longdblsize=$longdblsize ivtype='$ivtype', ivsize=$ivsize, nvtype='$nvtype', nvsize=$nvsize, Off_t='$lseektype', lseeksize=$lseeksize alignbytes=$alignbytes, prototype=$prototype Linker and Libraries: ld='$ld', ldflags ='$ldflags' libpth=$libpth libs=$libs perllibs=$perllibs libc=$libc, so=$so, useshrplib=$useshrplib, libperl=$libperl gnulibc_version='$gnulibc_version' Dynamic Linking: dlsrc=$dlsrc, dlext=$dlext, d_dlsymun=$d_dlsymun, ccdlflags='$ccdlflags' cccdlflags='$cccdlflags', lddlflags='$lddlflags' !END! my $summary_expanded = 0; sub myconfig { return $summary if $summary_expanded; $summary =~ s{\$(\w+)} { my $c = $Config{$1}; defined($c) ? $c : 'undef' }ge; $summary_expanded = 1; $summary; } sub FETCH { # check for cached value (which may be undef so we use exists not defined) return $_[0]->{$_[1]} if (exists $_[0]->{$_[1]}); # Search for it in the big string my($value, $start, $marker, $quote_type); $quote_type = "'"; # Virtual entries. if ($_[1] eq 'byteorder') { # byteorder does exist on its own but we overlay a virtual # dynamically recomputed value. my $t = $Config{ivtype}; my $s = $Config{ivsize}; my $f = $t eq 'long' ? 'L!' : $s == 8 ? 'Q': 'I'; if ($s == 4 || $s == 8) { my $i = 0; foreach my $c (reverse(2..$s)) { $i |= ord($c); $i <<= 8 } $i |= ord(1); $value = join('', unpack('a'x$s, pack($f, $i))); } else { $value = '?'x$s; } } elsif ($_[1] =~ /^((?:cc|ld)flags|libs(?:wanted)?)_nolargefiles/) { # These are purely virtual, they do not exist, but need to # be computed on demand for largefile-incapable extensions. my $key = "${1}_uselargefiles"; $value = $Config{$1}; my $withlargefiles = $Config{$key}; if ($key =~ /^(?:cc|ld)flags_/) { $value =~ s/\Q$withlargefiles\E\b//; } elsif ($key =~ /^libs/) { my @lflibswanted = split(' ', $Config{libswanted_uselargefiles}); if (@lflibswanted) { my %lflibswanted; @lflibswanted{@lflibswanted} = (); if ($key =~ /^libs_/) { my @libs = grep { /^-l(.+)/ && not exists $lflibswanted{$1} } split(' ', $Config{libs}); $Config{libs} = join(' ', @libs); } elsif ($key =~ /^libswanted_/) { my @libswanted = grep { not exists $lflibswanted{$_} } split(' ', $Config{libswanted}); $Config{libswanted} = join(' ', @libswanted); } } } } else { $marker = "$_[1]="; # return undef unless (($value) = $config_sh =~ m/^$_[1]='(.*)'\s*$/m); # Check for the common case, ' delimeted $start = index($config_sh, "\n$marker$quote_type"); # If that failed, check for " delimited if ($start == -1) { $quote_type = '"'; $start = index($config_sh, "\n$marker$quote_type"); } return undef if ( ($start == -1) && # in case it's first (substr($config_sh, 0, length($marker)) ne $marker) ); if ($start == -1) { # It's the very first thing we found. Skip $start forward # and figure out the quote mark after the =. $start = length($marker) + 1; $quote_type = substr($config_sh, $start - 1, 1); } else { $start += length($marker) + 2; } $value = substr($config_sh, $start, index($config_sh, "$quote_type\n", $start) - $start); } # If we had a double-quote, we'd better eval it so escape # sequences and such can be interpolated. Since the incoming # value is supposed to follow shell rules and not perl rules, # we escape any perl variable markers if ($quote_type eq '"') { $value =~ s/\$/\\\$/g; $value =~ s/\@/\\\@/g; eval "\$value = \"$value\""; } #$value = sprintf($value) if $quote_type eq '"'; # So we can say "if $Config{'foo'}". $value = undef if $value eq 'undef'; $_[0]->{$_[1]} = $value; # cache it return $value; } my $prevpos = 0; sub FIRSTKEY { $prevpos = 0; # my($key) = $config_sh =~ m/^(.*?)=/; substr($config_sh, 0, index($config_sh, '=') ); # $key; } sub NEXTKEY { # Find out how the current key's quoted so we can skip to its end. my $quote = substr($config_sh, index($config_sh, "=", $prevpos)+1, 1); my $pos = index($config_sh, qq($quote\n), $prevpos) + 2; my $len = index($config_sh, "=", $pos) - $pos; $prevpos = $pos; $len > 0 ? substr($config_sh, $pos, $len) : undef; } sub EXISTS { # exists($_[0]->{$_[1]}) or $config_sh =~ m/^$_[1]=/m; exists($_[0]->{$_[1]}) or index($config_sh, "\n$_[1]='") != -1 or substr($config_sh, 0, length($_[1])+2) eq "$_[1]='" or index($config_sh, "\n$_[1]=\"") != -1 or substr($config_sh, 0, length($_[1])+2) eq "$_[1]=\"" or $_[1] =~ /^(?:(?:cc|ld)flags|libs(?:wanted)?)_nolargefiles$/; } sub STORE { die "\%Config::Config is read-only\n" } sub DELETE { &STORE } sub CLEAR { &STORE } sub config_sh { $config_sh } sub config_re { my $re = shift; my @matches = grep /^$re=/, split /^/, $config_sh; @matches ? (print @matches) : print "$re: not found\n"; } sub config_vars { foreach(@_){ config_re($_), next if /\W/; my $v=(exists $Config{$_}) ? $Config{$_} : 'UNKNOWN'; $v='undef' unless defined $v; print "$_='$v';\n"; } } sub TIEHASH { bless {} } # avoid Config..Exporter..UNIVERSAL search for DESTROY then AUTOLOAD sub DESTROY { } tie %Config, 'Config'; 1; __END__ #line 8948 FILE099837ef/Cwd.pm*/#line 1 "/usr/lib/perl5/5.8.0/i386-linux-thread-multi/Cwd.pm" package Cwd; use 5.006; #line 148 use strict; use Carp; our $VERSION = '2.06'; use base qw/ Exporter /; our @EXPORT = qw(cwd getcwd fastcwd fastgetcwd); our @EXPORT_OK = qw(chdir abs_path fast_abs_path realpath fast_realpath); # sys_cwd may keep the builtin command # All the functionality of this module may provided by builtins, # there is no sense to process the rest of the file. # The best choice may be to have this in BEGIN, but how to return from BEGIN? if ($^O eq 'os2' && defined &sys_cwd && defined &sys_abspath) { local $^W = 0; *cwd = \&sys_cwd; *getcwd = \&cwd; *fastgetcwd = \&cwd; *fastcwd = \&cwd; *abs_path = \&sys_abspath; *fast_abs_path = \&abs_path; *realpath = \&abs_path; *fast_realpath = \&abs_path; return 1; } eval { require XSLoader; undef *Cwd::fastcwd; # avoid redefinition warning XSLoader::load('Cwd'); }; # Find the pwd command in the expected locations. We assume these # are safe. This prevents _backtick_pwd() consulting $ENV{PATH} # so everything works under taint mode. my $pwd_cmd; foreach my $try (qw(/bin/pwd /usr/bin/pwd)) { if( -x $try ) { $pwd_cmd = $try; last; } } $pwd_cmd ||= 'pwd'; # The 'natural and safe form' for UNIX (pwd may be setuid root) sub _backtick_pwd { local @ENV{qw(PATH IFS CDPATH ENV BASH_ENV)}; my $cwd = `$pwd_cmd`; # Belt-and-suspenders in case someone said "undef $/". local $/ = "\n"; # `pwd` may fail e.g. if the disk is full chomp($cwd) if defined $cwd; $cwd; } # Since some ports may predefine cwd internally (e.g., NT) # we take care not to override an existing definition for cwd(). unless(defined &cwd) { # The pwd command is not available in some chroot(2)'ed environments if( $^O eq 'MacOS' || (defined $ENV{PATH} && grep { -x "$_/pwd" } split(':', $ENV{PATH})) ) { *cwd = \&_backtick_pwd; } else { *cwd = \&getcwd; } } # set a reasonable (and very safe) default for fastgetcwd, in case it # isn't redefined later (20001212 rspier) *fastgetcwd = \&cwd; # By Brandon S. Allbery # # Usage: $cwd = getcwd(); sub getcwd { abs_path('.'); } # By John Bazik # # Usage: $cwd = &fastcwd; # # This is a faster version of getcwd. It's also more dangerous because # you might chdir out of a directory that you can't chdir back into. sub fastcwd { my($odev, $oino, $cdev, $cino, $tdev, $tino); my(@path, $path); local(*DIR); my($orig_cdev, $orig_cino) = stat('.'); ($cdev, $cino) = ($orig_cdev, $orig_cino); for (;;) { my $direntry; ($odev, $oino) = ($cdev, $cino); CORE::chdir('..') || return undef; ($cdev, $cino) = stat('.'); last if $odev == $cdev && $oino == $cino; opendir(DIR, '.') || return undef; for (;;) { $direntry = readdir(DIR); last unless defined $direntry; next if $direntry eq '.'; next if $direntry eq '..'; ($tdev, $tino) = lstat($direntry); last unless $tdev != $odev || $tino != $oino; } closedir(DIR); return undef unless defined $direntry; # should never happen unshift(@path, $direntry); } $path = '/' . join('/', @path); if ($^O eq 'apollo') { $path = "/".$path; } # At this point $path may be tainted (if tainting) and chdir would fail. # Untaint it then check that we landed where we started. $path =~ /^(.*)\z/s # untaint && CORE::chdir($1) or return undef; ($cdev, $cino) = stat('.'); die "Unstable directory path, current directory changed unexpectedly" if $cdev != $orig_cdev || $cino != $orig_cino; $path; } # Keeps track of current working directory in PWD environment var # Usage: # use Cwd 'chdir'; # chdir $newdir; my $chdir_init = 0; sub chdir_init { if ($ENV{'PWD'} and $^O ne 'os2' and $^O ne 'dos' and $^O ne 'MSWin32') { my($dd,$di) = stat('.'); my($pd,$pi) = stat($ENV{'PWD'}); if (!defined $dd or !defined $pd or $di != $pi or $dd != $pd) { $ENV{'PWD'} = cwd(); } } else { my $wd = cwd(); $wd = Win32::GetFullPathName($wd) if $^O eq 'MSWin32'; $ENV{'PWD'} = $wd; } # Strip an automounter prefix (where /tmp_mnt/foo/bar == /foo/bar) if ($^O ne 'MSWin32' and $ENV{'PWD'} =~ m|(/[^/]+(/[^/]+/[^/]+))(.*)|s) { my($pd,$pi) = stat($2); my($dd,$di) = stat($1); if (defined $pd and defined $dd and $di == $pi and $dd == $pd) { $ENV{'PWD'}="$2$3"; } } $chdir_init = 1; } sub chdir { my $newdir = @_ ? shift : ''; # allow for no arg (chdir to HOME dir) $newdir =~ s|///*|/|g unless $^O eq 'MSWin32'; chdir_init() unless $chdir_init; my $newpwd; if ($^O eq 'MSWin32') { # get the full path name *before* the chdir() $newpwd = Win32::GetFullPathName($newdir); } return 0 unless CORE::chdir $newdir; if ($^O eq 'VMS') { return $ENV{'PWD'} = $ENV{'DEFAULT'} } elsif ($^O eq 'MacOS') { return $ENV{'PWD'} = cwd(); } elsif ($^O eq 'MSWin32') { $ENV{'PWD'} = $newpwd; return 1; } if ($newdir =~ m#^/#s) { $ENV{'PWD'} = $newdir; } else { my @curdir = split(m#/#,$ENV{'PWD'}); @curdir = ('') unless @curdir; my $component; foreach $component (split(m#/#, $newdir)) { next if $component eq '.'; pop(@curdir),next if $component eq '..'; push(@curdir,$component); } $ENV{'PWD'} = join('/',@curdir) || '/'; } 1; } # In case the XS version doesn't load. *abs_path = \&_perl_abs_path unless defined &abs_path; sub _perl_abs_path { my $start = @_ ? shift : '.'; my($dotdots, $cwd, @pst, @cst, $dir, @tst); unless (@cst = stat( $start )) { carp "stat($start): $!"; return ''; } $cwd = ''; $dotdots = $start; do { $dotdots .= '/..'; @pst = @cst; unless (opendir(PARENT, $dotdots)) { carp "opendir($dotdots): $!"; return ''; } unless (@cst = stat($dotdots)) { carp "stat($dotdots): $!"; closedir(PARENT); return ''; } if ($pst[0] == $cst[0] && $pst[1] == $cst[1]) { $dir = undef; } else { do { unless (defined ($dir = readdir(PARENT))) { carp "readdir($dotdots): $!"; closedir(PARENT); return ''; } $tst[0] = $pst[0]+1 unless (@tst = lstat("$dotdots/$dir")) } while ($dir eq '.' || $dir eq '..' || $tst[0] != $pst[0] || $tst[1] != $pst[1]); } $cwd = (defined $dir ? "$dir" : "" ) . "/$cwd" ; closedir(PARENT); } while (defined $dir); chop($cwd) unless $cwd eq '/'; # drop the trailing / $cwd; } # added function alias for those of us more # used to the libc function. --tchrist 27-Jan-00 *realpath = \&abs_path; sub fast_abs_path { my $cwd = getcwd(); require File::Spec; my $path = @_ ? shift : File::Spec->curdir; CORE::chdir($path) || croak "Cannot chdir to $path: $!"; my $realpath = getcwd(); -d $cwd && CORE::chdir($cwd) || croak "Cannot chdir back to $cwd: $!"; $realpath; } # added function alias to follow principle of least surprise # based on previous aliasing. --tchrist 27-Jan-00 *fast_realpath = \&fast_abs_path; # --- PORTING SECTION --- # VMS: $ENV{'DEFAULT'} points to default directory at all times # 06-Mar-1996 Charles Bailey bailey@newman.upenn.edu # Note: Use of Cwd::chdir() causes the logical name PWD to be defined # in the process logical name table as the default device and directory # seen by Perl. This may not be the same as the default device # and directory seen by DCL after Perl exits, since the effects # the CRTL chdir() function persist only until Perl exits. sub _vms_cwd { return $ENV{'DEFAULT'}; } sub _vms_abs_path { return $ENV{'DEFAULT'} unless @_; my $path = VMS::Filespec::pathify($_[0]); croak("Invalid path name $_[0]") unless defined $path; return VMS::Filespec::rmsexpand($path); } sub _os2_cwd { $ENV{'PWD'} = `cmd /c cd`; chop $ENV{'PWD'}; $ENV{'PWD'} =~ s:\\:/:g ; return $ENV{'PWD'}; } sub _win32_cwd { $ENV{'PWD'} = Win32::GetCwd(); $ENV{'PWD'} =~ s:\\:/:g ; return $ENV{'PWD'}; } *_NT_cwd = \&_win32_cwd if (!defined &_NT_cwd && defined &Win32::GetCwd); *_NT_cwd = \&_os2_cwd unless defined &_NT_cwd; sub _dos_cwd { if (!defined &Dos::GetCwd) { $ENV{'PWD'} = `command /c cd`; chop $ENV{'PWD'}; $ENV{'PWD'} =~ s:\\:/:g ; } else { $ENV{'PWD'} = Dos::GetCwd(); } return $ENV{'PWD'}; } sub _qnx_cwd { local $ENV{PATH} = ''; local $ENV{CDPATH} = ''; local $ENV{ENV} = ''; $ENV{'PWD'} = `/usr/bin/fullpath -t`; chop $ENV{'PWD'}; return $ENV{'PWD'}; } sub _qnx_abs_path { local $ENV{PATH} = ''; local $ENV{CDPATH} = ''; local $ENV{ENV} = ''; my $path = @_ ? shift : '.'; my $realpath=`/usr/bin/fullpath -t $path`; chop $realpath; return $realpath; } sub _epoc_cwd { $ENV{'PWD'} = EPOC::getcwd(); return $ENV{'PWD'}; } { no warnings; # assignments trigger 'subroutine redefined' warning if ($^O eq 'VMS') { *cwd = \&_vms_cwd; *getcwd = \&_vms_cwd; *fastcwd = \&_vms_cwd; *fastgetcwd = \&_vms_cwd; *abs_path = \&_vms_abs_path; *fast_abs_path = \&_vms_abs_path; } elsif ($^O eq 'NT' or $^O eq 'MSWin32') { # We assume that &_NT_cwd is defined as an XSUB or in the core. *cwd = \&_NT_cwd; *getcwd = \&_NT_cwd; *fastcwd = \&_NT_cwd; *fastgetcwd = \&_NT_cwd; *abs_path = \&fast_abs_path; *realpath = \&fast_abs_path; } elsif ($^O eq 'os2') { # sys_cwd may keep the builtin command *cwd = defined &sys_cwd ? \&sys_cwd : \&_os2_cwd; *getcwd = \&cwd; *fastgetcwd = \&cwd; *fastcwd = \&cwd; *abs_path = \&fast_abs_path; } elsif ($^O eq 'dos') { *cwd = \&_dos_cwd; *getcwd = \&_dos_cwd; *fastgetcwd = \&_dos_cwd; *fastcwd = \&_dos_cwd; *abs_path = \&fast_abs_path; } elsif ($^O =~ m/^(?:qnx|nto)$/ ) { *cwd = \&_qnx_cwd; *getcwd = \&_qnx_cwd; *fastgetcwd = \&_qnx_cwd; *fastcwd = \&_qnx_cwd; *abs_path = \&_qnx_abs_path; *fast_abs_path = \&_qnx_abs_path; } elsif ($^O eq 'cygwin') { *getcwd = \&cwd; *fastgetcwd = \&cwd; *fastcwd = \&cwd; *abs_path = \&fast_abs_path; } elsif ($^O eq 'epoc') { *cwd = \&_epoc_cwd; *getcwd = \&_epoc_cwd; *fastgetcwd = \&_epoc_cwd; *fastcwd = \&_epoc_cwd; *abs_path = \&fast_abs_path; } elsif ($^O eq 'MacOS') { *getcwd = \&cwd; *fastgetcwd = \&cwd; *fastcwd = \&cwd; *abs_path = \&fast_abs_path; } } 1; FILE0898e244/DynaLoader.pm7g#line 1 "/usr/lib/perl5/5.8.0/i386-linux-thread-multi/DynaLoader.pm" # Generated from DynaLoader.pm.PL package DynaLoader; # And Gandalf said: 'Many folk like to know beforehand what is to # be set on the table; but those who have laboured to prepare the # feast like to keep their secret; for wonder makes the words of # praise louder.' # (Quote from Tolkien suggested by Anno Siegel.) # # See pod text at end of file for documentation. # See also ext/DynaLoader/README in source tree for other information. # # Tim.Bunce@ig.co.uk, August 1994 use vars qw($VERSION *AUTOLOAD); $VERSION = 1.04; # avoid typo warning require AutoLoader; *AUTOLOAD = \&AutoLoader::AUTOLOAD; use Config; # The following require can't be removed during maintenance # releases, sadly, because of the risk of buggy code that does # require Carp; Carp::croak "..."; without brackets dying # if Carp hasn't been loaded in earlier compile time. :-( # We'll let those bugs get found on the development track. require Carp if $] < 5.00450; # enable debug/trace messages from DynaLoader perl code $dl_debug = $ENV{PERL_DL_DEBUG} || 0 unless defined $dl_debug; # # Flags to alter dl_load_file behaviour. Assigned bits: # 0x01 make symbols available for linking later dl_load_file's. # (only known to work on Solaris 2 using dlopen(RTLD_GLOBAL)) # (ignored under VMS; effect is built-in to image linking) # # This is called as a class method $module->dl_load_flags. The # definition here will be inherited and result on "default" loading # behaviour unless a sub-class of DynaLoader defines its own version. # sub dl_load_flags { 0x00 } # ($dl_dlext, $dlsrc) # = @Config::Config{'dlext', 'dlsrc'}; ($dl_dlext, $dlsrc) = ('so','dl_dlopen.xs') ; # Some systems need special handling to expand file specifications # (VMS support by Charles Bailey ) # See dl_expandspec() for more details. Should be harmless but # inefficient to define on systems that don't need it. $Is_VMS = $^O eq 'VMS'; $do_expand = $Is_VMS; $Is_MacOS = $^O eq 'MacOS'; my $Mac_FS; $Mac_FS = eval { require Mac::FileSpec::Unixish } if $Is_MacOS; @dl_require_symbols = (); # names of symbols we need @dl_resolve_using = (); # names of files to link with @dl_library_path = (); # path to look for files #XSLoader.pm may have added elements before we were required #@dl_librefs = (); # things we have loaded #@dl_modules = (); # Modules we have loaded # This is a fix to support DLD's unfortunate desire to relink -lc @dl_resolve_using = dl_findfile('-lc') if $dlsrc eq "dl_dld.xs"; # Initialise @dl_library_path with the 'standard' library path # for this platform as determined by Configure. push(@dl_library_path, split(' ', $Config::Config{libpth})); my $ldlibpthname = $Config::Config{ldlibpthname}; my $ldlibpthname_defined = defined $Config::Config{ldlibpthname}; my $pthsep = $Config::Config{path_sep}; # Add to @dl_library_path any extra directories we can gather from environment # during runtime. if ($ldlibpthname_defined && exists $ENV{$ldlibpthname}) { push(@dl_library_path, split(/$pthsep/, $ENV{$ldlibpthname})); } # E.g. HP-UX supports both its native SHLIB_PATH *and* LD_LIBRARY_PATH. if ($ldlibpthname_defined && $ldlibpthname ne 'LD_LIBRARY_PATH' && exists $ENV{LD_LIBRARY_PATH}) { push(@dl_library_path, split(/$pthsep/, $ENV{LD_LIBRARY_PATH})); } # No prizes for guessing why we don't say 'bootstrap DynaLoader;' here. # NOTE: All dl_*.xs (including dl_none.xs) define a dl_error() XSUB boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader) && !defined(&dl_error); if ($dl_debug) { print STDERR "DynaLoader.pm loaded (@INC, @dl_library_path)\n"; print STDERR "DynaLoader not linked into this perl\n" unless defined(&boot_DynaLoader); } 1; # End of main code sub croak { require Carp; Carp::croak(@_) } sub bootstrap_inherit { my $module = $_[0]; local *isa = *{"$module\::ISA"}; local @isa = (@isa, 'DynaLoader'); # Cannot goto due to delocalization. Will report errors on a wrong line? bootstrap(@_); } # The bootstrap function cannot be autoloaded (without complications) # so we define it here: sub bootstrap { # use local vars to enable $module.bs script to edit values local(@args) = @_; local($module) = $args[0]; local(@dirs, $file); unless ($module) { require Carp; Carp::confess("Usage: DynaLoader::bootstrap(module)"); } # A common error on platforms which don't support dynamic loading. # Since it's fatal and potentially confusing we give a detailed message. croak("Can't load module $module, dynamic loading not available in this perl.\n". " (You may need to build a new perl executable which either supports\n". " dynamic loading or has the $module module statically linked into it.)\n") unless defined(&dl_load_file); my @modparts = split(/::/,$module); my $modfname = $modparts[-1]; # Some systems have restrictions on files names for DLL's etc. # mod2fname returns appropriate file base name (typically truncated) # It may also edit @modparts if required. $modfname = &mod2fname(\@modparts) if defined &mod2fname; # Truncate the module name to 8.3 format for NetWare if (($^O eq 'NetWare') && (length($modfname) > 8)) { $modfname = substr($modfname, 0, 8); } my $modpname = join(($Is_MacOS ? ':' : '/'),@modparts); print STDERR "DynaLoader::bootstrap for $module ", ($Is_MacOS ? "(:auto:$modpname:$modfname.$dl_dlext)\n" : "(auto/$modpname/$modfname.$dl_dlext)\n") if $dl_debug; foreach (@INC) { chop($_ = VMS::Filespec::unixpath($_)) if $Is_VMS; my $dir; if ($Is_MacOS) { my $path = $_; if ($Mac_FS && ! -d $path) { $path = Mac::FileSpec::Unixish::nativize($path); } $path .= ":" unless /:$/; $dir = "${path}auto:$modpname"; } else { $dir = "$_/auto/$modpname"; } next unless -d $dir; # skip over uninteresting directories # check for common cases to avoid autoload of dl_findfile my $try = $Is_MacOS ? "$dir:$modfname.$dl_dlext" : "$dir/$modfname.$dl_dlext"; last if $file = ($do_expand) ? dl_expandspec($try) : ((-f $try) && $try); # no luck here, save dir for possible later dl_findfile search push @dirs, $dir; } # last resort, let dl_findfile have a go in all known locations $file = dl_findfile(map("-L$_",@dirs,@INC), $modfname) unless $file; croak("Can't locate loadable object for module $module in \@INC (\@INC contains: @INC)") unless $file; # wording similar to error from 'require' $file = uc($file) if $Is_VMS && $Config::Config{d_vms_case_sensitive_symbols}; my $bootname = "boot_$module"; $bootname =~ s/\W/_/g; @dl_require_symbols = ($bootname); # Execute optional '.bootstrap' perl script for this module. # The .bs file can be used to configure @dl_resolve_using etc to # match the needs of the individual module on this architecture. my $bs = $file; $bs =~ s/(\.\w+)?(;\d*)?$/\.bs/; # look for .bs 'beside' the library if (-s $bs) { # only read file if it's not empty print STDERR "BS: $bs ($^O, $dlsrc)\n" if $dl_debug; eval { do $bs; }; warn "$bs: $@\n" if $@; } my $boot_symbol_ref; if ($^O eq 'darwin') { if ($boot_symbol_ref = dl_find_symbol(0, $bootname)) { goto boot; #extension library has already been loaded, e.g. darwin } } # Many dynamic extension loading problems will appear to come from # this section of code: XYZ failed at line 123 of DynaLoader.pm. # Often these errors are actually occurring in the initialisation # C code of the extension XS file. Perl reports the error as being # in this perl code simply because this was the last perl code # it executed. my $libref = dl_load_file($file, $module->dl_load_flags) or croak("Can't load '$file' for module $module: ".dl_error()); push(@dl_librefs,$libref); # record loaded object my @unresolved = dl_undef_symbols(); if (@unresolved) { require Carp; Carp::carp("Undefined symbols present after loading $file: @unresolved\n"); } $boot_symbol_ref = dl_find_symbol($libref, $bootname) or croak("Can't find '$bootname' symbol in $file\n"); push(@dl_modules, $module); # record loaded module boot: my $xs = dl_install_xsub("${module}::bootstrap", $boot_symbol_ref, $file); # See comment block above &$xs(@args); } #sub _check_file { # private utility to handle dl_expandspec vs -f tests # my($file) = @_; # return $file if (!$do_expand && -f $file); # the common case # return $file if ( $do_expand && ($file=dl_expandspec($file))); # return undef; #} # Let autosplit and the autoloader deal with these functions: __END__ sub dl_findfile { # Read ext/DynaLoader/DynaLoader.doc for detailed information. # This function does not automatically consider the architecture # or the perl library auto directories. my (@args) = @_; my (@dirs, $dir); # which directories to search my (@found); # full paths to real files we have found my $dl_ext= 'so'; # $Config::Config{'dlext'} suffix for perl extensions my $dl_so = 'so'; # $Config::Config{'so'} suffix for shared libraries print STDERR "dl_findfile(@args)\n" if $dl_debug; # accumulate directories but process files as they appear arg: foreach(@args) { # Special fast case: full filepath requires no search if ($Is_VMS && m%[:>/\]]% && -f $_) { push(@found,dl_expandspec(VMS::Filespec::vmsify($_))); last arg unless wantarray; next; } elsif ($Is_MacOS) { if (m/:/ && -f $_) { push(@found,$_); last arg unless wantarray; } } elsif (m:/: && -f $_ && !$do_expand) { push(@found,$_); last arg unless wantarray; next; } # Deal with directories first: # Using a -L prefix is the preferred option (faster and more robust) if (m:^-L:) { s/^-L//; push(@dirs, $_); next; } if ($Is_MacOS) { # Otherwise we try to try to spot directories by a heuristic # (this is a more complicated issue than it first appears) if (m/:/ && -d $_) { push(@dirs, $_); next; } # Only files should get this far... my(@names, $name); # what filenames to look for s/^-l//; push(@names, $_); foreach $dir (@dirs, @dl_library_path) { next unless -d $dir; $dir =~ s/^([^:]+)$/:$1/; $dir =~ s/:$//; foreach $name (@names) { my($file) = "$dir:$name"; print STDERR " checking in $dir for $name\n" if $dl_debug; if (-f $file) { push(@found, $file); next arg; # no need to look any further } } } next; } # Otherwise we try to try to spot directories by a heuristic # (this is a more complicated issue than it first appears) if (m:/: && -d $_) { push(@dirs, $_); next; } # VMS: we may be using native VMS directory syntax instead of # Unix emulation, so check this as well if ($Is_VMS && /[:>\]]/ && -d $_) { push(@dirs, $_); next; } # Only files should get this far... my(@names, $name); # what filenames to look for if (m:-l: ) { # convert -lname to appropriate library name s/-l//; push(@names,"lib$_.$dl_so"); push(@names,"lib$_.a"); } else { # Umm, a bare name. Try various alternatives: # these should be ordered with the most likely first push(@names,"$_.$dl_ext") unless m/\.$dl_ext$/o; push(@names,"$_.$dl_so") unless m/\.$dl_so$/o; push(@names,"lib$_.$dl_so") unless m:/:; push(@names,"$_.a") if !m/\.a$/ and $dlsrc eq "dl_dld.xs"; push(@names, $_); } foreach $dir (@dirs, @dl_library_path) { next unless -d $dir; chop($dir = VMS::Filespec::unixpath($dir)) if $Is_VMS; foreach $name (@names) { my($file) = "$dir/$name"; print STDERR " checking in $dir for $name\n" if $dl_debug; $file = ($do_expand) ? dl_expandspec($file) : (-f $file && $file); #$file = _check_file($file); if ($file) { push(@found, $file); next arg; # no need to look any further } } } } if ($dl_debug) { foreach(@dirs) { print STDERR " dl_findfile ignored non-existent directory: $_\n" unless -d $_; } print STDERR "dl_findfile found: @found\n"; } return $found[0] unless wantarray; @found; } sub dl_expandspec { my($spec) = @_; # Optional function invoked if DynaLoader.pm sets $do_expand. # Most systems do not require or use this function. # Some systems may implement it in the dl_*.xs file in which case # this autoload version will not be called but is harmless. # This function is designed to deal with systems which treat some # 'filenames' in a special way. For example VMS 'Logical Names' # (something like unix environment variables - but different). # This function should recognise such names and expand them into # full file paths. # Must return undef if $spec is invalid or file does not exist. my $file = $spec; # default output to input if ($Is_VMS) { # dl_expandspec should be defined in dl_vms.xs require Carp; Carp::croak("dl_expandspec: should be defined in XS file!\n"); } else { return undef unless -f $file; } print STDERR "dl_expandspec($spec) => $file\n" if $dl_debug; $file; } sub dl_find_symbol_anywhere { my $sym = shift; my $libref; foreach $libref (@dl_librefs) { my $symref = dl_find_symbol($libref,$sym); return $symref if $symref; } return undef; } #line 827 FILE56244356/Errno.pml#line 1 "/usr/lib/perl5/5.8.0/i386-linux-thread-multi/Errno.pm" # # This file is auto-generated. ***ANY*** changes here will be lost # package Errno; our (@EXPORT_OK,%EXPORT_TAGS,@ISA,$VERSION,%errno,$AUTOLOAD); use Exporter (); use Config; use strict; "$Config{'archname'}-$Config{'osvers'}" eq "i386-linux-thread-multi-2.4.18-11smp" or die "Errno architecture (i386-linux-thread-multi-2.4.18-11smp) does not match executable architecture ($Config{'archname'}-$Config{'osvers'})"; $VERSION = "1.09_00"; $VERSION = eval $VERSION; @ISA = qw(Exporter); @EXPORT_OK = qw(EBADR EADV EUCLEAN ENOMSG EROFS ENOTSUP ESHUTDOWN EMULTIHOP EPROTONOSUPPORT ENOLCK ENFILE ESTRPIPE EL3HLT EADDRINUSE ECONNABORTED EBADF ECANCELED ENAVAIL ENOTBLK EDEADLK ECHRNG ENOLINK ESRMNT ENOTNAM ELNRNG ENOTDIR ETIME EINVAL ENOTTY ENOANO EXDEV EBADE ELOOP EBADSLT ECONNREFUSED ENOSTR EOVERFLOW EISCONN ENONET EFBIG ECONNRESET EPFNOSUPPORT ENOENT EWOULDBLOCK ELIBMAX EREMOTEIO EBADMSG ENOMEDIUM EL2HLT ENOPKG EDOM EBFONT ELIBSCN EMSGSIZE ENOCSI EL3RST EDESTADDRREQ ENOTSOCK EIO ENOSPC EIDRM EMEDIUMTYPE ERANGE EINPROGRESS ENOBUFS EADDRNOTAVAIL EAFNOSUPPORT ENOSYS EINTR EHOSTDOWN EILSEQ EREMOTE EBADFD ENOSR ENOMEM ENETUNREACH EPIPE ENOTCONN ESTALE ENODATA EDQUOT EUSERS EOPNOTSUPP EPROTO EISNAM ESPIPE EALREADY ENAMETOOLONG EMFILE EACCES ENOEXEC EISDIR EBUSY EBADRQC EPERM E2BIG ELIBEXEC EEXIST EDOTDOT ETOOMANYREFS ELIBACC ENOTUNIQ ECOMM ELIBBAD ERESTART ESOCKTNOSUPPORT EUNATCH ETIMEDOUT ENXIO ESRCH ENODEV ETXTBSY EFAULT EMLINK EDEADLOCK EXFULL EAGAIN ENOPROTOOPT ECHILD ENETDOWN EHOSTUNREACH EPROTOTYPE EREMCHG EL2NSYNC ENETRESET ENOTEMPTY); %EXPORT_TAGS = ( POSIX => [qw( E2BIG EACCES EADDRINUSE EADDRNOTAVAIL EAFNOSUPPORT EAGAIN EALREADY EBADF EBUSY ECHILD ECONNABORTED ECONNREFUSED ECONNRESET EDEADLK EDESTADDRREQ EDOM EDQUOT EEXIST EFAULT EFBIG EHOSTDOWN EHOSTUNREACH EINPROGRESS EINTR EINVAL EIO EISCONN EISDIR ELOOP EMFILE EMLINK EMSGSIZE ENAMETOOLONG ENETDOWN ENETRESET ENETUNREACH ENFILE ENOBUFS ENODEV ENOENT ENOEXEC ENOLCK ENOMEM ENOPROTOOPT ENOSPC ENOSYS ENOTBLK ENOTCONN ENOTDIR ENOTEMPTY ENOTSOCK ENOTTY ENXIO EOPNOTSUPP EPERM EPFNOSUPPORT EPIPE EPROTONOSUPPORT EPROTOTYPE ERANGE EREMOTE ERESTART EROFS ESHUTDOWN ESOCKTNOSUPPORT ESPIPE ESRCH ESTALE ETIMEDOUT ETOOMANYREFS ETXTBSY EUSERS EWOULDBLOCK EXDEV )] ); sub EPERM () { 1 } sub ENOENT () { 2 } sub ESRCH () { 3 } sub EINTR () { 4 } sub EIO () { 5 } sub ENXIO () { 6 } sub E2BIG () { 7 } sub ENOEXEC () { 8 } sub EBADF () { 9 } sub ECHILD () { 10 } sub EWOULDBLOCK () { 11 } sub EAGAIN () { 11 } sub ENOMEM () { 12 } sub EACCES () { 13 } sub EFAULT () { 14 } sub ENOTBLK () { 15 } sub EBUSY () { 16 } sub EEXIST () { 17 } sub EXDEV () { 18 } sub ENODEV () { 19 } sub ENOTDIR () { 20 } sub EISDIR () { 21 } sub EINVAL () { 22 } sub ENFILE () { 23 } sub EMFILE () { 24 } sub ENOTTY () { 25 } sub ETXTBSY () { 26 } sub EFBIG () { 27 } sub ENOSPC () { 28 } sub ESPIPE () { 29 } sub EROFS () { 30 } sub EMLINK () { 31 } sub EPIPE () { 32 } sub EDOM () { 33 } sub ERANGE () { 34 } sub EDEADLK () { 35 } sub EDEADLOCK () { 35 } sub ENAMETOOLONG () { 36 } sub ENOLCK () { 37 } sub ENOSYS () { 38 } sub ENOTEMPTY () { 39 } sub ELOOP () { 40 } sub ENOMSG () { 42 } sub EIDRM () { 43 } sub ECHRNG () { 44 } sub EL2NSYNC () { 45 } sub EL3HLT () { 46 } sub EL3RST () { 47 } sub ELNRNG () { 48 } sub EUNATCH () { 49 } sub ENOCSI () { 50 } sub EL2HLT () { 51 } sub EBADE () { 52 } sub EBADR () { 53 } sub EXFULL () { 54 } sub ENOANO () { 55 } sub EBADRQC () { 56 } sub EBADSLT () { 57 } sub EBFONT () { 59 } sub ENOSTR () { 60 } sub ENODATA () { 61 } sub ETIME () { 62 } sub ENOSR () { 63 } sub ENONET () { 64 } sub ENOPKG () { 65 } sub EREMOTE () { 66 } sub ENOLINK () { 67 } sub EADV () { 68 } sub ESRMNT () { 69 } sub ECOMM () { 70 } sub EPROTO () { 71 } sub EMULTIHOP () { 72 } sub EDOTDOT () { 73 } sub EBADMSG () { 74 } sub EOVERFLOW () { 75 } sub ENOTUNIQ () { 76 } sub EBADFD () { 77 } sub EREMCHG () { 78 } sub ELIBACC () { 79 } sub ELIBBAD () { 80 } sub ELIBSCN () { 81 } sub ELIBMAX () { 82 } sub ELIBEXEC () { 83 } sub EILSEQ () { 84 } sub ERESTART () { 85 } sub ESTRPIPE () { 86 } sub EUSERS () { 87 } sub ENOTSOCK () { 88 } sub EDESTADDRREQ () { 89 } sub EMSGSIZE () { 90 } sub EPROTOTYPE () { 91 } sub ENOPROTOOPT () { 92 } sub EPROTONOSUPPORT () { 93 } sub ESOCKTNOSUPPORT () { 94 } sub ENOTSUP () { 95 } sub EOPNOTSUPP () { 95 } sub EPFNOSUPPORT () { 96 } sub EAFNOSUPPORT () { 97 } sub EADDRINUSE () { 98 } sub EADDRNOTAVAIL () { 99 } sub ENETDOWN () { 100 } sub ENETUNREACH () { 101 } sub ENETRESET () { 102 } sub ECONNABORTED () { 103 } sub ECONNRESET () { 104 } sub ENOBUFS () { 105 } sub EISCONN () { 106 } sub ENOTCONN () { 107 } sub ESHUTDOWN () { 108 } sub ETOOMANYREFS () { 109 } sub ETIMEDOUT () { 110 } sub ECONNREFUSED () { 111 } sub EHOSTDOWN () { 112 } sub EHOSTUNREACH () { 113 } sub EALREADY () { 114 } sub EINPROGRESS () { 115 } sub ESTALE () { 116 } sub EUCLEAN () { 117 } sub ENOTNAM () { 118 } sub ENAVAIL () { 119 } sub EISNAM () { 120 } sub EREMOTEIO () { 121 } sub EDQUOT () { 122 } sub ENOMEDIUM () { 123 } sub EMEDIUMTYPE () { 124 } sub ECANCELED () { 125 } sub TIEHASH { bless [] } sub FETCH { my ($self, $errname) = @_; my $proto = prototype("Errno::$errname"); my $errno = ""; if (defined($proto) && $proto eq "") { no strict 'refs'; $errno = &$errname; $errno = 0 unless $! == $errno; } return $errno; } sub STORE { require Carp; Carp::confess("ERRNO hash is read only!"); } *CLEAR = \&STORE; *DELETE = \&STORE; sub NEXTKEY { my($k,$v); while(($k,$v) = each %Errno::) { my $proto = prototype("Errno::$k"); last if (defined($proto) && $proto eq ""); } $k } sub FIRSTKEY { my $s = scalar keys %Errno::; # initialize iterator goto &NEXTKEY; } sub EXISTS { my ($self, $errname) = @_; my $proto = prototype($errname); defined($proto) && $proto eq ""; } tie %!, __PACKAGE__; 1; __END__ #line 277 FILE5759668f/Fcntl.pm #line 1 "/usr/lib/perl5/5.8.0/i386-linux-thread-multi/Fcntl.pm" package Fcntl; #line 57 our($VERSION, @ISA, @EXPORT, @EXPORT_OK, %EXPORT_TAGS, $AUTOLOAD); require Exporter; use XSLoader (); @ISA = qw(Exporter); $VERSION = "1.04"; # Items to export into callers namespace by default # (move infrequently used names to @EXPORT_OK below) @EXPORT = qw( FD_CLOEXEC F_ALLOCSP F_ALLOCSP64 F_COMPAT F_DUP2FD F_DUPFD F_EXLCK F_FREESP F_FREESP64 F_FSYNC F_FSYNC64 F_GETFD F_GETFL F_GETLK F_GETLK64 F_GETOWN F_NODNY F_POSIX F_RDACC F_RDDNY F_RDLCK F_RWACC F_RWDNY F_SETFD F_SETFL F_SETLK F_SETLK64 F_SETLKW F_SETLKW64 F_SETOWN F_SHARE F_SHLCK F_UNLCK F_UNSHARE F_WRACC F_WRDNY F_WRLCK O_ACCMODE O_ALIAS O_APPEND O_ASYNC O_BINARY O_CREAT O_DEFER O_DIRECT O_DIRECTORY O_DSYNC O_EXCL O_EXLOCK O_LARGEFILE O_NDELAY O_NOCTTY O_NOFOLLOW O_NOINHERIT O_NONBLOCK O_RANDOM O_RAW O_RDONLY O_RDWR O_RSRC O_RSYNC O_SEQUENTIAL O_SHLOCK O_SYNC O_TEMPORARY O_TEXT O_TRUNC O_WRONLY ); # Other items we are prepared to export if requested @EXPORT_OK = qw( FAPPEND FASYNC FCREAT FDEFER FDSYNC FEXCL FLARGEFILE FNDELAY FNONBLOCK FRSYNC FSYNC FTRUNC LOCK_EX LOCK_NB LOCK_SH LOCK_UN S_ISUID S_ISGID S_ISVTX S_ISTXT _S_IFMT S_IFREG S_IFDIR S_IFLNK S_IFSOCK S_IFBLK S_IFCHR S_IFIFO S_IFWHT S_ENFMT S_IRUSR S_IWUSR S_IXUSR S_IRWXU S_IRGRP S_IWGRP S_IXGRP S_IRWXG S_IROTH S_IWOTH S_IXOTH S_IRWXO S_IREAD S_IWRITE S_IEXEC &S_ISREG &S_ISDIR &S_ISLNK &S_ISSOCK &S_ISBLK &S_ISCHR &S_ISFIFO &S_ISWHT &S_ISENFMT &S_IFMT &S_IMODE SEEK_SET SEEK_CUR SEEK_END ); # Named groups of exports %EXPORT_TAGS = ( 'flock' => [qw(LOCK_SH LOCK_EX LOCK_NB LOCK_UN)], 'Fcompat' => [qw(FAPPEND FASYNC FCREAT FDEFER FDSYNC FEXCL FLARGEFILE FNDELAY FNONBLOCK FRSYNC FSYNC FTRUNC)], 'seek' => [qw(SEEK_SET SEEK_CUR SEEK_END)], 'mode' => [qw(S_ISUID S_ISGID S_ISVTX S_ISTXT _S_IFMT S_IFREG S_IFDIR S_IFLNK S_IFSOCK S_IFBLK S_IFCHR S_IFIFO S_IFWHT S_ENFMT S_IRUSR S_IWUSR S_IXUSR S_IRWXU S_IRGRP S_IWGRP S_IXGRP S_IRWXG S_IROTH S_IWOTH S_IXOTH S_IRWXO S_IREAD S_IWRITE S_IEXEC S_ISREG S_ISDIR S_ISLNK S_ISSOCK S_ISBLK S_ISCHR S_ISFIFO S_ISWHT S_ISENFMT S_IFMT S_IMODE )], ); sub S_IFMT { @_ ? ( $_[0] & _S_IFMT() ) : _S_IFMT() } sub S_IMODE { $_[0] & 07777 } sub S_ISREG { ( $_[0] & _S_IFMT() ) == S_IFREG() } sub S_ISDIR { ( $_[0] & _S_IFMT() ) == S_IFDIR() } sub S_ISLNK { ( $_[0] & _S_IFMT() ) == S_IFLNK() } sub S_ISSOCK { ( $_[0] & _S_IFMT() ) == S_IFSOCK() } sub S_ISBLK { ( $_[0] & _S_IFMT() ) == S_IFBLK() } sub S_ISCHR { ( $_[0] & _S_IFMT() ) == S_IFCHR() } sub S_ISFIFO { ( $_[0] & _S_IFMT() ) == S_IFIFO() } sub S_ISWHT { ( $_[0] & _S_IFMT() ) == S_IFWHT() } sub S_ISENFMT { ( $_[0] & _S_IFMT() ) == S_IFENFMT() } sub AUTOLOAD { (my $constname = $AUTOLOAD) =~ s/.*:://; die "&Fcntl::constant not defined" if $constname eq 'constant'; my ($error, $val) = constant($constname); if ($error) { my (undef,$file,$line) = caller; die "$error at $file line $line.\n"; } *$AUTOLOAD = sub { $val }; goto &$AUTOLOAD; } XSLoader::load 'Fcntl', $VERSION; 1; FILE8bc7a4a7/File/Glob.pm#line 1 "/usr/lib/perl5/5.8.0/i386-linux-thread-multi/File/Glob.pm" package File::Glob; use strict; our($VERSION, @ISA, @EXPORT_OK, @EXPORT_FAIL, %EXPORT_TAGS, $AUTOLOAD, $DEFAULT_FLAGS); use XSLoader (); @ISA = qw(Exporter); # NOTE: The glob() export is only here for compatibility with 5.6.0. # csh_glob() should not be used directly, unless you know what you're doing. @EXPORT_OK = qw( csh_glob bsd_glob glob GLOB_ABEND GLOB_ALPHASORT GLOB_ALTDIRFUNC GLOB_BRACE GLOB_CSH GLOB_ERR GLOB_ERROR GLOB_LIMIT GLOB_MARK GLOB_NOCASE GLOB_NOCHECK GLOB_NOMAGIC GLOB_NOSORT GLOB_NOSPACE GLOB_QUOTE GLOB_TILDE ); %EXPORT_TAGS = ( 'glob' => [ qw( GLOB_ABEND GLOB_ALPHASORT GLOB_ALTDIRFUNC GLOB_BRACE GLOB_CSH GLOB_ERR GLOB_ERROR GLOB_LIMIT GLOB_MARK GLOB_NOCASE GLOB_NOCHECK GLOB_NOMAGIC GLOB_NOSORT GLOB_NOSPACE GLOB_QUOTE GLOB_TILDE glob bsd_glob ) ], ); $VERSION = '1.01'; sub import { require Exporter; my $i = 1; while ($i < @_) { if ($_[$i] =~ /^:(case|nocase|globally)$/) { splice(@_, $i, 1); $DEFAULT_FLAGS &= ~GLOB_NOCASE() if $1 eq 'case'; $DEFAULT_FLAGS |= GLOB_NOCASE() if $1 eq 'nocase'; if ($1 eq 'globally') { local $^W; *CORE::GLOBAL::glob = \&File::Glob::csh_glob; } next; } ++$i; } goto &Exporter::import; } sub AUTOLOAD { # This AUTOLOAD is used to 'autoload' constants from the constant() # XS function. If a constant is not found then control is passed # to the AUTOLOAD in AutoLoader. my $constname; ($constname = $AUTOLOAD) =~ s/.*:://; my ($error, $val) = constant($constname); if ($error) { require Carp; Carp::croak($error); } eval "sub $AUTOLOAD { $val }"; goto &$AUTOLOAD; } XSLoader::load 'File::Glob', $VERSION; # Preloaded methods go here. sub GLOB_ERROR { return (constant('GLOB_ERROR'))[1]; } sub GLOB_CSH () { GLOB_BRACE() | GLOB_NOMAGIC() | GLOB_QUOTE() | GLOB_TILDE() | GLOB_ALPHASORT() } $DEFAULT_FLAGS = GLOB_CSH(); if ($^O =~ /^(?:MSWin32|VMS|os2|dos|riscos|MacOS)$/) { $DEFAULT_FLAGS |= GLOB_NOCASE(); } # Autoload methods go after =cut, and are processed by the autosplit program. sub bsd_glob { my ($pat,$flags) = @_; $flags = $DEFAULT_FLAGS if @_ < 2; return doglob($pat,$flags); } # File::Glob::glob() is deprecated because its prototype is different from # CORE::glob() (use bsd_glob() instead) sub glob { goto &bsd_glob; } ## borrowed heavily from gsar's File::DosGlob my %iter; my %entries; sub csh_glob { my $pat = shift; my $cxix = shift; my @pat; # glob without args defaults to $_ $pat = $_ unless defined $pat; # extract patterns $pat =~ s/^\s+//; # Protect against empty elements in $pat =~ s/\s+$//; # things like < *.c> and <*.c >. # These alone shouldn't trigger ParseWords. if ($pat =~ /\s/) { # XXX this is needed for compatibility with the csh # implementation in Perl. Need to support a flag # to disable this behavior. require Text::ParseWords; @pat = Text::ParseWords::parse_line('\s+',0,$pat); } # assume global context if not provided one $cxix = '_G_' unless defined $cxix; $iter{$cxix} = 0 unless exists $iter{$cxix}; # if we're just beginning, do it all first if ($iter{$cxix} == 0) { if (@pat) { $entries{$cxix} = [ map { doglob($_, $DEFAULT_FLAGS) } @pat ]; } else { $entries{$cxix} = [ doglob($pat, $DEFAULT_FLAGS) ]; } } # chuck it all out, quick or slow if (wantarray) { delete $iter{$cxix}; return @{delete $entries{$cxix}}; } else { if ($iter{$cxix} = scalar @{$entries{$cxix}}) { return shift @{$entries{$cxix}}; } else { # return undef for EOL delete $iter{$cxix}; delete $entries{$cxix}; return undef; } } } 1; __END__ #line 466 FILE1a66b451/IO.pma#line 1 "/usr/lib/perl5/5.8.0/i386-linux-thread-multi/IO.pm" # package IO; use XSLoader (); use Carp; $VERSION = "1.20"; XSLoader::load 'IO', $VERSION; sub import { shift; my @l = @_ ? @_ : qw(Handle Seekable File Pipe Socket Dir); eval join("", map { "require IO::" . (/(\w+)/)[0] . ";\n" } @l) or croak $@; } 1; __END__ #line 47 FILE802dac5b/IO/File.pm#line 1 "/usr/lib/perl5/5.8.0/i386-linux-thread-multi/IO/File.pm" # package IO::File; #line 105 use 5.006_001; use strict; our($VERSION, @EXPORT, @EXPORT_OK, @ISA); use Carp; use Symbol; use SelectSaver; use IO::Seekable; use File::Spec; require Exporter; @ISA = qw(IO::Handle IO::Seekable Exporter); $VERSION = "1.09"; @EXPORT = @IO::Seekable::EXPORT; eval { # Make all Fcntl O_XXX constants available for importing require Fcntl; my @O = grep /^O_/, @Fcntl::EXPORT; Fcntl->import(@O); # first we import what we want to export push(@EXPORT, @O); }; ################################################ ## Constructor ## sub new { my $type = shift; my $class = ref($type) || $type || "IO::File"; @_ >= 0 && @_ <= 3 or croak "usage: new $class [FILENAME [,MODE [,PERMS]]]"; my $fh = $class->SUPER::new(); if (@_) { $fh->open(@_) or return undef; } $fh; } ################################################ ## Open ## sub open { @_ >= 2 && @_ <= 4 or croak 'usage: $fh->open(FILENAME [,MODE [,PERMS]])'; my ($fh, $file) = @_; if (@_ > 2) { my ($mode, $perms) = @_[2, 3]; if ($mode =~ /^\d+$/) { defined $perms or $perms = 0666; return sysopen($fh, $file, $mode, $perms); } if (! File::Spec->file_name_is_absolute($file)) { $file = File::Spec->catfile(File::Spec->curdir(),$file); } $file = IO::Handle::_open_mode_string($mode) . " $file\0"; } open($fh, $file); } 1; FILE1112dc24/IO/Handle.pm#line 1 "/usr/lib/perl5/5.8.0/i386-linux-thread-multi/IO/Handle.pm" package IO::Handle; #line 249 use 5.006_001; use strict; our($VERSION, @EXPORT_OK, @ISA); use Carp; use Symbol; use SelectSaver; use IO (); # Load the XS module require Exporter; @ISA = qw(Exporter); $VERSION = "1.21_00"; $VERSION = eval $VERSION; @EXPORT_OK = qw( 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 format_write print printf getline getlines printflush flush SEEK_SET SEEK_CUR SEEK_END _IOFBF _IOLBF _IONBF ); ################################################ ## Constructors, destructors. ## sub new { my $class = ref($_[0]) || $_[0] || "IO::Handle"; @_ == 1 or croak "usage: new $class"; my $io = gensym; bless $io, $class; } sub new_from_fd { my $class = ref($_[0]) || $_[0] || "IO::Handle"; @_ == 3 or croak "usage: new_from_fd $class FD, MODE"; my $io = gensym; shift; IO::Handle::fdopen($io, @_) or return undef; bless $io, $class; } # # There is no need for DESTROY to do anything, because when the # last reference to an IO object is gone, Perl automatically # closes its associated files (if any). However, to avoid any # attempts to autoload DESTROY, we here define it to do nothing. # sub DESTROY {} ################################################ ## Open and close. ## sub _open_mode_string { my ($mode) = @_; $mode =~ /^\+?(<|>>?)$/ or $mode =~ s/^r(\+?)$/$1/ or $mode =~ s/^a(\+?)$/$1>>/ or croak "IO::Handle: bad open mode: $mode"; $mode; } sub fdopen { @_ == 3 or croak 'usage: $io->fdopen(FD, MODE)'; my ($io, $fd, $mode) = @_; local(*GLOB); if (ref($fd) && "".$fd =~ /GLOB\(/o) { # It's a glob reference; Alias it as we cannot get name of anon GLOBs my $n = qualify(*GLOB); *GLOB = *{*$fd}; $fd = $n; } elsif ($fd =~ m#^\d+$#) { # It's an FD number; prefix with "=". $fd = "=$fd"; } open($io, _open_mode_string($mode) . '&' . $fd) ? $io : undef; } sub close { @_ == 1 or croak 'usage: $io->close()'; my($io) = @_; close($io); } ################################################ ## Normal I/O functions. ## # flock # select sub opened { @_ == 1 or croak 'usage: $io->opened()'; defined fileno($_[0]); } sub fileno { @_ == 1 or croak 'usage: $io->fileno()'; fileno($_[0]); } sub getc { @_ == 1 or croak 'usage: $io->getc()'; getc($_[0]); } sub eof { @_ == 1 or croak 'usage: $io->eof()'; eof($_[0]); } sub print { @_ or croak 'usage: $io->print(ARGS)'; my $this = shift; print $this @_; } sub printf { @_ >= 2 or croak 'usage: $io->printf(FMT,[ARGS])'; my $this = shift; printf $this @_; } sub getline { @_ == 1 or croak 'usage: $io->getline()'; my $this = shift; return scalar <$this>; } *gets = \&getline; # deprecated sub getlines { @_ == 1 or croak 'usage: $io->getlines()'; wantarray or croak 'Can\'t call $io->getlines in a scalar context, use $io->getline'; my $this = shift; return <$this>; } sub truncate { @_ == 2 or croak 'usage: $io->truncate(LEN)'; truncate($_[0], $_[1]); } sub read { @_ == 3 || @_ == 4 or croak 'usage: $io->read(BUF, LEN [, OFFSET])'; read($_[0], $_[1], $_[2], $_[3] || 0); } sub sysread { @_ == 3 || @_ == 4 or croak 'usage: $io->sysread(BUF, LEN [, OFFSET])'; sysread($_[0], $_[1], $_[2], $_[3] || 0); } sub write { @_ >= 2 && @_ <= 4 or croak 'usage: $io->write(BUF [, LEN [, OFFSET]])'; local($\) = ""; $_[2] = length($_[1]) unless defined $_[2]; print { $_[0] } substr($_[1], $_[3] || 0, $_[2]); } sub syswrite { @_ >= 2 && @_ <= 4 or croak 'usage: $io->syswrite(BUF [, LEN [, OFFSET]])'; if (defined($_[2])) { syswrite($_[0], $_[1], $_[2], $_[3] || 0); } else { syswrite($_[0], $_[1]); } } sub stat { @_ == 1 or croak 'usage: $io->stat()'; stat($_[0]); } ################################################ ## State modification functions. ## sub autoflush { my $old = new SelectSaver qualify($_[0], caller); my $prev = $|; $| = @_ > 1 ? $_[1] : 1; $prev; } sub output_field_separator { carp "output_field_separator is not supported on a per-handle basis" if ref($_[0]); my $prev = $,; $, = $_[1] if @_ > 1; $prev; } sub output_record_separator { carp "output_record_separator is not supported on a per-handle basis" if ref($_[0]); my $prev = $\; $\ = $_[1] if @_ > 1; $prev; } sub input_record_separator { carp "input_record_separator is not supported on a per-handle basis" if ref($_[0]); my $prev = $/; $/ = $_[1] if @_ > 1; $prev; } sub input_line_number { local $.; my $tell = tell qualify($_[0], caller) if ref($_[0]); my $prev = $.; $. = $_[1] if @_ > 1; $prev; } sub format_page_number { my $old = new SelectSaver qualify($_[0], caller) if ref($_[0]); my $prev = $%; $% = $_[1] if @_ > 1; $prev; } sub format_lines_per_page { my $old = new SelectSaver qualify($_[0], caller) if ref($_[0]); my $prev = $=; $= = $_[1] if @_ > 1; $prev; } sub format_lines_left { my $old = new SelectSaver qualify($_[0], caller) if ref($_[0]); my $prev = $-; $- = $_[1] if @_ > 1; $prev; } sub format_name { my $old = new SelectSaver qualify($_[0], caller) if ref($_[0]); my $prev = $~; $~ = qualify($_[1], caller) if @_ > 1; $prev; } sub format_top_name { my $old = new SelectSaver qualify($_[0], caller) if ref($_[0]); my $prev = $^; $^ = qualify($_[1], caller) if @_ > 1; $prev; } sub format_line_break_characters { carp "format_line_break_characters is not supported on a per-handle basis" if ref($_[0]); my $prev = $:; $: = $_[1] if @_ > 1; $prev; } sub format_formfeed { carp "format_formfeed is not supported on a per-handle basis" if ref($_[0]); my $prev = $^L; $^L = $_[1] if @_ > 1; $prev; } sub formline { my $io = shift; my $picture = shift; local($^A) = $^A; local($\) = ""; formline($picture, @_); print $io $^A; } sub format_write { @_ < 3 || croak 'usage: $io->write( [FORMAT_NAME] )'; if (@_ == 2) { my ($io, $fmt) = @_; my $oldfmt = $io->format_name($fmt); CORE::write($io); $io->format_name($oldfmt); } else { CORE::write($_[0]); } } # XXX undocumented sub fcntl { @_ == 3 || croak 'usage: $io->fcntl( OP, VALUE );'; my ($io, $op) = @_; return fcntl($io, $op, $_[2]); } # XXX undocumented sub ioctl { @_ == 3 || croak 'usage: $io->ioctl( OP, VALUE );'; my ($io, $op) = @_; return ioctl($io, $op, $_[2]); } # this sub is for compatability with older releases of IO that used # a sub called constant to detemine if a constant existed -- GMB # # The SEEK_* and _IO?BF constants were the only constants at that time # any new code should just chech defined(&CONSTANT_NAME) sub constant { no strict 'refs'; my $name = shift; (($name =~ /^(SEEK_(SET|CUR|END)|_IO[FLN]BF)$/) && defined &{$name}) ? &{$name}() : undef; } # so that flush.pl can be deprecated sub printflush { my $io = shift; my $old = new SelectSaver qualify($io, caller) if ref($io); local $| = 1; if(ref($io)) { print $io @_; } else { print @_; } } 1; FILE4c4336c6/IO/Seekable.pm#line 1 "/usr/lib/perl5/5.8.0/i386-linux-thread-multi/IO/Seekable.pm" # package IO::Seekable; #line 96 use 5.006_001; use Carp; use strict; our($VERSION, @EXPORT, @ISA); use IO::Handle (); # XXX we can't get these from IO::Handle or we'll get prototype # mismatch warnings on C :-( use Fcntl qw(SEEK_SET SEEK_CUR SEEK_END); require Exporter; @EXPORT = qw(SEEK_SET SEEK_CUR SEEK_END); @ISA = qw(Exporter); $VERSION = "1.08_00"; $VERSION = eval $VERSION; sub seek { @_ == 3 or croak 'usage: $io->seek(POS, WHENCE)'; seek($_[0], $_[1], $_[2]); } sub sysseek { @_ == 3 or croak 'usage: $io->sysseek(POS, WHENCE)'; sysseek($_[0], $_[1], $_[2]); } sub tell { @_ == 1 or croak 'usage: $io->tell()'; tell($_[0]); } 1; FILE4858ef62/XSLoader.pm F#line 1 "/usr/lib/perl5/5.8.0/i386-linux-thread-multi/XSLoader.pm" # Generated from XSLoader.pm.PL (resolved %Config::Config value) package XSLoader; # And Gandalf said: 'Many folk like to know beforehand what is to # be set on the table; but those who have laboured to prepare the # feast like to keep their secret; for wonder makes the words of # praise louder.' # (Quote from Tolkien sugested by Anno Siegel.) # # See pod text at end of file for documentation. # See also ext/DynaLoader/README in source tree for other information. # # Tim.Bunce@ig.co.uk, August 1994 $VERSION = "0.01"; # avoid typo warning # enable debug/trace messages from DynaLoader perl code # $dl_debug = $ENV{PERL_DL_DEBUG} || 0 unless defined $dl_debug; my $dl_dlext = 'so'; package DynaLoader; # No prizes for guessing why we don't say 'bootstrap DynaLoader;' here. # NOTE: All dl_*.xs (including dl_none.xs) define a dl_error() XSUB boot_DynaLoader('DynaLoader') if defined(&boot_DynaLoader) && !defined(&dl_error); package XSLoader; 1; # End of main code # The bootstrap function cannot be autoloaded (without complications) # so we define it here: sub load { package DynaLoader; my($module) = $_[0]; # work with static linking too my $b = "$module\::bootstrap"; goto &$b if defined &$b; goto retry unless $module and defined &dl_load_file; my @modparts = split(/::/,$module); my $modfname = $modparts[-1]; my $modpname = join('/',@modparts); my $modlibname = (caller())[1]; my $c = @modparts; $modlibname =~ s,[\\/][^\\/]+$,, while $c--; # Q&D basename my $file = "$modlibname/auto/$modpname/$modfname.$dl_dlext"; # print STDERR "XSLoader::load for $module ($file)\n" if $dl_debug; my $bs = $file; $bs =~ s/(\.\w+)?(;\d*)?$/\.bs/; # look for .bs 'beside' the library goto retry if not -f $file or -s $bs; my $bootname = "boot_$module"; $bootname =~ s/\W/_/g; @dl_require_symbols = ($bootname); my $boot_symbol_ref; if ($^O eq 'darwin') { if ($boot_symbol_ref = dl_find_symbol(0, $bootname)) { goto boot; #extension library has already been loaded, e.g. darwin } } # Many dynamic extension loading problems will appear to come from # this section of code: XYZ failed at line 123 of DynaLoader.pm. # Often these errors are actually occurring in the initialisation # C code of the extension XS file. Perl reports the error as being # in this perl code simply because this was the last perl code # it executed. my $libref = dl_load_file($file, 0) or do { require Carp; Carp::croak("Can't load '$file' for module $module: " . dl_error()); }; push(@dl_librefs,$libref); # record loaded object my @unresolved = dl_undef_symbols(); if (@unresolved) { require Carp; Carp::carp("Undefined symbols present after loading $file: @unresolved\n"); } $boot_symbol_ref = dl_find_symbol($libref, $bootname) or do { require Carp; Carp::croak("Can't find '$bootname' symbol in $file\n"); }; push(@dl_modules, $module); # record loaded module boot: my $xs = dl_install_xsub("${module}::bootstrap", $boot_symbol_ref, $file); # See comment block above return &$xs(@_); retry: require DynaLoader; goto &DynaLoader::bootstrap_inherit; } __END__ #line 139 FILE50e023d6/auto/Cwd/Cwd.so4ELF4%4 (  CKEJ:#>GC!)-9F?'6@70I;13B.H/42%A<"8= 5*&,+($D2   P              !<: 6LxE)/ 8 m 6 Vs!V ! 5 ^3m;"uel! !e6J P1  0_DYNAMIC_GLOBAL_OFFSET_TABLE___gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesopen64strncpystrrchr__lxstat64readlink__errno_locationfchdirclosestrcpygetcwdstrlenstrcatXS_Cwd_fastcwdPerl_Gthr_key_ptrpthread_getspecificPerl_Tstack_sp_ptrPerl_Tstack_base_ptrPerl_Tmarkstack_ptr_ptrPerl_Top_ptrPerl_Tcurpad_ptrPerl_getcwd_svPerl_Itainting_ptrPerl_sv_taintPerl_mg_setPerl_sv_newmortalPerl_croakXS_Cwd_abs_pathPerl_sv_setpvnPerl_Isv_undef_ptrPerl_sv_setsv_flagsPerl_sv_2pv_nolenboot_CwdPerl_newXSPerl_sv_setpvPerl_Isv_yes_ptrPerl_sv_2pv_flagsPerl_formPerl_get_svlibc.so.6_edata__bss_start_endGLIBC_2.2GLIBC_2.1.3GLIBC_2.1GLIBC_2.0bii si ii ii   !-!7!;!E!I   !!! !!!"!#!$!% !&$!((!),!*0!+4!,8!./1ɉ4$7xljt! t€uҋt)ы9D=v>$tE4$xD$|$x|$04$D$맀~ <$>nvf.nt&UWVS -$8$$$E$$$$$s2$4$$)u)ʉ}@EE$$P$@$ 0$\$"$$<$$P 4$$$t$$$$F @U$H$$8u+$%$$0<[^_]$$$|$$$$|$e$$u$|$$$N$p$6$D$4$|$D$ $5$$T$$$$$$$xD$w&'UWVS&ÍL$$^$6$Eu$;$C$U$$2$4)$$$)uE)ʉ}@E썃E$$U@ $${$U@$E$M$UU}E$P$$UDE}tAUB=@E8Uԉ6$$$D$D$ED$ !$$k$$SU$+D$T$ D$D$94$D$$>$$|$$$U4$$$$$$UL[^_]$$nu܋U؉$D$EԉT$D$ :tRD$M܋E؅t N ^ n ~ .>N^n~GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5), #$W S/usr/src/build/143461-i386/BUILD/glibc-2.2.92/csuGNU AS 2.13.90.0.2Sq/usr/src/build/143461-i386/BUILD/glibc-2.2.92/csuGNU AS 2.13.90.0.2%%m# /tmp/cc1dWf6a.s,W 3,:,Wdd,,-:J# /tmp/ccO1UwYa.s!: .symtab.strtab.shstrtab.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.data.eh_frame.dynamic.ctors.dtors.jcr.got.bss.comment.debug_aranges.debug_info.debug_abbrev.debug_line@! )1o2 2 >o PM   8V P P 0 _ Z pekq2 y        !!!"X###$*@3 P012   P              !  ' 5 C V c  g!s4          <*5G[ d6u -@m O6`r! !  3!"=Sf!m !6 P1  0initfini.ccall_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____EH_FRAME_BEGIN____JCR_LIST__p.0completed.1__do_global_dtors_auxframe_dummy__CTOR_END____DTOR_END____FRAME_END____JCR_END____do_global_ctors_auxCwd.cbsd_realpath__dso_handle__i686.get_pc_thunk.bxreadlink@@GLIBC_2.0Perl_croakPerl_sv_2pv_flagspthread_getspecific_DYNAMICclose@@GLIBC_2.0Perl_mg_setPerl_sv_newmortalPerl_form__errno_location@@GLIBC_2.0Perl_sv_taintPerl_Tcurpad_ptrPerl_Isv_yes_ptr_initPerl_sv_setpvPerl_newXSPerl_Top_ptrPerl_Tmarkstack_ptr_ptrPerl_Isv_undef_ptrXS_Cwd_fastcwdchdir@@GLIBC_2.0strlen@@GLIBC_2.0Perl_sv_setsv_flagsPerl_Tstack_base_ptrPerl_get_svPerl_Gthr_key_ptr__bss_startPerl_getcwd_svstrcat@@GLIBC_2.0XS_Cwd_abs_path_finiopen64@@GLIBC_2.1strrchr@@GLIBC_2.0__cxa_finalize@@GLIBC_2.1.3__lxstat64@@GLIBC_2.2Perl_Itainting_ptr_edata_GLOBAL_OFFSET_TABLE__endgetcwd@@GLIBC_2.0strncpy@@GLIBC_2.0fchdir@@GLIBC_2.0Perl_Tstack_sp_ptr_Jv_RegisterClassesboot_CwdPerl_sv_setpvnPerl_sv_2pv_nolen__gmon_start__strcpy@@GLIBC_2.0FILE'a9dfef12/auto/DynaLoader/dl_findfile.al#line 1 "/usr/lib/perl5/5.8.0/i386-linux-thread-multi/auto/DynaLoader/dl_findfile.al" # NOTE: Derived from ../../lib/DynaLoader.pm. # Changes made here will be lost when autosplit is run again. # See AutoSplit.pm. package DynaLoader; #line 265 "../../lib/DynaLoader.pm (autosplit into ../../lib/auto/DynaLoader/dl_findfile.al)" sub dl_findfile { # Read ext/DynaLoader/DynaLoader.doc for detailed information. # This function does not automatically consider the architecture # or the perl library auto directories. my (@args) = @_; my (@dirs, $dir); # which directories to search my (@found); # full paths to real files we have found my $dl_ext= 'so'; # $Config::Config{'dlext'} suffix for perl extensions my $dl_so = 'so'; # $Config::Config{'so'} suffix for shared libraries print STDERR "dl_findfile(@args)\n" if $dl_debug; # accumulate directories but process files as they appear arg: foreach(@args) { # Special fast case: full filepath requires no search if ($Is_VMS && m%[:>/\]]% && -f $_) { push(@found,dl_expandspec(VMS::Filespec::vmsify($_))); last arg unless wantarray; next; } elsif ($Is_MacOS) { if (m/:/ && -f $_) { push(@found,$_); last arg unless wantarray; } } elsif (m:/: && -f $_ && !$do_expand) { push(@found,$_); last arg unless wantarray; next; } # Deal with directories first: # Using a -L prefix is the preferred option (faster and more robust) if (m:^-L:) { s/^-L//; push(@dirs, $_); next; } if ($Is_MacOS) { # Otherwise we try to try to spot directories by a heuristic # (this is a more complicated issue than it first appears) if (m/:/ && -d $_) { push(@dirs, $_); next; } # Only files should get this far... my(@names, $name); # what filenames to look for s/^-l//; push(@names, $_); foreach $dir (@dirs, @dl_library_path) { next unless -d $dir; $dir =~ s/^([^:]+)$/:$1/; $dir =~ s/:$//; foreach $name (@names) { my($file) = "$dir:$name"; print STDERR " checking in $dir for $name\n" if $dl_debug; if (-f $file) { push(@found, $file); next arg; # no need to look any further } } } next; } # Otherwise we try to try to spot directories by a heuristic # (this is a more complicated issue than it first appears) if (m:/: && -d $_) { push(@dirs, $_); next; } # VMS: we may be using native VMS directory syntax instead of # Unix emulation, so check this as well if ($Is_VMS && /[:>\]]/ && -d $_) { push(@dirs, $_); next; } # Only files should get this far... my(@names, $name); # what filenames to look for if (m:-l: ) { # convert -lname to appropriate library name s/-l//; push(@names,"lib$_.$dl_so"); push(@names,"lib$_.a"); } else { # Umm, a bare name. Try various alternatives: # these should be ordered with the most likely first push(@names,"$_.$dl_ext") unless m/\.$dl_ext$/o; push(@names,"$_.$dl_so") unless m/\.$dl_so$/o; push(@names,"lib$_.$dl_so") unless m:/:; push(@names,"$_.a") if !m/\.a$/ and $dlsrc eq "dl_dld.xs"; push(@names, $_); } foreach $dir (@dirs, @dl_library_path) { next unless -d $dir; chop($dir = VMS::Filespec::unixpath($dir)) if $Is_VMS; foreach $name (@names) { my($file) = "$dir/$name"; print STDERR " checking in $dir for $name\n" if $dl_debug; $file = ($do_expand) ? dl_expandspec($file) : (-f $file && $file); #$file = _check_file($file); if ($file) { push(@found, $file); next arg; # no need to look any further } } } } if ($dl_debug) { foreach(@dirs) { print STDERR " dl_findfile ignored non-existent directory: $_\n" unless -d $_; } print STDERR "dl_findfile found: @found\n"; } return $found[0] unless wantarray; @found; } # end of DynaLoader::dl_findfile 1; FILE045fe44f/auto/Fcntl/Fcntl.soBELFp 4/4 (P*P*P*P:P:X\\*\:\:%9786*,&/3%-$0#+1524' !"().H  p  # # P: X:\:$;,;4;8;;kG\:+Y7/ v& ;5# ;"^@] ; 8;;pJ _DYNAMIC_GLOBAL_OFFSET_TABLE___gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesXS_Fcntl_constantPerl_Tstack_sp_ptrPerl_Tstack_base_ptrPerl_Tmarkstack_ptr_ptrPerl_Top_ptrPerl_Tcurpad_ptrPerl_newSVpvf_nocontextPerl_sv_2mortalPerl_Tstack_max_ptrPerl_Isv_undef_ptrPerl_sv_setivPerl_mg_setPerl_stack_growPerl_sv_2pv_flagsPerl_sv_newmortalPerl_croakboot_FcntlPerl_newXSPerl_Isv_yes_ptrPerl_formPerl_get_svlibc.so.6_edata__bss_start_endGLIBC_2.1.3si P:T:;1;2;7;8D;H;L;P;T;X; \;!`;"d;#h;$l;&p;'t;(x;)|;*;,;-;/;1;6;7Uu hhhhh h($h0(h8p,h@`0hHP4hP@8hX0<h` @hhDhpHhxLhPhThXh\hUSP[þ0ltЋ]ÐUSR[Ú0pu4`u/tҋuƃp]à C뾉USP[20t hu]É P!吐U t$u $|$Fi/XtLX:Rt$ȋt$|$]Í8t˃Yuƍڍҍt&U $U t$|$B[/PwFDu u&u&$ȋt$|$]ùE 8tu uċE뜋u 8t뗋u ܋u u jU?E %uE E ,8E 38u :EU $U t$|$B9ë-PE A8twE I8tUE Q8t3u Y8t&'$ȋt$|$]u au׋E`&'u iuU E q8zE y8TE 8.E 8u E@E tHE uE@u UEE 8RE 8,u EBE uE E EE uEu UE 8]u AEsE E E  uEE uEE tHE !t%u )zUEEEEtE 1tE 9tu AU%u Iuu QEu YhE aE iuEE quE nE yE E uE u E uEE uEE *E uEu 2U@dt&u  u;E 8E uE8E uEu xUu Su@E 8$E uE N ^ n ~   . > N ^ GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5),# p #$W# S/usr/src/build/143461-i386/BUILD/glibc-2.2.92/csuGNU AS 2.13.90.0.2Sq/usr/src/build/143461-i386/BUILD/glibc-2.2.92/csuGNU AS 2.13.90.0.2%%m# /tmp/cc1dWf6a.s#,W3,:p ,Wdd,,-:J# /tmp/ccO1UwYa.s#!: .symtab.strtab.shstrtab.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.data.eh_frame.dynamic.ctors.dtors.jcr.got.bss.comment.debug_aranges.debug_info.debug_abbrev.debug_line! )1or>o M 0V HH _Z  `ep p k##q # #0 yP:P*X:X*\:\*$;$+,;,+4;4+8;8+p;++,X---.4  >H  p  # # P: X:\:$;,;4;8;; p  '$;5,;CX:V4;cT: g;s   (;0;X:4;" @ |  p k  8   *  6F ? D8 Ix N1 S X ] b g lV q v {b  > @      [    u   E     @ V   9 G   0 W   # ) / 5 ; A G M  SX Y _ e k q w }X      1 M i      P: "  \:)AM_oy&  ;,@# F"b@] t;{8;;  initfini.ccall_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____EH_FRAME_BEGIN____JCR_LIST__p.0completed.1__do_global_dtors_auxframe_dummy__CTOR_END____DTOR_END____FRAME_END____JCR_END____do_global_ctors_auxFcntl.cconstant_5constant_6constant_7constant_8constant_9constant_10constant_11constant.L15.L17.L20.L14.L22.L24.L26.L28.L39.L44.L46.L48.L54.L58.L62.L38.L67.L70.L78.L82.L84.L86.L88.L96.L102.L104.L109.L111.L116.L140.L139.L142.L145.L149.L151.L153.L156.L160.L163.L165.L168.L170.L172.L184.L183.L187.L189.L191.L193.L195.L203.L205.L207.L202.L209.L211.L213.L221.L220.L223.L225.L227.L229.L237.L238.L239.L240.L241.L242.L243.L244__dso_handle__i686.get_pc_thunk.bxPerl_croakPerl_sv_setivPerl_sv_2pv_flags_DYNAMICPerl_newSVpvf_nocontextPerl_mg_setPerl_sv_newmortalPerl_stack_growPerl_formPerl_Tcurpad_ptrPerl_Isv_yes_ptr_initPerl_sv_2mortalPerl_newXSPerl_Top_ptrPerl_Tmarkstack_ptr_ptrPerl_Isv_undef_ptrboot_FcntlPerl_Tstack_base_ptrPerl_get_sv__bss_startPerl_Tstack_max_ptr_fini__cxa_finalize@@GLIBC_2.1.3XS_Fcntl_constant_edata_GLOBAL_OFFSET_TABLE__endPerl_Tstack_sp_ptr_Jv_RegisterClasses__gmon_start__FILE6130ed89/auto/File/Glob/Glob.so\ELF4G4 (AAAQQAQQC^Z=Y<K.S(V)IW*!TH,X:7A]N?R/6\DGBL0-PFM+[Q';"%#12934$ &>E@8C5UJO    `0  X> > Q QQRRRRS 4 0pL. Q%$xB}JT@8 o/;,o:d/ %U^|S\@)j 0' 5X> x ;"iq\}S RSJ ( _DYNAMIC_GLOBAL_OFFSET_TABLE___gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesPerl_Gthr_key_ptrpthread_getspecificPerl_Ireentrant_buffer_ptrreaddir64_r__errno_locationbsd_globgetenvgetuidgetpwuid_rPerl_reentrant_retrygetpwnam_rqsortstrcmpclosedirPerl_safesysreallocPerl_safesysmallocPerl_safesysfree__ctype_tolowerbsd_globfreeopendir__lxstat64__xstat64Perl_Imodglobal_ptrPerl_hv_fetchPerl_sv_2uverrfuncXS_File__Glob_doglobPerl_Tstack_sp_ptrPerl_Tstack_base_ptrPerl_Tmarkstack_ptr_ptrPerl_Tstack_max_ptrstrlenPerl_newSVpvnPerl_sv_2mortalPerl_Ttainted_ptrPerl_Itainting_ptrPerl_sv_taintPerl_stack_growPerl_sv_2ivPerl_sv_2pv_nolenPerl_croakXS_File__Glob_constantPerl_Top_ptrPerl_Tcurpad_ptrPerl_newSVpvf_nocontextPerl_Isv_undef_ptrPerl_sv_setivPerl_mg_setPerl_sv_2pv_flagsPerl_sv_newmortalboot_File__GlobPerl_newXSPerl_sv_setpvPerl_newSVPerl_sv_setuvPerl_Isv_yes_ptrPerl_formPerl_get_svlibc.so.6_edata__bss_start_endGLIBC_2.1.3GLIBC_2.2GLIBC_2.1.2GLIBC_2.0si ii ri ii QQSS S!S=SNSZS]RRRRRR"R$R%R&R'R(R)R*R+R,R.R/R0R1R3R4R5R6S7S8S9 S:S;S<S>S? S@$SA(SB,SC0SD4SF8SGtЋ]ÐUSR[ú>u4u/tҋuƃ]à 뾉USP[R>t u]É P 吐UVSF>$$$0$$$oE $T$D$n70t 1[^]$L$b$ UWV UE uuFE uFE }%F EFFE 9s1Bt)'\t[f9sBu'f} yt$$s ^_]Ét$$g␍t&Bu\J @9sBt f9sBuy&UWV }f?{t\EE&4$D${t(4$E |$D$ED$ 0űE ^_]É<$E D$f}ufuߐUWV Mu 9t f9uf1ωft)f[f{f}yfu׋ufu&UT$$U 1^_]19w1t&f[[,Vt9vӋE몋t f,ti9sv'f9rO'ffuE$D$ NUrVj{t"}VYpɉf]tftf]t fuQfVꋵnct&f]t*ft'f]t fu&fU8]Eu}i19f8~tE]u}]ËE@ tU E}эDBE9s.UBft"f/tA;Msftf/uM 9$t]U E9sFt)'fAf;Us(ut&';UsffufE #X$E$$$LE$$$E$$|0$$$\MEL$Mp$hD$lT$D$ 0t5"t1҅ҋE>Jk$D$$$$p$$$$LE$$w$E$$T0$f$|$4ME L$M܁p$hD$lT$D$ 0 "$E t&U1WVSS6< ED$U $T$ D$} M I ?׃2tJ??q*%%f7u‹f|$ U $ED$T$tM y < [^_]ËE 0;tfU J uH} WЋWD$$)Ɓ08t$uD$ CE P 1낋H u%=uU J T$|$$BvU J 9tfx*f*[!fu%f[!woD$]O $ tf[!7&%ff-t%]uӋE H f]w]tf-%ff!iM I f?pUWV EEE EE8EEtF',A<p ,A<wnƒ 9uEGtQEuLj,A<w7H €A)w t ^_]ËEEEE ^_](ʍvE듍vz&U]E 1$E D$]]Ð&'U( Mf9u1]ÉL$ED$D$ E $T$D$ED$ED$UWVEUff/}ut>%ftE;UwbfJftf/uʋEuP}uf/u;Uw$ufBuMf/tgĠ^_]Ét$EUMu$$E T$UD$EL$ M D$T$T$L$ t$$묋MfuE 4$ut$D$1҅uU B t Mfy/tE%=@tK=tM AL$uE$4$D$Z뎉t$ET$$uˋE%=@uE;EUf/f랍t&UWVSÈ/<E9Ev <[^_]ËUfU(ƋET$$XDU(1B @tE(@t&<$x.u Uf:.uuPv';ufBffu;uEU$E T$D$T$ {tnUE t$$UD$E T$ U$D$E(T$U,D$T$=E(@ @t<$P<$[Ef f뽋E(@u1mD$U|$$C<$U(D$Ru E(@ t&UWVS}-U B ȍEB+$ED$U BU BuB~4Hxt&HyE pUt&'fuE׋U):<$Et/|$EU$T$uaU :BUE U JB @t)EE}v [^_]1}HE$"ڋU BtЉ$E @뼋E$&'UWVS5+,u ;usr?e?*t{E8EEtc=wR =w69u;urUf:Ѓ,[^_]1&щf9;utԉt$UEMT$$L$ uUU1ftŁ[4EUU1fl1f!Etf]tdv'f-Etp=w =wFE;Ut#f]uM19MvEԍ&}f9E=wz w\E;M:w= V=w 9E4ʉ}뭉f9wf9~rԋM1MfUWVSM) EPt9M@14E I$&$<$$$$l4$D$D$ D$TD$0F t@ U$$$t$Ѝ&F Rt+S^ jJU* v(E F Et[E+A EG E UU `^E@>UU 1t t]ÐUWVS}#|$0$F$.$E $#$$$$[2$4$$o}))ʉ@E$)Ez$$(M@ $J$`$UEE$$,$$$\4$D$D$ D$TD$0F @ EOEUMUD$T$ $D$M$r$$U)ЋU9yE9U|6U$d$($>$&M|[^_]$$E$$UuȉNj$wM<$D$T$UD$$$$$B$s$$!8uEM1EE;E;$3$I$8t$$&$8t$$$t$v$$$ED$D$ED$ BUEL$$$9UD@ t4$^$t$ MD@ E$*$@$$($U4$DD$$$$t$$$$$$JM4$D$E$e${$D$)&UWVSm,$ $6$$E$$$$$K2$4$$_8)xE)H8m$r$$@$ $D$Z$"$$$:$P U$$$4F +@EE$$$ED$ED$ED$ ts$q$Uƍ$|$T$4$D$EƋE0$)$?$'U,[^_]$$ƍH$UT$돃U$$$u)$$$EU$o$$ED$ED$?UB @uEEU$)$?$ED$$$U$D$ T$T$}E3t&$$ƍ$$$Et$D$D$ |&$d$z$EE$>$T$D$UWVSML$$$$E$$$$$+2$4$$?$)uE)ʉ}@E썃EM$c$U@ $$3$U@$E$$U}ED$$$fUDE}tAUB@E8eUԉ$F$\$.$D$D$D$ED$ aD$4$D$$$U$D$T$ D$$$$$$4$D$D$ D$TD$48$F$\$D$0$$,$|$t$,$$$$$$~U4$$$$$$8UL[^_]$Z$pu܋U؉$D$EԉT$D$ tRD$M܋E؅t`Usage: File::Glob::doglob(pattern, ...)Unexpected return type %d while processing File::Glob macro %s, used%s is not a valid File::Glob macroYour vendor has not defined File::Glob macro %s, usedUsage: File::Glob::constant(sv)%s object version %s does not match %s%s%s%s %_QR  X>    R`Ho oo oQFVfv&6FVfv&6FVfv&6FVfvGCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5),X> #$Wo>.S/usr/src/build/143461-i386/BUILD/glibc-2.2.92/csuGNU AS 2.13.90.0.2Sq/usr/src/build/143461-i386/BUILD/glibc-2.2.92/csuGNU AS 2.13.90.0.2%%m# /tmp/cc1dWf6a.sX>,W3,:,Wdd,,-:J# /tmp/ccO1UwYa.so>!:..symtab.strtab.shstrtab.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.data.eh_frame.dynamic.ctors.dtors.jcr.got.bss.comment.debug_aranges.debug_info.debug_abbrev.debug_line!   ) 1o >o PM HV `` _Z00e*kX>X>q>>0 yQAQAQARBRBRBRBSCCJDX@EE FF@Lp S Uj    `0  X> > Q QQRRRRS  'R5RCQVRcQ gSs < RRQR$>  ` pT `+, c P  P & 1 1 9%q D@! J# P@* X* _) i& o+@ v}+ , G, b, - &. @, . . {, , , , , - Q +  4 -AUp. xQ%x-@8 =Ygx0/ EWlU}S@)j 0' X> x1EY"uSRS" 6I[ initfini.ccall_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____EH_FRAME_BEGIN____JCR_LIST__p.0completed.1__do_global_dtors_auxframe_dummy__CTOR_END____DTOR_END____FRAME_END____JCR_END____do_global_ctors_auxbsd_glob.cmy_readdirglobexp1glob0g_strchrglobexp2globtildeglob1ci_comparecompareglobextendglob2glob3g_lstatg_statg_opendirmatchg_CtocGlob.cconstant.L3.L5.L7.L25.L33.L2.L44.L46.L9.L11.L13.L15.L17.L19__dso_handle__i686.get_pc_thunk.bxPerl_croakXS_File__Glob_constantPerl_sv_setivPerl_sv_2pv_flagsPerl_safesysreallocpthread_getspecific__ctype_tolower@@GLIBC_2.0errfuncPerl_sv_setuv_DYNAMICPerl_newSVpvf_nocontextstrcmp@@GLIBC_2.0getenv@@GLIBC_2.0Perl_mg_setgetpwuid_r@@GLIBC_2.1.2Perl_sv_newmortalPerl_stack_growPerl_formPerl_Ttainted_ptrboot_File__Glob__errno_location@@GLIBC_2.0Perl_sv_taintPerl_Tcurpad_ptrPerl_Isv_yes_ptr_initPerl_safesysfreePerl_newSVpvnPerl_sv_setpvPerl_sv_2mortalPerl_sv_2uvPerl_newXSPerl_Top_ptrPerl_Tmarkstack_ptr_ptrPerl_Isv_undef_ptrPerl_reentrant_retryXS_File__Glob_doglobstrlen@@GLIBC_2.0Perl_Tstack_base_ptrqsort@@GLIBC_2.0Perl_Ireentrant_buffer_ptrPerl_get_svPerl_Gthr_key_ptr__xstat64@@GLIBC_2.2__bss_startPerl_Tstack_max_ptrbsd_globfreebsd_globgetuid@@GLIBC_2.0_finigetpwnam_r@@GLIBC_2.1.2Perl_Imodglobal_ptrclosedir@@GLIBC_2.0__cxa_finalize@@GLIBC_2.1.3opendir@@GLIBC_2.0__lxstat64@@GLIBC_2.2Perl_Itainting_ptrPerl_newSV_edata_GLOBAL_OFFSET_TABLE__endPerl_hv_fetchPerl_sv_2ivreaddir64_r@@GLIBC_2.2Perl_Tstack_sp_ptr_Jv_RegisterClassesPerl_safesysmallocPerl_sv_2pv_nolen__gmon_start__FILE36915c1b/auto/IO/IO.soV ELFp4D4 (===MM>NNaaLB4>@1^I,UHY[*\VWCO6Z3 _PRT=<G`F7#2JE/-&]D8%X."+('5A90M!N$KQS:;?) "$<T p 8 8 M MNNNNNO<^^NsAP # Q) l$ d v! /<_P  )?.& ;O6G 58 g4 ! F;"f*M 4O NGOS / ` |, J ~-u "+ ( _DYNAMIC_GLOBAL_OFFSET_TABLE___gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesPerl_croak_nocontextPerl_PerlIO_filenofcntl__errno_locationXS_IO__Seekable_getposPerl_Tstack_sp_ptrPerl_Tstack_base_ptrPerl_Tmarkstack_ptr_ptrPerl_sv_2ioPerl_newSVPerl_sv_2mortalPerlIO_getposPerl_Isv_undef_ptrPerl_croakXS_IO__Seekable_setposPerlIO_setposPerl_sv_newmortalPerl_sv_setpvnPerl_sv_setivXS_IO__File_new_tmpfilePerlIO_tmpfilePerl_newGVgenPerl_hv_deletePerl_do_openPerl_newRVPerl_gv_stashpvPerl_sv_blessPerl_sv_freePerl_sv_2pv_nolenXS_IO__Poll__pollPerl_newSVivPerl_sv_2ivXS_IO__Handle_blockingXS_IO__Handle_ungetcPerl_Top_ptrPerl_Tcurpad_ptrPerlIO_ungetcPerl_mg_setXS_IO__Handle_errorPerl_PerlIO_errorXS_IO__Handle_clearerrPerl_PerlIO_clearerrXS_IO__Handle_untaintXS_IO__Handle_flushPerl_PerlIO_flushXS_IO__Handle_setbufXS_IO__Handle_setvbufXS_IO__Handle_syncfsyncXS_IO__Socket_sockatmarkboot_IOPerl_newXSPerl_sv_setpvPerl_gv_stashpvnPerl_newCONSTSUBPerl_Isv_yes_ptrPerl_sv_2pv_flagsPerl_formPerl_get_svlibc.so.6_edata__bss_start_endGLIBC_2.1.3GLIBC_2.2.4GLIBC_2.0*si Lti Xii dMMO%O'O,O-O0O4OCOGOLONOOOVOYOZO\O_O`NNNNNNO O"O# O$O&O(O)O* O+$O.(O/,O10O24O58O6\O?`O@dOAhOBlOEpOFtOIxOJ|OKOMONOPOTOWOXOZO[O]O^U)z& hhhhh h($h0(h8p,h@`0hHP4hP@8hX0<h` @hhDhpHhxLhPhThXh\h`hdhhhplh`phPth@xh0|h hhhhhhhh h(h0h8ph@`hHPhP@hX0h` hhhphxUSP[b: tЋ]ÐUSR[>:u4u/tҋuƃ]à 뾉USP[9t u]É P吐U]x"Î9D$ED$;U]M E"[9uɉ}E$E D$=$D$D$x(U ҉utVE~u]u}]Ít&E$E D$$D$|$hy빁ʍt& 띍&'UWVS[!q8E$U$EuNjE$H2U4$O8)u)}@}EU$$U$UD$Mx D$E$UD$$ƋE$U4E$U<$D$u*E$UƉ$U[^_]ËE$aUƉ$dU4봍E$9UƉ$9E$D$&'UWVS !5,E$EU$E%Mlj $2E4$8)@EE)U~7M $U@ M $UEUƋET$$Rt@M $@,D$@$D$@(D$D$ E|$D$ $(D$D$D$D$t$|$U$GMD$ $ƋE$U4M $U0D$ET$$ M $MD$T$#E$|$E$UƉ$lM,[^_]ÍU$9MƉ $M[^_]ËE$!MU$|$D$뮋MD$ $_v'UWVSñLE$U$ENjE$2U4$8E)u)}U@E썃S$E^U@ E$AU@EE$&U}EE$UDEMtAUB@E8XEԉEU$]D$T$ D$HUET$ $rD$D$"UET$ $D$D$UET$ $D$D$UET$ $D$D$UD$D$$wUET$ $D$D$qUET$ $D$D$KUET$ $D$D$%UET$ $D$D$UET$ $D$D$UET$ $,D$D$UET$ $?D$D$UET$ $&D$D$gUET$ $7D$D$AUD$D$$ED$D$ $ND$UD$$Ut$D$ $WT$AED$$Ut$D$ $^T$ED$$Ut$D$ $fT$ED$@$^Ut$D$ $nT$ED$$.Ut$D$ $yT$ED$$Ut$D$ $T$QED$$Ut$D$ $T$!ED$$Ut$D$ $T$ED$$nUt$D$ $T$ED$ $>Ut$D$ $T$ED$ D$ $D$UD$$Ut$D$ $T$:ED$$Ut$D$ $T$ ED$$Ut$D$ $T$ED$$WUt$D$ $T$ED$$'Ut$D$ $T$zED$$Ut$D$ $T$JE$UƉ$U4E$UƉ$UL[^_]ËEU؉$T$U܉D$Eԅ҉D$ tRD$}܋E؅tEU؉t$$ T$E܉D$ UD$D$$.Et @t$EU؉$T$E܉D$ UD$D$$&E$iU$UD$ D$ED$$$ÐUVS[p@tЋu[^USR[}]%s not implemented on this architectureUsage: IO::Seekable::getpos(handle)Usage: IO::Seekable::setpos(handle, pos)Usage: IO::File::new_tmpfile(packname = "IO::File")Usage: IO::Poll::_poll(timeout, ...)Usage: IO::Handle::blocking(handle, blk=-1)Usage: IO::Handle::ungetc(handle, c)Usage: IO::Handle::error(handle)Usage: IO::Handle::clearerr(handle)Usage: IO::Handle::untaint(handle)Usage: IO::Handle::flush(handle)Usage: IO::Handle::setbuf(handle, ...)Usage: IO::Handle::setvbuf(handle, buf, type, size)Usage: IO::Handle::sync(handle)Usage: IO::Socket::sockatmark(sock)%s object version %s does not match %s%s%s%s %_0 but trueIO::File+>&IO::Handle::setbufIO::Handle::setvbufIO.c1.20IO::Seekable::getposIO::Seekable::setposIO::File::new_tmpfileIO::Poll::_pollIO::Handle::blocking$;$IO::Handle::ungetcIO::Handle::errorIO::Handle::clearerrIO::Handle::untaintIO::Handle::flushIO::Handle::syncIO::Socket::sockatmarkIO::PollPOLLINPOLLPRIPOLLOUTPOLLRDNORMPOLLWRNORMPOLLRDBANDPOLLWRBANDPOLLERRPOLLHUPPOLLNVALIO::Handle_IOFBF_IOLBF_IONBFSEEK_SETSEEK_CURSEEK_END::bootstrap parameter%s::%sXS_VERSIONMN* < 8  n N$ooo"oNjz *:JZjz *:JZjz *:JZGCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5),8< p#$W8RS/usr/src/build/143461-i386/BUILD/glibc-2.2.92/csuGNU AS 2.13.90.0.2Sq/usr/src/build/143461-i386/BUILD/glibc-2.2.92/csuGNU AS 2.13.90.0.2%%m# /tmp/cc1dWf6a.s8,W<3,:p,Wdd,,-:J# /tmp/ccO1UwYa.s8!:R.symtab.strtab.shstrtab.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.data.eh_frame.dynamic.ctors.dtors.jcr.got.bss.comment.debug_aranges.debug_info.debug_abbrev.debug_line! ) n1o"">o@M $$V  _<<ZTTepp#k88q2 8 8 yM=M=N>N>N>N>N>O??J8AXA>BZBCH5 PP "$<T p 8 8 M MNNNNNO p 'N5NCMVNcM gOs  NNMN7 @) p M 7 $4?MZo}NP # ) (4$ Kd c! <P )ATi{.& O6 (8 .g?L[ ! mz"*M ONO / ` &, 9 M\-u u (  initfini.ccall_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____EH_FRAME_BEGIN____JCR_LIST__p.0completed.1__do_global_dtors_auxframe_dummy__CTOR_END____DTOR_END____FRAME_END____JCR_END____do_global_ctors_auxIO.cnot_hereio_blockingpoll.c__dso_handle__i686.get_pc_thunk.bxPerl_gv_stashpvPerl_croakPerlIO_setposPerl_sv_freePerl_croak_nocontextPerl_sv_setivPerl_sv_2pv_flags_DYNAMICPerl_newGVgenPerl_PerlIO_filenopoll@@GLIBC_2.0XS_IO__Handle_errorPerl_mg_setXS_IO__Handle_setbufPerl_sv_newmortalPerl_formPerlIO_ungetcPerl_sv_2ioXS_IO__Handle_clearerrXS_IO__File_new_tmpfile__errno_location@@GLIBC_2.0Perl_PerlIO_errorXS_IO__Handle_ungetcPerl_Tcurpad_ptrPerl_Isv_yes_ptr_initXS_IO__Handle_blockingPerl_sv_blessPerl_sv_setpvPerl_sv_2mortalPerl_newXSPerl_Top_ptrPerl_Tmarkstack_ptr_ptrPerl_Isv_undef_ptrPerl_Tstack_base_ptrPerl_PerlIO_flushsockatmark@@GLIBC_2.2.4Perl_newCONSTSUBPerlIO_getposPerl_newRVPerl_get_svXS_IO__Handle_untaint__bss_startfsync@@GLIBC_2.0Perl_PerlIO_clearerrXS_IO__Seekable_setpos_finifcntl@@GLIBC_2.0Perl_do_openPerl_hv_deleteXS_IO__Poll__pollPerl_newSViv__cxa_finalize@@GLIBC_2.1.3XS_IO__Handle_setvbufPerl_newSV_edata_GLOBAL_OFFSET_TABLE__endPerl_sv_2ivboot_IOXS_IO__Seekable_getposPerlIO_tmpfilePerl_Tstack_sp_ptrXS_IO__Handle_sync_Jv_RegisterClassesPerl_sv_setpvnXS_IO__Socket_sockatmarkPerl_sv_2pv_nolenPerl_gv_stashpvnXS_IO__Handle_flush__gmon_start__FILE61ab1329/auto/List/Util/Util.soxELF4f4 (__```  ` ` `ajI V1d!hZNg_\=WY<e%3$S,KU[^CGiB4;b`6@]Q&fEJ9Fc."'-8*72?H(0:LM/#RTO5PA>XD+)ah P0  [ [ ` ` `````b*  Q* @ f `+31?$0F /omP  59 W^ }*D p#bjI r Z  5[  N ;"\YBH b `/ b?5 %K J M _DYNAMIC_GLOBAL_OFFSET_TABLE___gmon_start___init_fini__cxa_finalize_Jv_RegisterClassesXS_List__Util_minPerl_Gthr_key_ptrpthread_getspecificPerl_Tstack_sp_ptrPerl_Tstack_base_ptrPerl_Tmarkstack_ptr_ptrPerl_Isv_undef_ptrPerl_sv_2nvXS_List__Util_sumPerl_Top_ptrPerl_Tcurpad_ptrPerl_sv_setnvPerl_mg_setPerl_sv_newmortalXS_List__Util_minstrPerl_sv_cmpXS_List__Util_reducePerl_Ttop_env_ptrPerl_gv_fetchpvPerl_save_sptrPerl_sv_2cvPL_ppaddrPerl_Ttmps_floor_ptrPerl_save_intPerl_Ttmps_ix_ptrPerl_Tcurstackinfo_ptrPerl_Tcurcop_ptrPerl_Tmarkstack_ptrPerl_Tscopestack_ix_ptrPerl_Tretstack_ix_ptrPerl_Tcurpm_ptrPerl_sv_mortalcopyPerl_Irunops_ptrPerl_cxincPerl_croakXS_List__Util_firstPerl_Idefgv_ptrPerl_sv_2boolXS_List__Util_shufflePerl_Ireentrant_buffer_ptrdrand48_r__errno_locationXS_Scalar__Util_dualvarPerl_sv_setpvnPerl_Itainting_ptrPerl_sv_taintedPerl_sv_taintPerl_sv_backoffPerl_sv_2ivPerl_sv_2uvPerl_sv_upgradePerl_sv_2pv_flagsXS_Scalar__Util_blessedPerl_sv_isobjectPerl_sv_reftypePerl_sv_setpvPerl_mg_getXS_Scalar__Util_reftypeXS_Scalar__Util_weakenPerl_sv_rvweakenXS_Scalar__Util_isweakPerl_Isv_no_ptrPerl_Isv_yes_ptrXS_Scalar__Util_readonlyPerl_sv_setivXS_Scalar__Util_taintedboot_List__UtilPerl_newXSPerl_formPerl_get_svlibc.so.6_edata__bss_start_endGLIBC_2.1.3GLIBC_2.0si 4ii @``aaa!a/a6a@aEaGaKaLbQbRbX babdbebi```aa a" a$a%a&a'a( a)$a*(a+,a,0a-4a.8a0ha?laApaBtaCxaD|aFaHaIaMaOaPaRaSaTaUaVaWaYa]a^a_a`abacaeafagahU3JH hhhhh h($h0(h8p,h@`0hHP4hP@8hX0<h` @hhDhpHhxLhPhThXh\h`hdhhhplh`phPth@xh0|h hhhhhhhh h(h0h8ph@`hHPhP@hX0h` hhhphxhhhhhhhhph`USP[J0tЋ]ÐUSR[I4u4u/tҋuƃ4]à k뾉USP[ÂIt ,u]É P吐UWVSC=I<$$$8$$$NE$$u$M 2$4P)$D$)ʉ@EE @0}E$ $$$$$M4$$$$$$RU<[^_]$t$j$"ME@ @]ؿ;}|.$/$%$UMԉ =$$$U4F t?@Ev Uuu]G;}|&Eu␍t&$$$t$.$p$f$EԉD$ UWVS6AíF,$0$&$$E $$$$$K2$4$$o8$)u)}@E$$@$ ;$_$U$-$?$5$}P U܋M$ $$$$$U4$$$$$$QU,[^_]$s$i$!U@ $C$9$U@EE9E]$$$}0$$EU܉$T$\$E@ @uPE܉$$$$$v$.8$U$KU܉$T$|$.$$$U؋}׋@ t>$$$E@E؋E]9E|$$$$$U4$D$4E$s$i$[$Q$ U4$D$ $$$$rEv'UWVS<]B,$$$8$$$nE$$$M 2$4p)$d$)ʉ@EE @0}E$*$ $$ $$M4$$$$$$rU,[^_]M$$$:;}ME|.$^$T$ UM L$0$&$U4$$$Et$D$;Et G;}|quUWVS:-@<$$$$E$$;$m$c$2$4A$7$)ʉ@EE)Eo$$$U4$$$y}E$$$D$D$D$ E$l$b$D$D$D$ E$1$'U؉$@ D$C$$Uԉ$@ D$$$$ED$Et$D$ D$AƋ@$$E$$@(D$P(B$a$W$I$?$D$<$[$$$R@R$$$$$D$4$$$$$$$$k$a$S$I$D$4$e$)$$UD$E$$ƀ$$$0$$$v@ 9Fi$$$J@$i$_$'0$I$?$@$E-$#$$ $$k2$4$$)ʉ@EE)E $$$OU<${$q$}EU$G$=$/$%$4$@ D$:$$$ED$E|$D$ D$bƋ@$$E$$@(D$P(B$$x$j$`$8D$<$|$@$6$R@R$$$$$D$4$$$$$$$$$$t$j$D$4$$J$@$ƀ$#$$0$$$@ 9F$$$@$$$r0$$$R@$$*$ $W$$$e$$$W$$$W$$$:W $y$o$W$V$L$Uۋ{v$$$$@ t.$$$p $$$@ tC$$$݃@$c$Y$K$A$94$D$*$$ $0$$$F$$$D$tt&UWVS% +|$$$~$Em$c$E$L$B$}2$4$$$)uu)}@E$$$$E$$$E$$EEEEEEE$U$K$0$5$+$U$$$$$$+}8$$$U}}OZ$$$$~$t$,}UD|[^_]ÍvE$M];$1$0$Ƭ$ $4$D$@0E܋}E$f fEm]mu$$]}$E$z$2$Ea$W$Uu֋U$0$&$}<}]&$$$E܈UWVS!-',$$$$E$$;$m$c$2$4A$7$8)u)}@}E/$$$U<$$$UDE@ U@EE$$$$w$m$%U4$Q$G$Ux$!$$ $$U4$D$ED$ED$ G%=w$$$YG U0@ F $q$g$U@ $A$7$UH$$ $r8t#G%fUB%fuP$$$$$$\U,[^_]$~$t$ED$et$U$K$8`$.$$$$ $U4$D$$$$|$`$$$$$FU4$D$ $a$W$|$ $4$*$G U0@ F $$$U@ u_$$$|UH$$$OUH[$o$e$W$M$U4$D$AR$ $$|$:t&$$$G U0t:@^$$$lUHx$$$|$&맍t&$d$Z$L$B$U4$D$D$$ $$ED$ D$ED$:$$$D$x&UWVS $$$~$Em$c$$M$C$2$4!$$8)u)}@}E$$$U<$$$@$ K$$$]$o$e$P UG%f$2$($|$$$$$$$U4$$$$$$PU[^_]$r$h$D$D$$B$8$Et$D$E$$$U}0B @uTU$$$$$$qʉt&$$$ED$$m$c$|$$D$:$E$$$8D$UWVS]$$$$E$$k$$$2$4q$g$8)u)}@}E$3$)$U<$ $$K@$ +$$$$$$P UG%fG $x$n$$X$N$U4$2$($ $$$U[^_]$$$D$D$$$$Et$D$$$$7U}0B @uTU$S$I$A$3$)$ʉt&$$$ED$+$$$|$4$$$E$$$xD$2UWVSV$P$F$>$E-$#$$ $$k2$4$$)u)ʉ}@}E$$$QU4$}$s$t$$[$Q$I$;$1$UD[^_]$ $$D$&'UWVS=$$$$E$$K$}$s$2$4Q$G$8)u)}@}E$$ $U4$$$8F%=tz$$$,U$$$$z$p$(U[^_]Í$D$:$"$$$$D$&UWVS],$$$8$$$n$$$2 M$q$g$U)ʉ@EE)O$4$*$M$E $$I@$ -$$$$$$P $%$$$$$Uʉ,[^_]É$$$|$$$$$$$D$/&'UWVSF ý$@$6$.$E$$$$$[2$4$$)u)ʉ}@}E$$$AU<$m$c$@$ k$?$5$ $$$]P 4EG%f$$$U׉U$$$Et$D$tF @uQ7$$v$n$`$V$U8[^_]$1$'$t$[$ $$|$Ev$$$"$$$8D$SUWVSv L$p$f$^$EM$C$$-$#$2$4$$8$)uE)}@E썃E$$kU@ , $$$;U@$E_$U$ U}E$($$UDEMtAUBG@E8UЉ$$$ D$Et$D$ Nj@0$r$hbUԉT$$|$o$C$9$D$Et$D$ \Nj@0$$Uԉ$|$T$$$ҿ$$躿$+D$D$ED$ Uԉ4$D$T$$x$n$;D$Et$D$ Nj@0$4$*Uԉ$|$T$7$ $$ND$Et$D$ $Nj@0$$þUԉ$|$aT$ʿ$$蔾$$|$dD$D$ED$ 虿D$4$|$i$=$3$%$U$wD$T$ D$8D$4$|$$ֿ$̽$辿$贽$D$$D$ED$ ѾUԉ4$D$T$螾$r$h$Z$P$D$D$ED$ mD$4$D$7$ $$$U$D$T$ D$D$4$|$ֽ$誾$蠼$蒾$舼$D$ D$ED$ 襽D$4$|$u$I$?$1$'U$D$ T$ D$DD$4$|$$$޻$н$ƻ$D$D$ED$ D$4$|$購$臽$}$o$eU$ D$(T$ D$肼D$4$|$R$&$$$$#D$D$ED$ !D$4$|$$ż$軺$裻$襼$蛺$SU4$$u$m$_$U$ UL[^_]$/$%U؉$xD$EЉT$U܉D$ tRD$}܋E؅t$4$&$X$E؉U܉T$ |$D$茹D$4$D$غEt @$Ⱥ$辸$谺$覸[$E؉|$U܉D$T$ D$4$D$b`$a$W$I$?$U4$D$ D$ED$$ÐUVS[fp@tЋu[^USR[21]abUtil.c1.07_00List::Util::maxList::Util::minList::Util::sumList::Util::minstrList::Util::maxstr&@List::Util::reduceList::Util::firstList::Util::shuffleScalar::Util::dualvar$$Scalar::Util::blessedScalar::Util::reftypeScalar::Util::weakenScalar::Util::isweakScalar::Util::readonlyScalar::Util::tainted::bootstrap parameter%s::%sXS_VERSIONUsage: List::Util::reduce(block, ...)Usage: List::Util::first(block, ...)Usage: Scalar::Util::dualvar(num, str)Usage: Scalar::Util::blessed(sv)Usage: Scalar::Util::reftype(sv)Usage: Scalar::Util::weaken(sv)Usage: Scalar::Util::isweak(sv)Usage: Scalar::Util::readonly(sv)Usage: Scalar::Util::tainted(sv)%s object version %s does not match %s%s%s%s %_``  [h  J `Poooo `FVfv&6FVfv&6FVfv&6FVfvGCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5)GCC: (GNU) 3.2 20020822 (Red Hat Linux Rawhide 3.2-5),[ #$W[.S/usr/src/build/143461-i386/BUILD/glibc-2.2.92/csuGNU AS 2.13.90.0.2Sq/usr/src/build/143461-i386/BUILD/glibc-2.2.92/csuGNU AS 2.13.90.0.2%%m# /tmp/cc1dWf6a.s[,W3,:,Wdd,,-:J# /tmp/ccO1UwYa.s[!:..symtab.strtab.shstrtab.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.data.eh_frame.dynamic.ctors.dtors.jcr.got.bss.comment.debug_aranges.debug_info.debug_abbrev.debug_line4! )h h J1o>o0M V PP _Z00eDk[[q[[ y```` ` `````````4bbb0cXc6dRdej 2 rVh P0  [ [ ` ` `````b  '`5`C`V`c` gbs \ ````x[ ` q[ *  )7EW* l@  `1!+<Hd0F vP  (@P\9 t D (b4I K Z  `q[ w N " H 3DbK`a bfx5 K  ,;G initfini.ccall_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____EH_FRAME_BEGIN____JCR_LIST__p.0completed.1__do_global_dtors_auxframe_dummy__CTOR_END____DTOR_END____FRAME_END____JCR_END____do_global_ctors_auxUtil.c__dso_handle__i686.get_pc_thunk.bxXS_List__Util_firstPerl_croakPerl_save_intPerl_sv_setivPerl_sv_2pv_flagsXS_List__Util_minstrpthread_getspecificXS_Scalar__Util_blessedPerl_sv_cmp_DYNAMICPerl_Tmarkstack_ptrPerl_save_sptrPerl_mg_setdrand48_r@@GLIBC_2.0Perl_sv_newmortalPerl_sv_2boolPerl_sv_upgradePerl_formPerl_sv_isobjectPerl_sv_2nv__errno_location@@GLIBC_2.0XS_List__Util_sumPerl_sv_taintPerl_Tcurpad_ptrPerl_Isv_yes_ptr_initPerl_sv_taintedPerl_sv_backoffPL_ppaddrPerl_sv_setpvPerl_sv_2uvPerl_newXSPerl_Top_ptrPerl_Tcurpm_ptrboot_List__UtilPerl_Tmarkstack_ptr_ptrPerl_Isv_no_ptrPerl_sv_2cvXS_Scalar__Util_dualvarPerl_Isv_undef_ptrPerl_Tretstack_ix_ptrPerl_Tstack_base_ptrPerl_Ireentrant_buffer_ptrXS_List__Util_minPerl_sv_mortalcopyXS_Scalar__Util_reftypePerl_get_svPerl_Gthr_key_ptr__bss_startXS_Scalar__Util_isweakXS_List__Util_reducePerl_Irunops_ptr_finiPerl_cxincPerl_sv_reftypeXS_Scalar__Util_tainted__cxa_finalize@@GLIBC_2.1.3Perl_Ttmps_ix_ptrPerl_gv_fetchpvPerl_Itainting_ptrPerl_Idefgv_ptrPerl_sv_rvweakenXS_Scalar__Util_weakenPerl_Tcurcop_ptr_edata_GLOBAL_OFFSET_TABLE__endPerl_Ttop_env_ptrPerl_sv_2ivPerl_Tcurstackinfo_ptrPerl_Tscopestack_ix_ptrXS_List__Util_shufflePerl_sv_setnvPerl_Tstack_sp_ptrXS_Scalar__Util_readonly_Jv_RegisterClassesPerl_Ttmps_floor_ptrPerl_sv_setpvnPerl_mg_get__gmon_start__FILE5a3e2f9a/lib.pm #line 1 "/usr/lib/perl5/5.8.0/i386-linux-thread-multi/lib.pm" package lib; # THIS FILE IS AUTOMATICALLY GENERATED FROM lib_pm.PL. # ANY CHANGES TO THIS FILE WILL BE OVERWRITTEN BY THE NEXT PERL BUILD. use Config; use strict; my $archname = $Config{archname}; my $version = $Config{version}; my @inc_version_list = reverse split / /, $Config{inc_version_list}; our @ORIG_INC = @INC; # take a handy copy of 'original' value our $VERSION = '0.5564'; my $Is_MacOS = $^O eq 'MacOS'; my $Mac_FS; if ($Is_MacOS) { require File::Spec; $Mac_FS = eval { require Mac::FileSpec::Unixish }; } sub import { shift; my %names; foreach (reverse @_) { if ($_ eq '') { require Carp; Carp::carp("Empty compile time value given to use lib"); } local $_ = _nativize($_); if (-e && ! -d _) { require Carp; Carp::carp("Parameter to use lib must be directory, not file"); } unshift(@INC, $_); # Add any previous version directories we found at configure time foreach my $incver (@inc_version_list) { my $dir = $Is_MacOS ? File::Spec->catdir( $_, $incver ) : "$_/$incver"; unshift(@INC, $dir) if -d $dir; } # Put a corresponding archlib directory in front of $_ if it # looks like $_ has an archlib directory below it. my($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir) = _get_dirs($_); unshift(@INC, $arch_dir) if -d $arch_auto_dir; unshift(@INC, $version_dir) if -d $version_dir; unshift(@INC, $version_arch_dir) if -d $version_arch_dir; } # remove trailing duplicates @INC = grep { ++$names{$_} == 1 } @INC; return; } sub unimport { shift; my %names; foreach (@_) { local $_ = _nativize($_); my($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir) = _get_dirs($_); ++$names{$_}; ++$names{$arch_dir} if -d $arch_auto_dir; ++$names{$version_dir} if -d $version_dir; ++$names{$version_arch_dir} if -d $version_arch_dir; } # Remove ALL instances of each named directory. @INC = grep { !exists $names{$_} } @INC; return; } sub _get_dirs { my($dir) = @_; my($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir); # we could use this for all platforms in the future, but leave it # Mac-only for now, until there is more time for testing it. if ($Is_MacOS) { $arch_auto_dir = File::Spec->catdir( $_, $archname, 'auto' ); $arch_dir = File::Spec->catdir( $_, $archname, ); $version_dir = File::Spec->catdir( $_, $version ); $version_arch_dir = File::Spec->catdir( $_, $version, $archname ); } else { $arch_auto_dir = "$_/$archname/auto"; $arch_dir = "$_/$archname"; $version_dir = "$_/$version"; $version_arch_dir = "$_/$version/$archname"; } return($arch_auto_dir, $arch_dir, $version_dir, $version_arch_dir); } sub _nativize { my($dir) = @_; if ($Is_MacOS && $Mac_FS && ! -d $dir) { $dir = Mac::FileSpec::Unixish::nativize($dir); $dir .= ":" unless $dir =~ /:$/; } return $dir; } 1; __END__ #line 206 FILEc580c829/re.pmd#line 1 "/usr/lib/perl5/5.8.0/i386-linux-thread-multi/re.pm" package re; our $VERSION = 0.03; #line 76 # N.B. File::Basename contains a literal for 'taint' as a fallback. If # taint is changed here, File::Basename must be updated as well. my %bitmask = ( taint => 0x00100000, eval => 0x00200000, ); sub setcolor { eval { # Ignore errors require Term::Cap; my $terminal = Tgetent Term::Cap ({OSPEED => 9600}); # Avoid warning. my $props = $ENV{PERL_RE_TC} || 'md,me,so,se,us,ue'; my @props = split /,/, $props; my $colors = join "\t", map {$terminal->Tputs($_,1)} @props; $colors =~ s/\0//g; $ENV{PERL_RE_COLORS} = $colors; }; } sub bits { my $on = shift; my $bits = 0; unless (@_) { require Carp; Carp::carp("Useless use of \"re\" pragma"); } foreach my $s (@_){ if ($s eq 'debug' or $s eq 'debugcolor') { setcolor() if $s eq 'debugcolor'; require XSLoader; XSLoader::load('re'); install() if $on; uninstall() unless $on; next; } if (exists $bitmask{$s}) { $bits |= $bitmask{$s}; } else { require Carp; Carp::carp("Unknown \"re\" subpragma '$s' (known ones are: @{[join(', ', map {qq('$_')} 'debug', 'debugcolor', sort keys %bitmask)]})"); } } $bits; } sub import { shift; $^H |= bits(1, @_); } sub unimport { shift; $^H &= ~ bits(0, @_); } 1; FILE29f68648/integer.pm#line 1 "/usr/lib/perl5/5.8.0/integer.pm" package integer; our $VERSION = '1.00'; #line 82 $integer::hint_bits = 0x1; sub import { $^H |= $integer::hint_bits; } sub unimport { $^H &= ~$integer::hint_bits; } 1; FILE35cbbe91/strict.pm#line 1 "/usr/lib/perl5/5.8.0/strict.pm" package strict; #line 92 $strict::VERSION = "1.02"; my %bitmask = ( refs => 0x00000002, subs => 0x00000200, vars => 0x00000400 ); sub bits { my $bits = 0; foreach my $s (@_){ $bits |= $bitmask{$s} || 0; }; $bits; } sub import { shift; $^H |= bits(@_ ? @_ : qw(refs subs vars)); } sub unimport { shift; $^H &= ~ bits(@_ ? @_ : qw(refs subs vars)); } 1; FILEbf35e2b3/unicore/Exact.plN# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! # This file is built by ./mktables from e.g. UnicodeData.txt. # Any changes made here will be lost! ## ## Data in this file used by ../utf8_heavy.pl ## ## Mapping from name to filename in ./lib %utf8::Exact = ( ASCII => 'ASCII', All => 'Any', Alnum => 'Alnum', Alpha => 'Alpha', Any => 'Any', Assigned => 'Assigned', BidiAL => 'BidiAL', BidiAN => 'BidiAN', BidiB => 'BidiB', BidiBN => 'BidiBN', BidiCS => 'BidiCS', BidiEN => 'BidiEN', BidiES => 'BidiES', BidiET => 'BidiET', BidiL => 'BidiL', BidiLRE => 'BidiLRE', BidiLRO => 'BidiLRO', BidiNSM => 'BidiNSM', BidiON => 'BidiON', BidiPDF => 'BidiPDF', BidiR => 'BidiR', BidiRLE => 'BidiRLE', BidiRLO => 'BidiRLO', BidiS => 'BidiS', BidiWS => 'BidiWS', Blank => 'Blank', C => 'C', Canon => 'Canon', Cc => 'Cc', Cf => 'Cf', Cn => 'Cn', Cntrl => 'Cntrl', Co => 'Co', Compat => 'Compat', Cs => 'Cs', DCcircle => 'DCcircle', DCcompat => 'DCcompat', DCfinal => 'DCfinal', DCfont => 'DCfont', DCfraction => 'DCfracti', DCinitial => 'DCinitia', DCisolated => 'DCisolat', DCmedial => 'DCmedial', DCnarrow => 'DCnarrow', DCnoBreak => 'DCnoBrea', DCsmall => 'DCsmall', DCsquare => 'DCsquare', DCsub => 'DCsub', DCsuper => 'DCsuper', DCvertical => 'DCvertic', DCwide => 'DCwide', Digit => 'Digit', Graph => 'Graph', L => 'L', 'L&' => 'L_', Ll => 'Ll', Lm => 'Lm', Lo => 'Lo', Lower => 'Lower', Lt => 'Lt', Lu => 'Lu', M => 'M', Mc => 'Mc', Me => 'Me', Mirrored => 'Mirrored', Mn => 'Mn', N => 'N', Nd => 'Nd', Nl => 'Nl', No => 'No', P => 'P', Pc => 'Pc', Pd => 'Pd', Pe => 'Pe', Pf => 'Pf', Pi => 'Pi', Po => 'Po', Print => 'Print', Ps => 'Ps', Punct => 'Punct', S => 'S', Sc => 'Sc', Sk => 'Sk', Sm => 'Sm', So => 'So', Space => 'Space', SpacePerl => 'SpacePer', Title => 'Title', Upper => 'Upper', Word => 'Word', XDigit => 'XDigit', Z => 'Z', Zl => 'Zl', Zp => 'Zp', Zs => 'Zs', _CanonDCIJ => '_CanonDC', _CaseIgnorable => '_CaseIgn', _CombAbove => '_CombAbo', ); 1; FILEe19dd8b2/unicore/lib/Word.pl# !!!!!!! DO NOT EDIT THIS FILE !!!!!!! # This file is built by ./mktables from e.g. UnicodeData.txt. # Any changes made here will be lost! # # This file supports: # \p{Word} # # Meaning: [[:Word:]] # return <<'END'; 0030 0039 0041 005A 005F 0061 007A 00AA 00B2 00B3 00B5 00B9 00BA 00BC 00BE 00C0 00D6 00D8 00F6 00F8 0220 0222 0233 0250 02AD 02B0 02B8 02BB 02C1 02D0 02D1 02E0 02E4 02EE 0300 034F 0360 036F 037A 0386 0388 038A 038C 038E 03A1 03A3 03CE 03D0 03F5 0400 0481 0483 0486 0488 04CE 04D0 04F5 04F8 04F9 0500 050F 0531 0556 0559 0561 0587 0591 05A1 05A3 05B9 05BB 05BD 05BF 05C1 05C2 05C4 05D0 05EA 05F0 05F2 0621 063A 0640 0655 0660 0669 066E 06D3 06D5 06DC 06DE 06E8 06EA 06ED 06F0 06FC 0710 072C 0730 074A 0780 07B1 0901 0903 0905 0939 093C 094D 0950 0954 0958 0963 0966 096F 0981 0983 0985 098C 098F 0990 0993 09A8 09AA 09B0 09B2 09B6 09B9 09BC 09BE 09C4 09C7 09C8 09CB 09CD 09D7 09DC 09DD 09DF 09E3 09E6 09F1 09F4 09F9 0A02 0A05 0A0A 0A0F 0A10 0A13 0A28 0A2A 0A30 0A32 0A33 0A35 0A36 0A38 0A39 0A3C 0A3E 0A42 0A47 0A48 0A4B 0A4D 0A59 0A5C 0A5E 0A66 0A74 0A81 0A83 0A85 0A8B 0A8D 0A8F 0A91 0A93 0AA8 0AAA 0AB0 0AB2 0AB3 0AB5 0AB9 0ABC 0AC5 0AC7 0AC9 0ACB 0ACD 0AD0 0AE0 0AE6 0AEF 0B01 0B03 0B05 0B0C 0B0F 0B10 0B13 0B28 0B2A 0B30 0B32 0B33 0B36 0B39 0B3C 0B43 0B47 0B48 0B4B 0B4D 0B56 0B57 0B5C 0B5D 0B5F 0B61 0B66 0B6F 0B82 0B83 0B85 0B8A 0B8E 0B90 0B92 0B95 0B99 0B9A 0B9C 0B9E 0B9F 0BA3 0BA4 0BA8 0BAA 0BAE 0BB5 0BB7 0BB9 0BBE 0BC2 0BC6 0BC8 0BCA 0BCD 0BD7 0BE7 0BF2 0C01 0C03 0C05 0C0C 0C0E 0C10 0C12 0C28 0C2A 0C33 0C35 0C39 0C3E 0C44 0C46 0C48 0C4A 0C4D 0C55 0C56 0C60 0C61 0C66 0C6F 0C82 0C83 0C85 0C8C 0C8E 0C90 0C92 0CA8 0CAA 0CB3 0CB5 0CB9 0CBE 0CC4 0CC6 0CC8 0CCA 0CCD 0CD5 0CD6 0CDE 0CE0 0CE1 0CE6 0CEF 0D02 0D03 0D05 0D0C 0D0E 0D10 0D12 0D28 0D2A 0D39 0D3E 0D43 0D46 0D48 0D4A 0D4D 0D57 0D60 0D61 0D66 0D6F 0D82 0D83 0D85 0D96 0D9A 0DB1 0DB3 0DBB 0DBD 0DC0 0DC6 0DCA 0DCF 0DD4 0DD6 0DD8 0DDF 0DF2 0DF3 0E01 0E3A 0E40 0E4E 0E50 0E59 0E81 0E82 0E84 0E87 0E88 0E8A 0E8D 0E94 0E97 0E99 0E9F 0EA1 0EA3 0EA5 0EA7 0EAA 0EAB 0EAD 0EB9 0EBB 0EBD 0EC0 0EC4 0EC6 0EC8 0ECD 0ED0 0ED9 0EDC 0EDD 0F00 0F18 0F19 0F20 0F33 0F35 0F37 0F39 0F3E 0F47 0F49 0F6A 0F71 0F84 0F86 0F8B 0F90 0F97 0F99 0FBC 0FC6 1000 1021 1023 1027 1029 102A 102C 1032 1036 1039 1040 1049 1050 1059 10A0 10C5 10D0 10F8 1100 1159 115F 11A2 11A8 11F9 1200 1206 1208 1246 1248 124A 124D 1250 1256 1258 125A 125D 1260 1286 1288 128A 128D 1290 12AE 12B0 12B2 12B5 12B8 12BE 12C0 12C2 12C5 12C8 12CE 12D0 12D6 12D8 12EE 12F0 130E 1310 1312 1315 1318 131E 1320 1346 1348 135A 1369 137C 13A0 13F4 1401 166C 166F 1676 1681 169A 16A0 16EA 16EE 16F0 1700 170C 170E 1714 1720 1734 1740 1753 1760 176C 176E 1770 1772 1773 1780 17D3 17D7 17DC 17E0 17E9 180B 180D 1810 1819 1820 1877 1880 18A9 1E00 1E9B 1EA0 1EF9 1F00 1F15 1F18 1F1D 1F20 1F45 1F48 1F4D 1F50 1F57 1F59 1F5B 1F5D 1F5F 1F7D 1F80 1FB4 1FB6 1FBC 1FBE 1FC2 1FC4 1FC6 1FCC 1FD0 1FD3 1FD6 1FDB 1FE0 1FEC 1FF2 1FF4 1FF6 1FFC 2070 2071 2074 2079 207F 2089 20D0 20EA 2102 2107 210A 2113 2115 2119 211D 2124 2126 2128 212A 212D 212F 2131 2133 2139 213D 213F 2145 2149 2153 2183 2460 249B 24EA 24FE 2776 2793 3005 3007 3021 302F 3031 3035 3038 303C 3041 3096 3099 309A 309D 309F 30A1 30FA 30FC 30FF 3105 312C 3131 318E 3192 3195 31A0 31B7 31F0 31FF 3220 3229 3251 325F 3280 3289 32B1 32BF 3400 4DB5 4E00 9FA5 A000 A48C AC00 D7A3 F900 FA2D FA30 FA6A FB00 FB06 FB13 FB17 FB1D FB28 FB2A FB36 FB38 FB3C FB3E FB40 FB41 FB43 FB44 FB46 FBB1 FBD3 FD3D FD50 FD8F FD92 FDC7 FDF0 FDFB FE00 FE0F FE20 FE23 FE70 FE74 FE76 FEFC FF10 FF19 FF21 FF3A FF41 FF5A FF66 FFBE FFC2 FFC7 FFCA FFCF FFD2 FFD7 FFDA FFDC 10300 1031E 10320 10323 10330 1034A 10400 10425 10428 1044D 1D165 1D169 1D16D 1D172 1D17B 1D182 1D185 1D18B 1D1AA 1D1AD 1D400 1D454 1D456 1D49C 1D49E 1D49F 1D4A2 1D4A5 1D4A6 1D4A9 1D4AC 1D4AE 1D4B9 1D4BB 1D4BD 1D4C0 1D4C2 1D4C3 1D4C5 1D505 1D507 1D50A 1D50D 1D514 1D516 1D51C 1D51E 1D539 1D53B 1D53E 1D540 1D544 1D546 1D54A 1D550 1D552 1D6A3 1D6A8 1D6C0 1D6C2 1D6DA 1D6DC 1D6FA 1D6FC 1D714 1D716 1D734 1D736 1D74E 1D750 1D76E 1D770 1D788 1D78A 1D7A8 1D7AA 1D7C2 1D7C4 1D7C9 1D7CE 1D7FF 20000 2A6D6 2F800 2FA1D END FILEaf4bf4f8/utf8.pm#line 1 "/usr/lib/perl5/5.8.0/utf8.pm" package utf8; $utf8::hint_bits = 0x00800000; our $VERSION = '1.00'; sub import { $^H |= $utf8::hint_bits; $enc{caller()} = $_[1] if $_[1]; } sub unimport { $^H &= ~$utf8::hint_bits; } sub AUTOLOAD { require "utf8_heavy.pl"; goto &$AUTOLOAD if defined &$AUTOLOAD; Carp::croak("Undefined subroutine $AUTOLOAD called"); } 1; __END__ #line 153 FILE00328865/utf8_heavy.pl"Spackage utf8; use strict; use warnings; sub DEBUG () { 0 } sub DESTROY {} my %Cache; sub croak { require Carp; Carp::croak(@_) } ## ## "SWASH" == "SWATCH HASH". A "swatch" is a swatch of the Unicode landscape ## sub SWASHNEW { my ($class, $type, $list, $minbits, $none) = @_; local $^D = 0 if $^D; print STDERR "SWASHNEW @_\n" if DEBUG; ## ## Get the list of codepoints for the type. ## Called from utf8.c ## ## Given a $type, our goal is to fill $list with the set of codepoint ## ranges. ## ## To make the parsing of $type clear, this code takes the a rather ## unorthadox approach of last'ing out of the block once we have the ## info we need. Were this to be a subroutine, the 'last' would just ## be a 'return'. ## my $file; ## file to load data from, and also part of the %Cache key. my $ListSorted = 0; if ($type) { $type =~ s/^\s+//; $type =~ s/\s+$//; print "type = $type\n" if DEBUG; GETFILE: { ## ## 'Is' is always optional, so if it's there, remove it. ## Same with 'Category=' and 'Script='. ## ## 'Block=' is replaced by 'In'. ## $type =~ s/^Is(?:\s+|[-_])?//i or $type =~ s/^Category\s*=\s*//i or $type =~ s/^Script\s*=\s*//i or $type =~ s/^Block\s*=\s*/In/i; ## ## See if it's in the direct mapping table. ## require "unicore/Exact.pl"; if (my $base = $utf8::Exact{$type}) { $file = "unicore/lib/$base.pl"; last GETFILE; } ## ## If not there exactly, try the canonical form. The canonical ## form is lowercased, with any separators (\s+|[-_]) removed. ## my $canonical = lc $type; $canonical =~ s/(?<=[a-z\d])(?:\s+|[-_])(?=[a-z\d])//g; print "canonical = $canonical\n" if DEBUG; require "unicore/Canonical.pl"; if (my $base = $utf8::Canonical{$canonical}) { $file = "unicore/lib/$base.pl"; last GETFILE; } ## ## It could be a user-defined property. ## if ($type =~ /^I[ns](\w+)$/) { my @caller = caller(1); if (defined $caller[0]) { my $prop = $caller[0] . "::" . $type; if (exists &{$prop}) { no strict 'refs'; $list = &{$prop}; last GETFILE; } } } ## ## Last attempt -- see if it's a "To" name (e.g. "ToLower") ## if ($type =~ /^To([A-Z][A-Za-z]+)$/) { $file = "unicore/To/$1.pl"; ## would like to test to see if $file actually exists.... last GETFILE; } ## ## If we reach this line, it's because we couldn't figure ## out what to do with $type. Ouch. ## return $type; } if (defined $file) { print "found it (file='$file')\n" if DEBUG; ## ## If we reach here, it was due to a 'last GETFILE' above ## (exception: user-defined properties), so we ## have a filename, so now we load it if we haven't already. ## If we have, return the cached results. The cache key is the ## file to load. ## if ($Cache{$file} and ref($Cache{$file}) eq $class) { print "Returning cached '$file' for \\p{$type}\n" if DEBUG; return $Cache{$class, $file}; } $list = do $file; } $ListSorted = 1; ## we know that these lists are sorted } my $extras; my $bits; my $ORIG = $list; if ($list) { my @tmp = split(/^/m, $list); my %seen; no warnings; $extras = join '', grep /^[^0-9a-fA-F]/, @tmp; $list = join '', sort { hex $a <=> hex $b } grep {/^([0-9a-fA-F]+)/ and not $seen{$1}++} @tmp; # XXX doesn't do ranges right } if ($none) { my $hextra = sprintf "%04x", $none + 1; $list =~ s/\tXXXX$/\t$hextra/mg; } if ($minbits < 32) { my $top = 0; while ($list =~ /^([0-9a-fA-F]+)(?:\t([0-9a-fA-F]+)?)(?:\t([0-9a-fA-F]+))?/mg) { my $min = hex $1; my $max = hex(defined $2 ? $2 : $1); my $val = hex(defined $3 ? $3 : ""); $val += $max - $min if defined $3; $top = $val if $val > $top; } $bits = $top > 0xffff ? 32 : $top > 0xff ? 16 : $top > 1 ? 8 : 1 } $bits = $minbits if $bits < $minbits; my @extras; for my $x ($extras) { pos $x = 0; while ($x =~ /^([^0-9a-fA-F\n])(.*)/mg) { my $char = $1; my $name = $2; print STDERR "$1 => $2\n" if DEBUG; if ($char =~ /[-+!]/) { my ($c,$t) = split(/::/, $name, 2); # bogus use of ::, really my $subobj; if ($c eq 'utf8') { $subobj = $c->SWASHNEW($t, "", 0, 0, 0); } elsif ($c =~ /^([0-9a-fA-F]+)/) { $subobj = utf8->SWASHNEW("", $c, 0, 0, 0); } return $subobj unless ref $subobj; push @extras, $name => $subobj; $bits = $subobj->{BITS} if $bits < $subobj->{BITS}; } } } print STDERR "CLASS = $class, TYPE => $type, BITS => $bits, NONE => $none\nEXTRAS =>\n$extras\nLIST =>\n$list\n" if DEBUG; my $SWASH = bless { TYPE => $type, BITS => $bits, EXTRAS => $extras, LIST => $list, NONE => $none, @extras, } => $class; if ($file) { $Cache{$class, $file} = $SWASH; } return $SWASH; } # NOTE: utf8.c:swash_init() assumes entries are never modified once generated. sub SWASHGET { # See utf8.c:Perl_swash_fetch for problems with this interface. my ($self, $start, $len) = @_; local $^D = 0 if $^D; my $type = $self->{TYPE}; my $bits = $self->{BITS}; my $none = $self->{NONE}; print STDERR "SWASHGET @_ [$type/$bits/$none]\n" if DEBUG; my $end = $start + $len; my $swatch = ""; my $key; vec($swatch, $len - 1, $bits) = 0; # Extend to correct length. if ($none) { for $key (0 .. $len - 1) { vec($swatch, $key, $bits) = $none } } for ($self->{LIST}) { pos $_ = 0; if ($bits > 1) { LINE: while (/^([0-9a-fA-F]+)(?:\t([0-9a-fA-F]+)?)(?:\t([0-9a-fA-F]+))?/mg) { my $min = hex $1; my $max = (defined $2 ? hex $2 : $min); my $val = hex $3; next if $max < $start; print "$min $max $val\n" if DEBUG; if ($none) { if ($min < $start) { $val += $start - $min if $val < $none; $min = $start; } for ($key = $min; $key <= $max; $key++) { last LINE if $key >= $end; print STDERR "$key => $val\n" if DEBUG; vec($swatch, $key - $start, $bits) = $val; ++$val if $val < $none; } } else { if ($min < $start) { $val += $start - $min; $min = $start; } for ($key = $min; $key <= $max; $key++, $val++) { last LINE if $key >= $end; print STDERR "$key => $val\n" if DEBUG; vec($swatch, $key - $start, $bits) = $val; } } } } else { LINE: while (/^([0-9a-fA-F]+)(?:[ \t]+([0-9a-fA-F]+))?/mg) { my $min = hex $1; my $max = (defined $2 ? hex $2 : $min); next if $max < $start; if ($min < $start) { $min = $start; } for ($key = $min; $key <= $max; $key++) { last LINE if $key >= $end; print STDERR "$key => 1\n" if DEBUG; vec($swatch, $key - $start, 1) = 1; } } } } for my $x ($self->{EXTRAS}) { pos $x = 0; while ($x =~ /^([-+!])(.*)/mg) { my $char = $1; my $name = $2; print STDERR "INDIRECT $1 $2\n" if DEBUG; my $otherbits = $self->{$name}->{BITS}; croak("SWASHGET size mismatch") if $bits < $otherbits; my $other = $self->{$name}->SWASHGET($start, $len); if ($char eq '+') { if ($bits == 1 and $otherbits == 1) { $swatch |= $other; } else { for ($key = 0; $key < $len; $key++) { vec($swatch, $key, $bits) = vec($other, $key, $otherbits); } } } elsif ($char eq '!') { if ($bits == 1 and $otherbits == 1) { $swatch |= ~$other; } else { for ($key = 0; $key < $len; $key++) { if (!vec($other, $key, $otherbits)) { vec($swatch, $key, $bits) = 1; } } } } elsif ($char eq '-') { if ($bits == 1 and $otherbits == 1) { $swatch &= ~$other; } else { for ($key = 0; $key < $len; $key++) { if (vec($other, $key, $otherbits)) { vec($swatch, $key, $bits) = 0; } } } } } } if (DEBUG) { print STDERR "CELLS "; for ($key = 0; $key < $len; $key++) { print STDERR vec($swatch, $key, $bits), " "; } print STDERR "\n"; } $swatch; } 1; FILE7b6dd9e6/vars.pm#line 1 "/usr/lib/perl5/5.8.0/vars.pm" package vars; use 5.006; our $VERSION = '1.01'; use warnings::register; use strict qw(vars subs); sub import { my $callpack = caller; my ($pack, @imports) = @_; my ($sym, $ch); foreach (@imports) { if (($ch, $sym) = /^([\$\@\%\*\&])(.+)/) { if ($sym =~ /\W/) { # time for a more-detailed check-up if ($sym =~ /^\w+[[{].*[]}]$/) { require Carp; Carp::croak("Can't declare individual elements of hash or array"); } elsif (warnings::enabled() and length($sym) == 1 and $sym !~ tr/a-zA-Z//) { warnings::warn("No need to declare built-in vars"); } elsif (($^H &= strict::bits('vars'))) { require Carp; Carp::croak("'$_' is not a valid variable name under strict vars"); } } $sym = "${callpack}::$sym" unless $sym =~ /::/; *$sym = ( $ch eq "\$" ? \$$sym : $ch eq "\@" ? \@$sym : $ch eq "\%" ? \%$sym : $ch eq "\*" ? \*$sym : $ch eq "\&" ? \&$sym : do { require Carp; Carp::croak("'$_' is not a valid variable name"); }); } else { require Carp; Carp::croak("'$_' is not a valid variable name"); } } }; 1; __END__ #line 83 FILE65948f1f/warnings.pm2'#line 1 "/usr/lib/perl5/5.8.0/warnings.pm" # !!!!!!! DO NOT EDIT THIS FILE !!!!!!! # This file was created by warnings.pl # Any changes made here will be lost. # package warnings; our $VERSION = '1.00'; #line 129 use Carp ; %Offsets = ( # Warnings Categories added in Perl 5.008 'all' => 0, 'closure' => 2, 'deprecated' => 4, 'exiting' => 6, 'glob' => 8, 'io' => 10, 'closed' => 12, 'exec' => 14, 'layer' => 16, 'newline' => 18, 'pipe' => 20, 'unopened' => 22, 'misc' => 24, 'numeric' => 26, 'once' => 28, 'overflow' => 30, 'pack' => 32, 'portable' => 34, 'recursion' => 36, 'redefine' => 38, 'regexp' => 40, 'severe' => 42, 'debugging' => 44, 'inplace' => 46, 'internal' => 48, 'malloc' => 50, 'signal' => 52, 'substr' => 54, 'syntax' => 56, 'ambiguous' => 58, 'bareword' => 60, 'digit' => 62, 'parenthesis' => 64, 'precedence' => 66, 'printf' => 68, 'prototype' => 70, 'qw' => 72, 'reserved' => 74, 'semicolon' => 76, 'taint' => 78, 'threads' => 80, 'uninitialized' => 82, 'unpack' => 84, 'untie' => 86, 'utf8' => 88, 'void' => 90, 'y2k' => 92, ); %Bits = ( 'all' => "\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x55\x15", # [0..46] 'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00", # [29] 'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00", # [30] 'closed' => "\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] 'closure' => "\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] 'debugging' => "\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00", # [22] 'deprecated' => "\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2] 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00", # [31] 'exec' => "\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] 'exiting' => "\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] 'glob' => "\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] 'inplace' => "\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00", # [23] 'internal' => "\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00", # [24] 'io' => "\x00\x54\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [5..11] 'layer' => "\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8] 'malloc' => "\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00", # [25] 'misc' => "\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00", # [12] 'newline' => "\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9] 'numeric' => "\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00\x00", # [13] 'once' => "\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00", # [14] 'overflow' => "\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00", # [15] 'pack' => "\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00", # [16] 'parenthesis' => "\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00", # [32] 'pipe' => "\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [10] 'portable' => "\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00", # [17] 'precedence' => "\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00", # [33] 'printf' => "\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00", # [34] 'prototype' => "\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00", # [35] 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00", # [36] 'recursion' => "\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00", # [18] 'redefine' => "\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00", # [19] 'regexp' => "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00", # [20] 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00", # [37] 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00", # [38] 'severe' => "\x00\x00\x00\x00\x00\x54\x05\x00\x00\x00\x00\x00", # [21..25] 'signal' => "\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00", # [26] 'substr' => "\x00\x00\x00\x00\x00\x00\x40\x00\x00\x00\x00\x00", # [27] 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\x55\x55\x15\x00\x00", # [28..38] 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00\x00", # [39] 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00", # [40] 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04\x00", # [41] 'unopened' => "\x00\x00\x40\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11] 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00", # [42] 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x40\x00", # [43] 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01", # [44] 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x04", # [45] 'y2k' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10", # [46] ); %DeadBits = ( 'all' => "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\x2a", # [0..46] 'ambiguous' => "\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00", # [29] 'bareword' => "\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00", # [30] 'closed' => "\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [6] 'closure' => "\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [1] 'debugging' => "\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00", # [22] 'deprecated' => "\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [2] 'digit' => "\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00", # [31] 'exec' => "\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [7] 'exiting' => "\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [3] 'glob' => "\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [4] 'inplace' => "\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00", # [23] 'internal' => "\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00", # [24] 'io' => "\x00\xa8\xaa\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [5..11] 'layer' => "\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [8] 'malloc' => "\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00", # [25] 'misc' => "\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00", # [12] 'newline' => "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [9] 'numeric' => "\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00", # [13] 'once' => "\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00", # [14] 'overflow' => "\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00", # [15] 'pack' => "\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00", # [16] 'parenthesis' => "\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00", # [32] 'pipe' => "\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [10] 'portable' => "\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00", # [17] 'precedence' => "\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00\x00", # [33] 'printf' => "\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00", # [34] 'prototype' => "\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00", # [35] 'qw' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00", # [36] 'recursion' => "\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00\x00\x00", # [18] 'redefine' => "\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00", # [19] 'regexp' => "\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00", # [20] 'reserved' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00\x00", # [37] 'semicolon' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00\x00", # [38] 'severe' => "\x00\x00\x00\x00\x00\xa8\x0a\x00\x00\x00\x00\x00", # [21..25] 'signal' => "\x00\x00\x00\x00\x00\x00\x20\x00\x00\x00\x00\x00", # [26] 'substr' => "\x00\x00\x00\x00\x00\x00\x80\x00\x00\x00\x00\x00", # [27] 'syntax' => "\x00\x00\x00\x00\x00\x00\x00\xaa\xaa\x2a\x00\x00", # [28..38] 'taint' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00\x00", # [39] 'threads' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00", # [40] 'uninitialized' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\x00", # [41] 'unopened' => "\x00\x00\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00", # [11] 'unpack' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\x00", # [42] 'untie' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\x00", # [43] 'utf8' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02", # [44] 'void' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08", # [45] 'y2k' => "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20", # [46] ); $NONE = "\0\0\0\0\0\0\0\0\0\0\0\0"; $LAST_BIT = 94 ; $BYTES = 12 ; $All = "" ; vec($All, $Offsets{'all'}, 2) = 3 ; sub Croaker { delete $Carp::CarpInternal{'warnings'}; croak @_ ; } sub bits { # called from B::Deparse.pm push @_, 'all' unless @_; my $mask; my $catmask ; my $fatal = 0 ; my $no_fatal = 0 ; foreach my $word ( @_ ) { if ($word eq 'FATAL') { $fatal = 1; $no_fatal = 0; } elsif ($word eq 'NONFATAL') { $fatal = 0; $no_fatal = 1; } elsif ($catmask = $Bits{$word}) { $mask |= $catmask ; $mask |= $DeadBits{$word} if $fatal ; $mask &= ~($DeadBits{$word}|$All) if $no_fatal ; } else { Croaker("Unknown warnings category '$word'")} } return $mask ; } sub import { shift; my $catmask ; my $fatal = 0 ; my $no_fatal = 0 ; my $mask = ${^WARNING_BITS} ; if (vec($mask, $Offsets{'all'}, 1)) { $mask |= $Bits{'all'} ; $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1); } push @_, 'all' unless @_; foreach my $word ( @_ ) { if ($word eq 'FATAL') { $fatal = 1; $no_fatal = 0; } elsif ($word eq 'NONFATAL') { $fatal = 0; $no_fatal = 1; } elsif ($catmask = $Bits{$word}) { $mask |= $catmask ; $mask |= $DeadBits{$word} if $fatal ; $mask &= ~($DeadBits{$word}|$All) if $no_fatal ; } else { Croaker("Unknown warnings category '$word'")} } ${^WARNING_BITS} = $mask ; } sub unimport { shift; my $catmask ; my $mask = ${^WARNING_BITS} ; if (vec($mask, $Offsets{'all'}, 1)) { $mask |= $Bits{'all'} ; $mask |= $DeadBits{'all'} if vec($mask, $Offsets{'all'}+1, 1); } push @_, 'all' unless @_; foreach my $word ( @_ ) { if ($word eq 'FATAL') { next; } elsif ($catmask = $Bits{$word}) { $mask &= ~($catmask | $DeadBits{$word} | $All); } else { Croaker("Unknown warnings category '$word'")} } ${^WARNING_BITS} = $mask ; } sub __chk { my $category ; my $offset ; my $isobj = 0 ; if (@_) { # check the category supplied. $category = shift ; if (ref $category) { Croaker ("not an object") if $category !~ /^([^=]+)=/ ; $category = $1 ; $isobj = 1 ; } $offset = $Offsets{$category}; Croaker("Unknown warnings category '$category'") unless defined $offset; } else { $category = (caller(1))[0] ; $offset = $Offsets{$category}; Croaker("package '$category' not registered for warnings") unless defined $offset ; } my $this_pkg = (caller(1))[0] ; my $i = 2 ; my $pkg ; if ($isobj) { while (do { { package DB; $pkg = (caller($i++))[0] } } ) { last unless @DB::args && $DB::args[0] =~ /^$category=/ ; } $i -= 2 ; } else { for ($i = 2 ; $pkg = (caller($i))[0] ; ++ $i) { last if $pkg ne $this_pkg ; } $i = 2 if !$pkg || $pkg eq $this_pkg ; } my $callers_bitmask = (caller($i))[9] ; return ($callers_bitmask, $offset, $i) ; } sub enabled { Croaker("Usage: warnings::enabled([category])") unless @_ == 1 || @_ == 0 ; my ($callers_bitmask, $offset, $i) = __chk(@_) ; return 0 unless defined $callers_bitmask ; return vec($callers_bitmask, $offset, 1) || vec($callers_bitmask, $Offsets{'all'}, 1) ; } sub warn { Croaker("Usage: warnings::warn([category,] 'message')") unless @_ == 2 || @_ == 1 ; my $message = pop ; my ($callers_bitmask, $offset, $i) = __chk(@_) ; croak($message) if vec($callers_bitmask, $offset+1, 1) || vec($callers_bitmask, $Offsets{'all'}+1, 1) ; carp($message) ; } sub warnif { Croaker("Usage: warnings::warnif([category,] 'message')") unless @_ == 2 || @_ == 1 ; my $message = pop ; my ($callers_bitmask, $offset, $i) = __chk(@_) ; return unless defined $callers_bitmask && (vec($callers_bitmask, $offset, 1) || vec($callers_bitmask, $Offsets{'all'}, 1)) ; croak($message) if vec($callers_bitmask, $offset+1, 1) || vec($callers_bitmask, $Offsets{'all'}+1, 1) ; carp($message) ; } 1; FILE227d0c2c/warnings/register.pm(#line 1 "/usr/lib/perl5/5.8.0/warnings/register.pm" package warnings::register ; our $VERSION = '1.00'; #line 23 require warnings ; sub mkMask { my ($bit) = @_ ; my $mask = "" ; vec($mask, $bit, 1) = 1 ; return $mask ; } sub import { shift ; my $package = (caller(0))[0] ; if (! defined $warnings::Bits{$package}) { $warnings::Bits{$package} = mkMask($warnings::LAST_BIT) ; vec($warnings::Bits{'all'}, $warnings::LAST_BIT, 1) = 1 ; $warnings::Offsets{$package} = $warnings::LAST_BIT ++ ; foreach my $k (keys %warnings::Bits) { vec($warnings::Bits{$k}, $warnings::LAST_BIT, 1) = 0 ; } $warnings::DeadBits{$package} = mkMask($warnings::LAST_BIT); vec($warnings::DeadBits{'all'}, $warnings::LAST_BIT++, 1) = 1 ; } } 1 ; FILE678333e4/Archive/Zip.pm@#! perl -w #line 2 "/usr/lib/perl5/site_perl/5.8.0/Archive/Zip.pm" # $Revision: 1.88 $ # Copyright (c) 2000-2002 Ned Konz. All rights reserved. This program is free # software; you can redistribute it and/or modify it under the same terms as # Perl itself. # ---------------------------------------------------------------------- # class Archive::Zip # Note that the package Archive::Zip exists only for exporting and # sharing constants. Everything else is in another package # in this file. # Creation of a new Archive::Zip object actually creates a new object # of class Archive::Zip::Archive. # ---------------------------------------------------------------------- package Archive::Zip; require 5.003_96; use strict; use Carp(); use IO::File(); use IO::Seekable(); use Compress::Zlib(); use File::Spec 0.8 (); use vars qw( @ISA @EXPORT_OK %EXPORT_TAGS $VERSION $ChunkSize $ErrorHandler $TempSequence); # This is the size we'll try to read, write, and (de)compress. # You could set it to something different if you had lots of memory # and needed more speed. $ChunkSize = 32768; $ErrorHandler = \&Carp::carp; # BEGIN block is necessary here so that other modules can use the constants. BEGIN { require Exporter; $VERSION = "1.09"; @ISA = qw( Exporter ); my @ConstantNames = qw( FA_MSDOS FA_UNIX GPBF_ENCRYPTED_MASK GPBF_DEFLATING_COMPRESSION_MASK GPBF_HAS_DATA_DESCRIPTOR_MASK COMPRESSION_STORED COMPRESSION_DEFLATED COMPRESSION_LEVEL_NONE COMPRESSION_LEVEL_DEFAULT COMPRESSION_LEVEL_FASTEST COMPRESSION_LEVEL_BEST_COMPRESSION IFA_TEXT_FILE_MASK IFA_TEXT_FILE IFA_BINARY_FILE ); my @MiscConstantNames = qw( FA_AMIGA FA_VAX_VMS FA_VM_CMS FA_ATARI_ST FA_OS2_HPFS FA_MACINTOSH FA_Z_SYSTEM FA_CPM FA_TOPS20 FA_WINDOWS_NTFS FA_QDOS FA_ACORN FA_VFAT FA_MVS FA_BEOS FA_TANDEM FA_THEOS GPBF_IMPLODING_8K_SLIDING_DICTIONARY_MASK GPBF_IMPLODING_3_SHANNON_FANO_TREES_MASK GPBF_IS_COMPRESSED_PATCHED_DATA_MASK COMPRESSION_SHRUNK DEFLATING_COMPRESSION_NORMAL DEFLATING_COMPRESSION_MAXIMUM DEFLATING_COMPRESSION_FAST DEFLATING_COMPRESSION_SUPER_FAST COMPRESSION_REDUCED_1 COMPRESSION_REDUCED_2 COMPRESSION_REDUCED_3 COMPRESSION_REDUCED_4 COMPRESSION_IMPLODED COMPRESSION_TOKENIZED COMPRESSION_DEFLATED_ENHANCED COMPRESSION_PKWARE_DATA_COMPRESSION_LIBRARY_IMPLODED ); my @ErrorCodeNames = qw( AZ_OK AZ_STREAM_END AZ_ERROR AZ_FORMAT_ERROR AZ_IO_ERROR ); my @PKZipConstantNames = qw( SIGNATURE_FORMAT SIGNATURE_LENGTH LOCAL_FILE_HEADER_SIGNATURE LOCAL_FILE_HEADER_FORMAT LOCAL_FILE_HEADER_LENGTH DATA_DESCRIPTOR_FORMAT DATA_DESCRIPTOR_LENGTH CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE CENTRAL_DIRECTORY_FILE_HEADER_FORMAT CENTRAL_DIRECTORY_FILE_HEADER_LENGTH END_OF_CENTRAL_DIRECTORY_SIGNATURE END_OF_CENTRAL_DIRECTORY_SIGNATURE_STRING END_OF_CENTRAL_DIRECTORY_FORMAT END_OF_CENTRAL_DIRECTORY_LENGTH ); my @UtilityMethodNames = qw( _error _printError _ioError _formatError _subclassResponsibility _binmode _isSeekable _newFileHandle _readSignature _asZipDirName); @EXPORT_OK = ('computeCRC32'); %EXPORT_TAGS = ( 'CONSTANTS' => \@ConstantNames, 'MISC_CONSTANTS' => \@MiscConstantNames, 'ERROR_CODES' => \@ErrorCodeNames, # The following two sets are for internal use only 'PKZIP_CONSTANTS' => \@PKZipConstantNames, 'UTILITY_METHODS' => \@UtilityMethodNames ); # Add all the constant names and error code names to @EXPORT_OK Exporter::export_ok_tags( 'CONSTANTS', 'ERROR_CODES', 'PKZIP_CONSTANTS', 'UTILITY_METHODS', 'MISC_CONSTANTS' ); } # ------------------------- begin exportable error codes ------------------- use constant AZ_OK => 0; use constant AZ_STREAM_END => 1; use constant AZ_ERROR => 2; use constant AZ_FORMAT_ERROR => 3; use constant AZ_IO_ERROR => 4; # ------------------------- end exportable error codes --------------------- # ------------------------- begin exportable constants --------------------- # File types # Values of Archive::Zip::Member->fileAttributeFormat() use constant FA_MSDOS => 0; use constant FA_AMIGA => 1; use constant FA_VAX_VMS => 2; use constant FA_UNIX => 3; use constant FA_VM_CMS => 4; use constant FA_ATARI_ST => 5; use constant FA_OS2_HPFS => 6; use constant FA_MACINTOSH => 7; use constant FA_Z_SYSTEM => 8; use constant FA_CPM => 9; use constant FA_TOPS20 => 10; use constant FA_WINDOWS_NTFS => 11; use constant FA_QDOS => 12; use constant FA_ACORN => 13; use constant FA_VFAT => 14; use constant FA_MVS => 15; use constant FA_BEOS => 16; use constant FA_TANDEM => 17; use constant FA_THEOS => 18; # general-purpose bit flag masks # Found in Archive::Zip::Member->bitFlag() use constant GPBF_ENCRYPTED_MASK => 1 << 0; use constant GPBF_DEFLATING_COMPRESSION_MASK => 3 << 1; use constant GPBF_HAS_DATA_DESCRIPTOR_MASK => 1 << 3; # deflating compression types, if compressionMethod == COMPRESSION_DEFLATED # ( Archive::Zip::Member->bitFlag() & GPBF_DEFLATING_COMPRESSION_MASK ) use constant DEFLATING_COMPRESSION_NORMAL => 0 << 1; use constant DEFLATING_COMPRESSION_MAXIMUM => 1 << 1; use constant DEFLATING_COMPRESSION_FAST => 2 << 1; use constant DEFLATING_COMPRESSION_SUPER_FAST => 3 << 1; # compression method # these two are the only ones supported in this module use constant COMPRESSION_STORED => 0; # file is stored (no compression) use constant COMPRESSION_DEFLATED => 8; # file is Deflated use constant COMPRESSION_LEVEL_NONE => 0; use constant COMPRESSION_LEVEL_DEFAULT => -1; use constant COMPRESSION_LEVEL_FASTEST => 1; use constant COMPRESSION_LEVEL_BEST_COMPRESSION => 9; # internal file attribute bits # Found in Archive::Zip::Member::internalFileAttributes() use constant IFA_TEXT_FILE_MASK => 1; use constant IFA_TEXT_FILE => 1; # file is apparently text use constant IFA_BINARY_FILE => 0; # PKZIP file format miscellaneous constants (for internal use only) use constant SIGNATURE_FORMAT => "V"; use constant SIGNATURE_LENGTH => 4; use constant LOCAL_FILE_HEADER_SIGNATURE => 0x04034b50; use constant LOCAL_FILE_HEADER_FORMAT => "v3 V4 v2"; use constant LOCAL_FILE_HEADER_LENGTH => 26; use constant DATA_DESCRIPTOR_FORMAT => "V3"; use constant DATA_DESCRIPTOR_LENGTH => 12; use constant CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE => 0x02014b50; use constant CENTRAL_DIRECTORY_FILE_HEADER_FORMAT => "C2 v3 V4 v5 V2"; use constant CENTRAL_DIRECTORY_FILE_HEADER_LENGTH => 42; use constant END_OF_CENTRAL_DIRECTORY_SIGNATURE => 0x06054b50; use constant END_OF_CENTRAL_DIRECTORY_SIGNATURE_STRING => pack( "V", END_OF_CENTRAL_DIRECTORY_SIGNATURE ); use constant END_OF_CENTRAL_DIRECTORY_FORMAT => "v4 V2 v"; use constant END_OF_CENTRAL_DIRECTORY_LENGTH => 18; use constant GPBF_IMPLODING_8K_SLIDING_DICTIONARY_MASK => 1 << 1; use constant GPBF_IMPLODING_3_SHANNON_FANO_TREES_MASK => 1 << 2; use constant GPBF_IS_COMPRESSED_PATCHED_DATA_MASK => 1 << 5; # the rest of these are not supported in this module use constant COMPRESSION_SHRUNK => 1; # file is Shrunk use constant COMPRESSION_REDUCED_1 => 2; # file is Reduced CF=1 use constant COMPRESSION_REDUCED_2 => 3; # file is Reduced CF=2 use constant COMPRESSION_REDUCED_3 => 4; # file is Reduced CF=3 use constant COMPRESSION_REDUCED_4 => 5; # file is Reduced CF=4 use constant COMPRESSION_IMPLODED => 6; # file is Imploded use constant COMPRESSION_TOKENIZED => 7; # reserved for Tokenizing compr. use constant COMPRESSION_DEFLATED_ENHANCED => 9; # reserved for enh. Deflating use constant COMPRESSION_PKWARE_DATA_COMPRESSION_LIBRARY_IMPLODED => 10; # ------------------------- end of exportable constants --------------------- use constant ZIPARCHIVECLASS => 'Archive::Zip::Archive'; use constant ZIPMEMBERCLASS => 'Archive::Zip::Member'; sub new # Archive::Zip { my $class = shift; return $class->ZIPARCHIVECLASS->new(@_); } sub computeCRC32 # Archive::Zip { my $data = shift; $data = shift if ref($data); # allow calling as an obj method my $crc = shift; return Compress::Zlib::crc32( $data, $crc ); } # Report or change chunk size used for reading and writing. # Also sets Zlib's default buffer size (eventually). sub setChunkSize # Archive::Zip { my $chunkSize = shift; $chunkSize = shift if ref($chunkSize); # object method on zip? my $oldChunkSize = $Archive::Zip::ChunkSize; $Archive::Zip::ChunkSize = $chunkSize if ($chunkSize); return $oldChunkSize; } sub chunkSize # Archive::Zip { return $Archive::Zip::ChunkSize; } sub setErrorHandler (&) # Archive::Zip { my $errorHandler = shift; $errorHandler = \&Carp::carp unless defined($errorHandler); my $oldErrorHandler = $Archive::Zip::ErrorHandler; $Archive::Zip::ErrorHandler = $errorHandler; return $oldErrorHandler; } # ---------------------------------------------------------------------- # Private utility functions (not methods). # ---------------------------------------------------------------------- sub _printError # Archive::Zip { my $string = join ( ' ', @_, "\n" ); my $oldCarpLevel = $Carp::CarpLevel; $Carp::CarpLevel += 2; &{$ErrorHandler} ($string); $Carp::CarpLevel = $oldCarpLevel; } # This is called on format errors. sub _formatError # Archive::Zip { shift if ref( $_[0] ); _printError( 'format error:', @_ ); return AZ_FORMAT_ERROR; } # This is called on IO errors. sub _ioError # Archive::Zip { shift if ref( $_[0] ); _printError( 'IO error:', @_, ':', $! ); return AZ_IO_ERROR; } # This is called on generic errors. sub _error # Archive::Zip { shift if ref( $_[0] ); _printError( 'error:', @_ ); return AZ_ERROR; } # Called when a subclass should have implemented # something but didn't sub _subclassResponsibility # Archive::Zip { Carp::croak("subclass Responsibility\n"); } # Try to set the given file handle or object into binary mode. sub _binmode # Archive::Zip { my $fh = shift; return UNIVERSAL::can( $fh, 'binmode' ) ? $fh->binmode() : binmode($fh); } # Attempt to guess whether file handle is seekable. # Because of problems with Windoze, this only returns true when # the file handle is a real file. sub _isSeekable # Archive::Zip { my $fh = shift; if ( UNIVERSAL::isa( $fh, 'IO::Scalar' ) ) { return 0; } elsif ( UNIVERSAL::isa( $fh, 'IO::String' ) ) { return 1; } elsif ( UNIVERSAL::can( $fh, 'stat' ) ) { return -f $fh; } return UNIVERSAL::can( $fh, 'seek' ); } # Return an opened IO::Handle # my ( $status, fh ) = _newFileHandle( 'fileName', 'w' ); # Can take a filename, file handle, or ref to GLOB # Or, if given something that is a ref but not an IO::Handle, # passes back the same thing. sub _newFileHandle # Archive::Zip { my $fd = shift; my $status = 1; my $handle; if ( ref($fd) ) { if ( UNIVERSAL::isa( $fd, 'IO::Scalar' ) or UNIVERSAL::isa( $fd, 'IO::String' ) ) { $handle = $fd; } elsif ( UNIVERSAL::isa( $fd, 'IO::Handle' ) or UNIVERSAL::isa( $fd, 'GLOB' ) ) { $handle = IO::File->new(); $status = $handle->fdopen( $fd, @_ ); } else { $handle = $fd; } } else { $handle = IO::File->new(); $status = $handle->open( $fd, @_ ); } return ( $status, $handle ); } # Returns next signature from given file handle, leaves # file handle positioned afterwards. # In list context, returns ($status, $signature) # ( $status, $signature) = _readSignature( $fh, $fileName ); sub _readSignature # Archive::Zip { my $fh = shift; my $fileName = shift; my $expectedSignature = shift; # optional my $signatureData; my $bytesRead = $fh->read( $signatureData, SIGNATURE_LENGTH ); return _ioError("reading header signature") if $bytesRead != SIGNATURE_LENGTH; my $signature = unpack( SIGNATURE_FORMAT, $signatureData ); my $status = AZ_OK; # compare with expected signature, if any, or any known signature. if ( ( defined($expectedSignature) && $signature != $expectedSignature ) || ( !defined($expectedSignature) && $signature != CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE && $signature != LOCAL_FILE_HEADER_SIGNATURE && $signature != END_OF_CENTRAL_DIRECTORY_SIGNATURE ) ) { my $errmsg = sprintf( "bad signature: 0x%08x", $signature ); if ( _isSeekable($fh) ) { $errmsg .= sprintf( " at offset %d", $fh->tell() - SIGNATURE_LENGTH ); } $status = _formatError("$errmsg in file $fileName"); } return ( $status, $signature ); } # Utility method to make and open a temp file. # Will create $temp_dir if it doesn't exist. # Returns file handle and name: # # my ($fh, $name) = Archive::Zip::tempFile(); # my ($fh, $name) = Archive::Zip::tempFile('mytempdir'); # BEGIN { $Archive::Zip::TempSequence = 0 } sub tempFileName # Archive::Zip { my $temp_dir = shift; $temp_dir = ( -d '/tmp' ? '/tmp' : $ENV{TMPDIR} || $ENV{TEMP} || '.' ) unless defined($temp_dir); unless ( -d $temp_dir ) { mkdir( $temp_dir, 0777 ) or die "Can't create temp directory $temp_dir\: $!\n"; } my $base_name = sprintf( "%d-%d.%d", $$, time(), $Archive::Zip::TempSequence++ ); return File::Spec->canonpath( File::Spec->catpath( '', $temp_dir, $base_name ) ); } sub tempFile # Archive::Zip { my $full_name = tempFileName(@_); my $fh = IO::File->new( $full_name, '+>' ); return defined($fh) ? ( $fh, $full_name ) : (); } # Return the normalized directory name as used in a zip file (path # separators become slashes, etc.). # Will translate internal slashes in path components (i.e. on Macs) to # underscores. Discards volume names. # When $forceDir is set, returns paths with trailing slashes (or arrays # with trailing blank members). # # If third argument is a reference, returns volume information there. # # input output # . ('.') '.' # ./a ('a') a # ./a/b ('a','b') a/b # ./a/b/ ('a','b') a/b # a/b/ ('a','b') a/b # /a/b/ ('','a','b') /a/b # c:\a\b\c.doc ('','a','b','c.doc') /a/b/c.doc # on Windoze # "i/o maps:whatever" ('i_o maps', 'whatever') "i_o maps/whatever" # on Macs sub _asZipDirName # Archive::Zip { my $name = shift; my $forceDir = shift; my $volReturn = shift; my ( $volume, $directories, $file ) = File::Spec->splitpath( File::Spec->canonpath($name), $forceDir ); $$volReturn = $volume if ( ref($volReturn) ); my @dirs = map { $_ =~ s{/}{_}g; $_ } File::Spec->splitdir($directories); if ( @dirs > 0 ) { pop (@dirs) unless $dirs[-1] } # remove empty component push ( @dirs, $file || '' ); return wantarray ? @dirs : join ( '/', @dirs ); } # Return an absolute local name for a zip name. # Assume a directory if zip name has trailing slash. # Takes an optional volume name in FS format (like 'a:'). # sub _asLocalName # Archive::Zip { my $name = shift; # zip format my $volume = shift; $volume = '' unless defined($volume); # local FS format my @paths = split ( /\//, $name ); my $filename = pop (@paths); my $localDirs = File::Spec->catdir(@paths); my $localName = File::Spec->catpath( $volume, $localDirs, $filename ); $localName = File::Spec->rel2abs($localName) unless $volume; return $localName; } # ---------------------------------------------------------------------- # class Archive::Zip::Archive (concrete) # Generic ZIP archive. # ---------------------------------------------------------------------- package Archive::Zip::Archive; use File::Path; use File::Find(); use File::Spec(); use File::Copy(); use File::Basename; use Cwd; use vars qw( @ISA ); @ISA = qw( Archive::Zip ); BEGIN { use Archive::Zip qw( :CONSTANTS :ERROR_CODES :PKZIP_CONSTANTS :UTILITY_METHODS ); } # Note that this returns undef on read errors, else new zip object. sub new # Archive::Zip::Archive { my $class = shift; my $self = bless( { 'diskNumber' => 0, 'diskNumberWithStartOfCentralDirectory' => 0, 'numberOfCentralDirectoriesOnThisDisk' => 0, # shld be # of members 'numberOfCentralDirectories' => 0, # shld be # of members 'centralDirectorySize' => 0, # must re-compute on write 'centralDirectoryOffsetWRTStartingDiskNumber' => 0, # must re-compute 'writeEOCDOffset' => 0, 'writeCentralDirectoryOffset' => 0, 'zipfileComment' => '', 'eocdOffset' => 0, 'fileName' => '' }, $class ); $self->{'members'} = []; if (@_) { my $status = $self->read(@_); return $status == AZ_OK ? $self : undef; } return $self; } sub members # Archive::Zip::Archive { @{ shift->{'members'} }; } sub numberOfMembers # Archive::Zip::Archive { scalar( shift->members() ); } sub memberNames # Archive::Zip::Archive { my $self = shift; return map { $_->fileName() } $self->members(); } # return ref to member with given name or undef sub memberNamed # Archive::Zip::Archive { my ( $self, $fileName ) = @_; foreach my $member ( $self->members() ) { return $member if $member->fileName() eq $fileName; } return undef; } sub membersMatching # Archive::Zip::Archive { my ( $self, $pattern ) = @_; return grep { $_->fileName() =~ /$pattern/ } $self->members(); } sub diskNumber # Archive::Zip::Archive { shift->{'diskNumber'}; } sub diskNumberWithStartOfCentralDirectory # Archive::Zip::Archive { shift->{'diskNumberWithStartOfCentralDirectory'}; } sub numberOfCentralDirectoriesOnThisDisk # Archive::Zip::Archive { shift->{'numberOfCentralDirectoriesOnThisDisk'}; } sub numberOfCentralDirectories # Archive::Zip::Archive { shift->{'numberOfCentralDirectories'}; } sub centralDirectorySize # Archive::Zip::Archive { shift->{'centralDirectorySize'}; } sub centralDirectoryOffsetWRTStartingDiskNumber # Archive::Zip::Archive { shift->{'centralDirectoryOffsetWRTStartingDiskNumber'}; } sub zipfileComment # Archive::Zip::Archive { my $self = shift; my $comment = $self->{'zipfileComment'}; if (@_) { $self->{'zipfileComment'} = shift; } return $comment; } sub eocdOffset # Archive::Zip::Archive { shift->{'eocdOffset'}; } # Return the name of the file last read. sub fileName # Archive::Zip::Archive { shift->{'fileName'}; } sub removeMember # Archive::Zip::Archive { my ( $self, $member ) = @_; $member = $self->memberNamed($member) unless ref($member); return undef unless $member; my @newMembers = grep { $_ != $member } $self->members(); $self->{'members'} = \@newMembers; return $member; } sub replaceMember # Archive::Zip::Archive { my ( $self, $oldMember, $newMember ) = @_; $oldMember = $self->memberNamed($oldMember) unless ref($oldMember); return undef unless $oldMember; return undef unless $newMember; my @newMembers = map { ( $_ == $oldMember ) ? $newMember : $_ } $self->members(); $self->{'members'} = \@newMembers; return $oldMember; } sub extractMember # Archive::Zip::Archive { my $self = shift; my $member = shift; $member = $self->memberNamed($member) unless ref($member); return _error('member not found') unless $member; my $name = shift; # local FS name if given my ( $volumeName, $dirName, $fileName ); if ( defined($name) ) { ( $volumeName, $dirName, $fileName ) = File::Spec->splitpath($name); $dirName = File::Spec->catpath( $volumeName, $dirName, '' ); } else { $name = $member->fileName(); ( $dirName = $name ) =~ s{[^/]*$}{}; $dirName = Archive::Zip::_asLocalName($dirName); $name = Archive::Zip::_asLocalName($name); } if ( $dirName && !-d $dirName ) { mkpath($dirName); return _ioError("can't create dir $dirName") if ( !-d $dirName ); } return $member->extractToFileNamed( $name, @_ ); } sub extractMemberWithoutPaths # Archive::Zip::Archive { my $self = shift; my $member = shift; $member = $self->memberNamed($member) unless ref($member); return _error('member not found') unless $member; return AZ_OK if $member->isDirectory(); my $name = shift; unless ($name) { $name = $member->fileName(); $name =~ s{.*/}{}; # strip off directories, if any $name = Archive::Zip::_asLocalName($name); } return $member->extractToFileNamed( $name, @_ ); } sub addMember # Archive::Zip::Archive { my ( $self, $newMember ) = @_; push ( @{ $self->{'members'} }, $newMember ) if $newMember; return $newMember; } sub addFile # Archive::Zip::Archive { my $self = shift; my $fileName = shift; my $newName = shift; my $newMember = $self->ZIPMEMBERCLASS->newFromFile( $fileName, $newName ); $self->addMember($newMember) if defined($newMember); return $newMember; } sub addString # Archive::Zip::Archive { my $self = shift; my $newMember = $self->ZIPMEMBERCLASS->newFromString(@_); return $self->addMember($newMember); } sub addDirectory # Archive::Zip::Archive { my ( $self, $name, $newName ) = @_; my $newMember = $self->ZIPMEMBERCLASS->newDirectoryNamed( $name, $newName ); $self->addMember($newMember); return $newMember; } # add either a file or a directory. sub addFileOrDirectory { my ( $self, $name, $newName ) = @_; if ( -f $name ) { ( $newName =~ s{/$}{} ) if $newName; return $self->addFile( $name, $newName ); } elsif ( -d $name ) { ( $newName =~ s{[^/]$}{&/} ) if $newName; return $self->addDirectory( $name, $newName ); } else { return _error("$name is neither a file nor a directory"); } } sub contents # Archive::Zip::Archive { my ( $self, $member, $newContents ) = @_; $member = $self->memberNamed($member) unless ref($member); return undef unless $member; return $member->contents($newContents); } sub writeToFileNamed # Archive::Zip::Archive { my $self = shift; my $fileName = shift; # local FS format foreach my $member ( $self->members() ) { if ( $member->_usesFileNamed($fileName) ) { return _error( "$fileName is needed by member " . $member->fileName() . "; consider using overwrite() or overwriteAs() instead." ); } } my ( $status, $fh ) = _newFileHandle( $fileName, 'w' ); return _ioError("Can't open $fileName for write") unless $status; my $retval = $self->writeToFileHandle( $fh, 1 ); $fh->close(); return $retval; } # It is possible to write data to the FH before calling this, # perhaps to make a self-extracting archive. sub writeToFileHandle # Archive::Zip::Archive { my $self = shift; my $fh = shift; my $fhIsSeekable = @_ ? shift: _isSeekable($fh); _binmode($fh); # Find out where the current position is. my $offset = $fhIsSeekable ? $fh->tell() : 0; $offset = 0 if $offset < 0; foreach my $member ( $self->members() ) { my $retval = $member->_writeToFileHandle( $fh, $fhIsSeekable, $offset ); $member->endRead(); return $retval if $retval != AZ_OK; $offset += $member->_localHeaderSize() + $member->_writeOffset(); $offset += $member->hasDataDescriptor() ? DATA_DESCRIPTOR_LENGTH: 0; # changed this so it reflects the last successful position $self->{'writeCentralDirectoryOffset'} = $offset; } return $self->writeCentralDirectory($fh); } # Write zip back to the original file, # as safely as possible. # Returns AZ_OK if successful. sub overwrite # Archive::Zip::Archive { my $self = shift; return $self->overwriteAs( $self->{'fileName'} ); } # Write zip to the specified file, # as safely as possible. # Returns AZ_OK if successful. sub overwriteAs # Archive::Zip::Archive { my $self = shift; my $zipName = shift; return _error("no filename in overwriteAs()") unless defined($zipName); my ( $fh, $tempName ) = Archive::Zip::tempFile(); return _error( "Can't open temp file", $! ) unless $fh; ( my $backupName = $zipName ) =~ s{\.[^.]*$}{.zbk}; my $status; if ( ( $status = $self->writeToFileHandle($fh) ) == AZ_OK ) { my $err; $fh->close(); # rename the zip if ( -f $zipName && !rename( $zipName, $backupName ) ) { $err = $!; unlink($tempName); return _error( "Can't rename $zipName as $backupName", $err ); } # move the temp to the original name (possibly copying) unless ( File::Copy::move( $tempName, $zipName ) ) { $err = $!; rename( $backupName, $zipName ); unlink($tempName); return _error( "Can't move $tempName to $zipName", $err ); } # unlink the backup if ( -f $backupName && !unlink($backupName) ) { $err = $!; return _error( "Can't unlink $backupName", $err ); } return AZ_OK; } else { $fh->close(); unlink($tempName); _printError("Can't write to $tempName"); return $status; } } # Used only during writing sub _writeCentralDirectoryOffset # Archive::Zip::Archive { shift->{'writeCentralDirectoryOffset'}; } sub _writeEOCDOffset # Archive::Zip::Archive { shift->{'writeEOCDOffset'}; } # Expects to have _writeEOCDOffset() set sub _writeEndOfCentralDirectory # Archive::Zip::Archive { my ( $self, $fh ) = @_; $fh->print(END_OF_CENTRAL_DIRECTORY_SIGNATURE_STRING) or return _ioError('writing EOCD Signature'); my $zipfileCommentLength = length( $self->zipfileComment() ); my $header = pack( END_OF_CENTRAL_DIRECTORY_FORMAT, 0, # {'diskNumber'}, 0, # {'diskNumberWithStartOfCentralDirectory'}, $self->numberOfMembers(), # {'numberOfCentralDirectoriesOnThisDisk'}, $self->numberOfMembers(), # {'numberOfCentralDirectories'}, $self->_writeEOCDOffset() - $self->_writeCentralDirectoryOffset(), $self->_writeCentralDirectoryOffset(), $zipfileCommentLength ); $fh->print($header) or return _ioError('writing EOCD header'); if ($zipfileCommentLength) { $fh->print( $self->zipfileComment() ) or return _ioError('writing zipfile comment'); } return AZ_OK; } # $offset can be specified to truncate a zip file. sub writeCentralDirectory # Archive::Zip::Archive { my ( $self, $fh, $offset ) = @_; if ( defined($offset) ) { $self->{'writeCentralDirectoryOffset'} = $offset; $fh->seek( $offset, IO::Seekable::SEEK_SET ) or return _ioError('seeking to write central directory'); } else { $offset = $self->_writeCentralDirectoryOffset(); } foreach my $member ( $self->members() ) { my $status = $member->_writeCentralDirectoryFileHeader($fh); return $status if $status != AZ_OK; $offset += $member->_centralDirectoryHeaderSize(); $self->{'writeEOCDOffset'} = $offset; } return $self->_writeEndOfCentralDirectory($fh); } sub read # Archive::Zip::Archive { my $self = shift; my $fileName = shift; return _error('No filename given') unless $fileName; my ( $status, $fh ) = _newFileHandle( $fileName, 'r' ); return _ioError("opening $fileName for read") unless $status; $status = $self->readFromFileHandle( $fh, $fileName ); return $status if $status != AZ_OK; $fh->close(); $self->{'fileName'} = $fileName; return AZ_OK; } sub readFromFileHandle # Archive::Zip::Archive { my $self = shift; my $fh = shift; my $fileName = shift; $fileName = $fh unless defined($fileName); return _error('No filehandle given') unless $fh; return _ioError('filehandle not open') unless $fh->opened(); $fh->seek( 0, 0 ); # rewind the file _binmode($fh); my $status = $self->_findEndOfCentralDirectory($fh); return $status if $status != AZ_OK; my $eocdPosition = $fh->tell(); $status = $self->_readEndOfCentralDirectory($fh); return $status if $status != AZ_OK; $fh->seek( $eocdPosition - $self->centralDirectorySize(), IO::Seekable::SEEK_SET ) or return _ioError("Can't seek $fileName"); # Try to detect garbage at beginning of archives # This should be 0 $self->{'eocdOffset'} = $eocdPosition - $self->centralDirectorySize() # here - $self->centralDirectoryOffsetWRTStartingDiskNumber(); for ( ; ; ) { my $newMember = $self->ZIPMEMBERCLASS->_newFromZipFile( $fh, $fileName, $self->eocdOffset() ); my $signature; ( $status, $signature ) = _readSignature( $fh, $fileName ); return $status if $status != AZ_OK; last if $signature == END_OF_CENTRAL_DIRECTORY_SIGNATURE; $status = $newMember->_readCentralDirectoryFileHeader(); return $status if $status != AZ_OK; $status = $newMember->endRead(); return $status if $status != AZ_OK; $newMember->_becomeDirectoryIfNecessary(); push ( @{ $self->{'members'} }, $newMember ); } $self->{'fileName'} = "$fh"; return AZ_OK; } # Read EOCD, starting from position before signature. # Return AZ_OK on success. sub _readEndOfCentralDirectory # Archive::Zip::Archive { my $self = shift; my $fh = shift; # Skip past signature $fh->seek( SIGNATURE_LENGTH, IO::Seekable::SEEK_CUR ) or return _ioError("Can't seek past EOCD signature"); my $header = ''; my $bytesRead = $fh->read( $header, END_OF_CENTRAL_DIRECTORY_LENGTH ); if ( $bytesRead != END_OF_CENTRAL_DIRECTORY_LENGTH ) { return _ioError("reading end of central directory"); } my $zipfileCommentLength; ( $self->{'diskNumber'}, $self->{'diskNumberWithStartOfCentralDirectory'}, $self->{'numberOfCentralDirectoriesOnThisDisk'}, $self->{'numberOfCentralDirectories'}, $self->{'centralDirectorySize'}, $self->{'centralDirectoryOffsetWRTStartingDiskNumber'}, $zipfileCommentLength ) = unpack( END_OF_CENTRAL_DIRECTORY_FORMAT, $header ); if ($zipfileCommentLength) { my $zipfileComment = ''; $bytesRead = $fh->read( $zipfileComment, $zipfileCommentLength ); if ( $bytesRead != $zipfileCommentLength ) { return _ioError("reading zipfile comment"); } $self->{'zipfileComment'} = $zipfileComment; } return AZ_OK; } # Seek in my file to the end, then read backwards until we find the # signature of the central directory record. Leave the file positioned right # before the signature. Returns AZ_OK if success. sub _findEndOfCentralDirectory # Archive::Zip::Archive { my $self = shift; my $fh = shift; my $data = ''; $fh->seek( 0, IO::Seekable::SEEK_END ) or return _ioError("seeking to end"); my $fileLength = $fh->tell(); if ( $fileLength < END_OF_CENTRAL_DIRECTORY_LENGTH + 4 ) { return _formatError("file is too short"); } my $seekOffset = 0; my $pos = -1; for ( ; ; ) { $seekOffset += 512; $seekOffset = $fileLength if ( $seekOffset > $fileLength ); $fh->seek( -$seekOffset, IO::Seekable::SEEK_END ) or return _ioError("seek failed"); my $bytesRead = $fh->read( $data, $seekOffset ); if ( $bytesRead != $seekOffset ) { return _ioError("read failed"); } $pos = rindex( $data, END_OF_CENTRAL_DIRECTORY_SIGNATURE_STRING ); last if ( $pos >= 0 or $seekOffset == $fileLength or $seekOffset >= $Archive::Zip::ChunkSize ); } if ( $pos >= 0 ) { $fh->seek( $pos - $seekOffset, IO::Seekable::SEEK_CUR ) or return _ioError("seeking to EOCD"); return AZ_OK; } else { return _formatError("can't find EOCD signature"); } } sub addTree # Archive::Zip::Archive { my $self = shift; my $root = shift or return _error("root arg missing in call to addTree()"); my $dest = shift; $dest = '' unless defined($dest); my $pred = shift || sub { -r }; my @files; my $startDir = cwd(); # This avoids chdir'ing in Find, in a way compatible with older # versions of File::Find. my $wanted = sub { local $main::_ = $File::Find::name; my $dir = $File::Find::dir; chdir($startDir); push ( @files, $File::Find::name ) if (&$pred); chdir($dir); }; File::Find::find( $wanted, $root ); my $rootZipName = _asZipDirName( $root, 1 ); # with trailing slash my $pattern = $rootZipName eq './' ? '^' : "^\Q$rootZipName\E"; $dest = _asZipDirName( $dest, 1 ); # with trailing slash foreach my $fileName (@files) { my $isDir = -d $fileName; # normalize, remove leading ./ my $archiveName = _asZipDirName( $fileName, $isDir ); if ( $archiveName eq $rootZipName ) { $archiveName = $dest } else { $archiveName =~ s{$pattern}{$dest} } next if $archiveName =~ m{^\.?/?$}; # skip current dir my $member = $isDir ? $self->addDirectory( $fileName, $archiveName ) : $self->addFile( $fileName, $archiveName ); return _error("add $fileName failed in addTree()") if !$member; } return AZ_OK; } sub addTreeMatching # Archive::Zip::Archive { my $self = shift; my $root = shift or return _error("root arg missing in call to addTreeMatching()"); my $dest = shift; $dest = '' unless defined($dest); my $pattern = shift or return _error("pattern missing in call to addTreeMatching()"); my $pred = shift; my $matcher = $pred ? sub { m{$pattern} && &$pred } : sub { m{$pattern} && -r }; return $self->addTree( $root, $dest, $matcher ); } # $zip->extractTree( $root, $dest [, $volume] ); # # $root and $dest are Unix-style. # $volume is in local FS format. # sub extractTree # Archive::Zip::Archive { my $self = shift; my $root = shift; # Zip format $root = '' unless defined($root); my $dest = shift; # Zip format $dest = './' unless defined($dest); my $volume = shift; # optional my $pattern = "^\Q$root"; my @members = $self->membersMatching($pattern); foreach my $member (@members) { my $fileName = $member->fileName(); # in Unix format $fileName =~ s{$pattern}{$dest}; # in Unix format # convert to platform format: $fileName = Archive::Zip::_asLocalName( $fileName, $volume ); my $status = $member->extractToFileNamed($fileName); return $status if $status != AZ_OK; } return AZ_OK; } # $zip->updateMember( $memberOrName, $fileName ); # Returns (possibly updated) member, if any; undef on errors. sub updateMember # Archive::Zip::Archive { my $self = shift; my $oldMember = shift; my $fileName = shift; if ( !defined($fileName) ) { _error("updateMember(): missing fileName argument"); return undef; } my @newStat = stat($fileName); if ( !@newStat ) { _ioError("Can't stat $fileName"); return undef; } my $isDir = -d _; my $memberName; if ( ref($oldMember) ) { $memberName = $oldMember->fileName(); } else { $oldMember = $self->memberNamed( $memberName = $oldMember ) || $self->memberNamed( $memberName = _asZipDirName( $oldMember, $isDir ) ); } unless ( defined($oldMember) && $oldMember->lastModTime() == $newStat[9] && $oldMember->isDirectory() == $isDir && ( $isDir || ( $oldMember->uncompressedSize() == $newStat[7] ) ) ) { # create the new member my $newMember = $isDir ? $self->ZIPMEMBERCLASS->newDirectoryNamed( $fileName, $memberName ) : $self->ZIPMEMBERCLASS->newFromFile( $fileName, $memberName ); unless ( defined($newMember) ) { _error("creation of member $fileName failed in updateMember()"); return undef; } # replace old member or append new one if ( defined($oldMember) ) { $self->replaceMember( $oldMember, $newMember ); } else { $self->addMember($newMember); } return $newMember; } return $oldMember; } # $zip->updateTree( $root, [ $dest, [ $pred [, $mirror]]] ); # # This takes the same arguments as addTree, but first checks to see # whether the file or directory already exists in the zip file. # # If the fourth argument $mirror is true, then delete all my members # if corresponding files weren't found. sub updateTree # Archive::Zip::Archive { my $self = shift; my $root = shift or return _error("root arg missing in call to updateTree()"); my $dest = shift; $dest = '' unless defined($dest); $dest = _asZipDirName( $dest, 1 ); my $pred = shift || sub { -r }; my $mirror = shift; my $rootZipName = _asZipDirName( $root, 1 ); # with trailing slash my $pattern = $rootZipName eq './' ? '^' : "^\Q$rootZipName\E"; my $startDir = cwd(); my @files; # This avoids chdir'ing in Find, in a way compatible with older # versions of File::Find. my $wanted = sub { local $main::_ = $File::Find::name; my $dir = $File::Find::dir; chdir($startDir); push ( @files, $File::Find::name ) if (&$pred); chdir($dir); }; File::Find::find( $wanted, $root ); # Now @files has all the files that I could potentially be adding to # the zip. Only add the ones that are necessary. # For each file (updated or not), add its member name to @done. my %done; foreach my $fileName (@files) { my @newStat = stat($fileName); my $isDir = -d _; # normalize, remove leading ./ my $memberName = _asZipDirName( $fileName, $isDir ); if ( $memberName eq $rootZipName ) { $memberName = $dest } else { $memberName =~ s{$pattern}{$dest} } next if $memberName =~ m{^\.?/?$}; # skip current dir $done{$memberName} = 1; my $changedMember = $self->updateMember( $memberName, $fileName ); return _error("updateTree failed to update $fileName") unless ref($changedMember); } # @done now has the archive names corresponding to all the found files. # If we're mirroring, delete all those members that aren't in @done. if ($mirror) { foreach my $member ( $self->members() ) { $self->removeMember($member) unless $done{ $member->fileName() }; } } return AZ_OK; } # ---------------------------------------------------------------------- # class Archive::Zip::Member # A generic member of an archive ( abstract ) # ---------------------------------------------------------------------- package Archive::Zip::Member; use vars qw( @ISA ); @ISA = qw ( Archive::Zip ); BEGIN { use Archive::Zip qw( :CONSTANTS :MISC_CONSTANTS :ERROR_CODES :PKZIP_CONSTANTS :UTILITY_METHODS ); } use Time::Local(); use Compress::Zlib qw( Z_OK Z_STREAM_END MAX_WBITS ); use File::Path; use File::Basename; use constant ZIPFILEMEMBERCLASS => 'Archive::Zip::ZipFileMember'; use constant NEWFILEMEMBERCLASS => 'Archive::Zip::NewFileMember'; use constant STRINGMEMBERCLASS => 'Archive::Zip::StringMember'; use constant DIRECTORYMEMBERCLASS => 'Archive::Zip::DirectoryMember'; # Unix perms for default creation of files/dirs. use constant DEFAULT_DIRECTORY_PERMISSIONS => 040755; use constant DEFAULT_FILE_PERMISSIONS => 0100666; use constant DIRECTORY_ATTRIB => 040000; use constant FILE_ATTRIB => 0100000; # Returns self if successful, else undef # Assumes that fh is positioned at beginning of central directory file header. # Leaves fh positioned immediately after file header or EOCD signature. sub _newFromZipFile # Archive::Zip::Member { my $class = shift; my $self = $class->ZIPFILEMEMBERCLASS->_newFromZipFile(@_); return $self; } sub newFromString # Archive::Zip::Member { my $class = shift; my $self = $class->STRINGMEMBERCLASS->_newFromString(@_); return $self; } sub newFromFile # Archive::Zip::Member { my $class = shift; my $self = $class->NEWFILEMEMBERCLASS->_newFromFileNamed(@_); return $self; } sub newDirectoryNamed # Archive::Zip::Member { my $class = shift; my $self = $class->DIRECTORYMEMBERCLASS->_newNamed(@_); return $self; } sub new # Archive::Zip::Member { my $class = shift; my $self = { 'lastModFileDateTime' => 0, 'fileAttributeFormat' => FA_UNIX, 'versionMadeBy' => 20, 'versionNeededToExtract' => 20, 'bitFlag' => 0, 'compressionMethod' => COMPRESSION_STORED, 'desiredCompressionMethod' => COMPRESSION_STORED, 'desiredCompressionLevel' => COMPRESSION_LEVEL_NONE, 'internalFileAttributes' => 0, 'externalFileAttributes' => 0, # set later 'fileName' => '', 'cdExtraField' => '', 'localExtraField' => '', 'fileComment' => '', 'crc32' => 0, 'compressedSize' => 0, 'uncompressedSize' => 0, @_ }; bless( $self, $class ); $self->unixFileAttributes( $self->DEFAULT_FILE_PERMISSIONS ); return $self; } sub _becomeDirectoryIfNecessary # Archive::Zip::Member { my $self = shift; $self->_become(DIRECTORYMEMBERCLASS) if $self->isDirectory(); return $self; } # Morph into given class (do whatever cleanup I need to do) sub _become # Archive::Zip::Member { return bless( $_[0], $_[1] ); } sub versionMadeBy # Archive::Zip::Member { shift->{'versionMadeBy'}; } sub fileAttributeFormat # Archive::Zip::Member { ( $#_ > 0 ) ? ( $_[0]->{'fileAttributeFormat'} = $_[1] ) : $_[0]->{'fileAttributeFormat'}; } sub versionNeededToExtract # Archive::Zip::Member { shift->{'versionNeededToExtract'}; } sub bitFlag # Archive::Zip::Member { shift->{'bitFlag'}; } sub compressionMethod # Archive::Zip::Member { shift->{'compressionMethod'}; } sub desiredCompressionMethod # Archive::Zip::Member { my $self = shift; my $newDesiredCompressionMethod = shift; my $oldDesiredCompressionMethod = $self->{'desiredCompressionMethod'}; if ( defined($newDesiredCompressionMethod) ) { $self->{'desiredCompressionMethod'} = $newDesiredCompressionMethod; if ( $newDesiredCompressionMethod == COMPRESSION_STORED ) { $self->{'desiredCompressionLevel'} = 0; } elsif ( $oldDesiredCompressionMethod == COMPRESSION_STORED ) { $self->{'desiredCompressionLevel'} = COMPRESSION_LEVEL_DEFAULT; } } return $oldDesiredCompressionMethod; } sub desiredCompressionLevel # Archive::Zip::Member { my $self = shift; my $newDesiredCompressionLevel = shift; my $oldDesiredCompressionLevel = $self->{'desiredCompressionLevel'}; if ( defined($newDesiredCompressionLevel) ) { $self->{'desiredCompressionLevel'} = $newDesiredCompressionLevel; $self->{'desiredCompressionMethod'} = ( $newDesiredCompressionLevel ? COMPRESSION_DEFLATED : COMPRESSION_STORED ); } return $oldDesiredCompressionLevel; } sub fileName # Archive::Zip::Member { my $self = shift; my $newName = shift; if ($newName) { $newName =~ s{[\\/]+}{/}g; # deal with dos/windoze problems $self->{'fileName'} = $newName; } return $self->{'fileName'}; } sub lastModFileDateTime # Archive::Zip::Member { my $modTime = shift->{'lastModFileDateTime'}; $modTime =~ m/^(\d+)$/; # untaint return $1; } sub lastModTime # Archive::Zip::Member { my $self = shift; return _dosToUnixTime( $self->lastModFileDateTime() ); } sub setLastModFileDateTimeFromUnix # Archive::Zip::Member { my $self = shift; my $time_t = shift; $self->{'lastModFileDateTime'} = _unixToDosTime($time_t); } # DOS date/time format # 0-4 (5) Second divided by 2 # 5-10 (6) Minute (0-59) # 11-15 (5) Hour (0-23 on a 24-hour clock) # 16-20 (5) Day of the month (1-31) # 21-24 (4) Month (1 = January, 2 = February, etc.) # 25-31 (7) Year offset from 1980 (add 1980 to get actual year) # Convert DOS date/time format to unix time_t format # NOT AN OBJECT METHOD! sub _dosToUnixTime # Archive::Zip::Member { my $dt = shift; return time() unless defined($dt); my $year = ( ( $dt >> 25 ) & 0x7f ) + 80; my $mon = ( ( $dt >> 21 ) & 0x0f ) - 1; my $mday = ( ( $dt >> 16 ) & 0x1f ); my $hour = ( ( $dt >> 11 ) & 0x1f ); my $min = ( ( $dt >> 5 ) & 0x3f ); my $sec = ( ( $dt << 1 ) & 0x3e ); # catch errors my $time_t = eval { Time::Local::timelocal( $sec, $min, $hour, $mday, $mon, $year ); }; return time() if ($@); return $time_t; } sub internalFileAttributes # Archive::Zip::Member { shift->{'internalFileAttributes'}; } sub externalFileAttributes # Archive::Zip::Member { shift->{'externalFileAttributes'}; } # Convert UNIX permissions into proper value for zip file # NOT A METHOD! sub _mapPermissionsFromUnix # Archive::Zip::Member { my $perms = shift; return $perms << 16; # TODO: map MS-DOS perms too (RHSA?) } # Convert ZIP permissions into Unix ones # # This was taken from Info-ZIP group's portable UnZip # zipfile-extraction program, version 5.50. # http://www.info-zip.org/pub/infozip/ # # See the mapattr() function in unix/unix.c # See the attribute format constants in unzpriv.h # # XXX Note that there's one situation that isn't implemented # yet that depends on the "extra field." sub _mapPermissionsToUnix # Archive::Zip::Member { my $self = shift; my $format = $self->{'fileAttributeFormat'}; my $attribs = $self->{'externalFileAttributes'}; my $mode = 0; if ( $format == FA_AMIGA ) { $attribs = $attribs >> 17 & 7; # Amiga RWE bits $mode = $attribs << 6 | $attribs << 3 | $attribs; return $mode; } if ( $format == FA_THEOS ) { $attribs &= 0xF1FFFFFF; if ( ( $attribs & 0xF0000000 ) != 0x40000000 ) { $attribs &= 0x01FFFFFF; # not a dir, mask all ftype bits } else { $attribs &= 0x41FFFFFF; # leave directory bit as set } } if ( $format == FA_UNIX || $format == FA_VAX_VMS || $format == FA_ACORN || $format == FA_ATARI_ST || $format == FA_BEOS || $format == FA_QDOS || $format == FA_TANDEM ) { $mode = $attribs >> 16; return $mode if $mode != 0 or not $self->localExtraField; # warn("local extra field is: ", $self->localExtraField, "\n"); # XXX This condition is not implemented # I'm just including the comments from the info-zip section for now. # Some (non-Info-ZIP) implementations of Zip for Unix and # VMS (and probably others ??) leave 0 in the upper 16-bit # part of the external_file_attributes field. Instead, they # store file permission attributes in some extra field. # As a work-around, we search for the presence of one of # these extra fields and fall back to the MSDOS compatible # part of external_file_attributes if one of the known # e.f. types has been detected. # Later, we might implement extraction of the permission # bits from the VMS extra field. But for now, the work-around # should be sufficient to provide "readable" extracted files. # (For ASI Unix e.f., an experimental remap from the e.f. # mode value IS already provided!) } # PKWARE's PKZip for Unix marks entries as FA_MSDOS, but stores the # Unix attributes in the upper 16 bits of the external attributes # field, just like Info-ZIP's Zip for Unix. We try to use that # value, after a check for consistency with the MSDOS attribute # bits (see below). if ( $format == FA_MSDOS ) { $mode = $attribs >> 16; } # FA_MSDOS, FA_OS2_HPFS, FA_WINDOWS_NTFS, FA_MACINTOSH, FA_TOPS20 $attribs = !( $attribs & 1 ) << 1 | ( $attribs & 0x10 ) >> 4; # keep previous $mode setting when its "owner" # part appears to be consistent with DOS attribute flags! return $mode if ( $mode & 0700 ) == ( 0400 | $attribs << 6 ); $mode = 0444 | $attribs << 6 | $attribs << 3 | $attribs; return $mode; } sub unixFileAttributes # Archive::Zip::Member { my $self = shift; my $oldPerms = $self->_mapPermissionsToUnix(); if (@_) { my $perms = shift; if ( $self->isDirectory() ) { $perms &= ~FILE_ATTRIB; $perms |= DIRECTORY_ATTRIB; } else { $perms &= ~DIRECTORY_ATTRIB; $perms |= FILE_ATTRIB; } $self->{'externalFileAttributes'} = _mapPermissionsFromUnix($perms); } return $oldPerms; } sub localExtraField # Archive::Zip::Member { ( $#_ > 0 ) ? ( $_[0]->{'localExtraField'} = $_[1] ) : $_[0]->{'localExtraField'}; } sub cdExtraField # Archive::Zip::Member { ( $#_ > 0 ) ? ( $_[0]->{'cdExtraField'} = $_[1] ) : $_[0]->{'cdExtraField'}; } sub extraFields # Archive::Zip::Member { my $self = shift; return $self->localExtraField() . $self->cdExtraField(); } sub fileComment # Archive::Zip::Member { ( $#_ > 0 ) ? ( $_[0]->{'fileComment'} = $_[1] ) : $_[0]->{'fileComment'}; } sub hasDataDescriptor # Archive::Zip::Member { my $self = shift; if (@_) { my $shouldHave = shift; if ($shouldHave) { $self->{'bitFlag'} |= GPBF_HAS_DATA_DESCRIPTOR_MASK; } else { $self->{'bitFlag'} &= ~GPBF_HAS_DATA_DESCRIPTOR_MASK; } } return $self->{'bitFlag'} & GPBF_HAS_DATA_DESCRIPTOR_MASK; } sub crc32 # Archive::Zip::Member { shift->{'crc32'}; } sub crc32String # Archive::Zip::Member { sprintf( "%08x", shift->{'crc32'} ); } sub compressedSize # Archive::Zip::Member { shift->{'compressedSize'}; } sub uncompressedSize # Archive::Zip::Member { shift->{'uncompressedSize'}; } sub isEncrypted # Archive::Zip::Member { shift->bitFlag() & GPBF_ENCRYPTED_MASK; } sub isTextFile # Archive::Zip::Member { my $self = shift; my $bit = $self->internalFileAttributes() & IFA_TEXT_FILE_MASK; if (@_) { my $flag = shift; $self->{'internalFileAttributes'} &= ~IFA_TEXT_FILE_MASK; $self->{'internalFileAttributes'} |= ( $flag ? IFA_TEXT_FILE: IFA_BINARY_FILE ); } return $bit == IFA_TEXT_FILE; } sub isBinaryFile # Archive::Zip::Member { my $self = shift; my $bit = $self->internalFileAttributes() & IFA_TEXT_FILE_MASK; if (@_) { my $flag = shift; $self->{'internalFileAttributes'} &= ~IFA_TEXT_FILE_MASK; $self->{'internalFileAttributes'} |= ( $flag ? IFA_BINARY_FILE: IFA_TEXT_FILE ); } return $bit == IFA_BINARY_FILE; } sub extractToFileNamed # Archive::Zip::Member { my $self = shift; my $name = shift; # local FS name return _error("encryption unsupported") if $self->isEncrypted(); mkpath( dirname($name) ); # croaks on error my ( $status, $fh ) = _newFileHandle( $name, 'w' ); return _ioError("Can't open file $name for write") unless $status; my $retval = $self->extractToFileHandle($fh); $fh->close(); utime( $self->lastModTime(), $self->lastModTime(), $name ); return $retval; } sub isDirectory # Archive::Zip::Member { return 0; } sub externalFileName # Archive::Zip::Member { return undef; } # The following are used when copying data sub _writeOffset # Archive::Zip::Member { shift->{'writeOffset'}; } sub _readOffset # Archive::Zip::Member { shift->{'readOffset'}; } sub writeLocalHeaderRelativeOffset # Archive::Zip::Member { shift->{'writeLocalHeaderRelativeOffset'}; } sub wasWritten { shift->{'wasWritten'} } sub _dataEnded # Archive::Zip::Member { shift->{'dataEnded'}; } sub _readDataRemaining # Archive::Zip::Member { shift->{'readDataRemaining'}; } sub _inflater # Archive::Zip::Member { shift->{'inflater'}; } sub _deflater # Archive::Zip::Member { shift->{'deflater'}; } # Return the total size of my local header sub _localHeaderSize # Archive::Zip::Member { my $self = shift; return SIGNATURE_LENGTH + LOCAL_FILE_HEADER_LENGTH + length( $self->fileName() ) + length( $self->localExtraField() ); } # Return the total size of my CD header sub _centralDirectoryHeaderSize # Archive::Zip::Member { my $self = shift; return SIGNATURE_LENGTH + CENTRAL_DIRECTORY_FILE_HEADER_LENGTH + length( $self->fileName() ) + length( $self->cdExtraField() ) + length( $self->fileComment() ); } # convert a unix time to DOS date/time # NOT AN OBJECT METHOD! sub _unixToDosTime # Archive::Zip::Member { my $time_t = shift; my ( $sec, $min, $hour, $mday, $mon, $year ) = localtime($time_t); my $dt = 0; $dt += ( $sec >> 1 ); $dt += ( $min << 5 ); $dt += ( $hour << 11 ); $dt += ( $mday << 16 ); $dt += ( ( $mon + 1 ) << 21 ); $dt += ( ( $year - 80 ) << 25 ); return $dt; } # Write my local header to a file handle. # Stores the offset to the start of the header in my # writeLocalHeaderRelativeOffset member. # Returns AZ_OK on success. sub _writeLocalFileHeader # Archive::Zip::Member { my $self = shift; my $fh = shift; my $signatureData = pack( SIGNATURE_FORMAT, LOCAL_FILE_HEADER_SIGNATURE ); $fh->print($signatureData) or return _ioError("writing local header signature"); my $header = pack( LOCAL_FILE_HEADER_FORMAT, $self->versionNeededToExtract(), $self->bitFlag(), $self->desiredCompressionMethod(), $self->lastModFileDateTime(), $self->crc32(), $self->compressedSize(), # may need to be re-written later $self->uncompressedSize(), length( $self->fileName() ), length( $self->localExtraField() ) ); $fh->print($header) or return _ioError("writing local header"); if ( $self->fileName() ) { $fh->print( $self->fileName() ) or return _ioError("writing local header filename"); } if ( $self->localExtraField() ) { $fh->print( $self->localExtraField() ) or return _ioError("writing local extra field"); } return AZ_OK; } sub _writeCentralDirectoryFileHeader # Archive::Zip::Member { my $self = shift; my $fh = shift; my $sigData = pack( SIGNATURE_FORMAT, CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE ); $fh->print($sigData) or return _ioError("writing central directory header signature"); my $fileNameLength = length( $self->fileName() ); my $extraFieldLength = length( $self->cdExtraField() ); my $fileCommentLength = length( $self->fileComment() ); my $header = pack( CENTRAL_DIRECTORY_FILE_HEADER_FORMAT, $self->versionMadeBy(), $self->fileAttributeFormat(), $self->versionNeededToExtract(), $self->bitFlag(), $self->desiredCompressionMethod(), $self->lastModFileDateTime(), $self->crc32(), # these three fields should have been updated $self->_writeOffset(), # by writing the data stream out $self->uncompressedSize(), # $fileNameLength, $extraFieldLength, $fileCommentLength, 0, # {'diskNumberStart'}, $self->internalFileAttributes(), $self->externalFileAttributes(), $self->writeLocalHeaderRelativeOffset() ); $fh->print($header) or return _ioError("writing central directory header"); if ($fileNameLength) { $fh->print( $self->fileName() ) or return _ioError("writing central directory header signature"); } if ($extraFieldLength) { $fh->print( $self->cdExtraField() ) or return _ioError("writing central directory extra field"); } if ($fileCommentLength) { $fh->print( $self->fileComment() ) or return _ioError("writing central directory file comment"); } return AZ_OK; } # This writes a data descriptor to the given file handle. # Assumes that crc32, writeOffset, and uncompressedSize are # set correctly (they should be after a write). # Further, the local file header should have the # GPBF_HAS_DATA_DESCRIPTOR_MASK bit set. sub _writeDataDescriptor # Archive::Zip::Member { my $self = shift; my $fh = shift; my $header = pack( DATA_DESCRIPTOR_FORMAT, $self->crc32(), $self->_writeOffset(), # compressed size $self->uncompressedSize() ); $fh->print($header) or return _ioError("writing data descriptor"); return AZ_OK; } # Re-writes the local file header with new crc32 and compressedSize fields. # To be called after writing the data stream. # Assumes that filename and extraField sizes didn't change since last written. sub _refreshLocalFileHeader # Archive::Zip::Member { my $self = shift; my $fh = shift; my $here = $fh->tell(); $fh->seek( $self->writeLocalHeaderRelativeOffset() + SIGNATURE_LENGTH, IO::Seekable::SEEK_SET ) or return _ioError("seeking to rewrite local header"); my $header = pack( LOCAL_FILE_HEADER_FORMAT, $self->versionNeededToExtract(), $self->bitFlag(), $self->desiredCompressionMethod(), $self->lastModFileDateTime(), $self->crc32(), $self->_writeOffset(), # compressed size $self->uncompressedSize(), length( $self->fileName() ), length( $self->localExtraField() ) ); $fh->print($header) or return _ioError("re-writing local header"); $fh->seek( $here, IO::Seekable::SEEK_SET ) or return _ioError("seeking after rewrite of local header"); return AZ_OK; } sub readChunk # Archive::Zip::Member { my ( $self, $chunkSize ) = @_; if ( $self->readIsDone() ) { $self->endRead(); my $dummy = ''; return ( \$dummy, AZ_STREAM_END ); } $chunkSize = $Archive::Zip::ChunkSize if not defined($chunkSize); $chunkSize = $self->_readDataRemaining() if $chunkSize > $self->_readDataRemaining(); my $buffer = ''; my $outputRef; my ( $bytesRead, $status ) = $self->_readRawChunk( \$buffer, $chunkSize ); return ( \$buffer, $status ) unless $status == AZ_OK; $self->{'readDataRemaining'} -= $bytesRead; $self->{'readOffset'} += $bytesRead; if ( $self->compressionMethod() == COMPRESSION_STORED ) { $self->{'crc32'} = $self->computeCRC32( $buffer, $self->{'crc32'} ); } ( $outputRef, $status ) = &{ $self->{'chunkHandler'} } ( $self, \$buffer ); $self->{'writeOffset'} += length($$outputRef); $self->endRead() if $self->readIsDone(); return ( $outputRef, $status ); } # Read the next raw chunk of my data. Subclasses MUST implement. # my ( $bytesRead, $status) = $self->_readRawChunk( \$buffer, $chunkSize ); sub _readRawChunk # Archive::Zip::Member { my $self = shift; return $self->_subclassResponsibility(); } # A place holder to catch rewindData errors if someone ignores # the error code. sub _noChunk # Archive::Zip::Member { my $self = shift; return ( \undef, _error("trying to copy chunk when init failed") ); } # Basically a no-op so that I can have a consistent interface. # ( $outputRef, $status) = $self->_copyChunk( \$buffer ); sub _copyChunk # Archive::Zip::Member { my ( $self, $dataRef ) = @_; return ( $dataRef, AZ_OK ); } # ( $outputRef, $status) = $self->_deflateChunk( \$buffer ); sub _deflateChunk # Archive::Zip::Member { my ( $self, $buffer ) = @_; my ( $out, $status ) = $self->_deflater()->deflate($buffer); if ( $self->_readDataRemaining() == 0 ) { my $extraOutput; ( $extraOutput, $status ) = $self->_deflater()->flush(); $out .= $extraOutput; $self->endRead(); return ( \$out, AZ_STREAM_END ); } elsif ( $status == Z_OK ) { return ( \$out, AZ_OK ); } else { $self->endRead(); my $retval = _error( 'deflate error', $status ); my $dummy = ''; return ( \$dummy, $retval ); } } # ( $outputRef, $status) = $self->_inflateChunk( \$buffer ); sub _inflateChunk # Archive::Zip::Member { my ( $self, $buffer ) = @_; my ( $out, $status ) = $self->_inflater()->inflate($buffer); my $retval; $self->endRead() unless $status == Z_OK; if ( $status == Z_OK || $status == Z_STREAM_END ) { $retval = ( $status == Z_STREAM_END ) ? AZ_STREAM_END: AZ_OK; return ( \$out, $retval ); } else { $retval = _error( 'inflate error', $status ); my $dummy = ''; return ( \$dummy, $retval ); } } sub rewindData # Archive::Zip::Member { my $self = shift; my $status; # set to trap init errors $self->{'chunkHandler'} = $self->can('_noChunk'); # Work around WinZip bug with 0-length DEFLATED files $self->desiredCompressionMethod(COMPRESSION_STORED) if $self->uncompressedSize() == 0; # assume that we're going to read the whole file, and compute the CRC anew. $self->{'crc32'} = 0 if ( $self->compressionMethod() == COMPRESSION_STORED ); # These are the only combinations of methods we deal with right now. if ( $self->compressionMethod() == COMPRESSION_STORED and $self->desiredCompressionMethod() == COMPRESSION_DEFLATED ) { ( $self->{'deflater'}, $status ) = Compress::Zlib::deflateInit( '-Level' => $self->desiredCompressionLevel(), '-WindowBits' => -MAX_WBITS(), # necessary magic # '-Bufsize' => $Archive::Zip::ChunkSize, @_ ); # pass additional options return _error( 'deflateInit error:', $status ) unless $status == Z_OK; $self->{'chunkHandler'} = $self->can('_deflateChunk'); } elsif ( $self->compressionMethod() == COMPRESSION_DEFLATED and $self->desiredCompressionMethod() == COMPRESSION_STORED ) { ( $self->{'inflater'}, $status ) = Compress::Zlib::inflateInit( '-WindowBits' => -MAX_WBITS(), # necessary magic # '-Bufsize' => $Archive::Zip::ChunkSize, @_ ); # pass additional options return _error( 'inflateInit error:', $status ) unless $status == Z_OK; $self->{'chunkHandler'} = $self->can('_inflateChunk'); } elsif ( $self->compressionMethod() == $self->desiredCompressionMethod() ) { $self->{'chunkHandler'} = $self->can('_copyChunk'); } else { return _error( sprintf( "Unsupported compression combination: read %d, write %d", $self->compressionMethod(), $self->desiredCompressionMethod() ) ); } $self->{'readDataRemaining'} = ( $self->compressionMethod() == COMPRESSION_STORED ) ? $self->uncompressedSize() : $self->compressedSize(); $self->{'dataEnded'} = 0; $self->{'readOffset'} = 0; return AZ_OK; } sub endRead # Archive::Zip::Member { my $self = shift; delete $self->{'inflater'}; delete $self->{'deflater'}; $self->{'dataEnded'} = 1; $self->{'readDataRemaining'} = 0; return AZ_OK; } sub readIsDone # Archive::Zip::Member { my $self = shift; return ( $self->_dataEnded() or !$self->_readDataRemaining() ); } sub contents # Archive::Zip::Member { my $self = shift; my $newContents = shift; if ( defined($newContents) ) { $self->_become(STRINGMEMBERCLASS); return $self->contents($newContents); } else { my $oldCompression = $self->desiredCompressionMethod(COMPRESSION_STORED); my $status = $self->rewindData(@_); if ( $status != AZ_OK ) { $self->endRead(); return $status; } my $retval = ''; while ( $status == AZ_OK ) { my $ref; ( $ref, $status ) = $self->readChunk( $self->_readDataRemaining() ); # did we get it in one chunk? if ( length($$ref) == $self->uncompressedSize() ) { $retval = $$ref; } else { $retval .= $$ref } } $self->desiredCompressionMethod($oldCompression); $self->endRead(); $status = AZ_OK if $status == AZ_STREAM_END; $retval = undef unless $status == AZ_OK; return wantarray ? ( $retval, $status ) : $retval; } } sub extractToFileHandle # Archive::Zip::Member { my $self = shift; return _error("encryption unsupported") if $self->isEncrypted(); my $fh = shift; _binmode($fh); my $oldCompression = $self->desiredCompressionMethod(COMPRESSION_STORED); my $status = $self->rewindData(@_); $status = $self->_writeData($fh) if $status == AZ_OK; $self->desiredCompressionMethod($oldCompression); $self->endRead(); return $status; } # write local header and data stream to file handle sub _writeToFileHandle # Archive::Zip::Member { my $self = shift; my $fh = shift; my $fhIsSeekable = shift; my $offset = shift; return _error("no member name given for $self") unless $self->fileName(); $self->{'writeLocalHeaderRelativeOffset'} = $offset; $self->{'wasWritten'} = 0; # Determine if I need to write a data descriptor # I need to do this if I can't refresh the header # and I don't know compressed size or crc32 fields. my $headerFieldsUnknown = ( ( $self->uncompressedSize() > 0 ) and ( $self->compressionMethod() == COMPRESSION_STORED or $self->desiredCompressionMethod() == COMPRESSION_DEFLATED ) ); my $shouldWriteDataDescriptor = ( $headerFieldsUnknown and not $fhIsSeekable ); $self->hasDataDescriptor(1) if ($shouldWriteDataDescriptor); $self->{'writeOffset'} = 0; my $status = $self->rewindData(); ( $status = $self->_writeLocalFileHeader($fh) ) if $status == AZ_OK; ( $status = $self->_writeData($fh) ) if $status == AZ_OK; if ( $status == AZ_OK ) { $self->{'wasWritten'} = 1; if ( $self->hasDataDescriptor() ) { $status = $self->_writeDataDescriptor($fh); } elsif ($headerFieldsUnknown) { $status = $self->_refreshLocalFileHeader($fh); } } return $status; } # Copy my (possibly compressed) data to given file handle. # Returns C on success sub _writeData # Archive::Zip::Member { my $self = shift; my $writeFh = shift; return AZ_OK if ( $self->uncompressedSize() == 0 ); my $status; my $chunkSize = $Archive::Zip::ChunkSize; while ( $self->_readDataRemaining() > 0 ) { my $outRef; ( $outRef, $status ) = $self->readChunk($chunkSize); return $status if ( $status != AZ_OK and $status != AZ_STREAM_END ); if ( length($$outRef) > 0 ) { $writeFh->print($$outRef) or return _ioError("write error during copy"); } last if $status == AZ_STREAM_END; } $self->{'compressedSize'} = $self->_writeOffset(); return AZ_OK; } # Return true if I depend on the named file sub _usesFileNamed { return 0; } # ---------------------------------------------------------------------- # class Archive::Zip::DirectoryMember # ---------------------------------------------------------------------- package Archive::Zip::DirectoryMember; use File::Path; use vars qw( @ISA ); @ISA = qw ( Archive::Zip::Member ); BEGIN { use Archive::Zip qw( :ERROR_CODES :UTILITY_METHODS ) } sub _newNamed # Archive::Zip::DirectoryMember { my $class = shift; my $fileName = shift; # FS name my $newName = shift; # Zip name $newName = _asZipDirName($fileName) unless $newName; my $self = $class->new(@_); $self->{'externalFileName'} = $fileName; $self->fileName($newName); if ( -e $fileName ) { if ( -d _ ) { my @stat = stat(_); $self->unixFileAttributes( $stat[2] ); $self->setLastModFileDateTimeFromUnix( $stat[9] ); } else # hmm.. trying to add a non-directory? { _error( $fileName, ' exists but is not a directory' ); return undef; } } else { $self->unixFileAttributes( $self->DEFAULT_DIRECTORY_PERMISSIONS ); $self->setLastModFileDateTimeFromUnix( time() ); } return $self; } sub externalFileName # Archive::Zip::DirectoryMember { shift->{'externalFileName'}; } sub isDirectory # Archive::Zip::DirectoryMember { return 1; } sub extractToFileNamed # Archive::Zip::DirectoryMember { my $self = shift; my $name = shift; # local FS name my $attribs = $self->unixFileAttributes() & 07777; mkpath( $name, 0, $attribs ); # croaks on error utime( $self->lastModTime(), $self->lastModTime(), $name ); return AZ_OK; } sub fileName # Archive::Zip::DirectoryMember { my $self = shift; my $newName = shift; $newName =~ s{/?$}{/} if defined($newName); return $self->SUPER::fileName($newName); } # So people don't get too confused. This way it looks like the problem # is in their code... sub contents { undef; } # ---------------------------------------------------------------------- # class Archive::Zip::FileMember # Base class for classes that have file handles # to external files # ---------------------------------------------------------------------- package Archive::Zip::FileMember; use vars qw( @ISA ); @ISA = qw ( Archive::Zip::Member ); BEGIN { use Archive::Zip qw( :UTILITY_METHODS ) } sub externalFileName # Archive::Zip::FileMember { shift->{'externalFileName'}; } # Return true if I depend on the named file sub _usesFileNamed # Archive::Zip::FileMember { my $self = shift; my $fileName = shift; my $xfn = $self->externalFileName(); return undef if ref($xfn); return $xfn eq $fileName; } sub fh # Archive::Zip::FileMember { my $self = shift; $self->_openFile() if !defined( $self->{'fh'} ) || !$self->{'fh'}->opened(); return $self->{'fh'}; } # opens my file handle from my file name sub _openFile # Archive::Zip::FileMember { my $self = shift; my ( $status, $fh ) = _newFileHandle( $self->externalFileName(), 'r' ); if ( !$status ) { _ioError( "Can't open", $self->externalFileName() ); return undef; } $self->{'fh'} = $fh; _binmode($fh); return $fh; } # Closes my file handle sub _closeFile # Archive::Zip::FileMember { my $self = shift; my $fh = $self->{'fh'}; $self->{'fh'} = undef; } # Make sure I close my file handle sub endRead # Archive::Zip::FileMember { my $self = shift; $self->_closeFile(); return $self->SUPER::endRead(@_); } sub _become # Archive::Zip::FileMember { my $self = shift; my $newClass = shift; return $self if ref($self) eq $newClass; delete( $self->{'externalFileName'} ); delete( $self->{'fh'} ); return $self->SUPER::_become($newClass); } # ---------------------------------------------------------------------- # class Archive::Zip::NewFileMember # Used when adding a pre-existing file to an archive # ---------------------------------------------------------------------- package Archive::Zip::NewFileMember; use vars qw( @ISA ); @ISA = qw ( Archive::Zip::FileMember ); BEGIN { use Archive::Zip qw( :CONSTANTS :ERROR_CODES :UTILITY_METHODS ) } # Given a file name, set up for eventual writing. sub _newFromFileNamed # Archive::Zip::NewFileMember { my $class = shift; my $fileName = shift; # local FS format my $newName = shift; $newName = _asZipDirName($fileName) unless defined($newName); return undef unless ( stat($fileName) && -r _ && !-d _ ); my $self = $class->new(@_); $self->fileName($newName); $self->{'externalFileName'} = $fileName; $self->{'compressionMethod'} = COMPRESSION_STORED; my @stat = stat(_); $self->{'compressedSize'} = $self->{'uncompressedSize'} = $stat[7]; $self->desiredCompressionMethod( ( $self->compressedSize() > 0 ) ? COMPRESSION_DEFLATED : COMPRESSION_STORED ); $self->unixFileAttributes( $stat[2] ); $self->setLastModFileDateTimeFromUnix( $stat[9] ); $self->isTextFile( -T _ ); return $self; } sub rewindData # Archive::Zip::NewFileMember { my $self = shift; my $status = $self->SUPER::rewindData(@_); return $status unless $status == AZ_OK; return AZ_IO_ERROR unless $self->fh(); $self->fh()->clearerr(); $self->fh()->seek( 0, IO::Seekable::SEEK_SET ) or return _ioError( "rewinding", $self->externalFileName() ); return AZ_OK; } # Return bytes read. Note that first parameter is a ref to a buffer. # my $data; # my ( $bytesRead, $status) = $self->readRawChunk( \$data, $chunkSize ); sub _readRawChunk # Archive::Zip::NewFileMember { my ( $self, $dataRef, $chunkSize ) = @_; return ( 0, AZ_OK ) unless $chunkSize; my $bytesRead = $self->fh()->read( $$dataRef, $chunkSize ) or return ( 0, _ioError("reading data") ); return ( $bytesRead, AZ_OK ); } # If I already exist, extraction is a no-op. sub extractToFileNamed # Archive::Zip::NewFileMember { my $self = shift; my $name = shift; # local FS name if ( File::Spec->rel2abs($name) eq File::Spec->rel2abs( $self->externalFileName() ) and -r $name ) { return AZ_OK; } else { return $self->SUPER::extractToFileNamed( $name, @_ ); } } # ---------------------------------------------------------------------- # class Archive::Zip::ZipFileMember # This represents a member in an existing zip file on disk. # ---------------------------------------------------------------------- package Archive::Zip::ZipFileMember; use vars qw( @ISA ); @ISA = qw ( Archive::Zip::FileMember ); BEGIN { use Archive::Zip qw( :CONSTANTS :ERROR_CODES :PKZIP_CONSTANTS :UTILITY_METHODS ); } # Create a new Archive::Zip::ZipFileMember # given a filename and optional open file handle # sub _newFromZipFile # Archive::Zip::ZipFileMember { my $class = shift; my $fh = shift; my $externalFileName = shift; my $possibleEocdOffset = shift; # normally 0 my $self = $class->new( 'crc32' => 0, 'diskNumberStart' => 0, 'localHeaderRelativeOffset' => 0, 'dataOffset' => 0, # localHeaderRelativeOffset + header length @_ ); $self->{'externalFileName'} = $externalFileName; $self->{'fh'} = $fh; $self->{'possibleEocdOffset'} = $possibleEocdOffset; return $self; } sub isDirectory # Archive::Zip::ZipFileMember { my $self = shift; return ( substr( $self->fileName(), -1, 1 ) eq '/' and $self->uncompressedSize() == 0 ); } # Seek to the beginning of the local header, just past the signature. # Verify that the local header signature is in fact correct. # Update the localHeaderRelativeOffset if necessary by adding the possibleEocdOffset. # Returns status. sub _seekToLocalHeader # Archive::Zip::ZipFileMember { my $self = shift; my $where = shift; $where = $self->localHeaderRelativeOffset() unless defined($where); my $status; my $signature; $status = $self->fh()->seek( $where, IO::Seekable::SEEK_SET ); return _ioError("seeking to local header") unless $status; ( $status, $signature ) = _readSignature( $self->fh(), $self->externalFileName(), LOCAL_FILE_HEADER_SIGNATURE ); return $status if $status == AZ_IO_ERROR; # retry with EOCD offset if any was given. if ( $status == AZ_FORMAT_ERROR && $self->{'possibleEocdOffset'} ) { $status = $self->_seekToLocalHeader( $self->localHeaderRelativeOffset() + $self->{'possibleEocdOffset'} ); if ( $status == AZ_OK ) { $self->{'localHeaderRelativeOffset'} += $self->{'possibleEocdOffset'}; $self->{'possibleEocdOffset'} = 0; } } return $status; } # Because I'm going to delete the file handle, read the local file # header if the file handle is seekable. If it isn't, I assume that # I've already read the local header. # Return ( $status, $self ) sub _become # Archive::Zip::ZipFileMember { my $self = shift; my $newClass = shift; return $self if ref($self) eq $newClass; my $status = AZ_OK; if ( _isSeekable( $self->fh() ) ) { my $here = $self->fh()->tell(); $status = $self->_seekToLocalHeader(); $status = $self->_readLocalFileHeader() if $status == AZ_OK; $self->fh()->seek( $here, IO::Seekable::SEEK_SET ); return $status unless $status == AZ_OK; } delete( $self->{'diskNumberStart'} ); delete( $self->{'localHeaderRelativeOffset'} ); delete( $self->{'dataOffset'} ); return $self->SUPER::_become($newClass); } sub diskNumberStart # Archive::Zip::ZipFileMember { shift->{'diskNumberStart'}; } sub localHeaderRelativeOffset # Archive::Zip::ZipFileMember { shift->{'localHeaderRelativeOffset'}; } sub dataOffset # Archive::Zip::ZipFileMember { shift->{'dataOffset'}; } # Skip local file header, updating only extra field stuff. # Assumes that fh is positioned before signature. sub _skipLocalFileHeader # Archive::Zip::ZipFileMember { my $self = shift; my $header; my $bytesRead = $self->fh()->read( $header, LOCAL_FILE_HEADER_LENGTH ); if ( $bytesRead != LOCAL_FILE_HEADER_LENGTH ) { return _ioError("reading local file header"); } my $fileNameLength; my $extraFieldLength; ( undef, # $self->{'versionNeededToExtract'}, undef, # $self->{'bitFlag'}, undef, # $self->{'compressionMethod'}, undef, # $self->{'lastModFileDateTime'}, undef, # $crc32, undef, # $compressedSize, undef, # $uncompressedSize, $fileNameLength, $extraFieldLength ) = unpack( LOCAL_FILE_HEADER_FORMAT, $header ); if ($fileNameLength) { $self->fh()->seek( $fileNameLength, IO::Seekable::SEEK_CUR ) or return _ioError("skipping local file name"); } if ($extraFieldLength) { $bytesRead = $self->fh()->read( $self->{'localExtraField'}, $extraFieldLength ); if ( $bytesRead != $extraFieldLength ) { return _ioError("reading local extra field"); } } $self->{'dataOffset'} = $self->fh()->tell(); return AZ_OK; } # Read from a local file header into myself. Returns AZ_OK if successful. # Assumes that fh is positioned after signature. # Note that crc32, compressedSize, and uncompressedSize will be 0 if # GPBF_HAS_DATA_DESCRIPTOR_MASK is set in the bitFlag. sub _readLocalFileHeader # Archive::Zip::ZipFileMember { my $self = shift; my $header; my $bytesRead = $self->fh()->read( $header, LOCAL_FILE_HEADER_LENGTH ); if ( $bytesRead != LOCAL_FILE_HEADER_LENGTH ) { return _ioError("reading local file header"); } my $fileNameLength; my $crc32; my $compressedSize; my $uncompressedSize; my $extraFieldLength; ( $self->{'versionNeededToExtract'}, $self->{'bitFlag'}, $self->{'compressionMethod'}, $self->{'lastModFileDateTime'}, $crc32, $compressedSize, $uncompressedSize, $fileNameLength, $extraFieldLength ) = unpack( LOCAL_FILE_HEADER_FORMAT, $header ); if ($fileNameLength) { my $fileName; $bytesRead = $self->fh()->read( $fileName, $fileNameLength ); if ( $bytesRead != $fileNameLength ) { return _ioError("reading local file name"); } $self->fileName($fileName); } if ($extraFieldLength) { $bytesRead = $self->fh()->read( $self->{'localExtraField'}, $extraFieldLength ); if ( $bytesRead != $extraFieldLength ) { return _ioError("reading local extra field"); } } $self->{'dataOffset'} = $self->fh()->tell(); # Don't trash these fields from the CD if we already have them. if ( not $self->hasDataDescriptor() ) { $self->{'crc32'} = $crc32; $self->{'compressedSize'} = $compressedSize; $self->{'uncompressedSize'} = $uncompressedSize; } # We ignore data descriptors (we don't read them, # and we compute elsewhere whether we need to write them ). # And, we have the necessary data from the CD header. # So mark this entry as not having a data descriptor. $self->hasDataDescriptor(0); return AZ_OK; } # This will read the data descriptor, which is at the end of files that have # GPBF_HAS_DATA_DESCRIPTOR_MASK set in their bitFlag. # Note that you have to seek to the end of the compressed file to find this to # read. # sub _readDataDescriptor # { # my $self = shift; # my $header; # $self->fh()->read( $header, DATA_DESCRIPTOR_LENGTH ) # or return _ioError( "reading data descriptor" ); # ( # $self->{'crc32'}, # $self->{'compressedSize'}, # $self->{'uncompressedSize'} # ) = unpack( DATA_DESCRIPTOR_FORMAT, $header ); # return AZ_OK; # } # Read a Central Directory header. Return AZ_OK on success. # Assumes that fh is positioned right after the signature. sub _readCentralDirectoryFileHeader # Archive::Zip::ZipFileMember { my $self = shift; my $fh = $self->fh(); my $header = ''; my $bytesRead = $fh->read( $header, CENTRAL_DIRECTORY_FILE_HEADER_LENGTH ); if ( $bytesRead != CENTRAL_DIRECTORY_FILE_HEADER_LENGTH ) { return _ioError("reading central dir header"); } my ( $fileNameLength, $extraFieldLength, $fileCommentLength ); ( $self->{'versionMadeBy'}, $self->{'fileAttributeFormat'}, $self->{'versionNeededToExtract'}, $self->{'bitFlag'}, $self->{'compressionMethod'}, $self->{'lastModFileDateTime'}, $self->{'crc32'}, $self->{'compressedSize'}, $self->{'uncompressedSize'}, $fileNameLength, $extraFieldLength, $fileCommentLength, $self->{'diskNumberStart'}, $self->{'internalFileAttributes'}, $self->{'externalFileAttributes'}, $self->{'localHeaderRelativeOffset'} ) = unpack( CENTRAL_DIRECTORY_FILE_HEADER_FORMAT, $header ); if ($fileNameLength) { $bytesRead = $fh->read( $self->{'fileName'}, $fileNameLength ); if ( $bytesRead != $fileNameLength ) { _ioError("reading central dir filename"); } } if ($extraFieldLength) { $bytesRead = $fh->read( $self->{'cdExtraField'}, $extraFieldLength ); if ( $bytesRead != $extraFieldLength ) { return _ioError("reading central dir extra field"); } } if ($fileCommentLength) { $bytesRead = $fh->read( $self->{'fileComment'}, $fileCommentLength ); if ( $bytesRead != $fileCommentLength ) { return _ioError("reading central dir file comment"); } } $self->desiredCompressionMethod( $self->compressionMethod() ); return AZ_OK; } sub rewindData # Archive::Zip::ZipFileMember { my $self = shift; my $status = $self->SUPER::rewindData(@_); return $status unless $status == AZ_OK; return AZ_IO_ERROR unless $self->fh(); $self->fh()->clearerr(); # Seek to local file header. # The only reason that I'm doing this this way is that the extraField # length seems to be different between the CD header and the LF header. $status = $self->_seekToLocalHeader(); return $status unless $status == AZ_OK; # skip local file header $status = $self->_skipLocalFileHeader(); return $status unless $status == AZ_OK; # Seek to beginning of file data $self->fh()->seek( $self->dataOffset(), IO::Seekable::SEEK_SET ) or return _ioError("seeking to beginning of file data"); return AZ_OK; } # Return bytes read. Note that first parameter is a ref to a buffer. # my $data; # my ( $bytesRead, $status) = $self->readRawChunk( \$data, $chunkSize ); sub _readRawChunk # Archive::Zip::ZipFileMember { my ( $self, $dataRef, $chunkSize ) = @_; return ( 0, AZ_OK ) unless $chunkSize; my $bytesRead = $self->fh()->read( $$dataRef, $chunkSize ) or return ( 0, _ioError("reading data") ); return ( $bytesRead, AZ_OK ); } # ---------------------------------------------------------------------- # class Archive::Zip::StringMember ( concrete ) # A Zip member whose data lives in a string # ---------------------------------------------------------------------- package Archive::Zip::StringMember; use vars qw( @ISA ); @ISA = qw ( Archive::Zip::Member ); BEGIN { use Archive::Zip qw( :CONSTANTS :ERROR_CODES ) } # Create a new string member. Default is COMPRESSION_STORED. # Can take a ref to a string as well. sub _newFromString # Archive::Zip::StringMember { my $class = shift; my $string = shift; my $name = shift; my $self = $class->new(@_); $self->contents($string); $self->fileName($name) if defined($name); # Set the file date to now $self->setLastModFileDateTimeFromUnix( time() ); $self->unixFileAttributes( $self->DEFAULT_FILE_PERMISSIONS ); return $self; } sub _become # Archive::Zip::StringMember { my $self = shift; my $newClass = shift; return $self if ref($self) eq $newClass; delete( $self->{'contents'} ); return $self->SUPER::_become($newClass); } # Get or set my contents. Note that we do not call the superclass # version of this, because it calls us. sub contents # Archive::Zip::StringMember { my $self = shift; my $string = shift; if ( defined($string) ) { $self->{'contents'} = ( ref($string) eq 'SCALAR' ) ? $$string : $string; $self->{'uncompressedSize'} = $self->{'compressedSize'} = length( $self->{'contents'} ); $self->{'compressionMethod'} = COMPRESSION_STORED; } return $self->{'contents'}; } # Return bytes read. Note that first parameter is a ref to a buffer. # my $data; # my ( $bytesRead, $status) = $self->readRawChunk( \$data, $chunkSize ); sub _readRawChunk # Archive::Zip::StringMember { my ( $self, $dataRef, $chunkSize ) = @_; $$dataRef = substr( $self->contents(), $self->_readOffset(), $chunkSize ); return ( length($$dataRef), AZ_OK ); } 1; __END__ # vim: ts=4 sw=4 tw=80 wrap FILEf8d86998/PAR.pm'#line 1 "/usr/lib/perl5/site_perl/5.8.0/PAR.pm" # $File: //member/autrijus/PAR/lib/PAR.pm $ $Author: autrijus $ # $Revision: #59 $ $Change: 9768 $ $DateTime: 2004/01/26 05:21:34 $ vim: expandtab shiftwidth=4 package PAR; $PAR::VERSION = '0.79'; use 5.006; use strict; use warnings; use Config '%Config'; #line 158 use vars qw(@PAR_INC); # explicitly stated PAR library files use vars qw(%PAR_INC); # sets {$par}{$file} for require'd modules use vars qw(@LibCache %LibCache); # I really miss pseudohash. use vars qw($LastAccessedPAR $LastTempFile); my $ver = $Config{version}; my $arch = $Config{archname}; my ($par_temp, $progname); my $preemptive_extraction_mode = 1; sub import { my $class = shift; _set_progname(); _set_par_temp(); foreach my $par (@_) { if ($par =~ /[?*{}\[\]]/) { require File::Glob; foreach my $matched (File::Glob::glob($par)) { push @PAR_INC, unpar($matched, undef, undef, 1); } next; } push @PAR_INC, unpar($par, undef, undef, 1); } return if $PAR::__import; local $PAR::__import = 1; unshift @INC, \&find_par unless $preemptive_extraction_mode || grep { $_ eq \&find_par } @INC; require PAR::Heavy; PAR::Heavy::_init_dynaloader(); if (unpar($0)) { # XXX - handle META.yml here! push @PAR_INC, unpar($0, undef, undef, 1); my $zip = $LibCache{$0}; if ( $preemptive_extraction_mode ) { my $preemptive_lib_dir = $par_temp; $zip->extractTree( "", "$preemptive_lib_dir/" ); unshift @INC, map File::Spec->catdir( $preemptive_lib_dir, @$_ ), [ "lib" ], [ "arch" ], [ $arch ], [ $ver ], [ $ver, $arch ], []; } my $member = $zip->memberNamed("script/main.pl") || $zip->memberNamed("main.pl"); # finally take $ARGV[0] as the hint for file to run if (defined $ARGV[0] and !$member) { $member = $zip->memberNamed("script/$ARGV[0]") || $zip->memberNamed("script/$ARGV[0].pl") || $zip->memberNamed("$ARGV[0]") || $zip->memberNamed("$ARGV[0].pl") or die qq(Can't open perl script "$ARGV[0]": No such file or directory); shift @ARGV; } elsif (!$member) { die "Usage: $0 script_file_name.\n"; } _run_member($member); } } sub _run_member { my $member = shift; my $clear_stack = shift; my ($fh, $is_new) = _tempfile($member->crc32String . ".pl"); if ($is_new) { my $file = $member->fileName; print $fh "package main; shift \@INC;\n"; if (defined &Internals::PAR::CLEARSTACK and $clear_stack) { print $fh "Internals::PAR::CLEARSTACK();\n"; } print $fh "#line 1 \"$file\"\n"; $member->extractToFileHandle($fh); seek ($fh, 0, 0); } unshift @INC, sub { $fh }; { do 'main'; die $@ if $@; exit } } sub find_par { my ($self, $file, $member_only) = @_; my $scheme; foreach (@PAR_INC ? @PAR_INC : @INC) { my $path = $_; if ($[ < 5.008001) { # reassemble from "perl -Ischeme://path" autosplitting $path = "$scheme:$path" if !@PAR_INC and $path and $path =~ m!//! and $scheme and $scheme =~ /^\w+$/; $scheme = $path; } my $rv = unpar($path, $file, $member_only, 1) or next; $PAR_INC{$path}{$file} = 1; $INC{$file} = $LastTempFile if (lc($file) =~ /^(?!tk).*\.pm$/); return $rv; } return; } sub reload_libs { my @par_files = @_; @par_files = sort keys %LibCache unless @par_files; foreach my $par (@par_files) { my $inc_ref = $PAR_INC{$par} or next; delete $LibCache{$par}; foreach my $file (sort keys %$inc_ref) { delete $INC{$file}; require $file; } } } sub read_file { my $file = pop; foreach my $zip (@LibCache) { my $member = $zip->memberNamed($file) or next; return scalar $member->contents; } return; } sub par_handle { my $par = pop; return $LibCache{$par}; } my %escapes; sub unpar { my ($par, $file, $member_only, $allow_other_ext) = @_; my $zip = $LibCache{$par}; my @rv = $par; return if $PAR::__unpar; local $PAR::__unpar = 1; unless ($zip) { if ($par =~ m!^\w+://!) { require File::Spec; require LWP::Simple; # reflector support $par .= "pm=$file" if $par =~ /[?&;]/; $ENV{PAR_CACHE} ||= '_par'; mkdir $ENV{PAR_CACHE}, 0777; if (!-d $ENV{PAR_CACHE}) { $ENV{PAR_CACHE} = File::Spec->catdir(File::Spec->tmpdir, 'par'); mkdir $ENV{PAR_CACHE}, 0777; return unless -d $ENV{PAR_CACHE}; } my $file = $par; if (!%escapes) { $escapes{chr($_)} = sprintf("%%%02X", $_) for 0..255; } { use bytes; $file =~ s/([^\w\.])/$escapes{$1}/g; } $file = File::Spec->catfile( $ENV{PAR_CACHE}, $file); LWP::Simple::mirror( $par, $file ); return unless -e $file; $par = $file; } elsif (ref($par) eq 'SCALAR') { my ($fh) = _tempfile(); print $fh $$par; $par = $fh; } elsif (!(($allow_other_ext or $par =~ /\.par\z/i) and -f $par)) { $par .= ".par"; return unless -f $par; } require Archive::Zip; $zip = Archive::Zip->new; my $method = (ref($par) ? 'readFromFileHandle' : 'read'); Archive::Zip::setErrorHandler(sub {}); my $rv = $zip->$method($par); Archive::Zip::setErrorHandler(undef); return unless $rv == Archive::Zip::AZ_OK(); push @LibCache, $zip; $LibCache{$_[0]} = $zip; foreach my $member ( $zip->members( "^par/(?:$Config{version}/)?(?:$Config{archname}/)?" ) ) { next if $member->isDirectory; my $content = $member->contents(); next unless $content =~ /^PK\003\004/; push @rv, unpar(\$content, undef, undef, 1); } } $LastAccessedPAR = $zip; return @rv unless defined $file; my $member = $zip->memberNamed("lib/$file") || $zip->memberNamed("arch/$file") || $zip->memberNamed("$arch/$file") || $zip->memberNamed("$ver/$file") || $zip->memberNamed("$ver/$arch/$file") || $zip->memberNamed($file) or return; return $member if $member_only; my ($fh, $is_new); ($fh, $is_new, $LastTempFile) = _tempfile($member->crc32String . ".pm"); die "Bad Things Happened..." unless $fh; if ($is_new) { $member->extractToFileHandle($fh); seek ($fh, 0, 0); } return $fh; } # The C version of this code appears in myldr/mktmpdir.c sub _set_par_temp { if ($ENV{PAR_TEMP} and $ENV{PAR_TEMP} =~ /(.+)/) { $par_temp = $1; return; } require File::Spec; foreach my $path ( (map $ENV{$_}, qw( TMPDIR TEMP TMP )), qw( "C:\\TEMP /tmp . ) ) { next unless $path and -d $path and -w $path; my $username = defined(&Win32::LoginName) ? &Win32::LoginName() : $ENV{USERNAME} || $ENV{USER} || 'SYSTEM'; my $stmpdir = File::Spec->catdir($path, "par-$username"); mkdir $stmpdir, 0755; if (!$ENV{PAR_CLEAN} and my $mtime = (stat($progname))[9]) { my $ctx = eval { require Digest::SHA1; Digest::SHA1->new } || eval { require Digest::MD5; Digest::MD5->new }; if ($ctx and open(my $fh, "<$progname")) { binmode($fh); $ctx->addfile($fh); close($fh); } $stmpdir = File::Spec->catdir( $stmpdir, "cache-" . ( $ctx ? $ctx->hexdigest : $mtime ) ); } else { $ENV{PAR_CLEAN} = 1; $stmpdir = File::Spec->catdir($stmpdir, "temp-$$"); } $ENV{PAR_TEMP} = $stmpdir; mkdir $stmpdir, 0755; last; } $par_temp = $1 if $ENV{PAR_TEMP} and $ENV{PAR_TEMP} =~ /(.+)/; } sub _tempfile { if ($ENV{PAR_CLEAN} or !@_) { require File::Temp; # under Win32, the file is created with O_TEMPORARY, # and will be deleted by the C runtime; having File::Temp # delete it has the only effect of giving ugly warnings my ($fh, $filename) = File::Temp::tempfile( DIR => $par_temp, UNLINK => ($^O ne 'MSWin32'), ) or die "Cannot create temporary file: $!"; binmode($fh); return ($fh, 1, $filename); } require File::Spec; my $filename = File::Spec->catfile( $par_temp, $_[0] ); if (-r $filename) { open my $fh, '<', $filename or die $!; binmode($fh); return ($fh, 0, $filename); } open my $fh, '+>', $filename or die $!; binmode($fh); return ($fh, 1, $filename); } sub _set_progname { require File::Spec; if ($ENV{PAR_PROGNAME} and $ENV{PAR_PROGNAME} =~ /(.+)/) { $progname = $1; } return if -s ($progname ||= $0); if (-s "$progname$Config{_exe}") { $ENV{PAR_PROGNAME} = $progname = "$progname$Config{_exe}"; return $progname; } foreach my $dir (split /\Q$Config{path_sep}\E/, $ENV{PATH}) { my $name = File::Spec->catfile($dir, "$progname$Config{_exe}"); if (-s $name) { $progname = $name; last } $name = File::Spec->catfile($dir, "$progname"); if (-s $name) { $progname = $name; last } } $ENV{PAR_PROGNAME} = $progname; } 1; #line 552 FILE6751940a/PAR/Dist.pm!>#line 1 "/usr/lib/perl5/site_perl/5.8.0/PAR/Dist.pm" # $File: //member/autrijus/PAR-Dist/lib/PAR/Dist.pm $ $Author: autrijus $ # $Revision: #11 $ $Change: 9530 $ $DateTime: 2004/01/01 05:24:09 $ package PAR::Dist; require Exporter; use vars qw/$VERSION @ISA @EXPORT/; $VERSION = '0.07'; @ISA = 'Exporter'; @EXPORT = qw/ blib_to_par install_par uninstall_par sign_par verify_par /; use strict; use File::Spec; #line 94 sub blib_to_par { @_ = (path => @_) if @_ == 1; my %args = @_; require Config; my $path = $args{path}; my $dist = File::Spec->rel2abs($args{dist}) if $args{dist}; my $name = $args{name}; my $version = $args{version}; my $suffix = $args{suffix} || "$Config::Config{archname}-$Config::Config{version}.par"; my $cwd; if (defined $path) { require Cwd; $cwd = Cwd::cwd(); chdir $path; } _build_blib() unless -d "blib"; my @files; open MANIFEST, ">blib/MANIFEST" or die $!; open META, ">blib/META.yml" or die $!; require File::Find; File::Find::find( sub { next unless $File::Find::name; (-r && !-d) and push ( @files, substr($File::Find::name, 5) ); } , 'blib' ); print MANIFEST join( "\n", ' ', (sort @files), q( # ) ); close MANIFEST; if (open(OLD_META, "META.yml")) { while () { if (/^distribution_type:/) { print META "distribution_type: par\n"; } else { print META $_; } if (/^name:\s+(.*)/) { $name ||= $1; $name =~ s/::/-/g; } elsif (/^version:\s+(.*)/) { $version ||= $1; } } close OLD_META; close META; } elsif ((!$name or !$version) and open(MAKEFILE, "Makefile")) { while () { if (/^DISTNAME\s+=\s+(.*)$/) { $name ||= $1; } elsif (/^VERSION\s+=\s+(.*)$/) { $version ||= $1; } } } my $file = "$name-$version-$suffix"; unlink $file if -f $file; print META << "YAML" if fileno(META); name: $name version: $version build_requires: {} conflicts: {} dist_name: $file distribution_type: par dynamic_config: 0 generated_by: 'PAR::Dist version $PAR::Dist::VERSION' license: unknown YAML close META; mkdir('blib', 0777); chdir('blib'); _zip(dist => File::Spec->catfile(File::Spec->updir, $file)) or die $!; chdir(File::Spec->updir); unlink "blib/MANIFEST"; unlink "blib/META.yml"; $dist ||= File::Spec->catfile($cwd, $file) if $cwd; if ($dist and $file ne $dist) { rename( $file => $dist ); $file = $dist; } my $pathname = File::Spec->rel2abs($file); if ($^O eq 'MSWin32') { $pathname =~ s!\\!/!g; $pathname =~ s!:!|!g; }; print << "."; Successfully created binary distribution '$file'. Its contents are accessible in compliant browsers as: jar:file://$pathname!/MANIFEST . chdir $cwd if $cwd; return $file; } sub _build_blib { if (-e 'Build') { system($^X, "Build"); } elsif (-e 'Makefile') { system($Config::Config{make}); } elsif (-e 'Build.PL') { system($^X, "Build.PL"); system($^X, "Build"); } elsif (-e 'Makefile.PL') { system($^X, "Makefile.PL"); system($Config::Config{make}); } } #line 234 sub install_par { my %args = &_args; _install_or_uninstall(%args, action => 'install'); } #line 246 sub uninstall_par { my %args = &_args; _install_or_uninstall(%args, action => 'uninstall'); } sub _install_or_uninstall { my %args = &_args; my $name = $args{name}; my $action = $args{action}; my ($dist, $tmpdir) = _unzip_to_tmpdir( dist => $args{dist}, subdir => 'blib' ); if (!$name) { open (META, 'blib/META.yml') or return; while () { next unless /^name:\s+(.*)/; $name = $1; last; } close META; } if (-d 'script') { require ExtUtils::MY; foreach my $file (glob("script/*")) { next unless -T $file; ExtUtils::MY->fixin($file); chmod(0555, $file); } } $name =~ s{::|-}{/}g; require ExtUtils::Install; my $rv; if ($action eq 'install') { $rv = ExtUtils::Install::install_default($name); } elsif ($action eq 'uninstall') { require Config; $rv = ExtUtils::Install::uninstall( "$Config::Config{installsitearch}/auto/$name/.packlist" ); } File::Path::rmtree([$tmpdir]); return $rv; } #line 300 sub sign_par { my %args = &_args; _verify_or_sign(%args, action => 'sign'); } #line 315 sub verify_par { my %args = &_args; $! = _verify_or_sign(%args, action => 'verify'); return ( $! == Module::Signature::SIGNATURE_OK() ); } sub _unzip { my %args = &_args; my $dist = $args{dist}; my $path = $args{path} || File::Spec->curdir; return unless -f $dist; if (eval { require Archive::Zip; 1 }) { my $zip = Archive::Zip->new; $SIG{__WARN__} = sub { print STDERR $_[0] unless $_[0] =~ /\bstat\b/ }; return unless $zip->read($dist) == Archive::Zip::AZ_OK() and $zip->extractTree('', "$path/") == Archive::Zip::AZ_OK(); } else { return if system(unzip => $dist, '-d', $path); } } sub _zip { my %args = &_args; my $dist = $args{dist}; if (eval { require Archive::Zip; 1 }) { my $zip = Archive::Zip->new; $zip->addTree( File::Spec->curdir, '' ); $zip->writeToFileNamed( $dist ) == Archive::Zip::AZ_OK() or die $!; } else { system(qw(zip -r), $dist, File::Spec->curdir) and die $!; } } sub _args { unshift @_, (glob('*.par'))[0] unless @_; @_ = (dist => @_) if @_ == 1; my %args = @_; $args{name} ||= $args{dist}; $args{dist} .= '-' . do { require Config; $args{suffix} || "$Config::Config{archname}-$Config::Config{version}.par" } unless !$args{dist} or $args{dist} =~ /\.[a-zA-Z_][^.]*$/; $args{dist} = _fetch(dist => $args{dist}) if ($args{dist} and $args{dist} =~ m!^\w+://!); return %args; } my %escapes; sub _fetch { my %args = @_; require LWP::Simple; $ENV{PAR_TEMP} ||= File::Spec->catdir(File::Spec->tmpdir, 'par'); mkdir $ENV{PAR_TEMP}, 0777; %escapes = map { chr($_) => sprintf("%%%02X", $_) } 0..255 unless %escapes; $args{dist} =~ s{^cpan://((([a-zA-Z])[a-zA-Z])[-_a-zA-Z]+)/} {http://www.cpan.org/modules/by-authors/id/\U$3/$2/$1\E/}; my $file = $args{dist}; $file =~ s/([^\w\.])/$escapes{$1}/g; $file = File::Spec->catfile( $ENV{PAR_TEMP}, $file); my $rc = LWP::Simple::mirror( $args{dist}, $file ); if (!LWP::Simple::is_success($rc)) { die "Error $rc: ", LWP::Simple::status_message($rc), " ($args{dist})\n"; } return $file if -e $file; return; } sub _verify_or_sign { my %args = &_args; require File::Path; require Module::Signature; die "Module::Signature version 0.25 required" unless Module::Signature->VERSION >= 0.25; require Cwd; my $cwd = Cwd::cwd(); my $action = $args{action}; my ($dist, $tmpdir) = _unzip_to_tmpdir($args{dist}); $action ||= (-e 'SIGNATURE' ? 'verify' : 'sign'); if ($action eq 'sign') { open FH, '>SIGNATURE' unless -e 'SIGNATURE'; open FH, 'MANIFEST' or die $!; local $/; my $out = ; if ($out !~ /^SIGNATURE(?:\s|$)/m) { $out =~ s/^(?!\s)/SIGNATURE\n/m; open FH, '>MANIFEST' or die $!; print FH $out; } close FH; $args{overwrite} = 1 unless exists $args{overwrite}; $args{skip} = 0 unless exists $args{skip}; } my $rv = Module::Signature->can($action)->(%args); _zip(dist => $dist) if $action eq 'sign'; File::Path::rmtree([$tmpdir]); chdir($cwd); return $rv; } sub _unzip_to_tmpdir { my %args = &_args; require File::Temp; my $dist = File::Spec->rel2abs($args{dist}); my $tmpdir = File::Temp::mkdtemp(File::Spec->catdir(File::Spec->tmpdir, "parXXXXX")) or die $!; my $path = $tmpdir; $path = File::Spec->catdir($tmpdir, $args{subdir}) if defined $args{subdir}; _unzip(dist => $dist, path => $path); chdir $tmpdir; return ($dist, $tmpdir); } 1; #line 474 FILE4206e844/PAR/Filter.pm#line 1 "/usr/lib/perl5/site_perl/5.8.0/PAR/Filter.pm" # $File: //member/autrijus/PAR/lib/PAR/Filter.pm $ $Author: autrijus $ # $Revision: #6 $ $Change: 9517 $ $DateTime: 2003/12/31 14:04:33 $ package PAR::Filter; $PAR::Filter::VERSION = '0.02'; #line 61 sub new { my $class = shift; require "PAR/Filter/$_.pm" foreach @_; bless(\@_, $class); } sub apply { my ($self, $ref, $name) = @_; my $filename = $name || '-e'; if (!ref $ref) { $name ||= $filename = $ref; local $/; open my $fh, $ref or die $!; binmode($fh); my $content = <$fh>; $ref = \$content; return $ref unless length($content); } "PAR::Filter::$_"->new->apply( $ref, $filename, $name ) foreach @$self; return $ref; } 1; #line 103 FILE5f3666f1/PAR/Filter/PodStrip.pm#line 1 "/usr/lib/perl5/site_perl/5.8.0/PAR/Filter/PodStrip.pm" # $File: //member/autrijus/PAR/lib/PAR/Filter/PodStrip.pm $ $Author: autrijus $ # $Revision: #4 $ $Change: 9517 $ $DateTime: 2003/12/31 14:04:33 $ package PAR::Filter::PodStrip; use strict; use base 'PAR::Filter'; #line 24 sub apply { my ($class, $ref, $filename, $name) = @_; no warnings 'uninitialized'; my $data = ''; $data = $1 if $$ref =~ s/((?:^__DATA__$).*)//ms; my $line = 1; if ($$ref =~ /^=(?:head\d|pod|begin|item|over|for|back|end)\b/) { $$ref = "\n$$ref"; $line--; } $$ref =~ s{( (.*?\n) =(?:head\d|pod|begin|item|over|for|back|end)\b .*?\n (?:=cut[\t ]*[\r\n]*?|\Z) (\r?\n)? )}{ my ($pre, $post) = ($2, $3); "$pre#line " . ( $line += ( () = ( $1 =~ /\n/g ) ) ) . $post; }gsex; $$ref = '#line 1 "' . ($filename) . "\"\n" . $$ref if length $filename; $$ref =~ s/^#line 1 (.*\n)(#!.*\n)/$2#line 2 $1/g; $$ref .= $data; } 1; #line 83 FILE4b0d125f/PAR/Heavy.pm)#line 1 "/usr/lib/perl5/site_perl/5.8.0/PAR/Heavy.pm" # $File: //member/autrijus/PAR/lib/PAR/Heavy.pm $ $Author: autrijus $ # $Revision: #19 $ $Change: 9627 $ $DateTime: 2004/01/07 10:58:09 $ vim: expandtab shiftwidth=4 package PAR::Heavy; $PAR::Heavy::VERSION = '0.08'; #line 20 ######################################################################## # Dynamic inclusion of XS modules my ($bootstrap, $dl_findfile); # Caches for code references my ($dlext); # Cache for $Config{dlext} my ($cache_key); # The current file to find # Adds pre-hooks to Dynaloader's key methods sub _init_dynaloader { return if $bootstrap; return unless eval { require DynaLoader; DynaLoader::dl_findfile(); 1 }; $bootstrap = \&DynaLoader::bootstrap; $dl_findfile = \&DynaLoader::dl_findfile; local $^W; *{'DynaLoader::dl_expandspec'} = sub { return }; *{'DynaLoader::bootstrap'} = \&_bootstrap; *{'DynaLoader::dl_findfile'} = \&_dl_findfile; } # Return the cached location of .dll inside PAR first, if possible. sub _dl_findfile { return $FullCache{$cache_key} if exists $FullCache{$cache_key}; return $dl_findfile->(@_); } # Find and extract .dll from PAR files for a given dynamic module. sub _bootstrap { my (@args) = @_; my ($module) = $args[0] or return; my @modparts = split(/::/, $module); my $modfname = $modparts[-1]; $modfname = &DynaLoader::mod2fname(\@modparts) if defined &DynaLoader::mod2fname; if (($^O eq 'NetWare') && (length($modfname) > 8)) { $modfname = substr($modfname, 0, 8); } # XXX: Multi-platform .dll support in PARs needs better than $Config. $dlext ||= do { require Config; (defined %Config::Config) ? $Config::Config{dlext} : ''; }; my $modpname = join((($^O eq 'MacOS') ? ':' : '/'), @modparts); my $file = $cache_key = "auto/$modpname/$modfname.$dlext"; if ($FullCache{$file}) { local $DynaLoader::do_expand = 1; return $bootstrap->(@args); } my $member = PAR::find_par(undef, $file, 1) if defined &PAR::find_par; return $bootstrap->(@args) unless $member; $FullCache{$file} = _dl_extract($member, $file); # Now extract all associated shared objs in the same auto/ path my $pat = $member->fileName; $pat =~ s{[^/]*$}{}; if ($PAR::LastAccessedPAR) { foreach my $member ( $PAR::LastAccessedPAR->members ) { next if $member->isDirectory; my $name = $member->fileName; next unless $name =~ m{^/?\Q$pat\E.*?\.\Q$dlext\E[^/]*$}; $name =~ s{.*/}{}; _dl_extract($member, $file, $name); } } local $DynaLoader::do_expand = 1; return $bootstrap->(@args); } sub _dl_extract { my ($member, $file, $name) = @_; require File::Spec; require File::Temp; my ($fh, $filename); # fix borked tempdir from earlier versions if ($ENV{PAR_TEMP} and -e $ENV{PAR_TEMP} and !-d $ENV{PAR_TEMP}) { unlink($ENV{PAR_TEMP}); mkdir($ENV{PAR_TEMP}, 0755); } if ($ENV{PAR_CLEAN} and !$name) { ($fh, $filename) = File::Temp::tempfile( DIR => ($ENV{PAR_TEMP} || File::Spec->tmpdir), SUFFIX => ".$dlext", UNLINK => ($^O ne 'MSWin32'), ); } else { $filename = File::Spec->catfile( ($ENV{PAR_TEMP} || File::Spec->tmpdir), ($name || ($member->crc32String . ".$dlext")) ); open $fh, '>', $filename or die $! unless -r $filename and -e $filename and -s $filename == $member->uncompressedSize; } if ($fh) { binmode($fh); print $fh scalar $member->contents; close $fh; chmod 0755, $filename; } return $filename; } 1; #line 168 FILE2d2d243e/Compress/Zlib.pm%T#line 1 "/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/Compress/Zlib.pm" # File : Zlib.pm # Author : Paul Marquess # Created : 26 November 2003 # Version : 1.32 # # Copyright (c) 1995-2003 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 Compress::Zlib; require 5.004 ; require Exporter; require DynaLoader; use AutoLoader; use Carp ; use IO::Handle ; use strict ; use warnings ; our ($VERSION, @ISA, @EXPORT, $AUTOLOAD); our ($deflateDefault, $deflateParamsDefault, $inflateDefault); $VERSION = "1.32" ; @ISA = qw(Exporter DynaLoader); # Items to export into callers namespace by default. Note: do not export # names by default without a very good reason. Use EXPORT_OK instead. # Do not simply export all your public functions/methods/constants. @EXPORT = qw( deflateInit inflateInit compress uncompress gzip gunzip gzopen $gzerrno adler32 crc32 ZLIB_VERSION DEF_WBITS OS_CODE MAX_MEM_LEVEL MAX_WBITS Z_ASCII Z_BEST_COMPRESSION Z_BEST_SPEED Z_BINARY Z_BUF_ERROR Z_DATA_ERROR Z_DEFAULT_COMPRESSION Z_DEFAULT_STRATEGY Z_DEFLATED Z_ERRNO Z_FILTERED Z_FINISH Z_FULL_FLUSH Z_HUFFMAN_ONLY Z_MEM_ERROR Z_NEED_DICT Z_NO_COMPRESSION Z_NO_FLUSH Z_NULL Z_OK Z_PARTIAL_FLUSH Z_STREAM_END Z_STREAM_ERROR Z_SYNC_FLUSH Z_UNKNOWN Z_VERSION_ERROR ); sub AUTOLOAD { my($constname); ($constname = $AUTOLOAD) =~ s/.*:://; my ($error, $val) = constant($constname); Carp::croak $error if $error; no strict 'refs'; *{$AUTOLOAD} = sub { $val }; goto &{$AUTOLOAD}; } bootstrap Compress::Zlib $VERSION ; # Preloaded methods go here. sub isaFilehandle($) { my $fh = shift ; return ((UNIVERSAL::isa($fh,'GLOB') or UNIVERSAL::isa(\$fh,'GLOB')) and defined fileno($fh) ) } sub isaFilename($) { my $name = shift ; return (! ref $name and UNIVERSAL::isa(\$name, 'SCALAR')) ; } sub gzopen($$) { my ($file, $mode) = @_ ; if (isaFilehandle $file) { IO::Handle::flush($file) ; my $offset = -f $file ? tell($file) : -1 ; gzdopen_(fileno($file), $mode, $offset) ; } elsif (isaFilename $file) { gzopen_($file, $mode) } else { croak "gzopen: file parameter is not a filehandle or filename" } } sub ParseParameters($@) { my ($default, @rest) = @_ ; my (%got) = %$default ; my (@Bad) ; my ($key, $value) ; my $sub = (caller(1))[3] ; my %options = () ; # allow the options to be passed as a hash reference or # as the complete hash. if (@rest == 1) { croak "$sub: parameter is not a reference to a hash" if ref $rest[0] ne "HASH" ; %options = %{ $rest[0] } ; } elsif (@rest >= 2) { my $count = @rest; croak "$sub: Expected even number of parameters, got $count" if @rest % 2 != 0 ; %options = @rest ; } while (($key, $value) = each %options) { $key =~ s/^-// ; if (exists $default->{$key}) { $got{$key} = $value } else { push (@Bad, $key) } } if (@Bad) { my ($bad) = join(", ", @Bad) ; croak "unknown key value(s) @Bad" ; } return \%got ; } $deflateDefault = { 'Level' => Z_DEFAULT_COMPRESSION(), 'Method' => Z_DEFLATED(), 'WindowBits' => MAX_WBITS(), 'MemLevel' => MAX_MEM_LEVEL(), 'Strategy' => Z_DEFAULT_STRATEGY(), 'Bufsize' => 4096, 'Dictionary' => "", } ; $deflateParamsDefault = { 'Level' => undef, 'Strategy' => undef, 'Bufsize' => undef, } ; $inflateDefault = { 'WindowBits' => MAX_WBITS(), 'Bufsize' => 4096, 'Dictionary' => "", } ; sub deflateInit(@) { my ($got) = ParseParameters($deflateDefault, @_) ; no warnings; croak "deflateInit: Bufsize must be >= 1, you specified $got->{Bufsize}" unless $got->{Bufsize} >= 1; _deflateInit($got->{Level}, $got->{Method}, $got->{WindowBits}, $got->{MemLevel}, $got->{Strategy}, $got->{Bufsize}, $got->{Dictionary}) ; } sub inflateInit(@) { my ($got) = ParseParameters($inflateDefault, @_) ; no warnings; croak "inflateInit: Bufsize must be >= 1, you specified $got->{Bufsize}" unless $got->{Bufsize} >= 1; _inflateInit($got->{WindowBits}, $got->{Bufsize}, $got->{Dictionary}); } sub Compress::Zlib::deflateStream::deflateParams { my $self = shift ; my ($got) = ParseParameters($deflateParamsDefault, @_) ; croak "deflateParams needs Level and/or Strategy" unless defined $got->{Level} || defined $got->{Strategy}; no warnings; croak "deflateParams: Bufsize must be >= 1, you specified $got->{Bufsize}" unless !defined $got->{Bufsize} || $got->{Bufsize} >= 1; my $flags = 0; if (defined $got->{Level}) { $flags |= 1 } else { $got->{Level} = 0 } if (defined $got->{Strategy}) { $flags |= 2 } else { $got->{Strategy} = 0 } $got->{Bufsize} = 0 if !defined $got->{Bufsize}; $self->_deflateParams($flags, $got->{Level}, $got->{Strategy}, $got->{Bufsize}); } sub compress($;$) { my ($x, $output, $out, $err, $in) ; if (ref $_[0] ) { $in = $_[0] ; croak "not a scalar reference" unless ref $in eq 'SCALAR' ; } else { $in = \$_[0] ; } my $level = (@_ == 2 ? $_[1] : Z_DEFAULT_COMPRESSION() ); if ( (($x, $err) = deflateInit(Level => $level))[1] == Z_OK()) { ($output, $err) = $x->deflate($in) ; return undef unless $err == Z_OK() ; ($out, $err) = $x->flush() ; return undef unless $err == Z_OK() ; return ($output . $out) ; } return undef ; } sub uncompress($) { my ($x, $output, $err, $in) ; if (ref $_[0] ) { $in = $_[0] ; croak "not a scalar reference" unless ref $in eq 'SCALAR' ; } else { $in = \$_[0] ; } if ( (($x, $err) = inflateInit())[1] == Z_OK()) { ($output, $err) = $x->__unc_inflate($in) ; return undef unless $err == Z_STREAM_END() ; return $output ; } return undef ; } # Constants use constant MAGIC1 => 0x1f ; use constant MAGIC2 => 0x8b ; use constant OSCODE => 3 ; use constant FTEXT => 1 ; use constant FHCRC => 2 ; use constant FEXTRA => 4 ; use constant FNAME => 8 ; use constant FCOMMENT => 16 ; use constant NULL => pack("C", 0) ; use constant RESERVED => 0xE0 ; use constant MIN_HDR_SIZE => 10 ; # minimum gzip header size sub memGzip($) { my $x = deflateInit( -Level => Z_BEST_COMPRESSION(), -WindowBits => - MAX_WBITS(), ) or return undef ; # write a minimal gzip header my(@m); push @m, pack("C" . MIN_HDR_SIZE, MAGIC1, MAGIC2, Z_DEFLATED(), 0,0,0,0,0,0, OSCODE) ; # if the deflation buffer isn't a reference, make it one my $string = (ref $_[0] ? $_[0] : \$_[0]) ; my ($output, $status) = $x->deflate($string) ; push @m, $output ; $status == Z_OK() or return undef ; ($output, $status) = $x->flush() ; push @m, $output ; $status == Z_OK() or return undef ; push @m, pack("V V", crc32($string), $x->total_in()); return join "", @m; } sub _removeGzipHeader($) { my $string = shift ; return Z_DATA_ERROR() if length($$string) < MIN_HDR_SIZE ; my ($magic1, $magic2, $method, $flags, $time, $xflags, $oscode) = unpack ('CCCCVCC', $$string); return Z_DATA_ERROR() unless $magic1 == MAGIC1 and $magic2 == MAGIC2 and $method == Z_DEFLATED() and !($flags & RESERVED()) ; substr($$string, 0, MIN_HDR_SIZE) = '' ; # skip extra field if ($flags & FEXTRA) { return Z_DATA_ERROR() if length($$string) < 2 ; my ($extra_len) = unpack ('v', $$string); $extra_len += 2; return Z_DATA_ERROR() if length($$string) < $extra_len ; substr($$string, 0, $extra_len) = ''; } # skip orig name if ($flags & FNAME) { my $name_end = index ($$string, NULL); return Z_DATA_ERROR() if $name_end == -1 ; substr($$string, 0, $name_end + 1) = ''; } # skip comment if ($flags & FCOMMENT) { my $comment_end = index ($$string, NULL); return Z_DATA_ERROR() if $comment_end == -1 ; substr($$string, 0, $comment_end + 1) = ''; } # skip header crc if ($flags & FHCRC) { return Z_DATA_ERROR() if length ($$string) < 2 ; substr($$string, 0, 2) = ''; } return Z_OK(); } sub memGunzip($) { # if the buffer isn't a reference, make it one my $string = (ref $_[0] ? $_[0] : \$_[0]); _removeGzipHeader($string) == Z_OK() or return undef; my $x = inflateInit( -WindowBits => - MAX_WBITS()) or return undef; my ($output, $status) = $x->inflate($string); return undef unless $status == Z_STREAM_END(); if (length $$string >= 8) { my ($crc, $len) = unpack ("VV", substr($$string, 0, 8)); substr($$string, 0, 8) = ''; return undef unless $len == length($output) and $crc == crc32($output); } else { $$string = ''; } return $output; } # Autoload methods go after __END__, and are processed by the autosplit program. 1; __END__ =cut #line 1181FILEd5db3ec7/Digest/SHA1.pm$#line 1 "/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/Digest/SHA1.pm" package Digest::SHA1; use strict; use vars qw($VERSION @ISA @EXPORT_OK); $VERSION = '2.07'; # $Date: 2003/12/05 13:17:59 $ require Exporter; *import = \&Exporter::import; @EXPORT_OK = qw(sha1 sha1_hex sha1_base64 sha1_transform); require DynaLoader; @ISA=qw(DynaLoader); eval { require Digest::base; push(@ISA, 'Digest::base'); }; if ($@) { my $err = $@; *add_bits = sub { die $err }; } Digest::SHA1->bootstrap($VERSION); 1; __END__ #line 240 FILE#bbef9705/auto/Compress/Zlib/Zlib.soELF04 4 (LPhhh@|r?WZ^vbn%0GiCI_<yqj(8kOYPe[h QFuN*]H2.}sg/AK,!1;753TL)aD4SpMB-$V#9olR>+wUf6tJd~m:'X`z"x=c&E{\T |""d%$)<) 0 q @q  dh08@D;@N 6`R C  P_PJ F m)  e?N j 1 P5x  $ 0@ "h ` "pC Q D] p #  Cq, m O>0i ~  kH dz u HD 0 r Z ' N P  A  m 4 06 d I? $) 1 1 0C< . *C Xp b c [ P5 x @&  _ 0 .  P@% B K. D   0l `b@  ? )-g [ Q 5 ^P\  @u `   V bL ~t0 _ hH ` b X; J  X0l J `x& A (  p @- /q ' `U Я /` ` 5> J"  u5"f S) PI K q zp u X C  D V ` ) / ` M XN C k "  0  k  "| 2PG PZ %   4 q@  J `Ar D 4AK 7 $  0G  Gg @  2 `m 0_DYNAMIC_GLOBAL_OFFSET_TABLE___gmon_start___fini__cxa_finalize_Jv_RegisterClassesPerl_Gthr_key_ptrpthread_getspecificPerl_get_svPerl_sv_setivPerl_sv_setpvPerl_sv_backoffPerl_sv_2iv__errno_locationPerl_Ireentrant_buffer_ptrstrerror_rPerlIO_stdoutfPerl_safesysmallocmemsetPerl_ninstrPerl_sv_catpvn_flagsPerl_newSVpvPerl_croak_nocontextXS_Compress__Zlib_constantPerl_Tstack_sp_ptrPerl_Tstack_base_ptrPerl_Tmarkstack_ptr_ptrPerl_Top_ptrPerl_Tcurpad_ptrPerl_newSVpvf_nocontextPerl_sv_2mortalPerl_Tstack_max_ptrPerl_Isv_undef_ptrstrlenPerl_sv_setpvnPerl_mg_setPerl_stack_growPerl_sv_2pv_flagsPerl_sv_newmortalPerl_croakXS_Compress__Zlib_zlib_versionzlibVersionXS_Compress__Zlib_DispStreamPerl_sv_derived_fromPerl_sv_2pv_nolenXS_Compress__Zlib_gzopen_gzopenPerl_newSVPerl_sv_setref_pvXS_Compress__Zlib_gzdopen_lseek64gzdopenXS_Compress__Zlib__gzFile_gzreadPerl_sv_growPerl_sv_upgradePerl_Tcurcop_ptrPerl_Icompiling_ptrPerl_sv_2uvXS_Compress__Zlib__gzFile_gzreadlineXS_Compress__Zlib__gzFile_gzwriteXS_Compress__Zlib__gzFile_gzflushXS_Compress__Zlib__gzFile_gzcloseXS_Compress__Zlib__gzFile_gzeofXS_Compress__Zlib__gzFile_gzsetparamsXS_Compress__Zlib__gzFile_DESTROYPerl_sv_freePerl_safesysfreeXS_Compress__Zlib__gzFile_gzerrorXS_Compress__Zlib_adler32Perl_sv_setuvXS_Compress__Zlib_crc32XS_Compress__Zlib__deflateInitdeflateInit2_Perl_newSVivPerl_dowantarraydeflateSetDictionaryPerl_warn_nocontextXS_Compress__Zlib__inflateInitinflateInit2_Perl_newSVsvXS_Compress__Zlib__deflateStream_DispStreamXS_Compress__Zlib__deflateStream_deflateXS_Compress__Zlib__deflateStream_flushXS_Compress__Zlib__deflateStream__deflateParamsXS_Compress__Zlib__deflateStream_get_LevelXS_Compress__Zlib__deflateStream_get_StrategyXS_Compress__Zlib__deflateStream_DESTROYdeflateEndXS_Compress__Zlib__deflateStream_dict_adlerXS_Compress__Zlib__deflateStream_total_inXS_Compress__Zlib__deflateStream_total_outXS_Compress__Zlib__deflateStream_msgXS_Compress__Zlib__inflateStream_DispStreamXS_Compress__Zlib__inflateStream_inflatememmoveinflateSetDictionaryXS_Compress__Zlib__inflateStream_inflateSyncXS_Compress__Zlib__inflateStream_DESTROYinflateEndXS_Compress__Zlib__inflateStream_dict_adlerXS_Compress__Zlib__inflateStream_total_inXS_Compress__Zlib__inflateStream_total_outXS_Compress__Zlib__inflateStream_msgboot_Compress__ZlibPerl_newXSPerl_Isv_yes_ptrPerl_formget_crc_tablestrcpyfdopenftellfprintffopen64fwritefreadferrorfcloseinflateResetmemcpygzgetcgzgetsgzprintfvsprintfgzputcgzputsfflushgzseekgzrewindfseekgztellfputcz_errmsgstrcatdeflate_copyrightdeflateInit_zcalloczcfreedeflateReset_tr_init_tr_stored_block_tr_aligndeflateCopy_tr_flush_block_length_code_dist_code_tr_tallyzErrorinflate_blocks_resetinflate_blocks_freeinflate_blocks_newinflateInit_inflate_blocksinflate_set_dictionaryinflateSyncPointinflate_blocks_sync_pointinflate_codes_freeinflate_trees_fixedinflate_codes_newinflate_flushinflate_trees_bitsinflate_maskinflate_trees_dynamicinflate_codesinflate_copyrightinflate_fastlibc.so.6_edata__bss_start_endGLIBC_2.1.3GLIBC_2.1GLIBC_2.09 si [ ii g ii q İȰ̰а԰ذܰ ,8DP\htx|ıȱ̱бԱرܱ04#8'<(@3D6H7LAPDTEXF\G`HdIhOlPpftgxi|jkpqzPTX\`d h!l"p%t&x)|*+,-./124589:;<=>?@BCJKLNQRVWXY[\]^_ `abcd f$h(l,m0o4r8s<t@vDwHxLyP|T}X~\`dhlptx|  $(,U'G hhhhh h($h0(h8p,h@`0hHP4hP@8hX0<h` @hhDhpHhxLhPhThXh\h`hdhhhplh`phPth@xh0|h hhhhhhhh h(h0h8ph@`hHPhP@hX0h` hhhphxhhhhhhhhph`hPh@h0h hhh hhhhh  h($h0(h8p,h@`0hHP4hP@8hX0<h` @hhDhpHhxLhPhThXh\h`hdhhhplh`phPth@xh0|h hhhhhhhh h(h0h8ph@`hHPhP@hX0h` hhhphxhhhhhhhhpUSP[jtЋ]ÐUSR[Fu4tu/`t`ҋ`uƃ]à \G뾉USP[ޒt u]É P吐UWVS蔼Ùu$)$/$qD$D$)|EG 9p ta$$$|$t$r$$$E|$D$G u G[^_]Ív$`$f$|$*G$9$?$|$9BwE0$$ $d$E$$AMM$0D$4D$v'U]E޺$ED$E$]]Ð&UWV1S袺ç ;u }. <$UFD$x;u | [^_]Ð&'UWVSDI u$E t$D$,t$$$F D$ܭ$F$D$$F(D$VT$$+$D$,<$E$F D$uF <$b_$FD$My$FD$8$FD$#$FD$Ǯ$F0D$$F4D$$F8D$$FxU @댐&U]Muu Q tQƒ vbuHt ]ȋu]$j$p$D$D$v$t$\썶U t$u $|$FRWIthI:Dt$ȋt$|$]8t˃NuuE뫍t&uEڐt&U t$u $|$F袴çUthU:Ft$ȋt$|$] 8t˃Xu uE뫍t& uEڐt&U t$u $|$FTt^T9Rt$t$|$] u܋EуUu ȯuE ӯuE뾐&'U t$u $|$FBGFt^F9Et$t$|$] ޯu܋EуMu uE uE뾐&'U t$u $|$F蒲×Pw: uE$t$|$]ø uEʍ u΋E믍) 6uE CuEPlU(]U讱óuEu }}Ew?Vu"Et&]u}]Ív鍻[$$}u ]EEuE]FRt#SubuEtkV$m$s}u ]EEuE]$:$@}u ]EEuE]W$$ }u ]EEuE]$$]}}EEu uE]Nt E sFTt+UzfE?DEFSt+T$EEFStTѰEcUWVS贮ù,$L$R$Z$E)$/$g$ $$2$4$$8)xE)Hhm$$$@$ $p$v$$P$V$P U$%$+$c4F [@EE$$$E܉D$ED$ED$ ED$Otq$$|$ƍ$E܉D$D$4$EU$P$V$^U,[^_]$%$+ƍ $U܉T$tD$4$HEƋE0돃7$$$M)$$$KEU$v$|ulj4$t$UD$ <$T$E@ @uEUE$"$(U$T$$$U$D$ T$T$E%$$$u)$$$>EU$i$o$ED$ED$ UB @uEEU$#$)$ED$$$U$D$ T$T$E3v$$ƍܳ$$$Et$D$D$ H{&$`$f$>E$:$@$D$~UWVSdi$$$ 8$$$E$$$YM 2$4)$$)ʉ@Ew$R$X$@$ $$$$*$$$ $P <3$$$t$|$$$$MΉMG @uQ>$z$$$Z$`$Uʉ[^_]$+$1$|$닍&$$$$$$\D$UWVS }$$$$Ey$$$Y$_$2$4-$3$k8)u)}xEH9$$$$$4$D$*D$x$$$@ 7$c$i$@ E1}~V$,$2$jD@ $$$<DD$U$$$$$$$D[^_]$y$$a$g$4$DD$V$,$2$$$R4$D$$$$D$ $$$ܴ֐UWVSy$|$$8$\$b$E$;$A$M 2$4 )$ $E)ʉ@E$$$M@ $$$U8$w$}$UD@ $F$L$MD<$D$[v$@@@ $$$D$G`HGHG@G7G $=$}$$[$]$c$M4$7$=$$%$]U4$|$ D$HD$+$$$$$$M[^_]1D@$$p$v$X$^$U4$DD$$ $&$$$FM4$D$X$$$D$UWVSu,$$$8$l$r$$L$R$2 M$$#$[U)ʉ@EE)$$$M@ n$$$u@ E$$$MD@ $O$U$uDE$!$'$_MD@ $$$.uD@ t D$MD$  $t$KEU$T$$@@@ $Z$`$D$G`HGHG@G7G $$$$E$$$Mu4$$E$$$MU܋$|$ D$HD$$U$[$c$5$;$su,[^_]Ðt&g01D@$v$$$$$U<$DD$A$$$x$~$U<$DD$$@$F$($.$fU<$D$n$$$\D$5&UWVSq<$$$$E$$$i$o$2$4=$C${8)u)}@EEB$$$8MD$EE$$G@$ $$$ ${$$P U$P$V$8$>$vU4$D$HD$$$$2M@ e$$$Ux }EwMA<M%H A@Gp~g;u|)uE$1$7$ED$GG D$UȉD$T$ GMO)ȉBEt_UML1M9HM$L$D$E$ExuUMH@$u${$UML$K$Q$UD@ @$$ $X}0$$U$E܉T$D$MA @uSU܉$$$$$$8<[^_]$j$p$E܉D$1농v$@$F$($.$fM4$DD$$$U؉$ET$D$EEz$$M$D$L$t UB $ t&$`$f$^$@$F$9u UBܵ$ $$GUD@ t4$$$MD@ E($$$$$U4$DD$$[$a$C$I$M4$D$u$$ $D$J$$$Eh$$$\밐UWVSi,$|$$$EY$_$$9$?$2$4 $$K8)u)}@}E$$$ U|$$$&@$ :$z$$$Z$`$P U$/$5$$$UU4$D$HD$f$$$U@ $$$U@ EGD<%H Gx@E|$$UE$$$$SU|$$$,UD@ @$$$}0$$U$ET$D$5E@ @uSE$[$a$i$;$A$yʉ,[^_]$ $U$T$농$$$$$U4$DD$$$$|$D$r$$_$e$|$D$QtG$$$!$$$$9uGp뤍&$$$$$U4$D$$m$s$D$t&$@$F$E$$ $ܶ뫐&UWVSDId,$$$$E$$$$$72$4m$s$8)u)}@}E$/$5$mUD@ D$$$$D$|UD@ E$$$@$ $$$O$$$?P U$$$~$$U4$D$HD$$:$@$xU@ 6$$ $DUx $ED$B$$$UU$ʉU$$Et$D$9UB @udU܋E$$R$X$`$2$8$pUʉ,[^_]Ív$$$ED$r$$$$$U4$D$.${$$D$v$P$V$.E$*$0$$$PU4$DD$$$$\ZUWVS [,$$$$Ey$$$Y$_$2$4-$3$k)u)ʉ}@}E$$$m@$ $$ǿ$/$$觿$P U$v$|$^$d$U4$D$HD$$$ $XU@ 6$$$$Up $E$$谾$U׉U$}$胾U$ET$D$E@ @uhEF U$$4$:$B$$$RUʉ,[^_]Ðt&$$U$T$觾n$$趽$$螽$U4$D$$[$a$D$蟼v$0$6$E$ $$뭐&UWVS49W$$Ҽ$$E$诼$$$菼$'2$4]$c$蛿)u)ʉ}@}E$$%$蝾@$ q$$$_$ѿ$׻$OP U$覿$謻$莿$蔻$̾U4$D$HD$.$J$P$舾U@ $$$TU@ $ٿ$۾$$U׉U$设$贺$Et$D$QUB @uTU$w$}$$W$]$蕽U8[^_]$($.$ED$념$$$$$&U4$D$^$譽$賹$D$t&$耽$膹$^E$Z$`$ܷ뫐&UWVS}ÉS,$$"$*$E$$7$ټ$߸$w2$4譼$賸$)u)ʉ}@}E/$o$u$譻UD@ $>$D$|UD@ E$$$MUD@ $޻$$UDx $費$踷$0@$ v$脻$芷$$d$j$P U$9$?$!$'$_U4$D$HD$$ݺ$$U@  $詺$诶$U@ |$$ED$1$c$i$衹U׉U$6$<$Et$D$ٵUB @uTU$$$ $߹$$U8,[^_]$谹$趵$ED$w$艹$菵$q$w$诸U4$D$$6$<$D$z$$$E$$$и$ִ$U4$DD$I$萸$薴$x$~$趷U4$DD$.$@$F$UWVSdxiN$$$ $Eٷ$߳$$蹷$迳$W2$4荷$蓳$˶8)u)}@}E$O$U$荶U@ T$$%$]U@ $$$)Up ~ $貶$踲$FD$4$聴$腶$苲$蓸$e$k$裵UD[^_]Ít&$Ro$ $&$$$FU4$D$~$˵$ѱ$_D$$裵$話$|։UWVSuK$l$r$z$EI$O$致$)$/$dz2$4$$;)u)ʉ}@}ED$迴$Ű$=@$ $葴$藰$$q$w$P <$I$O$1$7$oU4$D$HD$ѵ $$$+U@ $蹳$迯$U@ $ED$$w$}$t$|$蝱$Q$W$菲U։UG @>$$$$$>U4$D$ED$蓮$Dz$ͮ$UH$蚲$蠮$訴$z$耮$踱Uʉ[^_]$K$Q$|$ t&$ $&$$$FU4$D$~C$ͱ$ӭ$D$t&$蠱$覭$~2${$聭$묍v'UWVSqéG,$<$B$J$E$$W$$$藯2$4Ͱ$Ӭ$ )u)ʉ}@EEH"$茰$蒬$ʯU<$f$l$@$ $8$>$覭$$$薮P U<$D$@ @E8}$蹯$迫$UD@$腯$苫$îUD@ $T$Z$蒮UD@ $E|$D$$$$QU׉U$$$Et$D$)UB @uTU$诮$赪$轰$菮$蕪$ͭU8,[^_]$`$f$ED$'$9$?$!$'$_U4$DD$Z$D$D$y$ȭ$Ω$E|$D$D$ s$萭$薩$nE}$j$p$D$讨UWVSmÙC,$,$2$:$E $$G$$$臫2$4转$è$)u)ʉ}@EEH"$|$肨$身U<$V$\$Ԫ@$ $($.$薩$$$膪P U<$D$ @ @E8}$詫$诧$UD@$u${$質UD@ $D$J$肪UD@ $E|$D$$$ $AU׉U$֪$ܦ$Et$D$UB @uTU$蟪$襦$譬$$腦$轩U8,[^_]$P$V$ED$$)$/$$$OU4$DD$J$D$D$詨$踩$辥$E|$D$D$ c$耩$膥$^E}$Z$`$$v4$D D$责v$$$$$&4$DD$dPv$谡$趝$蘡$螝$֠4$DD$v$`$f$H$N$膠4$D$Ţ$$$ܹD$XUWVS4a97,$̠$Ҝ$ڢ$E詠$诜$$艠$菜$'2$4]$c$蛟)ʉxE)rm $$"$Z@ $$$-@ E$ğ$ʛ$D@ M$薟$蜛$ԞDp $m$s$諞|d}4$耧EGPD$P<$D$D$ 8螡EgUH'$$$U)$跞$轚$蟞$襚$}D$*4$D$|$ 賟EU$^$d$ܜ@$$0$6$讜@$<t+$$ $U,[^_]$۝$$u)~W$话$赙$藝$蝙U$T$D$4$›EUR$X$^$ED$ D$D$SEp$$%$識H$$U$D$ T$T$E $$Ƙ$ED$יGE$j$pU$T$W8ЉD$FEO8h$-$3$ED$ D$GD$Վmt&$$$ؒ$ގ$4$D$Q$螒$褎$D$$v$|$֐t&UWVSRé(,$<$B$J$E$$W$$$藐2$4͑$Ӎ$ 8)@EE)EHH$E)E肑$舍$j$p$訐U4$D$wD$ $&$,$dU@ 2$$$0Ux }E~`$趐$輌$UD@ u$腐$苌$ÏUD@ EG$O$U$7$=$G8D$D$4$bE‹@%H B@w8DwW tGEG OGDGu EO819B[OΉG <$UT$)‹Gut1H!‰UUB%H BW)։p$O$U$m})sEEU$$$葍@$$$$c@$<t+$軎$$ɐU,[^_]$萎$薊$讎u)~W$d$j$L$R$E܉D$ӎD$4$wEUR$ $U$D$ T$T$Ept&$Ѝ$։$^H$謍$貉$ED$ D$D$觊ET$s$y$!E$M$SU$T$O8ȉD$)EO8h$$$$$6U4$DD$qg$$ƈ$訌$讈$U4$D$$k$q$D$诇$C$I$ܻ։UWVStLy",$ $$$E$$'$ɋ$χ$g2$4蝋$裇$ۊ8)u)}@}E$_$e$蝊UD@ `$.$4$lUD@ E$$$=UD@ $Ί$Ԇ$ UD@ E$蟊$襆$݉UD @ $n$t$謉UD @ E$?$E$}UD@ N$$$LUDx $$$`@$ $贉$躅$"$蔉$蚅$P U$i$o$Q$W$菈U4$D$wD$$ $$KU@ p$و$߄$Up EtEFHEtUVXt~8FFEF F4$FHD$FXD$1u NuFD$G$M$腇U։U؋$$ $E܉|$D$轃UB @uXU܉$$$$Ç$Ƀ$U؋ʉ,[^_]Ít&$萇$薃$E܉D$W$i$o$Q$W$菆U4$D$Ljj$$$D$X$$$ʃE]$$Ƃ$訆$讂$U4$DD$$n$t$V$\$蔅U4$D D$χ$$$$$ $DU4$DD$,$΅$ԁ$超$輁$U4$DD$/|$~$脁$ev'UWVSEé$<$B$J$E$$W$$$藃2$4̈́$Ӏ$ )u)ʉ}@}E$菄$蕀$ @$ c$a$g$ρ$A$G$迂P U$$$$$z$밐UWVSd>i$}$z$ $E}$y$}$}$y$W|2$4}$y$|)u)ʉ}@}E$O}$Uy$|U@ T$}$%y$]|U@ $|$x$)|Up 4$`~xU8[^_]Ð$x$t$ED$u$x$t$x$t$wU4$D$z$Vx$\t$D$s$.x$4t$ uE$x$t$<밐UWVS489$w$s$y$Ew$s$v$w$s$'v2$4]w$cs$v)u)ʉ}@}E$w$%s$u@$ c$v$r$_t$v$r$OuP U$v$r$v$r$uU4$D$wD$.x$Jv$Pr$uU@  $v$r$TuU@ p$u$q$"uU׉U$u$q$Et$D$qUB @uUU$u$q$w$`u$fq$tU8[^_]Ð$0u$6q$ED$q$ u$q$t$p$/tU4$D$gv$t$p$D$o$t$p$lqE$ht$np$|밐UWVS4Ù $,t$2p$:v$E t$p$Gs$s$o$r2$4s$o$r)u)ʉ}@}E$s$o$q@$ c$Qs$Wo$p$1s$7o$qP U$s$ o$r$n$,rU4$D$wD$t$r$n$qU@  $vr$|n$qU@ p$Dr$Jn$qU׉U$r$n$Et$D$ZnUB @uUU$q$m$s$q$m$pU8[^_]Ð$q$m$ED$Wn$iq$om$Qq$Wm$pU4$D$r$q$m$D$Zl$p$l$mE$p$l$밐UWVS0$p$l$r$Eip$ol$o$Ip$Ol$n2$4p$#l$[o)u)ʉ}@}E$o$k$]n@$ q$o$k$m$o$k$nP U$fo$lk$No$Tk$nU4$D$wD$p$ o$k$HnU@ $n$j$nU@ p$n$j$Et$D$l${n$j$mU}0B @uZU$En$Kj$Sp$%n$+j$cm8[^_]Í&$m$i$ED$j|$m$i$m$i$lU4$D$o$mm$si$D$ht&$@m$Fi$jE$m$ i$뫐&UWVSD-I$l$h$n$El$h$k$l$h$7k2$4ml$sh$k8)u)}xEH9$-l$3h$l$h$Sk4$D$*D$m$k$g$k@ 7$k$g$j@ E1}~V$lk$rg$jD@ $>k$Dg$|jDD$U$q$k$ g$m$j$f$%jD[^_]$j$f$j$f$i4$DD$-mV$lj$rf$Tj$Zf$i4$D$k$j$"f$D$`e$i$e$<֐UWVS$*),$i$e$k$Ei$e$h$yi$e$h2$4Mi$Se$h)ʋM ЋUx)@0Eum$i$e$?hD$Eh$d$h$d$h4$D$*D$ej*$h$d$g@ n$Ph$Vd$gx M荃D$ $OrEU@G$g$d$g$c$G8@D$hD$4$ fE@%H A@w8wG u!EW8D29AKW։G <$D$cE}EuG멃}}$g$c$eE$f$b$gM)oEEM$f$b$:e@$$f$b$ e@$<t+$df$jb$rhM,[^_]$9f$?b$WfU)~W$ f$b$e$aM$L$|fD$4$ dEUR$e$aU$D$ T$T$bEp$}e$a$ aH$Ye$_aU$D$ T$T$TbEXUB%H BO)Ήp@uMW҉PuEU@MA @$d$`$ED$a$T$D$b룐G<UU8[^_]Ð$U$Q$ED$R$U$Q$U$Q$TU4$D$W$VU$\Q$D$P$.U$4Q$ RE$U$Q$\밐UWVS49$T$P$V$ET$P$S$T$P$'S2$4]T$cP$S)u)ʉ}@}E$T$%P$R@$ c$S$O$_Q$S$O$ORP U$S$O$S$O$RU4$D$*D$.U$JS$PO$RU@  $S$O$TRU@ p$R$N$"RU׉U$R$N$Et$D$NUB @uUU$R$N$T$`R$fN$QU8[^_]Ð$0R$6N$ED$N$ R$N$Q$M$/QU4$D$gS$Q$M$D$L$Q$M$lNE$hQ$nM$밐UWVSÙ$,Q$2M$:S$E Q$M$GP$P$L$O2$4P$L$O)u)ʉ}@}E$P$L$N@$ q$QP$WL$M$1P$7L$NP U$P$ L$O$K$,OU4$D$*D$Q$O$K$NU@ $vO$|K$NU@ p$DO$JK$Et$D$gM$O$!K$YNU}0B @uZU$N$J$P$N$J$N8[^_]Í&$N$J$ED$WK|$`N$fJ$HN$NJ$MU4$D$O$ N$J$D$QIt&$M$I$JE$M$I$ܿ뫐&UWVS L$|M$I$O$EYM$_I$L$9M$?I$K2$4 M$I$KL8$)uE)}@E썃رEL$H$LU@  $L$H$KU@$EkL$qH$KU}ED $4L$:H$rKUDEMtAUB  @E8߱Uԉ $K$G$D$D$ED$ J$K$GU$D$T$ D$I$PK$VG$D$D$ED$ I$K$GU$5D$T$ D$jI$J$F$MD$D$ED$ 1I$J$FU$D$xT$ D$H$lJ$rF$B$C$?$D$XD$ED$ B$yC$?U$D$T$ D$A?81$2C$8?$qD$D$B$C$?$t$D$>$B$>$D$t$@F  F$B$>$2@$tB$z>$AU4$NB$T>$\D$.B$4>$lAUL[^_]$A$>$t$?F8$A$=U؉$\D$EԉT$U܉D$ tRD$}܋E؅t~DF@8ME$ED$7F@~\wt14$NF@$8V)ЉF`'Ĝ[^_]É$\D$D$D$D$D$D$D$ D$ D$$D$(D$,k7F` xv4$1qE$ED$ ;#4$ED$D$ D$ED$D$8D$PD$9$@7FHF uft&htE@EvEt&Et&F\w&F\rUD$E$E D$p]ÍUH}1}]ux,|$uȍq4$D$`;E 4$|$D$]u}]Ít&Uuu]{Àt~\wt]u]ËFt4$E D$ED$:׋FHF $D$D$@F@D$ :=@tF8F@묉Uuu]F@uetG@t GGX1gUW1VS utWFPFtF\V *UU V VGu.U9U &} t `@G]u}]ËV=uFluE tDtB0u"F(T$$V$1FqD@뙋F($B0D$V$VɋF($B8D$V$V뭋F($Bt<$ED$OdGXGXwGpv 9GXG`uOlAG`GdG0IfP @fH9u=<$GT1ɅxO0L$GdD$ )ЉD$ GdGT$GdOlp`1[^_]ËGlMW\GdOp)ЋHf4P эF@ff%Lf  8@f:H9EWpGl)Ѓ@GlWpv'wdFwd;uw>G0W@OPDO81‹GL!‹G,W@!ƋG<PEfqO@W<GdfJGpHGpuGdG`GXE<$GT1҅xW0‰T$GdD$ )ȉD$N GdGT$"`1LWh)=cGXW&OdH<$Wlw M 1_O`tNW0GdЋHfP @fG`<$WT1xG0ЉD$Gd)ЉD$1} D$ 7 GdGT$ pu1} D1} D2U]Ðv'Uuu]1ҍ1ɉ 8  L$ t ( `0 f]uu]&'UU1&1f@=~11f @~11ft @~f1111]UWVUEuT EH9ƉE~9MU }X MET fEf9Ef9EtkU EfEf9Erf9Et1U}T Eu9~UEMT ^_]ÐU}E P88PwPE8PwUFT q}T bUWV$E UHM@0u1PUHM@EE&E1fp4 F~UMLT fDLFu܁<'E܋UM􋼂T DDp;u~E؋uEft;}[U1r4 @fr4 ;}| U)ЋU E1uEtuDЋEE܁}<`}؅MQ MQ4 fu&'MNq4 ftMHfq4 q6 fq6 uq4 Hfq4 mu؅utdv'Ep4 tHM܋EU܋T ;M.UD9t!)‰ЋU‹UEftOuNu$^_]Ð&'UWV10}Ut&'0fDMA~1;u Lu F;u ~0^_]DM؉L$PfTM؉$QfԐv'UWV=0E U }EB1ҋ@ EEHLE9E}K'EUf<H@HUU艔T 1ҋE舔PEU9U|HUE PHE~5 <$UET$D$JMuHu&X E싄T X BHU<$D$T$U싇LX P LT EfE؋EEЋUfEPP8r7PUftEftX FT$<$D$iH(LX HLT U <$T$?UET$$4 D$c0^_]ÍPH}~B1T ƋEf1Ɉ7Pt D)H~,EE븍vUEfD&'U1WV EE pEEuEEU} fD19Wt&AE ;Mt}9t8;M}gEt fEȋMft U1Ʌu"EEG;}~ ^_]Í&9tEEEȍvt-;UtMt @ft M @f 넃 M @f hvM @f N&UWV(EE u@EEMu EM9M }M}} LE9UM} 9M9EEv )9Ut UN ЋVf NVANF)D}MfMjEMMЋMu&EM9M (^_]Í}9}t кĐt&Ut  fr}M9M}v )}9Et N ЋVf NVANF)fUDM )ȉM܋9 N ЋVf NVANF)f}܍D~h}N ЋVf NVANF)fE fA  fU܍ F}t fU } 5 )ȉM؋9 N ЋVf NVANF)f}؍D ~b}N ЋVf NVANF) fE fAq  fU؍ I )ȉMԋ9 N ЋVf NVANF)f}ԍD ~b} N ЋVf NVANF) f\E fA<  fUԍ IUVSu4$D$ D$n 4$D$ D$R( 4$D$t&'fv uJ狎Rȃ[^]Ív'UWVSdi,E U}EEUE苏 UЉUO ЋWf OWAOG) Uf EHEO ЋWf OWAOG) Uf dEEO ЋWf OWAOG) Uf1;u' v EO ЋWf OWAOG) }܋UfF;ux<$D$EHD$ E E؉}E,[^_]v fAE fAUJЉU fADE- fAt&UWVE u}EEE ~~N ЋVf NVANF) fEuEE EE^_]  ǍAfUWVS贻ù} O ЋWf OWAOGE) }Uf)9EO ЋWf OWAOG)D}Uf<$ )ȃ  5O ЋWf OWAOGE) }UfEU䋏)9UO ЋWf OWAOG)}UfUD<$ [^_]Ív fU  fA fZ fAUWVSEE }uEEEG|8!<$ D$| D$<$j<$bE苗 9wʍF9wJEtC<$Et$D$ED$ <$Mu [^_]É}[^_]9 uO ЋWf OWAOG) f<$ @D$ @D$E@D$ D$ <$D$E fA떉 ~{uO ЋWf OWAOG) fD$<$ME fAʼn<$5N&UWMVu S^cf4PEu,U@f[^H9_]N}@fwCL> w> @f 댍t&7ݍvL벐v'UWVSdi4E}t&UPEBUU҉EU DEM)ȋ9IEEO ЋWf OWAOG)}܋UfUD9u8E EȸUȋ)9U UċO ЋWf OWAOG)}ċUfUȍDU 4[^_]ËU  fUȍ 뾋U E fU U4E EظU؋)9U UԋO ЋWf OWAOG)}ԋUfU؍DEM)U)ȋ9EO ЋWf OWAO񋇴G)UfUDM}vLU4EDEиUЋ)9"UŰO ЋWf OWAOG)}̋UfUЍDVN NVANF1f1^]Ív~NV Ѝv'UWV}u<$zEtEGW OWAOOWAOOWAOĈGNt('E NWO E Gu^_]ÐUS P[]Ð&UUS)ܭ`[]Ðv'U]E 训ó$ED$&]]ÐU]E ~Ã$M]]ÐU]MNStQu]]ÉA1AAz HA@D$L$$[1벐v'Uuu]ˬЂtVtN$u]u]Ðt&BuF(T$$1FӉ$t$N$VՍ&'U]ENS}}ut81t]u}]Ðt&}8utGW uG(h‰G G$u 0G$G(D$D$$҉G¸tBG@ u x|E v<$|TGU ,P1w<$~ H!ȈщD$D$+Fu<$,<$Z1] G@ rt&U]ED$$E D$ED$ ]]Ít&U8}}]軪ut Ot7u]u}]E1} DE  wЍGU HUGGAWB;BtG8U HBUGG@UGEp։E؉)ЉU܋U)9E uEO,UGU HUWGGBGGU HUWGGBGGtZU HUWGGBGGt-GHWGBWBG0EЋUB M̉Ju EċFE)FUȉMuq4E $D$uN(9tM9s)ʍz롉NjE)똋uMF,)넉΋I0V(9U9s )эyNjE)} w;v'EąMċMEM̃EE EЃ} vϋuЋE?pUЃoU B(D$t$$R MA mmAuFV 9‰Usq}w3MąJMċMEM̃EE EЃ}vϋuFV FE)FUȉMuq4E $D$D$uM~,)LUM $L$t?UЋMQ ẺAU Mċ:JE)BEȉUMJ4E $D$KU MB($A D$R$E 렃}Et EE}M19U<s;t&'EąMċMEM̃EE E9Ur)ủDmЋu)űEЋ U!ȉuuumЉ09wO}t3u1N t&'uFOutUJ EpUutuUN DʋU MB($A D$R$u U BM~EU MB($A D$R$u &MЋuN ẺFU Mċ2JE)Buȉ2EUP4M $L$jU M AEЉB M̉Ju Eċ>FE)FUȉMuq4E $D$MЋuN ẺFU :BE)BMȉ E UЋMQ ủqUċE PM Eȋ1)Auȉ1EUP4$yMЋuN ẺFU MĉJ E)Buȉ2EUP4M $D$L$~Muy,)5&'Uuu }}] l<$t$D$XF($G(D$V$F($G$D$V$F(|$$V$1]u}]U}}]uG(蕕Úku$E t$D$vG(Ɖw4w0]u}]ÉUE]8ÐU1WMVEuU 1} EEEEEEEEEEEEEEEE t& DO uu 9u $ DuFv9$(s$'DuOu9$0v$$ ӥ;0s)&'D) ѥF9rD)1ɉ<@1DO t+t& ֋2O uًM1 &' 0 t8U,<@8G;} rЋ011u,088,$M 1؉ 1 19(xD(tN4F $9(4Bt&,0$ )9Ɖv ()Ƌӥ9vq4)Ћ(H;s?F;s6ѥ9v)F;rԍt&U(ӥM$,ɉxE(}8$ы% Љ$),t))T$9(I(u U,* ō9 G% ( )ӥ ;s.t&T;r׋(It t&1u 1,H!;8t5,$) Ћ, H!;8u44(09(t&0t&'^_]1 ;Ms4`w1Ћ% Љ EUu)PЋ% Љ t&U fE\UWVStyd,EUB(D$D$$R ǸD$ED$D$ $ED$|$$D$E D$ED$ED$ t9t E uU|BUB(|$$R$,[^_]ËUBؐUWVS蔍ÙcM(}A3U(B'U(B(|$$R$1"&'USEӋaE EE1[]UUB(D$D$$R tEBE BEBEB]Ít&UWVSDIa msg stream pointer is NULL OS_CODEZ_ERRNOZ_ASCIIDEF_WBITSMAX_WBITSZ_UNKNOWNZ_FILTEREDZ_NO_FLUSHZ_DEFLATEDZ_NEED_DICTZ_MEM_ERRORZ_BUF_ERRORZ_FULL_FLUSHZ_SYNC_FLUSHZ_STREAM_ENDZ_BEST_SPEEDZ_DATA_ERRORZLIB_VERSION1.1.4Z_OKZ_NULLZ_FINISHZ_BINARYMAX_MEM_LEVELZ_HUFFMAN_ONLYZ_STREAM_ERRORZ_PARTIAL_FLUSHZ_VERSION_ERRORZ_NO_COMPRESSIONZ_DEFAULT_STRATEGYZ_BEST_COMPRESSIONZ_DEFAULT_COMPRESSION%s is not a valid Zlib macroCompress::Zlib::inflateStreamCompress::Zlib::gzFilefile is not a referenceCompress::Zlib::deflateStreamdeflates is not a referenceinflateUsage: %s(s, buf)inflateSyncZlib.c1.32Compress::Zlib::constantCompress::Zlib::zlib_versionCompress::Zlib::DispStreamCompress::Zlib::gzopen_Compress::Zlib::gzdopen_Compress::Zlib::gzFile::gzeofCompress::Zlib::adler32Compress::Zlib::crc32Compress::Zlib::_deflateInitCompress::Zlib::_inflateInit$::bootstrap parameter%s::%sXS_VERSION%s: buffer parameter is a reference to a reference%s: buffer parameter is not a SCALAR referenceUnexpected return type %d while processing Zlib macro %s, usedYour vendor has not defined Zlib macro %s, usedUsage: Compress::Zlib::constant(sv)Usage: Compress::Zlib::zlib_version()s is not of type Compress::Zlib::inflateStreamUsage: Compress::Zlib::DispStream(s, message=NULL)Usage: Compress::Zlib::gzopen_(path, mode)Usage: Compress::Zlib::gzdopen_(fh, mode, offset)cannot use buf argument as lvaluegzread: buffer parameter is read-onlyfile is not of type Compress::Zlib::gzFileUsage: Compress::Zlib::gzFile::gzread(file, buf, len=4096)gzreadline: buffer parameter is read-onlyUsage: Compress::Zlib::gzFile::gzreadline(file, buf)Usage: Compress::Zlib::gzFile::gzwrite(file, buf)Usage: Compress::Zlib::gzFile::gzflush(file, flush)Usage: Compress::Zlib::gzFile::gzclose(file)Usage: Compress::Zlib::gzFile::gzeof(file)Usage: Compress::Zlib::gzFile::gzsetparams(file, level, strategy)Usage: Compress::Zlib::gzFile::DESTROY(file)Usage: Compress::Zlib::gzFile::gzerror(file)Usage: Compress::Zlib::adler32(buf, adler=adlerInitial)Usage: Compress::Zlib::crc32(buf, crc=crcInitial)in _deflateInit(level=%d, method=%d, windowBits=%d, memLevel=%d, strategy=%d, bufsize=%d Usage: Compress::Zlib::_deflateInit(level, method, windowBits, memLevel, strategy, bufsize, dictionary)in _inflateInit(windowBits=%d, bufsize=%d, dictionary=%d Usage: Compress::Zlib::_inflateInit(windowBits, bufsize, dictionary)s is not of type Compress::Zlib::deflateStreamUsage: Compress::Zlib::deflateStream::DispStream(s, message=NULL)Usage: Compress::Zlib::deflateStream::deflate(s, buf)Usage: Compress::Zlib::deflateStream::flush(s, f=Z_FINISH)Usage: Compress::Zlib::deflateStream::_deflateParams(s, flags, level, strategy, bufsize)Usage: Compress::Zlib::deflateStream::get_Level(s)Usage: Compress::Zlib::deflateStream::get_Strategy(s)Usage: Compress::Zlib::deflateStream::DESTROY(s)Usage: Compress::Zlib::deflateStream::dict_adler(s)Usage: Compress::Zlib::deflateStream::total_in(s)Usage: Compress::Zlib::deflateStream::total_out(s)Usage: Compress::Zlib::deflateStream::msg(s)Usage: Compress::Zlib::inflateStream::DispStream(s, message=NULL)Usage: Compress::Zlib::inflateStream::inflateSync(s, buf)Usage: Compress::Zlib::inflateStream::DESTROY(s)Usage: Compress::Zlib::inflateStream::dict_adler(s)Usage: Compress::Zlib::inflateStream::total_in(s)Usage: Compress::Zlib::inflateStream::total_out(s)Usage: Compress::Zlib::inflateStream::msg(s)Compress::Zlib::gzFile::gzreadCompress::Zlib::gzFile::gzreadlineCompress::Zlib::gzFile::gzwriteCompress::Zlib::gzFile::gzflushCompress::Zlib::gzFile::gzcloseCompress::Zlib::gzFile::gzsetparamsCompress::Zlib::gzFile::DESTROYCompress::Zlib::gzFile::gzerrorCompress::Zlib::deflateStream::DispStreamCompress::Zlib::deflateStream::deflateCompress::Zlib::deflateStream::flushCompress::Zlib::deflateStream::_deflateParamsCompress::Zlib::deflateStream::get_LevelCompress::Zlib::deflateStream::get_StrategyCompress::Zlib::deflateStream::DESTROYCompress::Zlib::deflateStream::dict_adlerCompress::Zlib::deflateStream::total_inCompress::Zlib::deflateStream::total_outCompress::Zlib::deflateStream::msgCompress::Zlib::inflateStream::DispStreamCompress::Zlib::inflateStream::__unc_inflateCompress::Zlib::inflateStream::inflateCompress::Zlib::inflateStream::inflateSyncCompress::Zlib::inflateStream::DESTROYCompress::Zlib::inflateStream::dict_adlerCompress::Zlib::inflateStream::total_inCompress::Zlib::inflateStream::total_outCompress::Zlib::inflateStream::msg%s object version %s does not match %s%s%s%s %_Compress::Zlib needs zlib version 1.x wwwwwwwwwwwwwwwwwwwxzxxxxx/ybyyyy zvzzxzxx{0w,aQ mjp5c飕d2yҗ+L |~-d jHqA}mQDžӃVlkdzbeO\lcc=  n;^iLA`rqgjm Zjz  ' }Dңhi]Wbgeq6lknv+ӉZzJgo߹ホCՎ`~ѡ8ROggW?K6H+ L J6`zA`Ugn1yiFafo%6hRw G "/&U;( Z+j\1е,[d&c윣ju m ?6grWJz+{8 Ғ |! ӆBhn[&wowGZpj;f\ eibkaElx TN³9a&g`MGiIwn>JjѮZf @;7SŞϲG0򽽊º0S$6к)WTg#.zfJah]+o*7 Z-%c%c%c%c%c%c%c%c%c%c: deflate 1.1.4 Copyright 1995-2002 Jean-loup Gailly        L,l\<|B"bR2r J*jZ:zF&fV6vN.n^>~A!aQ1q I)iY9yE%eU5u M-m]=}   S S  3 3  s s    K K  + +  k k     [ [  ; ;  { {     G G  ' '  g g     W W  7 7  w w     O O  / /  o o     _ _  ? ?     @ `P0pH(hX8xD$dT4tC#c         (08@P`p  0@`  0@`incorrect header checkinvalid window sizeunknown compression methodincorrect data check`€m(Yт     B[܋EA Rn. N `QURq1 P a! A PY S;y9 Qi)  I PUPS+u5 Q e% E P] TS}= Rm-  M PSUS#s3 Q c# C P[ TC{; Rk+  K PWS3w7 Qg' G P _ Tc? Ro/ O `PTsRp0 P ` @ PX S;x8 Qh( H PTUS+t4 Q d$ D P\ TS|< Rl,  L PRUS#r2 Q b" B PZ TCz: Rj*  J PVS3v6 Qf& F P ^ Tc~> Rn. N `QURq1 P a! A PY S;y9 Qi)  I PUPS+u5 Q e% E P] TS}= Rm-  M PSUS#s3 Q c# C P[ TC{; Rk+  K PWS3w7 Qg' G P _ Tc? Ro/ O PWS[QYUA]@PXT!\ R ZV`PWS[QYUa]`PXT1\0R Z V`??9  $) qT { Dd%"o|"oo o&hR)b)r)))))))))**"*2*B*R*b*r*********++"+2+B+R+b+r+++++++++,,",2,B,R,b,r,,,,,,,,,--"-2-B-R-b-r---------..".2.B.R.b.r.........//"/2/B/R/b/r/////////00"020B0R0b0r000000GCC: (GNU) 3.2 20020903 (Red Hat Linux 8.0 3.2-7)GCC: (GNU) 3.2 20020903 (Red Hat Linux 8.0 3.2-7)GCC: (GNU) 3.2 20020903 (Red Hat Linux 8.0 3.2-7)GCC: (GNU) 3.2 20020903 (Red Hat Linux 8.0 3.2-7)GCC: (GNU) 3.2 20020903 (Red Hat Linux 8.0 3.2-7)GCC: (GNU) 3.2 20020903 (Red Hat Linux 8.0 3.2-7)GCC: (GNU) 3.2 20020903 (Red Hat Linux 8.0 3.2-7)GCC: (GNU) 3.2 20020903 (Red Hat Linux 8.0 3.2-7)GCC: (GNU) 3.2 20020903 (Red Hat Linux 8.0 3.2-7)GCC: (GNU) 3.2 20020903 (Red Hat Linux 8.0 3.2-7)GCC: (GNU) 3.2 20020903 (Red Hat Linux 8.0 3.2-7)GCC: (GNU) 3.2 20020903 (Red Hat Linux 8.0 3.2-7)GCC: (GNU) 3.2 20020903 (Red Hat Linux 8.0 3.2-7)GCC: (GNU) 3.2 20020903 (Red Hat Linux 8.0 3.2-7)GCC: (GNU) 3.2 20020903 (Red Hat Linux 8.0 3.2-7)GCC: (GNU) 3.2 20020903 (Red Hat Linux 8.0 3.2-7)GCC: (GNU) 3.2 20020903 (Red Hat Linux 8.0 3.2-7),q$) 0#$Wq:)S/usr/src/build/148620-i386/BUILD/glibc-2.2.93/csuGNU AS 2.13.90.0.2Sq/usr/src/build/148620-i386/BUILD/glibc-2.2.93/csuGNU AS 2.13.90.0.2%%m# /tmp/ccnhFcil.sq,W$)3,:0,Wdd,,-:J# /tmp/ccqfJNVk.sq!::).symtab.strtab.shstrtab.hash.dynsym.dynstr.gnu.version.gnu.version_r.rel.dyn.rel.plt.init.text.fini.rodata.data.eh_frame.dynamic.ctors.dtors.jcr.got.bss.comment.debug_aranges.debug_info.debug_abbrev.debug_linep! P )TT{ 1o >o|"|"@M ""V d%d% _$)$)Z<)<)e008@kqqq@q@qF/ y ddhh0088@@DDcPXVr1 HT |""d%$)<) 0 q @q  dh08@D 0 '058CdV@c gs0 \1 4<d@p (  1 P38 3Q 33 #06S .6 9 8 ?8 J9 U0: a: m; y< ; ; ; < 2< :< U< < < < = 7= s= = =  > B> d> > ?  ? R?  ") 2i :@ G0 O@ XZ `` i@ q{x P   x P  >  }    t x *L 7L @` Mx Z`t fx p| ~     P  `!1 #u `>'  $ &7 (  . . ? '>| 0?f :8 I=p W_ih pC u$D zD D E 3E E E ;F lF F F G BG L bK M N  P P Q S HT T W | @| x @x Y % . 7  @  IT_c Y.d ^e p*f cg pg hi mEj rj wk | ? @N `R   +=PJ WF ^mp ?N 1P5x  $ 0@ !/h8P X` epC mQ D] p # m #3CP0i r|kH dz u D    5 Z T p   P  A    # 4 06 ; I? L $)R d 1 u   0C<        Xp ' 2 ? [ L P5 T @& [ s  _ 0   P@%   . G D T  [ 0l b `b@ v ? } )     5  P\ ' @u 4 ` ?  L _ bL q } 0 _ H ` b  , W0l _s`x& (  @- q '`U Я B` n` v5J"  " S) PI K  p !.?X Y`Dv` / ` XN Ck -  V0 _kk r | PG PZ  4q#@ H[J n`Ar y AK 7   0G  g 9@ BT }2 m  0initfini.ccall_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____EH_FRAME_BEGIN____JCR_LIST__p.0completed.1__do_global_dtors_auxframe_dummy__CTOR_END____DTOR_END____FRAME_END____JCR_END____do_global_ctors_auxZlib.cmy_z_errmsgtraceSetGzErrorNoSetGzErrorDispHexDispStreamInitStreamgzreadlinedeRefconstant_7constant_9constant_10constant_11constant_12constant.L111.L110.L113.L115.L117.L119.L121.L130.L129.L132.L134.L135.L143.L144.L145.L146.L147.L149.L157.L165.L167.L175adler32.ccrc32.ccrc_tablegzio.cgz_magicgz_opencheck_headerdestroyget_bytegetLongdo_flushputLongdeflate.cconfiguration_tabledeflate_storeddeflate_fastdeflate_slowmy_version.0lm_initputShortMSBflush_pendingread_buflongest_matchfill_windowtrees.cextra_lbitsextra_dbitsextra_blbitsbl_orderstatic_ltreestatic_dtreebase_lengthbase_diststatic_l_descstatic_d_descstatic_bl_desctr_static_initinit_blockpqdownheapgen_bitlengen_codesbi_reversebuild_treescan_treesend_treebuild_bl_treesend_all_treescopy_blockbi_flushbi_windupcompress_blockset_data_typezutil.cinflate.cmark.0.L35.L39.L43.L45.L47.L49.L51.L52.L57.L59.L61.L63.L66.L67infblock.cborder.L21.L36.L48.L76.L93.L127.L136.L137inftrees.ccplenscplextcpdistcpdexthuft_buildfixed_blfixed_bdfixed_tlfixed_tdinfcodes.c.L10.L17.L28.L44.L72.L84.L89.L90infutil.cinffast.c__dso_handle__i686.get_pc_thunk.bxXS_Compress__Zlib_gzdopen_Perl_croakgzflushPerl_sv_freedeflatePerl_dowantarrayPerl_croak_nocontextPerl_sv_setivPerl_sv_2pv_flagsXS_Compress__Zlib_gzopen_gzgetcferror@@GLIBC_2.0Perl_Icompiling_ptrXS_Compress__Zlib__inflateStream_msgXS_Compress__Zlib_constantvsprintf@@GLIBC_2.0pthread_getspecificfdopen@@GLIBC_2.1_tr_flush_blockgzopenzlibVersionPerl_sv_setuv_DYNAMICPerl_newSVpvf_nocontextgzerror_length_codeinflatedeflateSetDictionaryXS_Compress__Zlib_zlib_versionXS_Compress__Zlib__gzFile_gzsetparamsfprintf@@GLIBC_2.0gzsetparamsfflush@@GLIBC_2.0Perl_mg_setPerl_sv_newmortalinflate_fastPerl_sv_upgradePerl_stack_growPerl_newSVsvXS_Compress__Zlib__gzFile_gzclosePerl_forminflate_flushXS_Compress__Zlib__gzFile_gzflushXS_Compress__Zlib__gzFile_DESTROYXS_Compress__Zlib__deflateInitXS_Compress__Zlib_crc32XS_Compress__Zlib__deflateStream__deflateParamsXS_Compress__Zlib__inflateInit__errno_location@@GLIBC_2.0rewind@@GLIBC_2.0Perl_Tcurpad_ptrboot_Compress__Zlibftell@@GLIBC_2.0XS_Compress__Zlib__deflateStream_get_LevelXS_Compress__Zlib__inflateStream_dict_adlerPerl_warn_nocontextPerl_Isv_yes_ptrgztellinflateSyncPoint_initmalloc@@GLIBC_2.0_tr_stored_blockPerl_sv_backoffPerl_safesysfreeinflateInit_Perl_sv_catpvn_flagsfread@@GLIBC_2.0memmove@@GLIBC_2.0Perl_newSVpvPerl_sv_setpvPerl_sv_2mortalPerl_sv_2uvinflate_blocks_freePerl_newXSPerl_Top_ptrdeflateInit_adler32zcfreePerl_Tmarkstack_ptr_ptrXS_Compress__Zlib__inflateStream_DispStreamXS_Compress__Zlib__gzFile_gzwriteXS_Compress__Zlib__deflateStream_get_StrategyPerl_Isv_undef_ptrfseek@@GLIBC_2.0zErrorcrc32XS_Compress__Zlib__deflateStream_flushinflate_maskgzseekgzreadinflate_trees_fixedgzputsstrerror_r@@GLIBC_2.0strlen@@GLIBC_2.0deflateInit2_Perl_Tstack_base_ptrXS_Compress__Zlib__deflateStream_total_indeflate_copyrightgzdopenPerl_Ireentrant_buffer_ptrinflateReset_dist_codedeflateResetlseek64@@GLIBC_2.1inflate_codes_newPerl_get_svXS_Compress__Zlib__inflateStream_DESTROYinflate_trees_bitsinflateSyncXS_Compress__Zlib__inflateStream_total_ininflate_codesPerl_Gthr_key_ptrfputc@@GLIBC_2.0__bss_startXS_Compress__Zlib__inflateStream_total_outgzclosePerl_Tstack_max_ptrstrcat@@GLIBC_2.0XS_Compress__Zlib__gzFile_gzerrorz_errmsgXS_Compress__Zlib__deflateStream_total_outzcalloc_finimemcpy@@GLIBC_2.0deflateCopyfclose@@GLIBC_2.1XS_Compress__Zlib__deflateStream_DESTROYXS_Compress__Zlib__deflateStream_dict_adlergzwritefopen64@@GLIBC_2.1inflate_blocksPerl_newSViv__cxa_finalize@@GLIBC_2.1.3XS_Compress__Zlib__gzFile_gzreadinflate_blocks_resetgzputcPerl_newSVcalloc@@GLIBC_2.0gzeofPerl_sv_growPerl_Tcurcop_ptrinflate_blocks_sync_point_edata_GLOBAL_OFFSET_TABLE_free@@GLIBC_2.0_endXS_Compress__Zlib__deflateStream_DispStreamPerl_sv_setref_pvinflate_copyrightinflate_trees_dynamicinflate_set_dictionarymemset@@GLIBC_2.0inflate_codes_freeXS_Compress__Zlib__deflateStream_deflate_tr_initPerl_sv_2ivgzgetsdeflateParamsPerl_ninstrXS_Compress__Zlib_adler32Perl_sv_derived_frominflateSetDictionaryXS_Compress__Zlib__gzFile_gzreadlinegzrewindsprintf@@GLIBC_2.0fwrite@@GLIBC_2.0XS_Compress__Zlib__deflateStream_msgPerl_Tstack_sp_ptrinflate_blocks_newinflateEnd_Jv_RegisterClassesPerlIO_stdoutfPerl_sv_setpvnPerl_safesysmallocinflateInit2__tr_tallydeflateEndXS_Compress__Zlib_DispStreamget_crc_tableXS_Compress__Zlib__inflateStream_inflateSyncgzprintfPerl_sv_2pv_nolenXS_Compress__Zlib__inflateStream_inflate_tr_alignXS_Compress__Zlib__gzFile_gzeof__gmon_start__strcpy@@GLIBC_2.0FILE(0de27bd7/auto/Compress/Zlib/autosplit.ix#line 1 "/usr/lib/perl5/site_perl/5.8.0/i386-linux-thread-multi/auto/Compress/Zlib/autosplit.ix" # Index created by AutoSplit for blib/lib/Compress/Zlib.pm # (file acts as timestamp) 1; FILE!bf8d4b27/auto/Digest/SHA1/SHA1.so^ELF4N4 (PIPIPIPYPYdIdYdYCJBGD)E=&$0CA#>F?;2I<35"@ 74:.,H8!%*-'1/(+96p 8 h      D D PY `YdY,Z4Z Љ  A~ʹt&x111AO~ϋEUMERI@ !! ʋMA‹‹yZ!! ʋʋ‰ЍyZ!# ʋʉ‰™yZ!# ʋʋ‹™yZ!! ʋ‹‹™yZ!! ʋ‹™yZ!! ʋ򋵬‹yZ!! ʋʋ‰ЍyZ!# ʋʉ‰™yZ!# ʋʋ‹™yZ!񉕬! ʋ‹‹™yZ!! ʋ‹™yZ!! ʋ򋵬‹yZ!! ʋʋ‰ЍyZ!# ʋʉ‰™yZ!# ʋʋ‹™yZ!񉕬! ʋ‹‹™yZ!! ʋ‹™yZ!! ʋ򋵬‹yZ!! ʋ򍲙yZ11ʋЋЉn11ʋЋ ȋЋn11ЋȋЋn11ЋЋn11ʋn11ЋЋn11Ћ Љn11ʋЋ$ȋЋn11Ћ(ȋЋn11Ћ,Ћn11ʋ0n114ЋЋn11Ћ8Љn11ʋЋ<ȋЋn11Ћ@ȋЋn11ЋDЋn1H1ʋЋn11ЋLЋn11ЋPЉn11ʋЋTȋЉ !ʉn! ʋЋXȋ-$Cp !ʋ! ʋ\Ћ-$Cp !ʋ!` ʋЋܼ !ʋ!d ʋЋܼ ʋ!# ʋЋh-$Cp! ! ʋЋlȋ !ʉ!-$Cp ʋЋpȋЋ-$Cp !ʋ! ʋtЋ-$Cp !ʋ!x ʋЋܼ !ʋ!| ЋЋܼ ʋ!# ʋЋUȋЋ-$Cp! ! ЋUȋЉ !ʉ!-$Cp ЋUȋ-$Cp !ʋ! ʋUЋ-$Cp !ʋ!} ʋЋܼ !ʋ!u ЋЋܼ ʋ!# ʋЋUȋЋ-$Cp! ! ЋUȋЉ !ʉ!-$Cp ЋUȋ-$Cp !ʋ! ʋЋUЋ-$Cp11ʋ}bʉ1u1ЋЋb11ЋUȋЉ-*>511ʉЋUЋ-*>511ЋUȋЋ-*>511ЋUЋ-*>511ʋ}b11ЋuЋb11ЋUȋЉ-*>511ʉЋUЋ-*>511ЋUȋЋ-*>511ЋUЋ-*>511ʋ}b11Ћubʋ11ʋЋUȋЉ-*>511ʉЋUЋ-*>511ЋUȋЋ-*>511Ћ}1ʋ-*>51Ћu1ʋbʉ1ЋUMybʉAQ AP^_]Í&'UE#Eg@@ܺ@ vT2@@@@\]ÐUWVS"7Uu} B9sE@EPUBB\t[E@)E9u~u|$UD$ED$UEJ\)ƋENjEȃ@B\t[^_]É$E?E~/|$E@D$@@$3U$?Ӊ|$Et$$Ur\떐&UWVu }4$jFFGGGFGFGFGFGF GF G FG FG FG FG F GF GFGFGFGFG^_]UWVSV E6Eu EFEMF?ED1A8D$@T1$)ȍ~D$-4$e1EFTEFUEFVEFWEFXEFYEFZEF[Eu E[^_]D$8T1$)ȉD$널&'U]SB5uu$$$t$D$ztA@ t@ ]u]$$$D$'΍`$UWM VuSß4~9s2ЋAF$ЋA9rE [^_]Ðt&UWVSVE4,}u GEGGEȈЋʃFE ‹F;}t9GUȈ ‹ʃ?FFEȋFE ,[^_]Ð&'UWVSu3\U E~x$ED$E$$$$$E|$D$D$4$\[^_]ÉE҉t$ED$E(|T$$qUWVSÕ2,$p$f$$EM$C$$-$#$2$4$$)u)ʉ}@}E$$$U4FA@EE$`%$g$]$e$G$=$U4$!$$ $$U4$|$ D$ED$$$$UH<$o$$$$s$i$AU,[^_]$C$9$Et$D$D$ 4$c$$$D$UWVS/,$$$>$E$$k$}$s$;2$4Q$G$8)u)}@}E$$ $}44$E$$$D$D$E$`aE$$$$$x$P4$_$U$G$=$U4$T$ D$ED$V$ $$H}u$$$L$$$|U,[^_]$~$t$@D$2UWVSve-$@$6$$E$$$$$2$4$$)u)ʉ}@}E$$$aU$1$$]$S$$=$3$ UD[^_]$ $$D$UWVS+,$$$N$E$${$$$K2$4a$W$/)u)ʉ}@E}$"$$U$EEE9E|P$$$`$$$U,[^_]$$$`u}@% =tx$X$N$@$6$4$D$ED$D$UE$D$EE9ES$$$@$E$$$$$D$@UWVSu)<$M$C$8$-$#$$ $$ 2$4)$$)ʉ@$$$g<$p$f$X$N$&4$DD$^p <$'$$$t$|$D$ 2~|$D$ $$$$t$uV$$z$$d$Z$2<[^_]Í$$$$ D$UWVS&L$$$N$E$${$$$K2$4a$W$/8)u)}U @}E@0E$$$U$ƍEȉE$t$4$EUD$$X$$$U4$$$$t$j$BUL[^_]$D$:U $D$@4@$D$UWVS&%$$$k$\$$$$$e2$4{$q$I)\)ʍM\@`E @0 $PX$$$m$tm1\Lv\<LtAX tXtT$L$T$1ɉT\9TPh4$D$%X4$T$$E$;$`4$$$$$$`ļ[^_]É$$$T`׋@% =$$v$h$^$64$D$dD$D$Pd$D$/\T9T7$$$@$d$$k$$$h`@% =$^$T$F$<$`4$D$dD$d $Ǎ `L$$$`@$d$$m`f$m$c$;`@ d$:$0$`@ t2 @p,󦍋L8UWVS  $$$+8$$$[ $i$_$'  2$47)$($)ʉ@O$$$4E$H$D$D$@F% =$$$$t$D$D$$} $D$[󥍵(4$D$5$$$t$D$$$$4$$$B$$$r [^_]Ë@$$Z$P$D$&'UWVSF5L$$$$E$$$$$2$4$$o8$)uE)}@E썃E]$S$+U@ $-$#$U@$E$$U}E$$$UDEMtAUBc@E8Uԉ`$V$L$#D$D$ED$ $$U$5D$T$ D$$$$ID$D$ED$ w$$U$_D$T$ D$>$r$h$qD$D$ED$ $9$/U䋳$T$ t$D$@0$$$D$Et$D$ @0$$U$T$ t$D$T@0$$u$D$Et$D$ @0$=$3U$T$ t$D$@0$$$D$Et$D$ @0$$U$D$T$ D$X$$$$l$b$:U4$F$<$$&$$UL[^_]$$U؉$D$EԉT$U܉D$ -tRD$}܋E؅to8 8 0M h h xV   _ Z e5kDDq2DD yPYPI`Y`IdYdI,Z,J4Z4Jn3Wa&6ԓ?O.@oף(Mn_q.hz8Mۨ\GjF%cZaN$}L:锖;J 5QKIaxid0285:7J&`sg)Ge"357qEfCIr" ޚ%YHȅXYs"X :8 AaZ ҘŁJ̌qG )5 a*N-5ڊn\c S67}U;]WK| m?!fAV BV;҃l'w( VB"OИ˿/3eW\0;0qc?󧥪y<)B~_Z;A,{ZD3 p W=Y^~dqB F_hLOiً̐ ;}` xW M:rs<”AG:ZߠSĺ &{ʖոGS@֔z/yvi=jPQz^NЪeFB%̳_1ա3bZEwVj5Ujwx ͺۻ?uoCzD_'Fg/)[ǖ/I#)^zrkNT5;At؋OΎ=??Z>c*G?||kgUͥ`,yְ5/docb/aпS % %=8(?әLbLὋC+*8!TFx:\kBH=+oB> cTl'W YRwRƵ]m [MiBX2Cz닎©+Mi~iai~iYbW _0D!6D=J>N!j q/*tH^~ 'Trt0 ?} J~7h{穖]0Uw,1E<(p!$tO1hsK7@榿YSmO .bdq@^7g|~h ,bi\nÆOZ\Aa8x5&Ho)PлUݎ!e)kͅjuS{ wTąO ;X{y;6$]G\5H-p~<\_G Gs!΄t_lb/\\ӝm~Kk~u|V6AySuɮt/vʫIhRۖ_807¶/*ZyA Kl-I^o-ݤ/.;Wjk{#VM{Nھ{I<THHo\"M̲#AgH)&|IXG!^)L}٢G&{zcӷyҎZ[[+ȱkkwy˒UdF˂,Q*Rn!Yܟ,6d(%j>rh}uTw|L6uxl<,P PKOr0"02 lib/BFD.pmUmo0ίQ%MOUߦJS-aݐ ڦiTe}gCs.{]]u*2'\G}2t#8Ǎ=Vl#}>Kaf4 'JH EkISՉ~za.$rNÒeI#C$ I^! W! ̓0 ` s-4seJ%J;[5nм}8ks&R Jג&@4LEYaABgPaU6_kNr>l X固P%:7uv6G0lnKRe YRWp"ǸXe 5ZRFDȨN3\(:GsQC"xG/ JԺt;e^w7 ?Ll,\8ow)~ǜ4f*&%ZSv4,7~v+i.7o[Y\Ebz.x2NV0rS0ր%TLPy]klŴX}i]%i#V1ΕUG{ۿ'[_|9*ɴ 3PKOr0}&Elib/Graph/Base.pm=WI?68N ݙ=kݞ𿟤!egT*T0|a>$oF^ֻ=~wƩ, Yw!^sʶYGxI6v9z߄g}gFqIw@Wh-k E/0Ɔw4up =mZ9Z dAO& .nOlDЬ )8)v'M@-a{sN{O"$[nP @3:SMvO)HԠ, 5056='Ng_{iԋ2/I;1R,Uy-G>?W?kP_-9DvQMP 5u=%cM5's멟rFA_#񧜗p?.~ AFa`gPDp:զA9OG!HcwVZl0c"q08A`^KBe$_|E{Tս@.|0D &'{R@i[b|5OA~z_>4ұ1sH?e2uO75>c;/n>C?Ŝ @\b .+{'|6yx1򇚪Eq!Y]yT ;B1`?/aK4{D3W F8~-Hbl5 =iv$@Ӿiyu%0p(!o+Xб"k15X cQD?NJ8&fwrDq)H6&MXoq$Y/Ņɽ#_~;?y`ՋȨ 7WpYLSoKH>{- _ұPIHCSf:)j21$c*Oё}[ɃxRxbiz8NvqӘu.ЋAtu?? Z*I^ 5{hRNLF¥*A]~QdMr.6L";Uڏpl[h|s= t6c.x>rl[XT:gI]AƫxW\L\WRv SQqŮims{b~kdF&eKL1-UvŢjFQ5˰HTZ4))38ITBA/v0RG71d7R42iH(R!pL1jKvm CH'FUwƞA`leɋc^; r[0`Za4bdO b6Lf(?(pP̞6E l\A`gvy[z)Pt`|4PtE :+ ZS3pL`v+jhb{;*3a&?P" f^$Nfp1̵3Mww`ZV] S|ZnTXi}s"@aI+?M 4޺hCqh3fM㭣'hyJצ |dدfC|4~Јf(vei$$iN*,TB~:.R+چ`tB lLڲc5k w#ً= [bnofxێ?l [.fDiÚ % } b1gZ5%oBwȬ!e$і'b!@O4un烴~?'mԱfc|Za 'C%m| CfM?e~ɗ' T),h^ǣJU..tW!sp8:Gu0׸(|>-3bS0:=K:X#3n Iy5JGQdw0Yb.oNKXT'`$;ҟ/~M;z6-zMz+-O$$96ߘ$C'ɤ!4X&X(xnʺݶ tv,:7%w%s fS-+= '>VÒSN)L7j 卹VM3/Դ7ʛS5AV$p0F99WSD+=ϕ=IQ Y5 cZ9\1{2+bUjAݵ=M1#vп kL /JGq:g 1Lc/ # 'X t; .x iQ#6=$H& =ơV5eX"JF6v|-*=l{/[R@~jtr**u Xu*hvH32ӎg]<Iη'j_Xwn jh[n^S$D0عC29[9[9tG4.H*xtoX Z}m߁TgGk])r:J7Ͻjvk @L +Ō+̂Y8= ʫpx3@LPE db:'9LPX[}chun`-?բA!>|!'ޚPAUba^hrJ3BY2BQ?,Mt`8e9<|<ɝ7d?#dc!NEȢ 2U T djmu=* ֬\؋E>HyjGUj0U.=+G"2W> krQ-Y''ί7lD%3O6ٺ)}r*Xx~,2~@=UE/2%T(.干T5L_~aL{'58%Y@M8Z1T⒪5ڜm b/`V/)fjfѭs2_{H:Ǯ-Fi:ӹP]]fJSRPpgvNV3Y,mɝg̎HŰD.+Q[q)LBp08[jNI~e(O@HpOQ<>fŠ뵠u>}e]U+VGG8x.>j&*>A0k,Rz>eX!QiR{!b:1Kh f|5me5Ӑ+ e ciJ/qPU(qC_1x"&e?jW ׿]h9 b%,`4\w8VVLdd;E[h0̄"D‹n$da-?0h2f  PH xH_;uB-vZd`ygq2X3%p"Y<Ҫ2e0\fGtETiɢKl 3k F]w=Ɣ(j0+wYEa)ػ: >х39@9~ (0ˁ1xfIb*3%c %5aп'̏O8Ky aЏ) Ia=G9OqӘv.EJ㻣P}ZsLV M]sʳ 6W1$タ5T@ AZ8ވV,?rC;箇sGti,Gl+MvӰ#Xdk8zwM0 pbv_DD-6iնwVO9]ǴZӍ7e _eS)$D!Ҫl4ͨ",{ aVRjM|єb罦&LJ<ճ8fq?-G3ߙ^ٔǍv7oqQ%9w=Xo/hۯ'n;ĦS-+7I£Ӧd4 y(5F#f]wtphќ'mK/ =@}btǷbS$_Ʊ)=Q;b67^ߏwˢ] n@D/y%NE3Sp2ŠpO9Y 8V-rcS Gb1JUKM0n'9~TR$ +sw |{s~oZaa;o ?^;ZI#S~-%P %Pll7ݍlw#!܈r?tO 6)mcA>(mD) Qlw'4^ި#/ڍp\A6lfn3Io}P9۹"m sZAFw ǃQP}0:b:%h Mu$ Ψ%[ SDlj[{vԿMa.*O~#8n ZzMM1%2y|F=whG:c>sǿFtoY:nL6 `i^9Fc6O->ZIdRʵ =y/|[@@>=lՇձ*3 ~6?[wڨm?\BGȟl`/z$3}Z~j8E;=0 ̌shd9h/oϯ`'ۃ"~?lki!U2*DTm2gʸK!P'=_ GPIej_ByKf>H1YE>2?e hW %@ +޾!b6.]~S^SHxC^vh:#oD{ (tOi2(xB "}YHhG;`Uov|Q|>Mk% **J0pI^|_]zGGG=:=ГJjVEIhӦPͰ)x8c,IIƋ>-¿PV|>McK߲g30xrf)ÐЏk )/ ._WQE4T°\F8yl~eY'U,{[oe⼅MlS[VP')yz)b(WkRw|hnk*b?Z*xlZ [0bYYlY> !)r;e9[R,eF5\jA¦WR.EotwJ,Ii9bҗ&k9+:-!˭C #Er#I8mb~}RS_*W~p}\c_Zh[%]8D}K5Hsz?.YVIlN]Ereg%K|4%3" ߴnϽOF5u˙nQ$bq pxѕB᜶8[> 6ǂGS߹RG<zѻdI ш-Џ~t*LeYWM),'o|}gLT1];%xw0΃s|.V]/JWfԾ ڸw]ĊӴ0N[gQpQ,x(LiQ1G:r vp.eՙ SfDST0TF䍼>I OJjWW(fj-,jWWw\؞o`>־XrJHx|B|ء'Y?+,bbAdzl6+8TGr,D #K-.kBWrjW䍯bGڠD٣6GեP@T6(5 K}7J%~ ^('鎷ڄSwLe%oeІGXDE^0D}W+ݨἍxaӃ&qP B'P# `w#/zA~{3\"\5 (FRlցE8x(5Q8ۼ:f։&ۀM&w+֟#ȷZ EУ} TzgYiAX"BS"XbQ"—0S]>G@d?BheLC̢[,\9-rՖ}:߷e.MNM_=pϞCwڠ&G0rgZEɐ Z,{c`X{|za{\;#0rW~fX?5BPKOr0oۢlib/Graph/DFS.pmuQK0ǟwև :|hY |d![YWCJImvyH/M_5+mqS t4 -*#`J-y:r}~`Bz\3m}&oYDM\$MyaA"'4x\1cdrggθUM{ F8ǟAGyK,Un^o㥬E)~ 4Xc̝Av99]/PKOr0Մ#|lib/Graph/Directed.pmTQO0~N~)F"N TBB c4rkkęTUΎ +b[^}绳;}Ɗg\af0QX'#8`aXim02c_#NFoY2*]ܞ.'4XD%$ Ɋ9 q?~?(pvN MFC->˂HASB,([ϺPJT)e%uY!2Y. ::/ᴒj30QJ]M&giM:Ϩp}ݖ랤2Ha97~VP[[ sԮ#<6%qE˺:%|=odN%=VU8rm\ {0?EB, <ׅXC_gǿ`riTձ-݇"w:^L? Ӑ0e&5E7)+IݑQI\PFao4AeR&v9Aȵn6p[elQu-ϳ8ڙTȲE&E TvRega}%Uе^=܎P*̱do;]UQ1h_Gch/8Q$:uq3PKOr0lib/Graph/HeapElem.pmSMo@W[j7Pz@m.mHD(238v&D̾y3> x.*jQ>+ Kn,Y4oy]ۻoNWS07@AM*5 NVO <: ÝgFZgO-(+"T'e$-efZ,'cf`=ASDcm Q`͓QyR -#J=ι+l].ݵ~-|ޒnėHg?=Q1 \YNHGt^OgRG@wU)HC&,9Pz 0l'<f:jeh1.HX8_EIEv]%,$[X)IgXDVGzc%5"\fcY.²y2SU@[q@!ZWYQq/c402gJlޚ Zm}T0 eP)&>!e<}G*kKX(Y*`f(he֟S]}ohc3.V0ѩuĉHi" B V*bLӻY e ՠ i0Þ@ :pR6TMT\&|DNYajʚ,ʿu9^ 2Zye!> 9$$j{NMK22 I  969Œ_񄠬6ך8%N!u,2|Cj:Jk S$nU,@_ yƞJl OˍD$U K=3=N-1v(kՋ:Ct~IKե"޲00"ynS'*B^$/y*e,RTm,W.!<yJXage!S504M,E[{ E{6t89 W2+0Pid㮇 ]|6V8&+n/b}MfטsxT7n^FuVk|1|;KxM ]]JgP"XMX )2N<GPKOr0H2lib/GraphViz.pmWHSL6ev\ئk kyN2Iulv>Iw}4FNYŋ_oوoΙ64KI֥/I׵8|w?a^]_^$ d|*{|LJW&g^rv` I—<4el,X"d 1`;b߯^s}ۍVXg[18™?^`gXby.Q(3avqsqS`(Yz3NA1m"6 31٥gA^ZH{K7wtqyrzί89szr&gWoq#"Af N%Fyr~uz<8=A5 h/`H<|歂 DW*UVӻo6G~Ui5M'Q%5ܼ9;xe+_s/2VB ӿOom4k- s-^ޞ-q"ۂCN||蟝+{b f_^^ S% 6[/|Bma*&!@%S~ [SHʁUȩDV6xlkHGĮ.hA28"R-4ӦܗPOz-Mv :I b—PtP!JBíհv gctJX+tNo`C>yd'_Y?L[qE&F7uݟ8-jcU6VSQ!G}gBm-a Ӥ6/,_3rBĞF)Cjv7 XU [8$Mȗ3d>i`1X̫bԢR(FÏlw{_W^|pXŦpoM`(`%8 V0AE"3.0nx$ȗ,I>^gv[m˯ʪ9JrSˊ^J;V; ^<84 bJHJ~tt?~{Z8?"zDv}pbS̅5}? 8D,@9k(76&( ,jȄ(eƸ~2ůoB=p<#K<ë5*JyRYHo7Jߨ-.5K㳵6m#{Ck*"!0kDηU тSMC#@r)-Vڧ([ Cu[f,1q߹8r}5.lԉ*'!˛qekUbUXefQ |0vWS6OȢ+61TX>8oA_PKOr0RZ lib/Heap/Elem.pm}SMo@WL!R@."%U QU -g{*̼y3]*:Hԟfʴ.;I-"Dt48I#8oUZXMn~-_w1\KAYOm';>!FȈ%$ijxޠ%9Ё!sPb GJʺǢ&!ʜJr^/cK:ZI #VYJc 6Jk[,y&QLYnJSf$AT[rd2m!VMwaٸSnqH\+ThL Joo27Y|x@Lqo܄K`~p'rg>"}I5+[QB;epT_l 7LY ##ʻMeR&Y8}<z8Xʼn֪ʊ5NłlG܎!MT&XFM)~ hOE>aPKOr0PXl $lib/Heap/Fibonacci.pmZms, 휕N9e46I2v"!1E2)Žﳻ J]r`vgA_YaԭgVe8JzcM|-e:?tm䟯7ߨW_z_߾wo36zKU֍ȗmS 1 ys)U*#+pPtUnԺݒNMq$SW/n~ cmmr)Q[ӤebզT v[r1+^xw)TE*hr;T;_Udņ|<> / Y##8)Hϒ̲=mv%XRIM;6Lt-Ƈ3Lݦ&~ O|P;[Aވϒ&Œ|+]U;u%qYFƞ_z`ϓ (DY +[/csj<ݱq*J8Ȁؚzhջ@9@j<巧c~E|f"7N ;:+ {T !>ElH&YQ-=+#=9Q2ZM,Y=[&m |&~E@RFJrjWΣ;>2S''4s&ىlU->E`1J#Lz 5+uʩMl.NCW7reS.'z1°IPPQ:!P},&5L)ARԔPG+ +,4LҔDmj Vk/ R?`BVeTG0( m%I6!b]Q942OT^nhexFUU -ɉU1Hܤ4jx>vj^fb jo0Bx#GIufr`Nba[O \OyL!=Sq 'n>T^GYF43jsܐ-ǯlOҠv"3wZy' 7+HU&W􁿳%N<ȆU\j=/D-]h=a`.83 }ډTqdG~0D-Ơ1]?v-F;"OZ`x J x%,Kąyc5VNv b>C[]PH 9W7_-@KPKOr0&!VAlib/IPC/Run.pm}{HSN81@&ېKp{*ƖܒLȥ}ϣRv陹˯Tuԩ>+8Ħhy~2KzI1 WE$Yvc"ӛ,,D{?8?YGtL«(sz?Q~$8/|VDb L(lt$~g??EIcfv>0ʫx%y$Rn0\("N1QXᅦ6V7Oomqyf09ѡF+>?G y M>EI%h 8MpvE\@t&7tk;Iq$ @lI8&C'.ޝG"MYt؛&Tb5᫳8Ί cq$͢MSO~H N#Gr\_q Og *?͡,.,UBLg)q*/U<Ȣp$.NEOtV8ͣ1/~~nhF 06MkNr%rP0\^]< ^p~:k-%L[bgW|Gx0zN]k߫qi%1pMI.~ )7ǧA8ELSyMU8r)H x ;ȢfqfGx{tw#n $8z"IaVb=ͷ~71#c[l=?'@ !j2Ol[ln7 Hbx\z W4_``oZ z_umZĤVW?+b/0J $29.ǧvrr 6E2yI[iH(Г#4hT\6DϊW$oN i3 q 0I ASY^gLA8g)h&&D9Aχ6, .PLt4j&7ōP+QNr̊hN pj-m3/E{/qZSNr< msGVxq&` $ }gVc@),Y#$`lH'h IRuEEzѠ>=;;݄Q:+l: 6D­{k5oI$a\鑔241&hЫ dL@ CgǷ?/]D|/n/ǁPӳg=/Gσw'xYPq!0cdG8&u$5DTGY, L[XOo p+[ý`ЬN{@uTBp #ӐH:Ť^]yTpE0Q_h@2 2[2, t>XuI5IV֤`L%@3%N+4;E14Z rNH+nCEZ7+';i,|YsU&A'ϙ"tp"inb4/ΠH=L[<> a^X#n9pK@ʫڗKb'R6SL>s Supd7U8b#D(}h J3Pǣ!,|ٸg/3-nҊy߻ ?%6s8(^x _ߪվb4D.:D)n WPRs$>Y:MZ1H1@tM3sg.t:c&ŵ+r>No3WMLJ>d:KߔsHh^R@h} o8KgRldJdEJlSn܄]:!b KTL;FL˝$W8Y%}pXy-|Y ]or !-g\xA"'X䢧qx;:e8,iik@k FC歳e j5<89e>&F2l7 #Νo-Yp>#?m;<܄ l-;aՑgM3[;⇤):NuUOи\w3m 0_g'ǿ0<ψo "W@gBW1?h0ciLL@2Bȇ0@zFb`󵪅3e<*r;bV(Gnh"z:"k' IL>8{yFHga0k%'K~pLw(:gOvGY@792jv.N|Hl!4a [9;-O<ǖ|tiۯRh ZW?wlS ͆#-װs}h{ -}QR'tK pꌒ0i'eD vY^98Ǘ7{g/Vhw;Y,znAs4mb\ތ6ukvB-AYm[(*$hn%Rdix%DFxi'Hõrf-w0Ed"#wjϞ_Ls_t0$p ~AZu'7 >׼έ}Dq\F&V <4;d:zES•]D37p 514@8jDYWA6\1KHg] $f8G) YŜ,b-e+]Y)FrSױ pCͼ!qx3=MT,&ójiI2@:.~å miۮX$° EO3pz3mv5;X/ix`A׹MgonqKs4OA`1T vD`H7;fvbC|U8?NYqmiL~~[CJ{*A8x(jQ [!biy: OiF}[ ylOـM0,X47UX:!q;X>|5*PR:145*Ɩ\V<2z<fQiڌ+ H$ˬD&z[ՂMEA]SxDi4iq{<ۀ'uqLjP7qB}alV,lT7`E6Zbo!К!ݲjp0V͆(- 4ْf^U}XUaGuXIf p`r_ο*F/ҧ>m[ԩ{q-jAZahĈnj֭ (Ak2J#btv[G= _ٕcշzt|(eDSڛ„_Gκ<+GKi{jA~Mznz+P%vq^? %'hMlԔ3rjYs684 !/)~*2L0P| dz. tŨ kwL cxF3Ǵ TT?F_eД^%sqR-Z9 KI/lHT~ϑ'yvi&eg6>RD۰;4G'NJ;)7:;y{iEOJ9Iޛ7GN3~йFIJ+6v˫&sxm7+:}7_XwdTUʣ4c)L_&svȢ)1 PӼ+Gb*JVz asCC,^ra"A(@=( Vf^r!$/*Х`AF1Rn IBpF#FH 8$J~&QL?YOb?$$'P6AG.M$Ux?*٘#:Y[<<銇"DtmH~[q0Ijo/ݳswYNƍ Q'.ށOfsbh.N&9nzqm؁ ރ_䓽nHǶd/Ӄ,;xt|?NI7[ {^wtћß++wk!s@tB]6xI-nMI"bG=^MԉI;hިlfhFGd d6 + MaP\͡ԶWUqZ-K p1nt,f :u&ʏ\Hrdd({~)@uS` Hw] =1.sc< >3CM?,Hv˝Gq?xn*Lwt[vKyHrjOюy[\mrȖ'u+1n>SC66\F,2["Cd@^+6X5@M(7Ǫoax4tgh(e6V!-59IJEDZ HI1p&pGl3̛1娠PK%gQZDy_пS BfUq^KmH锝҉F0S_OIBv R@"(*'FɚΊ눂0$0yFG3: q < {/'^N&]q1Nђؕv3` -r; e82mTsr-N7&G䐼Twx>:aoYiV-f\$ 8J\_wإ",$[? q5Bz LCj ITN;Lo~8E:/Yv;Xc9dhKz8@ l8 A O/Nnu  =& <E\VFaTx$~Km߫K \(tL!DIGdiqzKRR@4fÔ[KAf{?3Yo *]F0.-"Aᑶ;A"ǧG [{{j-‘BFZ@!{U:GnxA,j3*2LVy8 hKz"F7S5dڙlܱ?\^eChZ˜tAWZ2z* 5P0{!h TyF@cp;40^p(7Qاd[]v"c? SйV;g`XY_pkC'srf_ Mc9kCSwJm@(|B$EDf/33;+!yZ?jV^;'5[9By܄-RjliSHWb k;3Wjy"runw$zR w)+w^P 2@=Z3ZdچwWwO#$(΂篎Oczo`Uycbb9iz$@pdzES] {.eVh=/J{w)(:^*< Gq.XHw|n^?dÚ-1Md`A3F4$F }ZZ˧<̴ǿ _ {QG0?^ðnz'( Wq(\ԗ zp/ )A/!s}5?dc)r,|wm/I#y/6g #Gf~zF,Pݼ{5ѿ~Wo.aYV-V=c׃ׂ\ #Zr3͢ӷ?,&b}TN2C:%>UE8nDI qh%Dj\+iQ6Ќo:6G:pC Ք2X'cXeDq[\!k={ծV-c>8|>3KlZbCd(V=\ɁNSs+}yJy CR/hC'b&R«E|6;Ji5zRrBsSdw ١RΣGJu+t嚃3zQm¹|">DNL)Z"YQA7z\<&79~X =v`(h{o!Jbcp{xw4Յ$d1Bin-z޻'VGPl(E+XI4CSw}baO2G#AΉC1.Cd! ?^(LL2װ4 =cr x(Ǧ<:`2*=cMq%oJ'KLEJTiC&M0]u[k%?1?tz(sX밷tVRL~g嘁)8R#$ Tȁ8&L:^e7F=/LZkve&{n[S[Ըv=ڮΫcvEh;y`jhL8Vp`W&Zq'MCϿ -iϤ&t]+M11n2㋋(fPoXB:0XM˅UYRaiNۥWMswP) gF4U9}/qP'nmk-,Yn7=nD0IpRVƗlmWw]laMcroD:aƊNg=Ʒ7S),T_# EA[9/Q:f&@f[# 9^@hX2޻lD֦2EcK)ohh"UlRWĒ?/W{'G+O_kdT^FS?2G؃jf~>< N^}XZWJcC!rbPјKXz?>ZhH2)LGWmkgU<=89P;z>bX/Woo:Dt:Tw[8P.ޥ.rMOqRLCGϷ4ta0uۚV*-uùps⹙VpMr4--Qx?uY53׻Ng?#ns[-{>߼L8[tm^>~ o5k6bv=mHGfj8rge]Gp XkB8'{:Pݳ(CᅩEϕw]vtՁ{/Ã.S0nzw[?ILFEqЃ 6kGCwrD50obͨhԑ'm#+ΐs:T9nQUcv̝/uMdEmTeFC!{ߒRJ鐙\bZ.̏38EGiB-NMϸ"7ļRvFOz|Y&MU\KILEn+=8oK8SWxI5i.wEY3)X{ǦGBd"aL;[*\QB|#LYs~(\+~*>*tsE?xéЇ+yqDP ,e9uޜZSP',WD __-zs3W;c-#hz_u[$Z[]`_#Y◵˱V 2JF8,࿷s]heʽhƾ.JC64NSo"ƙ k5U!d{.SjewVNxP$q(eRc{(\[;ՔR\m6k(DsҶN%Px"7kzhCt\l gܐ,7L Tj++\ucp#p\yN+ zLn4Δr%oR˞?Vg.:uDzZ*(]͋jaOS,HJD(=^oBLb8& S*vOju@vh"VpAK !spL-ivF;,VhI9$ףq P{ɗGAJ7UAaQ\A)xJQW$J[h:&TQ7ʆo: 4i22es~l}izM4s0gS,߲6DqÀ) Yd\ >\y]*!* ^udtU yD3}w:3]y.<2f ff)y;3gRjI*GAh X Ҧ%~Mj_N*#J6* ITGTVQyՑ+ŭUlOrR2-r7p> y*sT$R]PelȥOxlT0dm@DsʯEa4i"7 :AvjzOˀǟZF/!,]mrFS3д@>H-S;>.WyMT!E{s2+%dmz[NRrLЪQ߳p9*޻XՓ5[MU}yc8pE9Fc6+wSk}A6xW~S@JfbBVtR[Mv2y}h䁁_E^ppQG aӢyS.4m &콄ɏDN|_ȨMlϥyj#<3Q\+fIſVn㣓 cEݥ d\~q VTi2}5 cx+鞳g;G8:/T,KRe] c8'\;99uXێ1ܐ4oᇑ&yѷdIHI',iÂlm/4IPAF04zhD42&)/W2!WЃ*;ɏk%p';ƝxޜGeX-d"bGb]%CKQ(h$ಐru M,o)7A ʃ),3)NroH^X0)wl,pY jźARVP~ßArYH͠xfS<31i۽sEkdn6Y*6? rZaR`6&j,Ǡx  Կ&bo~-`m5 7{ x3J-)ywjp&5Kzj~Rz?9x</zS)u1#Q4y>dSemPlP7]dP ×DІ7KYbUuX,ΖZFVZfK~ފ_!ʒ-2\aE3Xpn"OùHk(dЅ K%O@]7UŃmՌK {)&"GBLyIhnTK9vJ_x}~99~~pzJد %B3u.[[zN(}M'UWs*z뙄; ~O~ToqI6E,n\dcݺ-moύrJj-!89B]d 6S> c2S<͐i→O#8{yrr͢율FHLJ_e ΃W\8T@dn^W27q>f2+<ŤڧZHBK8a_Lv{%~98cW@ bTxpvvp"󗇯OG88Pu' Q蹂QeJ(*BDk2ԕnTj0ٷٟ<3B#YP`^|4*g_LH]wBZ32 fB ˗T:tT{7hX,)M\) 6άW#1ݑo84_SvMK&q{&ĩ蓌!_RʅrKX'"-fOw>Ų]p-2K.1v~(!ة|j3(c:t$DIүCfp(OkϾ O8=5_ځi)نjW8 {夠Hq2 ;btgSLjj(E%s4%p4aA۬PǁjdU{8a356mت}ݲcμF v"VQO2K fGPKeQ vF}Κ<*o8G@5Pq_!!*.4׼Tbi)ި(LP`=p-v{ro0βU\X;>g% TWGrVcل$PR֊_D9HRw-J--0`:u;2=buomS0 KogeT+ӦdKc!;WiGk*1slD$)yC v=tSL3Q^)ܭ~ܦdJS<HD]f) :;hqAu0zKl#\4܆\ "̌IXWq׷@5/_,!; ]n?ne+ #xE ȳݨ#d6('J G=,I I>;^ fi$YLQc<-Քfڬ*^9O-y豌lYfQĘ:|J|ã d7F*'ڊ<8GZR.Ï9rJGv$N$4}dHF!fdXsŠR|F:UiLf;> Y:)vV{zэlj&| -ۊ;i#gZ4 +rK"S1sDU/zܠ2f\[]G'_!}}(e`[k4V2jU`tQ$X o$Dd)F24+p\i5dʢS#FG2T4Y|B`kE`Ff_݉VD"J.ed fS4yCzNDӁsSd#k+a);r Tɧ Ń_1$L\7dr!"UT6DeRz$TibM:SjX>şTuzCiΉ1®fi+{R+mP2.&yќ+M2þػ϶p)^`,N 8u#XyP86>z/Tcy͒cԢNaawqjE[_u|15LQOI:H\_ÛV eZ! :ҾTK-LZ>Cy=O2.gosfcɱ=sSo*o4m ^:sC1ܘ /UKN"uvnuZKQ>5%yǰW Y}3"|#ץ `|P_H- N8)c!)O(qƙ_]-A*yPVԵ-׆lCJrr@CydQz wEQKZ!4$&cU th=iE8dmjTrNƄ{{c=M)X 򺞵`7 )df&= cR2uQ&Щ:_jT>7׃*J7q4Vp4Y]-U  <*ek75ZPr(p2SYlN3nO|qcP Ywg".vͲ"=h`)Ν?WTaTu̍EvR`65Ebp 0_.7W#o; nkBސJhԤIi[vG%=F ۆ# *ʱE *Vuȟz>O&ѵ\xRQ{!wns#zp6t^էbr ;d4DǠ;#"dZyrợ{G?Ԑvuaj4`wQf2E\>$Jš49ٸ0L{Dw~@OKqnn3L0(^x䔷FmF+է˃4s!g=DzV.9ϞR>>\ϳͪ˄%MAU̖#PGÓ˩L% ~f\Gjs ,`;L}|b\Vozel9ipw$=)5AȈÒJ?٭h4 ,pjW"D0%cfv r}TǂT` @C^)rN}֒ M7rm:":9C$~ wqHt5HT6KpPj4Cuu$n۫}F ]oD4ʭ+D<'sU1X%8L57yIt .52g*@37Dr8 wRT4.9.Ӗ-[=| vs{*S6J5`֡)궢( :6fG.0uo U fm͹9.'ԔI%&4wV;f!UcDo]9 ّv~C{h%݋k7Nɿbo>a}P'OJ80ӮU,'ۤjw!܀:l` gK^/75m,N`D ip6/ipU1P.HN#kjfsυL3QR4\- 7`SUA*_+`|xQǕUՇnO;z Wvb6U :y4KدQ:8`~pS@:uWDjtdDz+a a+2g&YXGN4t(BcTi9WXOz]*-(R s]F ;5V/__6Ghgl&k-'~ײ p|E)"0,8ώ K'0=%p2G}yz+Vq%Ư~9Poe+kLrvuK HzaU  i 1Z)ŇGq7Jr7'nRhWG7>>n~؁񧭏܍#h0|i?O{1OlH%:ѵ<޿U]':? )|e1'j_)GMC\*bI2U.Tn?Eٍ6A,.\'0#Y]ZG[r%}ʰɢD e8v#/muG?(H,ybU{ f~ l<ЯO짪h5" ӘLIݞ&e;U~sl7;3~_Qfc>Gh?47j,^m)ok[cǷ/Ha>,IXUNЛMvϏgJhLWtQֺPGtcd}3:Ah >Se[҉?x颤qºfJWwx/xm2-pĊn[*_۰. s"#H8sa)Wb19ZĭE,ˉ`\bw@5FیW3\Hż FD;<ʹ=s")%.㤉4 oi+8y-̇;8RD,]sf=$2wgC9p}ЫSٺp:(/_z oʅr9gZa'5>6<,K#aJKd6.b=fU3K#fSBFU{i_ET7 `arW{FB9fY yu{Slǝ([+_\ "VWa]} #x(6-^bXxeɇ-jG{˯]aku+*U[*X5i>Q vE(3KFwF%%Nlk)ru 8Z~hptQVZ⤣͓)GT6~5QՂ:m GUK;(` {aXZgO&̤箶6j7j3N26_p}R#EH}pCZeӷnX,b26 r(WN ̅VX EgĖ<8i#auIҾ?ycJ+\b_61Fk'蜏5y8Tl#E(/}*bPE/K~e/JS4Oso3޳~s]$DpfF:Ζ'_ڕ\Gڏn/OV:>Ptu )M-1etFa=M3.ʪö+KTs.u\ȷZJ=- o!lbE)"+q("ap q vjR =vEWn1bO` ^UIUic-A.E"+Wyْ3̰$edJSM:oָ(A) tVbG,f8Y8'I"v 17V6|ZzA@^wchU1!7끱<݃}%Ud0= `VjwaK&}o^2dy A67c5%2 ;Ӫv\Ĝ.jʩq2 `r:FLhmbej_+\54/Fjcz 4LP]jPBP]aګds~],PÖ+ w=3hX|WH!XLi~.Yp*NP6x fc_]kHn%tRPz3שg_`-b+ b~ r%EC:|9 )*I2ByʔW2U65AG-pOI蘝}!F39)L4D-:l|G`@˄S85 'o땱z2-`[3/23uU(NMHݡմ#.P`zaXZ+y{JjB4I+ʓه,ŘſʜډfޡѸD-42}c|գM1_:64p©9JoUp?mkO%#l}2;԰j,sD%qh[AA8yRxC}3"F@)D`pycfRA"=7\rWgD4RSDgAg[+!Oy \ K@wI@)@8+ܞ] v8|Lq]68Q( wG,qlߎAzЯ`8$(\Sd#lt.o~wEʃ"R>Xn 5sx=EL(xG#\)Ѧȃōuz>.cLQKp 8cM&_ι;S؄JPH! jp{슣qyiπ'5BG r?~.rpϞ7K!ڬ=}\x_o X6F1 !][$_Ӓ| ikBقDsȒ7Nx7~CnI1Y+]D]aQ50-pоňh- t $qn,!vl磣NkNZ XmIZ. O^[>WbaJ`gGy D!uң@~B?ht4;Q>uN࣬)+{ 9swG)k.JcѬ^:-4}dL IDen֔9 :6`a{sϠɆP#XӬ%o: ydS$ra~Fy3cj~  :N턆 wKBԸF _`ʩ$gj!6|<٫ݽRv;{{?aG2pp޿n.'4طTem#|ނm:-m5VIљ/hxv?vjhкi^佶d찑B j雷a@ +II -$nL`} Z8- 0WBwU_rI/f{XPu GPj)W:rvzCѣ`+VyCDBlqYQ/kuh8[(8yES44G!N@-ZѮ<tC6M0Q5,e+HA\[ALWc۩#P2Â( ɒ` s4d?3V9$(H6/GOpIbnF5ׅĒQHr@i8F rP"h!?)<<4~K , o3|X ރb=VR^`ar^ZW=9`{~C^~RgGd-̟2_=WAQ_5[S+ِYASDi ʞ}څ{(σI:zD'[8X 1#c8%]piȎ:Iy]j9vTH r5ԪA>FN9Oc,fځE)fПj@#:%;J&c%`elkPC`n&EtBפ ~K!FDqN0+Llf%6ʵ ?|/dI$g@.x+#McZ/3q_:6BDžu#ӒPkIH517Hz+j}l)ȴ 0:eTꜞ}5ٯU-K ej}}-U 0>kqd`rFUtq)Ã|+|>ӫ }[ذrp7q& $u]8!!l[qJjlgƒd1+N*`WmQeh$1cK16LAm$,:(%EB:>2q"&:$Ö[pVT3a1]Hg}tHhz+,d M2$TP蠩@M9b|!)LAMu:AGJGOVMhfڝ|EI芅n旆iJɯOUpYxkl63;{q>"ˋ!$$x;Q Yztc%f@t;-a"qxr  Q) f"0.2ǛC_}!vD*SbGdPvQSqE`n43bP/*`|'C~nxsWNj}U{1X[@ ae=yz:(N+z+cj8y[{0XybͽW:rQᯚ{?PysMO#N7v_e0Zep&DV~̧~u>N&b_1KX0+ R/'5ha\Jt  <,PB̾,Q5 kv雩/uz6~Ӏ8vn!B:coOCM7]1 S27e}袞6@mX2H(]d _8>j~|L)ЀKa)|tqgB)ל ]&lġˤO!,vSGgrWÙ'>{% 'u=ĝzǟ>c'I#T)㎝$tDH5 X`qBS[hK`IxSv6Y^dg+R9ܽ[I?,]!N#4JDS<ͼ( p{Oy$PС2/׋[8S-\BsDpeֵuM:uw2pR̿̈́f2Ę..qgGz 2[\lRN+(]l5]D.A"W5)[rpshh7)jr$CRS1ҳoiN߽5~7Z +P?c8(¸Vs1 !"GՁ9CF[+t"`sU]p9}=mPiV[^Q~c~דkv؏6ToifNʊ5Jy+24( {nf~@$_#Ib,WL D{U.LꐬLv^ľU0s `IgljN|雬rU*N+9くu"Y$SELD ؁~2, K RT~PI愵NM;" VEpԍ#v:N Qe'ٶDey)&hZzՖչaźyߦNs3kz obt06MM%80NJl ֞CYfDdmRkM6 aNށq㢒U.)Q^\iػSAeVت]ywS F 3< to, 04J46E¨'nb(fjX2eT4C$b7neY{;]Q< lΓY% w"\-kFJW2 ]Tr쪔D(x?2koȵ$zr*I{0( ~mTUtsُg޾-]= *zǕҞLҽ1XBG_`O륛q.8Q\=|?Wݮ7}%ͭmZU~&|BaICN!cO P߂:GTpDrSqM<iH.7o ,oQH^<"t2毴[uB~Bn _sC[]/Y#m9-|Ӹ͢"K=U3ri7^+Pp_)i} Mp}!r+ojwE^PKOr0Z @ M'lib/IPC/Run/Win32Helper.pmrH#Ta,a 8T<-BR$uos"3S5^:RytPM2$}k^qm8Mafp=:oHrRSrt~Ԇkhܡ \ 1c1 d-D6 .9odShuK Dj4h 0 hg #\fu/oWz{w8otZX}s!>1M_ħ*q"^+QR PL`W6:#KF͘t3ɞ2#N9>1M8.X}0Z%ibJ 3ĝ*Q9`[hXvK*;kƜ^Ż`߾IFms2Y+sj"ynNJ_ $ #Bm5[.4$u^bǭ"ol.:nC6uz7iJI*ҁ\z&K*O*\P*Tu,J,JkY~9*Y?1zKyJ] ~xpܻfgOuZ:Z YfPڹ[l(Iq(D#1q}e\ASrGj.H^~Q, н]W`t 1dl#ƹuŝc;s0h4 GTᴘ[v_#5O;" r\k|g mqC!,' wQv6?ˬT)9F\K$A)  (Oǻ**O3~Ւ8#pk }d~ƨTS+4O!1`$!X兖 Jˤ A:! |0v"A!V"l@Nc}n4:vG06"VOZI]֘s 3/1ch\JCBCYXukZ.JCdg1uwu۷w:4\z(qQW&Nk¸y]L9lMGv^0eozN|)6?I0qr@2+f&sd\P2aӽRgm#dPH,TCͤyIVt Cm7{{2򸷃cC qs~.Ɵ߯=~цcKf)5wrζhlG}I%ι6'i-4Ӽ*[4G0Ÿ {^n˙c1;@ (Ex?6v`/uILGtrHp{.ޙLbذ VaLcEx$# ]FԾ< ̳KTQY!82}a!#pk LyS%WzxdH^~yHLrPuL~}n]|M=ngno(}\a+dtn)Ykلq jd)xRCZi:%䱜4z4#3zA: ̴\HSj=#($w& "`S hnͧS`VI`C?Ę;JYA.-+&b֜{Z&bW:^ BB7A7Q\^3G%rkxx/}hhc߃3= ~3P%< 2U<} ypE1in&1DXKGnÑAmZ>6:(Jb6~;:;*+htFEu-]hV4prEa`Q0 1:0`n\E (hkt' ͺ+(#5N J`Pn9^HT $@c!':y b׿mwN~/njngeaW<+IoL1*~mM5&_(}w9 :-8SIG#?PKOr0P_B<lib/IPC/Run/Win32IO.pm;msHҟ_1ְI{-a ulrhH",OwϋFBNm}8F~3k0|:Oy_Fhc"gq8w6lND,I}zV&%i-R֡K'ݾvr`.8Nǭs6M'Ȟ]^5faH']&a<kkG<y0H\wRIϤ7޼ 4c/q``o7{js'F㾛tj_s1 9}6NҐm8fK8Ä隳5q&iPa/v8 ?gϮ'p7cjp?m")l7#M0Jo^o?^/7Np.H)D@7Y] {8c(S`?{ʴ(0Bgܝ3;dH\I6g@#'A±_&0 G4&-&rpy= !oJ ]!n`h.!{ R%XC}ImW®"d+*`^tȩpݕ{0WnqHxpza qq)'1Tn?px0|۽(bp'.bJ0Ꭻ>_J|Exw6 ~IF~GоMR (ZړÍ^Xf~ X6*uogQE$ 9~S1XT$eUa"a*jZ`/}g&@p ƾe1Nr`T8K[J NR"ܢwC-3C`AXN/W[5NNFF;쳗vt֤4W)-բ^6-}0xYy?pxA8 C@39l.2 8Srfx.LRҥm#Iy%7%9CnO#8{pRg>| Ke38S ,9Q^IMRg}ŧ neY{ hwY&79-`Ylb`aډl!9YӺp F!az?M 0Q]P* s(Q` 1a*sѹ fm;dS)`-p,ܦP,9+w m8tum[[FjCƒe'!K剷 DƸ!aZ6(5 1DNVx@-y4VjgA!?̥p; 7|#s0` l Z߭Zm@ZCLA %3Eڙ =Ba?;ѨQi y.&c 2Η._!A~D7m1+Q^  :V3~bEQ}R:bC1{ÿ )Ol) CҲ%cl*(s\W`nW`ڋ]KƇ~:T>CsD#zP=qm >kB>P#b@dɑ6CpF>JWfI& N?& JLiGY AV ī2ebl asÍ)´N#ͬxiEuZEf6v)x*|2? H q7I*wXa2;n@P12%˒"d*ֻECF #1*+U/T8)ǂd"감mD:t2%A#h A+mw`¬?ރC.C9\JV06moT HKO?OA)Q-1 i " G&T>An>CbIrj(?;J̓0GïSDPXօAy[ϳt(ӳdduQAN qNLRpAKVTӦJD BȜJ幍PF.9Z4?i:O!n+`@@Lj@J4SMY@˚:$soDEL%'{n#0M`)N CY1>!t_7Gd 8}oejq92⥰!pwNT9#tGVM H%r'R]2ؾ ru J >Ӵ:3n#QsK ˭fʍFzzuWXz2̯K18u68-0K' =hi㪓ttSv79^7( t 6ۃ 1u^@RDc!s>PE/B"((L_4"{C:a^ r*B`'ϑ"yYb #{'*a)*%񚸢C@ΨRraӫvj,_8d7;Cd%dB3p 3 ϚwM!P+,!ĺٴ?t -+ODpPB3ht HY/|ѻ+!ѻRHߋs>~.ɀƱ $ .y!.%lua@gB:"~&ֱ=6z-ڹ=Sl=g`?)o9Ha4izΔ>Z~MTs$/ɛ= F}yӝNu]e9_ҦV*DBaƏSLX[G`=LHU8Za)(WSQP,T*?bM ^@kSAA8 Q(Ae1ĎCdPDt P(V "5 [nc R,>D!chX0"ـw2-FSN L6֣rM`nK%[l-̃@gzf0|]cX(bQҶB-k`q$yPOqAbQ&OM V6\ԟSOf4Z*i3̓"Dko-՟ 5JA~P CߦaSZX^oT3*Vf,#7"1k|o6by0FXCHM-!jgfTDcWޔey"Rїؔ?Bp]h0rE ttb1Y:>׸|p؎|/ ͿQKlDuop6IR\fU*_%j&Tf(C *`ʷ2WԔRQZ&hT!O%v3}԰Eb-YV??ҷ'mY/ [$D f5=PJs@_WCN ?p^pcP-l~-Us٦҇UJ&=/D5L.8vd|(% E~/WރKu3*FpJ9:+@F2)I7xn#ҝSj)^mu"Ghj[ 6CWZIRx͏UvPެ0;N7$j6Ac,b/JCU9.Qݗq+P9(D=%$N'hVZ@ (|pc{V֙؁KUmxŗxpGQ~!{X]Y*ia ZQ?@R`6{ϜyMUdZPL $? J&e [t  0h2QkPGQ2bd i[nG мL%eu#~=d-2+@ȱT_, KH1EQ-֣{[J PX&(qCJEc^"|BEU0\onm4ū{%?>;PKOr0m. lib/Math/Bezier.pmWs7;:}3kg2yHNj0BG$d߻+!m(]o8BqhB>VΉ>9o<8'B8`3&| ^ Br#fx !1&'6in-XBJT i6DbTH^t&9Z)=7xl.ԤRw1ޫt 1J7l4{z'ϖZL2 C FQ$a[3xkN%9Ӽ ˼)<j1*,Y:/TdSk̔k|ypo nw7G\ 7j_9Kdzmek5Zb1*B2)R"s ^ |1 TU*ꦦTRgU ĸt]<b'*ǘ٬0YWf&EUhT qa&;S Y^Fͷ)f熗r4"pMoPKŅGF{vAgKkCkA~Ƚ젦(QCʩ jڡ rоpP'~Fcw}.KN@wQβhL&$TE l؋Юb)F ~hp5b\Mir[h$`,^7kN.hEؚ#`RBje ¢C/^\G!-xe'nC(lK9ȵ>8HlA| WͣmcCo¹:KN?lo'`d \mB#uhKAr[Zͥ}x@^u.w@jm{GwD#Wav s\Lk9ݕޟ${b;p*-brM|#w9uA-~uYv )F/e ڔ=0j^w"gIіzPz|ZQ6[G{k u؋ iPKOr0rlib/Regexp/Shellish.pmVms@l~VCBqbejǗ:E_iBһPP]cݳϳ~gu; ^ǵ˩{V 6AHmfn疵oq/L7 dBp~!@/I\H׏–v!d q>'و\)B"9MS'8 0>>$B銄踟`d>sUw=])xzhYsRڡ3X {q$(tń_%8;i ޗg7 ~Q~G`'ۑZk6[@ )pOfG|MhhiׂfA`Q ^n^fYr>pQǃAK_wmhCЄX3#|Jd.f) IZcvN9˄ O ÕG\Vps96n&M(Sg%^ݡdX7ZojW}L%I!`OR_F6n2T`3Q]g[(nր9IL԰5Ef .`0cCcdJ%C*Ed'KI `0p Mʃ1ӇCۜJ^뺮˶M-{i.Ye1raykq]wdT_7cYҝc`7*E.`,d?Lԃm}5,vZwC&J͆.ʬӅtM@Kbtp9 1a%jt@U9>v֖ŬQlyhå n:MzIA֔Z(\*[@eRJbGȱ+Lc|\S*PKOr0]Vllib/RevML/Doctype.pmWioF\1-R"Qq )ncp@+r%J(o|a;ofg޼ tDօܼ{;:M<}J'N*kdv\آN=3IVy^ /xm.nF7S1=sxNtKU\LoFTY84{m;D^1$ ?ppp OPfhdZdk1E"e{dug|Xa>ܪor䢱vc~ܙBppbUqg[I ~}yڿBݶ{ 0j49uguX|wFn_=;۩]xId:߸0$UL0$0u7u[EX!r4U x3.h v57 9Y+sB>PcS,̑^3i{^95Hq|8;q-IXbWДd t$BaN!ԕb6[Pն_ց{R;4Lg㤔VڏI"Z풢> +-]e\螘:md|7v!Q 6BesX23t x-YpgIx41A_EH2>5Rj)aXRXaVemCV> #s1oMHJfPs0 A8V"㸂=b]c1AoW3U$9e]}.o $q: eE#H:s4kq1 &Y^;t1N>~좨B`6=xSc>MM?ܣF"z-rM]htt)Q/M<*Pht| C3pR$(׆20붥2%>Y~ ]^N9AT7*[d.fVA| {&1/r15J &+uc+ 9{Yz J1jXЖ- n.wM [1]o]wm=mvdC9qאslxE$[}K> 51 JHb7{uhW <kS2%SD2|酕SFX* "VrXWZnY eY!++]B-3%cT~>9PKOr0]6lib/RevML/Doctype/v0_35.pmO8~ k :FGI]WTT(T qUH\H^VBw?q;q vݡJ$~ﷳ:- G=-pP[֣ytN_k=Ə5 G:85Cmb5cxF'\Zq xd<`hRz<@N:GmOrl5 VS@NWwY, 5DwyPen<`3\̎9yEHvk}w. p@]uZp>S;൙Q[kH35Gfg#Ji3@c﹙1z60 kt<$g3_O t7yɨc:}%o"yn4h]z pon Uc 9%b:#JC_g=`BA˳fhӆh#EҍIk^YdTzo;޽*$FddfR+19Ѩs#1cI3ï\NOۻN<9{ vEHs$k=A1RYE{P/*p= |?\.]LUg廚v%Bsg9WbWP㔄N/řV"+io1~'N2p>őX'z va^.ǔq35)7׼.2MB_`K/b sQL'5-6DZ))ڢ+I,8RY`xXS>߶$Y* %2'PJBQ-6hwNy3K8S$N 6??>E;bj-CrU%JTy%-JJXb"`=&]4YjR%ntX'O:iVp@%JcN>J4oLtջykSIʁ0,)Ԕ(KĨvvF%T7v2MSK R`L$͈歘k+yX(Y=D):hpF\ pR%֏O`FGq0Uj;4Ude+%ah|1X*p+ٞ(л6<$;|eZ|%-G,*qqF|uY|EpFk .[(&K@ӣS3K.e)Z'ݝٙgޖ9I\3/:f^f'혚)~R5FUH,e}urTZUIz9I~]/_~s?i]Yی'v&4r|7?;x>~xeυ:p?nIO^%7ZjS|THӦS)TVM\XjU^MZ^VTo/'Q!)'<0JI*!g7E4o2m-m7{S??dNd[$   T'0Undk6ɉҰD݃4Sօi )b`I\ojXW,Ȫ7J 4+,*bMn٪ktVNV]\ z]hh ~ֺ떛zwS{x&p.I?O+LʪԑU ׯ'dp0Ҍ@AcǔDY?>^%O.!^d.Lj 11c̈gOX4VxEf3~;@A$(yklE]-V" ?tJ:wt#,V2.©d jRBuV[QzUuSu:J@%:PA`V|j>c 8OjHt eѳ_\5VۋFi (!^=-Z P=f6t0!/$D4¢uK?vzrBVS Ψ yB>}XmsD?TI*/ &%MXQڙ|zF言--iŤZuPs`R}3Mfmg-a*:fv9l񆂚ڕ:r\g)^p0$.s F$MBIa"S%F_YJAu>+sqf~i #[auat `t pY'sp:BnEhPP֌˷s hU7zܒ39œOX21Gk57QaL@X˘y[; x:PO$A7~"4Ko&ݶ%f<6CHGsoߘHK±!,UN!$[auh M\0v+F5mB=/ ᅕ&4apT+ ƤSTEU>Ysi~M 2` ' ~83:ի,M{b/fNFo`CӃ~ҪZN#ږ%D:# Sr|,䚲<=0lOiD]Eĉ>+@WJoH>(dTd1Վd"̐ZUWiȊq `*-7GN0gk}W OVCC@ûvr38wr޽hl J3VEw,}U5SppMuw G5?iBt8ř7 ] Frٱ)–B~+ )U]j_x"P}O|L[/~??l_9Nq44ږ)|(֯MY.zY\Skq3f{h2Ngj<ƙXNq;*':5`ƟeS8h%}TS 1QHQQg]ºy" SvX+ BWPy1eM>m'[q#Б Cz0}CQDoqWDZxa6݋WSR vP/d6ڑfPֳy}KF=hQ,G//܄`^jhڀˋ1nP~+y.,+PôyIV-Vq5Taq''` gS\#~7v#!J^^ 囿PKOr0A,? ~+lib/Text/Diff.pmZyWH}afm|d;&62eBxܶؒFjXU}Hݒϵ~U[ ?`C%/i;ZR'rwv8s_} }~FW;N0rt1gq\ Z6H0|dzK538*&<=8Y|:e/%OsahMIf\&uu^}8{bXOj2SM66mxql1KƈAj¦Tur` e8IMk"h;*dOySWa}ȩ/_ x<4~wXms6pG/Ru;a{5E)ڙ HRl՟~-%9+Gj0 :K5s64-Ä6uPgGc]a[JpgMX˖Ol8Ƽyel Gw{vQoe#CG>ü'"^C X< 7"~4X@!A@@Cz]-ys_oB>=64x/ߟPL(>`v~ք ǂ<`moAPs=tp2ۄA*+lrWJr?#8uʁE},>]~tʉ̈́YX(THF#Rsh7je}&=dm]fVre˂?$C(ˤpQh~Q5-^w#Oɜ 4zj<E!,i!c1E>0ʋCOA̼pT;ʍҞ?e/GJ"#kiza]9J1؝ $N־5Bu>`!;PYHG$#kә^en PH#ІQob:XT/Kf+wqZQ,Cjpl)5a3xVPG?0s[2xx&'꒚ 3-ipO$ty [)8#3mZRˌPFK2ʝbpbveWDghVx~l12TX j }4)Bx3gۂ{hcV#>*LDM K$өi}}w@x!= # fjjQB&wNHP|% T$%LåJ %_mՂPsRYt #~0]$B3-r>fyN&ɋ [|[i8Qn5nR\.߭H`.l:a_Zݞjc($,<ʺ4 ᝹e͆d߾XOc @# ln=88{_kHM!T2Ԩ7How'[Itb>+-C/ 6"-iY3?ʠ[ݦp UVyuDgM#m2&=[N`G[R"F*J@9#9|شܪn%\ qдL[!,߼~]Z͆J ybNNSO< ,KnԷVT&'dZ}wE7>V*q@eP\e]hf:PuتH}=:E@WjSŴF[L*Y^UB۽WPKOr0Q-0lib/Text/Table.pmiSf; 8[!6f$T#˯m$s߾m-3mx[BCI6O8EpVԾP"]&VihYU^5"X/L"t{m%x>tWf-Pk8㰞&qC٤ Z,k "xlVDk+`Yb1pjsf Ӭ ûj2ݾɁhuoM".-ґ5+hힴ9ץgsdw-I<ې`8E><{(MXo/w U/qbPTDɴ72$eQZS``IWy ԍ2U3Ps ,j<`*;<mm^aVٔjebxL)(\;=FҎ=Xznw$tv_tM0, < ܌gOi6@ULBOY0 kVAf!Њ rab&O`$2DH7_(LhP2WWA"n 0!J#p{cXQ8Rlʦ8髛c^׺iԡz;`j% zL",! <.pR_Cx0PD(Q^:}SvTL\( ܘD2qUwoY|RuZ̖,zg0_i 8dtu%(e83(F<WKU\Q`֢.Z\SGFYo4#b[#DSFIA}lkb \LMi&fw095\\b{@wo5Ɩ#@+50.v~}.,lX]XZm;o|+s۸d*i(Adw, &%ޅ!o {1"&Np@wb+0>C [Ԙv8nHwydȄea)ଔMV*gz[q|.M$L ΈrSS<@e∻ OlKjX,'jQ.q(k/<9l* @`H^Q#lCQCm٪/P"LͼĠ=!)Sbȅ38 ^pB~B-62)Ew,68)$^<lBk~ǼvpqPIFN1/ ~; Y5G@oA@:OUar:uqA9C0NlrƨPc{IM - ksq!,o,օWv4O{lǝ=<'e"A0ťc32Xg_,KǚeS4zGyz"-3a8h 6cCQrP;0 >O1pAW)+L/09~al v/ Urj@؁'&*igx$l4{h07E-'8~2ŵ;1 z*?PA/CtRh岄ԏCMկ˺Ik\}kPc` iw#fa}XŋU@8 GLE;,qW*,PUix4JbP~26)k+.ջ1:Ym_S@#'[>5w}rdT {YhvR3] TzǞ4)+XxkV@{}-rJɱ mcL/( ֐ Y8sk |DC%.H=fMPR94Pu_Łfv8bDܜdRv)5kjCwJ3Qwz%l/ "V\FkD|\HHJB/F-߸"sїWH #Cf=FHnU Wp9a+q.,}7-Ɔ JB5T_v:fId Ϥr7dWf+,:Ps]1l̢!JN[BCmոGaT G0+Sl[\*-zNӱzOJ5AT,Z+pvBCD{bFbDO<jDWF36K|X5?nЎqo&!%V-4K> `]b5[RA"NE =%i,X1œ<:v2φ2ӲUlsXة|@)3^`yT9jS/h~I>J_JX`!O}^bC5< FvAƇ* B!z,PLlH2 fD x(B?`ߋXcbgJ9ovvK?PKOr0r"[ lib/VCP.pmVmoH_1j+@ m=ڋK$tZlYlg!z GOPgISlp2.X@g8NO9utwNt7FՐDB!\08F +D L%>\Z[Q<ާ qO8DʵG)&%˧-SC/@BVdtѢqT1WvP053 k ŌS\oZ֎|Yi&q>{TZuF GGt˨!T&yϠ`^m" ^-87|boLpZlmP10)sk6g>g90 Gwl3* XA"#3,`'#3|LK /wS*7%Rb%(eN"2OLrb6ο .G7_nuyek8_WuNc F7Àz?t헐I ؞ٰbcĎ(/b!tee,< TJ9)?۞ίrJ}6n&֙5]Ѽ=gh4Xa$ 0h>Sx$%L aKl]+p P {Ke9x ڽtUH\ L{"4%fi9̀҄KdѨXA W3h=ԨrU\: h %e% 9v:y۫VJZlhPUpHCNA)̪f#q9LmޝlWI |bbg#AmGA!r{lWcAe+YV{O?DK~^ݩ~?D# i,i+x[0#t"wL4>{Dt0vbnA&ħϐXy8bʬpvQD E,3xCiZP$ $#%eJj#>{PKOr0c"%Qlib/VCP/ConfigFileUtils.pmW{SFߟb+tˍ+7`흝mؽW%8^x^d1|ID X}XQ! D xssou]i:`ٶ]ĨY#:YGem磚iVVšs!AΓ"a-N5r' c@R,=rx Y|c1 }Xpx59E DܛXY, D;hŨ8ћ5%| )OVb ӧwF7!Lk @]`c/0$a)FΗBLa^"k֭:Q ~lp7bw.&ԝr ClALϥ'(NXd"' N"JɆ #+;AP:p2& SQڈxVt{[%@K35Mi&v@`8 UUuX0!>ZHel5n,ir{#Sp!&fPx(yf"}^c< }껿afj4'CIaؠ>*g6 9U,!F`R69uD MVfûc z,^0 㫵`P=σGI}Syc8N]b ,@c}ỉlFO YlдqsJr̗5'1y8\C1#*l'?NŮ0*J%1Lt&Zڽea+b"DBCC$ Z`v-_S'{r8h%ΥIM dÐ<^aלIĜZdCkюn"ul]UM&r JƆU |εuPԔj'U5|T1^t'aݥqi1kq ж: }kS AAonB=,j9|8NZ,'Mi!rՏ-Po=]de?FZUɭ.zh*EA1#:ZnR}ǟ w'zV{Wz1~Rn7 tZؾ,6/2:ZY+?Z+pb6(&A*1l<_o^dz.j^{ЫzbiV*4뒬ԆE5Ae=F82..$ƳnYTw t6aPKOr0:|" lib/VCP/DB.pm_o0WPl%YhtMWdM`M(w?Y^>|}.x"I|pV^_ɶmh+UU}q | )BP:ObMoˊy2v <> #҉P4uȓX'(9_@<dL*%I}fSxæe4+"ajX0B>YEPi3H>pEz!qxFO= G[הbuR%4M԰|Zk$:]Z|b.\+t֨PYxUMʱA,5q$rWRAHơhxq-/ 9Qj9g*3L1n!D$coڶc!U,j)t6sCM?Gަ)YFmjT4R3Nk5rw}eygiK6MRIn)|/PKOr0j. lib/VCP/DB_File.pmVmoH_14J* i [ꀓNBhYk{,Y]7 %vfvm'^EGd_yvd0IU{Hb@a^D7co^S2F#hSЎ7E].w.F&dרD 92 cosSLG,2aE٨ %V\Dk# #AԆ/o߇pڭxn(pWQkKК 93QwQ b-[YWH t6Ϯ.t߿$iY̘o g$)>znzqTy I/*BFsݨZN0<0=x CM_>3;o|ME5ΜQ>ȂZaʴU g|NFE[t~2uok-.tigm|;iMUm?"&=NPYar~Oڏ nnj >.ɗܼw~o(֮Xr 4ܧVv1|8z5v=dֹ#1-pAC\c-߄%瑖sH䩮e^ X!epW!"Q{ 2YI?<JIERy$sg ;{R;(>"r0,ʾ"$7~_@" $kbVkhlSL&Z_J~{sǻR_AJؠH xd,skvM,\Tq\Rő]Pp20h˳-#z3vEh*ş|fSbp"L"+0fw<2;G7~PKOr0S\lib/VCP/DB_File/big_records.pmXmsF_(,JBZZN 83Yw5%Hwg+ v]e'M2 ~|~ՋuyJ%a{u0g8TLá5r>LN'`H9:dzL+(‚Y g==;VL.F+8.򲢥`VIT&%^!ˉJգ@<+h4zXNtE />a1|IVEuc,x8e⏯qSp M TƜK W%-)\P-) m?9Ȥ.af$E 4 fRrRZ9""@8$H,qTpoVρ̃A Mc:[&q5%23{i=i%s?R~w*,+/jjKwd~f~*x۶R֐m5 Tt-r ه'qI;jm=g>V90@@`~xu|~Pnn}S8/$#ql}$]!:O2e4JnO'kdؾ*C(]W$}W^NOϻ Z]| 0.ͩF ΐKoz6]Xl>4S2z~w(8GW g;2ZӉ&(GE{Ap5eb-PIƇx *XʓVIaf3oqU i4FSY 4VÓjlb9}Sh\mdUGQNj3Lh! oyI@Is)U-J" `(hnl7Ζ:}Qz7}j=i2h ܰ-Cv;u8m9զj.W+q:c0:cҷ-SQ:~SՐ5vqm4oнiAFYz` xA?IoVj`7;Zyd^ݠA,@ȉ0)ȁ1Lh߷գU+єx|i!wY=eue{1]We(? ߐa 1 2똳f[B4&V%=^6va!p>IDhRf3EZDyKqeʽ˃hRz-g5MD;aD x_Ǧ{}9pPKOr0-fYRlib/VCP/DB_File/sdbm.pm]SFݿb#n!<$S 8ifҐ1I:hIV-KFwa{wN>ɘN_Rπu;S/Sm"s`E9`@aVVh|#$8e }yK0oOHq |21Jł7%wXsz`E;e_a̓@@LL.@  K26b IĪ["1C9$`e5'w|&Gh(#!{IQW$ &),҄ Q _3&0/Fir['\>f*gK--:)'Dza+{\*q}muUqK`PqS "npOӧ e0V9ߖu5\>ܳ>~]aE;/9O}4ua`Ɛ^&Ce(6 sceqWLqMhy7PbJ]dԃ抠$x7,)mQo@O"x*GHa%9G cC~Y2*s,8,?K%: xddynqÓpGSen,IHOKoFiC YM;c4ֿqy߽J. v\Z,V*MW*GNZXsKiFs[izDEĢD=kwhDyY^CN C9(aϞ᫕L%WH4½@ -渻d#2jQmәo. VwjjǗcl 4 ٌ(p ׷09!]H7e+ )(fg5g 6Db@ 8m8L *%vbf5*)˥~ѩjQqsC?h]h` .UngJN{[iGڦ<'kUtڎFQaݘ f$ #+p@ ǫu:mG@$NЭ׃Z#"Uc5&r \o}{8٢lԵ2G;֣ ZU*f&:=RGU0ßf8Vj.5@(8侥*:xEoPKOr0فy' lib/VCP/Debug.pmVmsF_p:\&Lg\C:E'P$3O{?%O.4ʶ"6g'P{=Me KJevNxӺAGQL܅p7d+N2aq&>;0RG3rFb-}B@ hx3~{nף˫kzإi-s_0ŦQi-D VLDå,CvƊ?kUU*rhgs>Xl,᥏6%)dÁ$):_B$,9k$IPYBo^Aϙ&yeQ(D7V-ajxmD@1)Kߏ>-S? ?ԎH {*EOKCU`nxXAm/hMY(<@gh5`"O) ΉI°-0JpTDs?u"M"5P;ڴPy&K_Z5+1mJK%^Rh%)L4\CjbRVhz5xHɯ1dtg1.eI ƼEL6Ot*̤t-£~HB$V˘CmHiòR ? Ԣ!K㠡ۼ}zhiY@?nrkϞϊ㋒kVr%Q{rphGU{jNߦ8\1کX1ber׾j~5ye؜objwWZ~W@YP"z`ƋCl7|ͶkG*USvPKOr0^htdElib/VCP/DefaultFilters.pmTn0+AlENЃ7M۠@7h.iaP%Il.^=așy|of*O+RoJQ!jޓc_>ۏ`H R2Uc_Q[ˁ%M?V-gl8x^~^ϓM`'iE+< o7B (iczcU`Tom}DYfr+~O!94܃H]'҇7"sfTq5p`4] m9: ]|Ls]|| 瘮_Ddkk 9*5ɷ=]*DžSR;lAR h6e L:chl/M`kž)x|Usò$Q #ZR{ r.US5%Y#iܢe~e>Gå վxNd-V|WOB7D5'=vndQz[gm} U_|PыYPlX)\h7,CqQ\(<"sja$t@0YvQY4/aM%1?PKOr0DDlib/VCP/Dest.pmXmOH_1gPO!%p$="xrubűݵ E~3k{7N'"3ol؈˜.wYwҙi7u pѶi cCv cnpu=z =ާ }l3<|`,*2YCO۩S|/al:e‚m|{9$'BE`=d{1>=5diy2rq$4<2!.?fi$< 4M[Pn! Zl7?jC؀&Ѭ0(bT9f dŝ9$jpw]!҅B(:fa0כ1}`5-N1Sn |uDC&,)$zfF{ `V,s.]BRic'[Y:}&o)kp0b~8Z~6lXE.a`EfVa=A 6S7`C:gߋc};׷c(7 |i6)~$lǮS[pkuT4Jt'G].(x玤ybTngGFKf)vD~K}8ԦbYG ڸ+Y pOXnf<77$Xg7`%ff-a%IJePd?;BL4ħV@h;cN r |7aʑ>\&GƩ<%[)!,7ȪKm9ʆ{mJa#8sh"c佾kaRqPD.ZCD4nl7۴+RyŸ: ,ܞI &O kv*fJ(JigߛHߕSyK%EU2qHݘ*geUjxϟ=dzeqp?Ƣh-0rfR㏐G` >yKyuЭ#j[01;{v:hojLoě;q_:N `,~;\BЯ3줌ƛcoGՕ*z pZ5$IJkl` ꣺Ԝ-uւ<ARG/40/'hl+at%K.ՓՂ)/ѠI%C,‰޳Fσv˞,x73c^'eʞ2Y]w4;И2+m摱h=,?NT놯0WqwVp0yCyql%ucHڈ1ƈXZqR+J'̜UNÔ_ha-G]}Icڜw깭xiգQE@ Hh6[=cPKOr0DIy ] lib/VCP/Dest/branch_diagram.pmkSH~Dvm  Tp9X:hd8xuK3iߏ$N)i8F1^N;:a`z=\(ry Amή!{xTH 6f^qXvBc^,YY,T lB")LX!x d\rk'\|9hQ>a}:B@@JcD^7mX&<8t1x>9\~K4{OOI6&bqT, {}mRa{JKJIHw$m;s<' 2z"qTg" X֨eNx4%xJ h ;Kv>z qR0Z2<SPY2$H׻p1Yy|6s"MΒ180r)=-8K" 6iu@:D\) ޓgCVHI]\Z `HBJ9 ;qԑJ61O@ϗz![8˵lX~Yovk[2KƹuQRqO:gϟRr!R8NMVB>T9Ocd|dk.Дш.4JPmuD(gdd[2f<68B5uDV9Og)hegbٌ*.\~eH{HYĞ|ҮK4!IKY+:#bU& 6=l~' GM>N] ҀP&P֛j,spIs[NmSԽ( q!8:9qyw}ĮLfR9B:d1kJ*{s?(@\oE=$ ȦYjN([GiV\-wqnŠ5o&\k1ccnǒUfj_]k8 ӣ^U32̺˗jn@.d)HsKkcWݳrKM ,e-t͙iM/&-fiy6ΐeown`l3:YQ9}wK g L9v|Cbmlok&R@ WB . g7x֖xG3UI{֑̑m5O0;]+ Umۖgmid`Zo[<jcORF91 >'c2(f9x3{]oP:| v56›}3PzP4+:F0q+ֳluc= v!n niu9677 ˒W@hin0w e ɞ =sm0KjBNou5mwzPKOr0&?. lib/VCP/Dest/csv.pmVNH}WA#EZ -ddcw'(~V_fsTUW5.|޻\x1ߞkbQ5ZR@%A`Y=mOݟ0L˫s0N̪ƒ6[.iBUȓ` W]; Y4=suJO#Qɜc}3]׃V,^ x;Q4Cׂ F[@ >^==J=tYaln3v4Y`2-ht?y}d80a G&} 8pENclFCi-Q.1yJ1)ksO{*X{a)ǣc\CMu/a]!'0tA5VB%Zۉ V)vHyT M8Ju.Zw`B`&s6ż pBӥX^q5s qoVx3Yf2#,CWL/XědZWL(}69=Qtw LZ}x8֔Ey綝mL7a-&&qSgdǞ14t{6"tbOvS5jÒ8pゃ}py ƹ};<9K$8bo$Hޡ2K3 :vIľTwSpE9FJzFlq9*}hh7$GZ٩*>M8zF^KTjoMN$i .4%j(DAX_?K*7^nF^"Lg,umtfzӲl"ƻVOcjľ^E Y}(V񃡥_[H<\I3k 7'_Mizr&4 B$ >qp(^p[Po v4.h\1<"87hDۢ0s %Lk&X*y+H0}wt!xs~|8{spo.V=ˋk\dp85= t? 2|["9I W8rZ ¢g\k-l>f&wXJ"N ID(ʜja0Kv#t2Vpfj, q_ \"0l@Q!aErŻ]'x5z;ޝ=9{Mp|[dq쉼kAD %0Gq\Bngo>KQ,$K$L_%(2.X_*-!3 Z@ vp2qf<7#U\ \,(Cp;,ߟ,Z1M,NP^m)nӷWN 4"eWj~+Pר>BJ}+AN1g܈Do,Xmɯ!?+9eP͠/Fa"*7Jf:36zlAQ"L+8j1٣|ѩc¤xh,lAt-I)a j >`GSc %[(g@6q[Vr=:.@kJ^ \ 6HV!o7;l(QukO+ OHCf$v!)eq#yMKç[]/"K4"oj÷u,;} 42VXʑlp&e{H"0%8R0*h9EQ<&V*՘YzR2uSƂ֥#87$JUY`GC<|2$hs);`PnDNV(eG\%jrx@ėwat7kR!|B=A8GG@Gb<`Kѫ j5Ch5[G5bWփ٣G\wM{qoƱ#\#ʼ8?J^ںqdm#}P;}~A,6ePMPF.f:/fScjl< hөgʼn;!!wGڻzyZ@lѱ؂z!)/&6=cD]6!(pX 2J1R[>-VY; ݣb('zI@$% Ѐ{P@Pް!y6e[78&.*2 ki3ma QJiy{pk]sq5E6O`>rL & =a ʍ/3bXz@oĆV"vZszΨ:F&Zc$-!15: 3V F<|pDa8z&0Sѿ 0ĎaV`H0҄X_W 4+{{' 8<ͰR" "yQ/(S_'ګ%m`O(w9@`7}2 S~bSO.?}~9~UN)aav m:5{Y63`EߘI2v ēLkt(y Q\M+Տ8h1kRnHj5ީP`"5#p <vot >^u9Q=s'V#Ƒ"J!1ċGDEQݸuijbb\^LCUI"_)4 ?심0Eψp46Lqш`Ρz5;$EK{x|Q5x|EjBMbr5ka+K,|eXEkh0MƊ+1|uek L_ Xu5@8φ'j`sL#GLS4%0f֘=V8龀6HW,`\KxPd;SozU w!sNQ'ۀd#ݜ׎QA%n71&(/)3aZB`odwD*l (+94s`A>?Y#ѷ`/3`7 !rRb|.1/w}PYy"X'<řT&R1$BD@)8Y"^,$-}=4\|9~WT @K:8( `ds{ ' A?I! Yb6A;ǎ,>XX3\۴v·P b*+_:&ѨNdkD8nv3:Iڪ{-WXkd2J/qip.n{w]?Wg i$u !!Hg½ڕ1*pgA;ܔd;oD1or*9,~ ~ `;jVHkՌCo 0WU&YS1}t˯&xCa90"!'Dn9"K(T_:MkT8,LD{Dsqһ$ׅ[Nqҁ/,pIJԨ2JwӔ8gհ4",Vy>[D|)uPP6VRO-eT[9UdZ^az珃R7nl iBȜTql),G47 3eJޫ39*A) ՀMT|3mF<9T>]-1/zb,6 QG&19H+ q?E sQM$53|DU|%) źuD`BCE3p7QymoԀ2Je֋yآZm,/\j tч[5RaKpUu+ T!(Vho)ɨlz0V+9I!K=*&h*RC+]{TT꜓+CjƞoJ] ij6][OgGzL_ܭ- mj~nT yjkUr$X5L|E^a д VI/d59s$SlZac`ݷK#V3C Krǣ7 b~uˌOP!10Tz[V`8dd UƨzLa0Acqu..EdvF1N b]OM6jj 6op(0]>sS\"qon#1Řx<C封t޼g:ɥ:]hoxa/@0tV\  CaUBT󨑁픽>9u: PcJ*6LSP1G$}-GRip9u0Y 9?[%7 5:&e]?g?*-2l42U 7(BV=Km]𖬲\ptg+[$d4wHbTSoŴKY"p$ɜ_Pgߖ"F-[M&W?B"$z!׍W;K3wy}5~MZs5S;sSi Y|TNEe=E@nr(Z4-:zÁ.B00Tի&7gҴuV(VwJkZkWps "Yoۙ#yq.I(ղny1r[dX&P:zV8 Z2R&<-w!7{v,l a!k߮Z ʟ0&!xpT,N:ڙRN,'&]Ltp LMaG-~=^ uU(ߏE ;Zy] Wn/Aѭx0t:1:Z2?h *'loE"E.ӵMytFK Cn!-$쩖.u ZpNN3t;1qlrH]nQyLEM+݈jn02HF=7FI\πn- #go|eu;HO`QDve 5j$K=^!zz1𒐵`0s.bR!mU'g=oJݘ ?RT-czp^1ĤcғU{[,uZrRcU%4I c˴ jeK` "flJۍ$<0>\=;^gwѽjTAڐqcW׬=stZXw;lN]CF&C iyzDCcm媯"n4,zGwQWQfB=ܮNҾ>u'm mT[MNE껺 ¿Q$7^DڴfJc7"Iat^SrE䯯?a[{NZ;jH'g'uӞȋ*W2M93Qظ\(/rjzR")-d UnB@!=}H?ў`gcvT5}Q5x6 |͔]}euY&usB+ԚGWZ]nfgiU_ hPprEAl8I6J*_Ed=".ui,l^ۤbT].M3L9oC5AR*1Άk^{÷3CY3WƦ*Ρ'Rй(1E* RTv_ Ɩs}CG|#l cA_ QқTA/$ǡqd1~ujִ:I 'zAzzwyZJ/0<9/#:`}5nX,6e[BH/Y_VKbs#k {ߌ>bOEUrTpof ,c}!$[үgF^7tZOme1GL:hK&tQ=p[\`- [S ɍݹDѠy(X#WE?ޣYbel)KWdx|'T|sLesrz o Pt] &hr[=8+ċ: "cb_AbW7 ̕O`PKOr0*H_lib/VCP/Dest/data_dump.pm @E!$(!JՈavn4Df˹яڼ71\H$Alā1m㨰mgܶ:ӯ5X۝uT:]/+ ~#1Ow@.v}t>= ^/-CÒV>-Oh6CK PKOr0&lib/VCP/Dest/metadb.pmTn@}߯a HR2 J($y*˰^V^05`9sfx 9:OoP5χd"FCaX"?2}nKx7vvM_pvZdRJKOuxRV(b)c^|ekZץ~9v9M'xSq! u|O xf[St/q#(rłw1U!-a$~lIT,`2{G1BF;bH}6^cXLXbYĆ탠g(**,x|qs4ЏmX~Ϟf`'~#PKOr0ED>elib/VCP/Dest/null.pm}Tn@}+`P\JU(&O ؊;ڮΜ3^!K3p'Q)z:HD@(bSqqz\Y.oW 0hmL ݵP5yCE߄R,pp,XY-loQô[S&H5ms;~.Vo@$E dfpPR$ձqOt3Wvx =EFspz?M"_h"&j#R[d@>9sCL%LꨅF%D%PCY!{g~X OfbFZ?+,֏WLǟÍ"% *i.{ʭ"օlA`.BӨs>w6N\Ԇy;Vm#rKZAfںtBsxwM66-<ܦ7eZp'$שVvܼ2j0 M]dic5!;wV߷z|EaIHq{6wn Ϋ"Euo$ןJ4M hs ;{aNAJڙPKOr0bf;elib/VCP/Dest/p4.pm=kWH+z? 0v`lB2瞘ё,) aoߪ$3;ɀ-uUWw׻{Q>yQAZY0,8}6n瓏`WN/^o7&>]Q\.[eJ/A^Nȧ"62 s䙄x|4z< VyxK@Rh#Bv]Xϟ/Y??Bo,؛˟q4#!Ἰ{^*+oa&.r?`Z8X!: y^<4l_/xYQz gs$%+S'qރ(a咳(YڃQfi1<)qP40vZbM,Y ,*csXiLW:Mpg51̀:D%>. Na`2oj:xzk'gǧg?{e<  |w ,9,LqMh'w'g @]Ӝ/"HB.@\ߏg!B?>yw!,ʩ}c3 XG<`%%çs59>]Hub!o+@kwߜ~B,-y`cy}||r, /4,bҹ{q΃aC1[էF1 B!B`K :(Ph~,ynf^OIa'OԤ2[86PRVtX,#f!sdƭ>볟Ol /$Y 1xɒ5>ƸfK##VO>N%CL„ P4T:9mPs@4޿?qh,P=fHbl f-jϫL#Nߟ $)Bfǣj4h>3c<ه_ˋ)t'i.T (IzࣜEoOߝ\R')P'\L2 *>F$ ,h7hwZe;`oe4/'G#hmsӜ'4!!p؎|$ A-F@±nK`cu洺sg(pT c6-1/5Qbu* k_UuMٲ1JiG/XHq`aW(RDdgiG{DNnA̖E'z$㏃*c!R1;lB&hDhW8otQAk gQa1/y*2ᰡ~X\~2͘A9XЎ`1N<`uy=K6hSpJ{Iz{塧A= =@-A_zz%壁 "?>RUKAdCM+nn\~bH%)*`m|&C=(,imN<5$h{ BǪtm@%ϪtT|ݩ!36dWW"Næg`M6_83Ԣ|-3Uzf-l{m*sߕzX2r͂J:P'iNBs" xC ߝ]»l!E| 2=Q xBG3P'pJI.JbC$c%۰^s?S&zZ{WJS#i.fy(#ݼ;[ Lf@"`UDGG 2*gS.uNА !|̍vu?6)8MK,NStj%.3Y9la^΂x ,+"Wuk B 񱃟L;K9t5ARs up!waq#"(m62NZE8R';@[I#[F1ހ% %8W*%źaO tlW̋m4ma1֘dBIXS&c"ъ%n` İe ^=+yW3D<8 UЮSu|/Z|o$vź/{WZ^Äm2lʽK?)/vɖr,SJܷ ApA2LL$ric\M92"&AN v$(ۇv1WzQkM4̠R4}=[Us4s%և11R dʭ$Hؗ+*ʍhELʈn74I극]m,l[mSIaRl }a֐)KTk2$%LHC:ɜR4Q7+_pL㖅FM20- ?2-ֈXT'.Ô/HY*}RQNec1:Cq˥ÜPMQq韎vHd8mN.ݯgp3ފ \uSMa3H7&!MW=%@7}j;hSKp"%H1|d?ѽaW&,r7U sǜcUb%&+t@wG !56 G!EaXr jEi, Т>nXQ9i_*\#à39qE|Z^}.[&WW?iDOj'` j{vn ND .d-Vw\Gx?&aLY04ܻTr S-KEY!Pc|qϳGuGec_ _ a@Y*t"*X3hU҆``VQ"y/U`Potq;O < 26 st(d$q`W{ŞwwxHqpyU~m!`£K>-{_X|z,e/Y*+̜Lji~102zTH͈ҁcHbu!Dyz(1(0+yvz#׎7;䍛\bwQT0Y8cQv"XJ@\#j,XzxN$MOU~d!qb[jCKdW ̣ @W4X2y)%^)è mHSq@l+&neTsiAU,;~k(<2J=oM,m'8[5/-m8m0mj+5?Yv%}VcGg%M'xm@\f1E;VHX4DC5į@9/Z?r4oOX&{Q.tڹVu㖜斴Ù߯D^6_DZP[p&|l`f)oZȕK)^Cᩫ 8X7j I9*a5L`kOxZl!Wa?ԧ`M8r4510.JF4-F[p@6 I 0޲V@^ fu)4dej,]DT9ʜ EyTp,ȻSxPZox9%(/+V*jhD d(oF*E45U zK0⨼Ul.L'!1+6Dh]E繖 X`Pqы 2g汒1#w 01 UO^'g I%(mtD!&TaAܒ[̓'͂yِtZX-BCbc.[8 T] O0 OӶ[[W!N(=$}ETaj0#-AW0:k,J1PU>Ga<}`A7f}H \j^Z-+#O,VmEر)3 Ϙ_0c9EМ0b?{ynY =P~I"`/JiN^qc=rNT[SXvуF>ct4ɡ\3+u[ W\*|*ntdU:ǽiTA~BJK+"L0:f:]hݚEIouHe\<|@s*6i\2+h#ߑfeHyZJ#|v7)7Z}P+7/Т[ԆYߥO=F2]VCӭߝe0M]Eklju&_^zUWuh"-CVIN(mYTHM9Kk|EΉvE^q`*;w]SFXn-cS16$+5i3*WIESgj+rgUȱGbJ|7XR*SY,<Q -V}%VfY +ˠڅ("3 ,Dd *m[Mu;›Kۦ,uAW " vܹ3瘂l5d&]Cl| ̟uHEPn*š(51n6qndд0AYxiW#69)E-[=tjգfM?tM m+x"`ݷ-/J@(-zcʗ+}v2˕?i4BMvbǞd>é{h,]j; t]˅)݆m11;]47ߴ0` N1ipY't)|ua%lKe-K4Bo 0V+Vv%ʀ"I*;>M'25^ :8BXkVf58gݣwMJL:DxPOyrզ!fR⥫=PL M&b[o`٦[=&UIFDRm9(*  'ywV Aw*y}eI ybˊ6km2xw;BQ58WHY3h@hxF?]!<)ut m;Wwap%DeN7g\q79y<"dw!r4R<\_b ĠAR {؉ dIѐpҭ g@3t$L] ba%"urM"xʱ;jVޙkOqYavP {c%hn8.S6MePA 6ftUECgWjE5]SR=E$\Cb{?qCTFBh.ղs׮>;}!Vċi CWk[qXr3'ژ{pxJ*sW"Ƽv@x+;$V'IxޣSp=>v[vYĔeb\BL0y]bEN^ߡaRU :I]&dUm+K5:ٓFtB%3TJ2v p'.nx U^#/ȉ9ť{¢,}Q"]E【ߢ ujNvAq 4?d/ZuBZ:gLjT Hj-Tu|4) F09C^|IF4~혅ݛQ3ѭ&5yʕ"ί+rHѶA߄5HHur^W8ø;Kz:zXGu!qSs.>ihy|\kW-_3 iq:]q) OJk?Flt+}6YᐱjPKOr0S=lib/VCP/Dest/revml.pm[{w6{)7,H7>7sbݺաDHbM,D7/Qs}N )ӫG2IwcyjEڙKCV1Vkwgb_ {4XR}hh\Ƽ&ns ( N]/LM8M4~8L|l !??ȹf8KoHE߉8S˥h߳$(P$RI‰"$}!.`*;yKWX, 6D޼:qh˸@Rh7R`_y"2HB.h)BƐ"+RPB2Hތ_Ns,C7itYnA.Nz[pnBYz3 :`ԩ 1sp~Wx`Z0 f8b[|?NIB'o_XJDKelZFt^:D燎K!Tƿ3Whr+Bbx&4k] L_Kn)"MB+'#oV=r2 R|'jc5L(wj$4ߟ_8|%舒I6穡kI:j b؆~`f \F].-tfhh<ȁ1̓bj]^%z=7eUn`dܾ38\m' ͫ7o_\ [{M֟^vKc$6&_]jc7 99>1]`])jɇwKfih,L|2NjODDbI.5||`}||zvt|vI8Bo dBrv2H)jId{ɦi3>G2gRf\طM@֋ [18jGCI(mpa;0Vq)+Rj  {E2/m#i*l¨s)8\-k֦M!KPp^#FXj E9ϋn2NNjM G ) Ó|%;GbFIc!f!,OS/@e'ۮxpb+vSh.-=m@%sc"ZTI`+1+&Yj*nД<='Ʈ?fÂnmGt`&.h8TJct4"]!8OY-]|GN꼁b63M:G FvK׈e̥O!xtͮna6ոOz~V  L㙿I1LO%YCC$&T)V֣hӧTC(ǂrqq\KC _fG<)mˡ*\#nU ; _>׆yB.nd'"V إ"ަZ!Ȏ%T%r21tXLт:!ČW"tz6rqT#J9S'(N ]R(J'㚗)l6a=6&sިIFUKHND(DFeˉ\6NWR|5p|,ϹOYC|SsY4EaUK4* @ Sd+$̕ɴF_`ԅB@R:ZלкRfr w*YCwHBƒ̉(ҥwSxP$#Va| sv ~yoxu\WyRU~QC!1u ?)H~8nR4!ŧHো 1Biv[KFֽXk[0vꐪT *kuf_K1^k+3k9CUtLuT;] LI fm"103IrDc߇'K2DO*/%~VUi])CajΨJ66yx u Uzlf79uWQfDC\q SYocA{Mh~8jZd,XŒ{˪d22N5j@@{4JzqL)8A21 RaX^j4[nl*;<6QF)PeQrIuk=0Q3'uRQN.,OOQE3t%'-vg)8V]{;*A8I/,ҖUhm+|̑9WմSs{ci:>;2TuP/C:iU ''q+`0zUyām[un$l1/L*w;qm 8HfN x+T^\өN$y5T}y],8S?cRuU;Ce 8iivg݃6,_r4lP9v&?{uyWSǟf>?IurQ'ylA걌ݭ2"F ]Hb"\LiAHq5C; ә\b 1m"EjțS]~@<;[;եm&"̨^,ݜdIQI+TW yB̓Bت:|KzpunΆp0 *_mL*0ȖNS]Z6'<.E\CA䧈$L$\~8APER/RQM~onyXGJ<*[X+[zDe5[ c!#$V)ǪS|ٵJOvmL:ʛqy0Ynk̬gz}lr鑣UXim|ĺS+\WPy^s!V֕z#c-Z/֪o_WƼMq2e2"~x Omp~:WO >4G S*nכ n[Mk?䁾/;שkhluōmqdI͐oV_E9 -עʗiy^rEX'A>H}s w^PKOr0ݒylib/VCP/Dest/summary.pmmkk0WՈt]؇v.Lۘ+ڴeITv}'mrΓ=Iymm0! coX#7[x!elB:z>nMFQ :` $$с# CKyƕR8x m}7mD%&=j^vA7\$YU~SCM+eG Ud.4r qZpjv8~ $K@"'@d|444‚VSDu['z`p%|\݋^Vncs?QpV~ݞ'\~(4oepbPKOr0l(` lib/VCP/Dest/texttable.pmVQoH~>q3w2¥m)j@zGeX`[v%iq3kc ,|;;3K#An,m~HMb2]VME h}~ e54e9wëOЃW/;d_ GwG&9\f|*:Y,XiF<0(|z/y+$[ G g< 3& $¯I4,Z 8\_ ]".d(1AZz  >⍖$ fH0$3\ {_D1J& |eSD.|=ac!xN9Cs ;G tma$NR.HǬ#G\T[AJlw6$JncS:Fpښr{|Ww-Ul3[h/6T5@c;\pMKbI'Dy D-ъ>QTk{u':煩쉼 u1 y{onm |!C+"tbʇ:-6<Ԇ <98 pz ';HN<44 TF@!=ȿ4baw6 A!% 5e? zH%B}QIGKd iI~WM@=di3wPA,EEKr?ZSt'-$=bs_$2[ 5aL wW:"k0?i/[IJu\Zx&64]U?IT=ũwEѭo\~ʱDkU>46BOkQf}[Ѫ~xɟo^up<"I[45/wEp Oɴi\BZu=ϢYY1WxT͟?^[V PKOr0 #lib/VCP/Dest/topo_table.pms}=A`c:mfn⌝dН>+$v2% ޾~oWiDa,X.w_LveJǑ8Y-}o'`#Bo0?x^ӛ۷ xz6֙`LÉd%OWWa$y&b= 9krW2i((#Ar%$DWǰMY@CkPDӌcCŻ˿?]ܶ: ?` -X2cǓENL$y)T,}%gB/BJ,!T`b\dęlJL:`!;$ǣR@lMM Ě*P ۶vPX4ֲXRP# R^{WswPEktm g02n|bI:,QWZ Mc &I<Yq_Kp)s۳l4F; !khGU׏h$\!\GviōW3dsty݇ݫWJ";.]dr"XR"k,޽|t.u"+ #XWg*`}鴂w)I- S ʈ@WiK)qo^ cgN99;jm<9FN;KR=]cʔmxa llOd0 FGO!XUxN+Z*fgؿBw.2C4%]]+#>T\_SSfq v>"+)QJsBxn~醯QJ%%8f1kIpV3)V'03k%"̘M s6(#eZ>I8穘s5Ơ0-IPdOf:pЀxر|P "2E^MD}vYx(31@~νϽz8LTx%j?N\-U"l@у1%WvD굎OE= {HQtf{.<1u$~ݗ߇S,a|:`BgAҶGh.xĀGopa[@Pr!~Ro3Mlpl488ݕ6ĕHuN_ЌZ<]Y*PR$cDs+ ʊ,̜jd< ]@-Բ-דWO+UB޳>߳^%埨D/„40" 4h-]^H܆$^^\\!# c# @I/MFUS.0|IUM_W2b^%.0l&`B8zfoÉ{ ,HWKxr!EJi`}Z "0e/2Bb/x"NfP% R%^o`}W9i(j4E$(wäeٕsc/ j/]JA04eƿ ѶrCX0Y`\Xne:^{1P\>/w,PP`/Ƕn5RpHfp9K=.CE46@bT4q+Ac{"8NL$fZjySF2,$e|a1j& c[sOrh=,̈́Vey:]N}z4=Mޏ֖F%C^J4׊2 IT8_Wa.#r_*@|e.G>nd} Q:cyV 4@is h[j)5y\BφɵyW FG>OPf j96@d6-]SXs>/4)rDGեd3 ǘ*kGN`f&#DŽo3DҎtUWAb`ó,O1 UI>Ѧ jwnP>Qid "-c"9Xc"XC @^7ay1I,~ z() fp”eGB!$%BS!8y`^"h#AF=_!f20j;d'f̰ 8XAa(98M8xmp~QY}`c<6jK \ APd(0D–im8'*HN 2IW/&N504E iy2AWDXSBNU}Pi 3N"ڐ+e4%:G@PE'eՋ9渼O*F4[4\IEa6|qwd &@)\> g\~<;g|7!.ifW݇<>OA?XۥG}M='~8DrGE5n0naxao޽=W=!_]}yvIퟧW5=ۀv XG) J( r]Ƨ'.% {p'͠uz2bSc_ilƭx#Psk@ )* i#A(&&FL ƶLma: țK7;U}Gׇo5Q!"\@f `9$@i; ײ0A u܉<Dqf}yڽF٩ b.o\a.YCXa`[>-b%LK`ON"-5|68?\}#!3\D,4irdyMS&"& $DGTG#XzӥO- kJ;MRw*Vw *5{FZ][=PH,|jڡ~t.,YpG| s#Gmʵ{g!M4:3Pe^Cd H3 soA]ZJ`~5V @nla! ܒ5Ӟ>^R+ژ5[Ɔ3cЕ;d]K>~ojg§x:t@S+&f HuA*-LLhS/>suzm +؀U\߈M_/BEw#GR$8|\neW*ZEWn#5!59?ZbX.3f: sC:]햭}%#1#51%HZAIIf!!PKOr00}mOlib/VCP/Driver.pm8glscA!|sR.^t3β<:y>MB&> xk8r2-)t^xǁA M ϓQj%qO\^\`p~|Qw #(uf3($F=$C 29|$sq=k5J:Kz=ؠ>trX&wV`WM^1C FHŕ('Qe}̓4(u)l6~]ZǹaI^[tt#>3V-ðW..n*uY$9K,ϰ0II~aAʃ 1ϏǧW0F)gyˆ08#7'WWog7'dcIu,yԏa. `ٍtq|r-1^g_#Y!Dy΢. bkcvn3? h(SmƠ&ql5Ȑ;5CCz1nػpyrjް8Pc-Z 8yqXاsZg'7'SO1ڙi>ͷl}r~U#QfRAaU[ We?N/..oɻPwc5Idņr]ƪ]/g^k*Va`qsFQ;INh`{#1Xh D2J9Xk!He*o8bUZ=An8O{ mˣقFs]K<նÝ f',R*pCc4Z:E#묜 ssw]{I% e7+$N6I,ó+XZ҇T{3ybЁ߳>+$n/\6&^nM^Vk}_dOjf9aYFbTC^l:mo3ֲF5y"{2 d;u19eTl=R`d!FmVch=9*H{&kqE3T˾^fZ[,dʤԦAc1hsRD2QZS"b[lĞs{C;xmF#NfG?}zhU!-?8k:U|OYq5e VrTEc}*B f̏@Bm}ZQ[+ج=0mN[BjPiwT& a:>4x>-lS%lXKd:l3cJjZgRC%*QU]Zl0E.lm)Pjς@F}vO'1X[wvzC2`҅{>iuH0ɓLΎCUNi;Y^kySgÑu6Tp;+8ºi2s>4ja:&!u< h׺% '1-v(LZNDi$MѶKwSZ<·RkAzyMr}MM2Q|~D=#)߀>~ I7 OXhh<7ISe}tJ䔃jv{A-(ߝW1S^Ş"t|؟} ƹ1<6e5I+}}[7\MLsrN)A}|k/sݱpe.lznu(aEsg4 7T5=ss44iQ.䘶.!"{S|Oo~1ḃA <*ܕ7 SK5C&uF(&4%˭i޾n%b!y"y 8$ mnlldVu @Z؈S7[I &(i "t@UdeUO<ky~y%@04O8QKWwq]‚@ * н{Z@`ME޾0ӾX.I =OU<}nZtVЦͺB\4 _ca1F2:P#YF ٖ8we*pcjj+Mf%\1ry\bk:;4Ɂ(`]VқUKX2YH@{rٲg3 hX{|*0/)6B#\3%uYTfXMA<vI4wp!C?zU9rUO\|6d2p q.\+XBG[!~7.!v1"˙?"'#3('d(EZi }:@-cm&)]'MP$,_gp^xEu vŇ,of"%5Xߤ_TULj%M#<~@s Cn|ru+CExx6NlredKS=I<hԇyg=5(϶5]//zpV5VÚcJ ǛW@֬0j#/kG$^xl,Te[h( >㇫ X97iwWzjuNs[[QIT HÂëaʁl"T+Fc4'YT+;@:mvʘ_-demFۅ%U! "{(" ^ Q6' 9˛.+i,ꌬPw2,gJsi4 ,f6;tJ_f0f{̸SWj;en)jDlf_IVU b73zoZp:bHrkV#CYVVӌWG6?dюGыbnr1q1"s)+(!iF枉REiiNhh.ߠb:"fuEs<Wk%3%)OUN?PH=aLxp9,QdYBCUrZ&XI@b.ht)Pl&8WKvru5sL/3i )BΔ6Cb0 u,J U jRgK/ 33--UJcvԪ4u O}pZn&4"z'0p>!EZ\r8zE[c/ײ<+TGeNAfL"vAs(XEXvhvFsQ޸ögfk_E/]̀e!6>jɿ`^MF0&z4f~43b-؊ݮ{3dzܩl瓵NSw;.,TWb$r\u.Lo93m~`a^d r)Α3G+ZzmS~emm&Y j7Yj%W?rb.#4c̫-b~V.\eOi^Uε7w]x.$7cmu0҅w Þ : nH'8~H'J "<^7ݳH{IэztE/ 0J֣,QIR08|9ئYAeQ)hu}|y#,mcx1bON YMT_&@%044uL'nF,cc !Ntm0v#%D{ };((IK*S%2K*a \M,*'% zt~=H4pfd ſ6Jvz,I0@0꧅,1dL*,㑳ϸQRALZ|a2aa"Nu`}#~:YR]- w =9/vN au L+^u+>/׬4L=LZBzE򄯄:ȕㄬj2br~A 4xdB]W[lljy-V'Y&$QX :uOFlq&QfhߥP8ԓz|- "È4෫+RYiI1ʘB c̡> ,]\Nfľ:L 'ӽ{i4`CB_ & K`Z+Pkzip44f:tVr&49{.4EE K䃁-4 \L9[.fVʥуe"]C!O(O64vHdzWqKmI-~fz1.Ic޾д;qo>ȂbaI e m'JC (V!8)g)Z#rZ⿥C'ZsPwX!r0ΐ6 4+*Fy-ENqwH`m//<'OWDq8 ٹ+{C5u!Yӗ\2ZnK(1\cf0_Zzu|Y$=&W$DkQyV:(,R'%ܾ[iQ|ÂQGb0[\B%zA8gmt37"{9Ӛj!? MJ{Q}lfeoV\zԒ->n͇-jGqJ@faBV٩v`c5Ȯ*"رqّhZ,Ͽ 5¼j(/uCPKOr0+mNlib/VCP/Filter/addlabels.pmU[oJ~WLZ,iJԊ۾a`Z Z^8Mݙovof4(́|yq%iEK'4є]GGS@וۻ,4M!yiƗĈhY^BS(L:p8 _oyKwu, n(^Fw|fSK k4d`j:L>\m: Hl"IiI&f3z<*OE <B!!>x)[>Ry]q 7r|4B!4V=xq R48Rӯ^oՇ&jI 'cWltoXo y~ol@zQ@Q{X0AL-g "//OHoh}cY%NӨh4In~~u4wZ5Ƽ3.s|'b]m _ OgFL08H) |EC8 .iTY{a~ AM\X^V݂`G.88AF+9HΖ!elyK5;Kp'FFV&;QIK.TX0Ӝ%*f| KYx@821n9doUʇ88B4̌f}R&(E'6j^uPĀ nP .e 4 /n ?MXeQ"Qҵ+kԽ~)?]]_^!G'UQ Y4)`!A >, -3ӏ,8rF!}~*8b,3yŕ 1`/^>[G<.Ex2VNAlI@|W1&w ,)cX2;.z;u\ /D‹(MX:e<4qyx+dL4 4DP Qd,jEJ(s.s]I#Qbk>>V8 dL^HQ3B  !\%f9X/4 Hi-DlŪ_QuB5KJZиU!%BVy^ڬ8X!,OAs(S+jiWH$P$x,[8 EXQu[Of2Ւ %\.M_e%#$u\}g " G > E eK ( X2\!1#YT=(Ԉӌgkо<%<8=/Ǟ4JBUލy4KCy,(R+ 5`DA^,"E~ŚsO!:Ѵ/;M>ÓOPȿPL;ج#xf7|IsȂ/Y< ~u,P,<̓dqƓ\(*#~Շp>21OPd1COp^zˁ M:ǫ|8{җ7[ ^xK+eX :c3lDGV\aPL# p=;.'ht ]"_jhOF>=nה Y僣ׅo 92ʆc-"9( |,گH.!8lQ<ğѿz1L>bD,5z hg)6Qd 䬍t@ -XS /Ŷ% ֳ ~DK9@_.2omm6|- ѵYjQr<ۖU숵_U.-Z ==S.6U1W%l8Y2A($9+ěB q؄~|m\x,89Z8 +4H˕'׎*~] ;k鋶u?YAyd8 I%=F#gJn[xj J;~eB1,y|$He~((9Ŭ93Zֵ}[sVVMKN `z8r S Xd :"GThb{<{v}KĪ]xv yG˂f|)KL4>>/>p)D#rYmG ޡ-[c?S%ĄT*hqÿJKal2߱#Ol"F MzmE 'TRlK'( ˘o7X{@@'{kZo 5Y12@JjV#uc Q+&:w$ӯ(t9z㡋mU} 4K7/_L'ZZ92Q׵5 EG3t@/@`GU︇:ĿMS+qpƈxX|!0 iZ&*[μUwQ98"{*CQC \A˰aqk4[jrKtR SX(sh: #Bźru7| 4Lb"R$z:;K/O_]2"i`>*8 ɛl|cFf嵕{4$1ÚV) \QTWnq(-hѡa NSTK$^w{[(6U9i=ԗ6.1@<(EIҵ*ht1 `@v> 'Bs$!r纮Eİ\&jaQjUiHO'}2rLq6qy_-/! pe[e|TTLL3X"{IhSIbXݤNb&XLFFYs =d21PuVC8ӦِB|z/Ǚfkкc#+&e6׺0r4^n49WZU.Q.[kPmr$PyTXJ\/pSU)ZaJAI,Q>0r%ff^T QfYZ.EG#S< 8\a0y24Yo^X4SfԨ]#+N4 y&pjА}Y RuɪkQRjdfeP復ńL$Ƚ`031-B9p3 W}sf7 9p5 FA^~Ag䆸%.T(gGsi*[e..Qx-xvЦ$`i=O`@ ~w@ sPozX:YQ3΍)X>~ \/ݧ}y*ҋ'V\/YB|R6z>4ǁB+Zέ7襣TGU)pIwmv"_D<\.f*'_ėsR8bllȈW.?vEp'A7fbƨgi lNS <Q .QJ,H,ofvOl&]y2u<#t 1<5UwQd"Ǟ0 XDdV?8Ql^tMժo5 5,\ZՖN!zG ״ܑzd 3m+3GCp̩ۣ࢜/UyӔd ³5/H2V:!@zoWBpe~)s1:OB}Jb+nry,20gݨ 2΋mz yDԃiNcu4^ԩuQ&x R94;[k5oebMEc(  ,23O dMLC@MFswe6Y^PKOr0SY J lib/VCP/Filter/csv_trace.pmV[oH~8b"7v2PF(iMe9f 5cF`CvvDܾs)\MX"iEbP;Z=BP2gFc^w| ~,ZF|Fwa.˃&D2ͤe01L3_V ^hQ"d%zaHsO9BfE day<&tYkRD8xN`ڂ&12,,gû/7[G0lL nF=t(JR|yaCF2!SRtI1gR+X.^hρOFan?ޣ`K0(FM`f 6'.NJ~*Gw wKP٭˷fQM92alzO[[Hmccj6Ovƣ{\f:<res?yp= H~djlmRgsPdߪ4;7XpOKMI\!ϊ[w[4&= CG}EHѯ5'tk~H3@zWkأ}B{Qٟ&-6q ^%:q=mӵr/BDӴ`8I=%Wכ]>9dPKOr0 ZM'lib/VCP/Filter/identity.pmmOk1ͧv=hъ̢(EE(*J=$6bw4iBoOF@~YRymY_SJ|/1.chgУR=*4[G7TʜHׇJkFpVr ~J|ߎcWVfPKOr0&[6lib/VCP/Filter/labelmap.pmX[sX~Wt)^^ d&ު&=3`9n֑L\x2>}I :%緟J$$ "u:E~悰?iR;:oW7~HgwotadUaBފi=WH=zMXxɆFŗb4]$BmyZĉH.SO9ڝ"$.?c.T։TE4Dgj5<#YO;]%KjD"[ijdI|Ux*Hq?˼yɇbÁ#TT$#)*V&"@IhQVqɁ+ yb@n,ZV PsdA)(iՁ'rW=b@GEodBU]fzTgH`j.MϬ$B89 LD%99 (_ksgY[LeJSְ*NSAE~sRT͹dsKu (LrYjQK WJ6IC&YNm@a7HqR#Ot:>C韃,2Ok'EU yT͆1L7>:{t 'z6C{^gB놦89>o%KtlV#`NbhydXCҝQUX;G ?U ֢qDGQ}=G v|P[ -TM3k^N|}Lz 0OW5&Kۤ୑eg7)|%x=Uֻ4hgE6Or#LGޣSN -(\@ -fl|򼚑ZdtQ|I3RA$øx|~h ^< zaOY;nPL8uv̋8Z@I=ͦʩ ݈G=\97HPa6J۵m 35ԭ, wmqȸs#vi?PKOr0lib/VCP/Filter/logmemsize.pmTn0+r[6 7F.n#95RtQ=KRb$4*argvG3+0ʘge\dR0 0 x#vy3NfY$)WȐ˭;H9Á~ʊ:ǯx#E8{^tÆ0yV 8 7kv@JAԐNOx}7> tsȁ~xnv޵.į^fEՒX2ݠEj72c4|hbŁróD>uS{UD,zӤ=<>{MPХYYη 2bss!L6"h8X#j+6;d8/E1Mp`C /,}PIZ=$ڣ F4r1 c܇6ҡM?4&̞6ֺ'ӟmH KRoCzzJȌ<PKOr0eF3xlib/VCP/Filter/map.pmXmsFίEl t$UW%*ٸlxfZG&=3I^{eo/OЋ t5O<lL#O^c60z3 w)w7xیR)8" A!C]P.y^PDbؽ/ӂw(f⚇s6m$OWYsW/Gsځ\]D<F\\7~׃ߖ2,DM7M@sGRWpnH9/VhH%ҍͼ\pacNd*3>d?wX-&Bs^ye  "(`\qaH%9cޖt'iQAl63'>q(jJ(%6-Uc-ª6/vIƆO /.1Q9HsN;Ob/uT8,R] _KNJ\ B0[>gV)%%QW[p{ӷN^i7kZ%yBCW_gpoW94 /ȾeewYwN7~vؐ~'Ih9lt1@'>?gۏ-/8U5DI/`M %xhQLpH%pÃw Q {tkOZk%NiUO+}9\m_G<Qr٥0 ^>/%2P؍`+)6,>b(9/+!u. H$~RP6/ öxb(5ޣ$9@^rdNaV<)0)(m@j T6TXKc#C_ķQ@!Hr|^a{y;5Zy_bNוcB*B7=Qz *g<((E2"@DS+=ظ*eyH('O<& iKN8BirxрϤnD1Zа3Aꃑ=H!8z1j8$أ ^c,F̟)X4Ήz."9JI4I,Ĺ<]t"nueqKh-ԸT^VDLxU29@d(..e1؟3*@}8½ x\Q7K[bӠc$y3?#͘vx~OX?}k젽ɕbvʥBmM$+oy*hZ$]o*;=:$Ăȥ˱^]mH,`^vuZa3ޫTc Z1ZEkNLYM%֐Vۚ+h̰EVKj*t&E -U< Aleʢ̅#5Gr>mhz{} $sh-!Gk$Gr1j)ҡ׍6"& d|BEPiAp+d"8hKab .PTF֙$[pr2{߿^8tlG".GW "{0֋|԰l5;dŌ㤤 AHأ@UN)+ w2Q-|̒sH{p'b1ST^ )b|F޿kNNPJf$PKOr0=lib/VCP/Filter/stringedit.pmmsH;boK'&s3738SӪT&JдF< , _cfg{1##Bun e6ϳ0^ ̏5RϿx,Qgb/ :|#yLt덥ӓ> s@/,Y, ՐXCa%R v71u'E'q@}8=w/ d$+"I/MUF, a,ncĄ7rqYLVXy>[8w}$T_\CJĝ D^$v3MlIL^ DDAP<zoO>PNP*=Mk8$_|. J^DL+'EZKrꆡF5ZxYm]}sWѷ!QakBj (xoOZPt@㘣rB}ݔFs^$1g?.NP ;F) I$S׿=kdN"Z+'nᎡ( I ?|RhC,’bGmlb,!CAtlSPy\2I+?H5ž,@рq,ׄ9%c)_Odݠ%'tS|n)Bcs? :VXR-1Zlڐ#ʥq\ILہ]tz &oXZ}GJ8Je,VP\^7$+/%t3Vaŗ>={+C0vVv(5/05"؜kל&UqRM2?`E*&?젌=A3],$ BT5P Vb tЖ)a"G oTEZo?[Ψ_!-b8}tX;W GHN[%x-M[=oqe0F%d]$9h{tLh=;Klx_w+C@4 jbTv<z` ,=al ^,"2#~"c`K .0)8xY h\ {8(.FR ьB?̣J%JMAzr{~1;l61rgPRG*7_p,qkb7zܕ('vY Įf ^/(0%G4`:XژC5fPd HG{ =9cqd^B/2 U"~.)_>)u@PKwr0gulib/VCP/Help.pm}{Ƶ/-)"ͳlQ$%ѳ%;ioB$$&%+mguf J${gml5z44މ;?>Mq'$eÇ(]ULA?7Gҟhz0وϞm}`y{A1iyE6J*2-f8.N ԍ\賫4po=i:/۲Jet6*ƼM4nT'+qu;LӸ3.w;ݸ3yxhC" k&^@m#xz^%p)qkJ=ÿ@_]M4WѭdN0jG7+UVWIմѠބFBgva]o؉/%>O.Sh6HoQq&J@'UQp?wW0 rb+SK[pl4o(BW@(] N)ïkPmiGVH&gTiL xL V1؀nm:*Z.t4,q~~wvti ҵQ+1^)^Fkj9J)-ul/K; ]O:WV؈7ET8!bK.N?ٰH͓9_4` / v*haynJ(qLU S;A~g2~m1u""3`hbe6cg0|Gxѫ$T&9u0κo3wq'_q7O޼>O&Ot@\.i5C3L? (.(21d`MsddcLHDHfʇ&4ڳr6Ô"k7~?ˇtDTbuUE1^GDep@weU2ճÏo0E>/HwG^.7(ܓ2-VC/Vf*P0GP dZٴH |{̓lv𭙼'HI|tAݍUI!A’&¥/B?N \y7\kWyv6A5 AڇꫯD*l?!9Psm)as n'l 64|6MQww˓YN$}:bT'DZ2.B n(@^ y7S(PHaQCM00,q*p28 ԏ`Z4+ 49P,d>> lGĬ92o=]x,.T2EJ~PE 6eB^]{"5k_v^^-1* 4 |N{~d2J9c"d$Β*b&TҬDKm RRz=/яrbL@bU]+{3#\T) Nvc`WC}=I,OG-4~vN_=?ۈ}O)xs?/8~#HՍϒn+$PCr_d`(Fuiuܑ>&ōݐ4 ǻ~՗|^$QFo. @]-_%J7"eː`t [ף&r@+l{\h9|}n d\L~W0ARZ_lefۙmZx<6%3;gUMԐRk-Ё ͈Hf pn[w.,VprђI,Ww RI(؞OHPn!ZJDGWѫ#q&-d#4`hbD}=r7}h ;14|2w?==~_j{)+E4'|vCx`Vo%I?>;sllAC`Dȡ(p>KCt\ٌ;x8x+~uaK|$~y{T9ˡw P(@h^MG!uD.\VuZ݆.AW M烫\a6{SO?dx<ƩĔzb|h57 W%h9Ѓt_CgtC5e޳}REvp8LMV n*69 )& <2 A71_5nq͙1hc:E kPYB v̛7~dͤ C:D8 M:m>q[*eUgh_[E\X)`Ft&".ÏF?2*wiUn)ͤl@W!"NzƗm r6N&3xKi2~# 9HÖ뤺3Bc0ן8sl\^ _>*ZdⅿxɋsBY3Ր8xQ[Hӯ@wKCV#)ژ ]5[I\HۮqԂU"~JL|jυ}`(&z{ȘjN@r˜Ρ4dwҰ 8USb1(Md N+㘃{A) I@|P  0LG*Tٯ);B"A&]/Gb;Dj7;JfNPV3ɻHdH KtQ76R803|XIpt42`Zk\‹} l.C//?lH贌c%Q.}TYb3hN +rS0;81bȶsބb!dj'~0G Ž }*d6B z 壸2x.#gJP*[fhCxO+K0͆NMى~`vWDA$!-}>7NhwvME^!Jnv`MRzad1s` dRn-UPn~ Ñ``__(; %gEY;y:r&0g/(^O 7TFaV y01}$%FJ8*Mni5nKJw![& At9rs'hI:-+ 0fNl<UA 2(xbn' KL&iB WՖѼ)?_~NV[p=wLY^*0ÕIR{G;0YZc(Ss S ?_(+ł%!!r_ M.6+]#Ԥ ,)i9Ϟe=׷ەy^ Go}Cs][֪ѿP5bnTP%MESA;9 E 68(F\W)%_0  yM Flh& T:`arbGɵd™@uijT0qrFURrQj8VLPL1- -8jb߻1CKΛNg v2r-ATr3+7jWfV""i)Tߊ&z^mJBlH4jOf *onOQq{mOTtd]TS@iKM2%P!>gDŽdIbTO/{$ZB8n=2Fј?pQV:l(gpHo\2A%}f&gD诚m|:U@C!' ag|-_چk,SŹ~ջ#I Jk#sU'.%NHFgRJz,֜(%#7X xP0QEM'ue b}N;xU3#;OSTE1 Q#X2"FON-utwuFS<-ǰkQD4ä-`aՃM2JWܶm~T v١X'GPY>0~#8&d1'z$%VsNpO5$nc%˽-{X t6ܳl9 t?lpndY8"0*:O9q^[+[1-^ pVX$Wޠ! ť) H=B@2Pg:Y:DbFaڟscW7KVW_Ӧ'3YoO(I苔.B(̋ {L~ոsEM),KL %\ЇY]O?OS.7% 0@ϰ`5UOWgԒ& VZO'؝ |,0$Yyk:EM{{|0̎7O"1;gF#V3jH#[B$PUO\xRdҶHx|.Э134j+ji-$[5o6QPd4,@judPIó(鰁vQi`eJQ.KQ c 0D0JXrBu45e̞PŢYy|ef{AI J,%FS(:,@Ln {Ѳ2)q1MS[d}E篱~Pac xl<%'Rv}x6&"X% Fg4"P\ ؕ id2Y . XfP%2e2b; 0To snlthO+WE*` `B:juot5rɶȺa1 Va|Gia [ ]d)ORxN)xX%i޴(?4,Le)7/'0t[Ӳ xr2ts1^+`|ᲁf#_ʺ#L'|ۙ> K(y]λ!իPFJV[(Zn}> k̴Mkxh>`bB ]uTB765z}nRMauR֞ɦ򊰱>eWWX~Puhн<8.t(ŏ/Pg.PRae'ӪY̐j2Ou;Q-(*X#rVyu4`#{(lDZB pzMʮ BE zA;mpk~$V9ܓδ* R㓣C'ͭ 5ς*}?* &8:5a3*>̠%dbmcdے^8yynSx7-+G2uեz'^fjn{ZMHUmw8  r s*KF/-M%d.úOOT[0Q,0K[N2EE@4п+M.:ڮ1&}]3lʙWvH5kTM\TR.qZxqG"owoNvwC3A6P%y0˟˗==_1{#L< T:cd)r\OCu/zz@*+_(rV+6"Nx4U+1mq R"*q_phH\MsJpęh?,hl0MRf0#H WĶ4+w0Ƴvrs)WˇAL _Ygz`>ѸTWTL 2A)k?j.xPe՝Z6$MƺyAEFmF A鈁mI:y2Hv0$'ke ̫PBTb)g( =z7Wqf8cC-itHK'e$5މE@OX#  SN}Kí0=v=v<"}!C'Oo `9&|DhLEbG>TzT;䮙 uH*ׯy:dm7gΩфR%q\rJrqxZfIS7B@jR֝ظ$>V_s`0/7+n]{(CBrA3k^3asC}og}\& k_Տo@H!?xs? _;RsdM(1ʵx@H)s9Qs7/La4ʑ:uMRA"?g_}.ǻNxLJm?AeЊ0)-a |ͲjN ҋCppob_n?d|hvǿ L[P*Ft-Lzj#hAKW*OXa ij#MP T]>7uP^T45^4H٥`  :?kۆ{;TFxU'ap!p^B!1Hk}M.x$b" &rxY+ ;dL S%҉d#ڀT;߻Tiynn13u%ɫW:TQJU$x%Ԗt*$.,e6tK-714asˢcS&]2`z>rLy]nl89g$QРW%hqgWŁmR#b仸>lnB 7J|o6n CjBRSˡMI-)?l T㺆}(ߣG #py# LR#a&FR;!awnpVq+^r:999H\:rN 5 z_<J Zj^QEB{3и = xŻxI^N%C~' Z3 ȣG }|ܛz\xc(VD3{VC- u}Xʃ7f(w2@ZƳvбN\RBΆJea!` is4@ױo^ ㇨MYuIlkie?}9--r i[CV=$b x`x9ȹ!" s#F͵# dnod.򐹅r\3xπ{-@=U{2ѳj>b. strp+8+ Fn)|\Ԋ݃ZpqyL%8,|ΩtȧN,[1y\cR߱AŨ_رchAǖJO /``DRZ$=tdmPۏBR5t;\ː=8S\)C̞n|1˿|LtuF)%EQU䟄ubt2 "mYP a[ڋ q@9[`|!>l,bU7#A.H{]ڹ(@ή])Zl;D6҃$46 @bWFISiugTV(8yt]l +, vaxރmoUI 7eCC6JO˚̄d<-Y 7zkEZ{+Nl;n ﵽo]ƣևy/7w51ɤ9ڳ˷ %"641Ҟn"UC*=6`2)Ofdd4s9*iagy3+#ENbD)<\EdݶRUi獴_tI.[cF X dY)EFm|Aw1~HS ]yE_U'a IJ SB$wt"th&w۱)F+yiw 6%H/(f\`"NSVXja$hԚʕ: ŦVlQ t~d^|Kch!|Ԏo`WGfKb",;-]zv"`cVG_LY0F zu4?l}7^`$4Ρ焹?,%΢0llOFkJ[& s'|775ȧy7[ĵxZHX{MWUYXz~);')\Zv*gSY??cvW.?5J`wAgrWlxɭC ,c*fmX;YNeife]{Y^ɓ,ÜA/X pdWkb uUqVN %ԙmxH]?#i8/{>ƳqIBNfЃo%Q!V`F7~鏇Z7U;_}&xn}ۍjLJl[ ^O䬟ʰ ^I<ᒱ7Fplv5jO2{^`j0OG[*tT4:*ZnAg RMa(lOePGX#Ċ4eAjVS_6Oq{oӌv\q[ҏrԒng׏>JR.oǔb`At0,axoNȟL9>DmOТkH)[N=ٍ ^ǩ}u!e)˹tR<=;RPeZDI)BDuQ!*>.W-<̈]/!INNyب ,GO%ppII ی-LZNОHO .v!rSSxSq _SCTw~:)$"%oY%  9l`o(h9e[{aNZ_$oh$OsԣTC5 >c+G^DP.V'ؤ KT{ gbE,P`8Ζ?2UrNem䖼Np=5 hvA PX[Q;5<69 r,neR^sI\qVhSGx@.l]ȌО:InSQ+.5b;KjIN1z[ ɶYN\Ѳ֗B\ݴDG4a)Y;:1CwjY 6( \!(.O\'<1RQn[8׌}*zFuЈmz"D8_)< |XdHY4i ڪK:"XxqG+~ÊN>qCm=E9JR_Po<}{xO *i"}2ޙ>yqӭuY!/ cfLڮƝ=(Rr٤2<܅ۑJd'MrXUnG0Ōì|قGzr=ac>vSpڪ‰0&/_~~*߸IP3÷oIHRƓl$KWڊ ʘʋqXjwד+5_"[% x!w)_ѕRJLQ\1e" puF}lYRޒOy[V  \fpg#H;gO%c;5Q؊85TcgDS º!g$oCAPP@lP^H&zK>kzcg& <3 {e꽯[vt~%ɴm ]s3c֗1e$˻3i0mG,Ԭӈ};ꄼ_cFOsM هY\È j^YrJ=ϰa7ƏG6]V6]DHv]낫}}oף]s' ZGW#&X{yJ G4ҁ6zd{6";2Pi g4zeٻa X߯z:z}t>z>IZU Cׄ|9PYIA jx:>bu`ÑYE򖢏|femTo|l`4Re3Xuޞ'G]ɋuYnKsֺ1<5}X2q#7?/"y0.K Ȅ#rK;dRČ!䚑JzG^h̦v0lRo1Bu.]jZ!YnL;[1!}?Oiȡ2X|֪K=FƬ*?Hqaaao6)Fz!M+] 梘/QRvP \7 ,K'a(^ܭ1gMMHkn!Wa5t!y># .m!TԇLM DA,'^ :&4v+H$ɑ~K*eO_ 3JFުjUNOP68'<8X:!7'm2cyF]rkņ*<9_|iR^|bۖ , JAp{̅ލ*f2fb",dDUXR+ؒZ- ,UK>"{erXG< ><E$ -pcW}=`( sf Ct`*Xxb,b}eO?;ԡv:1GtdֿE(~R#FT**!!r')#:؛5U-1r& $P,A~#^g ]H־OLx-F84>Ň8 k-Chk֧BoE_cU- k$ɬLk$od(!c ێ>FI&h]Í&hڄ#^.Bϋ#rccst_v|1_+IK +ӆ_e< `f]DyqMzbFp&ۈ\=-+^D"hO`b@|TKHEd:MHР>+m+ۃ6kr9 }gFACHl+2&U-d -g!`<]ʖY c"[._Wm٤1!-'W5=pݲUt}79St'34\ a.`p]K*ieRX܉szoK[&zDcx9v#*<`,hVfc-`jFu䫅E"aR$~UDar.GN&+l ̽fU WDw B%ZH4J@ѕ^Y,H"$mB#HDJ#~QQ%F:qՎ;*z>σ i i1ړ{HRbO`|iYOO/]aHZr<#n|4_@r$hi̊8FkJ0I=g,qRRWi8pԔMn-i4£-IFvi_[èr^5sQ4qsɛ& f]/<4EELi)ܳ@+dm$ޤ=Mљ*a5["YGKU4M޻1ؒc}r)Ø [JvT욌d Wa.j: @#ۣj*gE :d9{)Uɜ(B^!ͣ?9:9~y REE6 O0jw) mgE&vLAF)WX/*]T)QJa.ޡx3POV|)g(%~l21o NF6ϓ˒^H:;R]=/5"*3%bVro3e뱩3h;߰s T2LRP Ϙ C]9qpU;͡!z=7΀UHyFxppz.۔Es5qjV'ObU<Ȱ"X%nZwuun hկ 4 psy=mql:TY/Ǖʣ;jrDvؒۖg_u0荷Ғ2POi7ܥpHS HyK^P C<#@[b&LQ멓sǛdzsq5:&X 37hm9#-ߗ J)C`~ĝL3Lɹ_? Wa 5ө/u+l_:S)J)MfJ[$ktO;Qe_ =THR ѷ;B&t U GOR3LȹԂ>^^>]SC&@<;/P (e '<9"YôL^߽>9~K+lcLmsF/wpf,g]#7.|ߗP7(@'/{PHϛt6j:`O~ X:!b Ù!n[a-+_eȕv6TQ%g!Z6谖#PߤF:aTi/^};:;><%e_]>Q_j``qcA 5Jg/Pd䂗5g߽z[ō֭jh"HYz:dw죆lO1q <2T/IյK}< f 5;v՜vͩ1,'#])_K2J,ZChŷP#pS?{Y4K"˫c4oo`KuE}9rܕz`֐/‚mМ[3v|L=Ogq'4E:dLŅwxR!Iq"߽ $Su ֗o^ѫ\t^޵MZK:#/|mXhN+#_ b*i3V~` ;zn#ȼo SK̫r*u48`?ȑYlj2 MR9f uΘ/&T %{^ٔbjSx Ѕ ,) H.ʀKŝ8l03 <ig~@d~,7ٙ]xy)睫!fg!rOh-v a cPV+#aqE2\Ƚc3+cJ>^Pð u|hnlRo= fz ơ0SUf|j]!HazT]I,a˒Qk]?t; je#s['O|`W7N[HcE&FɫP/9__n^s`usu98 ;zD g^qpͅ9嗖V'RF~|E7^%#|ztz,͙)R '?GK: .i2Ct\V|`oϼ$xzl+a3u_ 𕟀.$ 3R xr^ phEgdA>V"`>g+3ZiA ;m֝YZ a=s gy\;vFp=9hqLgxNrFg-b8#\7nF?h7[ 8Ψ\݇coh5&6qw\^3x%\=8hfьh:|f*>sl[̥0Q&~F$eW5r&fi,Pqo[wr+]\rEG`QT4:qtIn+͢ӎWӨP؀]Tg2ߒ}\;]p_,}azM͍ 4wIXnԄ.}pp6ƲbDSi­MY5Bpa ыe ;|{h "'ip!`#Z _ˎJYyB7sL< 81qwjALcz@M!χ] BTė' C-ۗb^s~\LՂhްBu=|8!IKΦ˖L^3G9!\ &gF8"jٚ _nx; |w1UI.2$$E:b;_`9lpٸىX޽*~LJkV G":KQh~ƝG(U^<"^Ġ}NH{o^6-܄g;$AS2T`ij#8B@m^%Hdd8zK C8Oե"&mdSs0BO7< JOeSSXv[kοl냾ASfT"Ta(r'3-}yZ0vRY*6xaA2^SN#hsOdaća/]ʝ=L!!gAwwX/~lFx\}5Wac~VP [u-]ğ'vcI"gcہ&8A2ji{/PU&8|:v8R> /=O̢͢nuNvZ'9t㎦/DǨg{PD}=nrĭQzͣ?S7A;ru|2=~w`3A7VI83Vê>XO/\ 4  O8:a4 m+a2.Plt&kXY(Z:d@68M?mW_ids3l &747w׎ t-{tg`~&ó)ѓ!Ze#RU#o*mGosn.3X/uq̤7iKݲc˭6,?GuBNBG׬E:݀4̦$Sq&ѝ`:J֯"oݶn~\#XF]'3뇁/He0ݼ˳QR^8!P"B-1R-t\.];g## ,8{K3)c…SGFĤQfr|0[!ƽ)r/F"(2^'/]&Ss(o %rHDR`+7涾(! /#>60矊PrA_m)lgFk{+hr¿I=o%0 |7% }.>TpH q o*4>֕"OP$1yEy{_Qq}ꬦ{}ц2 @{Vc Lo! l,ve0^J"wǛZ 5]^& r/ . \ߍBuDr`ޫˇ޻a`gr*~v>^C1@t J]:\@zdA 2 yweD CNNdN .zsi$GXL=9x}@nVP}RN)^ da t5&)I?fYz&>J) J!87+gsMyk EHB)R%in"p 7ślwnygfΜ.-sӱl[C, OøH>1yJfj? 7#*CΝFc͊s`v;Okz&'R7ft&bv iXLq*94R4)O\ GE۠p`S*.JyJBR6b^X ͠jqfd+[ui&q[:Q 4)pbIPyŪ O7 Hq? ?Qڮ͗#(ÉMzﰡ6L9t]'W22, OjedfBZ3]^dY}AW&Xluh-宣#HZnUc,w;NJj:c,HUq0WdoǮ~^# Fh>ulBr3`X`ڵpN-w y<~AS_MjXt!>>cF~<^FhϮ=D#JeC*m $@m?dOHRrwcɘK;PYbVrwX6nf{ y] .O@.C$_b8X?LJ'䳌*K:7Z7tpv"Pd}$챈&v,UYɧ}8NS;r0uјXrmi?uyIv{Xq✌^ε \,hXBa-Fۙ>֎=yhr3d1Gǿض}Wǻl?qK. /A7V<8M+%SugH' qkS谓ԯs)9azYBCvaUPRPMah6QeX!V}'.5ǐ)hUK7D~PSI#bvح8oKQ\W86[uMe{›Sy1N7*W4EVqzq8hV㮦7!ȿʥ :[?ٍs`3)]ys!f[]~f(3U)w* &Ovumq!mw端sasУ'wC(؝`C@,LȐ_WBpnMN5A*jJie|ȂtQ=)+ jx msMB>,]S JJ5]WݕZBN }X 0 0op!r\&Oy]><ܧK.L AҋBqqgX{#*'#t/_xM<m'e!K#)jxyHHU=Iѕ5c"|&qXE y - HL,w䷼MT;XJ%0mv`!*;4V^XʦTi1+b(`l~g%35 i [֠qM)8+xT}j=h2d:X/DE,'ς`X_uՋHI $j䁒x,&_X 8ح6( clzj={yMP{>M'{{%5}q 8bc RǏ F)}TY.yGAPOl(XStYY..A5k65ح5O(2&[6hi|8EҴ3&X+}*zK@~?G]|recLegviqRJF0C߅g뤍'}酣[@M2uN4C; ]LΤ^"*SVa3QNpFPm%ȹ(TEQJP}&^n0À4z D=@i?;XLrRcо5M;]~#ɡmM /1 װF&W$HlRZ jeɈB:=ek>@Q(IVUp598XS51@SQ't:f3\ѬTXiA9]×1GF#iEU W0RY>jXr[PիK"5u6~z+s ;adF" |7:jgIe&ggcv ch䂹31pdiN)ųE+HxcDLQ j%xhŨ̷`Bهьq)64L+6f3xBUèS,eω "0]g.X:W74uW)K \>0z{&9&F$RX-dl7~LcdF-yw\lH fEwg-|? l\hr8f`^V"e:m݆]K^.A勊?~$_~IAZe_ۣ]0.wvqӍ?~x4֫ccW'5A'2gջfzPh)B<$"5i}S5y} lw1*_G% ;~ߪ%/̏;7ADsiGfi~J²ҝ{Toep1uif#8b%ci_}UXy9/H"g;uHNӏ{ʕ;%P.h?kݒz^c¦+x#l9*v@퀺 $*u޿οQS=?R=i? ѝ}n(W#/G>.Y]~9=> uhݧ? q'*Rp|vq;~F CF ?8#F\ej} q•ADތCy/ %پ;Q /SrƇ}DhxTȀ5ЍmlP\C ;.0ۚ3NlOS0$.JRi jmע*HV+܆i&r˧$Q=וP:mG/>ggg"DšlrhV.$saNLզsaȯ˕{ 5U1khP~_/w5kPu.u[z#Ieʫj7]{!mʅwT &#n97t7dnxܧ ;7B͂sc XPvE6zX_LkSqIfdB;6lHlDm[uvuhe\`,MT7'6MPWgo3ywpknqAP*+ﻳ!-aqE=!Ah'eQS!EVN6^#֨39vzh /zTk2 }gQ|֎PGЕT1쏢bc:[>'/<>)0\}csah|DqH 6PuJsZ@TM}ZЃƖ7( Dk2WGb?{oD`+ݐ 9*N:m<{,b(=S~2+Sw+x?Q^n>-yEO`7({G#&ILG}.E(`7Y~S #?=O?}c<ړY>r{)P\jEg%ckU"Gr#H:0=ե>&b<-k24-a ƠR!-;lu)`V1R'q$:L9â^[Owl''lvb$I|+g &^<4vl5n2YREG@7N_&1Gom^oM; Oy}b%MPG[|Q b&y_~R6\i->츗.{eOC5L]/_y>4iWGQOtXbP0"U?,1g/,]xn)ǽrG#(5Nq컲̿ETƞw%t V?۞a#2<7ɕ 7iH-)Hf̖L$VDj&@%ix\NHq9}yg/s=JZ̤ECØ$&H~E$iN҂I ߺ+Gi$Zs~X"dAuidm>Y!-`8+29hŲ"Z&XKİ1cWQ=vX*'nr*1ZjXUƪSEmqcT]1S]񩹱hT=.͏KգRCTOW WE>\d**Z1DxRᩨ5&8b`jŠTdwkـBDEJAȿr5X)+tg)`:gҢw>OKt߾ByzNXqebXį]-Z*fTjXRqecTKŧM|\j%bQ ǡA-Z2B) NKĜy1{M=XSTřL(SQsrh|wS4 ] xsNjE8P̩-IIcM/?̽!5tG)Z,j 5f7t gbLѼjw ė+%{:cvaZ[FE5JғJ᭾+GNidT埊GҎ̴x<gxltsjG+|Vv(}J".L蔤3FtvRk*Žq7jglBVz9@RF~-I'Iugq>GDZ/sKDH3)dD׸؜/UzԌK/oI_JZue2>v `!^4 X&x902̬r{=x0JA֧n@m6'rfO$^Cr7'OP-YTPqP_ip "|z+ `~;Ӊr=lc;p-vEKɕU=#o_%ON]_fԊdPD釬T68?Ǐkf:B71k}xW:T4 [g#UxRLm6eΈ'aWuZܦEY8|w\)̪}Kkë~GׇwS8T xN7֪n4MrVugA¶hL$.[K2.̕Lj˵2t1_%|jm+а`'mksfr2~Iڌ ncRwa'_%I؏O ną[fwN;ivT ܌B ?SW~w:OaՋ?xƻӣUm|ׯ^z{v/#'=^H(M 5*%reIa0YED^.D""+&@GOk'%_;z֎&[ /aebYDLvNZu(|e;7eeHHߥIGF~^߂Wl8OO뀲yXDޱ>H55WE,FîFΪ%+ 5_`z4SCyHk$aP_1I¯MI٬ȵ[#h ׁH,Ļv~9-5L?s=p * N.#gV>jg|խ(fЭ߂B7y:7y*7yuz+*[6 _|[mJZ׋4ygћIKf\h?ѝmCέǂS TiZqq؞娬戊;N؄9BԐH1,P6i~M45 G#!VjyfTW f+-'I54AAuBaA0W|(G ghuS8Jp3r^A+g0|:r j<9y哎; pƐ'Wo(|?RST?u^60 󋋮Z\֦ Uju\$8ڂ&CF!3_ q%YD@g* xzt?yu]\&,c!U` ,3IY,>F5U#R^Olŋxlzdc ˄e*T/+ٔ\ZҐQ5p,k=Fg䬽x?N8>9:}(h;4>㛣c  ?c9fz 'p7Oa'LFE?qEg9lbE*']pV@QHU~3e{3\G&Rcb2>JtbT|/" e#ڒʮi mWÖb(5LWU)-IWpf6u2xL_͋#أo^Vt퇣?-h'Lk6 F<|t|+7*GmD+ͣT))#V&Aphko(Hn- mk MXeri2,`vTYefܕ|Y?,t/"2d"IԹ1 : n)TX)7HtԡD>: 164dOD֘|HhjܾghT=eG#t@WV&F*ABʁC *X]4\/O)3|wV*|>=^O,YkzxߴA% 3|T{!0ÜU#FrɛX`5iO^RLYRˣY[L7p'ÔI%uN S{nzF'7b],1G-қyB+q~tTlY.G;ÐBVˈÁ||rEǷ@jX߁̮h]௿X7- )(d(%١%1Ve"ZAb ݤM]3J+ "'.\,A5}''s"ZtdgGhVw+_DpS!aV z*<[];t7 3e`!lȶ0ʧy(Dj^P]2 ͅD-'J(iC< YZj„CW|*PAdqB~p2wh_a=Y],8˥%ܙ-Q'_G#<]u>}_,]{ .f WFԨOG]5~a7](patid;&5zmE3AKc"KKb{0(9cVE'آ()ZK0 s/Hƽ5偕hP(Fhcb X<}gHËr痈o3?wL*~&?{:=}s!> #׸~y&?=嗶K& wŖwqm{|yBal@ u10LD|'(d?9EM|p:cS.sx21So߉| ;6ă<7E-28,~~Lb2Eu,aUx;_:]{ ep<*Q"я"*{GO'KZ3A];xM_⸳ J%CJ2keӺ" ɫˣ߿>dDRʹ%)h5(dZmeZCcf9M,0CQw$~x쫟,k{BFn,IQzV0T= af4f^ėEh<(9ĺf"O@x ҉*?/_ aI>C_5 K199ڛ4v)ى9zڌM̄@'/vcfxU-XK vLtpG? 3TRƈEN#EQLж]$P(Pd⤜B[oˌbW%,Ҫz\(gOXT2S3k8b6U{qF|3ۺø<`xmqւgKb)չs.͆мZuw'p7"5˰Ίg7^ט̦v"S)+ c2L4I!YJ4r?p1C%b8%,Vz X)e%GKN%OJdz1ֲ7:)hf4uc1QfU2d[0 jXpgV^1oQAե¡|ͦ)$Ի>#EH.&JFR&θuрᖴ`)6@üC4`GpOT"S`?l/HR`eCu^)kA"|A3+)RqV+UNh/Cg(2ZdT6{lIoH[􊍒t'/7oUCR| KT2ξ! goѠ06fUf'-Ҧk7#$(ʕwRC@ -U\jH6Wj {}qŭ惋{{z8{QG[ݯ~y}.ڤ<%vs:[)EbpY܃NG6N{ ICS|f>׏UBaU Tt}Qld7w dP#XƢY򵱸6"ַ~ IET.Sbn Y@^|f%#fMH(hl+5eHvP{i}*IpZ\f*Z- 8vR.]umjjJ]iWlL@Fuc[J~a"((@ yfRמ>s9^T>L"G&~k jpe_pkniYpk7ɛ~/j!؄2#bTpoݷk˥AnXJ*GphA~׺ߧR_V {pAzW4,fQT}uPedeqO|gx7̎ub|=cD޳fq\ݘ)Zs$ádzs7)mZ.0Hxx3̝N܎D*Tx䉹y$nufkmf*Il-Ӻ.ҩݼclɆ i;IBFWE1"=M2? r-g^[G6:P=)=rʮ7 /lnn_!yGQJpp)H$ؼ%WĘy}ſv$<^{S̴BIu h81o 2ȟ4^EMq0$Z_f9i*E%((1>ILj?R!4@!skzJ?AƟ V<)3yy / WOFo\npww{[FF7fܙQލ7NՅͬfS_FW)/o?b_ؿO7mlۃل[Txã[PKwr0Ԅlib/VCP/Logger.pmXks_'؉؄ao&TVR챭, I&IoF u7x4~(KFH̩7^OkZx˫k?tHn5"z?뎧ra 8Q]o;Gf$_Zc4a4IY5ͼ$s3OMHz|wqd"!S?,^).^y$ԯ׆YI:<*(~d &eGb >^,i{N7>۸΁{"sgR'w기=?9i( w #n-B#JD̏BFt{7H۵W ZciP-kDJ"P3)iixQmr=3eXoȝZsCpFӢ.p٦.ۯh|86M}͡KSxhKfD1 ~'XG%V;%1yA@TՃ"NX9CG^c]$D^AwPB Drw gkLPR|f ?vIQ݂IN&~+lWA!Rp5bͶ]iArA6vrIAW]>/x OS=̕ŠToB-^LX z'ea(7léx?BR 6QHFvBpn~ae?mڪ/h_*Yv5a<GO$롙&;:,h Ck4s93aH:Tn4G{0f.-"Iq-< x+O2^='yz}2*EVWGfVcwakm Цv(2С;2;~VP*CS)vwi:wgDߓcjYNsږUf%ϡ-P\_MR.u$E]r-rʋ`ޗ~qLģNѸ (%s y\F{" )bfgm~^cu~͛YuFΛ80cŰz.1?T0W<&==j$BLV\0\]zT b ri1,'XL8<5}3I5( }Qt5++iK=,SY-`̛sUQkgr-PSuvqą<-7S#h*G=Xi,ֆL_.Aq.|upq}bG(~]H3)Pa|,v}S62gtJ]ʒ/1Ϟ]?o=f Q,BpW`e ]zz"T8 /uӑ\(896`>W}uo=|˻;;;jߓAmm?- mDX`7*:3}DJHu~HfP{T @F@"U_$+8RSTxy]LHU "I<+?M.%5~ě_-K7 Y~EZǬbo %93k㫏746{__qƧƆP}pQ{F`+S838_qeU=G=]A/ձ:`m A:;C ݎs n;r`]I[ ͵b[`xo@$/qE~_t $ZY/quN^e б?m9RaȈYmk{xSvu7Clt! _+^$5\GD; ۀ|u]knS+:m\$=6^ٌ a?ywq*U $~=v?f4rgk27 (VxD3N{VYx#r6B !F@TV}-]ADzY쎪1jW6/ ȶ18Ϋwg=wגoh~ <_2Z6$9H^:GHdz:N[aV)/"9-qv|ywG[A%"S}*}j>< mH/sWF!BscT"Y7tZ%S~[eaNZ7>hV@`.C_0IB, LL&XC .~*B i#d1 s.a.RR RÂLo%֔H=3SP\$HŲ[ꌼW!mr[ QbfBC~I젯 I޼pu۟i]t`|QGJ|Ϲg؋4JCÎ A$SG;_(Qg3 @Ydv#\DEf[l @1PV6<4ῒX]x05D3Nڔ_@7jOVc7b~_=d&ޛwc\ ms,/ku>,w_y:-`VuђLLPqVdv]⍮GoOO  , LL=GEn汝,F:L`A۝Me LF(0+rczcZ-3Pʔ4`6= ᗽ,oe>Q?@k|t;Kxx-KGPV4k/`TU~&GN^Z_^()yxo~iPQjH)gU[# KirHHZ4Z/K*H\L$Q!=bF{,FcCisuB,ւEᭈk1Zd~N`d1DZ?ua{=ۃ4W]UX36 mKQpQ0|H 2r4AcqN7VӯDulOainnnU:v+yZ.#KC4 NkDq!@h-E*hCtQYwvrʪ*UxҼ$ݽ]^m=*mFU>?n1%*! jRWΊ`m%7z@s9欑`{P FXe$C͒2xoߦmukQS -xPKwr0YϚnlib/VCP/RefCountedFile.pmuTmOP,H@Z;龵ӹlYfQg!H/-BMܗ&=}yI_d8;$)믖 p@p/>2=u_^};geD%8,VilӴq|N6h'L+=7A{@j)t9LmM+|>g~?;Xp[ȏ2I9l\kq{V5( 9 C'$.1T֚4&㇔ѥځӮ;k0T&5" J02d< )ȯYM# Ӕt.j$q 4ApyW?ٛ h [)d0ɌV$s`{;ۣ>ܻiۤ(gtZ?܇9g˃òQj 6pcχ)o0,}:j /Ltpp)oyQ JOG_8 lZA\}7tģ}&ί:|"W~."gd_zσf;vف]+*rѶ^Lb#Hv[?!42o?|}eAPlMbXYhnY.wզHr'Yn=:r{@q@Ma^%-lơL2Ȱz# 4I(RM6inԎO&2|F9Ȏ T840BlAQgÔ00u`!D;).c&BGYSAUa8֤(ײ`($-XԤ AQ:.r])Ip)K_-}(/ kWHuB0urWzjUa* t 3>lՋ-]Lu =}uj1֑HT_u|:[@=dhYBE|2GP 62Dd6vݻtOhکv:M^AS, MBӳabb1L2,X[[8< BmGF\Ǒ^Ts2x\/_^7$:ǟ`d+N;6ؾ dr U +6zIeqʒ&x 6>!FC[M՞-BN U 4`KL.{+ɘ/ݿ0-Hlm.0 J[InEh<rEP`ts gCxaK0h=kP_B&9p+9Cf XK:Rt/ 2|]\b+X, Pᣤ;lEILz`rNIFEEajRӰ!cG.k {T" Oi>oe)<Ű'(h)mvdT-~{  ׈v"}" XwCHڊY|,8uޫ%,~9Â_+FcM Ϋ<1o$YRp<P& 7a$.U>JHu)3|ޥ#~[u%SrDdhV.PT.U:Qu.!ooE{Y7?[qt(cJZRVjFG*sBN4d#n `dVjM>86S9KҤ7SUy]I¤'JXuxAM4\4^ֹfr1GS ¹ ~ >ĆC3*g(u_5y0L:!D_`]n-U}ɑr_G `fg:+V2iD$a0&'_x2hY}-ҜٳKٺOK *3T]g(nۗģ$$}>J;~ peH_h0MT/~|wg%GAC :$gPԶiCy~x^+c|ڹJ,'DAӮFH&/o2o҂}s{OR?HQA> IJ3{,s9I`zg7(6ZEư֪8vH N`\.6}k A>X,6 AD \܇_Ȏ!uIV?dmz$c˷S3vU늮׷ڄ]zWj8VuZ)ڢѪޤԚ>c\7*7,)XvWd%Knq]tRӴ>}$KSK[rYQ%&MlayOYΞ}%M:.42O|9hTjdNJo8 O_ߖf=]L{%RwVZRM;VA` nΦqF,ܱ+{:n/xryO%qLyb8=_Ԁ?z>NFh.~i=jU0`ݮl,0/)jPJ#jp:GRqGpˣS& l,ZQ8n4ܣHANFfF7Rg9E\H=?7t)E79.68ܪHd "(cr-7!|$K6©[,|H)׻c>Df>]O+(2uqژ+o_ϽHg>37=sna aҵ[wXR:ׯZc]+H1\W*NRoU^iME&@U^äʨ9 C%~!XļzŶ|o_Ñwr_BXm,2&2]xnYs:+#(\ᮘ HsYo.I5a3W8MU-:HY Ռ/]Q Q,-טSjrue.e5U|&7d7*ۉFʥxiC +Š<$⭍iZOA1qR$ ht[g{+Őf6}fnuv?П!"E:E36cC!"*PKwr0zlib/VCP/RevMapDB.pmRKO@ﯘl9@dZLL@O&LJm3c^ubzng '" O-g6"B udS*}ZO~6K2 Ļ_ۮ]FCP:3jX"i|ˤF:;8I.R]z8f A/kA @gQ$12(^rl wy=Z> ץ|Vx*W5V _dEe0imd:x>U^NRqKf q Q!L<RT'cTV!L4n/k"U2;bYCpFiUxс^NK+UgOV}cE꛶ޡF?N.2l.58O}qX}PKwr0fK\lib/VCP/Revs.pmUmO@ _$ZEKՈQ:Եi4qiiRr wPlylw/`!jk+d4Ma㏚?ή'cK'1s?p>܂+h*%Stu{.,@Ӝ3ߎэb} \%/yriבpJ従~=/)¡نp[2,XI1i7e yyb]'V|K)q|1kQx@d_`Ik]ޜBmJ}`x:]%J?禀X'"WP| * m ~yA}qoŊSpBQU"ul/*Λx%ht*)n'9V挾юPKwr0+%5 &lib/VCP/Source.pmZmW8_1&@-3Bv8Br cb%ֱ]ˆahs%ٖƑs^YY1 x;̪E3 ýgZmMojߎΆǧ'lmv4< v TDl 獶z~wzr~|rqdELwDʸRz=pdXchAoa+t!0.㓡Nc7m ڕ> I9&sM\k^?U9y&\AǧCx0,mWC;dM~=WE qrcyPIBv-egO) #yûn8y* PRDz { {aȄbꍓ> ʑ} 6./f9ry|NCdfK+e& na?"nY.ԕ^.okzrmVyKD2Olu%FA%H SY=wbudjN5;1~N*U̿R9IW:Bn8 ?R,1*1[{F't2 ޥ26$%hޕ+  鰶nowD YdlGN2ZST; zh~Ņ8Yzw6+ۥϻ)7yEcLbi"ֺݦɕk$aZ6son@-FWhk?R-ިS^f(@*?[//Z*ZN15m n?PKwr0U);8ulib/VCP/Source/cvs.pm}{_G]I $F 6 wka49H3L@o=9!'͹ލ 35ibOxxs/Qݦ̫э? v] /EV۠~_}Sm8{}z)΂Y|8*NUKa4 ĉ;]эz*a2gi80лInk?uȄup:̟NE_I}qNhr"'`Ե1 (~&[ҏm A <10[m4PRm#g|OE Wۨm|Hj ϳ0DcQ`GL(HZA3'm`>8vHaO1 <eqr/Rد!ݝX2511rOB`vG0Ỏ34ꜽ:΍'ӬdKW{3t9y{ãi!$©+T/&IV`4?QȑJD80\x:%H;E0r20O nIdJĢﮁ4'Tt}xwa=yVb?Ů| tXFhq|H zy[:ǴA4VgǓwqjg4$)P7-<(6aF9`bc 6@6#9z=8?`zCt"aa[rjBĊAQ _XtN_`G Yh:z{rt~zѻW? .댛GO C*FmdZYL#RS $b`#3K,0Hg ($IPРK[(? Ng1 #Ǭ*A` A:;Ƨ]X'1,Uq`oO`p #)v4Z`jfv/6`zMz^e;/??>v4zŃCKvw ׄٽpĦ:p D GEƈYDR)Ы k8ih"9^m)Qt+GJDOc0)$V@jad o4>H=Cq .QRwpc߃$8r5LǙŃ-$,E[YjvB3t&_V#PbDPlW=\e=Ҿ00iZ2d]X]Jv^%I)[FaRZXg+J֚= HACPLD~v=v^RcΈg%od"?I՞2< qlhbC#Q>*5( a`Rl# @ctCi_8w}tdF@)h _G;֓y0k3`惘 Af$1zaA}mpm="8=X!@Θ_Q%\z,=Chsq0^)iMQ5q&C ۖPɤ,Pza}MѿML ]@ƃ[P4 ׃4v$<|2u~ZsxZˋi5V ~74[(hm;?$ Ȅ-mn!mk6~gI@՛ɓfAw^p|vܫu@0jԆ,MhgDЎnߴ;s FSV+)?44[Xꇰ49@ Gj_:SoCZ +ou=W#K95떩i=7x (5 G9\^Ȼ@v!s"ݠrO5 ~İfmkށРe9=SS>ҹO0K} 09lO+9HKg(x'JM&axj"b bO"`"] )xQs ϓgsѽΪ1C'g-2\|`r.KpJtL]vKH $TK#ϗ | K$x#'fKSNTםաWokgۣdpr+M7W|tY$JmRbIլTb@6Ev4eH zQ d:z%hw3)PJT|WNSjFq.&Q8H7ոKG>{n;AnA$`} M 'Ad #21eh9'Ef҈ 0(m䣗i{K7v *c~*P" 1<S8l6wZ}@yϑE6ˤ%Ejn5_Y>,{G7* -\οOףE!8 -yzP_Nt\2B5Qfz/lZ#mWQ?bxdIM3}ӢT`y@ʚ/ 2$^Uvc,-h1[eg+#d;mC \+:!{ynNI<N Iv'Dn|VRwIſFq?Uv~ނ&!eդ~ 7< iD.ԧv8Z'e<PwH[RӔti56g\]iW(1t UgϜVC.!0[Lpa7+NJFv &߶92"h uX`T PF#tg7FLaxq cj)@aY ~&ce=4a`B @ .6(:[+@:.wq%hOH1W†ёKk,*'P#xߵLE1QpSMX 1, p*CL#A0AͲ"-0Aghdp؝ )RS ?M6dҘo%ְշOX\ǃXW tnVeJæayk\=jEU]dʨ;>Wr9i#߄(T|wh:4ndu68E,>yϧ=04Σ3UŁ̉Ρl҄0$MW1J | LI3\'}\&Y#Rw3QfU%P{Wwc+20I'ePXr|[2sӉ|s?Cc$s<\2~Ÿ7D}>4,e2֜5p% /!#'3Ss^IH}aL&3ܯ5{F~ ?33ݹO$_΢`VYl:ca$.~?+CS&_ƖK|}[` }6-3+IZ\aΏPּeJAE: zeM9:jY c!{iNӫ'qvZ0No@ Qs8,@5M+܀R$,AD*4KJW)m۝?`;^qbm uT|+ O)-1A#ӮQ"7lQ鐗2|s8T'd.U+y2>{*LrHԇ&3(cwk5)=9g$m#!Ez?S/(O}T'n\M T@%N+NM[RMtğľGȇm"-&3 n)FS#ɮ>/BUnP|AsW1VȂ-ۿ*@C5<\qLsJ ŘsمxlP",.ֿ M9[6>06PlmaP>Ek3Ut<-f Akda]rd Qj3bAp/C-l?}P{n/5 p5,X& A;8mq&J l*Ԋ7k3wAC*V3KHzh#nZF==FEi{ip`x/& P?pE M`Iy`uPsg*NeT4Ք!ۤs`'3[IwP۳-^Iˣ$a!vrIB"Ý?3R[>¥AjX$bFf=f$(EVz;TSոKMuez΀Ab$qϼl;ߴ//7oeKi|?=W[MM'a}3\?qӊqSY&  \  >ρzg铕'3zsYͨUZ:^ycT&2]UKe,:F7%L@kJLz;ގKYoSZ ̱@Ї&W0<QAVX WEH#a/>+ci?R&q 1Vu0!dN.N~WB?Ph&9s NKd5iW˕(k-<m o,JNsXV]jb4l6km&  >g)d)kA[6tq&*lfHnѭ#ɚxȋ4d$AȆI) bHP0vG ]u'|\9d!c&Furޛ@;RtK1kS% z5k9GNbQe\:|ǰ;]nѰFt\QJ@!-H(a}ggxDv qQܙrY8pb${S 09<6:_$d NsZg!D8=*>  KRnk'7Xu!%9-)7(k/ʡ]qgb}ٻD+M. YI, 1oM{Y>|.AnonD0.4ļ)KJJMVcޢP, e4 ̧Kv J*%TRoxoyO taYU8ipjU 'YDQ0K1aZeL/'|'r@YWȈ:×hK(P(9p&G$|~϶:02y182V.ZD>$1Hx[^uB,J\z'DxnnpK=M*o igcY(x$;+БTS[3M l7}Kb&3TU@M @ަ)D lkɨrY6Sΐ -!`P( VIp%Y= E7o1fvzîcPz?ov&Jw׎ ` =l+>bs&ru,)뱣QcP ܋cDU!|%#.' q3#r'IVFE/ۑwt۱ڹ:Dᨛ Ca*Go??u8q|1S<ķdA3]Z2m)!19YRnJB֚v2*A[$Q ֪:9I^Ύ?;zDrs|PP_/ c߳5ڭsL%NBfϭu}194#LX2  'Ojna/^īOώ=4z:[:Y8{dDGGu 45񃱆(5"8:a}8|ughF鶨r|Gh!~ o`g9]h4Sc'gafad케sȗݩ75oV>,@f,s>ݘX0@Xܽu*Ə/>F(rnhTIF4 A}Զ0)۠y L¤w:0{9H ˛Ĭ%RN Pqp0k(浝(PzK 02h,;%O^'ciD)'`5)IkUP2uT~S%R8JCp zG%k/^q_'bfPd^*@!/83'RāMM~Cvr)/?Hɍb=!(<bЬervZ#`qVA㝊{nr/KWo?i'xקϮiZn8t{u!ޝ^kGfN}(U=*Z7@[@j X{rq k2 ɇGd)R&_%aúC:q1yxI:HAx Pk&8=v[8%]B-[ T)-H%xd[$VlPxQpUm+:=Æj kݥG!g\V@ަU!Wqs(+,q^`Ps]vN:,[=*ގrHNK%b˪spnBxTbpRZhT.g!߃y_Ud"Π6>~]nJ&%3Jr2bRbF֮u &{efdL Q,n{3a28H)qY% V8?; 1M'sw }BhdLAFۅ%9#~A, ^rEw2չInq DB~ P$ZMo Uw 1Dg_]'B[TpKJ-8D 4PA*-p~ng)dǝ?tjJ%iUՒa7h ;p"g$ӹɻfCTSnƠ׀1c"CqM_YbRNX(ZÛ|p;5;5P eOE]UbORs^iuDq4Rxp,+u)rfݢ}юYblX(OHpڰLWۣ@^UD@3J4(BW'윸 2i5$p<NF]B[pFs(]oV&%H$@|1r{ B~zE4+YVd;5s,P,7Ox3F#]k^8o+5+S/|֬VXkg+*G3[c[mťet&0ql:t JDz*VT qJ1kgBsuE>'Pe/ Zx銆]@Ȓ5AK^IqT ̥ΥTTw񫷧N?!K..Kk r+RDߪe3U7Ӱ<'1$*5OX0md_&F%2g_d e(V Пc^*(V 0q <"Lr(^HJ@ݨmwEO: wd|'MF lmm']-jxEW쵟6Xv6KQVG#:A@wtIvwbվz_x^mCfL*]qמC?IBخ6k/tQWl-vvk[[[RGB x/gO|I~oGl8(lI,] I+X&^0k?%~UwoDݜ|=zx*@~e <2^9E M@W.V{P,LҞD15 ,Uzcj5"&K<@tc w1NTv-LSU+ҫH-TrZzRkjX$@\i=n  ؍kZ/Fɛ9?"?dgY,t%P~)xJ0̶B$C,9EK,_ waxT5>itf2]}Ā/Q9,>V_nP٭`*1\fXݥj_] 2*aʂW*ye]B+"!@kj({bY-RPdUfM$b8κ>ؿCzgUE ŋ 97YTn޻_{o *:_V`+o(V^URkmv2rv]]vmXk2&,W zݫ9se bx6B⏲8<|ao\c*Dwxˋcs+oF3U7ql͸.!.UF(=st܅I*KTuR)AXPKt/ÿ>=o LnIdH ٸvYoA/,ZE G|tpFs.y,4Uq9|O0Rd7ho`!H' mrzSܺ0pU=IfK_*?Ɯ4˫/f2#p,%9rP5UV!h ˆ ºBbW.a]qH.c60L9&r$)X˲3߈>Xmp_"}s[`/'p8W>{oΏg}tqT u9-@KNt&, I0ӥW׻f2-IZbDXR|dlb5U U>cYߧ+qGkm̱XF dlU1 HCցCyђt-i2 Ŕ AS3,6B gmI$oӀpNl#H'sPOEIPRurH7s\Hq8 ([+fۜ–ASA:6Aɺ wPTp.WȚNrReρtVKtR `eh(Zpv>5ѶD?HGXfnv1œ%蟣h!{Uț'%۞q4D99i[xᔨ=wnW?)H588z=z\6@߫Þ kqˡܨ$ ӳE*4n3q712%d?ɏi6UK @=ZtB3g3BևyUJlXѡ^s"U8Ԅ30{;ƽ+A3k]+#{j6mͯ*mQs,㘭a: R|3/驢{>S۰$@+Xk#Qpl04$#Ɠj-CiKI+EBt[Ѯ(!P-6VX>[٬Ré)oo{9d66z/EMWpQ}$b~]k_PvXҩ[ {Zћԭm^JZA8WPm&;/~JUsX\Hc^G,tM낸ax LhCoU,:+3"Pެ—8nu՗929Q<#-竹ȥ}ujk}szz{1ct/`;NeTq-%oG bHGNmӤ'֘=jKn`%՞ݧT<1?PKwr0 klib/VCP/Source/null.pmmSN@WLhc!jk/j 5m&h#SBah7R]hcβP-yoޛ a|畈pUi/6+=\!PuuuU<:yXmϞ`gv;BDQ fwjYpYrcL䑧:򢎖!NIj `` ]iB':P]#,!:rk(yIôK.k<436*ܚZ7Jje^wsHbLggf1~1Q\VKXmªm"1*1OyH T b~2^bw|wA0),)~.n9X.Fз֝?><<ǰ==>>|8?89 _$A4~xìQy biRg/Ύ/ϧ(p)E D?8MR7/ra=驍)t01e0aqJah]MDtQ?% ~;ޤ؟ * En H"nbMI 폑$7BT.Z-Y`ܰ,F)XdM?ώwwpp SwI%  ;0I;SZ5e&V*HMy9ǣ[|Mi֮#ֳ30eת;~=ޮp*쿰wOii%DC,玶{6|KP]Xʅ^Z=s.#xb^\KF/畚?>X`bx,a@)g t{odVCY͉(4:A4XBߜeX\^ Js`fU@ xf6n5` nhI@ZIw0j]pK%0N`458G0FɻC8 +h. :m#7o$P`<3$oʴq<116?H$Km[-"[E>K#>!mfCaeZa·aF~*p1aNiS>8s$@MBB(r Dč G/U!{fۗ/g4njC`Н@V -spIs&^ܢ?J]:TZ`qEyq ?ᄞ$Go!LlL1@B.|]Ln"ɩYg5-LZ5 CbQ/la" _}һ>+aRs?A+X+gCn1Ɲ30.BZXIZŻ>,Ҡٽm{MAO忬۴%6u{]v02'KXѮ*w ~(bZH/J}l:r8T81Ȍ$ұo1Y'+08L.`b )-2H 2m#M;;o+{ C~+Iǵ i"=leE^>˱F(UXeHs@ܯC+(Y;ܔI<)(z|ac9Q)AHqERÌ4 l/EǢ,i¾C.`IӪ K3I.<`*&="4RlOmإ%/ N^K`f"#huv 9(Aq*@s:khgoLd1DDfXZg +LLz4KOL.Km=ERr2XEBYMbg ZFF:|E.ww7Xp|\M܃D@PqY%f9M*ϻ8x<(L`wL&t8&FER&tRMUQ7[Q}c KO:C(P*hksU#PSڹl0`Y*=֬p._bTܬ*e(Uf\$hhp-cJq#`ۈ ,$N+'GE5Y,`L9]ʑUf w!ZOF|$ͬ:4ǧ*Ix\p|W")1a/@J7HS&v6k7g|XH!C!U[jI&uHeO5YrZmfuV[ +a_53J~rsʅjO@JC0NNx#Vg޳%=xZ BZef2lwtX#T#b+V^bJ?bGzn'b -`T-PʿLbWVDZx J.Z̦D|* $un1>?k߱{k<͘cCOl2(M-.khvjZ_aN&aOzϮyZ[@LYCQo'6A6k<] :O?܅9(K[@v4qzNo vV}AcqclV l;EU]z3AԣUۈѧ)r J׈]Fjc QT`hL6Kb!l!:9-+We/_xB%U2vj rJ-B_0BYl4?z2ؖzXhZT-?qPNJ$aB7RlU>y(g<n<Ɗ{C6[6}#)3O*57R跟1_sIz|YyE)Egv%1j@y͗;г)TlFC ZmzY[/ݵQMB2Ê4u5 8(Pd4jo#IPL!;ݗ4ݵu16V^n]suܚ0SI*ڟ8 y gJU=,ʝv1 4dV-; Wg$<59kj#;\Rܨz7-ie8SbCC&)0fٮ\@ 4IԳAymt%=@:90.败g 3C:oF>&ww䤱P%2D$ΧSg%k΂'F]=x\X>3A>&M]goq!F[swg=aoxq8;tǸ.S\ Rߓ(S\{.G7w$(25M0J|HRtroӨ.0+nilE Ƥ_;ř-A:N:xW3 -cIʣ9k@&_sgހs~DhPH8d8<\c4P$ ޡ J@ 41iXb,Ct" qBO_/:Mv$."bGV=u-Qa"H0auoޑNUv[욷h.Ϣ;՜} aQn>rVvc{" Qa(%{^uiü-^hݟ%np>~Xf! EAYj}S~zXy`JQ=oof9G &b4D4\ EOWÛfO8`&w!:SDɻ6+cV(JbK2(оJvor[K҄,E>Mv.J <3@1nq9nzcNɯY&$d a\ؚԅ:SSjkV/2߷I7*@ޛGp.`nc_tL|7e.pԤ2sTwҕp]|%X:ngE]cC"7^s&+Z+mu 8rp;ϼm`4 *UG~?4Ib|p1DncUqSgx'{6R՞x_5LAcB (oͫpJ5-۝D)7ݛ>Tn`֛v֯PKwr0T8Glib/VCP/Source/revml.pm\}s[J5I4ӐmUOm#v+fAHp!Jv<31I`woooonہJ'Fؕż^[83/{=ע_m3w6߾V[&u4X|jE,ÓWGb_<NQw$f@B'In*C'^;}SޛK7L['ٿOU߼z3$4ʉ|Dnz|^ф^3~∖~w| dsIbqS3@Syٰ߀qwf?8hң^\pJ*s F$3(%:q:x[gԋz9mz>v.0e%YB4g3(D-mq6ROD1\8PLg*&q4)h>wBOijLJgx;I)j/r-ix0 ;3xX5?b) h?a'~)>#䫣˟  &LTs5)'3ϐ(?-TMrnlb d4 5S.CBt@1ƒl$b.S3Dօr@^c܈h!C!9D; lxtR@׻TZ\9~JܤKI7U^z=<};<e2ӤG S`yE4"$07oO]]$_xmE 1֩3̷BdƎg͡J3' Qr@ՅV0'oVQU1u]Bހ6ynz*,n`LG qHyzXeC~"lJsIĸ\>Nl #at6#,"* l)t5PC6~}?sʫvmW(=`;dCR!v‰Sed W3^ olyr,T d1tbwƛayKR9yzh\٠wKLZ3S5Lt~vwωufuT[&:ۆSz7Eψ pbstbsorLL l0f@V\*hMDKyJqaiUyb0VhR*M&J] S ԙ5 /عP9Jg-Z5i,hFx`)(\hXIlh_T@^~ s'` Uj3LȜHi:4x.Um\H DWX J [AĦTsX}mҷBzjRQPG2w9{2io)\VyzmW> iڔ/Ej[q*ȪTaj( eQ4!EW!2TM(>!/e/>,D\dUX+i7SͲi U?,G\k(]#'yΜx4;Z^#^(*~AEi˜ %u)ӂO)8b*ӳV 'ۼtEGr_D|wn1jD$'rA5҉Q4h*GARLaB3%߭ĻUV["= m@R#-=Ռj.NΥ,%ǡn/b*!ihX؏}֖()&Mk&DΣBOzk- t&9?-=oNo03$ z$c/,|YSBLtI0M^UV>+8Y K +esT)-LozQHqh{U_L:'><'EO MH+2 \4FSڦ4:3Xemm[rӸu#o-j!r[r@mG'zu?%gZӄB'9(ma?ɬ'afKj =heYβd}lؤ/Ec,ӣ 'YӬXqc-]e[ Za :TR˚\0dR+ w 1NZ  Ua}Iy'@ dI* +%P8kw.҇f;r]d!q4J2+5H]Ee,ԺcP5xa]<͵Q9&d,(t+x;Zuhb,ۛAin/T-!vd%}Ne0ً2;Sx O1I[D2a!5 n"[Z0Y*4 U)pc~왓}<a݌)s$;ۧVjUGMzg\A+h WNg 3L>w^tX ?6}uQ'R!4+iѻ,r?DwWԨC'PMWY $`,:7gj68`D!}H"#,FIJA ;d:R/$wrw&Abv#z  FsD5`m@ⵓ9ŕlJ!2%N/:P:c\@]VSVG`xx-JT?=X#{}zeuuΎDBZqNB-k|V-p7V64G~! Ŵ+|tώj{l&eI\MV Le4ˋ^I181)Z~y(̪ݺam{yIzڝ\ 3cQ͘h)=zFW_q_by[Us52L+\AcJжZK%ѨM1@Ff}j $ܺY>/oWdxpN[8Աq6fI{$Yu%uq*C8 ?U3WT] L4$/\*isP8 )zcJjڏ ¡Y ڻпn63(/QV=kS,r|3zQe'cnWM)I\/SUTlvIBeӹݑ {TU{bjYyP- hM'|{3jZ=f+cD O -*mw*Kw14-V0J~qf@}lXY^T*.bVs_趷^U;Z 8t ΎSt mk2hKKaq:[`ӶPůNÓ=%|S4z&;,ScE+BLj $Gb_ [Kۺn,a7kIմ]˶ޞW-;2 !qNǛKwKa9`Io^OWY5]~:}n_+(db_#nBDԼi׽~nd iSv9/ڸu:;IEX؍tb.I%ܓnwoo\J_m%b|]%mR=&5V/ʿezַ{Us :{LUpAp1( ~p8]|9!gJ4Hԧ@˿:ZFBq/m.!Xzn"S&A[0.lB-t&p ,~뉘]qg hykIg`k:S J睴kE,/aˎFf٣z!~Mزܭ:g0Tێ9Om;,i]D| uDYTFߜ772YvzD eVk#cc̼IBʹtu(M2e*kYIvX:BY8QJS$,/UH!<)+4\/rS0rNoZѥѵZ}M~:t~}QtquYMCԡkxB MSPRʋom:j$[ѴIK^+TsQw+U"Nt)ԝFҧڐ ߨbnX&4"aLa,lf/kaJ*L!|uڵVgna-alK h7)n#Df:Եy\v|8)u3vkj%k72WwD4C; }b]Lk5wk PKwr0wj!)Ƈlib/VCP/Source/vss.pm}kw6WHJvΌ];ql%mbXN:TC1Eduu~HJvkZfM~cs# c)},ґdYg6j3t_Ivw.{Nw?9;bCĹ&72A28IE{Y8qr+0἞ h, GdZd6X:Abs?R6ù$_ ܌fҟC_fI:_ ߯mtH_^i2-R& BS?f~f.M*o &frCxw ;%iP D(`0+ ;t$SSmC-pwCgׄGfxK9 %Q 3,jş-d`v*̼640dKwSab0#?2M>` ;zԱ{I/ @ajBe4ͅOg3 VdO%?;W0( j^4̹=+lOMNJp+1Ka>pj=Zȟ!nNZ AS |~ ~МZFA&G-a zOe dB/KKMF2d9N{zo"yAj\&6ҟvK*0YN_9@-98lnDYN8?;=|{;<:M:! T > 1H}AwObY>ޑA b/GjfF8yw cBY$grz7<ァp681g3r Q-i9Pzaa}d ifΚi )0=^0ChiEmsb1C j| veKF U_d3di%5,; N 0iȆ$M*|R4X&D(ɮp.$Of'GozRg~Xmx/ hz=i'@O"`5DI1Rg=~ `$WMm=,<].7ItDŢρߟхb@9p`dW'o{IA3BVYCA F~h1MD<gD?h,)pw +G1`רKPM|_ߜ"xs#w@6'bE|Q%%xHQr >ȍƕyv}se޽a ];O8M-6Jz(JjTP|xНt~R:o^ /-vK5 B#~>~ŒwxPj̦@8`f ,A'jE4fVN#yXwI 'x@H KF!Г0Ghĭr>0+AKos&PEpCm:c$1hadA32B1'X"^ui6b{?PivxEj^$hQD~&Сô~c9(Bf*IfVJgh)Z@ .$GN>@5XY=Q/rS>Jņ"O1>9{u7SHB0 h5+##m a*@5A` 3*CAG8P5PAV@\wb3l]h{DTOP[bS=5l_ a.`)B #"xd5mvU"ydydȊG2_|a;Pt@}wye@C0ㆨ\}COv.ZarcՖ ߪFջNP Zx1Ppog^NB^?8<>9z|t:`\׽Ej6`cr--?z@z1Vw p(PÖjf%oA8WW"[t#ME=jhduSSӟķoTo mTYlM};_Zm )4qPa^g⨽ $s}=CR߳fBql1 :DfyDmzmnfF~5rp9{XGhp%4<-|@Hʾ T<"3Vy , T %zS〝%ʭ1C8FƝ;0I2Md@#;C_ȋ,>IxVKY^`WPn>̳HYCfv܃Q8:￷G\ꟛv}K$:CYБ~\!^a+B*aLAKϝf\~J sDv,kCoP }>A[5Ԍ4rp ޹SXJ?jfAn`T)/7ғN/0'jU}a1k.P=EW=Зg)ygQYk6VcY Q(aUF lhVM8x I3WwAc]< )-?0Q`932A/zkpVbMFNn}(/,?dS&aa(h{m16&u)(5@ V'rn8 Lk!av ?t̐=%z nCD~ɲ&K1GƑ1@( ŧ~q-6VFՂV/fRE xuiKP@lbF:9O_zv*of324}k3?k^#CX7,qG(kXW}PoTEc-K~c2K#Yf>h37MV/FAU Y`4S(KΙ\ 0]~M/(w<^z \ 78J9 l* Vh*֑mZ3FQ.͖RZsӹ`bY:+6\rj:;5K%&-*R1+HڌǞjLY/)1,3ȫ%6b} W2p0W!x0 t<=Vk*w5`&_O%s (i@C֕ Y`#eקʃVktg)X<ِ yY4=-Cpr7oQ2-+QXqdU RdafjACfdOfw3SLt@d/3j_DW Qd2Պ - y,ޝڞѳ8Tf^ cC!۷ig@wZ+$2)/{ф VV Ba[yR O{UuD|iNllKolyn޾>>(m>5Z_3r0eQx3Ynb5˕t &Սs2ZxUxAs t ; &4/GR2M~χ۔tcrZ؀1R+QؾOj0+SWrx4vMqX '*=QSZZ(o?FӲ1x;v u^I@eLOiWXSG]H`[7!N폪ǤE&H,JQZ j\*́3 *ˋ%݅4;#e')P<!clI62]]њyoK'h鏮Mpvi&蚛##ŴB2D p)"2jLNSTŽ}gl伳7LLGLEOX} X֨Bjg\s6(1vjYPjY.0%Ӗ7>o$P3LIZlnZzp\`rf*ky_/a:s b JC"ش_WLږ6LW`fk{HHn1i[U(/辶Yh3S1 KItc\Wy{;T)`*"t($fԣaLl$D#05 sHZa2+75}h`jlWFhb چv"3u x^S?^4+Z-9 I(ࠨϊBZPȊ$_p_2+\= R FR)+ChPKӫ̱nMjG#_vCtrvqkn/2p 9ö+AGsҿ 70>Mb*ܧ]RޮNGq3 ~槭VG?FGOn{5s+TJ\JlV-A;uKUsRkOT@vzTf31\:?D_(M4yy\ꤔ6(v3]p3cm'9Dw_6_xUަeֻgZ5}u9]AY͂H9k}K֥}bҡ!Q2LKƍzV\F }. AcIAw>"xۋ8XAy? BZos [L&jT$x5pgU~3jR3-mu,كO3VW<~MC,X9Jx/^!J AsK*kU[4MW{H' [zQ +cm*?ОY>[7R|N R4|!"5&ц M?mG RqEge[ꈃQyk%_IY1GO-^7/ ZDf Vq2%a8Pq)n.4kyIyp's>NSRYȅT&:E.7 MB?Q6/4%nˏIz%H;kf,2:)oT[)RCSb]͸=ʚELn=-(h o"Ғ~9 o1F7jvMѵ^{v/1uukY_3y77΋P߂ݔyԖ~%P)[_9~û^_ԫمϏޜš8?<}+u+yMx=AlA'{+UV`V lGzL~Mp^9c%wQ TiKXq\bҼC%L<͏9!3RO ٱ/n)['8('4y~qoD1 |iXZo7pLe% Q1thXH:V *UxR#]zM]u+]!un`0 <e1AhFmx^qPMho O9!fd<9\7_|U+bx;ܚw\~5SQڿuJބM.,zҀ3w_cmXcyc|1|u>j4 T] )fi|g;4g#I:tA΢‹.? ]~ x,M@a1c 3-L~O ,ȚX~0խvY<M[)DPuUƤ4Maݍ_6If%C!±S4`x+|UL0Y^dXSZT Eea8]i+дp;N+lhx\knGXk":[ф6V@uCWFYE; yzIHPXycS-?SWf E({#F{Y_QOnWٕ7̖Gd:+_\#0"azw0 m(6V;@Aղӗ҇C…JQ5')*3Id7z%e<4E*UMA/f[w,qxtLD{FVdMWB Õn,Wq};y>?|$,f梗+bp؏2,t]aJKA|5SρzEEŨtfx EimR%1c͐z8wt;SG *4f[<,Y'_P@$Qu԰-s9w`Ю'@P媊 BvEYTbrcMKqk]T,'v13(W|p5OatFk+S* ߶Ѓ%ZZ؄- N .<¾U&d`Bs;2mɲѷxUsVw, D=VOҁueURG-]%R6ײ,TuờwF|Vl]^s[Vg+;=~>?mz8s17jJy;Y A(-8`%6BQ$&( y cBMŽ-QbK˯bs9)w+HQ89˗6*\{@I6/9EV|u4T6TB9sҶ5QR- )%m]ˮb)U*⟝j]}wyB*ȔhﴖK+.p}* 헔Pٴ?`!+_I`/YL{'j^IiP+>Vv8@_!}|Rb ~#A8Uh5T ,im [DhD[Jeօ\⊜JGJǤ+4,Ǝ99b TQ )(+fgKL}1TS%[οtF>^RNzµ|^XZnV\F~Qs2mYs7?ʻbi#k]#e]A=fl8zWt+'k"p?W #VCXKEt wU)Ƈ2CRF(y\*Qr:sb&Xa\:'xNHJREMY^+𱺷nrt V"0K{^Uɩ|-fNX.$#"|fL Gd90.)(N@3Nb*T̵~` ݦ(U!3>%$3X='G|>|W,/I^nX1ΓTΓ<ޤKkƊ:{kT?|+jMkb݊uu"Z=U{Yzt˩7^Yy7K;Arʔa]cvbu.]ɷi K,T3)d47]C52m2% NI5OgZ^zVDn׃Ju,{r,u{2tU7Xu*].zpG=}{vc_g)QڪGGحHFuwɵ~z~q6I#3*>ޡ3op`` x[lZc7TvjX^y*m:>)|wݝmvv{Z5{G99 `̥HJJgT#ߝچ 3fL⇋7gO1V^bmJ-9y꒯y-RUպvxUQRE7J\PYV͹V^_9JWNU"6ZVSŎ.w.T1I1AwhTDV@eվr5TAIl)QX"9OP=Z{a!+jLtTGzRU:j̺*MgV4Umlۄ 吺m?G. +Mkn4 yqh<~\՝{Juh0q7񫒪 բ̜BY!oJS 1n8߅.EjV'n\!StR~ǘչB+Z̨3uC :4*T~䍌B-a 2vPRm&vW%$?5? kLtp;N(F` j*f- ?I;xl7VvaS2Wt:A2czgy(,Q;e]uJIuُR/)=q5# tX4 dǣEZ(ߤ썪 9%þGTPM' s9&s4}ZQu-0S2P95nϹ1)IU:$c,bC-iڐdl;}]4G*"*2N}֭9- -;\kJRuTҲWq;dM[F-x^ZY9 (_)vynٍKaN_0PGuX?Ei>QJ)k 01EmٞcsT'VH[NnύcUJMdfk= XtUʖÆTf-1+/}7ۖ7~(]Zn ׊zy6S*ڪmd,Ok\tm*U)$rїxk^iL~,u.dtWE/&,3~2 T@Nl,,l'N_0~)\ },rW(l.[ltd^as6܉_bkS ^tT>dP˩4oU_̕kͅ RMRxVrh$h~@Z1'6ϑuVBXIU="I)4=[2 *F,cb*:ht\:{$) 0t+'3tv (ö=Kj۵ PKwr0Dt lib/VCP/UI.pmn@ քC"%i"UHU-V0@g"ĻwrJ{"DnoϲtT4,g{,.VְۧZ}jḿt;-\0]~㥉Bc@Wha |b]bA̫iA̧}nYV aײs6}XXQqqĈOyq> ?,WxB4؀YIRdٳEv99]qZ[rJܫ%,1B5騚/6Fcbq&]ܝ4i{YU^.)4SRf/I5SRn4,,uL)@" P┕!&Jp $fdq:%>T> 1plAY\UJB2ү`bFSx -@dtO6SQ<Bi+  R@ 0I(yY$Ti0W($_*҄)̆$ _",'gS$@^ojz>_8 cxRjA˪H(q{[)|פ""3 zi.}nNná9X14,x@B@p:(KJ5#4P`%$[\Զ`wv+X~Cז xGH 2u6_%4,0I%x Ch'O9(zSI *OѬQLᔬJ"$(E*TTaS;Ec gAiU@.*|o[KZק&q<Xt g< )XkDgbsmy (ĘyF8 ; |TllN8/D~I0VB8UPU7Ae{Ǔ%a$1;7qN2 u⎳E\Π L!"KЌbW\@nSS.$w%9ZmkIqm ,f9P +$,`^fc[S0$F tiimDj".'(\e %ċ8ͫ|RZݠjyQu2#~㲯`EA"B0#.JW79 b3Ijevt[#>x+ *4XbCsn>CˏT?$ j[ow0>a<e3ֹͪ 'km}濒%|M!_-ˋ%Wu7N]91ڮQ7ғS3iFΪm7 <$e `?U['%}uVM8#2n7VºjO}2<ř@[\q\ HW$Kl30+!vu ) Ն;}Z-:& 74nB)Idbr֜M͈{Aw작z4pl5GF{(;(#xrA}]\|VžfRJae&Y. 9id/Ԉ >ko9%BQ]wn{wtHN8XZ?p 'wlvZ' ,e!*Gk]xNs1 >zTM@faB}1>ȱRԜSڞUV@9}3 &FnW>'GZai V"¿J孄*5:irw s-;=|ӱ"f\+O|߇ SɉCb(ב$p4*(- <UCj9u]|_: nܘӖj`NW2edj~.^DUˆ Y¬O &"sfǺG;Z b }Vo׾o'O^g'ՃYO%<>u 3:!eOp I_{ J&Nc٩XևH'dڑ3f؍+$޶a\4#ca|۬ ;_KhwRITM, ƸA{o`^M{z_|X7ݠXb=cS1Y+6 rvl۰r為B| ߾H'S>m{>J5x7~&?  ?sNwוg ?|Xu_ˮ_9>T\u?kG_ PKwr0@h|lib/VCP/UIMachines.pmms۶? Tٹe=iSOzN>4"!T\7_؎p=md,%vs}%ڢadE26piw7²PmGJDq ZƧЯ/ҋ'EtQ G^3nYV4 _/xj{2ď"T}'~n?Hy})HEK&eupges\OǮXBQ[q/7pnI $xyh4Nc)Sƪ!ܾny1IFR_,d*S\Z*~FHۛ_ljaMetRьqhtGa^57 P!jl{1|=ݨk,J[<'X| įo'#!#Q, 7~Etd\A"D!*عl9W&3Q?7^w4:Tw:V.=$Iʴ?C@RҏU`afsI~\|ӳ\Kֈ/F*iIj&mc'tCe3ibJTG$ԓftF4eytGG6lxnՏk%M.JV\)ʬ|G0=>^ >XE `\QۊS ZK f^?d&+FRh7Pc?/3U6@],0Q.IjDsv[n)K#f,gpK0av0"\q](b/frZHtş&=Ty1S_7>Z7\U!}g~0jT~gƅK*$J.z_'4.Wf_ʃRl'`V们DS+.V%}<J[\res_4BLen9yB ?bظܡ>%=aN3VCJφG@_#F Δ p2a>Lu/? L1>sc$A_6v0 d}`jO">*fTfTfTfTfTfk3aTzZq_cRwb%Yߟ!?#3l|-YƎMv)7#Z&vkj͒rtVC >oo͚&fƊMT3L߶.s14Ǥle0e0e0e0e0nny(GQp͆A;X;ԉ(7Epu]nt81N~F\ZX¸?zV6ۍfr+ͩ懁W %r#=Ѐb74ȈȈȈȈXD~n:ToNgÌ\1SzZi1$\EyE!?ѓxY洊BK&֮hۛJ1npd?O/B]~CCu:dH¿f@Yٸk=vO5'F.e҅Laiy 6Y:. laC/:Б‘j CY65I"~c|X8աa|UJO*Չ]P)'sKޜ %/Ay_T7g讧q#<.E!Bͱ 7ʼnٮ q%ΖhGu)KL^횽%ew=bbbbbHW7yXQG3¨ momm+SM]\QQvkPH h DKUBYHS`ɊH)zBB Z+hk- hb@P&om6?8L z/mt&86XֺįIr'Pz0t@.~4p!z1#i5׃1bx @AH{?????kƟ<fyys473HF94`'ÃN,U|_qE'cŋm4 ""u$2hunC V# H-DH {|*QJEy)wyw3_tn75((((hXtm` -R{·s#RFʾ"*LXD=JRc|L-IRWA*Qm2S)>/V$Iy݊L[Lj+PX?#+f=Ogx LVҜ]$9;zwseOsӥAakcxYcY7@C\O\ +W[2WmպaZ*^::`yeu]Ϲܾkcr.d3Hƃ |krAsc{uwŶ34܅>Bٍ(Uzpy=KL&$=ufj5$tcaڠdBIhW$E"y؞ J܀-˓=5ཬmmmmm)mfו^/|ǰPJ[1n߈Y=mq 8o*n\5MX;z$ɹDGZ뻱 m|MK|# 4z?X3Z[/ &ԑb6 0T 3Y hqgVݻFt Fe%1B ԆZS2 |;L@%wPEͻɠRAj}v4_`VK]#x4xGvzZvk;mǖdQHɻע$ʊ"ݮB,d]W u`VN '%R5;c>] FRwqwb|Lـ4}HW2R|)@ʇts XYd|d|d|d|d|f|''<ޟ; ,M[I6qblwڑ@1}9*ŷmK䉈WϷpBW '"xByz.Zftt#ν N\3ȗ8blkFI047jԟ>>O_kP >ɘqkE;1,w88<Pn'W> 1\U$J}g,P A񒎓c>3=/<nKTX#a)h:33333׌۹9LYWrߙN-vxk&5B'b:1ÐZ/- FI\T0hǂDcAw,ًoŻAŒŌŌŌŌU`\´_+wd 7DN'Qy+*鄞UaI"gO0or qcmMccC[a`pG_.ǾQUH?`3rbW*s0Rn@g\tNu7^#^-V+n*{u %\tׯzoK8l?X :UȮk/>k v%˂`,Ή)0҆*cM 껧+p׃N70XH{3ט h҉+ϗƔwM7trb5Jxڣ/}ɉLLLLLu!"A4,҄ )cH9xA 45R.)V44X9 9)"[mQ)d*MFbtqc1" !RLѯ[Gd*h"820N uϝҎqJ͗{l81qa$Fr SM& ַ Q$Ji>XPI5jZnb@U;u˥4%4*Oxk^+Z 5[+5e gN ɡ}6V3sgjeYʽ7CFJ`Ğ.iw&Ԁ)ZMtr;2&JMhlRQʆYT OT6{|7: &n O?fzȹ&_ٰ[ؑ-l=Mp*Mv0o̺y9Lir\b}r2111vJƶ5g`f3(<Ϡ݉t (Ƞ^g8D ce6wbiIHʧ״roRpKB |2tvMu쟘Ooj8hA@Ż W)% W[X+4)qdpaևkfds} > =PǓ(B!(σlp@HoqEԛ}N#i𔞇ȍKxX $( SMpPzhъAJAm>zGu)ZUS(`5ԉ)BA$r[x9 ZYIzdU=W${@tƋyQ4!g=p9ZO,WhmR@Lgcɖ?<дf@(!LxZ$Չ-7ND&Eoa3H}^-3!s@I) ꮋ Cz| ]l+{-ΰɰɰɰɰZ< 2,8(uj>S.5ldٶјwM73oCFMȲ(B*e:94AiXX!p#~P/>=6Q6OKj`ȃlB=g(ՐCuxɄ.r*,8V>?gÿ졃, @{RLFćy+QTd:Vih^%">83-' E7YIm$UyƐX,`R!5և0zJ:g^(y*mWG߽NoʺU{^@UB h Jjjl,7|U*X⡶KZ~&},@2_͝.`_:uk!thF9'fUV 1e3L1GyKsRXPfՁ^-`\s!r sy%_тX/݅3~! D\݊||Q$ x!ϕr}BVA6XB/&$ m$vFx&Q# 1 641VQԩkE .wkEtQZ+Z:yi(PKwr0GT]lib/VCP/Utils/cvs.pmXmo6_qS]XJöH"̀b/钬f9"SR#)v sG҂8N?i&FVө63WSs0t^Uo:>_\|w2, e4WobƸK&jwN>\3 Kix)XfUHi+rʭf9Wjz+^&iŔJ|D,!gat# }Z>P~-stU?v߿X jVG2\8-߿tUG %XڷF0.<*f88cH hij-10s^.+,qb(Z~pꆓҁe1!z0ڜϖOp1EBZ#eeem# HyQNmӎQ`4P n9Y)D]om@]b%g0sP24xyYV%Y=YU;(™\^=0QiAN7SS|U'UԖ(vfH Iyװޢ :F4>k9WfTe&xGr;3uYo$3Dy]T-Y1 V~3&YϋpsL|V&OniS3NgOre,A9XTPaG-OEZ`m0b[(,G7w0 *-8?+bVFU˺('>t~26*u7 ʧ lm7 }YV2- a)!7Y*RqfUD9bĥC*")uF(A."[rcaց& 㬐~N\b#*wX08Oe͘[VIb,#RR irBܧrA2bSsCzTUվ=U y9["7?~ŕoa`V 2yKiMJI&Nx2^h>@UZB@=|)$6L͢i_b[F kڵOUU]Г;N &Y$HU$fL t2,9&t^`Ӎt@kcz5$R1yZQ3V@oYTmtɡ@|{W..+ {hKl dyL̲&y\cAHLp2|Ό9e>@,Ũ.Mm3<1Lռيp8l7F7T`! c}bB7!!PP j<~ A\= :HptJJ.tH"<ϳ!oq#yӜw WN:bf۬&>QGdRJ>ͤao5a%0Q6sMdF)6#BED7[-ȅjU5~q:O*jވco&QtbF"Xgd|;Xr2y-KrLɬCUBpyEB4n#6гX0[ȜI) Qz<}u"|߿M?4g hIg )Lg-1K,'NZ:k1/񃨐b+֡'Dۈ >wJK/+@(4R-N%xb1 6z%3`H̗ 촏"quDI.GdX2fRf$$wW(P6$a"]0YnCWYh;GjIY6Z^v kA U];Y_^eI7HկrC{cTVZ*ݜ 5'9F0]kLg4(58FnaCQ?6~O< tF:L!+`Hϓ@sE ʂI7W/.> wLC&ރ1M>EN)eC@AAzÓK]h/2I^|g4OA*F' >K#TT4n1kz{j܆qtp0$]`]F\AM}u5 ^%a1Wҋ{$ p"f{zVu۹0]z+Q.Y%KmK pނ[9զnqU]ϢlPKwr0rN}\lib/VCP/Utils/p4.pmD[qq>A58x[[ov,yf'kgԗ-sC.9 AƀL]{ h5oK[UB #0]g *A,ͼ 4RON bSL(;9 GcNϳbAekڒfpAJ6wq5?R[}5QlI2[*;9?z~?`ldr""! 7]M\+0'Ol`~ EY<HhMԓŋB| pg9B@F4@ky[C&صw|QNYA6Ix#HKGd8-f!Sb씧2 =)DXEÚف4!` )6R L;& ]3"5Ɖa)@1  Fmaj7œ^dn6Go }ik9u3̓+Db T:onpD9kE BQfAHCA4 g=l2c`gCVlfCa|¼Ky!R8Aino8_ְ6Z2 B#dƒ.)n:F'[ . B?)A7h]>NqV}Lq 'Qh! "@Bs"R]cv̼Ж}dRX@mvZ^ ÿ;]Å):wa]5ΌJtr ɏ4B3 C|M90YE,C5-`00Jy!#G_m=v^S'mF19팪x~ 4@n+h,5'Qt?`Q`wHDN(Sb*{B5%tJo8pڟ\e& pKQ` _pq)wz@})BP >fcNKkP*U!,2ؗDe (Dc@±bFJ%k# f5a`` v a,˯f%a&(1t.l}i LC|Ï@V{ 9¦3 q\!n=jqM1]dOF-䠤،ȧXݿ>92?44ׯ5֩4j-Uk]cnhkM24XMd&i5P*d Qgn3Z߳$0v n3 ޵Wkށp䛐NlAu=Sur~i.ۅr #NVBHo5{nWaZ4oM2엶`na2ڿ`5{Yi4:Vn, dV~+-睾݄jatGV+xRif4uo{N<:EݘѦLEi3c rzǝvC y@ðrE$=]IZu6 JwݫYT@*ub^oٲЩ`}_v%'"p݋=.#pY)%c9%&^w-Nэ#>bπD$O޵a\/y}o(~rt(4>T%Ja B!5V:s>;3K4ɚLi"!{)PGIa## A9/3Ln9.p: ;` bM@]f]i ]JD/EIi/x%`+)by4E2 x!9ّp4Ko&p&BF I1(۠DڃI8\}CJt@rúWW0j 2kn"PVQђ:%% Y~WzN>!)F"uee LG\*J\^t0(VXMxT) #mћ4C<ζvoo! [uSM|LPk˩@C ^뀌n20_3[w(iuı"e[/nigxv`t_LS2}ĐXź*Vk$_M3d<iK(n@oJ zmvseVЋT##j:pFjz0CKJ]zhq<+TA@h)-Wb9AY;z7yY/E~.$aR[7(TA=z:û&DDQ'{OM$4238)X`TkEr IBDeBvrꆭOĔDGV Hv c1)̣8EZM%h ĪC=pReu9Poh)Toz(iMGqXK{dRk 8h 5p1x,j aLOnG:_#`%$@[sHpF a7 ˆ%ּ߯J%vb}Fkh ߸7*-V׹&nLf/Yy-)aH4PZΓs-dJYg{pOIƘ v ,bȕG*w F 1Jܣ(rs%Ϻ/N{WTeq$D0X 򸀇 E0QĤ1VF?7]ѥ.O1pUQ$](ºXbΒ/18ԨsvtZUSRJKLZ|_3;e^oL6Cq:;ciL_ǽqS?sF>E$" U"=jq(O)h$_Fi: YQCh-@piu[d ǻ^)FM)lmDtl#@|M0D;=m2Cbj9ވ buXrI 1>5)oaO*{Ɯ !̾%8&ȍ_" XI+킳}Q?disؠ$"~OgG%,Ql-}e/V6y7mLDA*z_$ԩ V&'T}eAx lԌ:J7tDVB%$Y骁mJTqF\`,GjQʶFNpq͑+i-&`9D֜ZFYO/:c rw6 /#+^ߋ|PX #kQ}*Y L euMNNx' vN1*TDias'E.F@n4 yߣb&)꟏o^o޽mneBilpC1S2*;9>m"I( 50p0+V5P˸S Z|<_jG9BOqL҂1}1 o:7$lhiF [fL8OEa3*0ڈYs`V|'ꡇ30ZV8Ld03..W^*B^l3ѣ<=%prӽOg'ON9 Kʦ"F'fHр!}#IixA%T|A/װ. }E `橇;"Epqma/xh;g1ZgRqa2F%>/r֙x"AǗɞy^!nVstjh2,C"|9Ug57uE?%PP`A9*.]r{)8%x+ŋdj=]ʺU (&#CM đ۵m(bkN[-&gT)Xk) 8#󵰐Uo/aa=* krZgm)*Ψf`Y? hwӽ-=U Q} Z"F bIDWpeZr9谶Z"r$Β(Jk'?y%3]^N]ѡ'zX 2=Go is!H:>}5U 0i(D躧Gorcyb?Ř=N]{pV2t,ue´e^={^(W?)xIAuU+ gts|!Z.E  !2[#gCc:z^LYӻlR}Q^cKLoIxLkS)^oQJ^e98<Aa[@Llf0]"6m]/Ѓa.˞S3Wz!e\RjYsaPZ ދja.B}R~ԡH0X39H6szf2pew K?8ʆ l;(!ҍa4Ae ƛ 0u;X * -; H6M"rr\N6B@e jþGO5:!Ƈ\ F"edU໪\$0E}.KS'H1>hhCJлe[~ꁸ72d#~a?9'\i=1*OinKy4. TzX.,>:]8k03R-<~^^\t}cvٍ |>Es:97()ܡHx4<b]y`e7e@/V~c%FNPKwr0lib/VCP/Utils/revml.pmaK0-c":aҵ-n1N߽\,20pyo2f0|t㾵U+rLkZ 4II6=!PMEһp D<_g2aA0;D:\s}jWJOXH]A+JhpFhژFr rFELf"!7h3xVKIk#ƆgG)~⴬A|yo&~Qo桞PKwr0>V lib/VCP/Utils/vss.pmYkSH_Ml+$3R6d'A%A~ȒmZ}ԏ}mA}ϲ dlU׻vaݖS6fvT&38}iwz=BnN8aߦ56赮gAj2m_fᐧr:$u8 8ҿA>vJF݁i7?HZT*brń cl|Ǫ(dXQWS'#xzS <͇o+Qӓ,lfsX]Ys?6+3/o 9=9ߏL':߽6G>siMbŰ7h>'ZbjS|u^~%1 f5ʭD!kUFܟ-BLg`12͜r%hADq`)ԃ#Yȯ(šö~U zEC ^j!KNՕR t&*g1z=7#uJ8a/qXy*ۖ.|odp3 z Z,g Cv;ݯ|&v~w̥Ԏ6xxWYBX &+ԁ;dٷti ڇarE_x#7tC?ZݎͿr&a!= CH{S/y:Iq6 lW(MY9>u>wOrI2 FO^k2HbTOQ^$uc7MBUzÏ\WrRI E-4_ZZ%E-Z6Ht rEDCpP֌ ΅aY׋.tDuFVf#.=0E9+{晇c~c_L_}b}vo(V+% $ɫzj,1IVؤT!՗ͼK@yQ ɻ/,yp`>Wr.ZgG'<j}Tz{PG H] 7s3o$]5Ohk/K?lޑ$N%GqЊ 1H>ŏq&Vأ+[_C8lAO.ZK\$F镵" yU<ƶr/0q]VtSO"N޿L_V/!E*{\r?^CF^s{3@JW MU+V}Z#YmlBK2-ãNojB/'l(VǗ JhDH7l*?b ,h *LQֿ2LhFG:ڑ>  ;dT|FmjyK)k "/MRr@vH)AxGPR[DNtwO?ucY}XN>2i<5TlwݾU${QWvZ2 LBHyX5Jt#~so1j4S)/%oBZVInpyPxP Սڼ%28]! دb+|V\گ̂µ܎öF}52rDTr)Wy˩k(]E$-tQZS9dbٕ;w otw bdWL')`;nB. ?|$ hBoPKwr0Y,iUlib/XML/AutoWriter.pmW{oG| P;i k5-$R -W^E=vJ{!c(rDwx܎VRļ%sN'nTl߾(Aӏ,pCkhGGgQ8Z@x.'0+[S̊0 ~|"d!_/g~8GL-`SJ~`fXA5BPr`rSsĜMբ5c,,m@c.@I`dɈ)$}BIjtm jZ< sQO =8w xa1_ALCTd@/oF[ۋ, XjC Ip)%JrY>Mke?+oV<Nkd"Zsc~ɶ@`xuerɝvmSd*CpcMgVߗc+C3xX8D#o3UaCHcql.OG?(Z/eÔɚt2{1Գ6(x > m㐭,I] .Hưm]-,~NYfU5Z~&% LͰ3(1ԌOA=N&6 9ޡd.p4dtKi+z2Vi%?-X"M U9 Sg"$ UGO2iWІ C1N ].vj;PnoXPZ3ejB9vD$= }j 6Z9,J²6&m1iѳɟre9}{YohdҺ6I~kZo.Q .F/Vbn,=їIpMq&M=R b+hD6H$R lD6}`Τv#kO0nj8ȟ`n[3mxr4W#g@]''T,~qo~Ϛ wvE=H59߲ոZ.|/bKme|,"̭cm:U!wO d0҉Vh7uS'ߗֈkzͅt7Z G ͭN@v/ )Ձ\bͶk/cT,^եȂ}D>lJ/Kh1mwDKO4)x"§etIE uSi8Lgi#8Wi?,\fk P񰉎pFpi/(תcVަ=ώlv)%?ְSMDbfAG/} nᏻ! d0lйM [_?/wPKwr0"4 Ylib/XML/Doctype.pmksH+d6-|acB_m|qh-$1rz0I|8iߏَ˜B ';3ڜMmkF[rCm =^ZVQ4s\g/w$˼ 3 QyAM"Ck=:6taB $cXЈNigu |- &SIuO]pB!M$P8MzGë TkrA[|t&E0n32Z5xlV}ڲb1;~(뾒hۄmDB6 9Ԑ Hi^D,f@\Kߑr8*Ct jdpZ2y0UANEd?4BYFq I WN ö+;+gY+/=o~:%c 2NWC$rS$zY um%ab%GG"I0BX1K Oh  Qt||HͦMeoA1sʼn [#(e]#4A"K.C^f/aWY(tyy+=X_jZ{y O_(Bs~J,"9幀{!m8G5bވвY&H1#C,ac !>͚\\/Β4J;"|^X[i˽вң\yS&ĽR.Puotq]T3AgA1\_o^P꭫j1I vyET#ddžO-fx͔"WI]aEK#ـ!T֜NP)跘m PjPlm֤m-DZIrUGCT}bøbmoRǎVKTF?ԤWfQ)'yq(y]˩l v[k@ZSl0K6֬6nm#HNtƒ9V̓E_L,Vy GbAǺüxƊ/qx5$RNL~⋶K%MnKToQ>z*a>A?Fpe,Lj~`wر/߷5#vk/j9>!Khꕵ&;oNXr:XTFl҅WMhEo{vz\gTXu3qvK-ËڟIE ،`2g&ū(`2Qn n"_J,z;J#AeۨM?1xϮL[|0ؐ񇻦،0 ES蜏t u)h a>`}s6v)MDGyE_goti$Zlh~c[:TmC4f$GSRrKգBtS)BM>r|G;S6oXxcȮrTpL1H7rTk@EWmĕPEO`Nb B"'m*},CqnҸd#ъ|2N|&)?+`$FJuolݳ{{ĭCCVWSuf7*Ft쩫'.aCiw?Ꞝ\NWpr>p{vn?@X@ΏW6%'4ncomwUՍKdD'Q_W'Rוr^g~лX>V%Օ+˦a!X~#QA7^ym,V]6/AolaLamIoװE)<_ "֍1͠un?؏O$*2-btu Q2iiEYV *jZO2[øh4'؜2}e?PKwr0Llib/XML/Doctype/AttDef.pmTo@_MfRRmbutY:Bd GMӹ}q wߡ^@vЯu)}\EiBUnZ~%p(7bySbXP}] ȞI|j,J t=㲬^ZX7@@@5?!p3cbеmC$@,tN6]Wd4Pp=(v|Lh. HֵQfayu SNr#^tŀ=V pDKՆz|NTQ'x|\J1]d`[-$!{. !,0>=6Fd^7x2m8 #sG ~!Ծk5p1QN-;lS {*;6+DAߙhNOD4G$" ۹IAр"6K (s)p=$Y^E@8b.1XE8/b[wPe8 bK=i;N.=*z>!ehm+35 ,W[#'mSMAzn/Md2yt~&M.R,^ls"<4> L-`,L; u0/X`* PKwr0w 3Elib/XML/Doctype/ElementDecl.pmX{s7;|5t8u 2LLfQ|tC>{W;:n1I߾W.,ߎ>l_NFt҈ƲM>/i4,QPAP(iN_ $gurEu;ݳ'ICd j Z)ڝg^M:=/%:GOⵎ?yp 0pTuͨ9vږqĝzδ0%C"p=dX# Y+gr@d>$,|J$DHPcEIDQ";)Cٶ0{' J -1$.@q"aBPh0A͘g%1mzAIu/S[ ڙ{5WHϡO s UI|E&RVF $Z( h$olO, ݭTh$~ᆤ(ZgkY: 0z=TG9 J>iD5Q4%Đ TNzLڃ7}e \ŘիOQ521xF굪?y&t oZ)OL(|+'"$,5~D*$ξ8DqJbT}1,7P>TkQU +ӑ1!`W 0t1w8eܿ<j aځJIuzےX\+f&T23 ; )մx{&n9R_5]Cfn{Nyeݸ7T(gJpjVv)u6۳;9FSIfX׃Z$k =zn p)`sy21ٍjc܌ʚ4v4[־:Pv^PT1@lw`dEav24`tВaqo  zTY3F*u\薡Ak]tyz]#J]6φ﨓"MLdkbmlޠ6wTH89N_Qd{>F: KuG[[j7 }_JbFo!%q;/s\ԧ̡-Lؿ/;XeoPKwr0K /lib/XML/Parser.pmkSH3156} B-u,+LT<d+ɀ {F,~?F\_Tsj۳iʕ>fObh8MW[?nooñ h{<;B`FxO\fBŰ'n0(`ء"c4t8tXO;Z SHxv2+{,Lz<p`;zs=outw@a=qwk~8;zP:-]ULV #ЏkFnG0 z S;v&UQQBmnW*Jk?o曹֑o <jO-/FYM,4۸VtQԂM;GMڷzrq\О_XCXg1#]K4֞gvz%P1<4A -뗓NϒNDE,fYfPœu&X땢GgRAs}KȤΔLfum 4b9bؐ6n6 ϮƄ{5X :n'En??=mQ} E_$!>jL8lODfv3(@,#VD8W0 dB`V;/T%]jeMm2FfDաJ$F){8v&j Wbݲ&}7RE:n{-|00vQLYq,?hsu'%n kI(FׂPĭނesl̨XIh%mmw@/AB ;܍ +1kwJݮ~͌ZP"&+`Fi+äU;LBЏ&BM^, '*pEK-K2gD#PKz/˘'l>3#HxY]grAXt- .P@2K1>*KbpmoY0M$3Ckԛ=̋۞y@CкsqMq #@ ثgBvu]ul-W[3 nReStϧ>ʰx>E#J&驈'.Q<4e?Lܰ@N MQ\`%S[ C2)1KkTţ !M%I&Yt$])a߇߹I]ubi:lMVdKRa>硯L(ҳf$XrSRh_pȖ7MvDT$ʀžix\u#Mh#J/i&DZ˝,i doh2ckER ժ,wf2QX%T%5 $ɛ%-^gZ6RX:$h[fca7اX%* +'Ki!WOqo]͹Wz)ffkY& jZ) :r/ͽشwM./FJր)fStl jJ EBT-S+]BaVS'ҥDSrvc:C{ՙL!8F7 ^沛i<_)XFH 6f[4 ;y 9I J=⃹5/!k' AZIn:#soH&An߯j NG⾟.!NFvV3'u-;̀ TulK?Bzη]X$obKy ǣ橹 usYGĪv*=}b47=F_`ƋL YɍO 6.6?U f7%)y͙$\0 kEsMP~>n'[urB^+&E=W1b $8" _.qp|Q/%Ɂo8@q?SX]LM&%A4OQ+ ݔp.K[ogO KuJ^?MG!ђg2gF+^͍ O5+* ]xA&uÚ{rEg[P]ÓFUPKwr0#2lib/XML/Parser/Expat.pmkSH3q"@{!RE dXY9c{eOb=3Zmo6OBbsxF>mp) }*,.8~ŋ`<G?b2 q;p6L ӔD+1..8Й@dxJ|P mz=͍yfպ̲ #@M+ʰ(x4&|R j@5O‚(˃ kE68BfSlTYZM.ux5l`vy,$ո. "'i|02ĭ =;MCGr&L$| uHr&CF:.Hq^Y&0>qA6*osn5,PQ3,81j8SK.YʿNo!P{-@.uO0GvA=/> Dw[Ƀ9YZg; WEVFpSEUxudPLF<jF|:-8YJ $ʮw5w ]CݥZ$瓦{FFYF=v8cMZ ¶<qp̶bbq7Qgb:0p @c`m^|ga՚o7W!3hꭠunC}j2kKa 6iYuN׊&R[Ud01K!> 4GlTd'͒(Ja$T"}R8f5E1]ĭEE.غ8a)E6Ìh'@!/|/ $B()XLFx,V/U)''cktV TڬzbWN7a\ǂ`RΦdc.2-XUOy9"%.G~seԳ[~`R4gb˚MGO3;,Wުջ"Jfje~ͼ'DET kĘ+Xrnŧw/AzB~@x}М42iT_*"eIќ+6v+Y {N =F(8d#݁ 2+Re*$tn[E:] GtRO͊&ɺ}|6dW0X(:ĉ6dJ<1_A#)4^bX/`HrQuD2qFRpXQ0I PmC$RO%JuVƪx|]y`=m3[C?+D{ oN2n6ǰ$n6MD)"\ޖ_S?CHo~ j;ޯH%D\Gwrbsf.UnvFkM8rjQy(F]\U-XٛѮ49[ i"H6Ɉ_p|rtu1)<՜E4e X] ,}ּ,;ljWϠx[gTvoTiCXjٍVޜJ'hwlRHu A*A%4,dU;&ndٞǬ]?TFke1-Zl)3 Mɥż:`q?Xc\Gd½`|15L8olؼ Imh-ϼNv3÷҄~bm*C,WZ:f̋6^2@^͸rWB %| YpnXVD[2sl^I?R8R&2ׂQ*A#\?}IP$>yA5NpKg@hhb^oq%4,o%TCWdgoOxCԽ~Wx"sn1ȋ쪠:ݶS&Şe*v\z_֐, և@s(;>/Xcsde('!U̲$ =M0GB̃5a|iֲwßR_ÄASҜ' JTܣJ_RW0dL9`t\w1&OH$o'5#ɯi>+lQ x5@VpI~数ͦKY͹_-">F-TnEylT/o[}|_ T~=@PԪn iĂKΡVLJTI"az?<@O8 7k^ˠëCt4d8{@z>t \&qA`z)S{Nכuf֞v-+MRK*@xRɐji*TD#ӪIk{{>nz 0HџvN6k] #T39B5S2Q׿8ŭ=,eܲhHinx&Yh.pp$1cSJ,?7s+i"T֑8WD/"ԉ<ϊ4NnIX*"Ob|8DIL)Br;TP OM^5gNKZ<ʖ>?N س3_ 7%6s:ƪt?B\d-嘚MB5q^X/$vK/Z¢om\Kx΃vVkd629!A5Ötl𸪾ȰƷA*̀\ AۭPKxr0ٗU\lib/XML/ValidWriter.pm&AƓxT.? ښMmJk4ūW$,͒A>|}?;:=a{GgwoUˀUJ1ث1Ycg`7~|V4zOz:ey ΂QW6L0Q,6~}@MZ2 `I֘zA0;8܇}7GLJCK&q83Xs< 0O?t}Vyq\%a tpM1E 9pg@-! -3lg>aL:P,&Qש9oߟvscY99o>_·i1Mă µƓl<ɀB~ Ů`TGO1G|$RG$JMeMᗟ*VG1|$᧼y#{;pKf)}Ѳ$- hMYYJ11-9{$d8&z~"NTRCDE$iOhj vĕn'Cq( $-u`;0T>C1gӱz:%ĿwJ0)D?'hMm0CBMI ۪ e: |ʮx8HSfKq8"ځk&Ȉ|SC0+?J# ;<$c'Ó8trAppWpzb-ak.7CsX^ wGX嗩'Zqb!'wes?O5?1*zH,ijXNu?.2S𫭟 ilBYՑ =!9 O&ch2 0:ю /D,qG^4&LˢMreO \'-JfI/It47i[bHUڊgDALfll&nH C6c8-Ϟ9 Ѡ0g?.jiaRffQ1U$U?5j/]N8 E O2Z> [qW^"?c0;x0h oR\Iz 8@:eĵr[Pc%cu05OtdA6聡l5cw!c$PzMA4M !PMqˠjq5ۘ_?:mm|l ZxrݿEd鹂*匤t}5CP+ާlC뤛Cl.YCa{U3d Rp3pmmUlt.C L."p{=@߮bشj$=##jWl`F$>!@{?7?s$9K%6qmۂ]3K#6iZ[o"~;}4 L~8T`ڋ)F -2;g[dosZcwކ7#!mf趶u밠\6Ԍi-k_&qqJ%Pa5G7 Il9Y]_СD<"(+qqcD1-}2qF1W(2֖ AV>}ڄ!h97']V!@QudŀU|VurMFr <Ɩ9s7 yWs??}>WgwN6:1 $,YIK Q}{Pݏ3馗ҾcʺXጞe+|GHS+ۧg_y2e#>$&Ӛ[sؕ;{ڴf"9u=[dfgoT}Wa)pY S^p0-8}I:RF̮ιvdf!"kD<)^D<`@E cON0Z $!) )#N4!w0 V4,yUszazh2˪4 ݓc{cbEw: fRT| ̼3uÄLhIU~fF^X3C`BPsJ`GMmiGI Fc\{2de.lʌ p.'u~= ;"^gA#`$q[)tTۻIh@&dtD8&>ٯ7W\dIQGb8ӌ"7, _uگ_h~bY|G+a+1XW%"%!&?c/|[AFdK ׇZ:.GŮ1J6dQ§i=;ؽzS{cd[n?"OV珜p0`p\Cz# -8O `!!nk$ `/bNʋjH&{=JL9Z,\l3N)>2w A[e2kr,5M UQ0OxShr0Tȏ$'I<)q6KG_kEX}@p1>i:E%%c nKc! rj'?w]0NRQD83c@<ωyZf۪Xx+Љt1-X@3i[XZv~NU[sWd: Ws-eYh']srBmO:kv0o"65F4Oډ 1B8aݨ7ƨ2TU bԌXq ~K>jvU?b)NÌk g S,LQOWu`U@82ȧF;A]bضJ/r)JP+ "ҤkĉVP*?9Upm#rPBW* a÷h@0C=b1 "LS41̫d^uSTM+iR健 dӭl(jPi'aB9;aES`eZaD+Cer^0aj$v$*vVUؚmh[NgɂE2a1X&আ0stػ8>Pue:O25uY-[fGB2h)(ɚ7S5hJS-Y]T[@LR Wze1m7*_%3@_#bJ1Z Y3֫UU媀qp=eO>R+)]ll 23FarO$z8 X q[Js6<>>!3HQs<Y602 `-zyꚡrXbL=n~2/nE4*:p7aG* Ξ'BFxo}t>զQZʌ$&ue\e,5G}}/u@J/ [K+CdmYzVMQ{=WZW܏""22l!<X9fCQNSd ;wKT"փs' R\Tq?uQ1򲔚@ _b ZBK.gr:616/侸}%4Ŏ-1A 5S Y/[)dƞ4F–;disa8$'O[adItc%8ŽqFpMΘ۫TfG_( {d!{)gmiySΗ\t Jz!ۜlvsy% {Φ8t\GtT)⁓HIo@4[W@F.痮:;n`\PvX#/^~c(e8\_<?y8Yx5O$fVBͫWVuY*pQzT>aתR9x S.(&{SR9ƖFb.@.|G),$3NqƒRPbVbЊfY駯/wSR>]cBdS%*;ޛf%ۺ"mѦY7ErZܓ)qk5Z&3wN& !('u>w'[S,DmM)՛YPKqu-"lib/auto/XML/Parser/Expat/Expat.bsPKqu-hݏ"lib/auto/XML/Parser/Expat/Expat.so{|?~sc-2Bb9W!Cl7;9h[ۤRJRI*FrXHB {,sh^~]{z=_z'"la*$L:@iA Jsvf+m"TD8i T!D ƀt;,ߑO(n~c_CG鷱>]2@xBK h0XOAxhac[C!&+!<a]a4RP#yb!,\B#1ChКBXB§^T-LCxzBȁ0 pBȃV @Xafܒ~ P@C>1qtm0;n@o/du[V˵^uOIGB訤ޒnaHkwB0wQ 0k>> !ƒ aJxA! t=BAȅ%zB a:*)^ ~PAIs!D@h a]Ok0Bg , "ls3*.ӵ)>}G*w^]YD\T[+&2mq23Z@3*⏚˴7sqE~5D\8Gkk3E?WDi9]Go'K5v%]גgI׷o>3X*u }%ݣ9fN[-A5lZ:.`Kck] N't؅g5ߠYҝ|wߡs5ɿ tl[vP{Bٖ*rMJ,tNCmOu=~UHneir7OB{3[*֏ߒzsS-%ߡևڻ|T5- p&2'&ghџvK~~kuESz{eP6!g4 ZGV(_Fq'QG[,}ڷῶn͜^ki;|?< =aNϷg-sz}kt/k[ڻ>Ѥ?/C~amuWXfﲔ%Oe@ mZ(>X6'𝨼u)2oLgW=\o%[尥>7*3}}àУ=VPc43鿴'&UB{B-!Q޳tiG*jﳤ$}z%\gXe=/ǃjc7~S-!MWm҇Deo5A_z53_X~U=R>sv0S_a|ǯ_{RMs,Yji_eSL&9~*by~Uk6Ts}zѢqN#Vb @~%~-hRυ /[B iCjTbqK{,6/__BruԯM;Ii;pW@8ftj)χ-EͲ38jPy_&yb)Qzk19 fP>C# k@D3!95%&dbJSؤ-! NGz، G6ؑLHL ልpf9'ԡӦ( gƔ 3mJ %c;2g$&%ƙ.Xk0Aܤ4Q q)aJx3.A5 &읙HqHLq LHz&e&x%tKwL2BǤƥ8Ӝ:!-3#!&#.5Mʙ3>)55(WFS$N3Òc'Ձk^'Ǫxڸ E00&LHWO@[8HBԩz(F;5!.PgzbЊ)Ա` RSp$Np;ԓNPzeݛHK..Mpe.&q驱p%aqQv7'ɑb\ONMw&)]aJ1ƥ&uJMR&hxEH# tGA )"-zd0uD39]4@zo/LLPm3qCoI>A מ|)xd:\ *O8Ax3olJ|+ƁK3㜉)Ldix6!:% +7W#.E>/$sSqgP@:cL}c҆ew  pJ\1QQ\dGFZlK3r&94Jtʤԩ))qЦƆ~H6t;y!Iј*X_hpM8@SS|eM5WK&1E!}JH/wc||a1(_p$U[rūlg:<*#`__ԇ›/_Rz:a~M P眞H6@RJwIU/tSܽ|HupY_N"5#7!h헒k>rIqg8 Wt%|CqR`~/=*:_/3@sYOP}uMOtNLI*OzG H87bN4ȻXwȠ S5sTTi|b*N~*0Ko3IZ\WE>tRbZ4$3}`x*O}iV`,B4k;01dPZ+sU9:#uWG-Ɓq.(&3# zi׺m;L_D6e^1zSB%m{F~)6Z%bW-Q+s-C"Ɂ aίҵĚr?<&)Oq#C(9ŭ(ʓ6ʝvc< ] 㖚=qk(iZ0!_;C|1 b !/ƃ4q㉚IM 8Ubi0vj`h0giHjh4m,.M8O0~VӒ0~Q0~IӜi0~]fb w5-4m5mj"?Ҵi/ag&ƫ5m_hrjGk*7A̵iU@`F..7v8&.7v wC`.v^h@`v.v Ɲ]0qWhA`]0~]0 q8 .v8.Ӵ״uGizjZ>ƃ5m3C4mC5GiZњᚶv㑚V#V(Msc`' | gkwlR~O?8PoG '2lWe^v@D)Hw~ɍ(q2t@]%X@? DA>,s^GA 7ԣ=f9o`Q" ȍ(äs)01+?78](ܭt-طѭ"#6 :g@cÅa~ Jemֳ2Gf7/gmr?;fA}9U 'W5=C HdoB>tM;ӛ.5#l &KnryKR%0u0uKc-D} LeH*uunwWb2v"a]ѱZ DBC/3GY)%H˵I?.KV-E#wq3w{9s9s Cܺ*A7}Ce0͹$LlRp+K/*>S\(*UCug.IIjCj7(LNO42fOdn$!+7ɖbldբjeoƺxp%c}*Ѣ#F:.rΪzVqEUPઌ"|R˘]T*!- rG)3ΏpΪcL?V jeȞе])B#U#sJ$1uEY1}\ ,4:uVrD74@W|)9*Jp4{tF8?7b+b?N+ [0\QJ}80Sbzѝ RcL_¬:<@SK3y!+ًcz)"bN:<~;%,n bTqj.Nԓ|:>|&f}$Mr5 yYݎ| 鼬>:ͭ,X!ix2~ q1E Έl#"ڢbBt,t[bmKnĶ>`D?ul\@} ˍƯsDqNw[ѐ_؜1x'9 춾8o{U/fKN: ߝ )ʌ7c%,%!뎿 q̴\gr`YWx>'9ycj)1@F+9@0Y7_uΝu!]ͼnxΝnr n>YMirej )+.2f{JkOsbm(" eYi+Py_$MT f qMyX=g@eȌOʌ#dر>v\7Sۋ(S٭Ww,ۖӯ( n .vT9 UwӍas+ehpt)濍+[ ~gQ5L~L-|I ȯɭJD#b (Ȑh.e:yB%\(5y(*C .ll8,I21GE.67|)'>^8ɡ=1$ +>vLIp1(7L3j-?Ë sTxяpɫg1$xZe>tϝ/?bꑘ]z[FUh!|D}Wd^Gwsk`. .,0{ \\#Bf=6׈A\sa5\q0,E"wUxkdVBqݑc"ԝֵv{Nk=mj6s\qmE` vŒ7<P *?L=شֹ<'1SB~YJzfGЂ6(-"{W{7HO]~}ČM]~-`=ьMܯkw?IY_30[xZ}O]~fz=7 WXW)믗noA\믵5&2!UDԺL[m_pق {ـwa5ӯL#b^}2 $?ɸ<9u7ӓ^u}"h__3VًuUQ[|f,(sOL_U`XkLW!y}M>=aB.푘YVi!K;vyߠP ,21?mE]O,Gh{>:$cg61G_\`jnImKmzjӯ4$HNYW$ӷ}Ōe{bgHAHYX̭{pV-|q@b"1Ż!I9LCŭ? ?f~@y=~e&}gIDRWffTyH2 wj6n^BvCrFAG^Y4;bY3#Bdh~oORU4!b evJzOӇ0.Ak2i~Wَٖ?`Ф҇Ya&/uӓ,*cf?4#Ƚ?-+?RQT+oo=-O$.u>DOa SlW̏zm͌N:XSh=Yǟd6BEc.A!u3'4߹7e+?Dl{Zu'qO!-?nM'DVuk[+z>q`kD͇bh:A'nS3=73tݢǽUhً(MV2h>]5gwdvfwzI1%oS;A=ouiӐ1ui RlS6>cȕMW? {ei̹a ョ=m`^$aOLEqe=6 |U yu3ub [ΈuXbOA͸dElV*ӣfth3 {՞|_x|gf;Ն&1ߧz[TzF4d|,kar׾/mЯ096).76,ֻ_Hf|W>j3G0E2|DžMޕ񟩍Uo_WF.`HXtͪ$'ӿ"zЖPD)N}rua'uFehKQ_lT g'Ӄ>syУ(_|e4ߖ7[1o|oU+̰tSDae#MVVq_0z]w}~|YY )c2c7/|*wz7gzz3ߔ[V2u!~MS.}}z_kĝ]qVko_0s< 'Z4kl}J3vTؐT$jW֭ʐ5#mfW~+_aǿmA_{|rf=PZMb,Am%ѯ-a;7xߵ^XKx\ ;k2d9f4h_nP=+L?$M䤢:]oL翘,_`fL2a~Y9^IA_5N׳nN@hEVfakT-Eq1o_EcF[Og>4^XJ̔H%:vFyYK [V>:ᕊ}~QTZf5֫L?@ckL]t/#Jf`9OW%3}}) 7Cn%Ok +:uz?/} }KTP+ͬv[iזM`đv`>0m2SXn ļVSbj(bXu ŋ6lZbU[<  J\w1nΙߦRjgTLwn8a&wFtƯ\7gCZ3IC{:>F $5sDk/Ƿ~-ayw|~;>`u;|^ G9V|L}F!pDxˋ_HH7GHk~]©׭x]{ XR!8D3SGj:Z^'k /X`dB޹VWWM_sOU[?0 $&k"G8Dsڋ]Wy|M62kU^%;~VnEE3XLJ/3z$EL{3}%`K+XcYb2UVJ>bڭUG!ժ>1X׻hLo^fD_:3f6aaHBTz>!şlcd-BVAz]ֻe! Iln'Ÿ<şe΅$Ǹ_zݻ?[e?$OVIzK(|l:/|s]л9?S%3}?5^G+-1CO+syO[WWN>G ==R;Լ#d-SլʇYśꭕ/O"yW[}0|u?fV>~Ǽ+}(4H18f6_~Q;'T3?ч|hdǒjl;z0q5Ze1:JUR6wO= cC?}V/11ߗ?b'Z?VJ [K?nS KqҨV%>br{?Zɚ\/te[G3J[:dz0X5O~}LLfzUѳٌ.oGa2uʘ9q93jƭPG +$+\a3C$!1{4C+~ÐBnQ =}N{_xgcsL #8x#>TfW'zԒw\K k`\A>T%3}>ч0;@-|Dhlʸ w}e?h>܇Xݱ\&o?̬Kyqgi\TFu3x'-<oo.>i;bB1ߵ!}s _a濫:8>P}׹xỒLE71ޟjLwK[}ll&Lw<}HFNU}Wg&gr+C%P4V }}#M߬cβ(77@3oqHFbm2 mޑּnh_5 "Tk.^&m՚70NLfO3Oolߛ>0n2`koz|k}Gu?)S[X#<')?ߛ^|D!x#_Q s =1E3x^J'ߒyoq&JmXD&lofja&zt-՗lah2՗ _f%[7 vR%] L:s`t?[Amf%`-tʼn|̐y/Ⱥq#Wps/Yoy-y]&0pe{G9lTr sBWU$|.]·y|e3nnbwofՙ6]XNE\Uۙ?-OG>xT'h}^u _3 ۈ K0 [LM>ou1^_'_cvMMڄ+~M=>d_Ku#=0t A7oQ_jk⥮O翘Y :eV}ML YkmuEKQ1.dsW'iZb2oj|Y*RZ7ػ+y YIb__Qs fL}7T\郄B᜝Fo diD"b7d:\x3c4͙,_c/q^zBeЏ/6 z2f F =85\E8^aq;8hu)^uz8^S;0Cu+hIxIx3ZO.9fY%蘻 U'sb6BK/~@t^oZn&.AxZmz!&{J,l՗ZǪpC ~f8ng̣wܩ?ŽD z䟭f _DFP=K$6BZx_cϣ;Uy?B$(A({3_ VWy*l3?~d6g{^_y l[fL,Q~ξ?C,/T/ g9S_F_bO}dkxǛo_`'κ/X|/ iH=KCѹwYb1}ѻO(4y)U  sͱۅvRh\3f+p 7 4(Ók~\S%[ \3fc3384?f'U:ZuwaaAλagqdOf\ urvxPĪ^_D<I%XTFXkIiKݢV Ņ7=&VoZiΩyZ '] V+q/@\n2 `}r=[̺܈Uh6 JD*)ն@/Ug0 \:zuwc\B>JjXہg6/ QoeǐFٻ@)'0_ p} "<ǽ̹~>T;{:W>T1iѮ,PG$T#ϨFWOˆpe BMe+j]KsE;g0/%kom>Oׅ TݣkC58rD.YA4˞[uu<<+zzƍ~m{)zY]5gg'/6N W!x(cQhЍnʦo}~. $ \{w_V0+Ec yiұ"Ef:#\Vefۖ{O%ynWx>};㷳|=o@yPziʨѦ7{iu<};?J裼 3ͼ wȠԵ]}Z=mO‚# qS6~fzj&9PavTI%>IRCe4?$( \X3?,G|:1> zd5^&Y23>;np..B!ArFtD{Jr ez9E9wSfR{H̜#pCoߗTY&?^Tp3>B{|@dOW>G1/xoT胳>x_ʹz^^ p=Wmk[r^i3M[>} k$}]w)}gg3Ev}DŽ~}{_U_ߒ_\g/l_+V Pa羬ܭrKA(>^.eGbiE⓿* ep}Ҙi_=[^F,vC'ex{f9:\ⷩ> Q Q*ğ3Ū>Q|~fk 3?&(l1ή"DlU.. d FU%\I? ɹ)>2 LLP&d&LL+ ILjq&%23Lfp&iIp^Vn(*򲮔x/}zB1X}XNhj5 ȑvrϞ!6crD =|i.+j _^548\h,{5`y&{[7M̩xeVlgOqbjԡK=>[9J9 39LImUێܺd@駬TVѰy@L2Z6Uq*Cϣ8kˊa2fi^Vn'J)A5" =OF:/yE_<eRWh hkɨ{9Sڍ| 4+0( qJsӿaT$XLMw6fL{֭B=0+mQCǔېo3=Y|^0YI 3޽A*0Ki+8$uH+/;N]!|A0s\ Unb唐Nyé~t0׻=c:̫sWa5OLf rbsLܷ:ȾH0)e,Ÿ0 WTT,Uy3CbZL0=Na^U_`Y|T]=R*]| 2/h`f[JY矗[M`g )cL>M̩l~+[\{7 d>L pur閆;P)<,~grk`x87gw`Λs`R?[Ws9N?x[ O@p`<3 ?9 ±7sŸc9eatj8YKt.53Tm$^6IDO/1$'5f|?xDΌ-cDz͍?ZW"1CG g&~BV4oy2~[.g?_c$^2=do-3v͊_DA|~wJ6dJ7g|JjA|}.ǽ!sّ"nTTk&Iiwݓ<?8޴q RLM{2CqӗxӌgoJ93=''I{V_&x2z;1Z6ǰ1Ѽ2e>}0G\aѥH<&m7۫G$\E>-v{kLүץN#%\Ĩ}z`c~aMXErcr-I΄BRX$ÅO2T&ImLAte=܏؃L!n2_).Íݧƈ</Y\G b%1>զ%;^̧ƈ|b 1Zx~+tw<~CmcrH&|Qh~ƲSY JԱi~35ax0Ns"1H1" :#э v02Gu#t1g'Q 7r-z(^w+؁ i U=Q%2,а_H$~|ktzȾȻ%>G8QDh7hz5njO}{!eQaO=5eP(5Čf*$[Qr \L=ɞ.?'ֿ[3Ghc YKƏֿL_B>׿D=} {W׿yK/qE2m4? ڕ09su`(9D3+#M[&3["IS#=iv܊Q2=]nYSsd f6o4|)HO{r2+B}6i=aO1Y3{>迍=]!YfӓU{˘Lt Y0 s(G[)!;Okt#Ԟ%{Z&i՞F,@{kiwadJÆ^7 :r>s=D *|^y5WvoqNe~>OՊo=;-m 5`q‚-PO"J)y} $RuEw`]JSm=]ɯ:٢-n>SoUnxZ<0 7jJ(ø0z MjpKD:\ih%u W}670<<4V^7e$S.ġ:0Vt2q28ózp,`q= 2G)2o}S@W ן'kCʍ#fرUAS+2AsX1r^<?gdaXu!&<~#W⇘ûSsȍC )~}" طѵ =a?1(2tVzÙUfo?g`!D{sG?|A>lo&!a2 h\)La$20x% !"z R^Az-@!9?Ea~-m`?,fh FUCucPsD\k*EI|c??|OO0~dц? :2Lfo?ڬpAp%?p1gnȧe=PUMnk`_x?HS| 9?eB~?4cȤHjuOu?/EŅX',@`YOfZ)_L_B~;{U^X'I{~V[="ho]ϧcٽbg#R}ClC!nCl>!<ĥ~ǰ&_Цy}y7@Ǿ^}E %kV_1X1x_#WHy"%yK$)CmC!*P C^q c6¨p?)N c[Z?pw>x0R1}$j#o!x2ۡ^r!G^q&1%,%U>"L[FT0(0/O^čDȜԹFDT4o wo%>Gu~Q$7]ЋGžp=PBC?Cr ]? 4oa ].<V%ѝ^C >L~d'𡞪o`I?cL!|w3̾Awp _6*Eym Uwr`y|}OW!? gWȖT!{Y(ʸN?\_һMan#_+7]to9UC?A}~_vVSwu!CЅӛxulbhP0`Tgݼ$-[t60N:Ӌ:nN&p?hON_~*+@V93LGtQmd96nmfGa}0"U3'@%uO̐zy?)/ߧwu?۾KyH#+8OPtv]P<4y/ZC(ey̶ټ'̳Hq_Tq Q 5:I`OEȃLoB\˙L{\4ey%cdR%dRS۩ &翙T;O;m6wGoWxۡi$x}2*o3>S=޾miyvu}iK(ev;oyob$fo?q//zSс?k:xogF~x; <4|fx^r=foh?oq>0v?Vb"y>[26jN^Mov[- 9e9jmoON@0)f ;Z?AL_A:L7r ۶盶795&V>`{io87E[a?YfǷ&0қl?WP*¸[e[|OКNj{-#67H;ZCLH|cV!y p2V)r1:=?\l-!QwޔX]=Ò0xJZIkK'?ij-ip'{M) Å{M>y/9й&[e.w׷xoڽ>hZzoIa7G+֊<?xsZ%Xќ+p=>C-#p@kU#=7똫nx? |^0= LVc"G{+-y[Z/ ix`J:b"/C,q?wVeDnaЏMZT0[gV[Ȝ4ӹ"[TZ=ya?ӜWDŽEa7?FGlahP8`~( %#wgf'pI Uw2=3ᄆx75wOC3a-C=CUF)Xȱa]Ѩr?p GF=o$1fEURs}G5V^w=X{bLcGO?M +z o3 Ґ׿$Jr>\-:1Y=U|z܁ʽQh yu%2zˤS^DbjP2vI T=@&zm ^cW~3>NeoY*HmV!RũJ]N&aD6563#~V{m>/':\P:.nBc|M_Qb}VUJ>_BRR{ hdEsmW0wۃ=(da!iI& @]T1=_IlCf#|U\3_`Nwe%kw܋Y[˾NoYL[%r } h:.6Ep-F#zFBWGy%ƻ3Ҷuٚސ>y΃_Ġ.[3Wb`ݒ7iv{sr/I|ԫ˹sЖчr3+Fﺲoы2^Ʉh (݊uT] t11zw7];+-$x˾[%w# |.zn]CbosGmZOb$ # }v90v|<.?|[J܈=E.|*^ GqbejTL~T.Q2ZLgTa ],̾NȊBY+F3A,Bϒ( 8OL0}*匢U{nDѢ::[L:O-90g9$zx%Sތ T]dyh6Frk)/|Cu$>BR|m VquvE^ꉄH B a*\%| 8LDݘRTImM#pM>zuّ~q^.pA?6vّQ[tpC{]Q`yH?{[s)# -tpҫUm2Q[Z2`YRYU{99ޢJMDo)C#5\M8-ŏ+6^YG㝖^(7T~ M&9^_ƛB~J|t2Cq:^?%DO 5^7c$ 磕@}/qhf+ZSC;gqՠ+R|gdӟm MmKP(Lƈ CuTm4㫫*Pact{K\Dur!=/c fX eg3:{&/:;Q|>BQnpEW.mau9OE)_N߷![.uܳkx|gi0UɘT{Zx5+XpS 13}Ug^QlQ%?_]>[3kqN56I-g3Utխ&J1i@JnGg"B7WױޣnqQUTW^D?/VDb"\&JBlG۾C}2Ex2|~!yVask[GV/\%_ӉD,&W,*eZ/ucCDVb:}k'Q9XrxsO2î'G}SU>.T?T>gx gTi;+Z}d넯Rշ}dtUX ®!I*{&xJtaU|4FoGG8̧zeD\ίyg.?>~fL=WX36L>+{Gxް}dKS󴏩],dMockg'v>2U>eiMߴ}$0'\^}tflQɷ}Tg`B|ǡJoL#R?odO1׏eC%1ѯh>%/<);MD̯Opa+a2r. z<Q4i-lOl0?e1x/S?-x)Ij~[>rn>2BbUd?[4qJ0BoneG艦>}ǮB>~Aa# |GgFϾa {;T(-\yo׮u>e̯:uOm9H<죺b1[5_d_N?Y&4O_)zŽOp0C߂Wn>3s 1ü|Ǖ$¿W|Fzu*t&7}u/Ѭd}kq]^>3zqW(O93fW'z bGߪ}LfZ۫}e+jp}0$ۃW>¥}]zm/7WV7eȯyФ πc]=Xfb U;Zf\(W%v(x1%:ouVffB2z=TW{38.Χ#ylDurT+zwo2uׯ0} [K^f T|cq)ppţ"H[Qp"YHIʬW@ E,f.x㇓_NǼ</`2rR_9!%MÇ=0{u&U]Etk1T҄ϳb6P) nmmatΫ̧_Xih9}IKz~Y0M ?j ^zN0f1rE8% v\۳” _k3 ߛ1(~&,pKh^Ƕ~M0tC!Vv?mף lxUq.uܛ1bk6STKEom \cm^/4<>_>5Ɏ/<> ΊQbW- k >YbOXKE_=M*q+J|z \ݯC;[?KxwFsrtKs v6\Wq^i! PtBy]Ss/vdU6_$)"*JhvDcxDʠр/(TxYxr=eԴ( w(H"4yi;Ҳ/) HPbZvl8M^XtT2f%rizN *`9];@J74CnwN_3}75!ϟ.W||4LqhX?zUQ,pib݂'R< _m HκTg`T)9L]ФJ@<Ŵ^I?q\?|ǀj8z~)y//LuE<Պ2Ʉ;L puGKםm9y'炃Q#Ώ4cGhMǼyStxj2Q S(92>3ӥ/?Vk> Y~H[Hx}12G?!H.u.4Dϴ% {_,#E2 LO @{?yY=  )A_Q1WsRw+tiq_el 5W2ݯ/O;`{#C$u~r/>ퟱ_~}"PLֈC'˪v\ueSIƑ_M=0 l$J^x=JmkFkYܶ܈ bc{hl{ n/u|O`lG 'x͞ޛ{99<++O߉;0';ϛ92q3햃 si')O0%ۦNaÌ dncMfμj _x's{\r 31s@q3.Y2u9[̘h$y/u<`,+;Ù+RwƵORGq87:2XKmft)9/KjWv8D\-9~0֑yV}Ja\ʌd+cˌRxE::+͙1E\-9`00?91o5: ]̘$s .YO;%c{%x杧¸#oq83nܡԑy[+q15Ӓ j8H1y9W ~ueI%vEWOHj1̸l>{l8xD/xQQcUw*ʏߓRL+yDu-0b/.p!/k>4QnHfrE)wvT+P^ւ-MB}Wġ|'kR)gtڭ8 )~O+5embZލR*Z6 yYb;p})mjsmXWV1LFqzv/zYr1p?ݪ:s폹{"(l3J6vߔMyV]`'o u H\yQw ,+Qs4hV)Iq=JV3WHe^xtg3x'>v}w{PkݣEG922b'8DcSZ]KKHt&$QvHU`SQ$m4;!1)>ݑ =&8I)-/ q`>d3!5>$.6))d|lb#^⽑&;2bCN#ݭ5pt!Z~QzAͅHKL L Sc;'Nsd2cŎKr(N] UCqZZ2A %SިC^iІNJLNq&&iZ׮ڸTg3=6-$ pBet,C94fxĐ ,՛e:CDK7o"~k^ߐؔLgHx!SCSڸ 9R#ɠ=]CDo8c'@-cBR29C2qB2SR{Ǧ HL Q,$uDGK}IS!(KtNU~oA1TA'8RRS&T|ZڲpHJ3wܨ|f+D.!1#B,FyW&/}l葻zm;=<Ñ4>&cJ+P8Ⱥe?đ\.Y7|CR$UHƔ]B`JLnq3\܈~կ?2JW#Z_+#MXgUD/78=mNzfNCg>7(j%Ȗ?1>63Ƀ?~|G1Ƅ;⒬2S3}7c:cɼIN!Z]taN/x5 |'1%1#hVn`7_KHn\^3MdPN'|:o78'L=[\ B7eou2F6Bߌo&oiYE.yЮ0G:<9ʰ &0AqN-\|rn3a!Q 8R'$pě?}i%ﻑ+槲(rnXypS`%/ͨ [3>hq(55J>Ii|9t',4BA~c]Yt~'V MZWNH״lz* O.v=iC7t#Xњb M!6De0=OMPyq C:h&w*i퉎eiZ Ӛ@𱨠˅' rW첤 78 } awt=BA|YØOނ/;oY; ]x(CHH`ӎT&Y/[SZMc^(xpc7~Snէ ]ZۦJk}?9HS!=@sZM-M4oAz1MJgB߇ty~{?F}C{?sٴKFtXM[KA0iG}HfӆgH~1ǯ} =?ݩ|kw ׁ҅mIJ/!p¯R@lo%}ҒdIW5m(-! 1HjPy+x,;:NGc&${b\3Ù9~5fBRؤ9M[1enÍdBH0ېR哏IP4} ( RSF~H*$vܱ3&-.ƙZ vbOAH>Iό)1E"96}x3fBzT*.ֹb8bS,#L©vi 5)vxudԀi: *e)*Ux6ϻ qLP=";}ڍwdLϐjLci3;qUPLyj+r'8gg*Y씘$Ga!-5M d`Ϩ~lJzڳN$!dĥǝYwǁ2Y$G/&`u Ȋ,95 9.55ɨ~TX'Zx \Qr|Y3Ozgf$P불^d"RzsǛƉle9L!3Y>"~mjBntb*/M:09vکT)H32L@u)T^TתY9dQfSN GZcUgLQIoV Q]z)FJ+5:vyJ9/o\6q&qw1x7Q˩[_LD[eobm ,x}u`StGoP1y9]g}C/rJ[*ː|DābR ԍ\iе0晟Qʍ_9㈗iRz3Ob5 QH::){^TL+1%U &S|얹J3Iǃ0T~9!VY;8aI5kzsk6!/@eʫ?1QQ&V3kɬJxy>3٨jra P، Gb|Rjji.#Q)yhPFxӑgiױ}l'ݞ8R$qC*rT<(']Ɩ`0A&0p0 J&9Bz=q~v8k%z8^mZ&iGgb2ID4$^4ĉg/ק׎#x*(gZe<.=ǹ>qҏk'*&~\ta ėCq0i6T`2˂h.aK: (hQ\p%<[YڟŇ,^GŹ@h a%Mbۄ%bXFd162:YEiъT,s!2^H2/ wަ/" .8ₛ&4Pg $-v|JKnL.Ӿ\Udr*x#nEyH{mV=_ V//v=>1R+B9 h.#`23׉;Rb 7BWnH)1 ` ̆<c{le3ʒ8$1GMFۅ$pRo:39t}{ ~H,Bk#fNxR-d]|\D_yIlRt)f&ăVㅊt%`~.vO3T wA=a>%6ekERNe_&b ܭ`B#Zĵ$aLү9PQ*?_2`Qd&5QR̪u2TYRysRޱ4 \%:JZ]eA^KP-S>! il,W!+VBX O]dB4Lvrr5{&d]A皢K(59< 핕VOt`=O$3C*)wW^%|Yw `0`$a"+HAZָ$M4 vdrMop*e?`w0TwƁ`D:eAnXVKIiy)(TХMA}8w(X[SAT׶y`*D[[\(ѱ6 4lk/"]QFB1]I*@"K"N l4>Ո@+ЫvȨvR圴AI3\8>; g*6#U?T{hX6Yq_W7D/_\^\ LRBe^šWb9#]XrJB/1=L)ҐA4*ژymp::ܬT("#8*KSa<.3S1T6R,1ƥ̎Tp<^됇 I95A|Z3-@2q3ydOt hB$ȘkMHC(2E$ ?gF\/Iѣ= J+M;1>RX+`{u&Z0T3{U@N&Q>Fhfq61wrS$@x  Srcׅ:UGmyKE0d"%rӭwi촽PH@q NUWv̎Vk@X pzeB>Aʀ !z_hT@D `pC2M% l_UeIc%BAҌ&72)6EBA!C$4{?|5~j^jŞs!`1 }HdYIww{__QAx3w:d"n- lb{=b7uQZ%UX3b bѴ^/ߏD݂,qmL%`x{PdZp@É[y 6ve̒H" |.c*\L8C2Pvɾs o6IE0!`@^ߜ\tp~q3{CcrQNΐ;>k(s: -m"0' sG!$kzr`r_IҦ#5q'23<4UUŢâ*X*QyzP)i\,†"ph$dTa b)C5t$EkԲ5x&WS-RHSY @!'>DLsM,6N P4 w)dۑ=7K~BnDŽ`abEB(zOIw / Qm2B#D>"CNZ(HQk872N[% r 1RFSNaoԉWf)L㘄2 #(h 5bGikP ick|e#, mvJ( ja0_d` ,,AmZvY+pl'cb@m92*(uFK~80Vx/ \8;CZZG*4V &ڧT2/@no 4yeHcٛ4j :+Wp*;Eq$pgxB֏aG5YOJSYPmz?tkˣ!',zjW"JE|QGFZD2%W2RʭUc.bmCY! l&}b~&)=L >S 09CTL bZvBIP[船Ȁ8IJc34.`̔)ic!ʽCάhr+td(ҫt'޽f7\s>ln ՘0=f9aY@/ jSjpw= R儰>0CK0)GPy9RN9ZBCa̧VM{π`yF~͡yTܼ9g/Zl$Nϡa$NFGgojt|sqKWވwoG WKqt~xd@MGWP<t _,] znp]=8X!9zaF~ l1 O^taw5l[eg6cL2SC߉Na@"5#+(D E1}U?QG%:lHaa&/V-{mJp6;͢0qP: ا/S}p|GaS`x Szyyz~ =8N1c2x>1o"Cʴ)@1gGvnsSg @I%r_yT"AHqIy&ۢ9= >nϡQx/2vbWtut}tCZO芗GW..P*z]0X|6 @'X,6O_ߏ'h?t&թu2zu즵_T?q%+1~u$Z@d7j5rA:򷻶|gpv KZeAR\HAKrF[þwx4߶.iT]@'́)sĽJZ8s ABѸwNSs! vw$?Rna:G5ok󔟣֌afw^|> )d") z2d*0H,X)]`$FB[ qh`Vh-\w"Wa-7$efYSp i'@3Oӎ-E0ˌzf})$Ns"< s!V\ @w)M␧ _qѺna(ʰ(C4eESKwԳ]d`D:)2a_|򟬥^cK)(yǰ8v|e,-aJF0JPw #W9%]U![ˢUPͩyy)7|qTkdfXDE(3+Lt.%K@{IUdUΥqEHGeV(XBaBM]F@){TGDN AaETaw:#1'jjF, O˱d$3K;N5Bb Wm)ԭLQlPmmZxh|6 |0D" mpŠi.Ë{[v)^T\Se }vG[_ʰf)&ڝ-5S:Cd/O Zl9N#]kx۹W3u{~`5s;iU\Fj%{c/ɱ*TWr nʎ奐kEPif_?զ%5z'@qG^X!bPoaݒV<!qKF j n%U*ƈڡV ) * *窾&j6Ga;z&ī )tMP͹Z|C:h'^YYBvŮJخV!VGQq-M,_#5+9] Zc9`e2 ]/DK0I-Gs%Ti_9ޅ0TӮ=+V >Gy(G❎4 -Ә@^^Ȁ'ķ'q|B!IK˨ J\rъPg+*t A+8m zް@a]#Cq 8Ϊ |]n[*ރ>1L!gT/W8BKKO?uxm&EKTaRcZkKFZc2˴%J?ER`axoJ9DZ7ƫl7KZ%2kz-_#z__~t/vTU*dC<CUg@J|) ߊ}[5{dVC:(,Q=EgײpGu3%4%kJv{}5KRę8JgrԁY?ļʍQcôt6҅6.t܁Z8f]{]nA2J'.vӢXx )(X(jxWF&@r&Sm*S=y r%R2Dz(?Y6 o1ղRtD<“Hܞގ,LVSQb' ?В:̤(A_m֦ < "B8m<=?oؠ-EF{v?kUJ?m7ItH ^GwJ`t)+nZq'ۤT2ʹD^*PY-17JDm!!KQtTh4(nx*ڦ1[a[ wPa(Q kW:)(MͬIjD{xwdz%{_ 8 T4>b\KD%N~]AjxAAt;tF[W^`08}TnM]vO-oJس䧺gcQӀ>_c;aVמfOpl';;:zWzt<Վvhw4FyhZ|͎VL+oW봎 l5mI#xkw=xiMd|=Ń]׬R}فZu ,A]ϗrn0]@, \K7N|g[/~":A2QBWrvQ&*}[͎k~)]\c\/ɪNUiVjz†:@ӂv[-;ʍRU`NFٖiȤ*t@}fW(^ȉGTO"ˎC"kUc<el¾tB7K\U=:t99(?/Ә98tݑJ%a(_]mVo~+F?cU޿ZzQID/hő/[;:a`jPo?>ƯàM;<7A(!+|mj H>GA%9`6"'i@}Vb VEv)6.(6,3\/WVKo mI]SʤR Y!׼W?.xos;=~@h>.:y^:2UE']PwtZk)ͭ?:d~SEZJm$_KPjs[,Uߡjk] _>P-dwc4Ggsv@2îPIZO]~װTzKJt?+S=…^BֽM/_gfk=zwq~$:6X =I_ޤv|q77b&7ϟ=ssq?,Yfo!D~,GRA5:^eX |bͫBc^dI;ėL?PKxr0script/main.plU 0En# " tbiiiwu,pq7w1EBs6mIʃYAWjY*N"`GHxju`֥[$ڰͰ5^yIW0%d U%H x?ؓؖ/&L)M ŗBug8l7PKxr0 MANIFESTmo6S(-' bm&~^ mv3(nFRa}$Ϣ`w<qK҂(;Eoqs $\wHE ]a ^V]XK0 M kuNı{+ e莽:H@xeBdI'NH3~Kmd}٫|޽E秧:90QHU/EZ`ye7PKxr0_'META.yml-A0 yoj^"IZ)=ww<5J >  zRR- lib/Text/Diff.pmPKOr0Q-0 lib/Text/Table.pmPKOr0r"[ lib/VCP.pmPKOr0c"%Q lib/VCP/ConfigFileUtils.pmPKOr0:|" w lib/VCP/DB.pmPKOr0j.  lib/VCP/DB_File.pmPKOr0S\ lib/VCP/DB_File/big_records.pmPKOr0-fYR lib/VCP/DB_File/sdbm.pmPKOr0فy'  lib/VCP/Debug.pmPKOr0^htdE lib/VCP/DefaultFilters.pmPKOr0DDm lib/VCP/Dest.pmPKOr0DIy ]  lib/VCP/Dest/branch_diagram.pmPKOr0&?.  lib/VCP/Dest/csv.pmPKOr0G#d%O lib/VCP/Dest/cvs.pmPKOr0*H_)/ lib/VCP/Dest/data_dump.pmPKOr0&$0 lib/VCP/Dest/metadb.pmPKOr0ED>e~2 lib/VCP/Dest/null.pmPKOr0bf;e5 lib/VCP/Dest/p4.pmPKOr0S=T lib/VCP/Dest/revml.pmPKOr0ݒyh lib/VCP/Dest/summary.pmPKOr0l(` Vj lib/VCP/Dest/texttable.pmPKOr0 #n lib/VCP/Dest/topo_table.pmPKOr0M @x lib/VCP/Dest/vss.pmPKOr0HX lib/VCP/DiffFormat.pmPKOr00}mO lib/VCP/Driver.pmPKOr0ac lib/VCP/FilesDB.pmPKOr0P~/ B lib/VCP/Filter.pmPKOr0+mN lib/VCP/Filter/addlabels.pmPKOr0mH lib/VCP/Filter/changesets.pmPKOr0SY J [ lib/VCP/Filter/csv_trace.pmPKOr0' lib/VCP/Filter/dumpdata.pmPKOr0 ZM' lib/VCP/Filter/identity.pmPKOr0&[6B lib/VCP/Filter/labelmap.pmPKOr0 lib/VCP/Filter/logmemsize.pmPKOr0eF3x lib/VCP/Filter/map.pmPKOr03\S h lib/VCP/Filter/sort.pmPKOr0= lib/VCP/Filter/stringedit.pmPKOr0Ȥ2 lib/VCP/HeadRevsDB.pmPKwr0gu lib/VCP/Help.pmPKwr0Ԅ lib/VCP/Logger.pmPKwr0-8̒ lib/VCP/MainBranchIdDB.pmPKwr0n  lib/VCP/Patch.pmPKwr0 ceN h lib/VCP/Plugin.pmPKwr0YϚn lib/VCP/RefCountedFile.pmPKwr0.I:t:- lib/VCP/Rev.pmPKwr0zV lib/VCP/RevMapDB.pmPKwr0fK\ lib/VCP/Revs.pmPKwr0+%5 &` lib/VCP/Source.pmPKwr0U);8u lib/VCP/Source/cvs.pmPKwr0ր*2 lib/VCP/Source/metadb.pmPKwr0 k lib/VCP/Source/null.pmPKwr0|ٵWi lib/VCP/Source/p4.pmPKwr0T8GP lib/VCP/Source/revml.pmPKwr0wj!)ƇN. lib/VCP/Source/vss.pmPKwr0Dt W lib/VCP/UI.pmPKwr0ts\ +(X lib/VCP/UI/Text.pmPKwr0@h|d lib/VCP/UIMachines.pmPKwr09k]~ lib/VCP/Utils.pmPKwr0GT] lib/VCP/Utils/cvs.pmPKwr0aeX,d lib/VCP/Utils/metadb.pmPKwr0rN}\ō lib/VCP/Utils/p4.pmPKwr0s lib/VCP/Utils/revml.pmPKwr0>V  lib/VCP/Utils/vss.pmPKwr0Y,iU lib/XML/AutoWriter.pmPKwr0"4 Y2 lib/XML/Doctype.pmPKwr0L{ lib/XML/Doctype/AttDef.pmPKwr0w 3E? lib/XML/Doctype/ElementDecl.pmPKwr0K / lib/XML/Parser.pmPKwr0#2 lib/XML/Parser/Expat.pmPKxr0ٗU\ lib/XML/ValidWriter.pmPKxr0EAfoD lib/auto/Heap/Elem/autosplit.ixPKxr0MRq$ lib/auto/Heap/Fibonacci/autosplit.ixPKqu-"$ lib/auto/XML/Parser/Expat/Expat.bsPKqu-hݏ"m lib/auto/XML/Parser/Expat/Expat.soPKxr0Ascript/PKLr0B{"e%script/vcp_parPKxr0̽script/main.plPKxr0 MANIFESTPKxr0_'\META.ymlPKffu@ PAR.pm