pdfparser-0.9.25/000077500000000000000000000000001257674555500136225ustar00rootroot00000000000000pdfparser-0.9.25/.atoum.php000066400000000000000000000041021257674555500155330ustar00rootroot00000000000000addDefaultReport(); /* LOGO // This will add the atoum logo before each run. $report->addField(new atoum\report\fields\runner\atoum\logo()); // This will add a green or red logo after each run depending on its status. $report->addField(new atoum\report\fields\runner\result\logo()); */ /* CODE COVERAGE SETUP */ // Please replace in next line "Project Name" by your project name and "/path/to/destination/directory" by your destination directory path for html files. $coverageField = new atoum\report\fields\runner\coverage\html('PdfParser', 'coverage'); // Please replace in next line http://url/of/web/site by the root url of your code coverage web site. $coverageField->setRootUrl('http://test.local'); $report->addField($coverageField); /**/ /* TEST GENERATOR SETUP $testGenerator = new atoum\test\generator(); // Please replace in next line "/path/to/your/tests/units/classes/directory" by your unit test's directory. $testGenerator->setTestClassesDirectory('path/to/your/tests/units/classes/directory'); // Please replace in next line "your\project\namespace\tests\units" by your unit test's namespace. $testGenerator->setTestClassNamespace('your\project\namespace\tests\units'); // Please replace in next line "/path/to/your/classes/directory" by your classes directory. $testGenerator->setTestedClassesDirectory('path/to/your/classes/directory'); // Please replace in next line "your\project\namespace" by your project namespace. $testGenerator->setTestedClassNamespace('your\project\namespace'); // Please replace in next line "path/to/your/tests/units/runner.php" by path to your unit test's runner. $testGenerator->setRunnerPath('path/to/your/tests/units/runner.php'); $script->getRunner()->setTestGenerator($testGenerator); */ pdfparser-0.9.25/.bootstrap.atoum.php000066400000000000000000000007371257674555500175610ustar00rootroot00000000000000 Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . pdfparser-0.9.25/README.md000066400000000000000000000034111257674555500151000ustar00rootroot00000000000000# PdfParser # Pdf Parser, a standalone PHP library, provides various tools to extract data from a PDF file. [![Build Status](https://travis-ci.org/smalot/pdfparser.png?branch=master)](https://travis-ci.org/smalot/pdfparser) [![Total Downloads](https://poser.pugx.org/smalot/pdfparser/downloads.png)](https://packagist.org/packages/smalot/pdfparser) [![Current Version](https://poser.pugx.org/smalot/pdfparser/v/stable.png)](https://packagist.org/packages/smalot/pdfparser) [![HHVM Status](http://hhvm.h4cc.de/badge/smalot/pdfparser.png)](http://hhvm.h4cc.de/package/smalot/pdfparser) Website : [http://www.pdfparser.org](http://www.pdfparser.org/?utm_source=GitHub&utm_medium=website&utm_campaign=GitHub) Test the API on our [demo page](http://www.pdfparser.org/demo). This project is supported by [Actualys](http://www.actualys.com). ## Features ## Features included : - Load/parse objects and headers - Extract meta data (author, description, ...) - Extract text from ordered pages - Support of compressed pdf - Support of MAC OS Roman charset encoding - Handling of hexa and octal encoding in text sections - PSR-0 compliant ([autoloader](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md)) - PSR-1 compliant ([code styling](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md)) Currently, secured documents are not supported. This Library is still under active development. As a result, users must expect BC breaks when using the master version. ## Documentation ## [Read the documentation on website](http://www.pdfparser.org/documentation?utm_source=GitHub&utm_medium=documentation&utm_campaign=GitHub). ## License ## This library is under the [GPLv3 license](https://github.com/smalot/pdfparser/blob/master/LICENSE). pdfparser-0.9.25/composer.json000066400000000000000000000014301257674555500163420ustar00rootroot00000000000000{ "name": "smalot/pdfparser", "description": "Pdf parser library. Can read and extract information from pdf file.", "license": "GPL-3.0", "authors": [ { "name": "Sebastien MALOT", "email": "sebastien@malot.fr", "role": "Developer", "homepage": "http://www.malot.fr" } ], "support": { "issues": "https://github.com/smalot/pdfparser/issues" }, "homepage": "http://www.pdfparser.org", "require": { "php": ">=5.3.0", "tecnickcom/tcpdf": ">=6.0.050" }, "require-dev": { "atoum/atoum": "dev-master" }, "autoload": { "psr-0": { "Smalot\\PdfParser\\": "src/" } }, "config": { "process-timeout": 1200 } } pdfparser-0.9.25/docs/000077500000000000000000000000001257674555500145525ustar00rootroot00000000000000pdfparser-0.9.25/docs/README.md000066400000000000000000000002071257674555500160300ustar00rootroot00000000000000# Documentation # PDF References files has been downloaded from this url : http://www.adobe.com/devnet/pdf/pdf_reference_archive.html pdfparser-0.9.25/samples/000077500000000000000000000000001257674555500152665ustar00rootroot00000000000000pdfparser-0.9.25/samples/Document1_foxitreader.pdf000066400000000000000000003006721257674555500222240ustar00rootroot00000000000000%PDF-1.7 2 0 obj [/ICCBased 3 0 R] endobj 3 0 obj << /Filter /FlateDecode /Length 2596 /N 3 >> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 4 0 obj << /CA 0.498 /Type /ExtGState /ca 0.498 >> endobj 23 0 obj << /Filter /FlateDecode /Length 4893 >> stream x츑}=E;m ^iux,E[gK @"KÎ.D^ex̷p% {[- )yq?;ݖ!|KӰ,C3~sz_?^?#~O7O߰8a;Q__l3a6!Yw#p?t1{\ǐE 2kG2cY4e18aLCPG `q^O%O4C#.cF!􆿣/;%?>4#'̓7>Kf&iџ>w=@D"6y_f`ZK5{n<65sF>J  Ə4Yos[)ƽl wyВ<ݾ4T7۞^ ^"\~䛺?sp|ڮae(LuڼLk4YbD+/a/ȺM7 ¯ADǼL):kJ.鶏Uiտ_VlNqٖٱ{We1;uZc[:ym=>Cex3>aLFhz[Tu 2FKnQ'iI2[Uwaܯ2Ƭs̷jm,:QP$ H`T>CR0?l5%Lՙ P.q\EF.Tn9gDX ! X?eN,0ΐF7NzNN|TؘyhP>pF{>x٩31bC5>NTֹڂL^GA$Y]vaxduq$ ޙ+#1T$z6pEvv;W0;az>)8 at*ryUSq!d!NO&VFo9a;9JVC@=\~έҶr*ZL?b*QO= gouL ذm2y;G!ThṋLFiwKzpą S|i}Ye~',mOh'*ݣ hjZeNmC#G\+7״ / @O0`F>'@bʹ fY9S!٭]k0FpUR-KJiP2fQq-1(V9a?oCCE;u69ӞuCxL={djZ9INGL{%YxLoi^`FTf~ek3Agq6m\`\B}nq$s=L?` KS7G7|=i4sWW-0K_}oԷ{ P=jT:% wG݆L^u7}b6 +Ai*`g|7Fzeb:ua^zdxVZsO-?{;0Axq:SZL9UEy_s ',y~|!5o\ʎ4^(!)?QӼ.4!L1}a> ˷R!Av;w =!7JĢ%1,SJ'֜j]1Q5WPb8AΪI:*ss8N3CQb5z<;}os|5sFE}5"g}AɮRN[YުO1UP1smkI[׫B^& 1.[= ,? Hltg! 3]l : ni>GNׂ ow?iB^t79NRkZhI001w;N,>MZt~5q{#>_KC^8,7{a~m2nJHH*-, :%&f,边uV4o٭CfZw4m9@L42_i_![FǺ$oRИ6!hY`"8?7y UF c_{]_ݰoN|/֡6ζ^QD`XV‹ELHwz#6ۓ`KR2RpT[gyo9 <ʛ`f6,ڑx8X?xRc-- L85ntl/yb;aYR;(W(Q?o2Ab8 (}k`tdQ{ TyBz\Ϫ:>]5/O ls}VXFm pٳq}hԄ\dr4umlȄ NK|qا{go?2{? 7&q kRi灨1\+:j Z5AVCLyQTa32U^rfMG$<8c%DRFs:EXrN֐68Şھ^cCR)60#LJyI+fUY7EcxLScBRmjThqU":ʟЃk(OjOu'N7KP)iD$tuKlp0 :Uѫ endstream endobj 24 0 obj << /Contents 23 0 R /MediaBox [0 0 595.276 841.89] /Parent 1 0 R /Resources <> /Shading <<>> /XObject <<>> /ColorSpace <> /ExtGState <> >> /Type /Page >> endobj 1 0 obj << /Count 1 /Kids [24 0 R ] /Type /Pages >> endobj 28 0 obj << /Filter /FlateDecode /Length 12 >> stream xL5 endstream endobj 25 0 obj << /Ascent 778 /CIDSet 28 0 R /CapHeight 500 /Descent -221 /Flags 34 /FontBBox [-1109 -298 1373 1047] /FontFile2 7 0 R /FontName /FPEFAA+Cambria /ItalicAngle 0 /StemV 140 /Type /FontDescriptor >> endobj 5 0 obj << /BaseFont /FPEFAA+Cambria /DescendantFonts [27 0 R] /Encoding /Identity-H /Subtype /Type0 /ToUnicode 26 0 R /Type /Font >> endobj 27 0 obj << /BaseFont /FPEFAA+Cambria /CIDSystemInfo <> /CIDToGIDMap /Identity /FontDescriptor 25 0 R /Subtype /CIDFontType2 /Type /Font /W [0[658 705 569 469 597 890 531 604 365 220 314 308 ]] >> endobj 26 0 obj << /Filter /FlateDecode /Length 278 >> stream x]Mn >,E8I#YR.R o_8: fK#nkB/$780!!rF!!N.ű$.9YU@ G#.1Ue/Txv~ퟒE# b)CC倐 ʫ E]Ͼ )Ҵ(5..b񸏸KC5{ 1hׇN49">Co-y Cc1n^)?'gsnj..[64 endstream endobj 7 0 obj << /Filter /FlateDecode /Length 7614 >> stream xz T[י>:z!`ld1v;IltHI1I#$Iis;fzCog&$+Y7}iݙ;msi\O2}&u{{ D!thшN<#Y*Z467 A}#ނZ}-]{ G^BLƲT{^ ;;:ǂ??]fxLﵙp f09?<'I蔖IJY!р&UtSdYYWNwS{ᡨomٗk 5fX29]K-N`*][KVWgۮwb9b+RbMS )V:ZWgB唞.R.-Gx^M"hWېG?HkA6 ʒVon/Ǝ1s#P_;Av IRp)5^FҒP]XVY[Y7apyVg48<9"xջP]c]~#{ӓco LD[SOSl4RXk2Vz ݕ6~p-Tb*)*(*T;N W=nބț (15{eИpom:xMj'.=}j;$_Y\M'ǯk xjiCv] ^0JU xSoIv {eeT J-R 0h4]JNYJwt],R1?PJJ?TTד3th+J{tP[Oa\|X+c^.G2*CC7֒+>+*O m=0ڥ %#\I}j_*).RZk]#e=E9vj^ppxzwl#s?_v_}TO< :Z_T>+(,1kȫـ=@ (~\߁w恞~"AQ8p{ BEHtwrG Lȃ`}( zBvE(FF4qR)TDG$Z tuRD6yVuK}{G P~D_cit蠡R %Ltfx> V hU%Z _hqV}R5D o$ZfZuYz6I f^g,ҢEZH~i"-YE?g,ҢEZH~B D 4 SEFi3"( 48K8XIO(2@s'{׏h77QvL0 !g_\q׆Q rҩX0#Z:N:+*IKxҷgx>Fuܜ@_P+t3G,'Gh'ȊsxD4$R`=W H`Iı,Ē#{㉜}4MWcÎs8 t IBqR{ȑ4Iq'v $b?Zm|g,G0I8,9S#ϐ(3(bD>OW^Dn -E0&F8g ؔ;1#BtVxa%?'=SzW 7џ+:@<4ћ˥ v'%McJѳ 㒔g8^1CY@*VjUT^!)'x q3&$#g,fxn<|W4X^'4gsxg\rɮ)&8dPm2s6;E/wa~&IeɯrO=._DGSV9&ŵy%M")4g+o _SDQ=s"V| div w%&]ya=&,?C"+ڲ^}R>y 3"MI/<""`Jʪʓϒ'@jj}ZCŜt|Z\QdI鮈= "Aԝb!c%w5*C2w*))tΉ7xbB~o(qBzcgVU dS*J2㵸jY~Z'{I,82'[A :zosnYK#(ZKĐ:ݧǐYOQ4w+'Ϭɰq$X"qL$8f&T4=lIOpL:zO0"8e0dòd*a`/N&lL4 MŢq>Mؠrt|lIgRd(L$L39oM৒I$jiSL&‚)1!?cDZYh&LL%&yvx=4vh9 i G)Iqn ¡ TGa[44c&&DkNXq pJi)a6IL$&w4cR9rJG1aS<7R|z:!% stE8iK%]d[)fǧ?!mf" IЅ`L0g1I]cdo6A$ց4i$dE4 !+q? N ˤ1  NHt0gD))pR'T4 QMʾjkW.ׅyA@VhsKi慚IJ؉p<` J?Ŧ1 <7X>Ș=Tޟa3byp! L* hۗc }rBFS fcH&xfffZZ‰)KLddL@/%c,bZ`$ fDa; cp$o/L[ صeXa{ݟ?¢S]7` CCWjjjWT+lo7r П/?4Я ̌,~!T;jAAH1?Do ̿8S _+6,exoq%<]Exس0˨@< q_jG.F~ =Pw58Uo7w!Z Z>n{[蝥-倚R] "=sG?ء`Ⱦ{v޽H{VOKs:WlWJ%XThJI+(D[_T( ibýyd;flV *v{{e63~A_F|}.(\;Se84|] h(O;:AGB< S*dֵ5jKeM >Je: B1E!@ZʺT^}vcN?r=`Lv$`n(=(>X}0ЂN=feABaw-(PA!ςvT^`xefq)dXD%u`fZ ɱ v#B!`QBG:<a0kC;}8\aP!}skvO`v M;ۢ fˠnެ;4?ڋCɅq#^`an=G$n; :I6JBGGYl(S/7ЏC_9 vpn1cYUqN'xG^X҂Cx AwX*h\T-N&%j\BsךG~X/(߷zp(Ǧl&y.hpspXDADBb+rz"MM~ eN?ʲsN. ٤?ĐBŠ` E.!,p}U,=NGaέ]R!peM PL?.5P!삩,(t 9&%~nYC]~YL <K\p|E0Ao" q kgrCNmp';YtzIk`C }q_+$Ja1sC)d# T̬ɼLnAf2&3: v $PU*)tYL! ifIY6XcryvqAʛT]8qŞPkP+ҁ2w` LGJBО^\*%v Ћ]O 9.m p,ɖрQl5|HK'HgH?OI%Oҟ"0H?@ݸPu}Ў@K@; sо%h@h|@v#NC/A{ +He?ty˿}@7.X~,~:U.VNn" )3UKO;fi^+{MOrgU2Uɗ^V>}:4O)5^թ ¯i&\h̦]\G:sٺg/Sݗg.)ܦK=οD0/; ) 8)TJOw =-{F~4>|͆g(9hgTǡٷZm[V&jhj7ZխVcE-Ep5TÝe7mo>(jzGq.jrkENc"fh2:A)0JQ 6荃FmC>zBi}UZ=z6MǴWRk1کBj*+(K 7,7A@%hPowۺݖnc[MwQJ ^^=H3#B{P(A p- pCcEOBQH ]%p5l*(aɪ 0 vg{'ӫo7u?$vl_hB0뜾U5 4Ɣ`z޵,hC#ƠXHpK? co:^@𖲠*qTJheJYBAB+>>~~ƽǽ˽{{.:*w[n{]Y 7===qGS07 pi>Ԯ؉ endstream endobj 32 0 obj << /Filter /FlateDecode /Length 13 >> stream xw} endstream endobj 29 0 obj << /Ascent 750 /CIDSet 32 0 R /CapHeight 500 /Descent -249 /Flags 32 /FontBBox [-502 -306 1240 964] /FontFile2 10 0 R /FontName /FPEFAB+Calibri /ItalicAngle 0 /StemV 80 /Type /FontDescriptor >> endobj 8 0 obj << /BaseFont /FPEFAB+Calibri /DescendantFonts [31 0 R] /Encoding /Identity-H /Subtype /Type0 /ToUnicode 30 0 R /Type /Font >> endobj 31 0 obj << /BaseFont /FPEFAB+Calibri /CIDSystemInfo <> /CIDToGIDMap /Identity /FontDescriptor 29 0 R /Subtype /CIDFontType2 /Type /Font /W [0[507 226 533 479 229 229 525 349 268 420 527 498 799 525 391 525 525 335 250 423 525 471 252 646 305 452 525 855 579 567 268 252 525 ]] >> endobj 30 0 obj << /Filter /FlateDecode /Length 368 >> stream x]Mn0F9,E6 !%$XG=1CT 2dxQU/@g8(cw3 gh;QvVBBө٣{a|L3nȲNY`o >Af4ºlPݼ6?[0ϡK==B?UT|.#ARCX+4"жm9P7gDV}׆&PڠC0#` -1!hϸ=3H+=τ!ecFM=m7e$_G7HIHG}f$ߘn}|#| |SA%^ znRsEJֻ0?~, endstream endobj 10 0 obj << /Filter /FlateDecode /Length 13098 >> stream x|y|T9ξdL&d$% !@dLH0YA(ub][bu2ZmZj+V[mU$}=~> y=aF<n:6qJy!ϓPM+zn+&}#[v4@Zq_;jB:x\2ZaC}O2C:6']Ь*]ԃW! W|Be;uF$GhrEUԈO"=^bc*U)\8$H0 dp\\l>T?)q*;g>e.y/Jά\lDXc8Ҫ&pR JޤN+(,*9bJ9+_Qpe+q^!y)eS$(yEI Io(M JeN%gޔ|OyJYx5e5*NPL$:s=+ Lk1bUJI^xRGF:ӈ0 M}"z\{?::;~G1ȁȃRqVԲLvg(猫W)_=EȏrS1P$٬#1LU~um[~sqU5.Y4ՍMF6:1֌4{?㞯]c2]185ޢNU_̎?<՟0%„X3u/QE]j{:Z`^8DxaO !#!6sMk)"eLpd9*0ps`T r3'+`x9 '%>Y0F*#3<7me;[Z7:dV,:{EgP[J12bKZ76?/3ƻ1son.ygGE%Ct*ZtU*]<}U%:Bӭ*I*_8 `lW7Aet qKVp첌eU0O}K <"; I"X#_ʤʅJ=2IȆKUf,JEp8 BF&X#JB0ƗA+~h]s̻;c!-"$s?VRbrQ<ۤR6)Zo?q{rŎ~'U.' ORaϋf,Ys;_U9%0_gOBR Y g& \ {Fq45i g{d ,qhp6N5H2Hf203$(SL &Cq PlB qh֠ElEBRmsl:(2|NIޓoM4j5gaљ Ҫy^U-J3*F"s>fdAi5ÚDsPNpywe:4ۧvtZHNa^\Z+KH&}&C#<8..w7ȭ(e&@6i&mqCHmX 7XN xGZ`z:;<T d  y E^Y,,#))YY5|w#ncd)I֒IZa*#fx~[v;&/˰Lcm11\FxJ!vVhRv[ vg EwNOs& 6::VsR[bc`96ݱ)M8.ӰeE-ΦqNtXJMl9rIu-{nY.Bt \>F诅*ըi\k,HSBQbYΔKf]bFE4RF=R_^B%iRiRiRiRiK;@yȈцXЗ/(.^ͮl+yNOpyJv?DČLKml_,,$lM2p XT֬jvEUS2Ru~▪\cvSCmMc󖬭Jnc鳪2-ZHɛ`yBd6d^ ;@45d6zԊ$Sgmq񷞵:j`Q{@ Ym.2cacSv9jţ&j[eiKQ~ӓ{kIRv<jkfim᥏V_9ϒQ9ke:w4u{U^ e .nxA^.\2Y4׬\"k ?yy:.2]F#yhʺ&h@Cu]uP] +=t9oi>4-1M|;r[29ȍrP*܍ ZW 1Q 1Q l%de[rC/~i_dk,mIKAyԱ!K|6WwAӈ5Hjþ d% ;Y~{`SYU4x̝ܸ́qxKk+9RO#L5;U{KW"3O49Ll|ɖKdld/٧u SY`q%urN$_y_'A,K/AzMXvs}*c $2*j'LKnfûExJV'$cԊE\l3)_WB.ZgI&5ʒ Np䡛;d>~&jZ֒% ZKַj-F"HMLgr=sz98srujlԛ19;*nlgCw( ͞Ehz9`3gג֪Gт旑}eO>NʔA3^%3JER=YJK-#2P@fb3yE`b͙)-p!W/xC=^]P ,FWԵ ,gH ؃\Oaң55Ms/nOm3n?E䓊'/N+,ii1⯲.^T2 ?\Spg=YwrKfԺd ճe2K75K]םҿh˲XsN7p-sKR-|saԔ֊m˳*k -]3kq*gvF2![ǑqAY w3d/CWϩd&``6 E.fp;&''\_y䪗GMbDK5943$7tX0N3Sdҕ]^qjj+|c'z.-N_&x,nmVe-MHs'¼YaHq2aMKN[w˂6ُӓ4 :Z,bZW-hɬ_ø㒶d6xA̔f քTam\:aTM|?;m` ;c9q*ҖJ)b^}An6@.H)h$޺ފd,Zv7igNo,6z bEޠ`c䝂 UƉT$XIl={, E L8Մӌ8]!b~NN"<8ك1VN3M!&Ulu<{P/$DFCAAOzGW`.Zů'>7Bރq~$[E=1s'dtglEL8{עMx|.{I%Sktʯƨx*FïԙzH:ަ?mƹw{"=sM%XmV-7YUVj,WPr|6Ν3,8RMĥQ{ztɺt+ajK :^,$q%S❐D*iZqH|b$Oԉ@:N!Y`dojg:ΑqLtFiK^ޫ KIKuk y*XHܪXzI=UB ,D9NGj{Cn^*vv!O [/E,2rJ_(ògZBa)6'{jƸWYz^HL;kN?-+#[7'/~OL@4n_܀'bWyuP+z,^N\WFBkF)#iB$ÆY|T{ҭH\F5SȢ}_UVӑdUm;%Sׂɛۥ\P[#OcP_R,_jqt=˗z/8_R`Ke nA1R`l//| mC3}l/jsʌui_^kk38`7)`۫}10c'? *g!ߙ'~7Xg9r(~ׄ:s#T 4qݧnGR, :LVs$|+zXVVQ'i5hA<2vJL;fsrt<=mD)(+~܃1q2Cy\A̓m"Ѓ*RCv!9nBBo\i !3ękl~C9 w\#PPb'Bn`g cN2!%X+< 5_lD215KBH~:'/9F ́4nIf#WҊJ =)iI$K%E+JZ2eusߗ6Ġ^fz󔛦R9ЏJGfETf#yI+f+\嫒V!rȨ2HZܒ"z@:dS&iլ 1PsZejTS;SML53ղyV̈vڙjjgvڙjjgBxh<ԈzPr UB31=Q^'uCڰ !&xvBJ( y!GL_F!&oqΙ%V Kol{n.@mr}[.8R;I t}{{~堅C0ʀeQeTvhF _=;g6ԅK$oyT\c);v{/Yd&oNgl:"; YoPQFgkg 笿o5wHOh_.NS\}kOCؔI{E8FŒ OCrkFj]]~5d Н1GA!!/wV140<5"T  Fzs^aiaaix8<)ܙSiY^?.8GV0;(Oz02 .$}pюpjFΩo3U9٠ B 7drw;8{aC]Z'%>78 ;&qB$m-nCSzncv@61 ] #s #*4f/]v]]=t}焮ף`>܄nFü[Н.3$fKT$Iz =EK".] ;{govAIƤn=3JlHr:Y:g{DC7?;*q @ u~['*Q?M]t޻6~bLcz0;g*ʏ#A(C0hB 1G(̐1i,{\g LrsC ~z~~~އ(|n$|;Zj;׭m]zUKspMK/j\ذNvDb+aPRǚ;"6W'.Z|-p %1q^(e&=Wfŷтފy`dD+ ؅X6xsRYGxRiПhKj<%Q"DMI2pՌS\jTۅ[H/*2u,O qT#FQtDh-^C%ͤo6,64jG[% b $W sb*ktz, H^B$ N+RCW `i yP3>6 Vu!ux;Ǽ˚Ķ.mF^eF ayEv=^|ex_lU#B•˛**ZƓ!P@H,$HMK!-11bquLp48ѸG~``bnN2<;ZZB0#["ts ]D WD _Fh+abX !{X)PȅTIf שL5U~yWKѵ!l&e)-0mY>R F,C#ꀱ@dwKG^"Ngcy:E17O\4)WRCвf Iwx!MkP2t/ոhLDYjX%%"->ED9P!!KRliCWHƈZ:ÔR$ՓTRMZ; iX#lbŬZ4VIz)'nÁLL:YRT R駙D pj Uw!/=L\n&.fb;v&1-LlfbL01F&`>&z L0z&3DLhcbkheb XD LdbA&3L41L,bL40z&꘨ej&dr&L1Q|&119L0QDLf|&D.~&rf" Ld0DL0̄$&%,J2?Z.R%LJ)ѪS):)y)%Ѫ=ZM)RxJ.JqѸE@NJhb ;XidJfJ&fd1t4MKICIMTQ y$H0%$4)fghkJ)}EӾ/(ҿ)}u,,X/'O)}BACS:E#!hޣ.,_hϔޡt4-J&7h?).j_ zԾ5JRzo(LDEyү)/i(=O#A9J?thgiJ(=MӞS$tyCFcˀ@"PzJ?~[+_xO@ܯ}_%@?szq(3Y31x> x SF!Qݰ ݈`p<i EQV#mhwtrAiC(sڋwA u}npF Pz:"iֻis_y}⾔/v=K^u`gPkwv6ܾ7w ͎ۂ[[l>]eёQQ|`WQ̡Q0FCCA4dhPdH672trCCXCw Cc17l  =;`-5@kpM-E`Mŋ !@CpAq]@]&X Gx!7, u\']dqsfC;08qb'p^/9##`'?2KSbB,o#}m\^#rYYž6zSk 6lm\ۆo{30enqp1bfn=GSz>6Rcn֭eZ.- hsk6* ls>| ZQ-YWFRgiUDqeWn{-㘫\؊C e͑Z"AcQEo7kG|/( H$07*;h6u3"G? ʧKQ'p `7b.Nv6Vf&(`0  }^E @7`= t:  XX Xh4VVe&b"@#`!PjՀ*@%Py9@1P (?   @: H$$ ܀D@ V`Ft-@PT%@dS'g_N| > OO| 8!ீ xp'ۀ xx *වW x "׀_~ x<? ,1Ӏ?< 8 xp08 x D0ǀp/G p'n|p+̀7n\p-{}kWW\p,ߍacX?acX?acX?acX?acXx{=a`0 {=a`0 {=a`0 {=a`0 ǰ1} kǰ1} kǰ1} k{?݀?ukι"+ endstream endobj 36 0 obj << /Filter /FlateDecode /Length 13 >> stream xw} endstream endobj 33 0 obj << /Ascent 728 /CIDSet 36 0 R /CapHeight 500 /Descent -209 /Flags 32 /FontBBox [-664 -324 2000 1006] /FontFile2 13 0 R /FontName /FPEFAC+Arial /ItalicAngle 0 /StemV 80 /Type /FontDescriptor >> endobj 11 0 obj << /BaseFont /FPEFAC+Arial /DescendantFonts [35 0 R] /Encoding /Identity-H /Subtype /Type0 /ToUnicode 34 0 R /Type /Font >> endobj 35 0 obj << /BaseFont /FPEFAC+Arial /CIDSystemInfo <> /CIDToGIDMap /Identity /FontDescriptor 33 0 R /Subtype /CIDFontType2 /Type /Font /W [0[750 667 333 222 556 222 278 278 667 556 500 556 278 556 500 556 833 500 556 556 278 278 556 556 556 722 278 556 722 722 278 722 611 ]] >> endobj 34 0 obj << /Filter /FlateDecode /Length 384 >> stream x]n0@|CfM$DH"q袦,2xiUF3cx-cٷ3oj/8CR4Up[ۃ#|m=[4Fp\]YoHS]Y-p'p_D7ؔ=y7v2ج=WK!vkO2"4!A4V5!8 ҳ~2p3*MU)B2L|`g mrDX0}11;6bぢ'Ƃ!㑢OLɼ(zd$$f$H 7|#Ƽu|ڥ(dAF!+2ycElQ!lA:1~s|ϏJ3moN}5q5a4u<yӥ endstream endobj 13 0 obj << /Filter /FlateDecode /Length 15108 >> stream x `TE0\Uw뾽tzO&tB:"@hd_L0 lYA0 n茻#C'D C003<T\aPSuC8TթrΩS*E!$!uŚM˳+(yqolhecWB7|;䣐X}Nƿ4-WBmmUWzD[QU+[GyXb{qVWU1qE4":wqe7o Ib?*R!\C\ƅD#">߃gZz@f~a,wh 0k$dGi3_Ov^4 Fђd7Zg(alHWpI[)  fL DՔ'a7e8n3;sP-R) "41@ĒkZ"%WjNG}vYazմ{Aرn)J%1پI^6iʔ9S-3&<5D6@O <أ1K؆!Cosl$!:eXX,Xb1|6-JB "cbld  $6 R602FƣƓF fcqg1fF(rv#٨Wc$ "/R.>x?īa|<0nJXdi׌ 0)S mkI д/GjZ[H**Hm:̇Gžhy\5Z9^/g%'26yB΅95UƜ-׏u KrvOn:,4/>|+CN0P©et)yW;ͦPDrs  UV-?F W2 iNϒM#Ȉ@zu5fvZw[OX9m6Ъ4`b*d SBZ=!OjO.s3QyL#:(=`LzN2-خi=oL4ǻ)8.+C?(@.լY +a5<:;,vS& KҡchfI .-&q.`5͎9w'=<&8 IP,d~LZ).E3]Kt4"TT|1ϳ)e>OA<5}L i)6m )g嘊zԒ)pQرد0 I r.w(̉XOq%V~azیGVmlJzaۓs;{+MkW>Nvᴧ>,l/Zd3|aQ1n s l|'5;zk~+԰tk3vt|w*f6VvVd3^/?4od O)p$@25Bq[-4Ld*\h(q} 9ōɧi\fqj].Pv)DQx@~$e1j+eMc|GR7l<ɈNϝ [Lf[6K =L(-+cVNaԂ- 6B>GEo]׫iGPVaWɐ T*͖8a̴#X)@GR+4$oj8Od2(Ik"3epnB޾~K-%qiͤi+vSQ *Gv@.۟N`b+>ܵeMG\E7\^~18{ࣁu맮|ؗ\'phSKr3,xXeq6=)@8d&J -tW]ôtgEƲE Wo1^hS/qq}-#J>=Նjc\m6W[VVWɫL̫,,[V8#+c،r>\j|rG_ Z(@(d$zĢ2a>ŋ Yfd4*Gto.e;ۻĻ{+ڼAozo y_s 0QaYX=NW!^5)$%,V:ZUL(SVWKϋ`zrE׫/*t/^Z O.ER컽Xȁ 9tL}U-i Gȡ%f;67w|3 R$Tu$lE[tn*B5æ%m*ml26L`mLq1Sߖ~R4$wL|7ִLH" O$B=!-kaj=+,3ueL ܰ]q(I '[T?2fK~,( 4kȏCaYFY~TR|J=t͛ѐZ5 hqLP*kek5AT6$;ݠhӂic]rcQ^g9ͿU.Ww-j|C [.y2/b> :ڕ2BKE(r.! y^h0.sz&},3 ߽ Ƃ`0+q*|AiɰrM E Rn0pȲ >eUp2g5)6$;&>s{Nv[-qEmr؎fw A3R Xeg6vJ_J"{MK9vik2$qBkHRL^.%vH> =t!;DeJ8S 8`2Ǩ%HBynSL5_εwW^᷏_;1}db=38~ywCn*n&c6]eŝL]PZa khjsw=|ckd`Ƭcas|5>啚|ƌkӍf LMꞟ4]T뾏kyDyg6X*ȭ֛-GϚ.O gM_bk]cljRшNxfBc2c +Zr橄h) o0֬05fk\%?(G{o%3JfqH”H,aKj-1.`2gZ1?T1wq%(_hoeH ^@hqM n )qSJ:SN_ko{V݂;S4&w?_忼/xX|>䣆TIB^03 I.3NrD$A*WbۻkvezSo2{f{v|6S'6ƽnGH=}'}ٷ|wd$nϚÎ<;dg%';u@v46@~(FQD./!TtS,ᭂWWh9ުCy32{=itDf7P2G󐓲VyC- JJ@o-)}v7!=b5;Nݏ9]M:-pW7xrOzR+/<1kg߬Y2G"]7ιa'dLC]%X^+~;+>ЇOjL}%ʐ-l(#h02(3y*MR+0Ja*4Ј{ ToLM+DɔS际hWg*D*D6m ŨHˋ"Re4.IѸ]/' r=wͰt6i"zN@Gл7S,:%rdr(,g#M6 U(r ;Ev#.ɔldĴ. Z`J M+-erկ%!(;Fq愓^e$ B(Fa!όMӌFbg5C @Q%N7}g*|xM3 7C0Gl [*5OgUbPLpLpyʕ GS-T)5YuG*@kΌ;ѾIܧ}O;ʶC{Ux]`Tѧ;4~_9L;x]R~/sN|>䂙GL^dE\9³dmN,[@&ٜ>͉a76kш{DY?Ff8轌[>ڎY228he,jNHk+ꊹxqmd[ɶ߿k7KO\!K?jJ×ACA1*ZLhcPH^̈|t{7{97^1)y=ARX02"\J )'$QwŮ}5Kuoaemk7ox?e>4*򜣅R&\l#,?d+/uLdaVLau1󓺨wҔ8BM+ǘdṋݎ JS'1 #NN\1pbQ|A\gcS,~'{N70sa2f.2Ϣޔq09LӇ߅*_Yq-J: JVԒ!$+(Ł5<(vǺ[;n{դpm Oٷ6pb;,[_;Hu|HBKըJs(%?9?eJJC5LpO__e\267*kݫ_z>%x15B|D$iEb3Sʹ Y M0 7㰌YkWQDYEgT\R Va܎ H0W Dy Azea?Sҳcء>h?HȩJ@5Jv ɲsCNۭL}ëbncm‹ν)vgoxBY[o#$P`/g9Fˇ=~Nc;-5VJS`2[/WC_Ñ .;m]4JA$bt]37o`Z UQύeUΝIk7\\?!ޛZVNyZқ-y:e`.5T_jM&kt^l*woJ) :/2Ms.*M+Mg&[Gr&&e]#wW46miii#-(-K[66#H֗i߆Nd.1tvg$vYh4*@H\)B `fٕ\Y 'p-ʃFvcŭkn>1Lນ4b̈q3#ͼ=a;)*e+3J96҃llGm1f8+{+{}dc66L|`T6o$N9է sWc4eOZPM`/3@Ɗ<{ݦWmXN/ц/2_ A:@{j5)5]I!;:(촖NwX5b]229If1ibz/Ŝ ñ?+XS>勿K\^؆±_w^z|"1![dNLv9]I.Ns4B1ҰK!&so3֟qp.ZI(3i- WWm t~;|]kf=3?9^yl`gƎ)ϿI/}!lNAY< _d8/7v/}s'(xWO|Z1'gxa籷F=?vJɁ`hֳ25v츽\_<;xLoݥe-P3ٷfM*J.P& N l _$3"|ht&vPXԠ >CTCBQFua5EaUrBْ٦NNl:yP^=yp5TڒR{Oj,A|N]ڗξǁ3/M u~8p[+n.} ;#o#zH@R [%,I*QMLY\0e߫y5,O5 a &Xxg$?GgSQ뽷dK%>ʡO+d0C1k4i`3BAi" bIm"H% >az*xJ! eNHD[\app=MPOB )qb[2"$^Cr8r:7 5BcJ=dD(sD(!ܗ$B}"TBEl 'N߀bB"ࢧM]Nv=E%[bYf9 dEqC_a~HyP4XRm6dFω$>2H"AZ 8L>s(5CEh*Kh 61Q-x=cy5S ),O0)~`lPu갎Cq6:uXǡ8a:PuRX27)RXJeB&08 `4!Y?15˾]`?k)CF0zd)l2ÐC͉<@#ҙpЎ6@KB`Ay#k1 j&5S<([߷6kZoZN]VAOǚ0`>㫨zWQ6ԈAm7!}̈́ ͳB;[S=7ז 2rh֤0r6gZ; 8lY %tm(氱ZYM#|C8^TF14/Ci=jW׾͵5A\ʛxnh*9і4uf6ZhWKYq s,/hҶѰfr6o_mhF5 ʆ# _a{}+ Z&V_5qJIZ%71nOP7 :MX_\3U6 ܬC[F=3F]Aٴ}Ss:i(u5+y m GMnm[3a5u&B5^:aQCk|3Z͞ٸiyjqcZ7k]6-,\@ֺ׭Pg/_޸AkZڸNոleӚ\uN]{k:u~u0uLںM}%i]ޤ75ujsk#.Hֵ MY\G G++mnm_]y\&2dH-[p&&Ѵn&5qڰv)=8:k^OWFWIs~`_يa0j}4GBVVCAy}Z߰ڬlX<C@V6=XǸvwID|7}НQur/r sO駎IDc aXOa&>W .:~~ZQ rT:SIul/wž%McKS5hM=@~7g> _FP7/S~t%5 b(Ny9_coACx,^7]#ľv j tzTׂ|1̸w*cn=~qG&= }+w8tn|i0J ^DZ304VA^؃B/ǢWUՀEx:Ic3c ރ^lND^8K/t?^n@i\g煰ߣa MY4wօ0j]ýOMr b>>gEdi"ps2 G839=?şSŬ@0?` Tm=)J'ܯ'?KuˀnFOsx%oŷ{A|I&d59Z)Ϸ 7_T2c\0;}z~G'X&lB|7 Ɵw,OH:B\N~M'w|C~\:ኸkYmvYcc|NapR4K4 h lsk;1J A }'pnlp/,p ߋ;`BlΣHBf2@Zr;&3ę8pӹk6qwrQmC4w~1^|:#//j-3Q׊׋=HcIiT#*1wE 51n3W=n!y ȫ8>C+@IXF b#v>ON_v&;LG™R).pw6H{U~ #zQ,5zbA,5`I~+ Nϰ+Pk4z?7hS.Nd nj5273";+JOS)qIbZ&hDFij4\á3F| FLN&ֲf\RlUCj`YHV|sYJ1x&w0pZ|{VQ\GmX 4SCS䑹S6h(5wb$.IBeQo eG̭,/U̍BK(4%j&h*&*NJlݨvnGAKk#P}]uec#0nYY1rZ?Ө[讹Ckh\U}$sZi0MĊ*FTUFR+*%Ԩ14%rZ o{۔ibǐ\ݾ2-N}ަ=^M۩uvZmql 4 15PżAb:ЅQu 3 Өa<ھl<4* _E"QZN JHOfxI]DT(Hdՠ>G#hNei*8Fn!PBCsuUii7hh)ds+<؉.E&jҚD!npKƒl+|(v>*k㸭X0,׏CѤ!X-0e`c4GL'2 ӢJ =NүXr4"Mϼ QY`:`5} p!uۂ.)UPWOEHcBQiU`Xd1}Bg,#VfHaeJ@iQ3uAPa[j$r' ~A ܈HJpťtM j=\h#96y$GoXXBa7x @耰!ALkUMvB8Fk.ХY^WF' p(q@N"kGK \F]]7dϪ5,[gkXv%Uz:s]77SYzl\HmW cPcvq( pbD{2;p<0X/,2ȁ[ҧא=V{On p}L>FאcB CN@1G#d#<@ $! a ,p)B>X!e b9rqɋ8+Qa4p\: 1U!Q#]GwPXBB3zu@a(2*yC!h@0]0L9u0 /M^c[Ui*o׺Rh |@@Þ G06NA(0BUt@'ϣ7 ZvX(zȀUA-<PQxAS&Z{ K-Du7D/6D (\ /F <\FVpXl#.,]X`ӹוW v/y!р;qG wDpGw w<*:=,[ypǛц;¸#wdzHZׅ,)gɞtAz$>6MOpCb,A#5]oMiR=?jB~ee (2Ё RK B8!A0[Yl8B)%pȦsAM)fˋOz6͑G 4(%n `[*K%n`-?|oAFr !v[~L ໻''P*\QgB:| hZ)H3[W87[W{?  <P;opdʚ >&k* ^MӃA r-8/88+ , jm`i`ު~784:\8r;Ji6XR&/9 b`0@ /'")t1`ИXDIM*H)"ڻ U,Uz ڊ T`Jt|G͋TD9Vvb|KF68T-v>}~fo y\J=Iie?!<+OTE)Kwdy>?4MߕϣܤC*h?fTݽzLe(4Y;vme[EmM[Lhڸ:Л͛&:5 Ij5>`Mǚ,:$/&78|M@oc9hc9m"ۿ)3jY55jC j7nXv,UeUqk,\tJ5DB ee2sbTWꉡNT]Zk(뚨M,ՕU>pܰnpt6vVHǚ>gtqtqtt6b<>ӀT=$ӪIy'ymqd 9ydZ{VYe\=1Ϳ?R"#Oyc }=EGԕ\֎PE4g~ENIZDT^8 'BlHJho_O]A߃T܎ڪhj`A܄=ڪ`m8}ħZ ]s"Cq\SK-? ڡC m endstream endobj 40 0 obj << /Filter /FlateDecode /Length 13 >> stream x endstream endobj 37 0 obj << /Ascent 693 /CIDSet 40 0 R /CapHeight 500 /Descent -215 /Flags 34 /FontBBox [-567 -306 2000 1007] /FontFile2 16 0 R /FontName /FPEFAD+Times#20New#20Roman /ItalicAngle 0 /StemV 80 /Type /FontDescriptor >> endobj 14 0 obj << /BaseFont /FPEFAD+Times#20New#20Roman /DescendantFonts [39 0 R] /Encoding /Identity-H /Subtype /Type0 /ToUnicode 38 0 R /Type /Font >> endobj 39 0 obj << /BaseFont /FPEFAD+Times#20New#20Roman /CIDSystemInfo <> /CIDToGIDMap /Identity /FontDescriptor 37 0 R /Subtype /CIDFontType2 /Type /Font /W [0[778 611 278 778 444 389 250 278 667 500 333 444 500 278 500 250 500 444 500 278 500 500 500 250 556 500 722 333 722 500 333 556 722 889 ]] >> endobj 38 0 obj << /Filter /FlateDecode /Length 382 >> stream x]Ɏ0 ]*$NcUxK!/{#kST"(L }1 Cˆ12 cǸ3C|XH3愶3`C #)!ΌƲ"~H" HQg$EME"L#) fq"k̘զbJzC +Io57̩綷V?M)]l=caپ@w,-03Bo >6eFց endstream endobj 16 0 obj << /Filter /FlateDecode /Length 21647 >> stream x |ŵ7Z3ݳ={>iFHYx_^e#,cyZ JX !`BBn,md C IsC ҼS##SNWWWWUNU!=@,o޹rP7]Be!~d>y76\~o6YF"fu}\޲-} }z͎mZB!Ŀw5o,Ehbսk{?|B~,`?BAkyaCZ3Fnyͽ4xO Gt!%( 1E3#]3Hq[lBfRWivfhLjK#܁bpU` >ͤbEfK 'NL\Q4rP 6X2y,4)ރ #`(&&%az$YLLADb=eCA<N'wt!X<Gh#$O $)rMbQHZvvJsdg_?dff|g0b٘Fbж'kjhؤy5iTyuR:h1p3]g=F tPmAY}3 $Q,-vhb)J$[T7(v wIҠtP:+i"L=,6 2]6z%Ý}׸m4(ۭlM=platŔ)S詞>>cFO;4w ScҢ?6/=X/p4S=RyVqw(6C!lR.Y',HX #90U>CKefO=Q(aRj9i)1]k4q%s¦ l=^hЄmESZjT;%-ؑa>$*W]`w,]X-FxooRkȌ/ 2c1W X7e lj2-,aCȁe]\'2Z@&f Eμp@Z@!/n/ O. qPVP@)%jdA.sIjm:9+vKccѳ~M̔m۶:Ǟ?`֟1/R.a~ H+KwV!FV1% Sd->4dB2f!RC[y!i s0 ^]^/㵁Tvv r j'_?)d\$Uij^c[4_0x?3ۂL0n3`¿*^"KmW0RHHL֨"9'v]dsM ~$A?S?"V>󟈟Xϧ}dz~Ӡs;=Pi Pƀb\4=@쁬:XSKyX}JRO_,uEerZ&bLUQ51Br^Jv.Z#lŬl#YhHg c2KVNM"P V* rZQWD,IܬU}1ĵW^*Vo;ݦpU}e_o6#{h]=17xw^Vu`SqY}nYs0T:]q%`Z_?9a ⍊`Qtt28/1s( /ns8ӫ`_BRv>fD.ASh6fKt196Dz?-˷l,O BF \_a> ?k\>45GO[pL_xy53$bq~t选1 9%1Gtk␵XJ'tͲ-RHb$֤y59Tu\ X߹s﵌P!q7aHZp"82a [L /Bi=wwOw֍}fp˳_Wa9ͦ׎=8?*^\ݗ'#ZcFq&_f$A>c*ʾi{Q7҂^smFPs40d='rjZl$:( QI`+[nG嘐ꆎC= 붌W+ A2nUҀ[`OL(9Rwԫ'y^ $ddZL@kJKDôْ&oIxJb 8I\F9ItP34乡+ۂR2n ƓQ!Aala0BG1GԳҗP'{`~!_āGM1OJTE\ڐۚJh"b%T!, pWے=]I6%#ˣ$r2*87yZ'\%%.RʒVʊDPR#SZ(T.s;~k9ydzdF05Q,_x4pCM&`r&*YĜ4@;X$~+Z U dB!ȃ2]GSFJ?\O V5FPDB}9ׯZ7_'­;Ţ˜6gendxfvģטPR졟|F6Y?ˑr|$1'8XyQvK ʖ#B-o>*.T=4~G8Ep$QKyU/:t6_gTtPQ  $$Fn%+Yo]}Հ@9 F3#2'U{kۢzlCŁt-cX{+p{AĖN_Y%ϊ,lRZQd^gWX0ie[t7o6Xnr1U-LPꚫҕu`2"ci+Fcn*v#4aq^ӆbJ؜ lC`{fnVT27jWvQh@5q3x=8y@|0)qf ")x$*: rj^1e{VY1mENπ͈c$$mFՅ̀q@9;) ϩ}5b`o6Uq90N 6#`(n 8)QP'BCO$4H4~}`~Ի>R =<}X1sAk$iNl(anzx )!CT/P ׸Wa]C}}T"N#\*>q$ Z@J~/ӯ~lQK<Ё/l]W݄Ͷ\ڸk/_=zuKc{E"٦ʥ%[_i7573kٓ*]_:hN$KUjD5#GgH%Iy)o4Jn1:; [9Ioy'X9/>aP U}roPIF@1pҜOcD睴}b[{L{0i$&';[ܣ?M#in:fJn#|.$ŖT4K39a56njٴzM&nC&Dl9b:eMd`ꊿX] [A j h<2k2W/G2=>@b(20<: ^ QkN8N'[/y,ȒŒ핵W~݅Bأޱjj_~~YІL3ᱲpJ@!D^+o"Ee&JLW!D >=Jxͬ!.IZKKtQ AՑ*O'5Uw /WA .YdK핌f۩\ޛT4fDū*f[ڽU*Uដ>`_xWW2Z>'|_C\zG9hۙ23r>{#";tOFp:MF}%b4&݊k> Pb C-}NTv'5?!8gdg욈q'AbX`~eG;!qWTIGZs~1CV7TLU #^ T[Xnjimnvؕh*ܔn=S`_x涿˲?6?X~>2rEJpp:w甇asEc6h,ΐsdW(exֱN>B}v`Byn(e} qiA%?kt]Sm쭫?A~`e;ZռRsK(8nrD{P$87 v1TKX3[#I9/G}|A(fF,G>!9.h4Rt˜ 8ؖOep︎~_ѝsu\˜;t{,oRStԁ~QBx0GrfhiSuq 7iHE102Ƌ31̂ԢC헭xDw,8C2Q=cAr5&(wlqs6a8d^t@I?j'p!w2W(h4O͂%K}Y4K Ԣ 4*%Ш ewMĩ\aS%Hq Л"3MgZq8KkIODdܑ͒F~&'~Z!sD#ɕ%V{gp#7隴.&^+s.bsVS6ZV((j Ő,rQr В$7= (M tnppre8DRQ  텮BoaM8*h PwAH t2Zk$Gt5qunevI:>lowcr o<'\}h#3ը”A#n7.cqxx֨1vMZSKg1\X~~D 9--U^sHتʓUClpx!T,(kDiD ijpp DG="jLY*B}P.UC@FhWtfp(/eimr3]^;9M_nl`Yr7@!Tcpwa|h!e{QrUiZvNDUP~l< ޚH|9sr]ݠ Fr1(pfh3\˹R}w* #HULieV&_)oK`Oۂ@5 m.뤣l6B6҉(5:bCAs]KbU5s U ٱN2^d1 3  '$ 8ZR|\<1SJLp_'^],.O"Kތ [+-a0~Jۼ&|ʡ+Ϟz?sZ &:tbۆĔ>>}PAHS,C$z-Od M۩tA#'bأ̦26άNL$T7wh$qZF\0rD|z8)]8JFO ʚz&hV;bvYEZҨnJ$34@ZC@#j[Ű"?n~ AEqRcn)ٖ) +W[nvZwfo?3,\)SpN`Si]N=Fdn+ddlUI<:3]!= d@0&PYǚpW c"uvVbPɚx5Y$ N I%|8gC^Ն*&Yɜ)u`L&ϔF5䓐`obξWwqiHڝb4(q|͢i],bl7 efK]6-t_]*ِ:hzf_z^U?tӏjSTJ$#+$+q#69LWRZIxVN  G^IĠUAl*RE)ؓRP@#ȕ,ΌRyJ&hkNXO.V@dTJ&T ꩈq{UK 8L4;LÕ0r TV66oO5V7j[PHF6]$KiIJ VV}:(Ώ P ɪuL,'%JVH1ݠE߫?M"JU*+*{+JfJrT%Wՠ=8uxA%L^=NRtj7 ?:>s/2>ͩ|MS 03g6͝cW]?kL(J/32W6kƥTyj A/"(~h BV!xdX7`HBWD)%E2,8BjͷC~~To}zbU*QSRɍު*K{io㍡mfB-8|s߻X4u|6[@S<ޫ|j79[رA*\KCʞޕ}7K {4k߂[۾m;9>"RʂV^yv+;kł>Ra~}|̰YEd4u:ݡ' Y'al!bZşa0a(HYہdzM0UxIs~Ƃb.+T#glb<3a<2DZc[Q3\kyelGycy0Ayܓߗ?gnBG *v`1^LfGD%~Oub&P֋NN޺})ܖMNLMXAI6JeAsJr`[iwly>Q-:϶L;+ IOP+;E&!"}d7X4= YhdɪLx`8Z^?Y"NHHy(9c!9wODPb6uAڈ,k+n kjV;=іW$JЏZet nTMW2)%e~tY}S2^0P03dU1Ǘ.Ed4=Oե&G3 rY!tQG 8M ^DyŃjirđ.wp"#K&`wauo9̍༰xɃ7u1Z k\x⑙sp=W?x[~U]gֵ/jV|SG:n;h:W8HVX{yߚKRݚPu(z%{-+.|lڮu.$"lB~b26P X ~ v=X`A"]X0ʵ~\p `?9Oq"i f$ꃺP{XE(-u4Gfl9f{jfvDWי,ho- ;,%- ۼײ[m-qqqY૖/~Mϖ|*=`VgYcBAL Aά\~%0O s^d?b^+& <̼Xa#7*FANKtCYbfOqpH1;fy^ <ޱQ MTHF!@sxbwJx"#!q#z-xo.t0u`2y-v' ݱ"2%K<;QfsS[F[2qwnLsU*lbbc# <5w #LͨѣJuy%]ib.G mftMN0DK\k^Ńn,i YaGZN^ ='ėXqd !Ơ&!]RG$xSu4|81+!uSn;'ؙL\--FU jCC֡JyfUŪ G]|$qniH۬Z׋>Ɨ?W3a,*T,V.ȇbOvuѴIM[Z4VMS 1le֚=٧Y-˫sBaz!y󌺊yeZMDI+w&⮔%1?.ǀH!ɋ8`hL'.6]A,:N?>m;%Ç۸.讝 %G±G"X,5*f=mY,۫׿q\Kj<_Pa>L~>]H&|0N/aC>]8f E6[$2Xǀ0 6U`-Ze1/*"+ $OщӧL U8|DpHnxRY& dq(=[{Q"/A˕汥q *|*փ]o{?^0ԗ}@ؓA[ CejsE<\N|49)bA"{VdD'잢Lm &u峏s&>0NFS^v?ޞo]/іO\SN L,扟8yى3Ь]G~teF2󂪽tkRi]a @-$|ђ!}Z|N }VsصVvj24Z2d9)(-/VzXBpjgqx>lm1I&]Qd+JOw0O7S?K(<(}{@17=>{N8;?&=yo$k'yo_誣iZMi53GMI5Fjxu 4Ws%-}]P#7m=n`+1v#D65Lsy=uzNy1k5'0Al0FZ b[Ǣ>??]ߨxhsVQ%ˤeZlu2T'I2nDHzb k@}}Iy@wJ缣$FQYA|5` 7$26Q '\=.f ? r'a=(v V%CNk8$?v `L#&=~ܕ Ykػ 92ƀYg1g_DRs􄩕SVROx^pD l'.䳂b2 h QpVOD+ D>nv0"Є@"^ ƕyZ O<]`1w6AQR ! @9'>oWZ溱gI̬E I/gxZݼ>Ip7 (*od)׳|k`K&ӆiVN7{YJZY]jL3iwXz\o~paifccTk3@|WA9NWƴpyO>SV,6,5-f+1PWXZY+ Wԯh0CniJ:oߗ۟,7zH&ǥB0C5p>T |SQo4;FsXa:hx !m~X SP'qTs̻V,[Yߵw?~0#갎WTV)s Jkp¢**_5RUFE<KeәQ%aб~vIN|~oVk=0du(m!-;<+`fbE-q[ 9m-3WOBb_13d1C?oh,E.o)®z(8S?V 2jH5j 2j,%&>u~ e} )uy=G7ՆlMuٴ7Wi /j+je?v~Ur$Bt' cV0 [ů5;}W|^js,Ļ P8‡|pRf\.$lDl)͋JQ==ea7u?ᦱN7fTh^3>够N|7j-N?{w$Ru!` ->g餈fg^}Rʜ)p^|]\ şleR8ƷvqϮooe7jϽ~ٍ=xfH_a}Hp=L\MSsR ])݋Ͻ*-,Lֻy^ϑXW>)%Vn6p65 ([jj6ig[~/#ݒߏ=?X3T3+HoIjFJzN|?\<=;wv_yIq ?#2Aޑ/0$t G'$)I=D|Αz;&Un+=U$BmVkG3/C7BY(zVm!#UEPlBJށP"PoChB3Y{7B!pK#'(E_Q3it/|ǹ?# <ȯA鑥gfVYԏ)ܤ2$7˴EPyWi呹LЭ`613@/R}oeA+,*j eTFl"ff͒2- I֡2m­_A͘cYF^4!RZK)MGKi)+Jc:*M*Jc:*JcHhh6P8)L(M~Li;6.J;&wzMiפ|}̋L*Dh_Rҧ)]I -Lj0YIƉ|<jdm@k!mE=h NKsfY?7Upe: .p6t-n(_Cset)R=j"ףPj矟[@Bɳ) JA{:xJzRjݎ-H}n(s mZrEj&-{-}Q{\|E^W2i HOԾlϛBRnȹr:ҫ?7k)^v8GvEU!%7Cw]&_]-/ްVnҳmgZyFOoOm{T7o/߸~ök߱jkn/]{|y5\vͫ'orzҵ[NPoSlY-MCqZ}Q`VyukVo{bbrٿڍ[mm\Vm[eڝpoƭ=[ҍk WwݲM.tlYS޾um<{]\YU]mvW+kYKN{m-60^H7nYy{7ܺG޸w3<`nk#XU<-wʩiy5W>kD$Zm;I/5 m5d7S{ݲgBWM]/C{Qpܾw6{2Pfͽ#=TBWS&ཫ>zyڄV5({?,<٧Oxp6k?W'_߂vrA[±BTJU$1Jm@@$f*3?>tA Eǯ.f#uY\^D#h>zjnGw95tN*(XP2Go+DA,@6gH KqtJ"=7EgLgJ#ȍR78Vz=dEI }t:<(\ tQkVS(Wѷ)[z0ЗoGS@SE_@oa;fRtIi?~0/<#U+a77l 8lk_z4->:q5f0ZnK>ɏ%gO@ˡ s8e l~vatbch;rTZZ"UAKwC+>oh[p! o`kŗexlUxl2 ߌNoc=]&fX8drLz:ô1ö遭gv$syq]/.fn){&w^l))h+ݤyߠ&F<,j<<iƎ 7܎suh#w5xOcnCl|Z$Ř+"~4Q܇zבacwBok1pOa:LK<8q;sYP{-` Zz<8؊un& :mh_}nDck|0o(:W 4A&oiPPZK~d_r mD@~ ѵXA)\ uN8{ݥ=jn8y!ߡ+<ߋ}+\zP\v+z3Fh4vn.h{JWC7Z6t/MѪå+.*=wG0G5RM >vs۠XBh43h/Н-;JFNU`Eπm.;j/e(f{B.+}z4#t j޽[)w^9rɒJ˴SÈښ|2Hx, ˡ`z$al=+eDΝ[IΣ!c!WC?_fHϗT*%%(7ʬ<+*˖yhҭ pngIfCK54{džf?]}l[W]vmwieKMcvђ6aDam)N6ڥmF+6`6hv cli~IB 9|{=マkh.見鱑 W9Ptd|6. ʪDk^av2xXǩ'w=;RM7 և ΀ta1ư KaG<\ eջ݃w 17V=tkcGE.QCb.ǘޑ%N CwdrR r82a8hLэ dyJ]ߓۗl^>2;'<5zz0&v>XX^ji ]Ji8˅jȢM;;ʩGz'')cBdd o4G-c7^2ɹZwQ}=j>"͒ʼnBibأ6)_T }CXr;nmF^ڽG68#Uw,HJ,s "ˡby|Gua_rVޔj\5V+$x=c $ TY~ϕB^ Lz7]_+ń7^"k\u{@4JO#uOӧGwHy%t4G V҃HAd 2wVGX9Pis>sYiYe.=.J@$#Ы>Q$p[$v7~zm5&"xM;wDZG դ)ԯ-qx –6E q'"5ڤ2)&-8=/B0%kE a63c*SR쩬źhm[ zֺںca8uzzzZQk:f=d=fV҃J18.8zOG!<1`AHgg e HN9 9ceuѲPhˠWlBR!|@=@ 2Y`k)3UگJ[*Eo z#h(-q[w7vmƶf|ܢ_kԎ[vteiD3'>ݪ`8S%@0 hF2)= i qN/ZF)iٕ%v2[7uG;Lm.f,ei@i_?Nl* ]23Eoإ)F[VhlJ\gj]QR9%}F%m!R]`ꗷ74b%FQU7DUyJY;% F{x^[^I/[cWUK 6풮84KS7kjT/pDg풮Mg*8ZfxKd| Geo~C3vKlEWN k= +N:5~;f "XRro!D} >ϱ 3xڧ`_55}fx]F'0+ԓr;}෗*' ՊS"-`7S/qpAelb e/y wΫ'A+WWiu yyR,.+"E; Ed M ޣ֥+vTI{^מC6G~.mZW/r#a)*UvRH]iA'_6"z]vS(2m!]M&Ƕֶƶ^kwk*n[슝ٗӓzcrU>cȲKK ߷d +8vDRIs6ɒ}@hil $ {ϧSyοd(N/ JnZ2Λ?&~4Os,91>8p]ױj-#~)k! ԭ5M[6BT_NuVy@Mg1b,Hy xzэ101r+01/H.iK>_G0}~$)ՀhܔuAՠ#7̇Rcf)sV3rp %4f_5ƒfAG'Fg^|}0#@8Oqh~#Hح=/ĝ%ͶMUQ'n9;  !Di֦,>=9N$?)@eK{r]K= T`IjTmF # endstream endobj 44 0 obj << /Filter /FlateDecode /Length 13 >> stream xw} endstream endobj 41 0 obj << /Ascent 613 /CIDSet 44 0 R /CapHeight 500 /Descent -187 /Flags 33 /FontBBox [-121 -679 623 1021] /FontFile2 19 0 R /FontName /FPEFAE+Courier#20New /ItalicAngle 0 /StemV 80 /Type /FontDescriptor >> endobj 17 0 obj << /BaseFont /FPEFAE+Courier#20New /DescendantFonts [43 0 R] /Encoding /Identity-H /Subtype /Type0 /ToUnicode 42 0 R /Type /Font >> endobj 43 0 obj << /BaseFont /FPEFAE+Courier#20New /CIDSystemInfo <> /CIDToGIDMap /Identity /FontDescriptor 41 0 R /Subtype /CIDFontType2 /Type /Font /W [0[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 ]] >> endobj 42 0 obj << /Filter /FlateDecode /Length 372 >> stream x]n0 <ݡVBHm%DxSM;(/멩p[t ~V&Zr&2L΋^ash >[xMjR?8 ϡK^[*?!B4 fjqVu^'l<K|ך2( ZLcƈP2gL]pjQ;ĸRƃLK Ƃ]Gux",fy_AiHiHC.}Y_|#K䛰 I) Mvj&߈]oG'7NܯwG57M&-f\|\5)ǯ_ endstream endobj 19 0 obj << /Filter /FlateDecode /Length 14213 >> stream x |U0~;U[UwtVHH:$4ʒ $@ HQEPg=uf&gp{(<uFedoރsouBo{T!-E,_8г|֦ނW:=@.]SM:4淐_\a*r:n{C;[w-s,-ӻ=W[o=A8u1v BXFxդDԍR$|kܺ5~u'=~spPEE|-qf iJA' ~dw6Ϊu1]0y*ƬFNLLE3**T\U0 t*ZwBF8c GQt (DEU*<+m0̗ cc뜏w&yl>z Ͽ-5==RNQ+TlEBI.EQ$*['XzFyQ C3B!eȕ5p $T"%qBBE6B8"?qoGsBe(ĝV\3jUfID!O<^S{˪M ]cw=;0v^Asnѩ紺.55XHᰀ{"$  "ŋ21ke0 BРku=`KWik>BM\{  :U(pW<4[oYf褤q>)SbuC ؅Dt2֦o1d"Ee>|npy3@gyV&vvs *aq5k~%8cOrxɬvDhsR\SQpZjzsg8tC,I !' Pq'h@,W(! )S }OӔmW\lvʍ+Fl3{^{+붍L956>cv5K^!X{x<ӥdXRR.3ӣYgSTJs>[`mG4`S |R=[eYpIM%g=B&^iX14A(+.2fMZ՞%t2˝C8C[- -VhVW y̬(gLA"?L(U~F+`BS ǝ?Q0y̲BxH^xdO]!'((x^ :8]\N#mva'G0{@@tx4cn6M+ܥԠ,Kh0N }S,byEXz ACrCf4JcGo@:Ƙ>:y$f2M̠m&*+q +aVhhb tQ?A8%xf4 tκLgܦp~2 4 AdlX66T\(3s9QMǡt^ `hԉÌ\`͆}r$l%LWԼil]Ҹ!LZ`^ǭ_z3? o߲j(ߦc89U|ZL#Cmh'.5 ʏi}v)-Gu:˻I!4 #XB+kWH[FBY,.+TO5I>0 Qb{Q¹R4]Z(=&핎J%.ql ەtZ+]c3\8:u3:q0 TQm8G ʎcV!h0]!AsB+qaE:|1?L&170<"{B沎I?lGؘ;g~zo}Ц4?:㱾Jo/Lkő5loYi}qZŬ53

9yN|W.p^-)l[bR;M6hAVMjjAgu2ts4 l\lN/eI6XTI$Bs'(Kf ٭~UV2.ZT5Z[֠kǖȫzZnXlZozDJZxN XdAGH_HSԴ9bCx~22W[nޟg*[n/N֭P]&;Ôa 7vt>~$ E,fK렱37K*~^wҥw )3j*vF1lpW=#\D zr*|ΝM.̔%%F|d˾dR6 9 C>E fQ1ݧ>f2;ZXKngr=~j aNsGgϑ5 ٺmwיLA Q+0-NfsЉ4jE4tę\"uOA?~?b˓e|ǥA*ʞC n% =̮Ǵ>|AgOjݬmvsJ-\>оfdm˫)1%h h2`2r6o)MJfHxBҰ2"X.B)[k>טGsYR(8]A1Gd;D`~/B Q’cC ÙWV ozfY~O)n:8xnPBgm8ޓ'ΖQܕu(QjO٧:U*ҬjQx'~|pA'TH1b26bٜ%#-kA^VVn^0ìcNJ))):m,['&6IxAD)C; Eǔ(aE$^nъ.Ax$[v<׸M#B%ʆв ڟ>H#JKxjZ&J I G3 I@[sGV i 544AՀy] P(~LS8:>΅LNl[:ÿ񪁯c=\UwcD'g, ,^߅wYv[9Q+DhSD/%dMh IO[-֚(:md0r a`0ZEO( !pLD:Ѯ pdR Ƣ,5!p` V FZzpDuFEYn.=JzI|++dBW$p=$~o2ާląau\~dC4x)Cb=q{ڃk֞*Vܕ@ʯS^ֽS:XE#<~̥DMd\P'7Ckknޟ.-M Ju ~؋c K&lǛG3{^wt&m 2" ?(kٟĹL0E!0xVCTwUbyOT> :->Ӛ5Ax2~37M;Ww~eroL:}+δt~^\OO^Sq.pkm+rmA_a75#F0ER&ESit>-Q3C^ 4 i\# =;dVTTLg A\ggW ?lZ&bip./urO>?v\ 1 *<]w.hP5Zbr*rfÁvP2J$eĹ%S-.mZCEy^;_bZ#TrŊr2AGOsT4^Dˆ!٥q'0W:ȨQQcgF͕MҺ3.W|Z+.#Ի6膆&OiG<$UCC0NʙNl=\/$}Pnd 鲁te$U#:ްrT="1 gq$V5ubIiNwͤI58Hy(6umVj/En0Pjй>1ݺw l[[ [2t&fx%xL=D{@nT<+Rd0 Ss;QF8Ih)\G8f#7ɗ3? L-h0:#0Z QJLmjm6FspA&LjWM/4A!F4F;-a>lo _םͷ1de\S7<1[~#SWpԶ9"ņxڄYW~"9H bߣtYyeTTD<~i C2pc޲CL?xq830 ~ Pk|$J:(]HUސ"9&-2z ~qo)DM"fFh &H?Ml6K6*m(D,j&NMiY٫9QhE9r>⏆N΄·0iSF4 fs>}>pN\TOϯFR"C_@;hJFh,.fWABA"jkBKwmR 2Wߘf_Ξ͛?6o~b͞u}:_sUfC<`o7|3wK )xEcU_I:S@h;Q^o442wItZh;5lϙe$a1?sjꌰыl7\9^kE){gY*Rc#d:c/^~j7P}OOW Pqb!e8칬_y7<^3=ߑq%nkV+E'!9o2hD83anZnA+ˤnt{uhGy*;9'BxG.qW'NH֑#:۫ɠE re;K-R9%[j5ҀTҸ^-6jhk9;?S l p #i*HSLIO J.s˟傑H˸"$*8LvltfvP03O=)k)G]|i(9`g8q'OE7xi%2fow_ mEJOv'H''VPTz_uڭr9$",p 4_A2iea`j&9"x*ʕG%*T>#=Dg U&-xNa# ;GgeL1'<5pQanW.,2qᠨfE9Jگ65cu^p= ~M;V-]>2nĸ&l>ߗFݔ-8aaޣߧ5c~Wq>ZڨѿJ#څ9(Y9DDZƸSӃ(ܐ!lR{m1Tsrm1[VobT2g4^VFeYqt8ad\2o7+  xy`\Xgi{n\W`s jCKWވfFa`hrGjkEr>oXv.` rrE>OȳUx+UzmC:8\#7|ai D\LрB\ӣ^9$SYE}4*Fr3$32-dos:0x+W¾bQw޻̸cErSS*j{Qxϳ<RtJlhط cfB8Do:y0> dbBOLgg+&>}7#cŘ"r $2no47~7p?7l0gpj>U!3]:t?j~#ziYT`3Oo3iE:"ELdD#̨/E:Np0UJAT*tK.:xW\Nt~@$3Þ "s]PzAE3qy'R' 7jp4q;8719Q 3R,}soEȏPt2}2x<>8HLo6\|6*)8ǽ!+  q@ԡ2 $;hN+( CKȌ֢As8&`]xe+)`e t܋ƧhUEveQJ2?g~X{6`gfmE{g-Mp{M;u@s):ո1|MVqxdNaп>$)]8N|?wgDA86ew#`_L̔.^D_e,\"QŁ5;08XXx) 4;U3OE󘶺A/ýo?8CxS_b夏ܛ<]x7~a*@nK,p7Sp-<ði| IMn%Im^]ÃW >w Opfr;F]rCܵ\mp'&>&RpJKK+ <278' ]hSLw/pƏK?`78V 'be^ 1"~  U \0,gx"q\ߐ"\7+ʹFxuzxOy@2]˯_QpŃW_(M2E[v o2sr U||T;R"x;5Ny|ӃL.҈~Gܛd'Y{h-쉈 ҰFln/GȪKĐX [ '`*%MW~C%nmEx#h99R؅gG|t+hC(H:Hy/|;^ܤň "Br@+Fe| AEŸ%@:}___#<"@3G (qs3%.TS Af vsOJ4rd~p+iRF2/ʁӿ?ֹ 4P2 3F)Cl|\?J8KO &Dܙ@Ә_"Hͻ}{&OJ8^\ tDEth"H`lxq)[6]:AF@C<VV2Ak'4yzYMЇC.SZةh&cKoSm-y@'L Xpї*oy7V*g*'W2`L~^nNvV43#=-N %1y=na VdL1R*x`U(#q>2%CM41P|9qMGόW̌3c3I,CeYbMHYuP\X}*oeu% nkK8nkV/PX iBU,OjqGcvcV!RPqw& UĹpMSK|̺j$ggqUshQ&ƍQ6Umʪm#ѧA}Y6l7EQ}KiA]k{ouqY&,n[7rmqa:1sfQK“7L7ka7rg}] [IS=ĸ&41tòF@{CZ#ݱC3]#n]P}Sw6Z]G2`aduxtZ5 YLO ".6p4`T?>/Ich436xڞ>ˍI#964bCGzFoo %`aL[\3֚#íxڙĚ IՒKǒdx86 D`x2m|[UjJփIqS9JO?qŊ˷%.u<GH6hGM aä8iCㆦDh m8HdCGMF7z6C,Z /믝_wȄ~v]6UX!%ý%@}`9!ϡBlg܏SaO>_aǸc}s bPg1X٧)厡H{!ģMp(y$ڻ䎠8cNB=0S#==ۗwG HX>Y.L[̄rkm+ +5k]g{o1Xelٱz.Q8գpGT©ê;2K%+Tjzn.hr97&pKeNn6[XYevVog VHi;"Hsnw-73r:i9SɬP< WsX*hWC9ڴMUv@{!/j8C5D{@ 4YZH' ql&᪂;bF FbbpUUΕ;Wƞ fNe2X '$WA>6ZۯJ̊DkzhzPYqv!q֝=ɲSǛ7# gDҢ̢ՇD 6t'c0-y~6?j޾ RM>I3͙0zΒs9Ks8y4b Iu;s?aN{猀f!t5~w_MUh մBjo\]$P~7ED5/eSk?~7Z Uա}覚unV]&T]rSQ=ݾ̦Y.I{t=t=tɱl/F@j4lSV':-pGh7u3j.zT׃gD++pJaryk92A949kڪ᯻;Y=w_MKݳ EF=J=oT6ohGW!Z./>\[+DQʈ"9rݫpPIM7AXC&WA۸ endstream endobj 48 0 obj << /Filter /FlateDecode /Length 13 >> stream x endstream endobj 45 0 obj << /Ascent 765 /CIDSet 48 0 R /CapHeight 500 /Descent -206 /Flags 32 /FontBBox [-559 -302 1447 1051] /FontFile2 22 0 R /FontName /FPEFAF+Verdana /ItalicAngle 0 /StemV 80 /Type /FontDescriptor >> endobj 20 0 obj << /BaseFont /FPEFAF+Verdana /DescendantFonts [47 0 R] /Encoding /Identity-H /Subtype /Type0 /ToUnicode 46 0 R /Type /Font >> endobj 47 0 obj << /BaseFont /FPEFAF+Verdana /CIDSystemInfo <> /CIDToGIDMap /Identity /FontDescriptor 45 0 R /Subtype /CIDFontType2 /Type /Font /W [0[1000 684 596 427 623 601 633 352 454 748 633 274 973 633 274 394 521 521 364 843 607 623 623 684 592 684 364 603 623 623 352 732 632 344 ]] >> endobj 46 0 obj << /Filter /FlateDecode /Length 382 >> stream x]n0E|,Evx$B"H,P~!E*k<(FǞ;nVE~ M *+!n٢T]9jef슾 O9jMZW|]ը~nE/^fjldVvnm;<|-#Ai,+TeCpbO 8#䁔צ))Vx^&`0 Fѧ]1 !12(=ƽ]x0 sh8F endstream endobj 22 0 obj << /Filter /FlateDecode /Length 9664 >> stream x{ |Tս9.sglLfL&$  -`  # @! Y `+OI}־V"ѴRZuWں<;ߛ0gg?翟9 2݈C=#.3NZŮ~1ZVE R?CO:M#ڗFm!Boм}s?"TB;źr: 4;!d@g߶P4?[VOG~/B2$` زiiK)E BMYZ41Ih4ֵpMSo>zU ~E8{)Lo MmNF>,ʹ9|(T1oLjX̵)-e{Ҏ 3,i5Nxbr$Zd z=i &iI=1} SFBsQp*|nFIrfS~dR37'')T߽jO3 No;C}5Ư()\y;>[Wr8e>@I$g[,^y8:/bA!;Ĥ:nrںVW<:m{7v=PTknӖp=thIFg92UǎcJm'ȁypnsDJjm7J@Qr'ISx4?>2IБWx0 f)ՉsQo^"jӘ-*"IDcoSLEQ+$l"cdq:y@=/=^wT\ Χ+5u[t"`"S,͸M܅E "Y[DBtX9K"&:0mvjLSX0@a \%3 x1UEA=9&`]f(&4ʩ2mbS&RMG:E 5KUT%ȿc@^+  Ӹ]Ax $⼆reqY' tdzq/=MJlM"+*) 5NLS@n"BD ST$ UTnf, Y, HVaUX`XcjոzB lQVXJ9l +8МŪj | Gi<&k<&IӘ3-.i8M4KH{Od7i>lmȅkEܚȵZ)U $ª"'4Sv]Kk]D3eMKLccd½y¦ sP(nZZxF󻨸.w.U &h9$O0+\)w.ax`#1$y`x8T6GJ!kUTxASvf? n h)vgfMEٙ5gfkd#(ց~S qEwA6Ns#I j.5bWs A1E5L_{ѯ}R8,6W{&_y׿22;9TXf;KfRgM8C Fɡʡq(^4iqxQH_6P#0g+Q1̚*:rUdу=qvX0 DdRHqLþ t| Ӵ?pu9$1J>iOi]!v?4o`h;Ω5oE5yd\hz8g\{oU+-%!pD14H! <s[Ln&ll67XA7p[d/igFyW J/B"]e[QಇB-cwY3ˊbZi6}!h3,?Ϸi[o슽r^Q[~`K4LҞS7;@)Wԍ.psAn3KS uA4a =CAKy,_VJސ\,X,5X%7!-_Kͩ -~_`h=֙Kyt1.O'. < l6yNCqF!M=͉=8XhR_JfX/Su0@pܭa>%5dsmu^mcވmky۾g(讉p#,g*+?N@/Z}cނx֟~W,v[b󭟶6#-/M vqx?SWpm]MiO23iVzLo)"%W9\CU}+3­)!$) #v0=&ػOm!w3R׊|X/grԤ7:ӗWZ:-rNw8޻[iD\:ɨ2uܵNnkw>^C/g XKy5Л 3zI}.Dqyx\^} Ý`#T/2);{pkS"\|NkW>Ʌ-*grӳ~_8[:tk٢G-y~ lB``$fs5Y%\g~b?{3"<6e zCy?^$>jDyAq.׼1߿6j}wvbϝ[Q_7ֱ uqo?zcQi\DՑ--|lԳۑqJ*ZRR,#uU+3͠yFS|{BWZꍭvwskcpDY*' O=՞ FW߹hbM/ynz7.^+1\e̯ڗyYz88ca)1Uaʱ։9MH^Eo/mń =w/ Y@b(6C0 }Cm#lgʩgcoO2ZzYT1lvJQ`gpC,6ZQS/%oKҒ8'uZt"L(>paP"{%E4֖!AV>&AsPNr7lLSZ=1 &M%nθH}i+2[oʄ˗t//Xt M7W8MV=eK/^G[&ojnܺCJbӈ?@U$"sJD 3T`G`% 0lV6K l*l"ރ3{LWċ eo @ !ɿpΎƺF^GdT8' B@$ לThȺˀ ͥ)Hf\QsiFtۊK qity%C|1bES;LeAT@M*VTUt*>:6zЕz s)-};G9%-WĩS|Uә}Аh+=vcxtԘe9waxM]_Ӌ;߯zjK~B}>}?ީCCR{hN$c!S!b<#%~2%Z$lGYۄIÿ+'/S-^+L34tg8ԕǸ\4^&)' [qOz6$]OdL3ӧZ|^_#??N~'<$o* ?3f1kҀ֒b ,vq/?p6:jMT\e7 VF6IʓP`PJ9Z*0F@&z P`1\f#3 '%)6c9:VKj|):(oX`=)JFT#3  mPC[ Q 'rlHXM-r3Ee=V6?N]'HhdRv%\Ц68 7\ K k7%?/-1ÿcooÐ^@@Pw_onO{cРss`kgxU@spO@,ܯV _Q\RϋuC76:qowmo,^>DlkhonvҮt }CAΨ вd.L@_tcѕЗvv Giס>{Niڪwد3wn^:]Wk|AhwF@@ww{|ٰn:PfFn:ko[oO_{tJ;t}t*[;:YΞ654?+޶m[fᡑ]#a6`݈oFBNBhENK4@Q;==TϏnAA@<vZM^TLk{o3-ۈh :o'mQr䢰v߈iOkguU{U=Au%~TA(]gku2haijh1'Z ݰbړaKg0ki~uƔYm :YmC0FJP ZBiHF,0b7`mAϫYaR4 @Xe/Բ:Ա:!esY}@yW>eXzfώˣGal5~f'`ḐI_kl] ۯi'еOM])0Cnta-{csToFbn=FhA>ߤD-ymuE}/3|#i#7v[LΥu#0!:Y~'~O547ccX+"tz襸:NV4N_ފ}/*:FhwJG(z=G'~oCwo+i?|!=%Ń.A} h/]yP -[FKGz/-gk>5TFH-~ et%E&(S>[t;7]IQx]ׯ3ޭ$@О/%鎾dYU>Eo"N:=F6%epqQaNϑl%G`C뀿 XV_TؼiqForh` FQF/Q XhMzN#=*/

il<E֌bZ䗽huYtlz6:J 2ZO3QTzǐ6VsRqZM{[p=o %tk VKnPrG;k׌S_f`2H[3GHRJY!Y5b1"A{︌n'02I+èQʬZeR&C͐y+$~e'匱JL[6?{ѱ3;?FXLw[VVu-o%V+R.~E_h&`Q)~UTյ|Mm ?6ϫMj+omE)_Z*|yEr˹=GY,tLoGjyO.ཞj(坴]2]mcJDLtg8ӯ0}F>CO49U;t򪉀ߩgMzO&~O?qd=Arx]y0(_>.3yStD ƣFԸn4uGhsݞ;LrmCt:*5PAu>\è>*Y2f- [!> endobj 50 0 obj << /Author () /CreationDate (D:20130901215633+02'00') /Creator () /Keywords () /ModDate (D:20130901215633+02'00') /Producer (Foxit Reader PDF Printer Version 6.0.3.0513) /Subject () /Title () >> endobj xref 0 51 0000000000 65536 f 0000008036 00000 n 0000000018 00000 n 0000000051 00000 n 0000002728 00000 n 0000008407 00000 n 0000000000 00000 f 0000009172 00000 n 0000017169 00000 n 0000000000 00000 f 0000018108 00000 n 0000031590 00000 n 0000000000 00000 f 0000032542 00000 n 0000048048 00000 n 0000000000 00000 f 0000049030 00000 n 0000071068 00000 n 0000000000 00000 f 0000072024 00000 n 0000086623 00000 n 0000000000 00000 f 0000087582 00000 n 0000002789 00000 n 0000007758 00000 n 0000008184 00000 n 0000008819 00000 n 0000008554 00000 n 0000008098 00000 n 0000016948 00000 n 0000017665 00000 n 0000017316 00000 n 0000016861 00000 n 0000031370 00000 n 0000032083 00000 n 0000031736 00000 n 0000031283 00000 n 0000047814 00000 n 0000048573 00000 n 0000048208 00000 n 0000047727 00000 n 0000070841 00000 n 0000071577 00000 n 0000071222 00000 n 0000070754 00000 n 0000086401 00000 n 0000087125 00000 n 0000086771 00000 n 0000086314 00000 n 0000097322 00000 n 0000097374 00000 n trailer <> startxref 97648 %%EOFpdfparser-0.9.25/samples/Document1_pdfcreator.pdf000066400000000000000000001134201257674555500220320ustar00rootroot00000000000000%PDF-1.4 %쏢 5 0 obj <> stream x][s-;6][|}-s2\[Vyk7dESII/0f#9yF|8+jxq|ƺqWLݨӽ{jx}_@jD a|t몷m֭wuטͯ k潭r6P8-7/[[ݼ]oOzcKm[^n_պs{٫n@91laۦA?(ܞ}Owncmic[r;w򆶟6>]6nv2X[xP;Mcek[S)5t]٦UNӼ5h ]ypVtJiQ^&M>:uk~~LSlU,ީt_z0B =j0ñfl:dY7{y}c3`6lkATSnL ;MS& :_5O.vڡWC$Ҝi`nvxX7u[U񁫃 |+=N8V7=Rȕ`&ǰ}8+-Ιô-N 7mTGcGP&EgVC1Z;$s~"s޷?[3eh6,YC.2si2ABu G|SGF:cD@cv3ưj:9_n;/Ӵs X1EL$<cjD?΃;_Nk֪]h=F'β˹_Mt#{9ow$ʦlV %F~>gp9i*c~iM7":FB`i#Cw3"6Fvlۆ7-\7Rx~"MI-v:gVp;[k֮l1frpp˙SHR/?r6ǡY_J ^f"w\f@ +F s$1aI;mt,TE5B(QF1y!GrqJj,v./sa$~CdrsRFZO~=( $ hDBBdV䳦6)>xUl:S`Oݹ *(-(4t|;y%7 hޔ91+%HߤZtA07@C^3I 1%$0Y)X|\@ `_䲩zzG c "bx3ϑN_/.Re 7h!*#S'٤uXbwݜA{t̽TBo^&GGs46Oe25LðP[χvzUpnDH۝ t)oR猉v!yEJq.Sd,D \"Ղ=%r5ȋ[ S L ɴ.W=O y@J1iQf]*:}!+G =?K'])XN,>1U1*LV59aܚE&(ޙL`9db 8꿠yQ~(%aCA1Kxǫ>sP?f<řBdS«UD::ߞn@r8,ˏH9]j,M"Yֱ>1P"|yO+T=NZ&y"$!Y UvMY8M/Xː7-rkmk.\mqݵ0vͥѩ~PaLw[JA`VSP1"3Ѫ('zPBo;z9ńx Z+cP8lX]ʛ5{#:52~2{F֜M<\)DRo)I=Zh)TcL}%~hM_|]6fRy KN bX-;ѷIAwMi~Hg)fQۯI*Q,v,m*O$#;c~4xcJ;Gd&qx [_:KFfd[LTpu1֨Z8" YXOmlUtC]#K%H%ET5bɩbI7p.K7νw/̰nu"R9r.kmUfLzhߙE`{iY )l dJelq zҠY/]& ʱ7Kh[H.i!Q3]B25fϑbkPKf!wO |wYm2* _4+hCT65.';pu^tuJ?qGH>JWȌ32`ȽWժ].djd1wMlp<8wu1P QɪNAr_O *AgD>Aw:oZt=S=;?u1~MxNr*U?bSwB)05xNtM>"O[s8Sm&?R`Ha}Ivt@L@]'uJ/][ 옢-u52FbZ.d@].aD]D(R"O[s0rdvyNLOWeɌW,@`ᖐeg9JڳbKR&3(2o`|3vl,g cb{v&q;U}fH/Ofc) Ri1CMdE Qtena1p)Cr;07 j+z6R~֍_ MiVMy!/ߎb?[+&n‡{w8nRԫ_ ;A4U%C@ZI ~Զ?V)eb8 ʓAnmNosziL3 0#>jr'7ZoEPg0]TLo ϻ&zݮu;~j'jh iWrPY贋KxAb{Zi}$/fhT''uSo^PLFMi8]'e@|,GpsMƂL(ι''8I:ɣ> /Contents 5 0 R >> endobj 3 0 obj << /Type /Pages /Kids [ 4 0 R ] /Count 1 >> endobj 1 0 obj <> endobj 16 0 obj <> endobj 20 0 obj <>stream x]=n@F{N YֻdM4.EI.0 >H!=`}ל/i}'o0N/| Cݏe%[T[ߺ7L{/]ᵛ\8 T{ W<y -y b$#b"pOh;y Ry @)@{@=3y ۞@Y٨(hP\|nWBqEeEqE͊쩸FCqEMIQ\|7 +oߎ滳YqEm/-!> endobj 13 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> endobj 21 0 obj <>stream x];r0{N 935N"L b塰`0.räH3|ŷt~=i3:/L}~Smqۓoii[Z44{a@%e\Sbs6K P\q)T;Hc5CX>jG5YC.1Der f*356or;F1db ~d$PH6F djh(pl@@6 F8$"d2 re\A}egr8TN $HN}\~|F{טXWTyU)f endstream endobj 14 0 obj <> endobj 22 0 obj <>stream x]0 C:`(ٱ(quG&ݳJsͯùDyJ/?Is endstream endobj 7 0 obj <> endobj 10 0 obj <> endobj 17 0 obj <>stream x} |EwUG2If&I2I&$!!7!$$.(.*%貮g\UWQ﩮}}}2=駞~j !-ڎx4-ךѳ{%-c=ָ7y[I\/5BHv+qk_zsrо#$ kTnG]Z8zG;AFw{Q=Ak<2 2!4rbdh4nL͵P2IܧjF#Q#AsP|rWF#] Z'aV4 FsP'Bph1Z9Bi9[PzѧZ@+m%>Dkz6F mF[zf3(7mpgG;ŘD ].A`QՏ.C}]zi`]p݀~~q3mvrz]P)zE Q0,llpSVvrmncX'ڑ -i/>^a>uEtpjZj=ncQg~ 3NST.C( ݅{qӚ{@ߋ )=VQ~= ܹ(@1;0::v}b}l zy H$lPX{D'ѯLZS7EϡыPzA? wu[!OFq#`[\47\;onٳ:#ۦNmP_W[S]UYQ.+\2 b(+3#K&f^U L*925]+*{2I c*n9M%4s2 -2L[G[bdf*{jm YPB3U(rWGk-ԪJoUfPAAES+pj)Z]NB`8CAng;`BU.Q4]k#ocuVpE/~Z/(aV*kNv[rP-֝qv+ms!r /+4Ԭ]I~o[{S-΍䣌7ǸS1ŗ%mBdz{\eWE@ k?F(,rTHOӠ;.Bg#N0hqP'ua&!V{ܱL.d[ oR弥i*[AH}z98b0I]^SPȉ+KvQP\m`V{T/5@Z.n&@vrWn:&Q%{597pC!#$ھCpg}y>~A~7G0T )al8A${p ֖6puKUNZBĿ@)DxZ*Cx"SRwt FcJ'c0T M ZIZ_}7zjdj#VN\v}GqL<:Ϭff(ά ORhGT aM,CQ͉w(?!5c_|!7|Уթ᪑;8݃vb';8Llcb+[&&62qX:&2>&V1L,gb2qKXb&1L2|&bbsdbDLdb&34&ZD ShfF&gZ&jfJ&*(g"DLLfIL3QD!L31<&rabLb" &L3D*&LHaD2&LHb"&L3`΄ +&L02a`Bτ8&LhP3bBɄ 92&LHL Q&8ķL| &f+&ėL|L3Ǚ21'L|GL|L_ fOL8ĻLLěL=32 ce&~KL Ley&cY&ai&~SL#L'xL wJQ:N>4DzcJ)}@}JMBK?)G=.wh۔ޢ&7h?)z-f*Wh(L鷔^M^iڙ⢔DK@I)#sl1< +% %3%%#=@OJ8JZJRM[hҖZS(aJ(<"Nz]߂p5}u| 9w80>cAC[Kbן~m(& מz];s]h^[mE p(=]zv7%].rs= x9 ~YzTuHzDu08c>Q^y]7WoqQous}{VgpΝwq6зn}3u p=:k༫TS\WZ\Wvv]u!s]vB׎{GEDQo--[6mٳ-aL91iy {G.B %u{F$kk׬?_UkqZ̡fMduoZ=uՒIVsh5V ޷ڙT޼ZYYYgEde0%",,,,).+S8+2{ϬHGa{d&Q8=3=V5R8%2 #M{# u=ušH5\+bxLo hZcT1uv_}uVTvIEfnUNɯB]PEbc4=zGbGct;0# PUt ܾ̅5A %@lk2 65r o?5?T(.@Nm-̀Mkk}Uesz=n@``.000 hDmiVT@ ` h4uZ@ PTa@0P( |D@ YL@ HRdID@ 8v `Xf `z45@P9@$#P'| O/;3q>|}_'xM?~xU+^E <xS_~x0qc_<8< x s}{ী;wnp fM݀npZ5W\pp)ŀ?ac?ac?ac?ac?W `b!`b!`b!`b!`b!`b!`b!`bac?ac>ac>aoW_ys>eif4~i?J) ܕCnpx¸2peexC=,wA(/;B'2pyO P{7!<8N.7˼YĀ??77&qB]^~A)fVSʑ2_vrRmȕ&ZK3K|پD9/R<"7D5ѨPDҸ}S)9x٤9e)OT N" &<3t&Dm ѠIs"K#b}lxGNHJ(ѭQ5zp~55:'ʧ'{p*jܜ>ר5DJ 5^W#*++3B[!W?c;lgx{Ll{yd}.Ϥ8ץMH$ZG ɝ'لON:$\ēQji*<ЩwDZqF5_ftO+4.<6qȎCȃ8#fjh"Yf {_;2!gqEtTsG|\DIM[n+\:ƩZӲeƮނ=WnkU2n3;;Nwƙ2 T_MVe$GNv zbkxHzIWJ5r7ӄۋCAz;}lJ9a aO6+1+T*($o0E0xTwYp,p,p,p,p, !nedQ (0Oh 2o%'d;~IiRٰSiH@b DtXUfgB!U/.^k8xqXaᤔ ʮ'ӑ4TMTĺbVݦ 'd\NeFHp٤Uɡ\2 /&s fN"`z\2Ȃ ap.$-If57\f63)v%^/]~2Ӥ9uS}s\%%vߓOu~;')ݡV-Բ h2p_@3X'VĘfјfIba^C4!M(p*K8[!cP2R~kZb$ޖUZK >Z8S\v˨Ȉp%pqb~;0qXFE":1'+2o!ci_&liOtuZpA4Hg`$hy:;qgg'kFb1Γ[9Vݠ lLMN܇^aNIrhyE X"& ZU}󸤌ԓ`5gd/E(aUJ[nq9y> P CXBŢ>T,N1@  _<}7pFy8//<};úqr$񣬆oi%(C_5#E!F9E#O3𑉲Sq?wbbDp9}Xss 2}37ھ5-l0hrw@0vUV:lhd2fVYfay_MԉDoB9㽉Glei5mU``WP:yAWyŀ/|^,+vZF8tg#L^xdrYT=i >op蛊@HIt.ڊFg)ubq,yh '7XɿsUg&0:-0drXW:Zfݥ@~ j $MB' N%Ы3zGdczE%=`gA@"_19~b O>DcDN r6*m+esM Jm݄A,P6"8$p *dc I厒P &lhW8V( w( jHa:|}k/||$}|=d7\Tρgl S"]`[ ,B]eYDfgyd("Rt QDcDc"2yjE$.do.,mH5$S˵XL/;sQWܐ`&it=L͙aE|JyO喪2 rpMh}S(~|gpՎK:Z!Qz0/_ϛl2&'<223CUIP"-O":D18 Ǔ풫$a ~I%[G]q+8G umjrRgj!\1ne98K _0p%լl և4rx:ƪ{Wg]筟<4OYxW.'ޣu8+w:幙bp1r;vNkO>]/lxCUXRCa?[}d O̡h%ƵAzA Td;bu1$_3͖[, kqlOG)bԤ;ߛӹ}JAh+r崬sYl g{B(Jɛs~SZ ٵ!ۂBy 5.(uk)2Ƭ$o<;&L;<GS.yL3ٜEԎs8#3-R^]J{ x2t&&ѱMǛcٖ&VM"6 n= ;zyğz7drㅣII&13) 2))uUT԰7O- ݎɗO  _cYR'YX[PZYX4Ƣ"XvP$ E O?7, &Kt"挪ja%-fTf2c͚7]Y_QlmMujxΘ!߭/ +ՊPyꄪtL&A:zN &g%1y7I&)$#D8~@ +$U 鎔zfzGXDpWeԈ764CHl!;`! ei8Ո d`8iNS$`IbΕ$\IHRa\fՙjLlf~SowPJMot ^EDL^r%;}^q t.m_Rq-m[ZY~ƊW7o1(oގEyswu`2NV|%*KT,īW ] C;9Lׇg][wUxEY|M*qi55f'\aQXXYQ?\Z}rwBɇ3<s^zi邽k-1UNwk"Z뢰RɄ 4l, Y\6;Q2Wt\ѠWO$,o($+}V>l~6W>J2\fyZC]}(y5յ'sA~f)|4ȫc+ oR2f/.a $D'^{+'bNt*x:\:tĹ( yDx⮷4!1Yf2cdܽLPS,3Ì(QIIHxϷ&JœTp2@3**2I#C p腰&XҸqo\rS/LbY/0~+JI899Iv$1R YEӄ^Cz?W٫4Yo>6L5tVCZfS`NF0AF?BR},s*+aE)˒}ϯ2ܹ;dϬζ$2\,Q^ FZÁiYܝa<m08LɃPO[5fwKBRv*Ŀ";"/ uOUgut4?~<ط'/S~"Ja}/b endstream endobj 15 0 obj <> endobj 18 0 obj <>stream x{{|TսZk?d2df2yOBB^I&$$a< !I hD9[y(؞Vj=0&-VjګVZ.{ ޏ{gkZ0BȂv".))CEתu}y;l.z`_zu!_en8W#4VV [; <{`Z>o`U}ymgzRZoj~Z ߴY=WʃQZ`9/f.pǸ";B|#5џᾌ!0E' Hq݂8݂>J}FCiC(z=EiܷAwK8C{:w›ȇP<ڄvqċh]-kVtE'ѥ[-B1];~uv)꧵N6m6M6:ѿ_y -9? FAD2Rb\c[4Bɿ!ĭ$-RܝKgU(. RYIQ04}}ކhGwc?). ` x5H4cM\P(D\229ʥq/n)߷ĎVFwǹ>D38O[C5ٵ^Zhj=qIHѴM?{m۷'{+{zzذ w߾}F&w }G}8jcZ=q{2{u>%b{Vғn=tLۖ1 ;*ZqrYtyjxwRp.Ǡ +ylh|<0GzchcS O~t ǟzO,c?y'Ïc;Lj2s؆[w JÿYB xO3K).?b(D##~J|gFψLwDmڼiS2[k}q1ܰXىZkch[!ƁRss$\EDˊ3< #gbF-%b0evO0=<] n7I0*v;4* ,5*A#g4Eo X `F٨S QBz3d"BXV 7 oϔĜ1Toac?81H$B\R0z鞉 :v2@D 3VbG2kfA6; ThVL& ^UL5.CE ;ƘBw)!1؊ךgtD+T % L|?s6v≁+gۘN.#Mf U[/wAn0h4uM\?ba$A$ J }/P <`x;/& d 8aC0dALV0 3GvX#c ý!̸Zmր 2 tZ fRBdg}H:R t$Z.^HFu5u5N?Q}_ÓX%yRs#mڋØ*`pDbQlw8E]{nJS\lf"cZR@vO I[DlD `X!6Kp&3EwHX*"&1}#ƛuޜS9:v8\.g*p&I1"<`Z.`y0^x0~bbT!V#@ٸ!ӌ\:*TpلC ; `s6#fYVۤ $%"Io3ȶP DTX)qV7w)hcHNeYڭ"#SCP]I`q$21\4$h.t.t.GS-ambvLO -v(ÌyeTGͥeUCs'w?{jVW=JJx۪.^<+Tqi{o'~))]üɷ"Jq(*XL3 J.#+U _v |ov ZN T.-)y ݤ,.jՑޒ=ŻabϒYA×gPNE11 |ø=ʘsJDB1LQg JǰVl2[`1ImY;| u u%pPBv,p\cKm:o,h@j@eeU{x N%E*+Tw87;%] E'_fbru}<$}X\mLo&.~hs9gzߦUW\>WϾG5E5u &ݚ.bM!PM@*iag[q 7ܘ*[87e_ 8;Xwᬮ1)0BGӛ(pq!%@elebbb3۪Θ YWG3A`FΘ˜fy kfʒ\qZz*4/~/67ݻCy?-Z㝇|yQnqFȤϳRT-y=3cP0 7 L-rB#H2~7.p2nQM6DDGFM8jWhm2&.UrjfN%QfĨ3SͮB Ш|.gg'2~ $:WB?Lg[Q.*/LC;33liFw8$EPCcm|ѵތ73n.29ԡ8G&SRcZqz.Ϝ'l3A_;ӟ?roD!{e-&e-d{+<jlzy{pZں o:3 8- sïl# > *#*b0x@%p [lzʚO?&c9IaGL)U}Efs7=҆Obcc}-%nⲦN<*W^|י^wZ*5_Jg[}nq@8<+zpM5AAjM(a02h}+/ A5=P=?=~;~pp7:E%zG&2y֯ zrWFoJ݄ H: Xpq0Q9k_sO u-t8Pۃ7,W`ǝrQ[N~$%ETk&{K$G,KM|>jf.yXzSZeZqM `Ku&ZJnl6q@h'MG4J,i>ce +f:u!. |aPp N@ (8N'p -u5e21X5*p8SQU=LWn͟矝[UqW?48.^$|==_jJ}_ Э4 9LӣȮqBcUA贱΍LֹCȠfR&-&]U? L ЄldU,YVSke6֤ٶ`}[@`uOTճٳMܲ$]B9YvDY݄M36nmr꬙8sNc?uxI؎'[](\eHn'<+umO5Lt_TkS]Q`,*/~DŽ5xƳ] :gȝdCb\O،+ndR8ˌyn&b1mS7OdV9uԍ#U|HeSX&ߥV,PVWF"o"F@#iM^eV)_q7/e4-wL)ͿŐѳeʱu'tBB.T.TD㞇:3N~!Vj{}_j;z[7gRǝ3 oa> 5嗞/+c،p* yYRpE, -hA # rMB Iy dDrzZ)FIv8ӱ~uDAw"fx&!6! vatUDFL {$"7Uތ͌lZ%c=_zeؘ}\Vtxi=j5U=sɦHTÈףGgG(HVe_ã+lTfLLȩ̂A- "4, HTiD+J MbOOD&7fI2ꔨ1ŀM.1BMw_*2(nx,o3>>i75ohn=L-ToCoRҋˁ"]zK/3+KT(AI08ݣu-tv`uiIi‘^y|̳L_5`E2ˈ7Aڇ_)ߣHdDԅE ^')Ϊ)JU*MKL3.N:7 Y}Zik\AJvJAC!Bi82,>CtY)ƁbxX(`/{Y[{)5lnU @49t->cQ`6 Fauu;HEAvPv6) xJL*l\1`L>1`L>_.Li:ܜ[t]Jӓqh="]lbe}}.3IWf*z-KO}Tb^C=\D81f.5'v\ jzD)uNjo=*k9>j76]7޼;?RZZ9QI/ܕ0ǶtvvP_1NG]A E ]ZBj6b\%SD6OP4 z7ZapD W# 3uu4pu:Y#fp^*1j^#=wNSi@Z]4 N kNPr2N(0a!zX"dE0Y cκa=].%&1lG,uԄ6ؐxO$ũ {?|Wz+Gf$>Jۙ&0YYs|*I2 !+ZƎ]p[-,WB^ Syz)UWdՕ̪T`OQ+A|'?>Wqi1iFZtRrG `Q+`"C{Z^ZiU >C2K~۠+Dr$U!ý2_,0ڿ}n[*\}\|U)ȗpW~i~k[W}V{}ҒY3V^{^cfB1s'#aG(K͂O.͵ߟZZ3vd+ڟ![T@Afwv3KKl 键&RRMtȏ3h(DJO'~LfCX[ybrG9|ox!N&*mv÷&^8%p(fq QwFdsl}5hKVs7p'`fߓ;5?J/T>;I??[O!Xe;/Džk.Kvya1#ӳoZzFf:^s>W==ٟ}#PSCDusgSC;1-hYGiGªl[%-_激xJthr,te5jF 5vʹ 4uVԆhZ@5 ldCh)ZB#(-'9)΋Voٝ ɟrwVp /xԎ!lEi Gc{^=.n8^CC< h?FFk60ZQR!?| 2tz55z.ͥ׎c4f ^ # UBC}>=5o2 endstream endobj 8 0 obj <> endobj 19 0 obj <>stream x;kxוaY5,[fdDz0 l!K#1Dd<CxH IC#&$m_mlk}!l_6mv)IhM6bWy\3:{3 = ZһgS>ikix yֿ].uۺgU}zw :2!|}nKՅ%mI&{m1?LiCUp}(ݴqtھiMt.m Aà8g(NiG~ƾ=ɀVvc݇#pfAI>"+]&2ԐrGj8P_G*w*|a a0|g` 㽨|a,K:5d` a Zoؖq˲VM|ᇬq%1 lyW/;9VnxYwbh_a"h(#"I\c!燨6,u(#0wo|?F4m:=RV,_vkD|qWymsFZ³CM3g46LV?5P7?WuSeS.I%.YXȷ۬%l2r:TlGתE-I$GdARM7,`ݲU 5^֧=LJ ԐPukܬC7^ JQU)6|GUO5c7gE>uh5/DqhuSADSQWɢk%qhlSsB{$tƿ;%nGS*ɵT=TZ)upSS UP1a1^ HkǺjLTO {BE ut1H"tXJіd$p]Ugv,zܧdMu3L{k:!kg'IωiɱteQ+qcL6ix:Mo[T,$ȩ!))'JB`I4Z;cUI'f }?90q=~0;R+M5Ø!DUh[Z=!+pr>ቮY1Ff&xhpq!X#KR>c̶8Ӗl~s}N|_)l,*.BӐq%΋\DR>LeAR`L >U?)`TG\AQ__&4BJ (06`x IT2iW9 }6j KoiJt{Ky47yg[f"ܹRu*%#,%$+cgQdĒ8i/%f,*@eng fv]ru}jmN bčL뺪vba<3tV_vt}O:l3 <$C!r`qK?ג 'ʱ-~\KrK" .Y1Xwdyz4O8iҼoQg .5r/LPcCA:1&P9ip:+ F9L͔ߜ(_/1qsHt2nLqI0 # a=׭<"`5F<7Bs* Sބ3>!viS 8!3hec)z1X{dF"7GBM5tI\yzBD&ױDQs=ˀD8"VqDHzJ+cSoRBkkwKb Ouw\1d4窆38'ğ>H j3pmA5D+L6* ?i:Sކ{ fcj`I7"Gnƹrq*SMB51exûgx;p 1Lh^LKJ+Qz/Iu8\Kw]*aߵϖםWq?E 5=;TIْn^9rՄHA_[R[(:fZy T0Z ~kIX֦w4e˖!GQww|v )   lV !C"hB 'Y=mkie%c2<R*)>eWPU(~eS١t(J2W_IFi~@OP 0*Cs2@*@sspN%SM|T\iu#+yQmMTzE&Ȑ 䲔%Co;LrISU_Q4ʱ=K7yfָ+*] G<~qOs5or-!yr߉xK _%dvTTKv:}PٜԊO7 u#_OvףuS's P7}-h.;vOmk=k:%Gmmb 嫏nnz'/v¹75ʢr^rVE7laBƏ@)lXT0H(F]!dM/9gY|*©sLW뇇4quP˼Si,.4}?q4%i VlqeEc?SK<ݏy[ЧT?>E fHv^:d'$B s\ΑPE|_0 6P\\&tT:T/AV˗QjF+ˊӞ\ɍgLxNA!-nf<5NjK{~oKȮ=fnn-wl7w,럾8{ɇRm,FLR#> !jB[nYr,rx6@Q,6X$f(ͩh(mh(N@t6w/S'd4 X f1 ʈ rՌ!>sVI+\ .4:ez9ȿ?oeıj}MdorxҚ2-z {F'&!z\QwǬWN>/n\>*>p &acռĴKpUM9ldnuI.mhKS8ortp{bI{Q3^l}\#_\T|,BOy<"K5& nfie}:'cqMϛ68\ > :sl0y%h15-s]K Bk[AsgTV̻J=KFJ[Y]@Y%c9'S "/ ӽN$ܫ?9{kgoCB[ ":ܳ:T^Ut:nol7?<ϬHV,tz{zߩYcfkV?7|ZFxjFjXDoX+d\N =l6rӧ k@8?/}HLh 0ܟ;Asc1=p;ы' ?>Yxxj@JFsy\SmYG-:>1:ub'6^Jg6u0mPs,>zXRz^?rF?7ɺ,5Fz3S+Ϝ+ L4uP2ANlhEÏ_[40a ψql 1k GAЦR:0_yMOux:9 95F`d*F_nk#p" 'Ⱦ߂)hnK0C? 4#܏{h^P:7|CPOԧ]a ~t͑YbkǓ.={1'} l endstream endobj 23 0 obj <>stream GPL Ghostscript 9.07 () 2013-09-01T22:20:38+02:00 2013-09-01T22:20:38+02:00 PDFCreator Version 1.7.1 Document1Sebastien MALOT() endstream endobj 2 0 obj <>endobj xref 0 24 0000000000 65535 f 0000006898 00000 n 0000037598 00000 n 0000006839 00000 n 0000006697 00000 n 0000000015 00000 n 0000006677 00000 n 0000008906 00000 n 0000030171 00000 n 0000007461 00000 n 0000009099 00000 n 0000007797 00000 n 0000007862 00000 n 0000007734 00000 n 0000008341 00000 n 0000021156 00000 n 0000006963 00000 n 0000009300 00000 n 0000021373 00000 n 0000030372 00000 n 0000007046 00000 n 0000007929 00000 n 0000008619 00000 n 0000035960 00000 n trailer << /Size 24 /Root 1 0 R /Info 2 0 R /ID [<984DA96B7C5E60408BB1AFE2FE6B6C03><984DA96B7C5E60408BB1AFE2FE6B6C03>] >> startxref 38038 %%EOF pdfparser-0.9.25/samples/Document1_pdfcreator_nocompressed.pdf000066400000000000000000002012701257674555500246140ustar00rootroot00000000000000%PDF-1.4 %쏢 5 0 obj <> stream q 0.12 0 0 0.12 0 0 cm 0.210938 0.371094 0.570313 rg q 8.33333 0 0 8.33333 0 0 cm BT /R7 27.96 Tf 0.999429 0 0 1 201.96 720.68 Tm [()0.325008()-1.80537()0.672032()-4.03324()1.21721()-1.73093()-1.98045()0.219118( )1.20567()0.219118(\n)0.969781()0.219118( )-1.08406()-6.02524( )]TJ ET Q 0 g q 8.33333 0 0 8.33333 0 0 cm BT /R9 11.04 Tf 0.999402 0 0 1 70.8 698.96 Tm ()Tj 25.32 TL T*[()0.275486()0.45671()1.09464()1.09464()3.33903()0.598768()1.09464()-2.32338()-4.32348()-2.32338( )7.1195(\n)-5.58341()11.4748( )-2.74026( )4.87511()-2.32338()1.09531(\r)3.33903()-0.424846()3.33903( )-6()-2.32338()14.2151(\n)-5.58408()11.9714(\n)-5.58408()11.4748()-2.32338()-0.424846()1.09531()-2.19725()-2.32338()11.3328( )-6( )-2.74026()8.67882()-0.63727()-2.32205()9.56037(\n)-5.58408()3.34036()-0.424846( )-2.74026()9.5617()-2.19592( )-2.74026()-2.19592()3.34036()11.4735()-2.32338()]TJ 225.615 0 Td [()3.34036()1.09398(\r)3.34036()1.09398()-0.424846()-1.31437()1.09398()3.34036()3.03234()-2.32338( )-2.74026()1.09398()1.09398()-2.19592()2.29152()-2.32338()3.82362()3.34036()1.09398()1.09398()0.45671()-2.32338()1.09398()0.45671()-1.31437()3.34036()10.4512()-2.32338()0.45671()0.59744()-1.31437()3.34036()-0.63727()8.55269()0.645236( )-2.74026()3.34036()3.03234()1.09398()0.45671()-2.19592()-2.32338()0.45671()-2.32338()1.09398()1.09398()3.03234()3.34036()1.09398()0.45671()]TJ -225.615 -15.48 Td [()-1.31503()3.33903()0.598768()-0.42551()3.33903()-0.42551()-0.637933()-2.32338()0.645899( )-2.74026()3.33903()3.03234()1.09531()0.45671()-2.19725()-2.32338()3.33903()0.45671(\r)3.33903()1.09531()3.33903()3.33903()-0.424846()-2.32338()3.33903()1.09531()11.3328( )-6()2.29152()-2.32338()0.27615()0.598768()0.45671()10.4512()-2.32338()0.45671()3.33903()3.03234()3.3377( )-2.74026()-2.32338()0.45671()3.34036()-2.19592( )8.13581()-0.63727()-2.32338()5.74074(\n)-5.58408()1.09398()]TJ 229.457 0 Td [()-2.19592(\r)14.2164()0.45671()-2.19327()-2.32338()3.34036(\n)-5.58408()3.34036()8.55269()-5.13533( )-2.74026()1.09398()1.09398()8.68014()-2.32338()-0.424846()1.09398()-2.19592()-2.32338()11.3328( )4.87511( )-2.74026()-2.19592()-0.63727()8.55269()-5.13533( )-2.74026()3.34036()1.09398()9.5617()3.34036()1.09398()0.45671()-2.32338()0.645236()0.45671()-1.31437()1.09398()1.09398()1.09398()-0.424846()1.09398()-0.424846()-2.32338()1.09398()0.45671()-1.31437()3.33504()-0.424846()2.29417()]TJ -229.457 -15.36 Td [()-4.22921(\n)-5.58341()0.598768()3.33903()1.09464()8.55269()-5.13467()1.09464()-2.19725()11.3328( )-2.74026()-2.32338()-0.424846()0.45671(\r)3.33903()1.09531( )-2.74026()14.2151()-2.32338( )-2.74026()1.09531( )8.13581( )-6( )-2.74026()14.2151()-2.19592()3.33903( )-6()-0.63727()-2.32338()3.03234()0.598768()11.3328()-5.13533()1.09531()3.33903()0.45671()-2.32338()0.645236( )-2.74026()1.09398()11.97()-0.424846()-2.32338()3.34036(\n)-5.58408()3.34036()10.2388()-2.32338( )-2.74026()]TJ 232.339 0 Td [( )-2.74026()10.4512()-2.19592()0.459365()-0.424846()8.55269( )-6()0.45671()3.03234()3.34036()0.454043()2.29152()-2.32338()2.18265( )-2.74026()3.34036( )-2.74026()0.45671()3.34036()-2.32338()11.3328()-2.19592()8.55269( )-6()0.45671()14.2164()0.59744()1.09398()-0.424846()-2.32338()-5.13533()1.09398()-2.19592()11.3328( )-2.74026()8.55269( )-6()0.45671()3.03234()3.34036()0.45671()226.077]TJ -232.339 -15.48 Td [()3.33903()1.09464()3.03234()3.33903()1.09464()-0.42551()-0.42551()1.09464( )-6()-2.32338()3.33903()0.45671(\r)3.33903()1.09531()3.33903()3.33903()-0.424846()2.29152()-2.32338()1.82684( )-2.74026()-0.424846()-2.19725()1.09531()3.33903()3.33903()11.9714()3.34036( )-6()-2.32338()0.45671()3.33903()-2.19725( )8.13581()-2.32338()1.09531(\r)3.33903()-0.424846()3.3377( )4.87511()-2.32338(\r)3.34036()0.59744()1.09398( )-6()1.09398()10.4512()-2.32338()1.09398()3.34036()]TJ 231.618 0 Td [()0.645236()11.3328()3.34036()-1.31171()1.09398()3.34036()3.34036()-0.424846()-2.32338(\n)-5.58408()0.59744()-1.31437()1.09398()-2.32338()1.09398()3.34036()9.5617()-2.19592()3.34036()-0.424846()-2.32338( )8.13581()-2.19592()-2.32338()3.34036()1.09398()-2.19592()0.59744()1.09398()9.5617( )8.13581()-0.424846()-2.32338(\r)3.34036(\n)-5.58408()-0.424846()3.34036( )-2.74026()11.4735( )-2.74026()-2.32338()-1.31437()3.34036()3.33504()1.09398()1.09398()1.09398()0.45671()226.077]TJ -231.618 -15.48 Td [()0.275486()3.33903()0.598768()0.45671( )-2.74026()-4.32348()-2.32338()1.8275()11.9707()-5.13467()11.3328( )-6()3.33903()-0.424846()-2.32338(\r)3.33903()3.33903()0.598768()3.33903()-0.424846()-2.32338()3.33903()0.598768()3.33903()11.3328()-0.635942()-2.32338()-0.424846()0.45671()3.03234()1.09531()-2.19725()-2.19725()1.09531()-0.424846()8.55269( )-2.74026()3.03234( )-2.74291()8.68014()-2.32338()-0.424846( )8.13581( )-6(\r)3.34036( )-2.74026()0.59744()-2.32338()1.09398()3.34036()]TJ 229.457 0 Td [()-2.32338(\r)3.34036(\n)5.29199()0.600096()-2.19592()0.45671()-2.32338()5.74074( )-2.74026()1.09398()-2.32338()0.59744()1.09398()-0.424846()3.34036()-0.424846()2.29152()-2.32338()1.80294()3.34036()8.68014( )-2.74026()3.03234( )-2.74026()0.59744()-2.32338()10.4512( )-2.74026()3.34036()-2.32338()0.645236( )-2.74026()11.97()1.09398()-0.424846()-2.32338()0.59744()3.34036()-2.19592()0.59744()3.34036( )-6()10.2388()-2.32338()-2.19592( )8.13581( )-6.00627(\r)14.2164(\n)-5.58142()0.600096()]TJ -229.457 -15.36 Td [()3.33903()1.09464()-0.42551()1.09464()-2.32338()3.33903(\n)-5.58341()3.33903()-0.637933()-2.32338(\r)3.33903( )-2.74026()1.09531()1.09531( )-2.74026()14.2151()-2.19725( )-2.74026()-0.424846( )3.33903()3.33903( )-2.74026()8.55269( )-2.74026()1.09531()1.09531()-2.19725()2.29152()8.55269( )-3.75591(\n)-5.58408()11.4748( )-2.74026( )4.87511()-2.32338()1.09531(\r)3.33903()-0.424846()3.33903( )-6()-2.32338()14.2164(\n)-5.58408()11.97(\n)-5.58408()0.59744()-2.32338()-0.424846()1.09398()8.68014()]TJ 220.332 0 Td [()0.45671( )4.87511( )8.13581()-2.19592()-0.63727()-2.32338()9.5617(\n)-5.58408()3.34036()-0.424846( )-2.74026()-1.31437()8.68014( )-2.74026()-2.19592()3.34036()0.59744()-2.32338()0.45671()3.34036()1.09398(\r)3.34036()1.09398()-0.424846()-1.31437()1.09398()3.34036()3.035()8.55269( )-2.74026()1.09398()11.97()-2.19592()2.29152()-2.32338()6.64619(\n)-5.58408()0.59744()3.34036()1.09398()-2.32338()0.45671()0.59744()-1.31437()3.34036()-2.32603()3.34036()3.34036()3.34036()-1.31702()]TJ 227.056 0 Td [()226.077]TJ -447.387 -15.48 Td [()-1.31503()3.33903()0.598768()-0.42551()3.33903()-0.42551()-2.32338()0.45671()-2.32338()1.09464()1.09464()3.33903( )-2.74026()11.4748(\n)-5.58408()-2.32338( )-2.74026()3.33903()10.2388()-2.32338()3.33903()1.09531()3.33903( )-2.74026()3.33903()3.33903()3.33903( )-6()-2.32338()0.45671()9.56037()-1.3157()3.33903( )-6()-0.424846()0.45671()14.2138()-2.32338( )-2.74026()-0.424846()-2.19592()13.1676()-2.32338()1.82684()1.09398()-5.13533()11.3328( )-6()3.34036()-0.424846()]TJ 238.222 0 Td [()3.34036(\n)-5.58142()3.34036()-2.32338()0.59744()1.09398()-0.424846()3.34036()-0.424846()-2.32338(\r)3.34036( )-2.74026()1.09398()11.97( )-2.74026()3.34036()-2.19592( )-2.74026()-0.424846( )3.34036()3.34036( )8.13581()-2.32338( )-6()11.3328()10.4512()-0.424846()0.45671()-2.32338()-2.19592( )8.13581( )-6(\r)3.34036()3.34036()-0.424846()226.074]TJ -238.222 -15.48 Td [()3.33903()1.09464()3.33903( )-2.74026()3.33903()3.33903()3.33903( )-6()2.29152()-2.32338()3.81963()3.33903()3.33903()-1.3157()-2.32338()1.09531()3.33903()-2.32338()-1.3157(\n)5.29199( )4.87511( )4.87511(\n)5.29199()3.34036(\n)-5.58408()-2.32338()3.33903()3.33903()1.09531()2.29152()-2.32338()1.80294()3.33903()-2.19725( )-2.74026()3.02969( )-2.74026()0.59744()-2.32338(\r)3.34036()3.34036()0.45671()11.4735( )-2.74026()-2.19592()0.59744()0.45671()-2.32338()11.5213( )-2.74026()]TJ 242.305 0 Td [()1.09398()-0.422191()-2.32338()0.45671()0.59744()-1.31437()3.34036()-0.63727()-2.32338()1.09398()3.34036()-2.32338()-1.31437()3.34036()0.59744()-0.424846()3.34036()10.4512()-2.32338()1.09398()0.45671()-1.31437()3.34036()-0.424846()-2.32338()0.645236()0.59744()1.09398()3.34036()13.9084()1.09398()1.09398()1.09398()0.45671()-2.32338()-5.13533( )-2.74026()1.09133()2.29152()-2.32338()12.7029( )-2.74026()-0.424846()-2.19592()1.09398()3.34036()3.34036()1.09398()3.34036( )4.87511()]TJ -242.305 -15.48 Td [( )-2.74026()3.03234( )-2.74026()-2.19725()-2.32338(\r)3.33903()3.33903()0.598768()3.33903()-0.42551()-2.32338()9.56037(\n)-5.58408()3.33903()-0.424846( )-2.74026( )3.33903()3.33903()0.45671()8.67882()-0.63727()-2.32338()9.56037(\n)-5.58408()3.33903()10.4512( )-2.73893( )3.33903()3.33903()0.45671()-2.19725()-2.32338( )-6()11.9714()-2.32338()0.45671()-1.3157()-0.639925()-2.32338()11.5213( )-2.74026()3.34036()3.03234()1.09398()0.45671()-2.19592()8.55269( )-6()1.09398()13.1676()]TJ /R11 11.04 Tf 25.2 TL T*[(A)3.56008(r)-4.15818(i)4.47881(a)1.32034(l)4.47862( )-4.77753(:)-4.77753( )-4.77753(P)14.4361(r)-4.15818(a)1.32034(e)1.32101(s)-0.29872(e)1.32101(n)1.32101(t)6.09787( )-4.77819(d)1.32101(i)4.47815(c)-0.29872(t)-4.77819(u)12.1971(m)-4.4569( )-4.77819(v)10.5773(e)1.32101(l)4.47815( )-4.77819(o)1.32101(r)-4.15818(c)-0.29872(i)4.47815( )-4.77819(u)12.1984(t)-4.77819( )-4.77819(a)1.32101(l)4.47815(i)4.47815(q)-9.55639(u)1.31968(a)12.1957(m)6.41784(.)-4.77687( )6.0992(I)-4.77687(n)1.31968( )-4.77687(h)1.31968(a)1.31968(c)]TJ 238.703 0 Td [( )6.0992(h)1.31968(a)1.31968(b)1.31968(i)4.47947(t)-4.77687(a)1.31968(s)-0.300048(s)-0.297393(e)1.31968( )-4.77687(p)1.31968(l)4.47947(a)1.31968(t)-4.77687(e)1.31968(a)12.1957( )-4.77687(d)1.31968(i)4.47947(c)-0.300048(t)-4.77687(u)12.1957(m)-4.45823(s)10.576(t)-4.77687(.)6.0992( )-4.77687(N)4.17943(u)1.31968(l)4.47947(l)4.47947(a)1.31968( )6.0992(f)-15.6529(e)1.31968(r)6.71788(m)-4.46089(e)1.32233(n)1.32233(t)-4.77952(u)12.1984(m)6.42049( )277.998]TJ -238.703 -14.64 Td [(n)1.32034(i)4.47881(b)1.32034(h)1.32034( )-4.77753(e)1.32034(g)-9.55573(e)12.1964(t)-4.77753( )6.09854(r)-4.15818(u)1.32101(t)6.09787(r)-4.15818(u)1.32101(m)6.41916( )-4.77819(s)-0.29872(u)1.32101(s)-0.29872(c)-0.29872(i)4.47815(p)1.32101(i)4.47815(t)6.09787(.)-4.77687( )-4.77819(D)4.17943(o)1.32101(n)1.32101(e)1.32101(c)10.5773( )-4.77819(i)4.47815(n)1.32101( )-4.77819(l)4.47815(u)1.31968(c)-0.300048(t)-4.77687(u)1.31968(s)10.576( )-4.77687(e)1.31968(r)-4.15818(o)1.31968(s)10.576(.)6.0992( )-4.77687(C)4.17943(r)]TJ 243.626 0 Td [(a)1.32233(s)-0.300048( )6.0992(t)-4.77687(r)-4.15818(i)4.47947(s)10.576(t)-4.77687(i)4.47947(q)-9.55639(u)1.31968(e)12.1957( )-4.77687(e)1.31968(r)-4.15818(a)12.1957(t)-4.77687( )-4.77687(a)12.1957( )-4.77687(t)-4.77687(e)1.31968(l)4.47947(l)4.47947(u)1.31968(s)-0.300048( )6.0992(s)-0.300048(o)1.31968(d)1.31968(a)1.31968(l)4.47947(e)1.31968(s)-0.300048(,)-4.77687( )-4.77687(s)-0.300048(i)4.47947(t)6.0992( )-4.77687(a)12.1931(m)-4.45558(e)1.32233(t)6.09655( )277.998]TJ -243.626 -14.52 Td [(t)-4.77753(e)1.32034(m)-4.45757(p)1.32034(o)12.1964(r)-4.15818( )6.09854(m)-4.45729(a)1.32101(s)-0.29872(s)-0.29872(a)12.1971( )-4.77819(a)1.32101(l)4.47815(i)4.47815(q)-9.55506(u)1.32101(e)12.1971(t)-4.77819(.)6.09787( )-4.77819(U)4.17943(t)6.09787( )-4.77819(a)1.32101( )6.09787(m)-4.4569(e)1.32101(t)-4.77819(u)1.32101(s)10.5773( )-4.77819(v)10.5787(i)4.47682(t)-4.77687(a)1.31968(e)1.31968( )-4.77687(l)4.47947(i)4.47947(g)-9.55639(u)1.31968(l)4.47947(a)1.31968( )-4.77687(v)10.576(i)4.47947(v)10.576(e)-9.55639(r)]TJ 246.027 0 Td [(r)-4.15818(a)1.31968( )6.0992(c)-0.300048(o)1.31968(n)12.1957(g)-9.55639(u)1.31968(e)1.32233(.)6.0992( )-4.77687(C)4.17943(u)1.31968(r)-4.15818(a)1.31968(b)1.31968(i)4.47947(t)-4.77687(u)12.1957(r)-4.15818( )-4.77687(n)1.31968(o)12.1957(n)1.31968( )6.0992(f)-15.6529(e)1.31968(u)12.1957(g)-9.55639(i)4.47947(a)1.31968(t)6.0992( )-4.77687(l)4.47947(a)1.31968(c)-0.302703(u)1.32233(s)-0.297393(.)6.09655( )277.998]TJ -246.027 -14.52 Td [(I)-4.77753(n)1.32034(t)-4.77753(e)12.1964(g)-9.55573(e)12.1964(r)-4.15818( )-4.77753(a)12.1964( )-4.77753(e)1.32101(u)1.32101(i)4.47815(s)-0.29872(m)-4.4569(o)1.32101(d)12.1971( )6.09787(q)-9.55506(u)1.32101(a)1.32101(m)6.41916(.)6.09787( )-4.77687(D)4.17943(o)1.32101(n)1.32101(e)1.32101(c)-0.29872( )-4.77819(e)1.32101(u)12.1971( )-4.77819(l)4.47682(a)1.31968(o)1.31968(r)-4.15818(e)1.31968(e)1.31968(t)6.0992( )-4.77687(m)6.41784(a)12.1957(g)-9.55639(n)12.1957(a)1.31968(.)-4.77421( )-4.77687(F)1.94102(u)1.31968(s)]TJ 269.921 0 Td [(c)-0.300048(e)12.1957( )-4.77687(s)-0.300048(e)12.1957(m)-4.45823(p)1.31968(e)1.31968(r)6.71788(,)-4.77687( )-4.77687(l)4.47947(a)1.31968(c)-0.300048(u)1.31968(s)10.576( )-4.77687(i)4.47947(n)1.31968( )-4.77687(v)10.576(o)1.31968(l)4.47947(u)1.31968(t)-4.77687(p)1.31968(a)1.31968(t)-4.77687( )278]TJ -269.921 -14.52 Td [(c)-0.299384(o)1.32034(m)-4.45757(m)-4.45757(o)1.32034(d)1.32034(o)12.1964(,)6.09854( )-4.77819(l)4.47815(e)1.32101(c)-0.29872(t)-4.77819(u)1.32101(s)10.5773( )-4.77819(m)-4.4569(i)4.47815( )-4.77819(h)1.32101(e)1.32101(n)12.1971(d)1.32233(r)-4.15818(e)1.32101(r)-4.15818(i)4.47815(t)6.09787( )-4.77819(l)4.47815(e)1.32101(c)-0.29872(t)-4.77819(u)1.32101(s)10.576(,)-4.77687( )-4.77687(n)1.31968(e)1.31968(c)10.576( )-4.77687(p)1.31968(o)1.31968(r)6.71788(t)-4.77687(a)12.1957( )-4.77687(l)4.47947(o)1.31968(r)-4.15818(e)]TJ 249.749 0 Td [(m)6.41784( )-4.77687(d)1.31968(i)4.47947(a)1.31968(m)-4.45823( )-4.77687(e)12.1957(g)1.31968(e)1.31968(t)6.0992( )-4.77687(i)4.47947(p)1.31968(s)-0.300048(u)1.31968(m)6.41784(.)-4.77687( )-4.77687(N)15.0555(u)1.31968(l)4.47947(l)4.47947(a)1.31968( )-4.77687(e)1.31968(t)-4.77687( )-4.77687(e)1.31968(s)10.576(t)-4.77687( )6.0992(f)-4.77687(e)1.31968(l)4.47947(i)4.47947(s)-0.302703(.)-4.77952( )277.998]TJ -249.749 -14.64 Td [(P)3.56008(e)1.32034(l)4.47862(l)4.47881(e)1.32034(n)1.32034(t)-4.77753(e)1.32034(s)-0.299384(q)-9.55573(u)1.32101(e)1.32101( )6.09787(s)-0.29872(i)4.47815(t)-4.77819( )-4.77819(a)12.1971(m)-4.4569(e)12.1971(t)-4.77819( )-4.77819(c)-0.29872(u)12.1971(r)-4.15818(s)-0.29872(u)1.32101(s)-0.297393( )6.09787(m)-4.4569(a)12.1971(g)-9.55506(n)1.32101(a)12.1957(.)6.09828( )]TJ /R12 11.04 Tf 24.24 TL T*[(T)1.94035(i)-4.77753(m)16.6752(e)-1.91911(s)-2.53848( )-0.14936(:)-4.77753( )-0.14936(C)3.56008(u)-0.299384(r)-4.15818(a)8.95762(b)-0.29872(i)6.09787(t)-4.77819(u)-0.29872(r)-4.15818( )10.726(t)-4.77819(r)6.71788(i)-4.77819(s)8.33761(t)-4.77819(i)-4.77819(q)10.5773(u)-0.29872(e)-1.91845(,)-0.150024( )10.726(o)-0.29872(r)-4.15818(c)-1.91845(i)6.09787( )-0.150024(n)-0.29872(e)-1.91845(c)-1.91845( )10.7274(c)-1.91845(o)-0.29872(n)-0.300048(s)8.33761(e)-1.91977(c)8.95629(t)-4.77687(e)-1.91977(t)6.0992(u)-0.300048(r)-4.15818( )-0.148696(m)]TJ 221.893 0 Td [(o)-0.300048(l)-4.77687(l)6.0992(i)-4.77687(s)-2.53846(,)10.7274( )-0.148696(m)16.6752(a)-1.91977(s)-2.53846(s)-2.53846(a)-1.91977( )-0.148696(d)-0.300048(u)-0.297393(i)-4.77687( )-0.148696(s)8.33761(e)-1.91977(m)16.6752(p)-0.300048(e)-1.91977(r)-4.15818( )-0.148696(e)-1.91977(l)6.0992(i)-4.77687(t)-4.77687(,)-0.148696( )10.7274(s)-2.53846(i)6.0992(t)-4.77687( )-0.148696(a)8.95629(m)16.6752(e)-1.91977(t)-4.77687( )-0.148696(p)-0.300048(h)-0.300048(a)-1.91977(r)-4.15818(e)8.95629(t)-4.77687(r)-4.15818(a)-1.91977( )10.7221(l)-4.77952(e)8.95895(c)]TJ 214.088 0 Td [(t)-4.77952(u)10.5787(s)-2.53846( )250]TJ -435.981 -14.52 Td [(u)-0.299384(r)-4.15818(n)-0.299384(a)-1.91911( )-0.14936(u)10.5767(t)-4.77753( )-0.14936(l)6.09854(o)-0.299384(r)-4.15818(e)-1.91911(m)16.6752(.)-0.150024( )-0.150024(P)1.32101(r)-4.15818(a)-1.91845(e)8.95762(s)-2.53846(e)-1.91845(n)10.5773(t)-4.77819( )-0.150024(i)6.09787(d)-0.29872( )-0.150024(n)10.5773(u)-0.297393(n)-0.29872(c)-1.91845( )-0.150024(o)-0.29872(r)6.71788(n)-0.29872(a)-1.91845(r)6.71788(e)-1.91845(,)-0.150024( )-0.150024(p)-0.300048(r)6.71788(e)-1.91977(t)6.0992(i)-4.77687(u)-0.300048(m)16.6752( )-0.148696(n)-0.300048(i)-4.77687(b)]TJ 225.015 0 Td [(h)-0.300048( )-0.148696(e)-1.91977(g)10.576(e)-1.91712(t)-4.77687(,)-0.148696( )-0.148696(b)10.576(l)-4.77687(a)-1.91977(n)-0.300048(d)10.576(i)-4.77687(t)-4.77687( )10.7274(o)-0.300048(d)-0.300048(i)-4.77687(o)10.576(.)-0.148696( )-0.148696(A)4.17943(l)6.0992(i)-4.77687(q)-0.300048(u)-0.300048(a)-1.91977(m)16.6752( )-0.148696(f)-4.15818(a)8.95629(c)-1.91977(i)-4.77687(l)6.0992(i)-4.77687(s)8.33761(i)-4.77687(s)-2.53846( )-0.148696(p)-0.300048(o)10.576(r)-4.15818(t)6.0992(a)-1.91977( )250]TJ -225.015 -14.64 Td [(s)-2.53846(o)-0.299384(l)6.09854(l)-4.77753(i)-4.77753(c)8.95696(i)-4.77753(t)6.09854(u)-0.299384(d)-0.299384(i)-4.77753(n)10.5767(.)-0.150024( )-0.150024(N)4.17943(u)-0.29872(n)-0.29872(c)-1.91845( )-0.150024(p)-0.29872(o)10.5773(r)-4.15818(t)6.09787(a)-1.91845( )-0.150024(d)-0.29872(a)8.95725(p)10.5773(i)-4.77819(b)-0.29872(u)-0.29872(s)-2.53846( )10.726(a)-1.91845(u)-0.29872(g)10.5773(u)-0.29872(e)-1.91845( )-0.150024(s)-2.53846(e)-1.91977(d)-0.300048( )-0.148696(p)10.576(u)-0.300048(l)-4.77687(v)10.576(i)-4.77687(n)-0.300048(a)8.95629(r)]TJ 227.176 0 Td [(.)-0.148696( )-0.148696(N)15.0555(u)-0.300048(l)-4.77687(l)6.0992(a)-1.91977(m)16.6752( )-0.148696(s)-2.53846(i)-4.77687(t)-4.77687( )-0.148696(a)-1.91977(m)16.6752(e)-1.91977(t)-4.77687( )-0.148696(n)-0.300048(i)6.0992(s)-2.53846(l)-4.77687( )10.7274(a)-1.91977(t)-4.77687( )-0.148696(u)10.576(r)-4.15818(n)-0.300048(a)-1.91977( )10.7274(e)8.95629(l)-4.77421(e)-1.91977(i)6.0992(f)-4.15818(e)-1.91977(n)-0.300048(d)10.576( )-0.148696(s)-2.53846(c)8.95629(e)-1.91977(l)-4.77687(e)8.95629(r)-4.15818(i)6.09655(s)-2.53846(q)-0.297393(u)-0.297393(e)]TJ 217.33 0 Td [( )250]TJ -444.506 -14.52 Td [(e)-1.91911(u)-0.299384( )-0.14936(a)-1.91911(c)-1.91911( )-0.14936(n)10.5767(i)-4.77753(s)8.33761(l)-4.77753(.)-0.14936( )-0.14936(I)17.594(n)-0.29872(t)-4.77819(e)-1.91845(g)10.5773(e)-1.91845(r)-4.15818( )-0.150024(c)-1.91845(o)-0.29872(n)-0.29872(g)10.5773(u)-0.29872(e)-1.91845( )-0.150024(v)10.5773(i)-4.77687(t)-4.77819(a)8.95762(e)-1.91845( )-0.150024(o)-0.29872(r)6.71788(c)-1.91845(i)-4.77819( )-0.150024(v)10.5773(e)-1.91845(l)-4.77819( )10.7247(s)-2.53846(o)-0.300048(l)6.0992(l)-4.77687(i)6.0992(c)-1.91977(i)6.0992(t)-4.77687(u)]TJ 211.326 0 Td [(d)10.576(i)-4.77687(n)-0.300048(.)-0.148696( )-0.148696(S)1.31968(e)8.95629(d)-0.297393( )-0.148696(a)-1.91977(l)6.0992(i)-4.77687(q)-0.300048(u)-0.300048(e)8.95629(t)-4.77687( )-0.148696(a)-1.91977(c)8.95629(c)-1.91977(u)-0.300048(m)16.6752(s)-2.53846(a)-1.91977(n)-0.300048( )-0.148696(n)-0.300048(u)-0.300048(n)-0.300048(c)-1.91977( )10.7274(s)-2.53846(e)8.95629(d)-0.300048( )-0.148696(i)-4.77687(n)-0.300048(t)6.0992(e)-1.91977(r)-4.15818(d)10.576(u)-0.300048(m)16.6752(.)-0.148696( )-11.0248(I)17.594(n)-0.302703( )-0.148696(n)-0.297393(o)-0.297393(n)]TJ 232.819 0 Td [( )250]TJ -444.146 -14.52 Td [(p)-0.299384(u)-0.299384(r)-4.15818(u)-0.299384(s)-2.53846( )10.7267(s)-2.53846(i)6.09854(t)-4.77753( )-0.14936(a)-1.91911(m)16.6752(e)-1.91845(t)-4.77819( )-0.150024(r)6.71788(i)-4.77819(s)-2.53846(u)10.5773(s)-2.53846( )-0.150024(p)-0.29872(o)-0.29872(r)6.71788(t)-4.77819(a)-1.91845( )-0.150024(v)21.4534(o)-0.297393(l)-4.77819(u)-0.29872(t)6.09787(p)-0.29872(a)-1.91845(t)-4.77819( )10.726(f)-4.15818(a)8.95762(c)-1.91845(i)6.09787(l)-4.77819(i)-4.77819(s)8.33496(i)-4.77687(s)-2.53846( )10.7274(s)-2.53846(i)6.0992(t)-4.77687( )-0.148696(a)]TJ 207.364 0 Td [(m)16.6752(e)-1.91977(t)-4.77687( )-0.148696(l)6.0992(e)-1.91977(c)8.95629(t)-4.77687(u)-0.297393(s)-2.53846(.)-0.148696( )-0.148696(S)1.31968(u)10.576(s)-2.53846(p)-0.300048(e)-1.91977(n)-0.300048(d)10.576(i)-4.77687(s)8.33761(s)-2.53846(e)-1.91977( )10.7274(f)-4.15818(e)-1.92147(r)-4.15818(m)16.6752(e)-1.91977(n)-0.300048(t)-4.77687(u)10.576(m)16.6752( )-0.148696(p)-0.300048(u)-0.300048(r)-4.15818(u)-0.300048(s)-2.53846( )-0.148696(s)-2.53846(i)6.0992(t)-4.77687( )-0.148696(a)-1.91977(m)16.6752(e)-1.91712(t)-4.77952( )-0.148696(l)-4.77952(a)]TJ 230.418 0 Td [(c)-1.91712(u)-0.297393(s)-2.53846( )250]TJ -437.782 -14.52 Td [(e)-1.91911(g)10.5767(e)-1.91911(s)-2.53846(t)-4.77753(a)-1.91911(s)-2.53846( )-0.14936(v)10.5767(e)-1.91911(s)8.33761(t)-4.77819(i)-4.77819(b)10.5773(u)-0.29872(l)-4.77819(u)-0.29872(m)16.6752(.)-0.150024( )-0.150024(D)4.17943(o)-0.29872(n)-0.29872(e)-1.91845(c)-1.91845( )10.726(n)-0.297393(i)-4.77819(b)-0.29872(h)-0.29872( )-0.150024(d)10.5773(i)-4.77819(a)-1.91845(m)16.6752(,)-0.150024( )-0.150024(g)10.576(r)-4.15818(a)-1.91977(v)10.576(i)-4.77687(d)-0.300048(a)-1.91977( )-0.148696(s)-2.53846(i)6.0992(t)-4.77687( )-0.148696(a)-1.91977(m)]TJ 232.579 0 Td [(e)-1.91977(t)-4.77687( )10.7274(m)16.6779(i)-4.77687( )-0.148696(u)-0.300048(t)-4.77687(,)-0.148696( )-0.148696(b)-0.300048(l)-4.77687(a)-1.91977(n)-0.300048(d)10.576(i)6.0992(t)-4.77687( )-0.148696(p)-0.300048(o)-0.300048(r)6.71788(t)-4.77687(t)6.0992(i)6.0992(t)-4.77687(o)-0.300048(r)-4.15818( )10.7274(l)-4.77687(o)-0.300048(r)6.71788(e)8.95629(m)16.6752(.)-0.148696( )-0.148696(S)1.31968(e)-1.91977(d)-0.300048( )-0.148696(n)-0.300048(o)-0.300048(n)-0.300048( )-0.148696(m)16.6699(i)-4.77952( )-11.0248(v)10.5787(i)-4.77952(t)-4.77952(a)-1.91712(e)]TJ 216.85 0 Td [( )250]TJ -449.429 -14.52 Td [(n)-0.299384(u)-0.299384(l)-4.77753(l)6.09854(a)-1.91911( )-0.14936(c)-1.91911(o)-0.299384(n)-0.299384(v)10.5767(a)-1.91911(l)6.09787(l)-4.77819(i)6.09787(s)-2.53846( )-0.150024(t)6.09787(r)-4.15818(i)6.09787(s)-2.53846(t)6.09787(i)-4.77819(q)-0.29872(u)-0.29872(e)8.95762( )-0.150024(a)-1.91845(c)-1.91845( )10.726(l)6.09787(o)-0.297393(b)-0.29872(o)-0.29872(r)-4.15818(t)6.09787(i)-4.77819(s)-2.53846( )-0.150024(v)10.5773(e)-1.91845(l)6.09787(i)-4.77819(t)6.09787(.)-0.151352( )-0.148696(M)-2.83851(a)8.95629(u)-0.300048(r)6.71788(i)-4.77687(s)]TJ 211.326 0 Td [( )-0.148696(s)8.33761(e)-1.91977(d)-0.300048( )-0.148696(e)-1.91977(n)10.576(i)-4.77687(m)16.6779( )-0.148696(e)-1.91977(u)-0.300048( )-0.148696(n)-0.300048(i)-4.77687(b)-0.300048(h)-0.300048( )-0.148696(p)-0.300048(o)10.576(r)-4.15818(t)6.0992(a)-1.91977( )-0.148696(m)16.6752(a)-1.91977(l)-4.77687(e)-1.91977(s)-2.53846(u)-0.300048(a)-1.91977(d)10.576(a)8.95629(.)-0.148696( )-0.148696(N)4.17943(u)-0.300048(l)-4.77687(l)-4.77687(a)-1.91977(m)16.6752( )-0.148696(d)-0.300048(a)-1.91977(p)-0.300048(i)6.09655(b)-0.297393(u)-0.297393(s)-2.53846( )250]TJ -211.326 -14.64 Td [(m)16.6752(a)-1.91911(u)-0.299384(r)-4.15818(i)-4.77753(s)-2.53846( )-0.14936(s)-2.53846(e)-1.91911(d)-0.299384( )10.7267(u)-0.29872(l)6.09787(t)-4.77819(r)6.71788(i)-4.77819(c)8.95762(i)-4.77819(e)-1.91845(s)-2.53846( )10.726(c)-1.91845(o)-0.299163(n)-0.29872(d)10.5773(i)-4.77819(m)5.79915(e)-1.91845(n)-0.29872(t)-4.77819(u)-0.29872(m)16.6752(.)-0.150024( )-0.150024(N)4.17943(u)-0.29872(l)-4.77819(l)-4.77819(a)-1.91977( )10.7274(s)-2.53846(o)-0.300048(d)-0.300048(a)8.95629(l)-4.77687(e)8.95629(s)-2.53846( )-0.148696(a)-1.91977(t)6.0992( )]TJ 227.536 0 Td [(l)-4.77687(e)8.95629(o)-0.300048( )10.7274(f)-4.15818(r)-4.15818(i)6.0992(n)-0.300048(g)10.576(i)-4.77687(l)-4.77687(l)6.0992(a)-1.91977( )-0.148696(a)8.95629(l)-4.77687(i)-4.77687(q)-0.300048(u)10.576(e)-1.91977(t)-4.77687(.)10.7265( )]TJ /R13 11.04 Tf -227.536 -23.88 Td [(C)1.81622(o)1.81622(u)1.81622(r)1.81622(i)1.81622(e)1.81622(r)1.81622( )1.81622(N)1.81622(e)1.81622(w)1.81622( )1.81622(:)1.81622( )1.81622(C)1.81622(r)1.81622(a)1.81622(s)1.81622( )1.81622(i)1.81622(a)1.81622(c)1.81622(u)1.81622(l)1.81622(i)1.81622(s)1.81622( )1.81622(a)1.81622( )1.81622(s)1.81622(a)1.81622(p)1.81622(i)1.81622(e)1.81622(n)1.81622( )1.81622(v)1.81622(e)1.81622(l)1.81622( )1.81622(s)1.81622(o)1.81622(l)1.81622(l)1.81622(i)1.81622(c)1.81622(i)1.81622(t)1.81622(u)1.81622(d)1.81622(i)]TJ 336.801 0 Td [(n)1.81887(.)1.81622( )1.81622(C)1.81622(r)1.81622(a)1.81622(s)1.81622( )1.81622(b)1.81622(i)1.81622(b)1.81622(e)1.81622(n)1.81622(d)1.81622(u)1.81622(m)1.81622( )600]TJ -336.801 -14.4 Td [(i)1.81622(n)1.81622( )1.81622(s)1.81622(a)1.81622(p)1.81622(i)1.81622(e)1.81622(n)1.81622( )1.81622(n)1.81622(o)1.81622(n)1.81622( )1.81622(u)1.81622(l)1.81622(t)1.81622(r)1.81622(i)1.81755(c)1.81622(i)1.81622(e)1.81622(s)1.81622(.)1.81622( )1.81622(D)1.81622(u)1.81622(i)1.81622(s)1.81622( )1.81622(t)1.81622(e)1.81622(m)1.81622(p)1.81622(u)1.81622(s)1.81622( )1.81622(s)1.81887(a)1.81622(p)1.81622(i)1.81622(e)1.81622(n)1.81622( )1.81622(i)1.81622(d)1.81622( )1.81622(l)1.81622(e)1.81622(o)1.81622( )]TJ 336.801 0 Td [(v)1.81622(o)1.81622(l)1.81622(u)1.81622(t)1.81622(p)1.81622(a)1.81622(t)1.81622(,)1.81622( )1.81622(s)1.81622(i)1.81622(t)1.81622( )600]TJ -336.801 -14.28 Td [(a)1.81622(m)1.81622(e)1.81622(t)1.81622( )1.81622(c)1.81622(o)1.81622(n)1.81622(g)1.81622(u)1.81622(e)1.81622( )1.81622(e)1.81622(r)1.81622(o)1.81622(s)1.81622( )1.81622(m)1.81622(o)1.81755(l)1.81622(l)1.81622(i)1.81622(s)1.81622(.)1.81622( )1.81622(P)1.81622(e)1.81622(l)1.81622(l)1.81622(e)1.81622(n)1.81622(t)1.81622(e)1.81622(s)1.81622(q)1.81622(u)1.81622(e)1.81622( )1.81887(t)1.81622(i)1.81622(n)1.81622(c)1.81622(i)1.81622(d)1.81622(u)1.81622(n)1.81622(t)1.81622( )1.81622(p)1.81622(u)1.81622(r)]TJ 336.801 0 Td [(u)1.81622(s)1.81622( )1.81622(a)1.81622( )1.81622(e)1.81622(n)1.81622(i)1.81622(m)1.81622( )600]TJ -336.801 -14.28 Td [(e)1.81622(g)1.81622(e)1.81622(s)1.81622(t)1.81622(a)1.81622(s)1.81622(,)1.81622( )1.81622(i)1.81622(n)1.81622( )1.81622(v)1.81622(e)1.81622(h)1.81622(i)1.81622(c)1.81622(u)1.81622(l)1.81755(a)1.81622( )1.81622(m)1.81622(i)1.81622( )1.81489(e)1.81622(l)1.81622(e)1.81622(i)1.81622(f)1.81622(e)1.81622(n)1.81622(d)1.81622(.)1.81622( )1.81622(I)1.81622(n)1.81622(t)1.81622(e)1.81622(g)1.81622(e)1.81622(r)1.81622( )1.81622(m)1.81622(o)1.81622(l)1.81622(e)1.81622(s)1.81622(t)1.81622(i)1.81622(e)1.81622( )]TJ 336.801 0 Td [(s)1.81622(u)1.81622(s)1.81622(c)1.81622(i)1.81622(p)1.81622(i)1.81622(t)1.81622( )1.81622(j)1.81622(u)1.81887(s)1.81622(t)1.81622(o)1.81622( )600]TJ -336.801 -14.4 Td [(n)1.81622(e)1.81622(c)1.81622( )1.81622(a)1.81622(u)1.81622(c)1.81622(t)1.81622(o)1.81622(r)1.81622(.)1.81622( )1.81622(N)1.81622(a)1.81622(m)1.81622( )1.81622(n)1.81622(o)1.81622(n)1.81755( )1.81622(d)1.81622(o)1.81622(l)1.81622(o)1.81622(r)1.81622( )1.81622(e)1.81622(s)1.81622(t)1.81622(.)1.81622( )1.81622(V)1.81622(e)1.81622(s)1.81622(t)1.81622(i)1.81622(b)1.81622(u)1.81887(l)1.81622(u)1.81622(m)1.81622( )1.81622(c)1.81622(o)1.81622(n)1.81622(g)1.81622(u)1.81622(e)1.81622( )1.81622(h)1.81622(e)]TJ 336.801 0 Td [(n)1.81622(d)1.81622(r)1.81622(e)1.81622(r)1.81622(i)1.81622(t)1.81622( )1.81622(a)1.81622(n)1.81622(t)1.81622(e)1.81622( )1.81622(i)1.81622(d)1.81622( )600]TJ -336.801 -14.28 Td [(p)1.81622(o)1.81622(s)1.81622(u)1.81622(e)1.81622(r)1.81622(e)1.81622(.)1.81622( )]TJ /R14 11.04 Tf 25.92 TL T*[()-1.59848()-2.4807()2.5909()3.11067()2.40237()2()2.4024()3.52822()-2.69379()3.52888( )-2.40171(\n)2( )2.5119( )13.388()2.40171( )4.68659()3.52888(\r)2()-2.48004()-8.87531()3.11067()2.59156()-2.48004()2.59156()13.388()2.50394()-7.34719()2.40171()2()2.50394()-2.48004()3.52888()-1.05415()-2.48004()3.112()3.52888()-8.28451()13.388()-1.05415(\n)2()-1.05415()3.52888( )2.5119(\n)2()-1.05415()2.50394(\n)2()-1.05415()3.52888()-2.48004( )]TJ 283.009 0 Td [()-2.48004( )4.68659()-2.47739()2()2.50394(\n)2( )4.68659()4.85918()3.52888()-5.56018()-2.12689()2.59156()3.112()2.5119()3.52888()-1.05415()-2.12689()2()-1.05415()-2.48004()-1.05415()2.50394()-2.48535()2.50659(\n)2.00209()2.59156()351.56]TJ -283.009 -15.36 Td [()-2.4807()2.5046()3.52822()3.11067()13.3886()2.40237( )-6.19015()3.52822()-1.05548()-2.48004()3.11067()3.52888()-7.7654()13.388()3.11067()-8.87531()13.388()-1.05548()-11.9315()13.388( )-6.18948()4.86051()3.52888()-1.59848()-2.48004()3.11067()3.52888()2.40171()3.52888()-2.48004()2.58891()2.40304()2.50394()3.52888( )4.68659()-2.48004()2.50394(\n)2()-1.05415()4.85918()3.52888()-5.56018()2.40569(\n)2()2.59156()13.388()-1.05415()3.52888()-8.47303()3.52888(\n)]TJ 289.853 0 Td [( )13.388()2.50394()-8.28451()13.388()-1.05415()-2.48004()-1.05415()3.52888()4.4901()-13.3561( )2.5119()13.388()2.50394()4.85918()-7.34719()-1.59848()-2.48004()1.99676()-2.48004()2.40304()2()3.52888( )13.388()2.40304()-2.12689()2.59156()-2.48004()-2.48004()2.50659()351.56]TJ -289.853 -15.36 Td [( )13.3886()-2.4807()-1.05548()2.5046(\n)2()-1.05548()3.52822()-8.87531()13.3886()-11.9315()13.388()4.85918()3.52888()-8.37213()2.5119()2()-11.9315()13.388()3.11067(\n)2()2()2.50394()3.52888()-8.47436(\n)2.00209()-1.05548()2.50394()-2.12689()2.59156()3.52888()2(\n)2()2()-1.05681()3.52888()3.112()13.388()-1.05415()2.50394(\n)2( )4.68659()-7.34719()2.40304()2.50394()-6.01689()3.52888()4.8459()-2.48004( )2.5119( )13.388()]TJ 270.282 0 Td [()2()2.50394()-2.48004()-1.05415()3.112(\n)2()-2.48004()3.52888()2.40304()2.50394()3.52888()-2.48004()-8.87664()13.388( )-6.18948()3.52888()2.40304()-1.05415()3.52888()2.40304()2.59156()-1.05415(\n)2()3.52888( )4.68659()2.40038()2.50659()-8.36947()13.388()-1.05681()351.56]TJ -270.282 -15.36 Td [()3.11067()-2.4807( )2.51257( )13.3886()-2.4807()2()2.5046()-2.4807()-1.05548()3.11067(\n)2()-2.48004()3.52888()-2.48004()2.50394()3.52888()-2.48004()2.50394()3.52888( )13.388()-2.48004()-11.9315()2.50527(\n)2()-1.05548()4.85918()3.52888()4.84325()-13.3561( )2.5119( )13.388()-2.48004()2()2.50394()-2.48004()-1.05415()3.112(\n)2()-2.48004()3.52888()13.388()2()3.52888()-8.47303(\n)2()3.11466(\n)2()-2.48004()3.52888()13.388()]TJ 278.687 0 Td [()-1.05415(\n)2( )-6.18948()4.85918()3.52888()-12.4746()13.388()4.4901()2.40304( )4.68659(\n)2()-11.9302()3.52888()-1.05415()2.40304()3.112()13.388()-2.48004()2()-7.34719( )13.388()-2.12689()2.59156()-2.48535( )4.68393()4.85918()351.56]TJ -278.687 -15.48 Td [()-1.05548()-2.4807( )4.68592()3.11067()-2.4807()2.5909()3.52822()2.40237(\n)2()-1.05548()2.50394()-2.12689()2.59156()3.52888( )2.5119()13.388()3.11067(\n)-8.87531( )13.388()2.40171()-7.34719()-1.05548()13.3893()2.50394()3.52888()2.40171( )4.68659()-2.48004()-8.37213()4.85918()3.52888()-8.47569( )2.5119()13.388()3.112(\n)2()-8.47303( )4.68659()-7.34719()13.388( )4.68659()-7.76407()-2.48004()2.59422()3.112()13.388()-2.48004()2.50394()3.52888( )-6.18948()]TJ 288.052 0 Td [()4.85918()3.52888()-5.56018()2.40304()-2.48004()-1.05415()-2.48004()2()2.40304()-1.05415()3.52888()13.388()2()3.52888()2()-2.48004()3.112(\n)2()-2.48004()3.52888()13.388()2()3.52888()2.50128()-13.3561( )2.5119( )13.388(\n)2.00209()-1.05681()351.56]TJ -288.052 -15.36 Td [()-1.05548()2.40237()3.11065()13.3886()2.5046()-8.37147()13.3886()-1.05548()-7.34785()3.52822()-2.48004(\n)2()-7.7654()13.388()2.40171()2.50394()3.52888()2.40171()-1.05548()3.52888()2()-2.12689()-8.87531()3.52888()3.11067()-2.12689( )13.3893()-2.12689()2.59156()4.85918()-7.34719()3.2368()2.50394()3.52623()2.40304()-7.76407()13.388()-7.76407()13.388()-1.05415()-11.9302()13.388()2()-7.76407()3.52888()-2.48004()2.59156()2.40304()2.50394()3.52888()]TJ 269.561 0 Td [()-1.05415()3.52888()2.50394()-2.12689()2.59156()2.50394()-2.12689()2.59156()3.52888()3.52888()-8.28451()13.388()2()-7.76407()2.5119( )2.5119( )2.5119()2.40304()4.85918()-7.34719()13.388()2()-7.34719( )13.388()-2.12689()3.112()-2.12689()2.59156()-8.37213()13.388()-1.05415()3.52623()-2.12423()2.59156()-11.9329()13.388()351.56]TJ -269.561 -15.36 Td [()3.11067()2.5909()2.40237()-6.38664()13.3886()3.11067()2.40237()4.85918()-7.34785()4.84325()2.59156()2.40171()-2.48004()-1.05548()-2.48004()2()2.50394()3.52888()4.48877(\n)-8.87531( )2.5119()3.112(\n)2()2.50394()2.40171()2.50394()-2.48004()3.52888()2()-2.48004()3.10934(\n)2()-2.48004()3.52888()2.40304()-1.05415()3.52888()2()13.388()3.112(\r)2()-7.34719()-2.48004( )13.3906()-2.48004( )4.68659()-2.48004()2()2.50394(\n)2( )]TJ 301.02 0 Td [()3.52888()2.50394()-2.48004( )4.68659()3.112()-2.12689()2.59156()4.85918()3.52888( )-9.36255()2.50394()13.388()-8.47303( )4.68659()3.52888()-8.37213()13.388()2()-11.9302()13.388()3.112(\n)1.99678()2.00209()2.50659()351.56]TJ -301.02 -15.36 Td [()2.40237( )2.51257()13.3886()-7.7654(\n)2()2.40237( )4.68592()-7.34785( )2.51257()13.388()3.11067()-2.48004()2.59156()-2.12689()4.85918()3.52888(\n)2()-8.37213()3.52888()3.52888()2.40171(\n)-8.87531()-1.05415()13.388()3.11067(\n)2()-1.05548()4.01613(!)-4.28298(\n)2()-1.05548()2.50394()-2.12689()3.52888()-1.05415()-2.12689()3.112()2.40304( )13.388()-2.48004()-1.05415()3.52888()-1.05415()-2.48004()3.11466()4.85918()3.52888()-1.59848()-2.48004()2()]TJ 282.289 0 Td [()2.40304()2()3.52888()2.40304( )2.5119()13.388()3.112(\n)2()-8.47303( )4.68659()3.52888()-1.05415()-2.12689()3.112()2.40304( )13.388()-2.48004()-1.05415()3.52888()2(\n)-8.87664( )2.5119( )13.388()-8.47303()4.85918()3.52623()4.48744()-13.3561( )13.388()351.56]TJ -282.289 -15.36 Td [( )4.68592()-2.12622( )2.51257( )2.51257()13.3886()-1.05548()-7.34785( )13.3886()-2.4807()-2.12689()3.52888()-7.7654( )13.388()2.40173()2()-7.7654()2.5119()2.50394()3.52888()2.40171()2.50394()-6.01689()-7.34719()-5.56018()-2.12689()2.59156()3.11067()13.388()3.52888()4.48877(\n)-8.87531( )13.388()3.11067(\n)2()2.50394()2.40304()2.50394()-2.48004()3.52888()-8.37213()2.5119()2()-1.05415()2.5119()-7.76407(\n)2()2()2.50394()3.52888()4.4901()]TJ 272.203 0 Td [()2()-2.48004()2()2.40304()2.50394()13.388()-1.05415()-6.0169()]TJ ET Q Q endstream endobj 6 0 obj 34171 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 16 0 obj <> endobj 20 0 obj <>stream x]=n@F{N YֻdM4.EI.0 >H!=`}ל/i}'o0N/| Cݏe%[T[ߺ7L{/]ᵛ\8 T{ W<y -y b$#b"pOh;y Ry @)@{@=3y ۞@Y٨(hP\|nWBqEeEqE͊쩸FCqEMIQ\|7 +oߎ滳YqEm/-!> endobj 13 0 obj <> endobj 11 0 obj <> endobj 12 0 obj <> endobj 21 0 obj <>stream x];r0{N 935N"L b塰`0.räH3|ŷt~=i3:/L}~Smqۓoii[Z44{a@%e\Sbs6K P\q)T;Hc5CX>jG5YC.1Der f*356or;F1db ~d$PH6F djh(pl@@6 F8$"d2 re\A}egr8TN $HN}\~|F{טXWTyU)f endstream endobj 14 0 obj <> endobj 22 0 obj <>stream x]0 C:`(ٱ(quG&ݳJsͯùDyJ/?Is endstream endobj 7 0 obj <> endobj 10 0 obj <> endobj 17 0 obj <>stream x} |EwUG2If&I2I&$!!7!$$.(.*%貮g\UWQ﩮}}}2=駞~j !-ڎx4-ךѳ{%-c=ָ7y[I\/5BHv+qk_zsrо#$ kTnG]Z8zG;AFw{Q=Ak<2 2!4rbdh4nL͵P2IܧjF#Q#AsP|rWF#] Z'aV4 FsP'Bph1Z9Bi9[PzѧZ@+m%>Dkz6F mF[zf3(7mpgG;ŘD ].A`QՏ.C}]zi`]p݀~~q3mvrz]P)zE Q0,llpSVvrmncX'ڑ -i/>^a>uEtpjZj=ncQg~ 3NST.C( ݅{qӚ{@ߋ )=VQ~= ܹ(@1;0::v}b}l zy H$lPX{D'ѯLZS7EϡыPzA? wu[!OFq#`[\47\;onٳ:#ۦNmP_W[S]UYQ.+\2 b(+3#K&f^U L*925]+*{2I c*n9M%4s2 -2L[G[bdf*{jm YPB3U(rWGk-ԪJoUfPAAES+pj)Z]NB`8CAng;`BU.Q4]k#ocuVpE/~Z/(aV*kNv[rP-֝qv+ms!r /+4Ԭ]I~o[{S-΍䣌7ǸS1ŗ%mBdz{\eWE@ k?F(,rTHOӠ;.Bg#N0hqP'ua&!V{ܱL.d[ oR弥i*[AH}z98b0I]^SPȉ+KvQP\m`V{T/5@Z.n&@vrWn:&Q%{597pC!#$ھCpg}y>~A~7G0T )al8A${p ֖6puKUNZBĿ@)DxZ*Cx"SRwt FcJ'c0T M ZIZ_}7zjdj#VN\v}GqL<:Ϭff(ά ORhGT aM,CQ͉w(?!5c_|!7|Уթ᪑;8݃vb';8Llcb+[&&62qX:&2>&V1L,gb2qKXb&1L2|&bbsdbDLdb&34&ZD ShfF&gZ&jfJ&*(g"DLLfIL3QD!L31<&rabLb" &L3D*&LHaD2&LHb"&L3`΄ +&L02a`Bτ8&LhP3bBɄ 92&LHL Q&8ķL| &f+&ėL|L3Ǚ21'L|GL|L_ fOL8ĻLLěL=32 ce&~KL Ley&cY&ai&~SL#L'xL wJQ:N>4DzcJ)}@}JMBK?)G=.wh۔ޢ&7h?)z-f*Wh(L鷔^M^iڙ⢔DK@I)#sl1< +% %3%%#=@OJ8JZJRM[hҖZS(aJ(<"Nz]߂p5}u| 9w80>cAC[Kbן~m(& מz];s]h^[mE p(=]zv7%].rs= x9 ~YzTuHzDu08c>Q^y]7WoqQous}{VgpΝwq6зn}3u p=:k༫TS\WZ\Wvv]u!s]vB׎{GEDQo--[6mٳ-aL91iy {G.B %u{F$kk׬?_UkqZ̡fMduoZ=uՒIVsh5V ޷ڙT޼ZYYYgEde0%",,,,).+S8+2{ϬHGa{d&Q8=3=V5R8%2 #M{# u=ušH5\+bxLo hZcT1uv_}uVTvIEfnUNɯB]PEbc4=zGbGct;0# PUt ܾ̅5A %@lk2 65r o?5?T(.@Nm-̀Mkk}Uesz=n@``.000 hDmiVT@ ` h4uZ@ PTa@0P( |D@ YL@ HRdID@ 8v `Xf `z45@P9@$#P'| O/;3q>|}_'xM?~xU+^E <xS_~x0qc_<8< x s}{ী;wnp fM݀npZ5W\pp)ŀ?ac?ac?ac?ac?W `b!`b!`b!`b!`b!`b!`b!`bac?ac>ac>aoW_ys>eif4~i?J) ܕCnpx¸2peexC=,wA(/;B'2pyO P{7!<8N.7˼YĀ??77&qB]^~A)fVSʑ2_vrRmȕ&ZK3K|پD9/R<"7D5ѨPDҸ}S)9x٤9e)OT N" &<3t&Dm ѠIs"K#b}lxGNHJ(ѭQ5zp~55:'ʧ'{p*jܜ>ר5DJ 5^W#*++3B[!W?c;lgx{Ll{yd}.Ϥ8ץMH$ZG ɝ'لON:$\ēQji*<ЩwDZqF5_ftO+4.<6qȎCȃ8#fjh"Yf {_;2!gqEtTsG|\DIM[n+\:ƩZӲeƮނ=WnkU2n3;;Nwƙ2 T_MVe$GNv zbkxHzIWJ5r7ӄۋCAz;}lJ9a aO6+1+T*($o0E0xTwYp,p,p,p,p, !nedQ (0Oh 2o%'d;~IiRٰSiH@b DtXUfgB!U/.^k8xqXaᤔ ʮ'ӑ4TMTĺbVݦ 'd\NeFHp٤Uɡ\2 /&s fN"`z\2Ȃ ap.$-If57\f63)v%^/]~2Ӥ9uS}s\%%vߓOu~;')ݡV-Բ h2p_@3X'VĘfјfIba^C4!M(p*K8[!cP2R~kZb$ޖUZK >Z8S\v˨Ȉp%pqb~;0qXFE":1'+2o!ci_&liOtuZpA4Hg`$hy:;qgg'kFb1Γ[9Vݠ lLMN܇^aNIrhyE X"& ZU}󸤌ԓ`5gd/E(aUJ[nq9y> P CXBŢ>T,N1@  _<}7pFy8//<};úqr$񣬆oi%(C_5#E!F9E#O3𑉲Sq?wbbDp9}Xss 2}37ھ5-l0hrw@0vUV:lhd2fVYfay_MԉDoB9㽉Glei5mU``WP:yAWyŀ/|^,+vZF8tg#L^xdrYT=i >op蛊@HIt.ڊFg)ubq,yh '7XɿsUg&0:-0drXW:Zfݥ@~ j $MB' N%Ы3zGdczE%=`gA@"_19~b O>DcDN r6*m+esM Jm݄A,P6"8$p *dc I厒P &lhW8V( w( jHa:|}k/||$}|=d7\Tρgl S"]`[ ,B]eYDfgyd("Rt QDcDc"2yjE$.do.,mH5$S˵XL/;sQWܐ`&it=L͙aE|JyO喪2 rpMh}S(~|gpՎK:Z!Qz0/_ϛl2&'<223CUIP"-O":D18 Ǔ풫$a ~I%[G]q+8G umjrRgj!\1ne98K _0p%լl և4rx:ƪ{Wg]筟<4OYxW.'ޣu8+w:幙bp1r;vNkO>]/lxCUXRCa?[}d O̡h%ƵAzA Td;bu1$_3͖[, kqlOG)bԤ;ߛӹ}JAh+r崬sYl g{B(Jɛs~SZ ٵ!ۂBy 5.(uk)2Ƭ$o<;&L;<GS.yL3ٜEԎs8#3-R^]J{ x2t&&ѱMǛcٖ&VM"6 n= ;zyğz7drㅣII&13) 2))uUT԰7O- ݎɗO  _cYR'YX[PZYX4Ƣ"XvP$ E O?7, &Kt"挪ja%-fTf2c͚7]Y_QlmMujxΘ!߭/ +ՊPyꄪtL&A:zN &g%1y7I&)$#D8~@ +$U 鎔zfzGXDpWeԈ764CHl!;`! ei8Ո d`8iNS$`IbΕ$\IHRa\fՙjLlf~SowPJMot ^EDL^r%;}^q t.m_Rq-m[ZY~ƊW7o1(oގEyswu`2NV|%*KT,īW ] C;9Lׇg][wUxEY|M*qi55f'\aQXXYQ?\Z}rwBɇ3<s^zi邽k-1UNwk"Z뢰RɄ 4l, Y\6;Q2Wt\ѠWO$,o($+}V>l~6W>J2\fyZC]}(y5յ'sA~f)|4ȫc+ oR2f/.a $D'^{+'bNt*x:\:tĹ( yDx⮷4!1Yf2cdܽLPS,3Ì(QIIHxϷ&JœTp2@3**2I#C p腰&XҸqo\rS/LbY/0~+JI899Iv$1R YEӄ^Cz?W٫4Yo>6L5tVCZfS`NF0AF?BR},s*+aE)˒}ϯ2ܹ;dϬζ$2\,Q^ FZÁiYܝa<m08LɃPO[5fwKBRv*Ŀ";"/ uOUgut4?~<ط'/S~"Ja}/b endstream endobj 15 0 obj <> endobj 18 0 obj <>stream x{{|TսZk?d2df2yOBB^I&$$a< !I hD9[y(؞Vj=0&-VjګVZ.{ ޏ{gkZ0BȂv".))CEתu}y;l.z`_zu!_en8W#4VV [; <{`Z>o`U}ymgzRZoj~Z ߴY=WʃQZ`9/f.pǸ";B|#5џᾌ!0E' Hq݂8݂>J}FCiC(z=EiܷAwK8C{:w›ȇP<ڄvqċh]-kVtE'ѥ[-B1];~uv)꧵N6m6M6:ѿ_y -9? FAD2Rb\c[4Bɿ!ĭ$-RܝKgU(. RYIQ04}}ކhGwc?). ` x5H4cM\P(D\229ʥq/n)߷ĎVFwǹ>D38O[C5ٵ^Zhj=qIHѴM?{m۷'{+{zzذ w߾}F&w }G}8jcZ=q{2{u>%b{Vғn=tLۖ1 ;*ZqrYtyjxwRp.Ǡ +ylh|<0GzchcS O~t ǟzO,c?y'Ïc;Lj2s؆[w JÿYB xO3K).?b(D##~J|gFψLwDmڼiS2[k}q1ܰXىZkch[!ƁRss$\EDˊ3< #gbF-%b0evO0=<] n7I0*v;4* ,5*A#g4Eo X `F٨S QBz3d"BXV 7 oϔĜ1Toac?81H$B\R0z鞉 :v2@D 3VbG2kfA6; ThVL& ^UL5.CE ;ƘBw)!1؊ךgtD+T % L|?s6v≁+gۘN.#Mf U[/wAn0h4uM\?ba$A$ J }/P <`x;/& d 8aC0dALV0 3GvX#c ý!̸Zmր 2 tZ fRBdg}H:R t$Z.^HFu5u5N?Q}_ÓX%yRs#mڋØ*`pDbQlw8E]{nJS\lf"cZR@vO I[DlD `X!6Kp&3EwHX*"&1}#ƛuޜS9:v8\.g*p&I1"<`Z.`y0^x0~bbT!V#@ٸ!ӌ\:*TpلC ; `s6#fYVۤ $%"Io3ȶP DTX)qV7w)hcHNeYڭ"#SCP]I`q$21\4$h.t.t.GS-ambvLO -v(ÌyeTGͥeUCs'w?{jVW=JJx۪.^<+Tqi{o'~))]üɷ"Jq(*XL3 J.#+U _v |ov ZN T.-)y ݤ,.jՑޒ=ŻabϒYA×gPNE11 |ø=ʘsJDB1LQg JǰVl2[`1ImY;| u u%pPBv,p\cKm:o,h@j@eeU{x N%E*+Tw87;%] E'_fbru}<$}X\mLo&.~hs9gzߦUW\>WϾG5E5u &ݚ.bM!PM@*iag[q 7ܘ*[87e_ 8;Xwᬮ1)0BGӛ(pq!%@elebbb3۪Θ YWG3A`FΘ˜fy kfʒ\qZz*4/~/67ݻCy?-Z㝇|yQnqFȤϳRT-y=3cP0 7 L-rB#H2~7.p2nQM6DDGFM8jWhm2&.UrjfN%QfĨ3SͮB Ш|.gg'2~ $:WB?Lg[Q.*/LC;33liFw8$EPCcm|ѵތ73n.29ԡ8G&SRcZqz.Ϝ'l3A_;ӟ?roD!{e-&e-d{+<jlzy{pZں o:3 8- sïl# > *#*b0x@%p [lzʚO?&c9IaGL)U}Efs7=҆Obcc}-%nⲦN<*W^|י^wZ*5_Jg[}nq@8<+zpM5AAjM(a02h}+/ A5=P=?=~;~pp7:E%zG&2y֯ zrWFoJ݄ H: Xpq0Q9k_sO u-t8Pۃ7,W`ǝrQ[N~$%ETk&{K$G,KM|>jf.yXzSZeZqM `Ku&ZJnl6q@h'MG4J,i>ce +f:u!. |aPp N@ (8N'p -u5e21X5*p8SQU=LWn͟矝[UqW?48.^$|==_jJ}_ Э4 9LӣȮqBcUA贱΍LֹCȠfR&-&]U? L ЄldU,YVSke6֤ٶ`}[@`uOTճٳMܲ$]B9YvDY݄M36nmr꬙8sNc?uxI؎'[](\eHn'<+umO5Lt_TkS]Q`,*/~DŽ5xƳ] :gȝdCb\O،+ndR8ˌyn&b1mS7OdV9uԍ#U|HeSX&ߥV,PVWF"o"F@#iM^eV)_q7/e4-wL)ͿŐѳeʱu'tBB.T.TD㞇:3N~!Vj{}_j;z[7gRǝ3 oa> 5嗞/+c،p* yYRpE, -hA # rMB Iy dDrzZ)FIv8ӱ~uDAw"fx&!6! vatUDFL {$"7Uތ͌lZ%c=_zeؘ}\Vtxi=j5U=sɦHTÈףGgG(HVe_ã+lTfLLȩ̂A- "4, HTiD+J MbOOD&7fI2ꔨ1ŀM.1BMw_*2(nx,o3>>i75ohn=L-ToCoRҋˁ"]zK/3+KT(AI08ݣu-tv`uiIi‘^y|̳L_5`E2ˈ7Aڇ_)ߣHdDԅE ^')Ϊ)JU*MKL3.N:7 Y}Zik\AJvJAC!Bi82,>CtY)ƁbxX(`/{Y[{)5lnU @49t->cQ`6 Fauu;HEAvPv6) xJL*l\1`L>1`L>_.Li:ܜ[t]Jӓqh="]lbe}}.3IWf*z-KO}Tb^C=\D81f.5'v\ jzD)uNjo=*k9>j76]7޼;?RZZ9QI/ܕ0ǶtvvP_1NG]A E ]ZBj6b\%SD6OP4 z7ZapD W# 3uu4pu:Y#fp^*1j^#=wNSi@Z]4 N kNPr2N(0a!zX"dE0Y cκa=].%&1lG,uԄ6ؐxO$ũ {?|Wz+Gf$>Jۙ&0YYs|*I2 !+ZƎ]p[-,WB^ Syz)UWdՕ̪T`OQ+A|'?>Wqi1iFZtRrG `Q+`"C{Z^ZiU >C2K~۠+Dr$U!ý2_,0ڿ}n[*\}\|U)ȗpW~i~k[W}V{}ҒY3V^{^cfB1s'#aG(K͂O.͵ߟZZ3vd+ڟ![T@Afwv3KKl 键&RRMtȏ3h(DJO'~LfCX[ybrG9|ox!N&*mv÷&^8%p(fq QwFdsl}5hKVs7p'`fߓ;5?J/T>;I??[O!Xe;/Džk.Kvya1#ӳoZzFf:^s>W==ٟ}#PSCDusgSC;1-hYGiGªl[%-_激xJthr,te5jF 5vʹ 4uVԆhZ@5 ldCh)ZB#(-'9)΋Voٝ ɟrwVp /xԎ!lEi Gc{^=.n8^CC< h?FFk60ZQR!?| 2tz55z.ͥ׎c4f ^ # UBC}>=5o2 endstream endobj 8 0 obj <> endobj 19 0 obj <>stream x;kxוaY5,[fdDz0 l!K#1Dd<CxH IC#&$m_mlk}!l_6mv)IhM6bWy\3:{3 = ZһgS>ikix yֿ].uۺgU}zw :2!|}nKՅ%mI&{m1?LiCUp}(ݴqtھiMt.m Aà8g(NiG~ƾ=ɀVvc݇#pfAI>"+]&2ԐrGj8P_G*w*|a a0|g` 㽨|a,K:5d` a Zoؖq˲VM|ᇬq%1 lyW/;9VnxYwbh_a"h(#"I\c!燨6,u(#0wo|?F4m:=RV,_vkD|qWymsFZ³CM3g46LV?5P7?WuSeS.I%.YXȷ۬%l2r:TlGתE-I$GdARM7,`ݲU 5^֧=LJ ԐPukܬC7^ JQU)6|GUO5c7gE>uh5/DqhuSADSQWɢk%qhlSsB{$tƿ;%nGS*ɵT=TZ)upSS UP1a1^ HkǺjLTO {BE ut1H"tXJіd$p]Ugv,zܧdMu3L{k:!kg'IωiɱteQ+qcL6ix:Mo[T,$ȩ!))'JB`I4Z;cUI'f }?90q=~0;R+M5Ø!DUh[Z=!+pr>ቮY1Ff&xhpq!X#KR>c̶8Ӗl~s}N|_)l,*.BӐq%΋\DR>LeAR`L >U?)`TG\AQ__&4BJ (06`x IT2iW9 }6j KoiJt{Ky47yg[f"ܹRu*%#,%$+cgQdĒ8i/%f,*@eng fv]ru}jmN bčL뺪vba<3tV_vt}O:l3 <$C!r`qK?ג 'ʱ-~\KrK" .Y1Xwdyz4O8iҼoQg .5r/LPcCA:1&P9ip:+ F9L͔ߜ(_/1qsHt2nLqI0 # a=׭<"`5F<7Bs* Sބ3>!viS 8!3hec)z1X{dF"7GBM5tI\yzBD&ױDQs=ˀD8"VqDHzJ+cSoRBkkwKb Ouw\1d4窆38'ğ>H j3pmA5D+L6* ?i:Sކ{ fcj`I7"Gnƹrq*SMB51exûgx;p 1Lh^LKJ+Qz/Iu8\Kw]*aߵϖםWq?E 5=;TIْn^9rՄHA_[R[(:fZy T0Z ~kIX֦w4e˖!GQww|v )   lV !C"hB 'Y=mkie%c2<R*)>eWPU(~eS١t(J2W_IFi~@OP 0*Cs2@*@sspN%SM|T\iu#+yQmMTzE&Ȑ 䲔%Co;LrISU_Q4ʱ=K7yfָ+*] G<~qOs5or-!yr߉xK _%dvTTKv:}PٜԊO7 u#_OvףuS's P7}-h.;vOmk=k:%Gmmb 嫏nnz'/v¹75ʢr^rVE7laBƏ@)lXT0H(F]!dM/9gY|*©sLW뇇4quP˼Si,.4}?q4%i VlqeEc?SK<ݏy[ЧT?>E fHv^:d'$B s\ΑPE|_0 6P\\&tT:T/AV˗QjF+ˊӞ\ɍgLxNA!-nf<5NjK{~oKȮ=fnn-wl7w,럾8{ɇRm,FLR#> !jB[nYr,rx6@Q,6X$f(ͩh(mh(N@t6w/S'd4 X f1 ʈ rՌ!>sVI+\ .4:ez9ȿ?oeıj}MdorxҚ2-z {F'&!z\QwǬWN>/n\>*>p &acռĴKpUM9ldnuI.mhKS8ortp{bI{Q3^l}\#_\T|,BOy<"K5& nfie}:'cqMϛ68\ > :sl0y%h15-s]K Bk[AsgTV̻J=KFJ[Y]@Y%c9'S "/ ӽN$ܫ?9{kgoCB[ ":ܳ:T^Ut:nol7?<ϬHV,tz{zߩYcfkV?7|ZFxjFjXDoX+d\N =l6rӧ k@8?/}HLh 0ܟ;Asc1=p;ы' ?>Yxxj@JFsy\SmYG-:>1:ub'6^Jg6u0mPs,>zXRz^?rF?7ɺ,5Fz3S+Ϝ+ L4uP2ANlhEÏ_[40a ψql 1k GAЦR:0_yMOux:9 95F`d*F_nk#p" 'Ⱦ߂)hnK0C? 4#܏{h^P:7|CPOԧ]a ~t͑YbkǓ.={1'} l endstream endobj 23 0 obj <>stream GPL Ghostscript 9.07 () 2013-09-01T23:55:55+02:00 2013-09-01T23:55:55+02:00 PDFCreator Version 1.7.1 Document1Sebastien MALOT() endstream endobj 2 0 obj <>endobj xref 0 24 0000000000 65535 f 0000034458 00000 n 0000065158 00000 n 0000034399 00000 n 0000034257 00000 n 0000000015 00000 n 0000034236 00000 n 0000036466 00000 n 0000057731 00000 n 0000035021 00000 n 0000036659 00000 n 0000035357 00000 n 0000035422 00000 n 0000035294 00000 n 0000035901 00000 n 0000048716 00000 n 0000034523 00000 n 0000036860 00000 n 0000048933 00000 n 0000057932 00000 n 0000034606 00000 n 0000035489 00000 n 0000036179 00000 n 0000063520 00000 n trailer << /Size 24 /Root 1 0 R /Info 2 0 R /ID [] >> startxref 65598 %%EOF pdfparser-0.9.25/samples/Document1_pdfxchange.pdf000066400000000000000000000264531257674555500220210ustar00rootroot00000000000000%PDF-1.4 % 3 0 obj << /Producer (PDF-XChange 3.60.0128 \(Windows x64\)) /CreationDate (D:20130901215648+02'00') >> endobj 5 0 obj << /Type /FontDescriptor /FontName /Cambria-Bold /Flags 32 /FontBBox [-1110 -299 1373 1047] /MissingWidth 220 /StemH 82 /StemV 82 /ItalicAngle 0 /CapHeight 667 /XHeight 484 /Ascent 950 /Descent -222 /Leading 172 /MaxWidth 1380 /AvgWidth 600 >> endobj 6 0 obj << /Type /Font /Subtype /TrueType /BaseFont /Cambria-Bold /FirstChar 9 /LastChar 117 /Encoding /WinAnsiEncoding /FontDescriptor 5 0 R /Widths [ 220 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 705 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 469 0 531 0 0 0 314 0 0 308 890 604 569 0 0 0 0 365 597]>> endobj 7 0 obj << /Type /FontDescriptor /FontName /Calibri /Flags 32 /FontBBox [-503 -307 1240 964] /MissingWidth 226 /StemH 85 /StemV 85 /ItalicAngle 0 /CapHeight 638 /XHeight 470 /Ascent 952 /Descent -269 /Leading 221 /MaxWidth 1328 /AvgWidth 521 >> endobj 8 0 obj << /Type /Font /Subtype /TrueType /BaseFont /Calibri /FirstChar 32 /LastChar 118 /Encoding /WinAnsiEncoding /FontDescriptor 7 0 R /Widths [ 226 0 0 0 0 0 0 0 0 0 0 0 250 0 252 0 0 0 0 0 0 0 0 0 0 0 268 268 0 0 0 0 0 579 0 533 0 0 0 0 0 252 0 0 420 855 646 0 0 0 0 0 0 0 567 0 0 0 0 0 0 0 0 0 0 479 525 423 525 498 305 471 525 229 0 0 229 799 525 527 525 525 349 391 335 525 452]>> endobj 9 0 obj << /Type /FontDescriptor /FontName /ArialMT /Flags 32 /FontBBox [-665 -325 2000 1006] /MissingWidth 278 /StemH 78 /StemV 78 /ItalicAngle 0 /CapHeight 716 /XHeight 519 /Ascent 905 /Descent -212 /Leading 150 /MaxWidth 2000 /AvgWidth 441 >> endobj 10 0 obj << /Type /Font /Subtype /TrueType /BaseFont /ArialMT /FirstChar 32 /LastChar 118 /Encoding /WinAnsiEncoding /FontDescriptor 9 0 R /Widths [ 278 0 0 0 0 0 0 0 0 0 0 0 278 0 278 0 0 0 0 0 0 0 0 0 0 0 278 0 0 0 0 0 0 667 0 722 722 0 611 0 0 278 0 0 0 0 722 0 667 0 0 0 0 722 0 0 0 0 0 0 0 0 0 0 0 556 556 500 556 556 278 556 556 222 0 0 222 833 556 556 556 556 333 500 278 556 500]>> endobj 11 0 obj << /Type /FontDescriptor /FontName /TimesNewRomanPSMT /Flags 32 /FontBBox [-568 -307 2000 1007] /MissingWidth 250 /StemH 77 /StemV 77 /ItalicAngle 0 /CapHeight 662 /XHeight 447 /Ascent 891 /Descent -216 /Leading 150 /MaxWidth 2000 /AvgWidth 401 >> endobj 12 0 obj << /Type /Font /Subtype /TrueType /BaseFont /TimesNewRomanPSMT /FirstChar 32 /LastChar 118 /Encoding /WinAnsiEncoding /FontDescriptor 11 0 R /Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 250 0 250 0 0 0 0 0 0 0 0 0 0 0 278 0 0 0 0 0 0 722 0 667 722 0 0 0 0 333 0 0 0 889 722 0 556 0 0 556 611 0 0 0 0 0 0 0 0 0 0 0 0 444 500 444 500 444 333 500 500 278 0 0 278 778 500 500 500 500 333 389 278 500 500]>> endobj 13 0 obj << /Type /FontDescriptor /FontName /CourierNewPSMT /Flags 32 /FontBBox [-122 -680 623 1021] /MissingWidth 600 /StemH 79 /StemV 79 /ItalicAngle 0 /CapHeight 571 /XHeight 423 /Ascent 833 /Descent -300 /Leading 133 /MaxWidth 600 /AvgWidth 600 >> endobj 14 0 obj << /Type /Font /Subtype /TrueType /BaseFont /CourierNewPSMT /FirstChar 32 /LastChar 119 /Encoding /WinAnsiEncoding /FontDescriptor 13 0 R /Widths [ 600 0 0 0 0 0 0 0 0 0 0 0 600 0 600 0 0 0 0 0 0 0 0 0 0 0 600 0 0 0 0 0 0 0 0 600 600 0 0 0 0 600 0 0 0 0 600 0 600 0 0 0 0 0 600 0 0 0 0 0 0 0 0 0 0 600 600 600 600 600 600 600 600 600 600 0 600 600 600 600 600 600 600 600 600 600 600 600]>> endobj 15 0 obj << /Type /FontDescriptor /FontName /Verdana /Flags 32 /FontBBox [-560 -303 1447 1051] /MissingWidth 352 /StemH 85 /StemV 85 /ItalicAngle 0 /CapHeight 727 /XHeight 545 /Ascent 1005 /Descent -210 /Leading 215 /MaxWidth 1521 /AvgWidth 508 >> endobj 16 0 obj << /Type /Font /Subtype /TrueType /BaseFont /Verdana /FirstChar 32 /LastChar 118 /Encoding /WinAnsiEncoding /FontDescriptor 15 0 R /Widths [ 352 0 0 0 0 0 0 0 0 0 0 0 364 0 364 0 0 0 0 0 0 0 0 0 0 0 454 0 0 0 0 0 0 684 0 0 0 632 0 0 0 0 0 0 0 843 748 0 603 0 0 684 0 732 684 0 0 0 0 0 0 0 0 0 0 601 623 521 623 596 352 623 633 274 344 0 274 973 633 607 623 623 427 521 394 633 592]>> endobj 17 0 obj << /Type /Annot /Rect [0 768.048 73.871 841.919] /C [0 0 0] /Border [0 0 0] /Subtype /Link /A <> >> endobj 18 0 obj << /Type /Annot /Rect [521.328 768.048 595.2 841.919] /C [0 0 0] /Border [0 0 0] /Subtype /Link /A <> >> endobj 19 0 obj << /Type /FontDescriptor /FontName /Arial-BoldMT /Flags 32 /FontBBox [-628 -376 2000 1018] /MissingWidth 278 /StemH 78 /StemV 78 /ItalicAngle 0 /CapHeight 716 /XHeight 519 /Ascent 905 /Descent -212 /Leading 150 /MaxWidth 2000 /AvgWidth 479 >> endobj 20 0 obj << /Type /Font /Subtype /TrueType /BaseFont /Arial-BoldMT /FirstChar 32 /LastChar 121 /Encoding /WinAnsiEncoding /FontDescriptor 19 0 R /Widths [ 278 333 0 0 0 0 0 0 0 0 0 0 0 333 278 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 722 0 722 722 667 611 778 722 0 0 0 0 0 722 778 667 0 0 0 0 0 0 944 667 0 0 0 0 0 0 0 0 556 611 556 611 556 0 611 611 278 0 556 278 889 611 611 0 0 389 0 333 611 0 778 0 556]>> endobj 21 0 obj << /Type /XObject /Subtype /Form /Group <> /FormType 1 /BBox [0 0 73.871 73.871] /Matrix [1 0 0 1 0 0] /Resources<< /ProcSet[/PDF/Text] /Font << /F1 20 0 R >> >> /Filter [/FlateDecode] /Length 1357 >> stream xWK507@jJB#6@DE{鶳31{S{JE1{Sm~6&r.[՜7Cl&%K5kdiS6IݖLw'$4\1VuևnrV2]~K@\m;Z ] nSo!5nMG9X"A\G}PQvY?o̚F ݲ H<129S]mS"d sŐA\@hJ9J^_FxWg x(P<uţ "z*.ǺWTX鋂V<j !*hţ^* իks,\ ͳqţK?uC@NZ?}yţ@4;̣S{ъGOVE]( aQGu)xţk|+D&J#}sG@&Ozq:CG,\ia-x7)k]ʣb9fF90|x Q]eMa4{6/΍߯*uz_M"YfSd^B@čHuzs{s.gFx"9m?nqendstream endobj 22 0 obj << /Filter [/FlateDecode] /Length 3799 >> stream xڍZَ}z5G\%O{&py@j\\4s-JjwlH"Yu.엇(cE|}ֻ}-u3K|/Kx|p_SIhjcf[ÏxqN1E@9uxjc_c,xYw͢08[]E׻?a+Wt-nnB']1pvў1ze6\~[ŴrO>L.Fnʅ>YP!btsJ(z8O \UވC4y_KWOxvxuCE-R?WT)/Z:(|nnf^as7.ܻI“ƷԬܩ/UsFH6~[GQ&zHho*&49>KéJC%rl G7GMڙrgꫦY Nlо`0P Wx'NcgLEw7!_߭?s}0 }e?oDX4ęԷpt8V\2/rA cNra>x4`'}B'U`/wEp)c`pc?5bdFߜpsŒ<@jW.yCb7y6KYno`su { n*Hj& @& ;`a., Uqe!r+;>\v2,L=W$wEhqycum@(/6'|.v8=ԇPå5)J>|rMf&;v;:Đ9/yFHfĐZh6]ٹX' r4ڭw\~sSSpzPLiYII>w9QYB]<{b0Y3:Δ,^|ďbΜ01^cd͋iorb zl_6" , W%OȚOIWϰrTr/b CJv]_,k qR3T/K%j2]mGB> K;cH>Ym1P3j,MMLCS3 IvȢm6Yz8 zYΥQCiiϣW*4@(tcV` "03lZdX6bmr$ +,j%z ovY:*.2Ah}8}t'o 죨`$w|WU6cǑ8 " s!H#;6pQrCloȷy|_( iUJ}PbXw}F+ P{='Wak-VNjP.MH $ɱIB$$"Qugީt>.OY`.݈ogwvm5FF,8SBWcDrZ7I,=ه&w#. y +&Z:6 B9rT4 gqA@ z/t4~Z14i =G%\Bf4#w ;А#X[8)f~pE-cgNʩcLgU@꘏/Þ3y8Zd zwM2 uIsVCY:t/E~& [&=bA Ff"X^.8ƒQWeebByɍWgh|EY&4%td#nFe/6@ @թ9aku9M$jY>nvtY8JXrT{k\ob᭷6r  ;8 `ƾ**/,a^V Ge1W1''D*A*KHsrjUy9|eyoM3$i LS:Y'}?؎=-U9lЊh٨lTłծhc9-[W PЋFDUGz(@ÉG-`&\a+;Ö*˽sC~C˗j$[9l6$gI2Fu5ފ7">BjOW}g7zrFQB6 iY<ɇϵ󖱯jR&F]ae}U'7N5Cs>;c2;2#f8*w̩jfg[ƺ[td/mbi-͙qѱvk̶~h 0GB\-[wZ-,n,;8E [00FM,e*4r Wgߖt|{|m݂[Fvlf8{wLg='3VTa ubF=M>sE™ħCIg,0[6gQ;a0Ɋl֔|ע]ygz7n*?}o[k*+Dk[TԎavS4ZVhU3ꕌ5k!mT % ίa }dG49_I\c>ԣw8> z[蠯o[YIZ*ؑX4 oplTmJ\3Yll*K|ꍏHe.w/aE)bǚOp6)۪DL-< VZ 1.IH_V6#75"F'p]GN'D'p> AI.1J#Nzz¹)Q4zZDצH_h/zL/)o ԫtQO 2w4+ Y3I:{^e> /XObject << /WM0 21 0 R >> >> /Annots [17 0 R 18 0 R] /MediaBox [0 0 595.2 841.919] /Contents [22 0 R] >> endobj 1 0 obj << /Type /Pages /Count 1 /Kids [ 4 0 R ] >> endobj 2 0 obj << /Type /Catalog /Pages 1 0 R >> endobj xref 0 23 0000000000 65535 f 0000010841 00000 n 0000010900 00000 n 0000000015 00000 n 0000010582 00000 n 0000000126 00000 n 0000000385 00000 n 0000000787 00000 n 0000001039 00000 n 0000001435 00000 n 0000001688 00000 n 0000002085 00000 n 0000002349 00000 n 0000002759 00000 n 0000003018 00000 n 0000003425 00000 n 0000003680 00000 n 0000004080 00000 n 0000004243 00000 n 0000004411 00000 n 0000004670 00000 n 0000005083 00000 n 0000006708 00000 n trailer << /Size 23 /Info 3 0 R /Root 2 0 R /ID [<1DF768E1622FBE3F3A15F2096CD7B8C1><1DF768E1622FBE3F3A15F2096CD7B8C1>] >> startxref 10949 %%EOF pdfparser-0.9.25/samples/Document2_pdfcreator_nocompressed.pdf000066400000000000000000004074411257674555500246250ustar00rootroot00000000000000%PDF-1.4 %쏢 5 0 obj <> stream q 0.12 0 0 0.12 0 0 cm 0 g q 8.33333 0 0 8.33333 0 0 cm BT /R7 11.04 Tf 0.999402 0 0 1 483.36 628.64 Tm ()Tj ET Q q 3440 0 0 298 589 6129.67 cm /R9 Do Q q 3440 0 0 298 589 5831.67 cm /R10 Do Q q 3440 0 0 298 589 5533.67 cm /R11 Do Q q 3440 0 0 296 589 5237.67 cm /R12 Do Q Q endstream endobj 6 0 obj 276 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 13 0 obj <> endobj 12 0 obj <>stream AdobedC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY( p" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (}@ 4\֧{սBh#5]Jdsz8\=ZD6I L+ɾ7b#TljpF$Udj lkRisSzy!Vͼ߁mZz^yZtⵡ8\+#*qND u Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ HE:"ed0DS K+4¤N}f%SmFEI[,M)}OKI٢11|B9Ôe-4R u(4 M4i04 5˵d5\r+|Vmҹ*\[8w'y2xTR1QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEN5ni)kV@5 |3.Tf_\osQ]9acn㳊k543L**Gn*ZEdP3S5Vj644ɤ݋H|K(s+>,W}J%X8VXQ[EVQ^Y>$(qS@}(((((((((((((()Q@tȫ&Fh"Hm8$ "+!"+z59hDtyQ@NbUR7G LZ3IKZQE%6M`iiī*>3ʢFG|]4\+n|oьՅ5Z#V(R Z(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((() mh7Rڧ&.s29/^pKH !5cj 1HLګ$5]5UcTLij#T454YZ,+SV,+8d85܎+"*KhD)R(EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPQZ( Es:Őd$ /mR+Ԯ`!⸝z̩bzXܯ}N_-Jnr)()M4 Ji4ڑM:# iEDhuVrA]MWliҬdQ(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEV}6֔yb&{Qf'4&CMS}8rfBhnifHw\MZL&7_LTZXW1&: o[/n8VvB baiKH)h((((((((((((((((()RPl85 +"]#U rjF*B1Toby@i)ZCM4qRƆ|_xS >/+9%#{WSkW-נPմVEZhPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP_50H_m/\^^f5`rԊi }$6i¢N׺Վ!4њ@MjZjFX50yE!+WLcVXZz +ZoS9QZm( YOݵy11Eչu!^\8S)HMz 4Njae 4Cҥ5^ӣˊ95GȮLLMAjtz|xlWav:b(ZJZ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((() -!?Եy߈?׵z$Z^]C~ZPj5TV\/H WT,wEZ*J)-QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEk@Zb6QS]& zs!wR4ӻS3$4 YHCM=)iRC]+ӡ8{Sa+Գ7j٧^F0iB2h*Q@((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((4#SWƮap3;L¿r)sMWќ#34PHM6,HiM!Rq1P Jij7G5XɹEpRq]6hJ; mVP8+7, Zbu-Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ L3ORЕ> #;nbkw^25ss_K,MCsLjq1JM4ҚnjYhi4XְqXVN$kid,#CV}++Oll/*)+"(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((() -9C\wFuWlڭjJ;{p3T!٥4(h4Rh)HE!q].ukg95ˋ!d]9re hi{s[E|ܠԂ#fSR1RREPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPIKI@zV6uY&z%5Ӆ3*LJ15jY&V87MFƞƣ4HJcRi桲 5m"Z[a]Q(]n[G*]+Z⼃1VPTH: xQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE֪WoeȡhVY+cwc))V獙VdTf4f%3LRRf(H SZ105tŒ5]Qy1FmiځB50˚&[Fw8"V%ȣF6]ڝ@ӳPQEQEQEQEQEQEQEQEQEQEQEQEQEQEQER*І34vBnڔg;,5# sı5:8jϙO4iIw#fh&MC-}qLU.qZq\4n֖ܴ9ٶ~sswg\U-CU֠d*@)S)h ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( c  BCpřF'oZ ]XjΜCxr*7Xg{)aԴ3Lf )iAfPhԴZb#m29?WjOG(r sƦn;i~Z 2SxmYj䑖QwGT+;0٧YVl$U\.[t-K_=)٩%i٠ZZ( ( ( ( ( ( ( ( ))*S@$;B4S+5jt%Qg*&[RՌ՝wB9gQ՜gbsUɥ-QA+hddҖfERƕP kRpq\F.1lmqmY(k[ GfuN+Vvcxδ(XҬ⚋R@@QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQESZHhMXx*MhNڠWM(āXDQEz}ʧ-0$ pi#>5JxYPSRWG83IJ~isL.iӁKI3L.ix4vix4j:p4bb CQRhŨȸ֭F2枒ҰlRGyoZE#:[S֮[dןXSlmi"Ttⴭzq^%ZΨ!88 8;U㬊8VUi*P(REPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPLe) V2 eىⶊRG@.u W9wfѓ^umgJ=) SG-})?u"ﱏJ>0h?=t;WQAG=cG3ȫif[zSLJ]F0{SzVVzT]cҦ[?jv@IiSiGHJKlv;U.+@T:%.%8-< pдQ@)h ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( JZ(1AP1Fu-FVV4vRO1@LbJL=)jw=*鎏.(ڝqW|6P1|VR O{UhO Sm-G6(F1@ J--%PREQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQ@ EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP endstream endobj 11 0 obj <>stream AdobedC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY* p" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(EdZ{ӋwWVf;iSv"rE˝]#/ZZs^<-8j*_;33M!V62l!^6ҏJ>6PɤCGϥG WeNkCgҁf}(왟F i3K#Y|Q^řx4Z"XK.:Rx,X8.zR=/rj@5,qڕlzPq{=c41gJkb;T,o47F yTnM 5-Ug09T@҆IFi30VL< Rj7jۚ=DƵHL4M&h KM& ɭH2A^#c#zQ.[C8kk~TV`^Ix])YUF*P)iQE!Z#WMV{.G%5\p%xisAQH(I83M-KHMRZCLdl)٦TKBbxf'[ +\pkoLWgc1@DxFʊ҈A֟Q!E-Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%-%.U~m"8[ @:Uә V^}\>ө5&0ڢ&kfLe5M42%a]&+q]^ ^6] AHGJl ҇hy(QE*Jc@Wcgs[I|n1ODzgSM*טu KIE ("55+Tf 9Ȩb28SkjUjٶq[0`Y?"n}$J̼Z jE%-QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE!ejcPƼ\ƩlOQEsP5aR#jL櫹b2_[G9DR 5EGS@]XuydkئV#YVClB+Z>娅YZ1S:(()S gB$Cqڵ WxˑXt+Hp+krׇSu0qK^:RRES() 8RR@41@uזf:15qWx^.:GUFua g(` \: `Ԃ(((((((((((((((((]³.lV)3qN79å9+Q :}IH{1P1Лp{Tml=*9ʌg@߳JQl=(Y_ch=+kԿe,K[bg],R !qKqMN~ն-ǥ@01[N0JYJG(>:V}UќJM4 04ަhe4,b aiYǀ+HɹUG1:x-I@Q@4ө*.52rk-y.tݙ[4;ׁcZ`4Ѱ E&i(8mRS DFEJE12#Q=L¹"ݘԨuFkW>Y C{#6j&4j2kv cQ1rMK- Ա@X cҵmq^~'rmmӊص8ۧo1xu*91HX h(\1P1Q*e*ԀP-QEQEQEQEQEQEQEi@:yWR~5Ŋ)i-rpRZCL5>R#"&zkڥcQ75:i$Z4GY]%A\ޓEtvc҇hEVVDREPEPEPHih +5]+\ޱx+>Y|51!W) 4Z)iPSM1 cL m3ONqM66qt?+'I(淃8n5ѪšVև)5-4S((((((((((((((((((((((-%E* rݞ05 }+JSphdy~[Qk$'x858&yY.i)(uP(IKI@hh4 C5n9DlUYԦ ;uG5 W ^a&IàkEӑNjHVTHۊ\愴E-Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@!Pei b!HR&Ӽm.(.>(A%MP[)6Tأ6TE&)q@IHE3oV6 kG"{q!JxxyrPiQ p5B$Ffi `cA4jX 50e! Қie &ރMjn3Fr4|;q:i*BAүE\&)էPEQERZi J=kנ&5km$ⱨ_V9<ғL1W9LPii!h4f!MҚ*ddP )S;&tZL5۾@"]+ܢ)rNFDiN)iiQEQEQEQEQEQEQEQEQEQEQEQEQEQEQERR@ =+O'8S\5D:p9)sPԓj1ҹ†CN5eiL&ƚiL&LaqL kFd*䒳> >zwKnisRt ;4Z\JzS)s@ Hih4H 8H!)qO0%}+ ,q\]c()Fym&*fܣF皳qM8TsS-EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPMC2nR*zk uOܩYHSԭđ+lLr:4b\h;4:J(ԔQ@ E-%&(qHx B(-7iW\JLn9,eiZsg(**5s}uO+efw'rxԠԌ}QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEbqh][5kG"{55AGyqi©) M0ӚT4M8M&1iM%AAL=iƙ54 4ixW_`>Q_?{Pt+zr:Z( ( JZJcr sվcj<--->CRZ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (!MrZg5]!/Z k*E|{Rƌ4ƥcL'4ƓL&6ƓQ)8c&4m)d* mgmf)\ulkYG+jUXiµc:L(ih ( (qj1_@9U3i(rqYc|=<<83M5t)Ԙ3C u!1IM"!4S͕S1f>I\扱e'+N&+Y1Z6@.hxVv4jqVH))h((((((((((((((( S<*u1.CRrj*Y ҚcT⫿ZsZEd8Ԓ&"CY#+AJJ|c-]XxsHԴl]$Vx,mۯxrKVTQXQ@IK@Q@Q@Q@Q@ MaO4]5F]NEj3@^$-sV-B*V*$ ( ( ( ( QjZiWZ'LŔ2kxKoFaMQ*5jpZjuQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE)Ԕ k,++"^ۉWN|2WG\c5V;0(H5**8ًE&hl@%KM-Q@Q@Q@h4XqN"miXk '(ZRk#KhvNgF:Jij5jx4))h((((((((((((((((((((((((Jտ՚=+V=TZj L~WQqiEU) :mL44O4IJSIP04|Mz}]~ErotW3ս^QCRuSV@ EPEPIKE43.P"8nv%_-ȯGԭN+!)){}neʙȤiO=aAO4.;4 h4 u4ќPiJkSȦ`ĤRSl44#:GoϘlٮ7J5>P鋺>^>I3I LaMQ- ( ( ( ( ( ( ( ( ( ( ( ( ( ( AKHx :c5os]v.\M:M85dtke)5PQN&HLkSiibdm̧.UsGO$q]-8f`+~>QV4* \ATdJPEQEQE: 7QSX7KtT-$6447>Yå-!xyhzu@8uF <5+Rf4iӍ!@F›c wWZ)lDWEcp9{ J14ڬ0H, Zb}QEQEQEQEQEQEQEQEQEQEQEQEQEQEQE1xz֌nۓ\87"m)M5'!58)YjuR]ڤ;DQH3(++V«֕\y}xҴV+U퓁WZ9 Tš~(ii)h((((( 4}%Bɚ4 |c.h0jLh>O3 t+Ocj*uJ r:Z( ( (u! CZv3Yz3LtmB-4JHE/j eϨ58\u4h-8m&hǑNG4\RM`i)i 11)xHE H+wi]`Mi [C᮹D -~6Q!((((((((((((((;TH3CWv9n3\n0f#57ޮY;ptb)ɨ$wM4ҵFMQcZM8# 0&Md*ӡUHK8b%/C8hR.jBhyd.* E8RREPEPEPIKE1F0Tց.A5u`Z3Bjի{2qY.0>GB2 &i\EҊ`4`:fiiXR))SO4J`0Jy*i椄4HN oB$2hVV ּOWjq((((((((((((((XPk5vȑf5]Q߆Q )^A܆BsUWrbf3fs(l)lVSuaV'\HU82Emǀ+Jnj*/kVPS-QEQEQEQEQEQEQE%QSSH =B&hk sgϧ5Դ@^k`IUYt]ҫ={V(ɧڡk'BҺ2hd<0M6;WVxΜ=+eiȅ) ;ځa ^0REVٰjUj_ =NEiV@Rv(Ĭ)yS(4Lc145sOjl91ɭB !2⳩.X\U٣iC[tǐ+rb^B ȷoGң8q(z-J)TRREPEPEPEPEPEPEPEPEPEPEPSM8MdOҸ;_IWu+s|H`KH)خSM.h0E1qLjE"3QHxߚhL5# QІO`ɩ X*:'- ++;>B*V*$ ( ( ( ( JZ(87kDr.Wvgjֻ\V WsZdn!i+3UbN;uA^ËRu y4S3p4 wJ3C@QHi{PhEi޴bhk9.9N &9[1H9VTW[ 5m6]MlE&鋺>nppyM;5H4KIE-Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@!Pl+>IⴘT2&/gtwXb@yԫb#Tu;C+by+8͢ CIFhSA .i4((CKEWF&:NApSVcNqauznMx+;)U@j2YV<' -Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@zV.JվhdOcԿ:V5_MOG(Zu4 0FƩ aSIRPHiM%K(AM=i~j[ 5ϼ+;L»?_uچT!:өN(((j p5`c 5=H\Db6:5=HH=l"07faRsN1٥KqԠs@4 ~i3IEQKFh(CSQ* U8lg8s+3nw(ɭ5i{ Yc>D%t|*3]FaZ%iQEQEQEQEQEQEQEQEQEQEQEQEQE8\mCk\H r:r3YvGV< HyMN955}<#d14VQMƣFN*d!4A41lm>$,˜-Z6♅j.X[+T8xpjNR,AC qVi=EJ))QEQEQEQEQETl*JB(:-k"kuVEr⨪M-+FPdԀ j@kh&uE56LcE14HC 0C) 'j2ªr t[+N ݀p+ebB !ijF=E:REPEPEPEPEPEPEPEPEPEPEPEPSM:h'WR~5jOҸ;渱[V;C?4)kJzQ dmM4榞^593X6^"n*ѴHȩ X)X*Ѫ:'- ++;>B*V*$ ( ( ( ( ( iR}3q:G'21X:u8ӅlR{lcT\FJKisA}4fiAc-74QE )1KE!9b/X4L9OWP3\/NaxѰɫyOA3VC %5Кg:r/ Z LRfZ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (E>Y?xbu*͸t+J*H˻S*cN !1⾇ Uď4R +Ԣ@4niAf4)vii@((QE ȫwmj'JMYv;}7R &YF yDÚO8ׅ8;)־@k>HכXV@ EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPV.ڬ]_җL8MExj+GQ_p#Ζ-(ւiI4ƨڤ5U LӍ2 %)5, 0֓T3_M» ?ϼ+T6(juhNjӨh((()d\XzIoEO5t8kZY5k+h\Vga1 qez)3ZGhRQ@(34f\}ABIK@!q]Fv0k+uRѝڷ*b߬sZqאΤ-KP1RfZ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ukjuokJZșp5Z5_MKG-Ţ*,4iLj`Fj6FM14qL 4ӉPR3_L»?ϼ+T6(*uhNjӨh((((B)*Jk sn$}<HٲDF)I]Nr.2h5jiF$ 匣;V>U#Fj0ݩԎSS@ J 74I:;ց(@ Œ5iBE6JNyoիHҍ]7..̸P+T!RREPEPEPEPEPEPEPEPEPEp&,5$3W5kpk2汜 W95[46=ULcJd!Riiɍ'4KjH.*e$ؐ\+L`+>mn8O#rvC-Vż;qQ[CqZ1GVp*-52p-QEQEQEQEQEQEQE%4}%Wr+2 lyc )4Ɲ99**ۼ@c*Mx7+OF{sK֣n (n+ϱ>5p9<xj56Pi٨CSa4 @:M(4^6UGts*ѵ Wcj‚}0_IJɜO#T֤K@ EPEPEPEPEPEPEPEPEPE yvYe +.9LV"4mJ"q5Lҳd 79]!ʬ بNvآ(튁횁+x6CPOfVC]9⧂8G#b:"[xwlZہ*+X1+V֚#nC1WcZdIVhTT)PEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQETs5%G7B?\*&5ki~yw"H-w8m(wQM4biLO44 O?(T6(*uhNjӨh(((())hQSSXPEOjqBH{f)QΜy4m5[,ooqZF'Ĺh cַ8(8V1Di- *@((((((((((4%4niABҊLH@q@+)֥ёYBAⳝ8Y6;T0؆_כrўi#&:a_+:vT؆Xk̝9Sѝ1iADPQ%ԠEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEdj5X5/q:˚h?|Q5yqX 0IM i4M5-i4IPIQR0N 3 +O+ӹA^/:)mҮQGҸI֝MZu-Q@Q@Q@Q@Q@Q@!Pșgwfu7:f]ZM\ҝGOTyճ#*J 79!khjص%inP'48eFj7Pz5FFM2f5߽@GֲaRöjw^n Q4Lcxỗz$K曚^sݝQ84 S VT,gF6lTM-k7ݖnhbZ^3{q :!(+b{U{^WJiuJdd+{^TcUnbE;{UJrJqR@1E-QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQERRPMRHi2Zb@}ZznxR\Nއ^/!۹Q3S (94ئ3TeZ$l=ZJ(0Q@)CRRP(zPԬKAwUpyH-$wD֪yL idiE\R-bӗSuk05$q-DՐ5birj$dV텒 oNk黈kU(1Gm8r+8S8U(((4PFSR@ۇÿ]K-VCWd8 +,s^ V.6=L>2HAAlիRTTRzZnZ 4*m-rMf8E<vj<ܓ4{s!ܓu;4でQfXdj<wQ4X.KiY?5ozV6ҴQ<הcЊڮEmj8qڨ ;UHS*P*UZpZpNREPEPEPEPEPEPEPEPEPEPEPEPEPEPIKE7Z!dW{U)qhxj5 lRq U` j\DXK=MŀƔ9|ÎPn}|M2}9Q)sIFVc.Bzaz|)jiz QbDUs)&)KaJJ% b,i5O)=NybZ1VN08jb%"PڮkWju+-eHmPcXHqڬ,tGRQ@ x Z((((((((((((((((()(h4Sw 7--Fe_ZC:j5\ Lk騶+4⨽H;ժRbEۈЊ{A ViTRD#" tD#Pt=@)bEe澂ܣ%f!93[uњu.iP!AS)AsM--%)iTZVWMfrj'MMY6Nԃ Ȧ 85vwk50kaNgRRT]F YV<&QNEPEPEPEPEPERSd5JFfQaUرXZ#Ns'+Ni7ujP`̰9&$DWF_5EG>Iҷ~F>s[ٞeQ{ о}}kz~ /rR6NA}=hRzڹL:7{dvqIEp?fZm&ϩqlAzf괚\^PItǽtGuͬ5g\jsV zahCf1USKVDݒ,y6 4i4XRi 4ij`&4ܚ$e 3R,D{T$2,fV=fu[ج_%j֊VRڹإM"ݳҭGlH[`R=+ynQV["OJҷVLTT`3,tq !_vvܢxWVTqN@(((((((((LRbEFQ2fM+@d#SհVh@x`x,gv VԚQ>p+:kSK0{UIt#KT8SlõFںٴTLSΪxns{M"NWWЃҥtg`WZ܅UZґbnoJ l;R6 naҗczP54nu0UI@{D?u&wqқ7J4XS l@N(5kJncSҬ [KcJC*NYXV̓ҶbieTq7*V9Zij+`;U%cS3#jh v)mV vIH!HUJV-QKEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQE%R@L+LPgV[`{V´\ 9^<@[ړI6]H=*WK%ZJxx5 V~]+Mbܢ )lTg W3IRb,5 R+ q5hrMYr3Nh.MCAt4RatL}W)n(l\&(Ui<ÚIs-wRn&re*D\Ry¡e&"lT0 bIQj!$r*Dj 10%cS$Z if;LvQz)jOjiGn=*[JEB+_j;U cjcJO @ TӱJ7)h(((((((((((((()(hj{4ASg9Fets=j=#H⠓PA޸ԛ֢mAz8ouoP>=kzܱ]1vuOUk!lWoUwՈd&g5t'F{vԜ5Q.f]mA֓GZi3Uwen by&4Ka4Lpњfh?44~iySJ)}-4\!٠ )4mQLx5faW4R촭O8 kq"k5iZ@ׅhtg^R)N$V,NQEQEQEQEQEjILE142zUGմQGs {Sڶ#Ґ=).a}ڏVߐ=(6Ґ\//}oҏJ.}>}+wҏJ3H-1ڷ>=(8aOj>[g}zP1;R5n}ڏJs ҔZVهg#}ڶ=(81>G}oҏJ/ڶ=(Ҙ\ʎڭmuaX^8qڧTb@ UH;m(KEQEQEQEQEQERR@ M"I@fx[52 ڳ4 ]%BfM>LRBf4m>ڀBуI@s!sFh P=d;)Pf@jf==Rc%=h=1JLJfp{REI#:^;SNҺֵj=)r"AzR3ںl=)>=(E,MDrgJjGjJ9P}f ;ڜ4j=(r{yqڥ[jŨ QQF zXK0;Vз8[Jv-j̅j-=T@jpځjjmǥ\PUzTY J!X@&P(iSE PEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPb(2ҵ-!\ Dڮbg5zVJk'aBY[!LhGsg>е=zT{8gPE)6Tأ6T6T6T6T6T6T6T6T6T6TJpZ~(4-8 )h(((((((((-Ҵµ-! j)6@֣ҵ P,j{UI,] EzP/.I4 v n=*&S[HΓaQQ:V{W[AM6ԹP3#7,udLkLv&rK8H4JԦzQʃ9Qڜ4;WTҗҎTg2v;T{WD2ڏJvD{INCҶzS!̘YKAZB;PzJvkJ*#ҦXR*@)ؠOREPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPIKE!S(2GiIj%#i2P ϸA]SD @AcK?-fOxhj-մk$8&p2XU^݇j'Ӂ&vCћrKҚtiTӉ]4Cшy鱗 Z]>3R[ғ#h63LpE҃Q4$dfbMԹA,IisNњfh f5h YNbLњuXuhɢb\њqhXu!j`ɥ M.du/}){T:Cd{S}*Dcڡ F Tbqұ2 hRͦDǵk-Ja,z[3B})fcڷEL^ՋDzZY+m,}YW5Ldˍ4=V vԳ*{V9u-A#l}V>ձX[aYݕdc-XK/j[qR v-m1ڧKQZ"OX`(-Lc\pJTS@*P)q@l▀((((((((((((((((Z(RbEFVmHE&("]M1@ud& O(Uh((WXcj@y[Dpk M΢qŻԎN fKtHXץK rʳeɯYZz[i1I1uI"jaj ysML&abMӓNHvXr[YKR{U쏥rT;Ɠfvi=],}Y{W,ƊJZڶ˞f;/j6lQF JCҷ"VN]KPH=Et+gR-}Gʎ},=Q`=+|ZJ_{P0Fﰃڷŧ;.LvG?@ǥtbzR}g.fG8pNzWRm*6Lt y6*Xg\ i# r*ţFNJAhN2i PiZ~iE0p4<QL u0SZ)3K@E!40ȫ'#LAMY;_ Rd .]t$A|.-6;OH2VP!--4ZZ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (Z(QEFVV"B6(+@t!V6 HG[+I*y#ҐjLCԾH{h@ޕ6ji:V_9Vaځn]?p'!U31>bа\S O)h!{'$8=+p:h=Wbs1ǵHmvi{S=y{sKﳷtcO`yށNoGٛҺU1җ؜ڱJlϥt tx]lO'tO*cC5IذOK ,g9aRa]ڳugܮT` ?ڥKvm}zT9Ɏ~*YVڏJx;[?j-kp;SjҞլ!Gg% =m vYchiz;_j^Sf qUN+_jҰzf%XK_jKqR@H *U劤S*j*G] Fe(Jm.(0P6҅b1N( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( IBkP@5:nnșIEX7Ly癤'(PG 90f-L8,+VہybMNxm*\ڴiIqEHmW"[cZ;VEbjJqR,t ŊGS @b)bbE4 ZZ()h ( ( JZ("I@%0Tlyb++xWWNT011⩂kԴ W3u`{lZ9gN}(`T҃^E6`8S!ԔQb ( 4 CH+f[:" krm>R ˍkԔetuҕ֧Ef)p<ܰ -5iQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQERR@&)h!(Z(O(i6ԔP{hRQ@mIEGm>#KE3miPvъuRKK@ 1KE&(-Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@E,=+2jݑCQ@5OpdcX'q׷Rm@iJ)DP=k!=Uvɩd[E6jSQƮ[@Ik^ 䕑N CmӊյCoVW)9=NI ㊻8I[JC#(ZPbN 1E-%-PEPEPEPEPEPEPEPEPRNQf=)3-i];;6*]К p+-TQ[7+Wg%H$U:f"u4S)RZiI@ AXWMdGZ m4sZnm**MYvpVuimM>stream AdobedC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY* p" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?(emCZ2-sڼڄywHj84k##n;ҖiBliv #sP==TkSFƍij^2p+2⺝9Q^.>}(ֵLZJl:VC΂ j%(( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( )dUEƓdŀdUYse~[85$tJFZ̸:T,OZd-ֱVJ -Yv['Vkn&gҊ4*(Pu*RoɤɧasEL+%Ղ;uLG+k䛨Q aœBXM,ۨp jh\NSLV$44U

^At^I}s"MG>4h]@j5N )٢h~h34\,?4MӸ>4 4 @"!M>iGfOrsb$⳺Rk2PzJf˚=e,㚽Z8ٜѤ5Q%z[5ݾĜZ5<u(((((((((((((((()(i)"z-ҨM&S`cjaZϛWNFNQ-z&ss ]=kS WuRjڞzÑ֙k8(7YZ]Ijs +uF)lg_ksޔ\1Uw 7f 嫊4\iVzV"V10+ɭJZ#Ֆ,acU(u:Wެ+3P)KDVAR"AJW8tQtz֝TƱOJMO QVhE0qָ{Fݞ5jwj}+mmr:Sŧ=)?m7,ϥ)> Oj>G*k33]'=6SkSUkOj%{T:gM[Ve*lh+MhY{S9L#R2ؘ58=@ "`ӳP+SPKD&)QE#TG550"HsжY03YS1E)ӌՙj![\+\gZZЩ蝚jEjȴWI7t常9S!RREPEPEPEPEPEPEPEPEPEPEPEPEPEPEIUf*'R0We(LU%$Ls^]|czD+nHҒ*$ !6srR 4di ͊F`* Z%2SQUqU50B\rNzgR,jDF5Ri{ 4 mKkJ1v{kz}-v5k/PA$qSֿ1ژ֞>›F^唊l'#e<ƼBcS$"*k_Į4՞ELח:2RLZ_4k+aӁ;4ɰ)SQE%)x4m=\e% Ynzմce)RR wJ)lm$.)s޽UcV7GˀӁVI$(h((((((((((((())zIU暋{ U^\^y85qvj'Y#jUN eɪgyLMWsֽJxX%*eVj-zIKޘ[}_-δyf4VQS6_-{HwV;̥Q4HN,ZUcUlU1Rrl=(jWqlSm@585MJM&a4 VIi*44lj&M Z45YMHii“M&i1G2u&i44]MӂSGnjW Pl#,jV-zqZ[cy{=88mF:W){x`Ê8qڬƘR@Zu (()O5ejp_w\=\8'N:Q<8m;6TQ`FN*'jHbj&FiO`[-ΫHK~#- ǩЊ%U%2- ((((((((() i\ŽS)$kNA[ČYn櫷5)cסuc5cޕ5da帨5#٪2FMRdΤi<sSy=HӹR%Mԋ5}-}vժcΞ.rzbS=m-}AkWʌ]yf}(6gҷڝ_j|k#!l}+kOjT#Es/ /j=՛uRN;"5i\Y㠪)Y84zq@ њj: REhxlRfh$'sKJkS(hYZSLX3z+q4ƥjhɨ$5+UwZEQ5HzTMV44L&N*3RR ˊSN|⳩+D7WIj1ׁ] 6wcJ\AUU$QOQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQERQP(AրJEf]^Cw}kyF<3m>Y..T$搱sӦ*&~hsPT1jf+-LcEXɫ[04DI){TWjTJoBvj;lZUȭT{akkW:@0mcP5A!)hgmhHaomhzTMoZE)(%A*#ҷbxAX+*{B 9mڨOfY9&rij6vF)i &,Ifmje2{֔J{j$\cQrOb@XcI^G%JfVǥ[ק~+AG#nm}ZUڬ,>b)GmJmǥ]XH#EzTVBSo$P"[h@B䊷L=)njef=Z{Vя4z[R;UfI$ڌtJ3Vhq1MjrfH9 RlF XhˠњT^[MKR`isQN ٥Zbi4(M)o"IPHzVkʓЙSF795q"b}u<ꔜ j>jej1&N(((((((((((k0Q@ N* V <N@5*3EFR f'M;9j6zׯG jqN9cɨLsTmMf6J 8)5:[XU™i :Um}v$GLh.RZKkJՎam=XSHY=*QeJ[P;SŨ=5V]G8lMk#}zSMyN J%/jZzUI+x㦴!LLKJϸ)+ӣg4Q NLu`zSAB2RZbrWO CB,ḩqj7Uuj~P%4`j k3LfƚFn,} j[|W^Ui# 2FOc'n#Lҹ~3OdwGҏJ=(җ؏a>zQ!GVG=*6cҵx}Ԕ-E"6Wہڬ@Ve[H*E @T@8 1K@Q@Q@Q@1Ơ [QqVTk\k:Q@Erp4Q@a4&5+TL3TbD T1Q5Z7t_0t'nh:#- ++;>B*V*$ ( ( ( ( ( ( ( ( ((I7Wa36 #5wr\sC&-˒BFrzIiIإIAxv:c]"3fsAC֜85as5dFsV=h+B _jR<T*mroj\f8퇥X[qV,TUX=Q!)()DBmV!zUm -C%GJ+M)@Y稪W#Z jMQ'5YudA@ii jm:h) jgCO4AeK5k-vqi XxEQ]F`X^P3[>@|ˀӪjM2GEQEQEQE^I#VJԥq9MU) Ҭ6 V^ՠK(XL&yktS9 &jySy{nzV\2B '7,e)5qm՟$; yXk'em5*x+޵'٩:@ii(bM4Ji*YH;*i*ӗ2y| 9FykUYyi83QZ#FjZ`4Z( ( ( ( ( ( ( ( ( (e I Ae^_ sܳ滰g-YREY911zdNإk(wBC98R MKe:rkFqⱼNTo"=6bۧ ;W9nQKbVn;oj#Ҭ,^);UڬU X@=);Uh=(GZF`DҴvJT+:O+1x}Zjg-2xB0Xp+ aR{CNYlx^*jZ5GQZ _u85+5.u8V٤&44X&i*"\aU 0"MMYgc2ȢR0Gi65ެkXgM]jhAOJ|DVW\CNJ* qOX@VDtJ v(iR1E-QEQEQEQEi@Z\=]Ư s's )kŠ 4 8MD #TbB5TPZ7N~SV5GW}]%A\ޓEtwGcӇhEVVDREPEPEPEPEPEPEPEmpnƒIyu<%沜vPù;nn ScRrik FCj4 5XKE\*Ũ+ =)C8H-WJI?9;8OULS$#1NTBiiqNNPbR@ &)ʹJک\Z"@^+]Ÿ`xK!V30xNV{8.b(暝+C)enh74fRM0Ӎ1,B)*xfySN(]mБG54 !+3ᕹ#Յj˵:<29TJj@hh((k}\.E!šu95ՄcY&͹0Ri}+#M" ֚zU "jG5i!ifx~ W->M_L\[ qұt+vtr/D*Hci)h((((((((((((((((((((((((((((((((((((((((((((((('U < \I)氯n f,k=L60f,i:QҚMbz)PR195 Vjf7S2IPGnq AȭX!8[A⵭q]1GT8(:UJVRQ@8 \Q@-PEPEPEPEPEPEPHE-^*b)P) a8OaRqRZ2qwGژT鮿TI[J9⹥ EũFiA8flLji S@SM&iiFh-!$l9J݀Mr'ivaqT]^T(*9iE܍sAٗ⫣Ti>JZ((((((((( F8ViDHpqڝ;Aܱ襯"Ss՝iX)N&Mg&RBSN'4H꼏NfKڴyXr|' H]NߧXz*O6G&8h I X*I]"GYD"Tq@ U-REQEQEQEQEQEQER@ 5"+<`ϹZTRFP/4%[5N+jx(cpj'vF9M<5WVɁ M<Bhq4IE2GmPM4iAHiiƚX*Ԇ´7M QRVf\25o6Wq u<RUcjMvTӨ(((((((dhMa d\cwa_Vsթmgc@”IZ*n C#ӥ8լP;,Ԭy ejԵ8?VGEwwd8Kkl-mqZBWۓ;@UԊ(% #HuJr< hZv)qK@ Q@ 1KE!Q@+RQ隭-aȫijppHٴ,xK AȬ WN) W^]SZȧVm ,x]+SWG VВsKZ;4sE0iP 4) iq12TZzuFYbYT2=N(浣|ןiF,.9Aӑ #aNjUV6 kВP)h((((((( 4ө2uFk]֯ s(q;RA\R514ҚCҀ"jNDfj:"FiƧAU#DuG[?tWIoWtv=8|&Ui*Ui)H)i-QEQEQEQEQEQEQI@ ϻ py ˒s\fs].Je9@s\ؚ KYֳ@j5s:Uu5 purx57*QIK@Q@Q@Q@Q@Q@Q@ M4M45]5p_qbw<Ć/Ju4S0ө 6iM!"jR5Ǩ LNj&F#jt55GY]%A\ޓEtvcӇhEVVDREPEPEPEPEPEPT3JFڵ{sSV@5XԳIDrIݞjqMcJzTNjM5NvDnjj|'UiZkXM9.T[| m8 #JQ@REPEPEPEPEPEPEPIKE&)*Ji^X 5{n ++Rr*$Oi UG!zhriM#A 444fTCbM&bN)N,[ɶ@s]fuk݊.Hp3Uf,܃҈ϗVQ!( (2G\fs]fv=lc.qWzخ Za@bqA9SQ5R&J 4O4HL785+3m4r+S,8aX}lھqvUaEA֐RREPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEP1ːFjܻ;yrY5dt9 K櫁K4W+`UPN*2i$5ڪ,9oFP;ScTƓ3Ujն8'Y%^8-*]+Z]4IZEF:ru ( ( ( ( ( ( ( ( ( ( ( (ED51@t'c^qd5k=HpUePp)‰(iE!RL(E)M8sL|piSVgW_g5[Ayŕ5wkxHfWGHMSa'@Q@Q@Q@Q@Q@Q@2F)\gR\QWdɓU44Tgl#`ıM+S H WGlUYZ$1ۊp 0QH4(41i=ii8 1!V^ef\^#g&GAU5o.@{ZQ)(((((SL MaW[r3ZS;2*(7Y$Xw6jYǚ׷F"<˙ژn3V f5HHմPjslkU% q{Ey:浜}+j8F>k@+Gab$hbZp Z((((((())Ԕ\Ff%C[DT2`sM>Wt _C̵3 ;uY @2,uR6yaii(!ii)GZ\RSRLCi E52k 8GkгGU:jMPMUjʚuF@ EPEPEPEPEPEPSM:h+WTk^k.ךyX S-"urp\R@L&i() jRj'F"5uMBkDoN`:#~讒ߠoIK~c4"IUbILAKH)h(((((' SsSs]9\%sQI]ZZ)Gp3T5H櫹kFUj@惢(ޚsSd-FXVG.&|4m#V]+>,-Զ>fNfƸaZ#TE: ( ( ( ( ( ( ( ( ( JZ(&5lAux5ɮY&''zHCҘMRiM4nb\AU134CLŠ@h&\ X9Qcnw3]/+Wl>n9'cV3SĒREP?6%qU\溟\I!\pK<B(LjqLzmQ5Hj6E8Re 9(NV_zҰ?0LgiOs ٷM?+r/ҦZ>:ԴQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQESuQji7bgbqkسU9خI0"Tj)5#H)3T5@tE sǚ[J)jNsNSMsFsKBi)M%444iƐ敩Csjcω zsZ1w[dНϘy]jAUi:JZ(((()(M&YɸTZqQJBӠ)Қe)1N54Hڠv$5VV4!UJgt `!՜[CB>n*| ԅpzXjŠZQKEQEQEQEQEQEQEQEQEQEQEQEQEQEZd5hl2( jʚŚ=^.>2;:2:pS )!E CKHhQ cMFjCQ1"N0J/M]XҵqjsPFYr}-+ÖF*U5R7 kĚAK@Q@Q@Q@%-2Fk!]F}yMNɤƽL%/qןB0I4x)+9D5{T,Hdr5VsS9kx j=FjDVXttx,i좴6-SZQ-T ,, QQREQEQEQEQEQEQEQEQE4HHEg^6\WJS\ֳiX⺰}̪ǙN)EMx\T#}2wWy.wr=Or+X3Q+SJFTjG8ԍ5]jJiaW,QV͒cұfl εNWAcZEGPZ(((((((((((}RXI Eּ\ 5ypk\՟O=@gi9nY-1 i!JOE2@Pf)*SGlXMGsCJieErH⺋ >*q7b< Vihq ZAK@Q@*AB)N\UC+s58%yվ 4s]Ct0M5ڬyHiIf2kBPW,+Csӎ@;VxA_3?bUaMW CKH)h((((((((((((((((((((((((((((((((((((((((((((CLP HjHsWmɬjHRwd,wzL-Cai sUjF7cOcP;bFIL\hjҴ]͛oZV++C*;ɗUZ)=E>REPEPEPEPEPEPEPEPEPEPEPEPEPEPc Ԕ('Sb|«V.+Hpc%h ܷ^di۷|ܷYZNKIK@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%-%0kW܇ߪwqCI.Y\[HjCbqXm5ՙXj@)i3@tQEQ(HiH jm8iN&S$j[L fִ4vL\9wrehFՃM5 q] T|ܕjJ3S@QEQEQERR@}mƬ6jz|]\-!ŦN&jdƂƜim\RqUj = S ֽ+.jp}%=O0W#Z0+C2EE: ( ( ( ( ( ( ( ( ( ( ( ( ( ( (EW2 Y49MRk^KؤkiEu+/+KcZ*uN.v!\N: ( ( ( ( ( ( ( ( ( (H>b^ Yz}{5k6XWi}NzR0+8 vBm8LS)M!!4HҚi dWcɕ[8Ix/E < ~#xQiM>ZPEQEQEQEQENԚ.׵wz\-\X+!W1Q@jԆjCC dHĈ-֦jֈ#ZMjtZ4GY]%A\ޓEtvcӇhEVVDREPEPEPEPUkš ʿh52vEӏ4d߾554ncPqݟAJ<4M4BH iDj4"'5h%nrº+%V WEeWM=ſ|ՁzUNhr->@Q@Q@Q@Q@Q@Q@RPRܪ݆{ P¨Y7zLLڶr3Yt𓙹s*gȺsŹg'1kYMTV$uQEQE ́RrlqWe)_&49_;VnR= =)8P5%+SjX4is͚"jTjhWcB˓R]kŠO-[. lڎi[ƟhB8KU+VI AK@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@ IN 7Qŝveʚ½5sBNvJR_;E! @Q@ZCHc F¤4TDEFMHZ!1oV@pi'+N hȯc-,7nom gxL'LZ}QEHp1I0&C]./i^l`Wy)9)i'9jvi5!5cC4HHӺꬾR+?(ŧsه]z rMZuQEQEQEQEQEQEQEQEQEQEPREr)8֢܇73o/ [[|¼l}joS9AZ1ʲoVFOP((((JiSMdOҸK]ޯ+^ʼn:Q@EshQE FH45TS⠒ĉSֈ#ZMjtZ4GY]%A\ޓEtvcӇhEVVDREPEPEPEP$8SXʣB~C (@ &c5Jjhw5#TX#F˒+[N)|35 U\J&Zu5iQEQEQEQEQIH[LIS 9$\i[ "VkAֱ5N5wY:m, u cjI埩rz2gGZi;2OZLRv*+@&ajc=,s5FZ&3T.In5jA5*[JJDc-OKb{VVWb#:;K#.Sz;?jҊڮiV:U̸m=Vգ1RɻQڭ%;UԇQVHS,^8JxZGOT6ҁ@ J:1E-QEQEQEx~OUv Wr0 N MHiha5@!өHm4PJE 84fƜa]eeEqv/i͔i65r: \`R:(((((((((((((((((((((((((((((((((((((((((((R}ks&š}= =.(N.ZҚƂsL&55#5V4{3TMH¢cC~miqXrշ7<:;N!Qҵ L:T1å-Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%-! i3\NWw(嵨ruۂ,8E:uĆ\ӧt( (iq"3HiƛL4i8L#4LOLni-:l8O|ͶK**xW:X[Vn^<өiQEQE8F YSMqc*rUhuEi > ZfaL4aSLjaJRZi5:ܡ3ZS|־qc~J{jY_pV'|]JT1˜((((( 4ө2u'\%XR~\jyX (t4(!ڤj#"zTUXPZkSX)N`F4++~讒ߠzpMUXS(R Z((()JZCҀ(޾-xG)Zxk=lFqNE`zvfsJi !\-AHF5Fi23J*.sVi}]-A\ՇQ]5A]_jUT*tRaNuQEQERf*k0^R[Ns KF9jt:uƦkS,H'gXʯcңmƩ85qzO5Gli frl)L nQ搵#uajijfyCS A4,d$e* fڬGkVWknOj-imV'k#ͭFdVWc8m=vi$q9I2j_zT@=*RV*cBӀNKK@ KEQEQEQEQEQEG?qC^ڸM]vc/Cf5xe}QREPZ5!TӍ4ƆS 78R5=fؐW_6PWlq JlQA4k:ݲ^אtQ)(h((((((((((((((((((((((((((((((((((((((((((*9N.NcZT~Ͽ߭]J\O\swg!gny:Gi4ң&HkTMNsQ1j5{TmTj荚ni֘zUAVzV"ӻV3mz Ԇ: Ԇ*QQ%J) ZZ((((((((((((((((c+U(kx~b52WFi#!Y浵X!f}]x!–R6 (4N4Fi 8M2XHiM!HHiƛL|MupkjOIU^668xO&Vp+iϞ7 T>!=;VoH-S}-#̟:h4Ԑ=)i j#Z M0ԄS 640iR(Ѱ⺍9r]^NatQgUmVgͷ< --B*V*$ ( ( ( FiiMbr`\.kT=kQ{("j0ia4j6hF5hQHiMEM"j2"d/XWQf~Q\tg]0_lU5Nև!:ө KA֋&',F󪎵sȹ3H駅ߢʺ1ُ5] 53ԥKVhM3Tu搚ɶBc 3z-I$)jBIvin)ja92OݪL':HH5mmzU=X<ُHGJ;sZڴPHjb%7s>+n:U}JPJvH빟[BJ" eڦTPJ(iqN \R@Q@Q@Q@Q@Q@Q@Q@Q@P+knr@Xץ߱]hskOi M(RJHiA&CJM!iǭ%HE)4jZFbpksLiSnkIٝ͛eiFkAZКΧqq*Pj5(QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQERgg )l]5y#2jk;W zjC< -FMCDmQ5L PhfT=j4Ն歍=Ei ;0!Zt dٶ@Xks.JTIRZZ(((((((((((((((((ctdUa4up69Z\ˉ rYM5J): CKHh4%4֧kS!2)i4џUGsO+JYVj^CR*e4 uQ@ Ls>R*\5Qnbvɪƾ{+老AK\IE4iƘjYHcvքZ"zaUwE3P9Tek]nmV En0wsYgjw= z f%(.8j#4-o1@UXZnVDHOYJcR՝%ήpk&W-5aKpޠ,ǽe)6zpPОs泱ܣ$-L3FicSKSNhM"'R09452DMJ 'Zg ltc]5"IW!>v;_jS[#VjъڭhG)ngir+\va!)l=*@=**EJbX@ ZpZ~)q@(RREQEQEQEQEQEQEQEQEQEQE2Ok y-]\ƺeY^'k> 9⾝;p(\Ҏi8L"zS =i)RP1E8CF(4PZ>Pԑ6+*Eٝ(*9[\9$ Snrb9%c.ҌjFSYIKH)h((((((((((((((((((((((((((((((((((((((((((JԏkTM{ޚzSe4p+}DWfm; McKM&&M/ZѲ?0yMqc>NقtنQru0cS uQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQESXfI@kסk 3\m=EeHu `0M)4c 592)ĤKA5V;u}$Tw91nZ7+Vұn|4L^:i } pxUk:*;MK)5UF AE)Eh4RRSMRƫNЊDMҠn;thD2SSHE7cf¶O?0C:?ɨڞj6Ml qբ^φ DXgM3J7r{MPVjVe(0F #i[`j>G!Z#4ؽGdXMI{Q_jdac !liNcҚD{"ܚ;\DU$rTjtvf;OjԎڬGljQڭ%\HqS,tY N{Tʕ ZGR6ӀbE&)ih(((((((((((((5Gj۬B-5]9r]qHj+WYlTeyVcShZ:QEi)Sh %)44RJChN"Lq] M+|>RFZX=* p*frPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPESsFhSsFhSsFhSsFhSsFhSsFhSsFhSsFhSsFhSsFhSsFhSsFhRfM.hh(CXMm5j'^hO 3=)ڵ_(zP?}iZH/kZ~X[P;TnWR XPภS()h ( ( ( ( ( ( ( ( ( ( ( ( ( ( (7+MLe8Zc捏>lRyisMZ@!O@ 4i1) -#⺍`ɮXkONѵ)Yd Uڱw Xu]SR J :JZ(((((((((((((((((((((((eN!5LY[FЇR(|He͍`z6z'ڣGhg\z=i}Z}G=kW}Z}G=k֏ϰ{X/=hGscUWޏL=:_0zyֹѫ u=hxiy֏4z45_z?}ڣGhoWޓT}Zabth̝\zk{XYGOZ<\dzа}GSZ<\4?L^_=i|\!ׇG[Z<\q׆~/ަs=i|\_ޤ:5;C8k]lZ]@9ZT UkRkUk}-X|F9j54Q >*DCM掔4fj1S4"nsSMY i4? ѝUxV(iҺKfEtQb(YZ +LJZAK@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%-ZeMqrkeMrzu-Pa7iϨZ4i4RSXSiƦKyO&C3L4M1֦ejiGQ uA[0td8AZ>UUwpw{sSK5>#ӆÁPPmRQHi1P=N*B1U#=i dﭫ#jҴ~`̏/3nW#5B*WyN :(((((((((((((((((ktW#WMTʺP~qRb (4Ljy &5#yDoL5x{ҹ慭#зl>a޲+ ޲<l#U z & k)֠ J-њuHkѮc3['j5x\s.i_Bq KM IFhiCJi) JCNb!V>vm+K&fweEhDx >lb~+%Wc;Ut52((((((((((=(/Sl!RlWjos0qe3Q<*65#a5<2iJM47i aS 0MiXŒ* nYA1yckN7fXoZ&8plۦ1^ ՝eeDXJpJZ(((((Jii _IW s?ԟp?ڸ;V;CGJ((c (1 FiƤ402TTOTbBj#֥aQN`:#~讒ߠoIK~c4"IUbILAKH)h((( 2Oi'4䵕`1Y=ϧC-8Z)!SZ5=3M6jբ$4)6F8qTlLsr֎tEnںV-BiҦZdm< \P{ivE3m.u-3m.)PbZ((((((((((((((((((( 5B('V4'J2k\Wvg-x0-5lR׼r&i(f)CHRi(Hii %%:P*Kg+ P6iI]X3߁\>sv6Op= r5cn*uqYC\ Z(((((((((((((((((((())izMyG&\^`Xwյ:2kߪgĽq5b]jLy2N_R -Y:_Pg'h]ѦooZ< ըi7BR w֢K֗sz!Z.{zf ޴eiehzӨ޴RzKc-50#%֚Ži @4.Ϟ#DZ! .i C]i֔Bja79zEgnIjѧ1\(fVպVvB)⭥TU\Ƥ S@ oX m/ɨ*~"8 \osisM-"RiP+58i4Fi 8a1)*G☺l0ڜ/N|8򂷦|5Zf&RVև0SE: ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (ʚ5WPzW5 D:0j1SN>sP1pEZC@šԦM0 >cM0ғM5FRbMZxQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEVdjGjĻcU\ƪ(Q/Z(4Cj5+T/Ww5\Q|6vѝՍaMQi p)EPEPEPEPEPEPEPEPEPPO kkl[$\ć$`>FƢc^86R@M0\HK)Mn4j+9E]60GqTV]8Vu&vB6EhiBz5,JQEQEQEQEQEQE%4ө2u'\%WR~\jyX (J+Em1CQ!2j'dF!cQGh֧ASZVi?tWIoW7]%A]UUQ QEQEQE'4Mh:e N~Mϣ?tsH:QY)sM ‘M%5FjFȦl!ؚK#4k JoUs+.7J- WɵuvOϚ䙭+Tj9E- ((((((((((((((((((((((@Lu+j[QW. 4TMW1wG:KT9R@Q֜zR b0M4i1))h 6rl4˰kt:A9דs&Z *ueiuQ@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@5(ɥ5zN&*nî/0yw' Tٰy?s,wMz|$e9*U{Wګ>pk!ɨשNcdiwTT7Kt }*(}EEpNXD@XSK@YO UZͫ M;5R m~x(&jsS Rf@i٨DL&i gR\I]m-A"*mW+J;rXhE\FSR)h1Zf/F.oQ\j'p4ZEM M:hiF56֦ԝfA]nQ\imMct0]z J QI@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%-Gkw]S=8j T?|#rUOBRSM4O5ZiL=*cZJSM4XM)36*տK*%G+2ӠH{V\JEEL(hCPJU^2WC[WRnz穪-־k3Ң4 fRRbIJi(=*B-"4)jȘTfzB5>Wf>!{ݫp+J#ȵZt[Iq*AQ%J( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (255C/CS-1>`ջަ\J=z_QE`hiƘi1jH~VȢ"Ӟ Ppi([RٍyZ65,F+~paEoWN6G7v]-Wh@KH)h(*rSS9-n!++uP6+@xkU۔nfE%(\)(RhIEQEEb1[]5jũ|M58YMٞg0AQI9gYXS-AS ( ( ( ( ( ( ( ( ԥ؇5ZQWDM')Ϲ5ƭ5EF''vFƘiLjj2iZQ-Mi 4uc$H˿cmYo^62tӊܹiN+f,T{V+7,DeVZr} ((((((4NdOҸ;_IWu+s|Hh^yA)OCDg5zą#SDoi X*Ѫ:'- ++;>B*V*$QEQEQEvMn05e㮆%5jp{-EBx(P}- Qڐڀi)ǭ!2*kbj&D%⺽:l2},ߠXjӨh((((((((((((((((((((( endstream endobj 9 0 obj <>stream AdobedC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY* p" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ))h4fL7 Z)-1}hSw7uE7ppQIQZ)3FhhRQ@ EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPIHX rrEE$ZϞ.pk2}@k9TQ0x՛RЊ&7IVTQ 4> 2oCI{ѫq¨QQ%O|_׾Q\/k>u- o*sHE/i.?W_j{E/i.?_W_:gSH]Tfin_q˜q³NJ^}?/S:q²N:'^?>#_ωu,C_Fz4s˸*y&KLUu+exm˚>uek bVڿnXj2`>XVpH\(NlhҚWf2G*l8ekc4N(((((((((((((((((((((((((((((((((((((((((((((((((((((J(h#րW{^l.[4_jZJO.i%w95eZ&Z 6C7*;MʾOz=Xu֛DڌcA!=Mkx:zR_ZvQ?X:zOO(^ݝ{jkQLgrjZ zX$۳]LzָߴGڟ֟P{vv_kG.֗OR(~ݝkNOZsK(~WQ_Zoo֥[%OZpS޸Z5 )O޹4ԈS&Y<,UQӇՇYMQOzT&Dvf$Re (=ǭN%fKMJ3@ EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPE1*6.In^$ KNqSX:3U*bcy dɨ'͒韩|$뷱TŹ= ]Pz2sosͽ!Kyo9!TW4ƤJ;M&4P (݊BNfRlLFjߊWzۊDQ;PHJF7$wrIn5f=VJ3-eX:qPcV=+1J6=XRhC6*iBH:TT(E: ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ) 1U@YFPQƜKFuI:\ڮކI3 e*$ꔺ^|ުe<c*ɫSR'b>ֺc2ud6cޫrǽR/eoIlCd;L{ND"ǘ}ia]d n]j[ŌTV+F([CJj-LT ZZ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (z5ҠM&Y,C%ʧz˟R<]Ƣ[85 4e*sj*:R855ӱO5YϚ+4.M<ŻyYZG$zi U/MgKSKUr!|nR%IMhSKSMԿ`jEK[Λ `}ڟrm;ڛ]AkMV*9v]cZqҢ6qԎNYɝ<ٕ]cT-cҵXʄ$rFõuګ=+KS'@悰+fm?P͇A]񑑔4UJ )aښTu)c@5Ubpis@XO UCST"ҵ<5VVqh&NH)@4!`4)%5YWp B3Mێk)P)xoZZ>A:\5bo BIt5 ju`qb-A*P:1 8ȲZ)ӳ@ EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPIKE4bF(Omm?b#M+ScPFr?|kGq#ƸqOS7CTqK@ErhQNcSOJ~)L\S@EDT*Z##/(4Qnt`]5W?'+]!1UUqVҙDH)h(((((((((((((((((((((((((((((((((((((((((((((((uT2uW<%ޤX oNg*&֢ĺ TĒyR1՜,5 4ZJ{ 0Lve%g6jajDLvZTVc-ڱ^0ܸjDWZyqtFrvҭGiZ[p8Q{WA*PE5zHTxMuvʛ:U=ΰ5<ζY[KLSNEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEkP^ug5]5ÊqNC CKHhҡcHi)zBE"Q5ht/D_Tw5W}]A\EtvwcԇhEVVEVDREPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPES]Œ,y[Gn@5:nnșIEjX a^ W'rO5è)oaŏ4ÁJNB]ϊI) ks=BHZfR ƣ&\ *&[g_kCXAȊ v-ڦ8(-+įMSQԭ {V1ZPڹlhAqj"L@,u*<%< hZpQ@ P)h((((((((((((iݵ%%FVh@dNk@V/ Gos\ޜS'RYvA(eMΚg#tix$X76m6ߧmJe'7vv%`VQ`QxH#JVZ ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( JZ(SjJB(g^ىTZ*'L6ڮTsDclUFsOi{8(Mj(53%RCGkR8⹫TQ#۶klc׶xjʣPQAmoӊԆÁW+1SҪԠP8 -QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEƧ2_FƻMWQ.q+s"▹CzWW54=*x kg 㯋›e{[>FEm[p0)`qZTu+Rp:Rq+1q*ЫO)K@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@1Ơ WQ.qi5?Zny8ƎP:Q\84I4qL-R5 UH:"4A/;ίH;~# ǩЊ%U%2- ((((((((((((((((((((((((((((((((((((((()(8EbjWcVFk21pyمZV 4@日zYXQj7讎ߠzMUXS(R Z(((((((((((((((((((((((((((((((((((((((* B)f5KjÙؙ;+@5RM)w5pkݥH.f;0qLQ#KTNiU+H vj{jҰ cQ5DƖ 7Q5g9+ҹr (zV}XߴT;a"XaZD S((((((((((((((((((((((((((((#aZ@GVѶ+M-1R.(Z(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((5>55jq7\kZER!!"iy u53 R.$QR=DEZ:"1bX)/++>讎ߠzMUXS(R Z(((((((((((((((((((((((((((((((((((((((s@&؆]B{F3\ש՜iKH(& 1:vګjW5Uۚ(5FƜƣ&cHcӘsRXsZV1n"oOyGSRo6x^O TQN:K@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@%-PbR@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@1Ơ WQ*~k5]ny8gQH\Zl)i#ޠ5H$OQRZDo2i)ksUtWGoW9}]A]!UUQ QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEU;ق!1“X:)CV"r1Fk8sO4ҽqQI݅P*1sJj6n+DD튁i ƘyzfqI0swNVWe$ZM+qYt8"KXʜӲ;)ȿmJԅjp*K5&A jPKEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQIFhhRfZ)7 2(hȣ"LњZ)3@4QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQERQZ)3Fhh4fLњZ)3FhhEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQESLjտ.oF\8'gRc:W!Mj\hDjSҢnc N*T"E%BMM%BkDt@i`t_ZnuzGiR ZJZJe ZAK@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@Q@4RdRnSwZ7:nz_Z7u€hRfIZ((((((((((((( u(D5js[:yשJDihWr Q3TcM֨$8Ud5PFԬi֣CXF5-ش4˹EW,ψ,pWf݌<+z>f۶LbfN+" UTZQHcS: ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ('S ޣy=!5EU{wԗ֧*R{#P0I5!PGާ#eowڎ&=gO5 MA_Zޯs?moZc^7Kk :~ֹSvt>՚_Oz>O[>@_ZVimoZTX`Sޜ.\_ާMCީU1 H`isicXML^,ѻPSެGxRfR( њޤ=jAN:J3@ E%-QEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQERQ@ E4ip(z `)znV; ֘n+)b`2SL4@)>Gi}y4/nh: ;~#- ǩЊ%U%2- ((((((((((((((CLg ހ$W{;i/{rHNObp)0&=jCmʎ^\5US:Vw[P\ٸrz6:Vn) j֘uz7#L}i{FRD:ZQC!+q:5}ֹ3z緭?hx(R_SNjTqީUfr.^.p{(u5j=GCX9#f#ǭ[7z4yPz5R9SYV%-F 8u((((((((()49^mČգg+@;uc1Q{Tf*lԲUs[E֨Z6RNJ4ؤ ɭ+³cչuloIjt1El@+6Ϡh+:q }*u Z((((((((((((((((((((((((((((((((((((((((((((((((((((()(~Jb}i7bZiwޅT'tɬ6uæ/ɩcRR'gJOVcX: ]Wk=-KgTh;374޵*d>e0h.7T\9Q&7Tt hM56@I3MPhi!M\RNYw)ȝnw1Y"T-ͤW-0s\sZ) hv1])j)\Lp95~xёՠTU+V%4J(RQ@ EPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEPEQCQ&s8LzCU\%Z;,=Ͻ@Tfʸ(FCM5*Җ \n4V7e I4Qv1sFi)(XZ( J(E%/j-64Q@E89JjMu &L%"[@HtZZzk-jWSz1ՉJ F)´%KH ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (50M2/C!Nz;Gzˑ1?m)!k'w7cj'VtC֘u@;>I5$NziǭsN:'ִXHt֏a\O>}Rt֏a\'֓'HkZ?s9>SG GM=iֹZi'֚@N\zlZr}M!'֚@i?`z/h4{iG:4'8 W dzdz+i 9h!ǭr>I4N:i@*2qLNzkN;?W 8jL^G`u!}M4iF{y$+?!_Wh4L=! z8iB{y/R_15n`, (ZL]C|;[T^\kR4ŧEQESLjտ5oF{Ƹq[N?qqKH(\-Bj&MD@DԍQ4izDtDaS >/nh:#- ++;>B*V*$ ( ( ( ( ( ( ( ( ( ( ( ( JZC@ TO2⳦'MKv49r*>\k2RsְFzT0{_ީtޫSMd ̭L21M4ړu?yL4 .FQm,o٨EHqlTKC0)%`biڔSUVdU)@8hhBZѶcջr}MZG5\6vpݫwK(= rxֽ> endobj 16 0 obj <>stream x]O1 ydeI  D 1o Ig|wYu`A>Repm% F< ݀V'& L|"f I>n`i)HJus ը?-ΓkJĹEJ%XRA|R endstream endobj 7 0 obj <> endobj 8 0 obj <> endobj 15 0 obj <>stream xyXUϙqGH]TM7܈-QJ,vlm}lL-KS~6z~?z]3}YxՅBhF1yRq@JJ5r~ySBfV.jt*CC!{͞""yKkZϮ.:bh- ];qx6oae9Ń8|I]$@ҹ|~w[n3@{/ a,ĉdqhKzQb5 bK#xA#K"y@Gp)9t:;#݉!"\k1C'y!K;ja Uim'qD&LD;3W=ZA4 *JZ(@hMbJ|?&eX* r^gf/+J< *ݱRfH\FmtI*։/W[hʕ*WkĵzMgd73Z5ܢ;QxH< {YFwK~p Wrt[+pڵt NђF砍|Ɲ؀k Qt~eO+q)wfi׊1oŷvW5w<[tj~ɶ[vqbX)sVq7M܇?Ց> ן"څ*$;Dϫ'3;.ސn4Op1g9O#ZQx+ԋ%+A<>xGZ^_x-3)Fcޅ|)fT͚9cRSRI]1Q6j 2Hs92%(5vlʑ(?%Q8?,ӛ9OoF˚3ZdKisf̴Tg˩rv"/\ϩ%Ab"z8ks,s)j[r1^9<ǕS*Ͱf8]%uc7 B-acR^y2țkOL9(&},:g{:l,%UU>ݫѩ՘ںFJQr>%W+<%Ņ >[Ӟ˦=%G{h͍+7%:ѧ=-$reg†ǥtz]p3Bs3V2j]s}S)8I =e,'ωoOZk'יW{ 6h4h`X2&a"g0zJ{NELvz]. {W6^ϷUXT՟-)9- j 9xSXx ǞQ]PWaq6?pbC eD/w9mΖv.v6Uʹ:l_*Z’T=.-zwb\[U ҐSk:Nn=kвZR Z4A޾-D^'C =9)*; q΀\zN!csViģM.GH(\ڥ!$B wUg+fWY&2NhkRk ^(KzڐΎo+þDjAW K4h!=Fi,CxZ_SRA-&JFzuDJ<<@ ŧRz٦x4fpvt_kk>71“hs^`>Iy UeN QYWp;e$%WB,cÀѼ6%L>7mg|ʭwAUv.YS՚> S!`eNZɄjŒTPşqepPm0CYvƤέ|R]/x̄2-%-5̬EOZu_%y7q8!-ǎvH˜ 2d6L6.Ө Zftv.z0,^Yf ٴYff6\flYf&6l؜ϦB6 g3\6籙æl65lTdSMYlff:ilJxٜf*6l)b3$6L`3M!ql ،e3M><6lrd&(6d36df(!lf lIgӏMT6)lfӗM6gIfĦ7^l88d;lgӕMX61lf&M3p6alB٘؄ fF~#;ٜ`s͟l96ͯl~a36G|;6b-o|+6_l>c)Odsl͇l>`>ؼ6oy͛l`l^cͫl^a2ؼ6ϳyͳlalb$l`8<6df$dP!4`A4@$it~/$$l$}H΢Ih$.^4t"9Hz$ tWOt#WOt%d,I %DDQJH IՙII¨.Dv VAH4P$I.DOc$G~'W_j|1'~$}Ow$IQݷ$PkH$|Ng}J'$IP$)ɇ$OMޣ]wԮBVNE&% G:kd/ɫ|eH^&/u|>~ Z:ޱ p }2%% ^E+Ƚlx Ex2ec>Own|?Ex4HDcWDc';<Q9l3/u<`^߼qf^[]Ns6۱>Ne[3ecsa[gٳcnf{sam4C—{y.h[YYYҶسp1\,jk5456nmM2Iodkr6#=z\RTD ܽ3^^oYk[YP3sNpNlOmlOMFSQ)(ʘ63=3zE%O[833)cg"2 = =2z zd{p񢇭Ѧ8an{+vc̙M.춲݌w||k׽]?}נ.}8[3][܄|]rI ѯuB+9+XC#VQGO VZ;ͭHitGo8,bs[F<+brI0l^?}OGѝDa5X.-`%XrpX%`1X@#h:,<0Z0ԀjP*A(e` f`(>炩J@1d0 LxPƁ0  F79 #p` `A?RA 8}Y $zD$n tq Ā. DH` A&AN|H DDN8 3 ~G;p߂o+%|>OAp| >x o ^{2x ^σ< O 8x < NvCA(`xm^plw;vplfpn7uZp lW+pu\ ւ5p"1%_bK/1%_bK/1%濬X$5@b X$5@b X$5@b X$5@b X$5@b X$5@b X$5@b X$5@b _bK}/1%ܗs_bK}^Y3E'#Qp1ALqb|4x] ‰>TH,;wrU?eZ<㯦8zxam?5<}7/tb" &SLW?Ð4padWH>stream GPL Ghostscript 9.07 () 2013-09-02T00:17:31+02:00 2013-09-02T00:17:31+02:00 PDFCreator Version 1.7.1 Document2Sebastien MALOT() endstream endobj 2 0 obj <>endobj xref 0 18 0000000000 65535 f 0000000585 00000 n 0000133990 00000 n 0000000526 00000 n 0000000360 00000 n 0000000015 00000 n 0000000341 00000 n 0000125831 00000 n 0000125978 00000 n 0000099626 00000 n 0000061453 00000 n 0000022276 00000 n 0000000713 00000 n 0000000650 00000 n 0000125574 00000 n 0000126171 00000 n 0000125604 00000 n 0000132352 00000 n trailer << /Size 18 /Root 1 0 R /Info 2 0 R /ID [<3283407F444E43279E315E4546FD0806><3283407F444E43279E315E4546FD0806>] >> startxref 134430 %%EOF pdfparser-0.9.25/samples/Document3_pdfcreator_nocompressed.pdf000066400000000000000000000313141257674555500246160ustar00rootroot00000000000000%PDF-1.4 %쏢 5 0 obj <> stream q 0.12 0 0 0.12 0 0 cm q 0 7015 -2425 -0 3691 0.92125 cm /R7 Do Q Q endstream endobj 6 0 obj 68 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 8 0 obj <> endobj 7 0 obj <>stream AdobedC  $, !$4.763.22:ASF:=N>22HbINVX]^]8EfmeZlS[]YC**Y;2;YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY&" }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr $4%&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz ?( ($p(i:V&+{PV JKQ!;O(Udc:Sl >d,Y"k#lm+u(G"t0-gq!>}Uth+~t?8f`hRv9kw/G߷#r3\υ/dOݓm܎+X𕴃KXz'85lzXN h7b[QS-kxdzU0GzS7W]43G2Ք Q'iĔQEdPQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEQEŽMs7 GB:sV`nDU)z)X|Pr#_S1{A+k͗xbf<'`^ZKDFGJ< >kwc]`Ҍ ݋EVHQEQEQEQEQEQE2YI*&qdeDVt,e =WLfcnICG\͈*(j$mxCKLϥsEMF:^Z-(Ư,U%Ԝ<>Ѥ@( ( ( ( o1o{|39ǷҺ**9GvIRⳌ*(QR0(({{qDnȞȗ6xvo1늎x6Xjrʋ^d(OhEq˺99M=NphdQ@Q@R8Uw:?J1v2REr{"Hj1ƥK\0ϽJ[IE `zQ@Q@Q@u_}MDnY1Nͅ>m?b(}tXu CYp|E*nb:pqTkq!E`["oO|o'gΗWq\7ףOGKAEUSYFX=M:ΟZ ˼3T9ECWSxUnXՏήkBPS*?5$d΍Hk(褥2 (9]cȶZoV߉'ux@~_zn&OO6&>~y z %MڣzZ^Na+~V;hpuQ\&EPEPEPEPEPEPP]]Eky[i/.#5Ꚅ9FSa]g\E3a>R{u5 `t&dV:{qmiaU@D`嬎~΂۩e#4b1Ikqret2'˸BױCu,, Yz: 9P=yeA(r±9uGG&ΟJ8fXo$ֺuuNA(ss[ZVF8F=U:ό%RQMV unxEF=gViGEF.N}ŕ_AXך>'^9cgIF^d=2Mh]R8﮹1֬2>QT` ZV0uuo̱_-*Hpke 0Ec6^fc;+]dQI [#֝N0xaV>HYS:cgEczu=:ZӯEa:ЯŠ+#[E~T$y?Zr'Ե{m9Oֹۤ+^ܹy`Nc\Iqp1gc5h:p¯""–+sIs#0j?;+5Zf? j0TW60\RHՁ&oٞpJ`u!џHMtVAbN" 9Eٗ~{2"zj{\Jd],3nWC2^n+4:SIM:< ֵ褯%ԕ8 CW?Qkw'w_Q~??VtS/Ws\7]?w5CGKAEߋ8vTJsRb]/}>_j7.裠/Yf?iPM(y?#Քi&fZww 3՗r*qqV4$IvQYwoxx[#l<,ܭfST"+]EzHъG5wzZ(LB`A9ݐ>r*&kgY=uC_3;l=\<Њ mrW[ H\pk. IxC,tߩ2MW3-?E&y&srMu+ťmc\%:eԗ/?sK^RM?k ק¡"P=+,uuNO+0~އ:(bb80Ƽhfxd%H"Ŷg$eY@ze[I}u9q1HU yxR';d̠+##Щ(|<''w_QC!˯E`^d6x3gQ/2O]pS/tס/KfJO$z{ 鵩2R8-u\?eZ]g.{cV@9GA*xs_J5ŷ]^jvJ|7G&CŲ0+h1Ӕ1WZw:ˋ-S|kƼ7|P_rkNO) rQOu5C/#T3+{o|6"FGij P_:+!EU'/'^ ?*Ǔ]g-q%cc\r+0<ڱضs} WH$Vx ?ߋ=cf Ζ:0-Q^1QEQET70dUv8_Qh,0 ڕ ~DuW:}#m\'nUcN~ruo3xe#8EQgXf8P֜,q+2TʄuE-%xY!X7t9u_V 5Kg/?SoJkЇjO1}5J"PJB Ns'֒J))i*Fy9u_V Jnk̗_~S+?%Wu^>{TgvI ܏5zZiއucr9S~|'!d+ݑVӯVez0+;mOMǩUlo#Ib`"WQ-YمQ@((6Qj[̹WU)Ӻm6}& [J-S}p}̵IR^.Y/JڭH þ'-CkYjeBiFR=]\ ӫ4iPX>-?v7 C/^ lZOkc#fjH "\EP\Gn?λbBI5 !E!p 5R'&$5cG⽬Cܗ9GZ_OPZ_O_0w4_+_2!%}ΛtnQVSPk:7 Ũ<{Y HU)!5~֒G!deW%w1M<`U%B[ZF""Y\4T4Gc 5 l2{^d[qV7N&r:]/*U9Xz ؎p>d'־zp%%fwzdGv>vW`J>PU.ka$9]Gm: N;8ۢVSjr5If pZ{)Lw0~c0^}#WL(w~]曬j<~^PzԩqPhI`<於Z\sS2( +Oh9SѣIdYk689?v>Bڼj3K"/h >s&mU ҕ~B* `bZ( ;J"8_QZK&ѵ >l @%W$9AXڴיE%20 n^sX|( ̗z{{~?j&/mo7'n+N/jQ_|kwiW6RaC@l̟M/ڊOn0WGP5zX%^'e9:p=>X؃uSRPA}mB؉ǚ-F[p 4#oe>xNx=zepkdZ3^*A-yI͙mZPbwc_=_ R]w;V244k:f RM`) ~Q5:sre%YGǗVj~wm=?pu Ҧ[fI{ 3!eRkթQah$s:{mT\c(((((((((((((((((((((((((((((մmR $t=pܵ^HT0f(jQ^J ['"O"XrTpkfӭ)+>O i`Oʻ?]P7pGs*g51Fٮk䟕MlcTt3Zа* -:/­**VjдWqҴ{A\Vʀ-z`)QEQEQEQEQEQEQEQE endstream endobj 9 0 obj <>stream GPL Ghostscript 9.07 () 2013-09-02T00:19:33+02:00 2013-09-02T00:19:33+02:00 PDFCreator Version 1.7.1 Photo pleine pageSebastien MALOT() endstream endobj 2 0 obj <>endobj xref 0 10 0000000000 65535 f 0000000347 00000 n 0000012170 00000 n 0000000288 00000 n 0000000151 00000 n 0000000015 00000 n 0000000133 00000 n 0000000440 00000 n 0000000411 00000 n 0000010525 00000 n trailer << /Size 10 /Root 1 0 R /Info 2 0 R /ID [<560320AEAC45B12F8697446F81CA4275><560320AEAC45B12F8697446F81CA4275>] >> startxref 12650 %%EOF pdfparser-0.9.25/samples/bugs/000077500000000000000000000000001257674555500162265ustar00rootroot00000000000000pdfparser-0.9.25/src/000077500000000000000000000000001257674555500144115ustar00rootroot00000000000000pdfparser-0.9.25/src/Smalot/000077500000000000000000000000001257674555500156505ustar00rootroot00000000000000pdfparser-0.9.25/src/Smalot/PdfParser/000077500000000000000000000000001257674555500175365ustar00rootroot00000000000000pdfparser-0.9.25/src/Smalot/PdfParser/Document.php000066400000000000000000000147421257674555500220350ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser; use Smalot\PdfParser\Element\ElementDate; /** * Technical references : * - http://www.mactech.com/articles/mactech/Vol.15/15.09/PDFIntro/index.html * - http://framework.zend.com/issues/secure/attachment/12512/Pdf.php * - http://www.php.net/manual/en/ref.pdf.php#74211 * - http://cpansearch.perl.org/src/JV/PostScript-Font-1.10.02/lib/PostScript/ISOLatin1Encoding.pm * - http://cpansearch.perl.org/src/JV/PostScript-Font-1.10.02/lib/PostScript/ISOLatin9Encoding.pm * - http://cpansearch.perl.org/src/JV/PostScript-Font-1.10.02/lib/PostScript/StandardEncoding.pm * - http://cpansearch.perl.org/src/JV/PostScript-Font-1.10.02/lib/PostScript/WinAnsiEncoding.pm * * Class Document * * @package Smalot\PdfParser */ class Document { /** * @var Object[] */ protected $objects = array(); /** * @var array */ protected $dictionary = array(); /** * @var Header */ protected $trailer = null; /** * @var array */ protected $details = null; /** * */ public function __construct() { $this->trailer = new Header(array(), $this); } /** * */ public function init() { $this->buildDictionary(); $this->buildDetails(); // Propagate init to objects. foreach ($this->objects as $object) { $object->init(); } } /** * Build dictionary based on type header field. */ protected function buildDictionary() { // Build dictionary. $this->dictionary = array(); foreach ($this->objects as $id => $object) { $type = $object->getHeader()->get('Type')->getContent(); if (!empty($type)) { $this->dictionary[$type][$id] = $id; } } } /** * Build details array. */ protected function buildDetails() { // Build details array. $details = array(); // Extract document info if ($this->trailer->has('Info')) { /** @var Object $info */ $info = $this->trailer->get('Info'); $details = $info->getHeader()->getDetails(); } // Retrieve the page count try { $pages = $this->getPages(); $details['Pages'] = count($pages); } catch (\Exception $e) { $details['Pages'] = 0; } $this->details = $details; } /** * @return array */ public function getDictionary() { return $this->dictionary; } /** * @param Object[] $objects */ public function setObjects($objects = array()) { $this->objects = (array)$objects; $this->init(); } /** * @return Object[] */ public function getObjects() { return $this->objects; } /** * @param string $id * * @return Object */ public function getObjectById($id) { if (isset($this->objects[$id])) { return $this->objects[$id]; } else { return null; } } /** * @param string $type * @param string $subtype * * @return Object[] */ public function getObjectsByType($type, $subtype = null) { $objects = array(); foreach ($this->objects as $id => $object) { if ($object->getHeader()->get('Type') == $type && (is_null($subtype) || $object->getHeader()->get('Subtype') == $subtype) ) { $objects[$id] = $object; } } return $objects; } /** * @return \Object[] */ public function getFonts() { return $this->getObjectsByType('Font'); } /** * @return Page[] * @throws \Exception */ public function getPages() { if (isset($this->dictionary['Catalog'])) { // Search for catalog to list pages. $id = reset($this->dictionary['Catalog']); /** @var Pages $object */ $object = $this->objects[$id]->get('Pages'); $pages = $object->getPages(true); return $pages; } elseif (isset($this->dictionary['Pages'])) { // Search for pages to list kids. $pages = array(); /** @var Pages[] $objects */ $objects = $this->getObjectsByType('Pages'); foreach ($objects as $object) { $pages = array_merge($pages, $object->getPages(true)); } return $pages; } elseif (isset($this->dictionary['Page'])) { // Search for 'page' (unordered pages). $pages = $this->getObjectsByType('Page'); return array_values($pages); } else { throw new \Exception('Missing catalog.'); } } /** * @param Page $page * * @return string */ public function getText(Page $page = null) { $texts = array(); $pages = $this->getPages(); foreach ($pages as $index => $page) { if ($text = trim($page->getText())) { $texts[] = $text; } } return implode("\n\n", $texts); } /** * @param Header $header */ public function setTrailer(Header $trailer) { $this->trailer = $trailer; } /** * @return array */ public function getDetails($deep = true) { return $this->details; } } pdfparser-0.9.25/src/Smalot/PdfParser/Element.php000066400000000000000000000123561257674555500216470ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser; use Smalot\PdfParser\Element\ElementArray; use Smalot\PdfParser\Element\ElementBoolean; use Smalot\PdfParser\Element\ElementDate; use Smalot\PdfParser\Element\ElementHexa; use Smalot\PdfParser\Element\ElementName; use Smalot\PdfParser\Element\ElementNull; use Smalot\PdfParser\Element\ElementNumeric; use Smalot\PdfParser\Element\ElementString; use Smalot\PdfParser\Element\ElementStruct; use Smalot\PdfParser\Element\ElementXRef; /** * Class Element * * @package Smalot\PdfParser */ class Element { /** * @var Document */ protected $document = null; /** * @var mixed */ protected $value = null; /** * @param mixed $value * @param Document $document */ public function __construct($value, Document $document = null) { $this->value = $value; $this->document = $document; } /** * */ public function init() { } /** * @param mixed $value * * @return bool */ public function equals($value) { return ($value == $this->value); } /** * @param mixed $value * * @return bool */ public function contains($value) { if (is_array($this->value)) { /** @var Element $val */ foreach ($this->value as $val) { if ($val->equals($value)) { return true; } } return false; } else { return $this->equals($value); } } /** * @return mixed */ public function getContent() { return $this->value; } /** * @return string */ public function __toString() { return (string)($this->value); } /** * @param string $content * @param Document $document * @param int $position * * @return array * @throws \Exception */ public static function parse($content, Document $document = null, &$position = 0) { $args = func_get_args(); $only_values = isset($args[3]) ? $args[3] : false; $content = trim($content); $values = array(); do { $old_position = $position; if (!$only_values) { if (!preg_match('/^\s*(?P\/[A-Z0-9\._]+)(?P.*)/si', substr($content, $position), $match)) { break; } else { $name = ltrim($match['name'], '/'); $value = $match['value']; $position = strpos($content, $value, $position + strlen($match['name'])); } } else { $name = count($values); $value = substr($content, $position); } if ($element = ElementName::parse($value, $document, $position)) { $values[$name] = $element; } elseif ($element = ElementXRef::parse($value, $document, $position)) { $values[$name] = $element; } elseif ($element = ElementNumeric::parse($value, $document, $position)) { $values[$name] = $element; } elseif ($element = ElementStruct::parse($value, $document, $position)) { $values[$name] = $element; } elseif ($element = ElementBoolean::parse($value, $document, $position)) { $values[$name] = $element; } elseif ($element = ElementNull::parse($value, $document, $position)) { $values[$name] = $element; } elseif ($element = ElementDate::parse($value, $document, $position)) { $values[$name] = $element; } elseif ($element = ElementString::parse($value, $document, $position)) { $values[$name] = $element; } elseif ($element = ElementHexa::parse($value, $document, $position)) { $values[$name] = $element; } elseif ($element = ElementArray::parse($value, $document, $position)) { $values[$name] = $element; } else { $position = $old_position; break; } } while ($position < strlen($content)); return $values; } } pdfparser-0.9.25/src/Smalot/PdfParser/Element/000077500000000000000000000000001257674555500211275ustar00rootroot00000000000000pdfparser-0.9.25/src/Smalot/PdfParser/Element/ElementArray.php000066400000000000000000000103561257674555500242350ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Element; use Smalot\PdfParser\Element; use Smalot\PdfParser\Document; use Smalot\PdfParser\Header; use Smalot\PdfParser\Object; /** * Class ElementArray * * @package Smalot\PdfParser\Element */ class ElementArray extends Element { /** * @param string $value * @param Document $document */ public function __construct($value, Document $document = null) { parent::__construct($value, $document); } /** * @return mixed */ public function getContent() { foreach ($this->value as $name => $element) { $this->resolveXRef($name); } return parent::getContent(); } /** * @return array */ public function getRawContent() { return $this->value; } /** * @param bool $deep * * @return array */ public function getDetails($deep = true) { $values = array(); $elements = $this->getContent(); foreach ($elements as $key => $element) { if ($element instanceof Header && $deep) { $values[$key] = $element->getDetails($deep); } elseif ($element instanceof Object && $deep) { $values[$key] = $element->getDetails(false); } elseif ($element instanceof ElementArray) { if ($deep) { $values[$key] = $element->getDetails(); } } elseif ($element instanceof Element && !($element instanceof ElementArray)) { $values[$key] = $element->getContent(); } } return $values; } /** * @return string */ public function __toString() { return implode(',', $this->value); } /** * @param string $name * * @return Element|Object */ protected function resolveXRef($name) { if (($obj = $this->value[$name]) instanceof ElementXRef) { /** @var Object $obj */ $obj = $this->document->getObjectById($obj->getId()); $this->value[$name] = $obj; } return $this->value[$name]; } /** * @param string $content * @param Document $document * @param int $offset * * @return bool|ElementArray */ public static function parse($content, Document $document = null, &$offset = 0) { if (preg_match('/^\s*\[(?P.*)/is', $content, $match)) { preg_match_all('/(.*?)(\[|\])/s', trim($content), $matches); $level = 0; $sub = ''; foreach ($matches[0] as $part) { $sub .= $part; $level += (strpos($part, '[') !== false ? 1 : -1); if ($level <= 0) { break; } } // Removes 1 level [ and ]. $sub = substr(trim($sub), 1, -1); $sub_offset = 0; $values = Element::parse($sub, $document, $sub_offset, true); $offset += strpos($content, '[') + 1; // Find next ']' position $offset += strlen($sub) + 1; return new self($values, $document); } return false; } } pdfparser-0.9.25/src/Smalot/PdfParser/Element/ElementBoolean.php000066400000000000000000000044161257674555500245360ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Element; use Smalot\PdfParser\Element; use Smalot\PdfParser\Document; /** * Class ElementBoolean * * @package Smalot\PdfParser\Element */ class ElementBoolean extends Element { /** * @param string $value * @param Document $document */ public function __construct($value, Document $document = null) { parent::__construct((strtolower($value) == 'true' || $value === true), null); } /** * @return string */ public function __toString() { return $this->value ? 'true' : 'false'; } /** * @param mixed $value * * @return bool */ public function equals($value) { return ($this->getContent() === $value); } /** * @param string $content * @param Document $document * @param int $offset * * @return bool|ElementBoolean */ public static function parse($content, Document $document = null, &$offset = 0) { if (preg_match('/^\s*(?Ptrue|false)/is', $content, $match)) { $value = $match['value']; $offset += strpos($content, $value) + strlen($value); return new self($value, $document); } return false; } } pdfparser-0.9.25/src/Smalot/PdfParser/Element/ElementDate.php000066400000000000000000000102441257674555500240300ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHPi, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Element; use Smalot\PdfParser\Element; use Smalot\PdfParser\Document; /** * Class ElementDate * * @package Smalot\PdfParser\Element */ class ElementDate extends ElementString { /** * @var array */ protected static $formats = array( 4 => 'Y', 6 => 'Ym', 8 => 'Ymd', 10 => 'YmdH', 12 => 'YmdHi', 14 => 'YmdHis', 15 => 'YmdHise', 17 => 'YmdHisO', 18 => 'YmdHisO', 19 => 'YmdHisO', ); /** * @var string */ protected $format = 'c'; /** * @param \DateTime $value * @param Document $document */ public function __construct($value, Document $document = null) { if (!($value instanceof \DateTime)) { throw new \Exception('DateTime required.'); } parent::__construct($value, null); } /** * @param string $format */ public function setFormat($format) { $this->format = $format; } /** * @param mixed $value * * @return bool */ public function equals($value) { if ($value instanceof \DateTime) { $timestamp = $value->getTimeStamp(); } else { $timestamp = strtotime($value); } return ($timestamp == $this->value->getTimeStamp()); } /** * @return string */ public function __toString() { return (string)($this->value->format($this->format)); } /** * @param string $content * @param Document $document * @param int $offset * * @return bool|ElementDate */ public static function parse($content, Document $document = null, &$offset = 0) { if (preg_match('/^\s*\(D\:(?P.*?)\)/s', $content, $match)) { $name = $match['name']; $name = str_replace("'", '', $name); $date = false; // Smallest format : Y // Full format : YmdHisP if (preg_match('/^\d{4}(\d{2}(\d{2}(\d{2}(\d{2}(\d{2}(Z(\d{2,4})?|[\+-]?\d{2}(\d{2})?)?)?)?)?)?)?$/', $name)) { if ($pos = strpos($name, 'Z')) { $name = substr($name, 0, $pos + 1); } elseif (strlen($name) == 18 && preg_match('/[^\+-]0000$/', $name)) { $name = substr($name, 0, -4) . '+0000'; } $format = self::$formats[strlen($name)]; $date = \DateTime::createFromFormat($format, $name); } else { // special cases if (preg_match('/^\d{1,2}-\d{1,2}-\d{4},?\s+\d{2}:\d{2}:\d{2}[\+-]\d{4}$/', $name)) { $name = str_replace(',', '', $name); $format = 'n-j-Y H:i:sO'; $date = \DateTime::createFromFormat($format, $name); } } if (!$date) { return false; } $offset += strpos($content, '(D:') + strlen($match['name']) + 4; // 1 for '(D:' and ')' $element = new self($date, $document); return $element; } return false; } } pdfparser-0.9.25/src/Smalot/PdfParser/Element/ElementHexa.php000066400000000000000000000053241257674555500240430ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Element; use Smalot\PdfParser\Document; /** * Class ElementHexa * * @package Smalot\PdfParser\Element */ class ElementHexa extends ElementString { /** * @param string $content * @param Document $document * @param int $offset * * @return bool|ElementHexa */ public static function parse($content, Document $document = null, &$offset = 0) { if (preg_match('/^\s*\<(?P[A-F0-9]+)\>/is', $content, $match)) { $name = $match['name']; $offset += strpos($content, '<' . $name) + strlen($name) + 2; // 1 for '>' // repackage string as standard $name = '(' . self::decode($name, $document) . ')'; $element = false; if (!($element = ElementDate::parse($name, $document))) { $element = ElementString::parse($name, $document); } return $element; } return false; } /** * @param string $value * @param Document $document */ public static function decode($value, Document $document = null) { $text = ''; $length = strlen($value); if (substr($value, 0, 2) == '00') { for ($i = 0; $i < $length; $i += 4) { $hex = substr($value, $i, 4); $text .= '&#' . str_pad(hexdec($hex), 4, '0', STR_PAD_LEFT) . ';'; } } else { for ($i = 0; $i < $length; $i += 2) { $hex = substr($value, $i, 2); $text .= chr(hexdec($hex)); } } $text = html_entity_decode($text, ENT_NOQUOTES, 'UTF-8'); return $text; } } pdfparser-0.9.25/src/Smalot/PdfParser/Element/ElementMissing.php000066400000000000000000000035641257674555500245730ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Element; use Smalot\PdfParser\Element; use Smalot\PdfParser\Document; /** * Class ElementMissing */ class ElementMissing extends Element { /** * @param string $value * @param Document $document */ public function __construct($value, Document $document = null) { parent::__construct(null, null); } /** * @param mixed $value * * @return bool */ public function equals($value) { return false; } /** * @param mixed $value * * @return bool */ public function contains($value) { return false; } /** * @return bool */ public function getContent() { return false; } /** * @return string */ public function __toString() { return ''; } } pdfparser-0.9.25/src/Smalot/PdfParser/Element/ElementName.php000066400000000000000000000042361257674555500240370ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Element; use Smalot\PdfParser\Element; use Smalot\PdfParser\Document; use Smalot\PdfParser\Font; /** * Class ElementName * * @package Smalot\PdfParser\Element */ class ElementName extends Element { /** * @param string $value * @param Document $document */ public function __construct($value, Document $document = null) { parent::__construct($value, null); } /** * @param mixed $value * * @return bool */ public function equals($value) { return $value == $this->value; } /** * @param string $content * @param Document $document * @param int $offset * * @return bool|ElementName */ public static function parse($content, Document $document = null, &$offset = 0) { if (preg_match('/^\s*\/(?P[A-Z0-9\-\+,#\.]+)/is', $content, $match)) { $name = $match['name']; $offset += strpos($content, $name) + strlen($name); $name = Font::decodeEntities($name); return new self($name, $document); } return false; } } pdfparser-0.9.25/src/Smalot/PdfParser/Element/ElementNull.php000066400000000000000000000042061257674555500240660ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Element; use Smalot\PdfParser\Element; use Smalot\PdfParser\Document; /** * Class ElementNull * * @package Smalot\PdfParser\Element */ class ElementNull extends Element { /** * @param string $value * @param Document $document */ public function __construct($value, Document $document = null) { parent::__construct(null, null); } /** * @return string */ public function __toString() { return 'null'; } /** * @param mixed $value * * @return bool */ public function equals($value) { return ($this->getContent() === $value); } /** * @param string $content * @param Document $document * @param int $offset * * @return bool|ElementNull */ public static function parse($content, Document $document = null, &$offset = 0) { if (preg_match('/^\s*(null)/s', $content, $match)) { $offset += strpos($content, 'null') + strlen('null'); return new self(null, $document); } return false; } } pdfparser-0.9.25/src/Smalot/PdfParser/Element/ElementNumeric.php000066400000000000000000000037021257674555500245560ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Element; use Smalot\PdfParser\Element; use Smalot\PdfParser\Document; /** * Class ElementNumeric * * @package Smalot\PdfParser\Element */ class ElementNumeric extends Element { /** * @param string $value * @param Document $document */ public function __construct($value, Document $document = null) { parent::__construct(floatval($value), null); } /** * @param string $content * @param Document $document * @param int $offset * * @return bool|ElementNumeric */ public static function parse($content, Document $document = null, &$offset = 0) { if (preg_match('/^\s*(?P\-?[0-9\.]+)/s', $content, $match)) { $value = $match['value']; $offset += strpos($content, $value) + strlen($value); return new self($value, $document); } return false; } } pdfparser-0.9.25/src/Smalot/PdfParser/Element/ElementString.php000066400000000000000000000062461257674555500244300ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Element; use Smalot\PdfParser\Element; use Smalot\PdfParser\Document; use Smalot\PdfParser\Font; /** * Class ElementString * * @package Smalot\PdfParser\Element */ class ElementString extends Element { /** * @param string $value * @param Document $document */ public function __construct($value, Document $document = null) { parent::__construct($value, null); } /** * @param mixed $value * * @return bool */ public function equals($value) { return $value == $this->value; } /** * @param string $content * @param Document $document * @param int $offset * * @return bool|ElementString */ public static function parse($content, Document $document = null, &$offset = 0) { if (preg_match('/^\s*\((?P.*)/s', $content, $match)) { $name = $match['name']; // Find next ')' not escaped. $cur_start_text = $start_search_end = 0; while (($cur_start_pos = strpos($name, ')', $start_search_end)) !== false) { $cur_extract = substr($name, $cur_start_text, $cur_start_pos - $cur_start_text); preg_match('/(?P[\\\]*)$/s', $cur_extract, $match); if (!(strlen($match['escape']) % 2)) { break; } $start_search_end = $cur_start_pos + 1; } // Extract string. $name = substr($name, 0, $cur_start_pos); $offset += strpos($content, '(') + $cur_start_pos + 2; // 2 for '(' and ')' $name = str_replace( array('\\\\', '\\ ', '\\/', '\(', '\)', '\n', '\r', '\t'), array('\\', ' ', '/', '(', ')', "\n", "\r", "\t"), $name ); // Decode string. $name = Font::decodeOctal($name); $name = Font::decodeEntities($name); $name = Font::decodeHexadecimal($name, false); $name = Font::decodeUnicode($name); return new self($name, $document); } return false; } } pdfparser-0.9.25/src/Smalot/PdfParser/Element/ElementStruct.php000066400000000000000000000044711257674555500244440ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Element; use Smalot\PdfParser\Element; use Smalot\PdfParser\Document; use Smalot\PdfParser\Header; /** * Class ElementStruct * * @package Smalot\PdfParser\Element */ class ElementStruct extends Element { /** * @param string $content * @param Document $document * @param int $offset * * @return bool|ElementStruct */ public static function parse($content, Document $document = null, &$offset = 0) { if (preg_match('/^\s*<<(?P.*)/is', $content)) { preg_match_all('/(.*?)(<<|>>)/s', trim($content), $matches); $level = 0; $sub = ''; foreach ($matches[0] as $part) { $sub .= $part; $level += (strpos($part, '<<') !== false ? 1 : -1); if ($level <= 0) { break; } } $offset += strpos($content, '<<') + strlen(rtrim($sub)); // Removes '<<' and '>>'. $sub = trim(preg_replace('/^\s*<<(.*)>>\s*$/s', '\\1', $sub)); $position = 0; $elements = Element::parse($sub, $document, $position); $header = new Header($elements, $document); return $header; } return false; } } pdfparser-0.9.25/src/Smalot/PdfParser/Element/ElementXRef.php000066400000000000000000000045751257674555500240310ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Element; use Smalot\PdfParser\Element; use Smalot\PdfParser\Document; /** * Class ElementXRef * * @package Smalot\PdfParser\Element */ class ElementXRef extends Element { /** * @return string */ public function getId() { return $this->getContent(); } /** * @return mixed */ public function getObject() { return $this->document->getObjectById($this->getId()); } /** * @param mixed $value * * @return bool */ public function equals($value) { $id = ($value instanceof ElementXRef) ? $value->getId() : $value; return $this->getId() == $id; } /** * @return string */ public function __toString() { return '#Obj#' . $this->getId(); } /** * @param string $content * @param Document $document * @param int $offset * * @return bool|ElementXRef */ public static function parse($content, Document $document = null, &$offset = 0) { if (preg_match('/^\s*(?P[0-9]+\s+[0-9]+\s+R)/s', $content, $match)) { $id = $match['id']; $offset += strpos($content, $id) + strlen($id); $id = str_replace(' ', '_', rtrim($id, ' R')); return new self($id, $document); } return false; } } pdfparser-0.9.25/src/Smalot/PdfParser/Encoding.php000066400000000000000000000076161257674555500220070ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser; use Smalot\PdfParser\Element\ElementNumeric; /** * Class Encoding * * @package Smalot\PdfParser */ class Encoding extends Object { /** * @var array */ protected $encoding; /** * @var array */ protected $differences; /** * @var array */ protected $mapping; /** * */ public function init() { $this->mapping = array(); $this->differences = array(); $this->encoding = null; if ($this->has('BaseEncoding')) { // Load reference table charset. $baseEncoding = preg_replace('/[^A-Z0-9]/is', '', $this->get('BaseEncoding')->getContent()); $className = '\\Smalot\\PdfParser\\Encoding\\' . $baseEncoding; if (class_exists($className)) { $class = new $className(); $this->encoding = $class->getTranslations(); } else { throw new \Exception('Missing encoding data for: "' . $baseEncoding . '".'); } // Build table including differences. $differences = $this->get('Differences')->getContent(); $code = 0; if (!is_array($differences)) { return; } foreach ($differences as $difference) { /** @var ElementNumeric $difference */ if ($difference instanceof ElementNumeric) { $code = $difference->getContent(); continue; } // ElementName if (is_object($difference)) { $this->differences[$code] = $difference->getContent(); } else { $this->differences[$code] = $difference; } // For the next char. $code++; } // Build final mapping (custom => standard). $table = array_flip(array_reverse($this->encoding, true)); foreach ($this->differences as $code => $difference) { /** @var string $difference */ $this->mapping[$code] = (isset($table[$difference]) ? $table[$difference] : Font::MISSING); } } } /** * @return array */ public function getDetails($deep = true) { $details = array(); $details['BaseEncoding'] = ($this->has('BaseEncoding') ? (string)$this->get('BaseEncoding') : 'Ansi'); $details['Differences'] = ($this->has('Differences') ? (string)$this->get('Differences') : ''); $details += parent::getDetails($deep); return $details; } /** * @param int $char * * @return int */ public function translateChar($dec) { if (isset($this->mapping[$dec])) { $dec = $this->mapping[$dec]; } return $dec; } } pdfparser-0.9.25/src/Smalot/PdfParser/Encoding/000077500000000000000000000000001257674555500212645ustar00rootroot00000000000000pdfparser-0.9.25/src/Smalot/PdfParser/Encoding/ISOLatin1Encoding.php000066400000000000000000000070361257674555500251550ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ // Source : http://cpansearch.perl.org/src/JV/PostScript-Font-1.10.02/lib/PostScript/ISOLatin1Encoding.pm namespace Smalot\PdfParser\Encoding; /** * Class ISOLatin1Encoding * * @package Smalot\PdfParser\Encoding */ class ISOLatin1Encoding { public function getTranslations() { $encoding = '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . 'space exclam quotedbl numbersign dollar percent ampersand quoteright ' . 'parenleft parenright asterisk plus comma minus period slash zero one ' . 'two three four five six seven eight nine colon semicolon less equal ' . 'greater question at A B C D E F G H I J K L M N O P Q R S T U V W X ' . 'Y Z bracketleft backslash bracketright asciicircum underscore ' . 'quoteleft a b c d e f g h i j k l m n o p q r s t u v w x y z ' . 'braceleft bar braceright asciitilde .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef dotlessi grave acute ' . 'circumflex tilde macron breve dotaccent dieresis .notdef ring ' . 'cedilla .notdef hungarumlaut ogonek caron space exclamdown cent ' . 'sterling currency yen brokenbar section dieresis copyright ' . 'ordfeminine guillemotleft logicalnot hyphen registered macron degree ' . 'plusminus twosuperior threesuperior acute mu paragraph ' . 'periodcentered cedilla onesuperior ordmasculine guillemotright ' . 'onequarter onehalf threequarters questiondown Agrave Aacute ' . 'Acircumflex Atilde Adieresis Aring AE Ccedilla Egrave Eacute ' . 'Ecircumflex Edieresis Igrave Iacute Icircumflex Idieresis Eth Ntilde ' . 'Ograve Oacute Ocircumflex Otilde Odieresis multiply Oslash Ugrave ' . 'Uacute Ucircumflex Udieresis Yacute Thorn germandbls agrave aacute ' . 'acircumflex atilde adieresis aring ae ccedilla egrave eacute ' . 'ecircumflex edieresis igrave iacute icircumflex idieresis eth ntilde ' . 'ograve oacute ocircumflex otilde odieresis divide oslash ugrave ' . 'uacute ucircumflex udieresis yacute thorn ydieresis'; return explode(' ', $encoding); } } pdfparser-0.9.25/src/Smalot/PdfParser/Encoding/ISOLatin9Encoding.php000066400000000000000000000070041257674555500251600ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ // Source : http://cpansearch.perl.org/src/JV/PostScript-Font-1.10.02/lib/PostScript/ISOLatin9Encoding.pm namespace Smalot\PdfParser\Encoding; /** * Class ISOLatin9Encoding * * @package Smalot\PdfParser\Encoding */ class ISOLatin9Encoding { public function getTranslations() { $encoding = '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . 'space exclam quotedbl numbersign dollar percent ampersand quoteright ' . 'parenleft parenright asterisk plus comma minus period slash zero one ' . 'two three four five six seven eight nine colon semicolon less equal ' . 'greater question at A B C D E F G H I J K L M N O P Q R S T U V W X ' . 'Y Z bracketleft backslash bracketright asciicircum underscore ' . 'quoteleft a b c d e f g h i j k l m n o p q r s t u v w x y z ' . 'braceleft bar braceright asciitilde .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef dotlessi grave acute ' . 'circumflex tilde macron breve dotaccent dieresis .notdef ring ' . 'cedilla .notdef hungarumlaut ogonek caron space exclamdown cent ' . 'sterling Euro yen Scaron section scaron copyright ' . 'ordfeminine guillemotleft logicalnot hyphen registered macron degree ' . 'plusminus twosuperior threesuperior Zcaron mu paragraph ' . 'periodcentered zcaron onesuperior ordmasculine guillemotright ' . 'OE oe Ydieresis questiondown Agrave Aacute ' . 'Acircumflex Atilde Adieresis Aring AE Ccedilla Egrave Eacute ' . 'Ecircumflex Edieresis Igrave Iacute Icircumflex Idieresis Eth Ntilde ' . 'Ograve Oacute Ocircumflex Otilde Odieresis multiply Oslash Ugrave ' . 'Uacute Ucircumflex Udieresis Yacute Thorn germandbls agrave aacute ' . 'acircumflex atilde adieresis aring ae ccedilla egrave eacute ' . 'ecircumflex edieresis igrave iacute icircumflex idieresis eth ntilde ' . 'ograve oacute ocircumflex otilde odieresis divide oslash ugrave ' . 'uacute ucircumflex udieresis yacute thorn ydieresis'; return explode(' ', $encoding); } } pdfparser-0.9.25/src/Smalot/PdfParser/Encoding/MacRomanEncoding.php000066400000000000000000000071411257674555500251440ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ // Source : http://www.opensource.apple.com/source/vim/vim-34/vim/runtime/print/mac-roman.ps namespace Smalot\PdfParser\Encoding; /** * Class MacRomanEncoding * * @package Smalot\PdfParser\Encoding */ class MacRomanEncoding { public function getTranslations() { $encoding = '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . 'space exclam quotedbl numbersign dollar percent ampersand quotesingle ' . 'parenleft parenright asterisk plus comma minus period slash ' . 'zero one two three four five six seven ' . 'eight nine colon semicolon less equal greater question ' . 'at A B C D E F G ' . 'H I J K L M N O ' . 'P Q R S T U V W ' . 'X Y Z bracketleft backslash bracketright asciicircum underscore ' . 'grave a b c d e f g ' . 'h i j k l m n o ' . 'p q r s t u v w ' . 'x y z braceleft bar braceright asciitilde .notdef ' . 'Adieresis Aring Ccedilla Eacute Ntilde Odieresis Udieresis aacute ' . 'agrave acircumflex adieresis atilde aring ccedilla eacute egrave ' . 'ecircumflex edieresis iacute igrave icircumflex idieresis ntilde oacute ' . 'ograve ocircumflex odieresis otilde uacute ugrave ucircumflex udieresis ' . 'dagger degree cent sterling section bullet paragraph germandbls ' . 'registered copyright trademark acute dieresis notequal AE Oslash ' . 'infinity plusminus lessequal greaterequal yen mu partialdiff summation ' . 'Pi pi integral ordfeminine ordmasculine Omega ae oslash ' . 'questiondown exclamdown logicalnot radical florin approxequal delta guillemotleft ' . 'guillemotright ellipsis space Agrave Atilde Otilde OE oe ' . 'endash emdash quotedblleft quotedblright quoteleft quoteright divide lozenge ' . 'ydieresis Ydieresis fraction currency guilsinglleft guilsinglright fi fl ' . 'daggerdbl periodcentered quotesinglbase quotedblbase perthousand Acircumflex Ecircumflex Aacute ' . 'Edieresis Egrave Iacute Icircumflex Idieresis Igrave Oacute Ocircumflex ' . 'heart Ograve Uacute Ucircumflex Ugrave dotlessi circumflex tilde ' . 'macron breve dotaccent ring cedilla hungarumlaut ogonek caron'; return explode(' ', $encoding); } } pdfparser-0.9.25/src/Smalot/PdfParser/Encoding/StandardEncoding.php000066400000000000000000000070051257674555500252060ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ // Source : http://cpansearch.perl.org/src/JV/PostScript-Font-1.10.02/lib/PostScript/StandardEncoding.pm namespace Smalot\PdfParser\Encoding; /** * Class StandardEncoding * * @package Smalot\PdfParser\Encoding */ class StandardEncoding { public function getTranslations() { $encoding = '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . 'space exclam quotedbl numbersign dollar percent ampersand quoteright ' . 'parenleft parenright asterisk plus comma hyphen period slash zero ' . 'one two three four five six seven eight nine colon semicolon less ' . 'equal greater question at A B C D E F G H I J K L M N O P Q R S T U ' . 'V W X Y Z bracketleft backslash bracketright asciicircum underscore ' . 'quoteleft a b c d e f g h i j k l m n o p q r s t u v w x y z ' . 'braceleft bar braceright asciitilde .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef exclamdown cent ' . 'sterling fraction yen florin section currency quotesingle ' . 'quotedblleft guillemotleft guilsinglleft guilsinglright fi fl ' . '.notdef endash dagger daggerdbl periodcentered .notdef paragraph ' . 'bullet quotesinglbase quotedblbase quotedblright guillemotright ' . 'ellipsis perthousand .notdef questiondown .notdef grave acute ' . 'circumflex tilde macron breve dotaccent dieresis .notdef ring ' . 'cedilla .notdef hungarumlaut ogonek caron emdash .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef AE .notdef ' . 'ordfeminine .notdef .notdef .notdef .notdef Lslash Oslash OE ' . 'ordmasculine .notdef .notdef .notdef .notdef .notdef ae .notdef ' . '.notdef .notdef dotlessi .notdef .notdef lslash oslash oe germandbls ' . '.notdef .notdef .notdef .notdef'; return explode(' ', $encoding); } } pdfparser-0.9.25/src/Smalot/PdfParser/Encoding/WinAnsiEncoding.php000066400000000000000000000070621257674555500250210ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ // Source : http://cpansearch.perl.org/src/JV/PostScript-Font-1.10.02/lib/PostScript/WinANSIEncoding.pm namespace Smalot\PdfParser\Encoding; /** * Class WinAnsiEncoding * * @package Smalot\PdfParser\Encoding */ class WinAnsiEncoding { public function getTranslations() { $encoding = '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . '.notdef .notdef .notdef .notdef .notdef .notdef .notdef .notdef ' . 'space exclam quotedbl numbersign dollar percent ampersand quotesingle ' . 'parenleft parenright asterisk plus comma hyphen period slash zero one ' . 'two three four five six seven eight nine colon semicolon less equal ' . 'greater question at A B C D E F G H I J K L M N O P Q R S T U V W X ' . 'Y Z bracketleft backslash bracketright asciicircum underscore ' . 'grave a b c d e f g h i j k l m n o p q r s t u v w x y z ' . 'braceleft bar braceright asciitilde bullet Euro bullet quotesinglbase ' . 'florin quotedblbase ellipsis dagger daggerdbl circumflex perthousand ' . 'Scaron guilsinglleft OE bullet Zcaron bullet bullet quoteleft quoteright ' . 'quotedblleft quotedblright bullet endash emdash tilde trademark scaron ' . 'guilsinglright oe bullet zcaron Ydieresis space exclamdown cent ' . 'sterling currency yen brokenbar section dieresis copyright ' . 'ordfeminine guillemotleft logicalnot hyphen registered macron degree ' . 'plusminus twosuperior threesuperior acute mu paragraph ' . 'periodcentered cedilla onesuperior ordmasculine guillemotright ' . 'onequarter onehalf threequarters questiondown Agrave Aacute ' . 'Acircumflex Atilde Adieresis Aring AE Ccedilla Egrave Eacute ' . 'Ecircumflex Edieresis Igrave Iacute Icircumflex Idieresis Eth Ntilde ' . 'Ograve Oacute Ocircumflex Otilde Odieresis multiply Oslash Ugrave ' . 'Uacute Ucircumflex Udieresis Yacute Thorn germandbls agrave aacute ' . 'acircumflex atilde adieresis aring ae ccedilla egrave eacute ' . 'ecircumflex edieresis igrave iacute icircumflex idieresis eth ntilde ' . 'ograve oacute ocircumflex otilde odieresis divide oslash ugrave ' . 'uacute ucircumflex udieresis yacute thorn ydieresis'; return explode(' ', $encoding); } } pdfparser-0.9.25/src/Smalot/PdfParser/Font.php000066400000000000000000000360271257674555500211650ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser; /** * Class Font * * @package Smalot\PdfParser */ class Font extends Object { /** * */ const MISSING = '?'; /** * @var array */ protected $table = null; /** * @var array */ protected $tableSizes = null; /** * */ public function init() { // Load translate table. $this->loadTranslateTable(); } /** * @return string */ public function getName() { return $this->has('BaseFont') ? (string)$this->get('BaseFont') : '[Unknown]'; } /** * @return string */ public function getType() { return (string)$this->header->get('Subtype'); } /** * @return array */ public function getDetails($deep = true) { $details = array(); $details['Name'] = $this->getName(); $details['Type'] = $this->getType(); $details['Encoding'] = ($this->has('Encoding') ? (string)$this->get('Encoding') : 'Ansi'); $details += parent::getDetails($deep); return $details; } /** * @param string $char * @param bool $use_default * * @return string */ public function translateChar($char, $use_default = true) { $dec = hexdec(bin2hex($char)); if (array_key_exists($dec, $this->table)) { $char = $this->table[$dec]; } else { $char = ($use_default ? self::MISSING : $char); } return $char; } /** * @param int $code * * @return string */ public static function uchr($code) { return html_entity_decode('&#' . ((int)$code) . ';', ENT_NOQUOTES, 'UTF-8'); } /** * @return array */ public function loadTranslateTable() { if (!is_null($this->table)) { return $this->table; } $this->table = array(); $this->tableSizes = array( 'from' => 1, 'to' => 1, ); if ($this->has('ToUnicode')) { $content = $this->get('ToUnicode')->getContent(); $matches = array(); // Support for multiple spacerange sections if (preg_match_all('/begincodespacerange(?P.*?)endcodespacerange/s', $content, $matches)) { foreach ($matches['sections'] as $section) { $regexp = '/<(?P[0-9A-F]+)> *<(?P[0-9A-F]+)>[ \r\n]+/is'; preg_match_all($regexp, $section, $matches); $this->tableSizes = array( 'from' => max(1, strlen(current($matches['from'])) / 2), 'to' => max(1, strlen(current($matches['to'])) / 2), ); break; } } // Support for multiple bfchar sections if (preg_match_all('/beginbfchar(?P.*?)endbfchar/s', $content, $matches)) { foreach ($matches['sections'] as $section) { $regexp = '/<(?P[0-9A-F]+)> +<(?P[0-9A-F]+)>[ \r\n]+/is'; preg_match_all($regexp, $section, $matches); $this->tableSizes['from'] = max(1, strlen(current($matches['from'])) / 2); foreach ($matches['from'] as $key => $from) { $parts = preg_split( '/([0-9A-F]{4})/i', $matches['to'][$key], 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE ); $text = ''; foreach ($parts as $part) { $text .= self::uchr(hexdec($part)); } $this->table[hexdec($from)] = $text; } } } // Support for multiple bfrange sections if (preg_match_all('/beginbfrange(?P.*?)endbfrange/s', $content, $matches)) { foreach ($matches['sections'] as $section) { // Support for : $regexp = '/<(?P[0-9A-F]+)> *<(?P[0-9A-F]+)> *<(?P[0-9A-F]+)>[ \r\n]+/is'; preg_match_all($regexp, $section, $matches); foreach ($matches['from'] as $key => $from) { $char_from = hexdec($from); $char_to = hexdec($matches['to'][$key]); $offset = hexdec($matches['offset'][$key]); for ($char = $char_from; $char <= $char_to; $char++) { $this->table[$char] = self::uchr($char - $char_from + $offset); } } // Support for : [ ... ] $regexp = '/<(?P[0-9A-F]+)> *<(?P[0-9A-F]+)> *\[(?P[<>0-9A-F ]+)\][ \r\n]+/is'; preg_match_all($regexp, $section, $matches); foreach ($matches['from'] as $key => $from) { $char_from = hexdec($from); $strings = array(); preg_match_all('/<(?P[0-9A-F]+)> */is', $matches['strings'][$key], $strings); foreach ($strings['string'] as $position => $string) { $parts = preg_split( '/([0-9A-F]{4})/i', $string, 0, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE ); $text = ''; foreach ($parts as $part) { $text .= self::uchr(hexdec($part)); } $this->table[$char_from + $position] = $text; } } } } } return $this->table; } /** * @param string $hexa * @param bool $add_braces * * @return string */ public static function decodeHexadecimal($hexa, $add_braces = false) { $text = ''; $parts = preg_split('/(<[a-z0-9]+>)/si', $hexa, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); foreach ($parts as $part) { if (preg_match('/^<.*>$/', $part) && strpos($part, ''); if ($add_braces) { $text .= '('; } $part = pack('H*', $part); $text .= ($add_braces ? preg_replace('/\\\/s', '\\\\\\', $part) : $part); if ($add_braces) { $text .= ')'; } } else { $text .= $part; } } return $text; } /** * @param string $text * * @return string */ public static function decodeOctal($text) { $parts = preg_split('/(\\\\\d{3})/s', $text, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); $text = ''; foreach ($parts as $part) { if (preg_match('/^\\\\\d{3}$/', $part)) { $text .= chr(octdec(trim($part, '\\'))); } else { $text .= $part; } } return $text; } /** * @param $text * * @return string */ public static function decodeEntities($text) { $parts = preg_split('/(#\d{2})/s', $text, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE); $text = ''; foreach ($parts as $part) { if (preg_match('/^#\d{2}$/', $part)) { $text .= chr(hexdec(trim($part, '#'))); } else { $text .= $part; } } return $text; } /** * @param string $text * * @return string */ public static function decodeUnicode($text) { if (preg_match('/^\xFE\xFF/i', $text)) { // Strip U+FEFF byte order marker. $decode = substr($text, 2); $text = ''; $length = strlen($decode); for ($i = 0; $i < $length; $i += 2) { $text .= self::uchr(hexdec(bin2hex(substr($decode, $i, 2)))); } } return $text; } /** * @return int */ protected function getFontSpaceLimit() { return -50; } /** * @param array $commands * * @return string */ public function decodeText($commands) { $word_position = 0; $words = array(); $unicode = false; $font_space = $this->getFontSpaceLimit(); foreach ($commands as $command) { switch ($command[Object::TYPE]) { case 'n': if (floatval(trim($command[Object::COMMAND])) < $font_space) { $word_position = count($words); } continue(2); case '<': // Decode hexadecimal. $text = self::decodeHexadecimal('<' . $command[Object::COMMAND] . '>'); $unicode = true; break; default: // Decode octal (if necessary). $text = self::decodeOctal($command[Object::COMMAND]); } // replace escaped chars $text = str_replace( array('\\\\', '\(', '\)', '\n', '\r', '\t', '\ '), array('\\', '(', ')', "\n", "\r", "\t", ' '), $text ); // add content to result string if (isset($words[$word_position])) { $words[$word_position] .= $text; } else { $words[$word_position] = $text; } } foreach ($words as &$word) { $loop_unicode = $unicode; $word = $this->decodeContent($word, $loop_unicode); } return implode(' ', $words); } /** * @param string $text * @param bool $unicode * * @return string */ protected function decodeContent($text, &$unicode) { if ($this->has('ToUnicode')) { $bytes = $this->tableSizes['from']; if ($bytes) { $result = ''; $length = strlen($text); for ($i = 0; $i < $length; $i += $bytes) { $char = substr($text, $i, $bytes); if (($decoded = $this->translateChar($char, false)) !== false) { $char = $decoded; } elseif ($this->has('DescendantFonts')) { if ($this->get('DescendantFonts') instanceof Object) { $fonts = $this->get('DescendantFonts')->getHeader()->getElements(); } else { $fonts = $this->get('DescendantFonts')->getContent(); } $decoded = false; foreach ($fonts as $font) { if ($font instanceof Font) { if (($decoded = $font->translateChar($char, false)) !== false) { $decoded = @iconv('Windows-1252', 'UTF-8//TRANSLIT//IGNORE', $decoded); break; } } } if ($decoded !== false) { $char = $decoded; } else { $char = @iconv('Windows-1252', 'UTF-8//TRANSLIT//IGNORE', $char); } } else { $char = self::MISSING; } $result .= $char; } $text = $result; // By definition, this code generates unicode chars. $unicode = true; } } elseif ($this->has('Encoding')) { /** @var Encoding $encoding */ $encoding = $this->get('Encoding'); if ($encoding instanceof Encoding) { if ($unicode) { $chars = preg_split( '//s' . ($unicode ? 'u' : ''), $text, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY ); $result = ''; foreach ($chars as $char) { $dec_av = hexdec(bin2hex($char)); $dec_ap = $encoding->translateChar($dec_av); $result .= self::uchr($dec_ap); } $text = $result; } else { $result = ''; $length = strlen($text); for ($i = 0; $i < $length; $i++) { $dec_av = hexdec(bin2hex($text[$i])); $dec_ap = $encoding->translateChar($dec_av); $result .= chr($dec_ap); } $text = $result; if ($encoding->get('BaseEncoding')->equals('MacRomanEncoding')) { $text = @iconv('Mac', 'UTF-8//TRANSLIT//IGNORE', $text); return $text; } } } } // Convert to unicode if not already done. if (!$unicode) { if ($this->get('Encoding') instanceof Element && $this->get('Encoding')->equals('MacRomanEncoding') ) { $text = @iconv('Mac', 'UTF-8//TRANSLIT//IGNORE', $text); } else { $text = @iconv('Windows-1252', 'UTF-8//TRANSLIT//IGNORE', $text); } } return $text; } } pdfparser-0.9.25/src/Smalot/PdfParser/Font/000077500000000000000000000000001257674555500204445ustar00rootroot00000000000000pdfparser-0.9.25/src/Smalot/PdfParser/Font/FontCIDFontType0.php000066400000000000000000000023051257674555500241540ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Font; use Smalot\PdfParser\Font; /** * Class FontCIDFontType0 * * @package Smalot\PdfParser\Font */ class FontCIDFontType0 extends Font { } pdfparser-0.9.25/src/Smalot/PdfParser/Font/FontCIDFontType2.php000066400000000000000000000023051257674555500241560ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Font; use Smalot\PdfParser\Font; /** * Class FontCIDFontType2 * * @package Smalot\PdfParser\Font */ class FontCIDFontType2 extends Font { } pdfparser-0.9.25/src/Smalot/PdfParser/Font/FontTrueType.php000066400000000000000000000022751257674555500235730ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Font; use Smalot\PdfParser\Font; /** * Class FontTrueType * * @package Smalot\PdfParser\Font */ class FontTrueType extends Font { } pdfparser-0.9.25/src/Smalot/PdfParser/Font/FontType0.php000066400000000000000000000022671257674555500230140ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Font; use Smalot\PdfParser\Font; /** * Class FontType0 * * @package Smalot\PdfParser\Font */ class FontType0 extends Font { } pdfparser-0.9.25/src/Smalot/PdfParser/Font/FontType1.php000066400000000000000000000022671257674555500230150ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Font; use Smalot\PdfParser\Font; /** * Class FontType1 * * @package Smalot\PdfParser\Font */ class FontType1 extends Font { } pdfparser-0.9.25/src/Smalot/PdfParser/Header.php000066400000000000000000000123751257674555500214470ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser; use Smalot\PdfParser\Element\ElementArray; use Smalot\PdfParser\Element\ElementMissing; use Smalot\PdfParser\Element\ElementStruct; use Smalot\PdfParser\Element\ElementXRef; /** * Class Header * * @package Smalot\PdfParser */ class Header { /** * @var Document */ protected $document = null; /** * @var Element[] */ protected $elements = null; /** * @param Element[] $elements List of elements. * @param Document $document Document. */ public function __construct($elements = array(), Document $document = null) { $this->elements = $elements; $this->document = $document; } /** * Returns all elements. * * @return mixed */ public function getElements() { foreach ($this->elements as $name => $element) { $this->resolveXRef($name); } return $this->elements; } /** * Used only for debug. * * @return array */ public function getElementTypes() { $types = array(); foreach ($this->elements as $key => $element) { $types[$key] = get_class($element); } return $types; } /** * @param bool $deep * * @return array */ public function getDetails($deep = true) { $values = array(); $elements = $this->getElements(); foreach ($elements as $key => $element) { if ($element instanceof Header && $deep) { $values[$key] = $element->getDetails($deep); } elseif ($element instanceof Object && $deep) { $values[$key] = $element->getDetails(false); } elseif ($element instanceof ElementArray) { if ($deep) { $values[$key] = $element->getDetails(); } } elseif ($element instanceof Element) { $values[$key] = (string) $element; } } return $values; } /** * Indicate if an element name is available in header. * * @param string $name The name of the element * * @return bool */ public function has($name) { if (array_key_exists($name, $this->elements)) { return true; } else { return false; } } /** * @param string $name * * @return Element|Object */ public function get($name) { if (array_key_exists($name, $this->elements)) { return $this->resolveXRef($name); } return new ElementMissing(null, null); } /** * Resolve XRef to object. * * @param string $name * * @return Element|Object * @throws \Exception */ protected function resolveXRef($name) { if (($obj = $this->elements[$name]) instanceof ElementXRef && !is_null($this->document)) { /** @var ElementXRef $obj */ $object = $this->document->getObjectById($obj->getId()); if (is_null($object)) { throw new \Exception('Missing object reference #' . $obj->getId() . '.'); } // Update elements list for future calls. $this->elements[$name] = $object; } return $this->elements[$name]; } /** * @param string $content The content to parse * @param Document $document The document * @param int $position The new position of the cursor after parsing * * @return Header */ public static function parse($content, Document $document, &$position = 0) { /** @var Header $header */ if (substr(trim($content), 0, 2) == '<<') { $header = ElementStruct::parse($content, $document, $position); } else { $elements = ElementArray::parse($content, $document, $position); if ($elements) { $header = new self($elements->getRawContent(), null);//$document); } else { $header = new self(array(), $document); } } if ($header) { return $header; } else { // Build an empty header. return new self(array(), $document); } } } pdfparser-0.9.25/src/Smalot/PdfParser/Object.php000066400000000000000000000476111257674555500214660ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser; use Smalot\PdfParser\XObject\Form; use Smalot\PdfParser\XObject\Image; /** * Class Object * * @package Smalot\PdfParser */ class Object { const TYPE = 't'; const OPERATOR = 'o'; const COMMAND = 'c'; /** * The recursion stack. * * @var array */ static $recursionStack = array(); /** * @var Document */ protected $document = null; /** * @var Header */ protected $header = null; /** * @var string */ protected $content = null; /** * @param Document $document * @param Header $header * @param string $content */ public function __construct(Document $document, Header $header = null, $content = null) { $this->document = $document; $this->header = !is_null($header) ? $header : new Header(); $this->content = $content; } /** * */ public function init() { } /** * @return null|Header */ public function getHeader() { return $this->header; } /** * @param string $name * * @return Element|Object */ public function get($name) { return $this->header->get($name); } /** * @param $name * * @return bool */ public function has($name) { return $this->header->has($name); } /** * @param bool $deep * * @return array */ public function getDetails($deep = true) { return $this->header->getDetails($deep); } /** * @return null|string */ public function getContent() { return $this->content; } /** * @param $content */ public function cleanContent($content, $char = 'X') { $char = $char[0]; $content = str_replace(array('\\\\', '\\)', '\\('), $char . $char, $content); // Remove image bloc with binary content preg_match_all('/\s(BI\s.*?(\sID\s).*?(\sEI))\s/s', $content, $matches, PREG_OFFSET_CAPTURE); foreach ($matches[0] as $part) { $content = substr_replace($content, str_repeat($char, strlen($part[0])), $part[1], strlen($part[0])); } // Clean content in square brackets [.....] preg_match_all('/\[((\(.*?\)|[0-9\.\-\s]*)*)\]/s', $content, $matches, PREG_OFFSET_CAPTURE); foreach ($matches[1] as $part) { $content = substr_replace($content, str_repeat($char, strlen($part[0])), $part[1], strlen($part[0])); } // Clean content in round brackets (.....) preg_match_all('/\((.*?)\)/s', $content, $matches, PREG_OFFSET_CAPTURE); foreach ($matches[1] as $part) { $content = substr_replace($content, str_repeat($char, strlen($part[0])), $part[1], strlen($part[0])); } // Clean structure if ($parts = preg_split('/(<|>)/s', $content, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE)) { $content = ''; $level = 0; foreach ($parts as $part) { if ($part == '<') { $level++; } $content .= ($level == 0 ? $part : str_repeat($char, strlen($part))); if ($part == '>') { $level--; } } } // Clean BDC and EMC markup preg_match_all( '/(\/[A-Za-z0-9\_]*\s*' . preg_quote($char) . '*BDC)/s', $content, $matches, PREG_OFFSET_CAPTURE ); foreach ($matches[1] as $part) { $content = substr_replace($content, str_repeat($char, strlen($part[0])), $part[1], strlen($part[0])); } preg_match_all('/\s(EMC)\s/s', $content, $matches, PREG_OFFSET_CAPTURE); foreach ($matches[1] as $part) { $content = substr_replace($content, str_repeat($char, strlen($part[0])), $part[1], strlen($part[0])); } return $content; } /** * @param $content * * @return array */ public function getSectionsText($content) { $sections = array(); $content = ' ' . $content . ' '; $textCleaned = $this->cleanContent($content, '_'); // Extract text blocks. if (preg_match_all('/\s+BT[\s|\(|\[]+(.*?)\s*ET/s', $textCleaned, $matches, PREG_OFFSET_CAPTURE)) { foreach ($matches[1] as $part) { $text = $part[0]; if ($text === '') { continue; } $offset = $part[1]; $section = substr($content, $offset, strlen($text)); // Removes BDC and EMC markup. $section = preg_replace('/(\/[A-Za-z0-9]+\s*<<.*?)(>>\s*BDC)(.*?)(EMC\s+)/s', '${3}', $section . ' '); $sections[] = $section; } } // Extract 'do' commands. if (preg_match_all('/(\/[A-Za-z0-9\.\-_]+\s+Do)\s/s', $textCleaned, $matches, PREG_OFFSET_CAPTURE)) { foreach ($matches[1] as $part) { $text = $part[0]; $offset = $part[1]; $section = substr($content, $offset, strlen($text)); $sections[] = $section; } } return $sections; } /** * @param Page * * @return string * @throws \Exception */ public function getText(Page $page = null) { $text = ''; $sections = $this->getSectionsText($this->content); $current_font = new Font($this->document); $current_position_td = array('x' => false, 'y' => false); $current_position_tm = array('x' => false, 'y' => false); array_push(self::$recursionStack, $this->getUniqueId()); foreach ($sections as $section) { $commands = $this->getCommandsText($section); foreach ($commands as $command) { switch ($command[self::OPERATOR]) { // set character spacing case 'Tc': break; // move text current point case 'Td': $args = preg_split('/\s/s', $command[self::COMMAND]); $y = array_pop($args); $x = array_pop($args); if ((floatval($x) <= 0) || ($current_position_td['y'] !== false && floatval($y) < floatval($current_position_td['y'])) ) { // vertical offset $text .= "\n"; } elseif ($current_position_td['x'] !== false && floatval($x) > floatval( $current_position_td['x'] ) ) { // horizontal offset $text .= ' '; } $current_position_td = array('x' => $x, 'y' => $y); break; // move text current point and set leading case 'TD': $args = preg_split('/\s/s', $command[self::COMMAND]); $y = array_pop($args); $x = array_pop($args); if (floatval($y) < 0) { $text .= "\n"; } elseif (floatval($x) <= 0) { $text .= ' '; } break; case 'Tf': list($id,) = preg_split('/\s/s', $command[self::COMMAND]); $id = trim($id, '/'); $current_font = $page->getFont($id); break; case "'": case 'Tj': $command[self::COMMAND] = array($command); case 'TJ': // Skip if not previously defined, should never happened. if (is_null($current_font)) { // Fallback // TODO : Improve $text .= $command[self::COMMAND][0][self::COMMAND]; continue; } $sub_text = $current_font->decodeText($command[self::COMMAND]); $text .= $sub_text; break; // set leading case 'TL': $text .= ' '; break; case 'Tm': $args = preg_split('/\s/s', $command[self::COMMAND]); $y = array_pop($args); $x = array_pop($args); if ($current_position_tm['y'] !== false) { $delta = abs(floatval($y) - floatval($current_position_tm['y'])); if ($delta > 10) { $text .= "\n"; } } $current_position_tm = array('x' => $x, 'y' => $y); break; // set super/subscripting text rise case 'Ts': break; // set word spacing case 'Tw': break; // set horizontal scaling case 'Tz': $text .= "\n"; break; // move to start of next line case 'T*': $text .= "\n"; break; case 'Da': break; case 'Do': if (!is_null($page)) { $args = preg_split('/\s/s', $command[self::COMMAND]); $id = trim(array_pop($args), '/ '); $xobject = $page->getXObject($id); if ( is_object($xobject) && !in_array($xobject->getUniqueId(), self::$recursionStack) ) { // Not a circular reference. $text .= $xobject->getText($page); } } break; case 'rg': case 'RG': break; case 're': break; case 'co': break; case 'cs': break; case 'gs': break; case 'en': break; case 'sc': case 'SC': break; case 'g': case 'G': break; case 'V': break; case 'vo': case 'Vo': break; default: } } } array_pop(self::$recursionStack); return $text . ' '; } /** * @param string $text_part * @param int $offset * * @return array */ public function getCommandsText($text_part, &$offset = 0) { $commands = $matches = array(); while ($offset < strlen($text_part)) { $offset += strspn($text_part, "\x00\x09\x0a\x0c\x0d\x20", $offset); $char = $text_part[$offset]; $operator = ''; $type = ''; $command = false; switch ($char) { case '/': $type = $char; if (preg_match( '/^\/([A-Z0-9\._,\+]+\s+[0-9.\-]+)\s+([A-Z]+)\s*/si', substr($text_part, $offset), $matches ) ) { $operator = $matches[2]; $command = $matches[1]; $offset += strlen($matches[0]); } elseif (preg_match( '/^\/([A-Z0-9\._,\+]+)\s+([A-Z]+)\s*/si', substr($text_part, $offset), $matches ) ) { $operator = $matches[2]; $command = $matches[1]; $offset += strlen($matches[0]); } break; case '[': case ']': // array object $type = $char; if ($char == '[') { ++$offset; // get elements $command = $this->getCommandsText($text_part, $offset); if (preg_match('/^\s*[A-Z]{1,2}\s*/si', substr($text_part, $offset), $matches)) { $operator = trim($matches[0]); $offset += strlen($matches[0]); } } else { ++$offset; break; } break; case '<': case '>': // array object $type = $char; ++$offset; if ($char == '<') { $strpos = strpos($text_part, '>', $offset); $command = substr($text_part, $offset, ($strpos - $offset)); $offset = $strpos + 1; } if (preg_match('/^\s*[A-Z]{1,2}\s*/si', substr($text_part, $offset), $matches)) { $operator = trim($matches[0]); $offset += strlen($matches[0]); } break; case '(': case ')': ++$offset; $type = $char; $strpos = $offset; if ($char == '(') { $open_bracket = 1; while ($open_bracket > 0) { if (!isset($text_part[$strpos])) { break; } $ch = $text_part[$strpos]; switch ($ch) { case '\\': { // REVERSE SOLIDUS (5Ch) (Backslash) // skip next character ++$strpos; break; } case '(': { // LEFT PARENHESIS (28h) ++$open_bracket; break; } case ')': { // RIGHT PARENTHESIS (29h) --$open_bracket; break; } } ++$strpos; } $command = substr($text_part, $offset, ($strpos - $offset - 1)); $offset = $strpos; if (preg_match('/^\s*([A-Z\']{1,2})\s*/si', substr($text_part, $offset), $matches)) { $operator = $matches[1]; $offset += strlen($matches[0]); } } break; default: if (substr($text_part, $offset, 2) == 'ET') { break; } elseif (preg_match( '/^\s*(?P([0-9\.\-]+\s*?)+)\s+(?P[A-Z]{1,3})\s*/si', substr($text_part, $offset), $matches ) ) { $operator = trim($matches['id']); $command = trim($matches['data']); $offset += strlen($matches[0]); } elseif (preg_match('/^\s*([0-9\.\-]+\s*?)+\s*/si', substr($text_part, $offset), $matches)) { $type = 'n'; $command = trim($matches[0]); $offset += strlen($matches[0]); } elseif (preg_match('/^\s*([A-Z\*]+)\s*/si', substr($text_part, $offset), $matches)) { $type = ''; $operator = $matches[1]; $command = ''; $offset += strlen($matches[0]); } } if ($command !== false) { $commands[] = array( self::TYPE => $type, self::OPERATOR => $operator, self::COMMAND => $command, ); } else { break; } } return $commands; } /** * @param $document Document * @param $header Header * @param $content string * * @return Object */ public static function factory(Document $document, Header $header, $content) { switch ($header->get('Type')->getContent()) { case 'XObject': switch ($header->get('Subtype')->getContent()) { case 'Image': return new Image($document, $header, $content); case 'Form': return new Form($document, $header, $content); default: return new Object($document, $header, $content); } break; case 'Pages': return new Pages($document, $header, $content); case 'Page': return new Page($document, $header, $content); case 'Encoding': return new Encoding($document, $header, $content); case 'Font': $subtype = $header->get('Subtype')->getContent(); $classname = '\Smalot\PdfParser\Font\Font' . $subtype; if (class_exists($classname)) { return new $classname($document, $header, $content); } else { return new Font($document, $header, $content); } default: return new Object($document, $header, $content); } } /** * Returns unique id identifying the object. * * @return string */ protected function getUniqueId() { return spl_object_hash($this); } } pdfparser-0.9.25/src/Smalot/PdfParser/Page.php000066400000000000000000000135551257674555500211340ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser; use Smalot\PdfParser\Element\ElementArray; use Smalot\PdfParser\Element\ElementMissing; use Smalot\PdfParser\Element\ElementXRef; /** * Class Page * * @package Smalot\PdfParser */ class Page extends Object { /** * @var Font[] */ protected $fonts = null; /** * @var Object[] */ protected $xobjects = null; /** * @return Font[] */ public function getFonts() { if (!is_null($this->fonts)) { return $this->fonts; } $resources = $this->get('Resources'); if (method_exists($resources, 'has') && $resources->has('Font')) { if ($resources->get('Font') instanceof Header) { $fonts = $resources->get('Font')->getElements(); } else { $fonts = $resources->get('Font')->getHeader()->getElements(); } $table = array(); foreach ($fonts as $id => $font) { if ($font instanceof Font) { $table[$id] = $font; // Store too on cleaned id value (only numeric) $id = preg_replace('/[^0-9\.\-_]/', '', $id); if ($id != '') { $table[$id] = $font; } } } return ($this->fonts = $table); } else { return array(); } } /** * @param string $id * * @return Font */ public function getFont($id) { $fonts = $this->getFonts(); if (isset($fonts[$id])) { return $fonts[$id]; } else { $id = preg_replace('/[^0-9\.\-_]/', '', $id); if (isset($fonts[$id])) { return $fonts[$id]; } else { return null; } } } /** * Support for XObject * * @return Object[] */ public function getXObjects() { if (!is_null($this->xobjects)) { return $this->xobjects; } $resources = $this->get('Resources'); if (method_exists($resources, 'has') && $resources->has('XObject')) { if ($resources->get('XObject') instanceof Header) { $xobjects = $resources->get('XObject')->getElements(); } else { $xobjects = $resources->get('XObject')->getHeader()->getElements(); } $table = array(); foreach ($xobjects as $id => $xobject) { $table[$id] = $xobject; // Store too on cleaned id value (only numeric) $id = preg_replace('/[^0-9\.\-_]/', '', $id); if ($id != '') { $table[$id] = $xobject; } } return ($this->xobjects = $table); } else { return array(); } } /** * @param string $id * * @return Object */ public function getXObject($id) { $xobjects = $this->getXObjects(); if (isset($xobjects[$id])) { return $xobjects[$id]; } else { return null; /*$id = preg_replace('/[^0-9\.\-_]/', '', $id); if (isset($xobjects[$id])) { return $xobjects[$id]; } else { return null; }*/ } } /** * @param Page * * @return string */ public function getText(Page $page = null) { if ($contents = $this->get('Contents')) { if ($contents instanceof ElementMissing) { return ''; } elseif ($contents instanceof Object) { $elements = $contents->getHeader()->getElements(); if (is_numeric(key($elements))) { $new_content = ''; foreach ($elements as $element) { if ($element instanceof ElementXRef) { $new_content .= $element->getObject()->getContent(); } else { $new_content .= $element->getContent(); } } $header = new Header(array(), $this->document); $contents = new Object($this->document, $header, $new_content); } } elseif ($contents instanceof ElementArray) { // Create a virtual global content. $new_content = ''; foreach ($contents->getContent() as $content) { $new_content .= $content->getContent() . "\n"; } $header = new Header(array(), $this->document); $contents = new Object($this->document, $header, $new_content); } return $contents->getText($this); } return ''; } } pdfparser-0.9.25/src/Smalot/PdfParser/Pages.php000066400000000000000000000035301257674555500213070ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser; /** * Class Pages * * @package Smalot\PdfParser */ class Pages extends Object { /** * @param bool $deep * * @return array */ public function getPages($deep = false) { if ($this->has('Kids')) { if (!$deep) { return $this->get('Kids')->getContent(); } else { $kids = $this->get('Kids')->getContent(); $pages = array(); foreach ($kids as $kid) { if ($kid instanceof Pages) { $pages = array_merge($pages, $kid->getPages(true)); } else { $pages[] = $kid; } } return $pages; } } return array(); } } pdfparser-0.9.25/src/Smalot/PdfParser/Parser.php000066400000000000000000000226561257674555500215160ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser; use Smalot\PdfParser\Element\ElementArray; use Smalot\PdfParser\Element\ElementBoolean; use Smalot\PdfParser\Element\ElementDate; use Smalot\PdfParser\Element\ElementHexa; use Smalot\PdfParser\Element\ElementName; use Smalot\PdfParser\Element\ElementNull; use Smalot\PdfParser\Element\ElementNumeric; use Smalot\PdfParser\Element\ElementString; use Smalot\PdfParser\Element\ElementXRef; /** * Class Parser * * @package Smalot\PdfParser */ class Parser { /** * @var Object[] */ protected $objects = array(); /** * */ public function __construct() { } /** * Parse PDF file * * @param string $filename * * @return Document */ public function parseFile($filename) { $content = file_get_contents($filename); return @$this->parseContent($content); } /** * Parse PDF content * * @param string $content * * @return Document */ public function parseContent($content) { // Create structure using TCPDF Parser. ob_start(); @$parser = new \TCPDF_PARSER(ltrim($content)); list($xref, $data) = $parser->getParsedData(); unset($parser); ob_end_clean(); if (isset($xref['trailer']['encrypt'])) { throw new \Exception('Secured pdf file are currently not supported.'); } if (empty($data)) { throw new \Exception('Object list not found. Possible secured file.'); } // Create destination object. $document = new Document(); $this->objects = array(); foreach ($data as $id => $structure) { $this->parseObject($id, $structure, $document); unset($data[$id]); } $document->setTrailer($this->parseTrailer($xref['trailer'], $document)); $document->setObjects($this->objects); return $document; } protected function parseTrailer($structure, $document) { $trailer = array(); foreach ($structure as $name => $values) { $name = ucfirst($name); if (is_numeric($values)) { $trailer[$name] = new ElementNumeric($values, $document); } elseif (is_array($values)) { $value = $this->parseTrailer($values, null); $trailer[$name] = new ElementArray($value, null); } elseif (strpos($values, '_') !== false) { $trailer[$name] = new ElementXRef($values, $document); } else { $trailer[$name] = $this->parseHeaderElement('(', $values, $document); } } return new Header($trailer, $document); } /** * @param string $id * @param array $structure * @param Document $document */ protected function parseObject($id, $structure, $document) { $header = new Header(array(), $document); $content = ''; foreach ($structure as $position => $part) { switch ($part[0]) { case '[': $elements = array(); foreach ($part[1] as $sub_element) { $sub_type = $sub_element[0]; $sub_value = $sub_element[1]; $elements[] = $this->parseHeaderElement($sub_type, $sub_value, $document); } $header = new Header($elements, $document); break; case '<<': $header = $this->parseHeader($part[1], $document); break; case 'stream': $content = isset($part[3][0]) ? $part[3][0] : $part[1]; if ($header->get('Type')->equals('ObjStm')) { $match = array(); // Split xrefs and contents. preg_match('/^((\d+\s+\d+\s*)*)(.*)$/s', $content, $match); $content = $match[3]; // Extract xrefs. $xrefs = preg_split( '/(\d+\s+\d+\s*)/s', $match[1], -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE ); $table = array(); foreach ($xrefs as $xref) { list($id, $position) = explode(' ', trim($xref)); $table[$position] = $id; } ksort($table); $ids = array_values($table); $positions = array_keys($table); foreach ($positions as $index => $position) { $id = $ids[$index] . '_0'; $next_position = isset($positions[$index + 1]) ? $positions[$index + 1] : strlen($content); $sub_content = substr($content, $position, $next_position - $position); $sub_header = Header::parse($sub_content, $document); $object = Object::factory($document, $sub_header, ''); $this->objects[$id] = $object; } // It is not necessary to store this content. $content = ''; return; } break; default: if ($part != 'null') { $element = $this->parseHeaderElement($part[0], $part[1], $document); if ($element) { $header = new Header(array($element), $document); } } break; } } if (!isset($this->objects[$id])) { $this->objects[$id] = Object::factory($document, $header, $content); } } /** * @param array $structure * @param Document $document * * @return Header * @throws \Exception */ protected function parseHeader($structure, $document) { $elements = array(); $count = count($structure); for ($position = 0; $position < $count; $position += 2) { $name = $structure[$position][1]; $type = $structure[$position + 1][0]; $value = $structure[$position + 1][1]; $elements[$name] = $this->parseHeaderElement($type, $value, $document); } return new Header($elements, $document); } /** * @param $type * @param $value * @param $document * * @return Element|Header * @throws \Exception */ protected function parseHeaderElement($type, $value, $document) { switch ($type) { case '<<': return $this->parseHeader($value, $document); case 'numeric': return new ElementNumeric($value, $document); case 'boolean': return new ElementBoolean($value, $document); case 'null': return new ElementNull($value, $document); case '(': if ($date = ElementDate::parse('(' . $value . ')', $document)) { return $date; } else { return ElementString::parse('(' . $value . ')', $document); } case '<': return $this->parseHeaderElement('(', ElementHexa::decode($value, $document), $document); case '/': return ElementName::parse('/' . $value, $document); case 'ojbref': // old mistake in tcpdf parser case 'objref': return new ElementXRef($value, $document); case '[': $values = array(); foreach ($value as $sub_element) { $sub_type = $sub_element[0]; $sub_value = $sub_element[1]; $values[] = $this->parseHeaderElement($sub_type, $sub_value, $document); } return new ElementArray($values, $document); case 'endstream': case '': // Nothing to do with. break; default: throw new \Exception('Invalid type: "' . $type . '".'); } } } pdfparser-0.9.25/src/Smalot/PdfParser/Tests/000077500000000000000000000000001257674555500206405ustar00rootroot00000000000000pdfparser-0.9.25/src/Smalot/PdfParser/Tests/Units/000077500000000000000000000000001257674555500217425ustar00rootroot00000000000000pdfparser-0.9.25/src/Smalot/PdfParser/Tests/Units/Document.php000066400000000000000000000204561257674555500242400ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Tests\Units; use mageekguy\atoum; /** * Class Document * * @package Smalot\PdfParser\Tests\Units */ class Document extends atoum\test { public function testSetObjects() { $document = new \Smalot\PdfParser\Document(); $object = new \Smalot\PdfParser\Object($document); // Obj #1 is missing $this->assert->variable($document->getObjectById(1))->isNull(); $document->setObjects(array(1 => $object)); // Obj #1 exists $this->assert->object($document->getObjectById(1))->isInstanceOf('\Smalot\PdfParser\Object'); $content = '<>'; $header = \Smalot\PdfParser\Header::parse($content, $document); $object = new \Smalot\PdfParser\Object($document, $header); $document->setObjects(array(2 => $object)); // Obj #1 is missing $this->assert->assert->variable($document->getObjectById(1))->isNull(); // Obj #2 exists $this->assert->object($document->getObjectById(2))->isInstanceOf('\Smalot\PdfParser\Object'); } public function testGetObjects() { $document = new \Smalot\PdfParser\Document(); $object1 = new \Smalot\PdfParser\Object($document); $content = '<>unparsed content'; $header = \Smalot\PdfParser\Header::parse($content, $document); $object2 = new \Smalot\PdfParser\Page($document, $header); $document->setObjects(array(1 => $object1, 2 => $object2)); $this->assert->integer(count($objects = $document->getObjects()))->isEqualTo(2); $this->assert->object($objects[1])->isInstanceOf('\Smalot\PdfParser\Object'); $this->assert->object($objects[2])->isInstanceOf('\Smalot\PdfParser\Object'); $this->assert->object($objects[2])->isInstanceOf('\Smalot\PdfParser\Page'); } public function testDictionary() { $document = new \Smalot\PdfParser\Document(); $this->assert->integer(count($objects = $document->getDictionary()))->isEqualTo(0); $object1 = new \Smalot\PdfParser\Object($document); $content = '<>'; $header = \Smalot\PdfParser\Header::parse($content, $document); $object2 = new \Smalot\PdfParser\Page($document, $header); $document->setObjects(array(1 => $object1, 2 => $object2)); $this->assert->integer(count($objects = $document->getDictionary()))->isEqualTo(1); $this->assert->integer(count($objects['Page']))->isEqualTo(1); $this->assert->integer($objects['Page'][2])->isEqualTo(2); } public function testGetObjectsByType() { $document = new \Smalot\PdfParser\Document(); $object1 = new \Smalot\PdfParser\Object($document); $content = '<>'; $header = \Smalot\PdfParser\Header::parse($content, $document); $object2 = new \Smalot\PdfParser\Page($document, $header); $document->setObjects(array(1 => $object1, 2 => $object2)); $this->assert->integer(count($objects = $document->getObjectsByType('Page')))->isEqualTo(1); $this->assert->object($objects[2])->isInstanceOf('\Smalot\PdfParser\Object'); $this->assert->object($objects[2])->isInstanceOf('\Smalot\PdfParser\Page'); } public function testGetPages() { // Missing catalog $document = new \Smalot\PdfParser\Document(); try { $pages = $document->getPages(); $this->assert->boolean($pages)->isEqualTo(false); } catch (\Exception $e) { $this->assert->object($e)->isInstanceOf('\Exception'); } // Listing pages from type Page $content = '<>'; $header = \Smalot\PdfParser\Header::parse($content, $document); $object1 = new \Smalot\PdfParser\Page($document, $header); $header = \Smalot\PdfParser\Header::parse($content, $document); $object2 = new \Smalot\PdfParser\Page($document, $header); $document->setObjects(array(1 => $object1, 2 => $object2)); $pages = $document->getPages(); $this->assert->integer(count($pages))->isEqualTo(2); $this->assert->object($pages[0])->isInstanceOf('\Smalot\PdfParser\Page'); $this->assert->object($pages[1])->isInstanceOf('\Smalot\PdfParser\Page'); // Listing pages from type Pages (kids) $content = '<>'; $header = \Smalot\PdfParser\Header::parse($content, $document); $object1 = new \Smalot\PdfParser\Page($document, $header); $header = \Smalot\PdfParser\Header::parse($content, $document); $object2 = new \Smalot\PdfParser\Page($document, $header); $header = \Smalot\PdfParser\Header::parse($content, $document); $object3 = new \Smalot\PdfParser\Page($document, $header); $content = '<>'; $header = \Smalot\PdfParser\Header::parse($content, $document); $object4 = new \Smalot\PdfParser\Pages($document, $header); $content = '<>'; $header = \Smalot\PdfParser\Header::parse($content, $document); $object5 = new \Smalot\PdfParser\Pages($document, $header); $document->setObjects( array('1_0' => $object1, '2_0' => $object2, '3_0' => $object3, '4_0' => $object4, '5_0' => $object5) ); $pages = $document->getPages(); $this->assert->integer(count($pages))->isEqualTo(3); $this->assert->object($pages[0])->isInstanceOf('\Smalot\PdfParser\Page'); $this->assert->object($pages[1])->isInstanceOf('\Smalot\PdfParser\Page'); $this->assert->object($pages[2])->isInstanceOf('\Smalot\PdfParser\Page'); // Listing pages from type Catalog $content = '<>'; $header = \Smalot\PdfParser\Header::parse($content, $document); $object1 = new \Smalot\PdfParser\Page($document, $header); $header = \Smalot\PdfParser\Header::parse($content, $document); $object2 = new \Smalot\PdfParser\Page($document, $header); $header = \Smalot\PdfParser\Header::parse($content, $document); $object3 = new \Smalot\PdfParser\Page($document, $header); $content = '<>'; $header = \Smalot\PdfParser\Header::parse($content, $document); $object4 = new \Smalot\PdfParser\Pages($document, $header); $content = '<>'; $header = \Smalot\PdfParser\Header::parse($content, $document); $object5 = new \Smalot\PdfParser\Pages($document, $header); $content = '<>'; $header = \Smalot\PdfParser\Header::parse($content, $document); $object6 = new \Smalot\PdfParser\Pages($document, $header); $document->setObjects( array( '1_0' => $object1, '2_0' => $object2, '3_0' => $object3, '4_0' => $object4, '5_0' => $object5, '6_0' => $object6 ) ); $pages = $document->getPages(); $this->assert->integer(count($pages))->isEqualTo(3); $this->assert->object($pages[0])->isInstanceOf('\Smalot\PdfParser\Page'); $this->assert->object($pages[1])->isInstanceOf('\Smalot\PdfParser\Page'); $this->assert->object($pages[2])->isInstanceOf('\Smalot\PdfParser\Page'); } } pdfparser-0.9.25/src/Smalot/PdfParser/Tests/Units/Element.php000066400000000000000000000154661257674555500240600ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Tests\Units; use mageekguy\atoum; /** * Class Element * * @package Smalot\PdfParser\Tests\Units */ class Element extends atoum\test { public function testParse() { $document = new \Smalot\PdfParser\Document(array()); // Only_values = false. $content = '/NameType /FlateDecode /Contents[4 0 R 42]/Fonts<>/NullType null/StringType(hello)/DateType(D:20130901235555+02\'00\')/XRefType 2 0 R /NumericType 8/HexaType<0020>/BooleanType false'; $offset = 0; $elements = \Smalot\PdfParser\Element::parse($content, $document, $offset, false); $this->assert->array($elements)->hasKey('NameType'); $this->assert->object($elements['NameType'])->isInstanceOf('\Smalot\PdfParser\Element\ElementName'); $this->assert->string($elements['NameType']->getContent())->isEqualTo('FlateDecode'); $this->assert->boolean(array_key_exists('Contents', $elements))->isEqualTo(true); $this->assert->object($elements['Contents'])->isInstanceOf('\Smalot\PdfParser\Element\ElementArray'); $this->assert->boolean($elements['Contents']->contains(42))->isEqualTo(true); $this->assert->boolean(array_key_exists('Fonts', $elements))->isEqualTo(true); $this->assert->object($elements['Fonts'])->isInstanceOf('\Smalot\PdfParser\Header'); $this->assert->boolean(array_key_exists('NullType', $elements))->isEqualTo(true); $this->assert->object($elements['NullType'])->isInstanceOf('\Smalot\PdfParser\Element\ElementNull'); $this->assert->castToString($elements['NullType'])->isEqualTo('null'); $this->assert->boolean(array_key_exists('StringType', $elements))->isEqualTo(true); $this->assert->object($elements['StringType'])->isInstanceOf('\Smalot\PdfParser\Element\ElementString'); $this->assert->string($elements['StringType']->getContent())->isEqualTo('hello'); $this->assert->boolean(array_key_exists('DateType', $elements))->isEqualTo(true); $this->assert->object($elements['DateType'])->isInstanceOf('\Smalot\PdfParser\Element\ElementDate'); // $this->assert->castToString($elements['DateType'])->isEqualTo('2013-09-01T23:55:55+02:00'); $this->assert->boolean(array_key_exists('XRefType', $elements))->isEqualTo(true); $this->assert->object($elements['XRefType'])->isInstanceOf('\Smalot\PdfParser\Element\ElementXRef'); $this->assert->string($elements['XRefType']->getId())->isEqualTo('2_0'); $this->assert->boolean(array_key_exists('NumericType', $elements))->isEqualTo(true); $this->assert->object($elements['NumericType'])->isInstanceOf('\Smalot\PdfParser\Element\ElementNumeric'); $this->assert->castToString($elements['NumericType'])->isEqualTo('8'); $this->assert->boolean(array_key_exists('HexaType', $elements))->isEqualTo(true); $this->assert->object($elements['HexaType'])->isInstanceOf('\Smalot\PdfParser\Element\ElementString'); $this->assert->string($elements['HexaType']->getContent())->isEqualTo(' '); $this->assert->boolean(array_key_exists('BooleanType', $elements))->isEqualTo(true); $this->assert->object($elements['BooleanType'])->isInstanceOf('\Smalot\PdfParser\Element\ElementBoolean'); $this->assert->boolean($elements['BooleanType']->getContent())->isEqualTo(false); // Only_values = true. $content = '/NameType /FlateDecode'; $offset = 0; $elements = \Smalot\PdfParser\Element::parse($content, $document, $offset, true); $this->assert->array($elements)->hasSize(2); $this->assert->integer($offset)->isEqualTo(22); // Test error. $content = '/NameType /FlateDecode $$$'; $offset = 0; $elements = \Smalot\PdfParser\Element::parse($content, $document, $offset, false); $this->assert->array($elements)->hasSize(1); $this->assert->integer($offset)->isEqualTo(22); $this->assert->string(key($elements))->isEqualTo('NameType'); $this->assert->object(current($elements))->isInstanceOf('\Smalot\PdfParser\Element\ElementName'); $content = '/NameType $$$'; $offset = 0; $elements = \Smalot\PdfParser\Element::parse($content, $document, $offset, false); $this->assert->integer($offset)->isEqualTo(0); $this->assert->array($elements)->isEmpty(); /*$this->assert->boolean(array_key_exists('NameType', $elements))->isEqualTo(true); $this->assert->boolean($elements['NameType'])->isInstanceOf('\Smalot\PdfParser\Element\ElementName)->isEqualTo(true); $this->assert->string($elements['NameType']->getContent())->isEqualTo('FlateDecode');*/ } public function testGetContent() { $element = new \Smalot\PdfParser\Element(42); $content = $element->getContent(); $this->assert->integer($content)->isEqualTo(42); $element = new \Smalot\PdfParser\Element(array(4, 2)); $content = $element->getContent(); $this->assert->array($content)->hasSize(2); } public function testEquals() { $element = new \Smalot\PdfParser\Element(2); $this->assert->boolean($element->equals(2))->isEqualTo(true); $this->assert->boolean($element->equals(8))->isEqualTo(false); } public function testContains() { $val_4 = new \Smalot\PdfParser\Element(4); $val_2 = new \Smalot\PdfParser\Element(2); $element = new \Smalot\PdfParser\Element(array($val_4, $val_2)); $this->assert->boolean($element->contains(2))->isEqualTo(true); $this->assert->boolean($element->contains(8))->isEqualTo(false); } public function test__toString() { $element = new \Smalot\PdfParser\Element(2); $this->assert->castToString($element)->isEqualTo('2'); } } pdfparser-0.9.25/src/Smalot/PdfParser/Tests/Units/Element/000077500000000000000000000000001257674555500233335ustar00rootroot00000000000000pdfparser-0.9.25/src/Smalot/PdfParser/Tests/Units/Element/ElementArray.php000066400000000000000000000167451257674555500264510ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Tests\Units\Element; use mageekguy\atoum; use Smalot\PdfParser\Document; use Smalot\PdfParser\Header; use Smalot\PdfParser\Page; /** * Class ElementArray * * @package Smalot\PdfParser\Tests\Units\Element */ class ElementArray extends atoum\test { public function testParse() { $document = new \Smalot\PdfParser\Document(array()); // Skipped. $offset = 0; $element = \Smalot\PdfParser\Element\ElementArray::parse('ABC', $document, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementArray::parse(' / [ 4 2 ] ', $document, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementArray::parse(' 0 [ 4 2 ] ', $document, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementArray::parse(" 0 \n [ 4 2 ] ", $document, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); // Valid. $offset = 0; $element = \Smalot\PdfParser\Element\ElementArray::parse(' [ 4 2 ] ', $document, $offset); $this->assert->boolean($element->contains(4))->isEqualTo(true); $this->assert->boolean($element->contains(2))->isEqualTo(true); $this->assert->boolean($element->contains(8))->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(8); $offset = 0; $element = \Smalot\PdfParser\Element\ElementArray::parse(' [ 4 2 ]', $document, $offset); $this->assert->boolean($element->contains(4))->isEqualTo(true); $this->assert->boolean($element->contains(2))->isEqualTo(true); $this->assert->boolean($element->contains(8))->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(8); $offset = 0; $element = \Smalot\PdfParser\Element\ElementArray::parse('[ 4 2 ]', $document, $offset); $this->assert->boolean($element->contains(4))->isEqualTo(true); $this->assert->boolean($element->contains(2))->isEqualTo(true); $this->assert->boolean($element->contains(8))->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(7); $offset = 0; $element = \Smalot\PdfParser\Element\ElementArray::parse(" \n [ 4 2 ] ", $document, $offset); $this->assert->boolean($element->contains(4))->isEqualTo(true); $this->assert->boolean($element->contains(2))->isEqualTo(true); $this->assert->boolean($element->contains(8))->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(10); } public function testGetContent() { $val_4 = new \Smalot\PdfParser\Element\ElementNumeric('4'); $val_2 = new \Smalot\PdfParser\Element\ElementNumeric('2'); $element = new \Smalot\PdfParser\Element\ElementArray(array($val_4, $val_2)); $content = $element->getContent(); $this->assert->array($content)->hasSize(2); } public function testContains() { $val_4 = new \Smalot\PdfParser\Element\ElementNumeric('4'); $val_2 = new \Smalot\PdfParser\Element\ElementNumeric('2'); $element = new \Smalot\PdfParser\Element\ElementArray(array($val_4, $val_2)); $this->assert->boolean($element->contains(2))->isEqualTo(true); $this->assert->boolean($element->contains(8))->isEqualTo(false); } public function testResolveXRef() { // Document with text. $filename = __DIR__ . '/../../../../../../samples/Document1_pdfcreator_nocompressed.pdf'; $parser = new \Smalot\PdfParser\Parser(); $document = $parser->parseFile($filename); $object = $document->getObjectById('3_0'); $kids = $object->get('Kids'); $this->assert->object($kids)->isInstanceOf('\Smalot\PdfParser\Element\ElementArray'); $this->assert->array($kids->getContent())->hasSize(1); $pages = $kids->getContent(); $this->assert->object(reset($pages))->isInstanceOf('\Smalot\PdfParser\Page'); } public function testGetDetails() { // // Document with text. // $filename = __DIR__ . '/../../../../../../samples/Document1_pdfcreator_nocompressed.pdf'; // $parser = new \Smalot\PdfParser\Parser(); // $document = $parser->parseFile($filename); // $object = $document->getObjectById('3_0'); // /** @var \Smalot\PdfParser\Element\ElementArray $kids */ // $kids = $object->get('Kids'); // $details = $kids->getDetails(); // // $this->assert->array($details)->hasSize(1); // $this->assert->string($details[0]['Type'])->isEqualTo('Page'); $document = new Document(); $content = '<> [8 [9 <>]]]>>'; $details_reference = array( 'Type' => 'Page', 'Types' => array( 8, ), 'Sizes' => array( 1, 2, 3, 4, 5, array( 'Subtype' => 'XObject', ), array( 8, array( 9, array( 'FontSize' => 10, ), ), ), ), ); $header = Header::parse($content, $document); $details = $header->getDetails(); $this->assert->array($details)->hasSize(3); $this->assert->array($details)->isEqualTo($details_reference); } public function test__toString() { $val_4 = new \Smalot\PdfParser\Element\ElementNumeric('4'); $val_2 = new \Smalot\PdfParser\Element\ElementNumeric('2'); $element = new \Smalot\PdfParser\Element\ElementArray(array($val_4, $val_2)); $this->assert->castToString($element)->isEqualTo('4,2'); $document = new \Smalot\PdfParser\Document(array()); $element = \Smalot\PdfParser\Element\ElementArray::parse(' [ 4 2 ]', $document); $this->assert->castToString($element)->isEqualTo('4,2'); } } pdfparser-0.9.25/src/Smalot/PdfParser/Tests/Units/Element/ElementBoolean.php000066400000000000000000000135401257674555500267400ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Tests\Units\Element; use mageekguy\atoum; /** * Class ElementBoolean * * @package Smalot\PdfParser\Tests\Units\Element */ class ElementBoolean extends atoum\test { public function testParse() { // Skipped. $offset = 0; $element = \Smalot\PdfParser\Element\ElementBoolean::parse('ABC', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementBoolean::parse(' [ false ]', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementBoolean::parse(' << true >>', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementBoolean::parse(' / false ', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementBoolean::parse(' 0 true ', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementBoolean::parse(" 0 \n true ", null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); // Valid. $offset = 0; $element = \Smalot\PdfParser\Element\ElementBoolean::parse(' true ', null, $offset); $this->assert->boolean($element->getContent())->isEqualTo(true); $this->assert->integer($offset)->isEqualTo(5); $offset = 0; $element = \Smalot\PdfParser\Element\ElementBoolean::parse(' TRUE ', null, $offset); $this->assert->boolean($element->getContent())->isEqualTo(true); $this->assert->integer($offset)->isEqualTo(5); $offset = 0; $element = \Smalot\PdfParser\Element\ElementBoolean::parse(' True', null, $offset); $this->assert->boolean($element->getContent())->isEqualTo(true); $this->assert->integer($offset)->isEqualTo(5); $offset = 0; $element = \Smalot\PdfParser\Element\ElementBoolean::parse('true', null, $offset); $this->assert->boolean($element->getContent())->isEqualTo(true); $this->assert->integer($offset)->isEqualTo(4); $offset = 0; $element = \Smalot\PdfParser\Element\ElementBoolean::parse('False', null, $offset); $this->assert->boolean($element->getContent())->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(5); $offset = 0; $element = \Smalot\PdfParser\Element\ElementBoolean::parse(" \n true ", null, $offset); $this->assert->boolean($element->getContent())->isEqualTo(true); $this->assert->integer($offset)->isEqualTo(7); } public function testGetContent() { $element = new \Smalot\PdfParser\Element\ElementBoolean('true'); $this->assert->boolean($element->getContent())->isEqualTo(true); $element = new \Smalot\PdfParser\Element\ElementBoolean('false'); $this->assert->boolean($element->getContent())->isEqualTo(false); } public function testEquals() { $element = new \Smalot\PdfParser\Element\ElementBoolean('true'); $this->assert->boolean($element->equals(true))->isEqualTo(true); $this->assert->boolean($element->equals(1))->isEqualTo(false); $this->assert->boolean($element->equals(false))->isEqualTo(false); $this->assert->boolean($element->equals(null))->isEqualTo(false); $element = new \Smalot\PdfParser\Element\ElementBoolean('false'); $this->assert->boolean($element->equals(false))->isEqualTo(true); $this->assert->boolean($element->equals(0))->isEqualTo(false); $this->assert->boolean($element->equals(true))->isEqualTo(false); $this->assert->boolean($element->equals(null))->isEqualTo(false); } public function testContains() { $element = new \Smalot\PdfParser\Element\ElementBoolean('true'); $this->assert->boolean($element->contains(true))->isEqualTo(true); $this->assert->boolean($element->contains(false))->isEqualTo(false); $this->assert->boolean($element->contains(1))->isEqualTo(false); } public function test__toString() { $element = new \Smalot\PdfParser\Element\ElementBoolean('true'); $this->assert->castToString($element)->isEqualTo('true'); $element = new \Smalot\PdfParser\Element\ElementBoolean('false'); $this->assert->castToString($element)->isEqualTo('false'); } } pdfparser-0.9.25/src/Smalot/PdfParser/Tests/Units/Element/ElementDate.php000066400000000000000000000175451257674555500262470ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Tests\Units\Element; use mageekguy\atoum; /** * Class ElementDate * * @package Smalot\PdfParser\Tests\Units\Element */ class ElementDate extends atoum\test { public function testParse() { // Skipped. $offset = 0; $element = \Smalot\PdfParser\Element\ElementDate::parse('ABC', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementDate::parse(' [ (ABC) 5 6 ]', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementDate::parse(' << (invalid) >>', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementDate::parse(' / (FlateDecode) ', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementDate::parse(' 0 (FlateDecode) ', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementDate::parse(" 0 \n (FlateDecode) ", null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); // Valid. $offset = 0; $element = \Smalot\PdfParser\Element\ElementDate::parse(' (D:20130901235555+02\'00\') ', null, $offset); $element->setFormat('c'); $this->assert->object($element->getContent())->isInstanceOf('\DateTime'); $this->assert->castToString($element)->isEqualTo('2013-09-01T23:55:55+02:00'); $this->assert->integer($offset)->isEqualTo(26); $offset = 0; $element = \Smalot\PdfParser\Element\ElementDate::parse(' (D:20130901235555+02\'00\') ', null, $offset); $element->setFormat('c'); $this->assert->object($element->getContent())->isInstanceOf('\DateTime'); $this->assert->castToString($element)->isEqualTo('2013-09-01T23:55:55+02:00'); $this->assert->integer($offset)->isEqualTo(26); $offset = 0; $element = \Smalot\PdfParser\Element\ElementDate::parse(' (D:20130901235555+02\'00\')', null, $offset); $element->setFormat('c'); $this->assert->object($element->getContent())->isInstanceOf('\DateTime'); $this->assert->castToString($element)->isEqualTo('2013-09-01T23:55:55+02:00'); $this->assert->integer($offset)->isEqualTo(26); $offset = 0; $element = \Smalot\PdfParser\Element\ElementDate::parse('(D:20130901235555+02\'00\')', null, $offset); $element->setFormat('c'); $this->assert->object($element->getContent())->isInstanceOf('\DateTime'); $this->assert->castToString($element)->isEqualTo('2013-09-01T23:55:55+02:00'); $this->assert->integer($offset)->isEqualTo(25); $offset = 0; $element = \Smalot\PdfParser\Element\ElementDate::parse(" \n (D:20130901235555+02'00') ", null, $offset); $element->setFormat('c'); $this->assert->object($element->getContent())->isInstanceOf('\DateTime'); $this->assert->castToString($element)->isEqualTo('2013-09-01T23:55:55+02:00'); $this->assert->integer($offset)->isEqualTo(28); $offset = 0; $element = \Smalot\PdfParser\Element\ElementDate::parse(" \n (D:20130901235555) ", null, $offset); $element->setFormat('c'); $this->assert->object($element->getContent())->isInstanceOf('\DateTime'); $this->assert->boolean($element->equals(new \DateTime('2013-09-01T23:55:55')))->isEqualTo(true); $this->assert->integer($offset)->isEqualTo(21); $offset = 0; $element = \Smalot\PdfParser\Element\ElementDate::parse("(D:20131206091846Z00'00')", null, $offset); $element->setFormat('c'); $this->assert->object($element->getContent())->isInstanceOf('\DateTime'); //$this->assert->boolean($element->equals(new \DateTime('2013-09-01T23:55:55')))->isEqualTo(true); $this->assert->integer($offset)->isEqualTo(25); $offset = 0; $element = \Smalot\PdfParser\Element\ElementDate::parse(" \n (D:1-23-2014, 19:02:15-03'00') ", null, $offset); $element->setFormat('c'); $this->assert->object($element->getContent())->isInstanceOf('\DateTime'); $this->assert->castToString($element)->isEqualTo('2014-01-23T19:02:15-03:00'); $this->assert->integer($offset)->isEqualTo(33); // Format invalid $offset = 0; $element = \Smalot\PdfParser\Element\ElementDate::parse(" \n (D:2013+02'00') ", null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); } public function testGetContent() { $element = new \Smalot\PdfParser\Element\ElementDate(new \DateTime('2013-09-01 23:55:55+02:00')); $this->assert->dateTime($element->getContent())->isEqualTo(new \DateTime('2013-09-01 21:55:55+00:00')); try { $element = new \Smalot\PdfParser\Element\ElementDate('2013-09-01 23:55:55+02:00'); $this->assert->boolean(false)->isEqualTo(true); } catch (\Exception $e) { $this->assert->exception($e)->hasMessage('DateTime required.'); } } public function testEquals() { $element = new \Smalot\PdfParser\Element\ElementDate(new \DateTime('2013-09-01 23:55:55+02:00')); $element->setFormat('c'); $this->assert->boolean($element->equals('2013-09-01T23:55:55+02:00'))->isEqualTo(true); $this->assert->boolean($element->equals('2013-09-01T23:55:55+01:00'))->isEqualTo(false); $this->assert->boolean($element->equals(new \DateTime('2013-09-01T21:55:55+00:00')))->isEqualTo(true); $this->assert->boolean($element->equals(new \DateTime('2013-09-01T23:55:55+01:00')))->isEqualTo(false); $this->assert->boolean($element->equals('ABC'))->isEqualTo(false); } public function testContains() { $element = new \Smalot\PdfParser\Element\ElementDate(new \DateTime('2013-09-01 23:55:55+02:00')); $this->assert->boolean($element->contains('2013-09-01T21:55:55+00:00'))->isEqualTo(true); $this->assert->boolean($element->contains('2013-06-15'))->isEqualTo(false); } public function test__toString() { $element = new \Smalot\PdfParser\Element\ElementDate(new \DateTime('2013-09-01 23:55:55+02:00')); $element->setFormat('c'); $this->assert->castToString($element)->isEqualTo('2013-09-01T23:55:55+02:00'); } } pdfparser-0.9.25/src/Smalot/PdfParser/Tests/Units/Element/ElementHexa.php000066400000000000000000000116021257674555500262430ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Tests\Units\Element; use mageekguy\atoum; /** * Class ElementHexa * * @package Smalot\PdfParser\Tests\Units\Element */ class ElementHexa extends atoum\test { public function testParse() { // Skipped. $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse('ABC', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' [ <0020> 5 6 ]', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' << <0020> >>', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' / <0020> ', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' 0 <0020> ', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(" 0 \n <0020> ", null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); // Valid. $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' <0020> ', null, $offset); $this->assert->string($element->getContent())->isEqualTo(' '); $this->assert->integer($offset)->isEqualTo(7); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' <0020> ', null, $offset); $this->assert->string($element->getContent())->isEqualTo(' '); $this->assert->integer($offset)->isEqualTo(7); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(' <0020>', null, $offset); $this->assert->string($element->getContent())->isEqualTo(' '); $this->assert->integer($offset)->isEqualTo(7); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse('<0020>', null, $offset); $this->assert->string($element->getContent())->isEqualTo(' '); $this->assert->integer($offset)->isEqualTo(6); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(" \n <0020> ", null, $offset); $this->assert->string($element->getContent())->isEqualTo(' '); $this->assert->integer($offset)->isEqualTo(9); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(" \n <5465616d204d616e6167656d656e742053797374656d73> ", null, $offset); $this->assert->string($element->getContent())->isEqualTo('Team Management Systems'); $this->assert->integer($offset)->isEqualTo(51); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(" \n <5265706f72744275696c646572> ", null, $offset); $this->assert->object($element)->isInstanceOf('\Smalot\PdfParser\Element\ElementString'); $this->assert->string($element->getContent())->isEqualTo('ReportBuilder'); $this->assert->integer($offset)->isEqualTo(31); $offset = 0; $element = \Smalot\PdfParser\Element\ElementHexa::parse(" \n <443a3230313331323137313334303435303027303027> ", null, $offset); $this->assert->object($element)->isInstanceOf('\Smalot\PdfParser\Element\ElementDate'); $this->assert->castToString($element)->isEqualTo('2013-12-17T13:40:45+00:00'); $this->assert->integer($offset)->isEqualTo(49); } } pdfparser-0.9.25/src/Smalot/PdfParser/Tests/Units/Element/ElementMissing.php000066400000000000000000000046341257674555500267760ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Tests\Units\Element; use mageekguy\atoum; /** * Class ElementMissing * * @package Smalot\PdfParser\Tests\Units\Element */ class ElementMissing extends atoum\test { public function testEquals() { $element = new \Smalot\PdfParser\Element\ElementMissing(null); $this->assert->boolean($element->equals(null))->isEqualTo(false); $this->assert->boolean($element->equals(true))->isEqualTo(false); $this->assert->boolean($element->equals('A'))->isEqualTo(false); $this->assert->boolean($element->equals(false))->isEqualTo(false); } public function testGetContent() { $element = new \Smalot\PdfParser\Element\ElementMissing(null); $this->assert->boolean($element->getContent())->isEqualTo(false); } public function testContains() { $element = new \Smalot\PdfParser\Element\ElementMissing(null); $this->assert->boolean($element->contains(null))->isEqualTo(false); $this->assert->boolean($element->contains(true))->isEqualTo(false); $this->assert->boolean($element->contains('A'))->isEqualTo(false); $this->assert->boolean($element->contains(false))->isEqualTo(false); } public function test__toString() { $element = new \Smalot\PdfParser\Element\ElementMissing(null); $this->assert->castToString($element)->isEqualTo(''); } } pdfparser-0.9.25/src/Smalot/PdfParser/Tests/Units/Element/ElementName.php000066400000000000000000000162241257674555500262430ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Tests\Units\Element; use mageekguy\atoum; /** * Class ElementName * * @package Smalot\PdfParser\Tests\Units\Element */ class ElementName extends atoum\test { public function testParse() { // Skipped. $offset = 0; $element = \Smalot\PdfParser\Element\ElementName::parse('ABC', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementName::parse(' [ /ABC 5 6 ]', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementName::parse(' << invalid >>', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementName::parse(' / FlateDecode ', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementName::parse(' 0 /FlateDecode ', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementName::parse(" 0 \n /FlateDecode ", null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); // Valid. $offset = 0; $element = \Smalot\PdfParser\Element\ElementName::parse(' /FlateDecode ', null, $offset); $this->assert->string($element->getContent())->isEqualTo('FlateDecode'); $this->assert->integer($offset)->isEqualTo(13); $offset = 0; $element = \Smalot\PdfParser\Element\ElementName::parse(' /FlateDecode', null, $offset); $this->assert->string($element->getContent())->isEqualTo('FlateDecode'); $this->assert->integer($offset)->isEqualTo(13); $offset = 0; $element = \Smalot\PdfParser\Element\ElementName::parse('/FlateDecode', null, $offset); $this->assert->string($element->getContent())->isEqualTo('FlateDecode'); $this->assert->integer($offset)->isEqualTo(12); $offset = 0; $element = \Smalot\PdfParser\Element\ElementName::parse(" \n /FlateDecode ", null, $offset); $this->assert->string($element->getContent())->isEqualTo('FlateDecode'); $this->assert->integer($offset)->isEqualTo(15); $offset = 0; $element = \Smalot\PdfParser\Element\ElementName::parse('/FlateDecode2', null, $offset); $this->assert->string($element->getContent())->isEqualTo('FlateDecode2'); $this->assert->integer($offset)->isEqualTo(13); $offset = 0; $element = \Smalot\PdfParser\Element\ElementName::parse('/Flate-Decode2', null, $offset); $this->assert->string($element->getContent())->isEqualTo('Flate-Decode2'); $this->assert->integer($offset)->isEqualTo(14); $offset = 0; $element = \Smalot\PdfParser\Element\ElementName::parse('/OJHCYD+Cambria', null, $offset); $this->assert->string($element->getContent())->isEqualTo('OJHCYD+Cambria'); $this->assert->integer($offset)->isEqualTo(15); $offset = 0; $element = \Smalot\PdfParser\Element\ElementName::parse('/OJHCYD+Cambria,Bold', null, $offset); $this->assert->string($element->getContent())->isEqualTo('OJHCYD+Cambria,Bold'); $this->assert->integer($offset)->isEqualTo(20); // $offset = 0; $element = \Smalot\PdfParser\Element\ElementName::parse('/Flate_Decode2', null, $offset); $this->assert->string($element->getContent())->isEqualTo('Flate'); $this->assert->integer($offset)->isEqualTo(6); $offset = 0; $element = \Smalot\PdfParser\Element\ElementName::parse('/Flate.Decode2', null, $offset); $this->assert->string($element->getContent())->isEqualTo('Flate.Decode2'); $this->assert->integer($offset)->isEqualTo(14); } public function testGetContent() { $element = new \Smalot\PdfParser\Element\ElementName('FlateDecode'); $this->assert->string($element->getContent())->isEqualTo('FlateDecode'); } public function testEquals() { $element = new \Smalot\PdfParser\Element\ElementName('FlateDecode'); $this->assert->boolean($element->equals('FlateDecode'))->isEqualTo(true); $this->assert->boolean($element->equals('Flatedecode'))->isEqualTo(false); $element = new \Smalot\PdfParser\Element\ElementName('FlateDecode2'); $this->assert->boolean($element->equals('FlateDecode2'))->isEqualTo(true); $this->assert->boolean($element->equals('FlateDecode3'))->isEqualTo(false); $element = new \Smalot\PdfParser\Element\ElementName('Flate-Decode2'); $this->assert->boolean($element->equals('Flate-Decode2'))->isEqualTo(true); $this->assert->boolean($element->equals('Flate-Decode3'))->isEqualTo(false); } public function testContains() { $element = new \Smalot\PdfParser\Element\ElementName('FlateDecode'); $this->assert->boolean($element->contains('FlateDecode'))->isEqualTo(true); $this->assert->boolean($element->contains('Flatedecode'))->isEqualTo(false); $element = new \Smalot\PdfParser\Element\ElementName('FlateDecode2'); $this->assert->boolean($element->contains('FlateDecode2'))->isEqualTo(true); $this->assert->boolean($element->contains('FlateDecode3'))->isEqualTo(false); $element = new \Smalot\PdfParser\Element\ElementName('Flate-Decode2'); $this->assert->boolean($element->contains('Flate-Decode2'))->isEqualTo(true); $this->assert->boolean($element->contains('Flate-Decode3'))->isEqualTo(false); } public function test__toString() { $element = new \Smalot\PdfParser\Element\ElementName('FlateDecode'); $this->assert->castToString($element)->isEqualTo('FlateDecode'); } } pdfparser-0.9.25/src/Smalot/PdfParser/Tests/Units/Element/ElementNull.php000066400000000000000000000117321257674555500262740ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Tests\Units\Element; use mageekguy\atoum; /** * Class ElementNull * * @package Smalot\PdfParser\Tests\Units\Element */ class ElementNull extends atoum\test { public function testParse() { // Skipped. $offset = 0; $element = \Smalot\PdfParser\Element\ElementNull::parse('ABC', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementNull::parse(' [ null ]', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementNull::parse(' << null >>', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementNull::parse(' / null ', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementNull::parse(' 0 null ', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementNull::parse(" 0 \n null ", null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); // Valid. $offset = 0; $element = \Smalot\PdfParser\Element\ElementNull::parse(' null ', null, $offset); $this->assert->boolean(is_null($element->getContent()))->isEqualTo(true); $this->assert->integer($offset)->isEqualTo(5); $offset = 0; $element = \Smalot\PdfParser\Element\ElementNull::parse(' null ', null, $offset); $this->assert->boolean(is_null($element->getContent()))->isEqualTo(true); $this->assert->integer($offset)->isEqualTo(5); $offset = 0; $element = \Smalot\PdfParser\Element\ElementNull::parse(' null', null, $offset); $this->assert->boolean(is_null($element->getContent()))->isEqualTo(true); $this->assert->integer($offset)->isEqualTo(5); $offset = 0; $element = \Smalot\PdfParser\Element\ElementNull::parse('null', null, $offset); $this->assert->boolean(is_null($element->getContent()))->isEqualTo(true); $this->assert->integer($offset)->isEqualTo(4); $offset = 0; $element = \Smalot\PdfParser\Element\ElementNull::parse(" \n null ", null, $offset); $this->assert->boolean(is_null($element->getContent()))->isEqualTo(true); $this->assert->integer($offset)->isEqualTo(7); } public function testGetContent() { $element = new \Smalot\PdfParser\Element\ElementNull('null'); $this->assert->boolean(is_null($element->getContent()))->isEqualTo(true); } public function testEquals() { $element = new \Smalot\PdfParser\Element\ElementNull('null'); $this->assert->boolean($element->equals(null))->isEqualTo(true); $this->assert->boolean($element->equals(false))->isEqualTo(false); $this->assert->boolean($element->equals(0))->isEqualTo(false); $this->assert->boolean($element->equals(1))->isEqualTo(false); } public function testContains() { $element = new \Smalot\PdfParser\Element\ElementNull('null'); $this->assert->boolean($element->contains(null))->isEqualTo(true); $this->assert->boolean($element->contains(false))->isEqualTo(false); $this->assert->boolean($element->contains(0))->isEqualTo(false); } public function test__toString() { $element = new \Smalot\PdfParser\Element\ElementNull('null'); $this->assert->castToString($element)->isEqualTo('null'); } } pdfparser-0.9.25/src/Smalot/PdfParser/Tests/Units/Element/ElementNumeric.php000066400000000000000000000210111257674555500267530ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Tests\Units\Element; use mageekguy\atoum; /** * Class ElementNumeric * * @package Smalot\PdfParser\Tests\Units\Element */ class ElementNumeric extends atoum\test { public function testParse() { // Skipped. $offset = 0; $element = \Smalot\PdfParser\Element\ElementNumeric::parse('ABC', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementNumeric::parse(' [ 2 ]', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementNumeric::parse(' /2', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementNumeric::parse(" /2 \n 2", null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); // Valid. $offset = 0; $element = \Smalot\PdfParser\Element\ElementNumeric::parse(' -2', null, $offset); $this->assert->float($element->getContent())->isEqualTo(-2.0); $this->assert->integer($offset)->isEqualTo(3); $offset = 0; $element = \Smalot\PdfParser\Element\ElementNumeric::parse('2BC', null, $offset); $this->assert->float($element->getContent())->isEqualTo(2.0); $this->assert->integer($offset)->isEqualTo(1); $offset = 0; $element = \Smalot\PdfParser\Element\ElementNumeric::parse(' 2BC', null, $offset); $this->assert->float($element->getContent())->isEqualTo(2.0); $this->assert->integer($offset)->isEqualTo(2); $offset = 0; $element = \Smalot\PdfParser\Element\ElementNumeric::parse(' -2BC', null, $offset); $this->assert->float($element->getContent())->isEqualTo(-2.0); $this->assert->integer($offset)->isEqualTo(3); $offset = 0; $element = \Smalot\PdfParser\Element\ElementNumeric::parse(' -2', null, $offset); $this->assert->float($element->getContent())->isEqualTo(-2.0); $this->assert->integer($offset)->isEqualTo(3); $offset = 0; $element = \Smalot\PdfParser\Element\ElementNumeric::parse(' 2 0 obj', null, $offset); $this->assert->float($element->getContent())->isEqualTo(2.0); $this->assert->integer($offset)->isEqualTo(2); $offset = 0; $element = \Smalot\PdfParser\Element\ElementNumeric::parse(" \n -2 ", null, $offset); $this->assert->float($element->getContent())->isEqualTo(-2.0); $this->assert->integer($offset)->isEqualTo(5); } public function testGetContent() { $element = new \Smalot\PdfParser\Element\ElementNumeric('B'); $this->assert->float($element->getContent())->isEqualTo(0.0); $element = new \Smalot\PdfParser\Element\ElementNumeric('-2.5'); $this->assert->float($element->getContent())->isEqualTo(-2.5); $element = new \Smalot\PdfParser\Element\ElementNumeric('-2'); $this->assert->float($element->getContent())->isEqualTo(-2.0); $element = new \Smalot\PdfParser\Element\ElementNumeric(' -2'); $this->assert->float($element->getContent())->isEqualTo(-2.0); $element = new \Smalot\PdfParser\Element\ElementNumeric('2.5'); $this->assert->float($element->getContent())->isEqualTo(2.5); $element = new \Smalot\PdfParser\Element\ElementNumeric('2'); $this->assert->float($element->getContent())->isEqualTo(2.0); } public function testEquals() { $element = new \Smalot\PdfParser\Element\ElementNumeric('1'); $this->assert->boolean($element->equals('B'))->isEqualTo(false); $element = new \Smalot\PdfParser\Element\ElementNumeric('1.5'); $this->assert->boolean($element->equals('B'))->isEqualTo(false); $element = new \Smalot\PdfParser\Element\ElementNumeric('2'); $this->assert->boolean($element->equals('2'))->isEqualTo(true); $element = new \Smalot\PdfParser\Element\ElementNumeric('2'); $this->assert->boolean($element->equals('3'))->isEqualTo(false); $element = new \Smalot\PdfParser\Element\ElementNumeric('-2'); $this->assert->boolean($element->equals('-2'))->isEqualTo(true); $element = new \Smalot\PdfParser\Element\ElementNumeric('-2'); $this->assert->boolean($element->equals('-3'))->isEqualTo(false); $element = new \Smalot\PdfParser\Element\ElementNumeric('2.5'); $this->assert->boolean($element->equals('2.5'))->isEqualTo(true); $element = new \Smalot\PdfParser\Element\ElementNumeric('2.5'); $this->assert->boolean($element->equals('3.5'))->isEqualTo(false); $element = new \Smalot\PdfParser\Element\ElementNumeric('-2.5'); $this->assert->boolean($element->equals('-2.5'))->isEqualTo(true); $element = new \Smalot\PdfParser\Element\ElementNumeric('-2.5'); $this->assert->boolean($element->equals('-3.5'))->isEqualTo(false); } public function testContains() { $element = new \Smalot\PdfParser\Element\ElementNumeric('1'); $this->assert->boolean($element->contains('B'))->isEqualTo(false); $element = new \Smalot\PdfParser\Element\ElementNumeric('1.5'); $this->assert->boolean($element->contains('B'))->isEqualTo(false); $element = new \Smalot\PdfParser\Element\ElementNumeric('2'); $this->assert->boolean($element->contains('2'))->isEqualTo(true); $element = new \Smalot\PdfParser\Element\ElementNumeric('2'); $this->assert->boolean($element->contains('3'))->isEqualTo(false); $element = new \Smalot\PdfParser\Element\ElementNumeric('-2'); $this->assert->boolean($element->contains('-2'))->isEqualTo(true); $element = new \Smalot\PdfParser\Element\ElementNumeric('-2'); $this->assert->boolean($element->contains('-3'))->isEqualTo(false); $element = new \Smalot\PdfParser\Element\ElementNumeric('2.5'); $this->assert->boolean($element->contains('2.5'))->isEqualTo(true); $element = new \Smalot\PdfParser\Element\ElementNumeric('2.5'); $this->assert->boolean($element->contains('3.5'))->isEqualTo(false); $element = new \Smalot\PdfParser\Element\ElementNumeric('-2.5'); $this->assert->boolean($element->contains('-2.5'))->isEqualTo(true); $element = new \Smalot\PdfParser\Element\ElementNumeric('-2.5'); $this->assert->boolean($element->contains('-3.5'))->isEqualTo(false); } public function test__toString() { $element = new \Smalot\PdfParser\Element\ElementNumeric('B'); $this->assert->castToString($element)->isEqualTo('0'); $element = new \Smalot\PdfParser\Element\ElementNumeric('1B'); $this->assert->castToString($element)->isEqualTo('1'); $element = new \Smalot\PdfParser\Element\ElementNumeric('2'); $this->assert->castToString($element)->isEqualTo('2'); $element = new \Smalot\PdfParser\Element\ElementNumeric('-2'); $this->assert->castToString($element)->isEqualTo('-2'); $element = new \Smalot\PdfParser\Element\ElementNumeric('2.5'); $this->assert->castToString($element)->isEqualTo('2.5'); $element = new \Smalot\PdfParser\Element\ElementNumeric('-2.5'); $this->assert->castToString($element)->isEqualTo('-2.5'); } } pdfparser-0.9.25/src/Smalot/PdfParser/Tests/Units/Element/ElementString.php000066400000000000000000000162241257674555500266310ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Tests\Units\Element; use mageekguy\atoum; /** * Class ElementString * * @package Smalot\PdfParser\Tests\Units\Element */ class ElementString extends atoum\test { public function testParse() { // Skipped. $offset = 0; $element = \Smalot\PdfParser\Element\ElementString::parse('ABC', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementString::parse(' [ (ABC) 5 6 ]', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementString::parse(' << (invalid) >>', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementString::parse(' / (FlateDecode) ', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementString::parse(' 0 (FlateDecode) ', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementString::parse(" 0 \n (FlateDecode) ", null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); // Valid. $offset = 0; $element = \Smalot\PdfParser\Element\ElementString::parse(' (Copyright) ', null, $offset); $this->assert->string($element->getContent())->isEqualTo('Copyright'); $this->assert->integer($offset)->isEqualTo(12); $offset = 0; $element = \Smalot\PdfParser\Element\ElementString::parse(' (Copyright) ', null, $offset); $this->assert->string($element->getContent())->isEqualTo('Copyright'); $this->assert->integer($offset)->isEqualTo(12); $offset = 0; $element = \Smalot\PdfParser\Element\ElementString::parse(' (Copyright)', null, $offset); $this->assert->string($element->getContent())->isEqualTo('Copyright'); $this->assert->integer($offset)->isEqualTo(12); $offset = 0; $element = \Smalot\PdfParser\Element\ElementString::parse('(Copyright)', null, $offset); $this->assert->string($element->getContent())->isEqualTo('Copyright'); $this->assert->integer($offset)->isEqualTo(11); $offset = 0; $element = \Smalot\PdfParser\Element\ElementString::parse('(Copy-right2)', null, $offset); $this->assert->string($element->getContent())->isEqualTo('Copy-right2'); $this->assert->integer($offset)->isEqualTo(13); $offset = 0; $element = \Smalot\PdfParser\Element\ElementString::parse(" \n (Copyright) ", null, $offset); $this->assert->string($element->getContent())->isEqualTo('Copyright'); $this->assert->integer($offset)->isEqualTo(14); $offset = 0; $element = \Smalot\PdfParser\Element\ElementString::parse('()', null, $offset); $this->assert->string($element->getContent())->isEqualTo(''); $this->assert->integer($offset)->isEqualTo(2); // Complex study case : Unicode + octal. $offset = 0; $element = \Smalot\PdfParser\Element\ElementString::parse("(ABC\\))", null, $offset); $this->assert->string($element->getContent())->isEqualTo('ABC)'); $this->assert->integer($offset)->isEqualTo(7); $offset = 0; $element = \Smalot\PdfParser\Element\ElementString::parse("(\xFE\xFF\\000M)", null, $offset); $this->assert->string($element->getContent())->isEqualTo('M'); $this->assert->integer($offset)->isEqualTo(9); $offset = 0; $element = \Smalot\PdfParser\Element\ElementString::parse("(<20>)", null, $offset); $this->assert->string($element->getContent())->isEqualTo(' '); $this->assert->integer($offset)->isEqualTo(6); $offset = 0; $element = \Smalot\PdfParser\Element\ElementString::parse("(Gutter\\ console\\ assembly)", null, $offset); $this->assert->string($element->getContent())->isEqualTo('Gutter console assembly'); $this->assert->integer($offset)->isEqualTo(27); } public function testGetContent() { $element = new \Smalot\PdfParser\Element\ElementString('Copyright'); $this->assert->string($element->getContent())->isEqualTo('Copyright'); } public function testEquals() { $element = new \Smalot\PdfParser\Element\ElementString('CopyRight'); $this->assert->boolean($element->equals('CopyRight'))->isEqualTo(true); $this->assert->boolean($element->equals('Flatedecode'))->isEqualTo(false); $element = new \Smalot\PdfParser\Element\ElementString('CopyRight2'); $this->assert->boolean($element->equals('CopyRight2'))->isEqualTo(true); $this->assert->boolean($element->equals('CopyRight3'))->isEqualTo(false); $element = new \Smalot\PdfParser\Element\ElementString('Flate-Decode2'); $this->assert->boolean($element->equals('Flate-Decode2'))->isEqualTo(true); $this->assert->boolean($element->equals('Flate-Decode3'))->isEqualTo(false); } public function testContains() { $element = new \Smalot\PdfParser\Element\ElementString('CopyRight'); $this->assert->boolean($element->contains('CopyRight'))->isEqualTo(true); $this->assert->boolean($element->contains('Copyright'))->isEqualTo(false); $element = new \Smalot\PdfParser\Element\ElementString('CopyRight2'); $this->assert->boolean($element->contains('CopyRight2'))->isEqualTo(true); $this->assert->boolean($element->contains('CopyRight3'))->isEqualTo(false); } public function test__toString() { $element = new \Smalot\PdfParser\Element\ElementString('CopyRight'); $this->assert->castToString($element)->isEqualTo('CopyRight'); } } pdfparser-0.9.25/src/Smalot/PdfParser/Tests/Units/Element/ElementStruct.php000066400000000000000000000075131257674555500266500ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Tests\Units\Element; use mageekguy\atoum; /** * Class ElementStruct * * @package Smalot\PdfParser\Tests\Units\Element */ class ElementStruct extends atoum\test { public function testParse() { $document = new \Smalot\PdfParser\Document(array()); // Skipped. $offset = 0; $element = \Smalot\PdfParser\Element\ElementStruct::parse('ABC', $document, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementStruct::parse( ' [ << /Filter /FlateDecode >> ]', $document, $offset ); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementStruct::parse(' / << /Filter /FlateDecode >> ', $document, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementStruct::parse(' 0 << /Filter /FlateDecode >> ', $document, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementStruct::parse( " 0 \n << /Filter /FlateDecode >> ", $document, $offset ); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); // Valid. $offset = 0; $element = \Smalot\PdfParser\Element\ElementStruct::parse(' << /Filter /FlateDecode >> ', $document, $offset); $this->assert->object($element)->isInstanceOf('\Smalot\PdfParser\Header'); $this->assert->integer($offset)->isEqualTo(27); $offset = 0; $element = \Smalot\PdfParser\Element\ElementStruct::parse(' << /Filter /FlateDecode >>', $document, $offset); $this->assert->object($element)->isInstanceOf('\Smalot\PdfParser\Header'); $this->assert->integer($offset)->isEqualTo(27); $offset = 0; $element = \Smalot\PdfParser\Element\ElementStruct::parse('<< /Filter /FlateDecode >>', $document, $offset); $this->assert->object($element)->isInstanceOf('\Smalot\PdfParser\Header'); $this->assert->integer($offset)->isEqualTo(26); $offset = 0; $element = \Smalot\PdfParser\Element\ElementStruct::parse( " \n << /Filter /FlateDecode >> ", $document, $offset ); $this->assert->object($element)->isInstanceOf('\Smalot\PdfParser\Header'); $this->assert->integer($offset)->isEqualTo(29); } } pdfparser-0.9.25/src/Smalot/PdfParser/Tests/Units/Element/ElementXRef.php000066400000000000000000000120331257674555500262210ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Tests\Units\Element; use mageekguy\atoum; /** * Class ElementXRef * * @package Smalot\PdfParser\Tests\Units\Element */ class ElementXRef extends atoum\test { public function testParse() { // Skipped. $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse('ABC', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse(' [ 5 0 R ]', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse(' << 5 0 R >>', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse(' / 5 0 R ', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse(' 0 5 0 R ', null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse(" 0 \n 5 0 R ", null, $offset); $this->assert->boolean($element)->isEqualTo(false); $this->assert->integer($offset)->isEqualTo(0); // Valid. $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse(' 5 0 R ', null, $offset); $this->assert->string($element->getContent())->isEqualTo('5_0'); $this->assert->integer($offset)->isEqualTo(6); $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse(' 5 0 R ', null, $offset); $this->assert->string($element->getContent())->isEqualTo('5_0'); $this->assert->integer($offset)->isEqualTo(6); $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse(' 5 0 R', null, $offset); $this->assert->string($element->getContent())->isEqualTo('5_0'); $this->assert->integer($offset)->isEqualTo(6); $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse('5 0 R', null, $offset); $this->assert->string($element->getContent())->isEqualTo('5_0'); $this->assert->integer($offset)->isEqualTo(5); $offset = 0; $element = \Smalot\PdfParser\Element\ElementXRef::parse(" \n 5 0 R ", null, $offset); $this->assert->string($element->getContent())->isEqualTo('5_0'); $this->assert->integer($offset)->isEqualTo(8); } public function testGetContent() { $element = new \Smalot\PdfParser\Element\ElementXRef('5_0'); $this->assert->string($element->getContent())->isEqualTo('5_0'); } public function testGetId() { $element = new \Smalot\PdfParser\Element\ElementXRef('5_0'); $this->assert->string($element->getId())->isEqualTo('5_0'); } public function testEquals() { $element = new \Smalot\PdfParser\Element\ElementXRef('5_0'); $this->assert->boolean($element->equals(5))->isEqualTo(true); $this->assert->boolean($element->equals(8))->isEqualTo(false); $this->assert->boolean($element->equals($element))->isEqualTo(true); } public function testContains() { $element = new \Smalot\PdfParser\Element\ElementXRef('5_0'); $this->assert->boolean($element->contains(5))->isEqualTo(true); $this->assert->boolean($element->contains(8))->isEqualTo(false); $this->assert->boolean($element->contains($element))->isEqualTo(true); } public function test__toString() { $element = new \Smalot\PdfParser\Element\ElementXRef('5_0'); $this->assert->castToString($element)->isEqualTo('#Obj#5_0'); } } pdfparser-0.9.25/src/Smalot/PdfParser/Tests/Units/Font.php000066400000000000000000000237751257674555500233770ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Tests\Units; use mageekguy\atoum; use Smalot\PdfParser\Header; /** * Class Font * * @package Smalot\PdfParser\Tests\Units */ class Font extends atoum\test { public function testGetName() { $filename = __DIR__ . '/../../../../../samples/Document1_pdfcreator_nocompressed.pdf'; $parser = new \Smalot\PdfParser\Parser(); $document = $parser->parseFile($filename); $fonts = $document->getFonts(); $font = reset($fonts); $this->assert->string($font->getName())->isEqualTo('OJHCYD+Cambria,Bold'); } public function testGetType() { $filename = __DIR__ . '/../../../../../samples/Document1_pdfcreator_nocompressed.pdf'; $parser = new \Smalot\PdfParser\Parser(); $document = $parser->parseFile($filename); $fonts = $document->getFonts(); $font = reset($fonts); $this->assert->string($font->getType())->isEqualTo('TrueType'); } public function testGetDetails() { $filename = __DIR__ . '/../../../../../samples/Document1_pdfcreator_nocompressed.pdf'; $parser = new \Smalot\PdfParser\Parser(); $document = $parser->parseFile($filename); $fonts = $document->getFonts(); $font = reset($fonts); $reference = array( 'Name' => 'OJHCYD+Cambria,Bold', 'Type' => 'TrueType', 'Encoding' => 'Ansi', 'BaseFont' => 'OJHCYD+Cambria,Bold', 'FontDescriptor' => array( 'Type' => 'FontDescriptor', 'FontName' => 'OJHCYD+Cambria,Bold', 'Flags' => 4, 'Ascent' => 699, 'CapHeight' => 699, 'Descent' => -7, 'ItalicAngle' => 0, 'StemV' => 128, 'MissingWidth' => 658, ), 'ToUnicode' => array( 'Filter' => 'FlateDecode', 'Length' => 219, ), 'FirstChar' => 1, 'LastChar' => 11, 'Widths' => array( 0 => 705, 1 => 569, 2 => 469, 3 => 597, 4 => 890, 5 => 531, 6 => 604, 7 => 365, 8 => 220, 9 => 314, 10 => 308, ), 'Subtype' => 'TrueType', ); $this->assert->array($font->getDetails())->isEqualTo($reference); } public function testTranslateChar() { $filename = __DIR__ . '/../../../../../samples/Document1_pdfcreator_nocompressed.pdf'; $parser = new \Smalot\PdfParser\Parser(); $document = $parser->parseFile($filename); $fonts = $document->getFonts(); /** @var \Smalot\PdfParser\Font $font */ $font = reset($fonts); $this->assert->string($font->translateChar("\x01"))->isEqualTo('D'); $this->assert->string($font->translateChar("\x02"))->isEqualTo('o'); $this->assert->string($font->translateChar("\x03"))->isEqualTo('c'); $this->assert->string($font->translateChar("\x04"))->isEqualTo('u'); $this->assert->string($font->translateChar("\x99"))->isEqualTo(\Smalot\PdfParser\Font::MISSING); } public function testLoadTranslateTable() { $document = new \Smalot\PdfParser\Document(); $content = '<>'; $header = Header::parse($content, $document); $font = new \Smalot\PdfParser\Font($document, $header); $content = '/CIDInit /ProcSet findresource begin 14 dict begin begincmap /CIDSystemInfo << /Registry (Adobe) /Ordering (UCS) /Supplement 0 >> def /CMapName /Adobe-Identity-UCS def /CMapType 2 def 1 begincodespacerange <0000> endcodespacerange 3 beginbfchar <0003> <0020> <000F> <002C> <0011> <002E> endbfchar 2 beginbfrange <0013> <0016> <0030> <0018> <001C> <0035> endbfrange 7 beginbfchar <0023> <0040> <0026> <0043> <0028> <0045> <0030> <004D> <0033> <0050> <0035> <0052> <0039> <0056> endbfchar 4 beginbfrange <0044> <004C> <0061> <004F> <0052> <006C> <0054> <0059> <0071> <005B> <005C> <0078> endbfrange 4 beginbfchar <0070> <00E9> <00AB> <2026> <00B0> <0153> <00B6> <2019> endbfchar 1 beginbfrange <0084> <0086> [<0061> <0071> <0081>] endbfrange endcmap CMapName currentdict /CMap defineresource pop end end'; $unicode = new \Smalot\PdfParser\Object($document, null, $content); $document->setObjects(array('1_0' => $font, '2_0' => $unicode)); $font->init(); // Test reload $table = $font->loadTranslateTable(); $this->assert->array($table)->hasSize(47); // Test chars $this->assert->string($table[3])->isEqualTo(' '); $this->assert->string($table[15])->isEqualTo(','); $this->assert->string($table[17])->isEqualTo('.'); $this->assert->string($table[35])->isEqualTo('@'); $this->assert->string($table[57])->isEqualTo('V'); // Test ranges $this->assert->string($table[85])->isEqualTo('r'); $this->assert->string($table[92])->isEqualTo('y'); } public function testDecodeHexadecimal() { $hexa = '<322041>'; $this->assert->string(\Smalot\PdfParser\Font::decodeHexadecimal($hexa))->isEqualTo("2 A"); $this->assert->string(\Smalot\PdfParser\Font::decodeHexadecimal($hexa, false))->isEqualTo("2 A"); $this->assert->string(\Smalot\PdfParser\Font::decodeHexadecimal($hexa, true))->isEqualTo("(2 A)"); $hexa = '<003200200041>'; $this->assert->string(\Smalot\PdfParser\Font::decodeHexadecimal($hexa))->isEqualTo("\x002\x00 \x00A"); $this->assert->string(\Smalot\PdfParser\Font::decodeHexadecimal($hexa, false))->isEqualTo("\x002\x00 \x00A"); $this->assert->string(\Smalot\PdfParser\Font::decodeHexadecimal($hexa, true))->isEqualTo("(\x002\x00 \x00A)"); $hexa = '<00320020> 8 <0041>'; $this->assert->string(\Smalot\PdfParser\Font::decodeHexadecimal($hexa))->isEqualTo("\x002\x00 8 \x00A"); $this->assert->string(\Smalot\PdfParser\Font::decodeHexadecimal($hexa, false))->isEqualTo("\x002\x00 8 \x00A"); $this->assert->string(\Smalot\PdfParser\Font::decodeHexadecimal($hexa, true))->isEqualTo( "(\x002\x00 ) 8 (\x00A)" ); $hexa = '<3220> 8 <41>'; $this->assert->string(\Smalot\PdfParser\Font::decodeHexadecimal($hexa))->isEqualTo("2 8 A"); $this->assert->string(\Smalot\PdfParser\Font::decodeHexadecimal($hexa, false))->isEqualTo("2 8 A"); $this->assert->string(\Smalot\PdfParser\Font::decodeHexadecimal($hexa, true))->isEqualTo("(2 ) 8 (A)"); $hexa = '<00320020005C>-10<0041>'; $this->assert->string(\Smalot\PdfParser\Font::decodeHexadecimal($hexa))->isEqualTo("\x002\x00 \x00\\-10\x00A"); $this->assert->string(\Smalot\PdfParser\Font::decodeHexadecimal($hexa, false))->isEqualTo( "\x002\x00 \x00\\-10\x00A" ); $this->assert->string(\Smalot\PdfParser\Font::decodeHexadecimal($hexa, true))->isEqualTo( "(\x002\x00 \x00\\\\)-10(\x00A)" ); } public function testDecodeOctal() { $this->assert->string(\Smalot\PdfParser\Font::decodeOctal("\\101\\102\\040\\103"))->isEqualTo('AB C'); $this->assert->string(\Smalot\PdfParser\Font::decodeOctal("\\101\\102\\040\\103D"))->isEqualTo('AB CD'); } public function testDecodeEntities() { $this->assert->string(\Smalot\PdfParser\Font::decodeEntities("File#20Type"))->isEqualTo('File Type'); $this->assert->string(\Smalot\PdfParser\Font::decodeEntities("File##20Ty#pe"))->isEqualTo('File# Ty#pe'); } public function testDecodeUnicode() { $this->assert->string(\Smalot\PdfParser\Font::decodeUnicode("\xFE\xFF\x00A\x00B"))->isEqualTo('AB'); } public function testDecodeText() { $filename = __DIR__ . '/../../../../../samples/Document1_pdfcreator_nocompressed.pdf'; $parser = new \Smalot\PdfParser\Parser(); $document = $parser->parseFile($filename); $fonts = $document->getFonts(); /** @var \Smalot\PdfParser\Font $font */ // Cambria $font = reset($fonts); $commands = array( array( 't' => '', 'c' => "\x01\x02", ), array( 't' => 'n', 'c' => -10, ), array( 't' => '', 'c' => "\x03", ), array( 't' => '', 'c' => "\x04", ), array( 't' => 'n', 'c' => -100, ), array( 't' => '<', 'c' => "01020304", ), ); $this->assert->string($font->decodeText($commands))->isEqualTo('Docu Docu'); } } pdfparser-0.9.25/src/Smalot/PdfParser/Tests/Units/Header.php000066400000000000000000000136251257674555500236520ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Tests\Units; use mageekguy\atoum; /** * Class Header * * @package Smalot\PdfParser\Tests\Units */ class Header extends atoum\test { public function testParse() { $document = new \Smalot\PdfParser\Document(); $content = '<>foo'; $position = 0; $header = \Smalot\PdfParser\Header::parse($content, $document, $position); $this->assert->object($header)->isInstanceOf('\Smalot\PdfParser\Header'); $this->assert->integer($position)->isEqualTo(27); $this->assert->array($header->getElements())->hasSize(2); // No header to parse $this->assert->castToString($header->get('Type'))->isEqualTo('Page'); $content = 'foo'; $position = 0; $header = \Smalot\PdfParser\Header::parse($content, $document, $position); $this->assert->object($header)->isInstanceOf('\Smalot\PdfParser\Header'); $this->assert->integer($position)->isEqualTo(0); $this->assert->array($header->getElements())->hasSize(0); $position = 0; $content = "<>"; $header = \Smalot\PdfParser\Header::parse($content, $document, $position); $this->assert->integer($position)->isEqualTo(212); $position = 0; $content = '[5 0 R ] foo'; $header = \Smalot\PdfParser\Header::parse($content, $document, $position); $this->assert->integer($position)->isEqualTo(8); $this->assert->array($header->getElements())->hasSize(1); } public function testGetElements() { $document = new \Smalot\PdfParser\Document(); $content = '<>foo'; $position = 0; $header = \Smalot\PdfParser\Header::parse($content, $document, $position); $this->assert->array($elements = $header->getElements())->hasSize(2); $this->assert->object(current($elements))->isInstanceOf('\Smalot\PdfParser\Element\ElementName'); $types = $header->getElementTypes(); $this->assert->array($types); $this->assert->string($types['Type'])->isEqualTo('Smalot\PdfParser\Element\ElementName'); $this->assert->string($types['Subtype'])->isEqualTo('Smalot\PdfParser\Element\ElementName'); } public function testHas() { $document = new \Smalot\PdfParser\Document(); $content = '<>foo'; $position = 0; $header = \Smalot\PdfParser\Header::parse($content, $document, $position); $this->assert->boolean($header->has('Type'))->isEqualTo(true); $this->assert->boolean($header->has('SubType'))->isEqualTo(true); $this->assert->boolean($header->has('Font'))->isEqualTo(true); $this->assert->boolean($header->has('Text'))->isEqualTo(false); } public function testGet() { $document = new \Smalot\PdfParser\Document(); $content = '<>foo'; $position = 0; $header = \Smalot\PdfParser\Header::parse($content, $document, $position); $object = new \Smalot\PdfParser\Page($document, $header); $document->setObjects(array('5_0' => $object)); $this->assert->object($header->get('Type'))->isInstanceOf('\Smalot\PdfParser\Element\ElementName'); $this->assert->object($header->get('SubType'))->isInstanceOf('\Smalot\PdfParser\Element\ElementName'); $this->assert->object($header->get('Font'))->isInstanceOf('\Smalot\PdfParser\Page'); $this->assert->object($header->get('Image'))->isInstanceOf('\Smalot\PdfParser\Element\ElementMissing'); try { $resources = $header->get('Resources'); $this->assert->boolean(true)->isEqualTo(false); } catch (\Exception $e) { $this->assert->exception($e)->hasMessage('Missing object reference #8_0.'); } } public function testResolveXRef() { $document = new \Smalot\PdfParser\Document(); $content = '<>foo'; $position = 0; $header = \Smalot\PdfParser\Header::parse($content, $document, $position); $object = new \Smalot\PdfParser\Page($document, $header); $document->setObjects(array('5_0' => $object)); $this->assert->object($header->get('Font'))->isInstanceOf('\Smalot\PdfParser\Object'); try { $this->assert->object($header->get('Resources'))->isInstanceOf('\Smalot\PdfParser\Element\ElementMissing'); $this->assert->boolean(true)->isEqualTo(false); } catch (\Exception $e) { $this->assert->exception($e)->hasMessage('Missing object reference #8_0.'); } } } pdfparser-0.9.25/src/Smalot/PdfParser/Tests/Units/Object.php000066400000000000000000000214201257674555500236600ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Tests\Units; use mageekguy\atoum; /** * Class Object * * @package Smalot\PdfParser\Tests\Units */ class Object extends atoum\test { const TYPE = 't'; const OPERATOR = 'o'; const COMMAND = 'c'; public function testGetTextParts() { } // public function testGetCommandsImage() // { // $content = "/CS/RGB ///W 22 ///H 1 ///BPC 8 ///F/Fl ///DP<> //ID \x00\x50c\x63 //EI Q //q -124.774 124.127 5.64213 5.67154 930.307 4436.95 cm //BI //"; // // $document = new \Smalot\PdfParser\Document(); // $object = new \Smalot\PdfParser\Object($document); // $offset = 0; // $parts = $object->getCommandsImage($content, $offset); // $reference = array( // array( // self::TYPE => '/', // self::OPERATOR => 'CS', // self::COMMAND => 'RGB', // ), // array( // self::TYPE => '/', // self::OPERATOR => 'W', // self::COMMAND => '22', // ), // array( // self::TYPE => '/', // self::OPERATOR => 'H', // self::COMMAND => '1', // ), // array( // self::TYPE => '/', // self::OPERATOR => 'BPC', // self::COMMAND => '8', // ), // array( // self::TYPE => '/', // self::OPERATOR => 'F', // self::COMMAND => 'Fl', // ), // array( // self::TYPE => 'struct', // self::OPERATOR => 'DP', // self::COMMAND => array( // array( // self::TYPE => '/', // self::OPERATOR => 'Predictor', // self::COMMAND => '15', // ), // array( // self::TYPE => '/', // self::OPERATOR => 'Columns', // self::COMMAND => '22', // ), // array( // self::TYPE => '/', // self::OPERATOR => 'Colors', // self::COMMAND => '3', // ), // ), // ), // array( // self::TYPE => '', // self::OPERATOR => 'ID', // self::COMMAND => "\x00\x50c\x63", // ), // ); // // $this->assert->array($parts)->isEqualTo($reference); // $this->assert->integer($offset)->isEqualTo(83); // } public function testGetCommandsText() { $content = "/R14 30 Tf 0.999016 0 0 1 137.4 342.561 Tm [(A)-168.854( BC D)-220.905(\\(E\\))20.905<20>] TJ /R14 17.16 Tf <20> Tj 0.999014 0 0 1 336.84 319.161 Tm T* ( \x00m)Tj /R14 20.04 Tf ET Q q -124.774 124.127 5.64213 5.67154 930.307 4436.95 cm BI"; $document = new \Smalot\PdfParser\Document(); $object = new \Smalot\PdfParser\Object($document); $offset = 0; $parts = $object->getCommandsText($content, $offset); $reference = array( array( self::TYPE => '/', self::OPERATOR => 'Tf', self::COMMAND => 'R14 30', ), array( self::TYPE => '', self::OPERATOR => 'Tm', self::COMMAND => "0.999016 0 0 1 137.4\n342.561", ), array( self::TYPE => '[', self::OPERATOR => 'TJ', self::COMMAND => array( array( self::TYPE => '(', self::OPERATOR => '', self::COMMAND => 'A', ), array( self::TYPE => 'n', self::OPERATOR => '', self::COMMAND => '-168.854', ), array( self::TYPE => '(', self::OPERATOR => '', self::COMMAND => ' BC D', ), array( self::TYPE => 'n', self::OPERATOR => '', self::COMMAND => '-220.905', ), array( self::TYPE => '(', self::OPERATOR => '', self::COMMAND => '\\(E\\)', ), array( self::TYPE => 'n', self::OPERATOR => '', self::COMMAND => '20.905', ), array( self::TYPE => '<', self::OPERATOR => '', self::COMMAND => '20', ), ), ), array( self::TYPE => '/', self::OPERATOR => 'Tf', self::COMMAND => 'R14 17.16', ), array( self::TYPE => '<', self::OPERATOR => 'Tj', self::COMMAND => '20', ), array( self::TYPE => '', self::OPERATOR => 'Tm', self::COMMAND => '0.999014 0 0 1 336.84 319.161', ), array( self::TYPE => '', self::OPERATOR => 'T*', self::COMMAND => '', ), array( self::TYPE => '(', self::OPERATOR => 'Tj', self::COMMAND => " \x00m", ), array( self::TYPE => '/', self::OPERATOR => 'Tf', self::COMMAND => 'R14 20.04', ), ); $this->assert->array($parts)->isEqualTo($reference); $this->assert->integer($offset)->isEqualTo(172); } public function testCleanContent() { $content = '/Shape <>> BT >>BDC Q /CS0 cs 1 1 0 scn 1 i /GS0 gs BT /TT0 1 Tf 0.0007 Tc 0.0018 Tw 0 Ts 100 Tz 0 Tr 24 0 0 24 51.3 639.26025 Tm (Modificatio[ns] au \\(14\\) septembre 2009 ET 2010)Tj EMC (ABC) Tj [ (a)-4.5(b)6(c)8.8 ( fsdfsdfsdf[]sd) ] TD ET /Shape <>BDC q 0.03 841'; $expected = '_____________________________________ Q /CS0 cs 1 1 0 scn 1 i /GS0 gs BT /TT0 1 Tf 0.0007 Tc 0.0018 Tw 0 Ts 100 Tz 0 Tr 24 0 0 24 51.3 639.26025 Tm (________________________________________________)Tj ___ (___) Tj [_____________________________________] TD ET ______________________ q 0.03 841'; $document = new \Smalot\PdfParser\Document(); $object = new \Smalot\PdfParser\Object($document); $cleaned = $object->cleanContent($content, '_'); $this->assert->string($cleaned)->length->isEqualTo(strlen($content)); $this->assert->string($cleaned)->isEqualTo($expected); } public function testGetSectionText() { $content = '/Shape <>BDC Q /CS0 cs 1 1 0 scn 1 i /GS0 gs BT /TT0 1 Tf 0.0007 Tc 0.0018 Tw 0 Ts 100 Tz 0 Tr 24 0 0 24 51.3 639.26025 Tm (Mod BT atio[ns] au \\(14\\) septembre 2009 ET 2010)Tj EMC (ABC) Tj [ (a)-4.5(b) 6(c)8.8 ( fsdfsdfsdf[ sd) ] TD ET /Shape <>BDC BT /TT1 1.5 Tf (BT )Tj ET q 0.03 841'; $document = new \Smalot\PdfParser\Document(); $object = new \Smalot\PdfParser\Object($document); $sections = $object->getSectionsText($content); // $this->assert->string($cleaned)->length->isEqualTo(strlen($content)); // $this->assert->string($cleaned)->isEqualTo($expected); } } pdfparser-0.9.25/src/Smalot/PdfParser/Tests/Units/Page.php000066400000000000000000000076371257674555500233440ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Tests\Units; use mageekguy\atoum; /** * Class Page * * @package Smalot\PdfParser\Tests\Units */ class Page extends atoum\test { public function testGetFonts() { // Document with text. $filename = __DIR__ . '/../../../../../samples/Document1_pdfcreator_nocompressed.pdf'; $parser = new \Smalot\PdfParser\Parser(); $document = $parser->parseFile($filename); $pages = $document->getPages(); $page = $pages[0]; // the first to load data. $fonts = $page->getFonts(); $this->assert->array($fonts)->isNotEmpty(); foreach ($fonts as $font) { $this->assert->object($font)->isInstanceOf('\Smalot\PdfParser\Font'); } // the second to use cache. $fonts = $page->getFonts(); $this->assert->array($fonts)->isNotEmpty(); // ------------------------------------------------------ // Document without text. $filename = __DIR__ . '/../../../../../samples/Document3_pdfcreator_nocompressed.pdf'; $document = $parser->parseFile($filename); $pages = $document->getPages(); $page = $pages[0]; // the first to load data. $fonts = $page->getFonts(); $this->assert->array($fonts)->isEmpty(); // the second to use cache. $fonts = $page->getFonts(); $this->assert->array($fonts)->isEmpty(); } public function testGetFont() { // Document with text. $filename = __DIR__ . '/../../../../../samples/Document1_pdfcreator_nocompressed.pdf'; $parser = new \Smalot\PdfParser\Parser(); $document = $parser->parseFile($filename); $pages = $document->getPages(); $page = $pages[0]; // the first to load data. $font = $page->getFont('R7'); $this->assert->object($font)->isInstanceOf('\Smalot\PdfParser\Font'); $font = $page->getFont('ABC7'); $this->assert->object($font)->isInstanceOf('\Smalot\PdfParser\Font'); } public function testGetText() { // Document with text. $filename = __DIR__ . '/../../../../../samples/Document1_pdfcreator_nocompressed.pdf'; $parser = new \Smalot\PdfParser\Parser(); $document = $parser->parseFile($filename); $pages = $document->getPages(); $page = $pages[0]; $text = $page->getText(); $this->assert->string($text)->hasLengthGreaterThan(150); $this->assert->string($text)->contains('Document title'); $this->assert->string($text)->contains('Lorem ipsum'); $this->assert->string($text)->contains('Calibri'); $this->assert->string($text)->contains('Arial'); $this->assert->string($text)->contains('Times'); $this->assert->string($text)->contains('Courier New'); $this->assert->string($text)->contains('Verdana'); } } pdfparser-0.9.25/src/Smalot/PdfParser/Tests/Units/Parser.php000066400000000000000000000042151257674555500237110ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\Tests\Units; use mageekguy\atoum; /** * Class Parser * * @package Smalot\PdfParser\Tests\Units */ class Parser extends atoum\test { public function testParseFile() { $directory = getcwd() . '/samples/bugs'; if (is_dir($directory)) { $files = scandir($directory); $parser = new \Smalot\PdfParser\Parser(); foreach ($files as $file) { if (preg_match('/^.*\.pdf$/i', $file)) { try { $document = $parser->parseFile($directory . '/' . $file); $pages = $document->getPages(); $page = $pages[0]; $content = $page->getText(); $this->assert->string($content); } catch (\Exception $e) { if ($e->getMessage() != 'Secured pdf file are currently not supported.' && strpos($e->getMessage(), 'TCPDF_PARSER') != 0) { throw $e; } } } } } } } pdfparser-0.9.25/src/Smalot/PdfParser/XObject/000077500000000000000000000000001257674555500210745ustar00rootroot00000000000000pdfparser-0.9.25/src/Smalot/PdfParser/XObject/Form.php000066400000000000000000000030271257674555500225120ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\XObject; use Smalot\PdfParser\Header; use Smalot\PdfParser\Object; use Smalot\PdfParser\Page; /** * Class Form * * @package Smalot\PdfParser\XObject */ class Form extends Page { /** * @param Page * * @return string */ public function getText(Page $page = null) { $header = new Header(array(), $this->document); $contents = new Object($this->document, $header, $this->content); return $contents->getText($this); } } pdfparser-0.9.25/src/Smalot/PdfParser/XObject/Image.php000066400000000000000000000025421257674555500226320ustar00rootroot00000000000000 * @date 2013-08-08 * @license GPL-3.0 * @url * * PdfParser is a pdf library written in PHP, extraction oriented. * Copyright (C) 2014 - Sébastien MALOT * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. * If not, see . * */ namespace Smalot\PdfParser\XObject; use Smalot\PdfParser\Object; use Smalot\PdfParser\Page; /** * Class Image * * @package Smalot\PdfParser\XObject */ class Image extends Object { /** * @param Page * * @return string */ public function getText(Page $page = null) { return ''; } }