CAM-PDF-1.60000755000765000765 012203034032 12051 5ustar00chrischris000000000000CAM-PDF-1.60/Build.PL000444000765000765 300612203034032 13501 0ustar00chrischris000000000000use Module::Build; Module::Build->new( module_name => 'CAM::PDF', dist_author => 'Clotho Advanced Media, Inc. ', license => 'perl', requires => { 'perl' => '5.6.0', 'Text::PDF' => '0.29', 'Crypt::RC4' => '2.02', 'Digest::MD5' => '2.16', }, recommends => { # Needed for scripts 'Getopt::Long' => '2.0', 'Pod::Usage' => '1.0', # Optional in tests, skipped if not present 'Test::Pod' => 0, 'Test::Pod::Coverage' => 0, 'Test::Memory::Cycle' => '1.02', }, build_requires => { 'Test::More' => 0, # needs to be v0.62 for Test::Memory::Cycle v1.02 }, script_files => [qw( bin/appendpdf.pl bin/asciify bin/changepagestring.pl bin/changepdfstring.pl bin/changerefkeys.pl bin/crunchjpg_tmpl.pdf bin/crunchjpgs.pl bin/deillustrate.pl bin/deletepdfpage.pl bin/extractallimages.pl bin/extractjpgs.pl bin/fillpdffields.pl bin/getpdffontobject.pl bin/getpdfpage.pl bin/getpdfpageobject.pl bin/getpdftext.pl bin/listfonts.pl bin/listimages.pl bin/listpdffields.pl bin/pdfinfo.pl bin/readpdf.pl bin/renderpdf.pl bin/replacepdfobj.pl bin/revertpdf.pl bin/rewritepdf.pl bin/setpdfbackground.pl bin/setpdfpage.pl bin/stamppdf.pl bin/uninlinepdfimages.pl )], add_to_cleanup => [ 'CAM-PDF-*' ], create_makefile_pl => 'traditional', )->create_build_script; CAM-PDF-1.60/CHANGES000444000765000765 3774112203034032 13235 0ustar00chrischris000000000000Revision history for Perl module CAM::PDF 1.60 14 Aug 2013 [ENHANCEMENTS] - Added min/max font size for form field filling. Thanks to Gareth Tunley for the idea and the initial code 1.59 28 Jan 2013 [FIXES] - Added support for the \134 escape, synonymous with \\ Thanks to Zakariyya Mughal for the patch https://rt.cpan.org/Ticket/Display.html?id=83018 1.58 28 May 2012 Many thanks for Vadim Repin for numerous excellent bug reports! [FIXES] - Appended pdf revisions incorrectly incremented object generation numbers https://rt.cpan.org/Ticket/Display.html?id=76513 - Appending pdf revisions was broken for non-linearized PDFs https://rt.cpan.org/Ticket/Display.html?id=76514 - Allow multiple "startxref" statements in the last 1024 bytes -- unlikely, but possible https://rt.cpan.org/Ticket/Display.html?id=77508 - Allow whitespace at the beginning of an indirect object (I think the PDF spec is ambiguous about this) https://rt.cpan.org/Ticket/Display.html?id=76512 - Allow backspace character https://rt.cpan.org/Ticket/Display.html?id=76151 [DOCUMENTATION] - mention $pdf->setPageContent($pagenum, $tree->toString()); Leo Lapworth and http://cpanforum.com/posts/13228 1.57 17 Dec 2011 [FIXES] - Test for undef streams instead of truth, to allow streams like '' or '0' Thanks to Thorsten Schwander for the patch - Failed to parse PDF 1.5 cross reference streams where a 1024-byte boundary happened to fall between "endstream" and "endobj" do to a logic error. Thanks to Thorsten Schwander for the report and fix suggestion 1.56 13 Dec 2011 [FIXES] - Workaround for corrupt PDFs that have 'n' records in their index that point to byte zero of the file. Silently treat those as 'f' records. Yet another case of Acrobat supporting broken PDFs, so the rest of us have to support them too... Thanks to Mark Hunnibell for a sample PDF that demonstrated the problem 1.55 22 Jun 2011 [FIXES] - Performance enhancement saving large files https://rt.cpan.org/Ticket/Display.html?id=69021 Thanks to David Porter of Audacitas Limited for the patch 1.54 26 Mar 2011 [FIXES] - appendPDF was broken intermittently if appended doc was bigger than main doc Thanks to Charlie Katz for a sample PDF http://chrisdolan.net/talk/2011/03/26/cam-pdf-fixes-appendpdf-bug/ 1.53 25 Mar 2011 [FIXES] - Handle PDF 1.5 case where "endstream" token crosses a 1024-byte boundary Thanks to Charlie Katz for a sample PDF - Allow whitespace after the 'stream' token for better interoperability http://rt.cpan.org/Ticket/Display.html?id=42819 Credit to Vonne 'Robert' Bannavong - Fix broken crunchjpgs.pl, patch submitted by George Greer - Tolerate leading zeros on objnums and gennums http://www.cpanforum.com/posts/11494 1.52 02 Oct 2008 [FIXES] - Better handling of failures during filter loading (rlane10 via http://www.nntp.perl.org/group/perl.cpan.testers/2008/10/msg2361238.html) 1.51 28 Sep 2008 [FIXES] - Support PDFs with 24-bit offsets in the xref stream (PDF v1.5 only) (thanks to Dan Richman for reporting the problem and providing an example) 1.50 20 Sep 2008 [ENHANCEMENTS] - Support for reading PDF 1.5 compressed object streams and cross reference streams. (we cannot write this style, but we can append to it) [FIXES] - Decompression of PNG-filtered streams was totally broken. - Deleting pages now also deletes back references from annotations on that page. - cleanse() now removes PieceInfo data. I have no idea what PieceInfo does, but it had a whole bunch of page back links that broke page deletion. 1.21 13 Aug 2008 [FIXES] - Permit comments after the %%EOF, like Adobe Reader does. Thanks to Malcolm Cook for pointing out the incompatibility. 1.20 26 Jun 2008 [ENHANCEMENTS] - Support for Type 2 encryption (just reading, not writing) - Support for reading PDFs where the owner and user passwords are different - Improvement to performance of node traversal, inspired by RT #35555 (credit Eric Hall and his anonymous employee). 1.13 23 Apr 2008 [FIXES] - setpdfbackground.pl computed RGB values incorrectly. Thanks to Andrew Cadman for finding the bug and suggesting a fix 1.12 27 Nov 2007 [FIXES] - I just realized that CAM::PDF::Renderer::Text was useless because it just printed to STDOUT. Fixed to offer a toString() method instead. Fuse::PDF wants this feature. - Fixed a typo in the Synopsis of CAM::PDF::Content 1.11 20 Nov 2007 [ENHANCEMENTS] - added previousRevision() and allRevisions() [invented in Fuse::PDF] [INTERNALS] - Compliance with Perl::Critic v1.080 1.10 24 Mar 2007 [FIXES] - RT #25306, regression in rangeToArray 1.09 25 Feb 2007 [FIXES] - Restore Perl 5.6.x compatibility which was broken in 1.08 (credit Brian Casey of rootlevelservices.com) - Detect end-image tag accidentally embedded with an inline image (credit Christian Drechsler) [INTERNALS] - Changed maintainer from CLOTHO@cpan.org to CDOLAN@cpan.org 1.08 17 Oct 2006 [FIXES] - Add binmode() for Windows (RT #22136) - Fix addFont() where there is no 'Font' property (RT #22049) [INTERNALS] - Compliance with Perl::Critic v0.21 and Bangs - Moved the examples from scripts/ to bin/ 1.07 11 Jul 2006 [ENHANCEMENTS] - Add background_color options to fillFormFields [FIXES] - Add binmode() for Windows (RT #22136) - Documentation and copyright year [INTERNALS] - Compliance with Perl::Critic v0.17 1.06 20 Mar 2006 [ENHANCEMENTS] - Added scripts/setpdfbackground.pl program - Added getPageDimensions() method 1.05 06 Dec 2005 [FIXES] - Forgot to import Carp::cluck 1.04_01 30 Nov 2005 [ENHANCEMENTS] - Docs [INTERNALS] - Refactoring - Add an ENV flag to skip some tests 1.03 20 Oct 2005 [ENHANCEMENTS] - Regression tests [FIXES] - Fixes for deletePages with initial support for Dests and Outlines [INTERNALS] - Some code cleanup 1.02_01 18 Oct 2005 Broken CPAN release! [ENHANCEMENTS] - Add options hash to the constructor. - Documentation [FIXES] - Regression: parseStream must be able to be called as a class method [INTERNALS] - Code refactoring. 1.01 20 Sep 2005 [INCOMPATIBLE] - The API for CAM::PDF::Decrypt changed. Several methods now require a CAM::PDF instance as a first argument. [FIXES] - Remove instances of circular references so CAM::PDF instances are able to be garbage collected. 1.00 19 Sep 2005 [FIXES] - Fix an artificial limitation of the encryption module 0.99 22 Apr 2005 First CPAN release [INCOMPATIBLE] - Relicence from GPL-only to GPL+Artistic [FIXES] - Debug asciify shell script - Read error on fontmetrics Width array (bounds error) [INTERNALS] - Add handy nodeType function 0.98 30 Nov 2004 [ENHANCEMENTS] - Added better position support to GS - Added support for color devices in G - Prepend [FIXES] - addFont now checks that the font does not exist before adding [INTERNALS] - load Data::Dumper on demand only 0.97 09 Nov 2004 [FIXES] - Tree validation fixes - Pass textwidth into the renderText() function - Page validation: string vs. hexstring 0.95 18 Jun 2004 [ENHANCEMENTS] - New methods: addFont, wrapString [FIXES] - Debugged: graphic state computation 0.94 13 May 2004 [ENHANCEMENTS] - New methods: getFontNames getFonts getFontByBaseName deEmbedFontByBaseName deEmbedFontObj - pdfinfo.pl - more detailed output - deillustrate.pl - new script to remove Illustrator metadata [FIXES] - disable the "node has only one kid and no parent" error This is a case where the delete code does a poor job of maintaining a balanced page tree and then complains about it's own bad work. This should eventually be fixed, but for now, removing the die() is good enough. 0.93 29 Mar 2004 [FIXES] - Fix for font de-embedding to remove unused font widths 0.92 30 Jan 2004 [ENHANCEMENTS] - Add deEmbedFont() method [FIXES] - Fix a new bug in the page range code 0.91 30 Jan 2004 [ENHANCEMENTS] - Add listfonts.pl [FIXES] - Fix bug regarding page number ranges in getpdftext.pl and rendertext.pl - Fix MANIFEST 0.90 18 Sep 2003 [INCOMPATIBLE] - Rename revert.pl to revertpdf.pl [ENHANCEMENTS] - Add documentation to all scripts - Ensure that all scripts respect PDF Modify permission [INTERNALS] - Add functions to facilitate testing PDF permissions 0.80 16 Sep 2003 [ENHANCEMENTS] - Lots and lots and lots of documentation - Use Module::Build [FIXES] - Caught a couple little bugs in Decrypt.pm - Clean up some obsolete code in the Decrypt module 0.75 11 Sep 2003 [FIXES] - Fix little bug in getStringWidth method - Minor bugfix in debugging function 0.74 29 Aug 2003 [FIXES] - Better handling for loading Text::PDF::Filter library [INTERNALS] - Split GS.pm into two parts for performance 0.73 11 Aug 2003 [FIXES] - Font metric widths were not properly dereferenced, in the case of indirect objects - Page content "cm" directives (transform user coordinate system matrix) were replacing the current matrix instead of appending to it. 0.72 26 Jun 2003 [ENHANCEMENTS] - Add documentation for extractPages [FIXES] - rangeToArray() bug fixes in the corner cases, added tests - Fix number of tests 0.71 25 Jun 2003 [ENHANCEMENTS] - add extractPages() - add more tests [FIXES] - Fix bug in deletePages 0.70 24 Jun 2003 [ENHANCEMENTS] - Convert parser to non-destructive for higher speed [FIXES] - Fix a bug in the test script 0.65 24 Jun 2003 [ENHANCEMENTS] - Add toPDF() and needsSave() methods. 0.64 24 Jun 2003 [ENHANCEMENTS] - Add PDF.pm dcumentation - Add isLinearized() method - Add more output for pdfinfo.pl [FIXES] - Fix bug in syntax for page "d" element (numbers, not just integers) 0.63 22 Jun 2003 [ENHANCEMENTS] - Added PDF test document - Added pdfinfo.pl script - Added toString method on CAM::PDF::Content class - Added writeInlineImage method to support above [FIXES] - Simple bug fix in writeAny error message 0.62 09 Jun 2003 [ENHANCEMENTS] - Add Images renderer - findImages() content method - Add prependPDF to function list [FIXES] - bug fix 0.61 22 Apr 2003 [ENHANCEMENTS] - Added prependPDF(), deletePages(), and rangeToArray() methods - test.pl overhaul - a little debugging output in getPage() 0.60 04 Apr 2003 [ENHANCEMENTS] - Graphics state and rendering, some little code clean ups - Make output function more mod-perl friendly - Add page content validation - Add parsing of inline images - Add better Tj/TJ handline - Add check option to getpdftext.pl - Simplify BT treatment - Enhance the content reading by using native PDF data type parsing (converted the parsing functions to be either instance or class methods) - Special heuristic treatment of TJs [FIXES] - Add getpdftext.pl to the manifest 0.50 01 Apr 2003 [ENHANCEMENTS] - Add page content parsing - Add script to output page text content - Overhauled fillForm to do things like use inherited form field values, do justified text, do autosized text. This requires the use of the Text::PDF font utilities. - Handle multiline form widgets [FIXES] - Fix font autosizing to account for multiline fields 0.42 19 Feb 2003 [ENHANCEMENTS] - Add getFont() function and supporting script - Add deletePage() function - Add deletepdfpage.pl script [FIXES] - Expect Encoding key in resource dictionary - Expect font size zero in form widgets TO DO: properly treat font size zero as autoscaled font 0.39 28 Oct 2002 [ENHANCEMENTS] - Add return of number of successes to fillformfields 0.38 28 Oct 2002 [ENHANCEMENTS] - Added clearAnnotations and addPageResources [FIXES] - Fix appendPDF - Add appendpdf.pl to the MANIFEST 0.37 04 Oct 2002 [ENHANCEMENTS] - Add appendPDF() function and a script to facilitate PDF merging - Support for removal of decryption blocks - deleteObject function - Add support for the "null" object type [FIXES] - Fix and enable the cleanse function. I can't make this function fail any longer. Yay! - Fix typo for free block in xref dictionary creation - Catch undef objects in fillFormFields 0.35 29 Jul 2002 [ENHANCEMENTS] - Add clearFormFieldTriggers function - Make buildNameTable work on fonts as well as xobjects [FIXES] - Fix dereference() documentation. - Change "if" to "while" in check for cmd line arguments [INTERNALS] - Moved uninlineImages function into library from script - Made some improvements to the embedded image detection logic - Change data structure for nodes from arrayref to object (hashref) 0.31 14 May 2002 [INTERNALS] - Reorganize directory 0.30 13 May 2002 [INCOMPATIBLE] - Change package name from PDF to CAM::PDF [ENHANCEMENTS] - lots and lots of documentation [FIXES] - fix undef bug in getFormField 0.23 26 Apr 2002 bugfixes 0.22 19 Apr 2002 [ENHANCEMENTS] - Password fields - Make Makefile.PL smarter -- read MANIFEST itself [FIXES] - Fix delinearize for non-linearized files - Font tweaks in form filling - Add listpdffields.pl to the manifest 0.21 15 Apr 2002 [FIXES] - Improvements to form handling - Bug fixes in output of xref 0.20 12 Apr 2002 [ENHANCEMENTS] - Add .pl files to manifest 0.10 12 Apr 2002 [INCOMPATIBLE] - Change how the changestring code works with regex values [ENHANCEMENTS] - Form fields - Remove extra files from make process - Support for: different PDF versions concatenated strings \ continued lines \ escaped characters cleaner output formatting some dictionary sorting (special cases) - mac2unix support in asciify - verbose option in extractallimages.pl - pdf versioning in rewritepdf.pl - new revision reversion tool [FIXES] - Fix bug for \n in string - Fix string output implementation (used to break Acrobat5 and Xpdf) 0.01 13 Mar 2002 [ENHANCEMENTS] - JPG options; PDF stamping functions - Cmd line options for tweaking jpg compression - Add JPEG quality flag - Added support for messing with images [FIXES] - Fix bug in escaped strings - Fix permission modification 0.01 22 Feb 2002 [ENHANCEMENTS] - encryption/decryption - some documentation 0.01 18 Feb 2002 [ENHANCEMENTS] - Search-and-replace text in a PDF doc - Program to change all reference objects - add cleanse feature (which breaks acrobat), fix some traverse bugs - Inline image uninlining 0.00 15 Feb 2002 Initial import CAM-PDF-1.60/LICENSE000444000765000765 25412203034032 13174 0ustar00chrischris000000000000Copyright 2005 Clotho Advanced Media, Inc., This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. CAM-PDF-1.60/Makefile.PL000444000765000765 324212203034032 14161 0ustar00chrischris000000000000# Note: this file was auto-generated by Module::Build::Compat version 0.4003 require 5.006000; use ExtUtils::MakeMaker; WriteMakefile ( 'PL_FILES' => {}, 'INSTALLDIRS' => 'site', 'NAME' => 'CAM::PDF', 'EXE_FILES' => [ 'bin/appendpdf.pl', 'bin/asciify', 'bin/changepagestring.pl', 'bin/changepdfstring.pl', 'bin/changerefkeys.pl', 'bin/crunchjpg_tmpl.pdf', 'bin/crunchjpgs.pl', 'bin/deillustrate.pl', 'bin/deletepdfpage.pl', 'bin/extractallimages.pl', 'bin/extractjpgs.pl', 'bin/fillpdffields.pl', 'bin/getpdffontobject.pl', 'bin/getpdfpage.pl', 'bin/getpdfpageobject.pl', 'bin/getpdftext.pl', 'bin/listfonts.pl', 'bin/listimages.pl', 'bin/listpdffields.pl', 'bin/pdfinfo.pl', 'bin/readpdf.pl', 'bin/renderpdf.pl', 'bin/replacepdfobj.pl', 'bin/revertpdf.pl', 'bin/rewritepdf.pl', 'bin/setpdfbackground.pl', 'bin/setpdfpage.pl', 'bin/stamppdf.pl', 'bin/uninlinepdfimages.pl' ], 'VERSION_FROM' => 'lib/CAM/PDF.pm', 'PREREQ_PM' => { 'Test::More' => 0, 'Crypt::RC4' => '2.02', 'Text::PDF' => '0.29', 'Digest::MD5' => '2.16' } ) ; CAM-PDF-1.60/MANIFEST000444000765000765 200012203034032 13327 0ustar00chrischris000000000000bin/appendpdf.pl bin/asciify bin/changepagestring.pl bin/changepdfstring.pl bin/changerefkeys.pl bin/crunchjpg_tmpl.pdf bin/crunchjpgs.pl bin/deillustrate.pl bin/deletepdfpage.pl bin/extractallimages.pl bin/extractjpgs.pl bin/fillpdffields.pl bin/getpdffontobject.pl bin/getpdfpage.pl bin/getpdfpageobject.pl bin/getpdftext.pl bin/listfonts.pl bin/listimages.pl bin/listpdffields.pl bin/pdfinfo.pl bin/readpdf.pl bin/renderpdf.pl bin/replacepdfobj.pl bin/revertpdf.pl bin/rewritepdf.pl bin/setpdfbackground.pl bin/setpdfpage.pl bin/stamppdf.pl bin/uninlinepdfimages.pl Build.PL CHANGES lib/CAM/PDF.pm lib/CAM/PDF/Content.pm lib/CAM/PDF/Decrypt.pm lib/CAM/PDF/GS.pm lib/CAM/PDF/GS/NoText.pm lib/CAM/PDF/Node.pm lib/CAM/PDF/PageText.pm lib/CAM/PDF/Renderer/Dump.pm lib/CAM/PDF/Renderer/Images.pm lib/CAM/PDF/Renderer/Text.pm lib/CAM/PDF/Renderer/TextFB.pm LICENSE Makefile.PL MANIFEST META.yml README t/basic.t t/bugreports.t t/inlineimage.pdf t/pdf.t t/pdf15.pdf t/pod-coverage.t t/pod.t t/resume.pdf t/sample1.pdf META.json CAM-PDF-1.60/META.json000444000765000765 466012203034032 13635 0ustar00chrischris000000000000{ "abstract" : "PDF manipulation library", "author" : [ "Clotho Advanced Media, Inc. " ], "dynamic_config" : 1, "generated_by" : "Module::Build version 0.4003, CPAN::Meta::Converter version 2.120921", "license" : [ "perl_5" ], "meta-spec" : { "url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec", "version" : "2" }, "name" : "CAM-PDF", "prereqs" : { "build" : { "requires" : { "Test::More" : "0" } }, "configure" : { "requires" : { "Module::Build" : "0.40" } }, "runtime" : { "recommends" : { "Getopt::Long" : "2.0", "Pod::Usage" : "1.0", "Test::Memory::Cycle" : "1.02", "Test::Pod" : "0", "Test::Pod::Coverage" : "0" }, "requires" : { "Crypt::RC4" : "2.02", "Digest::MD5" : "2.16", "Text::PDF" : "0.29", "perl" : "v5.6.0" } } }, "provides" : { "CAM::PDF" : { "file" : "lib/CAM/PDF.pm", "version" : "1.60" }, "CAM::PDF::Content" : { "file" : "lib/CAM/PDF/Content.pm", "version" : "1.60" }, "CAM::PDF::Decrypt" : { "file" : "lib/CAM/PDF/Decrypt.pm", "version" : "1.60" }, "CAM::PDF::GS" : { "file" : "lib/CAM/PDF/GS.pm", "version" : "1.60" }, "CAM::PDF::GS::NoText" : { "file" : "lib/CAM/PDF/GS/NoText.pm", "version" : "1.60" }, "CAM::PDF::Node" : { "file" : "lib/CAM/PDF/Node.pm", "version" : "1.60" }, "CAM::PDF::PageText" : { "file" : "lib/CAM/PDF/PageText.pm", "version" : "1.60" }, "CAM::PDF::Renderer::Dump" : { "file" : "lib/CAM/PDF/Renderer/Dump.pm", "version" : "1.60" }, "CAM::PDF::Renderer::Images" : { "file" : "lib/CAM/PDF/Renderer/Images.pm", "version" : "1.60" }, "CAM::PDF::Renderer::Text" : { "file" : "lib/CAM/PDF/Renderer/Text.pm", "version" : "1.60" }, "CAM::PDF::Renderer::TextFB" : { "file" : "lib/CAM/PDF/Renderer/TextFB.pm", "version" : "1.60" } }, "release_status" : "stable", "resources" : { "license" : [ "http://dev.perl.org/licenses/" ] }, "version" : "1.60" } CAM-PDF-1.60/META.yml000444000765000765 273112203034032 13462 0ustar00chrischris000000000000--- abstract: 'PDF manipulation library' author: - 'Clotho Advanced Media, Inc. ' build_requires: Test::More: 0 configure_requires: Module::Build: 0.40 dynamic_config: 1 generated_by: 'Module::Build version 0.4003, CPAN::Meta::Converter version 2.120921' license: perl meta-spec: url: http://module-build.sourceforge.net/META-spec-v1.4.html version: 1.4 name: CAM-PDF provides: CAM::PDF: file: lib/CAM/PDF.pm version: 1.60 CAM::PDF::Content: file: lib/CAM/PDF/Content.pm version: 1.60 CAM::PDF::Decrypt: file: lib/CAM/PDF/Decrypt.pm version: 1.60 CAM::PDF::GS: file: lib/CAM/PDF/GS.pm version: 1.60 CAM::PDF::GS::NoText: file: lib/CAM/PDF/GS/NoText.pm version: 1.60 CAM::PDF::Node: file: lib/CAM/PDF/Node.pm version: 1.60 CAM::PDF::PageText: file: lib/CAM/PDF/PageText.pm version: 1.60 CAM::PDF::Renderer::Dump: file: lib/CAM/PDF/Renderer/Dump.pm version: 1.60 CAM::PDF::Renderer::Images: file: lib/CAM/PDF/Renderer/Images.pm version: 1.60 CAM::PDF::Renderer::Text: file: lib/CAM/PDF/Renderer/Text.pm version: 1.60 CAM::PDF::Renderer::TextFB: file: lib/CAM/PDF/Renderer/TextFB.pm version: 1.60 recommends: Getopt::Long: 2.0 Pod::Usage: 1.0 Test::Memory::Cycle: 1.02 Test::Pod: 0 Test::Pod::Coverage: 0 requires: Crypt::RC4: 2.02 Digest::MD5: 2.16 Text::PDF: 0.29 perl: v5.6.0 resources: license: http://dev.perl.org/licenses/ version: 1.60 CAM-PDF-1.60/README000444000765000765 430612203034032 13071 0ustar00chrischris000000000000CAM::PDF - PDF manipulation library LICENSE Copyright 2002-2006 Clotho Advanced Media, Inc., L Copyright 2007-2008 Chris Dolan This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. ABOUT CLOTHO "CAM" stands for Clotho Advanced Media Inc. (www.clotho.com) which originally sponsored the development of this module. Clotho no longer has anything to do with this module and simply forwards inquiries to me. INSTALLATION Install via one of the following: perl Makefile.PL make make test make install or perl Build.PL perl Build perl Build test perl Build install DESCRIPTION This package reads and writes any document that conforms to the PDF specification generously provided by Adobe at http://partners.adobe.com/asn/developer/acrosdk/docs/filefmtspecs/PDFReference.pdf (3rd edition, for PDF v1.4 as of May 2002) The file format is well-supported, with the exception of the "linearized" or "optimized" output format, which this module can read but not write. Many specific aspects of the document model are not manipulable with this package (like some font details), but if the input document is correctly written, then this module will preserve the model integrity. This library grants you some power over the PDF security model. Note that applications editing PDF documents via this library MUST respect the security preferences of the document. Any violation of this respect is contrary to Adobe's intellectual property position, as stated in the reference manual at the above URL. COMPARISON TO OTHER MODULES Other Perl libraries which implement the PDF specification are Text::PDF, PDF::API2, PDFLib. PDF::API2 supercedes Text::PDF. PDFlib is a wrapper around the superb C library by www.pdflib.com. All three of those libraries are optimized for programatically creating new PDF documents from scratch. If that is your goal, then we highly recommend that you look at those. On the contrary, CAM::PDF is optimized for reading and manipulating existing PDF documents. We use CAM::PDF in production Linux environments to customize template PDF documents that were often created by non-programmers using standard tools. CAM-PDF-1.60/bin000755000765000765 012203034032 12621 5ustar00chrischris000000000000CAM-PDF-1.60/bin/appendpdf.pl000555000765000765 466112203034032 15266 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( verbose => 0, prepend => 0, forms => 0, order => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('f|forms' => \$opts{forms}, 'v|verbose' => \$opts{verbose}, 'p|prepend' => \$opts{prepend}, 'o|order' => \$opts{order}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 2) { pod2usage(1); } my @files; my @docs; push @files, shift; push @files, shift; my $outfile = shift || q{-}; foreach my $file (@files) { my $doc = CAM::PDF->new($file) || die "$CAM::PDF::errstr\n"; push @docs, $doc; } if ($opts{prepend}) { if ($opts{verbose}) { print 'Prepending '.$docs[1]->numPages().' page(s) to original '.$docs[0]->numPages()." page(s)\n"; } $docs[0]->prependPDF($docs[1]); } else { if ($opts{verbose}) { print 'Appending '.$docs[1]->numPages().' page(s) to original '.$docs[0]->numPages()." page(s)\n"; } $docs[0]->appendPDF($docs[1]); } if (!$opts{forms}) { $docs[0]->clearAnnotations(); } if ($opts{order}) { $docs[0]->preserveOrder(); } if (!$docs[0]->canModify()) { die "This PDF forbids modification\n"; } $docs[0]->cleanoutput($outfile); __END__ =for stopwords appendpdf.pl =head1 NAME appendpdf.pl - Append one PDF to another =head1 SYNOPSIS appendpdf.pl [options] file1.pdf file2.pdf [outfile.pdf] Options: -p --prepend prepend the document instead of appending it -f --forms wipe all forms and annotations from the PDF -o --order preserve the internal PDF ordering for output -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version =head1 DESCRIPTION Copy the contents of C to the end of C. This may break complex PDFs which include forms, so the C<--forms> option is provided to eliminate those elements from the resulting PDF. =head1 SEE ALSO CAM::PDF F =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/asciify000555000765000765 100312203034032 14325 0ustar00chrischris000000000000#!/bin/csh # convert binary files to ascii, so they can be viewed or diffed set dosconvert = 0 set macconvert = 0 if ("q$1" == "q-m") then set macconvert = 1 shift endif if ("q$1" == "q-d") then set dosconvert = 1 shift endif while ($#argv > 0) if ($dosconvert == 1) then perl -pe's/\r\n/\n/gs;s/\r/\n/gs' "$1" | cat -v >! "$1.ascii" else if ($macconvert == 1) then perl -pe's/\r/\n/gs' "$1" | cat -v >! "$1.ascii" else cat -v "$1" >! "$1.ascii" endif endif shift end CAM-PDF-1.60/bin/changepagestring.pl000555000765000765 413212203034032 16627 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( verbose => 0, order => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('v|verbose' => \$opts{verbose}, 'o|order' => \$opts{order}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 3) { pod2usage(1); } my $infile = shift; my $fromstr = shift; my $tostr = shift; my $outfile = shift || q{-}; my $doc = CAM::PDF->new($infile) || die "$CAM::PDF::errstr\n"; foreach my $p (1 .. $doc->numPages()) { my $content = $doc->getPageContent($p); if ($content =~ s/$fromstr/$tostr/gxms) { $doc->setPageContent($p, $content); } } if (!scalar %{$doc->{changes}} && exists $doc->{contents}) { $doc->output($outfile); } else { if ($opts{order}) { $doc->preserveOrder(); } if (!$doc->canModify()) { die "This PDF forbids modification\n"; } $doc->cleanoutput($outfile); } __END__ =for stopwords changepagestring.pl =head1 NAME changepagestring.pl - Search and replace in all PDF pages =head1 SYNOPSIS changepagestring.pl [options] infile.pdf search-regex replace-str [outfile.pdf] Options: -o --order preserve the internal PDF ordering for output -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version =head1 DESCRIPTION Searches through all pages of a PDF file for instances of C and inserts C. The regex should be a form that Perl understands. Note that this does not change the PDF metadata like forms and annotation. To change metadata, use instead F. =head1 SEE ALSO CAM::PDF F =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/changepdfstring.pl000555000765000765 437712203034032 16477 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( verbose => 0, order => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('v|verbose' => \$opts{verbose}, 'o|order' => \$opts{order}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 3) { pod2usage(1); } my $infile = shift; my $fromstr = shift; my $tostr = shift; my $outfile = shift || q{-}; my $doc = CAM::PDF->new($infile) || die "$CAM::PDF::errstr\n"; foreach my $objnum (keys %{$doc->{xref}}) { my $objnode = $doc->dereference($objnum); $doc->changeString($objnode, {$fromstr => $tostr}); } if (!scalar %{$doc->{changes}} && exists $doc->{contents}) { print $doc->{contents}; } else { if ($opts{order}) { $doc->preserveOrder(); } if (!$doc->canModify()) { die "This PDF forbids modification\n"; } $doc->cleanoutput($outfile); } __END__ =for stopwords changepdfstring.pl =head1 NAME changepdfstring.pl - Search and replace in PDF metadata =head1 SYNOPSIS changepdfstring.pl [options] infile.pdf search-str replace-str [outfile.pdf] Options: -o --order preserve the internal PDF ordering for output -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version =head1 DESCRIPTION Searches through a PDF file's metadata for instances of C and inserts C. Note that this does not change the actual PDF page layout, but only interactive features, like forms and annotation. To change page layout strings, use instead F. The C can be a literal string, or it can be a Perl regular expression by wrapping it in C. For example: changepdfstring.pl in.pdf 'regex(CAM-PDF-(\d.\d+))' 'version=$1' out.pdf =head1 SEE ALSO CAM::PDF F =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/changerefkeys.pl000555000765000765 354212203034032 16140 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( verbose => 0, order => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('v|verbose' => \$opts{verbose}, 'o|order' => \$opts{order}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 3) { pod2usage(1); } my $infile = shift; my @nums = @ARGV; my $outfile = q{-}; if (@nums % 2 != 0) { $outfile = pop @nums; } my $doc = CAM::PDF->new($infile) || die "$CAM::PDF::errstr\n"; $doc->changeRefKeys(CAM::PDF::Node->new('dictionary', $doc->{trailer}), {@nums}, 1); if ($opts{order}) { $doc->preserveOrder(); } if (!$doc->canModify()) { die "This PDF forbids modification\n"; } $doc->cleanoutput($outfile); __END__ =for stopwords changerefkeys.pl =head1 NAME changerefkeys.pl - Search and replace PDF object numbers in the Trailer =head1 SYNOPSIS changerefkeys.pl [options] infile.pdf old-objnum new-objnum [old-objnum new-objnum ...] [outfile.pdf] Options: -o --order preserve the internal PDF ordering for output -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version =head1 DESCRIPTION Changes a PDF to alter the object numbers in the PDF Trailer. The resulting edited PDF is output to a specified file or STDOUT. This is a very low-level utility, and is not likely useful for general users. =head1 SEE ALSO CAM::PDF =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/crunchjpg_tmpl.pdf000444000765000765 560612203034032 16477 0ustar00chrischris000000000000%PDF-1.2 1 0 obj << /CreationDate (D:20020207113345) /Producer (@\(#\)ImageMagick 5.4.1 12/01/01 Q:16 http://www.imagemagick.org) >> endobj 2 0 obj << /Type /Catalog /Pages 3 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 4 0 obj << /Type /Page /Parent 3 0 R /Resources << /Font << /F0 8 0 R >> /XObject << /Im0 9 0 R >> /ProcSet 7 0 R >> /MediaBox [0 0 777 888] /Contents 5 0 R /Thumb 12 0 R >> endobj 5 0 obj << /Length 6 0 R >> stream q xxx 0 0 yyy 0 0 cm /Im0 Do Q endstream endobj 6 0 obj 31 endobj 7 0 obj [ /PDF /Text /ImageI ] endobj 8 0 obj << /Type /Font /Subtype /Type1 /Name /F0 /BaseFont /Helvetica /Encoding /MacRomanEncoding >> endobj 9 0 obj << /Type /XObject /Subtype /Image /Name /Im0 /Filter [ /RunLengthDecode ] /Width 100 /Height 100 /ColorSpace 11 0 R /BitsPerComponent 8 /Length 10 0 R >> stream              %                                  &                   endstream endobj 10 0 obj 641 endobj 11 0 obj [ /Indexed /DeviceRGB 31 14 0 R ] endobj 12 0 obj << /Filter [ /RunLengthDecode ] /Width 100 /Height 100 /ColorSpace 11 0 R /BitsPerComponent 8 /Length 13 0 R >> stream              %                                  &                   endstream endobj 13 0 obj 641 endobj 14 0 obj << /Length 15 0 R >> stream , :0HJ_ewu.GDZUi endstream endobj 15 0 obj 96 endobj xref 0 16 0000000000 65535 f 0000000010 00000 n 0000000141 00000 n 0000000190 00000 n 0000000249 00000 n 0000000430 00000 n 0000000513 00000 n 0000000531 00000 n 0000000569 00000 n 0000000677 00000 n 0000001505 00000 n 0000001525 00000 n 0000001575 00000 n 0000002362 00000 n 0000002382 00000 n 0000002533 00000 n trailer << /Size 16 /Info 1 0 R /Root 2 0 R >> startxref 2552 %%EOF CAM-PDF-1.60/bin/crunchjpgs.pl000555000765000765 2253312203034032 15511 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; use English qw(-no_match_vars); our $VERSION = '1.60'; my %opts = ( # Hardcoded: template => 'crunchjpg_tmpl.pdf', # User settable values: justjpgs => 0, quality => 50, scale => undef, scalemin => 0, skip => {}, only => {}, Verbose => 0, verbose => 0, order => 0, help => 0, version => 0, # Temporary values: onlyval => [], skipval => [], qualityval => undef, scaleminval=> undef, scaleval => undef, scales => {1 => undef, 2 => '50%', 4 => '25%', 8 => '12.5%'}, ); Getopt::Long::Configure('bundling'); GetOptions('S|skip=s' => \@{$opts{skipval}}, 'O|only=s' => \@{$opts{onlyval}}, 'q|quality=i' => \$opts{qualityval}, 's|scale=i' => \$opts{scaleval}, 'm|scalemin=i' => \$opts{scaleminval}, 'j|justjpgs' => \$opts{justjpgs}, 'veryverbose' => \$opts{Verbose}, 'v|verbose' => \$opts{verbose}, 'o|order' => \$opts{order}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } ## Fix up and validate special options: if ($opts{Verbose}) { $opts{verbose} = 1; } if (defined $opts{scaleval}) { if (exists $opts{scales}->{$opts{scaleval}}) { $opts{scale} = $opts{scales}->{$opts{scaleval}}; } else { die "Invalid value for --scale switch\n"; } } if (defined $opts{scaleminval}) { if ($opts{scaleminval} =~ m/\A\d+\z/xms && $opts{scaleminval} > 0) { $opts{scalemin} = $opts{scaleminval}; } else { die "Invalid value for --scalemin switch\n"; } } if (defined $opts{qualityval}) { if ($opts{qualityval} =~ m/\A\d+\z/xms && $opts{qualityval} >= 1 && $opts{qualityval} <= 100) { $opts{quality} = $opts{qualityval}; } else { die "The JPEG --quality setting must be between 1 and 100\n"; } } foreach my $flag (qw( skip only )) { foreach my $val (@{$opts{$flag.'val'}}) { foreach my $key (split /\D+/xms, $val) { $opts{$flag}->{$key} = 1; } } } if (!-f $opts{template}) { die "Cannot find the template pdf called $opts{template}\n"; } # Start work: if (@ARGV < 1) { pod2usage(1); } my $infile = shift; my $outfile = shift || q{-}; my $doc = CAM::PDF->new($infile) || die "$CAM::PDF::errstr\n"; if (!$doc->canModify()) { die "This PDF forbids modification\n"; } my $pages = $doc->numPages(); my $nimages = 0; my $rimages = 0; my %doneobjs; my $oldcontentsize = $doc->{contentlength}; my $oldtotsize = 0; my $newtotsize = 0; for my $p (1..$pages) { my $c = $doc->getPageContent($p); my @parts = split /(\/[\w]+\s*Do)\b/xms, $c; foreach my $part (@parts) { if ($part =~ m/\A(\/[\w]+)\s*Do\z/xms) { my $ref = $1; my $xobj = $doc->dereference($ref, $p); my $objnum = $xobj->{objnum}; my $im = $doc->getValue($xobj); my $l = $im->{Length} || $im->{L} || 0; if ($l) { $l = $doc->getValue($l); } my $w = $im->{Width} || $im->{W} || 0; if ($w) { $w = $doc->getValue($w); } my $h = $im->{Height} || $im->{H} || 0; if ($h) { $h = $doc->getValue($h); } next if (exists $doneobjs{$objnum}); $nimages++; _inform("Image $nimages page $p, $ref = object $objnum, (w,h)=($w,$h), length $l", $opts{verbose}); if (exists $opts{skip}->{$objnum} || (0 < scalar keys %{$opts{only}} && !exists $opts{only}->{$objnum})) { _inform("Skipping object $objnum", $opts{verbose}); next; } my $isjpg = _isjpg($im); if ((!$isjpg) && $opts{justjpgs}) { _inform('Not a jpeg', $opts{verbose}); } else { my $oldsize = $doc->getValue($im->{Length}); if (!$oldsize) { die "PDF error: Failed to get size of image\n"; } $oldtotsize += $oldsize; my $tmpl = CAM::PDF->new($opts{template}) || die "$CAM::PDF::errstr\n"; # Get a handle on the needed data bits from the template my $media_array = $tmpl->getValue($tmpl->getPage(1)->{MediaBox}); my $rawpage = $tmpl->getPageContent(1); $media_array->[2]->{value} = $w; $media_array->[3]->{value} = $h; my $page = $rawpage; $page =~ s/xxx/$w/igxms; $page =~ s/yyy/$h/igxms; $tmpl->setPageContent(1, $page); $tmpl->replaceObject(9, $doc, $objnum, 1); my $ofile = "/tmp/crunchjpg.$$"; $tmpl->cleanoutput($ofile); my $cmd = ('convert ' . ($opts{scale} && $w > $opts{scalemin} && $h > $opts{scalemin} ? "-scale '$opts{scale}' " : q{}) . "-quality $opts{quality} " . '-density 72x72 ' . "-page ${w}x$h " . "pdf:$ofile jpg:- | " . 'convert jpg:- pdf:- |'); _inform($cmd, $opts{Verbose}); # TODO: this should use IPC::Open3 or the like open my $pipe, $cmd ## no critic (ProhibitTwoArgOpen) or die "Failed to convert object $objnum to a jpg and back\n"; my $content = do { local $RS = undef; <$pipe>; }; close $pipe or die "Failed to convert object $objnum to a jpg and back\n"; my $jpg = CAM::PDF->new($content) || die "$CAM::PDF::errstr\n"; my $jpgim = $jpg->getObjValue(8); my $jpgsize = $jpg->getValue($jpgim->{Length}); if ($jpgsize < $oldsize) { $doc->replaceObject($objnum, $jpg, 8, 1); $newtotsize += $jpgsize; my $percent = sprintf '%.1f', 100 * ($oldsize - $jpgsize) / $oldsize; _inform("\tcompressed $oldsize -> $jpgsize ($percent%)", $opts{verbose}); $doneobjs{$objnum} = 1; $rimages++; } else { _inform("\tskipped $oldsize -> $jpgsize", $opts{verbose}); } } } } } _inform("Crunched $rimages of $nimages images", $opts{verbose}); $doc->cleanoutput($outfile); my $newcontentsize = $doc->{contentlength}; if ($opts{verbose}) { my $contentpercent = sprintf '%.1f', $oldcontentsize ? 100 * ($oldcontentsize - $newcontentsize) / $oldcontentsize : 0; my $totpercent = sprintf '%.1f', $oldtotsize ? 100 * ($oldtotsize - $newtotsize) / $oldtotsize : 0; _inform('Compression summary:', 1); _inform(" Document: $oldcontentsize -> $newcontentsize ($contentpercent%)", 1); _inform(" Images: $oldtotsize -> $newtotsize ($totpercent%)", 1); } sub _isjpg { my $im = shift; return if (!$im->{Filter}); my $f = $im->{Filter}; my @names = $f->{type} eq 'array' ? @{$f->{value}} : $f; for my $e (@names) { my $name = $doc->getValue($e); if (ref $name) { $name = $name->{value}; } #warn "Checking $name\n"; if ($name eq 'DCTDecode') { return 1; } } return; } sub _inform { my $str = shift; my $verbose = shift; if ($verbose) { print STDERR $str, "\n"; } return; } __END__ =for stopwords crunchjpgs.pl ImageMagick JPG rescaling =head1 NAME crunchjpgs.pl - Compress all JPG images in a PDF =head1 SYNOPSIS crunchjpgs.pl [options] infile.pdf [outfile.pdf] Options: -j --justjpgs make script skip non-JPGs -q --quality select JPG output quality (default 50) -s --scale=num select a rescaling factor for the JPGs (default 100%) -m --scalemin=size don't scale JPGs smaller than this pixel size (width or height) -O --only=imnum only change the specified images (can be used mutliple times) -S --skip=imnum don't change the specified images (can be used mutliple times) -o --order preserve the internal PDF ordering for output --veryverbose increases the verbosity -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version The available values for --scale are: 1 100% 2 50% 4 25% 8 12.5% C is a comma-separated list of integers indicating the images in order that they appear in the PDF. Use F to retrieve the image numbers. =head1 DESCRIPTION Requires the ImageMagick B program to be available Tweak all of the JPG images embedded in a PDF to reduce their size. This reduction can come from increasing the compression and/or rescaling the whole image. Various options give you full control over which images are altered. =head1 SEE ALSO CAM::PDF F F F F =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/deillustrate.pl000555000765000765 515112203034032 16021 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( verbose => 0, order => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('v|verbose' => \$opts{verbose}, 'o|order' => \$opts{order}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 1) { pod2usage(1); } my $infile = shift; my $outfile = shift || q{-}; my $doc = CAM::PDF->new($infile) || die "$CAM::PDF::errstr\n"; if (!$doc->canModify()) { die "This PDF forbids modification\n"; } foreach my $objnum (keys %{$doc->{xref}}) { my $objnode = $doc->dereference($objnum); my $val = $objnode->{value}; if ($val->{type} eq 'dictionary') { my $dict = $val->{value}; my $changed = 0; foreach my $key (qw(Metadata PieceInfo LastModified Thumb)) { if (exists $dict->{$key}) { delete $dict->{$key}; $changed = 1; } } if ($changed) { $doc->{changes}->{$objnum} = 1; } } } $doc->cleanse(); if ($opts{order}) { $doc->preserveOrder(); } $doc->cleanoutput($outfile); __END__ =for stopwords deillustrate.pl =head1 NAME deillustrate.pl - Remove Adobe Illustrator metadata from a PDF file =head1 SYNOPSIS deillustrate.pl [options] infile.pdf [outfile.pdf]\n"; Options: -o --order preserve the internal PDF ordering for output -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version =head1 DESCRIPTION Adobe Illustrator has a very handy feature that allows an author to embed special metadata in a PDF that allows Illustrator to reopen the file fully editable. However, this extra data does increase the size of the PDF unnecessarily if no further editing is expected, as is the case for most PDFs that will be distributed on the web. Depending on the PDF, this can dramatically reduce the file size. This program uses a few heuristics to find and delete the Illustrator-specific data. This program also removes embedded thumbnail representations of the PDF for further byte savings. =head1 SEE ALSO CAM::PDF =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/deletepdfpage.pl000555000765000765 347412203034032 16117 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( verbose => 0, order => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('v|verbose' => \$opts{verbose}, 'o|order' => \$opts{order}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 2) { pod2usage(1); } my $infile = shift; my $pagenums = shift; my $outfile = shift || q{-}; my $doc = CAM::PDF->new($infile) || die "$CAM::PDF::errstr\n"; if (!$doc->deletePages($pagenums)) { die "Failed to delete a page\n"; } if ($opts{order}) { $doc->preserveOrder(); } if (!$doc->canModify()) { die "This PDF forbids modification\n"; } $doc->cleanoutput($outfile); __END__ =for stopwords deletepdfpage.pl =head1 NAME deletepdfpage.pl - Remove one or more pages from a PDF =head1 SYNOPSIS deletepdfpage.pl [options] infile.pdf [outfile.pdf] Options: -o --order preserve the internal PDF ordering for output -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version is a comma-separated list of page numbers. Ranges like '2-6' allowed in the list Example: 4-6,2,12,8-9 =head1 DESCRIPTION Remove the specified pages from a PDF document. This may fail for very complex, annotated PDF files, for example ones that Adobe Illustrator emits. =head1 SEE ALSO CAM::PDF C =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/extractallimages.pl000555000765000765 1275512203034032 16701 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( template => 'crunchjpg_tmpl.pdf', verbose => 0, help => 0, version => 0, skip => {}, only => {}, # Temporary values: onlyval => [], skipval => [], ); Getopt::Long::Configure('bundling'); GetOptions('S|skip=s' => \@{$opts{skipval}}, 'O|only=s' => \@{$opts{onlyval}}, 'v|verbose' => \$opts{verbose}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } foreach my $flag (qw( skip only )) { foreach my $val (@{$opts{$flag.'val'}}) { foreach my $key (split /\D+/xms, $val) { $opts{$flag}->{$key} = 1; } } } if (!-f $opts{template}) { die "Cannot find the template pdf called $opts{template}\n"; } if (@ARGV < 2) { pod2usage(1); } my $infile = shift; my $outdir = shift; my $doc = CAM::PDF->new($infile) || die "$CAM::PDF::errstr\n"; my $nimages = 0; my $rimages = 0; my %doneobjs; foreach my $objnum (keys %{$doc->{xref}}) { my $xobj = $doc->dereference($objnum); if ($xobj->{value}->{type} eq 'dictionary') { my $im = $xobj->{value}->{value}; if (exists $im->{Type} && $doc->getValue($im->{Type}) eq 'XObject' && exists $im->{Subtype} && $doc->getValue($im->{Subtype}) eq 'Image') { my $ref = '(no name)'; if ($im->{Name}) { $ref = $doc->getValue($im->{Name}); } my $w = $im->{Width} || $im->{W} || 0; if ($w) { $w = $doc->getValue($w); } my $h = $im->{Height} || $im->{H} || 0; if ($h) { $h = $doc->getValue($h); } next if (exists $doneobjs{$objnum}); $nimages++; _inform("Image $nimages, $ref = object $objnum, (w,h)=($w,$h)", $opts{verbose}); if (exists $opts{skip}->{$objnum} || (0 < scalar keys %{$opts{only}} && !exists $opts{only}->{$objnum})) { _inform("Skipping object $objnum", $opts{verbose}); next; } my $isjpg = _isjpg($im); my $oldsize = $doc->getValue($im->{Length}); if (!$oldsize) { die "PDF error: Failed to get size of image\n"; } my $tmpl = CAM::PDF->new($opts{template}) || die "$CAM::PDF::errstr\n"; # Get a handle on the needed data bits from the template my $media_array = $tmpl->getValue($tmpl->getPage(1)->{MediaBox}); my $rawpage = $tmpl->getPageContent(1); $media_array->[2]->{value} = $w; $media_array->[3]->{value} = $h; my $page = $rawpage; $page =~ s/xxx/$w/igxms; $page =~ s/yyy/$h/igxms; $tmpl->setPageContent(1, $page); $tmpl->replaceObject(9, $doc, $objnum, 1); my $ofile = "/tmp/crunchjpg.$$"; $tmpl->cleanoutput($ofile); if (!-d $outdir) { require File::Path; File::Path::mkpath($outdir); } if ($isjpg) { my $result = `convert -quality 50 -density 72x72 -page ${w}x$h pdf:$ofile jpg:$outdir/$objnum.jpg`; ## no critic (Backtick) _inform($result, $opts{verbose}); } else { my $result = `convert -density 72x72 -page ${w}x$h pdf:$ofile gif:$outdir/$objnum.gif`; ## no critic (Backtick) _inform($result, $opts{verbose}); } $doneobjs{$objnum} = 1; $rimages++; } } } _inform("Extracted $rimages of $nimages images", $opts{verbose}); sub _isjpg { my $im = shift; return if (!$im->{Filter}); my $f = $im->{Filter}; my @names = $f->{type} eq 'array' ? @{$f->{value}} : $f; for my $e (@names) { my $name = $doc->getValue($e); if (ref $name) { $name = $name->{value}; } #warn "Checking $name\n"; if ($name eq 'DCTDecode') { return 1; } } return; } sub _inform { my $str = shift; my $verbose = shift; if ($verbose) { print STDERR $str, "\n"; } return; } __END__ =for stopwords extractallimages.pl ImageMagick =head1 NAME extractallimages.pl - Save copies of all PDF images to a directory =head1 SYNOPSIS extractallimages.pl [options] infile.pdf outdirectory Options: -O --only=imnum only output the specified images (can be used mutliple times) -S --skip=imnum don't output the specified images (can be used mutliple times) -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version C is a comma-separated list of integers indicating the images in order that they appear in the PDF. Use F to retrieve the image numbers. =head1 DESCRIPTION Requires the ImageMagick B program to be available Searches the PDF for images and saves them as individual files in the specified directory. The files are named CimnumE.jpg> or CimnumE.gif>. =head1 SEE ALSO CAM::PDF F F F F =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/extractjpgs.pl000555000765000765 1200112203034032 15666 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( template => 'crunchjpg_tmpl.pdf', verbose => 0, help => 0, version => 0, skip => {}, # Temporary values: skipval => [], ); Getopt::Long::Configure('bundling'); GetOptions('S|skip=s' => \@{$opts{skipval}}, 'v|verbose' => \$opts{verbose}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } foreach my $flag (qw( skip )) { foreach my $val (@{$opts{$flag.'val'}}) { foreach my $key (split /\D+/xms, $val) { $opts{$flag}->{$key} = 1; } } } if (!-f $opts{template}) { die "Cannot find the template pdf called $opts{template}\n"; } if (@ARGV < 2) { pod2usage(1); } my $infile = shift; my $outdir = shift; my $doc = CAM::PDF->new($infile) || die "$CAM::PDF::errstr\n"; my $pages = $doc->numPages(); my $nimages = 0; my $rimages = 0; my %doneobjs; for my $p (1..$pages) { my $c = $doc->getPageContent($p); my @parts = split /(\/[\w]+\s*Do)\b/xms, $c; foreach my $part (@parts) { if ($part =~ m/\A(\/[\w]+)\s*Do\z/xms) { my $ref = $1; my $xobj = $doc->dereference($ref, $p); my $objnum = $xobj->{objnum}; my $im = $doc->getValue($xobj); my $w = $im->{Width} || $im->{W} || 0; if ($w) { $w = $doc->getValue($w); } my $h = $im->{Height} || $im->{H} || 0; if ($h) { $h = $doc->getValue($h); } next if (exists $doneobjs{$objnum}); $nimages++; _inform("Image $nimages page $p, $ref = object $objnum, (w,h)=($w,$h)", $opts{verbose}); if (exists $opts{skip}->{$objnum}) { _inform("Skipping object $objnum", $opts{verbose}); next; } my $isjpg = _isjpg($im); if (!$isjpg) { _inform('Not a jpeg', $opts{verbose}); } else { my $oldsize = $doc->getValue($im->{Length}); if (!$oldsize) { die "PDF error: Failed to get size of image\n"; } my $tmpl = CAM::PDF->new($opts{template}) || die "$CAM::PDF::errstr\n"; # Get a handle on the needed data bits from the template my $media_array = $tmpl->getValue($tmpl->getPage(1)->{MediaBox}); my $rawpage = $tmpl->getPageContent(1); $media_array->[2]->{value} = $w; $media_array->[3]->{value} = $h; my $page = $rawpage; $page =~ s/xxx/$w/igxms; $page =~ s/yyy/$h/igxms; $tmpl->setPageContent(1, $page); $tmpl->replaceObject(9, $doc, $objnum, 1); my $ofile = "/tmp/crunchjpg.$$"; $tmpl->cleanoutput($ofile); if (!-d $outdir) { require File::Path; File::Path::mkpath($outdir); } `convert -quality 50 -density 72x72 -page ${w}x$h pdf:$ofile jpg:$outdir/$objnum.jpg`; ## no critic (Backtick) $doneobjs{$objnum} = 1; $rimages++; } } } } _inform("Extracted $rimages of $nimages images", $opts{verbose}); sub _isjpg { my $im = shift; return if (!$im->{Filter}); my $f = $im->{Filter}; my @names = $f->{type} eq 'array' ? @{$f->{value}} : $f; for my $e (@names) { my $name = $doc->getValue($e); if (ref $name) { $name = $name->{value}; } #warn "Checking $name\n"; if ($name eq 'DCTDecode') { return 1; } } return; } sub _inform { my $str = shift; my $verbose = shift; if ($verbose) { print STDERR $str, "\n"; } return; } __END__ =for stopwords extractjpgs.pl ImageMagick JPG =head1 NAME extractjpgs.pl - Save copies of all PDF JPG images to a directory =head1 SYNOPSIS extractjpgs.pl [options] infile.pdf outdirectory Options: -S --skip=imnum don't output the specified images (can be used mutliple times) -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version C is a comma-separated list of integers indicating the images in order that they appear in the PDF. Use F to retrieve the image numbers. =head1 DESCRIPTION Requires the ImageMagick B program to be available Searches the PDF for JPG images and saves them as individual files in the specified directory. The files are named CimnumE.jpg>. =head1 SEE ALSO CAM::PDF F F F F =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/fillpdffields.pl000555000765000765 535712203034032 16137 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( triggerclear => 0, background => '1', verbose => 0, order => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('t|triggerclear' => \$opts{triggerclear}, 'b|background=s' => \$opts{background}, 'v|verbose' => \$opts{verbose}, 'o|order' => \$opts{order}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 3) { pod2usage(1); } my $infile = shift; my $outfile = shift; if ($opts{background} =~ m/\s/xms) { # Separate r,g,b $opts{background} = [split m/\s+/xms, $opts{background}]; } my $doc = CAM::PDF->new($infile) || die "$CAM::PDF::errstr\n"; my @list = (@ARGV); $doc->fillFormFields({background_color => $opts{background}}, @list); if ($opts{triggerclear}) { # get even-numbered-index elemented (i.e. fieldnames) my @names = map {$_ % 2 ? $list[$_] : ()} 0 .. $#list; for my $name (@names) { my $objnode = $doc->getFormField($name); if ($objnode) { delete $objnode->{value}->{value}->{AA}; } } } if ($opts{order}) { $doc->preserveOrder(); } if (!$doc->canModify()) { die "This PDF forbids modification\n"; } $doc->cleanoutput($outfile); __END__ =for stopwords fillpdffields.pl =head1 NAME fillpdffields.pl - Replace PDF form fields with specified values =head1 SYNOPSIS fillpdffields.pl [options] infile.pdf outfile.pdf field value [field value ...] Options: -b --background=val specify a background color behind the filled text field Options are: 'none', gray or 'r g b'. Default: '1' -t --triggerclear remove all of the form triggers after replacing values -o --order preserve the internal PDF ordering for output -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version Examples of C<--background> values are: --background=none --background=1 # white --background=0.5 # gray --background=0 # black --background="1 0 0" # red =head1 DESCRIPTION Fill in the forms in the PDF with the specified values, identified by their field names. See F for a the names of the form fields. =head1 SEE ALSO CAM::PDF F =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/getpdffontobject.pl000555000765000765 332712203034032 16652 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Data::Dumper; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( verbose => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('v|verbose' => \$opts{verbose}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 3) { pod2usage(1); } my $file = shift; my $pagenum = shift; my $fontname = shift; if ($pagenum !~ m/\A\d+\z/xms || $pagenum < 1) { die "The page number must be an integer greater than 0\n"; } my $doc = CAM::PDF->new($file) || die "$CAM::PDF::errstr\n"; my $font = $doc->getFont($pagenum, $fontname); if (!$font) { die "Font $fontname not found\n"; } if ($opts{verbose}) { print Data::Dumper->Dump([$font], ['font']); } __END__ =for stopwords getpdffontobject.pl =head1 NAME getpdffontobject.pl - Print the PDF form field names =head1 SYNOPSIS getpdffontobject.pl [options] infile.pdf pagenum fontname Options: -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version =head1 DESCRIPTION Retrieves the font metadata from the PDF. If C<--verbose> is specified, the memory representation is dumped to STDOUT. Otherwise, the program silently returns success or emits a failure message to STDERR. The leading C on the C argument is optional. =head1 SEE ALSO CAM::PDF =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/getpdfpage.pl000555000765000765 263412203034032 15431 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( verbose => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('v|verbose' => \$opts{verbose}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 2) { pod2usage(1); } my $file = shift; my $pagenum = shift; my $doc = CAM::PDF->new($file) || die "$CAM::PDF::errstr\n"; foreach my $p (split /\D+/xms, $pagenum) { if ($p !~ m/\A\d+\z/xms || $p < 1) { die "The page number must be an integer greater than 0\n"; } print $doc->getPageContent($p); } __END__ =for stopwords getpdfpage.pl =head1 NAME getpdfpage.pl - Print the PDF page layout commands =head1 SYNOPSIS getpdfpage.pl [options] infile.pdf pagenum Options: -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version =head1 DESCRIPTION Retrieves the page content from the PDF and prints it to STDOUT. =head1 SEE ALSO CAM::PDF F F =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/getpdfpageobject.pl000555000765000765 410512203034032 16613 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Data::Dumper; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( decode => 0, content => 0, verbose => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('d|decode' => \$opts{decode}, 'c|content' => \$opts{content}, 'v|verbose' => \$opts{verbose}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 2) { pod2usage(1); } my $file = shift; my $pagenum = shift; if ($pagenum !~ m/\A\d+\z/xms || $pagenum < 1) { die "The page number must be an integer greater than 0\n"; } my $doc = CAM::PDF->new($file) || die "$CAM::PDF::errstr\n"; my $page = $doc->getPage($pagenum); if ($opts{content}) { if (!exists $page->{Contents}) { die "No page content found\n"; } $page = $doc->getValue($page->{Contents}); } if ($opts{decode}) { $doc->decodeAll(CAM::PDF::Node->new('dictionary', $page)); } if ($opts{verbose}) { print Data::Dumper->Dump([$page], ['page']); } __END__ =for stopwords getpdfpageobject.pl =head1 NAME getpdfpageobject.pl - Print the PDF page metadata =head1 SYNOPSIS getpdfpageobject.pl [options] infile.pdf pagenum Options: -d --decode uncompress any elements -c --content show the page Contents field only -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version =head1 DESCRIPTION Retrieves the page metadata from the PDF. If C<--verbose> is specified, the memory representation is dumped to STDOUT. Otherwise, the program silently returns success or emits a failure message to STDERR. =head1 SEE ALSO CAM::PDF F F =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/getpdftext.pl000555000765000765 444412203034032 15502 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( check => 0, geom => 0, verbose => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('g|geometry' => \$opts{geom}, 'c|check' => \$opts{check}, 'v|verbose' => \$opts{verbose}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 1) { pod2usage(1); } my $file = shift; my $pagelist = shift; my $doc = CAM::PDF->new($file) || die "$CAM::PDF::errstr\n"; foreach my $p ($doc->rangeToArray(1,$doc->numPages(),$pagelist)) { if ($opts{check}) { print "Checking page $p\n"; my $tree = $doc->getPageContentTree($p, $opts{verbose}); if (!$tree || !$tree->validate()) { print " Failed\n"; } if ($opts{geom}) { $tree->computeGS(); } } else { my $str = $doc->getPageText($p, $opts{verbose}); if (defined $str) { CAM::PDF->asciify(\$str); print $str; } } } __END__ =for stopwords getpdftext.pl =head1 NAME getpdftext.pl - Extracts and print the text from one or more PDF pages =head1 SYNOPSIS getpdftext.pl [options] infile.pdf [] Options: -c --check just validates the page instead of printing it -g --geometry just computes geometry, prints nothing -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version is a comma-separated list of page numbers. Ranges like '2-6' allowed in the list Example: 4-6,2,12,8-9 =head1 DESCRIPTION Extracts all of the text from the specified PDF page(s) and prints them to STDOUT. If no pages are specified, all pages are processed. The C<--check> and C<--geometry> modes are distinctly different. They are used primarily for debugging. =head1 SEE ALSO CAM::PDF F =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/listfonts.pl000555000765000765 1123412203034032 15364 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( sort => 0, verbose => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('s|sort' => \$opts{sort}, 'v|verbose' => \$opts{verbose}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 1) { pod2usage(1); } my $infile = shift; my $doc = CAM::PDF->new($infile) || die "$CAM::PDF::errstr\n"; my %fonts; for my $p (1 .. $doc->numPages()) { if (!$opts{sort}) { print "Page $p:\n"; } # Retrieve an examine all page properties to find the fonts foreach my $fontname (sort $doc->getFontNames($p)) { my $font = $doc->getFont($p, $fontname); # Collect a list of all fields, so we can list the unhandled ones at the end my %fields = map {$_ => 1} keys %{$font}; delete $fields{Type}; # delete the fields as we handle them # Font name, if present my $name = $fontname; if ($font->{Name}) { delete $fields{Name}; my $othername = $doc->getValue($font->{Name}); if ($othername ne $name) { $name .= "(aka $othername)"; } } my $desc = " Name: $name\n"; # Font subtype (required) delete $fields{Subtype}; $desc .= ' Type: '.$doc->getValue($font->{Subtype})."\n"; # Base font if ($font->{BaseFont}) { delete $fields{BaseFont}; $desc .= ' BaseFont: '.$doc->getValue($font->{BaseFont})."\n"; } # Font encoding delete $fields{Encoding}; if ($font->{Encoding}) { # complex or simple encoding? if ($font->{Encoding}->{type} eq 'reference') # Complex { # Handle encoding here. If it's not an encoding, no big deal $desc .= " Encoding:\n"; my $ref = $doc->getValue($font->{Encoding}); my %efields = map {$_ => 1} keys %{$ref}; delete $efields{Type}; if ($ref->{BaseEncoding}) { delete $efields{BaseEncoding}; $desc .= ' BaseEncoding: '.$doc->getValue($ref->{BaseEncoding})."\n"; } if ($ref->{Differences}) { delete $efields{Differences}; my @diffs = @{$doc->getValue($ref->{Differences})}; my @chars = grep {$_->{type} eq 'label'} @diffs; $desc .= ' Differences: ' . @chars . "\n"; } my @others = sort keys %efields; if (@others > 0) { my $other = join ', ', @others; $desc .= " Other fields: $other\n"; } } else # Simple encoding { $desc .= ' Encoding: '.$doc->getValue($font->{Encoding})."\n"; } } # Font widths delete $fields{Widths}; $desc .= ' Widths: '. ($font->{Widths} ? 'yes' : 'no') . "\n"; if ($font->{Widths}) { delete $fields{FirstChar}; delete $fields{LastChar}; $desc .= ' Characters: '.$doc->getValue($font->{FirstChar}) . q{-} . $doc->getValue($font->{LastChar}) . "\n"; } # Embedding info delete $fields{FontDescriptor}; $desc .= ' Embedded: '. ($font->{FontDescriptor} ? 'yes' : 'no') . "\n"; # Remaining fields my @others = sort keys %fields; if (@others > 0) { my $other = join ', ', @others; $desc .= " Other fields: $other\n"; } # Output, or defer until the end of all PDF pages if ($opts{sort}) { $fonts{$fontname} = $desc; } else { print $desc; } } } # No-op unless $opts{sort} is set foreach my $fontname (sort keys %fonts) { $fonts{$fontname} =~ s/ ^[ ][ ] //gxms; print $fonts{$fontname}; } __END__ =for stopwords listfonts.pl =head1 NAME listfonts.pl - Print details of the fonts used in the PDF =head1 SYNOPSIS listfonts.pl [options] infile.pdf Options: -s --sort sort the fonts by name, not by page -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version =head1 DESCRIPTION Outputs to STDOUT all of the fonts in the PDF document. =head1 SEE ALSO CAM::PDF =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/listimages.pl000555000765000765 720112203034032 15457 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( verbose => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('v|verbose' => \$opts{verbose}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 1) { pod2usage(1); } my $file = shift; my $doc = CAM::PDF->new($file) || die "$CAM::PDF::errstr\n"; my $pages = $doc->numPages(); my $nimages = 0; for my $p (1..$pages) { my $c = $doc->getPageContent($p); my @parts = split /(\/[\w]+\s*Do)\b/xms, $c; foreach my $part (@parts) { if ($part =~ /\A(\/[\w]+)\s*Do\z/xms) { $nimages++; my $ref = $1; my $xobj = $doc->dereference($ref, $p); my $objnum = $xobj->{objnum}; my $im = $doc->getValue($xobj); my $l = $im->{Length} || $im->{L} || 0; if ($l) { $l = $doc->getValue($l); } my $w = $im->{Width} || $im->{W} || 0; if ($w) { $w = $doc->getValue($w); } my $h = $im->{Height} || $im->{H} || 0; if ($h) { $h = $doc->getValue($h); } print "Image $nimages page $p, (w,h)=($w,$h), ref $ref = object $objnum, length $l\n"; } else { # Ths code may break if there is are legitimate strings "BI", # "ID" and "EI" in order in the page (which happened in the # PDF reference doc, of course! BI: while ($part =~ s/.*?\bBI\b\s*//xms) { my ($im) = $part =~ s/\A(.*?)\s*\bEI\b\s*//xms; next BI if (!$im); $im =~ s/\A.*\bBI\b//xms; # this may get rid of a fake BI if there is one in the page # Easy tests: next BI if ($im =~ m/ \A [)] /xms); next BI if ($im =~ m/ [(] \z /xms); next BI if ($im !~ m/ \bID\b /xms); # make sure that there is an open paren before every close # if not, then the "BI" was part of a string my $test = $im; $test =~ s/ \\[()] //gxms; # get rid of escaped parens for the test while ($test =~ s/ \A(.*?) [)] //xms) { my $bit = $1; next BI if ($bit !~ m/ [(] /xms); } $nimages++; my $w = 0; my $h = 0; if ($im =~ m/ \/W(|idth)\s*(\d+) /xms) { $w = $2; } if ($im =~ m/ \/H(|eight)\s*(\d+) /xms) { $h = $2; } print "Image $nimages page $p, (w,h)=($w,$h), inline\n"; } } } } __END__ =for stopwords listimages.pl =head1 NAME listimages.pl - Save copies of all PDF JPG images to a directory =head1 SYNOPSIS listimages.pl [options] infile.pdf Options: -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version =head1 DESCRIPTION Searches the PDF for images and lists them on STDOUT in one of the following formats: Image page

, (w,h)=(,), ref

, (w,h)=(,), inline =head1 SEE ALSO CAM::PDF F F F F =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/listpdffields.pl000555000765000765 270112203034032 16152 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( sort => 0, verbose => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('s|sort' => \$opts{sort}, 'v|verbose' => \$opts{verbose}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 1) { pod2usage(1); } my $infile = shift; my $doc = CAM::PDF->new($infile) || die "$CAM::PDF::errstr\n"; my @list = $doc->getFormFieldList(); if ($opts{sort}) { @list = sort @list; } foreach my $name (@list) { print $name, "\n"; } __END__ =for stopwords listpdffields.pl =head1 NAME listpdffields.pl - Print the PDF form field names =head1 SYNOPSIS listpdffields.pl [options] infile.pdf Options: -s --sort sort the output list alphabetically -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version =head1 DESCRIPTION Outputs to STDOUT all of the field names for any forms in the PDF document. =head1 SEE ALSO CAM::PDF F =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/pdfinfo.pl000555000765000765 673012203034032 14751 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; use English qw(-no_match_vars); our $VERSION = '1.60'; my %opts = ( verbose => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('v|verbose' => \$opts{verbose}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 1) { pod2usage(1); } while (@ARGV > 0) { my $file = shift; # prompt for password my $doc = CAM::PDF->new($file, q{}, q{}, 1) || die "$CAM::PDF::errstr\n"; if ($file eq q{-}) { $file = 'STDIN'; } my $size = length $doc->{content}; my $pages = $doc->numPages(); my @prefs = $doc->getPrefs(); my $pdfversion = $doc->{pdfversion}; my $pdfinfo = $doc->{trailer}->{Info}; $pdfinfo &&= $doc->getValue($pdfinfo); my @pagesize = (0,0); my $p = $doc->{Pages}; my $box = $p->{MediaBox}; if ($box) { $box = $box->{value}; @pagesize = ($box->[2]->{value} - $box->[0]->{value}, $box->[3]->{value} - $box->[1]->{value}); } print "File: $file\n"; print "File Size: $size bytes\n"; print "Pages: $pages\n"; if ($pdfinfo) { my $date = qr/(\d{4})(\d{2})(\d{2})/xms; my $time = qr/(\d{2})(\d{2})(\d{2})/xms; my $tz = qr/([+-Z])(\d{2})\'(\d{2})\'/xms; foreach my $key (sort keys %{$pdfinfo}) { my $val = $pdfinfo->{$key}->{value}; if ($pdfinfo->{$key}->{type} eq 'string' && $val && $val =~ m{ \A D: $date $time $tz \z }xms) { my ($Y,$M,$D,$h,$m,$s,$sign,$tzh,$tzm) = ($1,$2,$3,$4,$5,$6,$7,$8,$9); if ($sign eq 'Z') { $sign = q{+}; } require Time::Local; my $timegm = Time::Local::timegm($s,$m,$h,$D,$M-1,$Y-1900); my $tzshift = $sign . ($tzh*3600 + $tzm*60); $timegm += $tzshift; $val = localtime $timegm; } printf "%-13s %s\n", $key.q{:}, $val; } } print 'Page Size: '.($pagesize[0] ? "$pagesize[0] x $pagesize[1] pts" : 'variable')."\n"; print 'Optimized: '.($doc->isLinearized()?'yes':'no')."\n"; print "PDF version: $pdfversion\n"; print "Security\n"; if ($prefs[0] || $prefs[1]) { print " Passwd: '$prefs[0]', '$prefs[1]'\n"; } else { print " Passwd: none\n"; } print ' Print: '.($prefs[2]?'yes':'no')."\n"; print ' Modify: '.($prefs[3]?'yes':'no')."\n"; print ' Copy: '.($prefs[4]?'yes':'no')."\n"; print ' Add: '.($prefs[5]?'yes':'no')."\n"; if (@ARGV > 0) { print "---------------------------------\n"; } } __END__ =for stopwords pdfinfo.pl =head1 NAME pdfinfo.pl - Print information about PDF file(s) =head1 SYNOPSIS pdfinfo.pl [options] file.pdf [file.pdf ...] Options: -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version =head1 DESCRIPTION Prints to STDOUT various basic details about the specified PDF file(s). =head1 SEE ALSO CAM::PDF =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/readpdf.pl000555000765000765 352512203034032 14730 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( verbose => 0, decode => 0, askforpass => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('v|verbose' => \$opts{verbose}, 'd|decode' => \$opts{decode}, 'p|pass' => \$opts{askforpass}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 1) { pod2usage(1); } my $file = shift || q{-}; my $doc = CAM::PDF->new($file, q{}, q{}, { prompt_for_password => $opts{askforpass} }) || die "$CAM::PDF::errstr\n"; if ($opts{decode}) { foreach my $objnode (keys %{$doc->{xref}}) { $doc->decodeObject($objnode); } } if ($opts{verbose}) { $doc->cacheObjects(); # to force parsing of whole file print $doc->toString(); } __END__ =for stopwords readpdf.pl =head1 NAME readpdf.pl - Read a PDF document =head1 SYNOPSIS readpdf.pl [options] file.pdf Options: -d --decode uncompress internal PDF components -p --pass prompt for a user password if needed -v --verbose print the internal representation of the PDF -h --help verbose help message -V --version print CAM::PDF version =head1 DESCRIPTION Read a PDF document into memory and, optionally, output it's internal representation. This is primarily useful for debugging, but it can also be a way to validate a PDF document. =head1 SEE ALSO CAM::PDF F =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/renderpdf.pl000555000765000765 623012203034032 15270 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; use English qw(-no_match_vars); our $VERSION = '1.60'; my %opts = ( density => undef, xdensity => undef, ydensity => undef, check => 0, renderer => 'CAM::PDF::Renderer::Dump', verbose => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('r|renderer=s' => \$opts{renderer}, 'd|density=f' => \$opts{density}, 'x|xdensity=f' => \$opts{xdensity}, 'y|ydensity=f' => \$opts{ydensity}, 'c|check' => \$opts{check}, 'v|verbose' => \$opts{verbose}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (defined $opts{density}) { $opts{xdensity} = $opts{ydensity} = $opts{density}; } if (defined $opts{xdensity} || defined $opts{ydensity}) { if (!eval "require $opts{renderer}") ## no critic (StringyEval) { die $EVAL_ERROR; } if (defined $opts{xdensity}) { no strict 'refs'; ## no critic(ProhibitNoStrict) my $varname = $opts{renderer}.'::xdensity'; ${$varname} = $opts{xdensity}; } if (defined $opts{ydensity}) { no strict 'refs'; ## no critic(ProhibitNoStrict) my $varname = $opts{renderer}.'::ydensity'; ${$varname} = $opts{ydensity}; } } if (@ARGV < 1) { pod2usage(1); } my $file = shift; my $pagelist = shift; my $doc = CAM::PDF->new($file) || die "$CAM::PDF::errstr\n"; foreach my $p ($doc->rangeToArray(1, $doc->numPages(), $pagelist)) { my $tree = $doc->getPageContentTree($p, $opts{verbose}); if ($opts{check}) { print "Checking page $p\n"; if (!$tree->validate()) { print " Failed\n"; } } $tree->render($opts{renderer}); } __END__ =for stopwords renderpdf.pl renderers =head1 NAME renderpdf.pl - Applies a renderer to one or more PDF pages =head1 SYNOPSIS renderpdf.pl [options] infile.pdf [] Options: -r --renderer=class uses this renderer class (default: CAM::PDF::Renderer::Dump) -c --check validates the page before rendering it -d --density=float sets the X and Y density for the renderer -x --xdensity=float sets the X density for the renderer -y --ydensity=float sets the Y density for the renderer -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version is a comma-separated list of page numbers. Ranges like '2-6' allowed in the list Example: 4-6,2,12,8-9 =head1 DESCRIPTION Loads and runs the chosen renderer on the specified pages of the PDF. If no pages are specified, all are processed. The density flags are used for graphical renderers (namely CAM::PDF::Renderer::Text and the like). =head1 SEE ALSO CAM::PDF F =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/replacepdfobj.pl000555000765000765 443412203034032 16123 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( follow => 0, verbose => 0, order => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('f|follow' => \$opts{follow}, 'v|verbose' => \$opts{verbose}, 'o|order' => \$opts{order}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 4) { pod2usage(1); } my @files; my @nums; my @docs; push @files, shift; push @nums, shift; push @files, shift; push @nums, shift; my $outfile = shift || q{-}; foreach my $file (@files) { my $doc = CAM::PDF->new($file) || die "$CAM::PDF::errstr\n"; push @docs, $doc; } if (!$opts{follow}) { warn "Warning: if the object from doc2 has references, they may be broken by this process!\n" . "Use -f to follow and copy all references\n"; } if ($nums[0] eq 'a') { my $key = $docs[0]->appendObject($docs[1], $nums[1], $opts{follow}); warn "Appended as object $key\n"; } else { $docs[0]->replaceObject($nums[0], $docs[1], $nums[1], $opts{follow}); } if ($opts{order}) { $docs[0]->preserveOrder(); } if (!$docs[0]->canModify()) { die "This PDF forbids modification\n"; } $docs[0]->cleanoutput($outfile); __END__ =for stopwords replacepdfobj.pl =head1 NAME replacepdfobj.pl - Copy a metadata object from one PDF to another =head1 SYNOPSIS replacepdfobj.pl [options] mainfile.pdf objnum objfile.pdf objnum [outfile.pdf]\n"; Options: -f --follow copy referenced objects too -o --order preserve the internal PDF ordering for output -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version =head1 DESCRIPTION Copy an object (and perhaps it's referenced children) from one PDF to another. This is a rather low-level utility that will not be of interest to most users. =head1 SEE ALSO CAM::PDF =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/revertpdf.pl000555000765000765 577512203034032 15335 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use Getopt::Long; use Pod::Usage; use English qw(-no_match_vars); our $VERSION = '1.60'; my %opts = ( count => 0, verbose => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('c|count' => \$opts{count}, 'v|verbose' => \$opts{verbose}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { require CAM::PDF; print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 1) { pod2usage(1); } my $infile = shift; my $outfile = shift || q{-}; my $content; if ($infile eq q{-}) { $content = do { local $RS = undef; ; }; ## no critic(InputOutput::ProhibitExplicitStdin) } else { open my $in_fh, '<', $infile or die "Failed to open file $infile: $ERRNO\n"; $content = do { local $RS = undef; <$in_fh>; }; close $in_fh or die "Failed to read $infile: $ERRNO\n"; } my @matches = ($content =~ m/ [\015\012]%%EOF *[\015\012] /gxms); my $revs = @matches; if ($opts{count}) { print "$revs\n"; } elsif ($revs < 1) { die "Error: this does not seem to be a PDF document\n"; } elsif ($revs == 1) { die "Error: there is only one revision in this PDF document. It cannot be reverted.\n"; } else { # Figure out line end character my ($lineend) = $content =~ m/ (.)%%EOF.*?\z /xms; if (!$lineend) { die "Cannot find the end-of-file marker\n"; } my $eof = $lineend.'%%EOF'; my $i = rindex $content, $eof; my $j = rindex $content, $eof, $i-1; $content = (substr $content, 0, $j) . $eof . $lineend; if ($outfile eq q{-}) { print STDOUT $content; } else { open my $fh, '>', $outfile or die "Cannot write to $outfile: $ERRNO\n"; print {$fh} $content; close $fh or die "Failed to write $outfile: $ERRNO\n"; } } __END__ =for stopwords revertpdf.pl unoptimized =head1 NAME revertpdf.pl - Remove the last edits to a PDF document =head1 SYNOPSIS revertpdf.pl [options] infile.pdf [outfile.pdf] Options: -c --count just print the number of revisions and exits -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version =head1 DESCRIPTION PDF documents have the interesting feature that edits can be applied just to the end of the file without altering the original content. This makes it possible to recover previous versions of a document. This is only possible if the editor writes out an 'unoptimized' version of the PDF. This program removes the last layer of edits from the PDF document. If there is just one revision, we emit a message and abort. The C<--count> option just prints the number of generations the document has endured and applies no changes. =head1 SEE ALSO CAM::PDF =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/rewritepdf.pl000555000765000765 1302312203034032 15510 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( decode => 0, cleanse => 0, clearannots => 0, filters => [], newprefs => 0, prefs => [], newpass => 0, pass => [], decrypt => 0, newversion => 0, verbose => 0, order => 0, help => 0, version => 0, # temporary variables looking => q{}, state => 0, otherargs => [], ); Getopt::Long::Configure('bundling'); GetOptions('1|2|3|4|5|6|7|8|9' => sub {$opts{newversion} = '1'.$_[0]}, 'c|cleanse' => \$opts{cleanse}, 'd|decode' => \$opts{decode}, 'f|filter=s' => \@{$opts{filters}}, 'C|clearannots' => \$opts{clearannots}, 'X|decrypt' => \$opts{decrypt}, 'p|pass' => sub { @{$opts{pass}}=(); $opts{looking}='pass'; $opts{state}=2; $opts{newpass}=1; }, 'P|prefs' => sub { @{$opts{prefs}}=(); $opts{looking}='prefs'; $opts{state}=4; $opts{newprefs}=1; }, 'v|verbose' => \$opts{verbose}, 'o|order' => \$opts{order}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, '<>' => sub { if ($opts{looking}) { push @{$opts{$opts{looking}}}, $_[0]; if (--$opts{state} == 0) { $opts{looking} = q{}; } } else { push @{$opts{otherargs}}, $_[0]; } }, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } local @ARGV = @{$opts{otherargs}}; if (@ARGV < 1) { pod2usage(1); } my $infile = shift; my $outfile = shift || q{-}; my $opass = shift; my $upass = shift || $opass; my $doc = CAM::PDF->new($infile, $opass, $upass) || die "$CAM::PDF::errstr\n"; if (!$doc->canModify()) { die "This PDF forbids modification\n"; } if ($opts{newversion}) { $doc->{pdfversion} = $opts{newversion}; } if ($opts{decode} || @{$opts{filters}} > 0) { foreach my $objnode (keys %{$doc->{xref}}) { if ($opts{decode}) { $doc->decodeObject($objnode); } foreach my $filtername (@{$opts{filters}}) { $doc->encodeObject($objnode, $filtername); } } } if ($opts{newprefs} || $opts{newpass}) { my @p = $doc->getPrefs(); if ($opts{newpass}) { $p[0] = $opts{pass}->[0]; $p[1] = $opts{pass}->[1]; } if ($opts{newprefs}) { $p[2] = $opts{prefs}->[0]; $p[3] = $opts{prefs}->[1]; $p[4] = $opts{prefs}->[2]; $p[5] = $opts{prefs}->[3]; } $doc->setPrefs(@p); } if ($opts{decrypt}) { $doc->cacheObjects(); $doc->{crypt}->{noop} = 1; if ($doc->{crypt}->{EncryptBlock}) { $doc->deleteObject($doc->{crypt}->{EncryptBlock}); delete $doc->{trailer}->{Encrypt}; delete $doc->{crypt}->{EncryptBlock}; } } if ($opts{clearannots}) { $doc->clearAnnotations(); } if ($opts{cleanse}) { $doc->cleanse(); } if ($opts{order}) { $doc->preserveOrder(); } $doc->cleanoutput($outfile); __END__ =for stopwords rewritepdf.pl unprotecting passworded =head1 NAME rewritepdf.pl - Rebuild a PDF file =head1 SYNOPSIS rewritepdf.pl [options] infile.pdf [outfile.pdf] [password(s)]\n"; Options: -c --cleanse seek and destroy unreferenced metadata in the document -C --clearannots remove all annotations (including forms) -d --decode uncompress any encoded elements -f --filter=name compress all elements with this filter (can use more than once) -X --decrypt remove encryption from the document -o --order preserve the internal PDF ordering for output -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version -p --pass opass upass set a new owner and user password -P --prefs print modify copy add set boolean permissions for the document The optional password arguments are needed to open password-protected PDF files. Here's an example of password-protecting and then unprotecting it in sequence: rewritepdf.pl --pass SecretPass SecretPass orig.pdf passworded.pdf rewritepdf.pl --decrypt passworded.pdf unprotected.pdf SecretPass If you want to prevent people from being able to perform the latter step, then tighten your permissions: rewritepdf.pl -p Secret Secret -P 1 0 0 0 orig.pdf passworded.pdf which means that users can print the passworded PDF, but not change it, copy-and-paste from it, or append to it. =head1 DESCRIPTION Read and write a PDF document, and possibly modify it along the way. The C<--cleanse> option could possibly break some PDFs which use undocumented or poorly documented PDF features. Namely, some PDFs implicitly store their C objects just before their Font objects, without explicitly referring to the former. Cleansing removes the former, causing Acrobat Reader to choke. We recommend that you avoid the C<--decode> and C<--filter> options, as we're not sure they work right any longer. =head1 SEE ALSO CAM::PDF =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/setpdfbackground.pl000444000765000765 633012203034032 16642 0ustar00chrischris000000000000#!/usr/bin/perl use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( order => 0, verbose => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('v|verbose' => \$opts{verbose}, 'o|order' => \$opts{order}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 3) { pod2usage(1); } my $infile = shift || q{-}; my $pagenum = shift || 1; my $bgcolor = shift || 'ffffff'; my $outfile = shift || q{-}; my ($red, $blue, $green); if ($bgcolor =~ m/ \A [\da-fA-F]{3} \z /xms) { # For example, "f60" becomes "ff6600" my $rd = substr $bgcolor, 0, 1; my $gr = substr $bgcolor, 1, 1; my $bl = substr $bgcolor, 2, 1; $bgcolor = "$rd$rd$gr$gr$bl$bl"; } if ($bgcolor =~ m/ \A [\da-fA-F]{6} \z /xms) { $red = hex substr $bgcolor, 0, 2; $green = hex substr $bgcolor, 2, 2; $blue = hex substr $bgcolor, 4, 2; $red /= 256.0; $green /= 256.0; $blue /= 256.0; } else { die 'Invalid color specified. Should be "rrggbb" or "rgb"'; } my $doc = CAM::PDF->new($infile) || die "$CAM::PDF::errstr\n"; my ($x,$y,$w,$h) = $doc->getPageDimensions($pagenum); my $bg = 'q ' . # Start a new graphics state "$red $blue $green rg " . # Set the fill color "$x $y $w $h re " . # Mark a rectangle the size of the page 'f ' . # Fill the rectangle 'Q '; # End the graphics state # Prepend the background fill $doc->setPageContent($pagenum, $bg . $doc->getPageContent($pagenum)); if ($opts{order}) { $doc->preserveOrder(); } if (!$doc->canModify()) { die "This PDF forbids modification\n"; } $doc->cleanoutput($outfile); __END__ =for stopwords setpdfbackground.pl Cowgill RGB =head1 NAME setpdfbackground.pl - Apply a background color to a PDF page =head1 SYNOPSIS setpdfbackground.pl [options] file.pdf pagenum color [outfile] Options: -o --order preserve the internal PDF ordering for output -v --verbose print the internal representation of the PDF -h --help verbose help message -V --version print CAM::PDF version The C is specified as 3 or 6 character hexadecimal RGB. For example, C and C both mean pure red while C<999> and C<999999> both mean medium gray. =head1 DESCRIPTION This program alters a PDF document to add a solid background color behind the page contents. =head1 CAVEATS Some PDF creation programs assume a white background and draw bogus white rectangles all over the screen that you usually cannot see. If your PDF has such rectangles, you I sometimes fix it, but it is a pain. The best recommendation is to recreate the original PDF using a smarter library, if possible. Alternatively, you can contact Clotho Advanced Media for a commercial solution to this problem. =head1 CREDIT This feature was originally requested by Brent Cowgill. =head1 SEE ALSO CAM::PDF F =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/setpdfpage.pl000555000765000765 400212203034032 15434 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; use English qw(-no_match_vars); our $VERSION = '1.60'; my %opts = ( verbose => 0, order => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('v|verbose' => \$opts{verbose}, 'o|order' => \$opts{order}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 3) { pod2usage(1); } my $infile = shift; my $pagetext = shift; my $pagenum = shift; my $outfile = shift || q{-}; my $doc = CAM::PDF->new($infile) || die "$CAM::PDF::errstr\n"; my $content; if ($pagetext eq q{-}) { $content = do { local $RS = undef; ; }; ## no critic(InputOutput::ProhibitExplicitStdin) } else { open my $in_fh, '<', $pagetext or die "Failed to open $pagetext: $ERRNO\n"; $content = do { local $RS = undef; <$in_fh>; }; close $in_fh or die "Failed to read $pagetext: $ERRNO\n"; } $doc->setPageContent($pagenum, $content); if ($opts{order}) { $doc->preserveOrder(); } if (!$doc->canModify()) { die "This PDF forbids modification\n"; } $doc->cleanoutput($outfile); __END__ =for stopwords setpdfpage.pl =head1 NAME setpdfpage.pl - Replace a page of PDF layout =head1 SYNOPSIS setpdfpage.pl [options] infile.pdf page.txt pagenum [outfile.pdf] Options: -o --order preserve the internal PDF ordering for output -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version =head1 DESCRIPTION Assign the specified ASCII file to be the page content for the PDF page indicated. The existing page layout is discarded. =head1 SEE ALSO CAM::PDF F =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/stamppdf.pl000555000765000765 336512203034032 15143 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( verbose => 0, order => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('v|verbose' => \$opts{verbose}, 'o|order' => \$opts{order}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 2) { pod2usage(1); } my $infile = shift; my $stampfile = shift; my $outfile = shift || q{-}; my $doc = CAM::PDF->new($infile) || die "$CAM::PDF::errstr\n"; my $stampdoc = CAM::PDF->new($stampfile) || die "$CAM::PDF::errstr\n"; my $stamp = "q\n" . $stampdoc->getPageContent(1) . "Q\n"; foreach my $p (1 .. $doc->numPages()) { $doc->appendPageContent($p, $stamp); } if (!$doc->canModify()) { die "This PDF forbids modification\n"; } $doc->cleanoutput($outfile); __END__ =for stopwords stamppdf.pl =head1 NAME stamppdf.pl - Apply a mark to each page of a PDF =head1 SYNOPSIS stamppdf.pl [options] infile.pdf stamp.pdf [outfile.pdf] Options: -o --order preserve the internal PDF ordering for output -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version =head1 DESCRIPTION Add the contents of C page 1 to each page of C. If the two PDFs have different page sizes, this likely won't work very well. =head1 SEE ALSO CAM::PDF =head1 AUTHOR See L =cut CAM-PDF-1.60/bin/uninlinepdfimages.pl000555000765000765 317312203034032 17023 0ustar00chrischris000000000000#!/usr/bin/perl -w package main; use warnings; use strict; use CAM::PDF; use Getopt::Long; use Pod::Usage; our $VERSION = '1.60'; my %opts = ( verbose => 0, help => 0, version => 0, ); Getopt::Long::Configure('bundling'); GetOptions('v|verbose' => \$opts{verbose}, 'h|help' => \$opts{help}, 'V|version' => \$opts{version}, ) or pod2usage(1); if ($opts{help}) { pod2usage(-exitstatus => 0, -verbose => 2); } if ($opts{version}) { print "CAM::PDF v$CAM::PDF::VERSION\n"; exit 0; } if (@ARGV < 1) { pod2usage(1); } my $infile = shift; my $outfile = shift || q{-}; my $doc = CAM::PDF->new($infile) || die "$CAM::PDF::errstr\n"; $doc->uninlineImages(); if ($opts{verbose}) { print $doc->toString(); } if (!$doc->canModify()) { die "This PDF forbids modification\n"; } $doc->cleanoutput($outfile); __END__ =for stopwords uninlinepdfimages.pl =head1 NAME uninlinepdfimages.pl - Save copies of all PDF JPG images to a directory =head1 SYNOPSIS uninlinepdfimages.pl [options] infile.pdf [outfile.pdf] Options: -v --verbose print diagnostic messages -h --help verbose help message -V --version print CAM::PDF version =head1 DESCRIPTION Searches the PDF for images and lists them on STDOUT in one of the following formats: Image page

, (w,h)=(,), ref

, (w,h)=(,), inline =head1 SEE ALSO CAM::PDF F F F F =head1 AUTHOR See L =cut CAM-PDF-1.60/lib000755000765000765 012203034032 12617 5ustar00chrischris000000000000CAM-PDF-1.60/lib/CAM000755000765000765 012203034032 13217 5ustar00chrischris000000000000CAM-PDF-1.60/lib/CAM/PDF.pm000444000765000765 51177612203034032 14404 0ustar00chrischris000000000000package CAM::PDF; use 5.006; use warnings; use strict; use Carp qw(croak cluck); use English qw(-no_match_vars); use CAM::PDF::Node; use CAM::PDF::Decrypt; our $VERSION = '1.60'; ## no critic(Bangs::ProhibitCommentedOutCode) ## no critic(ControlStructures::ProhibitDeepNests) =for stopwords eval'ed CR-NL PDFLib defiltered prefill indices inline de-embedding 4th linearized viewable decrypted =head1 NAME CAM::PDF - PDF manipulation library =head1 LICENSE Copyright 2002-2006 Clotho Advanced Media, Inc., L Copyright 2007-2008 Chris Dolan This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SYNOPSIS use CAM::PDF; my $pdf = CAM::PDF->new('test1.pdf'); my $page1 = $pdf->getPageContent(1); [ ... mess with page ... ] $pdf->setPageContent(1, $page1); [ ... create some new content ... ] $pdf->appendPageContent(1, $newcontent); my $anotherpdf = CAM::PDF->new('test2.pdf'); $pdf->appendPDF($anotherpdf); my @prefs = $pdf->getPrefs(); $prefs[$CAM::PDF::PREF_OPASS] = 'mypassword'; $prefs[$CAM::PDF::PREF_UPASS] = 'mypassword'; $pdf->setPrefs(@prefs); $pdf->cleanoutput('out1.pdf'); print $pdf->toPDF(); Many example programs are included in this distribution to do useful tasks. See the C subdirectory. =head1 DESCRIPTION This package reads and writes any document that conforms to the PDF specification generously provided by Adobe at L (link last checked Oct 2005). The file format through PDF 1.5 is well-supported, with the exception of the "linearized" or "optimized" output format, which this module can read but not write. Many specific aspects of the document model are not manipulable with this package (like fonts), but if the input document is correctly written, then this module will preserve the model integrity. The PDF writing feature saves as PDF 1.4-compatible. That means that we cannot write compressed object streams. The consequence is that reading and then writing a PDF 1.5+ document may enlarge the resulting file by a fair margin. This library grants you some power over the PDF security model. Note that applications editing PDF documents via this library MUST respect the security preferences of the document. Any violation of this respect is contrary to Adobe's intellectual property position, as stated in the reference manual at the above URL. Technical detail regarding corrupt PDFs: This library adheres strictly to the PDF specification. Adobe's Acrobat Reader is more lenient, allowing some corrupted PDFs to be viewable. Therefore, it is possible that some PDFs may be readable by Acrobat that are illegible to this library. In particular, files which have had line endings converted to or from DOS/Windows style (i.e. CR-NL) may be rendered unusable even though Acrobat does not complain. Future library versions may relax the parser, but not yet. =cut our $PREF_OPASS = 0; our $PREF_UPASS = 1; our $PREF_PRINT = 2; our $PREF_MODIFY = 3; our $PREF_COPY = 4; our $PREF_ADD = 5; our $MAX_STRING = 65; # length of output string my %filterabbrevs = ( AHx => 'ASCIIHexDecode', A85 => 'ASCII85Decode', CCF => 'CCITTFaxDecode', DCT => 'DCTDecode', Fl => 'FlateDecode', LZW => 'LZWDecode', RL => 'RunLengthDecode', ); my %inlineabbrevs = ( %filterabbrevs, BPC => 'BitsPerComponent', CS => 'ColorSpace', D => 'Decode', DP => 'DecodeParms', F => 'Filter', H => 'Height', IM => 'ImageMask', I => 'Interpolate', W => 'Width', CMYK => 'DeviceCMYK', G => 'DeviceGray', RGB => 'DeviceRGB', I => 'Indexed', ); =head1 API =head2 Functions intended to be used externally $self = CAM::PDF->new(content | filename | '-') $self->toPDF() $self->needsSave() $self->save() $self->cleansave() $self->output(filename | '-') $self->cleanoutput(filename | '-') $self->previousRevision() $self->allRevisions() $self->preserveOrder() $self->appendObject(olddoc, oldnum, [follow=(1|0)]) $self->replaceObject(newnum, olddoc, oldnum, [follow=(1|0)]) (olddoc can be undef in the above for adding new objects) $self->numPages() $self->getPageText(pagenum) $self->getPageDimensions(pagenum) $self->getPageContent(pagenum) $self->setPageContent(pagenum, content) $self->appendPageContent(pagenum, content) $self->deletePage(pagenum) $self->deletePages(pagenum, pagenum, ...) $self->extractPages(pagenum, pagenum, ...) $self->appendPDF(CAM::PDF object) $self->prependPDF(CAM::PDF object) $self->wrapString(string, width, fontsize, page, fontlabel) $self->getFontNames(pagenum) $self->addFont(page, fontname, fontlabel, [fontmetrics]) $self->deEmbedFont(page, fontname, [newfontname]) $self->deEmbedFontByBaseName(page, basename, [newfont]) $self->getPrefs() $self->setPrefs() $self->canPrint() $self->canModify() $self->canCopy() $self->canAdd() $self->getFormFieldList() $self->fillFormFields(fieldname, value, [fieldname, value, ...]) or $self->fillFormFields(%values) $self->clearFormFieldTriggers(fieldname, fieldname, ...) Note: 'clean' as in cleansave() and cleanobject() means write a fresh PDF document. The alternative (e.g. save()) reuses the existing doc and just appends to it. Also note that 'clean' functions sort the objects numerically. If you prefer that the new PDF docs more closely resemble the old ones, call preserveOrder() before cleansave() or cleanobject(). =head2 Slightly less external, but useful, functions $self->toString() $self->getPage(pagenum) $self->getFont(pagenum, fontname) $self->getFonts(pagenum) $self->getStringWidth(fontdict, string) $self->getFormField(fieldname) $self->getFormFieldDict(object) $self->isLinearized() $self->decodeObject(objectnum) $self->decodeAll(any-node) $self->decodeOne(dict-node) $self->encodeObject(objectnum, filter) $self->encodeOne(any-node, filter) $self->changeString(obj-node, hashref) =head2 Deeper utilities $self->pageAddName(pagenum, name, objectnum) $self->getPageObjnum(pagenum) $self->getPropertyNames(pagenum) $self->getProperty(pagenum, propname) $self->getValue(any-node) $self->dereference(objectnum) or $self->dereference(name,pagenum) $self->deleteObject(objectnum) $self->copyObject(obj-node) $self->cacheObjects() $self->setObjNum(obj-node, num) $self->getRefList(obj-node) $self->changeRefKeys(obj-node, hashref) =head2 More rarely needed utilities $self->getObjValue(objectnum) =head2 Routines that should not be called $self->_startdoc() $self->delinearlize() $self->build*() $self->parse*() $self->write*() $self->*CB() $self->traverse() $self->fixDecode() $self->abbrevInlineImage() $self->unabbrevInlineImage() $self->cleanse() $self->clean() $self->createID() =head1 FUNCTIONS =head2 Object creation/manipulation =over =item $doc->new($package, $content) =item $doc->new($package, $content, $ownerpass, $userpass) =item $doc->new($package, $content, $ownerpass, $userpass, $prompt) =item $doc->new($package, $content, $ownerpass, $userpass, $options) Instantiate a new CAM::PDF object. C<$content> can be a document in a string, a filename, or '-'. The latter indicates that the document should be read from standard input. If the document is password protected, the passwords should be passed as additional arguments. If they are not known, a boolean C<$prompt> argument allows the programmer to suggest that the constructor prompt the user for a password. This is rudimentary prompting: passwords are in the clear on the console. This constructor takes an optional final argument which is a hash reference. This hash can contain any of the following optional parameters: =over =item prompt_for_password => $boolean This is the same as the C<$prompt> argument described above. =item fault_tolerant => $boolean This flag causes the instance to be more lenient when reading the input PDF. Currently, this only affects PDFs which cannot be successfully decrypted. =back =cut sub new ## no critic(Subroutines::ProhibitExcessComplexity, Unpack) { my $pkg = shift; my $content = shift; # or a filename # Optional args: my $opassword = shift; my $upassword = shift; my $options; # Backward compatible support for prompt flag as final argument if (ref $_[0]) { $options = shift; if ((ref $options) ne 'HASH') { croak 'Options must be a hash reference'; } } else { $options = { prompt_for_password => shift, }; } my $pdfversion = '1.2'; if ($content =~ m/ \A%PDF-([\d.]+) /xms) { my $ver = $1; if ($ver && $ver > $pdfversion) { $pdfversion = $ver; } } else { if (1024 > length $content) { my $file = $content; if ($file eq q{-}) { $content = q{}; my $offset = 0; my $step = 4096; binmode STDIN; ##no critic (Syscalls) while ($step == read STDIN, $content, $step, $offset) { $offset += $step; } } else { if (open my $fh, '<', $file) { binmode $fh; ##no critic (Syscalls) my $size = -s $file; if ($size != read $fh, $content, $size) { $CAM::PDF::errstr = "Failed to read $file bytes\n"; return; } if (!close $fh) { $CAM::PDF::errstr = "Failed to close reading $file\n"; return; } } else { $CAM::PDF::errstr = "Failed to open $file: $ERRNO\n"; return; } } } if ($content =~ m/ \A%PDF-([\d.]+) /xms) { my $ver = $1; if ($ver && $ver > $pdfversion) { $pdfversion = $ver; } } else { $CAM::PDF::errstr = "Content does not begin with \"%PDF-\"\n"; return; } } #warn "got pdfversion $pdfversion\n"; my $self = { options => $options, pdfversion => $pdfversion, maxstr => $CAM::PDF::MAX_STRING, # length of output string content => $content, contentlength => length $content, xref => {}, maxobj => 0, changes => {}, versions => {}, # Caches: objcache => {}, pagecache => {}, formcache => {}, Names => {}, NameObjects => {}, fontmetrics => {}, }; bless $self, $pkg; if (!$self->_startdoc()) { return; } if ($self->{trailer}->{ID}) { my $id = $self->getValue($self->{trailer}->{ID}); if (ref $id) { my $accum = q{}; for my $objnode (@{$id}) { $accum .= $self->getValue($objnode); } $id = $accum; } $self->{ID} = $id; } $self->{crypt} = CAM::PDF::Decrypt->new($self, $opassword, $upassword, $self->{options}->{prompt_for_password}); if (!$self->{crypt} && !$self->{options}->{fault_tolerant}) { return; } return $self; } =item $doc->toPDF() Serializes the data structure as a PDF document stream and returns as in a scalar. =cut sub toPDF { my $self = shift; if ($self->needsSave()) { $self->cleansave(); } return $self->{content}; } =item $doc->toString() Returns a serialized representation of the data structure. Implemented via Data::Dumper. =cut sub toString ## no critic (Unpack) { my $self = shift; my @skip = @_ == 0 ? qw(content) : @_; my %hold; for my $key (@skip) { $hold{$key} = delete $self->{$key}; } require Data::Dumper; my $result = Data::Dumper->Dump([$self], [qw(doc)]); for my $key (keys %hold) { $self->{$key} = $hold{$key}; } return $result; } ################################################################################ =back =head2 Document reading (all of these functions are intended for internal only) =over =cut # PRIVATE METHOD # read the document index and some metadata. sub _startdoc { my $self = shift; ### Parse the document metadata # Start by parsing out the location of the last xref block # Implementation note: The PDF spec says "The last line of the file # contains only the end-of-file marker, %%EOF." but it also says # "Acrobat viewers require only that the %%EOF marker appear # somewhere within the last 1024 bytes of the file." # So, we follow the latter more lenient rule. my $doc_length = length $self->{content}; my $startxref; if ($doc_length > 1024) { # The initial ".*" is for the unlikely case that there are two "startxref" statements in the last 1024 bytes ($startxref) = (substr $self->{content}, $doc_length - 1024, 1024) =~ m/ .* startxref\s*(\d+)\s*%%EOF.*?\z /xms; } else { ($startxref) = $self->{content} =~ m/ .* startxref\s*(\d+)\s*%%EOF.*?\z /xms; } if (!$startxref) { $CAM::PDF::errstr = "Cannot find the index in the PDF content\n"; return; } # Parse the hierarchy of xref blocks $self->{startxref} = $startxref; my @objstreamrefs; $self->{trailer} = $self->_buildxref($self->{startxref}, $self->{xref}, $self->{versions}, \@objstreamrefs); if (!defined $self->{trailer}) { return; } $self->_buildendxref(); for my $objstreamref (@objstreamrefs) { if (!$self->_index_objstream($objstreamref)) { return; } } ### Cache some page content descriptors # Get the document root catalog if (!exists $self->{trailer}->{Root}) { $CAM::PDF::errstr = "No root node present in PDF trailer.\n"; return; } my $root = $self->getRootDict(); if (!$root || (ref $root) ne 'HASH') { $CAM::PDF::errstr = "The PDF root node is not a dictionary.\n"; return; } # Get the root of the page tree if (!exists $root->{Pages}) { $CAM::PDF::errstr = "The PDF root node doesn't have a reference to the page tree.\n"; return; } my $pages = $self->getPagesDict(); if (!$pages || (ref $pages) ne 'HASH') { $CAM::PDF::errstr = "The PDF page tree root is not a dictionary.\n"; return; } # Get the number of pages in the document $self->{PageCount} = $self->getValue($pages->{Count}); if (!$self->{PageCount} || $self->{PageCount} < 1) { $CAM::PDF::errstr = "Bad number of pages in PDF document\n"; return; } return 1; } # PRIVATE FUNCTION # read document index sub _buildxref { my $self = shift; my $startxref = shift; my $index = shift; my $versions = shift; my $objstreamrefs = shift; my $trailer; if ('xref' eq substr $self->{content}, $startxref, 4) { $trailer = $self->_buildxref_pdf14($startxref, $index, $versions); if ($trailer && exists $trailer->{XRefStm}) { if (!$self->_buildxref_pdf15($trailer->{XRefStm}->{value}, $index, $versions, $objstreamrefs)) { return; } } } else { $trailer = $self->_buildxref_pdf15($startxref, $index, $versions, $objstreamrefs); } if ($trailer && exists $trailer->{Prev}) { if (!$self->_buildxref($trailer->{Prev}->{value}, $index, $versions, $objstreamrefs)) { return; } } return $trailer; } # Just for debugging sub __dump_binary_stream { my $stream = shift; my @b = unpack 'C*', $stream; print ' 0 1 2 3 4 5 6 7 8 9 a b c d e f'; for my $i (0 .. $#b) { if (0 == $i % 15) { printf "\n%04x: ", $i; } elsif (0 == $i % 3) { print q{ }; } printf '%02x', $b[$i]; } print "\n"; return; } sub _buildxref_pdf15 { my $self = shift; my $startxref = shift; my $index = shift; my $versions = shift; my $objstreamrefs = shift; my ($trailer, $stream) = $self->_buildxref_pdf15_getstream($startxref); if (!$trailer) { return; } #__dump_binary_stream($stream); my @byte_pattern = map {$_->{value}} @{$trailer->{W}->{value}}; my $entry_size = $byte_pattern[0] + $byte_pattern[1] + $byte_pattern[2]; #print STDOUT "pack: [@byte_pattern] => total size $entry_size\n"; my @objstreamrefs; { my @pairs = (0, $trailer->{Size}->{value}); if (exists $trailer->{Index}) { @pairs = map {$_->{value}} @{$trailer->{Index}->{value}}; } #print STDOUT "Pairs: (Index,Size)=@pairs; size of stream=",length($stream)," ?= $entry_size x ",(length($stream)/$entry_size),"\n"; my $i = 0; while (@pairs) { my $start = shift @pairs; my $len = shift @pairs; my $end = $start + $len; for my $objnum ($start .. $end - 1) { my @byte = unpack 'C*', substr $stream, $i++ * $entry_size, $entry_size; my %values = (type => 1, major => 0, minor => 0); my @w = @byte_pattern; my $pos = 0; my $w = 0; for my $key (qw(type major minor)) { $w += shift @w; if ($w > $pos) { my $val = 0; for (; $pos < $w; ++$pos) { ## no critic (ProhibitCStyleForLoops) $val = ($val << 8) + $byte[$pos]; } $values{$key} = $val; } } next if (exists $index->{$objnum}); # keep only latest revision #my %strs = ( # 0 => {str=>'free', major=>'objnext', minor=>'gennum'}, # 1 => {str=>'raw', major=>'byte', minor=>'gennum'}, # 2 => {str=>'zip', major=>'stream', minor=>'index'}, #); #my $type_def = $strs{$values{type}}; #my $type_str = $type_def ? $type_def->{str} : 'unk'; #my $major_str = $type_def ? $type_def->{major} : 'unk'; #my $minor_str = $type_def ? $type_def->{minor} : 'unk'; #print STDOUT "xref $objnum = $values{type}=$type_str $major_str=$values{major}(", # sprintf('%04x',$values{major}),") $minor_str=$values{minor}(", # sprintf('%02x',$values{minor}),")\n"; # Ignore type 0 if ($values{type} == 1) { $index->{$objnum} = $values{major}; $versions->{$objnum} = $values{minor}; } elsif ($values{type} == 2) { push @{$objstreamrefs}, {objnum => $objnum, streamnum => $values{major}, indx => $values{minor}}; $index->{$objnum} = {}; # will be overwritten later $versions->{$objnum} = 0; } } if ($end - 1 > $self->{maxobj}) { $self->{maxobj} = $end - 1; } } } return $trailer; } sub _buildxref_pdf15_getstream { my $self = shift; my $startxref = shift; # Don't slurp in the whole file my $chunk_size = 1024; my @content = (substr $self->{content}, $startxref, $chunk_size); # warning: this doesn't account for the case where "endobj" crosses a 1024-byte boundary # instead, we hit the end of file and find it after concatenation -- a hack but it works while ($content[-1] && $content[-1] !~ m/endobj/xms) { my $offset = $startxref + $chunk_size * @content; if ($offset >= length $self->{content}) { # end of file last; } push @content, substr $self->{content}, $offset, $chunk_size; } my $content = join q{}, @content; my $xrefstream = $self->parseObj(\$content); if (!$xrefstream) { $CAM::PDF::errstr = 'Failed to locate the xref stream'; return; } my $trailer = $xrefstream->{value}->{value}; # dict hash if (!$trailer) { $CAM::PDF::errstr = 'Invalid xref stream: no trailer'; return; } if ('HASH' ne ref $trailer) { $CAM::PDF::errstr = 'Invalid xref stream: trailer is not a dictionary'; return; } #print STDOUT "Trailer: @{[sort keys %{$trailer}]}, $trailer->{Type}->{value}\n"; if (!exists $trailer->{Type} || 'XRef' ne $trailer->{Type}->{value}) { $CAM::PDF::errstr = 'Invalid xref stream: type is not XRef'; return; } my $stream = $self->decodeOne($xrefstream->{value}); if (!$stream) { $CAM::PDF::errstr = 'Invalid xref stream: could not decode the stream'; return; } return ($trailer, $stream); } sub _index_objstream { my $self = shift; my $objstreamref = shift; my $objstream = $self->dereference($objstreamref->{streamnum}); if (!$objstream) { $CAM::PDF::errstr = 'Failed to read object stream ' . $objstreamref->{streamnum}; return; } if ($objstream->{_indexed}++) { return 1; } my $stream = $self->decodeOne($objstream->{value}); if (!$stream) { $CAM::PDF::errstr = 'Invalid xref stream: could not decode objstream ' . $objstreamref->{streamnum}; return; } my $dict = $objstream->{value}->{value}; my $n = $dict->{N}->{value}; my $first = $dict->{First}->{value}; my $lookup = substr $stream, 0, $first; my @objs; my $streamholder = {stream => $stream}; for my $i (0 .. $n-1) { if ($lookup =~ m/\G\s*(\d+)\s+(\d+)/cgxms) { my ($objnum, $offset) = ($1, $2); my $pos = {objstream => $streamholder, start => $first + $offset}; push @objs, $pos; if (exists $self->{xref}->{$objnum}) { # keep only latest revision next if !ref $self->{xref}->{$objnum}; next if $self->{xref}->{$objnum}->{objstream}; } #print "objnum $objnum at pos $offset of objstream $objstreamref->{streamnum}\n"; $self->{xref}->{$objnum} = $pos; $self->{versions}->{$objnum} = 0; } else { $CAM::PDF::errstr = 'Failed to read the objstream index for ' . $objstreamref->{streamnum}; return; } } for my $i (0 .. $#objs-1) { $objs[$i]->{end} = $objs[$i+1]->{start}; } $objs[-1]->{end} = length $stream; return 1; } sub _buildxref_pdf14 { my $self = shift; my $startxref = shift; my $index = shift; my $versions = shift; my $trailerpos = index $self->{content}, 'trailer', $startxref; # Workaround for Perl 5.6.1 bug if ($trailerpos > 0 && $trailerpos < $startxref) { my $xrefstr = substr $self->{content}, $startxref; $trailerpos = $startxref + index $xrefstr, 'trailer'; } my $end = substr $self->{content}, $startxref, $trailerpos-$startxref; if ($end !~ s/ \A xref\s+ //xms) { my $len = length $end; $CAM::PDF::errstr = "Could not find PDF cross-ref table at location $startxref/$trailerpos/$len\n" . $self->trimstr($end); return; } my $part = 0; while ($end =~ s/ \A (\d+)\s+(\d+)\s+ //xms) { my $s = $1; my $n = $2; $part++; for my $i (0 .. $n-1) { my $objnum = $s+$i; next if (exists $index->{$objnum}); my $row = substr $end, $i*20, 20; my ($indexnum, $version, $type) = $row =~ m/ \A (\d{10}) [ ] (\d{5}) [ ] (\w) /xms; if (!$indexnum) { $CAM::PDF::errstr = "Could not decipher xref row:\n" . $self->trimstr($row); return; } if ($type eq 'n') { if ($indexnum != 0) # if the index says it's at byte zero, pretend it's an 'f' instead of an 'n' { $index->{$objnum} = $indexnum; $versions->{$objnum} = $version; } } if ($objnum > $self->{maxobj}) { $self->{maxobj} = $objnum; } } $end = substr $end, 20*$n; } my $sxrefpos = index $self->{content}, 'startxref', $trailerpos; if ($sxrefpos > 0 && $sxrefpos < $trailerpos) # workaround for 5.6.1 bug { my $tail = substr $self->{content}, $trailerpos; $sxrefpos = $trailerpos + index $tail, 'startxref'; } $end = substr $self->{content}, $trailerpos, $sxrefpos-$trailerpos; if ($end !~ s/ \A trailer\s* //xms) { $CAM::PDF::errstr = "Did not find expected trailer block after xref\n" . $self->trimstr($end); return; } my $trailer = $self->parseDict(\$end)->{value}; return $trailer; } # PRIVATE FUNCTION # _buildendxref -- compute the end of each object # note that this is not always the *actual* end of the object, but # we guarantee that the object will end at or before this point. sub _buildendxref { my $self = shift; my $x = $self->{xref}; # shorthand # make a list of objnums sorted by file position. Ignore objects inside objstreams. my @keys = sort {$x->{$a} <=> $x->{$b}} grep {!ref $x->{$_}} keys %{$x}; my $r = {}; for my $i (0 .. $#keys-1) { # set the end of each object to be the beginning of the next object $r->{$keys[$i]} = $x->{$keys[$i+1]}; } # The end of the last object is the end of the file $r->{$keys[-1]} = $self->{contentlength}; $self->{endxref} = $r; return; } # PRIVATE FUNTION # _buildNameTable -- descend into the page tree and extract all XObject # and Font name references. sub _buildNameTable { my $self = shift; my $pagenum = shift; if (!$pagenum || $pagenum eq 'All') # Build the ENTIRE name table { $self->cacheObjects(); for my $p (1 .. $self->{PageCount}) { $self->_buildNameTable($p); } my %n; for my $objnode (values %{$self->{objcache}}) { if ($objnode->{value}->{type} eq 'dictionary') { my $dict = $objnode->{value}->{value}; if ($dict->{Name}) { $n{$dict->{Name}->{value}} = CAM::PDF::Node->new('reference', $objnode->{objnum}); } } } $self->{Names}->{All} = {%n}; return; } return if (exists $self->{Names}->{$pagenum}); my %n; my $page = $self->getPage($pagenum); while ($page) { my $objnum = $self->getPageObjnum($pagenum); if (exists $page->{Resources}) { my $r = $self->getValue($page->{Resources}); for my $key ('XObject', 'Font') { if (exists $r->{$key}) { my $x = $self->getValue($r->{$key}); if ((ref $x) eq 'HASH') { %n = (%{$x}, %n); } } } } # Inherit from parent $page = $page->{Parent}; if ($page) { $page = $self->getValue($page); } } $self->{Names}->{$pagenum} = {%n}; return; } =item $doc->getRootDict() Returns the Root dictionary for the PDF. =cut sub getRootDict { my $self = shift; return $self->getValue($self->{trailer}->{Root}); } =item $doc->getPagesDict() Returns the root Pages dictionary for the PDF. =cut sub getPagesDict { my $self = shift; return $self->getValue($self->getRootDict()->{Pages}); } =item $doc->parseObj($string) Use parseAny() instead of this, if possible. Given a fragment of PDF page content, parse it and return an object Node. This can be called as a class method in most circumstances, but is intended as an instance method. =cut sub parseObj { my $self = shift; my $c = shift; if (${$c} !~ m/ \G\s*(\d+)\s+(\d+)\s+obj\s* /cgxms) ##no critic(ProhibitUnusedCapture) { die "Expected object open tag\n" . $self->trimstr(${$c}); } # need to implement like this with explicit capture vars for 5.6.1 # compatibility my ($objnum, $gennum) = ($1, $2); ##no critic(ProhibitCaptureWithoutTest) $objnum = int $objnum; $gennum = int $gennum; my $objnode; if (${$c} =~ m/ \G(.*?)endobj\s* /cgxms) { my $string = $1; $objnode = $self->parseAny(\$string, $objnum, $gennum); if ($string =~ m/ \Gstream /xms) { if ($objnode->{type} ne 'dictionary') { die "Found an object stream without a preceding dictionary\n" . $self->trimstr(${$c}); } $objnode->{value}->{StreamData} = $self->parseStream(\$string, $objnum, $gennum, $objnode->{value}); } } else { die "Expected endobj\n" . $self->trimstr(${$c}); } return CAM::PDF::Node->new('object', $objnode, $objnum, $gennum); } =item $doc->parseInlineImage($string) =item $doc->parseInlineImage($string, $objnum) =item $doc->parseInlineImage($string, $objnum, $gennum) Given a fragment of PDF page content, parse it and return an object Node. This can be called as a class method in some cases, but is intended as an instance method. =cut sub parseInlineImage { my $self = shift; my $c = shift; my $objnum = shift; my $gennum = shift; if (${$c} !~ m/ \GBI\b /xms) { die "Expected inline image open tag\n" . $self->trimstr(${$c}); } my $dict = $self->parseDict($c, $objnum, $gennum, 'BI\\b\\s*', 'ID\\b'); $self->unabbrevInlineImage($dict); $dict->{value}->{Type} = CAM::PDF::Node->new('label', 'XObject', $objnum, $gennum); $dict->{value}->{Subtype} = CAM::PDF::Node->new('label', 'Image', $objnum, $gennum); $dict->{value}->{StreamData} = $self->parseStream($c, $objnum, $gennum, $dict->{value}, qr/ \s* /xms, qr/ \s*EI(?!\S) /xms); ${$c} =~ m/ \G\s+ /cgxms; return CAM::PDF::Node->new('object', $dict, $objnum, $gennum); } =item $doc->writeInlineImage($objectnode) This is the inverse of parseInlineImage(), intended for use only in the CAM::PDF::Content class. =cut sub writeInlineImage { my $self = shift; my $objnode = shift; # Make a copy since we are going to trash the image my $dictobj = $self->copyObject($objnode)->{value}; my $dict = $dictobj->{value}; delete $dict->{Type}; delete $dict->{Subtype}; my $stream = $dict->{StreamData}->{value}; delete $dict->{StreamData}; $self->abbrevInlineImage($dictobj); my $str = $self->writeAny($dictobj); $str =~ s/ \A << /BI /xms; $str =~ s/ >> \z / ID/xms; $str .= "\n" . $stream . "\nEI"; return $str; } =item $doc->parseStream($string, $objnum, $gennum, $dictnode) This should only be used by parseObj(), or other specialized cases. Given a fragment of PDF page content, parse it and return a stream Node. This can be called as a class method in most circumstances, but is intended as an instance method. The dictionary Node argument is typically the body of the object Node that precedes this stream. =cut sub parseStream { my $self = shift; my $c = shift; my $objnum = shift; my $gennum = shift; my $dict = shift; my $begin = shift || qr/ stream[ \t]*\r?\n /xms; my $end = shift || qr/ \s*endstream\s* /xms; if (${$c} !~ m/ \G$begin /cgxms) { die "Expected stream open tag\n" . $self->trimstr(${$c}); } my $stream; my $l = $dict->{Length} || $dict->{L}; if (!defined $l) { if ($begin =~ m/ \Gstream /xms) { die "Missing stream length\n" . $self->trimstr(${$c}); } if (${$c} =~ m/ \G$begin(.*?)$end /cgxms) { $stream = $1; my $len = length $stream; $dict->{Length} = CAM::PDF::Node->new('number', $len, $objnum, $gennum); } else { die "Missing stream begin/end\n" . $self->trimstr(${$c}); } } else { my $length = $self->getValue($l); my $pos = pos ${$c}; $stream = substr ${$c}, $pos, $length; pos(${$c}) += $length; ## no critic(CodeLayout::ProhibitParensWithBuiltins) if (${$c} !~ m/ \G$end /cgxms) { die "Expected endstream\n" . $self->trimstr(${$c}); } } if (ref $self) { # in the rare case of CAM::PDF::Content::_parseInlineImage, this # may be called as a class method, thus making the above test # necessary if ($self->{crypt}) { $stream = $self->{crypt}->decrypt($self, $stream, $objnum, $gennum); } } return CAM::PDF::Node->new('stream', $stream, $objnum, $gennum); } =item $doc->parseDict($string) =item $doc->parseDict($string, $objnum) =item $doc->parseDict($string, $objnum, $gennum) Use parseAny() instead of this, if possible. Given a fragment of PDF page content, parse it and return an dictionary Node. This can be called as a class method in most circumstances, but is intended as an instance method. =cut sub parseDict { my $pkg_or_doc = shift; my $c = shift; my $objnum = shift; my $gennum = shift; my $begin = shift || '<<\\s*'; my $end = shift || '>>\\s*'; my $dict = {}; if (${$c} =~ m/ \G$begin /cgxms) { while (${$c} !~ m/ \G$end /cgxms) { #warn "looking for label:\n" . $pkg_or_doc->trimstr(${$c}); my $keyref = $pkg_or_doc->parseLabel($c, $objnum, $gennum); my $key = $keyref->{value}; #warn "looking for value:\n" . $pkg_or_doc->trimstr(${$c}); my $value = $pkg_or_doc->parseAny($c, $objnum, $gennum); $dict->{$key} = $value; } } return CAM::PDF::Node->new('dictionary', $dict, $objnum, $gennum); } =item $doc->parseArray($string) =item $doc->parseArray($string, $objnum) =item $doc->parseArray($string, $objnum, $gennum) Use parseAny() instead of this, if possible. Given a fragment of PDF page content, parse it and return an array Node. This can be called as a class or instance method. =cut sub parseArray { my $pkg_or_doc = shift; my $c = shift; my $objnum = shift; my $gennum = shift; my $array = []; if (${$c} =~ m/ \G\[\s* /cgxms) { while (${$c} !~ m/ \G\]\s* /cgxms) { #warn "looking for array value:\n" . $pkg_or_doc->trimstr(${$c}); push @{$array}, $pkg_or_doc->parseAny($c, $objnum, $gennum); } } return CAM::PDF::Node->new('array', $array, $objnum, $gennum); } =item $doc->parseLabel($string) =item $doc->parseLabel($string, $objnum) =item $doc->parseLabel($string, $objnum, $gennum) Use parseAny() instead of this, if possible. Given a fragment of PDF page content, parse it and return a label Node. This can be called as a class or instance method. =cut sub parseLabel { my $pkg_or_doc = shift; my $c = shift; my $objnum = shift; my $gennum = shift; my $label; if (${$c} =~ m{ \G/([^\s<>/\[\]()]+)\s* }cgxms) { $label = $1; } else { die "Expected identifier label:\n" . $pkg_or_doc->trimstr(${$c}); } return CAM::PDF::Node->new('label', $label, $objnum, $gennum); } =item $doc->parseRef($string) =item $doc->parseRef($string, $objnum) =item $doc->parseRef($string, $objnum, $gennum) Use parseAny() instead of this, if possible. Given a fragment of PDF page content, parse it and return a reference Node. This can be called as a class or instance method. =cut sub parseRef { my $pkg_or_doc = shift; my $c = shift; my $objnum = shift; my $gennum = shift; my $newobjnum; if (${$c} =~ m/ \G(\d+)\s+\d+\s+R\s* /cgxms) { $newobjnum = int $1; } else { die "Expected object reference\n" . $pkg_or_doc->trimstr(${$c}); } return CAM::PDF::Node->new('reference', $newobjnum, $objnum, $gennum); } =item $doc->parseNum($string) =item $doc->parseNum($string, $objnum) =item $doc->parseNum($string, $objnum, $gennum) Use parseAny() instead of this, if possible. Given a fragment of PDF page content, parse it and return a number Node. This can be called as a class or instance method. =cut sub parseNum { my $pkg_or_doc = shift; my $c = shift; my $objnum = shift; my $gennum = shift; my $value; if (${$c} =~ m/ \G([\d.+-]+)\s* /cgxms) { $value = $1; } else { die "Expected numerical constant\n" . $pkg_or_doc->trimstr(${$c}); } return CAM::PDF::Node->new('number', $value, $objnum, $gennum); } =item $doc->parseString($string) =item $doc->parseString($string, $objnum) =item $doc->parseString($string, $objnum, $gennum) Use parseAny() instead of this, if possible. Given a fragment of PDF page content, parse it and return a string Node. This can be called as a class or instance method. =cut sub parseString { my $pkg_or_doc = shift; my $c = shift; my $objnum = shift; my $gennum = shift; my $value = q{}; if (${$c} =~ m/ \G [(] /cgxms) { # TODO: use Text::Balanced or Regexp::Common from CPAN?? my $depth = 1; while ($depth > 0) { if (${$c} =~ m/ \G ([^()]*) ([()]) /cgxms) { my $string = $1; my $delim = $2; $value .= $string; # Make sure this is not an escaped paren, OR an real paren # preceded by an escaped backslash! if ($string =~ m/ (\\+) \z/xms && 1 == (length $1) % 2) { $value .= $delim; } elsif ($delim eq '(') { $value .= $delim; $depth++; } elsif(--$depth > 0) { $value .= $delim; } } else { die "Expected string closing\n" . $pkg_or_doc->trimstr(${$c}); } } ${$c} =~ m/ \G\s* /cgxms; } else { die "Expected string opener\n" . $pkg_or_doc->trimstr(${$c}); } # Unescape slash-escaped characters. Treat \\ specially. my @parts = split /\\\\|\\134/xms, $value, -1; for (@parts) { # concatenate continued lines s/ \\\r?\n //gxms; s/ \\\r //gxms; # special characters s/ \\n /\n/gxms; s/ \\r /\r/gxms; s/ \\t /\t/gxms; s/ \\f /\f/gxms; s/ \\b /\x{8}/gxms; # octal numbers s/ \\(\d{1,3}) /chr oct $1/gexms; # Ignore all other slashes (i.e. following characters are treated literally) s/ \\ //gxms; } $value = join q{\\}, @parts; if (ref $pkg_or_doc) { my $self = $pkg_or_doc; if ($self->{crypt}) { $value = $self->{crypt}->decrypt($self, $value, $objnum, $gennum); } } return CAM::PDF::Node->new('string', $value, $objnum, $gennum); } =item $doc->parseHexString($string) =item $doc->parseHexString($string, $objnum) =item $doc->parseHexString($string, $objnum, $gennum) Use parseAny() instead of this, if possible. Given a fragment of PDF page content, parse it and return a hex string Node. This can be called as a class or instance method. =cut sub parseHexString { my $pkg_or_doc = shift; my $c = shift; my $objnum = shift; my $gennum = shift; my $str = q{}; if (${$c} =~ m/ \G<([\da-fA-F\s]*)>\s* /cgxms) { $str = $1; $str =~ s/\s+//gxms; my $len = length $str; if ($len % 2 == 1) { $str .= '0'; } $str = pack 'H*', $str; } else { die "Expected hex string\n" . $pkg_or_doc->trimstr(${$c}); } if (ref $pkg_or_doc) { my $self = $pkg_or_doc; if ($self->{crypt}) { $str = $self->{crypt}->decrypt($self, $str, $objnum, $gennum); } } return CAM::PDF::Node->new('hexstring', $str, $objnum, $gennum); } =item $doc->parseBoolean($string) =item $doc->parseBoolean($string, $objnum) =item $doc->parseBoolean($string, $objnum, $gennum) Use parseAny() instead of this, if possible. Given a fragment of PDF page content, parse it and return a boolean Node. This can be called as a class or instance method. =cut sub parseBoolean { my $pkg_or_doc = shift; my $c = shift; my $objnum = shift; my $gennum = shift; my $val = q{}; if (${$c} =~ m/ \G(true|false)\s* /cgxmsi) { $val = lc $1; } else { die "Expected boolean true or false keyword\n" . $pkg_or_doc->trimstr(${$c}); } return CAM::PDF::Node->new('boolean', $val, $objnum, $gennum); } =item $doc->parseNull($string) =item $doc->parseNull($string, $objnum) =item $doc->parseNull($string, $objnum, $gennum) Use parseAny() instead of this, if possible. Given a fragment of PDF page content, parse it and return a null Node. This can be called as a class or instance method. =cut sub parseNull { my $pkg_or_doc = shift; my $c = shift; my $objnum = shift; my $gennum = shift; my $val = q{}; if (${$c} =~ m/ \Gnull\s* /cgxmsi) { $val = undef; } else { die "Expected null keyword\n" . $pkg_or_doc->trimstr(${$c}); } return CAM::PDF::Node->new('null', $val, $objnum, $gennum); } =item $doc->parseAny($string) =item $doc->parseAny($string, $objnum) =item $doc->parseAny($string, $objnum, $gennum) Given a fragment of PDF page content, parse it and return a Node of the appropriate type. This can be called as a class or instance method. =cut sub parseAny { my $p = shift; # pkg or doc my $c = shift; my $objnum = shift; my $gennum = shift; return ${$c} =~ m/ \G \d+\s+\d+\s+R\b /xms ? $p->parseRef( $c, $objnum, $gennum) : ${$c} =~ m{ \G / }xms ? $p->parseLabel( $c, $objnum, $gennum) : ${$c} =~ m/ \G << /xms ? $p->parseDict( $c, $objnum, $gennum) : ${$c} =~ m/ \G \[ /xms ? $p->parseArray( $c, $objnum, $gennum) : ${$c} =~ m/ \G [(] /xms ? $p->parseString( $c, $objnum, $gennum) : ${$c} =~ m/ \G < /xms ? $p->parseHexString($c, $objnum, $gennum) : ${$c} =~ m/ \G [\d.+-]+ /xms ? $p->parseNum( $c, $objnum, $gennum) : ${$c} =~ m/ \G (true|false) /ixms ? $p->parseBoolean( $c, $objnum, $gennum) : ${$c} =~ m/ \G null /ixms ? $p->parseNull( $c, $objnum, $gennum) : die "Unrecognized type in parseAny:\n" . $p->trimstr(${$c}); } ################################################################################ =back =head2 Data Accessors =over =item $doc->getValue($object) I Dereference a data object, return a value. Given an node object of any kind, returns raw scalar object: hashref, arrayref, string, number. This function follows all references, and descends into all objects. =cut sub getValue { my $self = shift; my $objnode = shift; return if (! ref $objnode); while ($objnode->{type} eq 'reference' || $objnode->{type} eq 'object') { if ($objnode->{type} eq 'reference') { my $objnum = $objnode->{value}; $objnode = $self->dereference($objnum); } elsif ($objnode->{type} eq 'object') { $objnode = $objnode->{value}; } return if (! ref $objnode); } return $objnode->{value}; } =item $doc->getObjValue($objectnum) I Dereference a data object, and return a value. Behaves just like the getValue() function, but used when all you know is the object number. =cut sub getObjValue { my $self = shift; my $objnum = shift; return $self->getValue(CAM::PDF::Node->new('reference', $objnum)); } =item $doc->dereference($objectnum) =item $doc->dereference($name, $pagenum) I Dereference a data object, return a PDF object as a node. This function makes heavy use of the internal object cache. Most (if not all) object requests should go through this function. C<$name> should look something like '/R12'. =cut sub dereference { my $self = shift; my $key = shift; my $pagenum = shift; # only used if $key is a named resource if ($key =~ s/ \A\/ //xms) # strip off the leading slash while testing { # This is a request for a named object $self->_buildNameTable($pagenum); $key = $self->{Names}->{$pagenum}->{$key}; return if (!defined $key); # $key should now point to a 'reference' object if ((ref $key) ne 'CAM::PDF::Node') { die "Assertion failed: key is a reference object in dereference\n"; } $key = $key->{value}; } $key = int $key; if (!exists $self->{objcache}->{$key}) { #print "Filling cache for obj \#$key...\n"; my $pos = $self->{xref}->{$key}; if (!$pos) { warn "Bad request for object $key at position 0 in the file\n"; return; } my $content_fragment; if (ref $pos) { $content_fragment = substr $pos->{objstream}->{stream}, $pos->{start}, $pos->{end}; $content_fragment = "$key 0 obj\n$content_fragment\nendobj\n"; } else { # This is fastest and safest if (!exists $self->{endxref}) { $self->_buildendxref(); } my $endpos = $self->{endxref}->{$key}; if (!defined $endpos || $endpos < $pos) { # really slow, but a totally safe fallback $endpos = $self->{contentlength}; } $content_fragment = substr $self->{content}, $pos, $endpos - $pos; } $self->{objcache}->{$key} = $self->parseObj(\$content_fragment, $key); } return $self->{objcache}->{$key}; } =item $doc->getPropertyNames($pagenum) =item $doc->getProperty($pagenum, $propertyname) Each PDF page contains a list of resources that it uses (images, fonts, etc). getPropertyNames() returns an array of the names of those resources. getProperty() returns a node representing a named property (most likely a reference node). =cut sub getPropertyNames { my $self = shift; my $pagenum = shift; $self->_buildNameTable($pagenum); my $props = $self->{Names}->{$pagenum}; return if (!defined $props); return keys %{$props}; } sub getProperty { my $self = shift; my $pagenum = shift; my $name = shift; $self->_buildNameTable($pagenum); my $props = $self->{Names}->{$pagenum}; return if (!defined $props); return if (!defined $name); return $props->{$name}; } =item $doc->getFont($pagenum, $fontname) I Returns a dictionary for a given font identified by its label, referenced by page. =cut sub getFont { my $self = shift; my $pagenum = shift; my $fontname = shift; $fontname =~ s/ \A\/? /\//xms; # add leading slash if needed my $objnode = $self->dereference($fontname, $pagenum); return if (!$objnode); my $dict = $self->getValue($objnode); if ($dict && $dict->{Type} && $dict->{Type}->{value} eq 'Font') { return $dict; } else { return; } } =item $doc->getFontNames($pagenum) I Returns a list of fonts for a given page. =cut sub getFontNames { my $self = shift; my $pagenum = shift; $self->_buildNameTable($pagenum); my $list = $self->{Names}->{$pagenum}; my @names; if ($list) { for my $key (keys %{$list}) { my $dict = $self->getValue($list->{$key}); if ($dict && $dict->{Type} && $dict->{Type}->{value} eq 'Font') { push @names, $key; } } } return @names; } =item $doc->getFonts($pagenum) I Returns an array of font objects for a given page. =cut sub getFonts { my $self = shift; my $pagenum = shift; $self->_buildNameTable($pagenum); my $list = $self->{Names}->{$pagenum}; my @fonts; if ($list) { for my $key (keys %{$list}) { my $dict = $self->getValue($list->{$key}); if ($dict && $dict->{Type} && $dict->{Type}->{value} eq 'Font') { push @fonts, $dict; } } } return @fonts; } =item $doc->getFontByBaseName($pagenum, $fontname) I Returns a dictionary for a given font, referenced by page and the name of the base font. =cut sub getFontByBaseName { my $self = shift; my $pagenum = shift; my $fontname = shift; $self->_buildNameTable($pagenum); my $list = $self->{Names}->{$pagenum}; for my $key (keys %{$list}) { my $num = $list->{$key}->{value}; my $objnode = $self->dereference($num); my $dict = $self->getValue($objnode); if ($dict && $dict->{Type} && $dict->{Type}->{value} eq 'Font' && $dict->{BaseFont} && $dict->{BaseFont}->{value} eq $fontname) { return $dict; } } return; } =item $doc->getFontMetrics($properties $fontname) I Returns a data structure representing the font metrics for the named font. The property list is the results of something like the following: $self->_buildNameTable($pagenum); my $properties = $self->{Names}->{$pagenum}; Alternatively, if you know the page number, it might be easier to do: my $font = $self->dereference($fontlabel, $pagenum); my $fontmetrics = $font->{value}->{value}; where the C<$fontlabel> is something like '/Helv'. The getFontMetrics() method is useful in the cases where you've forgotten which page number you are working on (e.g. in CAM::PDF::GS), or if your property list isn't part of any page (e.g. working with form field annotation objects). =cut sub getFontMetrics { my $self = shift; my $props = shift; my $fontname = shift; my $fontmetrics; #print STDERR "looking for font $fontname\n"; # Sometimes we are passed just the object list, sometimes the whole # properties data structure if ($props->{Font}) { $props = $self->getValue($props->{Font}); } if ($props->{$fontname}) { my $fontdict = $self->getValue($props->{$fontname}); if ($fontdict && $fontdict->{Type} && $fontdict->{Type}->{value} eq 'Font') { $fontmetrics = $fontdict; #print STDERR "Got font\n"; } else { #print STDERR "Almost got font\n"; } } else { #print STDERR "No font with that name in the dict\n"; } #print STDERR "Failed to get font\n" if (!$fontmetrics); return $fontmetrics; } =item $doc->addFont($pagenum, $fontname, $fontlabel) =item $doc->addFont($pagenum, $fontname, $fontlabel, $fontmetrics) Adds a reference to the specified font to the page. If a font metrics hash is supplied (it is required for a font other than the 14 core fonts), then it is cloned and inserted into the new font structure. Note that if those font metrics contain references (e.g. to the C), the referred objects are not copied -- you must do that part yourself. For Type1 fonts, the font metrics must minimally contain the following fields: C, C, C, C, C. =cut sub addFont { my $self = shift; my $pagenum = shift; my $name = shift; my $label = shift; my $fontmetrics = shift; # optional # Check if this font already exists my $page = $self->getPage($pagenum); if (exists $page->{Resources}) { my $r = $self->getValue($page->{Resources}); if (exists $r->{Font}) { my $f = $self->getValue($r->{Font}); if (exists $f->{$label}) { # Font already exists. Skip. return $self; } } } # Build the font my $dict = CAM::PDF::Node->new('dictionary', { Type => CAM::PDF::Node->new('label', 'Font'), Name => CAM::PDF::Node->new('label', $label), BaseFont => CAM::PDF::Node->new('label', $name), }, ); if ($fontmetrics) { my $copy = $self->copyObject($fontmetrics); for my $key (keys %{$copy}) { if (!$dict->{value}->{$key}) { $dict->{value}->{$key} = $copy->{$key}; } } } else { $dict->{value}->{Subtype} = CAM::PDF::Node->new('label', 'Type1'); } # Add the font to the document my $fontobjnum = $self->appendObject(undef, CAM::PDF::Node->new('object', $dict), 0); # Add the font to the page my ($objnum,$gennum) = $self->getPageObjnum($pagenum); if (!exists $page->{Resources}) { $page->{Resources} = CAM::PDF::Node->new('dictionary', {}, $objnum, $gennum); } my $r = $self->getValue($page->{Resources}); if (!exists $r->{Font}) { $r->{Font} = CAM::PDF::Node->new('dictionary', {}, $objnum, $gennum); } my $f = $self->getValue($r->{Font}); $f->{$label} = CAM::PDF::Node->new('reference', $fontobjnum, $objnum, $gennum); delete $self->{Names}->{$pagenum}; # decache $self->{changes}->{$objnum} = 1; return $self; } =item $doc->deEmbedFont($pagenum, $fontname) =item $doc->deEmbedFont($pagenum, $fontname, $basefont) Removes embedded font data, leaving font reference intact. Returns true if the font exists and 1) font is not embedded or 2) embedded data was successfully discarded. Returns false if the font does not exist, or the embedded data could not be discarded. The optional C<$basefont> parameter allows you to change the font. This is useful when some applications embed a standard font (see below) and give it a funny name, like C. In this example, it's important to change the basename back to the standard C when de-embedding. De-embedding the font does NOT remove it from the PDF document, it just removes references to it. To get a size reduction by throwing away unused font data, you should use the following code sometime after this method. $self->cleanse(); For reference, the standard fonts are C, C, and C (and their bold, italic and bold-italic forms) plus C and C. (Adobe PDF Reference v1.4, p.319) =cut sub deEmbedFont { my $self = shift; my $pagenum = shift; my $fontname = shift; my $basefont = shift; my $success; my $font = $self->getFont($pagenum, $fontname); if ($font) { $self->_deEmbedFontObj($font, $basefont); $success = $self; } else { $success = undef; } return $success; } =item $doc->deEmbedFontByBaseName($pagenum, $fontname) =item $doc->deEmbedFontByBaseName($pagenum, $fontname, $basefont) Just like deEmbedFont(), except that the font name parameter refers to the name of the current base font instead of the PDF label for the font. =cut sub deEmbedFontByBaseName { my $self = shift; my $pagenum = shift; my $fontname = shift; my $basefont = shift; my $success; my $font = $self->getFontByBaseName($pagenum, $fontname); if ($font) { $self->_deEmbedFontObj($font, $basefont); $success = $self; } else { $success = undef; } return $success; } sub _deEmbedFontObj { my $self = shift; my $font = shift; my $basefont = shift; if ($basefont) { $font->{BaseFont} = CAM::PDF::Node->new('label', $basefont); } delete $font->{FontDescriptor}; delete $font->{Widths}; delete $font->{FirstChar}; delete $font->{LastChar}; $self->{changes}->{$font->{Type}->{objnum}} = 1; return; } =item $doc->wrapString($string, $width, $fontsize, $fontmetrics) =item $doc->wrapString($string, $width, $fontsize, $pagenum, $fontlabel) Returns an array of strings wrapped to the specified width. =cut sub wrapString ## no critic (Unpack) { my $self = shift; my $string = shift; my $width = shift; my $size = shift; my $fm; if (defined $_[0] && ref $_[0]) { $fm = shift; } else { my $pagenum = shift; my $fontlabel = shift; $fm = $self->getFont($pagenum, $fontlabel); } $string =~ s/ \r\n /\n/gxms; # no split limit, so trailing null strings are omitted my @strings = split /[\r\n]/xms, $string; my @out; $width /= $size; #print STDERR 'wrapping '.join('|',@strings)."\n"; for my $s (@strings) { $s =~ s/ \s+\z //xms; my $w = $self->getStringWidth($fm, $s); if ($w <= $width) { push @out, $s; } else { my $cur; if ($s =~ s/ \A(\s*) //xms) { $cur = $1; } my $curw = $cur eq q{} ? 0 : $self->getStringWidth($fm, $cur); while ($s) { my ($sp,$wd); if ($s =~ s/ \A(\s*)(\S*) //xms) { ($sp,$wd) = ($1,$2); } my $wwd = $wd eq q{} ? 0 : $self->getStringWidth($fm, $wd); if ($curw == 0) { $cur = $wd; $curw = $wwd; } else { my $wsp = $sp eq q{} ? 0 : $self->getStringWidth($fm, $sp); if ($curw + $wsp + $wwd <= $width) { $cur .= $sp . $wd; $curw += $wsp + $wwd; } else { push @out, $cur; $cur = $wd; $curw = $wwd; } } } if (0 < length $cur) { push @out, $cur; } } } #print STDERR 'wrapped to '.join('|',@out)."\n"; return @out; } =item $doc->getStringWidth($fontmetrics, $string) I Returns the width of the string, using the font metrics if possible. =cut sub getStringWidth { my $self = shift; my $fontmetrics = shift; my $string = shift; if (! defined $string || $string eq q{}) { return 0; } my $width = 0; if ($fontmetrics) { if ($fontmetrics->{Widths}) { my $firstc = $self->getValue($fontmetrics->{FirstChar}); my $lastc = $self->getValue($fontmetrics->{LastChar}); my $widths = $self->getValue($fontmetrics->{Widths}); my $missing_width; # populate this on demand CHAR: for my $char (unpack 'C*', $string) { if ($char >= $firstc && $char <= $lastc) { $width += $widths->[$char - $firstc]->{value}; next CHAR; } if (!defined $missing_width) { my $fd = exists $fontmetrics->{FontDescriptor} ? $self->getValue($fontmetrics->{FontDescriptor}) : undef; $missing_width = $fd && exists $fd->{MissingWidth} ? $self->getValue($fd->{MissingWidth}) : 0; } $width += $missing_width; } $width /= 1000.0; # units conversion } elsif ($fontmetrics->{BaseFont}) { my $fontname = $self->getValue($fontmetrics->{BaseFont}); if (!exists $self->{fontmetrics}->{$fontname}) { require Text::PDF::SFont; require Text::PDF::File; my $pdf = Text::PDF::File->new(); $self->{fontmetrics}->{$fontname} = Text::PDF::SFont->new($pdf, $fontname, 'NULL'); } if ($self->{fontmetrics}->{$fontname}) { $width = $self->{fontmetrics}->{$fontname}->width($string); } } else { warn 'Failed to understand this font'; } } if ($width == 0) { # HACK!!! #warn "Using klugy width!\n"; $width = 0.2 * length $string; } return $width; } =item $doc->numPages() Returns the number of pages in the PDF document. =cut sub numPages { my $self = shift; return $self->{PageCount}; } =item $doc->getPage($pagenum) I Returns a dictionary for a given numbered page. =cut sub getPage { my $self = shift; my $pagenum = shift; if ($pagenum < 1 || $pagenum > $self->{PageCount}) { warn "Invalid page number requested: $pagenum\n"; return; } if (!exists $self->{pagecache}->{$pagenum}) { my $node = $self->getPagesDict(); my $nodestart = 1; while ($self->getValue($node->{Type}) eq 'Pages') { my $kids = $self->getValue($node->{Kids}); if ((ref $kids) ne 'ARRAY') { die "Error: \@kids is not an array\n"; } my $child = 0; if (@{$kids} == 1) { # Do the simple case first: $child = 0; # nodestart is unchanged } else { # search through all kids EXCEPT don't bother looking at # the last one because that is surely the right one if all # the others are wrong. while ($child < $#{$kids}) { # the first leaf of the kid is the page we want. It # doesn't matter if the kid is a leaf or a node. last if ($pagenum == $nodestart); # Retrieve the dictionary of this child my $sub = $self->getValue($kids->[$child]); if ($sub->{Type}->{value} ne 'Pages') { # Its a leaf, and not the right one. Move on. $nodestart++; } else { my $count = $self->getValue($sub->{Count}); # The page we want is in this kid. Descend. last if ($nodestart + $count - 1 >= $pagenum); # Not in this kid. Move on. $nodestart += $count; } $child++; } } $node = $self->getValue($kids->[$child]); if (! ref $node) { require Data::Dumper; cluck Data::Dumper::Dumper($node); } } # Ok, now we've got the right page. Store it. $self->{pagecache}->{$pagenum} = $node; } return $self->{pagecache}->{$pagenum}; } =item $doc->getPageObjnum($pagenum) I Return the number of the PDF object in which the specified page occurs. =cut sub getPageObjnum { my $self = shift; my $pagenum = shift; my $page = $self->getPage($pagenum); return if (!$page); my ($anyobj) = values %{$page}; if (!$anyobj) { die "Internal error: page has no attributes!!!\n"; } if (wantarray) { return ($anyobj->{objnum}, $anyobj->{gennum}); } else { return $anyobj->{objnum}; } } =item $doc->getPageText($pagenum) Extracts the text from a PDF page as a string. =cut sub getPageText { my $self = shift; my $pagenum = shift; my $verbose = shift; my $pagetree = $self->getPageContentTree($pagenum, $verbose); if (!$pagetree) { return; } require CAM::PDF::PageText; return CAM::PDF::PageText->render($pagetree, $verbose); } =item $doc->getPageContentTree($pagenum) Retrieves a parsed page content data structure, or undef if there is a syntax error or if the page does not exist. =cut sub getPageContentTree { my $self = shift; my $pagenum = shift; my $verbose = shift; my $content = $self->getPageContent($pagenum); return if (!defined $content); $self->_buildNameTable($pagenum); my $page = $self->getPage($pagenum); my $box = [0, 0, 612, 792]; if ($page->{MediaBox}) { my $mediabox = $self->getValue($page->{MediaBox}); $box->[0] = $self->getValue($mediabox->[0]); $box->[1] = $self->getValue($mediabox->[1]); $box->[2] = $self->getValue($mediabox->[2]); $box->[3] = $self->getValue($mediabox->[3]); } require CAM::PDF::Content; my $tree = CAM::PDF::Content->new($content, { doc => $self, properties => $self->{Names}->{$pagenum}, mediabox => $box, }, $verbose); return $tree; } =item $doc->getPageContent($pagenum) Return a string with the layout contents of one page. =cut sub getPageContent { my $self = shift; my $pagenum = shift; my $page = $self->getPage($pagenum); if (!$page || !exists $page->{Contents}) { return q{}; } my $contents = $self->getValue($page->{Contents}); if (! ref $contents) { return $contents; } elsif ((ref $contents) eq 'HASH') { # doesn't matter if it's not encoded... return $self->decodeOne(CAM::PDF::Node->new('dictionary', $contents)); } elsif ((ref $contents) eq 'ARRAY') { my $stream = q{}; for my $arrobj (@{$contents}) { my $streamdata = $self->getValue($arrobj); if (! ref $streamdata) { $stream .= $streamdata; } elsif ((ref $streamdata) eq 'HASH') { $stream .= $self->decodeOne(CAM::PDF::Node->new('dictionary',$streamdata)); # doesn't matter if it's not encoded... } else { die "Unexpected content type for page contents\n"; } } return $stream; } else { die "Unexpected content type for page contents\n"; } return; # should never get here } =item $doc->getPageDimensions($pagenum) Returns an array of C, C, C and C numbers that define the dimensions of the specified page in points (1/72 inches). Technically, this is the C dimensions, which explains why it's possible for C and C to be non-zero, but that's a rare case. For example, given a simple 8.5 by 11 inch page, this method will return C<(0,0,612,792)>. This method will die() if the specified page number does not exist. =cut sub getPageDimensions { my $self = shift; my $pagenum = shift; my $pagedict = shift; # only used during recursion if (!$pagedict) { $pagedict = $self->getPage($pagenum); if (!$pagedict) { die 'No such page '.$pagenum; } } if (exists $pagedict->{MediaBox}) { my $box = $self->getValue($pagedict->{MediaBox}); return ($self->getValue($box->[0]), $self->getValue($box->[1]), $self->getValue($box->[2]), $self->getValue($box->[3])); } elsif (exists $pagedict->{Parent}) { return $self->getPageDimensions($pagenum, $self->getValue($pagedict->{Parent})); } else { die 'Failed to find the page dimensions'; } return; # never gets here } =item $doc->getName($object) I Given a PDF object reference, return it's name, if it has one. This is useful for indirect references to images in particular. =cut sub getName { my $self = shift; my $objnode = shift; if ($objnode->{value}->{type} eq 'dictionary') { my $dict = $objnode->{value}->{value}; if (exists $dict->{Name}) { return $self->getValue($dict->{Name}); } } return q{}; } =item $doc->getPrefs() Return an array of security information for the document: owner password user password print boolean modify boolean copy boolean add boolean See the PDF reference for the intended use of the latter four booleans. This module publishes the array indices of these values for your convenience: $CAM::PDF::PREF_OPASS $CAM::PDF::PREF_UPASS $CAM::PDF::PREF_PRINT $CAM::PDF::PREF_MODIFY $CAM::PDF::PREF_COPY $CAM::PDF::PREF_ADD So, you can retrieve the value of the Copy boolean via: my ($canCopy) = ($self->getPrefs())[$CAM::PDF::PREF_COPY]; =cut sub getPrefs { my $self = shift; my @p = (1,1,1,1); if (exists $self->{crypt}->{P}) { @p = $self->{crypt}->decode_permissions($self->{crypt}->{P}); } return($self->{crypt}->{opass}, $self->{crypt}->{upass}, @p); } =item $doc->canPrint() Return a boolean indicating whether the Print permission is enabled on the PDF. =cut sub canPrint { my $self = shift; return ($self->getPrefs())[$PREF_PRINT]; } =item $doc->canModify() Return a boolean indicating whether the Modify permission is enabled on the PDF. =cut sub canModify { my $self = shift; return ($self->getPrefs())[$PREF_MODIFY]; } =item $doc->canCopy() Return a boolean indicating whether the Copy permission is enabled on the PDF. =cut sub canCopy { my $self = shift; return ($self->getPrefs())[$PREF_COPY]; } =item $doc->canAdd() Return a boolean indicating whether the Add permission is enabled on the PDF. =cut sub canAdd { my $self = shift; return ($self->getPrefs())[$PREF_ADD]; } =item $doc->getFormFieldList() Return an array of the names of all of the PDF form fields. The names are the full hierarchical names constructed as explained in the PDF reference manual. These names are useful for the fillFormFields() function. =cut sub getFormFieldList { my $self = shift; my $parentname = shift; # very optional my $prefix = (defined $parentname ? $parentname . q{.} : q{}); my $kidlist; if (defined $parentname && $parentname ne q{}) { my $parent = $self->getFormField($parentname); return if (!$parent); my $dict = $self->getValue($parent); return if (!exists $dict->{Kids}); $kidlist = $self->getValue($dict->{Kids}); } else { my $root = $self->getRootDict()->{AcroForm}; return if (!$root); my $parent = $self->getValue($root); return if (!exists $parent->{Fields}); $kidlist = $self->getValue($parent->{Fields}); } my @list; for my $kid (@{$kidlist}) { if ((! ref $kid) || (ref $kid) ne 'CAM::PDF::Node' || $kid->{type} ne 'reference') { die "Expected a reference as the form child of '$parentname'\n"; } my $objnode = $self->dereference($kid->{value}); my $dict = $self->getValue($objnode); my $name = '(no name)'; # assume the worst if (exists $dict->{T}) { $name = $self->getValue($dict->{T}); } $name = $prefix . $name; push @list, $name; if (exists $dict->{TU}) { push @list, $prefix . $self->getValue($dict->{TU}) . ' (alternate name)'; } $self->{formcache}->{$name} = $objnode; my @kidnames = $self->getFormFieldList($name); if (@kidnames > 0) { #push @list, 'descend...'; push @list, @kidnames; #push @list, 'ascend...'; } } return @list; } =item $doc->getFormField($name) I Return the object containing the form field definition for the specified field name. C<$name> can be either the full name or the "short/alternate" name. =cut sub getFormField { my $self = shift; my $fieldname = shift; return if (!defined $fieldname); if (! exists $self->{formcache}->{$fieldname}) { my $kidlist; my $parent; if ($fieldname =~ m/ [.] /xms) { my $parentname; if ($fieldname =~ s/ \A(.*)[.]([.]+)\z /$2/xms) { $parentname = $1; } return if (!$parentname); $parent = $self->getFormField($parentname); return if (!$parent); my $dict = $self->getValue($parent); return if (!exists $dict->{Kids}); $kidlist = $self->getValue($dict->{Kids}); } else { my $root = $self->getRootDict()->{AcroForm}; return if (!$root); $parent = $self->dereference($root->{value}); return if (!$parent); my $dict = $self->getValue($parent); return if (!exists $dict->{Fields}); $kidlist = $self->getValue($dict->{Fields}); } $self->{formcache}->{$fieldname} = undef; # assume the worst... for my $kid (@{$kidlist}) { my $objnode = $self->dereference($kid->{value}); $objnode->{formparent} = $parent; my $dict = $self->getValue($objnode); if (exists $dict->{T}) { $self->{formcache}->{$self->getValue($dict->{T})} = $objnode; } if (exists $dict->{TU}) { $self->{formcache}->{$self->getValue($dict->{TU})} = $objnode; } } } return $self->{formcache}->{$fieldname}; } =item $doc->getFormFieldDict($formfieldobject) I Return a hash reference representing the accumulated property list for a form field, including all of it's inherited properties. This should be treated as a read-only hash! It ONLY retrieves the properties it knows about. =cut sub getFormFieldDict { my $self = shift; my $field = shift; return if (!defined $field); my $dict = {}; if ($field->{formparent}) { $dict = $self->getFormFieldDict($field->{formparent}); } my $olddict = $self->getValue($field); if ($olddict->{DR}) { $dict->{DR} ||= CAM::PDF::Node->new('dictionary', {}); my $dr = $self->getValue($dict->{DR}); my $olddr = $self->getValue($olddict->{DR}); for my $key (keys %{$olddr}) { if ($dr->{$key}) { if ($key eq 'Font') { my $fonts = $self->getValue($olddr->{$key}); for my $font (keys %{$fonts}) { $dr->{$key}->{$font} = $self->copyObject($fonts->{$font}); } } else { warn "Unknown resource key '$key' in form field dictionary"; } } else { $dr->{$key} = $self->copyObject($olddr->{$key}); } } } # Some properties are simple: inherit means override for my $prop (qw(Q DA Ff V FT)) { if ($olddict->{$prop}) { $dict->{$prop} = $self->copyObject($olddict->{$prop}); } } return $dict; } ################################################################################ =back =head2 Data/Object Manipulation =over =item $doc->setPrefs($ownerpass, $userpass, $print?, $modify?, $copy?, $add?) Alter the document's security information. Note that modifying these parameters must be done respecting the intellectual property of the original document. See Adobe's statement in the introduction of the reference manual. B Most PDF readers (Acrobat, Preview.app) only offer one password field for opening documents. So, if the C<$ownerpass> and C<$userpass> are different, those applications cannot read the documents. (Perhaps this is a bug in CAM::PDF?) Note: any omitted booleans default to false. So, these two are equivalent: $doc->setPrefs('password', 'password'); $doc->setPrefs('password', 'password', 0, 0, 0, 0); =cut sub setPrefs { my ($self, @prefs) = @_; my $p = $self->{crypt}->encode_permissions(@prefs[2..5]); $self->{crypt}->set_passwords($self, @prefs[0..1], $p); return; } =item $doc->setName($object, $name) I Change the name of a PDF object structure. =cut sub setName { my $self = shift; my $objnode = shift; my $name = shift; if ($name && $objnode->{value}->{type} eq 'dictionary') { $objnode->{value}->{value}->{Name} = CAM::PDF::Node->new('label', $name, $objnode->{objnum}, $objnode->{gennum}); if ($objnode->{objnum}) { $self->{changes}->{$objnode->{objnum}} = 1; } return $self; } return; } =item $doc->removeName($object) I Delete the name of a PDF object structure. =cut sub removeName { my $self = shift; my $objnode = shift; if ($objnode->{value}->{type} eq 'dictionary' && exists $objnode->{value}->{value}->{Name}) { delete $objnode->{value}->{value}->{Name}; if ($objnode->{objnum}) { $self->{changes}->{$objnode->{objnum}} = 1; } return $self; } return; } =item $doc->pageAddName($pagenum, $name, $objectnum) I Append a named object to the metadata for a given page. =cut sub pageAddName { my $self = shift; my $pagenum = shift; my $name = shift; my $key = shift; $self->_buildNameTable($pagenum); my $page = $self->getPage($pagenum); my ($objnum, $gennum) = $self->getPageObjnum($pagenum); if (!exists $self->{NameObjects}->{$pagenum}) { if ($objnum) { $self->{changes}->{$objnum} = 1; } if (!exists $page->{Resources}) { $page->{Resources} = CAM::PDF::Node->new('dictionary', {}, $objnum, $gennum); } my $r = $self->getValue($page->{Resources}); if (!exists $r->{XObject}) { $r->{XObject} = CAM::PDF::Node->new('dictionary', {}, $objnum, $gennum); } $self->{NameObjects}->{$pagenum} = $self->getValue($r->{XObject}); } $self->{NameObjects}->{$pagenum}->{$name} = CAM::PDF::Node->new('reference', $key, $objnum, $gennum); if ($objnum) { $self->{changes}->{$objnum} = 1; } return; } =item $doc->setPageContent($pagenum, $content) =item $doc->setPageContent($pagenum, $tree->toString) Replace the content of the specified page with a new version. This function is often used after the getPageContent() function and some manipulation of the returned string from that function. If your content is a parsed tree (i.e. the result of getPageContentTree) then you should serialize it via toString first. =cut sub setPageContent { my $self = shift; my $pagenum = shift; my $content = shift; # Note that this *could* be implemented as # delete current content # appendPageContent # but that would lose the optimization below of reusing the content # object, where possible my $page = $self->getPage($pagenum); my $stream = $self->createStreamObject($content, 'FlateDecode'); if ($page->{Contents} && $page->{Contents}->{type} eq 'reference') { my $key = $page->{Contents}->{value}; $self->replaceObject($key, undef, $stream, 0); } else { my ($objnum, $gennum) = $self->getPageObjnum($pagenum); my $key = $self->appendObject(undef, $stream, 0); $page->{Contents} = CAM::PDF::Node->new('reference', $key, $objnum, $gennum); $self->{changes}->{$objnum} = 1; } return; } =item $doc->appendPageContent($pagenum, $content) Add more content to the specified page. Note that this function does NOT do any page metadata work for you (like creating font objects for any newly defined fonts). =cut sub appendPageContent { my $self = shift; my $pagenum = shift; my $content = shift; my $page = $self->getPage($pagenum); my ($objnum, $gennum) = $self->getPageObjnum($pagenum); my $stream = $self->createStreamObject($content, 'FlateDecode'); my $key = $self->appendObject(undef, $stream, 0); my $streamref = CAM::PDF::Node->new('reference', $key, $objnum, $gennum); if (!$page->{Contents}) { $page->{Contents} = $streamref; } elsif ($page->{Contents}->{type} eq 'array') { push @{$page->{Contents}->{value}}, $streamref; } elsif ($page->{Contents}->{type} eq 'reference') { $page->{Contents} = CAM::PDF::Node->new('array', [ $page->{Contents}, $streamref ], $objnum, $gennum); } else { die "Unsupported Content type \"$page->{Contents}->{type}\" on page $pagenum\n"; } $self->{changes}->{$objnum} = 1; return; } =item $doc->extractPages($pages...) Remove all pages from the PDF except the specified ones. Like deletePages(), the pages can be multiple arguments, comma separated lists, ranges (open or closed). =cut sub extractPages ## no critic (Unpack) { my $self = shift; return $self if (@_ == 0); # no-work shortcut my @pages = $self->rangeToArray(1,$self->numPages(),@_); if (@pages == 0) { croak 'Tried to delete all the pages'; } my %pages = map {$_ => 1} @pages; # eliminate duplicates # make a list that is the complement of the @pages list my @delete = grep {!$pages{$_}} 1..$self->numPages(); return $self if (@delete == 0); # no-work shortcut return $self->_deletePages(@delete); } =item $doc->deletePages($pages...) Remove the specified pages from the PDF. The pages can be multiple arguments, comma separated lists, ranges (open or closed). =cut sub deletePages ## no critic (Unpack) { my $self = shift; return $self if (@_ == 0); # no-work shortcut my @pages = $self->rangeToArray(1,$self->numPages(),@_); return $self if (@pages == 0); # no-work shortcut my %pages = map {$_ => 1} @pages; # eliminate duplicates if ($self->numPages() == scalar keys %pages) { croak 'Tried to delete all the pages'; } return $self->_deletePages(keys %pages); } sub _deletePages { my ($self, @pages) = @_; # Pages should be reverse sorted since we need to delete from the # end to make the page numbers come out right. my @objnums; for my $page (reverse sort {$a <=> $b} @pages) { my $objnum = $self->_deletePage($page); if (!$objnum) { $self->_deleteRefsToPages(@objnums); # emergency cleanup to prevent corruption return; } push @objnums, $objnum; } $self->_deleteRefsToPages(@objnums); $self->cleanse(); return $self; } =item $doc->deletePage($pagenum) Remove the specified page from the PDF. If the PDF has only one page, this method will fail. =cut sub deletePage { my $self = shift; my $pagenum = shift; my $objnum = $self->_deletePage($pagenum); if ($objnum) { $self->_deleteRefsToPages($objnum); $self->cleanse(); } return $objnum ? $self : (); } # Internal method, called by deletePage() or deletePages() # Returns the objnum of the deleted page sub _deletePage { my $self = shift; my $pagenum = shift; if ($self->numPages() <= 1) # don't delete the last page { croak 'Tried to delete the only page'; } my ($objnum, $gennum) = $self->getPageObjnum($pagenum); if (!defined $objnum) { croak 'Tried to delete a non-existent page'; } $self->_deletePage_backPointers($objnum); $self->_deletePage_removeFromPageTree($pagenum); # Removing the page is easy: $self->deleteObject($objnum); # Caches are now bad for all pages from this one $self->decachePages($pagenum .. $self->numPages()); $self->{PageCount}--; return $objnum; } sub _deletePage_backPointers { my $self = shift; my $objnum = shift; # Delete pointer from annotation back to the page my $page = $self->dereference($objnum); my $pagedict = $page->{value}->{value}; if ($pagedict->{Annots}) { my $annots = $self->getValue($pagedict->{Annots}); if ($annots) { for my $annotref (@{$annots}) { my $annot = $self->getValue($annotref); if ($annot) { delete $annot->{P}; } } } } return; } sub _deletePage_removeFromPageTree { my $self = shift; my $pagenum = shift; # Removing references to the page is hard: # (much of this code is lifted from getPage) my $parentdict; my $node = $self->dereference($self->getRootDict()->{Pages}->{value}); my $nodedict = $node->{value}->{value}; my $nodestart = 1; while ($node && $nodedict->{Type}->{value} eq 'Pages') { my $count; if ($nodedict->{Count}->{type} eq 'reference') { my $countobj = $self->dereference($nodedict->{Count}->{value}); $count = $countobj->{value}->{value}--; $self->{changes}->{$countobj->{objnum}} = 1; } else { $count = $nodedict->{Count}->{value}--; } $self->{changes}->{$node->{objnum}} = 1; if ($count == 1) { # only one left, so this is it if (!$parentdict) { croak 'Tried to delete the only page'; } my $parentkids = $self->getValue($parentdict->{Kids}); @{$parentkids} = grep {$_->{value} != $node->{objnum}} @{$parentkids}; $self->{changes}->{$parentdict->{Kids}->{objnum}} = 1; $self->deleteObject($node->{objnum}); last; } my $kids = $self->getValue($nodedict->{Kids}); if (@{$kids} == 1) { # Count was not 1, so this must not be a leaf node # hop down into node's child my $sub = $self->dereference($kids->[0]->{value}); my $subdict = $sub->{value}->{value}; $parentdict = $nodedict; $node = $sub; $nodedict = $subdict; } else { # search through all kids for my $child (0 .. $#{$kids}) { my $sub = $self->dereference($kids->[$child]->{value}); my $subdict = $sub->{value}->{value}; if ($subdict->{Type}->{value} ne 'Pages') { if ($pagenum == $nodestart) { # Got it! splice @{$kids}, $child, 1; $node = undef; # flag that we are done last; } else { # Its a leaf, and not the right one. Move on. $nodestart++; } } else { # Type=='Pages' node my $child_count = $self->getValue($subdict->{Count}); if ($nodestart + $child_count - 1 >= $pagenum) { # The page we want is in this kid. Descend. $parentdict = $nodedict; $node = $sub; $nodedict = $subdict; last; } else { # Not in this kid. Move on. $nodestart += $child_count; } } if ($child == $#{$kids}) { die "Internal error: did not find the page to delete -- corrupted page index\n"; } } } } return; } sub _deleteRefsToPages { my ($self, @objnums) = @_; my %objnums = map {$_ => 1} @objnums; my $root = $self->getRootDict(); if ($root->{Names}) { my $names = $self->getValue($root->{Names}); if ($names->{Dests}) { my $dests = $self->getValue($names->{Dests}); if ($self->_deleteDests($dests, \%objnums)) { delete $names->{Dests}; } } if (0 == scalar keys %{$names}) { my $names_objnum = $root->{Names}->{value}; $self->deleteObject($names_objnum); delete $root->{Names}; } } if ($root->{Outlines}) { my $outlines = $self->getValue($root->{Outlines}); $self->_deleteOutlines($outlines, \%objnums); } return; } sub _deleteOutlines { my $self = shift; my $outlines = shift; my $objnums = shift; my @deletes; my @stack = ($outlines); while (@stack > 0) { my $node = shift @stack; # Check for a Destination (aka internal hyperlink) # A is indirect ref, Dest is direct ref; only one can be present my $dest; if ($node->{A}) { $dest = $self->getValue($node->{A}); $dest = $self->getValue($dest->{D}); } elsif ($node->{Dest}) { $dest = $self->getValue($node->{Dest}); } if ($dest && (ref $dest) && (ref $dest) eq 'ARRAY') { my $ref = $dest->[0]; if ($ref && $ref->{type} eq 'reference' && $objnums->{$ref->{value}}) { $self->deleteObject($ref->{objnum}); # Easier to just delete both, even though only one may exist delete $node->{A}; delete $node->{Dest}; } } if ($node->{Next}) { push @stack, $self->getValue($node->{Next}); } if ($node->{First}) { push @stack, $self->getValue($node->{First}); } } return; } sub _deleteDests ## no critic(Subroutines::ProhibitExcessComplexity) { my $self = shift; my $dests = shift; my $objnums = shift; ## Accumulate the nodes to delete my @deletes; my @stack = ([$dests]); while (@stack > 0) { my $chain = pop @stack; my $node = $chain->[0]; if ($node->{Names}) { my $pairs = $self->getValue($node->{Names}); for (my $i=1; $i<@{$pairs}; $i+=2) ## no critic(ControlStructures::ProhibitCStyleForLoops) { push @stack, [$self->getValue($pairs->[$i]), @{$chain}]; } } elsif ($node->{Kids}) { my $list = $self->getValue($node->{Kids}); push @stack, map {[$self->getValue($_), @{$chain}]} @{$list}; } elsif ($node->{D}) { my $props = $self->getValue($node->{D}); my $ref = $props->[0]; if ($ref && $ref->{type} eq 'reference' && $objnums->{$ref->{value}}) { push @deletes, $chain; } } } ## Delete the nodes, and their parents if applicable for my $chain (@deletes) { my $objnode = shift @{$chain}; my $objnum = [values %{$objnode}]->[0]->{objnum}; if (!$objnum) { die 'Destination object lacks an object number (number '.@{$chain}.' in the chain)'; } $self->deleteObject($objnum); # Ascend chain... $objnum gets overwritten CHAIN: for my $node (@{$chain}) { last if (exists $node->{deleted}); # internal flag my $node_objnum = [values %{$node}]->[0]->{objnum} || die; if ($node->{Names}) { my $pairs = $self->getValue($node->{Names}); my $limits = $self->getValue($node->{Limits}); my $redo_limits = 0; # Find and remove child reference # iterate over keys of key-value array for (my $i=@{$pairs}-2; $i>=0; $i-=2) ## no critic(ControlStructures::ProhibitCStyleForLoops) { if ($pairs->[$i+1]->{value} == $objnum) { my $name = $pairs->[$i]->{value} || die 'No name in Name tree'; splice @{$pairs}, $i, 2; if ($limits->[0]->{value} eq $name || $limits->[1]->{value} eq $name) { $redo_limits = 1; } } } if (@{$pairs} > 0) { if ($redo_limits) { my @names; for (my $i=0; $i<@{$pairs}; $i+=2) ## no critic(ControlStructures::ProhibitCStyleForLoops) { push @names, $pairs->[$i]->{value}; } @names = sort @names; $limits->[0]->{value} = $names[0]; $limits->[1]->{value} = $names[-1]; } last CHAIN; } } elsif ($node->{Kids}) { my $list = $self->getValue($node->{Kids}); # Find and remove child reference for my $i (reverse 0 .. $#{$list}) { if ($list->[$i]->{value} == $objnum) { splice @{$list}, $i, 1; } } if (@{$list} > 0) { if ($node->{Limits}) { my $limits = $self->getValue($node->{Limits}); if (!$limits || @{$limits} != 2) { die 'Internal error: trouble parsing the Limits array in a name tree'; } my @names; for my $i (0..$#{$list}) { my $child = $self->getValue($list->[$i]); my $child_limits = $self->getValue($child->{Limits}); push @names, map {$_->{value}} @{$child_limits}; } @names = sort @names; $limits->[0]->{value} = $names[0]; $limits->[1]->{value} = $names[-1]; } last CHAIN; } } else { die 'Internal error: found a parent node with neither Names nor Kids. This should be impossible.'; } # If we got here, the node is empty, so delete it and move onward $self->deleteObject($node_objnum); $node->{deleted} = undef; # internal flag # Prepare for next iteration $objnum = $node_objnum; } } return exists $dests->{deleted}; } =item $doc->decachePages($pagenum, $pagenum, ...) Clears cached copies of the specified page data structures. This is useful if an operation has been performed that changes a page. =cut sub decachePages { my ($self, @pages) = @_; for (@pages) { delete $self->{pagecache}->{$_}; delete $self->{Names}->{$_}; delete $self->{NameObjects}->{$_}; } delete $self->{Names}->{All}; return $self; } =item $doc->addPageResources($pagenum, $resourcehash) Add the resources from the given object to the page resource dictionary. If the page does not have a resource dictionary, create one. This function avoids duplicating resources where feasible. =cut sub addPageResources { my $self = shift; my $pagenum = shift; my $newrsrcs = shift; return if (!$newrsrcs); my $page = $self->getPage($pagenum); return if (!$page); my ($anyobj) = values %{$page}; my $objnum = $anyobj->{objnum}; my $gennum = $anyobj->{gennum}; my $pagersrcs; if ($page->{Resources}) { $pagersrcs = $self->getValue($page->{Resources}); } else { $pagersrcs = {}; $page->{Resources} = CAM::PDF::Node->new('dictionary', $pagersrcs, $objnum, $gennum); $self->{changes}->{$objnum} = 1; } for my $type (keys %{$newrsrcs}) { my $new_r = $self->getValue($newrsrcs->{$type}); my $page_r; if ($pagersrcs->{$type}) { $page_r = $self->getValue($pagersrcs->{$type}); } if ($type eq 'Font') { if (!$page_r) { $page_r = {}; $pagersrcs->{$type} = CAM::PDF::Node->new('dictionary', $page_r, $objnum, $gennum); $self->{changes}->{$objnum} = 1; } for my $font (keys %{$new_r}) { next if (exists $page_r->{$font}); my $val = $new_r->{$font}; if ($val->{type} ne 'reference') { die 'Internal error: font entry is not a reference'; } $page_r->{$font} = CAM::PDF::Node->new('reference', $val->{value}, $objnum, $gennum); $self->{changes}->{$objnum} = 1; } } elsif ($type eq 'ProcSet') { if (!$page_r) { $page_r = []; $pagersrcs->{$type} = CAM::PDF::Node->new('array', $page_r, $objnum, $gennum); $self->{changes}->{$objnum} = 1; } for my $proc (@{$new_r}) { if ($proc->{type} ne 'label') { die 'Internal error: procset entry is not a label'; } { ## no critic(BuiltinFunctions::ProhibitBooleanGrep) -- TODO: use any() instead next if (grep {$_->{value} eq $proc->{value}} @{$page_r}); } push @{$page_r}, CAM::PDF::Node->new('label', $proc->{value}, $objnum, $gennum); $self->{changes}->{$objnum} = 1; } } elsif ($type eq 'Encoding') { # TODO: is this a hack or is it right? # EXPLICITLY skip /Encoding from form DR entry } else { warn "Internal error: unsupported resource type '$type'"; } } return; } =item $doc->appendPDF($pdf) Append pages from another PDF document to this one. No optimization is done -- the pieces are just appended and the internal table of contents is updated. Note that this can break documents with annotations. See the F script for a workaround. =cut sub appendPDF { my $self = shift; my $otherdoc = shift; my $prepend = shift; # boolean, default false my $pageroot = $self->getPagesDict(); my ($anyobj) = values %{$pageroot}; my $objnum = $anyobj->{objnum}; my $gennum = $anyobj->{gennum}; my $root = $self->getRootDict(); my $otherroot = $otherdoc->getRootDict(); my $otherpageobj = $otherdoc->dereference($otherroot->{Pages}->{value}); my ($key, %refkeys) = $self->appendObject($otherdoc, $otherpageobj->{objnum}, 1); my $subpage = $self->getObjValue($key); my $newdict = {}; my $newpage = CAM::PDF::Node->new('object', CAM::PDF::Node->new('dictionary', $newdict)); $newdict->{Type} = CAM::PDF::Node->new('label', 'Pages'); $newdict->{Kids} = CAM::PDF::Node->new('array', [ CAM::PDF::Node->new('reference', $prepend ? $key : $objnum), CAM::PDF::Node->new('reference', $prepend ? $objnum : $key), ]); $self->{PageCount} += $otherdoc->{PageCount}; $newdict->{Count} = CAM::PDF::Node->new('number', $self->{PageCount}); my $newpagekey = $self->appendObject(undef, $newpage, 0); $root->{Pages}->{value} = $newpagekey; $pageroot->{Parent} = CAM::PDF::Node->new('reference', $newpagekey, $key, $subpage->{gennum}); $subpage->{Parent} = CAM::PDF::Node->new('reference', $newpagekey, $key, $subpage->{gennum}); if ($otherroot->{AcroForm}) { my $forms = $otherdoc->getValue($otherdoc->getValue($otherroot->{AcroForm})->{Fields}); my @newforms; for my $reference (@{$forms}) { if ($reference->{type} ne 'reference') { die 'Internal error: expected a reference'; } my $newkey = $refkeys{$reference->{value}}; if ($newkey) { push @newforms, CAM::PDF::Node->new('reference', $newkey); } } if ($root->{AcroForm}) { my $mainforms = $self->getValue($self->getValue($root->{AcroForm})->{Fields}); for my $reference (@newforms) { $reference->{objnum} = $mainforms->[0]->{objnum}; $reference->{gennum} = $mainforms->[0]->{gennum}; } push @{$mainforms}, @newforms; } else { die 'adding new forms is not implemented'; } } if ($prepend) { # clear caches $self->{pagecache} = {}; $self->{Names} = {}; $self->{NameObjects} = {}; } return $key; } =item $doc->prependPDF($pdf) Just like appendPDF() except the new document is inserted on page 1 instead of at the end. =cut sub prependPDF { my ($self, @args) = @_; return $self->appendPDF(@args, 1); } =item $doc->duplicatePage($pagenum) =item $doc->duplicatePage($pagenum, $leaveblank) Inserts an identical copy of the specified page into the document. The new page's number will be C<$pagenum + 1>. If C<$leaveblank> is true, the new page does not get any content. Thus, the document is broken until you subsequently call setPageContent(). =cut sub duplicatePage { my $self = shift; my $pagenum = shift; my $leave_blank = shift || 0; my $page = $self->getPage($pagenum); my $objnum = $self->getPageObjnum($pagenum); my $newobjnum = $self->appendObject($self, $objnum, 0); my $newdict = $self->getObjValue($newobjnum); delete $newdict->{Contents}; my $parent = $self->getValue($page->{Parent}); push @{$self->getValue($parent->{Kids})}, CAM::PDF::Node->new('reference', $newobjnum); while ($parent) { $self->{changes}->{$parent->{Count}->{objnum}} = 1; if ($parent->{Count}->{type} eq 'reference') { my $countobj = $self->dereference($parent->{Count}->{value}); $countobj->{value}->{value}++; $self->{changes}->{$countobj->{objnum}} = 1; } else { $parent->{Count}->{value}++; } $parent = $self->getValue($parent->{Parent}); } $self->{PageCount}++; if (!$leave_blank) { $self->setPageContent($pagenum+1, $self->getPageContent($pagenum)); } # Caches are now bad for all pages from this one $self->decachePages($pagenum + 1 .. $self->numPages()); return $self; } =item $doc->createStreamObject($content) =item $doc->createStreamObject($content, $filter ...) I Create a new Stream object. This object is NOT added to the document. Use the appendObject() function to do that after calling this function. =cut sub createStreamObject { my $self = shift; my $content = shift; my $dict = CAM::PDF::Node->new('dictionary', { Length => CAM::PDF::Node->new('number', length $content), StreamData => CAM::PDF::Node->new('stream', $content), }, ); my $objnode = CAM::PDF::Node->new('object', $dict); while (my $filter = shift) { #warn "$filter encoding\n"; $self->encodeOne($objnode->{value}, $filter); } return $objnode; } =item $doc->uninlineImages() =item $doc->uninlineImages($pagenum) Search the content of the specified page (or all pages if the page number is omitted) for embedded images. If there are any, replace them with indirect objects. This procedure uses heuristics to detect in-line images, and is subject to confusion in extremely rare cases of text that uses C and C a lot. =cut sub uninlineImages { my $self = shift; my $pagenum = shift; my $changes = 0; if (!$pagenum) { my $pages = $self->numPages(); for my $p (1 .. $pages) { $changes += $self->uninlineImages($p); } } else { my $c = $self->getPageContent($pagenum); my $pos = 0; while (($pos = index $c, 'BI', $pos) != 1) { # manual \bBI check # if beginning of string or token if ($pos == 0 || (substr $c, $pos-1, 1) =~ m/ \W /xms) { my $part = substr $c, $pos; if ($part =~ m/ \A BI\b(.*?)\bID\b /xms) { my $im = $1; ## Long series of tests to make sure this is really an ## image and not just coincidental text # Fix easy cases of "BI text) BI ... ID" $im =~ s/ \A .*\bBI\b //xms; # There should never be an EI inside of a BI ... ID next if ($im =~ m/ \bEI\b /xms); # Easy tests: is this the beginning or end of a string? # (these aren't really good tests...) next if ($im =~ m/ \A [)] /xms); next if ($im =~ m/ [(] \z /xms); # this is the most complex heuristic: # make sure that there is an open paren before every close # if not, then the "BI" or the "ID" was part of a string my $test = $im; # make a copy we can scribble on my $failed = 0; # get rid of escaped parens for the test $test =~ s/ \\[()] //gxms; # Look for closing parens while ($test =~ s/ \A(.*?)[)] //xms) { # If there is NOT an opening paren before the # closing paren we detected above, then the start of # our string is INSIDE a paren pair, thus a failure. my $bit = $1; if ($bit !~ m/ [(] /xms) { $failed = 1; last; } } next if ($failed); # End of heuristics. This is likely a real embedded image. # Now do the replacement. my $oldlen = length $part; my $image = $self->parseInlineImage(\$part, undef); my $newlen = length $part; my $imagelen = $oldlen - $newlen; # Construct a new image name like "I3". Start with # "I1" and continue until we get an unused "I" # (first, get the list of already-used labels) $self->_buildNameTable($pagenum); my $i = 1; my $name = 'Im1'; while (exists $self->{Names}->{$pagenum}->{$name}) { $name = 'Im' . ++$i; } $self->setName($image, $name); my $key = $self->appendObject(undef, $image, 0); $self->pageAddName($pagenum, $name, $key); $c = (substr $c, 0, $pos) . "/$name Do" . (substr $c, $pos+$imagelen); $changes++; } } } if ($changes > 0) { $self->setPageContent($pagenum, $c); } } return $changes; } =item $doc->appendObject($doc, $objectnum, $recurse?) =item $doc->appendObject($undef, $object, $recurse?) Duplicate an object from another PDF document and add it to this document, optionally descending into the object and copying any other objects it references. Like replaceObject(), the second form allows you to append a newly-created block to the PDF. =cut sub appendObject { my $self = shift; my $otherdoc = shift; my $otherkey = shift; my $follow = shift; my $objnum = ++$self->{maxobj}; # Make sure our new object has a number higher than anything in # either document, otherwise the changeRefKeys might change # something twice! We had a problem of 15 -> 134 -> 333 in 1.52 # (private email with Charlie Katz) if ($otherdoc && $otherdoc->{maxobj} >= $objnum) { $objnum = $self->{maxobj} = $otherdoc->{maxobj} + 1; } if (exists $self->{versions}->{$objnum}) { $self->{versions}->{$objnum}++; } else { $self->{versions}->{$objnum} = 0; } my %refkeys = $self->replaceObject($objnum, $otherdoc, $otherkey, $follow); if (wantarray) { return ($objnum, %refkeys); } else { return $objnum; } } =item $doc->replaceObject($objectnum, $doc, $objectnum, $recurse?) =item $doc->replaceObject($objectnum, $undef, $object) Duplicate an object from another PDF document and insert it into this document, replacing an existing object. Optionally descend into the original object and copy any other objects it references. If the other document is undefined, then the object to copy is taken to be an anonymous object that is not part of any other document. This is useful when you've just created that anonymous object. =cut sub replaceObject { my $self = shift; my $key = shift; my $otherdoc = shift; my $otherkey = shift; my $follow = shift; # careful! 'undef' means something different from '0' here! if (!defined $follow) { $follow = 1; } my $objnode; my $otherobj; if ($otherdoc) { $otherobj = $otherdoc->dereference($otherkey); $objnode = $self->copyObject($otherobj); } else { $objnode = $otherkey; if ($follow) { warn "Error: you cannot \"follow\" an object if it has no document.\n" . "Resetting follow = false and continuing....\n"; $follow = 0; } } $self->setObjNum($objnode, $key, 0); # Preserve the name of the object if ($self->{xref}->{$key}) # make sure it isn't a brand new object { my $oldname = $self->getName($self->dereference($key)); if ($oldname) { $self->setName($objnode, $oldname); } else { $self->removeName($objnode); } } $self->{objcache}->{$key} = $objnode; $self->{changes}->{$key} = 1; my %newrefkeys = ($otherkey, $key); if ($follow) { for my $oldrefkey ($otherdoc->getRefList($otherobj)) { next if ($oldrefkey == $otherkey); my $newkey = $self->appendObject($otherdoc, $oldrefkey, 0); $newrefkeys{$oldrefkey} = $newkey; } my $already_changed = {}; # hash used by traverse() to avoid repeats $self->changeRefKeys($objnode, \%newrefkeys, $already_changed); for my $newkey (values %newrefkeys) { $self->changeRefKeys($self->dereference($newkey), \%newrefkeys, $already_changed); } } return (%newrefkeys); } =item $doc->deleteObject($objectnum) Remove an object from the document. This function does NOT take care of dependencies on this object. =cut sub deleteObject { my $self = shift; my $objnum = shift; # DON'T clear versuion number! We need to keep this to increment later #delete $self->{versions}->{$objnum}; delete $self->{objcache}->{$objnum}; delete $self->{xref}->{$objnum}; delete $self->{endxref}->{$objnum}; delete $self->{changes}->{$objnum}; return; } =item $doc->cleanse() Remove unused objects. I this function breaks some PDF documents because it removes objects that are strictly part of the page model hierarchy, but which are required anyway (like some font definition objects). =cut sub cleanse { my $self = shift; delete $self->{trailer}->{XRefStm}; # can't write this delete $self->getRootDict()->{PieceInfo}; # can't handle this one, too complicated my $base = CAM::PDF::Node->new('dictionary', $self->{trailer}); my @list = sort {$a<=>$b} $self->getRefList($base); #print join(',', @list), "\n"; for my $i (1 .. $self->{maxobj}) { if (@list && $list[0] == $i) { shift @list; } else { #warn "delete object $i\n"; $self->deleteObject($i); } } return; } =item $doc->createID() I Generate a new document ID. Contrary the Adobe recommendation, this is a random number. =cut sub createID { my $self = shift; # Warning: this is non-repeatable, and depends on Linux! my $addbytes; if ($self->{ID}) { # do not change the first half of an existing ID $self->{ID} = substr $self->{ID}, 0, 16; $addbytes = 16; } else { $self->{ID} = q{}; $addbytes = 32; } # Append $addbytes random bytes # First try the system random number generator if (-f '/dev/urandom') { if (open my $fh, '<', '/dev/urandom') { my $bytes_read = read $fh, $self->{ID}, $addbytes, 32-$addbytes; close $fh; ##no critic(Syscalls) $addbytes -= $bytes_read; } } # If that failed, use Perl's random number generator for (1..$addbytes) { $self->{ID} .= pack 'C', int rand 256; } if ($self->{trailer}) { $self->{trailer}->{ID} = CAM::PDF::Node->new('array', [ CAM::PDF::Node->new('hexstring', substr $self->{ID}, 0, 16), CAM::PDF::Node->new('hexstring', substr $self->{ID}, 16, 16), ], ); } return 1; } =item $doc->fillFormFields($name => $value, ...) =item $doc->fillFormFields($opts_hash, $name => $value, ...) Set the default values of PDF form fields. The name should be the full hierarchical name of the field as output by the getFormFieldList() function. The argument list can be a hash if you like. A simple way to use this function is something like this: my %fields = (fname => 'John', lname => 'Smith', state => 'WI'); $field{zip} = 53703; $self->fillFormFields(%fields); If the first argument is a hash reference, it is interpreted as options for how to render the filled data: =over =item background_color =E 'none' | $gray | [$r, $g, $b] Specify the background color for the text field. =item max_autoscale_fontsize =E $size =item min_autoscale_fontsize =E $size If the form field is set to auto-size the text to fit, then you may use these options to constrain the limits of that autoscaling. Otherwise, for example, a very long string will become arbitrarily small to fit in the box. =back =cut sub fillFormFields ## no critic(Subroutines::ProhibitExcessComplexity, Unpack) { my $self = shift; my $opts = ref $_[0] ? shift : {}; my @list = (@_); my %opts = ( background_color => 1, %{$opts}, ); my $filled = 0; while (@list > 0) { my $key = shift @list; my $value = shift @list; if (!defined $value) { $value = q{}; } next if (!$key); next if (ref $key); my $objnode = $self->getFormField($key); next if (!$objnode); my $objnum = $objnode->{objnum}; my $gennum = $objnode->{gennum}; # This read-only dict includes inherited properties my $propdict = $self->getFormFieldDict($objnode); # This read-write dict does not include inherited properties my $dict = $self->getValue($objnode); $dict->{V} = CAM::PDF::Node->new('string', $value, $objnum, $gennum); #$dict->{DV} = CAM::PDF::Node->new('string', $value, $objnum, $gennum); if ($propdict->{FT} && $self->getValue($propdict->{FT}) eq 'Tx') # Is it a text field? { # Set up display of form value if (!$dict->{AP}) { $dict->{AP} = CAM::PDF::Node->new('dictionary', {}, $objnum, $gennum); } if (!$dict->{AP}->{value}->{N}) { my $newobj = CAM::PDF::Node->new('object', CAM::PDF::Node->new('dictionary',{}), ); my $num = $self->appendObject(undef, $newobj, 0); $dict->{AP}->{value}->{N} = CAM::PDF::Node->new('reference', $num, $objnum, $gennum); } my $formobj = $self->dereference($dict->{AP}->{value}->{N}->{value}); my $formonum = $formobj->{objnum}; my $formgnum = $formobj->{gennum}; my $formdict = $self->getValue($formobj); if (!$formdict->{Subtype}) { $formdict->{Subtype} = CAM::PDF::Node->new('label', 'Form', $formonum, $formgnum); } my @rect = (0,0,0,0); if ($dict->{Rect}) { ## no critic(Bangs::ProhibitNumberedNames) my $r = $self->getValue($dict->{Rect}); my ($x1, $y1, $x2, $y2) = @{$r}; @rect = ( $self->getValue($x1), $self->getValue($y1), $self->getValue($x2), $self->getValue($y2), ); } my $dx = $rect[2]-$rect[0]; my $dy = $rect[3]-$rect[1]; if (!$formdict->{BBox}) { $formdict->{BBox} = CAM::PDF::Node->new('array', [ CAM::PDF::Node->new('number', 0, $formonum, $formgnum), CAM::PDF::Node->new('number', 0, $formonum, $formgnum), CAM::PDF::Node->new('number', $dx, $formonum, $formgnum), CAM::PDF::Node->new('number', $dy, $formonum, $formgnum), ], $formonum, $formgnum); } my $text = $value; $text =~ s/ \r\n? /\n/gxms; $text =~ s/ \n+\z //xms; my @rsrcs; my $fontmetrics = 0; my $fontname = q{}; my $fontsize = 0; my $da = q{}; my $tl = q{}; my $border = 2; my $tx = $border; my $ty = $border + 2; my $stringwidth; if ($propdict->{DA}) { $da = $self->getValue($propdict->{DA}); # Try to pull out all of the resources used in the text object @rsrcs = ($da =~ m{ /([^\s<>/\[\]()]+) }gxms); # Try to pull out the font size, if any. If more than # one, pick the last one. Font commands look like: # "/ Tf" if ($da =~ m{ \s*/(\w+)\s+(\d+)\s+Tf.*? \z }xms) { $fontname = $1; $fontsize = $2; if ($fontname) { if ($propdict->{DR}) { my $dr = $self->getValue($propdict->{DR}); $fontmetrics = $self->getFontMetrics($dr, $fontname); } #print STDERR "Didn't get font\n" if (!$fontmetrics); } } } my %flags = ( Justify => 'left', ); if ($propdict->{Ff}) { # Just decode the ones we actually care about # PDF ref, 3rd ed pp 532,543 my $ff = $self->getValue($propdict->{Ff}); my @flags = split m//xms, unpack 'b*', pack 'V', $ff; $flags{ReadOnly} = $flags[0]; $flags{Required} = $flags[1]; $flags{NoExport} = $flags[2]; $flags{Multiline} = $flags[12]; $flags{Password} = $flags[13]; $flags{FileSelect} = $flags[20]; $flags{DoNotSpellCheck} = $flags[22]; $flags{DoNotScroll} = $flags[23]; } if ($propdict->{Q}) { my $q = $self->getValue($propdict->{Q}) || 0; $flags{Justify} = $q==2 ? 'right' : ($q==1 ? 'center' : 'left'); } # The order of the following sections is important! if ($flags{Password}) { $text =~ s/ [^\n] /*/gxms; # Asterisks for password characters } if ($fontmetrics && ! $fontsize) { # Fix autoscale fonts $stringwidth = 0; my $lines = 0; for my $line (split /\n/xms, $text) # trailing null strings omitted { $lines++; my $w = $self->getStringWidth($fontmetrics, $line); if ($w && $w > $stringwidth) { $stringwidth = $w; } } $lines ||= 1; # Initial guess $fontsize = ($dy - 2 * $border) / ($lines * 1.5); my $fontwidth = $fontsize * $stringwidth; my $maxwidth = $dx - 2 * $border; if ($fontwidth > $maxwidth) { $fontsize *= $maxwidth / $fontwidth; } # allow for user override if (exists $opts->{max_autoscale_fontsize} && $fontsize > $opts->{max_autoscale_fontsize}) { $fontsize = $opts->{max_autoscale_fontsize}; } if (exists $opts->{min_autoscale_fontsize} && $fontsize < $opts->{min_autoscale_fontsize}) { $fontsize = $opts->{min_autoscale_fontsize}; } $da =~ s/ \/$fontname\s+0\s+Tf\b /\/$fontname $fontsize Tf/gxms; } if ($fontsize) { # This formula is TOTALLY empirical. It's probably wrong. $ty = $border + 2 + (9 - $fontsize) * 0.4; } # escape characters $text = $self->writeString($text); if ($flags{Multiline}) { # TODO: wrap the field with wrapString()?? # Shawn Dawson of Silent Solutions pointed out that this does not auto-wrap the input text my $linebreaks = $text =~ s/ \\n /\) Tj T* \(/gxms; # Total guess work: # line height is either 150% of fontsize or thrice # the corner offset $tl = $fontsize ? $fontsize * 1.5 : $ty * 3; # Bottom aligned #$ty += $linebreaks * $tl; # Top aligned $ty = $dy - $border - $tl; if ($flags{Justify} ne 'left') { warn 'Justified text not supported for multiline fields'; } $tl .= ' TL'; } else { if ($flags{Justify} ne 'left' && $fontmetrics) { my $width = $stringwidth || $self->getStringWidth($fontmetrics, $text); my $diff = $dx - $width*$fontsize; if ($flags{Justify} eq 'center') { $text = ($diff/2)." 0 Td $text"; } elsif ($flags{Justify} eq 'right') { $text = "$diff 0 Td $text"; } } } # Move text from lower left corner of form field my $tm = "1 0 0 1 $tx $ty Tm "; # if not 'none', draw a background as a filled rectangle of solid color my $background_color = $opts{background_color} eq 'none' ? q{} : ref $opts{background_color} ? "@{$opts{background_color}} rgb" : "$opts{background_color} g"; my $background = $background_color ? "$background_color 0 0 $dx $dy re f" : q{}; $text = "$tl $da $tm $text Tj"; $text = "$background /Tx BMC q 1 1 ".($dx-$border).q{ }.($dy-$border)." re W n BT $text ET Q EMC"; my $len = length $text; $formdict->{Length} = CAM::PDF::Node->new('number', $len, $formonum, $formgnum); $formdict->{StreamData} = CAM::PDF::Node->new('stream', $text, $formonum, $formgnum); if (@rsrcs > 0) { if (!$formdict->{Resources}) { $formdict->{Resources} = CAM::PDF::Node->new('dictionary', {}, $formonum, $formgnum); } my $rdict = $self->getValue($formdict->{Resources}); if (!$rdict->{ProcSet}) { $rdict->{ProcSet} = CAM::PDF::Node->new('array', [ CAM::PDF::Node->new('label', 'PDF', $formonum, $formgnum), CAM::PDF::Node->new('label', 'Text', $formonum, $formgnum), ], $formonum, $formgnum); } if (!$rdict->{Font}) { $rdict->{Font} = CAM::PDF::Node->new('dictionary', {}, $formonum, $formgnum); } my $fdict = $self->getValue($rdict->{Font}); # Search out font resources. This is a total kluge. # TODO: the right way to do this is to look for the DR # attribute in the form element or it's ancestors. for my $font (@rsrcs) { my $fobj = $self->dereference("/$font", 'All'); if (!$fobj) { die "Could not find resource /$font while preparing form field $key\n"; } $fdict->{$font} = CAM::PDF::Node->new('reference', $fobj->{objnum}, $formonum, $formgnum); } } } $filled++; } return $filled; } =item $doc->clearFormFieldTriggers($name, $name, ...) Disable any triggers set on data entry for the specified form field names. This is useful in the case where, for example, the data entry Javascript forbids punctuation and you want to prefill with a hyphenated word. If you don't clear the trigger, the prefill may not happen. =cut sub clearFormFieldTriggers { my ($self, @fieldnames) = @_; for my $fieldname (@fieldnames) { my $objnode = $self->getFormField($fieldname); if ($objnode) { if (exists $objnode->{value}->{value}->{AA}) { delete $objnode->{value}->{value}->{AA}; my $objnum = $objnode->{objnum}; if ($objnum) { $self->{changes}->{$objnum} = 1; } } } } return; } =item $doc->clearAnnotations() Remove all annotations from the document. If form fields are encountered, their text is added to the appropriate page. =cut sub clearAnnotations { my $self = shift; my $formrsrcs; my $root = $self->getRootDict(); if ($root->{AcroForm}) { my $acroform = $self->getValue($root->{AcroForm}); # Get the form resources if ($acroform->{DR}) { $formrsrcs = $self->getValue($acroform->{DR}); } # Kill off the forms $self->deleteObject($root->{AcroForm}->{value}); delete $root->{AcroForm}; } # Iterate through the pages, deleting annotations my $pages = $self->numPages(); for my $p (1..$pages) { my $page = $self->getPage($p); if ($page->{Annots}) { $self->addPageResources($p, $formrsrcs); my $annotsarray = $self->getValue($page->{Annots}); delete $page->{Annots}; for my $annotref (@{$annotsarray}) { my $annot = $self->getValue($annotref); if ((ref $annot) ne 'HASH') { die 'Internal error: annotation is not a dictionary'; } # Copy all text field values into the page, if present if ($annot->{Subtype} && $annot->{Subtype}->{value} eq 'Widget' && $annot->{FT} && $annot->{FT}->{value} eq 'Tx' && $annot->{AP}) { my $ap = $self->getValue($annot->{AP}); my $rect = $self->getValue($annot->{Rect}); my $x = $self->getValue($rect->[0]); my $y = $self->getValue($rect->[1]); if ($ap->{N}) { my $n = $self->dereference($ap->{N}->{value})->{value}; my $content = $self->decodeOne($n, 0); if (!$content) { die 'Internal error: expected a content stream from the form copy'; } $content =~ s/ \bre(\s+)f\b /re$1n/gxms; $content = "q 1 0 0 1 $x $y cm\n$content Q\n"; $self->appendPageContent($p, $content); $self->addPageResources($p, $self->getValue($n->{value}->{Resources})); } } $self->deleteObject($annotref->{value}); } } } # kill off the annotation dependencies $self->cleanse(); return; } =item $doc->previousRevision() If this PDF was previously saved in append mode (that is, if C was not invoked on it), return a new instance representing that previous version. Otherwise return void. If this is an encrypted PDF, this method assumes that previous revisions were encrypted with the same password, which may be an incorrect assumption. =cut sub previousRevision { my $self = shift; my $content = \$self->{content}; return if !${$content}; # already wiped... # Figure out line end character my ($lineend) = ${$content} =~ m/ (.)%%EOF.*?\z /xms; return if !$lineend; # Corrupt PDF: Cannot find the end-of-file marker my $eof = $lineend.'%%EOF'; my $i = rindex ${$content}, $eof; my $j = rindex ${$content}, $eof, $i-1; return if $j < 0; # just one revision my $prev_content = (substr ${$content}, 0, $j) . $eof . $lineend; # assume the passwords were the same in the previous rev my ($opass, $upass, @perms) = $self->getPrefs; return __PACKAGE__->new($prev_content, $opass, $upass); } =item $doc->allRevisions() Accumulate CAM::PDF instances returned by C until there are no more previous revisions. Returns a list of instances from newest to oldest including this instance as the newest. =cut sub allRevisions { my ($self) = @_; my @revs; for (my $pdf = $self; $pdf; $pdf = $pdf->previous_revision) { ## no critic(ProhibitCStyleForLoops) push @revs, $pdf; } return @revs; } ################################################################################ =back =head2 Document Writing =over =item $doc->preserveOrder() Try to recreate the original document as much as possible. This may help in recreating documents which use undocumented tricks of saving font information in adjacent objects. =cut sub preserveOrder { # Call this to record the order of the objects in the original file # If called, then any new file will try to preserve the original order my $self = shift; my $x = $self->{xref}; # shorthand $self->{order} = [sort {$x->{$a} <=> $x->{$b}} grep {!ref $x->{$_}} keys %{$x}]; return; } =item $doc->isLinearized() Returns a boolean indicating whether this PDF is linearized (aka "optimized"). =cut sub isLinearized { my $self = shift; my $first; if (exists $self->{order}) { $first = $self->{order}->[0]; } else { my $x = $self->{xref}; # shorthand ($first) = sort {$x->{$a} <=> $x->{$b}} grep {!ref $x->{$_}} keys %{$x}; } my $linearized; # false my $objnode = $self->dereference($first); if ($objnode && $objnode->{value}->{type} eq 'dictionary') { if (exists $objnode->{value}->{value}->{Linearized}) { $linearized = $self; # true } } return $linearized; } =item $doc->delinearize() I Undo the tweaks used to make the document 'optimized'. This function is automatically called on every save or output since this library does not yet support linearized documents. =cut sub delinearize { my $self = shift; return if ($self->{delinearized}); # Turn off Linearization, if set my $first; if (exists $self->{order}) { $first = $self->{order}->[0]; } else { my $x = $self->{xref}; # shorthand ($first) = sort {$x->{$a} <=> $x->{$b}} grep {!ref $x->{$_}} keys %{$x}; } my $objnode = $self->dereference($first); if ($objnode->{value}->{type} eq 'dictionary') { if (exists $objnode->{value}->{value}->{Linearized}) { $self->deleteObject($first); } } $self->{delinearized} = 1; return; } =item $doc->clean() Cache all parts of the document and throw away it's old structure. This is useful for writing PDFs anew, instead of simply appending changes to the existing documents. This is called by cleansave() and cleanoutput(). =cut sub clean { my $self = shift; # Make sure to extract everything before we wipe the old version $self->cacheObjects(); $self->delinearize(); # Update the ID number to make this document distinct from the original. # If there is already an ID, only the second half is changed $self->createID(); # Mark everything changed %{$self->{changes}} = ( %{$self->{changes}}, map { $_ => 1 } keys %{$self->{xref}}, ); # Mark everything new %{$self->{versions}} = ( %{$self->{versions}}, map { $_ => 0 } keys %{$self->{xref}}, ); $self->{xref} = {}; delete $self->{endxref}; $self->{startxref} = 0; $self->{content} = q{}; $self->{contentlength} = 0; my $trailer = $self->{trailer}; delete $trailer->{Prev}; delete $trailer->{XRefStm}; if (exists $trailer->{Type} && $trailer->{Type}->{value} eq 'XRef') { delete $trailer->{Type}; delete $trailer->{Size}; delete $trailer->{Index}; delete $trailer->{W}; delete $trailer->{Length}; delete $trailer->{L}; delete $trailer->{StreamData}; delete $trailer->{Filter}; delete $trailer->{F}; delete $trailer->{DecodeParms}; delete $trailer->{DP}; } return; } =item $doc->needsSave() Returns a boolean indicating whether the save() method needs to be called. Like save(), this has nothing to do with whether the document has been saved to disk, but whether the in-memory representation of the document has been serialized. =cut sub needsSave { my $self = shift; return 0 != keys %{$self->{changes}}; } =item $doc->save() Serialize the document into a single string. All changed document elements are normalized, and a new index and an updated trailer are created. This function operates solely in memory. It DOES NOT write the document to a file. See the output() function for that. =cut sub save { my $self = shift; if (!$self->needsSave()) { return $self; } $self->delinearize(); delete $self->{endxref}; if (!$self->{content}) { $self->{content} = '%PDF-' . $self->{pdfversion} . "\n%\217\n"; } my %allobjs = (%{$self->{changes}}, %{$self->{xref}}); my @objects = sort {$a<=>$b} keys %allobjs; if ($self->{order}) { # Sort in the order in $self->{order} array, with the rest later # in objnum order my %o; my $n = @{$self->{order}}; for my $i (0 .. $n-1) { $o{$self->{order}->[$i]} = $i; } @objects = map {$_->[1]} sort {$a->[0] <=> $b->[0]} map {[$o{$_} || $_+$n, $_]} @objects; } delete $self->{order}; my %newxref; my $offset = length $self->{content}; for my $key (@objects) { next if (!$self->{changes}->{$key}); $newxref{$key} = $offset; #print "Writing object $key\n"; my $obj = $self->writeObject($key); $self->{content} .= $obj; $offset += length $obj; $self->{xref}->{$key} = $newxref{$key}; delete $self->{changes}->{$key}; } if ($self->{content} !~ m/ [\r\n] \z /xms) { $self->{content} .= "\n"; } my $startxref = length $self->{content}; # Append the new xref $self->{content} .= "xref\n"; my %blocks = ( 0 => "0000000000 65535 f \n", ); for my $key (keys %newxref) { $blocks{$key} = sprintf "%010d %05d n \n", $newxref{$key}, $self->{versions}->{$key}; } # If there is only one version of the document, there must be no # holes in the xref. Test for versions by checking if there's already an xref. # If clean() has been called, it will be absent if (!$self->{startxref}) { # Fill in holes my $prevfreeblock = 0; for my $key (reverse 0 .. $self->{maxobj}-1) { if (!exists $blocks{$key}) { # Add an entry to the free list # On $key == 0, this blows away the above definition of # the head of the free block list, but that's no big deal. $blocks{$key} = sprintf "%010d %05d f \n", $prevfreeblock, ($key == 0 ? 65_535 : 1); $prevfreeblock = $key; } } } my $currblock = q{}; my $currnum = 0; my $currstart = 0; my @blockkeys = sort {$a<=>$b} keys %blocks; for my $i (0 .. $#blockkeys) { my $key = $blockkeys[$i]; $currblock .= $blocks{$key}; $currnum++; if ($i == $#blockkeys || $key+1 < $blockkeys[$i+1]) { $self->{content} .= "$currstart $currnum\n$currblock"; if ($i < $#blockkeys) { $currblock = q{}; $currnum = 0; $currstart = $blockkeys[$i+1]; } } } # Append the new trailer $self->{trailer}->{Size} = CAM::PDF::Node->new('number', $self->{maxobj} + 1); if ($self->{startxref}) { $self->{trailer}->{Prev} = CAM::PDF::Node->new('number', $self->{startxref}); } $self->{content} .= "trailer\n" . $self->writeAny(CAM::PDF::Node->new('dictionary', $self->{trailer})) . "\n"; # Append the new startxref $self->{content} .= "startxref\n$startxref\n"; $self->{startxref} = $startxref; # Append EOF $self->{content} .= "%%EOF\n"; $self->{contentlength} = length $self->{content}; return $self; } =item $doc->cleansave() Call the clean() function, then call the save() function. =cut sub cleansave { my $self = shift; $self->clean(); return $self->save(); } =item $doc->output($filename) =item $doc->output() Save the document to a file. The save() function is called first to serialize the data structure. If no filename is specified, or if the filename is '-', the document is written to standard output. Note: it is the responsibility of the application to ensure that the PDF document has either the Modify or Add permission. You can do this like the following: if ($self->canModify()) { $self->output($outfile); } else { die "The PDF file denies permission to make modifications\n"; } =cut sub output { my $self = shift; my $file = shift; if (!defined $file) { $file = q{-}; } $self->save(); if ($file eq q{-}) { binmode STDOUT; ##no critic(RequireCheckedSysCalls) print $self->{content}; } else { open my $fh, '>', $file or die "Failed to write file $file\n"; binmode $fh or die "Failed to set binmode for file $file\n"; print {$fh} $self->{content}; close $fh or die "Failed to write file $file\n"; } return $self; } =item $doc->cleanoutput($file) =item $doc->cleanoutput() Call the clean() function, then call the output() function to write a fresh copy of the document to a file. =cut sub cleanoutput { my $self = shift; my $file = shift; $self->clean(); return $self->output($file); } =item $doc->writeObject($objnum) Return the serialization of the specified object. =cut sub writeObject { my $self = shift; my $objnum = shift; return "$objnum 0 " . $self->writeAny($self->dereference($objnum)); } =item $doc->writeString($string) Return the serialization of the specified string. Works on normal or hex strings. If encryption is desired, the string should be encrypted before being passed here. =cut sub writeString { my $pkg_or_doc = shift; my $string = shift; # Divide the string into manageable pieces, which will be # re-concatenated with "\" continuation characters at the end of # their lines # -- This code used to do concatenation by juxtaposing multiple # -- "()" compenents, but this breaks many PDF # -- implementations (incl Acrobat5 and XPDF) # Break the string into pieces of length $maxstr. Note that an # artifact of this usage of split returns empty strings between # the fragments, so grep them out my $maxstr = (ref $pkg_or_doc) ? $pkg_or_doc->{maxstr} : $CAM::PDF::MAX_STRING; my @strs = grep {$_ ne q{}} split /(.{$maxstr}})/xms, $string; for (@strs) { s/ \\ /\\\\/gxms; # escape escapes -- this line must come first! s/ ([()]) /\\$1/gxms; # escape parens s/ \n /\\n/gxms; s/ \r /\\r/gxms; s/ \t /\\t/gxms; s/ \f /\\f/gxms; # TODO: handle backspace char #s/ ??? /\\b/gxms; } return '(' . (join "\\\n", @strs) . ')'; } =item $doc->writeAny($node) Returns the serialization of the specified node. This handles all Node types, including object Nodes. =cut sub writeAny { my $self = shift; my $objnode = shift; if (! ref $objnode) { die 'Not a ref'; } my $key = $objnode->{type}; my $val = $objnode->{value}; my $objnum = $objnode->{objnum}; my $gennum = $objnode->{gennum}; return $key eq 'string' ? $self->writeString($self->{crypt}->encrypt($self, $val, $objnum, $gennum)) : $key eq 'hexstring' ? '<' . (unpack 'H*', $self->{crypt}->encrypt($self, $val, $objnum, $gennum)) . '>' : $key eq 'number' ? "$val" : $key eq 'reference' ? "$val 0 R" # TODO: lookup the gennum and use it instead of 0 (?) : $key eq 'boolean' ? $val : $key eq 'null' ? 'null' : $key eq 'label' ? "/$val" : $key eq 'array' ? $self->_writeArray($objnode) : $key eq 'dictionary' ? $self->_writeDictionary($objnode) : $key eq 'object' ? $self->_writeObject($objnode) : die "Unknown key '$key' in writeAny (objnum ".($objnum||'').")\n"; } sub _writeArray { my $self = shift; my $objnode = shift; my $val = $objnode->{value}; if (@{$val} == 0) { return '[ ]'; } my $str = q{}; my @strs; for (@{$val}) { my $newstr = $self->writeAny($_); if ($str ne q{}) { if ($self->{maxstr} < length $str . $newstr) { push @strs, $str; $str = q{}; } else { $str .= q{ }; } } $str .= $newstr; } if (@strs > 0) { $str = join "\n", @strs, $str; } return '[ ' . $str . ' ]'; } sub _writeDictionary { my $self = shift; my $objnode = shift; my $val = $objnode->{value}; my $str = q{}; my @strs; if (exists $val->{Type}) { $str .= ($str ? q{ } : q{}) . '/Type ' . $self->writeAny($val->{Type}); } if (exists $val->{Subtype}) { $str .= ($str ? q{ } : q{}) . '/Subtype ' . $self->writeAny($val->{Subtype}); } for my $dictkey (sort keys %{$val}) { next if ($dictkey eq 'Type'); next if ($dictkey eq 'Subtype'); next if ($dictkey eq 'StreamDataDone'); if ($dictkey eq 'StreamData') { if (exists $val->{StreamDataDone}) { delete $val->{StreamDataDone}; next; } # This is a stream way down deep in the data... Probably due to a solidifyObject # First, try to handle the easy case: if (2 == scalar keys %{$val} && (exists $val->{Length} || exists $val->{L})) { my $binary = $val->{$dictkey}->{value}; my $len = length $binary; my $unpacked = unpack 'H' . $len*2, $binary; return $self->writeAny(CAM::PDF::Node->new('hexstring', $unpacked, $objnode->{objnum}, $objnode->{gennum})); } # TODO: Handle more complex streams ... die "This stream is too complex for me to write... Giving up\n"; next; ## no critic(ControlStructures::ProhibitUnreachableCode) } my $newstr = "/$dictkey " . $self->writeAny($val->{$dictkey}); if ($str ne q{}) { if ($self->{maxstr} < length $str . $newstr) { push @strs, $str; $str = q{}; } else { $str .= q{ }; } } $str .= $newstr; } if (@strs > 0) { $str = join "\n", @strs, $str; } return '<< ' . $str . ' >>'; } sub _writeObject { my $self = shift; my $objnode = shift; my $val = $objnode->{value}; if (! ref $val) { die "Obj data is not a ref! ($val)"; } my $stream; if ($val->{type} eq 'dictionary' && exists $val->{value}->{StreamData}) { $stream = $val->{value}->{StreamData}->{value}; my $length = length $stream; my $l = $val->{value}->{Length} || $val->{value}->{L}; my $oldlength = $self->getValue($l); if ($length != $oldlength) { $val->{value}->{Length} = CAM::PDF::Node->new('number', $length, $objnode->{objnum}, $objnode->{gennum}); delete $val->{value}->{L}; } $val->{value}->{StreamDataDone} = 1; } my $str = $self->writeAny($val); if (defined $stream) { $stream = $self->{crypt}->encrypt($self, $stream, $objnode->{objnum}, $objnode->{gennum}); $str .= "\nstream\n" . $stream . 'endstream'; } return "obj\n$str\nendobj\n"; } ###################################################################### =back =head2 Document Traversing =over =item $doc->traverse($dereference, $node, $callbackfunc, $callbackdata) Recursive traversal of a PDF data structure. In many cases, it's useful to apply one action to every node in an object tree. The routines below all use this traverse() function. One of the most important parameters is the first: the C<$dereference> boolean. If true, the traversal follows reference Nodes. If false, it does not descend into reference Nodes. Optionally, you can pass in a hashref as a final argument to reduce redundant traversing across multiple calls. Just pass in an empty hashref the first time and pass in the same hashref each time. See C for an example. =cut sub traverse { my $self = shift; my $deref = shift; my $startnode = shift; my $func = shift; my $funcdata = shift; my $traversed = shift || {}; my @stack = ($startnode); my $i = 0; while ($i < @stack) { my $objnode = $stack[$i++]; $self->$func($objnode, $funcdata); my $type = $objnode->{type}; my $val = $objnode->{value}; if ($type eq 'object') { # Shrink stack periodically splice @stack, 0, $i; $i = 0; # Mark object done if ($objnode->{objnum}) { $traversed->{$objnode->{objnum}} = 1; } } push @stack, $type eq 'dictionary' ? values %{$val} : $type eq 'array' ? @{$val} : $type eq 'object' ? $val : $type eq 'reference' && $deref && !exists $traversed->{$val} ? $self->dereference($val) : (); } return; } # decodeObject and decodeAll differ from each other like this: # # decodeObject JUST decodes a single stream directly below the object # specified by the objnum # # decodeAll descends through a whole object tree (following # references) decoding everything it can find =item $doc->decodeObject($objectnum) I Remove any filters (like compression, etc) from a data stream indicated by the object number. =cut sub decodeObject { my $self = shift; my $objnum = shift; my $objnode = $self->dereference($objnum); $self->decodeOne($objnode->{value}, 1); return; } =item $doc->decodeAll($object) I Remove any filters from any data stream in this object or any object referenced by it. =cut sub decodeAll { my $self = shift; my $objnode = shift; $self->traverse(1, $objnode, \&decodeOne, 1); return; } =item $doc->decodeOne($object) =item $doc->decodeOne($object, $save?) I Remove any filters from an object. The boolean flag C<$save> (defaults to false) indicates whether this removal should be permanent or just this once. If true, the function returns success or failure. If false, the function returns the defiltered content. =cut sub decodeOne { my $self = shift; my $objnode = shift; my $save = shift || 0; my $changed = 0; my $streamdata = q{}; if ($objnode->{type} ne 'dictionary') { return $save ? $changed : $streamdata; } my $dict = $objnode->{value}; $streamdata = $dict->{StreamData}->{value}; #warn 'decoding thing ' . ($dict->{StreamData}->{objnum} || '(unknown)') . "\n"; # Don't work on {F} since that's too common a word #my $filtobj = $dict->{Filter} || $dict->{F}; my $filtobj = $dict->{Filter}; if (defined $filtobj) { my @filters = $filtobj->{type} eq 'array' ? @{$filtobj->{value}} : ($filtobj); my $parmobj = $dict->{DecodeParms} || $dict->{DP}; my @parms; if ($parmobj) { @parms = $parmobj->{type} eq 'array' ? @{$parmobj->{value}} : ($parmobj); } for my $filter (@filters) { if ($filter->{type} ne 'label') { warn "All filter names must be labels\n"; require Data::Dumper; warn Data::Dumper->Dump([$filter], ['Filter']); next; } my $filtername = $filter->{value}; # Make sure this is not an encrypt dict next if ($filtername eq 'Standard'); my $filt; eval { require Text::PDF::Filter; my $pkg = 'Text::PDF::' . ($filterabbrevs{$filtername} || $filtername); $filt = $pkg->new; 1; }; if (!$filt) { warn "Failed to open filter $filtername (Text::PDF::$filtername)\n"; last; } my $oldlength = length $streamdata; { # Hack to turn off warnings in Filter library no warnings; ## no critic(TestingAndDebugging::ProhibitNoWarnings) $streamdata = $filt->infilt($streamdata, 1); } $self->fixDecode(\$streamdata, $filtername, shift @parms); my $length = length $streamdata; #warn "decoded length: $oldlength -> $length\n"; if ($save) { my $objnum = $dict->{StreamData}->{objnum}; my $gennum = $dict->{StreamData}->{gennum}; if ($objnum) { $self->{changes}->{$objnum} = 1; } $changed = 1; $dict->{StreamData}->{value} = $streamdata; if ($length != $oldlength) { $dict->{Length} = CAM::PDF::Node->new('number', $length, $objnum, $gennum); delete $dict->{L}; } # These changes should happen later, but I prefer to do it # redundantly near the changes hash delete $dict->{Filter}; delete $dict->{F}; delete $dict->{DecodeParms}; delete $dict->{DP}; } } } #else { use Data::Dumper; print Dumper($dict); } return $save ? $changed : $streamdata; } =item $doc->fixDecode($streamdata, $filter, $params) This is a utility method to do any tweaking after removing the filter from a data stream. =cut sub fixDecode { my $self = shift; my $streamdata = shift; my $filter = shift; my $parms = shift; if (!$parms) { return; } my $d = $self->getValue($parms); if (!$d || (ref $d) ne 'HASH') { die "DecodeParms must be a dictionary.\n"; } if ($filter eq 'FlateDecode' || $filter eq 'Fl' || $filter eq 'LZWDecode' || $filter eq 'LZW') { my $p = exists $d->{Predictor} ? $self->getValue($d->{Predictor}) : 1; if ($p == 2) { $self->_fixDecodeTIFF($streamdata, $d); } elsif ($p >= 10) { $self->_fixDecodePNG($streamdata, $d); } # else no fix needed } return; } sub _fixDecodeTIFF { my $self = shift; my $streamdata = shift; my $d = shift; die 'The TIFF image predictor is not supported'; } sub _fixDecodePNG { my $self = shift; my $streamdata = shift; my $d = shift; # PNG differencing algorithms http://www.w3.org/TR/PNG-Filters.html my $colors = exists $d->{Colors} ? $self->getValue($d->{Colors}) : 1; my $columns = exists $d->{Columns} ? $self->getValue($d->{Columns}) : 1; my $bpc = exists $d->{BitsPerComponent} ? $self->getValue($d->{BitsPerComponent}) : 8; if (0 != $bpc % 8) { die 'Color samples that are not multiples of 8 bits are not supported'; } my $width = 1 + $colors * $columns * ($bpc >> 3); # size of a row in bytes, including the 1-byte predictor my $len = length ${$streamdata}; if (0 != $len % $width) { die 'The stream data is not evenly divisible into rows'; } my $rows = $len / $width; my $newdata = q{}; my $prev_row = [(0) x ($width - 1)]; for my $irow (0 .. $rows - 1) { my ($row_pred, @row) = unpack 'C' . $width, substr ${$streamdata}, $irow * $width, $width; if ($row_pred == 1) { ##no critic (IfElse) for my $i (1 .. $width-2) { $row[$i] = ($row[$i-1] + $row[$i]) & 0xff; } } elsif ($row_pred == 2) { for my $i (0 .. $width-2) { $row[$i] = ($prev_row->[$i] + $row[$i]) & 0xff; } } elsif ($row_pred == 3) { $row[0] = (($prev_row->[0] >> 1) + $row[0]) & 0xff; for my $i (1 .. $width-2) { $row[$i] = ((($row[$i-1] + $prev_row->[$i]) >> 1) + $row[$i]) & 0xff; } } elsif ($row_pred == 4) { # Paeth reduces to up for first column $row[0] = ($prev_row->[0] + $row[0]) & 0xff; for my $i (1 .. $width-2) { my $a = $row[$i-1]; my $b = $prev_row->[$i]; my $c = $prev_row->[$i-1]; my $p = $a + $b - $c; my $pa = abs $p - $a; my $pb = abs $p - $b; my $pc = abs $p - $c; my $paeth = $pa <= $pb && $pa <= $pc ? $a : $pb <= $pc ? $b : $c; $row[$i] = ($paeth + $row[$i]) & 0xff; } } $newdata .= pack 'C*', @row; $prev_row = \@row; } ${$streamdata} = $newdata; return; } =item $doc->encodeObject($objectnum, $filter) Apply the specified filter to the object. =cut sub encodeObject { my $self = shift; my $objnum = shift; my $filtername = shift; my $objnode = $self->dereference($objnum); $self->encodeOne($objnode->{value}, $filtername); return; } =item $doc->encodeOne($object, $filter) Apply the specified filter to the object. =cut sub encodeOne ## no critic(Subroutines::ProhibitExcessComplexity) { my $self = shift; my $objnode = shift; my $filtername = shift; my $changed = 0; if ($objnode->{type} eq 'dictionary') { my $dict = $objnode->{value}; my $objnum = $objnode->{objnum}; my $gennum = $objnode->{gennum}; if (! exists $dict->{StreamData}) { #warn "Object does not contain a Stream to encode\n"; return 0; } if ($filtername eq 'LZWDecode' || $filtername eq 'LZW') { $filtername = 'FlateDecode'; warn "LZWDecode filter not supported for encoding. Using $filtername instead\n"; } my $filt = eval { require Text::PDF::Filter; my $pkg = "Text::PDF::$filtername"; $pkg->new; }; if (!$filt) { warn "Failed to open filter $filtername (Text::PDF::$filtername)\n"; return 0; } my $l = $dict->{Length} || $dict->{L}; my $oldlength = $self->getValue($l); $dict->{StreamData}->{value} = $filt->outfilt($dict->{StreamData}->{value}, 1); my $length = length $dict->{StreamData}->{value}; if (! defined $oldlength || $length != $oldlength) { if (defined $l && $l->{type} eq 'reference') { my $lenobj = $self->dereference($l->{value})->{value}; if ($lenobj->{type} ne 'number') { die "Expected length to be a reference to an object containing a number while encoding\n"; } $lenobj->{value} = $length; } elsif (!defined $l || $l->{type} eq 'number') { $dict->{Length} = CAM::PDF::Node->new('number', $length, $objnum, $gennum); delete $dict->{L}; } else { die "Unexpected type \"$l->{type}\" for Length while encoding.\n" . "(expected \"number\" or \"reference\")\n"; } } # Record the filter my $newfilt = CAM::PDF::Node->new('label', $filtername, $objnum, $gennum); my $f = $dict->{Filter} || $dict->{F}; if (!defined $f) { $dict->{Filter} = $newfilt; delete $dict->{F}; } elsif ($f->{type} eq 'label') { $dict->{Filter} = CAM::PDF::Node->new('array', [ $newfilt, $f, ], $objnum, $gennum); delete $dict->{F}; } elsif ($f->{type} eq 'array') { unshift @{$f->{value}}, $newfilt; } else { die "Confused: Filter type is \"$f->{type}\", not the\n" . "expected \"array\" or \"label\"\n"; } if ($dict->{DecodeParms} || $dict->{DP}) { die "Insertion of DecodeParms not yet supported...\n"; } if ($objnum) { $self->{changes}->{$objnum} = 1; } $changed = 1; } return $changed; } =item $doc->setObjNum($object, $objectnum, $gennum) Descend into an object and change all of the INTERNAL object number flags to a new number. This is just for consistency of internal accounting. =cut sub setObjNum { my $self = shift; my $objnode = shift; my $objnum = shift; my $gennum = shift; $self->traverse(0, $objnode, \&_setObjNumCB, [$objnum, $gennum]); return; } # PRIVATE FUNCTION sub _setObjNumCB { my $self = shift; my $objnode = shift; my $nums = shift; $objnode->{objnum} = $nums->[0]; $objnode->{gennum} = $nums->[1]; return; } =item $doc->getRefList($object) I Return an array all of objects referred to in this object. =cut sub getRefList { my $self = shift; my $objnode = shift; my $list = {}; $self->traverse(1, $objnode, \&_getRefListCB, $list); return (sort keys %{$list}); } # PRIVATE FUNCTION sub _getRefListCB { my $self = shift; my $objnode = shift; my $list = shift; if ($objnode->{type} eq 'reference') { $list->{$objnode->{value}} = 1; } return; } =item $doc->changeRefKeys($object, $hashref) I Renumber all references in an object. =cut sub changeRefKeys { my $self = shift; my $objnode = shift; my $newrefkeys = shift; my $traversed = shift; # optional my $follow = shift || 0; # almost always false $self->traverse($follow, $objnode, \&_changeRefKeysCB, $newrefkeys, $traversed); return; } # PRIVATE FUNCTION sub _changeRefKeysCB { my $self = shift; my $objnode = shift; my $newrefkeys = shift; if ($objnode->{type} eq 'reference') { if (exists $newrefkeys->{$objnode->{value}}) { $objnode->{value} = $newrefkeys->{$objnode->{value}}; } } return; } =item $doc->abbrevInlineImage($object) Contract all image keywords to inline abbreviations. =cut sub abbrevInlineImage { my $self = shift; my $objnode = shift; $self->traverse(0, $objnode, \&_abbrevInlineImageCB, {reverse %inlineabbrevs}); return; } =item $doc->unabbrevInlineImage($object) Expand all inline image abbreviations. =cut sub unabbrevInlineImage { my $self = shift; my $objnode = shift; $self->traverse(0, $objnode, \&_abbrevInlineImageCB, \%inlineabbrevs); return; } # PRIVATE FUNCTION sub _abbrevInlineImageCB { my $self = shift; my $objnode = shift; my $convert = shift; if ($objnode->{type} eq 'label') { my $new = $convert->{$objnode->{value}}; if (defined $new) { $objnode->{value} = $new; } } elsif ($objnode->{type} eq 'dictionary') { my $dict = $objnode->{value}; for my $key (keys %{$dict}) { my $new = $convert->{$key}; if (defined $new && $new ne $key) { $dict->{$new} = $dict->{$key}; delete $dict->{$key}; } } } return; } =item $doc->changeString($object, $hashref) Alter all instances of a given string. The hashref is a dictionary of from-string and to-string. If the from-string looks like C then it is interpreted as a Perl regular expression and is eval'ed. Otherwise the search-and-replace is literal. =cut sub changeString { my $self = shift; my $objnode = shift; my $changelist = shift; $self->traverse(0, $objnode, \&_changeStringCB, $changelist); return; } # PRIVATE FUNCTION sub _changeStringCB { my $self = shift; my $objnode = shift; my $changelist = shift; if ($objnode->{type} eq 'string') { for my $key (keys %{$changelist}) { if ($key =~ m/ \A regex[(](.*)[)] \z /xms) { my $regex = $1; my $res; my $eval_result = eval { $res = ($objnode->{value} =~ s/ $regex /$changelist->{$key}/gxms); 1; }; if (!$eval_result) { die "Failed regex search/replace: $EVAL_ERROR\n"; } if ($res && $objnode->{objnum}) { $self->{changes}->{$objnode->{objnum}} = 1; } } else { if ($objnode->{value} =~ s/ $key /$changelist->{$key}/gxms && $objnode->{objnum}) { $self->{changes}->{$objnode->{objnum}} = 1; } } } } return; } ###################################################################### =back =head2 Utility functions =over =item $doc->rangeToArray($min, $max, $list...) Converts string lists of numbers to an array. For example, CAM::PDF->rangeToArray(1, 15, '1,3-5,12,9', '14-', '8 - 6, -2'); becomes (1,3,4,5,12,9,14,15,8,7,6,1,2) =cut sub rangeToArray { my ($pkg_or_doc, $min, $max, @range_parts) = @_; my @in_array = grep {defined $_} @range_parts; for (@in_array) # modify in place { s/ [^\d\-,] //gxms; # clean } # split on numbers and ranges @in_array = map {m/ ([\d\-]+) /gxms} @in_array; my @out_array; if (@in_array == 0) { @out_array = $min .. $max; } else { for (@in_array) { if (m/ (\d*)-(\d*) /xms) { my $aa = $1; my $bb = $2; if ($aa eq q{}) { $aa = $min-1; } if ($bb eq q{}) { $bb = $max+1; } # Check if these are possible next if ($aa < $min && $bb < $min); next if ($aa > $max && $bb > $max); if ($aa < $min) { $aa = $min; } if ($bb < $min) { $bb = $min; } if ($aa > $max) { $aa = $max; } if ($bb > $max) { $bb = $max; } if ($aa > $bb) { push @out_array, reverse $bb .. $aa; } else { push @out_array, $aa .. $bb; } } elsif ($_ >= $min && $_ <= $max) { push @out_array, $_; } } } return @out_array; } =item $doc->trimstr($string) Used solely for debugging. Trims a string to a max of 40 characters, handling nulls and non-Unix line endings. =cut sub trimstr ## no critic (Unpack) { my $pkg_or_doc = shift; my $s = $_[0]; my $pos = pos $_[0]; $pos ||= 0; if (!defined $s || $s eq q{}) { $s = '(empty)'; } elsif (length $s > 40) { $s = (substr $s, $pos, 40) . '...'; } $s =~ s/ \r /^M/gxms; return $pos . q{ } . $s . "\n"; } =item $doc->copyObject($node) Clones a node via Data::Dumper and eval(). =cut sub copyObject { my $self = shift; my $objnode = shift; # replace $objnode with a copy of itself require Data::Dumper; my $d = Data::Dumper->new([$objnode],['objnode']); $d->Purity(1)->Indent(0); $objnode = eval $d->Dump(); ## no critic(ProhibitStringyEval) return $objnode; } =item $doc->cacheObjects() Parses all object Nodes and stores them in the cache. This is useful for cases where you intend to do some global manipulation and want all of the data conveniently in RAM. =cut sub cacheObjects { my $self = shift; for my $key (keys %{$self->{xref}}) { if (!exists $self->{objcache}->{$key}) { $self->{objcache}->{$key} = $self->dereference($key); } } return; } =item $doc->asciify($string) Helper class/instance method to massage a string, cleaning up some non-ASCII problems. This is a very incomplete list. Specifically: =over =item f-i ligatures =item (R) symbol =back =cut sub asciify { my $pkg_or_doc = shift; my $R_string = shift; # scalar reference ## Heuristics: fix up some odd text characters: # f-i ligature ${$R_string} =~ s/ \223 /fi/gxms; # Registered symbol ${$R_string} =~ s/ \xae /(R)/gxms; return $pkg_or_doc; } 1; __END__ =back =head1 COMPATIBILITY This library was primarily developed against the 3rd edition of the reference (PDF v1.4) with several important updates from 4th edition (PDF v1.5). This library focuses most deeply on PDF v1.2 features. Nonetheless, it should be forward and backward compatible in the majority of cases. =head1 PERFORMANCE This module is written with good speed and flexibility in mind, often at the expense of memory consumption. Entire PDF documents are typically slurped into RAM. As an example, simply calling C (the 13.5 MB Adobe PDF Reference V1.5 document) pushes Perl to consume 89 MB of RAM on my development machine. =head1 SEE ALSO There are several other PDF modules on CPAN. Below is a brief description of a few of them. If these comments are out of date, please inform me. =over =item PDF::API2 As of v0.46.003, LGPL license. This is the leading PDF library, in my opinion. Excellent text and font support. This is the highest level library of the bunch, and is the most complete implementation of the Adobe PDF spec. The author is amazingly responsive and patient. =item Text::PDF As of v0.25, Artistic license. Excellent compression support (CAM::PDF cribs off this Text::PDF feature). This has not been developed since 2003. =item PDF::Reuse As of v0.32, Artistic/GPL license, like Perl itself. This library is not object oriented, so it can only process one PDF at a time, while storing all data in global variables. I'm not fond of it, but it's quite popular, so don't take my word for it! =back CAM::PDF is the only one of these that has regression tests. Currently, CAM::PDF has test coverage of about 50%, as reported by C. Additionally, PDFLib is a commercial package not on CPAN (L). It is a C-based library with a Perl interface. It is designed for PDF creation, not for reuse. =head1 INTERNALS The data structure used to represent the PDF document is composed primarily of a hierarchy of Node objects. Every node in the document tree has this structure: type => value => objnum => gennum => where the depends on the , and is one of Type Value ---- ----- object Node stream byte string string byte string hexstring byte string number number reference integer (object number) boolean "true" | "false" label string array arrayref of Nodes dictionary hashref of (string => Node) null undef All of these except "stream" are directly related to the PDF data types of the same name. Streams are treated as special cases in this library since the have a non-general syntax and placement in the document body. Internally, streams are very much like strings, except that they have filters applied to them. All objects are referenced indirectly by their numbers, as defined in the PDF document. In all cases, the dereference() function should be used to deserialize objects into their internal representation. This function is also useful for looking up named objects in the page model metadata. Every node in the hierarchy contains its object and generation number. You can think of this as a sort of a pointer back to the root of each node tree. This serves in place of a "parent" link for every node, which would be harder to maintain. The PDF document itself is represented internally as a hash reference with many components, including the document content, the document metadata (index, trailer and root node), the object cache, and several other caches, in addition to a few assorted bookkeeping structures. The core of the document is represented in the object cache, which is only populated as needed, thus avoiding the overhead of parsing the whole document at read time. =head1 AUTHOR Chris Dolan This module was originally developed by me at Clotho Advanced Media Inc. Now I maintain it in my spare time. =head1 ACKNOWLEDGMENTS Thanks to all the people who have submitted bug reports over the years! I've belatedly started crediting people in the F file. Apologies to contributors I've overlooked... =cut CAM-PDF-1.60/lib/CAM/PDF000755000765000765 012203034032 13630 5ustar00chrischris000000000000CAM-PDF-1.60/lib/CAM/PDF/Content.pm000444000765000765 3355112203034032 15764 0ustar00chrischris000000000000package CAM::PDF::Content; use 5.006; use warnings; use strict; use Carp; use English qw(-no_match_vars); use CAM::PDF; use CAM::PDF::Node; our $VERSION = '1.60'; =for stopwords renderers unvalidated =head1 NAME CAM::PDF::Content - PDF page layout parser =head1 LICENSE Same as L =head1 SYNOPSIS use CAM::PDF; my $pdf = CAM::PDF->new($filename); my $contentTree = $pdf->getPageContentTree(4); $contentTree->validate() || die 'Syntax error'; print $contentTree->render('CAM::PDF::Renderer::Text'); $pdf->setPageContent(5, $contentTree->toString()); =head1 DESCRIPTION This class is used to manipulate the layout commands for a single page of PDF. The page content is passed as a scalar and parsed according to Adobe's PDF Reference 3rd edition (for PDF v1.4). All of the commands from Appendix A of that document are parsed and understood. Much of the content object's functionality is wrapped up in renderers that can be applied to it. See the canonical renderer, CAM::PDF::GS, and the render() method below for more details. =cut # Package globals: my %loaded; # keep track of eval'd renderers my %endings = ( q => 'Q', BT => 'ET', BDC => 'EMC', BMC => 'EMC', BX => 'EX', ); my $starts = join q{|}, map {quotemeta} keys %endings; my $ends = join q{|}, map {quotemeta} values %endings; sub _buildOpSyntax { %CAM::PDF::Content::ops = ( b => [], B => [], 'b*' => [], 'B*' => [], BDC => ['label','dictionary|label'], BI => ['image'], BMC => ['label'], BT => [], BX => [], c => ['number','number','number','number','number','number'], cm => ['number','number','number','number','number','number'], CS => ['label'], cs => ['label'], d => ['array','number'], d0 => ['number','number'], d1 => ['number','number','number','number','number','number'], Do => ['label'], DP => ['label','dictionary'], EI => ['end'], EMC => ['end'], ET => ['end'], EX => ['end'], F => [], f => [], 'f*' => [], G => ['number'], g => ['number'], gs => ['label'], h => [], i => ['number'], ID => ['end'], j => ['integer'], J => ['integer'], K => ['number','number','number','number'], k => ['number','number','number','number'], l => ['number','number'], m => ['number','number'], M => ['number'], MP => ['label'], n => [], q => [], Q => ['end'], re => ['number','number','number','number'], RG => ['number','number','number'], rg => ['number','number','number'], ri => ['...'], # not really variable, I just don't understand this one s => [], S => [], SC => ['...'], sc => ['...'], SCN => ['...'], scn => ['...'], sh => ['label'], 'T*' => [], Tc => ['number'], TD => ['number','number'], Td => ['number','number'], Tf => ['label','number'], TJ => ['array'], Tj => ['string'], TL => ['number'], Tm => ['number','number','number','number','number','number'], Tr => ['integer'], Ts => ['number'], Tw => ['number'], Tz => ['number'], v => ['number','number','number','number'], w => ['number'], W => [], 'W*' => [], y => ['number','number','number','number'], q{'} => ['string'], q{"} => ['number','number','string'], ); return; } =head1 FUNCTIONS =over =item $pkg->new($content) =item $pkg->new($content, $data) =item $pkg->new($content, $data, $verbose) Parse a scalar CONTENT containing PDF page layout content. Returns a parsed, but unvalidated, data structure. The DATA argument is a hash reference of contextual data that may be needed to work with content. This is only needed for toString() method (which needs C CAM::PDF object> to work with images) and the render methods, to which the DATA reference is passed verbatim. See the individual renderer modules for details about required elements. The VERBOSE boolean indicates whether the parser should Carp when it encounters problems. The default is false. =cut sub new { my $pkg = shift; my $content = shift; my $refs = shift; my $verbose = shift; my $self = bless { refs => $refs || {}, content => $content, blocks => [], verbose => $verbose, }, $pkg; return $self->parse(\$content); } =item $self->parse($contentref) This is intended to be called by the new() method. The argument should be a reference to the content scalar. It's passed by reference so it is never copied. =cut my $progress = 0; sub parse { my $self = shift; my $c = shift; $progress = 0; pos(${$c}) = 0; ## no critic(CodeLayout::ProhibitParensWithBuiltins) ${$c} =~ m/ \A \s+ /cgxms; # prime the regex my $result = $self->_parseBlocks($c, $self->{blocks}); if (!defined $result) { if ($self->{verbose}) { carp 'Parse failed'; } return; } if (${$c} =~ m/ \G\S /cgxms) { if ($self->{verbose}) { carp 'Trailing unparsed content: ' . CAM::PDF->trimstr(${$c}); } return; } return $self; } # Internal method # sub _parseBlocks { my $self = shift; my $c = shift; my $A_blocks = shift; my $end = shift; my @stack; while (${$c} =~ m/ \G.*\S /xms) { my $block = $self->_parseBlock($c, $end); if (!defined $block) { return; } if (!$block) { return $self; } if ($block->{type} eq 'block' || $block->{type} eq 'op') { push @{$block->{args}}, @stack; @stack = (); push @{$A_blocks}, $block; } else { push @stack, $block; } } if (@stack > 0) { if ($self->{verbose}) { carp 'Error: '.@stack.' unprocessed arguments'; } return; } return $self; } # Internal method # sub _parseBlock { my $self = shift; my $c = shift; my $end = shift; # Start a new block? if (${$c} =~ m/ \G($starts)\s* /ocgxms) { my $type = $1; my $blocks = []; if ($self->_parseBlocks($c, $blocks, $endings{$type})) { return _b('block', $type, $blocks); } else { return; } } # Balanced end to open block? if (defined $end && ${$c} =~ m/ \G$end\s* /cgxms) { return q{}; } # Unbalanced end? if (${$c} =~ m/ \G($ends)\s* /ocgxms) { my $op = $1; if ($self->{verbose}) { if ($end) { carp "Wrong block ending (expected '$end', got '$op')"; } else { carp "Unexpected block ending '$op'"; } } return; } # Inline image? if (${$c} =~ m/ \G BI \b /xms) { my $img = CAM::PDF->parseInlineImage($c); if (!$img) { if ($self->{verbose}) { carp 'Failed to parse inline image'; } return; } my $blockimage = _b('op', 'BI', _b('image', $img->{value})); return $blockimage; } # Non-block operand? =for referencecode ## This is the REAL list #if (${$c} =~ m/ \G( # [bBcdfFgGhijJkKlmMnsSvwWy\'\"]| # b\*|B\*|BDC|BI|d[01]|c[sm]|CS|Do|DP|f\*|gs|MP| # re|RG|rg|ri|sc|SC|scn|SCN|sh|T[cdDfJjLmrswz\*]|W\* # )\b\s* # /cgxms) =cut ## This is a cheat version of the above if (${$c} =~ m/ \G([A-Za-z\'\"][*\w]*)\s* /cgxms) ## no critic (ProhibitEnumeratedClasses,ProhibitEscapedMetacharacters) { my $op = $1; return _b('op', $op); } # If we get here, it's data instead of an operand my $node = CAM::PDF->parseAny($c); return _b($node->{type}, $node->{value}); } =item $self->validate() Returns a boolean if the parsed content tree conforms to the PDF specification. =cut sub validate ## no critic(Subroutines::ProhibitExcessComplexity) { my $self = shift; my $blocks = shift || $self->{blocks}; $self->_buildOpSyntax(); BLOCK: foreach my $block (@{$blocks}) { if ($block->{type} eq 'block') { return if (!$self->validate($block->{value})); } elsif ($block->{type} ne 'op') { if ($self->{verbose}) { carp 'Neither a block nor an op'; } return; } my $syntax = $CAM::PDF::Content::ops{$block->{name}}; if ($syntax) { if ($syntax->[0] && $syntax->[0] eq '...') { # variable args, skip next BLOCK; } elsif (@{$block->{args}} != @{$syntax}) { if ($self->{verbose}) { carp "Wrong number of arguments to '$block->{name}' (got ".@{$block->{args}}.' instead of '.@{$syntax}.')'; } return; } ARG: foreach my $i (0 .. $#{$syntax}) { my $arg = $block->{args}->[$i]; my $types = $syntax->[$i]; ARGTYPE_OPT: foreach my $type (split /[|]/xms, $types) { # These are the successful match cases next ARG if ($arg->{type} eq $type); next ARG if ($type eq 'integer' && $arg->{type} eq 'number' && $arg->{value} =~ m/ \A\d+\z /xms); next ARG if ($type eq 'string' && $arg->{type} eq 'hexstring'); } if ($self->{verbose}) { carp "Expected '$types' argument for '$block->{name}' (got $arg->{type})"; } return; } } } return $self; } =item $self->render($rendererclass) Traverse the content tree using the specified rendering class. See CAM::PDF::GS or CAM::PDF::Renderer::Text for renderer examples. Renderers should typically derive from CAM::PDF::GS, but it's not essential. Typically returns an instance of the renderer class. The rendering class is loaded via C if not already in memory. =cut sub render { my $self = shift; my $renderer = shift; # a package name if (!$loaded{$renderer}) { if (!eval "require $renderer") ## no critic (StringyEval) { die $EVAL_ERROR; } $loaded{$renderer} = 1; } return $self->traverse($renderer); } =item $self->computeGS() =item $self->computeGS($skiptext) Traverses the content tree and computes the coordinates of each graphic point along the way. If the C<$skiptext> boolean is true (default: false) then text blocks are ignored to save time, since they do not change the global graphic state. This is a thin wrapper around render() with CAM::PDF::GS or CAM::PDF::GS::NoText selected as the rendering class. =cut sub computeGS { my $self = shift; my $skip_text = shift; return $self->render('CAM::PDF::GS' . ($skip_text ? '::NoText' : q{})); } =item $self->findImages() Traverse the content tree, accumulating embedded images and image references, according to the CAM::PDF::Renderer::Images renderer. =cut sub findImages { my $self = shift; return $self->render('CAM::PDF::Renderer::Images'); } =item $self->traverse($rendererclass) This recursive method is typically called only by wrapper methods, like render(). It instantiates renderers as needed and calls methods on them. =cut sub traverse { my $self = shift; my $renderer = shift; # class my $blocks = shift || $self->{blocks}; my $gs = shift; if (!$gs) { $gs = $renderer->new($self->{refs}); } foreach my $block (@{$blocks}) { $block->{gs} = $gs; # Enact the GS change performed by this operation my $func = $block->{name}; $func =~ s/ [*] /star/gxms; $func =~ s/ \' /quote/gxms; $func =~ s/ \" /doublequote/gxms; if ($gs->can($func)) { my $newgs = $gs->clone(); { no strict 'refs'; ## no critic(ProhibitNoStrict) $newgs->$func(map {$_->{value}} @{$block->{args}}); } $gs = $newgs; } if ($block->{type} eq 'block') { my $newgs = $self->traverse($renderer, $block->{value}, $gs); if ($block->{name} ne 'q') { $gs = $newgs; } } } return $gs; } =item $self->toString() Flattens a content tree back into a scalar, ready to be inserted back into a PDF document. Since whitespace is discarded by the parser, the resulting scalar will not be identical to the original. =cut sub toString { my $self = shift; my $blocks = shift || $self->{blocks}; my $str = q{}; my $doc = $self->{refs}->{doc}; foreach my $block (@{$blocks}) { if ($block->{name} eq 'BI') { $str .= $doc->writeInlineImage($block->{args}->[0]) . "\n"; } else { foreach my $arg (@{$block->{args}}) { $str .= $doc->writeAny($arg) . q{ }; } $str .= $block->{name} . "\n"; if ($block->{type} eq 'block') { $str .= $self->toString($block->{value}); $str .= $endings{$block->{name}} . "\n"; } } } return $str; } # internal function # Node creator sub _b { my ($type, @args) = @_; if ($type eq 'block') { return { type => $type, name => shift @args, value => shift @args, args => \@args, }; } elsif ($type eq 'op') { return { type => $type, name => shift @args, args => \@args, }; } else { return { type => $type, value => shift @args, args => \@args, }; } } 1; __END__ =back =head1 AUTHOR See L =cut CAM-PDF-1.60/lib/CAM/PDF/Decrypt.pm000444000765000765 3340512203034032 15762 0ustar00chrischris000000000000package CAM::PDF::Decrypt; # These are included at runtime via eval below # use Digest::MD5; # use Crypt::RC4; use 5.006; use warnings; use strict; use Carp; use English qw(-no_match_vars); use CAM::PDF; use CAM::PDF::Node; our $VERSION = '1.60'; =for stopwords Decrypt =head1 NAME CAM::PDF::Decrypt - PDF security helper =head1 LICENSE See CAM::PDF. =head1 SYNOPSIS use CAM::PDF; my $pdf = CAM::PDF->new($filename); =head1 DESCRIPTION This class is used invisibly by CAM::PDF whenever it detects that a document is encrypted. See new(), getPrefs() and setPrefs() in that module. =cut # These constants come from the Adobe PDF Reference document, IIRC my $padding = pack 'C*', 0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41, 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a; =head1 FUNCTIONS =over =item $pkg->new($pdf, $ownerpass, $userpass, $prompt) Create and validate a new decryption object. If this fails, it will set $CAM::PDF::errstr and return undef. C<$prompt> is a boolean that says whether the user should be prompted for a password on the command line. =cut sub new { my $pkg = shift; my $doc = shift; my $opassword = shift; my $upassword = shift; my $prompt = shift; if (!$doc) { $CAM::PDF::errstr = "This is an invalid PDF doc\n"; return; } if (!exists $doc->{trailer}) { $CAM::PDF::errstr = "This PDF doc has no trailer\n"; return; } my $self = bless { keycache => {}, }, $pkg; if (!exists $doc->{trailer}->{Encrypt}) { # This PDF doc is not encrypted. Return an empty object $self->{noop} = 1; return $self; } if (!$doc->{ID}) { $CAM::PDF::errstr = "This PDF lacks an ID. The document cannot be decrypted.\n"; return; } return $self->_init($doc, $opassword, $upassword, $prompt); } sub _init { my $self = shift; my $doc = shift; my $opassword = shift; my $upassword = shift; my $prompt = shift; if ($doc->{trailer}->{Encrypt}->{type} eq 'reference') { # If the encryption block is an indirect reference, store # it's location so we don't accidentally encrypt it. $self->{EncryptBlock} = $doc->{trailer}->{Encrypt}->{value}; } my $dict = $doc->getValue($doc->{trailer}->{Encrypt}); if ($dict->{Filter}->{value} ne 'Standard' || ($dict->{V}->{value} != 1 && $dict->{V}->{value} != 2)) { $CAM::PDF::errstr = "CAM::PDF only supports Version 1 and 2 of the Standard encryption filter. This PDF uses something else.\n"; return; } # V == 1 means MD5+RC4, keylength == 40 # V == 2 means MD5+RC4, keylength == {40, 48, 56, 64, ..., 128} # See PDF Ref 1.5 p93 $self->{keylength} = $dict->{V}->{value} == 1 ? 40 : $dict->{Length} ? $dict->{Length}->{value} : 40; if (40 > $self->{keylength} || 128 < $self->{keylength} || 0 != $self->{keylength} % 8) { $CAM::PDF::errstr = "Invalid key length $self->{keylength}. The document cannot be decrypted.\n"; return; } # PDF Ref 1.5 pp. 97-98 foreach my $key ('R', 'O', 'U', 'P') { if (exists $dict->{$key}) { $self->{$key} = $dict->{$key}->{value}; } else { $CAM::PDF::errstr = "Requred decryption datum $key is missing. The document cannot be decrypted.\n"; return; } } require Digest::MD5; require Crypt::RC4; while (1) { if ($self->_check_opass($opassword, $upassword)) { $self->{code} = $self->_compute_hash($doc->{ID}, $opassword); last; } elsif ($self->_check_upass($doc->{ID}, $upassword)) { $self->{code} = $self->_compute_hash($doc->{ID}, $upassword); last; } elsif ($prompt) { print {*STDERR} 'Enter owner password: '; $opassword = ; ## no critic(InputOutput::ProhibitExplicitStdin) chomp $opassword; print {*STDERR} 'Enter user password: '; $upassword = ; ## no critic(InputOutput::ProhibitExplicitStdin) chomp $upassword; } else { $CAM::PDF::errstr = "Incorrect password(s). The document cannot be decrypted.\n"; return; } } $self->{opass} = $opassword; $self->{upass} = $upassword; return $self; } =item $self->decode_permissions($field) Given a binary encoded permissions string from a PDF document, return the four individual boolean fields as an array: print boolean modify boolean copy boolean add boolean =cut sub decode_permissions { my $self = shift; my $p = shift; my $bytes = unpack 'b*', pack 'V', $p; return split //xms, substr $bytes, 2, 4; } =item $self->encode_permissions($print, $modify, $copy, $add) Given four booleans, pack them into a single field in the PDF style that decode_permissions can understand. Returns that scalar. =cut sub encode_permissions { my $self = shift; my %allow; $allow{print} = shift; $allow{modify} = shift; $allow{copy} = shift; $allow{add} = shift; foreach my $key (keys %allow) { $allow{$key} = $allow{$key} ? 1 : 0; } # This is more complicated that decode, because we need to pad # endian-appropriately my $perms = join q{}, $allow{print}, $allow{modify}, $allow{copy}, $allow{add}; my $bytes = '00' . $perms . '11'; # 8 bits: 2 pad, 4 data, 2 pad # Pad to 32 bits with the right endian-ness my $binary = unpack 'B16', pack 's', 255; if ('1' eq substr $binary, 0, 1) { # little endian $bytes .= '11111111' x 3; } else { # big endian $bytes = ('11111111' x 3) . $bytes; } # Make a signed 32-bit number (NOTE: should this really be signed??? need to check spec...) my $p = unpack 'l', pack 'b32', $bytes; return $p; } =item $self->set_passwords($doc, $ownerpass, $userpass) =item $self->set_passwords($doc, $ownerpass, $userpass, $permissions) Change the PDF passwords to the specified values. When the PDF is output, it will be encrypted with the new passwords. PERMISSIONS is an optional scalar of the form that decode_permissions can understand. If not specified, the existing values will be retained. Note: we only support writing using encryption version 1, even though we can read encryption version 2 as well. =cut sub set_passwords { my $self = shift; my $doc = shift; my $opass = shift; my $upass = shift; my $p = shift || $self->{P} || $self->encode_permissions(1,1,1,1); require Digest::MD5; require Crypt::RC4; $doc->clean(); # Mark EVERYTHING changed # if no crypt block, create it and a trailer entry my $dict = CAM::PDF::Node->new('dictionary', { Filter => CAM::PDF::Node->new('label', 'Standard'), V => CAM::PDF::Node->new('number', 1), R => CAM::PDF::Node->new('number', 2), P => CAM::PDF::Node->new('number', $p), O => CAM::PDF::Node->new('string', q{}), U => CAM::PDF::Node->new('string', q{}), }); my $objnode = CAM::PDF::Node->new('object', $dict); my $objnum = $self->{EncryptBlock}; if ($objnum) { $doc->replaceObject($objnum, undef, $objnode, 0); } else { $objnum = $doc->appendObject(undef, $objnode, 0); } if (!$doc->{trailer}) { die 'No trailer'; } # This may overwrite an existing ref, but that's no big deal, just a tiny bit inefficient $doc->{trailer}->{Encrypt} = CAM::PDF::Node->new('reference', $objnum); # if no ID, create it if (!$doc->{ID}) { $doc->createID(); #print 'new ID: ' . unpack('h*',$doc->{ID}) . ' (' . length($doc->{ID}) . ")\n"; } #else { print 'old ID: '.unpack('h*',$doc->{ID}) . ' (' . length($doc->{ID}) . ")\n"; } # Recompute O and U # To do so, we must set up a couple of dependent variables first: $self->{R} = 2; $self->{keylength} = 40; $self->{P} = $p; # set O (has to be first because U uses O) $self->{O} = $self->_compute_o($opass, $upass); # set U $self->{U} = $self->_compute_u($doc->{ID}, $upass); # save O and U in the Encrypt block $dict = $doc->getObjValue($objnum); $dict->{O}->{value} = $self->{O}; $dict->{U}->{value} = $self->{U}; # Create a brand new instance my $pkg = ref $self; $doc->{crypt} = $pkg->new($doc, $opass, $upass, 0) || die "$CAM::PDF::errstr\n"; return $doc->{crypt}; } =item $self->encrypt($doc, $string) Encrypt the scalar using the passwords previously specified. =cut sub encrypt { my ($self, @rest) = @_; return $self->_crypt(@rest); } =item $self->decrypt($doc, $string) Decrypt the scalar using the passwords previously specified. =cut sub decrypt { my ($self, @rest) = @_; return $self->_crypt(@rest); } # INTERNAL FUNCTION # The real work behind encrpyt/decrypt sub _crypt { my $self = shift; my $doc = shift; my $content = shift; my $objnum = shift; my $gennum = shift; return $content if ($self->{noop}); if (ref $content || ref $objnum || ref $gennum) { die 'Trying to crypt data with non-scalar obj/gennum or content'; } # DO NOT encrypt the encryption block!! :-) return $content if ($objnum && $self->{EncryptBlock} && $objnum == $self->{EncryptBlock}); if (!defined $gennum) { if (!$objnum) { # This is not a real document object. It might be a trailer object. return $content; } croak 'gennum missing in crypt'; } return Crypt::RC4::RC4($self->_compute_key($objnum, $gennum), $content); } sub _compute_key { my $self = shift; my $objnum = shift; my $gennum = shift; my $id = $objnum . '_' .$gennum; if (!exists $self->{keycache}->{$id}) { my $objstr = pack 'V', $objnum; my $genstr = pack 'V', $gennum; my $objpadding = substr $objstr, 0, 3; my $genpadding = substr $genstr, 0, 2; my $hash = Digest::MD5::md5($self->{code} . $objpadding . $genpadding); # size(bytes) = nbits/8 + 3 for objnum + 2 for gennum; max of 16; PDF ref 1.5 pp 94-95 my $size = ($self->{keylength} >> 3) + 5; if ($size > 16) { $size = 16; } $self->{keycache}->{$id} = substr $hash, 0, $size; } return $self->{keycache}->{$id}; } sub _compute_hash { my $self = shift; my $doc_id = shift; my $pass = shift; #print "_compute_hash for password $pass, P: $self->{P}, ID: $doc_id, O: $self->{O}\n" if ($pass); $pass = $self->_format_pass($pass); my $p = pack 'L', $self->{P}+0; my $bytes = unpack 'b32', $p; if (1 == substr $bytes, 0, 1) { # big endian, so byte swap $p = (substr $p,3,1).(substr $p,2,1).(substr $p,1,1).(substr $p,0,1); } my $id = substr $doc_id, 0, 16; my $input = $pass . $self->{O} . $p . $id; if ($self->{R} == 3) { # I don't know how to decide this. Maybe not applicable with Standard filter? #if document metadata is not encrypted # input .= pack 'L', 0xFFFFFFFF; } my $hash = Digest::MD5::md5($input); if ($self->{R} == 3) { for my $iter (1..50) { $hash = Digest::MD5::md5($hash); } } # desired number of bytes for the key # for V==1, size == 5 # for V==2, 5 < size < 16 my $size = $self->{keylength} >> 3; return substr $hash, 0, $size; } sub _compute_u { my $self = shift; my $doc_id = shift; my $upass = shift; my $hash = $self->_compute_hash($doc_id, $upass); if ($self->{R} == 3) { my $id = substr $doc_id, 0, 16; my $input = $padding . $id; my $code = Digest::MD5::md5($input); $code = substr $code, 0, 16; return $self->_do_iter_crypt($hash, $code) . substr $padding, 0, 16; } else { return Crypt::RC4::RC4($hash, $padding); } } sub _compute_o { my $self = shift; my $opass = shift; my $upass = shift; my $backward = shift; my $o = $self->_format_pass($opass); my $u = $self->_format_pass($upass); my $hash = Digest::MD5::md5($o); if ($self->{R} == 3) { for my $iter (1..50) { $hash = Digest::MD5::md5($hash); } } my $size = $self->{keylength} >> 3; my $code = substr $hash, 0, $size; return $self->_do_iter_crypt($code, $u, $backward); } sub _do_iter_crypt { my $self = shift; my $code = shift; my $pass = shift; my $backward = shift; if ($self->{R} == 3) { my @steps = 0..19; if ($backward) { @steps = reverse @steps; } my $size = $self->{keylength} >> 3; for my $iter (@steps) { my $xor = chr($iter) x $size; my $itercode = $code ^ $xor; $pass = Crypt::RC4::RC4($itercode, $pass); } } else { $pass = Crypt::RC4::RC4($code, $pass); } return $pass; } sub _check_opass { my $self = shift; my $opass = shift; my $upass = shift; my $crypto = $self->_compute_o($opass, $upass, 1); #printf "O: %s\n%s\n vs.\n%s\n", defined $opass ? $opass : '(undef)', _hex($crypto), _hex($self->{O}); return $crypto eq $self->{O}; } sub _check_upass { my $self = shift; my $doc_id = shift; my $upass = shift; my $cryptu = $self->_compute_u($doc_id, $upass); #printf "U: %s\n%s\n vs.\n%s\n", defined $upass ? $upass : '(undef)', _hex($cryptu), _hex($self->{U}); return $cryptu eq $self->{U}; } sub _hex { my $val = shift; return join q{}, map {sprintf '%08x', $_} unpack 'N*', $val; } sub _format_pass { my $self = shift; my $pass = shift; if (!defined $pass) { $pass = q{}; } return substr $pass.$padding, 0, 32; } 1; __END__ =back =head1 AUTHOR See L =cut CAM-PDF-1.60/lib/CAM/PDF/GS.pm000444000765000765 1434312203034032 14661 0ustar00chrischris000000000000package CAM::PDF::GS; use 5.006; use strict; use warnings; use base qw(CAM::PDF::GS::NoText); our $VERSION = '1.60'; =for stopwords subclasses =head1 NAME CAM::PDF::GS - PDF graphic state =head1 LICENSE See CAM::PDF. =head1 SYNOPSIS use CAM::PDF; my $pdf = CAM::PDF->new($filename); my $contentTree = $pdf->getPageContentTree(4); my $gs = $contentTree->computeGS(); =head1 DESCRIPTION This class is used to represent the graphic state at a point in the rendering flow of a PDF page. Much of the functionality is actually based in the parent class, CAM::PDF::GS::NoText. Subclasses that want to do something useful with text should override the renderText() method. =head1 CONVERSION FUNCTIONS =over =item $self->getCoords($node) Computes device coordinates for the specified node. This implementation handles text-printing nodes, and hands all other types to the superclass. =cut my %text_cmds = map {$_ => 1} qw(TJ Tj quote doublequote); sub getCoords { my $self = shift; my $node = shift; if ($text_cmds{$node->{name}}) { ## no critic (Bangs::ProhibitNumberedNames) my ($x1,$y1) = $self->userToDevice(@{$self->{last}}); my ($x2,$y2) = $self->userToDevice(@{$self->{current}}); return ($x1,$y1,$x2,$y2); } else { return $self->SUPER::getCoords($node); } } =item $self->textToUser($x, $y) Convert text coordinates (C) to user coordinates. Returns the converted X and Y. =cut sub textToUser { my $self = shift; my $x = shift; my $y = shift; return $self->dot($self->{Tm}, $x, $y); =for oldcode ## PDF Ref page 313 #my $tf = [$self->{Tfs}*$self->{Tz}, 0, # 0, $self->{Tfs}, # 0, $self->{Ts}]; #return $self->dot($self->{Tm}, $self->dot($tf, $x, $y)); =cut } =item $self->textToDevice($x, $y) Convert text coordinates (C) to device coordinates. Returns the converted X and Y. =cut sub textToDevice { my $self = shift; my $x = shift; my $y = shift; return $self->userToDevice($self->textToUser($x, $y)); } =item $self->textLineToUser($x, $y) Convert text coordinates (C) to user coordinates. Returns the converted X and Y. =cut sub textLineToUser { my $self = shift; my $x = shift; my $y = shift; return $self->dot($self->{Tlm}, $x, $y); } =item $self->textLineToDevice($x, $y) Convert text coordinates (C) to device coordinates. Returns the converted X and Y. =cut sub textLineToDevice { my $self = shift; my $x = shift; my $y = shift; return $self->userToDevice($self->textLineToUser($x, $y)); } =item $self->renderText($string, $width) A general method for rendering strings, from C or C. This is a no-op, but subclasses may override. =cut sub renderText { my $self = shift; my $string = shift; my $width = shift; # noop, override in subclasses return; } =item $self->Tadvance($width) Move the text cursor. =cut sub Tadvance { my $self = shift; my $width = shift; my $tx = 0; my $ty = 0; if ($self->{wm} == 0) { $tx = ($width * $self->{Tfs} + $self->{Tc} + $self->{Tw}) * $self->{Tz}; } else { $ty = $width * $self->{Tfs} + $self->{Tc} + $self->{Tw}; } $self->{moved}->[0] += $tx; $self->{moved}->[1] += $ty; $self->applyMatrix([1,0,0,1,$tx,$ty], $self->{Tm}); return; } =back =head1 DATA FUNCTIONS =over =item $self->BT() =cut sub BT { my $self = shift; @{$self->{Tm}} = (1, 0, 0, 1, 0, 0); @{$self->{Tlm}} = (1, 0, 0, 1, 0, 0); return; } =item $self->Tf($fontname, $fontsize) =cut sub Tf { my $self = shift; my $fontname = shift; my $fontsize = shift; $self->{Tf} = $fontname; $self->{Tfs} = $fontsize; $self->{refs}->{fm} = $self->{refs}->{doc}->getFontMetrics($self->{refs}->{properties}, $fontname); # TODO: support vertical text mode (wm = 1) $self->{wm} = 0; return; } =item $self->Tstar() =cut sub Tstar { my $self = shift; $self->Td(0, -$self->{TL}); return; } =item $self->Tz($scale) =cut sub Tz { my $self = shift; my $scale = shift; $self->{Tz} = $scale/100.0; return; } =item $self->Td($x, $y) =cut sub Td { my $self = shift; my $x = shift; my $y = shift; $self->applyMatrix([1,0,0,1,$x,$y], $self->{Tlm}); @{$self->{Tm}} = @{$self->{Tlm}}; return; } =item $self->TD($x, $y) =cut sub TD { my $self = shift; my $x = shift; my $y = shift; $self->TL(-$y); $self->Td($x,$y); return; } =item $self->Tj($string) =cut sub Tj { my $self = shift; my $string = shift; @{$self->{last}} = $self->textToUser(0,0); $self->_Tj($string); @{$self->{current}} = $self->textToUser(0,0); return; } sub _Tj { my $self = shift; my $string = shift; if (!$self->{refs}->{fm}) { die "No font metrics for font $self->{Tf}"; } my @parts; if ($self->{mode} eq 'c' || $self->{wm} == 1) { @parts = split m//xms, $string; } else { @parts = ($string); } foreach my $substr (@parts) { my $dw = $self->{refs}->{doc}->getStringWidth($self->{refs}->{fm}, $substr); $self->renderText($substr, $dw); $self->Tadvance($dw); } return; } =item $self->TJ($arrayref) =cut sub TJ { my $self = shift; my $array = shift; @{$self->{last}} = $self->textToUser(0,0); foreach my $node (@{$array}) { if ($node->{type} eq 'number') { my $dw = -$node->{value} / 1000.0; $self->Tadvance($dw); } else { $self->_Tj($node->{value}); } } @{$self->{current}} = $self->textToUser(0,0); return; } =item $self->quote($string) =cut sub quote { my $self = shift; my $string = shift; @{$self->{last}} = $self->textToUser(0,0); $self->Tstar(); $self->_Tj($string); @{$self->{current}} = $self->textToUser(0,0); return; } =item $self->doublequote($tw, $tc, $string) =cut sub doublequote { my $self = shift; $self->{Tw} = shift; $self->{Tc} = shift; my $string = shift; $self->quote($string); return; } =item $self->Tm($m1, $m2, $m3, $m4, $m5, $m6) =cut sub Tm { my ($self, @tm) = @_; @{$self->{Tm}} = @{$self->{Tlm}} = @tm; return; } 1; __END__ =back =head1 AUTHOR See L =cut CAM-PDF-1.60/lib/CAM/PDF/Node.pm000444000765000765 156712203034032 15221 0ustar00chrischris000000000000package CAM::PDF::Node; use 5.006; use warnings; use strict; our $VERSION = '1.60'; =head1 NAME CAM::PDF::Node - PDF element =head1 SYNOPSIS my $node = CAM::PDF::Node->new('number', 1.0); =head1 DESCRIPTION This is a simplistic internal class for representing arbitrary PDF data structures. =head1 LICENSE Same as L =head1 FUNCTIONS =over =item $pkg->new($type, $value) =item $pkg->new($type, $value, $objnum) =item $pkg->new($type, $value, $objnum, $gennum) Create a new PDF element. =cut sub new { my $pkg = shift; my $self = { type => shift, value => shift, }; my $objnum = shift; my $gennum = shift; if (defined $objnum) { $self->{objnum} = $objnum; } if (defined $gennum) { $self->{gennum} = $gennum; } return bless $self, $pkg; } 1; __END__ =back =head1 AUTHOR See L =cut CAM-PDF-1.60/lib/CAM/PDF/PageText.pm000444000765000765 1167312203034032 16074 0ustar00chrischris000000000000package CAM::PDF::PageText; use 5.006; use warnings; use strict; our $VERSION = '1.60'; =head1 NAME CAM::PDF::PageText - Extract text from PDF page tree =head1 SYNOPSIS my $pdf = CAM::PDF->new($filename); my $pageone_tree = $pdf->getPageContentTree(1); print CAM::PDF::PageText->render($pageone_tree); =head1 DESCRIPTION This module attempts to extract sequential text from a PDF page. This is not a robust process, as PDF text is graphically laid out in arbitrary order. This module uses a few heuristics to try to guess what text goes next to what other text, but may be fooled easily by, say, subscripts, non-horizontal text, changes in font, form fields etc. All those disclaimers aside, it is useful for a quick dump of text from a simple PDF file. =head1 LICENSE Same as L =head1 FUNCTIONS =over =item $pkg->render($pagetree) =item $pkg->render($pagetree, $verbose) Turn a page content tree into a string. This is a class method that should be called like: CAM::PDF::PageText->render($pagetree); =cut sub render { my $pkg = shift; my $pagetree = shift; my $verbose = shift; my $str = q{}; my @stack = ([@{$pagetree->{blocks}}]); my $in_textblock = 0; ## The stack is a list of blocks. We do depth-first on blocks, but ## we must be sure to traverse the children of the blocks in their ## original order. while (@stack > 0) { # keep grabbing the same node until it's empty my $node = $stack[-1]; if (ref $node) { if (@{$node} > 0) # Still has children? { my $block = shift @{$node}; # grab the next child if ($block->{type} eq 'block') { if ($block->{name} eq 'BT') { # Insert a flag on the stack to say when we leave the BT block push @stack, 'BT'; $in_textblock = 1; } push @stack, [@{$block->{value}}]; # descend } elsif ($in_textblock) { if ($block->{type} ne 'op') { die 'misconception'; } my @args = @{$block->{args}}; $str = $block->{name} eq 'TJ' ? _TJ( $str, \@args ) : $block->{name} eq 'Tj' ? _Tj( $str, \@args ) : $block->{name} eq q{\'} ? _Tquote( $str, \@args ) : $block->{name} eq q{\"} ? _Tquote( $str, \@args ) : $block->{name} eq 'Td' ? _Td( $str, \@args ) : $block->{name} eq 'TD' ? _Td( $str, \@args ) : $block->{name} eq 'T*' ? _Tstar( $str ) : $str; } } else { # Node is now empty, clear it from the stack pop @stack; } } else { # This is the 'BT' flag we pushed on the stack above pop @stack; $in_textblock = 0; # Add a line break to divide the text $str =~ s/ [ ]* \z /\n/xms; } } return $str; } sub _TJ { my $str = shift; my $args_ref = shift; if (@{$args_ref} != 1 || $args_ref->[0]->{type} ne 'array') { die 'Bad TJ'; } $str =~ s/ (\S) \z /$1 /xms; foreach my $node (@{$args_ref->[0]->{value}}) { if ($node->{type} eq 'string' || $node->{type} eq 'hexstring') { $str .= $node->{value}; } elsif ($node->{type} eq 'number') { # Heuristic: # "offset of more than a quarter unit forward" # means significant positive spacing if ($node->{value} < -250) { $str =~ s/ (\S) \z /$1 /xms; } } } return $str; } sub _Tj { my $str = shift; my $args_ref = shift; if (@{$args_ref} < 1 || ($args_ref->[-1]->{type} ne 'string' && $args_ref->[-1]->{type} ne 'hexstring')) { die 'Bad Tj'; } $str =~ s/ (\S) \z /$1 /xms; return $str . $args_ref->[-1]->{value}; } sub _Tquote { my $str = shift; my $args_ref = shift; if (@{$args_ref} < 1 || ($args_ref->[-1]->{type} ne 'string' && $args_ref->[-1]->{type} ne 'hexstring')) { die 'Bad Tquote'; } $str =~ s/ [ ]* \z /\n/xms; return $str . $args_ref->[-1]->{value}; } sub _Td { my $str = shift; my $args_ref = shift; if (@{$args_ref} != 2 || $args_ref->[0]->{type} ne 'number' || $args_ref->[1]->{type} ne 'number') { die 'Bad Td/TD'; } # Heuristic: # "move down in Y, and Y motion a large fraction of the X motion" # means new line if ($args_ref->[1]->{value} < 0 && 2 * (abs $args_ref->[1]->{value}) > abs $args_ref->[0]->{value}) { $str =~ s/ [ ]* \z /\n/xms; } return $str; } sub _Tstar { my $str = shift; $str =~ s/ [ ]* \z /\n/xms; return $str; } 1; __END__ =back =head1 AUTHOR See L =cut CAM-PDF-1.60/lib/CAM/PDF/GS000755000765000765 012203034032 14141 5ustar00chrischris000000000000CAM-PDF-1.60/lib/CAM/PDF/GS/NoText.pm000444000765000765 2170212203034032 16077 0ustar00chrischris000000000000package CAM::PDF::GS::NoText; use 5.006; use warnings; use strict; use Carp; use English qw(-no_match_vars); our $VERSION = '1.60'; ##no critic (Bangs::ProhibitNumberedNames) =for stopwords fallback =head1 NAME CAM::PDF::GS::NoText - PDF graphic state =head1 LICENSE See CAM::PDF. =head1 SYNOPSIS use CAM::PDF; my $pdf = CAM::PDF->new($filename); my $contentTree = $pdf->getPageContentTree(4); my $gs = $contentTree->computeGS(1); =head1 DESCRIPTION This class is used to represent the graphic state at a point in the rendering flow of a PDF page. This does not include the graphics state for text blocks. That functionality is in the subclass, CAM::PDF::GS. =head1 FUNCTIONS =over =item $pkg->new($hashref) Create a new instance, setting all state values to their defaults. Stores a reference to C<$hashref> and sets the property C<$hashref->{fm}> to C. =cut sub new { my $pkg = shift; my $refs = shift; my $self = bless { mode => 'n', # 'c'har, 's'tring, 'n'oop refs => $refs || {}, c => undef, # color cm => [1, 0, 0, 1, 0, 0], # current transformation matrix w => 1.0, # line width J => 0, # line cap j => 0, # line join M => 0, # miter limit da => [], # dash pattern array dp => 0, # dash phase ri => undef, # rendering intent i => 0, # flatness # Others, see PDF Ref page 149 Tm => [1, 0, 0, 1, 0, 0], # text matrix Tlm => [1, 0, 0, 1, 0, 0], # text matrix Tc => 0, # character spacing Tw => 0, # word spacing Tz => 1, # horizontal scaling TL => 0, # leading Tf => undef, # font Tfs => undef, # font size Tr => 0, # render mode Ts => 0, # rise wm => 0, # writing mode (0=horiz, 1=vert) Device => undef, device => undef, G => undef, g => undef, RG => undef, rg => undef, K => undef, k => undef, moved => [0,0], start => [0,0], last => [0,0], current => [0,0], }, $pkg; $self->{refs}->{fm} = undef; return $self; } =item $self->clone() Duplicate the instance. =cut sub clone { my $self = shift; require Data::Dumper; my $newself; # don't clone references, just point to them my $refs = delete $self->{refs}; if (!eval Data::Dumper->Dump([$self], ['newself'])) ## no critic (StringyEval) { die 'Error in '.__PACKAGE__."::clone() - $EVAL_ERROR"; } $self->{refs} = $newself->{refs} = $refs; # restore references @{$newself->{moved}} = (0,0); return $newself; } =back =head1 CONVERSION FUNCTIONS =over =item $self->applyMatrix($m1, $m2) Apply C<$m1> to C<$m2>, save in C<$m2>. =cut sub applyMatrix { my $self = shift; my $m1 = shift; my $m2 = shift; if (ref $m1 ne 'ARRAY' || ref $m2 ne 'ARRAY') { require Data::Dumper; croak "Bad arrays:\n".Dumper($m1,$m2); } my @m3; $m3[0] = $m2->[0]*$m1->[0] + $m2->[2]*$m1->[1]; $m3[1] = $m2->[1]*$m1->[0] + $m2->[3]*$m1->[1]; $m3[2] = $m2->[0]*$m1->[2] + $m2->[2]*$m1->[3]; $m3[3] = $m2->[1]*$m1->[2] + $m2->[3]*$m1->[3]; $m3[4] = $m2->[0]*$m1->[4] + $m2->[2]*$m1->[5] + $m2->[4]; $m3[5] = $m2->[1]*$m1->[4] + $m2->[3]*$m1->[5] + $m2->[5]; @{$m2} = @m3; return; } =item $self->dot($matrix, $x, $y) Compute the dot product of a position against the coordinate matrix. =cut sub dot { my $self = shift; my $cm = shift; my $x = shift; my $y = shift; return ($cm->[0]*$x + $cm->[2]*$y + $cm->[4], $cm->[1]*$x + $cm->[3]*$y + $cm->[5]); } =item $self->userToDevice($x, $y) Convert user coordinates to device coordinates. =cut sub userToDevice { my $self = shift; my $x = shift; my $y = shift; ($x,$y) = $self->dot($self->{cm}, $x, $y); $x -= $self->{refs}->{mediabox}->[0]; $y -= $self->{refs}->{mediabox}->[1]; return ($x, $y); } =item $self->getCoords($node) Computes device coordinates for the specified node. This implementation handles line-drawing nodes. =cut my %path_cmds = map {$_ => 1} qw(m l h c v y re); my %paint_cmds = map {$_ => 1} qw(S s F f f* B B* b b* n); sub getCoords { my $self = shift; my $node = shift; my ($x1,$y1,$x2,$y2); if ($path_cmds{$node->{name}}) { ($x1,$y1) = $self->userToDevice(@{$self->{last}}); ($x2,$y2) = $self->userToDevice(@{$self->{current}}); } return ($x1,$y1,$x2,$y2); } =item $self->nodeType($node) Returns one of C, C, C, C or (the fallback case) C for the type of the specified node. =cut sub nodeType { my $self = shift; my $node = shift; return $node->{type} eq 'block' ? 'block' : $path_cmds{$node->{name}} ? 'path' : $paint_cmds{$node->{name}} ? 'paint' : $node->{name} =~ / \A T /xms ? 'text' : 'op'; } =back =head1 DATA FUNCTIONS =over =item $self->i($flatness) =item $self->j($linejoin) =item $self->J($linecap) =item $self->ri($rendering_intent) =item $self->Tc($charspace) =item $self->TL($leading) =item $self->Tr($rendering_mode) =item $self->Ts($rise) =item $self->Tw($wordspace) =item $self->w($linewidth) =cut # default setters { no strict 'refs'; ## no critic(ProhibitNoStrict) foreach my $name (qw(i j J ri Tc TL Tr Ts Tw w)) { *{$name} = sub { $_[0]->{$name} = $_[1]; return; }; } } =item $self->g($gray) =cut sub g { my $self = shift; my $g = shift; $self->{g} = [$g]; $self->{device} = 'DeviceGray'; return; } =item $self->G($gray) =cut sub G { my $self = shift; my $g = shift; $self->{G} = [$g]; $self->{Device} = 'DeviceGray'; return; } =item $self->rg($red, $green, $blue) =cut sub rg { my $self = shift; my $rd = shift; my $gr = shift; my $bl = shift; $self->{rg} = [$rd, $gr, $bl]; $self->{device} = 'DeviceRGB'; return; } =item $self->RG($red, $green, $blue) =cut sub RG { my $self = shift; my $rd = shift; my $gr = shift; my $bl = shift; $self->{RG} = [$rd, $gr, $bl]; $self->{Device} = 'DeviceRGB'; return; } =item $self->k($cyan, $magenta, $yellow, $black) =cut sub k { my $self = shift; my $c = shift; my $m = shift; my $y = shift; my $k = shift; $self->{k} = [$c, $m, $y, $k]; $self->{device} = 'DeviceCMYK'; return; } =item $self->K($cyan, $magenta, $yellow, $black) =cut sub K { my $self = shift; my $c = shift; my $m = shift; my $y = shift; my $k = shift; $self->{K} = [$c, $m, $y, $k]; $self->{Device} = 'DeviceCMYK'; return; } =item $self->gs() (Not implemented...) =cut sub gs { my $self = shift; # See PDF Ref page 157 #warn 'gs operator not yet implemented'; return; } =item $self->cm M1, M2, M3, M4, M5, M6 =cut sub cm { my ($self, @mtx) = @_; $self->applyMatrix([@mtx], $self->{cm}); return; } =item $self->d($arrayref, $scalar) =cut sub d { my $self = shift; my $da = shift; my $dp = shift; @{$self->{da}} = @{$da}; $self->{dp} = $dp; return; } =item $self->m($x, $y) Move path. =cut sub m ##no critic (Homonym) { my $self = shift; my $x = shift; my $y = shift; @{$self->{start}} = @{$self->{last}} = @{$self->{current}} = ($x,$y); return; } =item $self->l($x, $y) Line path. =cut sub l { my $self = shift; my $x = shift; my $y = shift; @{$self->{last}} = @{$self->{current}}; @{$self->{current}} = ($x,$y); return; } =item $self->h() =cut sub h { my $self = shift; @{$self->{last}} = @{$self->{current}}; @{$self->{current}} = @{$self->{start}}; return; } =item $self->c($x1, $y1, $x2, $y2, $x3, $y3) =cut sub c ## no critic (ProhibitManyArgs) { my $self = shift; my $x1 = shift; my $y1 = shift; my $x2 = shift; my $y2 = shift; my $x3 = shift; my $y3 = shift; @{$self->{last}} = @{$self->{current}}; @{$self->{current}} = ($x3,$y3); return; } =item $self->v($x1, $y1, $x2, $y2) =cut sub v { my $self = shift; my $x1 = shift; my $y1 = shift; my $x2 = shift; my $y2 = shift; @{$self->{last}} = @{$self->{current}}; @{$self->{current}} = ($x2,$y2); return; } =item $self->y($x1, $y1, $x2, $y2) =cut sub y ##no critic (Homonym) { my $self = shift; my $x1 = shift; my $y1 = shift; my $x2 = shift; my $y2 = shift; @{$self->{last}} = @{$self->{current}}; @{$self->{current}} = ($x2,$y2); return; } =item $self->re($x, $y, $width, $height) Rectangle path. =cut sub re { my $self = shift; my $x = shift; my $y = shift; my $w = shift; my $h = shift; @{$self->{start}} = @{$self->{last}} = @{$self->{current}} = ($x,$y); return; } 1; __END__ =back =head1 AUTHOR See L =cut CAM-PDF-1.60/lib/CAM/PDF/Renderer000755000765000765 012203034032 15376 5ustar00chrischris000000000000CAM-PDF-1.60/lib/CAM/PDF/Renderer/Dump.pm000444000765000765 177612203034032 17011 0ustar00chrischris000000000000package CAM::PDF::Renderer::Dump; use 5.006; use warnings; use strict; use base qw(CAM::PDF::GS); our $VERSION = '1.60'; =head1 NAME CAM::PDF::Renderer::Dump - Print the graphic state of each node =head1 LICENSE See CAM::PDF. =head1 SYNOPSIS use CAM::PDF; my $pdf = CAM::PDF->new($filename); my $contentTree = $pdf->getPageContentTree(4); $contentTree->render("CAM::PDF::Renderer::Dump"); =head1 DESCRIPTION This class is used to print to STDOUT the coordinates of each node of a page layout. It is written both for debugging and as a minimal example of a renderer. =head1 FUNCTIONS =over =item $self->renderText($string) Prints the string prefixed by its device and user coordinates. =cut sub renderText { my $self = shift; my $string = shift; my ($xu, $yu) = $self->textToUser(0, 0); my ($xd, $yd) = $self->userToDevice($xu, $yu); printf "(%7.2f,%7.2f) (%7.2f,%7.2f) %s\n", $xd,$yd,$xu,$yu, $string; return; } 1; __END__ =back =head1 AUTHOR See L =cut CAM-PDF-1.60/lib/CAM/PDF/Renderer/Images.pm000444000765000765 270212203034032 17277 0ustar00chrischris000000000000package CAM::PDF::Renderer::Images; use 5.006; use warnings; use strict; our $VERSION = '1.60'; =for stopwords inline =head1 NAME CAM::PDF::Renderer::Images - Find all of the images in a page =head1 LICENSE See CAM::PDF. =head1 SYNOPSIS use CAM::PDF; my $pdf = CAM::PDF->new($filename); my $contentTree = $pdf->getPageContentTree(4); my $gs = $contentTree->findImages(); my @imageNodes = @{$gs->{images}}; =head1 DESCRIPTION This class is used to identify all image nodes in a page content tree. =head1 FUNCTIONS =over =item $self->new() Creates a new renderer. =cut sub new { my $pkg = shift; return bless { images => [], }, $pkg; } =item $self->clone() Duplicates an instance. The new instance deliberately shares its C property with the original instance. =cut sub clone { my $self = shift; my $pkg = ref $self; my $new_self = $pkg->new(); $new_self->{images} = $self->{images}; return $new_self; } =item $self->Do(DATA...) Record an indirect image node. =cut sub Do { my ($self, @rest) = @_; my $value = [@rest]; push @{$self->{images}}, { type => 'Do', value => $value, }; return; } =item $self->BI(DATA...) Record an inline image node. =cut sub BI { my ($self, @rest) = @_; my $value = [@rest]; push @{$self->{images}}, { type => 'BI', value => $value, }; return; } 1; __END__ =back =head1 AUTHOR See L =cut CAM-PDF-1.60/lib/CAM/PDF/Renderer/Text.pm000444000765000765 406012203034032 17015 0ustar00chrischris000000000000package CAM::PDF::Renderer::Text; use 5.006; use warnings; use strict; use CAM::PDF::Renderer::TextFB; use base qw(CAM::PDF::GS); our $VERSION = '1.60'; =for stopwords framebuffer =head1 NAME CAM::PDF::Renderer::Text - Render an ASCII image of a PDF page =head1 LICENSE See CAM::PDF. =head1 SYNOPSIS use CAM::PDF; my $pdf = CAM::PDF->new($filename); my $contentTree = $pdf->getPageContentTree(4); $contentTree->render("CAM::PDF::Renderer::Text"); =head1 DESCRIPTION This class is used to print to STDOUT the coordinates of each node of a page layout. It is written both for debugging and as a minimal example of a renderer. =head1 GLOBALS The $CAM::PDF::Renderer::Text::xdensity and $CAM::PDF::Renderer::Text::ydensity define the scale of the ASCII graphical output device. They both default to 6.0. =cut our $xdensity = 6.0; our $ydensity = 6.0; =head1 FUNCTIONS =over =item $pkg->new() Calls the superclass constructor, and initializes the ASCII PDF page. =cut sub new { my ($pkg, @rest) = @_; my $self = $pkg->SUPER::new(@rest); if ($self) { my $fw = ($self->{refs}->{mediabox}->[2] - $self->{refs}->{mediabox}->[0]) / $xdensity; my $fh = ($self->{refs}->{mediabox}->[3] - $self->{refs}->{mediabox}->[1]) / $ydensity; my $w = int $fw; my $h = int $fh; $self->{refs}->{framebuffer} = CAM::PDF::Renderer::TextFB->new($w, $h); $self->{mode} = 'c'; } return $self; } =item $self->renderText($string) Prints the characters of the screen to our virtual ASCII framebuffer. =cut sub renderText { my $self = shift; my $string = shift; my ($x, $y) = $self->textToDevice(0,0); $x = int $x / $xdensity; $y = int $y / $ydensity; $self->{refs}->{framebuffer}->add_string($x, $y, $string); #print "($x,$y) $string\n"; return; } =item $self->toString() Serializes the framebuffer into a single string that can be easily printed. =cut sub toString { my $self = shift; return $self->{refs}->{framebuffer}->toString(); } 1; __END__ =back =head1 AUTHOR See L =cut CAM-PDF-1.60/lib/CAM/PDF/Renderer/TextFB.pm000444000765000765 404612203034032 17231 0ustar00chrischris000000000000package CAM::PDF::Renderer::TextFB; use 5.006; use warnings; use strict; use CAM::PDF; our $VERSION = '1.60'; =for stopwords framebuffer =head1 NAME CAM::PDF::Renderer::TextFB - Framebuffer for CAM::PDF::Renderer::Text =head1 LICENSE See CAM::PDF. =head1 SYNOPSIS See CAM::PDF::Renderer::Text. =head1 DESCRIPTION This class is used solely to assist CAM::PDF::Renderer::Text. =head1 FUNCTIONS =over =item $pkg->new(width, height) Creates a new framebuffer. =cut sub new { my $pkg = shift; my $w = shift; my $h = shift; my $self = bless { w => $w, h => $h, fb =>[], }, $pkg; for my $r (0 .. $h-1) { $self->{fb}->[$r] = [(q{})x$w]; } return $self; } =item $self->add_string($x, $y, $string) Renders a string on the framebuffer. =cut sub add_string { my $self = shift; my $x = shift; my $y = shift; my $string = shift; CAM::PDF->asciify(\$string); my $fb = $self->{fb}; if (defined $fb->[$y]) { if (defined $fb->[$y]->[$x]) { $fb->[$y]->[$x] .= $string; } else { #print "bad 1\n"; $fb->[$y]->[$x] = $string; } } else { #print "bad 2\n"; $fb->[$y] = []; $fb->[$y]->[$x] = $string; } return; } =item $self->toString() Serializes the framebuffer into a single string that can be easily printed. =cut sub toString { my $self = shift; my @str; my $fb = $self->{fb}; for my $r (reverse 0 .. $#{$fb}) # PDF is bottom to top, we want top to bottom { my $row = $fb->[$r]; if ($row) { #print "r $r c ".@$row."\n"; #print '>'; for my $c (0 .. $#{$row}) { my $str = $row->[$c]; if (!defined $str || $str eq q{}) { $str = q{ }; } push @str, $str; } } else { #print "r $r c 0\n"; #print '>'; } push @str, "\n"; } return join q{}, @str; } 1; __END__ =back =head1 AUTHOR See L =cut CAM-PDF-1.60/t000755000765000765 012203034032 12314 5ustar00chrischris000000000000CAM-PDF-1.60/t/basic.t000444000765000765 436312203034032 13725 0ustar00chrischris000000000000#!/usr/bin/perl -w use warnings; use strict; use Carp; use Test::More tests => 36; use_ok('CAM::PDF'); is_deeply([CAM::PDF->rangeToArray(0,10)], [0,1,2,3,4,5,6,7,8,9,10], 'range test'); is_deeply([CAM::PDF->rangeToArray(0,10,'1-2')], [1,2], 'range test'); is_deeply([CAM::PDF->rangeToArray(0,10,'-3')], [0,1,2,3], 'range test'); is_deeply([CAM::PDF->rangeToArray(0,10,'8-')], [8,9,10], 'range test'); is_deeply([CAM::PDF->rangeToArray(0,10,3,4,'6-8',11,2)], [3,4,6,7,8,2], 'range test'); is_deeply([CAM::PDF->rangeToArray(0,10,'7-4')], [7,6,5,4], 'range test'); is_deeply([CAM::PDF->rangeToArray(10,20,'1-3,6,22,25-28')], [], 'range test'); is_deeply([CAM::PDF->rangeToArray(10,20,'-3')], [], 'range test'); is_deeply([CAM::PDF->rangeToArray(10,20,'25-')], [], 'range test'); is_deeply([CAM::PDF->rangeToArray(1, 15, '1,3-5,12,9', '14-', '8 - 6, -2')], [1,3,4,5,12,9,14,15,8,7,6,1,2], 'range test'); is(CAM::PDF->new('nosuchfile.pdf'), undef, 'open non-existent file'); foreach my $strtest ( ['(foo)', 'foo'], ['(foo)(bar)', 'foo'], # parsing should stop at the end of the string ['((foo))', '(foo)'], ['(\\(foo\\))', '(foo)'], ['(\\(foo)', '(foo'], ['(foo\\))', 'foo)'], ['(foo\\\\)', 'foo\\'], ['(foo\\\\\\))', 'foo\\)'], ['(foo\\n)', 'foo'."\n"], ['(foo\\r)', 'foo'."\r"], ['(foo\\t)', 'foo'."\t"], ['(octal\\040)', 'octal '], ['(octal\\40)', 'octal '], ['(\134\\\\)', '\\\\'], ['(\134\\\\\\))', '\\\\)'], ['(\134a\\\\\\))', '\\a\\)'], ['(\(\134\\\\\\))', '(\\\\)'], ) { my $orig = $strtest->[0]; my $expect = $strtest->[1]; is(CAM::PDF->parseString(\$orig)->{value}, $expect, 'parseString '.$orig); } foreach my $strtest ( ['<20>', ' '], ['<2>', ' '], ['<666f6f>', 'foo'], ) { my $orig = $strtest->[0]; my $expect = $strtest->[1]; is(CAM::PDF->parseHexString(\$orig)->{value}, $expect, 'parseHexString '.$orig); } is(CAM::PDF->parseBoolean(\'true')->{value}, 'true', 'parseBoolean'); is(CAM::PDF->parseBoolean(\'TRUE')->{value}, 'true', 'parseBoolean'); is(CAM::PDF->parseBoolean(\'false')->{value}, 'false', 'parseBoolean'); is(CAM::PDF->parseNull(\'null')->{value}, undef, 'parseNull'); CAM-PDF-1.60/t/bugreports.t000444000765000765 161512203034032 15035 0ustar00chrischris000000000000#!/usr/bin/perl -w use warnings; use strict; use Carp; $SIG{__WARN__} = $SIG{__DIE__} = \&Carp::confess; use Test::More tests => 1; use CAM::PDF; { # From an email exchange with Malcolm Cook: # exiftool is appending a comment after the "%%EOF" at the end of # the document, which is confusing CAM::PDF. Technically that's # not allowed (the PDF spec says "The last line of the file # contains only the end-of-file marker, %%EOF.") but the spec # also has an implementation note in the appendix that says # "Acrobat viewers require only that the %%EOF marker appear # somewhere within the last 1024 bytes of the file." my $orig_pdf = CAM::PDF->new('t/sample1.pdf') || die $CAM::PDF::errstr; my $new_pdf_content = $orig_pdf->{content} . "\n%EndExifToolUpdate 621754\n"; ok(CAM::PDF->new($new_pdf_content), 'can read a PDF with extra comments at the end'); } CAM-PDF-1.60/t/inlineimage.pdf000444000765000765 331412203034032 15426 0ustar00chrischris000000000000%PDF-1.2 %쏢 5 0 obj <> stream xNAœNmPpQ p e^dYobckPX NKgwhI\$s0‘e}!f4P \Y\!1Xvl8:0bB/ =?ܴћ7MPNzu PF)AtS(퍢22xK$^ } *+k ScDW G]828؈3yЙNL܊MQTda)f^ͱ05h䔺H;5TUMkU8] z-Vuz@hU*ODzLCeT6Kׇ"|Qڅkg+AXmHf*8 wèendstream endobj 6 0 obj 389 endobj 11 0 obj <> endobj 12 0 obj <> endobj 4 0 obj <> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 9 0 obj < ]/Width 100/Height 100/BitsPerComponent 4/Filter/FlateDecode/DecodeParms<> >> stream x1 ٿ2xArH$D"H$D"H$ 3 endstream endobj 10 0 obj 45 endobj 7 0 obj <> endobj 8 0 obj <> endobj 2 0 obj <>endobj xref 0 13 0000000000 65535 f 0000000777 00000 n 0000001346 00000 n 0000000718 00000 n 0000000553 00000 n 0000000015 00000 n 0000000474 00000 n 0000001212 00000 n 0000001273 00000 n 0000000825 00000 n 0000001193 00000 n 0000000493 00000 n 0000000523 00000 n trailer << /Size 13 /Root 1 0 R /Info 2 0 R >> startxref 1402 %%EOF CAM-PDF-1.60/t/pdf.t000444000765000765 2307012203034032 13431 0ustar00chrischris000000000000#!/usr/bin/perl -w use warnings; use strict; use Carp; $SIG{__WARN__} = $SIG{__DIE__} = \&Carp::confess; use Test::More; # If any test PDF has more than this many pages, trim them my $max_pages = 30; my $begin_pages = 9; my $end_pages = 9; # This is a little complicated because there are some tests that are # intended to run only on the developer's computer (namely, against # PDF docs that are too big or cannot be distributed). # We build up a list of PDFs to test, then winnow out the ones we # can't test. my @testdocs = filter_testdocs( { filename => 't/inlineimage.pdf', linear => 0, pages => [ { extern_images => 1, inline_images => 1 } ], }, { filename => 't/sample1.pdf', linear => 0, pages => [ { extern_images => 7, inline_images => 0 }, { extern_images => 0, inline_images => 0 } ], }, { filename => 't/resume.pdf', linear => 0, pages => [ { extern_images => 0, inline_images => 0 }, { extern_images => 0, inline_images => 0 } ], }, { filename => 't/PDFReference15_v5.pdf', linear => 1, pages => [ map { +{ } } 1..1172 ], # I don't know how many images per page }, { # This one has Type 2 encryption, but I don't own it so I can't include it in the CPAN upload filename => 't/Sample5500.pdf', linear => 0, pages => [ map { +{ } } 1..3 ], # no images permissions => [1,0,0,1], # no modify, no copy }, { # This is a crazy one that uses PDF v1.5 object streams and cross-reference streams and annotations filename => 't/pdf15.pdf', linear => 1, pages => [ +{ } ], }, ); { # Set up the test plan dynamically using the @testdocs data my @testpages = grep {!$_->{skip}} map {@{$_->{pages}}} @testdocs; my @impages = grep {exists $_->{extern_images}} @testpages; if (@testpages > 30) # that is, on my dev machine { diag 'docs: '.@testdocs.', pages: '.@testpages.', impages: '.@impages; } my $tests = 2 + @testdocs * 33 + @testpages * 4 + @impages * 4; plan tests => $tests; } # Begin testing use_ok('CAM::PDF'); # Utility routines for diagnosing test failures sub clearerr { $CAM::PDF::errstr = ''; } sub checkerr { if ($CAM::PDF::errstr) { diag($CAM::PDF::errstr); clearerr(); } } # Flag. We only do this test one time total, since it is slow my $did_deep_compare = 0; my $can_test_leaks = eval { require Test::Memory::Cycle; 1; }; foreach my $testdoc (@testdocs) { clearerr(); my $file = $testdoc->{filename}; my $doc = CAM::PDF->new($file); ok($doc, 'open pdf '.$file); checkerr(); is($doc->numPages(), scalar @{$testdoc->{pages}}, 'test predicted right number of pages'); { open my $fh, '<', $file or die; binmode $fh; my $content = do{local $/=undef;<$fh>}; close $fh; ok($doc->toPDF() eq $content, 'toPDF'); } is($doc->isLinearized() ? 1 : 0, $testdoc->{linear}, 'isLinearized'); my $pages = $doc->numPages(); for my $page (1..$pages) { my $pdata = $testdoc->{pages}->[$page-1]; #{ # my $pagecontent = $doc->getPageContent($page); # if ($pdata->{skip} && $pagecontent !~ /\s+BDC\s+Q\s+|\s+EMC\s+Q\s+/s) # { # diag "bad skip on p$page"; # } #} next if (!$pdata || $pdata->{skip}); my $pagecontent = $doc->getPageContent($page); ok(defined $doc->getPageText($page), "page $page, getPageText"); my $tree = $doc->getPageContentTree($page, "verbose"); ok($tree && ($pagecontent eq "" || @{$tree->{blocks}} > 0), "page $page, parse"); ok($tree->validate(), "page $page, validate"); if (!$did_deep_compare) { my $tree2 = CAM::PDF::Content->new($tree->toString()); is_deeply($tree2->{blocks}, $tree->{blocks}, "page $page, toString validity"); $did_deep_compare = 1; } if (exists $pdata->{extern_images}) { my $im = $tree->findImages(); ok($im, "page $page, findImages"); is((scalar grep {$_->{type} eq 'Do'} @{$im->{images}}), $pdata->{extern_images}, "page $page, findImages - external"); is((scalar grep {$_->{type} eq 'BI'} @{$im->{images}}), $pdata->{inline_images}, "page $page, findImages - inline"); SKIP: { skip 'optional memory leak test skipped', 1 if (!$can_test_leaks); Test::Memory::Cycle::memory_cycle_ok($im, 'memory leak test'); } } ## Too slow #SKIP: # { # skip 'optional memory leak test skipped', 1 if (!$can_test_leaks); # Test::Memory::Cycle::memory_cycle_ok($tree, 'memory leak test'); # } ok($tree->computeGS(), "page $page, computeGS"); ## Too slow #SKIP: # { # skip 'optional memory leak test skipped', 1 if (!$can_test_leaks); # Test::Memory::Cycle::memory_cycle_ok($tree, 'memory leak test'); # } } # Maybe trim some pages to speed up the tests my @delete_pagenums = grep {$testdoc->{pages}->[$_-1] && $testdoc->{pages}->[$_-1]->{skip}} 1 .. $pages; $doc->deletePages(@delete_pagenums); $pages = $doc->numPages(); # Add some pages { my $dupe = CAM::PDF->new($file); $dupe->deletePages(@delete_pagenums); checkerr(); $doc->appendPDF($dupe); $doc->appendPDF($dupe); $doc->appendPDF($dupe); } SKIP: { skip 'optional memory leak test skipped', 1 if (!$can_test_leaks); Test::Memory::Cycle::memory_cycle_ok($doc, 'memory leak test'); } $doc->cleansave(); is($doc->numPages(), $pages * 4, 'append pages'); is($doc->isLinearized(), undef, 'isLinearized'); ok($doc->extractPages($pages + 1, $pages * 3 + 1), 'extract pages'); $doc->cleansave(); is($doc->numPages(), 2, 'extract page check'); ok($doc->deletePages($doc->numPages()), 'delete pages'); $doc->cleansave(); is($doc->numPages(), 1, 'delete page check'); ok($doc->duplicatePage(1), 'duplicatePage'); is($doc->numPages(), 2, 'duplicate page check'); is($doc->getPageContent(1), $doc->getPageContent($doc->numPages()), 'duplicate page check'); my @passwords = ('foo', 'bar'); my @initial_permissions = @{ $testdoc->{permissions} || [1,1,1,1] }; is_deeply([$doc->getPrefs()], [undef, undef, @initial_permissions], 'getPrefs'); is($doc->canPrint(), $initial_permissions[0], 'canPrint'); is($doc->canModify(), $initial_permissions[1], 'canModify'); is($doc->canCopy(), $initial_permissions[2], 'canCopy'); is($doc->canAdd(), $initial_permissions[3], 'canAdd'); $doc->setPrefs(@passwords); is_deeply([$doc->getPrefs()], [@passwords, 0,0,0,0], 'getPrefs'); ok(!$doc->canPrint(), 'canPrint'); ok(!$doc->canModify(), 'canModify'); ok(!$doc->canCopy(), 'canCopy'); ok(!$doc->canAdd(), 'canAdd'); my @prefs = (1,0,1,0); $doc->setPrefs(@passwords, @prefs); $doc->setPrefs(@passwords, @prefs); is_deeply([$doc->getPrefs()], [@passwords, @prefs], 'getPrefs'); SKIP: { skip 'optional memory leak test skipped', 1 if (!$can_test_leaks); Test::Memory::Cycle::memory_cycle_ok($doc, 'memory leak test'); } { my $doc2; my $serialized = $doc->toPDF(); ok($serialized, 'serialized encrypted PDF'); $doc2 = CAM::PDF->new($serialized); is($doc2, undef, 'open encrypted PDF, no password'); $doc2 = CAM::PDF->new($serialized, 'wrong', 'password'); is($doc2, undef, 'open encrypted PDF, wrong password'); $doc2 = CAM::PDF->new($serialized, '', '', {fault_tolerant => 1}); isnt($doc2, undef, 'open encrypted PDF, fail gently'); clearerr(); $doc2 = CAM::PDF->new($serialized, @passwords); isnt($doc2, undef, 'open encrypted PDF, right password'); checkerr(); is_deeply([$doc2 ? $doc2->getPrefs() : ()], [@passwords, @prefs], 'getPrefs'); SKIP: { skip 'optional memory leak test skipped', 1 if (!$can_test_leaks); Test::Memory::Cycle::memory_cycle_ok($doc2, 'memory leak test'); } } } sub filter_testdocs { my @testdocs = grep {$_->{filename} && -f $_->{filename}} @_; # Choose one or neither of these. The first is for production, the second is for debugging if ($ENV{SKIP_BIG_PDF}) { @testdocs = grep {$_->{filename} !~ /PDFReference/} @testdocs; } { # Disable some PDFReference pages we know we can't handle # ALL of these are due to q..Q and BDC..EMC blocks not nesting my ($testdoc) = grep {$_->{filename} =~ /PDFReference/} @testdocs; if ($testdoc) { for my $page (89, 97, 167, 194, 208..210, 225, 226, 230, 302, 304, 307, 308, 313, 323, 324, 375, 376, 377, 380, 384, 386, 387, 392, 408, 443, 471..475, 482, 491, 494, 580, 601, 670, 842, 947, 949, 954, 1009..1020) { next if (!$testdoc->{pages}->[$page-1]); $testdoc->{pages}->[$page-1]->{skip} = 1; } } } for my $testdoc (@testdocs) { my @pages = grep {!$_->{skip}} @{$testdoc->{pages}}; if (@pages > $max_pages) { my $head_end = $begin_pages; my $middle_pages = $max_pages - $begin_pages - $end_pages; my $middle_start = $begin_pages + int((@pages - $max_pages)/2); my $middle_end = $middle_start + $middle_pages; my $tail_start = @pages - $end_pages; for my $p ($head_end+1 .. $middle_start, $middle_end+1 .. $tail_start) { $pages[$p-1]->{skip} = 1; } } } return @testdocs; } CAM-PDF-1.60/t/pdf15.pdf000444000765000765 4276212203034032 14116 0ustar00chrischris000000000000%PDF-1.6 % 23 0 obj <> endobj 30 0 obj <>/Filter/FlateDecode/ID[<656C2AECFD0DE2459B33B13521244CE4>]/Index[23 23]/Info 22 0 R/Length 55/Prev 17594/Root 24 0 R/Size 46/Type/XRef/W[1 2 1]>>stream hbbd``b`*@5Pv@ Ȱe`ϸ3@ endstream endobj startxref 0 %%EOF 45 0 obj <>stream hb```e` Y8XKoò`yFdFћ A )PpCJBEow endstream endobj 24 0 obj <>/Metadata 4 0 R/Outlines 8 0 R/Pages 13 0 R/Perms</Filter/Adobe.PPKLite/M(D:20080813140932-04'00')/Name(ARE Acrobat Product v8.0 P23 0002337)/Prop_Build<>/Filter<>/PubSec<>>>/Reference[<>/Type/SigRef>>]/SubFilter/adbe.pkcs7.detached/Type/Sig>>>>/PieceInfo 14 0 R/StructTreeRoot 10 0 R/Type/Catalog>> endobj 25 0 obj <>>>/Rotate 0/Type/Page>> endobj 26 0 obj <>/ProcSet[/PDF/Text]>>/Subtype/Form/Type/XObject>>stream /Tx BMC q 1 1 147.9998 20 re W n BT /Helv 14.82 Tf 0 g 2 5.5017 Td (assfdafdsafdas) Tj ET Q EMC endstream endobj 27 0 obj <>stream q /Fm0 Do Q endstream endobj 28 0 obj <>/Subtype/Form/Type/XObject>>stream H0 endstream endobj 29 0 obj <>stream hlUr6y ⽦ѷGkѶq7kx jDcU&Z {m Gp&#P/8&qN瘜MT7HK?,i0T 6:$Ft&~SQÄ`d%^;;V9]>xRrsOMdH~{䲍ޔ Va0`&ö UD&7fdE]M0w#fc!E.w 0z'83>Fc>N#s4J(iF\|1,]NK01qBƑ%"FD`ĈAjéW&pYx^"E8G M8__t˫oYTIiivƖS۷R}ѵW̄wDo6ܢ.0z1>gCtT?9*E~Wg endstream endobj 1 0 obj <>stream h޲P0Pw/+Q0,H/-K-0 x endstream endobj 2 0 obj <>stream h޲T0PwJ,Nu+яJ,HsKOJ,)KM$&T C0Rng` endstream endobj 3 0 obj <>stream h24P0P04T06V04R03S (T&A(.ɥy0b+  endstream endobj 4 0 obj <>stream 2008-08-13T14:09:32-04:00 2008-08-13T14:04:14-04:00 2008-08-13T14:09:32-04:00 Acrobat Editor 9.0 application/pdf Untitled uuid:919a1a6a-602c-4cfc-b042-1a60b5b0529a uuid:16007f7d-11a9-49b4-a759-2375d81a18cc Adobe Acrobat 9.0.0 1 1.1 endstream endobj 5 0 obj <>stream h4N0Dep׎[U VDC%Ql@}wmzw̢ ؀^0p\"ZˀmA!(f#{΀1LiP6N 7^|:bܮs2xS)8-g̞c v{PRZiQ {r7q'i_J/)y@<~4貔s?!lc *Ts /jzoulBOwU X endstream endobj 6 0 obj <>stream h22R0Pw.JM,sI,Ip22000464101450Q70Pׄ/pL.OJ,QpMr, 4}S05[5委&u'*ji,I+)vv~+ endstream endobj 7 0 obj <>/Filter/FlateDecode/ID[<656C2AECFD0DE2459B33B13521244CE4>]/Info 22 0 R/Length 58/Root 24 0 R/Size 23/Type/XRef/W[1 2 1]>>stream hbb&Fç L - b`$o^ b` 0 ? V/7 endstream endobj startxref 116 %%EOF CAM-PDF-1.60/t/pod-coverage.t000444000765000765 62312203034032 15172 0ustar00chrischris000000000000#!perl use warnings; use strict; use Test::More; if ((!$ENV{AUTHOR_TEST} && !$ENV{AUTHOR_TEST_CDOLAN}) || $ENV{AUTOMATED_TESTING}) { plan skip_all => 'Author test'; } eval 'use Pod::Coverage 0.17 ()'; plan skip_all => 'Optional Pod::Coverage 0.17 not found' if $@; eval 'use Test::Pod::Coverage 1.04'; plan skip_all => 'Optional Test::Pod::Coverage 1.04 not found' if $@; all_pod_coverage_ok(); CAM-PDF-1.60/t/pod.t000444000765000765 43212203034032 13377 0ustar00chrischris000000000000#!perl use warnings; use strict; use Test::More; if ((!$ENV{AUTHOR_TEST} && !$ENV{AUTHOR_TEST_CDOLAN}) || $ENV{AUTOMATED_TESTING}) { plan skip_all => 'Author test'; } eval 'use Test::Pod 1.14'; plan skip_all => 'Optional Test::Pod 1.14 not found' if $@; all_pod_files_ok(); CAM-PDF-1.60/t/resume.pdf000444000765000765 11120712203034032 14506 0ustar00chrischris000000000000%PDF-1.3 % 2 0 obj << /Length 1 0 R /Filter /FlateDecode >> stream xڝ<]䶍tW;+~Jmlʩn/ytk[m{v7>ICr6A!nv yhv;ݯ5A\],f*ETwBn۶iL':*OBJx,fKX!V@jCT1aa2Å$'hوǎP"[FI5Yۀw 8 z51 L3Y!u(7V1a`X1b`^v h)L E%? WE"`yX21 GmwkzPABYcAšT(FĭvWҐX Re1OZVQ "j4Ѳ)XVuQIEr ghVZaʅZ@a-,;?qn~&f}* ͪ 5mvʼn6Vkݟ>J.` >w*ij?>./sz-@QQ$Uw1OJ* w|W}t? #9[hISR ŮU,O G=~.9`0@$A ?$+U!))JgaAN(/'PʃN* 2@ϔ]mC^L]PeWP \%H ԂD ~/}(#zH>7iP=QAQA2A   ˸B5^#P~K#I 'Oܦ멟T*Aܬ`5YiV'2(,g Th5=.-# 2킅Z8e)L͉)Jd9n޽S-',Wmִ^/LU u\sw 2-HĻ4*~2Qؔsr.ːXF)*3Fo 1Q5N&oCS>#T$Ƙ0aUigUQj9fEqQk(7k VMjeaPx|Fx-3 ez}>Ur>i2|H#kh4v.N(rj]״Z:g%9!L֞:)Ȭ8O]<61ѸIqkOdF1_(mM6˅&VU(bŀ[n p "LZ<ݜQb\ӝ?T.el{夰ɣ_| G{12 Ao2Gr(Zy$tir^YF0`xs-@.ÍK,".!a:5*Shk?4ڎˈ^4$w]Sva X XFE|LHdRTw>xwJ2#t34r8cpn)$pԐm#4ǴW4 7<'H*  i)+[uKrKW(Y(qz< YԳ~4NkUU阽}?ڵ4jc4NTwx `MpXq X= 4Bx}5Yt'xq o?MfFn"*c-v]9uIH{02ܕZs1)S(yc;O$(薥- E7ݔ*ڰ1c# ZOjÐNf/Dc.}sy7}}M H¹f5ŴgD2. :.0tcVs? RP2|.:FE L8O`7Gn oxhxhĸ7{<8 9i2Y`T$995Ꭓ*Ģ-Fs5q5@?K PҌ(c2@9qU ^g&9WQmJyz΄.r"`n!)-'4[5]0Wﮧ)o4ZR)Ko1*nj ب~mfe8x1*kloț!-nqV,ÚN^em SwH]p) <sX d8c%9Ԇ,+?K2 glɤmlثcM*~im*(^K GxíQ>ZB9 IuxsXyg]x$^nZ q )P**sG?Iw~/澥Ԋ$87e|8kO`>%boˡOʮh]og2\>Et!>{^0v°wO$nB ]7]9$l73/b;0^um|5s֤.$-`1#0(G>PFd"IrDj 8sCkݵ"#  ~NnS'Qr.aԳ"W1D Ӌ#(V"Ep,0s4yi0wM"4\npA"sWExʸ c6gn*c9Ql{iZ *@HT@T?FPSH*#̣!Zu+VVޯA LSu.7o.B.ɨЏPTk_ -0͙ZlZF'NYʘC=-;mШX Gy;և({ ai8WܯK~ߖgڙe24|:ņrGލy}^񀹴6V,1*΍/u=:΅nHM]V RU68Dw]>4~ jcƻ4.\G9qJ3L2mp9swM.P%5elL)Hjyit\Fo](Cʨ TǝK|$Av)1~IW+3\]v$@I @*s~qO]bh3 2*[2âuߤ Lc/t98ɜ7DUzBE IY9hZ (۱(I^{Z#0*#+'_?HX4?_3Rھ,ڽ R6jM^C˨:w@"x4Lݿ{i{u{#xhՆݯzR=> endobj 5 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2.0 6 0 R /F3.0 7 0 R /F1.0 8 0 R >> >> endobj 10 0 obj << /Length 9 0 R /Filter /FlateDecode >> stream xڥZKw8WLO=c7}x7" -N3~K`I`L6Kߌ_ ˜A-f`63",d`k?o \ ۞V$bOIIBSI0*1 2!2׮ oѰYsjIDи!"j a6l̗D2Fm$h2[Q(%]\Nem'Eo/k_9 yHqAö-c3fWhjH<gqc|%"iI6JP$ Bfi gFhD"Bfj]qF{ 8P2 º ArTV%n,)Th <͒8wo$Ah5f/ sK! 1wa'27iv[MN ܄Vj~:}C[fc|Oj+(aTiR":LDXIl2֋UclGК4 iHs eH }sּ1P 4jdJˠ.ґMQ&f!q"e( B.%4xRKkzLkg61kcQ+0'0:m* ۛ}u#USQ "hA,\%HޭNpvfukDzFifnc>k Rа %cbSAJy+HL2ÔV$Sƽ6@v`0tBBHBl5ģC/3?}i:<,hhD)kRjڤtO*ba dH!0l8I1bta9q@o ԪNv,QInڲ~^z/:7pat< &Lu3_D9T0wc;@j/t^uDڼ׀sb0ΙȡZ^@,?˘|GĔ~*;f_W/<WP4y,U:N7Afb-?LLYy.:N$H E#)\./z\GLNTmSNl6jIAc׷rzBp[l jK{j*8Pc*8]kNe$ϨW8=5_ďg52.԰U|>XwHO,=POvi^ pNk qY.!f8٥cB&r]2!Vngp3 MYq>z<Ɖ0ZV^ =2nA\^AaYƉgeBu{nmeng 76eX0sXrc4%Quq×_> endobj 12 0 obj << /ProcSet [ /PDF /Text ] /Font << /F2.0 6 0 R /F3.0 7 0 R /F1.0 8 0 R >> >> endobj 13 0 obj << /Length 14 0 R /Length1 8204 /Filter /FlateDecode >> stream xڵY{\SsH BPQ "rD(7AP[Vm:::kK-uڪkg}v[w]~e]Qs|sTvo?op.9ܿ9 l<; cEtg#Kۢ5MmMwڂmZc{x)ͫ\Ys@LL4y-:Mm=?>}tUC*@l7odZ tN2^߶cO'tvtp.83o\7ц #Yom J-i> Q Qtb|hJLe5ޖddGJj8~B*Bb5J4|+? %)lZR,% 0ݘ03Љc"0cЄF ԡT!cp|p >#WM %xðkA8o.q\#8Ņ"rufb\>( p'nA.lfȲqˊpƙ]VIDٖ/I+:i;G #:&hDPcA3ͅFk+N~VeimJlTpnRSƙ)t55߼^Z|Og>LOa˅t`-h:trmuc&G*Yݟ}ʲn?RE>IMqK|-y߻[֧{>wSς=Ugs޽6Z?utB-td$⥤y6rYoK)2Y,yK*}/!ѓ~%r\gLS,5h3&{qh4DW΂|kw=%W$]Zң֎I)^^94!\B!eY`Ϫ9p^y2u^vg-zEo`g^q&C(Dxtҵ TZB,Ng-\(3r1!szfLE&.\fgf5z7 YuV>SX2'H/G0((5H.f/ÒEF顁POZϪmN%Yx1P]eKՌ3^z0!FܭQ.e5hVthA.Ư3Ǻ2@=3Hτ1MW1 .l0 Lvc8C4d2OONա!<"cZ7X~gm?;XQqR[Kius]Ȉ+VBsgP[QkNQ(Q e ՠz6ؑ#n%~Hw3L64!Z6bQb20QY2ŎyfJ+yd!\Ju}aݙwu8>kѪnU_VNzydulgnoǎº>OHK17]HÂ-=$h?Dz9!3 0\C-S1iӨSqvDV-BWX%9B郐 򎂞%'a4b! qRXL>V"-S:05&~s^[Y[޶G옝4}=u5⮟OoR揝\~s$&!fb&F&ٹd1 B-38]b"OPpXvAV-SnTV\IW?SSb rG p{+ʷnly>#s;[g7`7v_$zr\ݺ>6F@|  h质Sr aX ee+&+Yu;RL z[v/ڻ׻ CKzɛ30[B~ΙENo|~ٲ'f;gX.yXޚېx8㯔NOru3O^R>)h;wœo.Tu0kƞǿG>UG6tNWR-(5ՄnE%Q˺Otej|#%~̷Ai~…nw9ZW1khzM#sS?,jOhyVԝkqk;E>=ͤr}Gq zZ'WDҷȋmlN]'z:[:#D|!nv}x㣁 5 ԰KI,m(P qX{?Ϡ@ 0oƺn{ёⳀ|xNόdBŜ9fAmOdT*PK~rH@zis6}DK-3=тEg2'GKw* ݱ+#ۊ'f7l_5L#m靕h[Nu.ސr`Ird.sc:(ȎQ}Ym]d]8L02F-F:CkT㐣/&0`0^Ux.o\r\zd8Ik{-[u6OmZˆ8g ڤy(>6͡Hn 6ljw`y/@W$d6^j`я>LwdמUuZDŽu=ufьeͱ?N> %eKZa|$q4]AxmV -+Ep{v\<4ssgC~7[C+)Mk12O~;n9`k'&b$P p*hGJ>#H1IH^6HKM<$ӟa8|K?8u^u+{?> ']s>w?۹/6l諓j4%)URVkӳ&2Ӕ/yN)oN5`; ]_3S{:I(ᘆX eAVu#I("L+y*y1!l>rW&KΫ{־5*ƍ f1vW( o Yr6Yq'aG\(Püu.TyVRn u / C!bI"7 MMG .G%P(!2ފ9%(F(ѫ`DoXD0;NSQ%_\\.%M"x5E/p)no&ӜD`._Vpn[#} d-"wv\oʺ-tw͌tYTuAt,fX4 L=՟`BCVИR8i¦;3(F xg n]xw{PqUKkCc ãCCZtMvmڸ~. qLc-N4@: 0;rd2DfH><ocL'Y[%Ժb1ۘ=ΕrxWjŐrrHʬU ^V9u]!M cAӂJ6=%i(%$PPX=1eݺݩeܔ?2`7Ri0Z@]i*"!>CcB:=Y0 a>,bbs)2(ʡ*,x,;F<.>}$9t#IVǏ@#ܦM~}W'7YΕTpaDT.$eomH# DG/4 endstream endobj 14 0 obj 5905 endobj 15 0 obj << /Type /FontDescriptor /Ascent 923 /CapHeight 0 /Descent -235 /Flags 32 /FontBBox [ -576 -235 1182 923 ] /FontName /FZGZRX+GillSans-Bold /ItalicAngle 0 /StemV 0 /MaxWidth 1190 /FontFile2 13 0 R >> endobj 16 0 obj [ 297 500 500 500 500 500 500 500 500 500 500 500 302 490 281 529 594 594 594 594 594 594 594 594 594 594 281 500 500 500 500 500 961 833 500 743 822 647 500 500 500 500 396 500 500 958 905 500 699 500 500 612 500 500 500 1190 500 500 500 500 500 500 500 500 500 571 637 511 637 596 500 500 636 306 306 647 306 990 636 640 637 500 493 484 469 636 583 500 615 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 500 1000 ] endobj 6 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FZGZRX+GillSans-Bold /FontDescriptor 15 0 R /Widths 16 0 R /FirstChar 32 /LastChar 209 /Encoding /MacRomanEncoding >> endobj 17 0 obj << /Length 18 0 R /Length1 10568 /Filter /FlateDecode >> stream xڽz XTq̙ ̌(0*$LTP QBԀ|$!HAQWhLcƸ֌ITLuimM{6MM?Ilp3#ݽga KW׵#`',ݰ>`7!e-Wh B6/R;3!yB uMoB)oW֢ +0NYzG[JagUҺu_YBga[pJ` c s1zEz*gC<'~gVB2RU癐x@GVdCv@NBnA^|hzQ2A4[amz 1?GO-jnm}p{Uh1:+`DAknClG{hKtJI#9 YǍMKM ɣG۬lTED((<3*Oz _0'>T` nM3qrĊC3fO?Đ=1Ğ߃' TT*jyg3Cz VUx쓪2#4AD'*`oI\|'6:hI$SVf̖#E b ̈́`~sw[6ҳ'z8&̈sh] ̼нWGKj3P}:$E+Ԯ88ܸ`&P"b(ZQ Loô<+xA[ffYvyl={w孫AvE!8+jxY P_ĞT,j th0pi`l-ZvuwՇ'N *_TiY5<5V8cvfU0 *g0Bu3} ߘ` , Ђl. SP)0Uvߠ \}nxFHտA[*.kz, Pɹs[jepWЛ;|U1v gPV FT K5.+`=U>S%C?2Eŝ2fQÔ1 v荢%0m21%P4e+FV-#+7n S03&.{ъ1O1J#UQS2 b !|1򂯠*[0- ͽ{Qe$fs{\Vy㿫C[{gg!.ҚŰdf P8 01>℔BU@@q`E]=ha* YX٘K,Zm D7pf" s|m--6Js$,װvʯQ WTT |6 WwI@ &"9 1Bb¶?8q}^_Vl[_:>>p/k-8i"}܋ {*צjdBIXŪ*5 vpi"[W۬gLa@= MTPY.@,OCVS~ϗ$@D@?Yu"H79p_$ȭ+ i֊-f +J_B=}&TZT EZ>S^1-dOG\` {$` ǘx'4~~ _9OxoR1k^ ǤGDS7qxT'QRKb#'N za oR 3Nzmp*^-.9MNS&˼(9ys<''JQReq"*KTDos[ϧ1~@oDD'ap}i@$k2(QHŹ>^ ې,% .g(.p ރcX3/1JL3T v&i7hngG_}~pjț{Uu$xUhH hRBF%MUYSCQIXrSœPAV*m 'ܫ,W6*gN9H`pV$GN>o-\WW .ӻ؃|뻗:xޕ &,{xڠv=vUS>EDegC E&uvÁUlvV<*k"+JB+;tEvFl| Z@A0fxBo~P] yqL̬KFL嶇| !lv>;iuI%_ηΤ[;-@5?[6GoDmb GQ^jQނuɒC%;׭< VFgFa[ꑽlI&sYr>W[@VjZU1!¾>kѱnUp"[07e6d(NKDyS&MLN_֖ǣxOϽo/:#^ NeKׄWsu 'u3{: :!^¹QFx2pޚ`"=ǵz_<[O\~tз dB^.: Rrf Xj?8pL݃4nt,fE68^$qsrto%ZF=Ph sZLK7M8o,K&ϥv`!q!8a6?rc72oTcyi~z&ObV;_{yW? }FC@DwZ'=nlT(&eF-+AHUN-ND(Tp"`r$|شoq)k/Z~?^G,:hBC#~8Q[|K֨s&T A>lԣ`)&~}u.jhmFZ}js  n܄0 _P0B"vj!~xϯb}mq_>os'|!^Zf{ɧ̶<뼋\I $`wߢ:BN dY˜'hܹ&Sr:rr=eBݖj@TMN792:-d̼e$:`-;TbcU5Lb$m7'?`rDh"jOw^cO &xc%Gۥ6T*nYj:rwV߶lk哪=gb𳎊?h$#']i*;(vufM.Nϲ?8q|f9݆ t9NB=p4+ժQ@@ڢUptDGՃ+*WϪTuO[~gY,untpγn[ޒB so j wAیF`=L%wņ5|Jr;eup7.qvg<L&GZcf8f燴liЇ, qkN7O1ט͛̽(ڌ0jd]7s)Hn݀ӧ18q?mxd(+xЪ$6[,ɡi&t|fd>riSY ir@֢VWFWP8p!v ν=Bx8>:v,wƘG]]}S ]k/9joSC)s@qD#JHPB Pxe|7crkJ,PH Ql^bK,)r\#7aYg5 pF.:sS,燫{3KDlx5PhDgY9~oۿWN?6}xf_LEwE3lBA$ ꃨL$LL!H/(Q3Fʅ-L_0 "~;=R?Ga C|*Mc n*O9|(OIubޢy|cĐCuj MJJ Lc@2e;A>o$ݕDB( K7%RRҜҞ;|X\ȼn}`-^`.(,|ע;ƽܳƖlOTK%` E':gOoN,xG;N0>Aj~hqɟ?Qqt1ni_>@/^ZQcthh2sBnuբ$6%J#TdeAL+ݫCYYP(+LsuQN dj y-ʛ)[Kfykg쏼l"gd?=m5_HCdaMNrhdۍ6mOd? ծNUde_Jك!da1FjVm[#VvZ$/c9yV2@XNK0iv֗ {g\Lg7-?9\Ҵg/ۧf^rƽ?gs_nj[r|]4e(UNi|N1taqt)] ON x=Fz*|9t<g\NKZw,}bdm;wp> *@/D4Jeog??F \SVv"5ՂyI%I"9E.wMF8EC|ϗUrY,2qhՋi-.r 7w{lPG Sov+NTpV+gǶ>J!5%'uT%C_U@%a+\?pgX@6;L5G uzAMAcj ETc Leȼ.&,D_KTvA4E/IU|ȧ5R(9R1, B"K }b:*v%fcBpV|삇[3*hd`| 2:;oAKV쑖eƷhm@Њw27%MB8pAR`|غI!2z9*P=_h-t Gy\!*2س^D@[H;|MC8w0ʂ9_AY0QB @/+%4pʆh-9?C'\%8?Vx@tG+<[YeVNzI0}?A?J8$ /_N +A چ%@lFUVVej\ja欯[ո)_eW5)7~m Ɇ!&(Dh4WhZA^T"HUs-˖s{q5g϶g ܟ?8mf;BAN5jJZsz%^rZj|[@ڤ&[[mX5غ&'`;@VNv6܃K'%>uRoq;@:ɿ >?@e_ {\*|yNds6i8\4DYq閴T˘9$;QMo  jyEBujdEբ!A4uV:N|$eMeEs˧څc܌1O`6FbThl3Wًly㛓[ѫ22*:{FW!j]($ZOÞ3=18)3*L_súֵCr`C endstream endobj 18 0 obj 7468 endobj 19 0 obj << /Type /FontDescriptor /Ascent 909 /CapHeight 0 /Descent -230 /Flags 96 /FontBBox [ -506 -230 1009 917 ] /FontName /TUPXXY+GillSans-Italic /ItalicAngle -8 /StemV 0 /MaxWidth 1010 /FontFile2 17 0 R >> endobj 20 0 obj [ 278 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 198 281 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 521 510 552 656 1000 1000 1000 1000 1000 1000 1000 417 813 688 1000 448 1000 531 458 510 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 469 1000 385 469 438 271 427 469 188 188 458 188 740 469 448 490 1000 313 354 281 469 375 615 ] endobj 7 0 obj << /Type /Font /Subtype /TrueType /BaseFont /TUPXXY+GillSans-Italic /FontDescriptor 19 0 R /Widths 20 0 R /FirstChar 32 /LastChar 119 /Encoding /MacRomanEncoding >> endobj 21 0 obj << /Length 22 0 R /Length1 15488 /Filter /FlateDecode >> stream xڽ{ XW~TU4ݴ(H-RA@("A(@EI$$hF#1Ɠx2yc 8:dywmݚ峅; \mبk9hMKf} aN0ba+BX@oL(#A F"Zd8IɮwjZ:x/?,sxֈ:d;6/8.|hBIɷO-A/Ҳ| A?e9k6$㐞@{!moq>C>,O>,HEZv>tGO҄NJ< =&Z6У,G[%ԄΡgd)C̨ '{Zr?9Jᩨ<`Bh|`ܜ1F9̟zR)$nl2:F9J0U/4NufW|Q$}JNq='2Qdb{Qm6x_2Z_[ OEorNb*j/SSGg(m^eSZ e_$HkQYRcT^  wl<[*%F5ޕQ.{_>ս_DKkz}b\ED3KWT0:Tso otE-%?jԪ.)wT4j DAi[>r^v>vN wC謴ezi:otF |v0h5u "6y5ֱ6z/W׳CJUww)8Ԩ\fJ%:Qhw8NmI/ΐ󪦲JqѸQSҡ^6[w7UvZ>u/ S=3Eo(k.Q#dCX/.{˺k.{E3gv7¨UThَXO0))WUY.ˇ.A]Nk *|^ Ԃj7Щ+ϙpO9Hh䙚(|Lh)\DV#H ?jٝSCw ؝Cwn<^QN[銉Q^MnR/7e%}Aa4)n`;U܅^ Zqom5UR0R)$Fq:&V(M7GHW^"?ǃ%(8!vP[D.fC(v{oyWn,ͯZgaTv(.cpj?CcF ɞ = vVP.rI5D)@u5cGV&'/0htQݝ"ÁnXZcGjX.Wo~RyT@ߏ6"`BN x@?Pͫe* +1wf C7[y-Ik| @Q: /)5⹙K2er2ERc PFA"H,d9GPz#Im\fHc#qrzăRA\X ]1.>r,,ae l!~[pPPpjO` =o,kŹ쑽gV?ݱ0}3f5VWt *~rGѱ)< ]Ǟ7|x{ljJ?”'Ud&ϛUjzg'5bƀH* ͵i~U跠oSw(PVk݈`G9BTT46=v؟5g%bl45wPR},rw}/l>sqAmg}8ֱǧqzLJ i{֎/46yYYlz_e8'}_:z4M<ct:!&Pr '# rL/g Z}`҇1^1~pq˂y%%y2u ~ c%L(-Q`ԡ6?x@  'L) v <~pN}Ӡ:ch =4d4KMDg)?Cp8Im=ԃ8g6]4Jߡ11bd`sׇԽy?XE) 2] Iў)o7tm۸vKYLYx yRWʟqʕb/[;~&EɲJ8̆UǏ?Ϸ|]PP<~`ߢi1&`9X RR$;$,q%PLbc]DpLw,qPq^KE[8KN8c X(<.˃Zk=?8 /%&?.WfO>vﺊ L=zyU\‚M;(W_חLQzH6~MD?Ҕr0dj]zIRV2zSsSwM֕juVorMӥJrS/TJXဵ 'VF˄6Lxֈ@8AYZI'tg;{yr0n6v߹zM]߯}ެQWOD)崒H֨=`V=Y'bXSdlV7VvV!C[i+?.4gX-׎ ?~ꤢz6iݱxVkVuu]E'>Sli wV-ڴq»]׶nҤ IhbEh| v%$%)"[Rrc9=jVn%UI2Dt(k%P խyK *T|x)0`DvdZq][֒>ulIYvO(@}M)Onױl6/%T"E"3ɖbzQ(om7/O^6Uͧiz0,/8iӠaJ>[~ OZ]ȉ +騞0l|tЮAve0(4$h^j8+(/J.*,,,* RkL2l$Sc&UN^E#|ӁUr¢C=fd&ibk\ [$lMhn,鰑2cgչӥ9#G'b&X zK3&K doU7ec0٠d/|\灮ri3W:g]6rg[^RJȍ㘎v:i>hbcd p8=bxT֬lxa/q9nK9EK,DB1;@lHp0ϔ'K.+g*wgc v(o@#~Q-1F.yFr Ikz9]6  `hoCT vǗpuvu}Cm'`Ժ1?;oxV9zv zo2hL09nru6H<\}9(@6e#,V>&Ǣ0v,~Yʗ9GTաn0x:E.Ѱeh0V|''[Z #nV&dk  Co1E&/z=`6R[Qbf2H_-9K CD%Fqq c{ 3;)]A8T dӯĿM+ƢMx `ɛ=?}*$`? T~M}6= D&k m%Mc58ζ٘m8S+Cݤ6{"\l9Q*rO1a=^)Ss4ǚ`}{߀v(#~(I6{4nఎeT3>aѻmc29}|pbTsKRdR)p'--^sm4bd47xeAcd'hڸ6 1j8jxD(/ĵ!KdRKOAӦ{1HgS 2mvĢڸyr•@a؏0wʼLeW/鸢G$10 ffOK4]?,z X2QIu tN8A,c0nx n!gQ'DCt:.Ye>g]V.~ |V)wRT~>z0{v7|mh<ܼ[H2"_A+t9⣼lggʈȴI#U[m r-~[ӷǹs .5*w7o-t*>Rރ#eM9zMrX%j itJYK3"B\%Ԋw\! ^`# o$B z G|mvn&Z]H?xYc!OB$I#4iY}ho:jC:={*7h8PTb(E~}Mݢ;'#^n΃mc$3pV|/~o'q>"`s@R(9e#qu-PK,/&R>/@|_t0!ҼʗO敎~?ri8'Ěfytsauh\& v삀@s> -bÈhAOB~3 2`}@q 3;2: P]hh^ ^VnoxYEH Դcbǘ(Gۍl^ox%/huv·وtMF3rTOZ tl4<L \0:ȉs1X\.G9.GS!^.H9 .JK5Ὲ^ʄ t :(ix-v!` wĝ&\ӷ.?bg+ )z} |l0b:Aj^߮:kcԨ(1hyN irXAݠv:qݺb 2j UH_`Wb+JJjbMc'ɻؿ35[ :3eQʪR6C-YŖ7&\0\mg1X2].r6ڷe;SM _Ԥ^}ądҚ3v݈5m Q>}EW\ؚ9sBMklP2,_η<%^NDګwΰWۉC`itTk[E1a`>fjtW}nb_xi;74>Tz=iE1>us껊4?Ʌ'&Sz?_zl[K"G1^WhH^6,z%;!Qo=k3лlk%V nsm4g.(W}$*̽OaգTŗ LO)2|82}cR=V͏ۏxrW8yw~[q~u#rpqǯf]\iS\gI8by$ѶDŽ,nMV$e!fYokԤ9j;NIDaQr@^t Uc B{O?' dX5'ѽ~'?z"f$WPcEH ^ƢBL1OIFl!D֐4j V)l1X:ƥ 3e3F%)g&Fb2KPhO[.ý{BN]3S3iD0:]jD'z,>Ӱ<ӡM<ƚ؁I$4OJJtC?O;L{,p6ydG.*Yye)8,^M05lN U5Zl@Tj@)wƛacZ_/CL}3 ]SVyNN5}?SUsS/+̾cEZ;0T3qNHg樬&fOeKM988~uo%fb(pNn86Qo+'v,.Lŵ%VfV(3thĮwM[d L`fAQ<0!d6܁,kr#ză|GQǻΖo E\_c ^SXˎa^1>6ZDҞ.ڽv݈duX0]hy@-}]E3xwQ)r6ӹVU~-?z`sgSB3<<`U ZArN̢vn`@ ]e"\X%B5Z~B -L*ZoWɾ>W H$b.NMD@T^ 2%߽ueNlu>}rMȂ uod*3a.b6f6$iҊ^{q(-dȒAcubV§ &}ր>_|8 x5+`SYHaM Ty1Dt0HIT 5,׷p탏|Ud[Oa>mzma+j1=3)03sd$5̣ < zܱa܉33L~ ȎL/i8U> {& "jbY(`$Vd4I` / V;BLJ5*aQ߶펦%U{/8Psp G-4rƠ :d?cpŐSt#}xW&δ=b5ifx/bDg%{&ŐE {&& d &|DӁJq;\Q:ft ~能kY̠? T,6aH6~1M}3_QV`! yadJWg5+OH:@\~ eŇ& UG^4ӠV+ت\H,6 L Щex .dؗ,\g3毸gQ_KQ=K=ȃ<˜ c Y.&vb;0GL.s.>emorO@!L0<:Ay ,F EڥЌl :3>+y#qԩV.Pdy75̏h:&yLE {xI؃-D ( TR\Rҽ1"2>Idzw{]!D.D;NDfξzo썛B;.-9M2!mڊwiZ"Q E\sh=>@y `"`= yHl6@Z  h{;_ ݎP=h?~s#h~ EWh'5Etlb~x>9wVڎ@zU@_Գ`nA};;je\#y 4vxPKhʈV5 ^B\]^<߃ç{DKMt=%s^ iFh5Z@_nn~~`8hjxʹx,٢ [ēVɚk}4LZ->cQxθLC Q{C^ ‰C`TVUBh*@$q)*ާ[ 4B4<4U-DUՠEh1 #%[whMoڷ"/p h~ŏp4=]~4OSMH+E}qb99F\{>|LGgwOgOoý?]yNH{^oOL8 ͋fFE?@mp:O ,.vSq܉:9*ڔVc]i(_8Y> endobj 24 0 obj [ 278 1000 1000 1000 1000 1000 625 188 323 323 1000 584 219 323 219 281 500 500 500 500 500 500 500 1000 500 500 219 1000 1000 1000 1000 1000 1000 667 563 708 750 500 469 740 729 250 250 1000 490 781 1000 823 510 823 604 458 604 708 604 1042 708 1000 1000 1000 1000 1000 1000 1000 1000 427 500 438 510 479 250 427 500 219 219 479 219 771 500 552 500 500 396 385 333 500 438 719 500 438 417 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 500 1000 ] endobj 8 0 obj << /Type /Font /Subtype /TrueType /BaseFont /FXBSFL+GillSans /FontDescriptor 23 0 R /Widths 24 0 R /FirstChar 32 /LastChar 209 /Encoding /MacRomanEncoding >> endobj 4 0 obj << /Type /Pages /Count 2 /Kids [ 3 0 R 11 0 R ] >> endobj 25 0 obj << /Type /Catalog /Pages 4 0 R >> endobj 26 0 obj << /CreationDate (D:20050331231425+738'00') /Creator (Safari) /ModDate (D:20050331231425+738'00') /Producer (Mac OS X 10.3.8 Quartz PDFContext) >> endobj 27 0 obj [ <7fc914162b23035f185ead1a999d837d> <7fc914162b23035f185ead1a999d837d> ] endobj xref 0 28 0000000000 65535 f 0000005861 00000 n 0000000022 00000 n 0000005881 00000 n 0000036490 00000 n 0000005987 00000 n 0000015287 00000 n 0000023688 00000 n 0000036317 00000 n 0000008099 00000 n 0000006080 00000 n 0000008119 00000 n 0000008228 00000 n 0000008322 00000 n 0000014317 00000 n 0000014338 00000 n 0000014553 00000 n 0000015465 00000 n 0000023024 00000 n 0000023045 00000 n 0000023263 00000 n 0000023868 00000 n 0000035243 00000 n 0000035265 00000 n 0000035475 00000 n 0000036556 00000 n 0000036606 00000 n 0000036769 00000 n trailer << /Size 28 /Root 25 0 R /Info 26 0 R /ID 27 0 R >> startxref 36859 %%EOF CAM-PDF-1.60/t/sample1.pdf000444000765000765 227621612203034032 14606 0ustar00chrischris000000000000%PDF-1.3 % 2 0 obj << /Length 1 0 R /Filter /FlateDecode >> stream xW[sF~_qvZyc67d> \ ە@cAZ} _B“ \qRI*OZZtM<$T%UXqrMwzY{ش{7m?~ɦ4#=!"<Jx!N&x7wx`"H8\%Y\`a賗 &$Xsڱj1LlXag + (hNqs1bMe1`՚ 4ϾwZoo% e (2ir ;3O/\,|ڠRנ0ٌ֛Z~.a %|hcYfvtf} endstream endobj 1 0 obj 1519 endobj 4 0 obj << /Type /Page /Parent 5 0 R /Resources 6 0 R /Contents 2 0 R /MediaBox [ 0 0 612 792 ] >> endobj 6 0 obj << /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /ColorSpace << /Cs1 3 0 R >> /Font << /F1.0 7 0 R /F2.0 8 0 R /F3.0 9 0 R >> /XObject << /Im1 10 0 R /Im2 11 0 R /Im7 12 0 R /Im3 13 0 R /Im4 14 0 R /Im5 15 0 R /Im6 16 0 R >> >> endobj 10 0 obj << /Length 17 0 R /Type /XObject /Subtype /Image /Width 616 /Height 455 /ColorSpace 3 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xU¶k`"**UDt]`EEŰPtXE׀(0 :TΝ{rs@2`oM#z6}spnS{o}]}yꩧz衍7[֭[~֭[s='N7YDDDDD`Μ97x_~iӦM2'xs̙W\qży~YhѦMn`~ܹeeeЏfԨQrʂ k!z{۷?쳛7o . s=w@:@[; tMk֬+g,Yr%͞=|l9_pxQ4 h2h9K勠֟V;m h2hڴ1c~ѣG袋˗֊ATUUO<Ľ ķb `3f3f줱_|ŋ;< 3<>uT&LPRRZAAtyyy f}٥ʠٳ}Ю}^_5`$.At)np@]PU |ɹ-,,<y`Mڽ{Við~G$Iy熰DDDDD~ ׭[!HR@gqɓAZ|뭷n]v՗\r… Ld7 P Лos=\kowΝs%K{lYwΜ9$ +Vg>IaÆ;1捞0lμ9g\9w[+||L;7_̛ɞ߅jaU75Ȝj&`&Ү4iRĀpf0ʖ̙3N 5 7йrEsm<\(F ͑cb(y̛933 ̟7cؕ‹fFኙ fΛW^WRRV qV .3?0p7avڵi&J@B5gTFN;\!8CWyjJƕ-[:?]zuow=vm{ȮjjWڄU[QEAcn<ܔV̸ί#cP=JʎI%f$A)D`.-գipPϙ*X#M@(¢>o>*~|h9t}ȑ9ym߾d۸qVna+ߺrğ׌ܺ68qƷP&OBCC t%׿dnŋO]oNg˿]I/b.Ͳ#(X;qϜ`;+p/$ݻw aيܹ袋V  Uyy98U"@5k8_y˕=w;W%{^:K0Iښ1'NҠVb򌓔:l-CI|R2tj s2|V&K.,8aYXjcPFh*F.tƆAJkUebFʫVO2eh\ Q='O;3 $5kրC^qS&&%ޤo^SYՉDy8${Bm@ GMy}jܣ#fNV_ 9mڴÇa}͍f{?t]]v&M`/ .W?1iW;ʎ<;1ޱu+G7M(>msW\e˖^x̀EDDD`{Gyd… 05 8d8 L ?~Ocoio!i[H:ZE8Ԓ36&2Qu.6ۍĨt ]pͪO;Df`t.%05/6DBuuCH망{݈7vW3mF4LHr& Օ뿐H}p}Y푶2U@%5"Yz͐v(A_zYg};؋g„ ׂJ˿z7ʎ///4A4iҸq~؃r8L2wɒk]OWƹOc@,Zeԛ'.KMS3R%Q(),GChCbRs!(LmaǙ\ڧ{h΄)|Iqf,M͟yť$iMn-l6װY3zeP:N%:}ǰN.6@hR 3F:dY pUs9!,\Z -Pj34wuШ9' `n@sxnb䷷?L 21y/ Ǐ?E-""" +^z޼y , lF=#J&L>uYuzw%]5ZY wM02.kPA}J>L"ݍpLE;15J;udDR,'aFD1AhˈIPh{"D! 1` x]ZYZI Ikܪmt$**zcl:$] KiwXKcux2KQ8ަg<b/ xHxYT~:|rfΜ 47]VVv›wm^=mЫb]h  ~+++Zá1W~ߴE?Noe|'~lر@CX""""C /Yg&= `-8yUް!u-aN0`yH' 6n,FZĬUS+ mzTf>ybemZ]#5qM7DMd6Ia3GwTcMZiLKqΣδ ko3[?\\ hmMXY1OOiN&J}dtѬʨFe~9W{E9QF aoBƟWOHAWmZh|#4%7nݺm۶ /Poyp_=ZV&(_{ן}^{EQa|`|nm֬Y%%%^XX8|IN{܋_|]7e^La$N ; ڪl-D"I*tFخexo^W2村#G츔A#a!ivUW2g̘NQQѴi89'Áw<[ouΝ{ 8__kOd13fϸf5[>ܦRWIv4TjcMrOQ 3/\4DR„R4Eh f5LZjИa6؆hOjX#׃ B=m$W2_#F&ZcҪb bf9xKijLAk#*IX&מΩomEAzwW~ڦIS W]C84>%m}0 iWKX, 8Q;]۩PlͲ_›hC.hQhX1? BwӞz꩹U\:eܘ/weT7j ?*7̟qrXwq0xܹg%6߯z٧O:q„1#~xoAu%֯_v7Y(d.>{rRNFFq/Kq#$VcqFH^QiKk`2Ahҥ1 bW+jRhC# ^b;jB%X؊P 5bB޴TeMq<a M2Cq::2LRNK-NqVyIgTx jܭF)#IAAH*mXt˥!-fTN4`p0"@|Z2A:"YrPO{y=z 8'9yswMjv%47yl6Pphc*:# +GT2o/rׯ^q邹sO '\ѳ>e˖!<"""-k#Gn޼fŊ'Qcͻs2p`TɲmJķXj*?mF|'5 J;aV!)VΤ GEO#]pڣ\jΠ=YUq ζ<]b I>Я ~ It/gL8%op5 @zZ4WpZ SNޜ^tLyТ׿:{sԢLƟfWwtۦMs9??-_|q׮]SL[gjB!q3`T 7E{ģ,͍n6,s|LSu&*5YHDzUPhӜ #MTLM?Skh| &lzU =,"b@F|>|/袋vF߂4C/~X$ I]*4œߺ>p髆fΛ7_?Hh(`~)&4i7]LK^JkAɡ>,2A$Ї9uϺ3U 2É/; W ҩFܡ!ՌEM{t 5s2o"h rA s0YGCKcb_F;rO(1 J* 8dm$NLmtS\I8tF 2*< 1t m<%}*ކQ3eFD2i`q=Q6g$xf̬SzYK0C#2* v,`Z6\FZX2^ /^@/_>]AoİIC7qC#:!Mfp`#ՂE-cfY#ȋ x60s tyr1B-Z/]q=3@Y&:jQ/*A"`PP~:wφFGu%= ~6;ҿ?{u~UFk_?,[6?cso=3G\DD7gڴi^zoML18@f͸{74o_S8xCK.ٷo 8+'KV.$B=r;TƸñZKT7'L*Yt0b9JDRl6^?֥X0Ym 'Gc5Q?Yu2!I'I2]|Ϻ+.3'W0bĈ+W>b[vzO?d쌹3m\nLj&$GeQTZ:ImU0_1jX+JA;`FfG* 8*TҧfxĎr΋ kd([+PP#mIʨ ` $]cL5a!FeaN߃H}h2R'( Բ1k+%Qcd $Vw@d`1+Yآj(Zރ` dJ'51 qU.T4 v1Dz&%r.EWnIeP B+X#nYR.+rhY0 0{ C'?b T~{o*1ҡ#QM#7@zlT8{Y4fnx`5-4o޼M6J 8/g<7Fpd̦HXM >7Hbi.Ӈl }ݒ 7ӕGD|fHm:p0Q6ؾ²҉'{ ./ 8uXbҥ6l8Sr3f̬ޒ(m@˙8ԊI1pO`UVCvvk}$v*KilYa3~1#^BUf jg)ts=m5n}Lj0ƄU:ҪP"ˆy\Y ؐ !XD]My(4U-w㤟`0] G4pDM ,LsfYډ!., F w]iiۛM0oeSA•)I [("M*@!cA:KW/Pƍ7h`͆)S Y}Vh,B%o>sԃcD['V@д)W^~w]қ~̙3w)J-Z^9rUK}gsʎ\ՙ$ ct}dD6TSx&{(3e"Nɾ}!4d[߇$R1:[O+l:!GIW_la o˞s9='O D{4DS&:ҡ:mIuPXm%CmW<!]"Q]#=:ݺPe3W_=cC?(hФOI_ZƩ˞KRռ5EPMgZ+ifII > lU^>;Vu{(tf\tGe̕e&+.dM &~akm=W _M5mN ؕ@"3ǂ+V*)Gzo\sii 駟 ogŋ3[ڦjZ*Ư|҆A|UqRVcB#:Y\Ǧ1I+0bh'y:Env&lAV8`.@S4lN|~ti!M|J/wu|v~g` L5*"QdDdnp]Zl &KbN]RY(-ȋb<8 $ފrSlQ1,S-1i507 *=,q 6__a.@s&p3 A-nS( MCZבI5lBWFKAa>_e 1,,~ͱ+{}_C;3h#P^9xwn/;򯟝uEK[s"JczUb,Z{'c+3D7%=d 6HH$zنG"%2l4t VF2nR $9-fS0nI,7XUT2IF3xGW_e˖XbC?;v[.H- g?c|umlFPLrW_mA.N!vBץ(˜J֎աNQԀ88.әtQ %>)cJ,R: TcBJl{ܩ=$Ȫ 'ZIj] Ġ&B ,XI v"RsU9UA8AB6Uڧz$MPnN.)qc6Ҳ^P'HL'e. #nNfI:&ڎ)Q1!BfR ƭEZu``kuGx f͑n ϣna S6֡BJ0`ׄl5aEoa>&W^xaÇܛBi2!t4) *?=cASk&qIᬼ“ N;῿Qwca\E (sǼCO}؁xQ}FIf yk { S9@6E=ĠSvĤ']>7MhY"ʧU0`Pom,(\y$AHeK;eT:kmuԩEEE`Gdn|ҥs;~jAC}tb"@m* yҹ)D:`WF3ʄHP{)7Ϥhj +lc 館x2H UjwB+e츑a-nBU*^ʫ0I )#mii p(&Íd,\˥cfIE{J)?WQ VJLQ|"Z98lM h"NFBe0OZ 33X5 Ò&,#4Z N2GPVJy.y(`Hs{x/QOԛ )054 ʛ 9`S~5ick%B#I*7w (D\3>hӿNH|po/s F'2CNT:LbZ\aB1U@`ȁ1ba&J'S ;Ё7 .:Lw7?ݺɓZ !a6nܸdɒ\LJ\KE,{f07S]:}`2(#P (rtL ڎ䢜0Z] &0_c7HpGZ.%;آ~aA*QrXe͝Ǥ%F)fq7Qishgyɡ.ۉЌh0>@H@P )(;iy'D%,Ex)ʭ5H$USD-7FTBwu1fƃ<-(sд**ǂxB]$lP)l$SƊS^BoS,A.OyqƁ Yfmڴ+.._ȏW^Yz c~~~/%QM$*!"[BTd+QUXLEJmT1I uAאѱΨ (f%AWdUhk3i$.`pRXĤu6:3ZX"@0b"dTFOIXʁ^Ow155ZDӃ-w5 F0C-66ApG :`1l*iUja&SMLߊXCM1NB`Fؒ`_-lPdbeKZi(i\agzyaw3n%*Džuz瀼yׂ2XSo6 =WbY ?*?JZ4l%ΨɷHswJW&Hyӯ+GL{aJJJ]ߎj_LXs%`$M c>UTkGH2;w:'Be#و,RjA8*gq+1(z#¸ `؟WX(ZQ/iͪg.twZZ9{[pQ JJKk_4K O7%k0M(ԪA-XչP}֫lȦ0 U O>XO;t {[0o#%vLnѨ2 i򴃐UBZ u)h7DB+Kq2 t Da=;  TEtrw΋"V9 h]RV90;)XD8ދ`. j1SNىzNfPn53N=Cx3e8#k=]DcM^.-G#JK)qI)mP[|v0oIW "t7U 蘤 ™(,gi Ҳ\D85[>2¹ or-C7ׯ_? ěFsA_ɤ/5£9˷Op|}1TkߔW^ZkO:{7<K@%L){dZ|+QeT0A{SLAG3d0S ʀF)/}歎&Op4Y=fP*%ɚC I_s/H<}t8Q%f܉gL*QV2$j{}ß֥X&[O}1ҧ˸j?z/w̝;mQfgȯbټysyyyV_Ϥj=QuRe܂ۋ*dF6u8<1i('?2v,oilI\tNxTCU֛vXԪ۵Rm0@jɀ5CS&eXo4VgZJH|ҽ7J&c S{K꒫ՊZyH~ =u6O=Upi>[M2] a]u,/mՇU~9!u EZݡt NP:yRۦP+nY%ݥr4ҨkkaZOݏ14EԤݍ`y_XBhYK핂a ٝ/͛?xnGgxΛmoܫ=4mơ5mGwK{ѯ Dߍ}M׏nܨqgqN=-p4[M:_s1bҥKw5?Biyٹ,X4!jW*EWaa0VӆFܧ”m[ qTnA0h^Ɖ0a*Of8̃+TH2RrufMʤG &io$q§E ):ȆIʠk8 *' G6y[  8qIR5둘"7;bnA$ġ>.6CaNA(ZXF1ңnO5vɰBbSO>dʃLaRY@`*`͐..Lԥ| ]4! e`򰖊qº 4;M4O~t.oBږ$o>.p7r*mNϭs㘃1?(;JCNΛxŷxiL:;o~„wuQ{{ dSlAdCs!ܝt^&bC ;qd@Bw!/HJ%WE$E|W"tрH :e{pM<n Y2O!)*$  UXmnBJ"B8ܣkT:iB`^V>vH AdCݴ#S͘W 0^l$}$b:aB:\ĥ^U d@\ Gz1T$$$n4$T`>7">o;'N<+"RGzHYT8x,S1-TMD%ØZփSkdA7+tKx3mۏאshEyC_AKϡ-y_llʿQwӘ/(?l)v?uƼSF2,/lei&Q@/CL-K3.1m:fLH(MsT$|G>,ЅS d"eCRs>3|NEY,S$}Q: 2〳a&aR*x% Ra@ _g@?,e&ςH/n̳_uUC^/""{npQz ϏCMkhs(*YOkCRԩ36&^xWXi?TjH7#>2عB16QI3븬#AsKs&݂8wi͟ fC'lRN>4Zb-:XO=,lP&ȍ #a%o@ztS'IkjuuW: +ԊvE/*T ;a : j:qKa yƄS.I 31xFMɖjK&W^nBt=m4Թt]_V4Xud`RSlBxsR`ɪa0"`c_EiR5$;<qFp =Q2DYFlœrI _.=4 h:T~5?fn@cr8wݘ*S&Ert}YQ*"X2 fwߧ:a}}BH8T]A[LUp ӾHT)K{mGȌ/u}ie3/ph=mv_8f=vg+C/+>Zm=hRg:>x3f̘8q /P[[+O!ᩧZrȑ#4'Mlԉk.fʘ w v񤏀*حy1aoar q ((8(" dDA*,(ŀ LxSn{nߜsUݪ{z.g^хuxnS]]:ydi<<ΥǞ}[܄BO\m]m8(wQ\6u 0tѲߠݦ?>ֻe0ޤsi\x/]s ݦ%K{>s7sjk{L%MQ&r:L2y m-$T>*5{0+BSqA\u+|:Q["czmx%mxiWQ-#n3y[MfflRT-7X] b3Ev6Jjm욂6JGСԡe.9Y3ySOxMzRYE }Cw~]|/nAn̄%n*"@RI@hE؃R8ːFI{ ay/NLC\;f<6w\hO~f$9= alh|WD1*Н(D"y_9n$0d09KASu vshZCUD˞~6@JWڦI [w!"}V̠Rx~Jc񡠹Oc":\ %Fi'6Mmc'&y"Vpa4)اdmNB%foECF<Ąme߷׳>|/}K痙 æ&Ӫ@ LkEӦ}ZkZmZzӊwzN뾬(2;::Xɞϼ@ [9]f?~H^g[-d6J?:f+$?=*[Wwfewݔy;$Ռp6* =-֬y⌮̴|o2K쏻4nٔ `ZF7 Rxk\ۦBY(+~=]Z4 yGO' kS5;pt%1/6 loX e&=gʻQWG\EG 0 M4׬Ys>CS $v2n _Bhd1Nqi[(F4e7D.s8ivVIdF@&:3WF|) V<:ΧHVC+(LWCA D|Ȭx#~ W-PH7pQW#Db#1Xņ_|ՍV뱆Ӈw 2Ȟ )tr q4gǥ 4c˻?іY0#2Ʉs(3(1&سf ŋ,8`Ul n."rTW!< \&x,N83xMBo5M{p7pjVq8s:ڟE2CՍ}J )#xŃlEWPz1 F)(oT jyIP2'b {݁%,S̠n\H E iC38aTvaI|s#6'leCHWG! Jiښuj$JJDB.&JG\"-f:Ayty{zЛ;ݛOWzM=B+7_Ƚ%7f| qOmP?՝g,0?m[X3zI'n|,?6%29?t9*ޚUMZj[y9X*/qj:HJzQx8ܨ(̵*2SRQW 9]ٞ"٨p]P34Yi: XCM͔IL*1%jzPz^e3FNrD,7#7кBmFj!bs><OKhv7/w-m)߿#N4ۓh5=7P:8&eC\|ܖru̘+97p%d$m-`|c١od(\@^ R.{y\h"qxf|h ύC)Ү=4@)sD|Hsq<+\L٠Ⱦ1BG2|@5;sжCCa~p6O 0yҌFWpH O)/`=ԫM[e;NB"r…1>5~:24d bOLxvK~h _k 8֌H ا,S%q1R-[<66 ;>h 9yۍ._䱔 U+~aY&]55|gX-˷tu4uvt{~/*u܁rq8<{[P+j{ljK2ٺ@*sNo$ 6j?Q˖WVՈWTc+LdU2IsΕ ;^98d;]sr]h)@o`p3ۑBqĀb-̙Wm)RdhZ_Ny* ٤y. HJG#;E[wd_|qW1Ow 9f1h'חp5GH ڑ2OȬ9^ew9x0Ij,f(eiOL9QÑTY( [`oܶ8Q$0jFҬu։r ;#\OL|88u2U:w;ŚGS$Υ(8|0{18-q7B ƭlhq\;4=E. ϗ}c$/'iv5`lD<ۘHI(,ȋm @Unv0?2qtrCcu~S;51\덦 ɳ=:N뒿3_/w~yi]OGӴt]h&漭2=8ZJ l] V {#N%Qrw;ۧk^ Gj}WB4ql#[>5d!5/RBV:0 ~RӲ%#:.Gv/<7gweQoVb_.〛 rj\"jB<ҿovxdہ`\^)>pHɃ5_ -GKY=DRQ[8ێᅴh?. /Hxs6XBe]L>_ }\]#@yq|%Sq

1,{2WJUZL/P-x*ef>*{ X!vhQu~٧Vt Uum+͒#[ J3u]w E[yd楗^j4E9B#.{KavsaRh,ds> !K* P|PpPrPc,S>?vQNj>)k`/Fvс{zVa ! f>6LLf#zNAi<,':>N;F#@;j8@<ϥ֙]m֊G#<6K,ۊKEtwȓlJ/{yv}wzکK{~8z _1fwqPPԴvnmVL5-5b=vLWZݗZ(jPucɝͲG_h~e_Թ{o{(5#d1qQ<-舜GrnǞCOTCQO9G{nTQ@pX>akbZzs[(E te{ƜI߷7,6S5ض~˽yR7-g@Zת4mO/\9[J-:&Z`f;R~CѼ _auvOnxm+?onz /E[v7 6!nVs%ޖG,Ac=NL +RaNeH$2);r"Y'b̨bRSH )RT81(i)/mɺUjGS=J|XQPh~45,2qbLs%YD qEgCeW頀N!d )΋l-/B:Υ{RnO1PMBn"uGT'TEs_8%Ei#Bbm{4?T%*c*J"x`(8H2aBIU[L$#ra ֪.fOGApҐ2 /K37§xҏ*_-#|¸:ׯ7=9Lk>dZk`^msCYÞ䃝l{skz__낮K::֭[sW^*>n@omJV KSVQN%1LW[ 2Wj*l]% ek+ie1fkyFCլEQE,oe]ߡ*QUu2F tMC* L# jp+leE WF yvOաvͩDyДZ%u_nNԫYQ.kL$藆N>7fC't܊z.礻{0+1m{a#]sMYb?G)$MϱnFhGN#dɍ`tAW")D"R2cFyb+n"m`Yfш8Qf,EU(BgB;ƃUR4#eA Q|Q T#9-9/rJ%d Cm30dq8hx Ifi"K2a̞ `g\y(A"lT$ #ƴ ן? YEP72mPD"ΒFy aT0HiK%( `9ZH3Sa^ĽĮ8Ufg"f߬Y> kc섰K t ɧ |Z8:7akLŦ9xb֜BRA>fz oFН$)^'?h)0\!*1ʣd,Bq an!;B#|Z 1݂dA˂-[s] X4[K(NI{犻p`N"Ɍy>`[v.* ,ؚ./lN5$=aeʍsި+Xc+A:T39Z<Ot@tF{O=]i&Co~DWLg}pEe 7dtyeV ~oex,ZfZqiyJ?O\rgy¯bn[;g٣ ܜtp/'{V":wة%Ȧ,}j}WC!7[e2묒6 )=G5lC᪕JUjf3KcthC1gݵ4<FJ G ^sZ:KL[a)֡|[s Yu)[21P*gHinE׿~nZc>jMrҥnxg^qͅ>p?i_vZc.:բ-_{?xwqږ~=&1$tJ0a?O*@ب<p$OCZ$V H`UJȬ۽{骃J#4DTQD&RnRsq!iq]Vr̎9c$ at_18n/PhIeDeiIҽg%5L=t$>{0qS3.\!3P_ɻaLXP!|i :p^0[_mJ5dNש2Ne`՝mU,Ʉ\bH]c4ՔSW)&j^&]TS)s+ǫ5P]4PPP|M =T=TxM^jL=IÅ@ my )Aˀ`nl>۷~~e睹j#| L^vG[o.垇oZsqί38^Th} p tꦇ~\t$T83(`\J"$,;r$) Lir*Ty2`t+ CH2 ES Ȣ,TʨYG(MRSq(21y!է銋LN)M@)2$8c4eIJpRN2tfQsf5ږ Ej^1.YFl\Ld_I-aZ!-IY +;FD*ubg4pGF,'DL!3|dJFTe dg+(Fwr'"q-5q<,!@fly+Dl29hC؂7ƍ")趟ܶ'|N;7{7zKn2ycϝ0U0aZØ:N1\44?._ĝyˮ~Mqy%LL.ʯԇ%r6CWj1ڦ*Z~H Zܘ-173j >;ԌՊ1A&׏rs>uU1UwLWPK nTjUr!h>/ȼwolAhS*t?0?m_ʧ/첓NZ>+V8~v7_ />t \E;b7tG?Q|7^ԏmD7y&A"!#EeNcb\-wlB&:jLlx:|ި}6D,Km'rQ(ZJBÒTX&FR1'\5'>74!!N41ҞfS>"9ZBeQb( dKmI:)Hة ʘ, jYv);QWy8MT4,B:NC)֙$XwQ/RN.sn4mcg "`$۫.nZrQNIІdX#r#DEd#H (8 :f ´s!8˻jtb"Ib^ Ҭ͛Kp`-)C1Aϟ~I7rƺ6l0=5Vbiz9ɧw:z[{Cm{LW߹1ue]nLuԹʴYq_r'w` M^{z{EUf춖tdDFzvbZŇN@̦Jfv5XƵ1'R6LZikxX*e|6S/a5!6ڛ /Ur}87尴hʐ1,Km iՁ- jC_mYm?ݯxåׯ 79~c~W??=%1ۋ`/>#7pjO|gy1m?P}HI$%$f@| X&I2CI,e}Q $b4 P·7x"MG\汤T/RH㨣tJI`7Y8gd,#yY'`{.SĐMư KU4$*EXLgZN~aM8%YdGmM{)M!Dҁ8ZiR1a@gzū,ph\4 tJS`1vh RD(0 ;E(H{^ZjysX=5&J 6w1pwI$B nAPb(\% EnuCwgoCAO70-7\ihg\˂ZnSh>qϧWb;V,66uqWRK8w+[֬Y^gsp|/% :\u5)o/WUY DqZzU7"FT;qTCCfVx 挱!Es 8\- 'djgUme մ!"doCE iMf*/ZL o~կ\uՕZYutчs?<7Y97oy[?~-hyi~?7nÀUOPʒ!)<iO)<r4fgCUpAhRp*j4R2iL1F'@=0\qj[@=N<~Zт`g-AefTEة=[K.Xq_QfC  * ܰJ8stNfeLN&BMb,3x*] 8 |Yn$L{耋J@ei 6"E'hH WQe,Lô?LnYAv&Eȑ =Mpꀘu9_Ǚ"r yS)T@.rӴ [pqdS02i0 k-xֱC>M|Gن~ƏTѻۖݲzN[iӦG|ߟ *pj`q9mϲ՜rBC+dB0VJ:ʃEh V`51StU3ji^L=27#E2lp3epzlTIMd5 n*lU9g->YH` [>s8=˖5+.]˷>p}7py7_=S[Ecoӟq|oqSv:3Jh@*2 4&Wd` h<%H9ʎ TJR)m*3Drp$DZ R4}xKk$9/YfO+#Pf#Qf劸wG>A.h$Tqq0UPMhwUSSssϐCy@eI_,'*bDBC{a*+E*8`PZw =}aL(UDnlMnj0Ai'qGY28Tt$2B "O1 "8\ie B# Eb{DrN6bY#LjfHͫetdn5߻~<̱}u5=E&Mο4.uu}e5ܦ?Mb>O?]zWwoW ,]}y}{Ò7v:O9ğxtNKjD]l}XqFi`|݃U!| u6SЀ5o, ЧUmU0j KKڳ'ٙiCSAΈӳET|QPݮ) ϽW W~ /8iUoΎ ֟y7ް~_x3 wͿ\[|t{z/>Spw(!)rRH`v [NL-ryfi2J(@:q>ϗCHyĦ<B&On3&q+7?=kرlAXoM0QKX<9c-[ATL"Ozp0y,P"hA&2) H{GL/ÿtM~j{ܴ dXw;_=[_8O]< [lK 4cDJ8^94kCeaO%G(ܕJ{rsLY=EZ*\j-OE! V.hņ_N ҒweZՒ6GgzeKjٟuW4boYLBSlP!G?ۮO:mÒKV$vժUmr߽W<>}kGos譶oM?s}o}[7pgz.3:S3\~]k֬9ߢ-s hɛ>pᅿ$;Q (ʉ2VИؘ)vNKTh[#D$_NlY9@$yfE2N12M%XʅL#Ja%*E*et?"Ih_h6 ):J*HEVRIHSqԧ<Qжz( t xUf4ю3%pXQ_L# i$#FK^$Lp̏)Spub$.R ǩ8- 'i[.Ei7&o­7o}LOoMO;N8|_6xo?k.?/N=%?_ 7³ "÷=u?=o'xjײ%^wݕwyt']y庍?|[Ekw}-[to8~~*B"2dF=k(cNl $aq"WY&I"E M]_ڏˎ$nڴ颋.oO~酟w2O?D?zEǟy晾=:\El+Vx'~c5k_ CA;%U y PF,dn0c 11d*'$THlo-'<+r2ceMШ*bGeq{lD83G(Y(1Q<70.KN  KHû=1ɲ74[N6'0QzѪO`xN+BMIJ8]C]Q4;AV(tP[IU1,p0V:5ΒBy|");a=* x! -Tҕg#U+`(*O{Ex{s--Xо3.EdxMyLApɸ,n=i, 8 <.[!q4\)5{u7r7/pix8-ٽe0mTfUMͦ M˷tnybC?$6/^yƥv)@Gin|Cg&`.8rJOOϵn`?шZ|ַg1I8ܬѹu6#V[ @.j7Br)[%EP.;ݨZp#֋{êl91J[u#֦ʃLyRej*>WQ-yﰞ_58M+:zӫLo vLǯ^}->r˓O|Hm/:/>HY:~//xrlԻzeʮrM7}?lp;(ݑ D~6~8x"Vn>3^h pG]Ĩr9gBb) qZ#ޘ^oDTɈz4E?Vggp>X7q 4*;hdb>?*ln@"0+qt c΁Q"фJs$ՁN4MәdgޙgߩF3swgZUU]]uNUq~g}.VX|2-oVvW *mԙ=2E tZk)nb`u\΍ Bo[TI2.yV)M]Ÿ́Et[ÊP\R_`43OK7@= 3̿OnIp |<1PbAA658mpÐi.A=y #FSMֻ4cȞ={N8Xe "]Vh-JXVDkE^XAXL\,i|.[yFUPhB"R+JjPڭ[LyтX腕l8oH[Q|bQqQс ~һ7߯oi.~բÇ/_X+|+dAnq^O9q+Z01czvs9fĈiˢŜzjEE2П+v>&t I ٠%RYR }{?'_wMhl|`e7+ G - *{lR0؉VIГxrRm!SX 1@lcK4=骣kKPNDbD@ѳe[9[Mg08f2k4i7Vl^KBp OF M4=ETe,Hؐ,EeP~m+22I"SYP5K(t ^ XF43 :I'd)\t T]$X9w)1jT5³1:]Lfh$P4|URe,3X^ET 8,< *V6SSE (dpfSG҈l,)dQ4TQ<$0\,UiLxuؼ6pDSlղOOۉ/aezWׇsM8e77Ma=Oqg\W+9tǚܶ5Q̴a.SBVf) ;oO|i*T' c-wVl015A6V͆ki+0Av6=XFQ|(l TKC*+=UP97흜|\\\njvuK=QN9gGq>ȯ =tpf2j]]z`6K-=phO%.+ZunH=_DI, IFVI䶂 1b׮]Ƨ|Gm֭  \WF(Zf}–QX\(fp(%>*!7MBRY%Xa3e-Y*j*F,QmTyJeTq)eZUNZle;ib[N8)@$2|%|[O+[ߊJjN(|A讴ᔿ,ᠤ:"F+)*4R ,=̢7Wd9BG@K1 *峚hOXI!م"n)whF~r#D&DlBDVXd)nB&OE"ksʩ5T2J)5 Bse>K"~ "T6ݭ,'x *Wm1I.ڣY9l=h鶡']x\ָS\>woS{zg1R1i]F,+%S2т. FUրtQtMEM5k-Xk[s=m"CtBnPq,2rcx mfeuό2+ofoY4/AP۷7\0z3[hy1;Α 1L5~{AY>|˖-M8y$YDMI KN*CV8_,E#/L\1$Q Ҷ*hʂ>bkd֬Y[.^|H(U ]tPhRC0((a[ir($kiMVeu~+]#Tql\b TϢe&D<5GFVqJMMR %Bo*~{5WUl31[Fgm=xLla%ER&.h*úPԈf!N{t,L2$"T4(f\ӓ(R6+/Bkpd)jAT4z=aEJ4tvDT*X6bdP"r^M'j #dQDW [9RCt6=ױ1bqtDT T 2Nvy)]y}K+$y@?m+]8:3zu+b,ҭmzZ١b00MXV ѷٌ\cW~ $):E)]fDYԩ-1xulFFPJzG ZsO,G%dd^;|MܩcF OW#˵_?!C~#c&If$dwxσb}y_E]o?Vf\fo&ٰ6& d1_ :wC}2oMqko_gEEE&LM:Ti G{uOerU%Rp;)%5UņjHR :^9Z\U~ A9_տ;w\_E'r?:ݫ_,46cZ2]X?֪^[hh^&y]E=rʘQ}zz;輄;~5s2mLߔV7~[-܌/}wȷC6իWΚ5}@>n=z8:B{_&9%5E W2j_f7n@ .pD,>b_eۗ6`3$#m٨>Wrx71 \( W2Of̏s;}~f>_gY0~T$ȒRV36TcQ|I!Ѩ*Uˡؐ TPr*_\O1Ṁ5L(ŝ"ҋ"TKr+@^E=V*z 1(r#K%*g=i6Ѱ YL+~& kIRLJ mO`%(b 4ZFհl{@PXdM4f[5[j(#Z҄ = PlN$RgK͉ih T +!6 k%"FDAr*1#(HR2^lV8Z&ai($Eeu !7ʪ aSi*LL YL +Ԅ*Po!-DP dD4'Jz+1JKj=UMd.Cy֭q}&uJĸY37,}'ywSso3wwC{,{oàho6qhB9in7ޝƌi=36'f+j*h;<̱ʑmwmflک`_VLP ψ& ,ـVܩfˤN2$NCHFKr"2ZVAum1A/ JCjE*|Bla$cL@H B ȢiD9`ӬLn+a?600޿9w'<Xn>~ums@qӋ1|g+u&0y.*zuvptpuuYxRl~gCiA%g[ 6jjWVFk[)VTm:xSYɱjh|#~6rԈ};wbl_MRW=xpH&JI+THS2^1(SH7^RZ\K/H.QIPUyqP4ESt =WlF9qQ< k4`,Elu3wRЈqH)Eυ]b:Iz2_gV1ٝ 3"zu`A~$7!V {ORHYAnӒue}mIm]x+jq ,բZ.>rh,**DE:P),b8b1I{1~RU@Lh+sxWIJFIjL炒ڒR]R'1@=R,d#POO?pqN+#λTǩW>fr?^ލwiƟ"f&6gyfW/.t)_W$Nuğb=祿̳Vz^WANՋ2߲zƟUc_24y'&J}cg@<\{pt!$.ԹIwk* HPkKT'IK r[n}>GSNVꈍW4hA#F Θ4{LV.[;ޞTN¡KGNT$EYR^Ơ73Lǡ$lIq8$( dҨJ!Z c.dj )!4&q2JgXV@GeI-L>Jc*X QeGћ 7qA íuw9 {߸zl1KσzK13|Oׯug6p98qßnq:}lғ&^q+lRiESeL.M^a~fؚi63Kgg@l-׺V+ysIMx{*Xv3{f>oTT5="1v΁ Ν;y^ߗG߾c bУGV^8&=|_ ɳZh|73Ykb3hc 0aƊ+[UīH{dWb OPTq,g:S @z SPit32y@)"HS_JSસ1ӠVIR< (r"^7&px 'U\,<3E&R[!#c) XbGl}D۾}ĽӜOnor>sԨ9sL220lބإ֭>zϾ='O$zXt:E-#>>!WWRiCR&ENڊ"-d]}Ag7RPV2 /O.(|%*SokjQ[%㩐p:)cl ƫOQZ!s)*),ʷQ4OɅi"A~_*FRUw u;BZU[䷳ z9R\!f -bݜ6.Q.Sl"e=&-'jeA 8vsN&bBSPQnBM4јz:WS@i2dUl@)mUR&K3#*#Re'ɜ4iGlHo9w#(pgi$.x܀vn-3Nr}_ffpO5cpp 4fG_W~iUU/9f-Z9vZ=Ǧbؤ.#$|& ?Z[ۑPo2lBiS{~9zÃl޴Vo`_Vof{9)[/$NLXqx{D 8z::|/uk+'Qp\',PeY.<Pd'>rl!ե(_f噠1] r Ў B1r%8e\ @vH/@ ۲@ɭXP*pIl<*g[ǎ'O:tGl}z﹒9` &{GG'WWW7W7w7wwO^x >|)Ak֯W$d'\K nDi@ܣh4#c$IPVPl-,oIDJH=[ j;+A5t :82ajcc/El"Rdq%@638JUEV* Sw:I].eTޒ@@YUbEH5 E\ B2ZG71n] X(jS [b/.!VaAFr!+HP~BI>R7EC鈔6U*ױl. `]Z/xFDl@-AsO_M{f)7qқ2ym=ӬXj7φv/=vf/hP!kw_RПwW0^tSy+r$Z)?: lV#E'_T^hd iĵɽtqqrtO\a'vE雲3G9wĝ^jҸ}=\\ݜ{yZ>=8qFmmv}=@dL뉳;Ab{>T|+Wj:S"4G^7uq#%zG PKX=ی 3+kh.CbDi]h77/u3l޼>6lpŏJ?'(6lذ'Bgr1#'N9e԰Æ|6d{@{ w/wHEGww77gWM0oF  %XӿO_>|;tc'4sҜ%sC׬]'nI>;1SY/?vGt}6=; d >6"ĺso%CTѩ*d m,N/@=&`*B@4؀Kkq[XlB608jOχP`FS$D"dD)&䅈*痡h [ f&WC'lYhP%h[Yڐ¤>sFb+dcԩS]zϜ3;`̊! ->߂=u:z6-[7Ϛ9gfLh&4pc<}կg/~݈ttsso}~zƌП={)뎬;uS_waQU֍g/Q/?=Ȯ/c Gr^ѓ[lM DL )m'4jgk FHl?WY{ ^b ufaEg)JX`)JXM-d/G/4<5JL 7=|Yiq;)TB)f0uUR,_)ȥ[2w7Ǐ:bp=oO,Np_} iI޶pnnclvlj 5:WM6se>ltva{SͳRˊK9pi73:ZH'jLrusxb޽qΞ==Yp> ]=}l_ vFܵԭ/K>"S <٫oG6?xo'b_QUz%IJܒ.bljӺ'cWc qg6PpW4s% 9Hv\re\ LQӥ0wǀ@:LK(Qtcl@v Ue/\-~ L,_X j>bCdجYݜy r4lأѻB E>r42bWGn ;݇?;$pK#a;w| ~WK6L5cS|9ls?vش#};w>9s'usw#s  cѫg 2a҄)_Nx%˖]|Þȵ{ͻ+"}zAM+"RRPϽ"wem=WI*V4lDK# R>Gy i Jf&LPhF>ģ5r*##ӌHSe""B'DOA HdePL!%!H,ju"1T#`ke%/ &G&˦6Q:IS2%Mo.^ =?;7}^c9xHۑ=9;{rmrz,87{^VHu wڵtssSAg{浩b}'Y3rhjh洪J֦̄qmr/# L6l;r޼I+bvO6;c͜/d|[w>ww3VʶXdF1qF,X&!aÃʪ>E3dO.^B"M8 b%֟$4`tX\7\df̙a)cL1m#;lٯ~^>^}xõ_l oN^} `PhhɘE=+ ov+ 7 7I{8~stwrOz/oq7\eΑ2嶂L 4t ,秽@{Y9o4ًʔJ=; k׌p(a В4d  d ˄9hg;\N4^(Kd.4PޞjBIkMWA]Jmb:/{Е+Wر>bsd?7=c%;_ذjê9[m[Dx_XlНavE',;d1;"w._=?~fo_4.lFqAɱ1'~.~kƇر>ls ݱeGfZt pa˶69bg?iܩs1wT/ 3`@On^nnnjU̠:pqqp0ms-WiݾZyV>sb o\֒n>)} /X`;(]֑ȕauT+,Z)K& BF?jӧ{yy}>h3#Xq]!“b"[Gm <q8*_:=.t}~gC!;-K[/HU'Bvl _r :">jI|ΐFGG\;:`/>Dܸ|1b7~-A G-x򹟅r1A3GMlʨ?5٧CG=uwӿw yAvsquqqwvpw޻G^}{C;sf-\4/"z1~>zgC[wܞ+9-)w_~Zii͛;Dޭbɣkyta^a MǫuNGAa1+TKSueD3 3T˨M4¡7#$)d6ѣ9 fEEԩS?b+7o/o \?979M?*="G\: >2. , r 4Xo s vt)"8.6tDqOxeAcg]3lНˢNbqs-?qS|9 ?fҸӆ;dү^}{:Ins~Cg0>8>C|F9o&|2ݸqƍ$l]?C)f%%\J?Xyy_PT}4XD-e4a"EMMl`29YTN5 + -Yԧ֭\YYri6owW7{ܧ8N uS@k]ׄu.d挱k f@}ifUgwZ?(]텭5M 6X1qx~OaO6kƨsg7НJA~//K8bK߿?ĴA#g̘o#Ba6T*+v`.Ρl!DS\V@,Ji PCvԔhФs^hԯ`|r4X<)iFOiAL, ^|]1\s\ М'UiP!01}oVMjs$:h55P^;HPBX')iAzN*Is$Li/3i-Xu ІZ4xUV}>h7• #Fu H@$d$TK"FD-9gLTȎЈ-AEw,2p/>hP ;DƅFGrvE;r pKDEIQЍX]g`EXK?y44dgA J;2lG3"`-3OE.$20.rz|dLȃQ t"6hȒ5~#{##.9hY蜵&|0/fS"to/|GϚ0s3& ;xּm?Vn`؎iώ=]<2aaӇ\4sFA1X"j[Ԋq6&O>p<ѻ3fp?ooO7QF}gڋ'kkIB\&q{vs:ldS&u::EhƘ*9͹v2W*/i4X^ŘrNEeH$id褰k@~ۻښ)ŽNXץ H+t):X$U_4K#2jXR.KvBR()ȲD,O9ᕞI'3IQxWź pU[m['dY>;o͂ЭQ]SOĆ_lВ A-ލ8M|Ш}~!qJ7nؐq#~6JWQ>^n^z9O8wsRx+6ap}a%N\ P/K?b̔tJKWR'n 7׷ C%&~1oM~gnwBH 0&F|Fs +vox w>>Əy#\nGPĆo/E9 @5w;</(ZaYM8@EL=5W&KhVXW6YM\ u&jrAiy !YvidoXE5ijӄ.ú!MRSvթuYjAs 37ܼj4&cstʮ+Je7C\uY4P踒7Ǝ;fTd?nnoEB₡890pWt讯N჏F,w rШ]!OX3zH} B-?-niэ}!Q[o_}rN'Bcݶ<,9&(  Ä*~I\(I|ȞUqQ; ""6AxEvr<]qQ(}z(,t[Dć /@T؞h1=폂GF<qd/Lq8L!3$9w:H F3XƲdɖ-۲dKOֳeٷ:w#A0i8`I>+˽H#yFy~SШBw^5T3 _hTȲӸ3央 :yNV6)f#Y7qsԈlfci!X.o$Zhfo,YTv\qEX^Ĥ<\4O_:sO>ꡃ|`¾woطo6oPo:wS>nFOmKܮ߁|JԸ /{Ə MfsFw407= %%䤳;7m՗ (?sH$s9NqP+YSuVhn*,+h2S^?7noѣd*Aкe^o79+!9ClDPtiZQJeIv-u,%׫׷+vC?nw{P)l&[mC e7A/ʔV\}ܿ]malAOݺ"](r !;&-^]5\rd< y]Ba; brb+ /Cޝ)$QAbxmBgr'A`DeXMad>=GVYYm۶^SVƃ!n:yQ{06SMUM`Z|ZX]S!P% "e#fx $ >Zy+/ 4zcWh=:Bd LɅpGiUÜ>%`'3:ieѺb-SiuAWrID$)p:^OU!IW2i/q 4 a{(1Pz"q,g;.f/q;n6 0+֐\-7*:W`ahu\]UOVf[IeʭQ͙I” ,r%sbZfy|:Zkp;rc^?} Bgw㶍 NIIKMM}OQ~~ӹuDwWn&E;zxG]obj8 ǎ+)fF-ÇwCFްaÁ22.][+Ȯ1!)ˬJQ?;lٲ*vl՟~&RXk+A߭[޹HenN 8-%nޞZn]q<0tQkxW3neѕQX%]\[ u;A-Z[Qgia&U0=q\\~2} Fޥ~p܂Ҳoq-%~ -|c4?;ygq"Ųww^+$]g7At2H '4Mh_~BBBaa3|hn۷oߘ'=D!uQ:hkst%*o#j5h'jY4gגN6٢ƚWkTBVPx*!/F5zU+pPl"\t&Z,CuݔQM1&oSհ\a`'ohjn%2$aL]R)K+%h6sJSyuXfs12$~(r29WSZ9M{TX+8גJ;7pw>~ބOPdVCrAbD(N)=*};T\)oF#;^^0Z[XXS10R^p(Hq?m =0|o-zB~ߙ>#MzB)4pt6 ?k`X@YVj4 &}yQ@dZEsCj$HFYYlл ΃-8hDGVҌ3c=^(/xʨ^t@?[Q+$3h8ޕk?9x=o]ܹ}ci HXRecH7֊)-:D0ZccU~ YZJKQU:CVgy B-?RH%W9\H Jf#F6MjidZ&f :ZAurT) Cm3Gђ|ucLAV3%&l]LjmU_daD`.Ǚ:2@)e]0 ԞtiWNH;@NU)rZ̆Ҳ9@ ,Vrh髛˩fU!7R`3(i(6ZmԵJzr\;[ê,4*Y R@Wit#ՃNY XzZKUkJ2kLعqG_P*W =?߁\E1H,B)E!!"^)NKtq\Je0@ k[ <+F"&3 nDyJr 8zsn} H~Թ4bK0XF"7!x=rp茂4:|-H5zAx_ KKR~/"bbxڇ!@;qC (£P`^O\71pk@4 _N< g>ooZZZvy<=EWI8[܍BQvc9;M7C(02rD-\,^L0N"Tь ~g:H9&O"ݼ _sB]s6fiM[PeQrκp^xap32J46Wf o>VINB2R]Dй ˈ5m 0fb EYn [cRi)Zf2y2؜k6Tese={Io`n;i]^ n!"n> %{{e($" @7|`Żb Kz0~g տ|OqE O]etOw 7`mOOY5#>At~ofL68g>oo:;;ܦ)%hכLS]ur7XRrn8ZZՄ3|PCeBvutR,Hv>`:ugN`# #WXk\ndx5y*^Uh5dFBgձkteHFxZ ^&[XM%`*i+6D!ZP]B;Eidt%!}*zJ] C\Q]UxS;]*>ْJᴒ6TQUJ5f'ufY.FY5ḟp7RFĪ&r49TF! 8BklL7i8MVWuDbu-4QSJxA:eԖ=sn8pю?qNG)v_7u/{\.۰~h**^W\ OOm;'8UR{Μz葃wmݻS V(dw7 =a1TQt:},chIL} s_,6 !  ybw'CYQD\7"sQB||$H$.FF]Oӕ}ޞָ3!\zoEzTYn2K4/Q2lz¦g4_NCfcg]jSMk3A*\٩ZUh :T4ꯌ(s6MAoS@Ȗ_ֵ^6.ߩdCH4z/6*[\vȨ6ރ(Is/֧*#$ZpE@dU `P['Y蚴NT+i6dXuCO trIP팦>/BG_1+d3_Q)ΖU9 09-RBAW8T\QޤTh6^ef<,[ϳP4BZYC=i/;._(T|J& Ej܄e6_ jSOT9\JMqC/Le Y0 ,aS{6ǢtYg:Zs):~RT}ښ|eIHMF'(8zd}ZڅWtCE(-? HwHӗ ZMyˇNݳwǎM6l߶Nr6m?WnL?ns;釾 5Q'X6$| ,wP ?ƗBҥ6< G~8.E֣eRe0@C~1<I\ &sm2wgPM /J {M nf/XF3~x57 BZbt*'#*CH @%ÂS .n@3X"PZ؇ V|-OZ # cp h%iiLQ# ]^0u Iz7R2Skf6M*V@tBipx mf ,fӔdКrpL=#2D+lALCBUf1'9N#]VQn%bX&-VS$h.XejHLz ˩cTNm)LcV6&QdffyB\\2 etRD r8?sbVQǪkIQr,'(Kh͋6I VD-HAMy"l8թ!ecW<vq1. ´xi( na);SGNxjjF7PZuѹ.s&d3HVP\BV *U'_YC_ސz4uX ײ Kq'N< L7Uk2Y./9u|w{CM7jis^3(UJօڰa^Lp!l'&OZnqh9CxS(Z^MAbp<CuQ] P K&7c[r"]^QܻE_"2DRr|MtiDѣ@ѿҺ 'npa_P^[ ,R'xF#Q_hxxÐq41 U07< 9~-A ;H9'QVyxM߽ +#7oKPhuk$Aq>GiPmJѻ< w_wǑܔh坟ZZ`l.4ֹ0ZFB)߂%l kyw 'S⛃hjvcn,<߶v/-9A[,6/hU߿2CeЭah@p> -W\ Bc>@ӡm^^\]->r| ų}zqi߆ݙ%|NVEX*юar.spiePQ(:(BnBL1Ԫ^CZN!靬̪I[թ*C& kɍdv {xxVhլwh![ E;I\ARoקTdv}*ו8 KZR *o~Fegd $^k(PvL٪֖6SlG6 H_zxS`6^-h284_Sͩ_HVUX cR+ 5D>mPAFZYC-\Prvxh"%PKytpvUBUOF>JEUXm9͔9Iڔ$(vMMsU r[U[H\(ƣ7^uuA X;Ô3xyRʆMhs=M<.n灸M,^/IJ<8TИE MFݥOt7RJlz~:WI4 |h9}G耠saߠogܤ(]wBoPQ%:Z(Ol`n*r:"lN9K~|QovDNWʩhᵼ7.@o{Qfhbd/X2 &Dq𭷦"J~'f ͣ" ܃QZ\ٽ}l܌,v; ~,yF{Vʁ^d{ )NXs$'4XO J[cc1GL,@' 'O~ȥKyiii}ޞ&''!6rg!S$P94W50p'W2l% uulF n0;T) ]avL'E,9:;zTL^՜ϔ㬃%zCkYʭ41^ٸJVf9n2\<);!+d̸S,<@:͹U*̚maUe({HMKWkYL1JkͲJ\MkmZu-j`6N  cIaWRn*4;Lu8*aV0WL6`:ԮmzMeTtS.S*rte3*m(卸"\,c ]3y촶רttmey8R MIVBakpU!AS/b#-\QNqd5O@-O6-_'Z(M 'k pt@pnf/荡Ќ87^5Jt#`z-@ÉBEW~#qtJTV5y &BB TiP}&+s>Ħ}~l;gA<ұ[7x#!@\ŽiUy|b]a'RDј2YL[$v"<1"֊T$ΕיtS)qL~ 0MdM A®BIFUW:9t n'Jl!g G{#L Bj4j8ҜׅlxZP ErChD64+Tb$@ +*]N;q#8 %77*ז7~򏐰rL /IEPvmNV[R]oHS{NRju(0 x$틃(deU~\+,;G,gwA_8PrPA#5^;̈oy"#k @*XZ8#>:07-|F5=v?@9g}(o7]`iVVdI5:=l, 4X7v~ji )%hbs F7ѐqiK|{-f`5[#o͈?#2|m>׿W|C))T*Kڳ}z6{~Q:Jmm˔T++*"-Ky]WX+vAU ;򝲝 ^@!1ՓC%)( ՜_V#*A 麬$u] &ZRѪOup2J,Df*[HM3⠭$k/p x YM.%Rj4Xo B_CJPB[\QjTg&eB&`Jkեust*TKCRTx4T`r P1Pof*uiBTju*:ZʩkI‚˄]NT6 ,ZإBAjs!SsTV>OYy@dڹ.N (5i*dŖq!cyYV||oE%n/q󳒖|'ceEzM/ݻڴ&+i/:Oߝa)ua܇󣋠;CѴZ-H_^?C،d` kФL!_ܠ;bDL~O^0< kv}(c[('@@Z*: jbM`ϓ`s?2GLMEx-%zD1x0<`qΝŧ>QB=uޟo,&YVe*蘿'Y(hl ?J9 @p[ RݾTZE #of"(mI5{-k=h@ӱyq"4Z4;o}/WzzMu=oEg?/!a8sh{ݠk&򆚮3ͬLeTj079Hag ?FN]Uy.kqIvZs xW8D0˪f A(k-T 5 c[FCq$Va)j(UڈFɦ`Za ^Mbm:Ǜia]j x RC5`:mgR4oڄ|܄fMn3wW^9דKw3;#W]ejbVߵknjWw; LNź  \w=H[x{@el7NдD)p GK V"#~0B{w*aX d z+Z60 xE0JaŇb18'MƦ|;W @[pa*4rzKA4jhW(8 4pJfH <ߜW{~![l bn4 8)F'soxy( Q0c@?Jjf<|zۓ"yjHF7G C07yN -.,'@wX|9s}ޞھ/۷zT54k!I3 4mlf%ՠ9l>tILչ9cʲlKwnRCAۛ„ =<,Q0HYeË<]r_OT)~w\\MR ͞Tn*\>}K]۟aJ?ZBe:ztr!:ķ$fۍo>+v޹{3@ğIakPL,"0NPm4:-w15=gއk1{h\{O}^NwF|P̮i~(WPYӊoA?u;cG~?{k>T g"o?F+G^to-{*rS#G{8=3(=iGп<{9| 3}ly}ǎ68/D+e^'5FJeŔ.UDkjӢUZ\8+RZ،JQE6MNTY@`ǘb(e6$,ۉZNSYAEhZU]ld,cSvxYeXx J?3ێwz1϶㗝YVc8 B.d0)WhW.NSUɺtV*vx br,2ƭj8iq}&gũέ쌼CsRBY:EeLkYtŬ܁kP\, @cM4 W:̬ieUӼ99xgrWvhB㔛U{ !/Ǧk y]\IUųB+;Ԭ6@϶k07KǸY骩W2mZ~ͦ?[wrۤ޼6=TkZЧ?Ho~nxM{wyllb٦;wnOHزwož={Ⱦǎѳ/dVQa-ʩ_*6ƍ7\?닞y_mvq+C1'Ex4n!Fmul)KSaZvjtA( zX2GAw!)D 18xGh9I,Da M nFB+PMEbcw-A0  m u[&@}E蜊<GgB18u &V2 Pt;ڀw[vIf L|w <-;Dq&=k"wG ,!Tw܃r+ D:t3zô_J1.J۶m>ҹw=|.iEB&R6O,g2<_\XK2.UVquC f/(ljÔ5Zd#pE2t@ T^!:xVNR+Y#=ڸeJ:xSz.+lAƶqZe,[Y]ad /Z>sP;5΂r9_KT믹Z+(]\=ӥdjmR[4L F)u(Q؋Vs4׊4cCe=t(pȳl;d1v\g2' 2]R \N]ckSQ63RT/e,/@@hQ`<7):~8z⹸9І/Jn߼=.n/E}&FKϞ}u{9uc'||;&ٺo;m۶u۶[oܶq6lB O_HK)d[[]d4K痾/w_[Xr?ߍӝiiqkفB]`)` J ] ͬz#}R^ Vp7ҪA7E= DL02cq8P?x8# ѕP=%бKӗm 0 U>U+B9!2 B R)dTb7TR fv<},%'P#/ahęFG#i K3!eM૑JKY /^!i7Zw(.nۉG='%SJ*J)xy ϟ?q$lٹs篖)(\7mQ 2wǎ6'=kKd 솣*2=-MpqTdK|beZ=q뗖f=A>Ίb{ӏc^aϏn-=XW0b oֈ`-9}hivFDF-T<?ӒY49oN=; Pާ!j}oB>am(9iߏf5QD$Eԙ) ZGO?bWʎ)GHP?A@C[3Pi?wIE : g>s(997622r̙ 렺#7i2gnN;Nm9:º߻=nm[C_~Kz۰e y-[lޱkgm [vܙpdˋg=sbץN$N='&缮'5JZ-htsK8URYJd g<^C1LnT3 TK`&˪Z4DC>k[iXZOJL1R9قrm#:ᆡ%Zd N02\cC&)O#n%*if:m̬*(:\uJɜm%8q$wP kZxp'z}5J-n#H7M IkdV4l8]ͬ6(m(QnŲ팪Jqc.K40:VJYQ9mX%'K4,]Ie:iUg:[` UEfYNRkȩK>n2 K/I~Z}zqRS^oM/{B r[ows/_DX'r`'bS+ۉrdYV;rʈh5A)];DЏ7djx,ֿ2r;*ƎHٳg9lyqQt*<>[p0G{kg{WS|rK-^ n'ֽrlCۿO궸M֣W_n[ wmߴ~מ]ݻѣ;=wkY3SLZ6KWٮ\eݥ8֨t֮-R\W,\WjTV)7l !tj j@o%Y1#& ,Cl=-7Ҩ!7J[OTimލ2SP$22`Zt#WTd/S:TZhQu\ZVHeZ,TNDyuP'4Ѩ'nj[gwjRB]v+@| jÔQIV_Nkךp}6:_5mfVc3vo'f8@<'ˠI*I[ͼ'O[C|Cz饽]nOXwm~TD_Nv-eSyeD(ɘH`O=I,M"8:Ys5b*FqN!GgHD89_Dse4kI/>}ᓧr±}[uێ?m R mX*ո~w8{B$ϘL}}GTy_F8 "vG#XrLܾ=~ >T[ B8}8Jjo@e2PP,V Ԫ#Q0{d[BK3HMSeHO97 Z 34 |AI?Dş "ՑȴG` *Ԅx7(01=q޼'N<ۧy{~sb '' >y1ɃcOi뿧ؑ џn^l셩%[Jmڐȑmk m[nb" p/7'lߴq;豣_p 3<[Chf'WdBJm18'YMSդs7S7TM 񺐝Y[5q!\k2nҒS=k! V UŨ.R5hqŬFOqVJwxեZ֊ `/ e,"3YIFRT&.Ujukz/\U0NuW xYb!uwV`-a^nJCtLQ 9#E׭VS#kJI2r*VMRmKCĊ sIm(+J;qƸs͝qR6'>.ȑCuW=|z]?gKeiŪl+-M BiR>ͿT 7%.fDeY"ӮeSs 2i"9{tIYv)(FJ<׳i*lVթ2Y\bSNV;ܔ Oo&z|`c|xδy֭۶رe-;|왴Kejxɉ|GZo@D&?{O[}>)xy ܟӏ)Yذ }2GQ76C5l&fBt yoRݖCl=XZ{ymFUDeΤ'Hnx7{ jR_SleHln?!:->oMoK|wLCCqRkO W^Q𓥓O'^yr'od䓇G>'^zxOnOnw' 亮/>o/ko|jdGo.c`5r+#'ccz _8SWƃ Em[o_46ƭߊflu˖md][Hΰ==/:oc/NN>})Y\.si7oAR$ v$A}2f;$Y"yUcױc;vI>iik6}ۧM۴M%JEMʖ=g@)v~/>h;sCDtu5}C=)w@@`;vyxw鼓r;ݽ SwtѺnꁔG<#Н|8sߓNQS;]c^fsElзQmtp%ѳz1{i~Acg.NvsԳr=5l wxrv0'?7:Q;l g`},jR<8wq؁, M~AzsddB7Uo)r t7(n 7)Л1#7 '[Ka/Zc81dGjYȁ%Ikc5Q;ؽq௧.B E 6lvpŪkwD*T;:qCH_k֬]5377 de_~CQQqqZ`PLYM֖W+źoO>@GG 0Gz_C?Goχ~>g3_9}>uߑyfwe7a}ǵf>=g,^y܃G?u3L?5}Ϟm;>x3O/=9}ǿtØ#G^\|.!9 1{}98ѯz7N<" u:UnR~,YW5W#ZAd.ґZRJ9zi*:҂K:eעEZJ i$]TQGut\Z v:QzV|b=?ƿ?ح|Q}[  bLA3s3+YV}A)(*RׯW䯑oe-}%ӺvBQfUez}aUYtT7npl=#Ѐp'b|yn_S* 'hQ\W= vW5'>HFou?nb{&͡G= m~V\~>5轗gvsT~`a|yI Tϣhk*펹S}[v֧uEu[Av75`c>$lm yM|L6eHDiDŌo WQrk޼1P޾Y-Y^n]WPPlVt&y?iIR<:4JzEwG{jÝ>y@'NIQ~9҇#5$꾠;I|b⍓!ؔh`!wo/#VMv}"9% &I7#qTS8\ $  q2wVN٬' mUj~QU䗔[_Xk d'pvv6Dy%%;7I5yk,UOuecΝ#)t˧~/>w?ٯҾЅ{C/G^ؿښ3d؁oovpRNOϾK_yt;?Xo]HD&iˬ0d7fkxco"\t+')22 r/QlTnhi:6x'Hokm>L&;D&S!wkNk շ)~%. |3xӽ;|tow/Nޛgsmw҃)wW뻟wqVOwEy VޠABQ>y.a j(ESvp܃uKvlxF7wbqIѻ-D4d僢BJ{ydF3{BM1_P倾PhEl5'+@vԈEInHĵ0-"~IsG=hQ6JlDɰe U9Ɠ oɁpH%3ܔ0^M]X7 "!DqGyIQ4G"mp/b  ?1p]@8'?VIr1 ۫n5ֻ**MNHo,m4 Eڍkᱲh y8#KqonvF+de^UX,jSVcbb`o{?_z[oc;}?<>O7x`ė4>>_>q }/c<~l7=Ɓ_?}G{/|}?NS}t32ڹKUnR}EH3O.sҲy7o.>[*]UgMJTvmA΢Q:hAPJ+ia5iY'HL\9btĦJ"+QfB% csV%԰j&-iXKi ^Z4K`HZ^Kfi&͖9^g_?jJяQXd[ G`ܶ5mNSTa2f[9G ?RedW6:kq;+hh :|KspǥSB6w` EB{d&m|ڙb99^[Jq6e'zbq}xfLy0Rо/;|8vڻKn۷4 Jy;t'OwRlڷ&մ6dA>wO͛opEQYGC]nƍpTfآxZ~mtm)ԧmA+&7wgGzm~n5 'u ]GPIBڙ`],h{P HB1mĆQ-"DeHqщR0l$͹?bx&G5wJd(!D0X0ME4!aK0hEa 8DF6&% ,#!:%)aR0ERq+(I 䄏%aVz6zu=^Mg֥(M2]kj|JV,V [ʁ'ߨNW|j63*R*sLrGNt1]c̎;Fvy+__xaˏǝ[Ox__ۿ}'\|ĉ2ȝ{Bp4/}ĉtM|С++/<({hCs g>+LvٶzhӦM|*,//Qn99T:HU\ғ逸ҁRiOW#V\`q#w.ڤoΛ.'ҌQ^GQ-r 7@ 5+`RtB'CHjCUJ JRZ!~+} ּBzC+]UC+Z m@U]z_ъ{?d׆n['p9M t8fmQSgK%3d/P)rP궒'ctBo)I {]ak uuƝx}&nh3 m& 4՝ y'pv(}\voom}ggĵ},i[ĝjN To}j8#5Hyv C_n*34-tK}}$/Q[" )oi UiI?Lew}o_(TWd:Az!75mk|wÝ_{fX./;#VYK 5(X= Lv|DhsXHP6e 7&*T]&Ah Zb1cpRE $ )o P-|}g(LB߰k 'd0~=.ȑ:!16E c>ah]@kE%E uä/aG?7Fm",~G]c)w);6XW~LJk}1`xp `(]=CC4jV67kNcERSpc^^< i^&hOZ#*e*>9"_N?čk7TThZ'۹3"~jOɿCsߞ&O_ߧ_X^t禧LO?osEB/oəSw[y<痍wnل]vr}1++M7Ϣ{oo9 .]%ީR^:cylk Ac_7 r+G5 ٵ\:nMIiEt, #j*Qip|RKse!!=/&עp,]JMIt.UH=Y_'fإ2Lvmr}I鮞0w3#?+?w/*i׆[ |ҕK2k8̪/(ހ ,ȃM5855YyY֛76LvcEPAzlnObMnFlnZ:ǼήJ׾aRAv+{7[e`-ε=[v`7 ofSl wײ%L4m ;dn*CWdd* %JJJ(3rMnrF.Y)qG&1 O+[xWlֳ2ev:5 yqo7nhTgr$7'A4Q\ nfsÕݼ#exuO1rC 4 T\ rQ|8cTk8j@$&W$(0,60,'x{ijrڠ EG\ސ܃^Na ĉp@O2HS(\G<#NaՅ#Рs=.״7*mdcE]b*1ؕ*UVEkf[O\YY_Pdf^#gG۰`%%*d8+o yĔ灻oC}?=?}O~__<+˩O=<7ŖL&? VU~c1l5qHRb[0Im%*VҼe1 LA-4,?1MtҌ>%4 2H4_35ks {?S"X/.y/sJQj|"ym|u޲lD9>oΘf܀\[ ;gҊ^n q{BU}3W+ͨp ~=V\%zZ@94E5C_EO<]羢yS|39T{^[ƶ5{f-\QN6C+Csа줩_s.z}xXϲ;<G=K{?w?>HMZX ]7W|INz"Cȍo972ҧKp+kόhK׬)qqH: $;O6(0AIw f'(-#wJ2ly0V1!$A wGq$y ihȰOK'e`T{ ԰ZI::"3aт} 7꤅RQmhyK[0_]ݹ }<;Uo5bUXlz?W}Z԰_fe;91Z>:d|mtgx𻆿yEg_+#/>>)K|C^\ov_LGY,ho"`s1Χchڒ6K5&MXe֗뫫ڮzp 8ֺ`k&&| g6Nto2wtTk<{Ds<@i1?Y/l/73VEi"'ۡ ?TQzTrsbx..p@x"O|gDx+0Iɲp^@# L gQ-@2$e+Da\%A“%-9A$#d*)g;0J2L1HF3E| 0GtN x5b͠jgW;W2D"#!n+x`F!C{ 5B~U4Ɏ54v0lڽA7w0zcn17MMSe-KNrUR/Ntr|33sѯBkց*3yYYtOLLUnϖ^z#2]鸠, Q¸ {6 M~*5]ZĔ]j @fTu*)NݪTy#0!uN'0J?8jxwc8JcV =jY:bm8k ;k8xI]: ӆwi VPʸ7џug֬1Z2O82d /ݚ}3!S.g],e7*֊Q!%%"k+յq=lV}qA>h}}>4~|;jxZ1(3y 9QetkYx}f4H̭jk/ N:@no1IҲHdi; X&QdDl"!A:Ya ׬EZ4I36iE~m3\]mf0ô^:fGUUytjltFd\ VU>[FGG1]l|sU}]^%t#`EܸNc++ 6jѓyHDu/[=AAH%4:-VrX+s*UG+`1K.L5a?:X-Q >_*U#.( ysQwm^}|HTr=` 4OCl M7K-ly}lV-b; z<3G<(wI/}^/V >^-btѼ:♬D2^a˚|i+a]AHSk@:Sqt 10U]>Q=E;A3lh XXay¢(60,pf~A;LR9Jy%Leu51bfH Š 8šҦPɏӣ)OLlQTf$a 6BP=kX%nP:YFEq,L0&&$ 1lg4(e`\XB/bڐOdo FF~tX謉 Ռd'cI;mfZn6-y00cZ=!2 Xs@7-+i0hOTD>=JCQ(bw4>!pSD2!*u~]OsuCF}@G"@R^ʭ 06es۲LD*EL{o3VA5JSxgl̻pЧD27/8dFԻ ..4Iq0 !TE9`4wlX$3{t ~޷s27Js,3j,핍CMoBNעuh0gͫ2?Z^ 'Xe3B|X,ZX\ $CŜFۀ_Q)Y3i:~lzP~@[:# ^'5K'Ӷ4أ41~ \~{$^;~cOՏ6b?pv_[<@/nMnn5do 53+Ugˮ]Э_K<?6|=3&MPdEy> MQNN km`y+@$ F&&Qdn&*2fHä)ܜ 5(L6!\b  `PiyQ=r(7hp.Lh`ECW2LJe9F⫢CwU$ E09Z2]s440-2\gC@1RH&nftA4wx`m4bx2#41ǭ"]u46e+xCy'N$dz&x˹)I.$BG0XہI'ҫVjסX`tP+.l٧zф#f̫n@.tq;ϘV8@Lt NЯNz%tZWќ L!3x&v< *jY 3B'O罞bKgrfRiAp iN O&8^[UQn빇  A}!|AJ[w}\.xZKs33#ӴLmJ[T-%k0PqqMovvvR599 燃7)womWF pk G6c%=Y~6G1aD2~J6RO#,r3DptrMQM|@%UґhN|>mLƾnitA 6 E. 1PS_ Q\bWV` o*T , 1N1WE&'D]QD ɉt&,4F A Uh:It2LqR 1. GrADN0q 1qCxbIQtOU ɴЬH*ЯdY 6)PMta4Hp;w I|8k&}tLos fx?¯F;Q瑳L> 3\ZSU.SS닋n{*g KKW(:hj [+-9pțJ{Kr\+t\R/M+1-Ltŀ)Xflò qA.;qt `\`5:PxX sR:ެNaC5>=B28\/b_9WVaX/O30LR_K8*JzKCW\]q!HtBNy[^_R.]QY:`^1CZieWm`ˉ_-邏Y%밑ЯS@e3?/#VG93 }]T3wMu!z*0" 7񍎎T*3337fenP^\Y.2322 ^x*UI݇[B]7@7oomo/=Ԕ<od_ t7ÑRnr~ZҟpN|-VG11ND#/3H&NpA'Fǚ 'O_ȕ(bls&H͓1/Ys0c>"4^5I9Ʈ`S,Ҕeݑ~H+ y?L|c+#6Y=AuaPAyI!q7rr4׌s5 2=(V!4NpJ)ՙt1x}|D]^b8ǓYQ510]P`j2/mF]GM6_D?B>{g+uY?HtWTM;6'i!ɕ74o(]Nnll|/[Vl'ZWKQ@gt؄nΧQ"A>X(wp\ wA,,//|RVP=ey{g vB+sKd lZ]o0 -Kl7{Jٍ|iP`^0~|rzV$jOL+㚏8Q~6//ۮUH=BC5vэ9xe_<+pvT/e k9YΫ۠ng O1!iuyG0hkfwMz\ֳbXz'N{|ay ͺ:P'Y?moVO:Ҟ_~quvHo_onOw}qvPCnL*D23a9C]!|L&P5|P@5hb՘,1'6x2vφ8c x#<~Ӕ}(Mn T*~-z|b* `m|Ukph=f%<#d2Ŕ e4 :Ak$B~hOMcb3Od(9,ªQ=K#d?m5 pJRM6DĘ/Ռ@)9A, &&["PH 5} $ICsqB%YPk8\%$&Xblq5ce[,0B:> ͮ{V^l Z8+tNђ 8 >?41uzKc;F|8y 8Xkj"ODAg+A?NdWٝ FG1YdXwX׸澄>.݌Dh}8D*|>7Isc4G(R&]#p]ɔ8:qu6LdOL 7$੦~8S;lsr:ZNR> VU>[z{{ܲ]렆e I?Ss+zFqHt4'˷*AJ= 2]?IVy5k¶4j}i,"ӹp/X>8oxgN{MB'1Lײ\ҡx{d]Tנjpf^ I 8Lt&ےYZ#!'Taf]P_O#{:*fN?|a5.0zT=gझIUZEB³ Vc9\P58Ç7׼qA6v9j֪:V;[b^I H9~{`m}woU2AϭYЫ3ٽ W|%P)?w}yGw}z/ia%33eپ$OV#7s*yHh(˓8m7mӟ4ힽ4{ALCb53n~َp֏Y[ a5\睪_=$@Hi) /؝Nl ؽi mI!`cU *RM$10 F`E*D}}(\cEZ;JSp/TfUn_+7B:\BTޱR -srq=o;F'q[ FxWt˳+F8|yT(OxVa,ml5I4_Hjc9]_6q"ԡxg#d0-3UѨRzՎ5mW~x́S3`7 z(95?(/UsAKhtUֳ~|NsmN-}b2+3ؤAHG ^;f7-(C+T0jSJW"eEˋz<3V!SUA5Ъ'jWkqhlgҥ*iZY!g kc?24/,KsN۲j׼3>0ѭ!2Hn;VXcϳkrL^w7ۼ GS Fs9Kq"8IAQr؏*ip2kBtofsz=4 ;87 2HISܽ1B'b(14EL Q?#l/QnXC<X Cm;`rj@3hB1" P_iOlDSУD`98(#Z1ƺފQ3J @`+c5~IoWNCs;)# 14nѺe~gRAXcm-7H8KG[!C2pcwh47E<ƈ9.bfqrE=|9i_æ[ܼUGydzreHҹ EyL<<iqLϩLp ˻1S,jF9Fc\R&p ]j)9 tNyu N;zDN;ʄCҊ=hG-5rp‰ iL:) I xUlhazCtҜÚf Hs~'dI-ȓm8l|$Ʃ:eFc<9\X|'t.| .Ma@ڞPdeeSgٞ/6,=W oSEFFWii2u9$>֌64ܾ}ZPd( qU*Av{:VFfdy~z(/o~mrY֦9jB;`a\XJё7߻>ׅW imO{3" ?Wqݺ,mN:U7eJuAk׮:ǗKY`wM}REnI;,˶,;VɽNnʽNr|Ӌ8VEB^B$w'Nb;v~<瑇-s̎;~``/3MC>ٮu7i *6A>cTUQ1aD-2ҽ b* I ۃQqZ@4tD MZ+:b/mCLVjܬIMM|ةpN%1][\7eЋv`«7,L :mϗUV)+K*)qγ@2ۘN[ݙ2/LkbzkЩA+kлr]]gd,vwD|Gq8 x۶P B_1q1ǫlCvʁ:@k.,{4TpqBvSiDbceTˆZԀl~D` w霚Ji9ŵ |(Džm;zTOlR jF.Ax qV;1"/h`#\x"%X?cCpMuܡ'x`Q699C ccPoFHAh,r?!P۱kX!\O@_4ZN`,{, mXmG<^$P?G7^E'$sHk!|,hN$aNȼ"1L7߸yӹ-0 /؏/MD \.5۷oG||Q"ps6=5T ~KX̚,7W3++K sF:uPs۵ lg־"Sf÷D6[<=4:+WWT85k3j(tq]UkTpIsOê,jL] +#JkZuORuT-)ICp <ƙ fozuEjEaepFZWޘb.1A7 jnؠϳJj#Dn%fEa lK7u8бlloaz]j7*>VdyW;NJL3Nƪ)A{@./8vs\1*6@7\)J𬳁3TxixuHq骭ZO> _Wj i@xPHgvI`޽{V}鮴@r{N@=I=rXPT[: {9$g^j+=.';7X7hvr'٫%G8ꨂyy6R>eؓ]c9dΝ TP-9jD@{rD*Wtaujd+O&DŽ]JNJӬ&y"8,[Ρi`tX.!%g ҆&oLqUU%R}Ն'ڪkUTN*5g[\ɕ{ .b*_b1sR}f/b<}n7b/IJaNU:Qgkd+:آ$cY4$UW&uY\w$%ִk4YRUUF??*7KR=5u&ح&oQgtMf; T^+֡sZ䐐p\s{)!-[DYiv{׿/xD>bqqɥTeGة"WDT8 cP'GbM`iQ˱LRb=mXkmR\鞔&}޲5i5ze M[]k,է+'24TiE>@2ƵZ4@O67iѱG@5//tYQERݘl٫e 8zZ24{p< E ''lbtRn2֔+)A+IhRۃ۶effZ'TەҨ5&n?%3Dtʁɗ:x趿0"oAHvTٝo"Ɓ|!UsXTqKInűqn7F٠灲"r3އUd'>|:91RC`8x/ m>/ˬL(B=O'7" Pr@P4HAt/tF=l<fzsKq y=/ 01Dr!ѣS.1T*)!9V;cn^o7e&PODI1{$aA<J3hՅud$1 {1m&y*bKRGns;_,//ꩧ>#-sw M-dsVE@24>>VuL}Ҝ\4dmq+r\"xݞb#Y%^YuN\q=:c¡jj`jLqu.oqaD-M6*,BOâ/vBIoT#@|iUtբ'avhx}&fӬkW Iw\qmJ=auڛ[X֚geAjTWf[Jq$Ipt2L%[\)PTk8K+\1ymbWӄfo$)Nod+Nn(}ZQSR^yPӢ2 }Z u*[Ǚ2yxj-.I)tj\/2yV\-=Z_tvtu:'`vlr;-"u2z, e`u7 XfͧtŮF5ζG.эv )_n9'p542XD;J PJlEA'sZ\bxp4hr .yaA>ࢀ#ny,z}um|r/EΪo#Ƃ%'49y)/na!yBW }NW%ll{BI9#V:"*D&+mѰ9.r҂Mؙ89,"X_FNy .r_:d?#X؄xp%e" 9r _">l?ausSQoM-L-Օش:]uEEieeNP9:SݐfwVU\E< uz Z_X^-L5.X,8`T]n6 y=% 9)zG}ݔdr';,r ꃯ{ kB: Fs֧44{]EgnLYrmv2C mv\\iv ܴZj N+zo1*S lrVEs ga $k蛈<.$ ͍لk),!-18rZH.t(բy>5(:yCzM fG3Ǣq9CN(jaR<U~959' 6IAcw~5+ρ^wz8o;9.%y rx=Ph4<\Ar+YD~GDghЁ\™A4p&'e.٢*`0yOud8m:K <[tyN"S=mQUkCn#iSCGsxKGĆfb0sO1O=aá],_pi>o}ܹsTiΏ}zy9{0~z Ik~)}_3p F```pPd8AtZzZF~hmĝ/׮mHihZg炩BRBf ~ٜ^]ݠ-ח W#(d ]Alfnv3b)veX(HI1o(C>Kfj--JE ӐRݤ24hJSYuܜm++ b2=SPVn,zFF#޽z9Mۨk3lJ-O1ص *h,9߫oXQU6ϩ[[X!V8Ev}ޕqZFk4nO$rZK.BǕa[XL h84'UxPY^o^/Jؘ\ȖjBh6M@Vps _ঘz8כHpȳK*6 d^ ;X@[bn8myP0 2=BA9#!0;(vGIU@u R>V:h3,Pt#;F:79"bsh2sHo|i""8C^͍*p*@.xm\̣='9"u)̲5AWͥs8 ;s=HlcN6mӨ#g1in"Љ'x3 \Գ%B<AVm7۞m5JIf=zJ)u$Zn}os':bmiUV]U(OA4ңo-H-+BjV)ِ`Rj-lM.q\q.W˛鴤*urWX*53ܔS"V"OpM%Dpj.#K D?NBۃ{dt1Ц]i+۸_9'4; 5%7?]+cSdk<9vc $i,: B&h[DCM"H4U D ` l6 f`[H>;Ĺܥ\\B`^X? y:,i,%@yc\(,ҙCv]tEL+`,l&?{J:҆3FYsd`+4FASԏ]b å-fH)| #|8|D;)=PEm u?pm5DK%d)0ttVUK>-1@VPn#2D"jyu/1v=av6 DL{fHXHPHЧzQ=3^oD8s} _da ixnv0Q'{^I~ޛ/w?v7"T ZX-/'D `iH>/1'[!!ZA3o"4|9bB1)9DFI!pDK{Pt#@/H)_c$`PxWA0D}(<]pg~H@A'B`s*BMhq6;I$h0IC(X 8*aܛFKt-B`_ 9.z^jƊ<> )A">& aA2kFџlp !8~u!2-:_A/D\x:LL%nFӇ *e01ML!SG,|OGO*X_@!Kp@3Dosrr>l۸ORَDC* oyܼW/5_|G\[8tڡ+?;x=ηu#+<^}5dURKي4yv<-']%Zuw =o~A~~U ^M*,F.$KY9Ea8k_ɷf*䥥I.sX2}6_zYN˞u$՘պ8jI2+n Dvǚʲ\ZK#nkZ|zg+j+|:U`F[I % n-$xS7&QN 4ktv{ʒKfmY&Tv#tJLk%qfe{=N}}c;:;\WPX.]1\sgXc44]MGvV/} +qڕi۸] u0fn9Pa ##D,E@͠s,9": ׆K+Rd7ND CJv.q-XX<#"bl! P*s#lW-YĮ"R5ԇ1wLqj)$K"\ T"7[=UD䱘Oޏi ኜg 0}dߪ=&HŢgc нtJžPwWl9/Ż<>F{30v b| -񓒧 h(GO1w1;!0` tf'{ٗfb|"Aguz(8`>+jMl썂Pq0jq pw^큟;>IAU+9ЯWHËC[Nlx<뾽ns>WV}dZZ G#cE#.JO Zt`F h"lXR1ccY ;[(LѩS)m/gY:Žܢ=%h*"n#X:/o8'LóPGŁQ6ȖAZ]H.iI@N 7a%% Kd9-b`Zd)pQ9c/q^~\H$ #`c APSqijدzsEC[߶fJsd!~js!> =@"'qNOƢ;vLOZr:l+mRQ/W+((x4ⴈo9Co %[w #B;>{wP8A#O(;rTMѮp!6'GCIX2TNrl¤h)1(zFud/;΋zB#QPIX"9>̆N#8CH^@0Æ!-.Q-[.׈.ELd lk D'qy)g9J-Q|Y BA4뷧,%NbD89v;H Ȝ9H w3gAn9&"ۙ1#Ħp| ޺ukaa'{!!, _LzUF#t:}f㴏q+׿)cV5?&suyu߻~Vy7h¿ ܮ ϶wh߃VWWY,YtyZ<7^'щ9UUa-/H/[N f1## &1*%WJ&HtْĬu y9bwa;OkqI%θlqRJUo4昊T'-\rWb^ѹ"]JkJaeiӍ@3!kwjuV [S .-cǵ~37U l',3K|^ _ܵ+9++ܼys~~'uUBo;߬W%FiSoFAl NکMʓi7&@{)л"c :kYhrqT?&XwU)|<YsJ^yJ8%z%d8܃Eh9:9}8pah/>86 tVz}C^Cĵ 4 I론aύ 13Al> A7եG@Q'i=תyk,U\hWaA" 6Y/YTCCAmHQl39{'=ٻ9"1zaNNa۽nP\`kݺu%/ Bv\?zL{~Nt5Sb|ccN6nRNnްG%O 4 [o Y/iomz{M#8𳫷>i~ޖmȮ(N,-Y,U u`b%?J)!xm EI$M"Hii E^/檤[&HjIh.mImr+>ϙf8Usg:KGJ|K,VXdyRD*и<: )XW[52 ZnJza@+`42h-P]Lr%8 )nھ''tS^|Q.ſ^i+j~qlc76׫B~!|}Ux#%O-tJgƔY)(l"9kC Ibn/AJeݯw݂5(vǽ.5֝a]͜Cͯ;{^^->4B?gC 5h LF#=,˾7&8('^>#`' , hq ;sj+s $.qral j9~وv9ͩ]NݻvC#B'iӦ}s, lUn ФzrV~(AAAna6n-;p7nRǾ) -Cg"'ƃOP.:|+=/:tw߸G_Sg}Ǜ,Md4դR5T./YZ 'k9 O\[jcH<7%1J%):UA(;;ɰ.ٔ-)tk JQHٴUU[+:Ua*vU!jXyVUb(ux<1Vkխ6\:+n;z=TY\$R<. ]D zk+mQm9NJ/|L a48&}}'1#by2Ђ˗.L*2tòaVzbB":$Glz}cX _Ł%y5<;`"1{Xd V˺Нb4~5may]p OAc z71b3͙9~@h8yh7;0^d8-ρ%Bw31>98 8m]]]jj?DGGxqTg&)lju;qZMoDnr8s,Z"J{_:0gmm97Mo?G*^{c+vu#aN0gQO&UhDU)?&r+\F*z# 4::B Q\./.̖dDe KUk G;[W7f^k)*ᦨ‘q8%DC`h])؜}Y`RipppxP~d>RUHod3~Yx ٜ*\7fjsĵ.19$\ؾ/p[ \ϻ%;*JҐ`z0<{R`Gv@<[mR RTՈrGKYtlqA!N2&@ZzcRJ]ej-)!N 8@:?Cl|ᅳ~5J~끟fS#L* ;z98%bWS2SomP9 );Wj$JiiGRVPP@3UW1hBOe*_* U ϡC>wi?oRO|6fE ) +hV>L F>G;q ڣU7x+Xq >ݿtM#>s"/ul;G#o|սd׳=ÿ8mjaܪY~%ȏ cFѢ#h"BʍU WS"\$%аb`yp>_+m3nUKxbbqzck߶\7h,+=1CXȊ0i%7% ˸ɅXB;k\t7:b8=zðإ&oO) ;,[͢5>c.&v4blH mS]쉆JhzǕ:boʠ`\ i zf9#bȹXbzD XL0>`n+oY j,\4.< bgDžU:.>NzBh] q>'[c=e D=h)ogv9Ny}Rfnf/Ν ٍqs(ia?;hb,,,jb|1nGMo Ғ옿}_Fb1ۋ^{Knz/k{[>UT[V]fO2p?IDsG'~0_xx>R]"5Gs }EX^i+÷۸V%D)gu*-6*?i`l/U_p0-){# %%/E; ظ8$A12;ϱqScwL&HJ.v(2), 9=|ƴ B1aޕ!ݑ30F?!'b0?Fڏҙ!1<j=EcUfvϡ[8}qHxvH4M{9tUB2![j4Fo'yNed*v?}p7s0cby~b9N#_~xw0d!|܋?pt]̩DO#fffDq޽ݚ M⾏w%4̐0? 3p.4X~@/zi޳[z7_Տk=[mϠ{Қ6kSyI<yA8$ҩuxUj+$*8h̳XBCC}>hJ[i<o2N迱Yhu0mFƯ\# W:'NS'2^"ŝ~t] kѐ>"≾0|.*b~10 PruH6Glgqir@+0b,doymFcA^w\^jayK%.+_얽G%̍qXXEn}{vrK H{a/ub^9 p_|>2UE=X#Ь[5ۉ]D6^b1&E?O1$fn{;<Xك̩퀪/%}ˠ-^*=Ei('AC-[^$@:WVV۽ӏTS%pꥃ?k@Y/|a|x-_yڰ0Ar5zs6>KDm2YGy>pnfƛ?) A?s'FFK}o|w60 +1h4ְ?.ϰ1Aa/צD}MqlzZd"x*5V/ U}4pۓ,HMJ.w`Dً͆ Gys*XB=b-<$x{*ƞQ h+Cꫝ\rwsBrML5,\C>>G`R揾'[ b+(aXB{7EK>QFCogN`xacNlcvf`M!@.JO8571'm㻈fars1gG)7JettHv1TF:6?7_I۱_Z \zuNNk>RO~"0|HHH YcUե8V}n4*I9dp=6.Mgt=VʯP׀dF#>|{) / 2Zяm`S?*?PJ̖E.'C0Y2PAxn.8.iovmiq^X[<9!;c&PuMDvE.Mi5|PkRZM QZ""g0OK˅ E rNc|p3J+N;*Hmc]gp bX 5/՞Ee  hMซ`CY$uc{ã`bA'7OG 9?[pJ~č!%DÑm{[7G^l&:22g߼~ r ѹ9 ؾDDMX/`???nhj{O1GPwBBM~O~ܤ}UF($:#J=ߚJ Xg$)ŭt&;+iy:aZUUU `wmb*և:dLBv1㧵_\NQXQ<'=!/bn '*Jq\7pF;;@^+DEeXR+5Ty!IA10$a 0gC&o!4ĩxM gI y3!9?ōArajASjaٍA 5_XWF:ǀ z QR\rl7$B:+Ğ+{+X!.!4_v |9rv2EN fbHJ=˜2ڙk͑hcV=[=۱hϲd8@jsd7D?B, M0_ZR,qC_:546D pҝ8m ʏ:!'U];>sXC-Cřj]M[R ޶6+K)CB‚›qOָVlwtA8Nv-㤉Zo-Ʊ ?hZeW0*Bt,) w'OaaЀ<%µdrXJ_JB=J6$ أ79؂A l!ҥ~H,VdR`Po'1ui籞s3M-> nl __!YN³K:T:{{6mB{bw>.Wf>W@1*V3oo#jJW.wȔeMX4ZHDHZXSlFP΀4Z&h4ONVڝvJ[>GbNwօ]xG-w7~#fsD:CzDZXT2HiQS2[GIxA1%jȳlja EAuiS›h''''I9!#{d /K}m+/]vɋWB Θ%NTp T?gSaIpX,DE{G$Hʰ60q$ߗN<18~!ub{`9Xh!>la9ÜE?1{< ƶ<sf;"b X4?Xٳ^.DV0y%l̿diҶ+?GFF:ο{lMol>*za1Y:?s7'sH չ~0v4#*b#cbnl޼Yjɕ$ߪ~q:Ɵ*w6*G+~q 'h㘑~(ԠK&WgOBn(@o3ʁ4I:bgb:-g[Aijjv!)뜄8 P H=.X0 O#&~=h²y ]rZ琣,5f//]>`hA>$rvᑠM AscB]yH- '",Ҵh*Wh.!bx7Uoze/3{1}X@{yfȁ-̾@31&e\3fwcmDn&{d~IA;D_www. BI Nܺ#ݽ?ٗdE vK9N{w+|שINz0)}FwM(>޾͕ŽCan3OBP` QkԊxX*HgժUQQQffSYWJ ER8Ectc8a7FpbKC*FFFUZ`D '?~yc: @󘊜-fX yBON ѮQ2lI"^ɖhrp"aW1k]C^c#K'zE9컈=N ?o-fV%yC![e-~)8&yy5>?2ǥ@*>aE6^̀`-zr$'bq y4<5Y ٣A/rOnA/L&Z  <D0zٶ94c/&7/eͶf!PnbB}C̋GL^^:E8w8Ĝ2x'72G3#܌z8{lUUkiRKd$P^m=5;q5nR scYJp>uqrgЛGS42Yg+c ={LMM?~'?ɾ}񦦦x7|[ڕjwpSۜS.&qx1m{ya,g1;n?)X5e׊BKq-I[WW !!&ޑF:}x䨐!'a%OβhiTA9!8d<֯lXIlUt IXrHƚv&&3M! V{2Jb X8`c~mydЁgMΩcjP=%=)J{Kv\SJ,_$32uONJ-nw/0v#g!ڇƷ2;vbva+1y^LHB9D`^8L 7W#2ۛa']/3;GaNI'p ڸ6~[nDb;DӫJ&I6^ F⶧m =pC_}xu`W3ÞW,# W.h-D=>eddhZZ-HP(LMMrJnqs[wcuMo1TiwEu)93{bW0XdcLLbLb 4fS6& Ҥ c/ # }{zs^df3[FAx,.H20[iD TfVXyPy'jƂ:*? wF(jɟv-L;knSX@oj-7˦|- K6AN;غKLhgfTNgZ-W#Y+^݊2PjGs\6w8hD[l&[(2mww;JVsSP!Xm\'KdDݖ+~SH ,-'11nN0PBpVCpO\!2Rv\?V@Ls+Cr6"XEhl)ٯ 5Jlk#k.=mef|+кQ 'svrX؁5Xvc iˬ@%M NN7qCCڑQPD-s:IL3𣒋ю rX\\_GNe:}#4@g!_5462׬uj8̅Gߑ}+Z {zfbK/e[6i+9+t*~Iv֤+䴪?*x=?ǭAwPy0K?q]ru擨r}wM%Uy9';zzz`MS^rLo֨~&"bbCxT/Rhn SQP(qF YBv$+Yꃏ#Q*ZVI~9&/@_ zu'Xe ՘WFP&0Ga UZCh uƠWCFAW~ی-&u;ב^N`OoaSH-Bdܸq|=X* )k375nMvpP ra!ii'on~i.u.#Ӓer3G:ó Kj !1n Mz+pB@ \Ta\hoힹR4 Ȓ _|x1:KDb`[RBOSt毙BŰL6cu &|̓|(ޙo3f[rJ{55 ŌZ5Q#fx@1 %q rs[ɐn%e* dhymxk*s`{Ac;ҹqc#`~~~...o H@eMlOAl%OL̊KjB#,F|w{ϐo/_KnmA?.iҥ?M&y1B<'yEN$JѨr6RSЮp?*PlΟ(.}iH] H}IG(~|srcҳzh~9 #^UkУOGeGXe=ӇN7؆<9e? 0ZfِS}hHڐ* {rZ7, [[{ 2O aFnmshd\.Q%۬Ȟ{7,ӳ;ș'JВ~XqM.{}5ȵ<-ovPGp?TNjڕrUPT^I'?\'=<1^k( /M[['Š7|s= s?7yqu6#-YOSgD>)5!G^\zPwNMFX?ধ79[Ops`T8x$pGdh0!$y<#q~JpQjPi(> C`5 `L%aqNy aFrR0h-@ NT8Țp;ln6#IN6l apdb-a̳ɺa 6+3ۋ&0L-Z{5f &ͶJ[ 99وj=ET~Cm^t\T tޯ0 4 9&x`6w0z-k^JcٞL" Ӛd~;Hufqdl'6epJ{۳ȳ3 vҸkp>:YQ]SWΈzzs=zQF=RY ;uͲ3U䴍KIr\^x廢쁧EwX2g'.1c>팛C5xgNX/h,ݓn7ǍMz|IH#̡h\+;J pY5{Bz6\v0 @e>]Qb\KfIZNmMF^33_-g {^rYFvH<4w|1T$mFvlSt ą m0k wƑ?|ה?t zfti(\{G$K tYK-ڂB m"Xk@K~!rNQqnP%dJ%PFy6g3tL {uzx9N޹mk޻:pӔAlPWu&qӫo\&qz~~O9[n 6tn?O]@:lw촌r7ƩL~!%6> ֹgbѪf#TDbҼߩORw7wD"d+_y? !Mz'fp?ɛ*a7!fltŊY%煊| [ cP##'$$4 -}kX}P/k͚!xS~FŠ&ᛵV`Gb -:mN ~Ai78m} ̡o[>$GpL,o"1j hlC+Ok $J3&$zd%wE}v#u;g fZVzWe^_nNPva3>)1^wd}?Jpҹrז$qWً9CA4/΁j&oba$ bz턨nee ۘ rʕ/͵$\Moܹ*3&ՋE^t@`ήw^\u[}y˺/r-Pdd`;--ʢ>],aI?:i)'[[~?K ??n1>(_psosLsQyQ[]FP= |BB#q/EAT@%D.W |r.>wxJYUhS?o` (yљp!gcp4,upV)`m_4isq[n7=욬 vنorGfz+gm5ZK&Xmf 4Qonr*+ |A?=FUrK cwQOLpKf/ma;أ1OقҴ8̡dE{6/xk_Or9;mF{z-GqE =(XܬU֚gØ 9ڻj'lZWʼu+D[tTZsAР3+k9__ewے^IY 7@8(Ia%qͫR=`##ݳ^=Q1BPP_1htz1|u-C}ak 5-D+s= 짉ŴUZʄvzC͐Я.6Y "Y q'. ۂ@\ndP4q4&ppL` Cf>,z!T0i6 {|_y0pKOf Χ["7 =zᳱ aM( bLV.yَ?k ԽDlj=uC?;9#V6.}x4Cg·7io' 555ǎ-<-e![Z1m]NH+7Id*M1Tz=7kÆ ڄ8Ex6UNGաd0 DʩT$,P*r~*=@7:y kֹ/ ̇aϚYBNSSA/|^i_0$Hic#Riv qPB%Œ0 ݰex"  Elʎ@L:N1@g>P\ GƩ|~h U-ć?ĉ0yp.d&i?5ll@2v> z rk (iɦErZGM67A0HՂÓ3Jg4@f%S(]\k:wv#If׵mʆVXx4v%Cwx%ҍ'f]ۘޣn@-?:&CӠ;hB:X[?\2LPHV:% 9b-fF$4e?eY"7Y,kz!Fխ|>\%#(&8NatuUC}T/x'BW&Fel/Q8?A*X$E>(? Wx}ި'{HaH,>Jp*GX ^ǂ(\5NK"@5V$Wɉ3ApL6>iC]8ç~FC|jm._c8G)3V@*7@@Ő?oŗ=@BZIs JF(W1$jf3[AUa9&Xgf2lj3 \l&۵ gv0+b*۳ )@K;ִǺT BVל͝7µJWhA72yLM^GMMM ϒijukc/IvQB; 5柟$mRë r--s? ֐GO7OD2X''&p999qSٳF 51YU(dN! \棲 @@&fyX+7*7y,Xmq0_JI=FpbtYm$wPִXf?NҦv^v.k-Y*ܼ7k+YVgPkZz:6 >88ȗE8FSzKBEb/'? l{:wf:Mn[&=;a,;|ncܬOeSU&>d3Cbl cqߑ0>u4'M]՗ޟm*.̽,󫸋751G/;1}kkvo#<')4u]O'M=5nsf͚% G >](-}P'> ݳ=QI<$]'A㡸rL-q# @exoR?CPiG *C"T}jEj۲Hj2m;͝&{tߌԐJUMS0]g*GٮJZiG6rT#N6dq`b.paG  Or5!6I:u/H%{?cǎU)uxon.yGMF$'w[x(fɇٺQ'gqN&t'v9ѝڹ3|B1jg&)7uyZzK/"r&hLB!K4@6: 3/ qXLM%Qa4%>X ^ ~1<Dxg)ft {. >m-7l6:BVt B-LwgKvaGg>uBq'1hZCHۃBmw=_c79'Λrr"r0D ҳ'133{W]]]UJ^xՍEˆbCYI8\d=\ }::%lId,LpS(Huޛ/[WYeahAgJLSE<$@MQP,Ky7n޼ZS,2箵/WJA:Z sl)!J?\+;͕,y1=NE,F ޫ|a09LeѲ8?׸\w]<щ@.Ζ,+`DFkLw)6nTݸ`7;W-zAávZM]mi+dYgwk5o5Vk+ݭ|fۻY;rcC:0[A2tj#;6Ӳf6.f T3VԖկe`>%&S.gC$C`-\g6הvl纲 9`%v3md/*qC:gB0ax999K.522i %:%.ȹ#s>yt*ʽshhJ]nmՏr 9=p ֗0%@ `g#* J[[Z\-_"" |#Gɪ͜$ 1hYA$뇎C0Y V]%S*]Qy`l] Ob֓_P\3PuO,VF hY``Hg۴9 =t#}2 ȴ kTeQFna,6M/e̶hPCoFmx\K ѰC۳͞R` 5K[&N5nȍ1b<54 a%n_TM}6g#B'^/Lz2:x`0F!cި" ҭJP3=Bat$@;HBGGB>^3m|hǗPm_a~!rg[ ˖0j5PY\WnUn`Jy[&T!7]oJ;]Yr3v^W?!}A\-ETn[ A'Zm۲ms(dRu[&O$=h"ځXjACPgE_|h!t#'LSf=%0xWY@Anm'N54O[B}z}%oMu;ΎJAXrD><.r$hv^r0MYvgqg-)\oۚ Bbkslk"t&:ٝ sWӲfuOCrȹמܺtRc Aˆ-spܿTkM5ns>C{{{ ,a'ODBOUl1 / Xae:{"(YB|i=U $:UJHeݳ̐DKBVFB9'(\+v)U @D&hKȧГ0PK#XeRϟ; \^> {GAw>9z;! j0ͅjRY6$@kXmLbkRhAs-9`IdsMP PUvodWTc{=t;W$NpHK, 999͓[w,g:>pM-<3>S91CEؙ9|9%l2{^=iʡǻ70$~\tGe.MjTyM6m,eu4+ BBvI l(Cee_K) yP,GcCAx8 O{$ G"pa0> 6d, o^&ʣey!7" p(<Cqy(>Qs"tfBC]FS +&%Y[lN~i~D K;J{aQJ˲< 2H Mߒ]Mq$M/}qlWlonZ3Ṭf&7kM쵵t3m&w-KT=T.p˴ړƵnέUƳ'r -X,~>k,'''r!jޖK '9-9H)KΑo.4s- Z 2Jw>|Y~Ҳo D" =׵'l^ߵXȜGO<5T{ޟoapf/IOHP-ħc ZK4^YΛ@оX.!x]14? )5h~:Y:JB1w37 ٩&<:VFNKu)9g'̰Vcȑc(d1S1:`oOw`l},TcK0~J]|]VaDBfxWrK+;Cc{v!@'[f=5 CyA&YFs pB7>e.t 8h0cE'u+䧿m-5wΎo7QiI0HN+d#.eq\W:T6{7 ^`;Ro{Bg&=εpsti%J{3W'H`iLh?\OPK2斘9iҤX+++q@7:ox4>kWWmjii R)>x4'lO|us7kkD,]~Pwro2saZ RFf<#P{n3M/~Z,--ո^211!7jBm4Pļ&ahY;:IS 18?;4y;51H~!O[U514-! ٧(}Oy@ M,~x#BH!%Kg ̰(@9nwiQ(KC,VA",qbtnn 3shGes6DiXBN5 D9n%;[?*OK`%$lW`j\Y\6y5 W{P(zk nN8- rko.Z 4nŋ z;4p_8qbEEk1w\M@q}GnrEؔM[D"ۭ{udz͓>ؗ_*u@eglC$> d$aX@XpzϔfIi|S~K&mݺBVp@zHL_?pѼP=ۀ0¹/F>3{h- ? AL!+BH. N:gpDhH|0KECO[]EQy. {( C%P\E(c$fx@Whh/bID0]{KiTc cne]*ۓ& @ 9\W6r+TH^-sjM5&;i 4⶧PiZ m6~/}RjӜ0aBRR… W:ɷV.'@f=5wrE稤=6oH4EЎe;#)]@rsқ=|<:D5hDONOZÝ%!v<1О?8NNSň5㤱L7/cٹqS5s̯J[[[(Ԕ2r;IqB*(gCܯG&gC6f"e KGI|'fCcl~J܊HgpЮR {.B$< jgF4Zy p>ZWY5`tB@X O-x"sA&O%$NrTgy%_a/y*Xj/-7UMZ ńZ###X7<먲}wB'xʲ]ςxhQZֳkAs;+_)'ͣKgbp$8 @ӧO_n7WەN777~^E*- QlRb7cB3Og$.*z" P.Ąo`WBʼ*Z#;Cɧe&_tBA1μ `bq/ Ƅ ,!4U*BlQ >Z518o"b, x6%DN<׵5ft}&E@!mv39\v7MX7 qug8'w Чr`\%kȮe,SSɓ'7nѪ_u#cFozp\fը5)NR=H}J@aFSœ;?8hr$_6CK a6W~iD!2b9#:ixfMkum d2\/jT_b@-]ΎMF*eܜS%*2\v0 @e>%[ F3W ^pYvjȹfUٓxJu0[JQA,>MrQ.PFk\*0ឪp> fP\ =Pa^7MuBmfװEp@^N$mWw5;ON:i+ؚDrG)ܭ,h]\% MBW0e{>/3dqܡHu輌yxx3lmmwܹdDB0`p0B-ˢkgAcUbbň_gx s`uFFVN!r/~Ծ_.o85%Aӂ6S $ϴßvh&iaa^o-^3fLRR 1G;J(iJ}ѓ)R#ѩ o~aM7%hTJDž.13aBHJ/?*O@$+qk`\>@%?ܜl.l|GG3}@] pN]Nc@9aR >ӪW%d"= R+!=${yDH._,'K*^I&- T?бm!Ǒ蟰#&R8M9f?nyF ;W)bR3(o,G? */E3:;;PK~"oH{{{1aG,) E`R*o|(^y*\TG@/*NNy">TΕ0y4DBBV<БP|*ro|,f0(s<zSA\Fdh(){¡$7Ǚ #Md,0%΢A iخLJd{ײ] ܕ'\@^o`{fcןp C=\s&ײR8t}$CC//g5|511mH U]DcŽ[?xyhjJǏv_Yaͧ%?B"Mg+n7{uO̴{c{$E"\h |wkxF`?/wj.1mm3fPK~"@cee)mp0RyZ?(֩(Tq.~@Aѝ@X&VhA&Qjx]C!*O;E <@=\vW`R!; pu7̅gߑ_֖:J7 %$0 zb{J;Q6R!ٶ M:ufq`ܕUre6KP{,= (g؋k{^N!BB@SOO/**b ,Aj+mNC rc,,,|bmΧoB"qs{c VV_,Mʽ;֟"/oL[FށOXK_d0Lyȑ#?CL6?RGPaÆnCfpT2Tv$D ,]x %ꋕ#1`V4kY0"@Qc lT%#dso :riGGñar`V'%pB>)=,P U=F; QxA;oߑ|V'&9Ӵ=֥]۹lG2u 뭹Dc;w;8V[,/kdprd"״Υ_MߒX8/nOpSc;2Ltgې#wR@ b2۵ $*g [A˚ئ4 8At= HOd"gM.M0Svb0eWWϛ/Y2!ʅP, QCN9MGS .5SR"8U,:]_A3KP| UQ1^ BV{ Jf*ߢA}Pŕѷ G7FneӁ]^ڨJ3s ۱=ƶC@ $rV(3kbLɷ ߟV=zk02Njm^' 9PCjIO,0H$Æ #dS X.U9F'\kijZ?E|T+#tP0]RxP/ @2,'N-E^X'@v// h P?nM0`TRr|,= R@8ʗ!10gJD5U'#n35 ylMbdI1svly!$h m9(ۛ$t۲ J5ֲYܥA$0ZZZsYz듓?c BĠErYmxlJ^2OɆ㙽O7Kw>vW|׏>QSS@{GүkvQgVFZ -FƢǣ-=9@91EB['oFYܹsU_FyU[/i150`rX+pco:XTC!r$`*щPPP?. E!GIB]c{FBACƇ|+UY(z@\7=asbTJ,e n.D2F#OӒ%D0Y7ɞ7V`iE0h[PGh?.`M <D.|s`&Y^McovmaksD3 K[FZ,жA̢f0l–Jℕ׮]qF???/͐A+nr8PǿքJƱȐ/]LqF{Z`lMq iTpٖre]߽ QaFgh$wW:tˆILD+4@1hayT~^G^y.~- Ƨ!0~ROD{Y0 u)/WN~Ƃݯw65oje9f6wT*&^:^PC. fq-w[a?yV[.w-kgAmfڠOfllg}ꫯ.[l̙*n*MP3_a[mz#3{w>ҝv;`O9}5Q K-q>zT"lH#%asY!O?Pq_UW^yeƌeMN뙬sfdd[=N(پ;;tXz[Ei{1ޱ+EPl H"`X$ǘKMnnw옽KbHN9mf܄uJ\|s*7c0gEE(̜Li:s }pIjmq):\`@(ft])`uHV3`YX9Zhii$ e'_t@b0 '9"{ _ޒ:Myl&aoo^FK->~֭W&.;h'M\ؙu5-N>sU/~ߚ` so:sBQtsCze)g=j n0LBaggGo&O0"l sZB18BVCC>/u RV3#QS9lOTKr N&NYHB%yDW~-M@-}~ ~M9V1M};2+³Yhh>j:fT,GcL,!1{D*R&㍒/Q,5R%>_L؈'bgeekhhHJJs>$lO]c漡qr@c7WÂKJ|ebOn:1Y^WY:.Eٿ횘nɒ9HmddT^^N&BPɸq㬭UI0g :RN1>kC(\Zú)-kғvK$.'m73K&jM"،hBd|Jt('FjJi \HBXT$rojw0f37抄,%Vy~vI 06hcA ~{Te1xֈ& e2Z4h 9{{{\2 ZH]yh0}'h9čhBA]&pL_"Χh|?xٹ(T$ҕD^VOHR~!nMڗ#lO©Ţ $$1F𩲝@}^m!hq9 ;A>\&l˲!gRa3uf,MM {'<#b&1mCM$Yd&;Sv!6kN!?FZ߫Yu7\.#G AxǏoaabz%V$s,ޓ+<-M!.hlNۛ<6 ǒ˙+$Dmr},qR{<VmJϦcZlś1oWը+?*"_B/E q>D}XB)"[+~P!A1Zn_UF "B> $ܹsCCCqS#3 v {+6LRw -.qb&c$y:eG 'w:ϼVl?Ϲ**&ǡg6(JdVCAٹCf mJP!{;R_KQ5I}db `c )^lPMy#6n0OtLQd*{GX{r, utet^=8TH#Fifgg A ##QQHx21.3LYRQھxs TѩlDD]ah1؆BxƘ\d}x_,њE\OEoOd5.>3w1|4 /I$'PO,% oWoo$/GNx{H/bl߾=225 ...ĥFw;du٥9-Ͷqױ4Fg ҆`\fkFnb3_m1* Mқ?׏ҥ}i.Vjx؎$p@À%x0PpUg 6U6>;lSS/)Jhzr,}BkK3%oʼм&ޯɴgch%33*{{{@0$N9b幹vvΤ Nusev$ ęp-Iɉ9hJW: 3\O3F% 4#_ St%8M/eηr2,F2q) JRڏo B$E1ŏJ7)FrZpZ*+_, s 4 ٿttH$z &ԥd~t`]v&֑ZZ+hCRG3bj},6Ia2B۞*S/Kݒ0$5df;ᆮn苛ixJ$fjIGO̱ ( (4 ().,:f  V@PSHM'{NOL׶p #KC#BDeryV6u656w9vHH{-޴R~sYS+QTv:)N(m6f1!Ʉݺut,  ^7hҥ111&&VOֿaU#x{ 4x|~#L! I4Rl4yX4sdr<0f8~< Mwp656gӉ ,4aYUJHl~U7?m@S/AF4 e%h6Z+ɋE x͘@b8991!!$ɗMCYl]SS䟖[c60`j`L$lBG&t6W L':aSg&8V B"4O/BluB]Ĉ/%j>|Y2._l!n:ruvNt/2' -w.n޵LTL?޼$il98[QQ*H^РAy+ S*⿕?^O>,$m$:C9E"65j˼Æ M Uv]{Iu)cinjiݎ]R9VKzH=ǩyγ׶וH=Ii`GّGdž L@2I]  J0! FbcL x9BnAyK$P b# !Li* X$:*cG"^jBG@: <7ynww9v;gg]qQ\QlIQ/2jLSȗF;| ouI}my3I*\dǏbajP TWW9 4^vp--#X[0 [cR+h͔Xly38A\Vϥ9č4?!X'lKd{7E"V~`  BAm-]֓'f FrD"lmm,,,T:#bױ :EZ¯h~;~d~ź~d~3ViL1r,133ʗdHm3yjS%6ڲTMTS$C "^Wa;W \ͯ+jY\>`L`89! YǯlˠYfzOQcr~|EKT(32_šAKzƌ W0u˱gotǠE6[P @ ~<A#7E gӉ>WH<~ :^{%Ox Mx'@\+ЬA`E1:WM,V"G E7\ <=CnIOueb,S=9g'›g5ěV"b˫gϞ.ixJqK,5jPe.;-h C\ ;dzZD(E4fag2q.H#$ ądb[M!I|TFJfeuo0[TbaIIIƿv,|xOJ$ 619jjj𴄅YZ1%BI" euw_7S3j֜3 i}81f(yPӠ܃ǒ%K $>psb5=9h`f[~" =-Uv1uǭ#.}D{ 7?&9Z-bZ OU[/JӉ0Kjן8q͟iccxEmI۬)b4Batt\.GO ae[їÛK'C)鿛7ND;6leԩ4h^:x}|$M82 Pd/8/DD ׂkhiI6ɓJcOuľZH6O"[s0-,,4ڻoeeDoh|˭!HPS"BWWwѢE .{uތX'ң^ kCo^Lvc(YLLCG#==ҒfL4~{⒘fhhfAcVxF$;pk~ H/ -y!h҈h=8صlx-}eysUXKZ&=]K@Kc "n BobS7rP;mLL Mtx3g΄6*{^7'F7fڙHr#1Ϝ?Z9t 6MU5iޤAciӠ*fooJ2jaxǎ=Np4?OzI\Tda'Sx)-͇mR "~AT?.!w>, t~zjVWN0TL r-͛omlD7& >|xTI\9]_˛+D"md! J^<2~Z=77P1i]z%###SL92le13h:q-Z38ALrGӖ2XXp6՟/%xqP#WX𚯿7erߤ7mQ837;;;WWW'$$Tdiʮ*L S䥫Bݏ!0Rkԩ2C7-111PѣGk?Y72줌T;2gpślD8> -6`x95.m8i0@gr"UVx› PHӾFӒ$'VWW7))) ia0!zv[%y3%CN&qFh5 &Ѫ.@4oҠ{=9sf^^PT*wC&1B^m q,/%'I\ɏno$w&hP&&& ,>~ɒ%4]Ҡ[S[-ˁCѴ-L%g1ӜSV, X%$N 2'NRS%:;eICi{|d=7),uuuBQ Πqᢶ_~Zo-iz9L\1c o)4h'ΑvvvÇz6>Ql@S"('ESŕM4 Hsdnnrbc-!8bބ!((S=\܃g6<#pw|F7G⚑"w"HИ|.rBBGРAcbI%KL2%::Z&a?Z099yΝNnRq` hϧAjj*hf>̌?~o*dުgx3fph>ǝC1g}JJ f||<͘4hn`QFv &5T ĩ{odp^w~59YlP_ T6ixSS(%K/ÛAA^AgSU'Jbs533stt\~qqqbb-ʤҡd`B*!w촽Qw!XЛ/9μybbbеIS]76V+TT!m%3E/݇O?-08033Si4hAdg``gnn#7턚u4oVJޞ O`aaԩS0&FE@Ԏb[.\~u3Q)/Gj3\6:0~dH&4cҠA`ffnMOidd Qؑu!w촽QۯMO2-"" 4;~A-\sEfPf QJ+uX.8[2e2D"ڵkG MMM1iРʕ+ި[:ȎQg5䎝7jG VVVvt#ҷI {[b?Z^7tVf(K/d43)j'BÉx.k`\H$vqq2eʦMbccb*7^РA]]]KE*"ʳܱFmXibb 9q|֜Y&N ID^<4?N@jb4Q˨0r 0 6Ÿz0uB###GM4hx~$5|Cr|Qvvvk֬蓒 Ěf"ux9޼,.\fO7`{Yl65;ZGCC#((hʕ2,::RK L4hNIskѩ3 zC2ڼIٸqczz#ܝ2|73/_LS;#P )R#0rBpӦMKKKU} hkk|PJܱFGb&oRRWWONNF01Aje '~CWΏ#0%Ç'M!!kp4h\6lVNAͷܺD,0&p<9ukhh`3|u&HlQ*.[:6i,$c`p4h\xV(9DͷݺREvZAS^{С@`0x<He…~L+iР7XoQ ,d2)ݵkWHH@ՉHr555pHT8`N %TiChF}ˍM䲄 1XOT0B,*Y)s. + ?bjmyFqwegy'[eI-VI{7e#5d uT\){c``>#G̙3N.ZiРAch1Fsrr@N6-66FOO/ ,,~P [ pG$N9{wvؖaWC_V$u)rDm2]je2zdψ%\>Oblii SL)--uss 4~?~ QQQÇ6lx x___p  Ͷ`ihH]D1bL;RbTQn0|Mx"%݉KߪH:`mXӐdG6Be$t11S.|Tr2l̘1P?9s&5229rdjj*} 4hm[[ێ,Y)P.WC>$p~~O930?i$W+/- /fz*UazmG}f{Y'[9/ . _, #H"##Ğp%% @ PWW766P!JH]]ݤIhrAO `e˖M2%!!\P6)777SjbpL @3`>߀ahPۦ;&KMx0^moaѻMbwXbmclӺPhV"*1EYE ;'].EB<4ilCVIlͰE>摛7m2\a%@1-QGdCxk[qTU``VPWuuu"===CBBBCC'NjժsZ 4k4̜93%%%((6 pB X\2LCCb1Ry:'@pX,sC:L(u!.|4R:Rj))R$KIREt._+UKbRS(R&Fjػ`Rԅ+uJ8R)GK_-CajX GGGQ\\\^^޼y󜜜LLLF<++뙙F 4~/x&M$&&Y "J+**O\laaRc19}'}s2YOOCctttzzٳWXQUUi +&&XАfI4hРx1 @P E %vU^^vEM6-77(x*,,, `Ѡr`7`1#% % ,--ᯝ 7j($p&L;wʕ+KKKnݺ3fD"H '\HuC#""֟.l4hР6XdOMMTP(r9&2P[[[C @@~  Ab 'MxիW'''8yC]x4hРA@~ uРA 4hРA 4hРA 4hРA 4hРA 4hРA J̞={…-rNAq9hՋϟv-.VuK'ohc44|~mǏ[Moo{棟\qѣiޤA-Ʈ]@<7-I,//(p2)3fF %mll= N;;;za U@*%%5H~.Onkk &Zr ֟7&PRR)wބ3 @%:j/yj@jrtz(I҄P377466V~XROasfҚß]|X{7?uj45<2,#4Ԡ߆L@?ٳ]\\D%ĀhOfAQ\~=O޴iӔ)S^7A( *---jO\\ܒ%K/ȖO6~-oT̙|4rH=GǍ/*ܹSOOr;v^U*phyQG'M7 G$wd@\ޤFݸ_xww3f<yԸ ;PԾL\)))+V xbnn6&Η M|kXcuV_hƃu|ȉ'n5{ɺ;voj:#|x{G>>rj{??t͛4h M {kDPQ(L5hѢÇ[vnܸݻ(CFFFr\`UV }^ @Ɓm?{w!|ж@%L%`N n r,!! 8UYY9|7ʞE+W  z%GA!r8RpBS@Ժ9,h3 @ `i@hPn A4|}}=1nP08O<dСC7o=<< `c755\V ;ݻMMM f]QۆxpT 탫xP kB׭[A`@ A냨Mȯ*kPVO~1N x$<4Qx֭[ԙP&PgΜ/ MLZZZx.PHO@!Tq-BbQ(84&)r T4]Pk`KvmyTƻ m}-}tGm鑺:[њm7ot>8\qvV˷ѼIPFd/p0x3Taٲeթ><TH \^ںdr۶m+**/\* J1x<8*GuVfI KCԙoBƍxH:#M2 W…\pП7 XbTABFtgJ?6u?o8Bk (ys֬YT\\Ý1ƓbܸqcބxvR !I rAC:A B^@$.Fv }:_M Cá&F!Rp \.N -o[rܝ惽G>9z]w<rÎv^Mg-=ﶴ~x`Ogݣ?jZsfgKV"o&)\2<=('dOn_ȸ_|y &M)6m&u맖u+k֬Sw`%V-ԑ>ZPYi}?k0)\}xR}g˓QVoqF*842okLjCv]˳_3.9]K-X7++ .!RۿVՐ " 98ChPP+SSSkl2j͚5QpT5\tĉ7)X)Օ_R xJ'ś MHcp*;yoA 8U,# ggϞTP,@gpZٟ7A@BO4 ΌzBޤB400x~oB!@ɨx. [F0<<Rs<7!I@!_xj)/R r c:whysKV_W[k9qk]z.=8RYٞ=8gUgKmj=-Ϸ_92ilz]'>qZ}cW-rjO00,*>8 ?}x%W=#5BIII&kۊsO5ZymUˀPk4,/3;ޚ`!.|GP?}too/͛4T1vͯGV(y䙘9s&Yp/x탓WJsp K~AŪ~AI̙3@ {_ |; ~:dQ " ۠RAAbS=Q8~Nݿn555lBA7ӒSWMϛXᐪ]MTʧeЉp&y|ބ(( k(JM￯{ U1dmhye _5554~惟:i}{Mw:k?=x>o㮖ۚc>kӾ{chɺ֞ pk^˨" ꜐|&^]~QL2pq<ěc\딗ϳV~|ڦ|v$>>蔒@W&,Gd ݷ*m$xBZg}K/ΫbG1`EgMV6Bp5uS i@8Ç/BXBuRJjcUeHhh(RE >${Æ PVeeeH*r'd5Bȋ*:6iokuQQ… @P߶mJp=%;4UOw>7BiL>EބAgVV.'{6d B$}M~fo %UȾ'uvs{mU>9yu?m9|Pݖ_ގsgU;bkxgM=Dě^ȩϡN5fL>j?l\]QX+{?~e+OKs|gҲwb^'HNT_^: ׮_SC:8ZaZOA(<ަѫ0ת.;xGrwj~֫̍o1j-out{m0>L[~fԝ".˷RY^Vނn1AGy͒}X_ĬV |5X{ TC655V3K@@Og!?a455ϝ;w=$ Ӵ3333{릾Bp-ԩSA⁗ UWW;J'1%auRRU8pNCCѣGFGG=V2?*T2j|i߻wU mǃ͞=J6vft̙09RӰ9QSSj ( B~ jJ~<}44xx(7Ph8ݤĨ:S><P" {:"*8qn+%l(`ʕ+Pp6$ n`k5ZuOOxk>9yh'Gښ?o?A/Z;^} Gzvay9P0G 7o~ tP[nPA L7P?_`"8 3yd 𽼼 _P,ό<*P~Tf@ CYQX"&p  @( `4 gf HʅPcmϚ  S,w& Y#cCB=0wJPC.tRwC›^}Nw{n7~U{ǧ}~ƫ_^l/[kkrkݦw?oКmo$HXݞ3k9&Sw!4_#?ratuvA*w9ڽWn] ßfέ8T!m~1jz=yd*=*\Ca(Rǡf.lr{ ]]wRԳj]cƯ>u-R6B`{L7IpA幘ԩ#L^+1,22c,h_3yR5'4&/o203΄EW,b3U\6%Qź[ e]XACT=ś A t83jH8L9B qۯ|.X84bĔ (  RFy ~!#T{&DllbN*!.)H@jD2H*hOgáN $x AB. gdd-S]Ezl`C(/nih 8{[h۰Ó'?vc׽lֲ{~Mk+NOe{򙱰 ;rRcרL&_Y[퀊VT\Ҷ/̞Z/s'omg3?/:lxL}7_b̲F̻ZjٰIuENy.VݣG;3[}ܹ V+dDŽ+[MʠZ#t+p=co[4jJ ( *bA){**(`}EXј{7~7}9gts$b>̬ٙg)/.xѣnvʚi{"7QZ3c{;IweNa׭ۈ#GWU2y/'9*nӘhZJgbo\|>i%9 }&N;k{G`1{g1.Q:ׯP~@o/{_|~ cAsa񃒌gYM%k1KJs_U/jӢǨϗ,(̽Q|[6:i&܊*2AT!m9BNq&mjLFo2dwpVwe'1gB$;{GJqTG?| N7ɼl9ȭp.SwRr .xPYYn^>iSMuۯ^ &5y{ɹgZ(_?ܻfU7%FQ19c%o--sa4Iz7YXr2+K34^|r~IQGqvG+xobOJJӏ.MZRWsr 7=*cӚrY!u# oJHɞxU4 oJHHxED4lr3l+.]shWh{ZΧ#>kwc*gٙu\̨|Y( )S̝Kt*#c.Yw;-.DR&xsiw0~xx[YV[-]؊\ICufxӹd” FpyOgߊ|O[ֶ,4aVcφc|>-ɽSTPQ|ٽ/Z3UW?.=|Qk nnq[nASiҲo伺STޒ |3-D*>Ӝ);e05j/J)fNψ缅+ͽz}Æ9h;TLcwE0?qwr4Oڔ7VYq64;.8zzͥӎ2-j{w%DM 6me3e_Nxsɮ{oQ0[fKnf-֛579ӎX;KqA'953eyh"˛,XR0i略 y wfV](QavγK5ԥlRs.]i^n(l.*D+OB7ltx5$BU_i \;旔ȇr:{Y@49DꇝWfdd$Tϱlo bsEw ̚5;^ٜSKOܖ4wҥK$ڠ{ AO>mas[ ;g6Zg8'+k1zR,Uoe*7ru|/Y~˛NN,&YnBk-o(W~xߢş 7StǂşJ *~^U\TVUVtJ[NIDž%u%?yOQMֿ9)yA M7ɜgWbWcW<߮x]ޖrrnj͹bx-*̚7lu/G;XAAaסX=69f|i>N&o@Xl^=绻{+t*J( ~h~ wNu,=slK+I^hph]`mjy}ڧIR@7VJܕ/is0IYE.G-bȪh5;OȌ&뽯W_i:SYcpӮ;& q$9-e͗<-~Z]T~QQy]ܼMPE eUu]>wؽqA/QLQ:U]k׮ٴ+IqWٗU>R0Gttsx$;%+kwrMaHYI{P)uL9f9fffdG())jD\PPxnEnIH.[Qd6𙄪z-rG D5hzg9VV3Yu,]֙-GRK/31~) 7Z`*GXgCMW#ɑT_jqfIii]]lݘ1?Yş;.H74˛,XƩxmUϯtWg6?/Ͽq90B̯/V4=(OUokUY[an 0Ccq1 둚R pze!%%pRzWv ~f r#mmmVdƟ:+e uuY| 琡? YhѪU  ";ccc600 8wYwMf7\pa֭di@o E۵k+e˖͛75077OHH8w\bbΝ;b?9555Ɋ|+=#4+Q;'7TQEJs^{z,)gyƢŅ Jtd:bŊEpss`^,AIj}\Xn1. s\ǝeUSWb {-XFEEl >k׮1b[ ɶѿ=μ+D ꃆFDD;СCMLLkڶmz d<`nnndxڀE.w/l*TR~IkO+J䇔?.(lPkWs^}RX[P0f{Rؠ& ,~~TWW޽l^ I 6/1k,99޲! D!h( xan_ 1=+++$$W3m'Ny1 ]̬v8Xpvv N~†nnallcƄ 4Gn8~{RMzF}fj9WOզgpORS.g%J{̻gu7L}FFKfsodU{1J/ޙݷ EFFfBtT7XUwH###p V'{odv]tkG؜b~\~]7izN\k֭#npfO.""BV@YΝ;GV x,X0lذcZ-l6l71پ [ٙmܼq-V7oܺz&M;Ly'66oqtdkj6SCa`#VҲ"$}-,,wvZ"//cP䘿} ^pZk͚5AAALC@v[n_جcx ˗/ބ(D M}}}Aqjkk /=Byyyyxxl۶ʪ%pGP.'; UɼpBAܴic' -NPvf+mA#wYŅ6/x t85?? $ ڣ~A&>~wF 2$niiI,G?gI'& ·I?F9;( ou3]>]pGyy9!sw~9͛7s:scǎ1cr$R [~E+'Mfn0{/&<ܹs544HFfcS666 &''ւA$)dq @g/KK,FUhiiiPd#0 ɓyѢE(ؐ$rgϞ!WZŤI6mbk.D-]&HUdP "C^ЉW^E}-fΞ=jCIJJ6@F &fGN!C;vٷʾgϞٳg ?GsaSƌ 'uttP(<P6tP ܹs(WP=z4*p9 (0|҅ G}}>iql,~ xUA}˅ם3g|RyCn:h %8a<\:##x_Bӎ0#4 J@ 111$ &v^dqw|rr`ۓ@s ( }"i-[K`'<~<&A |o݂Xb1X I_+++=@#B_UTT477nݺlnaJX`I›xIxܹsi0 'BRrrr:*';䕒*]9Y,gѥAcccPZQ[mlŋ(# fU BD8E"0VFG}A/ <A.j׮]CWfB){`o݃s<ޤɹ?ɭr2'w-ջ?=? tIrpp"""pzdD\C:kxI$44C!Gڂ$?}ƚԐ\.ۚl :k#}1ӧO9s"%%B d F~WowK_ TzP%i J+p ?~\ - b-))*P'x AP(>ʂ"D#Pv(&ِ EM_Ba$:D"`!7s hJPχM#Gtu9)~4klU8d#&u..zrfÛ'2B $ɚ PDpqn4p28 Nj,pR9?)hT=!GP*~o;eAaB8$}AHIIkh,'`Xt0Qhhu_|O rakqЋMP&5gܐ!1fL8DԄr s 岰Xf co &~$F'\PPmYYY=Fv@D+"@ߑIB# [={ ،vA8:K/&I'3/o"Njj jo#' ,Rb4\nVx'f6bwH!cu: b;7_C@4sL31!ff۝s@<$ҥ㋋q{((jiAx9!?=I%%6 q.\轚H1KcdI&CFA1.{L @_"ӧ$=q$5Mo+133ۼy3 MBb?ΤUxNF@ppd^ h"h0Ъ#GބI4oyLݻwӂ#kAAAcUqF?n'z$d,Pu#F%&p4y!|C.t'$&r\d J#M\bF r?~|^ѣΐ( $#L1l2wlrrrPRғRQ4<-_4=INhhhzƆiӦ566Νv`⏅ 9>4ʈ ٷoDeFFwep`'OΝ#V.]:<|83 ԠQ4 =A'xܴb $NY0?i>2STPy4hެk|.>G{KŠ¢"F$i }hL߅@ ΈӂB8&@džhF/KZ7A`[X+h P3w" ,Xׯ?rQp4` Dqrw t?ow[899F @pp֭[H^!_dm۷-\rׇO1.؉8[M-M/'M$ c a\FAA a F@ogϞE ŴLϒ0dẀF: q R P.?.[ B4߶m6 ސ lFFGGg#Cѻ]f03_JE_e0caaѣW\\ KF$,Zmee|S;j4=%-### JJp*QHD]]ٓxwTTTLa% K?),, Hޤd WOBkWI]ZPOxLCpѼz1Y+gBWwp؊e_/`_SN}544ܽ{7??'/^YWx[nG|||$)PGKNN3% n__nܸh kvWB7};pcǎ]~ʕ+uuuLFLp UfBL)//'c}*F25 P̨(///#677LفOF߰z -%(O8D@LɸG{xT`Fh<nK}&C-R?}Pf;'C w»h}S$Bע5Y`rPƍ3tF"D%ā T9r$DO'IC?2dȐɅZ }&o[ wzۿ>QqoA2, ljEREc`L܂d}3(GCh7 2yMQiJGH 09`<^zoqp0a)-[`yc>*"=gx&M?_$g)iOD+9K~.Ewy_ꖡ;y!7odyn˧<ǁ_zo!觤-$mmm777%JMMԩSx֧N:l}}}ssޣ}!qΝɓM6!/GmrPit8XFBOHwN_Ѝ藊4W9t(/}l;GBt+Xd-=<<.\Hf^׮]TN8E9y似3~3&N+(8 lig8i:>~>~2~)A7Nn+agt*}S"* 7Y` geeeΰ0??ݻwAC ei"zzz<%%mM@~޽#FFhBIE.Q{'3:Х, Bn_H7%OHm3x/o&^L*Rݍ"Bɂ [~e5^5T䣩3x4 4wj ){a4_@){OɹBS^;„xZ,X`_@QH~,E?D7Jӏ%}$JwϠ|$d}&Ew gsQ$WGR ƒ,X`1^ q7ti*lcQd[&/Dz_vhۿ̤[dx_9^v_27}}}:00@qrssQ̔aaᠠ To5B¼|}};::?xbۇ`۶m-4Y`@ ׭qAt4 ZJ( C1$]+S]%IO4,wN ].jekednnn{ 7oƍ*,,,lllb4fȔ55C޽{޽؆ 䔕Ĭ@s{UUAiiiSSӧ{ Ȃk֬h8|~[D '!!{b(2}ӦMx`%%%{w u GgC,8%˦} `d~ٽBxBw{_dnٰa<oz{{{2 ݌իW z7%Λl'r@>AoFEE7ovލPXXΝ;,k,Xtu xSFH\iM0lʛK%^?;$)apkwŜȐzeʄC* ^!i>AK!3[ܼySAAAKK>ꁃurr[egg8ICBB@mQȈւ&m]vX?Y^^4yQP+WrssAtrI'9BF9::@ބBtssA \E @CBs߾}1;E ED__Dfkk fDu4GM#ᐥBxG "##vvvɐ9T&(>鞪*]FFBPh)9s)))f؉16] ǓK0fxzzickQ!;v@-ۓ `捍0%1#{O#nW)=hx C8}Pd{=gnrW=JK;w|nprty^xM͛UUa8tw>934ĂEo^pY4)|$OS`Co/N (I5C}wg4]?~)]/9u@ȆwGd=Ձt@ Л۶m 9v9y2$"QFA+89'9sL^G*ț.T]]}( Ν;a|/Nԕ.{ FHűFgoyFnR]C>.|&N 'L`'4;up(:'` "u:t`sMvDH94(n\v ̈2R Qv3n|#O2ZA1'kpW O$-aqA}&V NEEŖ1b`G6l߼Eg%EGvFEcccHq }P0Nrqq1EKMMewЁ";DT&PT<CQ)*j~L!0Ex8Ey"GQσ).?ƒ)ʟc8eteY`zAiEm8MIwI4M~!O ѯ}*2;doy/l_ ӭWƒ2TRZZJb»372^^n|C:e^؂\MI$ûcx9CGh@@ G2ÛPLpn~~~}G zMf HB8a&/20s¡ȝ(J& $,"!F S-"yÛ(2M-xػ,nDЇ`s 4})٢|&EVa9hD.7BBY5>z_~ZćvFRA4R";Л111}.pפIVxGkfDe2avzB:l) V~*:(*EóэжhǏ͛[ܩ u?j~F5Z@ōS^@ 4#Y*}O{'kLe⏋evވg=#72t MIӏd~:Wn&Bs^^ބ__fl 4 WFB.]D 移!} (.mپ~=֭[A psdx疖;` =4z2MPAɰ~=-)\(v 0)ZFF 0;@?7I4h>o~PW( Kڵ Jj R3on7aބqrrG v<Έ>p󞶟RQo;nDɈe›$>L"; C&2tAϷo߆F#! J̭[GևIͼ=w& ! HfVUULqg EEMz4ًCZZZdd1 &"#>0ȱ7ohnu[BA{ZDd4({P?}3Xgggƃ0QRTz;xFCd8D\ExrtttԩS_q0:@{|/\MjcS-qTm$E}h7nPٝF?}QgJQԳxٞ3g#"Xd7"fx L?Fw*ZDެr:oRvY,oW1$oWS}"CwOLPT~MkP[g\\|&q4!yz$ paaam%2 sHTOfff&,A={3cAdcE ͖;}`4P (,q6??`(k0jҒD$WRg߾}|r 0rFF3`ѣQE蟄'&&Cʨ7҇]qqq >(tr@ T) 9p-dv ZVAA2=k,SSSp+.″Кi&;A螄ðС>V{GGgIKK $sp1XFC e'Za!0v o+M^BB &@ &=Z]]M 7|2^#a y¥նwGPRkc^# d DpFFFwF /` L{7f%hv"!N> nah;hᦦ&} )D_{? 0ŋ yΜ9---VVV(n07$)>>) l2'hQRm6EBQ"#G"5t-g"Ǐy=4%v<3x p| Pt$MB8UC5(o:X]SWwj^|m-ox*//(n<i( 8]o`-םR̙Cd7⏪i"{Mt MǒkE'NOx)R7Fxo"Ŕst zH>8ȃ[.//9"cRx%4/2|<xlK&h^~g~)s?KKKo޼IÝBw q{+1X>G$fຑ28i_u"28̙3Q($A AvJ\$p|UVV@dhpon( 8a]@UfDs0DFj(*MqDEQ@\Eec0$9drf jT5H Ԍȸ H]uuuу***BP{T!GFAp,Rœ5IdD}󑚚J&s]! QP!~ДhA(h$BeeeBnAlq\4@[-C ꢩTmհut}]H Lqè&* @ jI8=-xK^wñ'V-\lٮ+4 uJ6?O>Vf +2?z]uuuO^F^V~[^kTPp /6[8%6L=yU"# TX .[zTϹ#!f;/?0h$]`*X>w4-CK%x>MOGsgt?S2$PJdLwhDN7{3 8ˌL>L IOv*rdV!w?pT?G~%CDOniB~p"8 d|q!InaZU@Hr;' #Ûs\%@Ɣ6d>2F^cV{?%|0z#OBϛ74‘SAF8 n_r#^ll<Cݏ{Q*36njEN)G"9S_mCb۬uNY,IUE. ˼pmJp[=pկwU)iGp%Xt QM蔬UZ8Y;xEng 9 '*Kj}.1Gt݉umQjk(Xʈ}_N_+Н߅d2wvO/EixÄsy'ݝ*a!6滜ुr4ߛ]YL'^YC`}f;>Vd 𦩇kIi?x/wPWW@׉:cgauz?b|)!_p?U{f%&5cG{:ct.\x~7f|(sIuv$G/&R;'eoE3 **\ùyPGcWOWޏjkݻ¨9>yуq<꩐І֨z4< ADF/_nL孅q5BKyZZccE2 Λ<2#cʄynrHurfS|ws?Q9[ on=ÌC&ؾ$7 HgwgkK٣hu/۸ox˦vWLk^1,EOᒁhEkL+]~nef[ko,_:84) k^"9I[Kf| 5K5q.QDc|E)-ښӵF.ќ9S[k) ћ7|{Z,X|~!efܴ(T3XJ9~ˍ㟇Q܃ݏ߁j㹝1g׹\Sg˛!Ʈ55qw[ bx4jl~}k|`Wf=7wțFƛYA#}|:ysAwc -s&{ڞ%6lZjx3㍲׸u;q{ۭz K6L-ɪ1b؅.L,vW̶d,Z8Q;əf<}ίfQ3_-0CG]oVG`#\>edffJ陙)ioOoffrffzZNR'++)++$gei~b`gDZ)O_.MC/CY'M1uQ]u6P/" Gj߫sz{]8odueeeŋUc;f9Fp_fl|/GnT/E|۽69;w(ߑYt'xC 34cj譱PZ,70GqB2 X's&Qmț*φ!?nj|#mS7-=UBn$1c'+̵o֒9,-SߙL wm*>[kipjjwc$.Y^ᨾY:* G)#7so9iN-ڶ7d͛,~p>~b`gDŘm.r rC݋v#Iݧ_>v{Pu/k_R;ND}\x$,Zr3:pͼe=VάluL-3AKF)$1ͿqAoGL" 3Lu_o2i[\j%7@\%a6{Z$lmm;mv1e\j-o"۳/hurcUQ_ l$ܕېf_tA5ɜg$ݍ;>z܏YߺX,XqeT]Q_FpQ.71zLƂ.C=IuEPTUҌK!T$>yޟdXl\FcƌR]qUqC }#k26{=qAox$&kzpqsys3fL2Q7sD~ޜQ e涂~w˃T}lC'79H~$ l^xQ"vnHks(yOZk:J\1ɾwxUr3RY|*9ױ 3Ό%qק_(]pIM 1Z)L;RbrI ;oovqd8sYxE54&%RGy;;tлfwRmtم!}ƮF.e;B}_@@6Jf[g0x>9r0vQi 3pUtn-\GG(Ŗj6=.ZO9w;2`;OQn5>)zU=j #mÇWv&;y?ef Iذ?NRFGʵvɋ ,X ";"^8Z4jH⩧m<(nЛ 3{::(7: i z5wɂş893bxS9p+ Efddfd@ȹs"++ٳ<333;;9=-ܹT---\ĂKw۠U)\M,~+_xƍ0ٴIw&c 6D㯉 S]^[dAّsVZ&  ĂV89(_}ŊHZ@f)YEW_V< yoCؗ{C.&lp3rP2:pI&1WE,o`+ ` 1~Ok1S~sJM L*j,Zm+1»Ӹt(>eԋj{?X`{N>(*2v?"]Ek8\l-=SGZVGt΢}E.yW >|MWݿ]jrDMӎ& gxX+gO@|mӅV-_abheyMӥj=ʥL 뉫Mp.Q.K˥Xer4O1 w==?<++ujv*bůu;ypW)""p윑KJE改V9獙8wyZ}O>3g$̚PhzsLSvK2 ɓ1t|s^$dpݖ+UQ]:A/僄()9Mڐu4/#%26ol#F|J;f̘u6Fܝd' TBqUK.ihRVpQ+ѧZXW?<,^8Ǜ>o,t鮜܌M &[~pƕ,t[reooH35?MKٸ>oi؟ݻ}CdmW~&;xwRO֝Mg>kl53uTrc^6i}Ta_ěj&dyV'랡t8pw* NBdrexiw3~||K˗.*lff?b)卂Ug{67:~/;Ƭ!^5q-Y8vv_?bxڧyUYx]͍^<\5k׏#P!)*vŮ$܊.o Ƅ}TonrL77iH2ӷFP]'1[(gGf̓U ͔&MKJebN!1’"EֻK\e/[fm!k[?L}{^@yqrr#F :"W[TΪ`Z0oSWm_2m4j.^rTҀYe7(myf.TeyU\h u/$$FSU,XϽtWN(x!2K15g.:uZYqNz6u6BgTFמ8|Աs':Ϙ1-A/(E+lj)OCCÏ'>Yus [(7Ǝ=}HPDc7\v畔^2?vݹ׵ts1C+vWDwa 㬵 z{^7 ]\z a9/jKxIB-e͟?d!}%Ft ߄ǒoxDP,޴S62rFT#LJhdh[.4"mW8Y;]α> 7n8;F令g t54bþdذ1NB%#EZμy`|ʝWɭ2N]ڵ_DdW(aS0IvG߼7\d wQcT g/3Yv핰}$81gv3Rc}V`zkDf2DK&'o<{'ߊI,j\9:H_>毚j|kNќ9s tGq>G7o[g5 7r_ yg7FL7FDc7P[KJW\nz8;qu($ٳUKÛΑ=yhOS֭;[n۶sw/hbYOMMMqZƊt;$P]\;dETy ul?/!CXxs WŕYY^~Fdzl{ѧYugI/+^>ᆴ{PQܷROߜlj(JM4oҠϷ֥?oƔxfqZ="ӍYLFѩE7DĤ9M"t_ q704{:5ց=KU];0hn+[ ,4hq˹3t"*vcr]{^d讟i6i$O]̯r|²AY,m{Y{ٮ~1BBB2d޼*Oلś,qgu,Y ga{vٲe JT^Isq֬e14I IU=7mocDzXlUVY _ᬋ65-f 5;ks1ye"n(Ӵ'I8K"-]n/꒎'ɚʬQ!g'N*,Q@90083g ZU'fփG/hri!2w$o\1euڱʞyAkR9e '.\$&?,6RXiyX!/8M78<\~KݝY\yeTO񴪱 [UM:[3>ELL7iPw_oi73&gQ!w$$ ^9&S[of?~*tpDkvR\g͢!&o:5l1*$-s VgK6]Fz>)9An}C0C1+=OyyeBϘ뷴|jg:tQѱPI'8|%N!KgRs9ZCYXXfOC7w~~@`c(CR5Og |OŞYYhF^V;f9nTJmeoS?O) Ϯ̞:oEAH~zcxs\IP(W!fiŞQ))X`Ts]ٳWXypSY)9(4hڲd%E;q(_Tel,.v =b@ݱ\es[-0;UYV+++xdK[YpVdߗ/{Pz6WQvc{Wǟ~՛o&wԧ̯^}ǿi/\-DPh4EklO,T+YΓ7:b#  P9RXTݦ3eś ܥqKX<5>>d5PQPA#2#G F s'/~\efE*8lذ׎cǍ~ѤvC 8OM%8t8+ClÇ3@×?>|cՉ3.jM#G 4T¬򛛷}?L,P<aƠ#9rȟ'zYiЈ|#n gCCw}폯`aT9'\Pp4I<|?C5XmX5$0M`usYtO,0vaA((ͯonR~;|y'qzUWw73uʞ>J3 ΚWEn%U;1lҜI}9xtm;;.^F@O6i$999O66l؀NZZZj}l2__ߜ##cǎ̙3G]]hhc+++?>66Zj3f̘:u*.:ejkk#2ܹ"lmm322Z]7 `p"v$g -*:|Eӧ;gp3'OžɻcqD螫#!!$${ˆ9H2z0BTJ@`L%b pOc(&NHE/j'!!-""_$ g@fN(7l~9SR\\;TiDei#A|ck}Qܽ&$yLii iiҪԨ8p .\iIIit~r@+2SZL;[Np͔DQ8JR{ȸ:~2Ĉֲ7OkZUqSsrzVхҎ_W~W=aV[}We#Dޣ7@Uyyy$c֬Ynnn\]]ڍh6=lyS@0m`*XNƍ[t)*\,\AN<}!\ 4/.6^+.\xx8.Y\\V/ӰW [W*ĔixJ7Un}C" >qk@9W1sܹdN'ޢ}V}Z=VSγZ7swܭxCꛇϟ~u]~q|c>Jll/ǭy-ߦ/ljOn?ww;/ȑ#۷oWSS;w. y󦾾>?Bp&a1 Cp<1{n!8sqqK^DG222oR\S> ғLIM>s#@ݗ/_ǡC>6!Xzsʕ䊠_FFt5IL|2,pcO}/97Ba;:'-J㯄#xV? +`E53ǎ%_TyQMCUw56oe͕oZZg,xmgΊ}&; 0))Ν;:::#D(**ر$*ٵkWɛT`kk{}х ݟ;sxSJz |L PeeeW`/ z݆`LiiiUUU@&allL޽J3Hi+~"`Q)?i *ݴs0'FoDLh}ljkl,kijob6Vx@_<ޒlkho)o}Q~99΢#{ŧN,9SSS8I+VP_ڵk7:@ү& WLBΜ9ù޽{MLL8BA䖗Sb&r{o))) Q~K666<BtO6g7͂[4Gw1ftxF/ĉ550G;K,zތK8U}BLBcZ0UЯC@rraggȸ AAA\x3#6OŲ6&ĸ.]86{ JIIȀ!nJN >ؚ5kG^!{_ % R(g7 WC\˗͛׊;u?tМ9s(bc7lBJJJ eM @>8{1?}Ȋ0e**oNgtn8tqqhLt6Pɓ'C9õN0$sN?>>ׯ:u DYQQQh(DN\l8@lÊfeeZ#-2%FY$Mh.، BCCCII5e4 XHl@ѡE۷ҥK֠]FhFGG~b+P-R :m'N+yU(שnUz]ԥB1*@3"FښJ*m-WZ}J)`;:6!y߁^zAΖWj:UԿJ}בXDŸyumC٫ƢU 25Vd6=h)mo|U {_TɽĚ- _#|8$pQQQ{d WApw] ›pl.E+**oBDFFB)K'౗.])!!1{l2?k,58dyͺ:&x7BRMڂL#_`5jp۶m}ŋ?P6#@&oKKKtNWPڼy3J6tK@T=P\/t]6l@*0`[:;;||ĸ ng] ޤ,kkk<zÂ̝4i,f!z, _tPkQ_( C/D^(x}33tbSPV%"',)`9"J"2R2%$TpCΙ5KCLl̙E%EDDDT}pBѠ=-PMT_Z𪸩u{g_՟go:~yɫ(?PaoqvB]{C>֯_nnٲ3syAPP[O>% ?~ *!S<*$aɇ_Y" CݻwPL!2 SBS$8׸qH-dkk;oQPqJb3X ׀,SY^^^hLmEls>`yԈf$9{slHF 5/''` QFh .G}&U(PUUm=)5kg kA-HfP3U:Ԩ)'`AF #&ym#GFCHH'ބ>Ք&BA)[[[3<2sQ46!o߆єεB5a _^ pZ k%b.|||+$-TE*\54{ A\VqMM'{XƲM̦ڎǕ-MWw8N 8pСd&333; x 0eJ'C0֬YtRtaÆ :*fo>XhdݲUI]GSqz=YVpp͛HJJ222k IIISrrr}Yhbbb}O j-]jr ګLkjh/YlR_HluWZT{jmV*\l``@AGc;LҠA.w c0GW?#HqO:w|56m`1߿ _EF8B"W74|$oj7ixhޤA 4>Ņ؎u%3b 7iРA_T&ϛ] ܕK^xA}Bjj[ϝ;;c\@W^r Y7󬉉ӧOr=fff666PK}:>>~ڵ<)//oXXo'κ/` YVNNΞ={GK,QPPPQQ[?~|L<E 򵴴2 ضmɗ{e$!>tC;vʔ)`XyS__[n+++1Sr!5k8;;-]c>`iii%%~ k4l0"1OƱcxA ~&|_XHdQo^В...\ 1c"d l DVC%&Џ!!!Ԛ|f0۷odjh YK=V^ x2 yyy%<m 4`f3ڦLtp>(O Қ={6ԢBV\s.RjjjF'N B.5F >RpԩSIiӦn 1řPUU5++חTPBBBe! 3A QJ z*,LHH0aBo%Τ!C@Ysh4D@MI=*yÆ ]222 S`|*AB9y[rfܿ*r5O˓7neeEnܹsݺufY@..)822ã">||R?$~)HTbpK,a(Q<|ɓ'ԤT|?9((j[LLy9NϟGgςh7{`ii >Z~}O vrr>}:f} 5k"LS p(((XYY Ð tuu3j}X}GӧϨ++ 2:$b=y+@ah ss#GIQ;AJJ 8x aԤL0mOOK.aݻ;ѣqS)((̜9L 4h|q+7='ov=!Ad>-|^xw  b xM2Nsih.ś` (M aWRRɛ8o`qi&MMMB]DP"Xᵵq^ݼygACPX\zxxBD4hN/++C=Q($' +-ID [@( 3 k0_Wwv$ŗ/_a Hj~ !$QA\/mGGǾ}`?Ge0U>>!\.Aun߾ rF^zݸy@={PPC6iР [C|ɾD_o ٳUR3Ri/hb J'99s  /P9H|0=C HgאP /H0WZ2N5/7$PvzxE-Pq.ބniiACASA݉.^B6p(.--E6x=i{UWN yRaO=?v3uT_22$==P}d%BA4dkdd6l=DC!III#XQ OJJ 7oɈ`hB=y Ur%2NL4qhkk ̚5 4]ɕA7MF͛пxby8,===Ϗ&߳gLRcuMTS oޜmʓ7%$$t›zltuV/9qȪA'%Nqۑ?gΜ򦝝  ByʕsBҥK:tA.x |kxsѐ0c,G$gC!(Lȁ=H8(L---q@!pԚ<9,//', d)ZIII>$»w ;M(NhyTMBDmQCё7𦤴f޼yEY$-<0䃞 cbb8-d,oA]D'CA3f 9[[[ vJG b>>`:)?΢,qqqO^뀵MP-T!"C~E]]yr,//ʊ5y`6$zP.={',QvMh4HB8wZarCݩ8APvؼ9Qhb"?n݊n 5f>>>E;C:0`2;1q]ȔC :<H%P V ln:hC@ʠsNto@H^UU"zm@OobBhiGҠx2{כJ0  LApppzIII-V-{C>[ޕ67J p# G\l6f@gI?<< rt(M"?@%AQ3 ;`PT9ArC$Pj!j^ '@d}2 uG,فkP(8'|[鯁8GĐ~iN& =-.y ?V1xxDu'E=σ x.S҇d0 ^gZ. d6D 2,ۋ$l@}ՇhFt [հU}Ϟ=⒙J??;梴oǸ1NtE}i|lOG:S!-M_p˗/700577|ƟQQQg^УițzV2+1};\" 7gɓgy&s^p=X艛G;9Èn 1 `ZYJ{!JKe{YYAA~/v.,e覧֓CqUYWZ -sѶ9!$hk[O ?q\UGIӀ*ooo*ɎG;;7GvCi+W{ :%W{$ HE&~tݘ>[i/DCߺKޤABqBV%;{$%, []ҢdugvA%VP\G2ֱZ]Oz6̜cfa ~Y6(?͛4~Caojqgna;x}wʕ-[=<<;uvvta)))0ȑ#d…ӭ͛mv QQQaaafff˗/YҞ/ܷP"*9\MO+l l,R3嵃~($&ZCꝌ%M7f|J(C+e 8}}왺4tp%/v="izh[QW ?3cy4g_͙,,|bƸ447Zٸw=>{Ownܹsgw΋wʗd8[7o}q /r򁁁O~5559 Ϝ9$%##bŊ/~NIHH@]>!RRRZ9!''WUU%+++...((Ϗ^{ٺu+(++GGGӼGRRJR|yͱՇ d?q*xh»IY M={/*Ŗ}bjmx6;=?>m z~cKZ ѫ_ּ,}d_źd蹣wֹ97zeǬ3;wssa?@ 7(Sfmd_UVWRTRRPb*(cGmBOX'd---x~.tھ};Xʪs Eꐺ`jE?.G&?M窪YtI>#_RRL_vcOe]CAb,Iݟr27M:) PFę22$/^raRs>i75#33SWW7Y$$8;w:.]l¹v3'V^=j(q<.O.%%={67ꫯ qƝ>}Zwv&Рy 䭿޴6c!# eW C/3"S07scNڒ k2 ?3c C+֓X+ͅ)NRM]Nw^w;X|wu3UFEEo `ōgD2_GG*h-4FIeii@ Νn:zzzPV>% _x/ ^U\BSSSmmmmۦoooO%K!Asyyy0,44tʕ&Mw=zAmmmcc{$P͛!Y hff o͛?ĨDEEO q& ^bELLLbb"߷o^PPj***ٳgmll>]q!/ݿ=o[3֧3 bdO\h}Lee%+KAN81AwuI+mg o؝ʕ xsxS;`w7o:Θ%'*Sy&ӗxUq)0s:qٛ8k›- 4hyovW8p _NN(pC@$}6nWu////:w`ԩ&L@g7yF FnlPKǃ|A^`=8-[ 1fΜ Z)maymm-jCHiXYY222>Rc}f{{;$92411AcƄMTƣ8V'$$˗`{PPdlaavmEFpW2N"75ۤfc읡kX㞒˗/s}"hjם?s{Av&YY>`߄Y""=V]!hpx^@A6 $2 >V9rd@@k׈@8YOEIEd999IV}˗/A(k֭eAl$5fM9sM/^ ـ{qww'f@qk\&x ~JZW_mޖ$\(S}tqK#M\O[4<jjʓr6L;r~$DrU4H~/Ɪ+ޜ`vD7NKt̸{0gu@g3eeټy4IQQ? M/3f@M<RpI&4E@^l}g{R?vҽ5ّp];˼"?<~|*qҪvթwOSXr ԙ+v2eQƙkw[lڒpUZBQK1-JOjx4 rW?Z`bO+\~~„ T 2YYY'q 4;}֠&#,L@ֶ&s oBSN7͛}q$0R`$=A MMM˛ Лd=缠 嬬,YMMMH8x"p^;;;Z#11[%){pE =nGcޓuC&fp;O'!kc}xuctT)q߾(Λ{GMLmOghe,U߽/g#6͵ $7ۑ)9oMR{r l i_%7qӠEo7߀ !O2D'O^]⿏xm, A{7/ e08Pǿ嫮{ $4hHJJzN 6i$G*,,,<AqϸmnlwKL3ƶ7Mbsl9&aaɓ: 2dȔ)ƍ2u-O 9zSL6;䊀F`o?BB"(ӠJ^A~yHBM6C.ԀLLLGŏ?޵kh.>>M7n?~7|-BQ,YXl Xv:s+s$EC}Zb8Ml&n}Amm)6 TY;m( i#QںB)(IUl:6l<#qІDoW >!!hZDLp%KKK4irJSוҋMuMYO appcX:8,e;888sp0yg k6yB 4xђ1T"$,D>1G *&p UUU]l6x}ہw>ṡ53{[綎׿EVY۷o.k/3xXW4IqK>ʫF_WƟ lDn?N4hРA 4hРA 4hРA 4hРA 4hРA 4hРA 4hРA 4hРA 4hРA 4hРA 4hРA  6c endstream endobj 17 0 obj 193794 endobj 11 0 obj << /Length 18 0 R /Type /XObject /Subtype /Image /Width 616 /Height 455 /ColorSpace 3 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream xU¶k`"**UDt]`EEŰPtXE׀(0 :TΝ{rs@2`oM#z6}spnS{o}]}yꩧz衍7[֭[~֭[s='N7YDDDDD`Μ97x_~iӦM2'xs̙W\qży~YhѦMn`~ܹeeeЏfԨQrʂ k!z{۷?쳛7o . s=w@:@[; tMk֬+g,Yr%͞=|l9_pxQ4 h2h9K勠֟V;m h2hڴ1c~ѣG袋˗֊ATUUO<Ľ ķb `3f3f줱_|ŋ;< 3<>uT&LPRRZAAtyyy f}٥ʠٳ}Ю}^_5`$.At)np@]PU |ɹ-,,<y`Mڽ{Við~G$Iy熰DDDDD~ ׭[!HR@gqɓAZ|뭷n]v՗\r… Ld7 P Лos=\kowΝs%K{lYwΜ9$ +Vg>IaÆ;1捞0lμ9g\9w[+||L;7_̛ɞ߅jaU75Ȝj&`&Ү4iRĀpf0ʖ̙3N 5 7йrEsm<\(F ͑cb(y̛933 ̟7cؕ‹fFኙ fΛW^WRRV qV .3?0p7avڵi&J@B5gTFN;\!8CWyjJƕ-[:?]zuow=vm{ȮjjWڄU[QEAcn<ܔV̸ί#cP=JʎI%f$A)D`.-գipPϙ*X#M@(¢>o>*~|h9t}ȑ9ym߾d۸qVna+ߺrğ׌ܺ68qƷP&OBCC t%׿dnŋO]oNg˿]I/b.Ͳ#(X;qϜ`;+p/$ݻw aيܹ袋V  Uyy98U"@5k8_y˕=w;W%{^:K0Iښ1'NҠVb򌓔:l-CI|R2tj s2|V&K.,8aYXjcPFh*F.tƆAJkUebFʫVO2eh\ Q='O;3 $5kրC^qS&&%ޤo^SYՉDy8${Bm@ GMy}jܣ#fNV_ 9mڴÇa}͍f{?t]]v&M`/ .W?1iW;ʎ<;1ޱu+G7M(>msW\e˖^x̀EDDD`{Gyd… 05 8d8 L ?~Ocoio!i[H:ZE8Ԓ36&2Qu.6ۍĨt ]pͪO;Df`t.%05/6DBuuCH망{݈7vW3mF4LHr& Օ뿐H}p}Y푶2U@%5"Yz͐v(A_zYg};؋g„ ׂJ˿z7ʎ///4A4iҸq~؃r8L2wɒk]OWƹOc@,Zeԛ'.KMS3R%Q(),GChCbRs!(LmaǙ\ڧ{h΄)|Iqf,M͟yť$iMn-l6װY3zeP:N%:}ǰN.6@hR 3F:dY pUs9!,\Z -Pj34wuШ9' `n@sxnb䷷?L 21y/ Ǐ?E-""" +^z޼y , lF=#J&L>uYuzw%]5ZY wM02.kPA}J>L"ݍpLE;15J;udDR,'aFD1AhˈIPh{"D! 1` x]ZYZI Ikܪmt$**zcl:$] KiwXKcux2KQ8ަg<b/ xHxYT~:|rfΜ 47]VVv›wm^=mЫb]h  ~+++Zá1W~ߴE?Noe|'~lر@CX""""C /Yg&= `-8yUް!u-aN0`yH' 6n,FZĬUS+ mzTf>ybemZ]#5qM7DMd6Ia3GwTcMZiLKqΣδ ko3[?\\ hmMXY1OOiN&J}dtѬʨFe~9W{E9QF aoBƟWOHAWmZh|#4%7nݺm۶ /Poyp_=ZV&(_{ן}^{EQa|`|nm֬Y%%%^XX8|IN{܋_|]7e^La$N ; ڪl-D"I*tFخexo^W2村#G츔A#a!ivUW2g̘NQQѴi89'Áw<[ouΝ{ 8__kOd13fϸf5[>ܦRWIv4TjcMrOQ 3/\4DR„R4Eh f5LZjИa6؆hOjX#׃ B=m$W2_#F&ZcҪb bf9xKijLAk#*IX&מΩomEAzwW~ڦIS W]C84>%m}0 iWKX, 8Q;]۩PlͲ_›hC.hQhX1? BwӞz꩹U\:eܘ/weT7j ?*7̟qrXwq0xܹg%6߯z٧O:q„1#~xoAu%֯_v7Y(d.>{rRNFFq/Kq#$VcqFH^QiKk`2Ahҥ1 bW+jRhC# ^b;jB%X؊P 5bB޴TeMq<a M2Cq::2LRNK-NqVyIgTx jܭF)#IAAH*mXt˥!-fTN4`p0"@|Z2A:"YrPO{y=z 8'9yswMjv%47yl6Pphc*:# +GT2o/rׯ^q邹sO '\ѳ>e˖!<"""-k#Gn޼fŊ'Qcͻs2p`TɲmJķXj*?mF|'5 J;aV!)VΤ GEO#]pڣ\jΠ=YUq ζ<]b I>Я ~ It/gL8%op5 @zZ4WpZ SNޜ^tLyТ׿:{sԢLƟfWwtۦMs9??-_|q׮]SL[gjB!q3`T 7E{ģ,͍n6,s|LSu&*5YHDzUPhӜ #MTLM?Skh| &lzU =,"b@F|>|/袋vF߂4C/~X$ I]*4œߺ>p髆fΛ7_?Hh(`~)&4i7]LK^JkAɡ>,2A$Ї9uϺ3U 2É/; W ҩFܡ!ՌEM{t 5s2o"h rA s0YGCKcb_F;rO(1 J* 8dm$NLmtS\I8tF 2*< 1t m<%}*ކQ3eFD2i`q=Q6g$xf̬SzYK0C#2* v,`Z6\FZX2^ /^@/_>]AoİIC7qC#:!Mfp`#ՂE-cfY#ȋ x60s tyr1B-Z/]q=3@Y&:jQ/*A"`PP~:wφFGu%= ~6;ҿ?{u~UFk_?,[6?cso=3G\DD7gڴi^zoML18@f͸{74o_S8xCK.ٷo 8+'KV.$B=r;TƸñZKT7'L*Yt0b9JDRl6^?֥X0Ym 'Gc5Q?Yu2!I'I2]|Ϻ+.3'W0bĈ+W>b[vzO?d쌹3m\nLj&$GeQTZ:ImU0_1jX+JA;`FfG* 8*TҧfxĎr΋ kd([+PP#mIʨ ` $]cL5a!FeaN߃H}h2R'( Բ1k+%Qcd $Vw@d`1+Yآj(Zރ` dJ'51 qU.T4 v1Dz&%r.EWnIeP B+X#nYR.+rhY0 0{ C'?b T~{o*1ҡ#QM#7@zlT8{Y4fnx`5-4o޼M6J 8/g<7Fpd̦HXM >7Hbi.Ӈl }ݒ 7ӕGD|fHm:p0Q6ؾ²҉'{ ./ 8uXbҥ6l8Sr3f̬ޒ(m@˙8ԊI1pO`UVCvvk}$v*KilYa3~1#^BUf jg)ts=m5n}Lj0ƄU:ҪP"ˆy\Y ؐ !XD]My(4U-w㤟`0] G4pDM ,LsfYډ!., F w]iiۛM0oeSA•)I [("M*@!cA:KW/Pƍ7h`͆)S Y}Vh,B%o>sԃcD['V@д)W^~w]қ~̙3w)J-Z^9rUK}gsʎ\ՙ$ ct}dD6TSx&{(3e"Nɾ}!4d[߇$R1:[O+l:!GIW_la o˞s9='O D{4DS&:ҡ:mIuPXm%CmW<!]"Q]#=:ݺPe3W_=cC?(hФOI_ZƩ˞KRռ5EPMgZ+ifII > lU^>;Vu{(tf\tGe̕e&+.dM &~akm=W _M5mN ؕ@"3ǂ+V*)Gzo\sii 駟 ogŋ3[ڦjZ*Ư|҆A|UqRVcB#:Y\Ǧ1I+0bh'y:Env&lAV8`.@S4lN|~ti!M|J/wu|v~g` L5*"QdDdnp]Zl &KbN]RY(-ȋb<8 $ފrSlQ1,S-1i507 *=,q 6__a.@s&p3 A-nS( MCZבI5lBWFKAa>_e 1,,~ͱ+{}_C;3h#P^9xwn/;򯟝uEK[s"JczUb,Z{'c+3D7%=d 6HH$zنG"%2l4t VF2nR $9-fS0nI,7XUT2IF3xGW_e˖XbC?;v[.H- g?c|umlFPLrW_mA.N!vBץ(˜J֎աNQԀ88.әtQ %>)cJ,R: TcBJl{ܩ=$Ȫ 'ZIj] Ġ&B ,XI v"RsU9UA8AB6Uڧz$MPnN.)qc6Ҳ^P'HL'e. #nNfI:&ڎ)Q1!BfR ƭEZu``kuGx f͑n ϣna S6֡BJ0`ׄl5aEoa>&W^xaÇܛBi2!t4) *?=cASk&qIᬼ“ N;῿Qwca\E (sǼCO}؁xQ}FIf yk { S9@6E=ĠSvĤ']>7MhY"ʧU0`Pom,(\y$AHeK;eT:kmuԩEEE`Gdn|ҥs;~jAC}tb"@m* yҹ)D:`WF3ʄHP{)7Ϥhj +lc 館x2H UjwB+e츑a-nBU*^ʫ0I )#mii p(&Íd,\˥cfIE{J)?WQ VJLQ|"Z98lM h"NFBe0OZ 33X5 Ò&,#4Z N2GPVJy.y(`Hs{x/QOԛ )054 ʛ 9`S~5ick%B#I*7w (D\3>hӿNH|po/s F'2CNT:LbZ\aB1U@`ȁ1ba&J'S ;Ё7 .:Lw7?ݺɓZ !a6nܸdɒ\LJ\KE,{f07S]:}`2(#P (rtL ڎ䢜0Z] &0_c7HpGZ.%;آ~aA*QrXe͝Ǥ%F)fq7Qishgyɡ.ۉЌh0>@H@P )(;iy'D%,Ex)ʭ5H$USD-7FTBwu1fƃ<-(sд**ǂxB]$lP)l$SƊS^BoS,A.OyqƁ Yfmڴ+.._ȏW^Yz c~~~/%QM$*!"[BTd+QUXLEJmT1I uAאѱΨ (f%AWdUhk3i$.`pRXĤu6:3ZX"@0b"dTFOIXʁ^Ow155ZDӃ-w5 F0C-66ApG :`1l*iUja&SMLߊXCM1NB`Fؒ`_-lPdbeKZi(i\agzyaw3n%*Džuz瀼yׂ2XSo6 =WbY ?*?JZ4l%ΨɷHswJW&Hyӯ+GL{aJJJ]ߎj_LXs%`$M c>UTkGH2;w:'Be#و,RjA8*gq+1(z#¸ `؟WX(ZQ/iͪg.twZZ9{[pQ JJKk_4K O7%k0M(ԪA-XչP}֫lȦ0 U O>XO;t {[0o#%vLnѨ2 i򴃐UBZ u)h7DB+Kq2 t Da=;  TEtrw΋"V9 h]RV90;)XD8ދ`. j1SNىzNfPn53N=Cx3e8#k=]DcM^.-G#JK)qI)mP[|v0oIW "t7U 蘤 ™(,gi Ҳ\D85[>2¹ or-C7ׯ_? ěFsA_ɤ/5£9˷Op|}1TkߔW^ZkO:{7<K@%L){dZ|+QeT0A{SLAG3d0S ʀF)/}歎&Op4Y=fP*%ɚC I_s/H<}t8Q%f܉gL*QV2$j{}ß֥X&[O}1ҧ˸j?z/w̝;mQfgȯbټysyyyV_Ϥj=QuRe܂ۋ*dF6u8<1i('?2v,oilI\tNxTCU֛vXԪ۵Rm0@jɀ5CS&eXo4VgZJH|ҽ7J&c S{K꒫ՊZyH~ =u6O=Upi>[M2] a]u,/mՇU~9!u EZݡt NP:yRۦP+nY%ݥr4ҨkkaZOݏ14EԤݍ`y_XBhYK핂a ٝ/͛?xnGgxΛmoܫ=4mơ5mGwK{ѯ Dߍ}M׏nܨqgqN=-p4[M:_s1bҥKw5?Biyٹ,X4!jW*EWaa0VӆFܧ”m[ qTnA0h^Ɖ0a*Of8̃+TH2RrufMʤG &io$q§E ):ȆIʠk8 *' G6y[  8qIR5둘"7;bnA$ġ>.6CaNA(ZXF1ңnO5vɰBbSO>dʃLaRY@`*`͐..Lԥ| ]4! e`򰖊qº 4;M4O~t.oBږ$o>.p7r*mNϭs㘃1?(;JCNΛxŷxiL:;o~„wuQ{{ dSlAdCs!ܝt^&bC ;qd@Bw!/HJ%WE$E|W"tрH :e{pM<n Y2O!)*$  UXmnBJ"B8ܣkT:iB`^V>vH AdCݴ#S͘W 0^l$}$b:aB:\ĥ^U d@\ Gz1T$$$n4$T`>7">o;'N<+"RGzHYT8x,S1-TMD%ØZփSkdA7+tKx3mۏאshEyC_AKϡ-y_llʿQwӘ/(?l)v?uƼSF2,/lei&Q@/CL-K3.1m:fLH(MsT$|G>,ЅS d"eCRs>3|NEY,S$}Q: 2〳a&aR*x% Ra@ _g@?,e&ςH/n̳_uUC^/""{npQz ϏCMkhs(*YOkCRԩ36&^xWXi?TjH7#>2عB16QI3븬#AsKs&݂8wi͟ fC'lRN>4Zb-:XO=,lP&ȍ #a%o@ztS'IkjuuW: +ԊvE/*T ;a : j:qKa yƄS.I 31xFMɖjK&W^nBt=m4Թt]_V4Xud`RSlBxsR`ɪa0"`c_EiR5$;<qFp =Q2DYFlœrI _.=4 h:T~5?fn@cr8wݘ*S&Ert}YQ*"X2 fwߧ:a}}BH8T]A[LUp ӾHT)K{mGȌ/u}ie3/ph=mv_8f=vg+C/+>Zm=hRg:>x3f̘8q /P[[+O!ᩧZrȑ#4'Mlԉk.fʘ w v񤏀*حy1aoar q ((8(" dDA*,(ŀ LxSn{nߜsUݪ{z.g^хuxnS]]:ydi<<ΥǞ}[܄BO\m]m8(wQ\6u 0tѲߠݦ?>ֻe0ޤsi\x/]s ݦ%K{>s7sjk{L%MQ&r:L2y m-$T>*5{0+BSqA\u+|:Q["czmx%mxiWQ-#n3y[MfflRT-7X] b3Ev6Jjm욂6JGСԡe.9Y3ySOxMzRYE }Cw~]|/nAn̄%n*"@RI@hE؃R8ːFI{ ay/NLC\;f<6w\hO~f$9= alh|WD1*Н(D"y_9n$0d09KASu vshZCUD˞~6@JWڦI [w!"}V̠Rx~Jc񡠹Oc":\ %Fi'6Mmc'&y"Vpa4)اdmNB%foECF<Ąme߷׳>|/}K痙 æ&Ӫ@ LkEӦ}ZkZmZzӊwzN뾬(2;::Xɞϼ@ [9]f?~H^g[-d6J?:f+$?=*[Wwfewݔy;$Ռp6* =-֬y⌮̴|o2K쏻4nٔ `ZF7 Rxk\ۦBY(+~=]Z4 yGO' kS5;pt%1/6 loX e&=gʻQWG\EG 0 M4׬Ys>CS $v2n _Bhd1Nqi[(F4e7D.s8ivVIdF@&:3WF|) V<:ΧHVC+(LWCA D|Ȭx#~ W-PH7pQW#Db#1Xņ_|ՍV뱆Ӈw 2Ȟ )tr q4gǥ 4c˻?іY0#2Ʉs(3(1&سf ŋ,8`Ul n."rTW!< \&x,N83xMBo5M{p7pjVq8s:ڟE2CՍ}J )#xŃlEWPz1 F)(oT jyIP2'b {݁%,S̠n\H E iC38aTvaI|s#6'leCHWG! Jiښuj$JJDB.&JG\"-f:Ayty{zЛ;ݛOWzM=B+7_Ƚ%7f| qOmP?՝g,0?m[X3zI'n|,?6%29?t9*ޚUMZj[y9X*/qj:HJzQx8ܨ(̵*2SRQW 9]ٞ"٨p]P34Yi: XCM͔IL*1%jzPz^e3FNrD,7#7кBmFj!bs><OKhv7/w-m)߿#N4ۓh5=7P:8&eC\|ܖru̘+97p%d$m-`|c١od(\@^ R.{y\h"qxf|h ύC)Ү=4@)sD|Hsq<+\L٠Ⱦ1BG2|@5;sжCCa~p6O 0yҌFWpH O)/`=ԫM[e;NB"r…1>5~:24d bOLxvK~h _k 8֌H ا,S%q1R-[<66 ;>h 9yۍ._䱔 U+~aY&]55|gX-˷tu4uvt{~/*u܁rq8<{[P+j{ljK2ٺ@*sNo$ 6j?Q˖WVՈWTc+LdU2IsΕ ;^98d;]sr]h)@o`p3ۑBqĀb-̙Wm)RdhZ_Ny* ٤y. HJG#;E[wd_|qW1Ow 9f1h'חp5GH ڑ2OȬ9^ew9x0Ij,f(eiOL9QÑTY( [`oܶ8Q$0jFҬu։r ;#\OL|88u2U:w;ŚGS$Υ(8|0{18-q7B ƭlhq\;4=E. ϗ}c$/'iv5`lD<ۘHI(,ȋm @Unv0?2qtrCcu~S;51\덦 ɳ=:N뒿3_/w~yi]OGӴt]h&漭2=8ZJ l] V {#N%Qrw;ۧk^ Gj}WB4ql#[>5d!5/RBV:0 ~RӲ%#:.Gv/<7gweQoVb_.〛 rj\"jB<ҿovxdہ`\^)>pHɃ5_ -GKY=DRQ[8ێᅴh?. /Hxs6XBe]L>_ }\]#@yq|%Sq

1,{2WJUZL/P-x*ef>*{ X!vhQu~٧Vt Uum+͒#[ J3u]w E[yd楗^j4E9B#.{KavsaRh,ds> !K* P|PpPrPc,S>?vQNj>)k`/Fvс{zVa ! f>6LLf#zNAi<,':>N;F#@;j8@<ϥ֙]m֊G#<6K,ۊKEtwȓlJ/{yv}wzکK{~8z _1fwqPPԴvnmVL5-5b=vLWZݗZ(jPucɝͲG_h~e_Թ{o{(5#d1qQ<-舜GrnǞCOTCQO9G{nTQ@pX>akbZzs[(E te{ƜI߷7,6S5ض~˽yR7-g@Zת4mO/\9[J-:&Z`f;R~CѼ _auvOnxm+?onz /E[v7 6!nVs%ޖG,Ac=NL +RaNeH$2);r"Y'b̨bRSH )RT81(i)/mɺUjGS=J|XQPh~45,2qbLs%YD qEgCeW頀N!d )΋l-/B:Υ{RnO1PMBn"uGT'TEs_8%Ei#Bbm{4?T%*c*J"x`(8H2aBIU[L$#ra ֪.fOGApҐ2 /K37§xҏ*_-#|¸:ׯ7=9Lk>dZk`^msCYÞ䃝l{skz__낮K::֭[sW^*>n@omJV KSVQN%1LW[ 2Wj*l]% ek+ie1fkyFCլEQE,oe]ߡ*QUu2F tMC* L# jp+leE WF yvOաvͩDyДZ%u_nNԫYQ.kL$藆N>7fC't܊z.礻{0+1m{a#]sMYb?G)$MϱnFhGN#dɍ`tAW")D"R2cFyb+n"m`Yfш8Qf,EU(BgB;ƃUR4#eA Q|Q T#9-9/rJ%d Cm30dq8hx Ifi"K2a̞ `g\y(A"lT$ #ƴ ן? YEP72mPD"ΒFy aT0HiK%( `9ZH3Sa^ĽĮ8Ufg"f߬Y> kc섰K t ɧ |Z8:7akLŦ9xb֜BRA>fz oFН$)^'?h)0\!*1ʣd,Bq an!;B#|Z 1݂dA˂-[s] X4[K(NI{犻p`N"Ɍy>`[v.* ,ؚ./lN5$=aeʍsި+Xc+A:T39Z<Ot@tF{O=]i&Co~DWLg}pEe 7dtyeV ~oex,ZfZqiyJ?O\rgy¯bn[;g٣ ܜtp/'{V":wة%Ȧ,}j}WC!7[e2묒6 )=G5lC᪕JUjf3KcthC1gݵ4<FJ G ^sZ:KL[a)֡|[s Yu)[21P*gHinE׿~nZc>jMrҥnxg^qͅ>p?i_vZc.:բ-_{?xwqږ~=&1$tJ0a?O*@ب<p$OCZ$V H`UJȬ۽{骃J#4DTQD&RnRsq!iq]Vr̎9c$ at_18n/PhIeDeiIҽg%5L=t$>{0qS3.\!3P_ɻaLXP!|i :p^0[_mJ5dNש2Ne`՝mU,Ʉ\bH]c4ՔSW)&j^&]TS)s+ǫ5P]4PPP|M =T=TxM^jL=IÅ@ my )Aˀ`nl>۷~~e睹j#| L^vG[o.垇oZsqί38^Th} p tꦇ~\t$T83(`\J"$,;r$) Lir*Ty2`t+ CH2 ES Ȣ,TʨYG(MRSq(21y!է銋LN)M@)2$8c4eIJpRN2tfQsf5ږ Ej^1.YFl\Ld_I-aZ!-IY +;FD*ubg4pGF,'DL!3|dJFTe dg+(Fwr'"q-5q<,!@fly+Dl29hC؂7ƍ")趟ܶ'|N;7{7zKn2ycϝ0U0aZØ:N1\44?._ĝyˮ~Mqy%LL.ʯԇ%r6CWj1ڦ*Z~H Zܘ-173j >;ԌՊ1A&׏rs>uU1UwLWPK nTjUr!h>/ȼwolAhS*t?0?m_ʧ/첓NZ>+V8~v7_ />t \E;b7tG?Q|7^ԏmD7y&A"!#EeNcb\-wlB&:jLlx:|ި}6D,Km'rQ(ZJBÒTX&FR1'\5'>74!!N41ҞfS>"9ZBeQb( dKmI:)Hة ʘ, jYv);QWy8MT4,B:NC)֙$XwQ/RN.sn4mcg "`$۫.nZrQNIІdX#r#DEd#H (8 :f ´s!8˻jtb"Ib^ Ҭ͛Kp`-)C1Aϟ~I7rƺ6l0=5Vbiz9ɧw:z[{Cm{LW߹1ue]nLuԹʴYq_r'w` M^{z{EUf춖tdDFzvbZŇN@̦Jfv5XƵ1'R6LZikxX*e|6S/a5!6ڛ /Ur}87尴hʐ1,Km iՁ- jC_mYm?ݯxåׯ 79~c~W??=%1ۋ`/>#7pjO|gy1m?P}HI$%$f@| X&I2CI,e}Q $b4 P·7x"MG\汤T/RH㨣tJI`7Y8gd,#yY'`{.SĐMư KU4$*EXLgZN~aM8%YdGmM{)M!Dҁ8ZiR1a@gzū,ph\4 tJS`1vh RD(0 ;E(H{^ZjysX=5&J 6w1pwI$B nAPb(\% EnuCwgoCAO70-7\ihg\˂ZnSh>qϧWb;V,66uqWRK8w+[֬Y^gsp|/% :\u5)o/WUY DqZzU7"FT;qTCCfVx 挱!Es 8\- 'djgUme մ!"doCE iMf*/ZL o~կ\uՕZYutчs?<7Y97oy[?~-hyi~?7nÀUOPʒ!)<iO)<r4fgCUpAhRp*j4R2iL1F'@=0\qj[@=N<~Zт`g-AefTEة=[K.Xq_QfC  * ܰJ8stNfeLN&BMb,3x*] 8 |Yn$L{耋J@ei 6"E'hH WQe,Lô?LnYAv&Eȑ =Mpꀘu9_Ǚ"r yS)T@.rӴ [pqdS02i0 k-xֱC>M|Gن~ƏTѻۖݲzN[iӦG|ߟ *pj`q9mϲ՜rBC+dB0VJ:ʃEh V`51StU3ji^L=27#E2lp3epzlTIMd5 n*lU9g->YH` [>s8=˖5+.]˷>p}7py7_=S[Ecoӟq|oqSv:3Jh@*2 4&Wd` h<%H9ʎ TJR)m*3Drp$DZ R4}xKk$9/YfO+#Pf#Qf劸wG>A.h$Tqq0UPMhwUSSssϐCy@eI_,'*bDBC{a*+E*8`PZw =}aL(UDnlMnj0Ai'qGY28Tt$2B "O1 "8\ie B# Eb{DrN6bY#LjfHͫetdn5߻~<̱}u5=E&Mο4.uu}e5ܦ?Mb>O?]zWwoW ,]}y}{Ò7v:O9ğxtNKjD]l}XqFi`|݃U!| u6SЀ5o, ЧUmU0j KKڳ'ٙiCSAΈӳET|QPݮ) ϽW W~ /8iUoΎ ֟y7ް~_x3 wͿ\[|t{z/>Spw(!)rRH`v [NL-ryfi2J(@:q>ϗCHyĦ<B&On3&q+7?=kرlAXoM0QKX<9c-[ATL"Ozp0y,P"hA&2) H{GL/ÿtM~j{ܴ dXw;_=[_8O]< [lK 4cDJ8^94kCeaO%G(ܕJ{rsLY=EZ*\j-OE! V.hņ_N ҒweZՒ6GgzeKjٟuW4boYLBSlP!G?ۮO:mÒKV$vժUmr߽W<>}kGos譶oM?s}o}[7pgz.3:S3\~]k֬9ߢ-s hɛ>pᅿ$;Q (ʉ2VИؘ)vNKTh[#D$_NlY9@$yfE2N12M%XʅL#Ja%*E*et?"Ih_h6 ):J*HEVRIHSqԧ<Qжz( t xUf4ю3%pXQ_L# i$#FK^$Lp̏)Spub$.R ǩ8- 'i[.Ei7&o­7o}LOoMO;N8|_6xo?k.?/N=%?_ 7³ "÷=u?=o'xjײ%^wݕwyt']y庍?|[Ekw}-[to8~~*B"2dF=k(cNl $aq"WY&I"E M]_ڏˎ$nڴ颋.oO~酟w2O?D?zEǟy晾=:\El+Vx'~c5k_ CA;%U y PF,dn0c 11d*'$THlo-'<+r2ceMШ*bGeq{lD83G(Y(1Q<70.KN  KHû=1ɲ74[N6'0QzѪO`xN+BMIJ8]C]Q4;AV(tP[IU1,p0V:5ΒBy|");a=* x! -Tҕg#U+`(*O{Ex{s--Xо3.EdxMyLApɸ,n=i, 8 <.[!q4\)5{u7r7/pix8-ٽe0mTfUMͦ M˷tnybC?$6/^yƥv)@Gin|Cg&`.8rJOOϵn`?шZ|ַg1I8ܬѹu6#V[ @.j7Br)[%EP.;ݨZp#֋{êl91J[u#֦ʃLyRej*>WQ-yﰞ_58M+:zӫLo vLǯ^}->r˓O|Hm/:/>HY:~//xrlԻzeʮrM7}?lp;(ݑ D~6~8x"Vn>3^h pG]Ĩr9gBb) qZ#ޘ^oDTɈz4E?Vggp>X7q 4*;hdb>?*ln@"0+qt c΁Q"фJs$ՁN4MәdgޙgߩF3swgZUU]]uNUq~g}.VX|2-oVvW *mԙ=2E tZk)nb`u\΍ Bo[TI2.yV)M]Ÿ́Et[ÊP\R_`43OK7@= 3̿OnIp |<1PbAA658mpÐi.A=y #FSMֻ4cȞ={N8Xe "]Vh-JXVDkE^XAXL\,i|.[yFUPhB"R+JjPڭ[LyтX腕l8oH[Q|bQqQс ~һ7߯oi.~բÇ/_X+|+dAnq^O9q+Z01czvs9fĈiˢŜzjEE2П+v>&t I ٠%RYR }{?'_wMhl|`e7+ G - *{lR0؉VIГxrRm!SX 1@lcK4=骣kKPNDbD@ѳe[9[Mg08f2k4i7Vl^KBp OF M4=ETe,Hؐ,EeP~m+22I"SYP5K(t ^ XF43 :I'd)\t T]$X9w)1jT5³1:]Lfh$P4|URe,3X^ET 8,< *V6SSE (dpfSG҈l,)dQ4TQ<$0\,UiLxuؼ6pDSlղOOۉ/aezWׇsM8e77Ma=Oqg\W+9tǚܶ5Q̴a.SBVf) ;oO|i*T' c-wVl015A6V͆ki+0Av6=XFQ|(l TKC*+=UP97흜|\\\njvuK=QN9gGq>ȯ =tpf2j]]z`6K-=phO%.+ZunH=_DI, IFVI䶂 1b׮]Ƨ|Gm֭  \WF(Zf}–QX\(fp(%>*!7MBRY%Xa3e-Y*j*F,QmTyJeTq)eZUNZle;ib[N8)@$2|%|[O+[ߊJjN(|A讴ᔿ,ᠤ:"F+)*4R ,=̢7Wd9BG@K1 *峚hOXI!م"n)whF~r#D&DlBDVXd)nB&OE"ksʩ5T2J)5 Bse>K"~ "T6ݭ,'x *Wm1I.ڣY9l=h鶡']x\ָS\>woS{zg1R1i]F,+%S2т. FUրtQtMEM5k-Xk[s=m"CtBnPq,2rcx mfeuό2+ofoY4/AP۷7\0z3[hy1;Α 1L5~{AY>|˖-M8y$YDMI KN*CV8_,E#/L\1$Q Ҷ*hʂ>bkd֬Y[.^|H(U ]tPhRC0((a[ir($kiMVeu~+]#Tql\b TϢe&D<5GFVqJMMR %Bo*~{5WUl31[Fgm=xLla%ER&.h*úPԈf!N{t,L2$"T4(f\ӓ(R6+/Bkpd)jAT4z=aEJ4tvDT*X6bdP"r^M'j #dQDW [9RCt6=ױ1bqtDT T 2Nvy)]y}K+$y@?m+]8:3zu+b,ҭmzZ١b00MXV ѷٌ\cW~ $):E)]fDYԩ-1xulFFPJzG ZsO,G%dd^;|MܩcF OW#˵_?!C~#c&If$dwxσb}y_E]o?Vf\fo&ٰ6& d1_ :wC}2oMqko_gEEE&LM:Ti G{uOerU%Rp;)%5UņjHR :^9Z\U~ A9_տ;w\_E'r?:ݫ_,46cZ2]X?֪^[hh^&y]E=rʘQ}zz;輄;~5s2mLߔV7~[-܌/}wȷC6իWΚ5}@>n=z8:B{_&9%5E W2j_f7n@ .pD,>b_eۗ6`3$#m٨>Wrx71 \( W2Of̏s;}~f>_gY0~T$ȒRV36TcQ|I!Ѩ*Uˡؐ TPr*_\O1Ṁ5L(ŝ"ҋ"TKr+@^E=V*z 1(r#K%*g=i6Ѱ YL+~& kIRLJ mO`%(b 4ZFհl{@PXdM4f[5[j(#Z҄ = PlN$RgK͉ih T +!6 k%"FDAr*1#(HR2^lV8Z&ai($Eeu !7ʪ aSi*LL YL +Ԅ*Po!-DP dD4'Jz+1JKj=UMd.Cy֭q}&uJĸY37,}'ywSso3wwC{,{oàho6qhB9in7ޝƌi=36'f+j*h;<̱ʑmwmflک`_VLP ψ& ,ـVܩfˤN2$NCHFKr"2ZVAum1A/ JCjE*|Bla$cL@H B ȢiD9`ӬLn+a?600޿9w'<Xn>~ums@qӋ1|g+u&0y.*zuvptpuuYxRl~gCiA%g[ 6jjWVFk[)VTm:xSYɱjh|#~6rԈ};wbl_MRW=xpH&JI+THS2^1(SH7^RZ\K/H.QIPUyqP4ESt =WlF9qQ< k4`,Elu3wRЈqH)Eυ]b:Iz2_gV1ٝ 3"zu`A~$7!V {ORHYAnӒue}mIm]x+jq ,բZ.>rh,**DE:P),b8b1I{1~RU@Lh+sxWIJFIjL炒ڒR]R'1@=R,d#POO?pqN+#λTǩW>fr?^ލwiƟ"f&6gyfW/.t)_W$Nuğb=祿̳Vz^WANՋ2߲zƟUc_24y'&J}cg@<\{pt!$.ԹIwk* HPkKT'IK r[n}>GSNVꈍW4hA#F Θ4{LV.[;ޞTN¡KGNT$EYR^Ơ73Lǡ$lIq8$( dҨJ!Z c.dj )!4&q2JgXV@GeI-L>Jc*X QeGћ 7qA íuw9 {߸zl1KσzK13|Oׯug6p98qßnq:}lғ&^q+lRiESeL.M^a~fؚi63Kgg@l-׺V+ysIMx{*Xv3{f>oTT5="1v΁ Ν;y^ߗG߾c bУGV^8&=|_ ɳZh|73Ykb3hc 0aƊ+[UīH{dWb OPTq,g:S @z SPit32y@)"HS_JSસ1ӠVIR< (r"^7&px 'U\,<3E&R[!#c) XbGl}D۾}ĽӜOnor>sԨ9sL220lބإ֭>zϾ='O$zXt:E-#>>!WWRiCR&ENڊ"-d]}Ag7RPV2 /O.(|%*SokjQ[%㩐p:)cl ƫOQZ!s)*),ʷQ4OɅi"A~_*FRUw u;BZU[䷳ z9R\!f -bݜ6.Q.Sl"e=&-'jeA 8vsN&bBSPQnBM4јz:WS@i2dUl@)mUR&K3#*#Re'ɜ4iGlHo9w#(pgi$.x܀vn-3Nr}_ffpO5cpp 4fG_W~iUU/9f-Z9vZ=Ǧbؤ.#$|& ?Z[ۑPo2lBiS{~9zÃl޴Vo`_Vof{9)[/$NLXqx{D 8z::|/uk+'Qp\',PeY.<Pd'>rl!ե(_f噠1] r Ў B1r%8e\ @vH/@ ۲@ɭXP*pIl<*g[ǎ'O:tGl}z﹒9` &{GG'WWW7W7w7wwO^x >|)Ak֯W$d'\K nDi@ܣh4#c$IPVPl-,oIDJH=[ j;+A5t :82ajcc/El"Rdq%@638JUEV* Sw:I].eTޒ@@YUbEH5 E\ B2ZG71n] X(jS [b/.!VaAFr!+HP~BI>R7EC鈔6U*ױl. `]Z/xFDl@-AsO_M{f)7qқ2ym=ӬXj7φv/=vf/hP!kw_RПwW0^tSy+r$Z)?: lV#E'_T^hd iĵɽtqqrtO\a'vE雲3G9wĝ^jҸ}=\\ݜ{yZ>=8qFmmv}=@dL뉳;Ab{>T|+Wj:S"4G^7uq#%zG PKX=ی 3+kh.CbDi]h77/u3l޼>6lpŏJ?'(6lذ'Bgr1#'N9e԰Æ|6d{@{ w/wHEGww77gWM0oF  %XӿO_>|;tc'4sҜ%sC׬]'nI>;1SY/?vGt}6=; d >6"ĺso%CTѩ*d m,N/@=&`*B@4؀Kkq[XlB608jOχP`FS$D"dD)&䅈*痡h [ f&WC'lYhP%h[Yڐ¤>sFb+dcԩS]zϜ3;`̊! ->߂=u:z6-[7Ϛ9gfLh&4pc<}կg/~݈ttsso}~zƌП={)뎬;uS_waQU֍g/Q/?=Ȯ/c Gr^ѓ[lM DL )m'4jgk FHl?WY{ ^b ufaEg)JX`)JXM-d/G/4<5JL 7=|Yiq;)TB)f0uUR,_)ȥ[2w7Ǐ:bp=oO,Np_} iI޶pnnclvlj 5:WM6se>ltva{SͳRˊK9pi73:ZH'jLrusxb޽qΞ==Yp> ]=}l_ vFܵԭ/K>"S <٫oG6?xo'b_QUz%IJܒ.bljӺ'cWc qg6PpW4s% 9Hv\re\ LQӥ0wǀ@:LK(Qtcl@v Ue/\-~ L,_X j>bCdجYݜy r4lأѻB E>r42bWGn ;݇?;$pK#a;w| ~WK6L5cS|9ls?vش#};w>9s'usw#s  cѫg 2a҄)_Nx%˖]|Þȵ{ͻ+"}zAM+"RRPϽ"wem=WI*V4lDK# R>Gy i Jf&LPhF>ģ5r*##ӌHSe""B'DOA HdePL!%!H,ju"1T#`ke%/ &G&˦6Q:IS2%Mo.^ =?;7}^c9xHۑ=9;{rmrz,87{^VHu wڵtssSAg{浩b}'Y3rhjh洪J֦̄qmr/# L6l;r޼I+bvO6;c͜/d|[w>ww3VʶXdF1qF,X&!aÃʪ>E3dO.^B"M8 b%֟$4`tX\7\df̙a)cL1m#;lٯ~^>^}xõ_l oN^} `PhhɘE=+ ov+ 7 7I{8~stwrOz/oq7\eΑ2嶂L 4t ,秽@{Y9o4ًʔJ=; k׌p(a В4d  d ˄9hg;\N4^(Kd.4PޞjBIkMWA]Jmb:/{Е+Wر>bsd?7=c%;_ذjê9[m[Dx_XlНavE',;d1;"w._=?~fo_4.lFqAɱ1'~.~kƇر>ls ݱeGfZt pa˶69bg?iܩs1wT/ 3`@On^nnnjU̠:pqqp0ms-WiݾZyV>sb o\֒n>)} /X`;(]֑ȕauT+,Z)K& BF?jӧ{yy}>h3#Xq]!“b"[Gm <q8*_:=.t}~gC!;-K[/HU'Bvl _r :">jI|ΐFGG\;:`/>Dܸ|1b7~-A G-x򹟅r1A3GMlʨ?5٧CG=uwӿw yAvsquqqwvpw޻G^}{C;sf-\4/"z1~>zgC[wܞ+9-)w_~Zii͛;Dޭbɣkyta^a MǫuNGAa1+TKSueD3 3T˨M4¡7#$)d6ѣ9 fEEԩS?b+7o/o \?979M?*="G\: >2. , r 4Xo s vt)"8.6tDqOxeAcg]3lНˢNbqs-?qS|9 ?fҸӆ;dү^}{:Ins~Cg0>8>C|F9o&|2ݸqƍ$l]?C)f%%\J?Xyy_PT}4XD-e4a"EMMl`29YTN5 + -Yԧ֭\YYri6owW7{ܧ8N uS@k]ׄu.d挱k f@}ifUgwZ?(]텭5M 6X1qx~OaO6kƨsg7НJA~//K8bK߿?ĴA#g̘o#Ba6T*+v`.Ρl!DS\V@,Ji PCvԔhФs^hԯ`|r4X<)iFOiAL, ^|]1\s\ М'UiP!01}oVMjs$:h55P^;HPBX')iAzN*Is$Li/3i-Xu ІZ4xUV}>h7• #Fu H@$d$TK"FD-9gLTȎЈ-AEw,2p/>hP ;DƅFGrvE;r pKDEIQЍX]g`EXK?y44dgA J;2lG3"`-3OE.$20.rz|dLȃQ t"6hȒ5~#{##.9hY蜵&|0/fS"to/|GϚ0s3& ;xּm?Vn`؎iώ=]<2aaӇ\4sFA1X"j[Ԋq6&O>p<ѻ3fp?ooO7QF}gڋ'kkIB\&q{vs:ldS&u::EhƘ*9͹v2W*/i4X^ŘrNEeH$id褰k@~ۻښ)ŽNXץ H+t):X$U_4K#2jXR.KvBR()ȲD,O9ᕞI'3IQxWź pU[m['dY>;o͂ЭQ]SOĆ_lВ A-ލ8M|Ш}~!qJ7nؐq#~6JWQ>^n^z9O8wsRx+6ap}a%N\ P/K?b̔tJKWR'n 7׷ C%&~1oM~gnwBH 0&F|Fs +vox w>>Əy#\nGPĆo/E9 @5w;</(ZaYM8@EL=5W&KhVXW6YM\ u&jrAiy !YvidoXE5ijӄ.ú!MRSvթuYjAs 37ܼj4&cstʮ+Je7C\uY4P踒7Ǝ;fTd?nnoEB₡890pWt讯N჏F,w rШ]!OX3zH} B-?-niэ}!Q[o_}rN'Bcݶ<,9&(  Ä*~I\(I|ȞUqQ; ""6AxEvr<]qQ(}z(,t[Dć /@T؞h1=폂GF<qd/Lq8L!3$9w:H F3XƲdɖ-۲dKOֳeٷ:w#A0i8`I>+˽H#yFy~SШBw^5T3 _hTȲӸ3央 :yNV6)f#Y7qsԈlfci!X.o$Zhfo,YTv\qEX^Ĥ<\4O_:sO>ꡃ|`¾woطo6oPo:wS>nFOmKܮ߁|JԸ /{Ə MfsFw407= %%䤳;7m՗ (?sH$s9NqP+YSuVhn*,+h2S^?7noѣd*Aкe^o79+!9ClDPtiZQJeIv-u,%׫׷+vC?nw{P)l&[mC e7A/ʔV\}ܿ]malAOݺ"](r !;&-^]5\rd< y]Ba; brb+ /Cޝ)$QAbxmBgr'A`DeXMad>=GVYYm۶^SVƃ!n:yQ{06SMUM`Z|ZX]S!P% "e#fx $ >Zy+/ 4zcWh=:Bd LɅpGiUÜ>%`'3:ieѺb-SiuAWrID$)p:^OU!IW2i/q 4 a{(1Pz"q,g;.f/q;n6 0+֐\-7*:W`ahu\]UOVf[IeʭQ͙I” ,r%sbZfy|:Zkp;rc^?} Bgw㶍 NIIKMM}OQ~~ӹuDwWn&E;zxG]obj8 ǎ+)fF-ÇwCFްaÁ22.][+Ȯ1!)ˬJQ?;lٲ*vl՟~&RXk+A߭[޹HenN 8-%nޞZn]q<0tQkxW3neѕQX%]\[ u;A-Z[Qgia&U0=q\\~2} Fޥ~p܂Ҳoq-%~ -|c4?;ygq"Ųww^+$]g7At2H '4Mh_~BBBaa3|hn۷oߘ'=D!uQ:hkst%*o#j5h'jY4gגN6٢ƚWkTBVPx*!/F5zU+pPl"\t&Z,CuݔQM1&oSհ\a`'ohjn%2$aL]R)K+%h6sJSyuXfs12$~(r29WSZ9M{TX+8גJ;7pw>~ބOPdVCrAbD(N)=*};T\)oF#;^^0Z[XXS10R^p(Hq?m =0|o-zB~ߙ>#MzB)4pt6 ?k`X@YVj4 &}yQ@dZEsCj$HFYYlл ΃-8hDGVҌ3c=^(/xʨ^t@?[Q+$3h8ޕk?9x=o]ܹ}ci HXRecH7֊)-:D0ZccU~ YZJKQU:CVgy B-?RH%W9\H Jf#F6MjidZ&f :ZAurT) Cm3Gђ|ucLAV3%&l]LjmU_daD`.Ǚ:2@)e]0 ԞtiWNH;@NU)rZ̆Ҳ9@ ,Vrh髛˩fU!7R`3(i(6ZmԵJzr\;[ê,4*Y R@Wit#ՃNY XzZKUkJ2kLعqG_P*W =?߁\E1H,B)E!!"^)NKtq\Je0@ k[ <+F"&3 nDyJr 8zsn} H~Թ4bK0XF"7!x=rp茂4:|-H5zAx_ KKR~/"bbxڇ!@;qC (£P`^O\71pk@4 _N< g>ooZZZvy<=EWI8[܍BQvc9;M7C(02rD-\,^L0N"Tь ~g:H9&O"ݼ _sB]s6fiM[PeQrκp^xap32J46Wf o>VINB2R]Dй ˈ5m 0fb EYn [cRi)Zf2y2؜k6Tese={Io`n;i]^ n!"n> %{{e($" @7|`Żb Kz0~g տ|OqE O]etOw 7`mOOY5#>At~ofL68g>oo:;;ܦ)%hכLS]ur7XRrn8ZZՄ3|PCeBvutR,Hv>`:ugN`# #WXk\ndx5y*^Uh5dFBgձkteHFxZ ^&[XM%`*i+6D!ZP]B;Eidt%!}*zJ] C\Q]UxS;]*>ْJᴒ6TQUJ5f'ufY.FY5ḟp7RFĪ&r49TF! 8BklL7i8MVWuDbu-4QSJxA:eԖ=sn8pю?qNG)v_7u/{\.۰~h**^W\ OOm;'8UR{Μz葃wmݻS V(dw7 =a1TQt:},chIL} s_,6 !  ybw'CYQD\7"sQB||$H$.FF]Oӕ}ޞָ3!\zoEzTYn2K4/Q2lz¦g4_NCfcg]jSMk3A*\٩ZUh :T4ꯌ(s6MAoS@Ȗ_ֵ^6.ߩdCH4z/6*[\vȨ6ރ(Is/֧*#$ZpE@dU `P['Y蚴NT+i6dXuCO trIP팦>/BG_1+d3_Q)ΖU9 09-RBAW8T\QޤTh6^ef<,[ϳP4BZYC=i/;._(T|J& Ej܄e6_ jSOT9\JMqC/Le Y0 ,aS{6ǢtYg:Zs):~RT}ښ|eIHMF'(8zd}ZڅWtCE(-? HwHӗ ZMyˇNݳwǎM6l߶Nr6m?WnL?ns;釾 5Q'X6$| ,wP ?ƗBҥ6< G~8.E֣eRe0@C~1<I\ &sm2wgPM /J {M nf/XF3~x57 BZbt*'#*CH @%ÂS .n@3X"PZ؇ V|-OZ # cp h%iiLQ# ]^0u Iz7R2Skf6M*V@tBipx mf ,fӔdКrpL=#2D+lALCBUf1'9N#]VQn%bX&-VS$h.XejHLz ˩cTNm)LcV6&QdffyB\\2 etRD r8?sbVQǪkIQr,'(Kh͋6I VD-HAMy"l8թ!ecW<vq1. ´xi( na);SGNxjjF7PZuѹ.s&d3HVP\BV *U'_YC_ސz4uX ײ Kq'N< L7Uk2Y./9u|w{CM7jis^3(UJօڰa^Lp!l'&OZnqh9CxS(Z^MAbp<CuQ] P K&7c[r"]^QܻE_"2DRr|MtiDѣ@ѿҺ 'npa_P^[ ,R'xF#Q_hxxÐq41 U07< 9~-A ;H9'QVyxM߽ +#7oKPhuk$Aq>GiPmJѻ< w_wǑܔh坟ZZ`l.4ֹ0ZFB)߂%l kyw 'S⛃hjvcn,<߶v/-9A[,6/hU߿2CeЭah@p> -W\ Bc>@ӡm^^\]->r| ų}zqi߆ݙ%|NVEX*юar.spiePQ(:(BnBL1Ԫ^CZN!靬̪I[թ*C& kɍdv {xxVhլwh![ E;I\ARoקTdv}*ו8 KZR *o~Fegd $^k(PvL٪֖6SlG6 H_zxS`6^-h284_Sͩ_HVUX cR+ 5D>mPAFZYC-\Prvxh"%PKytpvUBUOF>JEUXm9͔9Iڔ$(vMMsU r[U[H\(ƣ7^uuA X;Ô3xyRʆMhs=M<.n灸M,^/IJ<8TИE MFݥOt7RJlz~:WI4 |h9}G耠saߠogܤ(]wBoPQ%:Z(Ol`n*r:"lN9K~|QovDNWʩhᵼ7.@o{Qfhbd/X2 &Dq𭷦"J~'f ͣ" ܃QZ\ٽ}l܌,v; ~,yF{Vʁ^d{ )NXs$'4XO J[cc1GL,@' 'O~ȥKyiii}ޞ&''!6rg!S$P94W50p'W2l% uulF n0;T) ]avL'E,9:;zTL^՜ϔ㬃%zCkYʭ41^ٸJVf9n2\<);!+d̸S,<@:͹U*̚maUe({HMKWkYL1JkͲJ\MkmZu-j`6N  cIaWRn*4;Lu8*aV0WL6`:ԮmzMeTtS.S*rte3*m(卸"\,c ]3y촶רttmey8R MIVBakpU!AS/b#-\QNqd5O@-O6-_'Z(M 'k pt@pnf/荡Ќ87^5Jt#`z-@ÉBEW~#qtJTV5y &BB TiP}&+s>Ħ}~l;gA<ұ[7x#!@\ŽiUy|b]a'RDј2YL[$v"<1"֊T$ΕיtS)qL~ 0MdM A®BIFUW:9t n'Jl!g G{#L Bj4j8ҜׅlxZP ErChD64+Tb$@ +*]N;q#8 %77*ז7~򏐰rL /IEPvmNV[R]oHS{NRju(0 x$틃(deU~\+,;G,gwA_8PrPA#5^;̈oy"#k @*XZ8#>:07-|F5=v?@9g}(o7]`iVVdI5:=l, 4X7v~ji )%hbs F7ѐqiK|{-f`5[#o͈?#2|m>׿W|C))T*Kڳ}z6{~Q:Jmm˔T++*"-Ky]WX+vAU ;򝲝 ^@!1ՓC%)( ՜_V#*A 麬$u] &ZRѪOup2J,Df*[HM3⠭$k/p x YM.%Rj4Xo B_CJPB[\QjTg&eB&`Jkեust*TKCRTx4T`r P1Pof*uiBTju*:ZʩkI‚˄]NT6 ,ZإBAjs!SsTV>OYy@dڹ.N (5i*dŖq!cyYV||oE%n/q󳒖|'ceEzM/ݻڴ&+i/:Oߝa)ua܇󣋠;CѴZ-H_^?C،d` kФL!_ܠ;bDL~O^0< kv}(c[('@@Z*: jbM`ϓ`s?2GLMEx-%zD1x0<`qΝŧ>QB=uޟo,&YVe*蘿'Y(hl ?J9 @p[ RݾTZE #of"(mI5{-k=h@ӱyq"4Z4;o}/WzzMu=oEg?/!a8sh{ݠk&򆚮3ͬLeTj079Hag ?FN]Uy.kqIvZs xW8D0˪f A(k-T 5 c[FCq$Va)j(UڈFɦ`Za ^Mbm:Ǜia]j x RC5`:mgR4oڄ|܄fMn3wW^9דKw3;#W]ejbVߵknjWw; LNź  \w=H[x{@el7NдD)p GK V"#~0B{w*aX d z+Z60 xE0JaŇb18'MƦ|;W @[pa*4rzKA4jhW(8 4pJfH <ߜW{~![l bn4 8)F'soxy( Q0c@?Jjf<|zۓ"yjHF7G C07yN -.,'@wX|9s}ޞھ/۷zT54k!I3 4mlf%ՠ9l>tILչ9cʲlKwnRCAۛ„ =<,Q0HYeË<]r_OT)~w\\MR ͞Tn*\>}K]۟aJ?ZBe:ztr!:ķ$fۍo>+v޹{3@ğIakPL,"0NPm4:-w15=gއk1{h\{O}^NwF|P̮i~(WPYӊoA?u;cG~?{k>T g"o?F+G^to-{*rS#G{8=3(=iGп<{9| 3}ly}ǎ68/D+e^'5FJeŔ.UDkjӢUZ\8+RZ،JQE6MNTY@`ǘb(e6$,ۉZNSYAEhZU]ld,cSvxYeXx J?3ێwz1϶㗝YVc8 B.d0)WhW.NSUɺtV*vx br,2ƭj8iq}&gũέ쌼CsRBY:EeLkYtŬ܁kP\, @cM4 W:̬ieUӼ99xgrWvhB㔛U{ !/Ǧk y]\IUųB+;Ԭ6@϶k07KǸY骩W2mZ~ͦ?[wrۤ޼6=TkZЧ?Ho~nxM{wyllb٦;wnOHزwož={Ⱦǎѳ/dVQa-ʩ_*6ƍ7\?닞y_mvq+C1'Ex4n!Fmul)KSaZvjtA( zX2GAw!)D 18xGh9I,Da M nFB+PMEbcw-A0  m u[&@}E蜊<GgB18u &V2 Pt;ڀw[vIf L|w <-;Dq&=k"wG ,!Tw܃r+ D:t3zô_J1.J۶m>ҹw=|.iEB&R6O,g2<_\XK2.UVquC f/(ljÔ5Zd#pE2t@ T^!:xVNR+Y#=ڸeJ:xSz.+lAƶqZe,[Y]ad /Z>sP;5΂r9_KT믹Z+(]\=ӥdjmR[4L F)u(Q؋Vs4׊4cCe=t(pȳl;d1v\g2' 2]R \N]ckSQ63RT/e,/@@hQ`<7):~8z⹸9І/Jn߼=.n/E}&FKϞ}u{9uc'||;&ٺo;m۶u۶[oܶq6lB O_HK)d[[]d4K痾/w_[Xr?ߍӝiiqkفB]`)` J ] ͬz#}R^ Vp7ҪA7E= DL02cq8P?x8# ѕP=%бKӗm 0 U>U+B9!2 B R)dTb7TR fv<},%'P#/ahęFG#i K3!eM૑JKY /^!i7Zw(.nۉG='%SJ*J)xy ϟ?q$lٹs篖)(\7mQ 2wǎ6'=kKd 솣*2=-MpqTdK|beZ=q뗖f=A>Ίb{ӏc^aϏn-=XW0b oֈ`-9}hivFDF-T<?ӒY49oN=; Pާ!j}oB>am(9iߏf5QD$Eԙ) ZGO?bWʎ)GHP?A@C[3Pi?wIE : g>s(997622r̙ 렺#7i2gnN;Nm9:º߻=nm[C_~Kz۰e y-[lޱkgm [vܙpdˋg=sbץN$N='&缮'5JZ-htsK8URYJd g<^C1LnT3 TK`&˪Z4DC>k[iXZOJL1R9قrm#:ᆡ%Zd N02\cC&)O#n%*if:m̬*(:\uJɜm%8q$wP kZxp'z}5J-n#H7M IkdV4l8]ͬ6(m(QnŲ팪Jqc.K40:VJYQ9mX%'K4,]Ie:iUg:[` UEfYNRkȩK>n2 K/I~Z}zqRS^oM/{B r[ows/_DX'r`'bS+ۉrdYV;rʈh5A)];DЏ7djx,ֿ2r;*ƎHٳg9lyqQt*<>[p0G{kg{WS|rK-^ n'ֽrlCۿO궸M֣W_n[ wmߴ~מ]ݻѣ;=wkY3SLZ6KWٮ\eݥ8֨t֮-R\W,\WjTV)7l !tj j@o%Y1#& ,Cl=-7Ҩ!7J[OTimލ2SP$22`Zt#WTd/S:TZhQu\ZVHeZ,TNDyuP'4Ѩ'nj[gwjRB]v+@| jÔQIV_Nkךp}6:_5mfVc3vo'f8@<'ˠI*I[ͼ'O[C|Cz饽]nOXwm~TD_Nv-eSyeD(ɘH`O=I,M"8:Ys5b*FqN!GgHD89_Dse4kI/>}ᓧr±}[uێ?m R mX*ո~w8{B$ϘL}}GTy_F8 "vG#XrLܾ=~ >T[ B8}8Jjo@e2PP,V Ԫ#Q0{d[BK3HMSeHO97 Z 34 |AI?Dş "ՑȴG` *Ԅx7(01=q޼'N<ۧy{~sb '' >y1ɃcOi뿧ؑ џn^l셩%[Jmڐȑmk m[nb" p/7'lߴq;豣_p 3<[Chf'WdBJm18'YMSդs7S7TM 񺐝Y[5q!\k2nҒS=k! V UŨ.R5hqŬFOqVJwxեZ֊ `/ e,"3YIFRT&.Ujukz/\U0NuW xYb!uwV`-a^nJCtLQ 9#E׭VS#kJI2r*VMRmKCĊ sIm(+J;qƸs͝qR6'>.ȑCuW=|z]?gKeiŪl+-M BiR>ͿT 7%.fDeY"ӮeSs 2i"9{tIYv)(FJ<׳i*lVթ2Y\bSNV;ܔ Oo&z|`c|xδy֭۶رe-;|왴Kejxɉ|GZo@D&?{O[}>)xy ܟӏ)Yذ }2GQ76C5l&fBt yoRݖCl=XZ{ymFUDeΤ'Hnx7{ jR_SleHln?!:->oMoK|wLCCqRkO W^Q𓥓O'^yr'od䓇G>'^zxOnOnw' 亮/>o/ko|jdGo.c`5r+#'ccz _8SWƃ Em[o_46ƭߊflu˖md][Hΰ==/:oc/NN>})Y\.si7oAR$ v$A}2f;$Y"yUcױc;vI>iik6}ۧM۴M%JEMʖ=g@)v~/>h;sCDtu5}C=)w@@`;vyxw鼓r;ݽ SwtѺnꁔG<#Н|8sߓNQS;]c^fsElзQmtp%ѳz1{i~Acg.NvsԳr=5l wxrv0'?7:Q;l g`},jR<8wq؁, M~AzsddB7Uo)r t7(n 7)Л1#7 '[Ka/Zc81dGjYȁ%Ikc5Q;ؽq௧.B E 6lvpŪkwD*T;:qCH_k֬]5377 de_~CQQqqZ`PLYM֖W+źoO>@GG 0Gz_C?Goχ~>g3_9}>uߑyfwe7a}ǵf>=g,^y܃G?u3L?5}Ϟm;>x3O/=9}ǿtØ#G^\|.!9 1{}98ѯz7N<" u:UnR~,YW5W#ZAd.ґZRJ9zi*:҂K:eעEZJ i$]TQGut\Z v:QzV|b=?ƿ?ح|Q}[  bLA3s3+YV}A)(*RׯW䯑oe-}%ӺvBQfUez}aUYtT7npl=#Ѐp'b|yn_S* 'hQ\W= vW5'>HFou?nb{&͡G= m~V\~>5轗gvsT~`a|yI Tϣhk*펹S}[v֧uEu[Av75`c>$lm yM|L6eHDiDŌo WQrk޼1P޾Y-Y^n]WPPlVt&y?iIR<:4JzEwG{jÝ>y@'NIQ~9҇#5$꾠;I|b⍓!ؔh`!wo/#VMv}"9% &I7#qTS8\ $  q2wVN٬' mUj~QU䗔[_Xk d'pvv6Dy%%;7I5yk,UOuecΝ#)t˧~/>w?ٯҾЅ{C/G^ؿښ3d؁oovpRNOϾK_yt;?Xo]HD&iˬ0d7fkxco"\t+')22 r/QlTnhi:6x'Hokm>L&;D&S!wkNk շ)~%. |3xӽ;|tow/Nޛgsmw҃)wW뻟wqVOwEy VޠABQ>y.a j(ESvp܃uKvlxF7wbqIѻ-D4d僢BJ{ydF3{BM1_P倾PhEl5'+@vԈEInHĵ0-"~IsG=hQ6JlDɰe U9Ɠ oɁpH%3ܔ0^M]X7 "!DqGyIQ4G"mp/b  ?1p]@8'?VIr1 ۫n5ֻ**MNHo,m4 Eڍkᱲh y8#KqonvF+de^UX,jSVcbb`o{?_z[oc;}?<>O7x`ė4>>_>q }/c<~l7=Ɓ_?}G{/|}?NS}t32ڹKUnR}EH3O.sҲy7o.>[*]UgMJTvmA΢Q:hAPJ+ia5iY'HL\9btĦJ"+QfB% csV%԰j&-iXKi ^Z4K`HZ^Kfi&͖9^g_?jJяQXd[ G`ܶ5mNSTa2f[9G ?RedW6:kq;+hh :|KspǥSB6w` EB{d&m|ڙb99^[Jq6e'zbq}xfLy0Rо/;|8vڻKn۷4 Jy;t'OwRlڷ&մ6dA>wO͛opEQYGC]nƍpTfآxZ~mtm)ԧmA+&7wgGzm~n5 'u ]GPIBڙ`],h{P HB1mĆQ-"DeHqщR0l$͹?bx&G5wJd(!D0X0ME4!aK0hEa 8DF6&% ,#!:%)aR0ERq+(I 䄏%aVz6zu=^Mg֥(M2]kj|JV,V [ʁ'ߨNW|j63*R*sLrGNt1]c̎;Fvy+__xaˏǝ[Ox__ۿ}'\|ĉ2ȝ{Bp4/}ĉtM|С++/<({hCs g>+LvٶzhӦM|*,//Qn99T:HU\ғ逸ҁRiOW#V\`q#w.ڤoΛ.'ҌQ^GQ-r 7@ 5+`RtB'CHjCUJ JRZ!~+} ּBzC+]UC+Z m@U]z_ъ{?d׆n['p9M t8fmQSgK%3d/P)rP궒'ctBo)I {]ak uuƝx}&nh3 m& 4՝ y'pv(}\voom}ggĵ},i[ĝjN To}j8#5Hyv C_n*34-tK}}$/Q[" )oi UiI?Lew}o_(TWd:Az!75mk|wÝ_{fX./;#VYK 5(X= Lv|DhsXHP6e 7&*T]&Ah Zb1cpRE $ )o P-|}g(LB߰k 'd0~=.ȑ:!16E c>ah]@kE%E uä/aG?7Fm",~G]c)w);6XW~LJk}1`xp `(]=CC4jV67kNcERSpc^^< i^&hOZ#*e*>9"_N?čk7TThZ'۹3"~jOɿCsߞ&O_ߧ_X^t禧LO?osEB/oəSw[y<痍wnل]vr}1++M7Ϣ{oo9 .]%ީR^:cylk Ac_7 r+G5 ٵ\:nMIiEt, #j*Qip|RKse!!=/&עp,]JMIt.UH=Y_'fإ2Lvmr}I鮞0w3#?+?w/*i׆[ |ҕK2k8̪/(ހ ,ȃM5855YyY֛76LvcEPAzlnObMnFlnZ:ǼήJ׾aRAv+{7[e`-ε=[v`7 ofSl wײ%L4m ;dn*CWdd* %JJJ(3rMnrF.Y)qG&1 O+[xWlֳ2ev:5 yqo7nhTgr$7'A4Q\ nfsÕݼ#exuO1rC 4 T\ rQ|8cTk8j@$&W$(0,60,'x{ijrڠ EG\ސ܃^Na ĉp@O2HS(\G<#NaՅ#Рs=.״7*mdcE]b*1ؕ*UVEkf[O\YY_Pdf^#gG۰`%%*d8+o yĔ灻oC}?=?}O~__<+˩O=<7ŖL&? VU~c1l5qHRb[0Im%*VҼe1 LA-4,?1MtҌ>%4 2H4_35ks {?S"X/.y/sJQj|"ym|u޲lD9>oΘf܀\[ ;gҊ^n q{BU}3W+ͨp ~=V\%zZ@94E5C_EO<]羢yS|39T{^[ƶ5{f-\QN6C+Csа줩_s.z}xXϲ;<G=K{?w?>HMZX ]7W|INz"Cȍo972ҧKp+kόhK׬)qqH: $;O6(0AIw f'(-#wJ2ly0V1!$A wGq$y ihȰOK'e`T{ ԰ZI::"3aт} 7꤅RQmhyK[0_]ݹ }<;Uo5bUXlz?W}Z԰_fe;91Z>:d|mtgx𻆿yEg_+#/>>)K|C^\ov_LGY,ho"`s1Χchڒ6K5&MXe֗뫫ڮzp 8ֺ`k&&| g6Nto2wtTk<{Ds<@i1?Y/l/73VEi"'ۡ ?TQzTrsbx..p@x"O|gDx+0Iɲp^@# L gQ-@2$e+Da\%A“%-9A$#d*)g;0J2L1HF3E| 0GtN x5b͠jgW;W2D"#!n+x`F!C{ 5B~U4Ɏ54v0lڽA7w0zcn17MMSe-KNrUR/Ntr|33sѯBkց*3yYYtOLLUnϖ^z#2]鸠, Q¸ {6 M~*5]ZĔ]j @fTu*)NݪTy#0!uN'0J?8jxwc8JcV =jY:bm8k ;k8xI]: ӆwi VPʸ7џug֬1Z2O82d /ݚ}3!S.g],e7*֊Q!%%"k+յq=lV}qA>h}}>4~|;jxZ1(3y 9QetkYx}f4H̭jk/ N:@no1IҲHdi; X&QdDl"!A:Ya ׬EZ4I36iE~m3\]mf0ô^:fGUUytjltFd\ VU>[FGG1]l|sU}]^%t#`EܸNc++ 6jѓyHDu/[=AAH%4:-VrX+s*UG+`1K.L5a?:X-Q >_*U#.( ysQwm^}|HTr=` 4OCl M7K-ly}lV-b; z<3G<(wI/}^/V >^-btѼ:♬D2^a˚|i+a]AHSk@:Sqt 10U]>Q=E;A3lh XXay¢(60,pf~A;LR9Jy%Leu51bfH Š 8šҦPɏӣ)OLlQTf$a 6BP=kX%nP:YFEq,L0&&$ 1lg4(e`\XB/bڐOdo FF~tX謉 Ռd'cI;mfZn6-y00cZ=!2 Xs@7-+i0hOTD>=JCQ(bw4>!pSD2!*u~]OsuCF}@G"@R^ʭ 06es۲LD*EL{o3VA5JSxgl̻pЧD27/8dFԻ ..4Iq0 !TE9`4wlX$3{t ~޷s27Js,3j,핍CMoBNעuh0gͫ2?Z^ 'Xe3B|X,ZX\ $CŜFۀ_Q)Y3i:~lzP~@[:# ^'5K'Ӷ4أ41~ \~{$^;~cOՏ6b?pv_[<@/nMnn5do 53+Ugˮ]Э_K<?6|=3&MPdEy> MQNN km`y+@$ F&&Qdn&*2fHä)ܜ 5(L6!\b  `PiyQ=r(7hp.Lh`ECW2LJe9F⫢CwU$ E09Z2]s440-2\gC@1RH&nftA4wx`m4bx2#41ǭ"]u46e+xCy'N$dz&x˹)I.$BG0XہI'ҫVjסX`tP+.l٧zф#f̫n@.tq;ϘV8@Lt NЯNz%tZWќ L!3x&v< *jY 3B'O罞bKgrfRiAp iN O&8^[UQn빇  A}!|AJ[w}\.xZKs33#ӴLmJ[T-%k0PqqMovvvR599 燃7)womWF pk G6c%=Y~6G1aD2~J6RO#,r3DptrMQM|@%UґhN|>mLƾnitA 6 E. 1PS_ Q\bWV` o*T , 1N1WE&'D]QD ɉt&,4F A Uh:It2LqR 1. GrADN0q 1qCxbIQtOU ɴЬH*ЯdY 6)PMta4Hp;w I|8k&}tLos fx?¯F;Q瑳L> 3\ZSU.SS닋n{*g KKW(:hj [+-9pțJ{Kr\+t\R/M+1-Ltŀ)Xflò qA.;qt `\`5:PxX sR:ެNaC5>=B28\/b_9WVaX/O30LR_K8*JzKCW\]q!HtBNy[^_R.]QY:`^1CZieWm`ˉ_-邏Y%밑ЯS@e3?/#VG93 }]T3wMu!z*0" 7񍎎T*3337fenP^\Y.2322 ^x*UI݇[B]7@7oomo/=Ԕ<od_ t7ÑRnr~ZҟpN|-VG11ND#/3H&NpA'Fǚ 'O_ȕ(bls&H͓1/Ys0c>"4^5I9Ʈ`S,Ҕeݑ~H+ y?L|c+#6Y=AuaPAyI!q7rr4׌s5 2=(V!4NpJ)ՙt1x}|D]^b8ǓYQ510]P`j2/mF]GM6_D?B>{g+uY?HtWTM;6'i!ɕ74o(]Nnll|/[Vl'ZWKQ@gt؄nΧQ"A>X(wp\ wA,,//|RVP=ey{g vB+sKd lZ]o0 -Kl7{Jٍ|iP`^0~|rzV$jOL+㚏8Q~6//ۮUH=BC5vэ9xe_<+pvT/e k9YΫ۠ng O1!iuyG0hkfwMz\ֳbXz'N{|ay ͺ:P'Y?moVO:Ҟ_~quvHo_onOw}qvPCnL*D23a9C]!|L&P5|P@5hb՘,1'6x2vφ8c x#<~Ӕ}(Mn T*~-z|b* `m|Ukph=f%<#d2Ŕ e4 :Ak$B~hOMcb3Od(9,ªQ=K#d?m5 pJRM6DĘ/Ռ@)9A, &&["PH 5} $ICsqB%YPk8\%$&Xblq5ce[,0B:> ͮ{V^l Z8+tNђ 8 >?41uzKc;F|8y 8Xkj"ODAg+A?NdWٝ FG1YdXwX׸澄>.݌Dh}8D*|>7Isc4G(R&]#p]ɔ8:qu6LdOL 7$੦~8S;lsr:ZNR> VU>[z{{ܲ]렆e I?Ss+zFqHt4'˷*AJ= 2]?IVy5k¶4j}i,"ӹp/X>8oxgN{MB'1Lײ\ҡx{d]Tנjpf^ I 8Lt&ےYZ#!'Taf]P_O#{:*fN?|a5.0zT=gझIUZEB³ Vc9\P58Ç7׼qA6v9j֪:V;[b^I H9~{`m}woU2AϭYЫ3ٽ W|%P)?w}yGw}z/ia%33eپ$OV#7s*yHh(˓8m7mӟ4ힽ4{ALCb53n~َp֏Y[ a5\睪_=$@Hi) /؝Nl ؽi mI!`cU *RM$10 F`E*D}}(\cEZ;JSp/TfUn_+7B:\BTޱR -srq=o;F'q[ FxWt˳+F8|yT(OxVa,ml5I4_Hjc9]_6q"ԡxg#d0-3UѨRzՎ5mW~x́S3`7 z(95?(/UsAKhtUֳ~|NsmN-}b2+3ؤAHG ^;f7-(C+T0jSJW"eEˋz<3V!SUA5Ъ'jWkqhlgҥ*iZY!g kc?24/,KsN۲j׼3>0ѭ!2Hn;VXcϳkrL^w7ۼ GS Fs9Kq"8IAQr؏*ip2kBtofsz=4 ;87 2HISܽ1B'b(14EL Q?#l/QnXC<X Cm;`rj@3hB1" P_iOlDSУD`98(#Z1ƺފQ3J @`+c5~IoWNCs;)# 14nѺe~gRAXcm-7H8KG[!C2pcwh47E<ƈ9.bfqrE=|9i_æ[ܼUGydzreHҹ EyL<<iqLϩLp ˻1S,jF9Fc\R&p ]j)9 tNyu N;zDN;ʄCҊ=hG-5rp‰ iL:) I xUlhazCtҜÚf Hs~'dI-ȓm8l|$Ʃ:eFc<9\X|'t.| .Ma@ڞPdeeSgٞ/6,=W oSEFFWii2u9$>֌64ܾ}ZPd( qU*Av{:VFfdy~z(/o~mrY֦9jB;`a\XJё7߻>ׅW imO{3" ?Wqݺ,mN:U7eJuAk׮:ǗKY`wM}REnI;,˶,;VɽNnʽNr|Ӌ8VEB^B$w'Nb;v~<瑇-s̎;~``/3MC>ٮu7i *6A>cTUQ1aD-2ҽ b* I ۃQqZ@4tD MZ+:b/mCLVjܬIMM|ةpN%1][\7eЋv`«7,L :mϗUV)+K*)qγ@2ۘN[ݙ2/LkbzkЩA+kлr]]gd,vwD|Gq8 x۶P B_1q1ǫlCvʁ:@k.,{4TpqBvSiDbceTˆZԀl~D` w霚Ji9ŵ |(Džm;zTOlR jF.Ax qV;1"/h`#\x"%X?cCpMuܡ'x`Q699C ccPoFHAh,r?!P۱kX!\O@_4ZN`,{, mXmG<^$P?G7^E'$sHk!|,hN$aNȼ"1L7߸yӹ-0 /؏/MD \.5۷oG||Q"ps6=5T ~KX̚,7W3++K sF:uPs۵ lg־"Sf÷D6[<=4:+WWT85k3j(tq]UkTpIsOê,jL] +#JkZuORuT-)ICp <ƙ fozuEjEaepFZWޘb.1A7 jnؠϳJj#Dn%fEa lK7u8бlloaz]j7*>VdyW;NJL3Nƪ)A{@./8vs\1*6@7\)J𬳁3TxixuHq骭ZO> _Wj i@xPHgvI`޽{V}鮴@r{N@=I=rXPT[: {9$g^j+=.';7X7hvr'٫%G8ꨂyy6R>eؓ]c9dΝ TP-9jD@{rD*Wtaujd+O&DŽ]JNJӬ&y"8,[Ρi`tX.!%g ҆&oLqUU%R}Ն'ڪkUTN*5g[\ɕ{ .b*_b1sR}f/b<}n7b/IJaNU:Qgkd+:آ$cY4$UW&uY\w$%ִk4YRUUF??*7KR=5u&ح&oQgtMf; T^+֡sZ䐐p\s{)!-[DYiv{׿/xD>bqqɥTeGة"WDT8 cP'GbM`iQ˱LRb=mXkmR\鞔&}޲5i5ze M[]k,է+'24TiE>@2ƵZ4@O67iѱG@5//tYQERݘl٫e 8zZ24{p< E ''lbtRn2֔+)A+IhRۃ۶effZ'TەҨ5&n?%3Dtʁɗ:x趿0"oAHvTٝo"Ɓ|!UsXTqKInűqn7F٠灲"r3އUd'>|:91RC`8x/ m>/ˬL(B=O'7" Pr@P4HAt/tF=l<fzsKq y=/ 01Dr!ѣS.1T*)!9V;cn^o7e&PODI1{$aA<J3hՅud$1 {1m&y*bKRGns;_,//ꩧ>#-sw M-dsVE@24>>VuL}Ҝ\4dmq+r\"xݞb#Y%^YuN\q=:c¡jj`jLqu.oqaD-M6*,BOâ/vBIoT#@|iUtբ'avhx}&fӬkW Iw\qmJ=auڛ[X֚geAjTWf[Jq$Ipt2L%[\)PTk8K+\1ymbWӄfo$)Nod+Nn(}ZQSR^yPӢ2 }Z u*[Ǚ2yxj-.I)tj\/2yV\-=Z_tvtu:'`vlr;-"u2z, e`u7 XfͧtŮF5ζG.эv )_n9'p542XD;J PJlEA'sZ\bxp4hr .yaA>ࢀ#ny,z}um|r/EΪo#Ƃ%'49y)/na!yBW }NW%ll{BI9#V:"*D&+mѰ9.r҂Mؙ89,"X_FNy .r_:d?#X؄xp%e" 9r _">l?ausSQoM-L-Օش:]uEEieeNP9:SݐfwVU\E< uz Z_X^-L5.X,8`T]n6 y=% 9)zG}ݔdr';,r ꃯ{ kB: Fs֧44{]EgnLYrmv2C mv\\iv ܴZj N+zo1*S lrVEs ga $k蛈<.$ ͍لk),!-18rZH.t(բy>5(:yCzM fG3Ǣq9CN(jaR<U~959' 6IAcw~5+ρ^wz8o;9.%y rx=Ph4<\Ar+YD~GDghЁ\™A4p&'e.٢*`0yOud8m:K <[tyN"S=mQUkCn#iSCGsxKGĆfb0sO1O=aá],_pi>o}ܹsTiΏ}zy9{0~z Ik~)}_3p F```pPd8AtZzZF~hmĝ/׮mHihZg炩BRBf ~ٜ^]ݠ-ח W#(d ]Alfnv3b)veX(HI1o(C>Kfj--JE ӐRݤ24hJSYuܜm++ b2=SPVn,zFF#޽z9Mۨk3lJ-O1ص *h,9߫oXQU6ϩ[[X!V8Ev}ޕqZFk4nO$rZK.BǕa[XL h84'UxPY^o^/Jؘ\ȖjBh6M@Vps _ঘz8כHpȳK*6 d^ ;X@[bn8myP0 2=BA9#!0;(vGIU@u R>V:h3,Pt#;F:79"bsh2sHo|i""8C^͍*p*@.xm\̣='9"u)̲5AWͥs8 ;s=HlcN6mӨ#g1in"Љ'x3 \Գ%B<AVm7۞m5JIf=zJ)u$Zn}os':bmiUV]U(OA4ңo-H-+BjV)ِ`Rj-lM.q\q.W˛鴤*urWX*53ܔS"V"OpM%Dpj.#K D?NBۃ{dt1Ц]i+۸_9'4; 5%7?]+cSdk<9vc $i,: B&h[DCM"H4U D ` l6 f`[H>;Ĺܥ\\B`^X? y:,i,%@yc\(,ҙCv]tEL+`,l&?{J:҆3FYsd`+4FASԏ]b å-fH)| #|8|D;)=PEm u?pm5DK%d)0ttVUK>-1@VPn#2D"jyu/1v=av6 DL{fHXHPHЧzQ=3^oD8s} _da ixnv0Q'{^I~ޛ/w?v7"T ZX-/'D `iH>/1'[!!ZA3o"4|9bB1)9DFI!pDK{Pt#@/H)_c$`PxWA0D}(<]pg~H@A'B`s*BMhq6;I$h0IC(X 8*aܛFKt-B`_ 9.z^jƊ<> )A">& aA2kFџlp !8~u!2-:_A/D\x:LL%nFӇ *e01ML!SG,|OGO*X_@!Kp@3Dosrr>l۸ORَDC* oyܼW/5_|G\[8tڡ+?;x=ηu#+<^}5dURKي4yv<-']%Zuw =o~A~~U ^M*,F.$KY9Ea8k_ɷf*䥥I.sX2}6_zYN˞u$՘պ8jI2+n Dvǚʲ\ZK#nkZ|zg+j+|:U`F[I % n-$xS7&QN 4ktv{ʒKfmY&Tv#tJLk%qfe{=N}}c;:;\WPX.]1\sgXc44]MGvV/} +qڕi۸] u0fn9Pa ##D,E@͠s,9": ׆K+Rd7ND CJv.q-XX<#"bl! P*s#lW-YĮ"R5ԇ1wLqj)$K"\ T"7[=UD䱘Oޏi ኜg 0}dߪ=&HŢgc нtJžPwWl9/Ż<>F{30v b| -񓒧 h(GO1w1;!0` tf'{ٗfb|"Aguz(8`>+jMl썂Pq0jq pw^큟;>IAU+9ЯWHËC[Nlx<뾽ns>WV}dZZ G#cE#.JO Zt`F h"lXR1ccY ;[(LѩS)m/gY:Žܢ=%h*"n#X:/o8'LóPGŁQ6ȖAZ]H.iI@N 7a%% Kd9-b`Zd)pQ9c/q^~\H$ #`c APSqijدzsEC[߶fJsd!~js!> =@"'qNOƢ;vLOZr:l+mRQ/W+((x4ⴈo9Co %[w #B;>{wP8A#O(;rTMѮp!6'GCIX2TNrl¤h)1(zFud/;΋zB#QPIX"9>̆N#8CH^@0Æ!-.Q-[.׈.ELd lk D'qy)g9J-Q|Y BA4뷧,%NbD89v;H Ȝ9H w3gAn9&"ۙ1#Ħp| ޺ukaa'{!!, _LzUF#t:}f㴏q+׿)cV5?&suyu߻~Vy7h¿ ܮ ϶wh߃VWWY,YtyZ<7^'щ9UUa-/H/[N f1## &1*%WJ&HtْĬu y9bwa;OkqI%θlqRJUo4昊T'-\rWb^ѹ"]JkJaeiӍ@3!kwjuV [S .-cǵ~37U l',3K|^ _ܵ+9++ܼys~~'uUBo;߬W%FiSoFAl NکMʓi7&@{)л"c :kYhrqT?&XwU)|<YsJ^yJ8%z%d8܃Eh9:9}8pah/>86 tVz}C^Cĵ 4 I론aύ 13Al> A7եG@Q'i=תyk,U\hWaA" 6Y/YTCCAmHQl39{'=ٻ9"1zaNNa۽nP\`kݺu%/ Bv\?zL{~Nt5Sb|ccN6nRNnްG%O 4 [o Y/iomz{M#8𳫷>i~ޖmȮ(N,-Y,U u`b%?J)!xm EI$M"Hii E^/檤[&HjIh.mImr+>ϙf8Usg:KGJ|K,VXdyRD*и<: )XW[52 ZnJza@+`42h-P]Lr%8 )nھ''tS^|Q.ſ^i+j~qlc76׫B~!|}Ux#%O-tJgƔY)(l"9kC Ibn/AJeݯw݂5(vǽ.5֝a]͜Cͯ;{^^->4B?gC 5h LF#=,˾7&8('^>#`' , hq ;sj+s $.qral j9~وv9ͩ]NݻvC#B'iӦ}s, lUn ФzrV~(AAAna6n-;p7nRǾ) -Cg"'ƃOP.:|+=/:tw߸G_Sg}Ǜ,Md4դR5T./YZ 'k9 O\[jcH<7%1J%):UA(;;ɰ.ٔ-)tk JQHٴUU[+:Ua*vU!jXyVUb(ux<1Vkխ6\:+n;z=TY\$R<. ]D zk+mQm9NJ/|L a48&}}'1#by2Ђ˗.L*2tòaVzbB":$Glz}cX _Ł%y5<;`"1{Xd V˺Нb4~5may]p OAc z71b3͙9~@h8yh7;0^d8-ρ%Bw31>98 8m]]]jj?DGGxqTg&)lju;qZMoDnr8s,Z"J{_:0gmm97Mo?G*^{c+vu#aN0gQO&UhDU)?&r+\F*z# 4::B Q\./.̖dDe KUk G;[W7f^k)*ᦨ‘q8%DC`h])؜}Y`RipppxP~d>RUHod3~Yx ٜ*\7fjsĵ.19$\ؾ/p[ \ϻ%;*JҐ`z0<{R`Gv@<[mR RTՈrGKYtlqA!N2&@ZzcRJ]ej-)!N 8@:?Cl|ᅳ~5J~끟fS#L* ;z98%bWS2SomP9 );Wj$JiiGRVPP@3UW1hBOe*_* U ϡC>wi?oRO|6fE ) +hV>L F>G;q ڣU7x+Xq >ݿtM#>s"/ul;G#o|սd׳=ÿ8mjaܪY~%ȏ cFѢ#h"BʍU WS"\$%аb`yp>_+m3nUKxbbqzck߶\7h,+=1CXȊ0i%7% ˸ɅXB;k\t7:b8=zðإ&oO) ;,[͢5>c.&v4blH mS]쉆JhzǕ:boʠ`\ i zf9#bȹXbzD XL0>`n+oY j,\4.< bgDžU:.>NzBh] q>'[c=e D=h)ogv9Ny}Rfnf/Ν ٍqs(ia?;hb,,,jb|1nGMo Ғ옿}_Fb1ۋ^{Knz/k{[>UT[V]fO2p?IDsG'~0_xx>R]"5Gs }EX^i+÷۸V%D)gu*-6*?i`l/U_p0-){# %%/E; ظ8$A12;ϱqScwL&HJ.v(2), 9=|ƴ B1aޕ!ݑ30F?!'b0?Fڏҙ!1<j=EcUfvϡ[8}qHxvH4M{9tUB2![j4Fo'yNed*v?}p7s0cby~b9N#_~xw0d!|܋?pt]̩DO#fffDq޽ݚ M⾏w%4̐0? 3p.4X~@/zi޳[z7_Տk=[mϠ{Қ6kSyI<yA8$ҩuxUj+$*8h̳XBCC}>hJ[i<o2N迱Yhu0mFƯ\# W:'NS'2^"ŝ~t] kѐ>"≾0|.*b~10 PruH6Glgqir@+0b,doymFcA^w\^jayK%.+_얽G%̍qXXEn}{vrK H{a/ub^9 p_|>2UE=X#Ь[5ۉ]D6^b1&E?O1$fn{;<Xك̩퀪/%}ˠ-^*=Ei('AC-[^$@:WVV۽ӏTS%pꥃ?k@Y/|a|x-_yڰ0Ar5zs6>KDm2YGy>pnfƛ?) A?s'FFK}o|w60 +1h4ְ?.ϰ1Aa/צD}MqlzZd"x*5V/ U}4pۓ,HMJ.w`Dً͆ Gys*XB=b-<$x{*ƞQ h+Cꫝ\rwsBrML5,\C>>G`R揾'[ b+(aXB{7EK>QFCogN`xacNlcvf`M!@.JO8571'm㻈fars1gG)7JettHv1TF:6?7_I۱_Z \zuNNk>RO~"0|HHH YcUե8V}n4*I9dp=6.Mgt=VʯP׀dF#>|{) / 2Zяm`S?*?PJ̖E.'C0Y2PAxn.8.iovmiq^X[<9!;c&PuMDvE.Mi5|PkRZM QZ""g0OK˅ E rNc|p3J+N;*Hmc]gp bX 5/՞Ee  hMซ`CY$uc{ã`bA'7OG 9?[pJ~č!%DÑm{[7G^l&:22g߼~ r ѹ9 ؾDDMX/`???nhj{O1GPwBBM~O~ܤ}UF($:#J=ߚJ Xg$)ŭt&;+iy:aZUUU `wmb*և:dLBv1㧵_\NQXQ<'=!/bn '*Jq\7pF;;@^+DEeXR+5Ty!IA10$a 0gC&o!4ĩxM gI y3!9?ōArajASjaٍA 5_XWF:ǀ z QR\rl7$B:+Ğ+{+X!.!4_v |9rv2EN fbHJ=˜2ڙk͑hcV=[=۱hϲd8@jsd7D?B, M0_ZR,qC_:546D pҝ8m ʏ:!'U];>sXC-Cřj]M[R ޶6+K)CB‚›qOָVlwtA8Nv-㤉Zo-Ʊ ?hZeW0*Bt,) w'OaaЀ<%µdrXJ_JB=J6$ أ79؂A l!ҥ~H,VdR`Po'1ui籞s3M-> nl __!YN³K:T:{{6mB{bw>.Wf>W@1*V3oo#jJW.wȔeMX4ZHDHZXSlFP΀4Z&h4ONVڝvJ[>GbNwօ]xG-w7~#fsD:CzDZXT2HiQS2[GIxA1%jȳlja EAuiS›h''''I9!#{d /K}m+/]vɋWB Θ%NTp T?gSaIpX,DE{G$Hʰ60q$ߗN<18~!ub{`9Xh!>la9ÜE?1{< ƶ<sf;"b X4?Xٳ^.DV0y%l̿diҶ+?GFF:ο{lMol>*za1Y:?s7'sH չ~0v4#*b#cbnl޼Yjɕ$ߪ~q:Ɵ*w6*G+~q 'h㘑~(ԠK&WgOBn(@o3ʁ4I:bgb:-g[Aijjv!)뜄8 P H=.X0 O#&~=h²y ]rZ琣,5f//]>`hA>$rvᑠM AscB]yH- '",Ҵh*Wh.!bx7Uoze/3{1}X@{yfȁ-̾@31&e\3fwcmDn&{d~IA;D_www. BI Nܺ#ݽ?ٗdE vK9N{w+|שINz0)}FwM(>޾͕ŽCan3OBP` QkԊxX*HgժUQQQffSYWJ ER8Ectc8a7FpbKC*FFFUZ`D '?~yc: @󘊜-fX yBON ѮQ2lI"^ɖhrp"aW1k]C^c#K'zE9컈=N ?o-fV%yC![e-~)8&yy5>?2ǥ@*>aE6^̀`-zr$'bq y4<5Y ٣A/rOnA/L&Z  <D0zٶ94c/&7/eͶf!PnbB}C̋GL^^:E8w8Ĝ2x'72G3#܌z8{lUUkiRKd$P^m=5;q5nR scYJp>uqrgЛGS42Yg+c ={LMM?~'?ɾ}񦦦x7|[ڕjwpSۜS.&qx1m{ya,g1;n?)X5e׊BKq-I[WW !!&ޑF:}x䨐!'a%OβhiTA9!8d<֯lXIlUt IXrHƚv&&3M! V{2Jb X8`c~mydЁgMΩcjP=%=)J{Kv\SJ,_$32uONJ-nw/0v#g!ڇƷ2;vbva+1y^LHB9D`^8L 7W#2ۛa']/3;GaNI'p ڸ6~[nDb;DӫJ&I6^ F⶧m =pC_}xu`W3ÞW,# W.h-D=>eddhZZ-HP(LMMrJnqs[wcuMo1TiwEu)93{bW0XdcLLbLb 4fS6& Ҥ c/ # }{zs^df3[FAx,.H20[iD TfVXyPy'jƂ:*? wF(jɟv-L;knSX@oj-7˦|- K6AN;غKLhgfTNgZ-W#Y+^݊2PjGs\6w8hD[l&[(2mww;JVsSP!Xm\'KdDݖ+~SH ,-'11nN0PBpVCpO\!2Rv\?V@Ls+Cr6"XEhl)ٯ 5Jlk#k.=mef|+кQ 'svrX؁5Xvc iˬ@%M NN7qCCڑQPD-s:IL3𣒋ю rX\\_GNe:}#4@g!_5462׬uj8̅Gߑ}+Z {zfbK/e[6i+9+t*~Iv֤+䴪?*x=?ǭAwPy0K?q]ru擨r}wM%Uy9';zzz`MS^rLo֨~&"bbCxT/Rhn SQP(qF YBv$+Yꃏ#Q*ZVI~9&/@_ zu'Xe ՘WFP&0Ga UZCh uƠWCFAW~ی-&u;ב^N`OoaSH-Bdܸq|=X* )k375nMvpP ra!ii'on~i.u.#Ӓer3G:ó Kj !1n Mz+pB@ \Ta\hoힹR4 Ȓ _|x1:KDb`[RBOSt毙BŰL6cu &|̓|(ޙo3f[rJ{55 ŌZ5Q#fx@1 %q rs[ɐn%e* dhymxk*s`{Ac;ҹqc#`~~~...o H@eMlOAl%OL̊KjB#,F|w{ϐo/_KnmA?.iҥ?M&y1B<'yEN$JѨr6RSЮp?*PlΟ(.}iH] H}IG(~|srcҳzh~9 #^UkУOGeGXe=ӇN7؆<9e? 0ZfِS}hHڐ* {rZ7, [[{ 2O aFnmshd\.Q%۬Ȟ{7,ӳ;ș'JВ~XqM.{}5ȵ<-ovPGp?TNjڕrUPT^I'?\'=<1^k( /M[['Š7|s= s?7yqu6#-YOSgD>)5!G^\zPwNMFX?ধ79[Ops`T8x$pGdh0!$y<#q~JpQjPi(> C`5 `L%aqNy aFrR0h-@ NT8Țp;ln6#IN6l apdb-a̳ɺa 6+3ۋ&0L-Z{5f &ͶJ[ 99وj=ET~Cm^t\T tޯ0 4 9&x`6w0z-k^JcٞL" Ӛd~;Hufqdl'6epJ{۳ȳ3 vҸkp>:YQ]SWΈzzs=zQF=RY ;uͲ3U䴍KIr\^x廢쁧EwX2g'.1c>팛C5xgNX/h,ݓn7ǍMz|IH#̡h\+;J pY5{Bz6\v0 @e>]Qb\KfIZNmMF^33_-g {^rYFvH<4w|1T$mFvlSt ą m0k wƑ?|ה?t zfti(\{G$K tYK-ڂB m"Xk@K~!rNQqnP%dJ%PFy6g3tL {uzx9N޹mk޻:pӔAlPWu&qӫo\&qz~~O9[n 6tn?O]@:lw촌r7ƩL~!%6> ֹgbѪf#TDbҼߩORw7wD"d+_y? !Mz'fp?ɛ*a7!fltŊY%煊| [ cP##'$$4 -}kX}P/k͚!xS~FŠ&ᛵV`Gb -:mN ~Ai78m} ̡o[>$GpL,o"1j hlC+Ok $J3&$zd%wE}v#u;g fZVzWe^_nNPva3>)1^wd}?Jpҹrז$qWً9CA4/΁j&oba$ bz턨nee ۘ rʕ/͵$\Moܹ*3&ՋE^t@`ήw^\u[}y˺/r-Pdd`;--ʢ>],aI?:i)'[[~?K ??n1>(_psosLsQyQ[]FP= |BB#q/EAT@%D.W |r.>wxJYUhS?o` (yљp!gcp4,upV)`m_4isq[n7=욬 vنorGfz+gm5ZK&Xmf 4Qonr*+ |A?=FUrK cwQOLpKf/ma;أ1OقҴ8̡dE{6/xk_Or9;mF{z-GqE =(XܬU֚gØ 9ڻj'lZWʼu+D[tTZsAР3+k9__ewے^IY 7@8(Ia%qͫR=`##ݳ^=Q1BPP_1htz1|u-C}ak 5-D+s= 짉ŴUZʄvzC͐Я.6Y "Y q'. ۂ@\ndP4q4&ppL` Cf>,z!T0i6 {|_y0pKOf Χ["7 =zᳱ aM( bLV.yَ?k ԽDlj=uC?;9#V6.}x4Cg·7io' 555ǎ-<-e![Z1m]NH+7Id*M1Tz=7kÆ ڄ8Ex6UNGաd0 DʩT$,P*r~*=@7:y kֹ/ ̇aϚYBNSSA/|^i_0$Hic#Riv qPB%Œ0 ݰex"  Elʎ@L:N1@g>P\ GƩ|~h U-ć?ĉ0yp.d&i?5ll@2v> z rk (iɦErZGM67A0HՂÓ3Jg4@f%S(]\k:wv#If׵mʆVXx4v%Cwx%ҍ'f]ۘޣn@-?:&CӠ;hB:X[?\2LPHV:% 9b-fF$4e?eY"7Y,kz!Fխ|>\%#(&8NatuUC}T/x'BW&Fel/Q8?A*X$E>(? Wx}ި'{HaH,>Jp*GX ^ǂ(\5NK"@5V$Wɉ3ApL6>iC]8ç~FC|jm._c8G)3V@*7@@Ő?oŗ=@BZIs JF(W1$jf3[AUa9&Xgf2lj3 \l&۵ gv0+b*۳ )@K;ִǺT BVל͝7µJWhA72yLM^GMMM ϒijukc/IvQB; 5柟$mRë r--s? ֐GO7OD2X''&p999qSٳF 51YU(dN! \棲 @@&fyX+7*7y,Xmq0_JI=FpbtYm$wPִXf?NҦv^v.k-Y*ܼ7k+YVgPkZz:6 >88ȗE8FSzKBEb/'? l{:wf:Mn[&=;a,;|ncܬOeSU&>d3Cbl cqߑ0>u4'M]՗ޟm*.̽,󫸋751G/;1}kkvo#<')4u]O'M=5nsf͚% G >](-}P'> ݳ=QI<$]'A㡸rL-q# @exoR?CPiG *C"T}jEj۲Hj2m;͝&{tߌԐJUMS0]g*GٮJZiG6rT#N6dq`b.paG  Or5!6I:u/H%{?cǎU)uxon.yGMF$'w[x(fɇٺQ'gqN&t'v9ѝڹ3|B1jg&)7uyZzK/"r&hLB!K4@6: 3/ qXLM%Qa4%>X ^ ~1<Dxg)ft {. >m-7l6:BVt B-LwgKvaGg>uBq'1hZCHۃBmw=_c79'Λrr"r0D ҳ'133{W]]]UJ^xՍEˆbCYI8\d=\ }::%lId,LpS(Huޛ/[WYeahAgJLSE<$@MQP,Ky7n޼ZS,2箵/WJA:Z sl)!J?\+;͕,y1=NE,F ޫ|a09LeѲ8?׸\w]<щ@.Ζ,+`DFkLw)6nTݸ`7;W-zAávZM]mi+dYgwk5o5Vk+ݭ|fۻY;rcC:0[A2tj#;6Ӳf6.f T3VԖկe`>%&S.gC$C`-\g6הvl纲 9`%v3md/*qC:gB0ax999K.522i %:%.ȹ#s>yt*ʽshhJ]nmՏr 9=p ֗0%@ `g#* J[[Z\-_"" |#Gɪ͜$ 1hYA$뇎C0Y V]%S*]Qy`l] Ob֓_P\3PuO,VF hY``Hg۴9 =t#}2 ȴ kTeQFna,6M/e̶hPCoFmx\K ѰC۳͞R` 5K[&N5nȍ1b<54 a%n_TM}6g#B'^/Lz2:x`0F!cި" ҭJP3=Bat$@;HBGGB>^3m|hǗPm_a~!rg[ ˖0j5PY\WnUn`Jy[&T!7]oJ;]Yr3v^W?!}A\-ETn[ A'Zm۲ms(dRu[&O$=h"ځXjACPgE_|h!t#'LSf=%0xWY@Anm'N54O[B}z}%oMu;ΎJAXrD><.r$hv^r0MYvgqg-)\oۚ Bbkslk"t&:ٝ sWӲfuOCrȹמܺtRc Aˆ-spܿTkM5ns>C{{{ ,a'ODBOUl1 / Xae:{"(YB|i=U $:UJHeݳ̐DKBVFB9'(\+v)U @D&hKȧГ0PK#XeRϟ; \^> {GAw>9z;! j0ͅjRY6$@kXmLbkRhAs-9`IdsMP PUvodWTc{=t;W$NpHK, 999͓[w,g:>pM-<3>S91CEؙ9|9%l2{^=iʡǻ70$~\tGe.MjTyM6m,eu4+ BBvI l(Cee_K) yP,GcCAx8 O{$ G"pa0> 6d, o^&ʣey!7" p(<Cqy(>Qs"tfBC]FS +&%Y[lN~i~D K;J{aQJ˲< 2H Mߒ]Mq$M/}qlWlonZ3Ṭf&7kM쵵t3m&w-KT=T.p˴ړƵnέUƳ'r -X,~>k,'''r!jޖK '9-9H)KΑo.4s- Z 2Jw>|Y~Ҳo D" =׵'l^ߵXȜGO<5T{ޟoapf/IOHP-ħc ZK4^YΛ@оX.!x]14? )5h~:Y:JB1w37 ٩&<:VFNKu)9g'̰Vcȑc(d1S1:`oOw`l},TcK0~J]|]VaDBfxWrK+;Cc{v!@'[f=5 CyA&YFs pB7>e.t 8h0cE'u+䧿m-5wΎo7QiI0HN+d#.eq\W:T6{7 ^`;Ro{Bg&=εpsti%J{3W'H`iLh?\OPK2斘9iҤX+++q@7:ox4>kWWmjii R)>x4'lO|us7kkD,]~Pwro2saZ RFf<#P{n3M/~Z,--ո^211!7jBm4Pļ&ahY;:IS 18?;4y;51H~!O[U514-! ٧(}Oy@ M,~x#BH!%Kg ̰(@9nwiQ(KC,VA",qbtnn 3shGes6DiXBN5 D9n%;[?*OK`%$lW`j\Y\6y5 W{P(zk nN8- rko.Z 4nŋ z;4p_8qbEEk1w\M@q}GnrEؔM[D"ۭ{udz͓>ؗ_*u@eglC$> d$aX@XpzϔfIi|S~K&mݺBVp@zHL_?pѼP=ۀ0¹/F>3{h- ? AL!+BH. N:gpDhH|0KECO[]EQy. {( C%P\E(c$fx@Whh/bID0]{KiTc cne]*ۓ& @ 9\W6r+TH^-sjM5&;i 4⶧PiZ m6~/}RjӜ0aBRR… W:ɷV.'@f=5wrE稤=6oH4EЎe;#)]@rsқ=|<:D5hDONOZÝ%!v<1О?8NNSň5㤱L7/cٹqS5s̯J[[[(Ԕ2r;IqB*(gCܯG&gC6f"e KGI|'fCcl~J܊HgpЮR {.B$< jgF4Zy p>ZWY5`tB@X O-x"sA&O%$NrTgy%_a/y*Xj/-7UMZ ńZ###X7<먲}wB'xʲ]ςxhQZֳkAs;+_)'ͣKgbp$8 @ӧO_n7WەN777~^E*- QlRb7cB3Og$.*z" P.Ąo`WBʼ*Z#;Cɧe&_tBA1μ `bq/ Ƅ ,!4U*BlQ >Z518o"b, x6%DN<׵5ft}&E@!mv39\v7MX7 qug8'w Чr`\%kȮe,SSɓ'7nѪ_u#cFozp\fը5)NR=H}J@aFSœ;?8hr$_6CK a6W~iD!2b9#:ixfMkum d2\/jT_b@-]ΎMF*eܜS%*2\v0 @e>%[ F3W ^pYvjȹfUٓxJu0[JQA,>MrQ.PFk\*0ឪp> fP\ =Pa^7MuBmfװEp@^N$mWw5;ON:i+ؚDrG)ܭ,h]\% MBW0e{>/3dqܡHu輌yxx3lmmwܹdDB0`p0B-ˢkgAcUbbň_gx s`uFFVN!r/~Ծ_.o85%Aӂ6S $ϴßvh&iaa^o-^3fLRR 1G;J(iJ}ѓ)R#ѩ o~aM7%hTJDž.13aBHJ/?*O@$+qk`\>@%?ܜl.l|GG3}@] pN]Nc@9aR >ӪW%d"= R+!=${yDH._,'K*^I&- T?бm!Ǒ蟰#&R8M9f?nyF ;W)bR3(o,G? */E3:;;PK~"oH{{{1aG,) E`R*o|(^y*\TG@/*NNy">TΕ0y4DBBV<БP|*ro|,f0(s<zSA\Fdh(){¡$7Ǚ #Md,0%΢A iخLJd{ײ] ܕ'\@^o`{fcןp C=\s&ײR8t}$CC//g5|511mH U]DcŽ[?xyhjJǏv_Yaͧ%?B"Mg+n7{uO̴{c{$E"\h |wkxF`?/wj.1mm3fPK~"@cee)mp0RyZ?(֩(Tq.~@Aѝ@X&VhA&Qjx]C!*O;E <@=\vW`R!; pu7̅gߑ_֖:J7 %$0 zb{J;Q6R!ٶ M:ufq`ܕUre6KP{,= (g؋k{^N!BB@SOO/**b ,Aj+mNC rc,,,|bmΧoB"qs{c VV_,Mʽ;֟"/oL[FށOXK_d0Lyȑ#?CL6?RGPaÆnCfpT2Tv$D ,]x %ꋕ#1`V4kY0"@Qc lT%#dso :riGGñar`V'%pB>)=,P U=F; QxA;oߑ|V'&9Ӵ=֥]۹lG2u 뭹Dc;w;8V[,/kdprd"״Υ_MߒX8/nOpSc;2Ltgې#wR@ b2۵ $*g [A˚ئ4 8At= HOd"gM.M0Svb0eWWϛ/Y2!ʅP, QCN9MGS .5SR"8U,:]_A3KP| UQ1^ BV{ Jf*ߢA}Pŕѷ G7FneӁ]^ڨJ3s ۱=ƶC@ $rV(3kbLɷ ߟV=zk02Njm^' 9PCjIO,0H$Æ #dS X.U9F'\kijZ?E|T+#tP0]RxP/ @2,'N-E^X'@v// h P?nM0`TRr|,= R@8ʗ!10gJD5U'#n35 ylMbdI1svly!$h m9(ۛ$t۲ J5ֲYܥA$0ZZZsYz듓?c BĠErYmxlJ^2OɆ㙽O7Kw>vW|׏>QSS@{GүkvQgVFZ -FƢǣ-=9@91EB['oFYܹsU_FyU[/i150`rX+pco:XTC!r$`*щPPP?. E!GIB]c{FBACƇ|+UY(z@\7=asbTJ,e n.D2F#OӒ%D0Y7ɞ7V`iE0h[PGh?.`M <D.|s`&Y^McovmaksD3 K[FZ,жA̢f0l–Jℕ׮]qF???/͐A+nr8PǿքJƱȐ/]LqF{Z`lMq iTpٖre]߽ QaFgh$wW:tˆILD+4@1hayT~^G^y.~- Ƨ!0~ROD{Y0 u)/WN~Ƃݯw65oje9f6wT*&^:^PC. fq-w[a?yV[.w-kgAmfڠOfllg}ꫯ.[l̙*n*MP3_a[mz#3{w>ҝv;`O9}5Q K-q>zT"lH#%asY!O?Pq_UW^yeƌeMN뙬sfdd[=N(پ;;tXz[Ei{1ޱ+EPl H"`X$ǘKMnnw옽KbHN9mf܄uJ\|s*7c0gEE(̜Li:s }pIjmq):\`@(ft])`uHV3`YX9Zhii$ e'_t@b0 '9"{ _ޒ:Myl&aoo^FK->~֭W&.;h'M\ؙu5-N>sU/~ߚ` so:sBQtsCze)g=j n0LBaggGo&O0"l sZB18BVCC>/u RV3#QS9lOTKr N&NYHB%yDW~-M@-}~ ~M9V1M};2+³Yhh>j:fT,GcL,!1{D*R&㍒/Q,5R%>_L؈'bgeekhhHJJs>$lO]c漡qr@c7WÂKJ|ebOn:1Y^WY:.Eٿ횘nɒ9HmddT^^N&BPɸq㬭UI0g :RN1>kC(\Zú)-kғvK$.'m73K&jM"،hBd|Jt('FjJi \HBXT$rojw0f37抄,%Vy~vI 06hcA ~{Te1xֈ& e2Z4h 9{{{\2 ZH]yh0}'h9čhBA]&pL_"Χh|?xٹ(T$ҕD^VOHR~!nMڗ#lO©Ţ $$1F𩲝@}^m!hq9 ;A>\&l˲!gRa3uf,MM {'<#b&1mCM$Yd&;Sv!6kN!?FZ߫Yu7\.#G AxǏoaabz%V$s,ޓ+<-M!.hlNۛ<6 ǒ˙+$Dmr},qR{<VmJϦcZlś1oWը+?*"_B/E q>D}XB)"[+~P!A1Zn_UF "B> $ܹsCCCqS#3 v {+6LRw -.qb&c$y:eG 'w:ϼVl?Ϲ**&ǡg6(JdVCAٹCf mJP!{;R_KQ5I}db `c )^lPMy#6n0OtLQd*{GX{r, utet^=8TH#Fifgg A ##QQHx21.3LYRQھxs TѩlDD]ah1؆BxƘ\d}x_,њE\OEoOd5.>3w1|4 /I$'PO,% oWoo$/GNx{H/bl߾=225 ...ĥFw;du٥9-Ͷqױ4Fg ҆`\fkFnb3_m1* Mқ?׏ҥ}i.Vjx؎$p@À%x0PpUg 6U6>;lSS/)Jhzr,}BkK3%oʼм&ޯɴgch%33*{{{@0$N9b幹vvΤ Nusev$ ęp-Iɉ9hJW: 3\O3F% 4#_ St%8M/eηr2,F2q) JRڏo B$E1ŏJ7)FrZpZ*+_, s 4 ٿttH$z &ԥd~t`]v&֑ZZ+hCRG3bj},6Ia2B۞*S/Kݒ0$5df;ᆮn苛ixJ$fjIGO̱ ( (4 ().,:f  V@PSHM'{NOL׶p #KC#BDeryV6u656w9vHH{-޴R~sYS+QTv:)N(m6f1!Ʉݺut,  ^7hҥ111&&VOֿaU#x{ 4x|~#L! I4Rl4yX4sdr<0f8~< Mwp656gӉ ,4aYUJHl~U7?m@S/AF4 e%h6Z+ɋE x͘@b8991!!$ɗMCYl]SS䟖[c60`j`L$lBG&t6W L':aSg&8V B"4O/BluB]Ĉ/%j>|Y2._l!n:ruvNt/2' -w.n޵LTL?޼$il98[QQ*H^РAy+ S*⿕?^O>,$m$:C9E"65j˼Æ M Uv]{Iu)cinjiݎ]R9VKzH=ǩyγ׶וH=Ii`GّGdž L@2I]  J0! FbcL x9BnAyK$P b# !Li* X$:*cG"^jBG@: <7ynww9v;gg]qQ\QlIQ/2jLSȗF;| ouI}my3I*\dǏbajP TWW9 4^vp--#X[0 [cR+h͔Xly38A\Vϥ9č4?!X'lKd{7E"V~`  BAm-]֓'f FrD"lmm,,,T:#bױ :EZ¯h~;~d~ź~d~3ViL1r,133ʗdHm3yjS%6ڲTMTS$C "^Wa;W \ͯ+jY\>`L`89! YǯlˠYfzOQcr~|EKT(32_šAKzƌ W0u˱gotǠE6[P @ ~<A#7E gӉ>WH<~ :^{%Ox Mx'@\+ЬA`E1:WM,V"G E7\ <=CnIOueb,S=9g'›g5ěV"b˫gϞ.ixJqK,5jPe.;-h C\ ;dzZD(E4fag2q.H#$ ądb[M!I|TFJfeuo0[TbaIIIƿv,|xOJ$ 619jjj𴄅YZ1%BI" euw_7S3j֜3 i}81f(yPӠ܃ǒ%K $>psb5=9h`f[~" =-Uv1uǭ#.}D{ 7?&9Z-bZ OU[/JӉ0Kjן8q͟iccxEmI۬)b4Batt\.GO ae[їÛK'C)鿛7ND;6leԩ4h^:x}|$M82 Pd/8/DD ׂkhiI6ɓJcOuľZH6O"[s0-,,4ڻoeeDoh|˭!HPS"BWWwѢE .{uތX'ң^ kCo^Lvc(YLLCG#==ҒfL4~{⒘fhhfAcVxF$;pk~ H/ -y!h҈h=8صlx-}eysUXKZ&=]K@Kc "n BobS7rP;mLL Mtx3g΄6*{^7'F7fڙHr#1Ϝ?Z9t 6MU5iޤAciӠ*fooJ2jaxǎ=Np4?OzI\Tda'Sx)-͇mR "~AT?.!w>, t~zjVWN0TL r-͛omlD7& >|xTI\9]_˛+D"md! J^<2~Z=77P1i]z%###SL92le13h:q-Z38ALrGӖ2XXp6՟/%xqP#WX𚯿7erߤ7mQ837;;;WWW'$$Tdiʮ*L S䥫Bݏ!0Rkԩ2C7-111PѣGk?Y72줌T;2gpślD8> -6`x95.m8i0@gr"UVx› PHӾFӒ$'VWW7))) ia0!zv[%y3%CN&qFh5 &Ѫ.@4oҠ{=9sf^^PT*wC&1B^m q,/%'I\ɏno$w&hP&&& ,>~ɒ%4]Ҡ[S[-ˁCѴ-L%g1ӜSV, X%$N 2'NRS%:;eICi{|d=7),uuuBQ Πqᢶ_~Zo-iz9L\1c o)4h'ΑvvvÇz6>Ql@S"('ESŕM4 Hsdnnrbc-!8bބ!((S=\܃g6<#pw|F7G⚑"w"HИ|.rBBGРAcbI%KL2%::Z&a?Z099yΝNnRq` hϧAjj*hf>̌?~o*dުgx3fph>ǝC1g}JJ f||<͘4hn`QFv &5T ĩ{odp^w~59YlP_ T6ixSS(%K/ÛAA^AgSU'Jbs533stt\~qqqbb-ʤҡd`B*!w촽Qw!XЛ/9μybbbеIS]76V+TT!m%3E/݇O?-08033Si4hAdg``gnn#7턚u4oVJޞ O`aaԩS0&FE@Ԏb[.\~u3Q)/Gj3\6:0~dH&4cҠA`ffnMOidd Qؑu!w촽QۯMO2-"" 4;~A-\sEfPf QJ+uX.8[2e2D"ڵkG MMM1iРʕ+ި[:ȎQg5䎝7jG VVVvt#ҷI {[b?Z^7tVf(K/d43)j'BÉx.k`\H$vqq2eʦMbccb*7^РA]]]KE*"ʳܱFmXibb 9q|֜Y&N ID^<4?N@jb4Q˨0r 0 6Ÿz0uB###GM4hx~$5|Cr|Qvvvk֬蓒 Ěf"ux9޼,.\fO7`{Yl65;ZGCC#((hʕ2,::RK L4hNIskѩ3 zC2ڼIٸqczz#ܝ2|73/_LS;#P )R#0rBpӦMKKKU} hkk|PJܱFGb&oRRWWONNF01Aje '~CWΏ#0%Ç'M!!kp4h\6lVNAͷܺD,0&p<9ukhh`3|u&HlQ*.[:6i,$c`p4h\xV(9DͷݺREvZAS^{С@`0x<He…~L+iР7XoQ ,d2)ݵkWHH@ՉHr555pHT8`N %TiChF}ˍM䲄 1XOT0B,*Y)s. + ?bjmyFqwegy'[eI-VI{7e#5d uT\){c``>#G̙3N.ZiРAch1Fsrr@N6-66FOO/ ,,~P [ pG$N9{wvؖaWC_V$u)rDm2]je2zdψ%\>Oblii SL)--uss 4~?~ QQQÇ6lx x___p  Ͷ`ihH]D1bL;RbTQn0|Mx"%݉KߪH:`mXӐdG6Be$t11S.|Tr2l̘1P?9s&5229rdjj*} 4hm[[ێ,Y)P.WC>$p~~O930?i$W+/- /fz*UazmG}f{Y'[9/ . _, #H"##Ğp%% @ PWW766P!JH]]ݤIhrAO `e˖M2%!!\P6)777SjbpL @3`>߀ahPۦ;&KMx0^moaѻMbwXbmclӺPhV"*1EYE ;'].EB<4ilCVIlͰE>摛7m2\a%@1-QGdCxk[qTU``VPWuuu"===CBBBCC'NjժsZ 4k4̜93%%%((6 pB X\2LCCb1Ry:'@pX,sC:L(u!.|4R:Rj))R$KIREt._+UKbRS(R&Fjػ`Rԅ+uJ8R)GK_-CajX GGGQ\\\^^޼y󜜜LLLF<++뙙F 4~/x&M$&&Y "J+**O\laaRc19}'}s2YOOCctttzzٳWXQUUi +&&XАfI4hРx1 @P E %vU^^vEM6-77(x*,,, `Ѡr`7`1#% % ,--ᯝ 7j($p&L;wʕ+KKKnݺ3fD"H '\HuC#""֟.l4hР6XdOMMTP(r9&2P[[[C @@~  Ab 'MxիW'''8yC]x4hРA@~ uРA 4hРA 4hРA 4hРA 4hРA 4hРA J̞={…-rNAq9hՋϟv-.VuK'ohc44|~mǏ[Moo{棟\qѣiޤA-Ʈ]@<7-I,//(p2)3fF %mll= N;;;za U@*%%5H~.Onkk &Zr ֟7&PRR)wބ3 @%:j/yj@jrtz(I҄P377466V~XROasfҚß]|X{7?uj45<2,#4Ԡ߆L@?ٳ]\\D%ĀhOfAQ\~=O޴iӔ)S^7A( *---jO\\ܒ%K/ȖO6~-oT̙|4rH=GǍ/*ܹSOOr;v^U*phyQG'M7 G$wd@\ޤFݸ_xww3f<yԸ ;PԾL\)))+V xbnn6&Η M|kXcuV_hƃu|ȉ'n5{ɺ;voj:#|x{G>>rj{??t͛4h M {kDPQ(L5hѢÇ[vnܸݻ(CFFFr\`UV }^ @Ɓm?{w!|ж@%L%`N n r,!! 8UYY9|7ʞE+W  z%GA!r8RpBS@Ժ9,h3 @ `i@hPn A4|}}=1nP08O<dСC7o=<< `c755\V ;ݻMMM f]QۆxpT 탫xP kB׭[A`@ A냨Mȯ*kPVO~1N x$<4Qx֭[ԙP&PgΜ/ MLZZZx.PHO@!Tq-BbQ(84&)r T4]Pk`KvmyTƻ m}-}tGm鑺:[њm7ot>8\qvV˷ѼIPFd/p0x3Taٲeթ><TH \^ںdr۶m+**/\* J1x<8*GuVfI KCԙoBƍxH:#M2 W…\pП7 XbTABFtgJ?6u?o8Bk (ys֬YT\\Ý1ƓbܸqcބxvR !I rAC:A B^@$.Fv }:_M Cá&F!Rp \.N -o[rܝ惽G>9z]w<rÎv^Mg-=ﶴ~x`Ogݣ?jZsfgKV"o&)\2<=('dOn_ȸ_|y &M)6m&u맖u+k֬Sw`%V-ԑ>ZPYi}?k0)\}xR}g˓QVoqF*842okLjCv]˳_3.9]K-X7++ .!RۿVՐ " 98ChPP+SSSkl2j͚5QpT5\tĉ7)X)Օ_R xJ'ś MHcp*;yoA 8U,# ggϞTP,@gpZٟ7A@BO4 ΌzBޤB400x~oB!@ɨx. [F0<<Rs<7!I@!_xj)/R r c:whysKV_W[k9qk]z.=8RYٞ=8gUgKmj=-Ϸ_92ilz]'>qZ}cW-rjO00,*>8 ?}x%W=#5BIII&kۊsO5ZymUˀPk4,/3;ޚ`!.|GP?}too/͛4T1vͯGV(y䙘9s&Yp/x탓WJsp K~AŪ~AI̙3@ {_ |; ~:dQ " ۠RAAbS=Q8~Nݿn555lBA7ӒSWMϛXᐪ]MTʧeЉp&y|ބ(( k(JM￯{ U1dmhye _5554~惟:i}{Mw:k?=x>o㮖ۚc>kӾ{chɺ֞ pk^˨" ꜐|&^]~QL2pq<ěc\딗ϳV~|ڦ|v$>>蔒@W&,Gd ݷ*m$xBZg}K/ΫbG1`EgMV6Bp5uS i@8Ç/BXBuRJjcUeHhh(RE >${Æ PVeeeH*r'd5Bȋ*:6iokuQQ… @P߶mJp=%;4UOw>7BiL>EބAgVV.'{6d B$}M~fo %UȾ'uvs{mU>9yu?m9|Pݖ_ގsgU;bkxgM=Dě^ȩϡN5fL>j?l\]QX+{?~e+OKs|gҲwb^'HNT_^: ׮_SC:8ZaZOA(<ަѫ0ת.;xGrwj~֫̍o1j-out{m0>L[~fԝ".˷RY^Vނn1AGy͒}X_ĬV |5X{ TC655V3K@@Og!?a455ϝ;w=$ Ӵ3333{릾Bp-ԩSA⁗ UWW;J'1%auRRU8pNCCѣGFGG=V2?*T2j|i߻wU mǃ͞=J6vft̙09RӰ9QSSj ( B~ jJ~<}44xx(7Ph8ݤĨ:S><P" {:"*8qn+%l(`ʕ+Pp6$ n`k5ZuOOxk>9yh'Gښ?o?A/Z;^} Gzvay9P0G 7o~ tP[nPA L7P?_`"8 3yd 𽼼 _P,ό<*P~Tf@ CYQX"&p  @( `4 gf HʅPcmϚ  S,w& Y#cCB=0wJPC.tRwC›^}Nw{n7~U{ǧ}~ƫ_^l/[kkrkݦw?oКmo$HXݞ3k9&Sw!4_#?ratuvA*w9ڽWn] ßfέ8T!m~1jz=yd*=*\Ca(Rǡf.lr{ ]]wRԳj]cƯ>u-R6B`{L7IpA幘ԩ#L^+1,22c,h_3yR5'4&/o203΄EW,b3U\6%Qź[ e]XACT=ś A t83jH8L9B qۯ|.X84bĔ (  RFy ~!#T{&DllbN*!.)H@jD2H*hOgáN $x AB. gdd-S]Ezl`C(/nih 8{[h۰Ó'?vc׽lֲ{~Mk+NOe{򙱰 ;rRcרL&_Y[퀊VT\Ҷ/̞Z/s'omg3?/:lxL}7_b̲F̻ZjٰIuENy.VݣG;3[}ܹ V+dDŽ+[MʠZ#t+p=co[4jJ ( *bA){**(`}EXј{7~7}9gts$b>̬ٙg)/.xѣnvʚi{"7QZ3c{;IweNa׭ۈ#GWU2y/'9*nӘhZJgbo\|>i%9 }&N;k{G`1{g1.Q:ׯP~@o/{_|~ cAsa񃒌gYM%k1KJs_U/jӢǨϗ,(̽Q|[6:i&܊*2AT!m9BNq&mjLFo2dwpVwe'1gB$;{GJqTG?| N7ɼl9ȭp.SwRr .xPYYn^>iSMuۯ^ &5y{ɹgZ(_?ܻfU7%FQ19c%o--sa4Iz7YXr2+K34^|r~IQGqvG+xobOJJӏ.MZRWsr 7=*cӚrY!u# oJHɞxU4 oJHHxED4lr3l+.]shWh{ZΧ#>kwc*gٙu\̨|Y( )S̝Kt*#c.Yw;-.DR&xsiw0~xx[YV[-]؊\ICufxӹd” FpyOgߊ|O[ֶ,4aVcφc|>-ɽSTPQ|ٽ/Z3UW?.=|Qk nnq[nASiҲo伺STޒ |3-D*>Ӝ);e05j/J)fNψ缅+ͽz}Æ9h;TLcwE0?qwr4Oڔ7VYq64;.8zzͥӎ2-j{w%DM 6me3e_Nxsɮ{oQ0[fKnf-֛579ӎX;KqA'953eyh"˛,XR0i略 y wfV](QavγK5ԥlRs.]i^n(l.*D+OB7ltx5$BU_i \;旔ȇr:{Y@49DꇝWfdd$Tϱlo bsEw ̚5;^ٜSKOܖ4wҥK$ڠ{ AO>mas[ ;g6Zg8'+k1zR,Uoe*7ru|/Y~˛NN,&YnBk-o(W~xߢş 7StǂşJ *~^U\TVUVtJ[NIDž%u%?yOQMֿ9)yA M7ɜgWbWcW<߮x]ޖrrnj͹bx-*̚7lu/G;XAAaסX=69f|i>N&o@Xl^=绻{+t*J( ~h~ wNu,=slK+I^hph]`mjy}ڧIR@7VJܕ/is0IYE.G-bȪh5;OȌ&뽯W_i:SYcpӮ;& q$9-e͗<-~Z]T~QQy]ܼMPE eUu]>wؽqA/QLQ:U]k׮ٴ+IqWٗU>R0Gttsx$;%+kwrMaHYI{P)uL9f9fffdG())jD\PPxnEnIH.[Qd6𙄪z-rG D5hzg9VV3Yu,]֙-GRK/31~) 7Z`*GXgCMW#ɑT_jqfIii]]lݘ1?Yş;.H74˛,XƩxmUϯtWg6?/Ͽq90B̯/V4=(OUokUY[an 0Ccq1 둚R pze!%%pRzWv ~f r#mmmVdƟ:+e uuY| 琡? YhѪU  ";ccc600 8wYwMf7\pa֭di@o E۵k+e˖͛75077OHH8w\bbΝ;b?9555Ɋ|+=#4+Q;'7TQEJs^{z,)gyƢŅ Jtd:bŊEpss`^,AIj}\Xn1. s\ǝeUSWb {-XFEEl >k׮1b[ ɶѿ=μ+D ꃆFDD;СCMLLkڶmz d<`nnndxڀE.w/l*TR~IkO+J䇔?.(lPkWs^}RX[P0f{Rؠ& ,~~TWW޽l^ I 6/1k,99޲! D!h( xan_ 1=+++$$W3m'Ny1 ]̬v8Xpvv N~†nnallcƄ 4Gn8~{RMzF}fj9WOզgpORS.g%J{̻gu7L}FFKfsodU{1J/ޙݷ EFFfBtT7XUwH###p V'{odv]tkG؜b~\~]7izN\k֭#npfO.""BV@YΝ;GV x,X0lذcZ-l6l71پ [ٙmܼq-V7oܺz&M;Ly'66oqtdkj6SCa`#VҲ"$}-,,wvZ"//cP䘿} ^pZk͚5AAALC@v[n_جcx ˗/ބ(D M}}}Aqjkk /=Byyyyxxl۶ʪ%pGP.'; UɼpBAܴic' -NPvf+mA#wYŅ6/x t85?? $ ڣ~A&>~wF 2$niiI,G?gI'& ·I?F9;( ou3]>]pGyy9!sw~9͛7s:scǎ1cr$R [~E+'Mfn0{/&<ܹs544HFfcS666 &''ւA$)dq @g/KK,FUhiiiPd#0 ɓyѢE(ؐ$rgϞ!WZŤI6mbk.D-]&HUdP "C^ЉW^E}-fΞ=jCIJJ6@F &fGN!C;vٷʾgϞٳg ?GsaSƌ 'uttP(<P6tP ܹs(WP=z4*p9 (0|҅ G}}>iql,~ xUA}˅ם3g|RyCn:h %8a<\:##x_Bӎ0#4 J@ 111$ &v^dqw|rr`ۓ@s ( }"i-[K`'<~<&A |o݂Xb1X I_+++=@#B_UTT477nݺlnaJX`I›xIxܹsi0 'BRrrr:*';䕒*]9Y,gѥAcccPZQ[mlŋ(# fU BD8E"0VFG}A/ <A.j׮]CWfB){`o݃s<ޤɹ?ɭr2'w-ջ?=? tIrpp"""pzdD\C:kxI$44C!Gڂ$?}ƚԐ\.ۚl :k#}1ӧO9s"%%B d F~WowK_ TzP%i J+p ?~\ - b-))*P'x AP(>ʂ"D#Pv(&ِ EM_Ba$:D"`!7s hJPχM#Gtu9)~4klU8d#&u..zrfÛ'2B $ɚ PDpqn4p28 Nj,pR9?)hT=!GP*~o;eAaB8$}AHIIkh,'`Xt0Qhhu_|O rakqЋMP&5gܐ!1fL8DԄr s 岰Xf co &~$F'\PPmYYY=Fv@D+"@ߑIB# [={ ،vA8:K/&I'3/o"Njj jo#' ,Rb4\nVx'f6bwH!cu: b;7_C@4sL31!ff۝s@<$ҥ㋋q{((jiAx9!?=I%%6 q.\轚H1KcdI&CFA1.{L @_"ӧ$=q$5Mo+133ۼy3 MBb?ΤUxNF@ppd^ h"h0Ъ#GބI4oyLݻwӂ#kAAAcUqF?n'z$d,Pu#F%&p4y!|C.t'$&r\d J#M\bF r?~|^ѣΐ( $#L1l2wlrrrPRғRQ4<-_4=INhhhzƆiӦ566Νv`⏅ 9>4ʈ ٷoDeFFwep`'OΝ#V.]:<|83 ԠQ4 =A'xܴb $NY0?i>2STPy4hެk|.>G{KŠ¢"F$i }hL߅@ ΈӂB8&@džhF/KZ7A`[X+h P3w" ,Xׯ?rQp4` Dqrw t?ow[899F @pp֭[H^!_dm۷-\rׇO1.؉8[M-M/'M$ c a\FAA a F@ogϞE ŴLϒ0dẀF: q R P.?.[ B4߶m6 ސ lFFGGg#Cѻ]f03_JE_e0caaѣW\\ KF$,Zmee|S;j4=%-### JJp*QHD]]ٓxwTTTLa% K?),, Hޤd WOBkWI]ZPOxLCpѼz1Y+gBWwp؊e_/`_SN}544ܽ{7??'/^YWx[nG|||$)PGKNN3% n__nܸh kvWB7};pcǎ]~ʕ+uuuLFLp UfBL)//'c}*F25 P̨(///#677LفOF߰z -%(O8D@LɸG{xT`Fh<nK}&C-R?}Pf;'C w»h}S$Bע5Y`rPƍ3tF"D%ā T9r$DO'IC?2dȐɅZ }&o[ wzۿ>QqoA2, ljEREc`L܂d}3(GCh7 2yMQiJGH 09`<^zoqp0a)-[`yc>*"=gx&M?_$g)iOD+9K~.Ewy_ꖡ;y!7odyn˧<ǁ_zo!觤-$mmm777%JMMԩSx֧N:l}}}ssޣ}!qΝɓM6!/GmrPit8XFBOHwN_Ѝ藊4W9t(/}l;GBt+Xd-=<<.\Hf^׮]TN8E9y似3~3&N+(8 lig8i:>~>~2~)A7Nn+agt*}S"* 7Y` geeeΰ0??ݻwAC ei"zzz<%%mM@~޽#FFhBIE.Q{'3:Х, Bn_H7%OHm3x/o&^L*Rݍ"Bɂ [~e5^5T䣩3x4 4wj ){a4_@){OɹBS^;„xZ,X`_@QH~,E?D7Jӏ%}$JwϠ|$d}&Ew gsQ$WGR ƒ,X`1^ q7ti*lcQd[&/Dz_vhۿ̤[dx_9^v_27}}}:00@qrssQ̔aaᠠ To5B¼|}};::?xbۇ`۶m-4Y`@ ׭qAt4 ZJ( C1$]+S]%IO4,wN ].jekednnn{ 7oƍ*,,,lllb4fȔ55C޽{޽؆ 䔕Ĭ@s{UUAiiiSSӧ{ Ȃk֬h8|~[D '!!{b(2}ӦMx`%%%{w u GgC,8%˦} `d~ٽBxBw{_dnٰa<oz{{{2 ݌իW z7%Λl'r@>AoFEE7ovލPXXΝ;,k,Xtu xSFH\iM0lʛK%^?;$)apkwŜȐzeʄC* ^!i>AK!3[ܼySAAAKK>ꁃurr[egg8ICBB@mQȈւ&m]vX?Y^^4yQP+WrssAtrI'9BF9::@ބBtssA \E @CBs߾}1;E ED__Dfkk fDu4GM#ᐥBxG "##vvvɐ9T&(>鞪*]FFBPh)9s)))f؉16] ǓK0fxzzickQ!;v@-ۓ `捍0%1#{O#nW)=hx C8}Pd{=gnrW=JK;w|nprty^xM͛UUa8tw>934ĂEo^pY4)|$OS`Co/N (I5C}wg4]?~)]/9u@ȆwGd=Ձt@ Л۶m 9v9y2$"QFA+89'9sL^G*ț.T]]}( Ν;a|/Nԕ.{ FHűFgoyFnR]C>.|&N 'L`'4;up(:'` "u:t`sMvDH94(n\v ̈2R Qv3n|#O2ZA1'kpW O$-aqA}&V NEEŖ1b`G6l߼Eg%EGvFEcccHq }P0Nrqq1EKMMewЁ";DT&PT<CQ)*j~L!0Ex8Ey"GQσ).?ƒ)ʟc8eteY`zAiEm8MIwI4M~!O ѯ}*2;doy/l_ ӭWƒ2TRZZJb»372^^n|C:e^؂\MI$ûcx9CGh@@ G2ÛPLpn~~~}G zMf HB8a&/20s¡ȝ(J& $,"!F S-"yÛ(2M-xػ,nDЇ`s 4})٢|&EVa9hD.7BBY5>z_~ZćvFRA4R";Л111}.pפIVxGkfDe2avzB:l) V~*:(*EóэжhǏ͛[ܩ u?j~F5Z@ōS^@ 4#Y*}O{'kLe⏋evވg=#72t MIӏd~:Wn&Bs^^ބ__fl 4 WFB.]D 移!} (.mپ~=֭[A psdx疖;` =4z2MPAɰ~=-)\(v 0)ZFF 0;@?7I4h>o~PW( Kڵ Jj R3on7aބqrrG v<Έ>p󞶟RQo;nDɈe›$>L"; C&2tAϷo߆F#! J̭[GևIͼ=w& ! HfVUULqg EEMz4ًCZZZdd1 &"#>0ȱ7ohnu[BA{ZDd4({P?}3Xgggƃ0QRTz;xFCd8D\ExrtttԩS_q0:@{|/\MjcS-qTm$E}h7nPٝF?}QgJQԳxٞ3g#"Xd7"fx L?Fw*ZDެr:oRvY,oW1$oWS}"CwOLPT~MkP[g\\|&q4!yz$ paaam%2 sHTOfff&,A={3cAdcE ͖;}`4P (,q6??`(k0jҒD$WRg߾}|r 0rFF3`ѣQE蟄'&&Cʨ7҇]qqq >(tr@ T) 9p-dv ZVAA2=k,SSSp+.″Кi&;A螄ðС>V{GGgIKK $sp1XFC e'Za!0v o+M^BB &@ &=Z]]M 7|2^#a y¥նwGPRkc^# d DpFFFwF /` L{7f%hv"!N> nah;hᦦ&} )D_{? 0ŋ yΜ9---VVV(n07$)>>) l2'hQRm6EBQ"#G"5t-g"Ǐy=4%v<3x p| Pt$MB8UC5(o:X]SWwj^|m-ox*//(n<i( 8]o`-םR̙Cd7⏪i"{Mt MǒkE'NOx)R7Fxo"Ŕst zH>8ȃ[.//9"cRx%4/2|<xlK&h^~g~)s?KKKo޼IÝBw q{+1X>G$fຑ28i_u"28̙3Q($A AvJ\$p|UVV@dhpon( 8a]@UfDs0DFj(*MqDEQ@\Eec0$9drf jT5H Ԍȸ H]uuuу***BP{T!GFAp,Rœ5IdD}󑚚J&s]! QP!~ДhA(h$BeeeBnAlq\4@[-C ꢩTmհut}]H Lqè&* @ jI8=-xK^wñ'V-\lٮ+4 uJ6?O>Vf +2?z]uuuO^F^V~[^kTPp /6[8%6L=yU"# TX .[zTϹ#!f;/?0h$]`*X>w4-CK%x>MOGsgt?S2$PJdLwhDN7{3 8ˌL>L IOv*rdV!w?pT?G~%CDOniB~p"8 d|q!InaZU@Hr;' #Ûs\%@Ɣ6d>2F^cV{?%|0z#OBϛ74‘SAF8 n_r#^ll<Cݏ{Q*36njEN)G"9S_mCb۬uNY,IUE. ˼pmJp[=pկwU)iGp%Xt QM蔬UZ8Y;xEng 9 '*Kj}.1Gt݉umQjk(Xʈ}_N_+Н߅d2wvO/EixÄsy'ݝ*a!6滜ुr4ߛ]YL'^YC`}f;>Vd 𦩇kIi?x/wPWW@׉:cgauz?b|)!_p?U{f%&5cG{:ct.\x~7f|(sIuv$G/&R;'eoE3 **\ùyPGcWOWޏjkݻ¨9>yуq<꩐І֨z4< ADF/_nL孅q5BKyZZccE2 Λ<2#cʄynrHurfS|ws?Q9[ on=ÌC&ؾ$7 HgwgkK٣hu/۸ox˦vWLk^1,EOᒁhEkL+]~nef[ko,_:84) k^"9I[Kf| 5K5q.QDc|E)-ښӵF.ќ9S[k) ћ7|{Z,X|~!efܴ(T3XJ9~ˍ㟇Q܃ݏ߁j㹝1g׹\Sg˛!Ʈ55qw[ bx4jl~}k|`Wf=7wțFƛYA#}|:ysAwc -s&{ڞ%6lZjx3㍲׸u;q{ۭz K6L-ɪ1b؅.L,vW̶d,Z8Q;əf<}ίfQ3_-0CG]oVG`#\>edffJ陙)ioOoffrffzZNR'++)++$gei~b`gDZ)O_.MC/CY'M1uQ]u6P/" Gj߫sz{]8odueeeŋUc;f9Fp_fl|/GnT/E|۽69;w(ߑYt'xC 34cj譱PZ,70GqB2 X's&Qmț*φ!?nj|#mS7-=UBn$1c'+̵o֒9,-SߙL wm*>[kipjjwc$.Y^ᨾY:* G)#7so9iN-ڶ7d͛,~p>~b`gDŘm.r rC݋v#Iݧ_>v{Pu/k_R;ND}\x$,Zr3:pͼe=VάluL-3AKF)$1ͿqAoGL" 3Lu_o2i[\j%7@\%a6{Z$lmm;mv1e\j-o"۳/hurcUQ_ l$ܕېf_tA5ɜg$ݍ;>z܏YߺX,XqeT]Q_FpQ.71zLƂ.C=IuEPTUҌK!T$>yޟdXl\FcƌR]qUqC }#k26{=qAox$&kzpqsys3fL2Q7sD~ޜQ e涂~w˃T}lC'79H~$ l^xQ"vnHks(yOZk:J\1ɾwxUr3RY|*9ױ 3Ό%qק_(]pIM 1Z)L;RbrI ;oovqd8sYxE54&%RGy;;tлfwRmtم!}ƮF.e;B}_@@6Jf[g0x>9r0vQi 3pUtn-\GG(Ŗj6=.ZO9w;2`;OQn5>)zU=j #mÇWv&;y?ef Iذ?NRFGʵvɋ ,X ";"^8Z4jH⩧m<(nЛ 3{::(7: i z5wɂş893bxS9p+ Efddfd@ȹs"++ٳ<333;;9=-ܹT---\ĂKw۠U)\M,~+_xƍ0ٴIw&c 6D㯉 S]^[dAّsVZ&  ĂV89(_}ŊHZ@f)YEW_V< yoCؗ{C.&lp3rP2:pI&1WE,o`+ ` 1~Ok1S~sJM L*j,Zm+1»Ӹt(>eԋj{?X`{N>(*2v?"]Ek8\l-=SGZVGt΢}E.yW >|MWݿ]jrDMӎ& gxX+gO@|mӅV-_abheyMӥj=ʥL 뉫Mp.Q.K˥Xer4O1 w==?<++ujv*bůu;ypW)""p윑KJE改V9獙8wyZ}O>3g$̚PhzsLSvK2 ɓ1t|s^$dpݖ+UQ]:A/僄()9Mڐu4/#%26ol#F|J;f̘u6Fܝd' TBqUK.ihRVpQ+ѧZXW?<,^8Ǜ>o,t鮜܌M &[~pƕ,t[reooH35?MKٸ>oi؟ݻ}CdmW~&;xwRO֝Mg>kl53uTrc^6i}Ta_ěj&dyV'랡t8pw* NBdrexiw3~||K˗.*lff?b)卂Ug{67:~/;Ƭ!^5q-Y8vv_?bxڧyUYx]͍^<\5k׏#P!)*vŮ$܊.o Ƅ}TonrL77iH2ӷFP]'1[(gGf̓U ͔&MKJebN!1’"EֻK\e/[fm!k[?L}{^@yqrr#F :"W[TΪ`Z0oSWm_2m4j.^rTҀYe7(myf.TeyU\h u/$$FSU,XϽtWN(x!2K15g.:uZYqNz6u6BgTFמ8|Աs':Ϙ1-A/(E+lj)OCCÏ'>Yus [(7Ǝ=}HPDc7\v畔^2?vݹ׵ts1C+vWDwa 㬵 z{^7 ]\z a9/jKxIB-e͟?d!}%Ft ߄ǒoxDP,޴S62rFT#LJhdh[.4"mW8Y;]α> 7n8;F令g t54bþdذ1NB%#EZμy`|ʝWɭ2N]ڵ_DdW(aS0IvG߼7\d wQcT g/3Yv핰}$81gv3Rc}V`zkDf2DK&'o<{'ߊI,j\9:H_>毚j|kNќ9s tGq>G7o[g5 7r_ yg7FL7FDc7P[KJW\nz8;qu($ٳUKÛΑ=yhOS֭;[n۶sw/hbYOMMMqZƊt;$P]\;dETy ul?/!CXxs WŕYY^~Fdzl{ѧYugI/+^>ᆴ{PQܷROߜlj(JM4oҠϷ֥?oƔxfqZ="ӍYLFѩE7DĤ9M"t_ q704{:5ց=KU];0hn+[ ,4hq˹3t"*vcr]{^d讟i6i$O]̯r|²AY,m{Y{ٮ~1BBB2d޼*Oلś,qgu,Y ga{vٲe JT^Isq֬e14I IU=7mocDzXlUVY _ᬋ65-f 5;ks1ye"n(Ӵ'I8K"-]n/꒎'ɚʬQ!g'N*,Q@90083g ZU'fփG/hri!2w$o\1euڱʞyAkR9e '.\$&?,6RXiyX!/8M78<\~KݝY\yeTO񴪱 [UM:[3>ELL7iPw_oi73&gQ!w$$ ^9&S[of?~*tpDkvR\g͢!&o:5l1*$-s VgK6]Fz>)9An}C0C1+=OyyeBϘ뷴|jg:tQѱPI'8|%N!KgRs9ZCYXXfOC7w~~@`c(CR5Og |OŞYYhF^V;f9nTJmeoS?O) Ϯ̞:oEAH~zcxs\IP(W!fiŞQ))X`Ts]ٳWXypSY)9(4hڲd%E;q(_Tel,.v =b@ݱ\es[-0;UYV+++xdK[YpVdߗ/{Pz6WQvc{Wǟ~՛o&wԧ̯^}ǿi/\-DPh4EklO,T+YΓ7:b#  P9RXTݦ3eś ܥqKX<5>>d5PQPA#2#G F s'/~\efE*8lذ׎cǍ~ѤvC 8OM%8t8+ClÇ3@×?>|cՉ3.jM#G 4T¬򛛷}?L,P<aƠ#9rȟ'zYiЈ|#n gCCw}폯`aT9'\Pp4I<|?C5XmX5$0M`usYtO,0vaA((ͯonR~;|y'qzUWw73uʞ>J3 ΚWEn%U;1lҜI}9xtm;;.^F@O6i$999O66l؀NZZZj}l2__ߜ##cǎ̙3G]]hhc+++?>66Zj3f̘:u*.:ejkk#2ܹ"lmm322Z]7 `p"v$g -*:|Eӧ;gp3'OžɻcqD螫#!!$${ˆ9H2z0BTJ@`L%b pOc(&NHE/j'!!-""_$ g@fN(7l~9SR\\;TiDei#A|ck}Qܽ&$yLii iiҪԨ8p .\iIIit~r@+2SZL;[Np͔DQ8JR{ȸ:~2Ĉֲ7OkZUqSsrzVхҎ_W~W=aV[}We#Dޣ7@Uyyy$c֬Ynnn\]]ڍh6=lyS@0m`*XNƍ[t)*\,\AN<}!\ 4/.6^+.\xx8.Y\\V/ӰW [W*ĔixJ7Un}C" >qk@9W1sܹdN'ޢ}V}Z=VSγZ7swܭxCꛇϟ~u]~q|c>Jll/ǭy-ߦ/ljOn?ww;/ȑ#۷oWSS;w. y󦾾>?Bp&a1 Cp<1{n!8sqqK^DG222oR\S> ғLIM>s#@ݗ/_ǡC>6!Xzsʕ䊠_FFt5IL|2,pcO}/97Ba;:'-J㯄#xV? +`E53ǎ%_TyQMCUw56oe͕oZZg,xmgΊ}&; 0))Ν;:::#D(**ر$*ٵkWɛT`kk{}х ݟ;sxSJz |L PeeeW`/ z݆`LiiiUUU@&allL޽J3Hi+~"`Q)?i *ݴs0'FoDLh}ljkl,kijob6Vx@_<ޒlkho)o}Q~99΢#{ŧN,9SSS8I+VP_ڵk7:@ү& WLBΜ9ù޽{MLL8BA䖗Sb&r{o))) Q~K666<BtO6g7͂[4Gw1ftxF/ĉ550G;K,zތK8U}BLBcZ0UЯC@rraggȸ AAA\x3#6OŲ6&ĸ.]86{ JIIȀ!nJN >ؚ5kG^!{_ % R(g7 WC\˗͛׊;u?tМ9s(bc7lBJJJ eM @>8{1?}Ȋ0e**oNgtn8tqqhLt6Pɓ'C9õN0$sN?>>ׯ:u DYQQQh(DN\l8@lÊfeeZ#-2%FY$Mh.، BCCCII5e4 XHl@ѡE۷ҥK֠]FhFGG~b+P-R :m'N+yU(שnUz]ԥB1*@3"FښJ*m-WZ}J)`;:6!y߁^zAΖWj:UԿJ}בXDŸyumC٫ƢU 25Vd6=h)mo|U {_TɽĚ- _#|8$pQQQ{d WApw] ›pl.E+**oBDFFB)K'౗.])!!1{l2?k,58dyͺ:&x7BRMڂL#_`5jp۶m}ŋ?P6#@&oKKKtNWPڼy3J6tK@T=P\/t]6l@*0`[:;;||ĸ ng] ޤ,kkk<zÂ̝4i,f!z, _tPkQ_( C/D^(x}33tbSPV%"',)`9"J"2R2%$TpCΙ5KCLl̙E%EDDDT}pBѠ=-PMT_Z𪸩u{g_՟go:~yɫ(?PaoqvB]{C>֯_nnٲ3syAPP[O>% ?~ *!S<*$aɇ_Y" CݻwPL!2 SBS$8׸qH-dkk;oQPqJb3X ׀,SY^^^hLmEls>`yԈf$9{slHF 5/''` QFh .G}&U(PUUm=)5kg kA-HfP3U:Ԩ)'`AF #&ym#GFCHH'ބ>Ք&BA)[[[3<2sQ46!o߆єεB5a _^ pZ k%b.|||+$-TE*\54{ A\VqMM'{XƲM̦ڎǕ-MWw8N 8pСd&333; x 0eJ'C0֬YtRtaÆ :*fo>XhdݲUI]GSqz=YVpp͛HJJ222k IIISrrr}Yhbbb}O j-]jr ګLkjh/YlR_HluWZT{jmV*\l``@AGc;LҠA.w c0GW?#HqO:w|56m`1߿ _EF8B"W74|$oj7ixhޤA 4>Ņ؎u%3b 7iРA_T&ϛ] ܕK^xA}Bjj[ϝ;;c\@W^r Y7󬉉ӧOr=fff666PK}:>>~ڵ<)//oXXo'κ/` YVNNΞ={GK,QPPPQQ[?~|L<E 򵴴2 ضmɗ{e$!>tC;vʔ)`XyS__[n+++1Sr!5k8;;-]c>`iii%%~ k4l0"1OƱcxA ~&|_XHdQo^В...\ 1c"d l DVC%&Џ!!!Ԛ|f0۷odjh YK=V^ x2 yyy%<m 4`f3ڦLtp>(O Қ={6ԢBV\s.RjjjF'N B.5F >RpԩSIiӦn 1řPUU5++חTPBBBe! 3A QJ z*,LHH0aBo%Τ!C@Ysh4D@MI=*yÆ ]222 S`|*AB9y[rfܿ*r5O˓7neeEnܹsݺufY@..)822ã">||R?$~)HTbpK,a(Q<|ɓ'ԤT|?9((j[LLy9NϟGgςh7{`ii >Z~}O vrr>}:f} 5k"LS p(((XYY Ð tuu3j}X}GӧϨ++ 2:$b=y+@ah ss#GIQ;AJJ 8x aԤL0mOOK.aݻ;ѣqS)((̜9L 4h|q+7='ov=!Ad>-|^xw  b xM2Nsih.ś` (M aWRRɛ8o`qi&MMMB]DP"Xᵵq^ݼygACPX\zxxBD4hN/++C=Q($' +-ID [@( 3 k0_Wwv$ŗ/_a Hj~ !$QA\/mGGǾ}`?Ge0U>>!\.Aun߾ rF^zݸy@={PPC6iР [C|ɾD_o ٳUR3Ri/hb J'99s  /P9H|0=C HgאP /H0WZ2N5/7$PvzxE-Pq.ބniiACASA݉.^B6p(.--E6x=i{UWN yRaO=?v3uT_22$==P}d%BA4dkdd6l=DC!III#XQ OJJ 7oɈ`hB=y Ur%2NL4qhkk ̚5 4]ɕA7MF͛пxby8,===Ϗ&߳gLRcuMTS oޜmʓ7%$$t›zltuV/9qȪA'%Nqۑ?gΜ򦝝  ByʕsBҥK:tA.x |kxsѐ0c,G$gC!(Lȁ=H8(L---q@!pԚ<9,//', d)ZIII>$»w ;M(NhyTMBDmQCё7𦤴f޼yEY$-<0䃞 cbb8-d,oA]D'CA3f 9[[[ vJG b>>`:)?΢,qqqO^뀵MP-T!"C~E]]yr,//ʊ5y`6$zP.={',QvMh4HB8wZarCݩ8APvؼ9Qhb"?n݊n 5f>>>E;C:0`2;1q]ȔC :<H%P V ln:hC@ʠsNto@H^UU"zm@OobBhiGҠx2{כJ0  LApppzIII-V-{C>[ޕ67J p# G\l6f@gI?<< rt(M"?@%AQ3 ;`PT9ArC$Pj!j^ '@d}2 uG,فkP(8'|[鯁8GĐ~iN& =-.y ?V1xxDu'E=σ x.S҇d0 ^gZ. d6D 2,ۋ$l@}ՇhFt [հU}Ϟ=⒙J??;梴oǸ1NtE}i|lOG:S!-M_p˗/700577|ƟQQQg^УițzV2+1};\" 7gɓgy&s^p=X艛G;9Èn 1 `ZYJ{!JKe{YYAA~/v.,e覧֓CqUYWZ -sѶ9!$hk[O ?q\UGIӀ*ooo*ɎG;;7GvCi+W{ :%W{$ HE&~tݘ>[i/DCߺKޤABqBV%;{$%, []ҢdugvA%VP\G2ֱZ]Oz6̜cfa ~Y6(?͛4~Caojqgna;x}wʕ-[=<<;uvvta)))0ȑ#d…ӭ͛mv QQQaaafff˗/YҞ/ܷP"*9\MO+l l,R3嵃~($&ZCꝌ%M7f|J(C+e 8}}왺4tp%/v="izh[QW ?3cy4g_͙,,|bƸ447Zٸw=>{Ownܹsgw΋wʗd8[7o}q /r򁁁O~5559 Ϝ9$%##bŊ/~NIHH@]>!RRRZ9!''WUU%+++...((Ϗ^{ٺu+(++GGGӼGRRJR|yͱՇ d?q*xh»IY M={/*Ŗ}bjmx6;=?>m z~cKZ ѫ_ּ,}d_źd蹣wֹ97zeǬ3;wssa?@ 7(Sfmd_UVWRTRRPb*(cGmBOX'd---x~.tھ};Xʪs Eꐺ`jE?.G&?M窪YtI>#_RRL_vcOe]CAb,Iݟr27M:) PFę22$/^raRs>i75#33SWW7Y$$8;w:.]l¹v3'V^=j(q<.O.%%={67ꫯ qƝ>}Zwv&Рy 䭿޴6c!# eW C/3"S07scNڒ k2 ?3c C+֓X+ͅ)NRM]Nw^w;X|wu3UFEEo `ōgD2_GG*h-4FIeii@ Νn:zzzPV>% _x/ ^U\BSSSmmmmۦoooO%K!Asyyy0,44tʕ&Mw=zAmmmcc{$P͛!Y hff o͛?ĨDEEO q& ^bELLLbb"߷o^PPj***ٳgmll>]q!/ݿ=o[3֧3 bdO\h}Lee%+KAN81AwuI+mg o؝ʕ xsxS;`w7o:Θ%'*Sy&ӗxUq)0s:qٛ8k›- 4hyovW8p _NN(pC@$}6nWu////:w`ԩ&L@g7yF FnlPKǃ|A^`=8-[ 1fΜ Z)maymm-jCHiXYY222>Rc}f{{;$92411AcƄMTƣ8V'$$˗`{PPdlaavmEFpW2N"75ۤfc읡kX㞒˗/s}"hjם?s{Av&YY>`߄Y""=V]!hpx^@A6 $2 >V9rd@@k׈@8YOEIEd999IV}˗/A(k֭eAl$5fM9sM/^ ـ{qww'f@qk\&x ~JZW_mޖ$\(S}tqK#M\O[4<jjʓr6L;r~$DrU4H~/Ɪ+ޜ`vD7NKt̸{0gu@g3eeټy4IQQ? M/3f@M<RpI&4E@^l}g{R?vҽ5ّp];˼"?<~|*qҪvթwOSXr ԙ+v2eQƙkw[lڒpUZBQK1-JOjx4 rW?Z`bO+\~~„ T 2YYY'q 4;}֠&#,L@ֶ&s oBSN7͛}q$0R`$=A MMM˛ Лd=缠 嬬,YMMMH8x"p^;;;Z#11[%){pE =nGcޓuC&fp;O'!kc}xuctT)q߾(Λ{GMLmOghe,U߽/g#6͵ $7ۑ)9oMR{r l i_%7qӠEo7߀ !O2D'O^]⿏xm, A{7/ e08Pǿ嫮{ $4hHJJzN 6i$G*,,,<AqϸmnlwKL3ƶ7Mbsl9&aaɓ: 2dȔ)ƍ2u-O 9zSL6;䊀F`o?BB"(ӠJ^A~yHBM6C.ԀLLLGŏ?޵kh.>>M7n?~7|-BQ,YXl Xv:s+s$EC}Zb8Ml&n}Amm)6 TY;m( i#QںB)(IUl:6l<#qІDoW >!!hZDLp%KKK4irJSוҋMuMYO appcX:8,e;888sp0yg k6yB 4xђ1T"$,D>1G *&p UUU]l6x}ہw>ṡ53{[綎׿EVY۷o.k/3xXW4IqK>ʫF_WƟ lDn?N4hРA 4hРA 4hРA 4hРA 4hРA 4hРA 4hРA 4hРA 4hРA 4hРA 4hРA  6c endstream endobj 18 0 obj 193794 endobj 12 0 obj << /Length 19 0 R /Type /XObject /Subtype /Image /Width 149 /Height 514 /ColorSpace 3 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x >w}EDAvD@ %&!D+jD㊘5!]efvnwh\eY=ݏ}fd&wx>OSTw=1* 6 #c#lI(jjjH$u]ǿvoIP(:y`cc?ա Ե_s'7moHB%׳=pCY:WL/~!@SNy eL4 _JX5ٶ)T,Ё-PXqhr*-A h'5` I*8 W|#YX1KdL, ^MڦZ(Q4"0I/9ݻ*g8Ql@!~4;zfG)ݵ@%qqqկhw0"UV]tE,+W2X0dž~{С@ ))3|7 .իO?t 74 G?ӟ}7la,Xe2$xf 6|AD3̙3'77?pyy7eY޽{Y C1\dbb"Q*;iK=S? =;>>J,_->|8 tЁe`Dh-Տb >Km<`ڧz*~ΖoݺUYS=ՋzP&66k׮4#WH #1\,hPjCy@_9;P-]%\fca A#4i҉'H";v]vу6.n%!Ш 8V9"[xhڨ/wC}YG3gڰi |8@ۦGY _$-M --Gmc#%% RXUhwr @b/TSOm߾]b_|eP-` Kc'7x׳\uUo)\^lStT{u]G9ӟ61plx֠@nxGlp؆2z'c h3rP0"*"Rk֬!hYYYl^ zA"b ;=icѽ27{gI͛Go?x_3{"wlnqwP .-l,M-_h:26 Тe?|.2e-ϋav}m۶?q w+5̟?cfj $;/^`f)Xk]cobTXXg)$* {d 4֭wˣ%tP2&ɪ:wLDgvӭx-^ 2zU^<T6ptʎlGNAf6#5H@l̈=tg&bA")A5 { %dw '{2)#$SL9IXuPAzg9R|>M&4e˖qS>MK,YDMMt1G1\3/F`Lo,z~jX$ǙIewm |HT˞={F"&ԭ[7uv|˖-yU 8ҥK{DG&.ND_C-ZĆ8 `µ5J^',_cu%&,x ̏p#qb|CKy At=T>3AC=>j(1vh'L'4Ѓ+(_wGK;p@#z93`΂EٍgȐ! jq'|rvcNllԔ䪪*Z~zrT$U~xކFMsVG 4mXUDk.Op6 C2qQl;V z뭸B;3Tjۼロ&{Z^ oP@o8 DPnŊFh+)_L%$z/2 TԬ8_h.p֭CbQy8IeGYtMdoZ`,W礓NbOy/.oNN'|+@Ch'X 5fϞ\v-:D4>iIضO64CsN謘b#SO=v}lHҳ :䷿k1b8D]-AYй ӧO޽KKKm8nVFHFS(j@hŒm6beQ$uh***>Ͱ$33@B9GZMBpod 88(Ocxm"%ʣ7?sHP C aGۺu+k =ze\60GÙ`L^P'$W_eN7xN^0*WV^<.4k֬7b1o#i2T?fȦ f?a{f4@RJ$RfmDۚcH߼9CINfP-})Ύ %qfUl 68;(Y* d,XK/bCn/g;uD lHBhZbAəN9PF>[0 ew)qP'·4'6Nm,ϒ$ۄ[9aqӧO_z5C"k{yCKa!ME0vv rA(qw薌K&/bE +Z8;ǎ$geЕ&K,2ma0=o@9|]tu(u*%Pv = &˳R'M|%r4x+?p/(VeÄ ;_ea8.*籌 ;FoN6öe…`[qG/6 f݇$$o6ʎUIK5 >Ȗ-[C(ڹKP;H-b| U I:mhE#,&L 4:bq.s)`Ǎ>1DZP΅19 G+|yLYj lʕHby 5O|Z '|>WŃjsxZ<\-|>WŃjsxZ<\-|>WŃjsxZ\n3s+ =ȷ2H̊"$a͐is&Nce3Ne8s2)rҡS>$S9GMrUB&&OIuNhd 6d:'9!ohQ>eM[9ݻpP)"IkOpڋP>[ ep رCډgd sE4石 j/*++dzWhQcDz u&M]fΜ y1jC4h b),,>_f)߄뮷~TO;4ԏja(ͣ@3/]⪸gΜ9M,-5*dYdw\0).`iӈ8 +ƔÌ)S0>,!y 6I(W9&CW|w([-;)ӣvɦDd+7ݭX@Ý*jO9aqΌfmp#/Cf+xTEZ&l /fϞMW$1lIAntdBP 7K C r uAeE<㕃BzLl 20A>{DK%;999BيA {7`ѭ[7{Hx~*>ٝ&k׮$\t)yyB RnElu jjjHfHIvW\ O%Qר"{ >Ѹnfj JV1d`(?lxސ\ʐQvxÚi?)Zˈ <O>$ %Ui~7]MsKF0rRHɑ1PbHe-pd@qLm6Y3IA;0UbUW]+@Jv$l7J`R#5VN:qD '/_ ܼy/۔?x# Xz5ʼd9VF"+3FVFe˖[pкVz$a۳3g ؏ nߏ)]|ifi"Xk1رcH`) ؈Uxh'hZ=z{<59%%edb>С/ h>y.#!,*OE%; Aa-) `[Ȣ9 h_pĎ 0Jj6{y.]qO:

SʙJ97(Zw9Oec FBh;11e. ?> )beد!1sHr _OJiֺ9^Vd3eFR3`V(XT9 uu&.Ÿ/#wTb<$|K(/QѧMm+9/.-t{a8i*T+k^!=,"t/:d8\>%b/8"Vs5Ke_g{˃f٨<Γ:H`}x_Bl< *"m@ꊴ=Z=ăjsxZ<\-|>WŃjsxZ<\-|>WŃjsxZ<\-|>W+ZkR7dB֮7"M8Sae!윭mfIU, efyQo;_B%}+!v fDNi#q| W>AS)OuVhM\R3qy$`2HnDYf$>ZR1I%vܚp:N99+O.;禵>e@ɯJf9G\zŴъ/!|Wyd0ƩyNt?)<"쉇b=n-W+Bw3#SseNohD֭@&::Yǝm8ș.$^6'vv =O>-[H;w9s EEEկ}ua͚5?9WlV(V\yEi\xK,!b^K/h%Ms7xcȐ!,X(gʔ)l'xbJJfϰ ͛~oa2KR^,_\<$_ TW^ar#ׯg=I uvW+''@*r#dʦ ܹs~tBcbb.9fXSN`e*,,(5tޝylͰ* ,ָrvi|:&9|tY:to~C#\O<ѿ\.z~F!"<;w.ͭ[n;-(iӦ VF z駟~}:ӧ`mޛ\eeeq15#v`n6Tv\Aeԩ۶mS_::ؑ$ |_[op"#gW_M$i?ϕ?fڡ*Or-LA)ggtB"sXlr`5B|嗹sƌѣGs>d>/" 6paÆ S r*қc?$.",QWGN\<$ɎۇL89/~)>)T`!@I+짅 E-8 /^{Td:Rr |]zAkb}>Cdq2({TSS#*rv%v(Nɼ)yŋ# I.2*͞= 'NGW>e-1faBGtgG!fC|!5`D@6p\IYboAx_ɦ iH,XΑGK%I}vڠ0¾pX2zO\@Bjr'T!dt:ÿ[t)5k@xjAKPm0 <a#K5jsARyI:^-f"Y~ݻ=lAΠBY\<2zh˒%K8M"ASEc=8P?w\g{hDW]uI6nw7\q2ډg馛x; T}Oɓ's7y"޽;]+2UߔNgHӔ"y#2)(( E$?sN^x4bМȔY S>D h8q"3b#4iV),H+0`S7 32~tMh`iP4hDmH3Ig>3,I/#`SNe)-M۳gO~Ox?xe8;CL#X(2H-eZ%#UXSO=ŚY~a^ر#u@\vZDm;77W)In,t8D]v03ˠ_&pÇGۤL=9묳<8 >G0,Ou`9眃,'oEK%)y76dut&ތ @aTvˇ #Gjv"4*9;ߦntk9cpV6s]hۥdmdg#Bq<5wFEىƢb3iSKt1ͯ.P2k&ܻlm SɐQHgb҆?J-A"*ʑ0!4r8^THKW3,akSSm 3CPsq(5G׹2."*ovkq'QI'vg8`'nY*j67'54R*W>ˣ1s6Ϲ`!*ۉq?Ǘ-SuhLiQ^#kF7`WŃjsxZ<\-|>WŃjsxZ<\-|>WŃjsxZ<\-|Wwifޝsdl %n AxNB ekXjbF._#B =hQ>ezPI'*jtgɶV.t,EN9/ae3f>YdV (k z=E8(QSd}R4WQ3ab|9[N#ZjT.WB&1*G4do>6{ne=DH2L,Nt8EW>B:8Þ"$<q_ɦΙI/_-ђq6aHX*7,o}<>l)ۅ*KYV8p51g׮]kdmGVPSKu{۷; ;wtzH0.`؞dP{K8SY5KpSD[iŭ}[mشi y{ INN( ϙ3gر=z N&9|4hPBB&8?eUV?RDaU@ eb .@]N+,qĉ7Y?A1 HVOs|.5,Y"s</^X2/ݢ>V;%a\"Wg}VfO˅|PH& ' Pjj*vĻFW\ߘ1cИz!b0yG{ XqE!qHK)K2e(%ʢOw{`M"̘11zؒJrey9nlS?75w\ia* |zdN=@;q,t2=t]w3G#@g<̑\s5\Sʳq\[>l_ԩӎ;H_$BR[}< P@+Vdi2QFldPɦK}+)=Pc5+6fAjyЙAGm݆ICpz'B^z%e.H:vP<.}32ɬ ;l >NeTlH̃ƍ` 5yAlI'e=1GqTt5C.z`\]5Cwʶ݊rİAhٲe!QFqÆ ##"HM2ŰS٥Kz֮]c S>e IC@WuRZO*e(F+tK/o sؓ/9r$|>^ >irmԨ> q_ dߑGVaS`?km8WĐa(;q6MNN-qfc<$ܦ03+{8y?"-zmAӦ5NF?C$łjpr?f cdtgāܗ<g/ py28j۵knQ*ٮ.*hK2F=Xo<>y&JIg9СC5k0H X°%A*=}t,C iB&L`ڔΝ;qbr \|$3L\.,ٳg;hI'-C4;Br>}{エ{K6^&OLI,Zeψp"d-))n6Yfo=ۊ)|<fO['CF>hҤI.@bNH«Esm6V\jj*I;#|4d̙3f$z:okqvk׽r / &UMᓱw6EPȅ;y-~@åZDe%MG,q>lq^1-9 @8Jh\';wܕ8 !***l&y0Eg8ԶfӭُrT6mJsxR.?- o\&0qC#I+\B~+{h=ꙻ[v6ctO>$)iv>|8\ԩSl#&nO+w#Y۱crv|WPىa](eE;mG\̡y)Wgأ^|`W??=90_yY# RUȋ+S)*bta5r:~o)'ǝy CP+y>sxZ<\-|>WŃjsxZ<\-|>WŃjsxZ<\-|>WŃ to+#lkMQ,ֶV6i[~NaO0lbU! ٵk0(7-^v|2^fp bN"Nd9}mLMCJOٺuK1fT6R\{r5[@Z8T=?Im ~em~N%-}x^!tAFA石 o>(GNXcbbf͚E.\ ) L49 x7\sy뭷hhBÍe˖]{K.Yv$* f͚CxڣG(i`I+'480-->8ءIfq,@9N;իW###ꫬ(vߪU5(zV C4u}}.EMA?OE̥,WI$B@4h]ѝЃ'nTEt5;v,C?F֭[]Λ7OTE#XywEEEs Wk׮ gܹ^"p{Fpc9s\ĪI;|wٶ.hc̙Q'yŊB)7(}%F,/HB,G)n&6 gNR l(+J!k%JN0$(&9|۷/OB䂛ѱ vaO'?XK{18{lZkcRaH+/&ūcthNkryg||Dv.jKe!HKV( Y]c+K=d4d;w$*((@dm6`a A% yjUn~KKxf4 ;Q%v7mtWgl|A,_-sYbd8d,FYDG h6C{*tl5hQ>!tt8餓H-LKqR_r=؆qAD9CB(DY/]^ l*},>Vڂ";Us#F.j s?J<\8K\@SNe>| &O>K2e 缩jÇ@<$W++ln>H$A믿^f% x H x U܃ڮ*xeqW^Iblq!㕠v ܝr(V>dxȘO*JxIBNvaS5+8_"qiyM DT^^^s<x>S ǸTq\sw =yqCԶ[Cԩ %bF)'YyLusJ!w3Rzͦw>FRTWIykCI˷Aw.A o/ܻ,lX/ ֨ {"q~Y?NLڶm͛7c鎕y"s..jiZQΟwGp>J=}ҳf.AP3e1+bll$pKX|OjTE3so (2.HۣuޣO<\-|>WŃjsxZ<\-|>WŃjsxZ<\-|>WŃjsf+g!Ba2I&:_wcf0*ǔX~'sⒼQ:Sy aR~Z9f L=aw!Q\t2p"nW mmxu\3p),9?R$Œizmm-E:£;u|!GU|CiB)g!hR: S0ǰ]o͏SӈK㼃ohP9&2ʜ(YBKU2`pN N/!̢bq9*]+*3ldሠ9GR&NzIFO|Lqą98N2ے(+S U֔kr:+$u俜$R& ݢP/fva\}-qĉR7nٵK5 {ng&xyUV-pK)&|N#_ G1"  +#"2Pa]5E)c2Q"_ ETP*ޗ;h~ P$Иq.4da,Y"V!Iʦ⧝vZ׮]5{("9Tf?20y)j@y /++k6-jc~e/iOPhA&S'L8  >N֛t&7(NE7RT¸Pi@q]6fv$GT+Γ H?*oC0%'ʤb&K @R0[ǾK x?QզTVU0X j:|-6jM | @~O7#zc8gـb_vU]ߦe5=Nb }F27;2T@aIǐ9;V(qxΝy"nӃQd iiipH^Į,=0StWp~7KueBb?y_c ꣷGTR7RalZzi>꽍767RvHG ru}:r_ve4ɘ i5Owʶ|9F)˾?3?p)ͅ^xg6L4dʔ)2t vҥ.pWU5r`yU&=6kv1㌡g9q֐35Urb{V 5|N7褅-8,p">O[<;-SdHecNҴT@,'l^XĂϺN;D}\!6(UЕz@'tK}r_TXB3tԴt)FXT L Ks-| fƷpš9sp=H-{KU_Ɔ bT^Pe>)ԌM`CQl$?ȏsب/ )v%©>=;.\8O8^:\kvpHA8,*B$=\׆8p0I :w͑"]wEcpAOd>.i^a-..SOz|z9 g>҉>-_YV$PHa^P1W-pT1\u5G$04۷:)++NR x]%9s / { 7oׯ3nh`ݺuK,ywQ3:7nT|bBLΞ=9ئ-\0rqEήZk1Ȩ벍X ;–i*__jWhmzTM"-\ 4Ֆs 6VE‫ԇ`ᐂ8K˺{H; ӛ1bjj)ҷo_dp9D4BnyjUڵ,䥢$v~ggm߂5 ̟]bnr-h s cѻI-1c$&g'| mfTF`OqڮJ늲#Yi*3E&5ī^eZTSm떺WHM1搶#kml@1. qrƏ/9 &VWW:|/^>#ef b~٨GKxqq2^{-΁;^+W"`3m:t9wQ͂KW,j:͗izf c"~P9>`T5hf[[i@:h~Zqi<-%F+Lʆb3`Ll~ }|C'Q-3}wѝٖf?!K9]ZI*W=R4k'NWk9 -s^$T-|ː4_\UNHA0R14eP52V^I}  &YK4Nb0>@B@9dDIZ0R%Ql3 \!^b!LF1D\l]zX<]ҵ gfSj67Fأ *o1>.<y>U4ÒZI!~…fʍ5 WT0T31|v|aY=HaN*=f[ 1q |^SYP˖-Q4zdӗ,;w>v%6=d#!LOrf[WŃjsxZ<\-|>WŃjsxZ<\-|>WŃjsxZ\~NOori&;Ğ7xc̘19jԨ^{MH~uyҥƍ;oÆ d[fW\<_uN#0B'´ .xS˅o|$ L%gISYvXcƍ2Sq"xRUVqvzz:Y*p涷7/_ޣG8&̃n!f|bN={eN"Yq`ǎL& N\=(ߧO:q)lݺ3bA`w|;\۟g*>>W^MbkFuEYf9(I2K<4=?h DYبWBիJKK9\؁  . jPy>cދ7iy:5\C6[n;rrrxF"cO2)))^{-kx衇H9zhH} o'o[蝏)Ȗsi}+߷oykS]]]K]~S_~e=k;묳-[mm0O8ٳg.O逸BUvZrfo_9~s%iI8 .#rCIrsQ8h%L3"jvtN.@5{}'1?BK.p_\HbN [kjxɒ%,x8 (BP/0⥰ZHMM ^PC|q)S($ÐKtM-q ^0O0oCf]9d rM7iկ~E)eƏ/CQ_ xnf[oD:C־sN\* +Ń b8*a'|r̙{IQȴB?{1ed>裏PI>}H'խEp/hu'c SN9}GAAĉټ;M4IY.NYԚ>(|pݻwOw/))Xpq1p.Lرf'$z^Lz`'x~Vю[Kv=ȟ4aϕW^),J>ފ"QE!?r YfK9)юsuٲeOJ :w\jȐ!7 \w܁gK;Si$~ڔV'z:揀IV`lذ3$vvڪU8^-z0j(geV 9_#<;CiXj6|\M/2X9&{^/\gZNRIkVch1Z 3д4Kb˃ZjO!Z@uf hi>:QzR.)!DXgחjӘIZL|4_|F~n1` w(|iYEX-.QۤAZ(! oV+tوh`Sq|> i_Aҿ,IߛژXد wv]QqfEҟrquBư nܷ7oތQm۔p <28-9|2r.SNI6J}kɆtcζyۻ)k,¤ƲU)2W/N '}1wIǏ մHC5#fWM^l;>=$A gFHԸ`3:p^×d7+7hLTfMr.T M/0UV V)?ݯeĘ оƐ5m.֝b :t2Uܖusm>MM/je%P~TNЯO 1zA\0.L 8=J1kOr ZcF  5o9xH"I='*%d]X-"&*fV< (>y~'¼5?zV@.[4BI <*>W!s̐'-HTCW11'"bc.ꗯ!L=/i5}|*6]LD 30咚fas)sX&RceE - T%iA\$JoBfD]BJ\( M .Uű*}]/ ksX&ZԼ&#Tgua|!nO~62WM-0MUOKe ʏYүT-d~ I4fIK-d&}vU0YK`Z6TAA }_g2WzWZueZ}XisB-Rl.Ќbm惄 \{8¶x,7=ŃjsxZ<\-|>WŃjsxZ<\-|>y /sJK$ihh{7(kj3ߋV֌<Út9, s0 FD'';HJγH[dRDxLI%{%v;vSJ!Do'0r |T(>s '޽[frnIIɦM9<<|ᇉ/)pFrsYjyHHJ55rəd, 'ʤ-aؓCHC!v2EgG[~̉&.^UUզ7H3IvZeq4QIII&D|?sʞ+ؑ2C2h-Φ߿.R~|0!!:u#H=J[Hzwpv˖-D beL)b77}tfrr2'x" ߬-䨄Ft5אfE}5)(\+J١rr"PA&+an;d ۤ ^}х)G%|/++#E'i|HH\}~!QF2m4TVc`{L QxSO=x+!>ؿ="TgDXo!`6'9DGȒp ҷBjY2  G%|@E4a`6!ݻS8$ C a(ƪ@Yb_x1":x5>'|c3#4~; ?yAۯ=$Ll͚5N\޽ǡ6I$yΖ <֭C>w(m$G%|/osP\ kN: ~E>|G222Pgɾl@_(ygΜ)vVoSu1$)_;={\R7|;*{czEIz(Àh]dt'GQ z%^V> HNͰt`/>-E9+h2JzD_LS4hGH F?LR<@eee{8I':(au9*#sxiiW\qwӸ~P{S6dIhÇ @|ȑأaٳw"@-prL2=1_S%aKfPǛ |L0( ,",Ҽ%>d2FaeZV0&^ 7E,vI7!}BoLÄuH>k,I>3uh<رc%hIY>1l'etXey`"|Y &@QvԐe΀V;NҔER5h|7BEq*'^Ỏy 2u?%(L+9@"[vا}d+z-eEOM6炝rBO 1c\ܟ9!2P&cr4-,F -.2AdM tLX8/*Wك^9#G; >S۟+NV~3{vhLt[q~-!NO42I icfSCFU!e*]l0q's'ʓ[s<"JHn)vтEP_ϋ1R|&{gaTI =`c* KlCI\ӯ Swuέ>lMNjRj )=Tװ^2]*y;9'\! fd_&< JErԔpR3|TG?9cU,Ql* 6VrbUnOcRLS/ٱq7Xc)- M&|ЉaE(L !r -49M'bq M&dݨk4j#pE|Ap(Kb ‘_u+bLcr5~]Y2_Y^h+OwjfZM~N''s-U:X j1ZшzҿV*j>o>6;8ßL3|M`5GUVb8qUa&/!,sR_Ҭ5 |c'ƒ"(fy&'ddZd#XӋ+%eSP3_,i[2hKT#!^r&O]FOYt*KLHsZ(Tg>-oMzD4HcCSCo.t H7ˣ<oJZ&u|EBJc)bO|zS$C%ksxZ<\-|>WŃjsxZ<\-|>WŃrT'oMi[. ȯ A*5ߑO|5P5 'e^[Q q'ʫK񊵼& cL#HK, ִt*Y(DX{d ʚ|&A#jNX Rw: }r2PB8o;eƊp + MP5j,9/-Q(G%|vzl U k>'(zJÚBhN:.8]Jy˹ZN?bd/W &Kp c<ӈS5 v;a[b>#˄"ѦӾ}:u䂀w})/Cnذ'g7n9izܸqP`bRm۶=#yyy$eA.]}Qևb~c <2R+VZ9ebͷz!$*G;Κ5>TuЁX%..N -[FCI.99Y.,,$q`#??ZKJJ NaQ? %\$4=g2}te/W_)j 8 !vzڴinݺrR]]-ܡ@ݻ?O @~W ؁rT‡LF$%f?|w9W,:,(Y9㛆nn7|3i_=؍7H &(lk6 G%|yii) v$tNZ mx GA{ꩧhO+ ݻ711c 9sD oQ L hOWصk v)ך:7 0-- /PVByEihP{U.c^@*]x18JF娄)C׮]ɪ$s&4d8PҾXO߽{j$$K6`B^飪 !l=#%}Q '|Z-ATɰ#FB3AIG/_Nu-Y-pP֮]=h*CJ8\tkH K/dX T66P dȑ۷ogUB713lIsybWl*1Lj&⢅K[TSd.Zx +LxUk`?.Ũ")7b;\T1uqeI*?%Pʊ&Yf~4 /}LUku'>s5-:ZBIJtCt  S*Rµz( c!bo)*@%*뮻G d܂z>l<(>1 +DT!A1gQ>DsU8b_XfTʢK[XSU sZXt%+UϬxinMuRv:4#;_&D |u1KBE1zLRuYZc1F%qF/鴑s"m$3 ^B9 ᒤ H h>:#zS }ڏMVOa"h‡ ~ާ40":={x4k cgĮBx5vX‡oh@0PYW_ |痿%'^yjn-/ۀcjUSɶgX04炊U ͯ^8}A[fE5Z N 6АTiM`cԷ3U9 $(Q$cm1Y ܀^pg.H]ֽ۩[ldѸ3Rk5EOXoćF͖`c{T}Fwz  U+B'x"sɓ'{~>1* 1xZ6={D>'BF*N2NT^PPptʔ)>{yk!|L4$l: r5 .\4fORS:+- Y:| EZm׋bUyl6C þ>|9H&I0)ÿĒ}NԷ.J5P}h&CN&> වŁDtr@U^veiSƍye9=-G,,,,|'aӯ_?ƥP2D޽;{X,++cG:6,LjNzZ -`L5*hܪ^>땍BLHдDî9;;ƆJ4g*`JPi0޴įN_[dpI峆vyu ԯN?c`ɜ+Nn?~<Д)2.]:8p( z nzz=U<,ВXfO` +f.8z$@DR͒qز).I7ddS^g$dQ$F!)D⸩ؒЧ?#:KŔ; A߽ƧO=6:|i4=IϨ H*IIA >t)GS"6c]-"Qxަd9=I@N?H5h%Q I,Y躠ˢ&J,銤vdO1qDViJ욯[.;:ɗJ?cz0 d&=e‡ #):KݾUG3ZY`qiR 1391)L&'Ʀr E_`uVM>MYIQΓrX'\=*Zֻ3i'~6Q~]߇HPV~E {%} vM:uKĔQdܛG?ߢ *'hp_И Yb"ej9$Wvf&QQFd/Ug69 )9c4CUo937ϧC`Y\0YD95v|nhA`Q_M!p;$KND'bW[AuYaV][";Cwo;u{C[ wkΞv oI-* vϮPvd\liQ(&)!k4xV_ovb/^4su?NQҏi;#;Ns`3&~ J#bèVZZΛԱ3#EqO2:4K/ȷXwOW-(4AS(xN'+g;0X>PlQs;|=`)!y|9]M}#tFD7"=w݉AP97ѝJUOZf6d0Zfޠ|32+Gj-n> e4/@.~T_Dn-$T I,@ArB.'Er\D,u#H10C&QXԴZDbɊ6 SFG#F Rbz3g;A0c >F]; WU.FT 32zpєZ84?w=hDR9 Ƹ\器j(ѵB&& =I=6 1C={oF^> x\kD.VXe&2D 2įY}bױm\MUTE{Č` `" cJ%Fskeq 2p1J5!Wu4uMA*mR5h)aGhԘz Uu) WD) *`"بVj*~[=1> fCC:G^5 k1rǥS gFF',Eq*0=Ƕ,cF= ڀ |"R\z>ܶ$mg)%Eqr7}F5"j-'HUHͤ\;+ a:~[QeTK#L8vmsَ{iQ(^|66֪UJ Ϟ⩇8XTXȟgAU"iYLfݖRBhJjaWH42`A(CqؖP$׊l7ɗ%Oe>z,3|rB m= 99QmrZ݁ӿwi~'>IkN>zlfafL4EUȈp۾ݓn\?QG IQ>J#O2R|q4+1t9j)/YnX*('#>"Pӌp. #b_ߵ }n#VVAa4>˼`67_w417+ӓS< X01O q TD |c,YCPb!qP&kF,͈튏kpӼV&B\IC+YX$՘ȗ0-r{ySg3Y``xn<|x(E$.Ůc^ZhIވU q+3@6|$GOYA.rծ7ZYu&w"8> OG_?UCnfE K% 4U#3x-n´K7W[ajǺuL^X? G{*CTWZ%V,E:}&(LWƆG cFE8@ɾv逸h`r]zĉo*D3VSci2vNJS7$!EԐ'pq}Zb^rs?>53rLX@h @%IgRTZ1 SUx ?վ^x{j+^K+3Ԋ{AhU F]AVY$c<={ĉ-榧&Frv,&ALČ |FXi-ոJhfb@4 e1h  pJ*k2Z읉>MQZkS9g"+++\~*xmrHD!󫔂%E){Bz;߲ȶH;UoͿ 6Q;ϐUb9+PZ&y"9L-5JQmK+1xqx˼vљn?z#31 vp 'w,@C:>UV* _#ZA"'MNGfXoQμ*u<)ağR߻ $ydtt c6W.;???W.[>6sRArm.blDk1J4|ԈHk!0'"6퐎UTN襤Z" {:ȘʊQ-Fzo}}}BpѮ8l_o{X+)Cvюx*}'$Rc'휽1nH_.Pa ٨%Oz~g 3!Y:#*5W[DωQoll\EDxv`.XKc.3JvLmST<)F=8 |>?+|0e7F9{@`H4GlcA`e~ e~]zYg^O3]c|g9"@ gn}.0"t'&nt}:&CYMz_-D_-bZ\n5xYm4tɍYsL@ A=h\n;YdHz΁tzN ^hߍmSZ*1*ridӽMo] ={;BcY Hck]ѭ|BcIޅ!Ll쭠Άg`5_Mx̧`mosL}qJAQ4Q%~w^fF.mVZLy"pFAd/hvIYfovR,u ^BJ62r_ +*Mt-wbY2?a+QPfP(鱮fzr9j)H5WV2ٌTؘlj2f'늴R6mN Aj\>> |~lu/$-&"x̙JQ ,= Mc dZAK@^U/oTvɎ!jOQ)ǽ~]vƁ6Zv>$=VZ+%{=1 R7~W{,.5ЈEf?*P%:\O-Z f?q)R_n'3r%,{0u5ԌTJv.}27zӫ4GϦcλ|U|x5o0i 7} a¶Rļ2@].\U2_3H1m(Oܴ+X1 , ÀDr=#:jHaȣ͹F4?q_xhG=RL(Nҙ_2j+em J+IGtۑ@u{0O\[9-8W9WiU.{FB޶#iχ2_~('v5γygDr*iGZ!gRR=M,Ag-!2i,3*j_{lF(1̡#P$jOcF(gJLu=czTOj`۴x.)/t`Tz­ݻ>rKr=_vcC 42Kڞ 4"~2C x+x&XúV_}vh((HAHNRlv)-*o8|ԓ|M>gvZ1"dhhf4_#htMv$H/PbDFD$WFAM !L1Yqz r,F|"L\LvME{D$It/JsFad᫦%JHQDz v7w8׾32{Q WMGYʎ6ä/dm4[דXA7]G@ 5Y>KJn{=MBIJ}d@O@ nY"5^|O\^ ',kǷ1Ż`!@ҽv-ӓfRYO8ȊE՜ZZySb P]^d_caG#(.`v0RܸC#N].Jm`f,$dX0یYݣ/t O^/"k.u~%(9Sya7Ks7~թJ*‡A_LhlD_ڿӜz<}jS(|fב,0htK%Қ?b^J/Vp[H+=2i[yݶyP>+, sqN )9룡-ೂ+`Ä}.n1M7 DH*~@OwwBJ{5# }g G,n >G$LbK"hH"/2ffK'.3!d+i\,5y'R#mP뢣" g~;n=ݧnʰXW=n]K^9A~>?wa:gg Ickkvf] mA]R~hggN;HNYy?GdLryX!I*/F~Fu5 @afNgT#d0M%kR<}2IN'@לRD;z΍a0b M&דmQ֢Z7U).7$.t./Jl]z@%"+(3/a4/_=Uy$NLKCvQ k *C K:iXOo)=fJZRmmq_c[wD5\p# oJ-ȏ˩@rڭdxbj"f߈C=C[+-D 痵ݠ*]g!|PKݾzRg -InvT"iBt+ȁ]cB8l6*›n?{^FX8GadvZmJ}7 ^:_řp^~P|žZL ?׶MՙWrےr=,?XS`P{*TyG\V8tmyDޟھg{Ux&Z"|ē1m *툊 *&=olU\C%կ.{I.BCt+ַdJ;v (H]jI^܊OayбBFU 3=}_w3EM@E|q \f&lF'|ҥ>\1|^O?*D,ciV^DvtV֓KtLc!?Y5`w 2bm$_)}C a* ft &#j%k1!߿tK+i12|LD*?|^Q8吕6n;ho DžpC{pۍ$Ũʂ*tƵifuNlWVV096qBT+Mѱ[N7Ў@oiVH+eúT~y'ngyG3Yv^ ̣c/r;2s37wgO/xVWܕ? x1ZR >EI??B69 d]y !;בEi g{zF#р2Ab5VtV_j-hHqnD66&h]T@6*Qy%tYYNn4$W|Q'>#Hdݐuc( gͨկuT<93#9Tx3g]('\Ar>SP\#cZYnYºM*SED- ]!F'~+"x_"5_? }XUQRtȚ)<ؼKG4@DЬN_`04~E] Nm>HHkI/ ?NS/XJ?nF`F϶m+_"RC\"EI}*)ѸrC[CUb,&T=,VAnZr}$RVL1w|'9QUxrm̝1xvlj@6"7 :2FZ&rRE#%Ea-}D_}.>һtBJ mGTہZTH1$D R#/V`R֝'b/fçyxyyh/_P-{LqpDvE| ct=SZ -?Qv[A3vyӯF)h%I0 P"FBXI0!עRO7 N=tn O e: T^Ԩ[׼s::ZO&f Q0k RN1r#G'',)cAFFL|F nꠙ rQ2SFusGnXr!Sft)7>*qwyz]Ѥw-C0SaTJxq:#; wI_;%J39xTad( &@:5!%ƒ1&-yRD%in)>f S ((l)N^KݺydֵK 4 i}Kmnۍ9I,lz^o6s}ɶg{k1.<44d-BATq4Wwtt.!>xEtb)TxSԿ2k-Q0^6ssgSF;^2[߾`C_ )RONɯE?-o.tk՚͵ZRm6}.K~V|/Js"@!7:]M8qbr8OOR&evl{G5moҁdx5jB3&vt!.Hǜ}cgP0 v4Tz<2A3u'1=oBʅؑλh2kT6?[/o,aP_yYrLX^^Fѣh)<H3 ?]x h%!_Q*{u| 2nt\.ɏ!5*$$rBK[ɐg mTsd$_H=h_ P#$bbU*vJN`;, =am<~`N3Yt4k 3ZC~AxS9{,NQ(LN&s|v0\,#ㅁ/Mf @XL]gvyv\m:vAqy oĬ2Sd郩rҵj*8I@fV`}֊Ode/y 69 I!,.'EJW2ӧO#|B1^8 "8/Zg+FeAI ; X6TE/*]\:jʹP_Y!qBYo vH&?6[Nb`EoṮ V-ҡ斟J{&62k0aj:N WLc PdB|a.' \~2[@HA ǏaNQ pb+?=R8Z ޟ`0? RRR%56SsVӲbJt S*D4s2)TY?l񳽻sw޶HJ,.?3Kϗ&:5z\FjUA17 B~:_,c0-ǧŹʼnGǦgآAԜN1 nkp{i&~^ѩU3fR*$W )|IǓ>̛jLZIIAX;no$ȲnA rTqը?jADL/78I-͏M;9:=y{HrAr)9M/М;33ѵ://\tO Sgg 'fe4nMkSv}G׆޴"_qݪQ# H-PLʕ84[P'᳷?}޷i(gBxFnٺ|G"l򹵈*ժ WgO /U0>''fбM fűO5tMW5Ul-ַ||]F5ܵmz8cteUh7Ͽ|DJsa `*=QeJh6cL90DcDY#Dʹը•Ʋ|njzr&wdr8>ZF:wdrb2;:=408=^<6xߐy$q $gU*4F_'DӞα;osoxJgjhqV J]PTC(R֫`bP.fmmn56AXm2L׼ᲫҪTi hvh|)犣C 33cFg&9~08ԉ\n1z:FT bg ğ=5fOFY|_8h" j O}܅FH턕.\drl6 ͑d;s7hhƌ> F<ȩӋ Cٱ#GL LN >2O82W9>p ~.fªH ԡ–H"U$*&phj*( jZ*`XX~X55>퓊^Xb˗Uh9L Y_J*mty^n!{%\kW+ VT^\ GF#ũ#HMLJLJ'd'&grrS}|:y/ݛwz E>eGA lVɩS.!p@wJ% QrU7z(-՗LuhtknPn.] (juz"f8;3 tnC##CHffrʼnlCs3:t`h87;123}`l#TI؃|n471bn3 #gG ù/|̗V]ynm Q[r$f#Eze)/^99ԌVӜ>Ze: 7#֩Tn,-o=zrh0;3}4/Lcѡd0u0;q|v1?>ud|r4?qoC#Sٙ 0Si |?9y م\vn"{bQ^m2Dƪvci/gJ~Ĭոo,_CUk)hqSV~_evtʤryvv> stream xĽ_T7{>쭒0 9LH΢"9's9+`Ί9gErafW, {?{)Z{,4viZ֚h&>3MKAWCrZkNϕvThqɓFe'ZĀOȁ0M]:jMr&%뮩v'/fĹg9iۚqaE8NmOK߸L~ 0\GO !?7pSX5D@G?!2m?;鹚.34z4-B/4͌I&دH  LN@ڧL>B3И?dp.騅 zJC bB?V7jAjz 61.A6wepC/I5116>> "P&aGLB32225ށI㡿 HSbݓHW@7m\,}==}@y&qO"Q@ .ɐ/L y} 8 dh0<<jۅ/ᣇvݵg=vݹu׶m{vl߻s;ܺg붽(ݾ[[vrvǖm5̚՛VUmڲ)p%Le@*J+YZRV9 *KKK+*JJee%Ņť%eeEeB()-@&P~aQn^~VQq^aa~~~.n s9y P 7oSNn&87s6R}ffV雲2s6deؘn436l\~֥3RE 33֧_tTM(>m]zu(R DHFƺ 8'Mk7e944"2Ir Rߔ4sS 7Fx& 7efnشicVV&V@Pt -,./*e1C>JBK!%,*)CIe1)CZSZUFPRɬfKUum%-tƸyk5gdVoLGddss{:xdc{wC'8\8`C'O9u(RBN9HϜ=@SgN9{칓Οp…s+u_|ŋϞ={4!؏+W2H&I؈ll-mmV"[[Jl̓X*eP@O`EV,-@fV\EsK jjYZXXXZZX֒bG"JQ11wp<.<2772@Y֨7Dp#"YlL3pEY̘1k,4gcNdganc6j , QBuE;b11QG4 @E HbH\͘9w`l9Ȏ $/0o14uT*g h- ؆&nmͬZZܐΚɆx~`|l`afXYZXLY3,g;Q"erA[?\Tk݊ ) 1sH$R 4jf蹅3,{@Hjje)'L풁:D OVlWnbD*HDL9̬6dBZ(#VR^ " rl$RL$+&FLbW@prbLjoo 2\P(t9rN2v/ī<~M{B% /;o t Xp)%.Yh .^XxoI KŨ2B˗<+VY)!B @Jʯ &X"@8CCV!EBQ@F| #b"cQqMK!@fؘTND~RbZ|ܚ4@bZq1QIq1i51Q uI ik2֦G.%ymbB*5NP WII^TE)'9i@@xR|zrB !vm\hMLX<$%C:ilLkRc@A-%.:pdnAx&I3ё P'sb =IILOMI`>-!mT <NJ^*12"):2$ϏI )Y!F : ZC=*!#A]IHBW\zepU+#W _ ,heh @Ȳ ,[tyP@hʄ%. XS-_t ~ / XlBd-`Ѽ%(` GL?g\E|sp9> /x/3{/B[8Ax~x&HF :8Ӎi򽍠G;B[+痶o߿~kS 2|COt 7_߽7! ϯ^~{4h|Ϟ틗.]x2,+˫* *W8<{(ߚ|%4دl,onj%\ΓLV3lwb K2Ɵ<fzen#g/+MSk?_ cM:Su,Wc'/S ^I}i/2z.ԓ0?J[WH3ss-޾yAxŸ́N|2<i'./X߽}Cr:~?|ÇO<~'={уO<||݇ ]gswqbbQ_O{>|K&j:hlikjVǏ_yGA߄RJ#ΟLxL`:5Jh5 ~yamnݺ!sGȴڮ޶[޳f^kIG3zi Ԥ˙1A渐yҕ/lʊ?ÇwUUMMߍD}FMlQq9#yO?۹{vc’󺺺KW.5_tuiik/d>u}voQ{O5&F:`8(ĠQ;$8ɗM/oݹ zT7.4wo=l|lz{71:c ū?lib<{G/_>Cxy[{F`&C/_'OSǍ>ml#y`Ȅ&hZZC"W֔W*W#'𙣣...g>sc\r8?Ii N37r;ZP?t\@J"e/;{̄fR6_G;"BacCNg۷nA00wH"5kM W(T0L2s芰 .rn˄xBbgka5K.yv۰q]ϯSB8_Mkqy:mЮk 4{爥Ĥё.[Y~E?} ߾p<0hik7/D2) N}<!߿;cƬյFM 㢩M"l >޾EU<'_Eʬxxw|<{~ysl,,|}}|aM^OYG&LҨk<>M޸q yb>x((hyXm3u91 auZڸ8{:~(ʹ∪WUUC2;O9~Knu Wh3{ӏ" g_{T*lrr5)|  00@n7ff?~ a0ue}w6\tE,XaZo|| wq z% cmggRpXl^SS|Xn'V$R9|T"$V[j CϹU^xrߤy]77LִO?~!˖A8.TwJk|'6ߦMf1^ͪ|2[c>źz4jĜTCصPӏ;vm߿ _ݫpnyR~Qw57.}Ƭ-4cta ]w\~6^thsv얌$&[X*Ee-͝Cڦo2Mrj Y.UL aբQms dagZЊѬﱃ ѣF}&rаj{k0qkWo,_)Jրŝv铗5>}rΈ£o\ So_z_ Znmm]]V7I¯Rz)+>vdh4.6m-[j_ubCݝUo?~xhhׯ_ eZݻ8;(ȯFsY,X¢OXQuME^3i'>026Heի ,en);˷V0itt~a[GNheJyO?Mޱj@٭՛U_O\\ׯ70ٽ~o@<&r/Ão޼z-$|}޽{'=}v?}ܾߟ__~6y)z:={VK1L𻧷^3>}a{XBx44Փ[S*ej`5|ǣƇo6ybl|f|ujZyP2tՎܺu;#U~[: ^emmm]}B|Weֳ#Vlܐ Vhͭ?5޿6F|t|D& A^s'$utt@={EyexD2c4}'3zg=(яfh`Wow7>yu ʧy9MHe]Z8%y >^.غA)fN^R-rيWÕeݾ}W #""-ͬm<܏9DNe3^?Qf/^`q yffnh=е>44y(֭K lo&S/Xؚ-u*VV#`_ .hy>Rl}Li-7Oh]C?  U mytʕ+QQQJGL+Cn޺JFP`g{nؐqı蘋Jt˖lffh=""|td_V] MVv(&*yЖ X9NM0}mb? ͕ݽ=CCztV{ R"pvq377ߐ~bLU#y{{CDW>|0&_Շl <sw\{\ܱLW@VKvjԺM]]ܑςK-fVE#:ϟMh?>/X0f,^䟔wYs ]7w q^٬[-nVS}  b5tPpȇO1]+C`)a+7l?syM-9{lU9g={8}֬*kLtbHhH,c;*Gι3g,@ 5݇'Lx=c2Dq8nrܹ߿3g"m$Jؘ1rҢvjAa՛FE >YdϟiY?Ν1m%$$Y[WGmڲrjD#Y@,s@hH1w?GZZv^b455{R@ll ƸױcD1/$tE\|nj :V̕*'O ڪ?`8_WUUA Q׮ݠK#uW=|B_Df%bUVseq*?pDjX`aWW]U<;+dK7wOWh'~uUDH$BCFoBs~ƯƸU~bDקgPp ~7nfn40(0L,G?97\}UX@x3sZ!|7&*F߿._&.>ͭUvܺwlloq1<Wmu֢_Λ#ݹcGKF<'/ i`Bh꤁#Fr̭E C,Ћ(G4wd@+ֶ.,Kvz2[B+<;ҺvM/ ' mEve--mG*|uBWNNGM'ڬ~ﹿYfe֕Klwvwa3[rqyGEF؈vڏ=] e=nmn[ I uvẃuik-j@mdt$b{wlLtPhm|[;3nݼpɲ67}o$\jpTa@/\D =yB̖qh`pZ,!7GfncޡS')m$뮠 \+!W~s9OٺuX$Ci%8{Sx |dGi;űLШϜ;kie$`Y{+/N;ѫ0>OӷoCvw?xdh32J,Acζܼ̟͝R`BĐ2}eƊ+aw1999|j'wΛyy I :NR!V;g7Vr{oh~q>z}[dÆ ZS/]쩺.^8Ma9yW=\\O?oF$1Haa->rvvvP:;m ؊+jkb,xȘɷBܶ$47#)*Y߿{J]fo_Oo\T4ي[ sU{oO@3s-WW8ctՋnnn7Tδȩ`իU A~X+p>}/Ra%5g7Kݝ]+WĊ&77_^ݐ~5:6xH)fK5L,buԸzbhd8%%r܅Odkx)o͚Z9z͛a2rUZW iX] !d2 ǬWIMM\x1>~8fGEu\:;zo3JJJJQQ?93&&n``@ztx 2V"[GA~UO5|Nnrrv߾UP.# 9юM yxw|;;C0^'!^KZ))n6<윂~9<<8]+K/àϘ53#c8$$L&?Gfff0AiVDDI԰W!c!l/]_y'n̯ZWXy¯DEC8~AA"ԉ k/_Lc)IXM'[7Fa#tuUTlWߠZˍHr5[+bAs2!P_upr|{+m81>Ajg{k[n`bۧsf=Zsda㾋|lڵPKeo>ӎj,XJeneO^CNnٓ^^ Չ6&tvË]cbiWrÇ̭ĹyE. Y_2Yr[-&`ѷ הW gӦl(īmmmXq/O 4,n`p~599 PkP; tpKk04>LoY>}N#+8rʕ+vvvXgj5kï q'¬ vy?M,m޾}OdGS?~KIIѲ%oR骮es"22$4z<׽&;zBÇLh{W[[IlW|}螆{Mc ^=E,TWWw*.)4840H}?rD*tx|̋M:gY^z~ՎPyud,b3g"nGkצRdFD# NNLRO!WWG#XZW?<}Ͱ FA3OL,^o߲`[rJ|ՋCw_pq_ `>ίUJܺ 󫃽=Xc, FJ񣇏g.X{] 4ո5kaȃ0!j{w+ VV:8Y2[$gqtdﭦUrj2֥ .ZG^'ϟsԹoj'_-;L\\\={G9>g/#GUҵ[vhX""Ђ CBS}ӓsX"2}xVcnM귵v U4/7h(ֻxz%tZ\q^^u˂hwikeq cX ǻBBBlllrt4LdW˖-Ckِ֭qCƦj6o>2'))Ep.H;:޿%TaWztě7oJ2vG_ˆ#.]svP:R:00nLT ,qutt 23(((hO=D0+tZ8H`ll|\ïvsL?jldkg7k\ʢvr\Ƿ,,E̬.q&w1X55ؐng/U9GD''j62cWIbݡ{yxL(n?FKپ9ьȯ4}nD=],_xY˝:}7wO,`%ɖZݻr#4""tyH?_3s}jr ]룧/\\=r6fj[!Μa&:6]ݚVį> ]Q#m[;Zs1U/޼%_K|M̴5lWFR^+I<79t6ljsӇnܸ`񩖋'voʊkY:8d~HN^ž\Ef֛+ !^env9>QMh6 32:132** ;^tFD{>G psR -^T/+(Jҷ;.Um26(DO_7VhqeX84hj,>T ;|TlL  _bű98l ;hDM*%a[]WE^~;lŧT_֖ .DQYH,"`1 XJh}=%ibr[t]^I ūX!\\W'ُb4pqmImjVT +K/^_86| #1Pl~} ޽{o͛^rw@wk řn/\l#ngن珟-Z :ӎ„e2.{|; jW9rj#9pd4":gÃ.]_e/S~u"t9+'U+ Z8ܺq&*_yYWwQ=)9 KU??LSWdW;w*` 8({d臅 [iN*sp0bᢥ?~Ƃ`.J**revppn+c#>1dצXw-^2sN7}oh;w>ڽuľ3o}pN#'c~01>iblܤsn~u?bWJ.5]}KEb2#:;Qa1̬_pر/\𡰕+Nh-vx1B,խ;WVw-_RE穬{.~ˏ&ī5<ܛ}GU_]2†Nɝ;qJ9kޢ29ܪ]Aa蘎Hqa]陘ֲ>c ;vS^!ՆzѩF;Ɇ%"|52;TЃW_S!X ̞P( Xmje-g!yx/ trrZ>kpۢoeG,,;:VkHc혩5%EbE <}I¯Ι3? s~{7^YQ#W8[ϴ0[[ذ"c~Dgܐ wpu.yJJ^8F҆k 9(vrr2tUD0wtld<'' G(Q?sG$o6SxkL%ai;̆SF*#bGӧO[ZZ"ApPAKm,,g:::_8_ u>5)#pĸLw 5. ZtEJrƹGGt#GA=vlߋ> P?1>6i]7M7:Z6m]le^ K6>~a.:<#&^O߳6.]RZʭJ}xɑ'B FFiZH/spuU+x/Yw΃ܒ1~0}T]tEHJ,4t9=~42х3e7d.Zl"xYتQ=֦_x;)L5˃Wi8;y_)G/w\$%8,\"ݹuG_raD^f1~gxJ?>_;;z<ͣcmzottDz90}d_ Ou ?mAOFZ[zƌ~hj :S8<4WO7MlUF5r#j萺{Ǭoօ_O2bO/c`}ĀֈYƨs`tX]O'L!E*,;u̼=4gL3e*1 &1e?ѱmĘv4)RˑޮA6@]pOW?tTXA>!L7&]>@v* dQng#쐆gS'Qq t¸cCc4=#\ {780Ua)lVZrj߱d8]G{Jm}0§fִn.ݾz+6Ō_v]dѼ]sj1VEwMõ8 mGaɊK^ḳ2I  ݗ~O~ (8  Y0_Ni'S4j~֮].]; \/^'>yI0*!,3!|@熲2dJK_HC`+dKב)spp o[2v9F_!]/?BWD6߯^k"WMT:`a7B'}cg|P׃:8u0&[7r&KsKC0Sn}/#$#6O{KAfedRވULUА)RU e$) ?(-tx5]צxGiÀ1+@ƅ_Z`NiV! JnĤQ&GǨZ8]OMur 57< 4XUE(7IIlb:\o#/؛᧶{5-[&ݹo/98WO_l'hMId ?SVHAiyddӌ48F47@92i ۨ/SEB7*o䦊KM7,oG.1dCSMy:9ڶ2Z柼<0"82&pFRP ~D55(_7i#Z֘tcA!Ww+~u;ܧT*'녺?ұ)/N; ˏ/;=eWZޗ<{SL)>Tr4=)?f߳Z@ƹh(#5J㞎2<]#<)0сqe@3F+01 M2֕aZvD?ėIL6w5Z8 7Jkwǡ]slpR殃ًtvػ}3dmt#v}ފ-;kkw g-5۫mA>rh֪;쬩RY^]VY[- +K*+*j7TnLq (\ZU]^U]Y8xiUIyUq撪FPUSRZ_R^( ()+,(+-,+ @WW_]P ՋKegflPQMœ<f1۔Or7pa{ (2HJ%TAl ťE`J KKiZ`Չj1:Ź9Hg& ׵ kyeYIY `QiEUyYEyQI1*=BN1:WJp(͵5[˫T@<ھs˖wٺk6[ܿU` 0 {h?q={SB i51Ja;"e)9`$܅TԆ(e t@HHj֏MxC]p&n#J ܅Y Cp_] uWb8t݌O F-~@s )ٓcK}-[E&X'thXE2 az<=Xdpk;% "NњGl!Ilm5Gua_F,帕Hu d4qʙc0ĦPE_r\[ڈ64.ZѢ )n ޞe"݀Q,u8LտX An-fxlqUn- :`F-7ň`h@ T$iYAJOA |}p+aȁئm69P&?Rl8l!-Ùqd%3q s![L!؉KI=PKR-NI>$UR'R!Nd#͗gz=;*/-%b\&EM\EFAC8 D +ަ){-YnÂ(Vr}𴩥bʄLz +Ua#sge(F %rWlgۊhn ~ے8{FDFH0-Aׄ{8vH)nOR :xٺu/OW'I1Q1qI )Q t46:eb⒓RSRҀIN\AC$'Rp nMr:h6u=!H !Ԕ55׭ݘ.3#}`ufnY 8 #=sl $Y̍2PΦ̼MHyظ!*g4fm*ܘ0{SInvYVfqVVINva^nqnN ?ۂҢ2bGqQEaAEUy,ŭ.QxsYi [TV"j{U6@em[e%[TՁdyY-HTVl|}#[VUP BJk֐GxJ8eVT(Q^d{i1n-.Z=8PbWI(l^Q|=*+A>v/u\D8$SUFPab0lKP+\[)!?,7R -eHV)=-ţ쬢|V :|SfAvVt@%6 YmX v HK?.MOdFGJJ $>&9.ѫ1 qb" R𸨈بU"VƆE ;4:IN''=3sLdtOәtNt'QcdEP6eTY:DMb&.hL\I"F؊UWQJs}{{Ν>o, L8 I) 3榥fRgL> YnĄiӓfOHO6= $&$&$''HIN7NM R9uWY}Yy-tFh[LQog6'Gac`YL8rha̬8<$8$ģ8#pYcVaGr(5ϋӷI?!D-pWwADiDdN@U1\0wb oq7娛gm=G'Qُ2}.9P@hÓ#8;vrw_>La@-ANzGzш#oΤgnѨ:wH+9CNV\K<&zL&- GGt=^^k?8mO^ө#qi#u]ڎvMG{OZ#Fݾ* ՂunbKDps2SP(gSS̰tLo˝Μvvig1OP( b}&m1Br%$ i]aK^ejkr%TT)C5NnU`pЎ’Ҳ|1h;SRMO=Vq⽿`n B=[9lœUmww>-{ "9qRaih"?pa1>7wQ$.mî]o!\~IOF>XuWg=.p[Sﳁ/]^R egG\#}kP9svz,p'=MXN,Չ&,mK0>|wV2 !a[NBRj{]ݑQ6oRۢ'M,غY߅E\i^0tBDCm6egȴ߬"nCrXïds0#yV3H\p9cNVHvtڕ"""oll _{^ D`0,Y=%&fJU,Z5(Ҫe+^B]CJ=yB$ثev7BoOyo1 2rU=wܙ3gjjjsy9w\mE8#֜9LmmmGpAbR./0RyIr8gϞN,y[kI9].Eoy\K.Z7_pW |.'Yv{@Ciez0@wYo]%RYYySN!p IRdIN8Gr$uB rO8 )qC8rbTOepUUg?~ MMM^ݗ6^\\grT #ݻ'M()oUğ9S91rԴMx F%pf*`vne`P uuƍaC3Sf-]As{G&ttt:86`vNqz~~̶p zا!m!a$۟gFe?pܧںlzd-΃3ad/[8t$dd?ʱ0$C ] ~A8B'fJ}{-[~6ϸ|ֿ(M)Osx{ty'N49jwVߺD9r,..!%%-qZʺu -[8-)%ufB|XKVӫu#O[H&>p$%uFds短&c $^yT\\lt̚>щaƫײ2sLrP`n#3?ٍP%93ݳd x`vpy1ۺV\SXTbaȰ|5UZ;[ԪvƘNJnmQ46z@yV}QqC흷nhHȄvUݺ˳%Fs杮.A"(^u^(ƀ;DĒ B>SBf;:E|R( eG `[J+BybTlˑ 0]7:*P(|+JB9d,P( Y`/sf+ HxVwEȶt Yɛ.9! yCNyUſ ^Y'm )G>y@wW&Db3t\*BBKWQT6*#j(>?_G*J_ (qz   ڮ,!UʓxG!Y2E{o~m@Q~L NRS(1ݨǛstq(Q@̉# BDȦ96=sUL%*)-a/8lY婪R( xF*_3c*/WH JmvYG "sD!JPi <]sGR|FB*J%8*Rطnn2.bmDZZ ,U 2 Ƃ~~+^#VA}~Q-ŮrzRW|}s8uG?M`ENOP(ιsҥ߼(8_,RpGR^o6Y,rg|ę ʈ] ^P(Ø ^uW4=s7RIzjUbCܴ*7]4—˺yLVO8F[Y es1ctOjQGuT`wl)y_/Sy 6VqD+m_P(A[׵n"Ժ(uK6V׶Hd]) $-{b7yc]-$t{˯j~,l*0Y}G qvR*Fe!E`G/IM6XbcgX>Y+{e9R=^FN>ttEJ_Ӧ-YJ9"p)1]dެ87BKC Bs= ^7~Ϗ, ؾ<`/[fYc^i17v7L-#@P췁 S`:wQ-T6[NT_́wnNy7x[NN򂶷C_(:a28κBԭ ox*>qђr>h[k}h)=zÇ /ՎOpǔ, 3p\Iآ!C~kߡO(DKq;}|q2lVqa-9y9u`n,:XUVVN0aׯ'gK7DLY^N^tt_Wн{nɳ~-pέaaa{ִDOڴtWmQ_mhWtkomoT\3 v{큁Ea_~~uc|駌oi2-7.de ,6,,f3}OWfo|(Jw 77D endstream endobj 20 0 obj 27916 endobj 14 0 obj << /Length 21 0 R /Type /XObject /Subtype /Image /Width 456 /Height 94 /ColorSpace 3 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x}`G"k}tw{{F6Nd4A$rAhF"ژM1Q$8UFhZ=^_zUq<1 PW駟EKWV˲],.c^t宔GDr' k[nDxhQQ"2ر&546ʇeR7޼y=,{8jnǖw~by޽<۔2a|61Ƃi& ;޷6u钡TmRoU2[U9Ju:03{V:WޤJ +?q޾w-)Jcx[IdJcx6I&ZnjaY#^?c%0r }il0";΍bH| ](_*]ryd`M>E sLs c"Lu'VD%;|-O1YIc D` 55l6d0:o>gϟ`⢂}s ,TTU»4!zLrJ!,SMMիW/_|Ӎ7]v3dg*sTL"7H%( [MW)w(iAGBiF`H6i5M 8S|%AgX51=qۗK߼ܯ\r7n$tL(p@JʕKp @ }<bp!$$TNSzRL2#),1D 5R(PyI2BWe |@5(Pyyy#Uj8uuuu &'55&pU@W C,Ų5؞2yҤIV+LIq!ꞯ ?S!<1#"ïݺ-4MYϜ5l}={ϗ5=6npuփ ݼqSxh؍[W~]CΝ=C}r*-r\~֭;g2;uV)9juRUTsl>JTEDRjIN4H5pYojӢZGϞwel71]q:n.&?24gpJ VmGL#2 K%d1ܔ!>ulv..b>b&$;yHJ"jJ:\krős]Z*4sl匐vrt.\zŋ%%%1]$>ů_|ŋKJ.bQQI1&ErqIB&ݬHv>y*YR^!܄39ޅ¹yp; ?P<<…S*u+w^\\r%icƌvYj/"h4ƍ1Vo8aĘ Mbro:àmV!ZjƏ5bĈZl6Cv Xn `t7puڮVKGevj(j"TwjjI:W hM|8ꋕ&GUg*Y`wڔ*WɅQqYP㘱EYA~jjgB2Vr9KȞ6+_Js0zTOMd6l+@J7%9*. ٓ%KϞ?GsBw7AAEL;4D[.@_\%vURUU&ޚθ WK2M'<+nw~0KVbm)(lJ_( rX Ƣ|bE)1$zO@)I=RlQʚz$U@q36I$yB-#/Uڠ*#,K]C9$ğ *8VJX** ,E{Q}uJ ⪃u@pղx L ~zVwacD 陗D*GwX*ŠR+f]|+9m`yZ<ڡj9<@JqHU$MnKSlrI9>a'Ƿ䨕jRA@+|90`k}ե*W1a\   bpˁ Զ(8ʑ'|ZZЋ?ZG1?B Z $e*O2~L7;x%z?ZZK/g;3#HЖD(XG5%3 0ŵ(-B-^8\`)hOF0#мqZZ1U kESiأgi <&06!}ن̿Z 4EzHQelpFh~cϹøK7M2rby360ZZߗ^8\dBҜCf;5סˏf?E +Rkmn\FB-B-^4\&􂎈0kz^ۋrZys$@[.8)Tl{i P 8@ܸj[0#RJQ4~FY+z=czz V%{Xă1x+L6;Nh2/0*K9o8xnaԟxNzq>^}6s\*|=.F>nj!?ŃŁXF-a1 pE>y+؎^^`eH-H$,3wYx#?gy$SNXOx$p-YO1 !p?tbhƫp?͍K8Fd!}'>"NWs(t*M$0Jg ͮ.YN56A@^, 61h?/QAkZ+PÖ U)CFY2E$^ z$t_/Wn0 q;님x~H olj7m4)-RUS*]LV. WdʎcHyA*֡oIa8a3w4q g?+<):G$Ӕc (CB C"R"%K3H'6\&;X^;(#:u.a9O e+P&E_EՃ%'䆊g"Bz3O8]~41l>p`a} 7i[zφ89Nނߏ᧣BrLo\3} Cϟ1Ӿnh\?/Фϱ&Mҝ\)wdDU#{5Zȅb cTrN5&֎s֩\fKuTKXNUvQ~C Nn ,rnoA<|Vd?V MZz6R\jUS?FNoo˗tx!E7cۚ-Й̐MR\܆RuJ6zWV9}X/9$u}X_/Y.G ZHp$X95ma]??z'ANG'JN}O)rJKuO:>5U҇sMQYn;$R=G~&d̃uTiN(ljO.e!!|;d k]R`IrMfCQ*,]> ?hòw"{p 9*mhجn߽_Z[Su7lBxPN)eXAep՛(ZuZV].Y].q¯7PA]Y2Rk'+^4P˟F6VK/F]o,ӭ~kݪ;=nE|mEM]uYꊊ򊪇f 2-)#yuu5i{(kUUŃ(/g$1WVWuu ^a?a)KKK+** 2dBŀ 2XVI%bL&a -;ᨨ(3wIK ~Aݛ ,f3Iďx4@+e_CCd/mUM%\ 1pT>O-BVuuuP*z" XW[_W^YG%|U9HK Ӡk-ibil7a0O&e6SP7uF^R͏Р 'i4 &8!780>)WPwlYofڌ`+If6[Mf\6J O,-0޹skazEFFF 2勐f,<\{կoﰈS&Ǟyx>_sQˇ`~/o12>~,Z<('˫i{F 9lX%kVR_͝+mo_ ׷?^I1Fw4c<>A5hЀ㜣pΝ9憆EEE7""bժUF*烲&L0`Ǝu EB%;w;y$7W_I?'99l)6EBꠂA5v֭Çv={6(lbb{ Q}< L߾ WT}{EFK,[  3>>dcG=lAjٵǼQcF;j̸P1RRjE3;J'8iܰ6nZKSV`1o1N4iBtJKuIɓ4sgwsc!kǟ|)ꢂ1͏A :xG}Gڼ6f$eL4?2`1wiḧF=n?^`Ҏv齻Q{A B9WiG}a0J|w?h}Qwy+$D]YQfpΜË_$;ò_o^E/E\G%zk׮<y;fg6ۦ + P}~ǶYYiẦ }W-̦{dgu#Pk Ox[w+R+6Ss&]ub4uCv3ٳ6ZikθIEoϽ0/)gWHAz:ڶ͹Ǒc!2fM6CnJۼ1:J'Ngfe‘@/wIݔ9{㺴,葋 ~wׯЄc#s 9}/k/w!@fzΖᖺN^zĐnzj[zM 6Cյ۷Lۜλv쮮ܳ3Bm[߾yGZ I۸>bl2 Gؑ֬r¹<ܹUJޅJq1gltqEH/<6۷+n"8}捛ӲS7gnXw7Xc%7{ .g\vb6ӲW._7J׭ݴr5._"+5^qs/[Es+zcf/Zp傹JEV]` |kz.cg SollbMT>oy9Y+2M8k?eG˔V82wꚲ AWO˜%9 b@_,'w-/s{9k ꂼ0.7SB Iat1b{Y{M"6J~f,Ɣjl]/o ߗܑS^lĺq֒ωb^Ipؾk'GDfG9I21Hge$fl@IִzՉhP$ {Qؿ|+CЊ6Lm+c06Tz6mFja^[D~#6,l09d3;8nBC:tN8{ɮ%I,W.c{,Rl'Oܮm:_(>~Ox(hjw}ӿ]!e1i2`?ATL3B[4RK'WK/q?}%BW_J|gEVV楟Z"Lq-WSnەBbÔ*E%ޔU!D)*rWۡ9qvònZJǃI#K4LbN$x"M;xS+tH#'p!wYX̜48Sr:cd^ %cE`WHW>q=Y|V.}L¸s"H"͍EYS$i kLԱi3Yow+ⶊQi-C~KfIItdTmq&ձcqKY^nʠ;zHoYGR46+O;(&E.-gNvY ~Kybq{[jR[I(4L.@2`?eߕuS7rN!Qv%sB9CȂfM8^3ZĹt6Iŧ뙐SbeɄw.:!2=֝;4TA_ R mH_>5O2ԪleP;;u?TD-lw >V%%;iJQK2hc ZPk3څ7I紐Ь kx Wclug|}_kG&ƒ3'$٢5dRDK3]RDmeԠ\(x^ݵ$4F!a?Kؔ%\Lw] Z[6QSU^H!n'z)#i$SO3'T#y rYՉ&]7 ,'Ma%~;:G!0"綞جx`θ:1-%*uB6,4-ӟSdZ籢y_Xv1''[gud'Z;\roUjvxDj̐EJe7'Œlhuc H C6XR شӔU#\>Ϩ۩j2.CÑE tF*w]Z;FkYv'1i!=YQqd.6Uëv+Q9.7Ͽֿ*@V/u0h5iTB^hMDhLݯ%CIm2됇c>bMXɛ.[dLeÌQ .3ljY27L!#?7-d4Ymf fK%λ!.wXe9BwW_6{hgsg7.]mܹx'ܞ*W%r:x=I뛻{3ouTHҚ!u ͯeZpII#ĘXuPjʨ'OYyMA md27fEE]qrY bb&r.C8pUupЮ_Z싈^Q-XoȠZ4]Q *(}_Alo9}{c` hGW5^YM@n:7XEp@z*(Mh V^C% :cb2H Au7pU" zj"X _ ULeXFPйެuK1nj6MM'kLXdՃ hYb :WU3@ cdM4"#chɊU}ĝM#ǥ19݉St/zy 94wbߝqQE}Aq7g~=ԹD5vr^uz~q{G\__?zSw] =gϫT%^*,Ç3:`ذzPwu#F6c:b{@MMMŌ3:w\%*fW&qmVjEYMf+aO*?(2MuKP  ZT4l(kj$.VZjk= 2XV]yа3TJ;^^[F Lr*xcXv6["͟Ng4S!~zYtSLn?ygd ^ȻPt̍;;?Zw`gnܾp.T wBa~I a';pCyN$)޹ !irܥL8y] W ,\#i2QeIK3~]$|a:{s .y T8DBץ&DQ3yԩSO 8D~={ٳ`g5IH"w| o r뚚fU3Z1{}߾{dO#""284lа3i'm6hİCDpi]X#d՚"emZ>}"{;B%޾vgRgd,\΀(nӧСfM9!I `_Yyc" -޺Np~nVh/AW?/]f:U C~8.s)9>O6n%{G=Q7OEEٳ z= ԔtuҢ H#44Y.\y%~*k.]V]U=_s* o}K|k<&& 5UUWE\E> |QF]51ƪoΔٿ xL"J̑6kEVs+Co eveszv>!BWګW2]5J E]XNTMYh7ygEu'qc3Bntӧ"0 VWW gi,a)zj]-|pr6HFq@ʫ(] /:*ٞmmWPQY+ dqJ% -/d:wavYU}ۋ߸mf^qGZ@Tja,^3ʈy Wꏙ$i,`Yxg8sw=,!\}> Hd 9jO뗸ߊlRa ^)-?|Mm^^g n\n3Z,&f lmC{,ќ aAk SdWp+l#l[%׬8{yZ;HׁtřZp98~& )9WȖ.6?PD)j!t%qsxFذ)xMU4|iXhS.GP1Vr3fq {(8`9s7_ƱVN&~E iGD-Zz.] g=` [>ڞ^`@׎ȁe .ͳl祯 +Kֵ|~rJ,?FuNI1k+6;]x"iyyܸQ+?G!hoOЬTnhQdEyǯZ^`j烫\i]ڲmSihmiiSͥdž7DZW ¢`Tٖ10% m8nmj/6B8d!!˷hRV\'q٨-x) K\x.4!ۣ"&rxfdVOqt{W@6ۊXAx O 39%ɅId%S8'e.%^#}$Oe2.3 |),GvԂ;*ۧ+݃ԪmOX_9o3FɸGw ^g!NRJ-mig*iupZwU%P%h*`x m)D6\mmYeNۚڷ!V@Jƽ N⬸Q#<"0޾޼߬ӹw$jh*0(M*4]hSUeS7|b0 QB[G0P)ٱ%g(0ʸgU~RЉ>}6) V<~4^hZ6I|5-&-0`f ?jWYg)(!mTEȠ+zU,jLIƩS $*^gM&$_ܪH rcKH=c;#-_"23h,Yhx~17ZVM k#֢"6m~ 9YiǑU%ϋ6s]@ii HD7(s-h&|akQu1Ý*qRt =aa=O<|NSdf_9W&.AM8y$| Qe-OXrymM=ybڔZM©SgXZlAkO_%֘U7 iwtlmOحd%+bd|eNNQk hX$Ih5F ܾo\'y!%|6_Mf%$bH% O_l+j^?6A^E#'hV4FBBW_&&phyCd@^ gWPgǏX)b2Y 郾5.#K{/{.DѣG^fpggθzڐ!CΜ9p)S۷oEҥVx֭cVX1`\R>|G 6]xyȐa۷5k3/gW#GOعswuu԰`99[BCA^~mUucϛj?it[X@ysrxm_MnyGϝӷBW K?sR6+91I:#DTB-qm7=H LS*v`ٷ*${7WkZ'FRfZH ZA'B[tcLVsqx@Yv}u~mB`6FyJ@Qb\%\>zB}1#>ןz-Ӏys5(, LolM37.Æ7VFL‚ 8o}pwo?`u̩޽+ TUUsԙ׬]2ΝG]|y>rs!#oߺV[[gNv PSg͚u~9rl=W\ jdY/|W+߹cqFr~<Ļ~٬CP(MR_WCS=#q2 =BIX0{>~gNJ~%)l6^U p\qԨQmyv}O: /~>}=fKƹ@]`!xԂ/& Qn)Qcp5clEP6o^z"xad@|__З#J)iq7`ey(8cx˒nqc-ik|[ #䧏>S~ Ca#ߋMЭQ*ZǏD F `;v̙ݼ~왼Ȟ}VX O4w)޾&jӦ#Fc5;JTV\}Qq5GOW)ӂFDY4iN5'(Aؠb%'7/[riZB7/&Th5B_lj|*KīxY{CR1i!~i|ŀV?`6 O[퓓"qSɓ.\xM6_$Qk%yLLx}Jt@x~YY':IJqH%.q? ]\}1qLVh{x.j͊n!\eWȇa=wtZX^~ 'Uo ~GSHcΒ4ʚJH6i $c\5n`;\y ufPgvd?7W^Wt#hO|6~qth3M Md+9y.*OҹT$H5?5L$zJtL$9K]ai(*X4'}*zm9,_ 9 ̏Zp UJVe-qMgftV*ssC*7p﷿}[3dm~WۚƏ1OfNHyASBY5101a܊>% 'P IUG[4򟬗hb3翠ADdw!1Z'_`36r,? υh.#qarkΕ=Ę qtmgW\y`\}1q5[ 7Q=!նxótX@CAgVezd,!oBF~o ihINqI8.E\5^k4ɴ-BÛ;o9 wFH0hp}m_-KE֙4nE'4NjܤM4' l7,ѓpI9bwJ.5YsB#<6NK(9G뮥[*0}T_< .kwG%凉'7ӨK&dҶ1&"Y"fAGwCw~+*bhWczUF\%2܃q(!!8 f+-BcX<" ŷQx^쫤Jfv %[ɳVn B45*o}r7ZLn4@ WPۋ^4ѓ!}5[@N@RRG;]?Z"w22kրnxZÄI&19Bψ-*.8?}_G\<]Β5DƜSL.q5+͍*j3W/\EcL/ :q2C MPcDqZqZ"(8*Q%]pQ `*^:W}\pw2!|#B<\%pWlUܥ@w&,Ґ"55ɂMgjDDvl2NVl 薣TH>n[Y4by2^iVД'ƴlڹs U;o[lhyŔ6hР^z?v+Ʀ+5pb,}h1aa .n*i[Forkt෩:HǭrAW-<W m8>\"0W[P)lU` 5&LBjV 5^c$XtZ4I!Np-n9juR!=td줤4SmhWY4/\̬Y&NŊ)ӧ͙MF4w۶u7^ܶ}+7XV21;vn-55574Y֘񃇌8{.?##S;vN'O U7IHu~#W(0gn_j_58vUs̤P-@F:$p44BF'U.U~.SL=9*CЉSnBʍ$b_1Úc._ۃ7gdB♶UU5Æ,lhq{@MV3l8۶wx2HufOƌ`gϙ׻O <¹4 1[pD>T0*{ MN~*** QO2cʈqoy.** 8eV4<ŝ?{NR;qرcgΓ.>ACIV4)έ+W۽G[dWe_p& C;B2O4O36޼ZU'mۿG\k[?+v栭4E0[&& PqF]<9zr\*ǭAhG;Ԡz6ZcI&]^G%¸jY36b_dmCeۖz1(*ֽ[",efNcnRp]d0>]^^>O X 뀫 #S)*$|Njcbjb,6zZd0Xֲ2޽W\+((,t͛!@S[ EFO=Ry`t咒KŅE%袰xMV}YQ`8~FKW@/*_XP_PTTT\|ҕg=K,r3l8'OC/^ .ɿXTR\r+W-]թk"*A1k,1j-|K\]x|ơ+2u \I}/" S<')USΓ&6ΙS &"OKSs5f!1S%r9J{K t:@]#̱q}v‹%pQ)Ga!Y$OJ&&0I|D/(x䑲 x(K.(A$#"$ Iì]&#K4E}@j%򳾱*;!ݻg&iʔia"޾Y_Щ[zP^[Ll#5Ś1FMSŝ:q2Pt>aGXi'5VoB+rqS*/KCq7Pvһ<߿ۤīkEﭾum@20Jm֩m+wjث8Z֑)̓Co{[$)!9}{svNNBZ@{ur=or6pƯ\X!!3ZFFǞWCWe嫙C?ICCmk+/(ѪUs*W?ՍԃjZϟ WQb\EC-( f3BkWK"Ր:UWչSX; ZP!-H/ $ E!$]\ 4-?y]8uRfQ'ANhHŏh~%gO7${ I}jj*R|`w4@_?ʢ|Lb*s%ސp*K3ذ OOOqYa3DӧO%>tvv&? C]nޯa{*_oO?ܼ֚\S<}UD2C+ 8pun6\/X*aV!8],3$|]Ho''׮/|@ُ]Ȳ!HǾbp}(3==d,i.]7ٖ<&yc H{JʺΜ޲i4㮬/o5f!FwLSߩڼ,ZrHJJ}ee~W~>p(!! sWV>>p}=5k٧/%S39׭>U "_1nr}2UgŲ-ʎUw6U_.!VW`g9NڣGm?ރ^WѹqF6Aw\.WK KAF:8t+Y"C@;@Y/vnxpBׯ~w{ZZQc!C9?g={)̟h}m[S>诇!k0"'VBM9vW2|Weq㹑o K)po3A҄W);z~,!ϗ6/zLqp8/)6"&'{}||"7n}|aQ8]lk&r"_&WyUaΎr5??z1(lKW=+/>|W>3d*hrW34$XN۳M(_9֗Urii~NWͦZ|xF̈U 1SEtK%2ƞ_&!ƫksq&x[S"nzNx9DEȨuox}Ut_Km+:Φ/_] 9g_Mݓ8եг|Ud'PU#_W|Ց`m=x gER|jk$VWfLe <|c_6|~aa!bySdEw]Hwkua;'E  XsI6k CCˣ>@Vh\a*@#'ીDZfw*M]W'zzW"} b'P#N+8W啯BP9Uh>UįD ~o\.U˴:"Y3'UB[C^4RDHSy/]ksQ}󈯞_$%Bv|e&{{1_U׭1N0(ղ!2YcژȞݾy&bheGkWɾҾt_9yY\@*eY.5Du+9WSRfg\/3r@|z?y"JTMKK-/DuH$o]hI Ho^K(nZW/S\] *qb\W#T2!Fݱ^vIyyazV]_5KJBVutvq>rquSe81cLFJ nFN*\fSm*(}9Ve$';s_uqW%E )U2ˢҹ/ ޔ|'G}>RZ9GB,:$>DAJiW8 bΦX.˽VT rWDl9EӬ@h p]"c]|u.3 Uu+*ݥ92*Z0 WtOM CK-4%NU4@~`ŁO$FEGD B-]lz{f@Ise,CA8,C#AћE]18lن''mu zNJYnh npq>S][W5o`\%zVZ˦g*Ơ~?& )sӇmW@1 e5JC|tAwU8ݗ73kƘeۓb⢕aٻ2g}eǼjNyYb ]iSR Nu|ų,ZZXYaF.YW]OS UʰQ SBalظnyر# EF)f o".`&$DSvס{+෶ndZ&;^ PJ|' @^^.d g^ 1ٳ0rw|a! c[?Pvz\ʕoTP:gsNpzޭwё ςC$&$}gƵc B4B4ykLbܺnx|􀼎V8fu}v׮_}*kmW'VF鵱oAz;7ckj HC.:$8;M%꾃68(敨(l@6\E-#0(8) r1lJGgbx."c\ffhC2\neȚ5Fvb+ aS4C(X C|R} U2<;A”QF_1˵zRQp+yژEba)L|tFA4Um޸2`=rRQ ȃȖQBѢ1 '%q>*VTn"LUrs(M2Lu}= g΅FjzG՞ccc[zlT "p݋a % W .]ׯTD-h/hB3o퐕 (o8y_~yz[֊Ua&WrE i汑Q7LN>oikniIR{hknW`zb♩ I\nߊ[\RyrYLlJUז/XCsև?TyXb27>S,ʦgNN`f#5uuU=xS3$m-9QV Z"_X.B~mJ;_Ҩ,=6+>V;pcmc#[Wgy$?B&SucUglmUZ[mTS1āhcc3 3u",K57 vXWS]X^_]W{뉅q!.Qy Un)[,so  Q%e\.TTzyCʢR\(.:[*%r /X42Pugrϝ9u6̹S׮^5^ HB <~5d] ]NJpbYH;O-X*~+ehVą]W] QPJ`\"~͊lܸ)Wu+TPn%:tQFpU:sr8仈_7#4,* z"1E4>!. E VASDȓ.Tkº]/A$$i18x+Cu덫wUIHZj1Jz ?/̂}9 _Fqr/ifOnL FpzW\]~+b`6-aAʰ~+[H7DF`n,K$> stream x`G/tHWݽMB^6 lUJI ^mzKJKB/ CB Wt z3Hk"DdILw~~1Av?}Ԩlb\CR(s Vwb4)Vi4tvNo׊vlaLr*gjq<ĘdN/^a9JĒV+:}l *|sH,zÝz[<1rw໠R֮SVLRF:z@*R-ܒUsjjfQ;W>|XLM9C&?NѕujA[|qNK/nޕ1fLV1ĕ*tZNcl}H;PUc71da..dzeYLXhي֊.4ɤ3$ktcEp7ZIC}k5]E+kYnLio0xN?CZbNSdl __kP5W)ţtXm*" 2x o4%4mqծ7bBudo<z^ Ÿh6r]H Xgwر;UFcj4dL4ak_‹zc$^)!r…Hk32!@$AL%9 Kχ4T&fx Ο6m>t >Oxcor/-FdIy?ৰWer%*@+1ȕV";Drхgb}\q?To i{$/DQQS71` a؎@HnWdn,x1ˉnҿЍ{*㪏?~ PV0X$9((@Q9$sU!`+]91DX U[᧬_c4jcɽ͙ʴ 0~侹ܼ,yjNXԩS~ x*..fK/GDD(ui,ݹ*e0ի2#⪸U*]o0^ 原@<իcd^ԫx!' NNkmÆgJr.,a\\Em_] W;*U* 去r7JMey+>|ӄ><'89 ImMGZhnx  (6:*~`S|%teZm|&Qw-Z)Mݰ#nS3NO6CPE5i-w@_K_mll ޙb6TM}yҒ+[ɗIUn =qc 'Lr+mD{cxO' 4ի^j*yb3Kn6֫mYJ;4ի`ws5膫^|/9qzՖVPЮJTA(EA{aHũv/ W,OIwE.Vsx=1tyԅkM_@L 46J|\U:$J^U+DJƠ3YP]kG7$d2G.XxGf؎^hhhzzfBXIF] usfZh9]v/TK9s&H)Eۍct:1?>yVq+U!;n\Ympz؂RTxsu; as@}W WPm@x r^W&ZmdqMm~QU\uC.WmQľrvڱT4ί;@Ş<i$typc&M1r;t@7i/_ha.\=6frR/ ٯ/|a*J m'ds7DjT ޼~ꇟn&j[踛❣Gv2.`1yPquvR檂 ,sV2x}5b0WI=O[W}{@ۭ|i霫ݓ3U/[蚿*.j `}r<4- h8Y#'-ꕮFD_rɧ=ݽL`,P"*Ӎ[I ĀY{#ZBSjtj1n2722DU+7_P)+]̾{'NPPoZj܈Кp&Npb꺴Z) .wo֬/vX$y+1G{pU[R2WOq$tղ'dr}ջ\E8׶rݩub D 6נ /NY _oxpBhdo#&L6!ݬeY,x`C! {;C(ٞJ,Jb,Ry>4wI62!"92f{ 66XIvIԕŕ@ҡx<ީli4u]hσ8pF+QJ2OK/:ٯ6cXwo.#bbwXЁFadܾy͙oꌹsOޘyC"&Oy)2*\פ* Ƀ7oFomSW._./,,,.**68&^YGU]/x/]/$Ba~8m0xw_k>y?sG~A傋{A^rן}3~B@[ NbrTQDZC.^vxr򶑣U3.>12 /^/(((,r%ciwfPOBcZV|9#\"ʕk˕'+%7b-+:wRa$ b|Bł󗮖\*9JrQq K n8`5\Zj}ةP p2έoz'ȯUdenۖ7)7\ܼy}jq| <^(ey3H[_g<)d}!z"<™Xppjw00@^եwMͻ0kuxp8^'x\>j v}UϷ~dZ vbC6,Jw7S;UsJ6Ыfd7ϒKwa>˼v^5:ƙdoh d;T;6;ksPvX9;>;_t" @Ԟ|WP*vIֱR*4f&XNaӎMs8yqCsP'](?O {QDl\g}-.~ I;$2T8$76EmIFKjF$E% ": CC_ 2n86n `9xWTJ 'GBNf:g͈pKc^+ +N<}g"2eWh)K-36sEې甜g\S'j2Y^}yNaINAL<=C:ܙ%K?)TrϷ~VUk] OxW*"wO #/o]oe#ZkہwiwW zCƉ[yT6p i *T9VW-QюD@uJ#]CLbt: +k{WQ D9ڥX?Áp{0@);bU98`@~}^'5 Гs,S"SԁR\۬I OJiHzUI\QJAvJ‚ BbðV //^Dw6gv`K \wPmA zV<3g_V /} hҚc뢓L M#bR#Sj(WkbuFFSSa~.^z՗ؙgׄ)<~~ZN=yđG\CB&:S'_z饼ܮ::l͉/`Gv[zuf]^ǚ)W:v\Mnz*)}ϝ{^g~ܺME9<W_:hE+w 񣏁N;FÂE %j_}>ƅa￿֭;͆>ߌSk7n j>*XqUW\ TQX4.G*'_IW*N 08{`ڃLHaw@XI_uqIg:I0(Wωgmt{]mF"& ̗gg%cŕ8ZlM&}>㪏WDP_Wdt|j˄]S}ÒP1>\KQ傜1ARE*$K32'ÝՇ2 ޙQ8ZFKj *tնW[YBѵ6ȞtQ~'_qqǁ}p 0` bT'g)2!vUS}y O\wf5-^갫YwյGnvϷ*ZOm<ϊچv}n|k^q_1W]'lKA8:4W>jRNvt Vd*&}Tƀ߸3a!쵫wjp=4?7vj@:&G㤻{c۔* x,Ķޏ-T>>\u|| g&w2yll0/Θ0ǂfC]Uh:wSqݤ?pVlL-@kIkn޼ ӫ+h]v/'/n]Ypdݺԏ>TW[) j6nZҥ nߺk{޾}NW}\qxU}tsQMP4l9ٳfڲؘuץi4ƆwW7l0X@ox}/nZ[ZZNhVre&y[>ݚ~oisc-**p7-㪏]^&F#>XǠuj~\EMͦ긘_v40Hmk yܥR_z՛7J6 xaeW}\q#G. e:^mRihljfffrݻ6mgܹsuЕ+W_ϓʞ8uקU<(͙ vr͚8Qc5܀Ո痔iԫW%޸~Yo͹~ȑ#f%!!aN'E3_2S'N\rOo߁'Oŵ%;vvEsc:u㪏>v|l *'5! 8j&ަq)6h>-:J={w<g#"7oj?䓏>&4/4އbQmyyQ9;r+*XIX4"<=|{W{31>JZ˔+r'MءJFvW̛)mcsnw( T[MZSX"TƇ>;v|@+o8-0ߦё f\`2[7}qrNi.nKnٽw.5^*.  R3xJe^XzIj/;J'+& )qUW;>H&61zV,_W!X,d`E+bq\UV%{,{?#Q:߾vNzѷ۬M밒㪏>>>\#z_T3]гfV]JYĐmEnQ!n= /w1>>VǜLu(!\bU#3ޅVHP<7I`ӽ ;l#"i=#wO=OiW}\qOf!CCdN'Go'yk Sv#- \ϞgSʼnM lh3LaZT3YZ(+ as;W}\q*҂@:JdւrJph$} ?#0ow%E頟&$q/W_K]vUI)s̉vۭyr##"B?hSCS=tY+͙NddcGX։u::t ,,lƌ˖-+++tkvUW}\}Jd*P2H$%6~7I Fa Ol,?YqXƑ DĨ~gnj: ԈYf,Yl _}}-/!ɩ)nl`k6 g &M***F4rbE{+vn㪏>>F\IvMē@WcGiΞ#$ITO$r^D~cX οv ~R .#@uUok}kS pPY^qj[UQ 4DGR:mχ+8 __VKo!˗>}Z]}3|?7o\***A]x>8qVCzL!doBk6=QGK?*QXzJ%JE )z{[D'~zc۳߉ټesmi'w]sɔ|9^쵗^Nm2奫w߿D՛w}{KKtt~A)24̸d&/^ ޽B: PɷIR#e}/#~5懅;S!md@r_.^ZJy\]oaL)t^.vUפ:qUTSסS\:bT\EBnu{dcӇ݈Tӗ\#*.˓]ŤuzAR\2Wڡ֮,x*[h3j|CaP9`0`-a/[ݾke K GwTΪæ+uL?C⑨%ć-@AQ狜RQ=DA./[ϐ3k >\ԣ+ݦ޾p"B%+ oܺN&r?t@```VA훷N9+9p̩cG'LTxZΩS'߫ءi#ʪߜp*LL41}Gad:[_3&K!Vr)WT^ѫ6mFvñ٥G<'g y[T8U'$x\Lg(e]UVg7ƃfz8ϐv/\ݱ#}LYP7~/buёWi%Dg]3AIe"~h4ViccIb>-}\8#5<`Up%*MJb)f/\Xg 82ETEJ52Y^QCԐ3pyትT']]\-5,dN^1rvs+2i2[PQ6HEv䪿Dq`g,;/ݪXxd$0qV$6sA?SH͝6m̝TxH]v_hK{w4e[ӷ|\s'*+ c7jhlnl;{N崯ʿt9d >q˗/@/JJJܶ4[n ۪<"5$\u E:#w҅BJII\()./80D F=^Ggf\Ʉp8>]x؎<Vxu2M_Mc/,,,()vuWZjQ֯I,q"((⛷ܰ[\;>Tj W] H(q\fFq9r\HOMS7._^zRᕒWKqKH@+k@i^*Ob̋],^CŅ% K^wiaIaq5_^ ZHW^ K.]{Z=nx_P^RvbUwl5'QXh]n^sr I%uuua5ՃN8tб' J䊐 drj9kꆆKXRSS_}ں3gRȔGOռA._80 /RۻwRRtv $ȝ8vHqf\xs(Whs$@//++|y𠼦m*Y/\5^C@/p:P][SwOV ՌrՋzjz* ۫ݻS>A5TOfJe.xvߗEm_JyuUe9dv%>#K^ԫIuRzPx ZvE{+ݫ,wGzfcD$PU R'g;~##JjSS52LZ\l6wOk`8vK-_<5m}J3f7^ʿ(7a]8#_ϟ={U]yu 2#{>eʔիZ=v{+ߕK V'%=zt3b4V'CnEN)lcKs7hS޵8S0L q$Mv鲭/ñȥ^| '<%GvNxhЫOPRo7we+75*pF|q낑6ľg}V؈}rջj'INF6kfŽ8mXXv/ratzKDr%khSح㉛hai^]*漏,2r'FUЉ( e%J/ B VjG/)a)})E2C+e ^#v۲uHO>90a¤)S_ӝ dkM{뭷Ν;}oܽ{7"RsQN0,k$ګ3g\dquu5} EFFo̘r$.dlN} :VSzL \wǎn Q \͐詔?꿕4skh3y`zg-‹tʻvy;H\:h dp5;d|Lҫ#.s y-Gfɼ@t2@yD yp}G4o!:ʙ Is29tߤĽiy+dpb?1mceN^*ڨ^E Mk""J|xQ) X&D6]]Xkqgót%ҁ/ѿG| |dCU|)`2SԫMNr·LFggZ6pv"iP^ƺaæ>4MmknXl{ƛoJHv*d-#:3e1g{qtf~ av$]k}gL`xhUI.9qC0NgXWKkKLX[V?ʤ[yW}\qjA Ywӆ'{OK{_(dV,t.ySN"ee/9_ZިTV\ZZ抆lO>pbq>bY8oEbLTOKHk MiKjUM O:kYSr2 $㪏W1B}=3GOG*agv 7 9{A2Q.*1"6:8!^ZbRgVͬ[W}\qjߡ+jT#.?c;H/x \o\A=.nyEHZZWsM]z >*C \ U2P+޽W}\qUl Ugb;86W}\q>C %oŬ&RW >㪏}1W2+ƤpUW}\q{? AFUW}\q= O~2jz!>jA ~ Z ף֛|\}pؑ̑#҃Uə=L"W-Z7=55FVcjAg6s,X*S,kwW`ܒ/)πO5 NYQ4qXTYxFdw'"B^x,y0HLSٮf*yRSکV0虸-{dsf|Ԅ@,>e8\UDMR5.+lhZNW[ ):FoFš]!,[ǏfTY˳ !nӋoHN(5܃ 'fqxџo-+H% YBܮ"-;*>eXCnphH@od-GUXZpa6xJm!O% #Lcq \0`"j씫zJ`@xUE&6EԪ6-kVIUyH={~C3Xgp!P/xɼ/,Xq=:@ct_sx ZT0sYCji{6rWp̖ɷOWȿ^M̩5ǛF3E%RCr@ !-9 y0zD+Nc蠆; PCB-8n؎?zj"HVtbPʀNjF@tљ ZVcpD:PrKNɁx9o^5bDbQB,J9 EG|\v4&)n8hHk`.v8vgH5tZ֔I[LH12Tm T9xwUh&F?Xu @b1,Ip_t @ d :3ʕVȺEgBS:hX Eoϲ|17z6:yӃFm 2>QvUvF@.&5 RlF=܏mN > ymPӶ9yr|sdU ۡ2@&}P>'Ծfjixڑ Bg/e))ى < d3Y*(|W*!9:\bz3<?t҂1c`܂ |g0dagæ;vщ #R["^[V_ӌqz:-pR^ CAQEǪ!^؍^-Y“kԅ&7DVM[`6շ+~xaCt2 G, 0q+VKPqSX ĝMX)Sxܖq"zɍSz\iv\ f#6-YjPiZPap^Wvwk<@L4/HGW*gӄq *7Zχ&oFGRt$4խFNefo07[ȑJw A ۹^%7Tc v̀J׫[41lDct:hRy{ 1S6.;(h"$C !<`ho_u Н!9:t\-^骾<8xpQq$\xZОUb쒫fީKjbH7-[ .cH(Gw9oèzRɠ1EE8b:3f^<+aFU3?{I 3k pƾJi kkN^꿹:늧lNȇ,oogt?=94 g{! {2~ s,VS#R+M\Urks-|Tm skWe9v,t9AnFXw| NEiymGm1,k?+OU Usl%:ƺMTnՐd6 íĬ E#NZ##aINC>ƆDgbeccWoՀ=yAL~oμϏN;nGrLSӮCu j ̡[OJB2n'+j }7swUH;Tۍ=a8@w+@~JI;тS8Hƚ,;IC'⺒=zSJVWdSe6.ča}`dct! !fXa.8%`43=}9! tf{F2"N_MwQÿ5!:O־ ׂADFxwHCŴ\=AQkbSZA;~>q񛵉Y<}^hƭ>=6izy`H6Mr|YPKť{hTCMeߺѥj5kn[v'ե$/VV !ڋ)/Ȁ8p=Ea'\x:p˱nߌ;&a߭dž{fMN:ԙWR(;Y}Ygv^*4mʥgKТu`7 ?h> R@qo2y*994-aD#sR8JΧ>kMߝ6,myȠJ wsM!(39i_xO'{nʁl3PĔ669伙v tuU('{:5\.Q_^ĒFCĕ Q`=i)HInޛ_,Y@5Eʾ@An0+ӿJf(u(0fhi@tu}h£`W˒/lm|vf.5^}3 nFC7ᱼUwZJɷyO*Xýu}qPu|}e||d@p8F߃ ,uȆܹ}zՊRK\"Mڍ]vnDڤ',DE>e[ 儲sl\.M tT+e:nmx]7#4\?NK.pYQfza/7+P-BBm'N3m 80;gn^aYAY`q L,qE賆Pmii8o6E_/^픤ک+f,yv ,2*6(W driCZn52kɃ;Ҧ>p0}m9p@IR뗯ln(Gc36B0gawnٲ?5}פS'9. Xr3UelPlykb1v;uX.^7ugi_*-) /vR9_0Ll:7|:5qsɩM_ TVg/mǾ¼3򘎄b ڳъB/׾{''eS^+H$cˊ EgJdk=^okԺ~V s E-zG*bXNGzP ܉+&'O|МY= A-ʱJOFR( ٧o^Ï Dqٹ7mή _羥֮U_ *ڲ%L )z$+x/C{-\3 M瀣(|j!UndZHD)Nnx=7&DߡիNk}gDj|()(⎐=04'm 7+Tv4Ws^9!cY6$wZ7~{Z)]+BZQoEjiq_ Dكn-/ȼYճwvj&G *)^hL{8 ڳ4矟*]{u3#H9NCtܰ\3nFFƆUEuۜ/9~T@m88 c:g2߻۲wfmۦIRTZ"cb W!t7XbB^wЈy 2h\c' enj4(5uF"9i\C(HLj$+ Šy/5WX>e(! c bƅ({2l|-& = YւJdCϜUn,v (H8BsV,՘XFX`khM }VK#cx ~ݳ&?ί_=ccf}{W%s742}>Ʋ,7 q s%EifXcեeǎcy`IxVpP%0-{9fwXEIHv88`Dt72D :i)=BiGX=b("3,#@KA$NP"K9mcD0wl` È qnq2L;Π`@//XmXp! H{@ %,(<>$ D XfDX4P)X xA0]aX/&/H#ކD:z:i'ǚ(7O;sf18 hl#M(9]WUoY‹oGq쨌~SjblQ p>a E#XÃo3*͈F]Q:=j$҇k`'Jӆ'#D<0J9}U1'3ļ8%!Q;߷M#w̬w}/}܏?SBщqf2/ĈOODgF0;#պh$p;q|l bqWf4u#!10znc؍?hqaLͶҍmZcvBF1W1Kٿ[i]ئ endstream endobj 22 0 obj 27515 endobj 16 0 obj << /Length 23 0 R /Type /XObject /Subtype /Image /Width 456 /Height 93 /ColorSpace 3 0 R /BitsPerComponent 8 /Filter /FlateDecode >> stream x{9&v>{vܳgtvsmEKV9s9sΙT$1}"K%=J / @ׇL&#=ӳA^gB (W@z} AK ѝS,k\I\~9{O/J$k*J庮 L W֨1} iR AJṲ6~]_/gH$Ȍ~u*vmbht jOi\\B%NG2SSӨoE,,ԃ)5V}ݑȵђk\Ӳ:?ZHAnWE֠b:RSWESjα@AW!s}U4p#L;B" Ȥ2B.zꬴ~( !lT:(v ASqTPSUÇvU\sK /"O#+ & x<X* xBD \)w*}MvxrO~sDl69Bک鏎pV]֚H C~SjAUZ)jUg߯6&%md"Eu vJ\54r'Q*s8G{{;y4dookGrrQ8|Ț7Ką..-)-/lhGtF`WFmΦ! j%j(G/C\1(R_\~ՀKdG@c66bcAkAkk+E%HneeչT$:2dqnncOOllŹM>+**Ҹi_´"Z3sH={``@;o򲱱='Z̚ .+$]પJ A#GgKk+;[8S估zR;Y^ [XX˱prr0effneeNt&kcw/%-5"2GzzoONN4*>Tik-S*e<朦űX,ꬆ=88^ ֧fttl@HpTTTnvٙBuWQ'Fo[S%qO^&&}}g/&y|ayyۿB B##߿Y9Q|b%%%^/(*|zu}H d755F(I*Yh8w /,--xz0'F_y#c-sz+;pQ Kh xO8I)Pec}33#1`DBs^zG ]Ȱc}s%e-/^nk$xZR\oii ĩȺ:DF!SSSaא)hwL'V[[kddVS[1[[[GGaxť0<<4 /22 opyUU_9,|0~uuwG&&+}mFFCqP$xy%RhC#ð|WWW[[]\BB–W֐idT\gWk=ښƩɹW/VUցcJ@VLLL09mYWwƶ%)1 +ll144 <==44u 5fVNf}CHtaRXRtA~3խL;{f,::}|A/^5pSoHek[o޼'q[Ǿ!'G֖N fc#3jsSuzz:eee;Co[;cJ≩IO/۷ef[x땛ⲁx%Bǝ" e>!! f] L(j}]ȤOyY5ڡ>33%*2ZOOjIvРͭ\ś7!ɹ9)fͅE%Q Px@ǹ{VVYXDWCzs||B(~ TUNo`t2<++ A͍-Ўuu[[edd,,,`ȃR}SSq 7209ӃZ{)$",,m~*W:$zz^~" ѣGã#GJ++CGIbΚ]J_^VPBm9r{{Dt.I 膆8?J% >_v&C'b" 0 'M#^9f; yNvAqQ9%Zcl}I- 5?!2kP+ƑҒJz4M檞vbCWW66w.W7B{ G4VA;Orvh QOM7d4dg-΍O4wT;ƶξ6zaa1,ݣȈ81cT4ʦ&t HJL?=BeruĐ1i@㼜µUVrzVxXL`H$zm ~(vr.%u|t#Rb/*Jퟗ ]R>f(3(*.f=?;z %y1yKu<\UXռ(M@.8u=>}겴TEytTV ]rZA SV8LD1Z$R*Y Ø+ȐL)cYj2S);@(qϡ `(8Na(bKDRx.q9BpÓihwCrx65eIM8:N}BL{(ACկ!#'N}5o">ue'UgJpq+ʕh S}OdY(_ؓz9tԑ.ǰ2ՎJP=p4aSTJBEuʃǴ4XŜ+r"/haOfA d_dJĴ qiִr,(h} GDSz.qn+*a(Iqf)vȅT4X|N^ZAgɟ2t*ԝ^# \J*&CRQfȈ~g#L)D"K,SYUZ|! \W OW=iѩy^ 靜rBp~~\6Kr@5եၳ35W-!M*>;f[[[ZZ[UT/=%t ]_c\_HMEEUīׇ)홙.`aQ꫄ZsUn# VlPm92W%҈MֳgZ;;&R@II ]=tL>&qN2J~A333YjCJ%.%c6a]]ݛ7;kc|!=C|tՍ ' {{{PVV?@67z}Cz !~yvI(㕿76=gjTˤHDxrr|/>;8>\9 Od >_ IăCٹY3scssx~)WWW;;;:;;{J wkk뀀;;k"466l gff9U(&8S詜Ajccw|xDZG^~N.!fV?~P\R`g/ ]@WpCTT6kLݬ,釭8 {aoC< G-l'&>nlh4;;t~vnzz1{~ngvncHFngO&&GdWWL*L^.Z?>:b7|U(7.NAƞ^>~Ee;55uaQHSbb2*55---"Hc笌)rkh+4玎www%9ͭ-^Gc_vo mllu,*NwwO)/<2,($4`cgrqqkCNN.N0Ӡ_%$$Mcc}2B{g`gann 1PӂTZ{{{X $NwuA'&<Ӳ! 7WUO5)KF7씑1\711}uO@`@7M0mVVn𰋋 ~Uc`][[ҳPv\ݼ"b ӳܠcD6vzN1>>;MmC;'g,/6$#Hee%:ƴŀ_29 e+>Eov4h'aBqČ`ss rztt"QڬrA7XBtz.W@c#˯Q^޾_ )gwgGcCkKW 726~3dgc?::ׇ\pBkijqVw=KO NHwpr>A .9<,:**vMUU:hW^V;ڗIѢBy7>>^0!a:#|M><611}dQq;}X{[j7Y5;}b ^WTU]㺹{% Ckmm@QO HKI`m:*_h*m s@2 ;$`BuxxH>-舃46`5Єa׬+*ca/)uݧg5#'ًjaFTe)Ϗ%.OPUR /P{re*:5[&6ZcWQceE*0fmM ֖qS3\ sԻkD@ {уY*#&wslldHJTUBGE32!''ܾ~AES+нzNuCk LLr9׃fԼhGƨ\ze|PO"}=Mؿi V3&w] g(?kW?2]{ٕ6*UƟ:Ӌ1Q#b(|\(#_^A$˫+j..F} Գ\L·#>΢,L.~/z(GT@Q(XLBgݤ Tĥ@kw]H5fɠ/Suꗎr4:??TdJT58Dź-ZLDT( V /0$#R*> .FںX! fqi)߅v:?Fyc2\h=WLT2H"ǧ>%Tʣe5rՇBѥҡ._"EreW#7:#,PѕEId7S gfI:]\^ϡnxrr|x؄p{{{zz| ɉjG_ӂ.ށ(k!sssCR{js|fv~rzJd(%&EMB~R+V]M]ZZ).)(kIΥrh2jJ~wt+Kay33S|)]af [T__~^9orU59 111,+($.19]dZ?輺biicJZ7X!i鋋]}UTBXL6ҦSL(S-UfY`vn֭[sE$wEIՏ*kkr*/RryRs8O0l뒒2?(VVV~~~=NN.흊U' )ccch咒#cH757ŀ|ڄ]]]?BtpqoN 3+*B~e,00ckknwwh{+' 0EP1Wq{}ܢzhdT J58:TYUӞR\_ZV5Ftv^UW{JMON/$%%eds痗 K555oe'8 ݳa.MM B:-kH2:: 6/ --־ L>.Ave-0rP;`C!6v0l-8ٹ򅅥w jFߛ^ljiv/)+utv  LOOynngSSuDdD)t,ʶZX%%9VeϕqIFE=K 8:8056~o48[WWgcgecc3=9-dR՞L㠬jjXX'G|HZpphTTƆcFFUrrFIQidx`ww#Ψ/5@kwbce JHHvv&/l(33@UQ\9=%$[ضs&aᜣczI;ۻV=~^Y^,'$&'B++宾~ch?=>kko7>4f'fJJ/M}^ll<7zӃCcB@=J+Mw77OLrR#BBF$$%BW155Eyo`;?9>ptriq6p>իW=]TXB=ݕ n;~^M JK$uM%AP@kmm= `k8D>9>翸sFr#>Ƀn pmm#-,,-f`AILLpNsqq>D"}ay[ K|f ~hXRR\ /o*w<23bbKX\^}r_EN=2㓉)T֤R>|"1?<\EyPƒ#R#&I$2\,pvww_|.LML.f ><4Nn@̀7 }Bn-n3t\(Fg i.@bͅX~ 0`p#XĪK(.U'$LT:&U^;TX 0h|&(<ZM"O:AQ$SHIпtLW5N]SkP7A NИ*pp ڢ[i %555T|*YU4崮k}T`xzd}|m%1`*k|b?'9-semuM+TZ]_# ""}}}S4*%BvsolmT0`pPr|bOO}rvSYYEl6+%%eggg|r?8mww7W(svu74 U&z NXN#):6e_Y 0P ze諗%RRAQ^_OoBJ ,ܕȶj``(>>/@#< 0`A3Oߤ41/))ōb%&''$~=c㒡v XYWW׶{zzK +,>2`bC[[MHPp__aYY֮Zm^^Abbr```SSUO``NCW0`gbR+..`PH7׷fҲ NR#cFe2322:--|i~W UR[+7S՞u{!S[0`[USd2Rԅ 2`bIU_VQ+SShjl"./ `>)ŀ?y<{RGq'2 #~{aUMgOurpOew+e52V)εj[WO ne`uho"Ng>>!~'@pvvvUvdloiiaxxmaajff Llo 7HeWp.mmme /]1\(\ߖIM6}o6s,X\ْ !s"<; + PU]i|j)TyeX9%brTqF*_^*jgA͵L%3`pjgTSV_(Tq72AkO W0iVB#JTPݸr9nksŒug]I(|R=>< +/-ChNN. @ 8VWU_#?HYf07t(@Cf(xn^U{Tt]rk]C=3V<PʃGն zFё]ŋE9QS]Nc2 NNN@m*ɫW?|m* j<vnr컿 (544!_Rrg)|u} WrӘ ^チﭔmJ>hlnGJ B)WIP*x~9}pFpi&M+w ZY\&+K+8'pd8ʢ82: 旦f&I?.",LO/337 7;79=;AwcS3 <8n|j#hQ1 Q6=:=3&FLJ><1486?74>807hd GmO(+_Iel(vB3̎[|zntnqbvaɩH\Z%4%--,/⸼Z[FG`׷W׶VqЃ^lL|B@/fCg]Y[}6{k߆n`whx:cnc6Βnp!8d}ʆ!B؜#CQ#1~x~;;=NN.w9q'|>$B! D "D b$44o"ÛťUr??_~?|/=z8>~ѣGG{!UDT$=\D"R8xΝ{Ltd)EHɓ'(BpW]@~$wR@ Ⓨ̝*ս{w_O?z{[o;?t?~'%nݺݟ~gćqõ*֭I?~Rܹ2+)G%#<~pOz { q_x9=ySd~?^zكgyK|ѫO7xNAț/7x#~"Pg70|ch{}7oq#C775CC3<4C}.)T624hDGQ1Q8FGFDEpQqQ1N@ؤԔ4)OjR&\ZJzzjFFZvVFnfzNZJ&"QM΂'%1#=%;3-R3SrIDDJσH+Tefgdfß^|Ԣ<Ԕ'gg*Kp*őt,8dIOH)KIOM.J+N/Ej8Sk r2Q䜌TEr3̑r Jy!n0Y(=6%KEfFdE䨌 \jb~zr"´x]~ve^VENFY9pT %ӈCrZr^jR.2S2n7{ĝ&ep$&%%f\zrRZ6!6bVGB* 1>)G$OAIq|FD+7*!1qp1 hBHcodwxx`lh@H0P=vw.c{`[p~^^n!.A΁+B܂\H`mos?N<8N>og`bc`maogD-?⧭ru0731`M- >7? >[35}oq_~ɩ>(<1e~uG_}Š& GBwkӹ&勻rr[E5TT$pI_-"ӿ.r%Yrz^YϬUAy4GݾVK~Tf>=>];sF䔜*ŕY=h)%~y%d-QEznkOL"U %dbB*R8DᗜI% G"XDpgBP 9?#΄r_J9>O=qO<w9#oPOFXNi/ku,|qhWυֻ)F h-HSO&MtejT%o4: Ŗ')W.4rݵzU5u8jT?!h% }Zgu^BD3e^#7-ݩI RN2Ҥ[Jb KBPݩ&|)/b|fW FPqЫoO"(U+h7s)p-Pgbsӈ74C{]E9B~ j/OK.Z^%!!IR\Z-~^%/^xgЙ1?1AGNN8KvZݩiV*H$iZ-WwuV~g>:jhwڐk>ЮI95JwŅrS:ъ tv(L$:[X_\9;;!U]999Y\HDAT[ M-n!o̊T^j|r@|:I.?3 '%2(IrTr.q8XL=,|QʕJ"H(x]\ )eY1fbmmm|ӿ!/!Bu?e^C-QY噙;fff*/Q)ѭo\*ƓmU8r8.ޕa5"0_дwvplَZPPXl ŗ60*:v}H>PIգ ˖ddlۧ]&˩u 2:|p4R Tu0$yliidjj ׯƚn}cG{ݝ899{z;k=ꨩ"Eqtt "䐐_gFF~wWMujaq)ŎɁz󻺺*++;::۠HT??`aw~.1('G3 p +ޡ,{Ox.[^^V6 #>19=r7XMd9aì&%%3dcnnL(MMMNNNa?᷷OHHJŵ)))Pr#I Zojj:57]\܂B<<&'cm"޼ylj~zvDZCCCnnnH!vq+(((** =B__:))eddDiW?#F}| rz/$$("*4).vkgkikcCǛA*=-, Byyy0r+jRp:89!Krv[YQy&%7}"##!H?,"<$,VƦ;{G9쩝=FF|.( $lhp|gatTwzZvmM36`sz" c;99 WW;A ϡo@ለ(Has //"u89X"%&dGC0}oJMLJN1񅅅ž==}U(%aѕ3vNAAmnoQMLM>*-=S 8Èqs;<(lg+**F1~aCE֖3}}m QW`l|ίx9 VDRSS0+ EgXXXuu"6 9%5}xdʆTWWP(DJJJPx034Ptyss, mymm #AVF_#!>0 |𪍍ZTLtEy){T Z^^<::hf577z/,=xkkRkˮٹ3S{~y3S%eqIBAWw3.LO421Y```bsttdii A" @2j|,P䵱`bkwss./*2Jᵵb?~dccessEBBdkEEEUow;: lPћr{w 42Bk>Wy9{/%n?,/XXX`p8G\}8r]w'Ǽ HTzjDW(I”XQMJFG"׉>1",]%*col)Ŋ֖iQcCPzNՕMHf ++ 졳#SlJ&gWZ;\0r~X#9? eA/-,vuyc kSIgw~ $̌ܚ3 \]^[[YA3b`Q퐳܁ʹԬ%B&MHLFmGGعyjnn 1"'&&b1,hOV?MmU-VKҊI WM^"#\LVxT}"%tރ L} u^N|I?2R#?8HHɩ{&BGh= 'xg4 ! )9% s@%!KUB#3Қ̀X ߿Qvø4d⫠5W_9F RLz)F"  6ͪr)BvFr>9ÊE#5 0NmPvw4ts8/SB}惣E`aP'ȩT8"h|! R!Qt1? vBB={ussPoǧ^Lۻ:I}U^ULVF#\(TVW3j* U-=5It.qkj+*JONOGm͍ s--M uå##C|zzziq*nOOWumUKk.-mť%[,B?ﲊrxxv@ô ,`|à AfgzyxCtt󌉍_~聛KK[bb͜##111i`ڗ/_G}0nj;!>rqyi~qZ !1MLLlmm|^||lVVT*^o``R[[?442qQV h*hdr#<2biiik5:<䲳?7Xfyg 򒓓33sssr?|_UUs~.qtrILL> 2`otu;45OON/.zx E)IEŇ#`%'Mxxxp2rs q`fkkmT_800nk琖5o ~7hwp8GGG$6XSSSB@tv+KE".[*Qy|lo+'\.kk*'}vã 3Nq8Hahhdtt}*c1` \^0B՗k|H]1?`42hT#S,t'C 06ͨjQ͙N-ү2ʀo ?tWQ}'Ũjs |;iWjK3R jN!" endstream endobj 23 0 obj 19824 endobj 25 0 obj << /Length 24 0 R /N 3 /Alternate /DeviceRGB /Filter /FlateDecode >> stream x}OhPǿt2p1TC;2/mudiƥILҪcģsGT$oE'ECaPɰ{hDBv;-K~^NF,:Gu' [+/?'];K`.;ppj2,hڽZie$|̊Cwɬ<4ޟxL6܈Ɠ^R,H:QֵDU?U_tb*pMwKF|x8"$^Y0ƙN-*\gj5#:M *$H5ETN;#` h_NjQ2٤\/-ԣXhMKNď!|~ ªTQ戹Qw/:dOz> stream xiW1W\ťqwZť.)Ro73m33zzz,ofN '$2e4!݁-8ŕB,^(BDpc$4;\a` Cu`qSq*Kv`jZKOMOձ]]p’L^4/{y˙!ZE +G'^?ŋk8]ʃյa&F8j§;ׯ^us{\:7zhQ~߂K+=tuA#|2E .{dF $iG-}FNt5Sna' MS@d 8"GZa`}xr9!bqd`N0d"RHPHsNe+M\"C*9?e7FiM_9g3x\ge;ʄ 25CꋖMF.Z6l $WDSA8SEQB͝DSAT$!{ڝF?cFMl8UsJ3 g񭤡IAx)>Cr&O(HRu5Lfu2j3eBl qTvLIzVNIԕ8#RoPڳr&C;.w"N%<[ _>)C267YpK endstream endobj 26 0 obj 791 endobj 28 0 obj << /Type /Page /Parent 5 0 R /Resources 29 0 R /Contents 27 0 R /MediaBox [ 0 0 612 792 ] >> endobj 29 0 obj << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 3 0 R >> /Font << /F2.0 8 0 R /F3.0 9 0 R /F1.0 7 0 R >> >> endobj 31 0 obj << /Length 32 0 R /Length1 30 0 R /Filter /FlateDecode >> stream xܽw|G(|:LI( h! B(aA ! !P&`lp6 " 0kqZgaw-kˬzG"{{VM:u3~୨+o3H?T,n|Aq<5ǯbe͞``ؙUO'x7=Ob<>ljZ]0M m(_ `䇺b pŧX[_^Wn݇76>㧉wU|4=BГxpD,h H`UE2TRN[K f&#҅ !W&y]ho7-%h`K'D'%&J(KJz{ܟ?_hWl3x~q )==~( أ_H{tz=X{=Ǩ+Gs ~n=XvtZ5"C?)12OB:} XpԂSNn;'8z䜓?N?ߥDC]zix{3|HV݇Dh{^;Go!X_ pl{1x?::[nkG8  <K̅ *5U82 _ P jhhE a | Ka9,vxV#筁k;s>4| a?`-< (H4f/%Ed`4-Vbw8]HOTtLlx/һO~i2fe ,a F5zq'L4yi/QrY甕܊ʪyk,ohljni]xeW\r5W]~v뮿ƛn-[vwu=w><]ɶ={?pP#G:?sϿK/k扷~~'~vQgr, _ $ yOK@sV,s .T^X8kY]bXW\Չ%o>(h)*꾓<0u}c+|ʨch{td N WXlqsNN7`=3C=#)$+(fl͍\HV@2du듮N`;Uss"SFSGѐI0gj H?\2Ԑ:RO6'i-gEṶ艍HcǨ?>GQ<9Yh"~q t"˄k'vu#DȄlȃ0]܂ yr'WLʱŶǠ~(C+~ 9CK[䛻k%߄F ] C`,b\ plv5bQnq easS r终'"#KƱ#l -8CIN"ȿ9Mi*FGI./Џ'd mnS[Sb@\*>'9NU',]i]ېrOvӃzL8!Sr3 MWÇ  30s@F@zZԾ}z$'%|^1Q+6l2:YJ_D-MLƎxem^<5:m2^{q ֜wI͠V3S(|O-{({g |}|>[_m#eޢo**+ëi`ф =d:h z b6_X6_Ph+&MQTk#+s?͖ʫpM]R;e]eØ2%"αaj3e m0M p7ecNØ"~_[A0v 6MYot;+i(v{0`\T\ ĺԄa,"&3m4)}U¦\AmRwO33r0Kn-5o_)8~oqXm$I3A$fys{Aۚ3c/̍ @jI-cWw_qOcWt_鹽̏켟{6}rϟMpF"Uu"QJ4iFr1e+iwĦM]kӞc75u昶ו)e ҵ-S#Hs !hLRByc>"6W!/Mf!SR4_TSڴ_TY^9L`x[ $`yaIT^x+rpzΔ Fwʢϋ-Oc}_{\VJb -MN/Kr2E\c&vdQ )gA,@tX#i?NP:?A9?^) POf}$"謞 % q/=mszBQګA;W\ tyyPP6?|8L}yKZ`_>B8mK >DDQeh'AiQ^o#ِڡ6E()dB&."wW@C?~}$!\iUtH]Xr/%0`M1FEgX3""n屸itMcc.!>h۽%\.A(:tSb1Doll'nnwFb4QiYPqCLy-qw&CiT@6l;`%7J+7{v sf dNVY>8oD2X1rl7 E=1OS;&<=yR9DL"իX1u=c$]}*'ǿ)h@HtLē){iѽ :avgZ~NW;-?vGD$Đ#Sn=PlBZ~z0A}ua2_1ސ C`WyM_dvEFDQKֹYĎSi윬Lwqw6#@D;78rbayysK+llQ>"։MɾfQQk݋+*kH'v}.U(]n06Yt5TpQ*-NM}(y;ɻ"_HitۇY E ^eZ&7ˑȳ/(`D uttc+o ~ğNqDeר]'6IWذ@u7Km7-7yWUnAY}C{]UĿeƴ`w:D2uj+I⒖ѓZ@_cbIn<{.*Iz"#?QIH'P@%'nC' >Lx!kܯ# |iBg;g쨉Pq)(/GnJL?dZ @&뜾ٟ}e@o[$L9?koP7gЯ5%X}Vbcz# 4sIad3a܆q3F9H].%'%'2mIRZYUQ3{k2Y?fÆ1-d )Q(~J砟`sIŲCf!CL( f9gQv_TwNA2_S4 d0eW}i&FN>Hn]VvN27 ogoMÆXLs?jlft%ZIDa9L8s u~o$R2A\Op BZu2M=AƨLu}.q: A\SpAt`ntqW}USJ\$آ uK#yA,%'U鐃攦 >3 ǹ) 0#eEK(<1ħM`dNaJegzqdP0>v"t(Rq},0Ο7^}+{s5z3nWk_jFX:=#b+enCyeE~D`렅{ r_=yql-][z1·ϦiUTΞCB 璘ɴ0]ִۋIq {BPN A2 ].Ob['Is&yH:%9YH"Hߠ%ڰwMNQ}"I:Rܡ/|un\5"Ōݭ8CH͍)QMˌ{'{ 9,!e?,$f<#XKu BH jpl2UǢ[b^9<y2+8!4`Rr~pRjR|o9~錆M/{&}v~<[MN훒+nowrLU:t7^sx1&瞸P2úCPpd(BqnhX,V}(hd}{R@ E-M"A} $^mBUOg qGSjMKM BkYfU [sվH1_v&k\ ^ΘĿ51~΋%e>=iKƎ+bz}zWޱޱ>)}Sm7?>dIS{7׵ +FLY:9^4G! Xf!$W-7px#t+ݭhL]cQdC[Zjv(+ٴ9dKV ==ԟ>WOq7?$q?Y&?.h# ,dd#6,CCdt7Ō6ᖬ0& 6hE_h^`ћ8hIܦ%ƕ/,X7^ͻw149{~IdlʠIh$K.2 꽒W~N!Aŋ DuҞQ莎P#:JazxÞK" φSH!5rw"ms9{b*,ʺň$i4耑ungoDǍmCgY熈s;7u7zmڸD4n'q{()'j8l7U^>%6%"9O>D׸tVr2v@9XGh~[iVr}JL*ZK ڶOxs_GRZr[LmROgI b*>_ɆQCfGtE[c&L25CY&GBx]mJ5$V6ev1Dy tͰRX|Dpt|O']Y`LѠMf}ТWF(IFEc(AD($Y:Skѝ#t#tcާ[ֈaFŸ4̗;BPw%'gSՙ1cc3?=ϒw=8fb!eQ^+{|_:Ϗt@ފu-ت,EN7y+H}m-Ak O]sϗW>uO ghtFϮ(-$lj`"  222|vr]4ql=[1ѩP2zzOLޭ>h`h=xz$ F3lwWOSgvw=8)0(؉dW0/K }pڙXau\i߱@ʙ(%v\ f"H!ZIKF:+Yp3Ýc[7ȿܿ&4?{ֱco!9qDmG[P n0 m1DVoU.& *c-vT{[^T+ig7?ǃ9 7? SPI_@oSG:>+hnu.EGʝ؈Lh j]#ho {@O(65 ` 1aĔ KǬh30hT:nҌà:Grg괋z?)6~3Q{D`-ASE. RHj\^;<"rٛ׮=ӽWgF}S=bΗ%n se|q7` Kf UosǻWotwSn}[pըQ阃6s4J MMaMڡ_Fql651wX fϻa\-m%ɻbHV/HX+[!z^XO@&3LwtpOi0z!MY$B%Hٖپ?]R!V3>;&m9ӓ+д] #wpXHkUoE=EOEH,.Q*6?մ\_f5玃[i}Iw7޴r[]rFy9c'Ͽyu^;$%3:)΀qT0Lwll=DZP,NSrbb;̶\)19. !bRɾ>I&ꦨڢ('-I▸ !GDT,>zmР(,1DsQSuY 1:JwfkgA/iS[-8`jw*l(2%v]L-ȱѨD(nBuGgZFJ1|G$!/}돆~5+S~!)?a'V ^ "'G;X: L1d_#VF#%?I4+RPa)F" }<(f4*z/(JtE(S '_a,b}l~ߡ8#)ӡsC|mבۑ6`*:©1-jضW/& S]'AEur=-X]'ӗ,: ^tX""cTV~;䋶_xnd՟w/ 5 ̽Cd=1QgЃ9btQsPc@]o}CaetluC3\Nz%3H2`45*2 >=Ԙ.|I:,3 ӤpE0R,7f)4sD:Ÿ1Y~H41_thPSFWvysqPLnW%tG uBnt~q If҉޲Rl|bךɑBZɝ]Ph#RvԄ ԧG]QԼ௅p1 5sewYie5@ cy[e~Ʋ|Wrr [[JNѡ_|էV;l[vzW9)b`طƳ%2>/VEwh7h*Rbܖqlm!6tS,\3zc4ojԙ,Kc[yC& ;'Ou>as\Vvn7H#iCKF0.TPuv !Ѓ祒W]SOVk}R#Z)|[87[mV#a1 xf)xI +Hyb 싟>N\|xGMzk[F$&zIg!Hq,&o UUصu daw_ukϾ6!ukZjuFZowQ%}Z10%rÅOt[8tNfhۭ>< ygJw"jKjelxqktǓGVyt EMm3d,̻B2bjegFAg'Ԧ$ؒ߬d"(ӡio]v?Uf<0xꉣ&5-3NM"7ݏ=eҠ-4f$D=KfLv:}+ӡ7XCA4ʿqz&1)GG{YPFh"d.SG.7u Ww&$اo)~aL!bz&DDwB+p GHKW8tq7?Ԣ9ʇmٕH(F {)8;8~4WN${sQ;0gRL4Y2vk2H.Mr{?r͟TZ XAZѤ-Rp#3FZ"4ff~B8r{zjI3YQّޮ>)?N (ѻ,X.&8G\^<>2qdWwr΢ ^NuM'l΄rZ4 ,gl6QT5A:ZCe 6a`/&&t/o5`XN $N,‰TZ?֓N#OZFRu ZEABױbc ϗ>"Xf?dP\O)Aq^Kc|@2u9w!M~\kvUPs]VZF ͪ؂'OOػzzAWQ^XCU5H-e|S+ez_9 {47Z/DL~0?VY,4^Ƃ`Ќ:{^nNnߜusEK&lbB$=Y}3˿go^ow~yb/@o't?t'AgKKL>E#']$SQuA]g8>  ?n}~‘[cI4z[u6T;yzǬ ^XGɚOw‿TBUդd@w8glh t6޶ۦ t]˝̱@gGge& RБѱG"~wiu;oaڭK_&8M x40,oJRljR>Wm:95Rr~Q?kmxW b7+b\VM6f3`l6,e2Q6F͢X1HRPF̥| jsu`8Qv]u]%- @.%ҕĈP';Iܾ}>=kcffw}-o +8ӰdټÅ>}nim,YYYfr*t2߼KƟ/ƓQAd })w=uRzfτ>[8l69Su<@~`}KxROV:Gz5i^j[]|^ζ7YsAשnoصa̦n 6!KߧW,ky>vM\W=9'69ovɈAWWԯZ=.?|5mii {ҿμr|w@ߢ!ߧ=)6(^'o_g^oڇvbzbt+w݅Y<#f=Aw_}'qnp$HH8`s Ӵ*OϨ!@'gjEØϏ[e}ArCCs6LŽ8\$Iݫ|bo@+}b`en(h/0l7#~fKÏ~(*K2 ]EjB($J( b9dKq7$HB1DZqb! g(8F f܋-| 0L^`C{J&˙ؗ).bB0Kk e8bSxm9x] 'BY]zTbySHøcߗXo!J&q#Nnaepׯ»,b,XOL} Ft&f=Km iLS1DZqfcßyqete{p ^6/!.~6 q8/#s/V8 .͛tqOtNi$[!M;퇰$: y/_ss][.^gEC^CGZթBźXoqtFw_bAWd+^"^s K ?|9C_E x? ]`y|S >$ne&,,w:_ OKhixsN2G8/RkWοt0_*Em!;h6WT5/Lk,hִx˽Uu S[Wշ4{Ֆ/P[YS_;2]qJUp+i ; =3K;?!^q~MwDUy"; Oh_^_]C@Zk*kZjq&6cw-S5V544T PP\XF,P ЊzTIxRS1pD PXZ,*벻P-52՚gU[g0犱N} Vqj7V# E,kq~T*/XqLxwǣcX6+^B<𛍾 aXc}֧Z'ŻkZ5ac>/q ֯EKpIǀL#h ֋W!.~?;jO2)^xHeo >Y|v 9<>l$WxLjݻm3y(c zNfg ?n<¡*YxUzN q]jxHFNm.]P[âGPjsW[Z`W5[ܲ٬⽷GՈp-Eǧ_j7{>BqGV y]%|>|{+oQ"+h.[kE[Vٖ8_O\oa VC~ iu­^*/3sl0xL|42gGpg癮lF(m0)U{rEx$|.Ur2-Vr޺Y3~GBq!uM\Wqkb. ᙩ3⣺RU\J~9fvz~}UX.[w0O3ǖ f\Tu\k:!k okF6dνa^續ٕ2=W#_jԾPjko)ŰwUE-y⼦>_وz.8kNׅͬ8 }n#Ft?F~YMx= Z4å>Tw˚_ͳZe;nOI&óq^ƺ_ʪv_ \yKqD=~Ըtt_.-Z|5?9as¢0a-9gK؂TI=mZk뼞[b[R-˒ܿm欥EnM/]ɪ.Rp'-n`W@ٹ=wp>Ѫ9,,v{Ua{ =1OkwUAC_1lz7rU %ߵ~UO7囹 jz0VqwyXs[ 󚬒K5pc2]o_i5=|iPGQb:4\s9Xa9n +G }Ld?@0l!"Q 1 8IƢ/"{@hHp䠡!]0@ ðCB7b q_ؙ1HGh:2 td0 Ja6BeѬL>XS-&1FaVVj{Ykaa#\& w|n%mP;w=p/~xoGQx v. $ n_jp1Ÿi8^%x^Wo}>zSp>3|&OOpHD&:'8&-k2 [*亚ʆVü aybѢFUDӭw|eYngK lԖvw&R-Բ7RӚ(Qi5 ąD%1\}'|$xߜ9sΜ3ga}KWfzI`(ۖJz?l/s}-OܤvDv+n._9xkwƵε(@,͸ek"B3, }kseD٧4+4sX+uKu%RW20@)Ky>PFU6/ժ!uJg^M{]3<4? {>m؇ a Ʃ^R?TS{TTbR &o{2kӵJO8^.I/֒Kp /j%/{zEQ,y}XNyj1i5 n.{^R4V-0?Q HӃG4,(P'u ԧi/SG>\Xw? ,ƕ ETCW=Uam;*z}RZ>DׁNZअL/$RTiF `>G1@*wER>TOCx !j QcxkPP$ɏ9Q+;Ԉj.)a@~Qh7gw"8cHyT^"(VSိn8Y`(>^ZIR%3G4O*.L2X5٧>tv58@bXB|L֪J~/Lg8KǣoRǜlapDɥG(H f5 攥ytCNa1bIaC& endstream endobj 32 0 obj 20216 endobj 30 0 obj 31264 endobj 33 0 obj << /Type /FontDescriptor /Ascent 1009 /CapHeight 0 /Descent -211 /Flags 32 /FontBBox [ -130 -211 1008 1009 ] /FontName /NZUXSR+Impact /ItalicAngle 0 /StemV 0 /MaxWidth 1025 /FontFile2 31 0 R >> endobj 34 0 obj [ 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 177 271 370 627 548 693 577 186 314 314 281 534 168 295 185 396 537 381 502 531 500 537 542 392 535 542 203 203 534 534 534 525 775 508 553 554 553 416 398 552 556 289 332 537 381 717 542 547 502 547 539 518 461 547 524 815 483 474 397 283 396 283 484 553 334 504 520 495 520 512 290 519 524 274 280 479 274 771 523 512 520 519 358 471 305 523 438 670 434 449 352 370 271 370 525 750 508 508 554 416 542 547 547 504 504 504 504 504 504 495 512 512 512 512 274 274 274 274 523 512 512 512 512 512 523 523 523 523 543 348 518 536 484 348 577 551 784 784 783 334 334 750 714 547 750 534 750 750 474 472 750 750 750 750 750 325 330 750 754 512 525 271 534 750 444 750 750 372 372 554 177 508 508 547 689 766 500 1000 345 345 168 168 534 750 449 474 125 549 198 198 561 560 544 334 168 345 1025 508 416 508 416 416 289 289 289 289 547 547 750 547 547 547 547 274 334 334 553 334 334 334 334 334 334 334 ] endobj 7 0 obj << /Type /Font /Subtype /TrueType /BaseFont /NZUXSR+Impact /FontDescriptor 33 0 R /Widths 34 0 R /FirstChar 0 /LastChar 255 /Encoding /MacRomanEncoding >> endobj 36 0 obj << /Length 37 0 R /Length1 35 0 R /Filter /FlateDecode >> stream xܼy|E?^U}Nsd2 HB΁4B@H+A"A B8ArPT$PYoX(B&ߧz&73U]}TSzzF`Ǣ,F(y!_Qn~;Ba8^5i3v7\MoY0!E2q܄#kJ_Gh!xF(0=8}9YUB7B̛?4# Bn2&\:nD7Oy=s9 w KHYg=rڶ͎h{G_#1gK@L"! ax O o10ftcRZ\+^%)%KSz(}iHIi4oZ -'ڴϑ7_vqŅ]\rtt@:d@ 5ހk_?ck5ڠӕKhS܊_QL1?j\qԈ/^8SKXu ';j:: ŁBjg?~/?i39gF>]wz ?*N9UjSy'_S6q{h<͂g+Il; UY~a|@rO}V{jځD2jD]wtzBGЗG=~Bmg8z^G;hzMF?CAߡQt+ڊfz\4CYtZb%}G t}N/)) EkN*Zz h£)} r $h2pϟHUip$#3+;Kny KJ=zz]SO~0pTa#GUUqLMckǡO8iun~댙fϙ;om ޾hKyײ+Vq{]xp޸Gۼeǟx򩧟پwi施^lࡗ^~G^;xy{G|ǟO~WNSdo<|85ɝ3Qo__J$^5F +/4 l^a#Jw}OԎy& h' {]Pc  ۗˀbP) E 2 }¯َgo.a^gu\L@(__A!x$"3ff|N܍9x1s%>%~#A_F詂g; 7҇%8M{sWlťx(OJ|ވ7N)L={-|ٻjxUh;V-_c vށxnZ_/aMx#A",2q1iLSĘjfj%{^8tmp۹#9 )"OgxK_ THE1h8xoBa΋5x0Pf, &!ҧgh6w#EZ27#r,gjfibebf.0Jl*F?;nfcpp?_kJaP# p;,eʙ^Rz{=X4 T"q In{zt_'[ғ0TGO쳐P{<6ހ ?#:9;$s 6+an#0k*dE/0x1K.kgA. E1z@Q 7g m}O`'.@z> \g6nAtpv 0 Q:<?N^`*s x pbKOF nl% UƀL}@oJ܀ !6a, h*(b~8iE9;jj5b={DKK v%';+3#N@]NffѠts,C0RW4EjH8(wUAmE|MR]JW++WbYX.JyHi:7C OPԦ+:-o|07()}&\77/nBSЪ`k&g|&ɜ]h4}e* ZrqMn1LM7WM@}\ Ϻ8[Ti,wOUacJiЪ龺p~P a FWW5PB{B{P9-StkCSjahM=^ +ëB2_z\_n;jaAGU<>ӵnْ n91LrNiܠP *}*q|)\j w5MڤS(&.,_ ?KaD'W;M99M"BSh5qQ.ZI(4SV J@`V M C ٷ9M9y1i nY]&+oqler!K>}R cwmL->IH~v]&era,-|+ާLF$v-5&r r?ht=h TKti}@lkVvL@i;+JLv % \ѕ41H\SSﲅ l[#A&d 2-8yԎ7ƹ6=G=4j;3 #㯏{ Ń];>~}|$~6>i1:670ץ8_pD2{{`Cr~kǩрvi8vQBubiP8z0'!GI0/mC`(3KXWw<\ O"J(lpn%{J[>F\ >hvWF"j!DZ 9r*JiiYYpg, AqfϐD>E<.Uen c9O'To<+m|*;Nگꊮ4uYiZ|41> ԁ-= 1f—Luu +A0Tн%N|$ߠG 9]"^r(pEHFtY"HQaIq --"  ;/8w؝.[qqQa$W](\7cȚU76=6fԜ|OplG(-5ZcaF6mmWxWJex. 䤢%?w@.7rFbNE.֑-l"S2Sq dtKEy!ؙ!;9zk* C9,5gNSН 0_߼q+>գ vo6?'V‰z4;/ʁ^=lwyo{7AOydzEU).)uAŸB,,n sW8 Rps*&wI׺ӡ:lओN!s|d.I]w NrWQ!]~z9<#N25L# ~SIZFSIėԵkk7IB>3š8r@j,fz0zߊM6&צڈ˔nn%U,%fݴՈ[oR,ԕ?DH gϷ@l[Yeq C0Vh"Ǵ&%0X\B21..qLaHW|r|c.i^6;z0ax`nƅB"I9t^qf{Z~`|w՜ËVܸ|J٠7M^7Z?D`Ѡ34 #:`' ^ 㩭@)̂6A XM3 (>^dK2VAV\ЌDHUtbdFayck_ʳ,F#BV/!c|z{-]+z_ĦN_zqq܃dL)$cdH[L[`F[̦TP[{f(ɻTX GxOE]eƓOv7Zc>t!zLtA@,#FA9:M) z;+0"xNر콧|Yj"g暄Vq,5ckb``$Rh/\Y/dn[ݖ,5CΛ})Ҭ}ǯ/rohՈ!8bm7ȟ>ڥj*UG~[9 ÷!JXM䳱=6vkkm4y6~ ߅! ]W#9 A,l,/z Ac mnS=Vnl6M WS ;V9{XHg܍PooJt{]TL2! !fv=ggkoQnEиRt&Yu^J[ gPXuXoe%ċMF8F|LIĠaqj=JR{!f !kL%<E@9%#Jd;G'=rdKiKv=`ݪݺn{Kn{{ڤ w|{ʦ;mo&-e7&0n=[h)=AUΫ*&[n03 X[3' F N;1A$ުJeĶI/rJ4FAM  "aP3텈D! kjk4sn=⤱&} 4j Ɣ glN:۔ety\+Гmjm2M6;?fմ,Yu`o6}(6y-ceYpp-{b=1oxL3@$Uò6@d6:RqC hѩ@$xpFx˝-;׌Z^yCws9f;nW}|Ӟ!eN/|}{PVt?lG͘}WmLc&:e8׿\\?!~-JH RζdTc|U|\Zn}[ flYؘ,y]+TZb]$9':)d]esk:BY4M{RJC+_E5Rˀi#{>4}?dȽz>3U]ӗk~vn?rg[7?k)k33UQ#fGDVI}`0v{&5uGCX<0eK@zLIP[>Vqzv:?j&=EXQk(l.JU/cYrQ"Ԇ&&z-`kHm? Lc$&&\͝K 9=8"HDi$%@b<ϙXsB\՚!bTe,QXn3w6).63J&'&d#ei4WcI՝Η5ۓ}F/Lψ;HFC!CF!*WAP 94{׋Q)<ފ6V%="1yr!dv9~4j3Yx66 ǬCa"YB :ل;#Ei*plL]K7ܴ d- {cB9s) WT8%{m 7VF_zq=/1rY׌p9>z4|>ȻGnNiq&2 Rlk">(HΰX1ˎiXKKSb`UU.ߤPq[)Nbr_iy֢Y2R @ф?g~'O1}WUSӭu=z*|}QWug0.2M} ?ria]vJ$[N182kÓyJ_^]:21ɕ& S2g+D/8P4lӃRY+93sH\2}ץ,T\y Jn53eG6f:"URޙjCu;AUo" sMH`lsz=2:wY qW۟+G]%R`AMaCGWfFtTOVY5!\C ]~d!C > U_=ȶ?7Kp~x$@_f/U+Y_hdhRhnԁrN8St:5)Rj `A;G .)E59=$<]˿P9H^͵pAXW&IHsIҁݹ9~SׯTx&gn8'U ui`(TOr5I] h 4e)&9)~}t6)5Œdl8>13ruuѴɿ?I[>1ِyee$(QFfT6#l :9b"44("=c:eI᜜:Ɇga@k:`| j-Gz_-#p#_.=_)8'&$K[?}杮[<}?4xp4` YFTGL E ۛ"'=Ǹ'"gZ9Y Q;mN1 `A,A-eg)@rnH8=9Xp3wTϙ}-/xw8R?~x|Ǹ;x_+"q˭G7 t=:f~Z( g*b$꒽6ѝ #^Sql>?/1g/ofr.,쌗=7-]-ѡAj֒l: yT!JR1QلFy;oHS{%I3g9HmIa+V #󮀉Jq$#V%|Y 8#%HXD؉  iQ9>8 8ĹEheC>3!"Ԉf#ۘDN-mGi\8z.D PrV[qP-KFMՠ# 3L_g--͸-yߌGKWbr!e3f7}vn`̆ˆr4~a\ Бaj 9 Y&JKDы 5 Fl$Āj@p-J1bXi54=95-Ӧajs l!o;B~?r?MFޏ4W_-V1O~7f i׼DHCDHnob<(*:nXݺmEME*D9Y(\=ΞDC1U{@Tϊt@-rj+hkIw8MCUD2C򫌫,UlE$IkVlVkcm8Yi54,F%cqTDzfPy;_=/3_=oם ڒ&^3i%QQ#C*⋥(f)#̓>g>Ln =(r,:BF;P͆6ñLYhfR{ypxzZuN8eNsx0hxIBa1"%7i%=TsrMa rEZJ!B땤 ۮ-׷QR,p/Y?nm.V 6lZSQڇZtiГ.(K4_sj(O;F4{UQa:9|){Y5@C~e7;;Ps,i &gfkBWn%Ϩ&0IQ_IH(Cw…#ěy2.A,ډOdV40:3ņ]LU̍Dz2k׻>vkur}DIQ-ClC\ҍGXFƺGzGV6`k@sDh!#Vfm k^4&Sx.QAwd)$`֢x.~{%)~} ~m<?v$ԗ[G5~b_3?%lZ߈hZ42NɃ77Y!,\e^ŋu2skS_s튵PI_F#W,Tu-W+ ~hse&}۟g%crUr?8P&lA~6LT{溺r"=Gd075 RÍUEfp3 5n=A8A߸q{\zrl w{CvfG yjyhPdXe22u2*m*71-r{^/_F<=(ko|Q83!3vrgz@1= @UIv0ld 'Gr&+,[|%x=h‰P: (-NbBS`Y9+'FЮ&\ϭn17N|&ge1'?{rk=Xz i.C;p2EixjMZ:IZ[;nz !=לQh)r25'S8YsJ$q)=ΆL4?Pʹ\Ze~ȸjY6 lXAg)Vl4pnz. ivfk Lz; 笻Jp:Qܕ'*9j{X=7zsVL?*ʗRa"WbGڲIpi<·?1Wmz"GOӯ֔LAɂS1߱'G3 g1Qf08~Tl'c;g+$Ga;ڙzcc!J֎  CaLPlP9TYtmY!O'1R ~pH!%ZtT7na^#f2':9cR@HzSOYR\”RcS&Ymҝ)վ&uΕN}>'6Kg"bCOx8G['l8M?4:](R0:߶mlu-S3s wo]迫0}e˲l2,-V z1Mc^&6d)Wb4*n00 Ch4@bP ЊǾH#ֽc<ݪJ|*WeFTIAHt)jxjj OZ J4>f3EOL_TLEr{?<60$،&+f:]D{b 9=!f )^czl.(rWS>Ց;, s|G|L^[V9 /ow- 1E+\O`؞й. TdXQkѭ3dLYbkb))EA:).IzuB0H~<ģ$  JܪΠA$٫zVTMI|\z[wc+KB#(4hf%]ےa7OWD8ZGubڒ:m6j&V_叡+˯ nLg*-wMVP:_NH^Gc0:%),̔ôhgLfHY:6Z p'z)'{iPч+_|D5jQLrRb5I F;Hy^OikP  AGoU3[& ܹ0iO%n+USY&s`d , ǦtRv,AGRXTa>_j:`#KC[;ZxNj{v2V>*uޞ(#>h(T,#2Cr ,Gh,*%>=bY =8MjFH؇| p10}iU,edn!_⩂xwGA ^(Ӝp+0rdZ}}N-~<><~Pui2(T0bd\Fy@O\TvG|wRW#pOgJ]B-tuz +q%CT ˘i%L+m&~?E jNB4ab }OMg[v|kP&*):.cfgbGGcMvqjvm^qE&#FӞg3yfU׉S].مQ6e{]bu$qj?hW7뱬W=- r7sMexf'п$:@H8-FN-i S? AhY Bi xhv}ewիth)q߼矚;y@/k}{vWF>i{1΀S}l}\l\Z#fIIA4z:2fOI{ ao150/13fL: O[YE35yslփRflN7T) ;ҏ 8U(+~MI2P:E;H-8dgO]+LyjE.Ԭ:lzloٲk17=~ٴ~ZaQǤ~7< 0tm|(#`FSkzE֗y]'>b#*/SPkBd Xek8XU֥_lh:KTh,!FaYry/ j;_cɶwqA*`g"j:V]N@TL]nK茮C'@W ,agZ*麤DubJJI1*Qdw0PW|=Am)&Zd $ڑAKv;cp22EjcMonkK8g{iAP@D< Qk@;  ̿[O|$1ԒMURykCR[iZUF: -2']{k>7|G,/3" KH|`ϝOhOӤ9L)DN3~JsYe[.cug\JKabW4ۋL΂{8e-ӟ̆c{w=2&Ĺ l얿O=u7Tԥׁ:?ȆEVU-JZAkYF Xy XȒlF,PKxuHK='.S [bz/=<ȊkLW-]>yԉ*fV<;je]ϸ}1U,{V mu΢Pf-kr=]2gԦ:R:EF"cIh6M&avn~a`zMDרo6ų9=9w~b=<{Hyy(kF!cЩR%oJ_J #YspuԘngyƩr;w9y,~D'z4hI-]ɥ쥒 ¦tJUB;86G,W|ZLsy_Y|Tbcs֙!jl€_7Z˄>/E4=7"/`hz-U&(!mգaLSv6Qju* thS۶Z)먚?QA7 .dIQ6գ2jyU7uS&VXz 5EigQZ UOvxgm;cc7ՎM ʲ]6]NɔMKi9_|(E::-e[{N J>D%7Y( mJoU֘^ȓmV9*W=,Ԡ`~r|>O|)=. SgWj+|y?(N!06pMw)H},GQ*"l=+(g9-ـmz*I8ROlS#TҙPjo`*!@Ti: bL ,MFzjз@PҐQS~6r. aj{ox'g׍kAFp" f(8L4C/"bm n!a!݀q7(lvv:n'p~[{G":-zOG;tAWCj%}e[K~Pu`dy:VC{t#i9El~S-N;k%Y/l_ֿ,q2E!R~8ud X9 @Hzr='G`Dd_4qj\aYjY(jݙ+]nϺsJU֦I:jRiZIyO >S)WM #꧙gX.5/囅֍M|\89f>l;mޒ򌹦Y= cC`L?4׺s6ZN :bU{@R,l^[VS7 d7Ml;dH("yJ0[ &΢SqV@kj5S/gшE=F؇:gd_[gV u|[׋jك 7oZزsa2} qy##,/8=iءh ya,L1f7xvh3z0Ʌx$d}$Zsf- Ϗ%G1‡|tJBV<]=l-GVƜd @-y>qxؓU'>8nr?>g9I:wy|[oA_GVlrʯv/1߭[tYk'r6m1U+-zzo/6݃wv돐>'Mo;SժpKF˜f$Fq!IiĬ_GkrIz݈^Iy%:˸Ő34-~#~ܐRA3Ev>gekJoP/*.5~Hsbs1fjw_+Q90_*qfڊG]yE:oA1"=5s q{- !gx|~t\UVnEPRE7o2[X$*Kݲ.;k}bAWhC_)9c6/*X֜뿷kdw?;swaMzG~!+.ݻ~'g/`\7 O'ӅY: 7av؆$&U8.\_+~/ ?xӖ ?<#bR) g*N*:"tL` @EF gґ>l>ZC e|ȄoZi1}eRHסbnd~[G>LHbSDݐf[*_Q@:7XWm U2JnpT{a%a_@J^ QdZL-SL笩.OV=U<.aELЍj4`QXI炱HP&'W.-W# J!v04I_"zwڸv碌f]IFq](-U%*3L%DHлv#ѐ w7["0DIm؝gfߔ%[\k6dOquud ٥ֹ߭ZSFG&ܛHt&-.ÕЎ]w[" yg`ZGH9 QϒSG32 VC`.mE[9."yXv`#+|V9UØy)l%Gߩg T`Vw =2Qgjрlf$k3c΀ 4nDߊ}_,hVa@q6el@J+ V=nKMBNʥsx!~3R& uEy¡_JAG_l%Ձ~7y|?ǩmtI ŏ4zBT~9ơJt¿rRGՕ/|*VO3MT\ZdZdզ9[{wV M'IRwZP!),,pݕ*\?ݥ-v!$qS{i=֒I2B.*UWf߸T"ׇS iWִ36TQ$?7ӗ=;nv-;/o˜؊Čs/rot*sTCjM]2]G:_z|N{W=s<[pxm{]W?21Ͽ'Uiw,^+8iڽiG^0qM(t<~xeK}[3iOw[Bs&u[>okk*=#]X %J,[5jUJjTNW Ʒs?_ W4|W:/OQ)ՙJLIU,z2f گ vd:_M?X;m? fq% 'Pj6@{՟"!J LR5>za ~OC4m hz *"D5(3ͨ/D) u} oq]u}Og䯇0ƥBm_DiN/(sD}jQ` <|RQ`- (i땑*hep VSqa Y `Zƀc8)0s8;x83?)0{I=3W`NxFSg+0Ls ~}Kf{lb\&5Mylؚ7vI5 NfdycpÑۖpe a/0x4ORX埣ANr5wѬYSgנ(ZP!ГP+W$4 ΢c C6_P5K/K*jJ‰A,ƢrANm/< qkE XQLze5gKZ[1SnZJ `R)YNZZe$om܍+uV7ph6.Ji\vqNZS0(fZ.jydn0$Ψ["V@AŒ͌(uFKP)+Fsi[vVL}: *!_)`}mmb%F(&F*16:(n%םHW(T85v ^ 1!*)]Ҕy:flQ-ٮJd+s0L6۔aF~;6ֺDBƆBˠaڀB v2K4kfufr~:yשHtFW-0,ld JlN'{27vrOFrwxߠL;k ܒNP;0~пR*VBtEB =AY0ޖl`1yiW(x9z%f!XhD)ór*&VRFC)r#Ŕ%\qi FXMvL!nJ2,g7^2!Es;Z(V4e%;FȶDT43JG":rvtRu_E.*Z6#Є|ƌv1[#k$w+U<:?0b}t]sB&FlT;~0{VFҬCnԍFjW'ʋ*_Xu.]:25 +yhj0/-6kOjLA%:|)*[KX8 VU)1"Xj1pu,\)U2TƁ-@-WĵPoh=lj CғRCkH!IvFx8!u @<_ ¤H[MI: 1P\(MikWc҂P,]j Vwb+XV, Ecc9`4G1Yœ=!5D͡@tiX< 5K) yHu--RY BݭV8T7:l82)$UG4oH;ZZYE [#mX-=R}dP<-ӶE7JPnCIKa֮@4_  tN#!a y't0 bv(w[R|WGH[#f84$D%ݡx8A %FP4cvD3`c2:z(kBKW[P}{* w4w⬫ƶHJPNZBpÈFBh *9X׻[Rk(VׇcC@p! cG0SbI ЙPF iey$)!Ǫb 뢍 RK-2)@ף!8 S HNPt(,ٛñζFZu:i Mc`GXixgEQQwwwa°H{Qk=hVh i⿘;!en]ì鳦MiU7W.͞5fn}4eƂ95s:Ț%1h( (z):CyFic Rn:y$%0Q_~X ('J5lYE_ʝݔB0p!Jh(qn:adu!Cܻ+EC3#0FtT,(`!R e&uVb!#sJ ;nLH.`  t.T`FÔ'+L"(-?hT[=L;0HtmLfRƏ,1 kU[8J끲drBa:7J2*"FY-Ýk]W(ƪ E;Dv3Xkp[WtH@4>B` Ƈǘv,Ų&ePRWP̥Y G'CHB ,Ȋ’P2JAD( P:@nP22QF9ȃ(Q(@ }SGA)%d<($@@Q%&*ug*`Nw&Wb3)j4Cg!ZDAY^& -{%3fla i Ԍҭc ld mF?B[Vԃvt ]vNt݄nF݆nGw;]nBѽ>F?A=F{#QSz=DOѳ9}h?:C0:Qt =^<:N*z @?G@'ћ-t N_wл`~>@EC>D3,C Gt } t}<#Ahk,յj-i ,}9V 90rñB:+ 삠!IfuV jXt`bO\l6fE3V:Ƿ! 3? IY23YŠȔ +  +h%!p *+ %AB?{dAwE —49_B (4q/kX:zF^_2I?]t>q&˅.c0d2V`gD)Zr MnU]Mwϻ${P #/@<8h\\i;1lus#~zԧAӇvQ'@ > 1uMp?{n woa\3k]BH<g~{w{&WZǠ*rw59M`>4vU \Xև[b|&4.XQ0 A'FP D@uFdG,"ܝ` q~*=Don^uTkE S{'je^~0R{}5,Ã4ڴ^4#\{s󮽹9W9-ӫ/sXGENサ~qS鍽Lo^jZ|>LG4\Xۇ1<$?p̟$$!CƻO@~ˡi> endobj 39 0 obj [ 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 278 278 355 557 557 890 667 191 334 334 390 584 278 334 278 278 557 557 557 557 557 557 557 557 557 557 278 278 584 584 584 557 1016 667 667 723 723 667 611 778 723 278 500 667 557 834 723 778 667 778 723 667 611 723 667 944 667 667 611 278 278 278 470 557 334 557 557 500 557 557 278 557 557 223 223 500 223 834 557 557 557 557 334 500 278 557 500 723 500 500 500 334 260 334 584 750 667 667 723 667 723 778 723 557 557 557 557 557 557 500 557 557 557 557 278 278 278 278 557 557 557 557 557 557 557 557 557 557 557 400 557 557 557 351 538 611 737 737 1000 334 334 750 1000 778 750 549 750 750 557 577 750 750 750 750 750 371 366 750 890 611 611 334 584 750 557 750 750 557 557 1000 278 667 667 778 1000 944 557 1000 334 334 223 223 549 750 500 667 167 557 334 334 500 500 557 278 223 334 1000 667 667 667 667 667 278 278 278 278 778 778 750 778 723 723 723 278 334 334 553 334 334 334 334 334 334 334 ] endobj 8 0 obj << /Type /Font /Subtype /TrueType /BaseFont /XSFKRA+ArialMT /FontDescriptor 38 0 R /Widths 39 0 R /FirstChar 0 /LastChar 255 /Encoding /MacRomanEncoding >> endobj 41 0 obj << /Length 42 0 R /Length1 40 0 R /Filter /FlateDecode >> stream xܼy`E?^U}\=Iz2$d Ʉ$H#`9$H/T *xJ@ @Qd@WEE ^QEd|Iv}߿twUwOWS笧0B ;NiBm3@iҼ[ջt+B!_?~MO1?iPzڍ {W+B?}ʄɇկ#Xg'ݸo>YouA}#P!gO' ;#i‚z nRkV!"o1#T)3I= - q!%ԠĴ"HC*D2%w#?@! ˘cg\LeLs3@u5]TjPW_ g$ϴe3陱AuS?COC/ЗStF{. z݉@+1FMx5wYXDI6-Vbw8]nBj83-{QqGiYy^Tj} jHКaï1rԎw}uIL6}Y7t9:w v%KeW\z{u?CG7=|gݲ緽ۛw={[?^?߽t?/r >_ƫN™q(7~/\epB/ #bs?OpQmEil>jo=B8:>;a\]WEwGAێaB#z@YȃF0~CMڿAmp}-6>va1Lm(4}Kp5y5iYxKqVn^xaF{_opE};ڟl[u v&D/Eh-*ŏ?YB0|mz;mF0#th:NakD|?drļ|bywen1ysB< ij8>IVdb/I./mP ->mO':\'q3>'$5'ϒl {;#9[ /mcGAF4| 8<oVnC% D7"dN yZ?8pL&Ӄi`d+Val>۝aDz03E90w'2ɼ:ҧ.HZx~;p",Y0΁~へ Wx G&~Fc =FdB^ |D=J6XV8fífP~fs9|ʹytv.ne_a?p7)u!w>L9o/ 8 A˅"m.mp"Yd`FWU2:̋^u_ @%-' 5O/$;}nen'aHuUr_^!d4y LS9@=g[ ċq)^>&f^*ڟ",`|Adtn rOvO- kAϣ_1=H72ޗ#*gK An䏠W}!}E4O^=JKE uu͉fgE2jFz(-+6l%Q9!uX6GhdРn'&\vYSY3nSS;۝ZNҝXQ+PEꀈ>ԪmF(3(uozשΛf@]x/oܭ+!hR7R{`@z H@L 30ֵ،"W5b-L3߯Y0QgѠ]EAbɑLmcnfVoUxߘ_ 2kffJ1_ }m-<~K֭MDBkdyfTHR@TUkf4kwھ(0@]3rL$\N蟶Å\p_SW^ubOvQ0[./Lt(Rյ(i"$z2&c*)ehͤ2 >~<fdFԯnғo沕g} glgD';ͱXs^Ǩt:+*|hvBm 8L' MJs1&w" VLCWܣ+~^$bؑf1zϦxlƞcǨuжjK:J~c ( c\P^fZcnf7@=P':YAG-g诌o?esؕ^Wԯy ej5k+ f:pMݚ -#Yl%[ЖwS {vAz`ZHD3HX#s:a^YÇ|1\Ebr:Y*\]°=lφ~Qe]8t!>^IH9͟qƊeuAd+BXQE#+~s'J.?XyseliI8#%ŰL1La"N=ꕊ38Tsx~D5Ï'/88^/qJj37|VuyQq4u>71Om%ܱR]G=(.ut69nuȊ=98$[N xSXδY5 .F2@DÙofq~<|C8ji?'G[PEz rcx^dobk k ,P*Q\8 ׄb W8ZHM?'W~⏥[5%zzdX BiXA3̅],&9%K"YƭKٵ,mg ;?t5)fC\//֐nkM4~r-p! 0gΜdD,$aw6Z}`wo9PP~-g8ZB SQC"h$ޣxh-/#%hNyuQo{7Hz'yұt)czꆚ3'&9w=i6VzKKYgW- H;(zЌi8P+JxWV\uZ}Vz P+>wަfbI !1k;23fl篨gLD:h8GDGahn;V ; *rc2?^(.ԋdFK]^OqQ)-'.ڗݾv󫪿[WW|X_i.p찷^;6l힕}Mkok.9Q:-0傀_PQZxg糶%Yo$ EeEژ@(d}ZPPXVfDLײFf1|YAD '.=OxZ2"wdS2uJ*-8]mr!8yLA~*+*nTxHX!Fm l2GS=J9h6MMrq^g_ǐ~]K4x׃ϰh/ṩ<sg bLTW7|" BJ_\,}8s5׶! xgaꑥ7l!-jI؟aIc(NUU8%% )oll4z١zDO0&'ܦ''ѓ/4yXY 9'vѧWr̴7]Ӗl3>LI0%f=Ӧ~}֫^ԇ|?qzhO$^^ģBɀt28g̲ 1\C+p j.s-ܱf˫lV={iZ -^6>ҬF:4H4G^7܋}lJDg<Ձul,OMpߊ| +m~YY!;OH8szs9o%к s7 ! kogu!%X޸7;t i'ft Vv L9q#l~ *%2&2CR2y<)XC֒&Tςފ &˶/}'z#nߡ//^ߥK\}~UnI4@D q8G,( G7Obk$ BN{?oQ*oѽiGdiY ,W SaTab ?썴DZ-Mh\0iE=47)C2^[Ro V^X _'O^R_0.Bhx <' pw~xpG:(H}rV@^%oۄmV^]ImFgLOLLI9CaL{қS}G ohɰ؈b- a1t3 `Ѝ3y=vE݈Jio&/vcv%%E,Xn'G_a_<ܡG^u{փ?g7}Gޤ a2}a^) $4Zf@Vw5cܰW2K4$Y8f*̲_ޏ&j?h31BIb&~Û1)le#g"! =6~oO`_}~~iB؇}-i"PQ._ Y,VD'W >Xh[ڶ@!%慖օl Q@ `ix'wlZ$\`&f:w-NN: ȰSz5f!*Vpc **%]?f i/}i3U)gEpnjO-c`I[dYYY-4ejZաyXb=Ԏ._g篮.]~!,}Q7Ly[]FQ5Cf P+s=7s[id <յq};=.-^'aQgifY 1C4[Ix-A C/KPQ-X9c{\IXM <Ǽ1ϻ*g;e//HthT(1l(6ƠPD>jHfV5V,s_7ε=2,3xT GOh?߼~Š3ݸ[.C?s xzLrj)~s<<73fDD+{P  3"l^!`$K !~~<28̚j[ʴ׃G2  M9@(\l܎,I>Gn~cx/g$SS%nE"ZUscc Vaw:c 0^B4Z-E= 3:[Wh %C.L'oqQ\*ti.Ղ_\v{RNi[N^y7a8|kh3NU]GŽhS KL4SD%`9N8,}yc-u9 `vZ/ vʕg>}uu^A^3MsŕVnusuz+<ɟ\t~bPj) @%#\&pM@jڎ1` `N4cBc5M}SugSrlΣIEc D x֦GMX/~|rGgG֔]?_3.~Ew]zpjB+!f˦'[&F^3I(T`"JS1S3  YU `iVR`&``u ຤(66s1_/7;߹¹µ2ӹ @)&r6)*kI~rCק54;\k\-䶐4aĕ5$># \1i~X EccTŔhL&b  D J x2ڐ@ X _RF2 oyxMN}uO]}kՍ:.09Nx{gnmg~l;xƏ_}띋M[|9Œ:ژ^*"q<źŹcv[[8B9qhSeZgs=Ǖ.n5#X̪S*0*%`tYRz;V@vo͗KNvHR]$J6z1ygn~xG|crkN~Gt6l:z\fLڪsF{`(Z)<_v>U#v/>;]088lKy%`@ߣ~3zϔA6>7lCUl1V}:Zic\Mogs.LYv򴠱6mA{ 6{FN+ }MAmh+; oݠ)<ˍZqRRjL ^I|)tYFLwJ_p<+6p+}[l\jC.:d?rp+ޥ]?K2 uAk!^PKye}$$$ !jF-\qQDFB;BL9=mOa9:~ ??q)N) e\D~j!_er:=a bzL+H]ZXqNQ񞾞~xA%+lpAcl-ʣ`ܪe:q3XE +C<-(Xv(Q^ЖZfLm5V Po^kx<]m#?k=k]PM8O8}Ƌ$]+5nF^]XkĖ׌qF&Z_)(dlOJ{_>Aٹ^"YU܄^kQ #,dH]{G Aq3ų4_{T.0$/4`B!a,)mq#[AFHVpkľ™P.)v9,:[ڣU]xucEfuĭUm\-Mfl?ZG<S!&ۄ g]%#.~C҆#s=BJ2%وJ͠xS][3}^"M3x,?s}z* N*gjŹW{S\;Sʽ=+&.NAtdџ:&)DAi0VÅ`4AP! Š_1x t 1x ԇP"uwu+Z}g㷗_Qq>i?iRU^{b1mLuX)B{FjB"U6p!~A08IuEϧldHr6.?4D?b250K4Zj吅Sjh׹W2s,0CEnRe+RoxĥzK\XUnuׁ$xĠ*SЮHq*]84nȝ pl#GW$3P3mzc:Ƣ9c(e-=8@G4Gղf[-d4Ua̰/RV+X ,;IHrteU@FS|}F&_efvY~[zOcJɧ)[2_Z Eaai NBVOR|x4F|r5Nzq\i/IXfB/*+JRQjd!P$&a,!f@$F&eO 1.#\ KE,\ 9hRMf2B7 j1c,T)gh:W J!P.86TaeE 闹 1u'wT $!kbP S I~?>_/}׿dPn0ϏGF[4$L5X<S$"#"0 HŰt,0[1VZiԛMtDRV(ub~)w̋X6[ w +j rj***ߊYp,܎+sg7&02F")kFS CZ.Tj 5x5t&DBJN4hTh=ҖcXމTvawOq{q)f]ۯiwxD?ӗ_{$|~g~>/@iA-pJZ6s1Wsxw#{jEAڬ6$zÛd ;DžR5J?aSF"~CI_`KM0t{o<}^4q=W̰}MħܺQ.ZZ~=z_,WW+UAIف+ gy!V{0t@a}u`Q(?j`ݠ?/r) fȋB{G#<7"!˓ÓhX9-dhMf7PBh|lǒfsH< #<-.>1)W䑼&33̅fFvuw[`&ʳm1%BFrN3 .z1NxQ#)3J.l)MxS?ͺwve܈xIIZĈnx^7_[w @wEԦf,kwۮffi^NSd$"/{E::&dwY]6vmulZ - VWx6\2C֧U]fv[lu&qhdQ87x_Yj0B"a8ϼB3#rch5C&Lֆ XӱJu|Ad='ߨ[<۷G|aW3\ dq1 u 7CX?Z\a1-O^{h FiVR&RjĘH+5nFB9qN8(p 7 P5uNgy&P{o>lr(F}YpR.,] \1tk+м]k ƞj`ʵCʥ?>]+ǜ1kn>2v~OAG~ _ԟ޷4L*,gLK2 c%9Z@*d aR(s$eD Kui2/-\U;cFI#YGX/vP}^J݀)[;Da'j^}({ }h!,Qtx$\'V+쏸7y*{=OxlQvJfj9B-XA/D l' 2zt f7['x^cz%X 8tĹ&ۗ4pn^gK\!0M:X6i_fbuk'l͂l8ǣw!4:(7CQ||~q_mFn3}Wԝc<|`BT\0)7Ո3-dfH=T~2h] $˲-ؤKFs=r /bADvɄoҀO%n%{(NyĔ<[@Lwlo#V $m_OkUSEItM;sg њx'gU rK]P$|#6"K̽ý'c} Q$>ͽ ?k>ȻR>Ȫy I~,6^窥HAfiy+2.IxAPE%k2;0"53l$)!WV .d?h:Pf5tNJ_L|dL:bKoxomj٩U}]yeث ;,sktO Roя'ؙ/"6BKp#K{X}" =c,MG £C3n!GZŗ$:nWZO@w\k/E/gWR)EgDNO;0Sh$L_L10G쏸h?FQG-1Qj(Hxd<9v:% 'y"d3{+<˳`*}e-YOp?rd3]R *_d:TOSg?^"?FDỎqan Nַ"0ѽm,vq{q{;z +'NgfјiT.ٓ9=+> 4VZM&B7+T }:@62l{ ~5ATi3ƅYAy*njb,-3vP|v,5/CSW b kiʰT` -ݬ`]׌#\6pGWLݣb)Ral&fnfꉛ5qG .^|‹k㽳_jKֿ5)33Goz!fW76tL![ծޫܳ|HZ_8p窱Vei(T]-͚B+a2"Qi}T^:Hhh_m/_rU*CFI6[n($ .JidC7,q҅0Q[ G4LQ-YPCQ{D1i*?Uꛑ%jQXyʩ-t%߹'ۡ9&Z6m nCi_qgk7)7W6jQnY[@6V}}#~}w98 ՚gROͷVVsls|c ƭ[-?=nBYc@7݄4ip*^H%+`zQ,pA!M'bgbt6KJR"3ۻuSv׿NxaS;oﰧ)}шo;ظ[J37;nZVu$է7L_7_(I.2&j6jb REhLťҵEC"F$bϐg8RpIE^{_v~{ wbQфU˦M^ظZElr~ې}f g!xTQzԲ^y*XZr?˲ cхrMs=;1yŚfKskPܭYqu76`^i^8{5fAM=pH .c[N3 $g5x轋59|Y&q;7鶰Ylq|]1˧*}Z v m}T,ʤq@'# 79:2=lbG9ty$7\IV*GFV cYiV d;FۜX ܧb#$@S1&6E9bFxɯwg`Gm'5 Wak }r 1-*=|_.XUQl}c:mH:1RKm&lb6d)W_aI<\cnQs'"FIbI]n\<%M͊op;8m\OfV|G}g|G!W6dgV0'֑ns5CSjI/.QS qC_Xupc5!:u6_6y?ulI+àƻFC͹˕4L"RtH@Q2:i'8x6ʹaPV&hFq8;8* -MpN3=Ի /\F/|HSpݭU{z{{DыCnE1+ҿu'ٰ+J`k=bxY(Lfg l[(DgiRxv]Ψ_anބ-VH f݅ zvw2?Sɹ7+b؍}m[\`HSeyx"u<#`؋<7T*NǸGGGE9u16yBX`b8Rΐ,1y ҡ3&x$5y&^j Qq҆ǯ>}Ugة5kbxZWl]smܚG5| ^myBsat;wؽxco~roۉ>eI4^ϱWox'y'ib-8#ϱ_il^UMS5ui_ =>:'|F4}6d0X ٸ5?!Xp||ivKfl6 Oaѽ Tە=:ɚ*DSGH=˰;kom>v>v.nT9#xβwa٭Hjk:su:t퐋dh?iWWV۝2;gaBBoHIf&3l8v[쑄$S]wnZ^TꀾpRz3PĪaz;Q{D;skO[|{c\Ң k =GJVOJy.{Q֖З0d:8ajˌq[@gѕt.um[cj;`;nmpӷSS֚#$e&9j D5}^%+zhu4V}.洳Gd]+zẺՋw?/ŵc2b` ƪzVgnnǃ t^6Ix=/L4&~Ã'l)ν6ǽݶo*b2sC,!+4VdVdUdWڪL6yYYYBN43lؔ!?Zp[-{/8u8۴3 Fgj'~Fc\9}J*Yg"vZo4YFϧ2r:9,!dg#\8zWXd9CT.]oq= i B5 I}]0f:J>kuJxN{S\*aoN%ͩ\j]pf&I$)u%p^Zlν'˕332Sggҙd&9#Q9e,kdDgBp8ծp|eP!m#/]V|()zK[:TB_*?gMIg՘ *XE1#]AC('wQgyrf{'wx*H*>k0=e_b;P>wa»ѪyXr>V4)j5YOqZyCNcwvh I̶|mN5ZrFK_? lѢM8VQ`HkE͕weuFb'EOc8rzi?I@/z N9.Rs{xQZрfΦJե고zPbȅzޠ8hU'Rrz`r[LkRsUiT/qh*n "=_Q^&/9HLϪil O \_HE NÎsc\&O$39'q3PLt8CR220=h8zj$q3x:UpfF#[mRUiT]٭ڭgƙP(W:7A*vRFc6u.O1AzqW a76ꇍ6~6mw]mۺwo?ꓺ'_—99ݗs"į%]\/Ƌn|=vwx; {!0W^nB EYDYr4\(y5$&KR:B\p`@@E$*t5%yn1 ar_'>lLUX/Lt $#9ݰJv4tޝw>n)i/ӱ^< r%7NqO_:bĖI[&ݑ's#}pƤ |&OS sWvr# z7)fBY,6|Bn@Kګ|o$@xI6+I Nċ|7D>E?WTN"O7u9dKCh8H4Z c lpO[Qpcr}aNT& vF~ j֦%.\ S>FQt_kcBg$[c?%cɎes$';K{ =;婉1hjLf@/zQ''Gsj74(CNCf0J@L,MLTr{G[ o"]3YS[b-G8zg#U * )cd}VzJhIȬDn7$~8k7B{4Q sq-ę* a[mI &kbO-FM o;, *xKRdv,]zk) *K}w,p;~3~ҷö7yTfz/zҰHFڸ p[mOF^_?&E@ zҊI y* :}Ŭ؉ffY4%VƜ?3&haq'ܠZ0wp17hnZ777t0d9:]9J}V. r.QD#ț9PeLj 2R#avyfb9C5h:9͡zlC:HM4"%m,HR"23b4[s9 ">oMJK:]k%T]/{qQ>sa"Buz@j,/]=c9{ Q 5OO@Q{|lKy"}h8aG b4u9j7ksoWkf 5ib,KR;sY)䡎4ۧ)kFoh.̺} ig {{thl9nJ5 {6Ŧețcv(nJoBq#Zf3vOvkur/"w1"8 lsժisad&H]/4w. VeJ(5f@RL}"{J ʵsX#grHyy{@(-,JO_kmŊTšyz16;h™m\\af_w ͺ.UlZUb5IJzlsג=z6dVϙ}kufiކ?5Jߣ/iWӔ9$9`ZyKӥ|kq8q8^{^sJ{!ERA820~⭁EIRuTePgO*+v'=U~ 3[PöYki`}S䢅Xnh{g1%פtц-PV`Jܮg77l~ >yi6 %;m^"uX*BTtBG"ǙvXĢ]˷yt!Vmh?[aa+-m{EVg5lI0f3ݣF_,ZR]ݩUij{*>tG9h4_x ,6b[f?9p$ Jh(:pI;ptӏ:^|*|%ߕ@E5;iF%YOԁ*i^=y{|7翞40=hß}46G|䘴N_JlGv6'J[an֛Wk$YTzcqnضxw_t303ThTZPgByet앲_$[2wB]PU@{⴪RP0>|)GS9 t!|&՟ܢVrwϝ?a9%( _U dи܍frw;}KMZ^eiܔd~uOC ^%FbNO躭9!h@}#zs&{1)`rΔdGcN[NZΝEYrC`:؅Lݚ~1ةՕmmģ WM; wO jWgE+ +awspNiV91G4?5Ny87P{(sm$E.˛:P?msŒIW7XH `;o"u!@k>Zd6ꓘQ4ΟOqHd;MU"?Tp,б/0 87G: R*н'EޒBB2p^^G"l6s1WE"?T/Ɏ-X=[a {64flScKa0)ԧi/J0 a!4Ю~&Z [P3xF>j<үBxa  "ϛ154ނ+0-@x]*TAǴ8]vJ\ʿ cLS蟄Kӈ`܍ݕ*Mf(++-|.w \7`tx4F-*Vn,d0,O*y#[ǧbC- a,@hN|Nu,jʴ0Y> ~B50ab͚1 r@&*Q~mj?*ӇOuB*Չp=f\NT6x%k~E[`7B/2z='0& ]W"zNX:r=._2}<ā,OvTvQ}CD4LO._gB*(!!O \@n4ag+w5Ug.jIFԴijռ)4 wjkݠn(0?0{kM~2ƲÚkcҶվ~qOz|9) 2ӞK,)3zf<:_VݙI/dgWd?snbnok{"?u[~Wo ~0e}Q/%..}YiW.oǴ> }E♊~Xt*@oY*iiRp4 - & ~ eyH`UuPoMPp=糶(ܤڑ P 8^# NTt\[ #[W#kH:Z&s ]^ܠ4U(t!5j')8IKAMr`KՓu#kߘ[yHNi c<))8[LQpԷ9 ڬo} 6SQV(8[ &>oo pzBKBGYe4#Upf2H˒ -hKXyH P[~cDhf"YzK e!=cTÌV|<tivR~Qa-b.%KYHs3s2!`ڂ(˵\#VYraR-yʧ袬Q&aTYZ[F9X4}Qrcu+!\2|&?hR~&0Ft)D\kʆi #DM _B8L*t帻(4ը)bg4>x ݌j@)i SREJ;%׀"ݠRZ 3-gNdYho*_SrSz=Qiq2_R} ):+mi1L>VWvLJk{62N$ӵ;0YoTjfmNd>ݔF.[Ie@7㒥=Y^"ӁLawDuwG^CnMaE˦zO9tՈ63~94n:ir=LZCl,Ev%5ں7(}ih$ɯ8NXQsWR2Պ/MGvQuR3J̗Y.#_h/cSWVKJ%L. beLr4$P,EEmtiO$63'CvjfI z aVXmNCeie 5$N,=V5T{}SҚ^t+\f:xQ.TafF/Cm4 ӭ/y.g]Z,n8^cdwvJʗpxa'Ԃ<C 8ZwE8"}R -WB9 8@cƺ+Hza!/>%%`ąP0PwXR8|eUUExU,+k"aq?mԆxsH4YųKż%P0OL`E,V?)|=_hƜ!@8{Aҕ-b/"%b7#>$+ \ mBZ@+]@w_Ic>ZhBİ =p`LQ.{7R8 žo/vBn,Xߠah(!,19Z JTA811 =fE6L ;"DXaGe7ߏ(+&?D=p5. a?4d:ևbBr|k4|e.P"Aqm`0(q t#ohȏbc"TX#f߿IIJQwi~&ވҐJzaT)&M(l_ b1F,T$BcGP5(2x;[ĨА'mIPApx7YCb$SPp b+D斔 ( [( D}-x1g,K664.mm\T\ ^ո~iKXhE}&IڇbK fKaLcLܵIRnm(g֎dD`:o}kC~?b|.ڌ3rAfvSucCs/q*_ kU$V joW4Qc6آpd|3p_0߃mhC?,wWaM&ˈbkwdi|J{/-$0_d.%XR@oeXY6[ZӭlBҲ2b슪*kZ76FzWdC:N6T싣طP84(.Įoa7 hB;`βP-QlU^ ,bQ3K~ģ|`#*oth҃h8%,`NHH4H .42! !r 4 q*RfO 3fїhFldsaT0j@¼.P_&b4B>x`?< spF !8 "x ^DW~kSxހ7gsx ~k N5 ;=|'$|cONß ,-H]UiniQ>-R'ZQrw`wwn"H;c|hy.8؆uuaWdp2؂aM;7 ܈-A" ccB!B!1C1CcEщ8:9:qv"G'hFfhFfьь͌9qH!!㐐CB 9$!!(ER(ERQQ9Jq!""CD9D!"" 9,aa 9,'@9N 8' 8'8'7|Pu8G8GrGr\)z Cقa=ǐcǘzE((r"(r2QEQe1c9Fc9Fr r0Q+]5MMKan# 0w oA{Pap3cn\Z24&a a Ba/W B2ap@xEPNYLWs@F}@sBÉiF]SJZð΋z*弒iEy( Z;j8*98iw*ݞ3'Nט{k|O"CaBB. }Dy $ ) VU+Ldߡ4=|̓|/yJ,C1OVG^}kitNb̘etsys͘-WOY[McUH|̕iáEqƕ#=暇N֘RkC+"=5uU0C!m< Ӯ\ `Q=yt~;NVIzѢG5V8>TQ>ڗ=zU캻h\waw$\7ӒݵUt]]> WG.uلv=#lR䎹厳,66$U%9rEG`LoA8*g5a-d 3 i-Qj-崠u݉tCCOp O<-r*h9pF&ei= M]蹖q_~:{5AS9MĊ¦QݎmZ5mԶֻҎ!)IjklU ut*i>If>6?}tE&2ڛFojm;™9S}.:mG!\CuHv6' xd R2OP2#΍HIӛz ;X_wPM.;\FunF-6JEڲE|˅$E.FBLbKld$W!$`iKqiyHS/($ʢ[^gwf:GЗ{l,=%> endobj 44 0 obj [ 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 750 278 334 475 557 557 890 723 238 334 334 390 584 278 334 278 278 557 557 557 557 557 557 557 557 557 557 334 334 584 584 584 611 976 723 723 723 723 667 611 778 723 278 557 723 611 834 723 778 667 778 723 667 611 723 667 944 667 667 611 334 278 334 584 557 334 557 611 557 611 557 334 611 611 278 278 557 278 890 611 611 611 611 390 557 334 611 557 778 557 557 500 390 280 390 584 750 723 723 723 667 723 778 723 557 557 557 557 557 557 557 557 557 557 557 278 278 278 278 611 611 611 611 611 611 611 611 611 611 557 400 557 557 557 351 557 611 737 737 1000 334 334 750 1000 778 750 549 750 750 557 577 750 750 750 750 750 371 366 750 890 611 611 334 584 750 557 750 750 557 557 1000 278 723 723 778 1000 944 557 1000 500 500 278 278 549 750 557 667 167 557 334 334 611 611 557 278 278 500 1000 723 667 723 667 667 278 278 278 278 778 778 750 778 723 723 723 278 334 334 553 334 334 334 334 334 334 334 ] endobj 9 0 obj << /Type /Font /Subtype /TrueType /BaseFont /XSFKRA+Arial-BoldMT /FontDescriptor 43 0 R /Widths 44 0 R /FirstChar 0 /LastChar 255 /Encoding /MacRomanEncoding >> endobj 5 0 obj << /Type /Pages /Count 2 /Kids [ 4 0 R 28 0 R ] >> endobj 45 0 obj << /Type /Catalog /Pages 5 0 R >> endobj 46 0 obj << /Creator (Word) /Producer (Mac OS X 10.2.6 Quartz PDFContext) /CreationDate (D:20030625170937Z00'00') /ModDate (D:20030625170937Z00'00') >> endobj 47 0 obj [ ] endobj xref 0 48 0000000000 65535 f 0000001615 00000 n 0000000022 00000 n 0000534476 00000 n 0000001635 00000 n 0000620292 00000 n 0000001741 00000 n 0000557239 00000 n 0000588508 00000 n 0000620116 00000 n 0000001986 00000 n 0000195971 00000 n 0000389956 00000 n 0000428905 00000 n 0000457010 00000 n 0000485922 00000 n 0000513626 00000 n 0000195948 00000 n 0000389933 00000 n 0000428883 00000 n 0000456988 00000 n 0000485900 00000 n 0000513604 00000 n 0000533617 00000 n 0000534456 00000 n 0000533639 00000 n 0000535379 00000 n 0000534512 00000 n 0000535399 00000 n 0000535508 00000 n 0000555961 00000 n 0000535631 00000 n 0000555939 00000 n 0000555983 00000 n 0000556193 00000 n 0000587214 00000 n 0000557409 00000 n 0000587192 00000 n 0000587236 00000 n 0000587457 00000 n 0000618818 00000 n 0000588679 00000 n 0000618796 00000 n 0000618840 00000 n 0000619066 00000 n 0000620358 00000 n 0000620408 00000 n 0000620567 00000 n trailer << /Size 48 /Root 45 0 R /Info 46 0 R /ID 47 0 R >> startxref 620657 %%EOF