dompdf-0.6.2/000077500000000000000000000000001263120276100127705ustar00rootroot00000000000000dompdf-0.6.2/.gitattributes000066400000000000000000000002311263120276100156570ustar00rootroot00000000000000*.json text *.xml text *.php text *.LGPL text *.md text *.skel text *.css text *.inc text *.js text *.html text *.txt text *.svg text dompdf-0.6.2/.gitignore000066400000000000000000000001601263120276100147550ustar00rootroot00000000000000.DS_Store composer.lock vendor .idea .project lib/fonts/*.afm.php lib/fonts/*.ufm.php lib/fonts/log.htm dompdf-0.6.2/.gitmodules000066400000000000000000000001511263120276100151420ustar00rootroot00000000000000[submodule "lib/php-font-lib"] path = lib/php-font-lib url = https://github.com/PhenX/php-font-lib.git dompdf-0.6.2/CONTRIBUTING.md000066400000000000000000000061501263120276100152230ustar00rootroot00000000000000# How to contribute - [Getting help](#getting-help) - [Submitting bug reports](#submitting-bug-reports) - [Contributing code](#contributing-code) ## Getting help Community discussion, questions, and informal bug reporting is done on the [dompdf Google group](http://groups.google.com/group/dompdf). You may also seek help on [StackOverflow](http://stackoverflow.com/questions/tagged/dompdf). ## Submitting bug reports The preferred way to report bugs is to use the [GitHub issue tracker](http://github.com/dompdf/dompdf/issues). Before reporting a bug, read these pointers. **Please search inside the bug tracker to see if the bug you found is not already reported.** **Note:** The issue tracker is for *bugs* and *feature requests*, not requests for help. Questions should be asked on the [dompdf Google group](http://groups.google.com/group/dompdf) instead. ### Reporting bugs effectively - dompdf is maintained by volunteers. They don't owe you anything, so be polite. Reports with an indignant or belligerent tone tend to be moved to the bottom of the pile. - Include information about **the PHP version on which the problem occurred**. Even if you tested several PHP version on different servers, and the problem occurred in all of them, mention this fact in the bug report. Also include the operating system it's installed on. PHP configuration can also help, and server error logs (like Apache logs) - Mention which release of dompdf you're using (the zip, the master branch, etc). Preferably, try also with the current development snapshot, to ensure the problem has not already been fixed. - Mention very precisely what went wrong. "X is broken" is not a good bug report. What did you expect to happen? What happened instead? Describe the exact steps a maintainer has to take to make the problem occur. We can not fix something that we can not observe. - If the problem can not be reproduced in any of the demos included in the dompdf distribution, please provide an HTML document that demonstrates the problem. There are a few options to show us your code: - [JS Fiddle](http://jsfiddle.net/) - [dompdf debug helper](http://eclecticgeek.com/dompdf/debug.php) (provided by @bsweeney) - Include the HTML/CSS inside the bug report, with [code highlighting](https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#wiki-code). ## Contributing code - Make sure you have a [GitHub Account](https://github.com/signup/free) - Fork [dompdf](https://github.com/dompdf/dompdf/) ([how to fork a repo](https://help.github.com/articles/fork-a-repo)) - *Make your changes on the dev branch* or the most appropriate feature branch. Please only patch the master branch if you are attempting to address an urgent bug in the released code. - Add a simple test file in `www/test/`, with a comprehensive name. - Submit a pull request ([how to create a pull request](https://help.github.com/articles/fork-a-repo)) ### Coding standards - 2 spaces per indentation level, no tabs. - spaces inside `if` like this: ```php if ( $foo == "bar" ) { // } ``` - booleans in lowercase - opening braces *always* on the same line dompdf-0.6.2/LICENSE.LGPL000066400000000000000000000574401263120276100145440ustar00rootroot00000000000000 GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. GNU LESSER GENERAL PUBLIC LICENSE TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a) The modified work must itself be a software library. b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.dompdf-0.6.2/README.md000066400000000000000000000123641263120276100142550ustar00rootroot00000000000000[![Latest Stable Version](https://poser.pugx.org/dompdf/dompdf/v/stable.png)](https://packagist.org/packages/dompdf/dompdf) [![Total Downloads](https://poser.pugx.org/dompdf/dompdf/downloads.png)](https://packagist.org/packages/dompdf/dompdf) [![Latest Unstable Version](https://poser.pugx.org/dompdf/dompdf/v/unstable.png)](https://packagist.org/packages/dompdf/dompdf) [![License](https://poser.pugx.org/dompdf/dompdf/license.png)](https://packagist.org/packages/dompdf/dompdf) **dompdf is an HTML to PDF converter**. At its heart, dompdf is (mostly) [CSS 2.1](http://www.w3.org/TR/CSS2/) compliant HTML layout and rendering engine written in PHP. It is a style-driven renderer: it will download and read external stylesheets, inline style tags, and the style attributes of individual HTML elements. It also supports most presentational HTML attributes. ---- **Check out the [Demo](http://pxd.me/dompdf/www/examples.php) and ask any question on [StackOverflow](http://stackoverflow.com/questions/tagged/dompdf) or on the [Google Groups](http://groups.google.com/group/dompdf)** ---- [![Follow us on Twitter](http://twitter-badges.s3.amazonaws.com/twitter-a.png)](http://www.twitter.com/dompdf) [![Follow us on Google+](https://ssl.gstatic.com/images/icons/gplus-32.png)](https://plus.google.com/108710008521858993320?prsrc=3) Features ======== * handles most CSS 2.1 and a few CSS3 properties, including @import, @media & @page rules * supports most presentational HTML 4.0 attributes * supports external stylesheets, either local or through http/ftp (via fopen-wrappers) * supports complex tables, including row & column spans, separate & collapsed border models, individual cell styling * image support (gif, png (8, 24 and 32 bit with alpha channel), bmp & jpeg) * no dependencies on external PDF libraries, thanks to the R&OS PDF class * inline PHP support Requirements ============ * PHP 5.0+ (5.3+ recommended) * DOM extension * GD extension Recommendations ============ * MBString extension: provides internationalization support. This extension is *not* enabled by default. dompdf has limited internationalization support when this extension is not enabled. * opcache (OPcache, XCache, APC, etc.): improves performance About Fonts & Character Encoding ============ PDF documents internally support the following fonts: Helvetica, Times-Roman, Courier, Zapf-Dingbats, & Symbol. These fonts only support Windows ANSI encoding. In order for a PDF to display characters that are not available in Windows ANSI you must supply an external font. dompdf will embed any referenced font in the PDF so long as it has been pre-loaded or is accessible to dompdf and reference in CSS @font-face rules. See the [font overview](https://github.com/dompdf/dompdf/wiki/About-Fonts-and-Character-Encoding) for more information on how to use fonts. The [DejaVu TrueType fonts](http://dejavu-fonts.org) have been pre-installed to give dompdf decent Unicode character coverage by default. To use the DejaVu fonts reference the font in your stylesheet, e.g. `body { font-family: DejaVu Sans; }` (for DejaVu Sans). Easy Installation ============ Install with git --- From the command line switch to the directory where dompdf will reside and run the following commands: ```sh git clone https://github.com/dompdf/dompdf.git . git submodule init git submodule update ``` Install with composer --- To install with Composer, simply add the requirement to your `composer.json` file: ```json { "require" : { "dompdf/dompdf" : "0.6.*" } } ``` And run Composer to update your dependencies: ```bash $ curl -sS http://getcomposer.org/installer | php $ php composer.phar update ``` Before you can use the Composer installation of DOMPDF in your application you must disable dompdf's default auto-loader, include the Composer autoloader, and load the dompdf configuration file: ```php // somewhere early in your project's loading, require the Composer autoloader // see: http://getcomposer.org/doc/00-intro.md require 'vendor/autoload.php'; // disable DOMPDF's internal autoloader if you are using Composer define('DOMPDF_ENABLE_AUTOLOAD', false); // include DOMPDF's default configuration require_once '/path/to/vendor/dompdf/dompdf/dompdf_config.inc.php'; ``` Download and install --- Download an archive of dompdf and extract it into the directory where dompdf will reside * You can download stable copies of dompdf from https://github.com/dompdf/dompdf/tags * Or download a nightly (the latest, unreleased code) from http://eclecticgeek.com/dompdf Limitations (Known Issues) ========================== * not particularly tolerant to poorly-formed HTML input. To avoid any unexpected rendering issues you should either enable the built-in HTML5 parser (via the `DOMPDF_ENABLE_HTML5PARSER` configuration constant) or run your HTML through a HTML validator/cleaner (such as Tidy). * large files or large tables can take a while to render * CSS float is not supported (but is in the works, enable it through the `DOMPDF_ENABLE_CSS_FLOAT` configuration constant). If you find this project useful, please consider making a donation. (Any funds donated will be used to help further development on this project.) [![Donate button](https://www.paypal.com/en_US/i/btn/btn_donate_SM.gif)](http://goo.gl/DSvWf) dompdf-0.6.2/composer.json000066400000000000000000000010571263120276100155150ustar00rootroot00000000000000{ "name": "dompdf/dompdf", "type": "library", "description": "DOMPDF is a CSS 2.1 compliant HTML to PDF converter", "homepage": "https://github.com/dompdf/dompdf", "license": "LGPL", "authors": [ { "name": "Fabien Ménager", "email": "fabien.menager@gmail.com" }, { "name": "Brian Sweeney", "email": "eclecticgeek@gmail.com" } ], "autoload": { "classmap": ["include/"] }, "require": { "phenx/php-font-lib": "0.2.*" } } dompdf-0.6.2/dompdf.php000077500000000000000000000150141263120276100147560ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Display command line usage */ function dompdf_usage() { $default_paper_size = DOMPDF_DEFAULT_PAPER_SIZE; echo <<set_option('enable_php', false); if ( isset($_GET["input_file"]) ) $file = rawurldecode($_GET["input_file"]); else throw new DOMPDF_Exception("An input file is required (i.e. input_file _GET variable)."); if ( isset($_GET["paper"]) ) $paper = rawurldecode($_GET["paper"]); else $paper = DOMPDF_DEFAULT_PAPER_SIZE; if ( isset($_GET["orientation"]) ) $orientation = rawurldecode($_GET["orientation"]); else $orientation = "portrait"; if ( isset($_GET["base_path"]) ) { $base_path = rawurldecode($_GET["base_path"]); $file = $base_path . $file; # Set the input file } if ( isset($_GET["options"]) ) { $options = $_GET["options"]; } $file_parts = explode_url($file); $outfile = "dompdf_out.pdf"; # Don't allow them to set the output file $save_file = false; # Don't save the file break; } if ( $file === "-" ) { $str = ""; while ( !feof(STDIN) ) $str .= fread(STDIN, 4096); $dompdf->load_html($str); } else $dompdf->load_html_file($file); if ( isset($base_path) ) { $dompdf->set_base_path($base_path); } $dompdf->set_paper($paper, $orientation); $dompdf->render(); if ( $_dompdf_show_warnings ) { global $_dompdf_warnings; foreach ($_dompdf_warnings as $msg) echo $msg . "\n"; echo $dompdf->get_canvas()->get_cpdf()->messages; flush(); } if ( $save_file ) { // if ( !is_writable($outfile) ) // throw new DOMPDF_Exception("'$outfile' is not writable."); if ( strtolower(DOMPDF_PDF_BACKEND) === "gd" ) $outfile = str_replace(".pdf", ".png", $outfile); list($proto, $host, $path, $file) = explode_url($outfile); if ( $proto != "" ) // i.e. not file:// $outfile = $file; // just save it locally, FIXME? could save it like wget: ./host/basepath/file $outfile = realpath(dirname($outfile)) . DIRECTORY_SEPARATOR . basename($outfile); if ( strpos($outfile, DOMPDF_CHROOT) !== 0 ) throw new DOMPDF_Exception("Permission denied."); file_put_contents($outfile, $dompdf->output( array("compress" => 0) )); exit(0); } if ( !headers_sent() ) { $dompdf->stream($outfile, $options); } dompdf-0.6.2/dompdf_config.custom.inc.php000066400000000000000000000030461263120276100203630ustar00rootroot00000000000000 * @author Helmut Tischer * @author Fabien Ménager * @author Brian Sweeney * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ if ( class_exists( 'DOMPDF' , false ) ) { return; } PHP_VERSION >= 5.0 or die("DOMPDF requires PHP 5.0+"); /** * The root of your DOMPDF installation */ define("DOMPDF_DIR", str_replace(DIRECTORY_SEPARATOR, '/', realpath(dirname(__FILE__)))); /** * The location of the DOMPDF include directory */ define("DOMPDF_INC_DIR", DOMPDF_DIR . "/include"); /** * The location of the DOMPDF lib directory */ define("DOMPDF_LIB_DIR", DOMPDF_DIR . "/lib"); /** * Some installations don't have $_SERVER['DOCUMENT_ROOT'] * http://fyneworks.blogspot.com/2007/08/php-documentroot-in-iis-windows-servers.html */ if( !isset($_SERVER['DOCUMENT_ROOT']) ) { $path = ""; if ( isset($_SERVER['SCRIPT_FILENAME']) ) $path = $_SERVER['SCRIPT_FILENAME']; elseif ( isset($_SERVER['PATH_TRANSLATED']) ) $path = str_replace('\\\\', '\\', $_SERVER['PATH_TRANSLATED']); $_SERVER['DOCUMENT_ROOT'] = str_replace( '\\', '/', substr($path, 0, 0-strlen($_SERVER['PHP_SELF']))); } /** Include the custom config file if it exists */ if ( file_exists(DOMPDF_DIR . "/dompdf_config.custom.inc.php") ){ require_once(DOMPDF_DIR . "/dompdf_config.custom.inc.php"); } //FIXME: Some function definitions rely on the constants defined by DOMPDF. However, might this location prove problematic? require_once(DOMPDF_INC_DIR . "/functions.inc.php"); /** * Username and password used by the configuration utility in www/ */ def("DOMPDF_ADMIN_USERNAME", "user"); def("DOMPDF_ADMIN_PASSWORD", "password"); /** * The location of the DOMPDF font directory * * The location of the directory where DOMPDF will store fonts and font metrics * Note: This directory must exist and be writable by the webserver process. * *Please note the trailing slash.* * * Notes regarding fonts: * Additional .afm font metrics can be added by executing load_font.php from command line. * * Only the original "Base 14 fonts" are present on all pdf viewers. Additional fonts must * be embedded in the pdf file or the PDF may not display correctly. This can significantly * increase file size unless font subsetting is enabled. Before embedding a font please * review your rights under the font license. * * Any font specification in the source HTML is translated to the closest font available * in the font directory. * * The pdf standard "Base 14 fonts" are: * Courier, Courier-Bold, Courier-BoldOblique, Courier-Oblique, * Helvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique, * Times-Roman, Times-Bold, Times-BoldItalic, Times-Italic, * Symbol, ZapfDingbats. */ def("DOMPDF_FONT_DIR", DOMPDF_DIR . "/lib/fonts/"); /** * The location of the DOMPDF font cache directory * * This directory contains the cached font metrics for the fonts used by DOMPDF. * This directory can be the same as DOMPDF_FONT_DIR * * Note: This directory must exist and be writable by the webserver process. */ def("DOMPDF_FONT_CACHE", DOMPDF_FONT_DIR); /** * The location of a temporary directory. * * The directory specified must be writeable by the webserver process. * The temporary directory is required to download remote images and when * using the PFDLib back end. */ def("DOMPDF_TEMP_DIR", sys_get_temp_dir()); /** * ==== IMPORTANT ==== * * dompdf's "chroot": Prevents dompdf from accessing system files or other * files on the webserver. All local files opened by dompdf must be in a * subdirectory of this directory. DO NOT set it to '/' since this could * allow an attacker to use dompdf to read any files on the server. This * should be an absolute path. * This is only checked on command line call by dompdf.php, but not by * direct class use like: * $dompdf = new DOMPDF(); $dompdf->load_html($htmldata); $dompdf->render(); $pdfdata = $dompdf->output(); */ def("DOMPDF_CHROOT", realpath(DOMPDF_DIR)); /** * Whether to use Unicode fonts or not. * * When set to true the PDF backend must be set to "CPDF" and fonts must be * loaded via load_font.php. * * When enabled, dompdf can support all Unicode glyphs. Any glyphs used in a * document must be present in your fonts, however. */ def("DOMPDF_UNICODE_ENABLED", true); /** * Whether to enable font subsetting or not. */ def("DOMPDF_ENABLE_FONTSUBSETTING", false); /** * The PDF rendering backend to use * * Valid settings are 'PDFLib', 'CPDF' (the bundled R&OS PDF class), 'GD' and * 'auto'. 'auto' will look for PDFLib and use it if found, or if not it will * fall back on CPDF. 'GD' renders PDFs to graphic files. {@link * Canvas_Factory} ultimately determines which rendering class to instantiate * based on this setting. * * Both PDFLib & CPDF rendering backends provide sufficient rendering * capabilities for dompdf, however additional features (e.g. object, * image and font support, etc.) differ between backends. Please see * {@link PDFLib_Adapter} for more information on the PDFLib backend * and {@link CPDF_Adapter} and lib/class.pdf.php for more information * on CPDF. Also see the documentation for each backend at the links * below. * * The GD rendering backend is a little different than PDFLib and * CPDF. Several features of CPDF and PDFLib are not supported or do * not make any sense when creating image files. For example, * multiple pages are not supported, nor are PDF 'objects'. Have a * look at {@link GD_Adapter} for more information. GD support is * experimental, so use it at your own risk. * * @link http://www.pdflib.com * @link http://www.ros.co.nz/pdf * @link http://www.php.net/image */ def("DOMPDF_PDF_BACKEND", "CPDF"); /** * PDFlib license key * * If you are using a licensed, commercial version of PDFlib, specify * your license key here. If you are using PDFlib-Lite or are evaluating * the commercial version of PDFlib, comment out this setting. * * @link http://www.pdflib.com * * If pdflib present in web server and auto or selected explicitely above, * a real license code must exist! */ //def("DOMPDF_PDFLIB_LICENSE", "your license key here"); /** * html target media view which should be rendered into pdf. * List of types and parsing rules for future extensions: * http://www.w3.org/TR/REC-html40/types.html * screen, tty, tv, projection, handheld, print, braille, aural, all * Note: aural is deprecated in CSS 2.1 because it is replaced by speech in CSS 3. * Note, even though the generated pdf file is intended for print output, * the desired content might be different (e.g. screen or projection view of html file). * Therefore allow specification of content here. */ def("DOMPDF_DEFAULT_MEDIA_TYPE", "screen"); /** * The default paper size. * * North America standard is "letter"; other countries generally "a4" * * @see CPDF_Adapter::PAPER_SIZES for valid sizes */ def("DOMPDF_DEFAULT_PAPER_SIZE", "letter"); /** * The default font family * * Used if no suitable fonts can be found. This must exist in the font folder. * @var string */ def("DOMPDF_DEFAULT_FONT", "serif"); /** * Image DPI setting * * This setting determines the default DPI setting for images and fonts. The * DPI may be overridden for inline images by explictly setting the * image's width & height style attributes (i.e. if the image's native * width is 600 pixels and you specify the image's width as 72 points, * the image will have a DPI of 600 in the rendered PDF. The DPI of * background images can not be overridden and is controlled entirely * via this parameter. * * For the purposes of DOMPDF, pixels per inch (PPI) = dots per inch (DPI). * If a size in html is given as px (or without unit as image size), * this tells the corresponding size in pt at 72 DPI. * This adjusts the relative sizes to be similar to the rendering of the * html page in a reference browser. * * In pdf, always 1 pt = 1/72 inch * * Rendering resolution of various browsers in px per inch: * Windows Firefox and Internet Explorer: * SystemControl->Display properties->FontResolution: Default:96, largefonts:120, custom:? * Linux Firefox: * about:config *resolution: Default:96 * (xorg screen dimension in mm and Desktop font dpi settings are ignored) * * Take care about extra font/image zoom factor of browser. * * In images, size in pixel attribute, img css style, are overriding * the real image dimension in px for rendering. * * @var int */ def("DOMPDF_DPI", 96); /** * Enable inline PHP * * If this setting is set to true then DOMPDF will automatically evaluate * inline PHP contained within tags. * * Attention! * Enabling this for documents you do not trust (e.g. arbitrary remote html * pages) is a security risk. Inline scripts are run with the same level of * system access available to dompdf. Set this option to false (recommended) * if you wish to process untrusted documents. * * @var bool */ def("DOMPDF_ENABLE_PHP", false); /** * Enable inline Javascript * * If this setting is set to true then DOMPDF will automatically insert * JavaScript code contained within tags. * * @var bool */ def("DOMPDF_ENABLE_JAVASCRIPT", true); /** * Enable remote file access * * If this setting is set to true, DOMPDF will access remote sites for * images and CSS files as required. * This is required for part of test case www/test/image_variants.html through www/examples.php * * Attention! * This can be a security risk, in particular in combination with DOMPDF_ENABLE_PHP and * allowing remote access to dompdf.php or on allowing remote html code to be passed to * $dompdf = new DOMPDF(); $dompdf->load_html(...); * This allows anonymous users to download legally doubtful internet content which on * tracing back appears to being downloaded by your server, or allows malicious php code * in remote html pages to be executed by your server with your account privileges. * * @var bool */ def("DOMPDF_ENABLE_REMOTE", false); /** * The debug output log * @var string */ def("DOMPDF_LOG_OUTPUT_FILE", DOMPDF_FONT_DIR."log.htm"); /** * A ratio applied to the fonts height to be more like browsers' line height */ def("DOMPDF_FONT_HEIGHT_RATIO", 1.1); /** * Enable CSS float * * Allows people to disabled CSS float support * @var bool */ def("DOMPDF_ENABLE_CSS_FLOAT", false); /** * Enable the built in DOMPDF autoloader * * @var bool */ def("DOMPDF_ENABLE_AUTOLOAD", true); /** * Prepend the DOMPDF autoload function to the spl_autoload stack * * @var bool */ def("DOMPDF_AUTOLOAD_PREPEND", false); /** * Use the more-than-experimental HTML5 Lib parser */ def("DOMPDF_ENABLE_HTML5PARSER", false); require_once(DOMPDF_LIB_DIR . "/html5lib/Parser.php"); // ### End of user-configurable options ### /** * Load autoloader */ if (DOMPDF_ENABLE_AUTOLOAD) { require_once(DOMPDF_INC_DIR . "/autoload.inc.php"); require_once(DOMPDF_LIB_DIR . "/php-font-lib/classes/Font.php"); } /** * Ensure that PHP is working with text internally using UTF8 character encoding. */ mb_internal_encoding('UTF-8'); /** * Global array of warnings generated by DomDocument parser and * stylesheet class * * @var array */ global $_dompdf_warnings; $_dompdf_warnings = array(); /** * If true, $_dompdf_warnings is dumped on script termination when using * dompdf/dompdf.php or after rendering when using the DOMPDF class. * When using the class, setting this value to true will prevent you from * streaming the PDF. * * @var bool */ global $_dompdf_show_warnings; $_dompdf_show_warnings = false; /** * If true, the entire tree is dumped to stdout in dompdf.cls.php. * Setting this value to true will prevent you from streaming the PDF. * * @var bool */ global $_dompdf_debug; $_dompdf_debug = false; /** * Array of enabled debug message types * * @var array */ global $_DOMPDF_DEBUG_TYPES; $_DOMPDF_DEBUG_TYPES = array(); //array("page-break" => 1); /* Optionally enable different classes of debug output before the pdf content. * Visible if displaying pdf as text, * E.g. on repeated display of same pdf in browser when pdf is not taken out of * the browser cache and the premature output prevents setting of the mime type. */ def('DEBUGPNG', false); def('DEBUGKEEPTEMP', false); def('DEBUGCSS', false); /* Layout debugging. Will display rectangles around different block levels. * Visible in the PDF itself. */ def('DEBUG_LAYOUT', false); def('DEBUG_LAYOUT_LINES', true); def('DEBUG_LAYOUT_BLOCKS', true); def('DEBUG_LAYOUT_INLINE', true); def('DEBUG_LAYOUT_PADDINGBOX', true); dompdf-0.6.2/include/000077500000000000000000000000001263120276100144135ustar00rootroot00000000000000dompdf-0.6.2/include/absolute_positioner.cls.php000066400000000000000000000062131263120276100217770ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Positions absolutely positioned frames */ class Absolute_Positioner extends Positioner { function __construct(Frame_Decorator $frame) { parent::__construct($frame); } function position() { $frame = $this->_frame; $style = $frame->get_style(); $p = $frame->find_positionned_parent(); list($x, $y, $w, $h) = $frame->get_containing_block(); $top = $style->length_in_pt($style->top, $h); $right = $style->length_in_pt($style->right, $w); $bottom = $style->length_in_pt($style->bottom, $h); $left = $style->length_in_pt($style->left, $w); if ( $p && !($left === "auto" && $right === "auto") ) { // Get the parent's padding box (see http://www.w3.org/TR/CSS21/visuren.html#propdef-top) list($x, $y, $w, $h) = $p->get_padding_box(); } list($width, $height) = array($frame->get_margin_width(), $frame->get_margin_height()); $orig_style = $this->_frame->get_original_style(); $orig_width = $orig_style->width; $orig_height = $orig_style->height; /**************************** Width auto: ____________| left=auto | left=fixed | right=auto | A | B | right=fixed | C | D | Width fixed: ____________| left=auto | left=fixed | right=auto | E | F | right=fixed | G | H | *****************************/ if ( $left === "auto" ) { if ( $right === "auto" ) { // A or E - Keep the frame at the same position $x = $x + $frame->find_block_parent()->get_current_line_box()->w; } else { if ( $orig_width === "auto" ) { // C $x += $w - $width - $right; } else { // G $x += $w - $width - $right; } } } else { if ( $right === "auto" ) { // B or F $x += $left; } else { if ( $orig_width === "auto" ) { // D - TODO change width $x += $left; } else { // H - Everything is fixed: left + width win $x += $left; } } } // The same vertically if ( $top === "auto" ) { if ( $bottom === "auto" ) { // A or E - Keep the frame at the same position $y = $frame->find_block_parent()->get_current_line_box()->y; } else { if ( $orig_height === "auto" ) { // C $y += $h - $height - $bottom; } else { // G $y += $h - $height - $bottom; } } } else { if ( $bottom === "auto" ) { // B or F $y += $top; } else { if ( $orig_height === "auto" ) { // D - TODO change height $y += $top; } else { // H - Everything is fixed: top + height win $y += $top; } } } $frame->set_position($x, $y); } }dompdf-0.6.2/include/abstract_renderer.cls.php000066400000000000000000000546461263120276100214140ustar00rootroot00000000000000 * @author Helmut Tischer * @author Fabien Ménager * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Base renderer class * * @access private * @package dompdf */ abstract class Abstract_Renderer { /** * Rendering backend * * @var Canvas */ protected $_canvas; /** * Current dompdf instance * * @var DOMPDF */ protected $_dompdf; /** * Class constructor * * @param DOMPDF $dompdf The current dompdf instance */ function __construct(DOMPDF $dompdf) { $this->_dompdf = $dompdf; $this->_canvas = $dompdf->get_canvas(); } /** * Render a frame. * * Specialized in child classes * * @param Frame $frame The frame to render */ abstract function render(Frame $frame); //........................................................................ /** * Render a background image over a rectangular area * * @param string $url The background image to load * @param float $x The left edge of the rectangular area * @param float $y The top edge of the rectangular area * @param float $width The width of the rectangular area * @param float $height The height of the rectangular area * @param Style $style The associated Style object * * @throws Exception */ protected function _background_image($url, $x, $y, $width, $height, $style) { if ( !function_exists("imagecreatetruecolor") ) { throw new Exception("The PHP GD extension is required, but is not installed."); } $sheet = $style->get_stylesheet(); // Skip degenerate cases if ( $width == 0 || $height == 0 ) { return; } $box_width = $width; $box_height = $height; //debugpng if (DEBUGPNG) print '[_background_image '.$url.']'; list($img, $type, /*$msg*/) = Image_Cache::resolve_url( $url, $sheet->get_protocol(), $sheet->get_host(), $sheet->get_base_path(), $this->_dompdf ); // Bail if the image is no good if ( Image_Cache::is_broken($img) ) { return; } //Try to optimize away reading and composing of same background multiple times //Postponing read with imagecreatefrom ...() //final composition parameters and name not known yet //Therefore read dimension directly from file, instead of creating gd object first. //$img_w = imagesx($src); $img_h = imagesy($src); list($img_w, $img_h) = dompdf_getimagesize($img, $this->_dompdf->get_http_context()); if (!isset($img_w) || $img_w == 0 || !isset($img_h) || $img_h == 0) { return; } $repeat = $style->background_repeat; $dpi = $this->_dompdf->get_option("dpi"); //Increase background resolution and dependent box size according to image resolution to be placed in //Then image can be copied in without resize $bg_width = round((float)($width * $dpi) / 72); $bg_height = round((float)($height * $dpi) / 72); //Need %bg_x, $bg_y as background pos, where img starts, converted to pixel list($bg_x, $bg_y) = $style->background_position; if ( is_percent($bg_x) ) { // The point $bg_x % from the left edge of the image is placed // $bg_x % from the left edge of the background rectangle $p = ((float)$bg_x)/100.0; $x1 = $p * $img_w; $x2 = $p * $bg_width; $bg_x = $x2 - $x1; } else { $bg_x = (float)($style->length_in_pt($bg_x)*$dpi) / 72; } $bg_x = round($bg_x + $style->length_in_pt($style->border_left_width)*$dpi / 72); if ( is_percent($bg_y) ) { // The point $bg_y % from the left edge of the image is placed // $bg_y % from the left edge of the background rectangle $p = ((float)$bg_y)/100.0; $y1 = $p * $img_h; $y2 = $p * $bg_height; $bg_y = $y2 - $y1; } else { $bg_y = (float)($style->length_in_pt($bg_y)*$dpi) / 72; } $bg_y = round($bg_y + $style->length_in_pt($style->border_top_width)*$dpi / 72); //clip background to the image area on partial repeat. Nothing to do if img off area //On repeat, normalize start position to the tile at immediate left/top or 0/0 of area //On no repeat with positive offset: move size/start to have offset==0 //Handle x/y Dimensions separately if ( $repeat !== "repeat" && $repeat !== "repeat-x" ) { //No repeat x if ($bg_x < 0) { $bg_width = $img_w + $bg_x; } else { $x += ($bg_x * 72)/$dpi; $bg_width = $bg_width - $bg_x; if ($bg_width > $img_w) { $bg_width = $img_w; } $bg_x = 0; } if ($bg_width <= 0) { return; } $width = (float)($bg_width * 72)/$dpi; } else { //repeat x if ($bg_x < 0) { $bg_x = - ((-$bg_x) % $img_w); } else { $bg_x = $bg_x % $img_w; if ($bg_x > 0) { $bg_x -= $img_w; } } } if ( $repeat !== "repeat" && $repeat !== "repeat-y" ) { //no repeat y if ($bg_y < 0) { $bg_height = $img_h + $bg_y; } else { $y += ($bg_y * 72)/$dpi; $bg_height = $bg_height - $bg_y; if ($bg_height > $img_h) { $bg_height = $img_h; } $bg_y = 0; } if ($bg_height <= 0) { return; } $height = (float)($bg_height * 72)/$dpi; } else { //repeat y if ($bg_y < 0) { $bg_y = - ((-$bg_y) % $img_h); } else { $bg_y = $bg_y % $img_h; if ($bg_y > 0) { $bg_y -= $img_h; } } } //Optimization, if repeat has no effect if ( $repeat === "repeat" && $bg_y <= 0 && $img_h+$bg_y >= $bg_height ) { $repeat = "repeat-x"; } if ( $repeat === "repeat" && $bg_x <= 0 && $img_w+$bg_x >= $bg_width ) { $repeat = "repeat-y"; } if ( ($repeat === "repeat-x" && $bg_x <= 0 && $img_w+$bg_x >= $bg_width) || ($repeat === "repeat-y" && $bg_y <= 0 && $img_h+$bg_y >= $bg_height) ) { $repeat = "no-repeat"; } //Use filename as indicator only //different names for different variants to have different copies in the pdf //This is not dependent of background color of box! .'_'.(is_array($bg_color) ? $bg_color["hex"] : $bg_color) //Note: Here, bg_* are the start values, not end values after going through the tile loops! $filedummy = $img; $is_png = false; $filedummy .= '_'.$bg_width.'_'.$bg_height.'_'.$bg_x.'_'.$bg_y.'_'.$repeat; //Optimization to avoid multiple times rendering the same image. //If check functions are existing and identical image already cached, //then skip creation of duplicate, because it is not needed by addImagePng if ( $this->_canvas instanceof CPDF_Adapter && $this->_canvas->get_cpdf()->image_iscached($filedummy) ) { $bg = null; } else { // Create a new image to fit over the background rectangle $bg = imagecreatetruecolor($bg_width, $bg_height); switch (strtolower($type)) { case IMAGETYPE_PNG: $is_png = true; imagesavealpha($bg, true); imagealphablending($bg, false); $src = imagecreatefrompng($img); break; case IMAGETYPE_JPEG: $src = imagecreatefromjpeg($img); break; case IMAGETYPE_GIF: $src = imagecreatefromgif($img); break; case IMAGETYPE_BMP: $src = imagecreatefrombmp($img); break; default: return; // Unsupported image type } if ( $src == null ) { return; } //Background color if box is not relevant here //Non transparent image: box clipped to real size. Background non relevant. //Transparent image: The image controls the transparency and lets shine through whatever background. //However on transparent image preset the composed image with the transparency color, //to keep the transparency when copying over the non transparent parts of the tiles. $ti = imagecolortransparent($src); if ( $ti >= 0 ) { $tc = imagecolorsforindex($src, $ti); $ti = imagecolorallocate($bg, $tc['red'], $tc['green'], $tc['blue']); imagefill($bg, 0, 0, $ti); imagecolortransparent($bg, $ti); } //This has only an effect for the non repeatable dimension. //compute start of src and dest coordinates of the single copy if ( $bg_x < 0 ) { $dst_x = 0; $src_x = -$bg_x; } else { $src_x = 0; $dst_x = $bg_x; } if ( $bg_y < 0 ) { $dst_y = 0; $src_y = -$bg_y; } else { $src_y = 0; $dst_y = $bg_y; } //For historical reasons exchange meanings of variables: //start_* will be the start values, while bg_* will be the temporary start values in the loops $start_x = $bg_x; $start_y = $bg_y; // Copy regions from the source image to the background if ( $repeat === "no-repeat" ) { // Simply place the image on the background imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $img_h); } else if ( $repeat === "repeat-x" ) { for ( $bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w ) { if ( $bg_x < 0 ) { $dst_x = 0; $src_x = -$bg_x; $w = $img_w + $bg_x; } else { $dst_x = $bg_x; $src_x = 0; $w = $img_w; } imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $img_h); } } else if ( $repeat === "repeat-y" ) { for ( $bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h ) { if ( $bg_y < 0 ) { $dst_y = 0; $src_y = -$bg_y; $h = $img_h + $bg_y; } else { $dst_y = $bg_y; $src_y = 0; $h = $img_h; } imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $h); } } else if ( $repeat === "repeat" ) { for ( $bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h ) { for ( $bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w ) { if ( $bg_x < 0 ) { $dst_x = 0; $src_x = -$bg_x; $w = $img_w + $bg_x; } else { $dst_x = $bg_x; $src_x = 0; $w = $img_w; } if ( $bg_y < 0 ) { $dst_y = 0; $src_y = -$bg_y; $h = $img_h + $bg_y; } else { $dst_y = $bg_y; $src_y = 0; $h = $img_h; } imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $h); } } } else { print 'Unknown repeat!'; } imagedestroy($src); } /* End optimize away creation of duplicates */ $this->_canvas->clipping_rectangle($x, $y, $box_width, $box_height); //img: image url string //img_w, img_h: original image size in px //width, height: box size in pt //bg_width, bg_height: box size in px //x, y: left/top edge of box on page in pt //start_x, start_y: placement of image relative to pattern //$repeat: repeat mode //$bg: GD object of result image //$src: GD object of original image //When using cpdf and optimization to direct png creation from gd object is available, //don't create temp file, but place gd object directly into the pdf if ( !$is_png && $this->_canvas instanceof CPDF_Adapter ) { // Note: CPDF_Adapter image converts y position $this->_canvas->get_cpdf()->addImagePng($filedummy, $x, $this->_canvas->get_height() - $y - $height, $width, $height, $bg); } else { $tmp_dir = $this->_dompdf->get_option("temp_dir"); $tmp_name = tempnam($tmp_dir, "bg_dompdf_img_"); @unlink($tmp_name); $tmp_file = "$tmp_name.png"; //debugpng if (DEBUGPNG) print '[_background_image '.$tmp_file.']'; imagepng($bg, $tmp_file); $this->_canvas->image($tmp_file, $x, $y, $width, $height); imagedestroy($bg); //debugpng if (DEBUGPNG) print '[_background_image unlink '.$tmp_file.']'; if (!DEBUGKEEPTEMP) { unlink($tmp_file); } } $this->_canvas->clipping_end(); } protected function _get_dash_pattern($style, $width) { $pattern = array(); switch ($style) { default: /*case "solid": case "double": case "groove": case "inset": case "outset": case "ridge":*/ case "none": break; case "dotted": if ( $width <= 1 ) $pattern = array($width, $width*2); else $pattern = array($width); break; case "dashed": $pattern = array(3 * $width); break; } return $pattern; } protected function _border_none($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) { return; } protected function _border_hidden($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) { return; } // Border rendering functions protected function _border_dotted($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) { $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, "dotted", $r1, $r2); } protected function _border_dashed($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) { $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, "dashed", $r1, $r2); } protected function _border_solid($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) { // TODO: Solve rendering where one corner is beveled (radius == 0), one corner isn't. if ( $corner_style !== "bevel" || $r1 > 0 || $r2 > 0 ) { // do it the simple way $this->_border_line($x, $y, $length, $color, $widths, $side, $corner_style, "solid", $r1, $r2); return; } list($top, $right, $bottom, $left) = $widths; // All this polygon business is for beveled corners... switch ($side) { case "top": $points = array($x, $y, $x + $length, $y, $x + $length - $right, $y + $top, $x + $left, $y + $top); $this->_canvas->polygon($points, $color, null, null, true); break; case "bottom": $points = array($x, $y, $x + $length, $y, $x + $length - $right, $y - $bottom, $x + $left, $y - $bottom); $this->_canvas->polygon($points, $color, null, null, true); break; case "left": $points = array($x, $y, $x, $y + $length, $x + $left, $y + $length - $bottom, $x + $left, $y + $top); $this->_canvas->polygon($points, $color, null, null, true); break; case "right": $points = array($x, $y, $x, $y + $length, $x - $right, $y + $length - $bottom, $x - $right, $y + $top); $this->_canvas->polygon($points, $color, null, null, true); break; default: return; } } protected function _apply_ratio($side, $ratio, $top, $right, $bottom, $left, &$x, &$y, &$length, &$r1, &$r2) { switch ($side) { case "top": $r1 -= $left * $ratio; $r2 -= $right * $ratio; $x += $left * $ratio; $y += $top * $ratio; $length -= $left * $ratio + $right * $ratio; break; case "bottom": $r1 -= $right * $ratio; $r2 -= $left * $ratio; $x += $left * $ratio; $y -= $bottom * $ratio; $length -= $left * $ratio + $right * $ratio; break; case "left": $r1 -= $top * $ratio; $r2 -= $bottom * $ratio; $x += $left * $ratio; $y += $top * $ratio; $length -= $top * $ratio + $bottom * $ratio; break; case "right": $r1 -= $bottom * $ratio; $r2 -= $top * $ratio; $x -= $right * $ratio; $y += $top * $ratio; $length -= $top * $ratio + $bottom * $ratio; break; default: return; } } protected function _border_double($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) { list($top, $right, $bottom, $left) = $widths; $third_widths = array($top / 3, $right / 3, $bottom / 3, $left / 3); // draw the outer border $this->_border_solid($x, $y, $length, $color, $third_widths, $side, $corner_style, $r1, $r2); $this->_apply_ratio($side, 2/3, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2); $this->_border_solid($x, $y, $length, $color, $third_widths, $side, $corner_style, $r1, $r2); } protected function _border_groove($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) { list($top, $right, $bottom, $left) = $widths; $half_widths = array($top / 2, $right / 2, $bottom / 2, $left / 2); $this->_border_inset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2); $this->_apply_ratio($side, 0.5, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2); $this->_border_outset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2); } protected function _border_ridge($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) { list($top, $right, $bottom, $left) = $widths; $half_widths = array($top / 2, $right / 2, $bottom / 2, $left / 2); $this->_border_outset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2); $this->_apply_ratio($side, 0.5, $top, $right, $bottom, $left, $x, $y, $length, $r1, $r2); $this->_border_inset($x, $y, $length, $color, $half_widths, $side, $corner_style, $r1, $r2); } protected function _tint($c) { if ( !is_numeric($c) ) return $c; return min(1, $c + 0.16); } protected function _shade($c) { if ( !is_numeric($c) ) return $c; return max(0, $c - 0.33); } protected function _border_inset($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) { switch ($side) { case "top": case "left": $shade = array_map(array($this, "_shade"), $color); $this->_border_solid($x, $y, $length, $shade, $widths, $side, $corner_style, $r1, $r2); break; case "bottom": case "right": $tint = array_map(array($this, "_tint"), $color); $this->_border_solid($x, $y, $length, $tint, $widths, $side, $corner_style, $r1, $r2); break; default: return; } } protected function _border_outset($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $r1 = 0, $r2 = 0) { switch ($side) { case "top": case "left": $tint = array_map(array($this, "_tint"), $color); $this->_border_solid($x, $y, $length, $tint, $widths, $side, $corner_style, $r1, $r2); break; case "bottom": case "right": $shade = array_map(array($this, "_shade"), $color); $this->_border_solid($x, $y, $length, $shade, $widths, $side, $corner_style, $r1, $r2); break; default: return; } } // Draws a solid, dotted, or dashed line, observing the border radius protected function _border_line($x, $y, $length, $color, $widths, $side, $corner_style = "bevel", $pattern_name, $r1 = 0, $r2 = 0) { list($top, $right, $bottom, $left) = $widths; $width = $$side; $pattern = $this->_get_dash_pattern($pattern_name, $width); $half_width = $width/2; $r1 -= $half_width; $r2 -= $half_width; $adjust = $r1/80; $length -= $width; switch ($side) { case "top": $x += $half_width; $y += $half_width; if ( $r1 > 0 ) { $this->_canvas->arc($x + $r1, $y + $r1, $r1, $r1, 90-$adjust, 135+$adjust, $color, $width, $pattern); } $this->_canvas->line($x + $r1, $y, $x + $length - $r2, $y, $color, $width, $pattern); if ( $r2 > 0 ) { $this->_canvas->arc($x + $length - $r2, $y + $r2, $r2, $r2, 45-$adjust, 90+$adjust, $color, $width, $pattern); } break; case "bottom": $x += $half_width; $y -= $half_width; if ( $r1 > 0 ) { $this->_canvas->arc($x + $r1, $y - $r1, $r1, $r1, 225-$adjust, 270+$adjust, $color, $width, $pattern); } $this->_canvas->line($x + $r1, $y, $x + $length - $r2, $y, $color, $width, $pattern); if ( $r2 > 0 ) { $this->_canvas->arc($x + $length - $r2, $y - $r2, $r2, $r2, 270-$adjust, 315+$adjust, $color, $width, $pattern); } break; case "left": $y += $half_width; $x += $half_width; if ( $r1 > 0 ) { $this->_canvas->arc($x + $r1, $y + $r1, $r1, $r1, 135-$adjust, 180+$adjust, $color, $width, $pattern); } $this->_canvas->line($x, $y + $r1, $x, $y + $length - $r2, $color, $width, $pattern); if ( $r2 > 0 ) { $this->_canvas->arc($x + $r2, $y + $length - $r2, $r2, $r2, 180-$adjust, 225+$adjust, $color, $width, $pattern); } break; case "right": $y += $half_width; $x -= $half_width; if ( $r1 > 0 ) { $this->_canvas->arc($x - $r1, $y + $r1, $r1, $r1, 0-$adjust, 45+$adjust, $color, $width, $pattern); } $this->_canvas->line($x, $y + $r1, $x, $y + $length - $r2, $color, $width, $pattern); if ( $r2 > 0 ) { $this->_canvas->arc($x - $r2, $y + $length - $r2, $r2, $r2, 315-$adjust, 360+$adjust, $color, $width, $pattern); } break; } } protected function _set_opacity($opacity) { if ( is_numeric($opacity) && $opacity <= 1.0 && $opacity >= 0.0 ) { $this->_canvas->set_opacity( $opacity ); } } protected function _debug_layout($box, $color = "red", $style = array()) { $this->_canvas->rectangle($box[0], $box[1], $box[2], $box[3], CSS_Color::parse($color), 0.1, $style); } } dompdf-0.6.2/include/attribute_translator.cls.php000066400000000000000000000355701263120276100221720ustar00rootroot00000000000000 * @author Fabien Ménager * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Translates HTML 4.0 attributes into CSS rules * * @package dompdf */ class Attribute_Translator { static $_style_attr = "_html_style_attribute"; // Munged data originally from // http://www.w3.org/TR/REC-html40/index/attributes.html // http://www.cs.tut.fi/~jkorpela/html2css.html static private $__ATTRIBUTE_LOOKUP = array( //'caption' => array ( 'align' => '', ), 'img' => array( 'align' => array( 'bottom' => 'vertical-align: baseline;', 'middle' => 'vertical-align: middle;', 'top' => 'vertical-align: top;', 'left' => 'float: left;', 'right' => 'float: right;' ), 'border' => 'border: %0.2F px solid;', 'height' => 'height: %s px;', 'hspace' => 'padding-left: %1$0.2F px; padding-right: %1$0.2F px;', 'vspace' => 'padding-top: %1$0.2F px; padding-bottom: %1$0.2F px;', 'width' => 'width: %s px;', ), 'table' => array( 'align' => array( 'left' => 'margin-left: 0; margin-right: auto;', 'center' => 'margin-left: auto; margin-right: auto;', 'right' => 'margin-left: auto; margin-right: 0;' ), 'bgcolor' => 'background-color: %s;', 'border' => '!set_table_border', 'cellpadding' => '!set_table_cellpadding',//'border-spacing: %0.2F; border-collapse: separate;', 'cellspacing' => '!set_table_cellspacing', 'frame' => array( 'void' => 'border-style: none;', 'above' => 'border-top-style: solid;', 'below' => 'border-bottom-style: solid;', 'hsides' => 'border-left-style: solid; border-right-style: solid;', 'vsides' => 'border-top-style: solid; border-bottom-style: solid;', 'lhs' => 'border-left-style: solid;', 'rhs' => 'border-right-style: solid;', 'box' => 'border-style: solid;', 'border' => 'border-style: solid;' ), 'rules' => '!set_table_rules', 'width' => 'width: %s;', ), 'hr' => array( 'align' => '!set_hr_align', // Need to grab width to set 'left' & 'right' correctly 'noshade' => 'border-style: solid;', 'size' => '!set_hr_size', //'border-width: %0.2F px;', 'width' => 'width: %s;', ), 'div' => array( 'align' => 'text-align: %s;', ), 'h1' => array( 'align' => 'text-align: %s;', ), 'h2' => array( 'align' => 'text-align: %s;', ), 'h3' => array( 'align' => 'text-align: %s;', ), 'h4' => array( 'align' => 'text-align: %s;', ), 'h5' => array( 'align' => 'text-align: %s;', ), 'h6' => array( 'align' => 'text-align: %s;', ), 'p' => array( 'align' => 'text-align: %s;', ), // 'col' => array( // 'align' => '', // 'valign' => '', // ), // 'colgroup' => array( // 'align' => '', // 'valign' => '', // ), 'tbody' => array( 'align' => '!set_table_row_align', 'valign' => '!set_table_row_valign', ), 'td' => array( 'align' => 'text-align: %s;', 'bgcolor' => '!set_background_color', 'height' => 'height: %s;', 'nowrap' => 'white-space: nowrap;', 'valign' => 'vertical-align: %s;', 'width' => 'width: %s;', ), 'tfoot' => array( 'align' => '!set_table_row_align', 'valign' => '!set_table_row_valign', ), 'th' => array( 'align' => 'text-align: %s;', 'bgcolor' => '!set_background_color', 'height' => 'height: %s;', 'nowrap' => 'white-space: nowrap;', 'valign' => 'vertical-align: %s;', 'width' => 'width: %s;', ), 'thead' => array( 'align' => '!set_table_row_align', 'valign' => '!set_table_row_valign', ), 'tr' => array( 'align' => '!set_table_row_align', 'bgcolor' => '!set_table_row_bgcolor', 'valign' => '!set_table_row_valign', ), 'body' => array( 'background' => 'background-image: url(%s);', 'bgcolor' => '!set_background_color', 'link' => '!set_body_link', 'text' => '!set_color', ), 'br' => array( 'clear' => 'clear: %s;', ), 'basefont' => array( 'color' => '!set_color', 'face' => 'font-family: %s;', 'size' => '!set_basefont_size', ), 'font' => array( 'color' => '!set_color', 'face' => 'font-family: %s;', 'size' => '!set_font_size', ), 'dir' => array( 'compact' => 'margin: 0.5em 0;', ), 'dl' => array( 'compact' => 'margin: 0.5em 0;', ), 'menu' => array( 'compact' => 'margin: 0.5em 0;', ), 'ol' => array( 'compact' => 'margin: 0.5em 0;', 'start' => 'counter-reset: -dompdf-default-counter %d;', 'type' => 'list-style-type: %s;', ), 'ul' => array( 'compact' => 'margin: 0.5em 0;', 'type' => 'list-style-type: %s;', ), 'li' => array( 'type' => 'list-style-type: %s;', 'value' => 'counter-reset: -dompdf-default-counter %d;', ), 'pre' => array( 'width' => 'width: %s;', ), ); static protected $_last_basefont_size = 3; static protected $_font_size_lookup = array( // For basefont support -3 => "4pt", -2 => "5pt", -1 => "6pt", 0 => "7pt", 1 => "8pt", 2 => "10pt", 3 => "12pt", 4 => "14pt", 5 => "18pt", 6 => "24pt", 7 => "34pt", // For basefont support 8 => "48pt", 9 => "44pt", 10 => "52pt", 11 => "60pt", ); /** * @param Frame $frame */ static function translate_attributes(Frame $frame) { $node = $frame->get_node(); $tag = $node->nodeName; if ( !isset(self::$__ATTRIBUTE_LOOKUP[$tag]) ) { return; } $valid_attrs = self::$__ATTRIBUTE_LOOKUP[$tag]; $attrs = $node->attributes; $style = rtrim($node->getAttribute(self::$_style_attr), "; "); if ( $style != "" ) { $style .= ";"; } foreach ($attrs as $attr => $attr_node ) { if ( !isset($valid_attrs[$attr]) ) { continue; } $value = $attr_node->value; $target = $valid_attrs[$attr]; // Look up $value in $target, if $target is an array: if ( is_array($target) ) { if ( isset($target[$value]) ) { $style .= " " . self::_resolve_target($node, $target[$value], $value); } } else { // otherwise use target directly $style .= " " . self::_resolve_target($node, $target, $value); } } if ( !is_null($style) ) { $style = ltrim($style); $node->setAttribute(self::$_style_attr, $style); } } /** * @param DOMNode $node * @param string $target * @param string $value * * @return string */ static protected function _resolve_target(DOMNode $node, $target, $value) { if ( $target[0] === "!" ) { // Function call $func = "_" . mb_substr($target, 1); return self::$func($node, $value); } return $value ? sprintf($target, $value) : ""; } /** * @param DOMElement $node * @param string $new_style */ static function append_style(DOMElement $node, $new_style) { $style = rtrim($node->getAttribute(self::$_style_attr), ";"); $style .= $new_style; $style = ltrim($style, ";"); $node->setAttribute(self::$_style_attr, $style); } /** * @param DOMNode $node * * @return DOMNodeList|DOMElement[] */ static protected function get_cell_list(DOMNode $node) { $xpath = new DOMXpath($node->ownerDocument); switch($node->nodeName) { default: case "table": $query = "tr/td | thead/tr/td | tbody/tr/td | tfoot/tr/td | tr/th | thead/tr/th | tbody/tr/th | tfoot/tr/th"; break; case "tbody": case "tfoot": case "thead": $query = "tr/td | tr/th"; break; case "tr": $query = "td | th"; break; } return $xpath->query($query, $node); } /** * @param string $value * * @return string */ static protected function _get_valid_color($value) { if ( preg_match('/^#?([0-9A-F]{6})$/i', $value, $matches) ) { $value = "#$matches[1]"; } return $value; } /** * @param DOMElement $node * @param string $value * * @return string */ static protected function _set_color(DOMElement $node, $value) { $value = self::_get_valid_color($value); return "color: $value;"; } /** * @param DOMElement $node * @param string $value * * @return string */ static protected function _set_background_color(DOMElement $node, $value) { $value = self::_get_valid_color($value); return "background-color: $value;"; } /** * @param DOMElement $node * @param string $value * * @return null */ static protected function _set_table_cellpadding(DOMElement $node, $value) { $cell_list = self::get_cell_list($node); foreach ($cell_list as $cell) { self::append_style($cell, "; padding: {$value}px;"); } return null; } /** * @param DOMElement $node * @param string $value * * @return string */ static protected function _set_table_border(DOMElement $node, $value) { $cell_list = self::get_cell_list($node); foreach ($cell_list as $cell) { $style = rtrim($cell->getAttribute(self::$_style_attr)); $style .= "; border-width: " . ($value > 0 ? 1 : 0) . "pt; border-style: inset;"; $style = ltrim($style, ";"); $cell->setAttribute(self::$_style_attr, $style); } $style = rtrim($node->getAttribute(self::$_style_attr), ";"); $style .= "; border-width: $value" . "px; "; return ltrim($style, "; "); } /** * @param DOMElement $node * @param string $value * * @return string */ static protected function _set_table_cellspacing(DOMElement $node, $value) { $style = rtrim($node->getAttribute(self::$_style_attr), ";"); if ( $value == 0 ) { $style .= "; border-collapse: collapse;"; } else { $style .= "; border-spacing: {$value}px; border-collapse: separate;"; } return ltrim($style, ";"); } /** * @param DOMElement $node * @param string $value * * @return null|string */ static protected function _set_table_rules(DOMElement $node, $value) { $new_style = "; border-collapse: collapse;"; switch ($value) { case "none": $new_style .= "border-style: none;"; break; case "groups": // FIXME: unsupported return null; case "rows": $new_style .= "border-style: solid none solid none; border-width: 1px; "; break; case "cols": $new_style .= "border-style: none solid none solid; border-width: 1px; "; break; case "all": $new_style .= "border-style: solid; border-width: 1px; "; break; default: // Invalid value return null; } $cell_list = self::get_cell_list($node); foreach ($cell_list as $cell) { $style = $cell->getAttribute(self::$_style_attr); $style .= $new_style; $cell->setAttribute(self::$_style_attr, $style); } $style = rtrim($node->getAttribute(self::$_style_attr), ";"); $style .= "; border-collapse: collapse; "; return ltrim($style, "; "); } /** * @param DOMElement $node * @param string $value * * @return string */ static protected function _set_hr_size(DOMElement $node, $value) { $style = rtrim($node->getAttribute(self::$_style_attr), ";"); $style .= "; border-width: ".max(0, $value-2)."; "; return ltrim($style, "; "); } /** * @param DOMElement $node * @param string $value * * @return null|string */ static protected function _set_hr_align(DOMElement $node, $value) { $style = rtrim($node->getAttribute(self::$_style_attr),";"); $width = $node->getAttribute("width"); if ( $width == "" ) { $width = "100%"; } $remainder = 100 - (double)rtrim($width, "% "); switch ($value) { case "left": $style .= "; margin-right: $remainder %;"; break; case "right": $style .= "; margin-left: $remainder %;"; break; case "center": $style .= "; margin-left: auto; margin-right: auto;"; break; default: return null; } return ltrim($style, "; "); } /** * @param DOMElement $node * @param string $value * * @return null */ static protected function _set_table_row_align(DOMElement $node, $value) { $cell_list = self::get_cell_list($node); foreach ($cell_list as $cell) { self::append_style($cell, "; text-align: $value;"); } return null; } /** * @param DOMElement $node * @param string $value * * @return null */ static protected function _set_table_row_valign(DOMElement $node, $value) { $cell_list = self::get_cell_list($node); foreach ($cell_list as $cell) { self::append_style($cell, "; vertical-align: $value;"); } return null; } /** * @param DOMElement $node * @param string $value * * @return null */ static protected function _set_table_row_bgcolor(DOMElement $node, $value) { $cell_list = self::get_cell_list($node); $value = self::_get_valid_color($value); foreach ($cell_list as $cell) { self::append_style($cell, "; background-color: $value;"); } return null; } /** * @param DOMElement $node * @param string $value * * @return null */ static protected function _set_body_link(DOMElement $node, $value) { $a_list = $node->getElementsByTagName("a"); $value = self::_get_valid_color($value); foreach ($a_list as $a) { self::append_style($a, "; color: $value;"); } return null; } /** * @param DOMElement $node * @param string $value * * @return null */ static protected function _set_basefont_size(DOMElement $node, $value) { // FIXME: ? we don't actually set the font size of anything here, just // the base size for later modification by tags. self::$_last_basefont_size = $value; return null; } /** * @param DOMElement $node * @param string $value * * @return string */ static protected function _set_font_size(DOMElement $node, $value) { $style = $node->getAttribute(self::$_style_attr); if ( $value[0] === "-" || $value[0] === "+" ) { $value = self::$_last_basefont_size + (int)$value; } if ( isset(self::$_font_size_lookup[$value]) ) { $style .= "; font-size: " . self::$_font_size_lookup[$value] . ";"; } else { $style .= "; font-size: $value;"; } return ltrim($style, "; "); } } dompdf-0.6.2/include/autoload.inc.php000066400000000000000000000047521263120276100175140ustar00rootroot00000000000000 * @author Fabien Ménager * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * DOMPDF autoload function * * If you have an existing autoload function, add a call to this function * from your existing __autoload() implementation. * * @param string $class */ function DOMPDF_autoload($class) { $filename = DOMPDF_INC_DIR . "/" . mb_strtolower($class) . ".cls.php"; if ( is_file($filename) ) { include_once $filename; } } // If SPL autoload functions are available (PHP >= 5.1.2) if ( function_exists("spl_autoload_register") ) { $autoload = "DOMPDF_autoload"; $funcs = spl_autoload_functions(); // No functions currently in the stack. if ( !DOMPDF_AUTOLOAD_PREPEND || $funcs === false ) { spl_autoload_register($autoload); } // If PHP >= 5.3 the $prepend argument is available else if ( PHP_VERSION_ID >= 50300 ) { spl_autoload_register($autoload, true, true); } else { // Unregister existing autoloaders... $compat = (PHP_VERSION_ID <= 50102 && PHP_VERSION_ID >= 50100); foreach ($funcs as $func) { if (is_array($func)) { // :TRICKY: There are some compatibility issues and some // places where we need to error out $reflector = new ReflectionMethod($func[0], $func[1]); if (!$reflector->isStatic()) { throw new Exception('This function is not compatible with non-static object methods due to PHP Bug #44144.'); } // Suprisingly, spl_autoload_register supports the // Class::staticMethod callback format, although call_user_func doesn't if ($compat) $func = implode('::', $func); } spl_autoload_unregister($func); } // Register the new one, thus putting it at the front of the stack... spl_autoload_register($autoload); // Now, go back and re-register all of our old ones. foreach ($funcs as $func) { spl_autoload_register($func); } // Be polite and ensure that userland autoload gets retained if ( function_exists("__autoload") ) { spl_autoload_register("__autoload"); } } } else if ( !function_exists("__autoload") ) { /** * Default __autoload() function * * @param string $class */ function __autoload($class) { DOMPDF_autoload($class); } } dompdf-0.6.2/include/block_frame_decorator.cls.php000066400000000000000000000137551263120276100222250ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Decorates frames for block layout * * @access private * @package dompdf */ class Block_Frame_Decorator extends Frame_Decorator { /** * Current line index * * @var int */ protected $_cl; /** * The block's line boxes * * @var Line_Box[] */ protected $_line_boxes; function __construct(Frame $frame, DOMPDF $dompdf) { parent::__construct($frame, $dompdf); $this->_line_boxes = array(new Line_Box($this)); $this->_cl = 0; } function reset() { parent::reset(); $this->_line_boxes = array(new Line_Box($this)); $this->_cl = 0; } /** * @return Line_Box */ function get_current_line_box() { return $this->_line_boxes[$this->_cl]; } /** * @return integer */ function get_current_line_number() { return $this->_cl; } /** * @return Line_Box[] */ function get_line_boxes() { return $this->_line_boxes; } /** * @param integer $i */ function clear_line($i) { if ( isset($this->_line_boxes[$i]) ) { unset($this->_line_boxes[$i]); } } /** * @param Frame $frame */ function add_frame_to_line(Frame $frame) { if ( !$frame->is_in_flow() ) { return; } $style = $frame->get_style(); $frame->set_containing_line($this->_line_boxes[$this->_cl]); /* // Adds a new line after a block, only if certain conditions are met if ((($frame instanceof Inline_Frame_Decorator && $frame->get_node()->nodeName !== "br") || $frame instanceof Text_Frame_Decorator && trim($frame->get_text())) && ($frame->get_prev_sibling() && $frame->get_prev_sibling()->get_style()->display === "block" && $this->_line_boxes[$this->_cl]->w > 0 )) { $this->maximize_line_height( $style->length_in_pt($style->line_height), $frame ); $this->add_line(); // Add each child of the inline frame to the line individually foreach ($frame->get_children() as $child) $this->add_frame_to_line( $child ); } else*/ // Handle inline frames (which are effectively wrappers) if ( $frame instanceof Inline_Frame_Decorator ) { // Handle line breaks if ( $frame->get_node()->nodeName === "br" ) { $this->maximize_line_height( $style->length_in_pt($style->line_height), $frame ); $this->add_line(true); } return; } // Trim leading text if this is an empty line. Kinda a hack to put it here, // but what can you do... if ( $this->get_current_line_box()->w == 0 && $frame->is_text_node() && !$frame->is_pre() ) { $frame->set_text( ltrim($frame->get_text()) ); $frame->recalculate_width(); } $w = $frame->get_margin_width(); if ( $w == 0 ) { return; } // Debugging code: /* pre_r("\n

Adding frame to line:

"); // pre_r("Me: " . $this->get_node()->nodeName . " (" . spl_object_hash($this->get_node()) . ")"); // pre_r("Node: " . $frame->get_node()->nodeName . " (" . spl_object_hash($frame->get_node()) . ")"); if ( $frame->is_text_node() ) pre_r('"'.$frame->get_node()->nodeValue.'"'); pre_r("Line width: " . $this->_line_boxes[$this->_cl]->w); pre_r("Frame: " . get_class($frame)); pre_r("Frame width: " . $w); pre_r("Frame height: " . $frame->get_margin_height()); pre_r("Containing block width: " . $this->get_containing_block("w")); */ // End debugging $line = $this->_line_boxes[$this->_cl]; if ( $line->left + $line->w + $line->right + $w > $this->get_containing_block("w")) { $this->add_line(); } $frame->position(); $current_line = $this->_line_boxes[$this->_cl]; $current_line->add_frame($frame); if ( $frame->is_text_node() ) { $current_line->wc += count(preg_split("/\s+/", trim($frame->get_text()))); } $this->increase_line_width($w); $this->maximize_line_height($frame->get_margin_height(), $frame); } function remove_frames_from_line(Frame $frame) { // Search backwards through the lines for $frame $i = $this->_cl; $j = null; while ($i >= 0) { if ( ($j = in_array($frame, $this->_line_boxes[$i]->get_frames(), true)) !== false ) { break; } $i--; } if ( $j === false ) { return; } // Remove $frame and all frames that follow while ($j < count($this->_line_boxes[$i]->get_frames())) { $frames = $this->_line_boxes[$i]->get_frames(); $f = $frames[$j]; $frames[$j] = null; unset($frames[$j]); $j++; $this->_line_boxes[$i]->w -= $f->get_margin_width(); } // Recalculate the height of the line $h = 0; foreach ($this->_line_boxes[$i]->get_frames() as $f) { $h = max( $h, $f->get_margin_height() ); } $this->_line_boxes[$i]->h = $h; // Remove all lines that follow while ($this->_cl > $i) { $this->_line_boxes[ $this->_cl ] = null; unset($this->_line_boxes[ $this->_cl ]); $this->_cl--; } } function increase_line_width($w) { $this->_line_boxes[ $this->_cl ]->w += $w; } function maximize_line_height($val, Frame $frame) { if ( $val > $this->_line_boxes[ $this->_cl ]->h ) { $this->_line_boxes[ $this->_cl ]->tallest_frame = $frame; $this->_line_boxes[ $this->_cl ]->h = $val; } } function add_line($br = false) { // if ( $this->_line_boxes[$this->_cl]["h"] == 0 ) //count($this->_line_boxes[$i]["frames"]) == 0 || // return; $this->_line_boxes[$this->_cl]->br = $br; $y = $this->_line_boxes[$this->_cl]->y + $this->_line_boxes[$this->_cl]->h; $new_line = new Line_Box($this, $y); $this->_line_boxes[ ++$this->_cl ] = $new_line; } //........................................................................ } dompdf-0.6.2/include/block_frame_reflower.cls.php000066400000000000000000000564701263120276100220710ustar00rootroot00000000000000 * @author Fabien Ménager * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Reflows block frames * * @access private * @package dompdf */ class Block_Frame_Reflower extends Frame_Reflower { // Minimum line width to justify, as fraction of available width const MIN_JUSTIFY_WIDTH = 0.80; /** * @var Block_Frame_Decorator */ protected $_frame; function __construct(Block_Frame_Decorator $frame) { parent::__construct($frame); } /** * Calculate the ideal used value for the width property as per: * http://www.w3.org/TR/CSS21/visudet.html#Computing_widths_and_margins * * @param float $width * @return array */ protected function _calculate_width($width) { $frame = $this->_frame; $style = $frame->get_style(); $w = $frame->get_containing_block("w"); if ( $style->position === "fixed" ) { $w = $frame->get_parent()->get_containing_block("w"); } $rm = $style->length_in_pt($style->margin_right, $w); $lm = $style->length_in_pt($style->margin_left, $w); $left = $style->length_in_pt($style->left, $w); $right = $style->length_in_pt($style->right, $w); // Handle 'auto' values $dims = array($style->border_left_width, $style->border_right_width, $style->padding_left, $style->padding_right, $width !== "auto" ? $width : 0, $rm !== "auto" ? $rm : 0, $lm !== "auto" ? $lm : 0); // absolutely positioned boxes take the 'left' and 'right' properties into account if ( $frame->is_absolute() ) { $absolute = true; $dims[] = $left !== "auto" ? $left : 0; $dims[] = $right !== "auto" ? $right : 0; } else { $absolute = false; } $sum = $style->length_in_pt($dims, $w); // Compare to the containing block $diff = $w - $sum; if ( $diff > 0 ) { if ( $absolute ) { // resolve auto properties: see // http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-width if ( $width === "auto" && $left === "auto" && $right === "auto" ) { if ( $lm === "auto" ) $lm = 0; if ( $rm === "auto" ) $rm = 0; // Technically, the width should be "shrink-to-fit" i.e. based on the // preferred width of the content... a little too costly here as a // special case. Just get the width to take up the slack: $left = 0; $right = 0; $width = $diff; } else if ( $width === "auto" ) { if ( $lm === "auto" ) $lm = 0; if ( $rm === "auto" ) $rm = 0; if ( $left === "auto" ) $left = 0; if ( $right === "auto" ) $right = 0; $width = $diff; } else if ( $left === "auto" ) { if ( $lm === "auto" ) $lm = 0; if ( $rm === "auto" ) $rm = 0; if ( $right === "auto" ) $right = 0; $left = $diff; } else if ( $right === "auto" ) { if ( $lm === "auto" ) $lm = 0; if ( $rm === "auto" ) $rm = 0; $right = $diff; } } else { // Find auto properties and get them to take up the slack if ( $width === "auto" ) { $width = $diff; } else if ( $lm === "auto" && $rm === "auto" ) { $lm = $rm = round($diff / 2); } else if ( $lm === "auto" ) { $lm = $diff; } else if ( $rm === "auto" ) { $rm = $diff; } } } else if ($diff < 0) { // We are over constrained--set margin-right to the difference $rm = $diff; } return array( "width" => $width, "margin_left" => $lm, "margin_right" => $rm, "left" => $left, "right" => $right, ); } /** * Call the above function, but resolve max/min widths * * @throws DOMPDF_Exception * @return array */ protected function _calculate_restricted_width() { $frame = $this->_frame; $style = $frame->get_style(); $cb = $frame->get_containing_block(); if ( $style->position === "fixed" ) { $cb = $frame->get_root()->get_containing_block(); } //if ( $style->position === "absolute" ) // $cb = $frame->find_positionned_parent()->get_containing_block(); if ( !isset($cb["w"]) ) { throw new DOMPDF_Exception("Box property calculation requires containing block width"); } // Treat width 100% as auto if ( $style->width === "100%" ) { $width = "auto"; } else { $width = $style->length_in_pt($style->width, $cb["w"]); } extract($this->_calculate_width($width)); // Handle min/max width $min_width = $style->length_in_pt($style->min_width, $cb["w"]); $max_width = $style->length_in_pt($style->max_width, $cb["w"]); if ( $max_width !== "none" && $min_width > $max_width ) { list($max_width, $min_width) = array($min_width, $max_width); } if ( $max_width !== "none" && $width > $max_width ) { extract($this->_calculate_width($max_width)); } if ( $width < $min_width ) { extract($this->_calculate_width($min_width)); } return array($width, $margin_left, $margin_right, $left, $right); } /** * Determine the unrestricted height of content within the block * not by adding each line's height, but by getting the last line's position. * This because lines could have been pushed lower by a clearing element. * * @return float */ protected function _calculate_content_height() { $lines = $this->_frame->get_line_boxes(); $height = 0; foreach ($lines as $line) { $height += $line->h; } /* $first_line = reset($lines); $last_line = end($lines); $height2 = $last_line->y + $last_line->h - $first_line->y; */ return $height; } /** * Determine the frame's restricted height * * @return array */ protected function _calculate_restricted_height() { $frame = $this->_frame; $style = $frame->get_style(); $content_height = $this->_calculate_content_height(); $cb = $frame->get_containing_block(); $height = $style->length_in_pt($style->height, $cb["h"]); $top = $style->length_in_pt($style->top, $cb["h"]); $bottom = $style->length_in_pt($style->bottom, $cb["h"]); $margin_top = $style->length_in_pt($style->margin_top, $cb["h"]); $margin_bottom = $style->length_in_pt($style->margin_bottom, $cb["h"]); if ( $frame->is_absolute() ) { // see http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-height $dims = array($top !== "auto" ? $top : 0, $style->margin_top !== "auto" ? $style->margin_top : 0, $style->padding_top, $style->border_top_width, $height !== "auto" ? $height : 0, $style->border_bottom_width, $style->padding_bottom, $style->margin_bottom !== "auto" ? $style->margin_bottom : 0, $bottom !== "auto" ? $bottom : 0); $sum = $style->length_in_pt($dims, $cb["h"]); $diff = $cb["h"] - $sum; if ( $diff > 0 ) { if ( $height === "auto" && $top === "auto" && $bottom === "auto" ) { if ( $margin_top === "auto" ) $margin_top = 0; if ( $margin_bottom === "auto" ) $margin_bottom = 0; $height = $diff; } else if ( $height === "auto" && $top === "auto" ) { if ( $margin_top === "auto" ) $margin_top = 0; if ( $margin_bottom === "auto" ) $margin_bottom = 0; $height = $content_height; $top = $diff - $content_height; } else if ( $height === "auto" && $bottom === "auto" ) { if ( $margin_top === "auto" ) $margin_top = 0; if ( $margin_bottom === "auto" ) $margin_bottom = 0; $height = $content_height; $bottom = $diff - $content_height; } else if ( $top === "auto" && $bottom === "auto" ) { if ( $margin_top === "auto" ) $margin_top = 0; if ( $margin_bottom === "auto" ) $margin_bottom = 0; $bottom = $diff; } else if ( $top === "auto" ) { if ( $margin_top === "auto" ) $margin_top = 0; if ( $margin_bottom === "auto" ) $margin_bottom = 0; $top = $diff; } else if ( $height === "auto" ) { if ( $margin_top === "auto" ) $margin_top = 0; if ( $margin_bottom === "auto" ) $margin_bottom = 0; $height = $diff; } else if ( $bottom === "auto" ) { if ( $margin_top === "auto" ) $margin_top = 0; if ( $margin_bottom === "auto" ) $margin_bottom = 0; $bottom = $diff; } else { if ( $style->overflow === "visible" ) { // set all autos to zero if ( $margin_top === "auto" ) $margin_top = 0; if ( $margin_bottom === "auto" ) $margin_bottom = 0; if ( $top === "auto" ) $top = 0; if ( $bottom === "auto" ) $bottom = 0; if ( $height === "auto" ) $height = $content_height; } // FIXME: overflow hidden } } } else { // Expand the height if overflow is visible if ( $height === "auto" && $content_height > $height /* && $style->overflow === "visible" */) { $height = $content_height; } // FIXME: this should probably be moved to a seperate function as per // _calculate_restricted_width // Only handle min/max height if the height is independent of the frame's content if ( !($style->overflow === "visible" || ($style->overflow === "hidden" && $height === "auto")) ) { $min_height = $style->min_height; $max_height = $style->max_height; if ( isset($cb["h"]) ) { $min_height = $style->length_in_pt($min_height, $cb["h"]); $max_height = $style->length_in_pt($max_height, $cb["h"]); } else if ( isset($cb["w"]) ) { if ( mb_strpos($min_height, "%") !== false ) { $min_height = 0; } else { $min_height = $style->length_in_pt($min_height, $cb["w"]); } if ( mb_strpos($max_height, "%") !== false ) { $max_height = "none"; } else { $max_height = $style->length_in_pt($max_height, $cb["w"]); } } if ( $max_height !== "none" && $min_height > $max_height ) { // Swap 'em list($max_height, $min_height) = array($min_height, $max_height); } if ( $max_height !== "none" && $height > $max_height ) { $height = $max_height; } if ( $height < $min_height ) { $height = $min_height; } } } return array($height, $margin_top, $margin_bottom, $top, $bottom); } /** * Adjust the justification of each of our lines. * http://www.w3.org/TR/CSS21/text.html#propdef-text-align */ protected function _text_align() { $style = $this->_frame->get_style(); $w = $this->_frame->get_containing_block("w"); $width = $style->length_in_pt($style->width, $w); switch ($style->text_align) { default: case "left": foreach ($this->_frame->get_line_boxes() as $line) { if ( !$line->left ) { continue; } foreach($line->get_frames() as $frame) { if ( $frame instanceof Block_Frame_Decorator) { continue; } $frame->set_position( $frame->get_position("x") + $line->left ); } } return; case "right": foreach ($this->_frame->get_line_boxes() as $line) { // Move each child over by $dx $dx = $width - $line->w - $line->right; foreach($line->get_frames() as $frame) { // Block frames are not aligned by text-align if ($frame instanceof Block_Frame_Decorator) { continue; } $frame->set_position( $frame->get_position("x") + $dx ); } } break; case "justify": // We justify all lines except the last one $lines = $this->_frame->get_line_boxes(); // needs to be a variable (strict standards) array_pop($lines); foreach($lines as $i => $line) { if ( $line->br ) { unset($lines[$i]); } } // One space character's width. Will be used to get a more accurate spacing $space_width = Font_Metrics::get_text_width(" ", $style->font_family, $style->font_size); foreach ($lines as $line) { if ( $line->left ) { foreach ( $line->get_frames() as $frame ) { if ( !$frame instanceof Text_Frame_Decorator ) { continue; } $frame->set_position( $frame->get_position("x") + $line->left ); } } // Only set the spacing if the line is long enough. This is really // just an aesthetic choice ;) //if ( $line["left"] + $line["w"] + $line["right"] > self::MIN_JUSTIFY_WIDTH * $width ) { // Set the spacing for each child if ( $line->wc > 1 ) { $spacing = ($width - ($line->left + $line->w + $line->right) + $space_width) / ($line->wc - 1); } else { $spacing = 0; } $dx = 0; foreach($line->get_frames() as $frame) { if ( !$frame instanceof Text_Frame_Decorator ) { continue; } $text = $frame->get_text(); $spaces = mb_substr_count($text, " "); $char_spacing = $style->length_in_pt($style->letter_spacing); $_spacing = $spacing + $char_spacing; $frame->set_position( $frame->get_position("x") + $dx ); $frame->set_text_spacing($_spacing); $dx += $spaces * $_spacing; } // The line (should) now occupy the entire width $line->w = $width; //} } break; case "center": case "centre": foreach ($this->_frame->get_line_boxes() as $line) { // Centre each line by moving each frame in the line by: $dx = ($width + $line->left - $line->w - $line->right ) / 2; foreach ($line->get_frames() as $frame) { // Block frames are not aligned by text-align if ($frame instanceof Block_Frame_Decorator) { continue; } $frame->set_position( $frame->get_position("x") + $dx ); } } break; } } /** * Align inline children vertically. * Aligns each child vertically after each line is reflowed */ function vertical_align() { $canvas = null; foreach ( $this->_frame->get_line_boxes() as $line ) { $height = $line->h; foreach ( $line->get_frames() as $frame ) { $style = $frame->get_style(); if ( $style->display !== "inline" ) { continue; } $align = $frame->get_parent()->get_style()->vertical_align; if ( !isset($canvas) ) { $canvas = $frame->get_root()->get_dompdf()->get_canvas(); } $baseline = $canvas->get_font_baseline($style->font_family, $style->font_size); $y_offset = 0; switch ($align) { case "baseline": $y_offset = $height*0.8 - $baseline; // The 0.8 ratio is arbitrary until we find it's meaning break; case "middle": $y_offset = ($height*0.8 - $baseline) / 2; break; case "sub": $y_offset = 0.3 * $height; break; case "super": $y_offset = -0.2 * $height; break; case "text-top": case "top": // Not strictly accurate, but good enough for now break; case "text-bottom": case "bottom": $y_offset = $height*0.8 - $baseline; break; } if ( $y_offset ) { $frame->move(0, $y_offset); } } } } /** * @param Frame $child */ function process_clear(Frame $child){ $enable_css_float = $this->get_dompdf()->get_option("enable_css_float"); if ( !$enable_css_float ) { return; } $child_style = $child->get_style(); $root = $this->_frame->get_root(); // Handle "clear" if ( $child_style->clear !== "none" ) { $lowest_y = $root->get_lowest_float_offset($child); // If a float is still applying, we handle it if ( $lowest_y ) { if ( $child->is_in_flow() ) { $line_box = $this->_frame->get_current_line_box(); $line_box->y = $lowest_y + $child->get_margin_height(); $line_box->left = 0; $line_box->right = 0; } $child->move(0, $lowest_y - $child->get_position("y")); } } } /** * @param Frame $child * @param float $cb_x * @param float $cb_w */ function process_float(Frame $child, $cb_x, $cb_w){ $enable_css_float = $this->_frame->get_dompdf()->get_option("enable_css_float"); if ( !$enable_css_float ) { return; } $child_style = $child->get_style(); $root = $this->_frame->get_root(); // Handle "float" if ( $child_style->float !== "none" ) { $root->add_floating_frame($child); // Remove next frame's beginning whitespace $next = $child->get_next_sibling(); if ( $next && $next instanceof Text_Frame_Decorator) { $next->set_text(ltrim($next->get_text())); } $line_box = $this->_frame->get_current_line_box(); list($old_x, $old_y) = $child->get_position(); $float_x = $cb_x; $float_y = $old_y; $float_w = $child->get_margin_width(); if ( $child_style->clear === "none" ) { switch( $child_style->float ) { case "left": $float_x += $line_box->left; break; case "right": $float_x += ($cb_w - $line_box->right - $float_w); break; } } else { if ( $child_style->float === "right" ) { $float_x += ($cb_w - $float_w); } } if ( $cb_w < $float_x + $float_w - $old_x ) { // TODO handle when floating elements don't fit } $line_box->get_float_offsets(); if ( $child->_float_next_line ) { $float_y += $line_box->h; } $child->set_position($float_x, $float_y); $child->move($float_x - $old_x, $float_y - $old_y, true); } } /** * @param Frame_Decorator $block */ function reflow(Block_Frame_Decorator $block = null) { // Check if a page break is forced $page = $this->_frame->get_root(); $page->check_forced_page_break($this->_frame); // Bail if the page is full if ( $page->is_full() ) { return; } // Generated content $this->_set_content(); // Collapse margins if required $this->_collapse_margins(); $style = $this->_frame->get_style(); $cb = $this->_frame->get_containing_block(); if ( $style->position === "fixed" ) { $cb = $this->_frame->get_root()->get_containing_block(); } // Determine the constraints imposed by this frame: calculate the width // of the content area: list($w, $left_margin, $right_margin, $left, $right) = $this->_calculate_restricted_width(); // Store the calculated properties $style->width = $w . "pt"; $style->margin_left = $left_margin."pt"; $style->margin_right = $right_margin."pt"; $style->left = $left ."pt"; $style->right = $right . "pt"; // Update the position $this->_frame->position(); list($x, $y) = $this->_frame->get_position(); // Adjust the first line based on the text-indent property $indent = $style->length_in_pt($style->text_indent, $cb["w"]); $this->_frame->increase_line_width($indent); // Determine the content edge $top = $style->length_in_pt(array($style->margin_top, $style->padding_top, $style->border_top_width), $cb["h"]); $bottom = $style->length_in_pt(array($style->border_bottom_width, $style->margin_bottom, $style->padding_bottom), $cb["h"]); $cb_x = $x + $left_margin + $style->length_in_pt(array($style->border_left_width, $style->padding_left), $cb["w"]); $cb_y = $y + $top; $cb_h = ($cb["h"] + $cb["y"]) - $bottom - $cb_y; // Set the y position of the first line in this block $line_box = $this->_frame->get_current_line_box(); $line_box->y = $cb_y; $line_box->get_float_offsets(); // Set the containing blocks and reflow each child foreach ( $this->_frame->get_children() as $child ) { // Bail out if the page is full if ( $page->is_full() ) { break; } $child->set_containing_block($cb_x, $cb_y, $w, $cb_h); $this->process_clear($child); $child->reflow($this->_frame); // Don't add the child to the line if a page break has occurred if ( $page->check_page_break($child) ) { break; } $this->process_float($child, $cb_x, $w); } // Determine our height list($height, $margin_top, $margin_bottom, $top, $bottom) = $this->_calculate_restricted_height(); $style->height = $height; $style->margin_top = $margin_top; $style->margin_bottom = $margin_bottom; $style->top = $top; $style->bottom = $bottom; $needs_reposition = ($style->position === "absolute" && ($style->right !== "auto" || $style->bottom !== "auto")); // Absolute positioning measurement if ( $needs_reposition ) { $orig_style = $this->_frame->get_original_style(); if ( $orig_style->width === "auto" && ($orig_style->left === "auto" || $orig_style->right === "auto") ) { $width = 0; foreach ($this->_frame->get_line_boxes() as $line) { $width = max($line->w, $width); } $style->width = $width; } $style->left = $orig_style->left; $style->right = $orig_style->right; } $this->_text_align(); $this->vertical_align(); // Absolute positioning if ( $needs_reposition ) { list($x, $y) = $this->_frame->get_position(); $this->_frame->position(); list($new_x, $new_y) = $this->_frame->get_position(); $this->_frame->move($new_x-$x, $new_y-$y, true); } if ( $block && $this->_frame->is_in_flow() ) { $block->add_frame_to_line($this->_frame); // May be inline-block if ( $style->display === "block" ) { $block->add_line(); } } } } dompdf-0.6.2/include/block_positioner.cls.php000066400000000000000000000026361263120276100212600ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Positions block frames * * @access private * @package dompdf */ class Block_Positioner extends Positioner { function __construct(Frame_Decorator $frame) { parent::__construct($frame); } //........................................................................ function position() { $frame = $this->_frame; $style = $frame->get_style(); $cb = $frame->get_containing_block(); $p = $frame->find_block_parent(); if ( $p ) { $float = $style->float; $enable_css_float = $frame->get_dompdf()->get_option("enable_css_float"); if ( !$enable_css_float || !$float || $float === "none" ) { $p->add_line(true); } $y = $p->get_current_line_box()->y; } else { $y = $cb["y"]; } $x = $cb["x"]; // Relative positionning if ( $style->position === "relative" ) { $top = $style->length_in_pt($style->top, $cb["h"]); //$right = $style->length_in_pt($style->right, $cb["w"]); //$bottom = $style->length_in_pt($style->bottom, $cb["h"]); $left = $style->length_in_pt($style->left, $cb["w"]); $x += $left; $y += $top; } $frame->set_position($x, $y); } } dompdf-0.6.2/include/block_renderer.cls.php000066400000000000000000000152031263120276100206650ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Renders block frames * * @access private * @package dompdf */ class Block_Renderer extends Abstract_Renderer { //........................................................................ function render(Frame $frame) { $style = $frame->get_style(); $node = $frame->get_node(); list($x, $y, $w, $h) = $frame->get_border_box(); $this->_set_opacity( $frame->get_opacity( $style->opacity ) ); if ( $node->nodeName === "body" ) { $h = $frame->get_containing_block("h") - $style->length_in_pt(array( $style->margin_top, $style->border_top_width, $style->border_bottom_width, $style->margin_bottom), $style->width); } // Handle anchors & links if ( $node->nodeName === "a" && $href = $node->getAttribute("href") ) { $this->_canvas->add_link($href, $x, $y, $w, $h); } // Draw our background, border and content list($tl, $tr, $br, $bl) = $style->get_computed_border_radius($w, $h); if ( $tl + $tr + $br + $bl > 0 ) { $this->_canvas->clipping_roundrectangle( $x, $y, $w, $h, $tl, $tr, $br, $bl ); } if ( ($bg = $style->background_color) !== "transparent" ) { $this->_canvas->filled_rectangle( $x, $y, $w, $h, $bg ); } if ( ($url = $style->background_image) && $url !== "none" ) { $this->_background_image($url, $x, $y, $w, $h, $style); } if ( $tl + $tr + $br + $bl > 0 ) { $this->_canvas->clipping_end(); } $border_box = array($x, $y, $w, $h); $this->_render_border($frame, $border_box); $this->_render_outline($frame, $border_box); if (DEBUG_LAYOUT && DEBUG_LAYOUT_BLOCKS) { $this->_debug_layout($frame->get_border_box(), "red"); if (DEBUG_LAYOUT_PADDINGBOX) { $this->_debug_layout($frame->get_padding_box(), "red", array(0.5, 0.5)); } } if (DEBUG_LAYOUT && DEBUG_LAYOUT_LINES && $frame->get_decorator()) { foreach ($frame->get_decorator()->get_line_boxes() as $line) { $frame->_debug_layout(array($line->x, $line->y, $line->w, $line->h), "orange"); } } } protected function _render_border(Frame_Decorator $frame, $border_box = null, $corner_style = "bevel") { $style = $frame->get_style(); $bp = $style->get_border_properties(); if ( empty($border_box) ) { $border_box = $frame->get_border_box(); } // find the radius $radius = $style->get_computed_border_radius($border_box[2], $border_box[3]); // w, h // Short-cut: If all the borders are "solid" with the same color and style, and no radius, we'd better draw a rectangle if ( in_array($bp["top"]["style"], array("solid", "dashed", "dotted")) && $bp["top"] == $bp["right"] && $bp["right"] == $bp["bottom"] && $bp["bottom"] == $bp["left"] && array_sum($radius) == 0 ) { $props = $bp["top"]; if ( $props["color"] === "transparent" || $props["width"] <= 0 ) return; list($x, $y, $w, $h) = $border_box; $width = $style->length_in_pt($props["width"]); $pattern = $this->_get_dash_pattern($props["style"], $width); $this->_canvas->rectangle($x + $width / 2, $y + $width / 2, $w - $width, $h - $width, $props["color"], $width, $pattern); return; } // Do it the long way $widths = array($style->length_in_pt($bp["top"]["width"]), $style->length_in_pt($bp["right"]["width"]), $style->length_in_pt($bp["bottom"]["width"]), $style->length_in_pt($bp["left"]["width"])); foreach ($bp as $side => $props) { list($x, $y, $w, $h) = $border_box; $length = 0; $r1 = 0; $r2 = 0; if ( !$props["style"] || $props["style"] === "none" || $props["width"] <= 0 || $props["color"] == "transparent" ) continue; switch($side) { case "top": $length = $w; $r1 = $radius["top-left"]; $r2 = $radius["top-right"]; break; case "bottom": $length = $w; $y += $h; $r1 = $radius["bottom-left"]; $r2 = $radius["bottom-right"]; break; case "left": $length = $h; $r1 = $radius["top-left"]; $r2 = $radius["bottom-left"]; break; case "right": $length = $h; $x += $w; $r1 = $radius["top-right"]; $r2 = $radius["bottom-right"]; break; default: break; } $method = "_border_" . $props["style"]; // draw rounded corners $this->$method($x, $y, $length, $props["color"], $widths, $side, $corner_style, $r1, $r2); } } protected function _render_outline(Frame_Decorator $frame, $border_box = null, $corner_style = "bevel") { $style = $frame->get_style(); $props = array( "width" => $style->outline_width, "style" => $style->outline_style, "color" => $style->outline_color, ); if ( !$props["style"] || $props["style"] === "none" || $props["width"] <= 0 ) return; if ( empty($border_box) ) { $border_box = $frame->get_border_box(); } $offset = $style->length_in_pt($props["width"]); $pattern = $this->_get_dash_pattern($props["style"], $offset); // If the outline style is "solid" we'd better draw a rectangle if ( in_array($props["style"], array("solid", "dashed", "dotted")) ) { $border_box[0] -= $offset / 2; $border_box[1] -= $offset / 2; $border_box[2] += $offset; $border_box[3] += $offset; list($x, $y, $w, $h) = $border_box; $this->_canvas->rectangle($x, $y, $w, $h, $props["color"], $offset, $pattern); return; } $border_box[0] -= $offset; $border_box[1] -= $offset; $border_box[2] += $offset * 2; $border_box[3] += $offset * 2; $method = "_border_" . $props["style"]; $widths = array_fill(0, 4, $props["width"]); $sides = array("top", "right", "left", "bottom"); $length = 0; foreach ($sides as $side) { list($x, $y, $w, $h) = $border_box; switch($side) { case "top": $length = $w; break; case "bottom": $length = $w; $y += $h; break; case "left": $length = $h; break; case "right": $length = $h; $x += $w; break; default: break; } $this->$method($x, $y, $length, $props["color"], $widths, $side, $corner_style); } } } dompdf-0.6.2/include/cached_pdf_decorator.cls.php000066400000000000000000000132461263120276100220140ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Caching canvas implementation * * Each rendered page is serialized and stored in the {@link Page_Cache}. * This is useful for static forms/pages that do not need to be re-rendered * all the time. * * This class decorates normal CPDF_Adapters. It is currently completely * experimental. * * @access private * @package dompdf */ class Cached_PDF_Decorator extends CPDF_Adapter implements Canvas { /** * @var CPDF_Adapter */ protected $_pdf; protected $_cache_id; protected $_current_page_id; protected $_fonts; // fonts used in this document function __construct($paper = "letter", $orientation = "portrait", DOMPDF $dompdf) { $this->_fonts = array(); } /** * Must be called after constructor * * @param int $cache_id * @param CPDF_Adapter $pdf */ function init($cache_id, CPDF_Adapter $pdf) { $this->_cache_id = $cache_id; $this->_pdf = $pdf; $this->_current_page_id = $this->_pdf->open_object(); } //........................................................................ function get_cpdf() { return $this->_pdf->get_cpdf(); } function open_object() { $this->_pdf->open_object(); } function reopen_object($object) { $this->_pdf->reopen_object($object); } function close_object() { $this->_pdf->close_object(); } function add_object($object, $where = 'all') { $this->_pdf->add_object($object, $where); } function serialize_object($id) { $this->_pdf->serialize_object($id); } function reopen_serialized_object($obj) { $this->_pdf->reopen_serialized_object($obj); } //........................................................................ function get_width() { return $this->_pdf->get_width(); } function get_height() { return $this->_pdf->get_height(); } function get_page_number() { return $this->_pdf->get_page_number(); } function get_page_count() { return $this->_pdf->get_page_count(); } function set_page_number($num) { $this->_pdf->set_page_number($num); } function set_page_count($count) { $this->_pdf->set_page_count($count); } function line($x1, $y1, $x2, $y2, $color, $width, $style = array()) { $this->_pdf->line($x1, $y1, $x2, $y2, $color, $width, $style); } function rectangle($x1, $y1, $w, $h, $color, $width, $style = array()) { $this->_pdf->rectangle($x1, $y1, $w, $h, $color, $width, $style); } function filled_rectangle($x1, $y1, $w, $h, $color) { $this->_pdf->filled_rectangle($x1, $y1, $w, $h, $color); } function polygon($points, $color, $width = null, $style = array(), $fill = false) { $this->_pdf->polygon($points, $color, $width, $style, $fill); } function circle($x, $y, $r1, $color, $width = null, $style = null, $fill = false) { $this->_pdf->circle($x, $y, $r1, $color, $width, $style, $fill); } function image($img_url, $x, $y, $w, $h, $resolution = "normal") { $this->_pdf->image($img_url, $x, $y, $w, $h, $resolution); } function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0.0, $char_space = 0.0, $angle = 0.0) { $this->_fonts[$font] = true; $this->_pdf->text($x, $y, $text, $font, $size, $color, $word_space, $char_space, $angle); } function page_text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0.0, $char_space = 0.0, $angle = 0.0) { // We want to remove this from cached pages since it may not be correct $this->_pdf->close_object(); $this->_pdf->page_text($x, $y, $text, $font, $size, $color, $word_space, $char_space, $angle); $this->_pdf->reopen_object($this->_current_page_id); } function page_script($script, $type = 'text/php') { // We want to remove this from cached pages since it may not be correct $this->_pdf->close_object(); $this->_pdf->page_script($script, $type); $this->_pdf->reopen_object($this->_current_page_id); } function new_page() { $this->_pdf->close_object(); // Add the object to the current page $this->_pdf->add_object($this->_current_page_id, "add"); $this->_pdf->new_page(); Page_Cache::store_page($this->_cache_id, $this->_pdf->get_page_number() - 1, $this->_pdf->serialize_object($this->_current_page_id)); $this->_current_page_id = $this->_pdf->open_object(); return $this->_current_page_id; } function stream($filename, $options = null) { // Store the last page in the page cache if ( !is_null($this->_current_page_id) ) { $this->_pdf->close_object(); $this->_pdf->add_object($this->_current_page_id, "add"); Page_Cache::store_page($this->_cache_id, $this->_pdf->get_page_number(), $this->_pdf->serialize_object($this->_current_page_id)); Page_Cache::store_fonts($this->_cache_id, $this->_fonts); $this->_current_page_id = null; } $this->_pdf->stream($filename); } function output($options = null) { // Store the last page in the page cache if ( !is_null($this->_current_page_id) ) { $this->_pdf->close_object(); $this->_pdf->add_object($this->_current_page_id, "add"); Page_Cache::store_page($this->_cache_id, $this->_pdf->get_page_number(), $this->_pdf->serialize_object($this->_current_page_id)); $this->_current_page_id = null; } return $this->_pdf->output(); } function get_messages() { return $this->_pdf->get_messages(); } } dompdf-0.6.2/include/canvas.cls.php000066400000000000000000000222441263120276100171630ustar00rootroot00000000000000 * @author Fabien Ménager * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Main rendering interface * * Currently {@link CPDF_Adapter}, {@link PDFLib_Adapter}, {@link TCPDF_Adapter}, and {@link GD_Adapter} * implement this interface. * * Implementations should measure x and y increasing to the left and down, * respectively, with the origin in the top left corner. Implementations * are free to use a unit other than points for length, but I can't * guarantee that the results will look any good. * * @package dompdf */ interface Canvas { function __construct($paper = "letter", $orientation = "portrait", DOMPDF $dompdf); /** * @return DOMPDF */ function get_dompdf(); /** * Returns the current page number * * @return int */ function get_page_number(); /** * Returns the total number of pages * * @return int */ function get_page_count(); /** * Sets the total number of pages * * @param int $count */ function set_page_count($count); /** * Draws a line from x1,y1 to x2,y2 * * See {@link Style::munge_color()} for the format of the color array. * See {@link Cpdf::setLineStyle()} for a description of the format of the * $style parameter (aka dash). * * @param float $x1 * @param float $y1 * @param float $x2 * @param float $y2 * @param array $color * @param float $width * @param array $style */ function line($x1, $y1, $x2, $y2, $color, $width, $style = null); /** * Draws a rectangle at x1,y1 with width w and height h * * See {@link Style::munge_color()} for the format of the color array. * See {@link Cpdf::setLineStyle()} for a description of the $style * parameter (aka dash) * * @param float $x1 * @param float $y1 * @param float $w * @param float $h * @param array $color * @param float $width * @param array $style */ function rectangle($x1, $y1, $w, $h, $color, $width, $style = null); /** * Draws a filled rectangle at x1,y1 with width w and height h * * See {@link Style::munge_color()} for the format of the color array. * * @param float $x1 * @param float $y1 * @param float $w * @param float $h * @param array $color */ function filled_rectangle($x1, $y1, $w, $h, $color); /** * Starts a clipping rectangle at x1,y1 with width w and height h * * @param float $x1 * @param float $y1 * @param float $w * @param float $h */ function clipping_rectangle($x1, $y1, $w, $h); /** * Starts a rounded clipping rectangle at x1,y1 with width w and height h * * @param float $x1 * @param float $y1 * @param float $w * @param float $h * @param float $tl * @param float $tr * @param float $br * @param float $bl * * @return */ function clipping_roundrectangle($x1, $y1, $w, $h, $tl, $tr, $br, $bl); /** * Ends the last clipping shape */ function clipping_end(); /** * Save current state */ function save(); /** * Restore last state */ function restore(); /** * Rotate */ function rotate($angle, $x, $y); /** * Skew */ function skew($angle_x, $angle_y, $x, $y); /** * Scale */ function scale($s_x, $s_y, $x, $y); /** * Translate */ function translate($t_x, $t_y); /** * Transform */ function transform($a, $b, $c, $d, $e, $f); /** * Draws a polygon * * The polygon is formed by joining all the points stored in the $points * array. $points has the following structure: * * array(0 => x1, * 1 => y1, * 2 => x2, * 3 => y2, * ... * ); * * * See {@link Style::munge_color()} for the format of the color array. * See {@link Cpdf::setLineStyle()} for a description of the $style * parameter (aka dash) * * @param array $points * @param array $color * @param float $width * @param array $style * @param bool $fill Fills the polygon if true */ function polygon($points, $color, $width = null, $style = null, $fill = false); /** * Draws a circle at $x,$y with radius $r * * See {@link Style::munge_color()} for the format of the color array. * See {@link Cpdf::setLineStyle()} for a description of the $style * parameter (aka dash) * * @param float $x * @param float $y * @param float $r * @param array $color * @param float $width * @param array $style * @param bool $fill Fills the circle if true */ function circle($x, $y, $r, $color, $width = null, $style = null, $fill = false); /** * Add an image to the pdf. * * The image is placed at the specified x and y coordinates with the * given width and height. * * @param string $img_url the path to the image * @param float $x x position * @param float $y y position * @param int $w width (in pixels) * @param int $h height (in pixels) * @param string $resolution The resolution of the image */ function image($img_url, $x, $y, $w, $h, $resolution = "normal"); /** * Add an arc to the PDF * See {@link Style::munge_color()} for the format of the color array. * * @param float $x X coordinate of the arc * @param float $y Y coordinate of the arc * @param float $r1 Radius 1 * @param float $r2 Radius 2 * @param float $astart Start angle in degrees * @param float $aend End angle in degrees * @param array $color Color * @param float $width * @param array $style * * @return void */ function arc($x, $y, $r1, $r2, $astart, $aend, $color, $width, $style = array()); /** * Writes text at the specified x and y coordinates * See {@link Style::munge_color()} for the format of the color array. * * @param float $x * @param float $y * @param string $text the text to write * @param string $font the font file to use * @param float $size the font size, in points * @param array $color * @param float $word_space word spacing adjustment * @param float $char_space char spacing adjustment * @param float $angle angle * * @return void */ function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0.0, $char_space = 0.0, $angle = 0.0); /** * Add a named destination (similar to ... in html) * * @param string $anchorname The name of the named destination */ function add_named_dest($anchorname); /** * Add a link to the pdf * * @param string $url The url to link to * @param float $x The x position of the link * @param float $y The y position of the link * @param float $width The width of the link * @param float $height The height of the link * * @return void */ function add_link($url, $x, $y, $width, $height); /** * Add meta information to the pdf * * @param string $name Label of the value (Creator, Producer, etc.) * @param string $value The text to set */ function add_info($name, $value); /** * Calculates text size, in points * * @param string $text the text to be sized * @param string $font the desired font * @param float $size the desired font size * @param float $word_spacing word spacing, if any * @param float $char_spacing * * @return float */ function get_text_width($text, $font, $size, $word_spacing = 0.0, $char_spacing = 0.0); /** * Calculates font height, in points * * @param string $font * @param float $size * * @return float */ function get_font_height($font, $size); /** * Calculates font baseline, in points * * @param string $font * @param float $size * * @return float */ function get_font_baseline($font, $size); /** * Returns the font x-height, in points * * @param string $font * @param float $size * * @return float */ //function get_font_x_height($font, $size); /** * Sets the opacity * * @param float $opacity * @param string $mode */ function set_opacity($opacity, $mode = "Normal"); /** * Sets the default view * * @param string $view * 'XYZ' left, top, zoom * 'Fit' * 'FitH' top * 'FitV' left * 'FitR' left,bottom,right * 'FitB' * 'FitBH' top * 'FitBV' left * @param array $options * * @return void */ function set_default_view($view, $options = array()); /** * @param string $script * * @return void */ function javascript($script); /** * Starts a new page * * Subsequent drawing operations will appear on the new page. */ function new_page(); /** * Streams the PDF directly to the browser * * @param string $filename the name of the PDF file * @param array $options associative array, 'Attachment' => 0 or 1, 'compress' => 1 or 0 */ function stream($filename, $options = null); /** * Returns the PDF as a string * * @param array $options associative array: 'compress' => 1 or 0 * @return string */ function output($options = null); } dompdf-0.6.2/include/canvas_factory.cls.php000066400000000000000000000027661263120276100207210ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Create canvas instances * * The canvas factory creates canvas instances based on the * availability of rendering backends and config options. * * @package dompdf */ class Canvas_Factory { /** * Constructor is private: this is a static class */ private function __construct() { } /** * @param DOMPDF $dompdf * @param string|array $paper * @param string $orientation * @param string $class * * @return Canvas */ static function get_instance(DOMPDF $dompdf, $paper = null, $orientation = null, $class = null) { $backend = strtolower(DOMPDF_PDF_BACKEND); if ( isset($class) && class_exists($class, false) ) { $class .= "_Adapter"; } else if ( (DOMPDF_PDF_BACKEND === "auto" || $backend === "pdflib" ) && class_exists("PDFLib", false) ) { $class = "PDFLib_Adapter"; } // FIXME The TCPDF adapter is not ready yet //else if ( (DOMPDF_PDF_BACKEND === "auto" || $backend === "cpdf") ) // $class = "CPDF_Adapter"; else if ( $backend === "tcpdf" ) { $class = "TCPDF_Adapter"; } else if ( $backend === "gd" ) { $class = "GD_Adapter"; } else { $class = "CPDF_Adapter"; } return new $class($paper, $orientation, $dompdf); } } dompdf-0.6.2/include/cellmap.cls.php000066400000000000000000000460011263120276100173220ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Maps table cells to the table grid. * * This class resolves borders in tables with collapsed borders and helps * place row & column spanned table cells. * * @access private * @package dompdf */ class Cellmap { /** * Border style weight lookup for collapsed border resolution. * * @var array */ static protected $_BORDER_STYLE_SCORE = array( "inset" => 1, "groove" => 2, "outset" => 3, "ridge" => 4, "dotted" => 5, "dashed" => 6, "solid" => 7, "double" => 8, "hidden" => 9, "none" => 0, ); /** * The table object this cellmap is attached to. * * @var Table_Frame_Decorator */ protected $_table; /** * The total number of rows in the table * * @var int */ protected $_num_rows; /** * The total number of columns in the table * * @var int */ protected $_num_cols; /** * 2D array mapping to frames * * @var Frame[][] */ protected $_cells; /** * 1D array of column dimensions * * @var array */ protected $_columns; /** * 1D array of row dimensions * * @var array */ protected $_rows; /** * 2D array of border specs * * @var array */ protected $_borders; /** * 1D Array mapping frames to (multiple) pairs, keyed on frame_id. * * @var Frame[] */ protected $_frames; /** * Current column when adding cells, 0-based * * @var int */ private $__col; /** * Current row when adding cells, 0-based * * @var int */ private $__row; /** * Tells wether the columns' width can be modified * * @var bool */ private $_columns_locked = false; /** * Tells wether the table has table-layout:fixed * * @var bool */ private $_fixed_layout = false; //........................................................................ function __construct(Table_Frame_Decorator $table) { $this->_table = $table; $this->reset(); } function __destruct() { clear_object($this); } //........................................................................ function reset() { $this->_num_rows = 0; $this->_num_cols = 0; $this->_cells = array(); $this->_frames = array(); if ( !$this->_columns_locked ) { $this->_columns = array(); } $this->_rows = array(); $this->_borders = array(); $this->__col = $this->__row = 0; } //........................................................................ function lock_columns() { $this->_columns_locked = true; } function is_columns_locked() { return $this->_columns_locked; } function set_layout_fixed($fixed) { $this->_fixed_layout = $fixed; } function is_layout_fixed() { return $this->_fixed_layout; } function get_num_rows() { return $this->_num_rows; } function get_num_cols() { return $this->_num_cols; } function &get_columns() { return $this->_columns; } function set_columns($columns) { $this->_columns = $columns; } function &get_column($i) { if ( !isset($this->_columns[$i]) ) { $this->_columns[$i] = array( "x" => 0, "min-width" => 0, "max-width" => 0, "used-width" => null, "absolute" => 0, "percent" => 0, "auto" => true, ); } return $this->_columns[$i]; } function &get_rows() { return $this->_rows; } function &get_row($j) { if ( !isset($this->_rows[$j]) ) { $this->_rows[$j] = array( "y" => 0, "first-column" => 0, "height" => null, ); } return $this->_rows[$j]; } function get_border($i, $j, $h_v, $prop = null) { if ( !isset($this->_borders[$i][$j][$h_v]) ) { $this->_borders[$i][$j][$h_v] = array( "width" => 0, "style" => "solid", "color" => "black", ); } if ( isset($prop) ) { return $this->_borders[$i][$j][$h_v][$prop]; } return $this->_borders[$i][$j][$h_v]; } function get_border_properties($i, $j) { return array( "top" => $this->get_border($i, $j, "horizontal"), "right" => $this->get_border($i, $j+1, "vertical"), "bottom" => $this->get_border($i+1, $j, "horizontal"), "left" => $this->get_border($i, $j, "vertical"), ); } //........................................................................ function get_spanned_cells(Frame $frame) { $key = $frame->get_id(); if ( !isset($this->_frames[$key]) ) { throw new DOMPDF_Exception("Frame not found in cellmap"); } return $this->_frames[$key]; } function frame_exists_in_cellmap(Frame $frame) { $key = $frame->get_id(); return isset($this->_frames[$key]); } function get_frame_position(Frame $frame) { global $_dompdf_warnings; $key = $frame->get_id(); if ( !isset($this->_frames[$key]) ) { throw new DOMPDF_Exception("Frame not found in cellmap"); } $col = $this->_frames[$key]["columns"][0]; $row = $this->_frames[$key]["rows"][0]; if ( !isset($this->_columns[$col])) { $_dompdf_warnings[] = "Frame not found in columns array. Check your table layout for missing or extra TDs."; $x = 0; } else { $x = $this->_columns[$col]["x"]; } if ( !isset($this->_rows[$row])) { $_dompdf_warnings[] = "Frame not found in row array. Check your table layout for missing or extra TDs."; $y = 0; } else { $y = $this->_rows[$row]["y"]; } return array($x, $y, "x" => $x, "y" => $y); } function get_frame_width(Frame $frame) { $key = $frame->get_id(); if ( !isset($this->_frames[$key]) ) { throw new DOMPDF_Exception("Frame not found in cellmap"); } $cols = $this->_frames[$key]["columns"]; $w = 0; foreach ($cols as $i) { $w += $this->_columns[$i]["used-width"]; } return $w; } function get_frame_height(Frame $frame) { $key = $frame->get_id(); if ( !isset($this->_frames[$key]) ) { throw new DOMPDF_Exception("Frame not found in cellmap"); } $rows = $this->_frames[$key]["rows"]; $h = 0; foreach ($rows as $i) { if ( !isset($this->_rows[$i]) ) { throw new Exception("The row #$i could not be found, please file an issue in the tracker with the HTML code"); } $h += $this->_rows[$i]["height"]; } return $h; } //........................................................................ function set_column_width($j, $width) { if ( $this->_columns_locked ) { return; } $col =& $this->get_column($j); $col["used-width"] = $width; $next_col =& $this->get_column($j+1); $next_col["x"] = $next_col["x"] + $width; } function set_row_height($i, $height) { $row =& $this->get_row($i); if ( $row["height"] !== null && $height <= $row["height"] ) { return; } $row["height"] = $height; $next_row =& $this->get_row($i+1); $next_row["y"] = $row["y"] + $height; } //........................................................................ protected function _resolve_border($i, $j, $h_v, $border_spec) { $n_width = $border_spec["width"]; $n_style = $border_spec["style"]; if ( !isset($this->_borders[$i][$j][$h_v]) ) { $this->_borders[$i][$j][$h_v] = $border_spec; return $this->_borders[$i][$j][$h_v]["width"]; } $border = &$this->_borders[$i][$j][$h_v]; $o_width = $border["width"]; $o_style = $border["style"]; if ( ($n_style === "hidden" || $n_width > $o_width || $o_style === "none") or ($o_width == $n_width && in_array($n_style, self::$_BORDER_STYLE_SCORE) && self::$_BORDER_STYLE_SCORE[ $n_style ] > self::$_BORDER_STYLE_SCORE[ $o_style ]) ) { $border = $border_spec; } return $border["width"]; } //........................................................................ function add_frame(Frame $frame) { $style = $frame->get_style(); $display = $style->display; $collapse = $this->_table->get_style()->border_collapse == "collapse"; // Recursively add the frames within tables, table-row-groups and table-rows if ( $display === "table-row" || $display === "table" || $display === "inline-table" || in_array($display, Table_Frame_Decorator::$ROW_GROUPS) ) { $start_row = $this->__row; foreach ( $frame->get_children() as $child ) { $this->add_frame( $child ); } if ( $display === "table-row" ) { $this->add_row(); } $num_rows = $this->__row - $start_row - 1; $key = $frame->get_id(); // Row groups always span across the entire table $this->_frames[$key]["columns"] = range(0,max(0,$this->_num_cols-1)); $this->_frames[$key]["rows"] = range($start_row, max(0, $this->__row - 1)); $this->_frames[$key]["frame"] = $frame; if ( $display !== "table-row" && $collapse ) { $bp = $style->get_border_properties(); // Resolve the borders for ( $i = 0; $i < $num_rows+1; $i++) { $this->_resolve_border($start_row + $i, 0, "vertical", $bp["left"]); $this->_resolve_border($start_row + $i, $this->_num_cols, "vertical", $bp["right"]); } for ( $j = 0; $j < $this->_num_cols; $j++) { $this->_resolve_border($start_row, $j, "horizontal", $bp["top"]); $this->_resolve_border($this->__row, $j, "horizontal", $bp["bottom"]); } } return; } $node = $frame->get_node(); // Determine where this cell is going $colspan = $node->getAttribute("colspan"); $rowspan = $node->getAttribute("rowspan"); if ( !$colspan ) { $colspan = 1; $node->setAttribute("colspan",1); } if ( !$rowspan ) { $rowspan = 1; $node->setAttribute("rowspan",1); } $key = $frame->get_id(); $bp = $style->get_border_properties(); // Add the frame to the cellmap $max_left = $max_right = 0; // Find the next available column (fix by Ciro Mondueri) $ac = $this->__col; while ( isset($this->_cells[$this->__row][$ac]) ) { $ac++; } $this->__col = $ac; // Rows: for ( $i = 0; $i < $rowspan; $i++ ) { $row = $this->__row + $i; $this->_frames[$key]["rows"][] = $row; for ( $j = 0; $j < $colspan; $j++) { $this->_cells[$row][$this->__col + $j] = $frame; } if ( $collapse ) { // Resolve vertical borders $max_left = max($max_left, $this->_resolve_border($row, $this->__col, "vertical", $bp["left"])); $max_right = max($max_right, $this->_resolve_border($row, $this->__col + $colspan, "vertical", $bp["right"])); } } $max_top = $max_bottom = 0; // Columns: for ( $j = 0; $j < $colspan; $j++ ) { $col = $this->__col + $j; $this->_frames[$key]["columns"][] = $col; if ( $collapse ) { // Resolve horizontal borders $max_top = max($max_top, $this->_resolve_border($this->__row, $col, "horizontal", $bp["top"])); $max_bottom = max($max_bottom, $this->_resolve_border($this->__row + $rowspan, $col, "horizontal", $bp["bottom"])); } } $this->_frames[$key]["frame"] = $frame; // Handle seperated border model if ( !$collapse ) { list($h, $v) = $this->_table->get_style()->border_spacing; // Border spacing is effectively a margin between cells $v = $style->length_in_pt($v) / 2; $h = $style->length_in_pt($h) / 2; $style->margin = "$v $h"; // The additional 1/2 width gets added to the table proper } else { // Drop the frame's actual border $style->border_left_width = $max_left / 2; $style->border_right_width = $max_right / 2; $style->border_top_width = $max_top / 2; $style->border_bottom_width = $max_bottom / 2; $style->margin = "none"; } if ( !$this->_columns_locked ) { // Resolve the frame's width if ( $this->_fixed_layout ) { list($frame_min, $frame_max) = array(0, 10e-10); } else { list($frame_min, $frame_max) = $frame->get_min_max_width(); } $width = $style->width; $val = null; if ( is_percent($width) ) { $var = "percent"; $val = (float)rtrim($width, "% ") / $colspan; } else if ( $width !== "auto" ) { $var = "absolute"; $val = $style->length_in_pt($frame_min) / $colspan; } $min = 0; $max = 0; for ( $cs = 0; $cs < $colspan; $cs++ ) { // Resolve the frame's width(s) with other cells $col =& $this->get_column( $this->__col + $cs ); // Note: $var is either 'percent' or 'absolute'. We compare the // requested percentage or absolute values with the existing widths // and adjust accordingly. if ( isset($var) && $val > $col[$var] ) { $col[$var] = $val; $col["auto"] = false; } $min += $col["min-width"]; $max += $col["max-width"]; } if ( $frame_min > $min ) { // The frame needs more space. Expand each sub-column // FIXME try to avoid putting this dummy value when table-layout:fixed $inc = ($this->is_layout_fixed() ? 10e-10 : ($frame_min - $min) / $colspan); for ($c = 0; $c < $colspan; $c++) { $col =& $this->get_column($this->__col + $c); $col["min-width"] += $inc; } } if ( $frame_max > $max ) { // FIXME try to avoid putting this dummy value when table-layout:fixed $inc = ($this->is_layout_fixed() ? 10e-10 : ($frame_max - $max) / $colspan); for ($c = 0; $c < $colspan; $c++) { $col =& $this->get_column($this->__col + $c); $col["max-width"] += $inc; } } } $this->__col += $colspan; if ( $this->__col > $this->_num_cols ) $this->_num_cols = $this->__col; } //........................................................................ function add_row() { $this->__row++; $this->_num_rows++; // Find the next available column $i = 0; while ( isset($this->_cells[$this->__row][$i]) ) { $i++; } $this->__col = $i; } //........................................................................ /** * Remove a row from the cellmap. * * @param Frame */ function remove_row(Frame $row) { $key = $row->get_id(); if ( !isset($this->_frames[$key]) ) { return; // Presumably this row has alredy been removed } $this->_row = $this->_num_rows--; $rows = $this->_frames[$key]["rows"]; $columns = $this->_frames[$key]["columns"]; // Remove all frames from this row foreach ( $rows as $r ) { foreach ( $columns as $c ) { if ( isset($this->_cells[$r][$c]) ) { $id = $this->_cells[$r][$c]->get_id(); $this->_frames[$id] = null; unset($this->_frames[$id]); $this->_cells[$r][$c] = null; unset($this->_cells[$r][$c]); } } $this->_rows[$r] = null; unset($this->_rows[$r]); } $this->_frames[$key] = null; unset($this->_frames[$key]); } /** * Remove a row group from the cellmap. * * @param Frame $group The group to remove */ function remove_row_group(Frame $group) { $key = $group->get_id(); if ( !isset($this->_frames[$key]) ) { return; // Presumably this row has alredy been removed } $iter = $group->get_first_child(); while ($iter) { $this->remove_row($iter); $iter = $iter->get_next_sibling(); } $this->_frames[$key] = null; unset($this->_frames[$key]); } /** * Update a row group after rows have been removed * * @param Frame $group The group to update * @param Frame $last_row The last row in the row group */ function update_row_group(Frame $group, Frame $last_row) { $g_key = $group->get_id(); $r_key = $last_row->get_id(); $r_rows = $this->_frames[$r_key]["rows"]; $this->_frames[$g_key]["rows"] = range( $this->_frames[$g_key]["rows"][0], end($r_rows) ); } //........................................................................ function assign_x_positions() { // Pre-condition: widths must be resolved and assigned to columns and // column[0]["x"] must be set. if ( $this->_columns_locked ) { return; } $x = $this->_columns[0]["x"]; foreach ( array_keys($this->_columns) as $j ) { $this->_columns[$j]["x"] = $x; $x += $this->_columns[$j]["used-width"]; } } function assign_frame_heights() { // Pre-condition: widths and heights of each column & row must be // calcluated foreach ( $this->_frames as $arr ) { $frame = $arr["frame"]; $h = 0; foreach( $arr["rows"] as $row ) { if ( !isset($this->_rows[$row]) ) { // The row has been removed because of a page split, so skip it. continue; } $h += $this->_rows[$row]["height"]; } if ( $frame instanceof Table_Cell_Frame_Decorator ) { $frame->set_cell_height($h); } else { $frame->get_style()->height = $h; } } } //........................................................................ /** * Re-adjust frame height if the table height is larger than its content */ function set_frame_heights($table_height, $content_height) { // Distribute the increased height proportionally amongst each row foreach ( $this->_frames as $arr ) { $frame = $arr["frame"]; $h = 0; foreach ($arr["rows"] as $row ) { if ( !isset($this->_rows[$row]) ) { continue; } $h += $this->_rows[$row]["height"]; } if ( $content_height > 0 ) { $new_height = ($h / $content_height) * $table_height; } else { $new_height = 0; } if ( $frame instanceof Table_Cell_Frame_Decorator ) { $frame->set_cell_height($new_height); } else { $frame->get_style()->height = $new_height; } } } //........................................................................ // Used for debugging: function __toString() { $str = ""; $str .= "Columns:
"; $str .= pre_r($this->_columns, true); $str .= "Rows:
"; $str .= pre_r($this->_rows, true); $str .= "Frames:
"; $arr = array(); foreach ( $this->_frames as $key => $val ) { $arr[$key] = array("columns" => $val["columns"], "rows" => $val["rows"]); } $str .= pre_r($arr, true); if ( php_sapi_name() == "cli" ) { $str = strip_tags(str_replace(array("
","",""), array("\n",chr(27)."[01;33m", chr(27)."[0m"), $str)); } return $str; } } dompdf-0.6.2/include/cpdf_adapter.cls.php000066400000000000000000000607421263120276100203310ustar00rootroot00000000000000 * @author Orion Richardson * @author Helmut Tischer * @author Fabien Ménager * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ // FIXME: Need to sanity check inputs to this class require_once(DOMPDF_LIB_DIR . "/class.pdf.php"); /** * PDF rendering interface * * CPDF_Adapter provides a simple stateless interface to the stateful one * provided by the Cpdf class. * * Unless otherwise mentioned, all dimensions are in points (1/72 in). The * coordinate origin is in the top left corner, and y values increase * downwards. * * See {@link http://www.ros.co.nz/pdf/} for more complete documentation * on the underlying {@link Cpdf} class. * * @package dompdf */ class CPDF_Adapter implements Canvas { /** * Dimensions of paper sizes in points * * @var array; */ static $PAPER_SIZES = array( "4a0" => array(0,0,4767.87,6740.79), "2a0" => array(0,0,3370.39,4767.87), "a0" => array(0,0,2383.94,3370.39), "a1" => array(0,0,1683.78,2383.94), "a2" => array(0,0,1190.55,1683.78), "a3" => array(0,0,841.89,1190.55), "a4" => array(0,0,595.28,841.89), "a5" => array(0,0,419.53,595.28), "a6" => array(0,0,297.64,419.53), "a7" => array(0,0,209.76,297.64), "a8" => array(0,0,147.40,209.76), "a9" => array(0,0,104.88,147.40), "a10" => array(0,0,73.70,104.88), "b0" => array(0,0,2834.65,4008.19), "b1" => array(0,0,2004.09,2834.65), "b2" => array(0,0,1417.32,2004.09), "b3" => array(0,0,1000.63,1417.32), "b4" => array(0,0,708.66,1000.63), "b5" => array(0,0,498.90,708.66), "b6" => array(0,0,354.33,498.90), "b7" => array(0,0,249.45,354.33), "b8" => array(0,0,175.75,249.45), "b9" => array(0,0,124.72,175.75), "b10" => array(0,0,87.87,124.72), "c0" => array(0,0,2599.37,3676.54), "c1" => array(0,0,1836.85,2599.37), "c2" => array(0,0,1298.27,1836.85), "c3" => array(0,0,918.43,1298.27), "c4" => array(0,0,649.13,918.43), "c5" => array(0,0,459.21,649.13), "c6" => array(0,0,323.15,459.21), "c7" => array(0,0,229.61,323.15), "c8" => array(0,0,161.57,229.61), "c9" => array(0,0,113.39,161.57), "c10" => array(0,0,79.37,113.39), "ra0" => array(0,0,2437.80,3458.27), "ra1" => array(0,0,1729.13,2437.80), "ra2" => array(0,0,1218.90,1729.13), "ra3" => array(0,0,864.57,1218.90), "ra4" => array(0,0,609.45,864.57), "sra0" => array(0,0,2551.18,3628.35), "sra1" => array(0,0,1814.17,2551.18), "sra2" => array(0,0,1275.59,1814.17), "sra3" => array(0,0,907.09,1275.59), "sra4" => array(0,0,637.80,907.09), "letter" => array(0,0,612.00,792.00), "legal" => array(0,0,612.00,1008.00), "ledger" => array(0,0,1224.00, 792.00), "tabloid" => array(0,0,792.00, 1224.00), "executive" => array(0,0,521.86,756.00), "folio" => array(0,0,612.00,936.00), "commercial #10 envelope" => array(0,0,684,297), "catalog #10 1/2 envelope" => array(0,0,648,864), "8.5x11" => array(0,0,612.00,792.00), "8.5x14" => array(0,0,612.00,1008.0), "11x17" => array(0,0,792.00, 1224.00), ); /** * The DOMPDF object * * @var DOMPDF */ private $_dompdf; /** * Instance of Cpdf class * * @var Cpdf */ private $_pdf; /** * PDF width, in points * * @var float */ private $_width; /** * PDF height, in points * * @var float; */ private $_height; /** * Current page number * * @var int */ private $_page_number; /** * Total number of pages * * @var int */ private $_page_count; /** * Text to display on every page * * @var array */ private $_page_text; /** * Array of pages for accesing after rendering is initially complete * * @var array */ private $_pages; /** * Array of temporary cached images to be deleted when processing is complete * * @var array */ private $_image_cache; /** * Class constructor * * @param mixed $paper The size of paper to use in this PDF ({@link CPDF_Adapter::$PAPER_SIZES}) * @param string $orientation The orientation of the document (either 'landscape' or 'portrait') * @param DOMPDF $dompdf The DOMPDF instance */ function __construct($paper = "letter", $orientation = "portrait", DOMPDF $dompdf) { if ( is_array($paper) ) { $size = $paper; } else if ( isset(self::$PAPER_SIZES[mb_strtolower($paper)]) ) { $size = self::$PAPER_SIZES[mb_strtolower($paper)]; } else { $size = self::$PAPER_SIZES["letter"]; } if ( mb_strtolower($orientation) === "landscape" ) { list($size[2], $size[3]) = array($size[3], $size[2]); } $this->_dompdf = $dompdf; $this->_pdf = new Cpdf( $size, $dompdf->get_option("enable_unicode"), $dompdf->get_option("font_cache"), $dompdf->get_option("temp_dir") ); $this->_pdf->addInfo("Creator", "DOMPDF"); $time = substr_replace(date('YmdHisO'), '\'', -2, 0).'\''; $this->_pdf->addInfo("CreationDate", "D:$time"); $this->_pdf->addInfo("ModDate", "D:$time"); $this->_width = $size[2] - $size[0]; $this->_height= $size[3] - $size[1]; $this->_page_number = $this->_page_count = 1; $this->_page_text = array(); $this->_pages = array($this->_pdf->getFirstPageId()); $this->_image_cache = array(); } function get_dompdf(){ return $this->_dompdf; } /** * Class destructor * * Deletes all temporary image files */ function __destruct() { foreach ($this->_image_cache as $img) { // The file might be already deleted by 3rd party tmp cleaner, // the file might not have been created at all // (if image outputting commands failed) // or because the destructor was called twice accidentally. if (!file_exists($img)) { continue; } if (DEBUGPNG) print '[__destruct unlink '.$img.']'; if (!DEBUGKEEPTEMP) unlink($img); } } /** * Returns the Cpdf instance * * @return Cpdf */ function get_cpdf() { return $this->_pdf; } /** * Add meta information to the PDF * * @param string $label label of the value (Creator, Producer, etc.) * @param string $value the text to set */ function add_info($label, $value) { $this->_pdf->addInfo($label, $value); } /** * Opens a new 'object' * * While an object is open, all drawing actions are recored in the object, * as opposed to being drawn on the current page. Objects can be added * later to a specific page or to several pages. * * The return value is an integer ID for the new object. * * @see CPDF_Adapter::close_object() * @see CPDF_Adapter::add_object() * * @return int */ function open_object() { $ret = $this->_pdf->openObject(); $this->_pdf->saveState(); return $ret; } /** * Reopens an existing 'object' * * @see CPDF_Adapter::open_object() * @param int $object the ID of a previously opened object */ function reopen_object($object) { $this->_pdf->reopenObject($object); $this->_pdf->saveState(); } /** * Closes the current 'object' * * @see CPDF_Adapter::open_object() */ function close_object() { $this->_pdf->restoreState(); $this->_pdf->closeObject(); } /** * Adds a specified 'object' to the document * * $object int specifying an object created with {@link * CPDF_Adapter::open_object()}. $where can be one of: * - 'add' add to current page only * - 'all' add to every page from the current one onwards * - 'odd' add to all odd numbered pages from now on * - 'even' add to all even numbered pages from now on * - 'next' add the object to the next page only * - 'nextodd' add to all odd numbered pages from the next one * - 'nexteven' add to all even numbered pages from the next one * * @see Cpdf::addObject() * * @param int $object * @param string $where */ function add_object($object, $where = 'all') { $this->_pdf->addObject($object, $where); } /** * Stops the specified 'object' from appearing in the document. * * The object will stop being displayed on the page following the current * one. * * @param int $object */ function stop_object($object) { $this->_pdf->stopObject($object); } /** * @access private */ function serialize_object($id) { // Serialize the pdf object's current state for retrieval later return $this->_pdf->serializeObject($id); } /** * @access private */ function reopen_serialized_object($obj) { return $this->_pdf->restoreSerializedObject($obj); } //........................................................................ /** * Returns the PDF's width in points * @return float */ function get_width() { return $this->_width; } /** * Returns the PDF's height in points * @return float */ function get_height() { return $this->_height; } /** * Returns the current page number * @return int */ function get_page_number() { return $this->_page_number; } /** * Returns the total number of pages in the document * @return int */ function get_page_count() { return $this->_page_count; } /** * Sets the current page number * * @param int $num */ function set_page_number($num) { $this->_page_number = $num; } /** * Sets the page count * * @param int $count */ function set_page_count($count) { $this->_page_count = $count; } /** * Sets the stroke color * * See {@link Style::set_color()} for the format of the color array. * @param array $color */ protected function _set_stroke_color($color) { $this->_pdf->setStrokeColor($color); } /** * Sets the fill colour * * See {@link Style::set_color()} for the format of the colour array. * @param array $color */ protected function _set_fill_color($color) { $this->_pdf->setColor($color); } /** * Sets line transparency * @see Cpdf::setLineTransparency() * * Valid blend modes are (case-sensitive): * * Normal, Multiply, Screen, Overlay, Darken, Lighten, * ColorDodge, ColorBurn, HardLight, SoftLight, Difference, * Exclusion * * @param string $mode the blending mode to use * @param float $opacity 0.0 fully transparent, 1.0 fully opaque */ protected function _set_line_transparency($mode, $opacity) { $this->_pdf->setLineTransparency($mode, $opacity); } /** * Sets fill transparency * @see Cpdf::setFillTransparency() * * Valid blend modes are (case-sensitive): * * Normal, Multiply, Screen, Overlay, Darken, Lighten, * ColorDogde, ColorBurn, HardLight, SoftLight, Difference, * Exclusion * * @param string $mode the blending mode to use * @param float $opacity 0.0 fully transparent, 1.0 fully opaque */ protected function _set_fill_transparency($mode, $opacity) { $this->_pdf->setFillTransparency($mode, $opacity); } /** * Sets the line style * * @see Cpdf::setLineStyle() * * @param float $width * @param string $cap * @param string $join * @param array $dash */ protected function _set_line_style($width, $cap, $join, $dash) { $this->_pdf->setLineStyle($width, $cap, $join, $dash); } /** * Sets the opacity * * @param $opacity * @param $mode */ function set_opacity($opacity, $mode = "Normal") { $this->_set_line_transparency($mode, $opacity); $this->_set_fill_transparency($mode, $opacity); } function set_default_view($view, $options = array()) { array_unshift($options, $view); call_user_func_array(array($this->_pdf, "openHere"), $options); } /** * Remaps y coords from 4th to 1st quadrant * * @param float $y * @return float */ protected function y($y) { return $this->_height - $y; } // Canvas implementation function line($x1, $y1, $x2, $y2, $color, $width, $style = array()) { $this->_set_stroke_color($color); $this->_set_line_style($width, "butt", "", $style); $this->_pdf->line($x1, $this->y($y1), $x2, $this->y($y2)); } function arc($x, $y, $r1, $r2, $astart, $aend, $color, $width, $style = array()) { $this->_set_stroke_color($color); $this->_set_line_style($width, "butt", "", $style); $this->_pdf->ellipse($x, $this->y($y), $r1, $r2, 0, 8, $astart, $aend, false, false, true, false); } //........................................................................ /** * Convert a GIF or BMP image to a PNG image * * @param string $image_url * @param integer $type * * @throws DOMPDF_Exception * @return string The url of the newly converted image */ protected function _convert_gif_bmp_to_png($image_url, $type) { $image_type = Image_Cache::type_to_ext($type); $func_name = "imagecreatefrom$image_type"; if ( !function_exists($func_name) ) { throw new DOMPDF_Exception("Function $func_name() not found. Cannot convert $image_type image: $image_url. Please install the image PHP extension."); } set_error_handler("record_warnings"); $im = $func_name($image_url); if ( $im ) { imageinterlace($im, false); $tmp_dir = $this->_dompdf->get_option("temp_dir"); $tmp_name = tempnam($tmp_dir, "{$image_type}dompdf_img_"); @unlink($tmp_name); $filename = "$tmp_name.png"; $this->_image_cache[] = $filename; imagepng($im, $filename); imagedestroy($im); } else { $filename = Image_Cache::$broken_image; } restore_error_handler(); return $filename; } function rectangle($x1, $y1, $w, $h, $color, $width, $style = array()) { $this->_set_stroke_color($color); $this->_set_line_style($width, "butt", "", $style); $this->_pdf->rectangle($x1, $this->y($y1) - $h, $w, $h); } function filled_rectangle($x1, $y1, $w, $h, $color) { $this->_set_fill_color($color); $this->_pdf->filledRectangle($x1, $this->y($y1) - $h, $w, $h); } function clipping_rectangle($x1, $y1, $w, $h) { $this->_pdf->clippingRectangle($x1, $this->y($y1) - $h, $w, $h); } function clipping_roundrectangle($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL) { $this->_pdf->clippingRectangleRounded($x1, $this->y($y1) - $h, $w, $h, $rTL, $rTR, $rBR, $rBL); } function clipping_end() { $this->_pdf->clippingEnd(); } function save() { $this->_pdf->saveState(); } function restore() { $this->_pdf->restoreState(); } function rotate($angle, $x, $y) { $this->_pdf->rotate($angle, $x, $y); } function skew($angle_x, $angle_y, $x, $y) { $this->_pdf->skew($angle_x, $angle_y, $x, $y); } function scale($s_x, $s_y, $x, $y) { $this->_pdf->scale($s_x, $s_y, $x, $y); } function translate($t_x, $t_y) { $this->_pdf->translate($t_x, $t_y); } function transform($a, $b, $c, $d, $e, $f) { $this->_pdf->transform(array($a, $b, $c, $d, $e, $f)); } function polygon($points, $color, $width = null, $style = array(), $fill = false) { $this->_set_fill_color($color); $this->_set_stroke_color($color); // Adjust y values for ( $i = 1; $i < count($points); $i += 2) { $points[$i] = $this->y($points[$i]); } $this->_pdf->polygon($points, count($points) / 2, $fill); } function circle($x, $y, $r1, $color, $width = null, $style = null, $fill = false) { $this->_set_fill_color($color); $this->_set_stroke_color($color); if ( !$fill && isset($width) ) { $this->_set_line_style($width, "round", "round", $style); } $this->_pdf->ellipse($x, $this->y($y), $r1, 0, 0, 8, 0, 360, 1, $fill); } function image($img, $x, $y, $w, $h, $resolution = "normal") { list($width, $height, $type) = dompdf_getimagesize($img, $this->_dompdf->get_http_context()); $debug_png = $this->_dompdf->get_option("debug_png"); if ($debug_png) print "[image:$img|$width|$height|$type]"; switch ($type) { case IMAGETYPE_JPEG: if ($debug_png) print '!!!jpg!!!'; $this->_pdf->addJpegFromFile($img, $x, $this->y($y) - $h, $w, $h); break; case IMAGETYPE_GIF: case IMAGETYPE_BMP: if ($debug_png) print '!!!bmp or gif!!!'; // @todo use cache for BMP and GIF $img = $this->_convert_gif_bmp_to_png($img, $type); case IMAGETYPE_PNG: if ($debug_png) print '!!!png!!!'; $this->_pdf->addPngFromFile($img, $x, $this->y($y) - $h, $w, $h); break; default: if ($debug_png) print '!!!unknown!!!'; } } function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0.0, $char_space = 0.0, $angle = 0.0) { $pdf = $this->_pdf; $pdf->setColor($color); $font .= ".afm"; $pdf->selectFont($font); //Font_Metrics::get_font_height($font, $size) == //$this->get_font_height($font, $size) == //$this->_pdf->selectFont($font),$this->_pdf->getFontHeight($size) //- FontBBoxheight+FontHeightOffset, scaled to $size, in pt //$this->_pdf->getFontDescender($size) //- Descender scaled to size // //$this->_pdf->fonts[$this->_pdf->currentFont] sizes: //['FontBBox'][0] left, ['FontBBox'][1] bottom, ['FontBBox'][2] right, ['FontBBox'][3] top //Maximum extent of all glyphs of the font from the baseline point //['Ascender'] maximum height above baseline except accents //['Descender'] maximum depth below baseline, negative number means below baseline //['FontHeightOffset'] manual enhancement of .afm files to trim windows fonts. currently not used. //Values are in 1/1000 pt for a font size of 1 pt // //['FontBBox'][1] should be close to ['Descender'] //['FontBBox'][3] should be close to ['Ascender']+Accents //in practice, FontBBox values are a little bigger // //The text position is referenced to the baseline, not to the lower corner of the FontBBox, //for what the left,top corner is given. //FontBBox spans also the background box for the text. //If the lower corner would be used as reference point, the Descents of the glyphs would //hang over the background box border. //Therefore compensate only the extent above the Baseline. // //print '
['.$font.','.$size.','.$pdf->getFontHeight($size).','.$pdf->getFontDescender($size).','.$pdf->fonts[$pdf->currentFont]['FontBBox'][3].','.$pdf->fonts[$pdf->currentFont]['FontBBox'][1].','.$pdf->fonts[$pdf->currentFont]['FontHeightOffset'].','.$pdf->fonts[$pdf->currentFont]['Ascender'].','.$pdf->fonts[$pdf->currentFont]['Descender'].']
'; // //$pdf->addText($x, $this->y($y) - ($pdf->fonts[$pdf->currentFont]['FontBBox'][3]*$size)/1000, $size, $text, $angle, $word_space, $char_space); $pdf->addText($x, $this->y($y) - $pdf->getFontHeight($size), $size, $text, $angle, $word_space, $char_space); } //........................................................................ function javascript($code) { $this->_pdf->addJavascript($code); } //........................................................................ /** * Add a named destination (similar to ... in html) * * @param string $anchorname The name of the named destination */ function add_named_dest($anchorname) { $this->_pdf->addDestination($anchorname, "Fit"); } //........................................................................ /** * Add a link to the pdf * * @param string $url The url to link to * @param float $x The x position of the link * @param float $y The y position of the link * @param float $width The width of the link * @param float $height The height of the link */ function add_link($url, $x, $y, $width, $height) { $y = $this->y($y) - $height; if ( strpos($url, '#') === 0 ) { // Local link $name = substr($url,1); if ( $name ) { $this->_pdf->addInternalLink($name, $x, $y, $x + $width, $y + $height); } } else { $this->_pdf->addLink(rawurldecode($url), $x, $y, $x + $width, $y + $height); } } function get_text_width($text, $font, $size, $word_spacing = 0, $char_spacing = 0) { $this->_pdf->selectFont($font); $unicode = $this->_dompdf->get_option("enable_unicode"); if (!$unicode) { $text = mb_convert_encoding($text, 'Windows-1252', 'UTF-8'); } return $this->_pdf->getTextWidth($size, $text, $word_spacing, $char_spacing); } function register_string_subset($font, $string) { $this->_pdf->registerText($font, $string); } function get_font_height($font, $size) { $this->_pdf->selectFont($font); $ratio = $this->_dompdf->get_option("font_height_ratio"); return $this->_pdf->getFontHeight($size) * $ratio; } /*function get_font_x_height($font, $size) { $this->_pdf->selectFont($font); $ratio = $this->_dompdf->get_option("font_height_ratio"); return $this->_pdf->getFontXHeight($size) * $ratio; }*/ function get_font_baseline($font, $size) { $ratio = $this->_dompdf->get_option("font_height_ratio"); return $this->get_font_height($font, $size) / $ratio; } /** * Writes text at the specified x and y coordinates on every page * * The strings '{PAGE_NUM}' and '{PAGE_COUNT}' are automatically replaced * with their current values. * * See {@link Style::munge_color()} for the format of the colour array. * * @param float $x * @param float $y * @param string $text the text to write * @param string $font the font file to use * @param float $size the font size, in points * @param array $color * @param float $word_space word spacing adjustment * @param float $char_space char spacing adjustment * @param float $angle angle to write the text at, measured CW starting from the x-axis */ function page_text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0.0, $char_space = 0.0, $angle = 0.0) { $_t = "text"; $this->_page_text[] = compact("_t", "x", "y", "text", "font", "size", "color", "word_space", "char_space", "angle"); } /** * Processes a script on every page * * The variables $pdf, $PAGE_NUM, and $PAGE_COUNT are available. * * This function can be used to add page numbers to all pages * after the first one, for example. * * @param string $code the script code * @param string $type the language type for script */ function page_script($code, $type = "text/php") { $_t = "script"; $this->_page_text[] = compact("_t", "code", "type"); } function new_page() { $this->_page_number++; $this->_page_count++; $ret = $this->_pdf->newPage(); $this->_pages[] = $ret; return $ret; } /** * Add text to each page after rendering is complete */ protected function _add_page_text() { if ( !count($this->_page_text) ) { return; } $page_number = 1; $eval = null; foreach ($this->_pages as $pid) { $this->reopen_object($pid); foreach ($this->_page_text as $pt) { extract($pt); switch ($_t) { case "text": $text = str_replace(array("{PAGE_NUM}","{PAGE_COUNT}"), array($page_number, $this->_page_count), $text); $this->text($x, $y, $text, $font, $size, $color, $word_space, $char_space, $angle); break; case "script": if ( !$eval ) { $eval = new PHP_Evaluator($this); } $eval->evaluate($code, array('PAGE_NUM' => $page_number, 'PAGE_COUNT' => $this->_page_count)); break; } } $this->close_object(); $page_number++; } } /** * Streams the PDF directly to the browser * * @param string $filename the name of the PDF file * @param array $options associative array, 'Attachment' => 0 or 1, 'compress' => 1 or 0 */ function stream($filename, $options = null) { // Add page text $this->_add_page_text(); $options["Content-Disposition"] = $filename; $this->_pdf->stream($options); } /** * Returns the PDF as a string * * @param array $options Output options * @return string */ function output($options = null) { $this->_add_page_text(); $debug = isset($options["compress"]) && $options["compress"] != 1; return $this->_pdf->output($debug); } /** * Returns logging messages generated by the Cpdf class * * @return string */ function get_messages() { return $this->_pdf->messages; } } dompdf-0.6.2/include/css_color.cls.php000066400000000000000000000173311263120276100176770ustar00rootroot00000000000000 * @author Fabien Ménager * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ class CSS_Color { static $cssColorNames = array( "aliceblue" => "F0F8FF", "antiquewhite" => "FAEBD7", "aqua" => "00FFFF", "aquamarine" => "7FFFD4", "azure" => "F0FFFF", "beige" => "F5F5DC", "bisque" => "FFE4C4", "black" => "000000", "blanchedalmond" => "FFEBCD", "blue" => "0000FF", "blueviolet" => "8A2BE2", "brown" => "A52A2A", "burlywood" => "DEB887", "cadetblue" => "5F9EA0", "chartreuse" => "7FFF00", "chocolate" => "D2691E", "coral" => "FF7F50", "cornflowerblue" => "6495ED", "cornsilk" => "FFF8DC", "crimson" => "DC143C", "cyan" => "00FFFF", "darkblue" => "00008B", "darkcyan" => "008B8B", "darkgoldenrod" => "B8860B", "darkgray" => "A9A9A9", "darkgreen" => "006400", "darkgrey" => "A9A9A9", "darkkhaki" => "BDB76B", "darkmagenta" => "8B008B", "darkolivegreen" => "556B2F", "darkorange" => "FF8C00", "darkorchid" => "9932CC", "darkred" => "8B0000", "darksalmon" => "E9967A", "darkseagreen" => "8FBC8F", "darkslateblue" => "483D8B", "darkslategray" => "2F4F4F", "darkslategrey" => "2F4F4F", "darkturquoise" => "00CED1", "darkviolet" => "9400D3", "deeppink" => "FF1493", "deepskyblue" => "00BFFF", "dimgray" => "696969", "dimgrey" => "696969", "dodgerblue" => "1E90FF", "firebrick" => "B22222", "floralwhite" => "FFFAF0", "forestgreen" => "228B22", "fuchsia" => "FF00FF", "gainsboro" => "DCDCDC", "ghostwhite" => "F8F8FF", "gold" => "FFD700", "goldenrod" => "DAA520", "gray" => "808080", "green" => "008000", "greenyellow" => "ADFF2F", "grey" => "808080", "honeydew" => "F0FFF0", "hotpink" => "FF69B4", "indianred" => "CD5C5C", "indigo" => "4B0082", "ivory" => "FFFFF0", "khaki" => "F0E68C", "lavender" => "E6E6FA", "lavenderblush" => "FFF0F5", "lawngreen" => "7CFC00", "lemonchiffon" => "FFFACD", "lightblue" => "ADD8E6", "lightcoral" => "F08080", "lightcyan" => "E0FFFF", "lightgoldenrodyellow" => "FAFAD2", "lightgray" => "D3D3D3", "lightgreen" => "90EE90", "lightgrey" => "D3D3D3", "lightpink" => "FFB6C1", "lightsalmon" => "FFA07A", "lightseagreen" => "20B2AA", "lightskyblue" => "87CEFA", "lightslategray" => "778899", "lightslategrey" => "778899", "lightsteelblue" => "B0C4DE", "lightyellow" => "FFFFE0", "lime" => "00FF00", "limegreen" => "32CD32", "linen" => "FAF0E6", "magenta" => "FF00FF", "maroon" => "800000", "mediumaquamarine" => "66CDAA", "mediumblue" => "0000CD", "mediumorchid" => "BA55D3", "mediumpurple" => "9370DB", "mediumseagreen" => "3CB371", "mediumslateblue" => "7B68EE", "mediumspringgreen" => "00FA9A", "mediumturquoise" => "48D1CC", "mediumvioletred" => "C71585", "midnightblue" => "191970", "mintcream" => "F5FFFA", "mistyrose" => "FFE4E1", "moccasin" => "FFE4B5", "navajowhite" => "FFDEAD", "navy" => "000080", "oldlace" => "FDF5E6", "olive" => "808000", "olivedrab" => "6B8E23", "orange" => "FFA500", "orangered" => "FF4500", "orchid" => "DA70D6", "palegoldenrod" => "EEE8AA", "palegreen" => "98FB98", "paleturquoise" => "AFEEEE", "palevioletred" => "DB7093", "papayawhip" => "FFEFD5", "peachpuff" => "FFDAB9", "peru" => "CD853F", "pink" => "FFC0CB", "plum" => "DDA0DD", "powderblue" => "B0E0E6", "purple" => "800080", "red" => "FF0000", "rosybrown" => "BC8F8F", "royalblue" => "4169E1", "saddlebrown" => "8B4513", "salmon" => "FA8072", "sandybrown" => "F4A460", "seagreen" => "2E8B57", "seashell" => "FFF5EE", "sienna" => "A0522D", "silver" => "C0C0C0", "skyblue" => "87CEEB", "slateblue" => "6A5ACD", "slategray" => "708090", "slategrey" => "708090", "snow" => "FFFAFA", "springgreen" => "00FF7F", "steelblue" => "4682B4", "tan" => "D2B48C", "teal" => "008080", "thistle" => "D8BFD8", "tomato" => "FF6347", "turquoise" => "40E0D0", "violet" => "EE82EE", "wheat" => "F5DEB3", "white" => "FFFFFF", "whitesmoke" => "F5F5F5", "yellow" => "FFFF00", "yellowgreen" => "9ACD32", ); static function parse($color) { if ( is_array($color) ) { // Assume the array has the right format... // FIXME: should/could verify this. return $color; } static $cache = array(); $color = strtolower($color); if ( isset($cache[$color]) ) { return $cache[$color]; } if ( in_array($color, array("transparent", "inherit")) ) { return $cache[$color] = $color; } if ( isset(self::$cssColorNames[$color]) ) { return $cache[$color] = self::getArray(self::$cssColorNames[$color]); } $length = mb_strlen($color); // #rgb format if ( $length == 4 && $color[0] === "#" ) { return $cache[$color] = self::getArray($color[1].$color[1].$color[2].$color[2].$color[3].$color[3]); } // #rrggbb format else if ( $length == 7 && $color[0] === "#" ) { return $cache[$color] = self::getArray(mb_substr($color, 1, 6)); } // rgb( r,g,b ) / rgbaa( r,g,b,α ) format else if ( mb_strpos($color, "rgb") !== false ) { $i = mb_strpos($color, "("); $j = mb_strpos($color, ")"); // Bad color value if ( $i === false || $j === false ) { return null; } $triplet = explode(",", mb_substr($color, $i+1, $j-$i-1)); // alpha transparency // FIXME: not currently using transparency $alpha = 1; if ( count( $triplet ) == 4 ) { $alpha = (float) ( trim( array_pop( $triplet ) ) ); // bad value, set to fully opaque if ( $alpha > 1 || $alpha < 0 ) { $alpha = 1; } } if ( count($triplet) != 3 ) { return null; } foreach (array_keys($triplet) as $c) { $triplet[$c] = trim($triplet[$c]); if ( $triplet[$c][mb_strlen($triplet[$c]) - 1] === "%" ) { $triplet[$c] = round($triplet[$c] * 2.55); } } return $cache[$color] = self::getArray(vsprintf("%02X%02X%02X", $triplet)); } // cmyk( c,m,y,k ) format // http://www.w3.org/TR/css3-gcpm/#cmyk-colors else if ( mb_strpos($color, "cmyk") !== false ) { $i = mb_strpos($color, "("); $j = mb_strpos($color, ")"); // Bad color value if ( $i === false || $j === false ) { return null; } $values = explode(",", mb_substr($color, $i+1, $j-$i-1)); if ( count($values) != 4 ) { return null; } foreach ($values as &$c) { $c = floatval(trim($c)); if ($c > 1.0) $c = 1.0; if ($c < 0.0) $c = 0.0; } return $cache[$color] = self::getArray($values); } return null; } static function getArray($color) { $c = array(null, null, null, null, "hex" => null); if (is_array($color)) { $c = $color; $c["c"] = $c[0]; $c["m"] = $c[1]; $c["y"] = $c[2]; $c["k"] = $c[3]; $c["hex"] = "cmyk($c[0],$c[1],$c[2],$c[3])"; } else { $c[0] = hexdec(mb_substr($color, 0, 2)) / 0xff; $c[1] = hexdec(mb_substr($color, 2, 2)) / 0xff; $c[2] = hexdec(mb_substr($color, 4, 2)) / 0xff; $c["r"] = $c[0]; $c["g"] = $c[1]; $c["b"] = $c[2]; $c["hex"] = "#$color"; } return $c; } } dompdf-0.6.2/include/dompdf.cls.php000066400000000000000000000754251263120276100171720ustar00rootroot00000000000000 * @author Fabien Ménager * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * DOMPDF - PHP5 HTML to PDF renderer * * DOMPDF loads HTML and does its best to render it as a PDF. It gets its * name from the new DomDocument PHP5 extension. Source HTML is first * parsed by a DomDocument object. DOMPDF takes the resulting DOM tree and * attaches a {@link Frame} object to each node. {@link Frame} objects store * positioning and layout information and each has a reference to a {@link * Style} object. * * Style information is loaded and parsed (see {@link Stylesheet}) and is * applied to the frames in the tree by using XPath. CSS selectors are * converted into XPath queries, and the computed {@link Style} objects are * applied to the {@link Frame}s. * * {@link Frame}s are then decorated (in the design pattern sense of the * word) based on their CSS display property ({@link * http://www.w3.org/TR/CSS21/visuren.html#propdef-display}). * Frame_Decorators augment the basic {@link Frame} class by adding * additional properties and methods specific to the particular type of * {@link Frame}. For example, in the CSS layout model, block frames * (display: block;) contain line boxes that are usually filled with text or * other inline frames. The Block_Frame_Decorator therefore adds a $lines * property as well as methods to add {@link Frame}s to lines and to add * additional lines. {@link Frame}s also are attached to specific * Positioner and {@link Frame_Reflower} objects that contain the * positioining and layout algorithm for a specific type of frame, * respectively. This is an application of the Strategy pattern. * * Layout, or reflow, proceeds recursively (post-order) starting at the root * of the document. Space constraints (containing block width & height) are * pushed down, and resolved positions and sizes bubble up. Thus, every * {@link Frame} in the document tree is traversed once (except for tables * which use a two-pass layout algorithm). If you are interested in the * details, see the reflow() method of the Reflower classes. * * Rendering is relatively straightforward once layout is complete. {@link * Frame}s are rendered using an adapted {@link Cpdf} class, originally * written by Wayne Munro, http://www.ros.co.nz/pdf/. (Some performance * related changes have been made to the original {@link Cpdf} class, and * the {@link CPDF_Adapter} class provides a simple, stateless interface to * PDF generation.) PDFLib support has now also been added, via the {@link * PDFLib_Adapter}. * * * @package dompdf */ class DOMPDF { /** * DomDocument representing the HTML document * * @var DOMDocument */ protected $_xml; /** * Frame_Tree derived from the DOM tree * * @var Frame_Tree */ protected $_tree; /** * Stylesheet for the document * * @var Stylesheet */ protected $_css; /** * Actual PDF renderer * * @var Canvas */ protected $_pdf; /** * Desired paper size ('letter', 'legal', 'A4', etc.) * * @var string */ protected $_paper_size; /** * Paper orientation ('portrait' or 'landscape') * * @var string */ protected $_paper_orientation; /** * Callbacks on new page and new element * * @var array */ protected $_callbacks; /** * Experimental caching capability * * @var string */ private $_cache_id; /** * Base hostname * * Used for relative paths/urls * @var string */ protected $_base_host; /** * Absolute base path * * Used for relative paths/urls * @var string */ protected $_base_path; /** * Protcol used to request file (file://, http://, etc) * * @var string */ protected $_protocol; /** * HTTP context created with stream_context_create() * Will be used for file_get_contents * * @var resource */ protected $_http_context; /** * Timestamp of the script start time * * @var int */ private $_start_time = null; /** * The system's locale * * @var string */ private $_system_locale = null; /** * Tells if the system's locale is the C standard one * * @var bool */ private $_locale_standard = false; /** * The default view of the PDF in the viewer * * @var string */ private $_default_view = "Fit"; /** * The default view options of the PDF in the viewer * * @var array */ private $_default_view_options = array(); /** * Tells wether the DOM document is in quirksmode (experimental) * * @var bool */ private $_quirksmode = false; /** * Protocol whitelist * * Protocols and PHP wrappers allowed in URLs. Full support is not * guarantee for the protocols/wrappers contained in this array. * * @var array */ private $_allowed_protocols = array(null, "", "file://", "http://", "https://"); /** * Local file extension whitelist * * File extensions supported by dompdf for local files. * * @var array */ private $_allowed_local_file_extensions = array("htm", "html"); /** * The list of built-in fonts * * @var array */ public static $native_fonts = array( "courier", "courier-bold", "courier-oblique", "courier-boldoblique", "helvetica", "helvetica-bold", "helvetica-oblique", "helvetica-boldoblique", "times-roman", "times-bold", "times-italic", "times-bolditalic", "symbol", "zapfdinbats" ); private $_options = array( // Directories "temp_dir" => DOMPDF_TEMP_DIR, "font_dir" => DOMPDF_FONT_DIR, "font_cache" => DOMPDF_FONT_CACHE, "chroot" => DOMPDF_CHROOT, "log_output_file" => DOMPDF_LOG_OUTPUT_FILE, // Rendering "default_media_type" => DOMPDF_DEFAULT_MEDIA_TYPE, "default_paper_size" => DOMPDF_DEFAULT_PAPER_SIZE, "default_font" => DOMPDF_DEFAULT_FONT, "dpi" => DOMPDF_DPI, "font_height_ratio" => DOMPDF_FONT_HEIGHT_RATIO, // Features "enable_unicode" => DOMPDF_UNICODE_ENABLED, "enable_php" => DOMPDF_ENABLE_PHP, "enable_remote" => DOMPDF_ENABLE_REMOTE, "enable_css_float" => DOMPDF_ENABLE_CSS_FLOAT, "enable_javascript" => DOMPDF_ENABLE_JAVASCRIPT, "enable_html5_parser" => DOMPDF_ENABLE_HTML5PARSER, "enable_font_subsetting" => DOMPDF_ENABLE_FONTSUBSETTING, // Debug "debug_png" => DEBUGPNG, "debug_keep_temp" => DEBUGKEEPTEMP, "debug_css" => DEBUGCSS, "debug_layout" => DEBUG_LAYOUT, "debug_layout_lines" => DEBUG_LAYOUT_LINES, "debug_layout_blocks" => DEBUG_LAYOUT_BLOCKS, "debug_layout_inline" => DEBUG_LAYOUT_INLINE, "debug_layout_padding_box" => DEBUG_LAYOUT_PADDINGBOX, // Admin "admin_username" => DOMPDF_ADMIN_USERNAME, "admin_password" => DOMPDF_ADMIN_PASSWORD, ); /** * Class constructor */ function __construct() { $this->_locale_standard = sprintf('%.1f', 1.0) == '1.0'; $this->save_locale(); $this->_messages = array(); $this->_css = new Stylesheet($this); $this->_pdf = null; $this->_paper_size = DOMPDF_DEFAULT_PAPER_SIZE; $this->_paper_orientation = "portrait"; $this->_base_protocol = ""; $this->_base_host = ""; $this->_base_path = ""; $this->_http_context = null; $this->_callbacks = array(); $this->_cache_id = null; $this->restore_locale(); } /** * Class destructor */ function __destruct() { clear_object($this); } /** * Get the dompdf option value * * @param string $key * * @return mixed * @throws DOMPDF_Exception */ function get_option($key) { if ( !array_key_exists($key, $this->_options) ) { throw new DOMPDF_Exception("Option '$key' doesn't exist"); } return $this->_options[$key]; } /** * @param string $key * @param mixed $value * * @throws DOMPDF_Exception */ function set_option($key, $value) { if ( !array_key_exists($key, $this->_options) ) { throw new DOMPDF_Exception("Option '$key' doesn't exist"); } $this->_options[$key] = $value; } /** * @param array $options */ function set_options(array $options) { foreach ($options as $key => $value) { $this->set_option($key, $value); } } /** * Save the system's locale configuration and * set the right value for numeric formatting */ private function save_locale() { if ( $this->_locale_standard ) { return; } $this->_system_locale = setlocale(LC_NUMERIC, "0"); setlocale(LC_NUMERIC, "C"); } /** * Restore the system's locale configuration */ private function restore_locale() { if ( $this->_locale_standard ) { return; } setlocale(LC_NUMERIC, $this->_system_locale); } /** * Returns the underlying {@link Frame_Tree} object * * @return Frame_Tree */ function get_tree() { return $this->_tree; } /** * Sets the protocol to use * FIXME validate these * * @param string $proto */ function set_protocol($proto) { $this->_protocol = $proto; } /** * Sets the base hostname * * @param string $host */ function set_host($host) { $this->_base_host = $host; } /** * Sets the base path * * @param string $path */ function set_base_path($path) { $this->_base_path = $path; } /** * Sets the HTTP context * * @param resource $http_context */ function set_http_context($http_context) { $this->_http_context = $http_context; } /** * Sets the default view * * @param string $default_view The default document view * @param array $options The view's options */ function set_default_view($default_view, $options) { $this->_default_view = $default_view; $this->_default_view_options = $options; } /** * Returns the protocol in use * * @return string */ function get_protocol() { return $this->_protocol; } /** * Returns the base hostname * * @return string */ function get_host() { return $this->_base_host; } /** * Returns the base path * * @return string */ function get_base_path() { return $this->_base_path; } /** * Returns the HTTP context * * @return resource */ function get_http_context() { return $this->_http_context; } /** * Return the underlying Canvas instance (e.g. CPDF_Adapter, GD_Adapter) * * @return Canvas */ function get_canvas() { return $this->_pdf; } /** * Returns the callbacks array * * @return array */ function get_callbacks() { return $this->_callbacks; } /** * Returns the stylesheet * * @return Stylesheet */ function get_css() { return $this->_css; } /** * @return DOMDocument */ function get_dom() { return $this->_xml; } /** * Loads an HTML file * Parse errors are stored in the global array _dompdf_warnings. * * @param string $file a filename or url to load * * @throws DOMPDF_Exception */ function load_html_file($file) { $this->save_locale(); // Store parsing warnings as messages (this is to prevent output to the // browser if the html is ugly and the dom extension complains, // preventing the pdf from being streamed.) if ( !$this->_protocol && !$this->_base_host && !$this->_base_path ) { list($this->_protocol, $this->_base_host, $this->_base_path) = explode_url($file); } if ( !in_array($this->_protocol, $this->_allowed_protocols) ) { throw new DOMPDF_Exception("Permission denied on $file. The communication protocol is not supported."); } if ( !$this->get_option("enable_remote") && ($this->_protocol != "" && $this->_protocol !== "file://" ) ) { throw new DOMPDF_Exception("Remote file requested, but DOMPDF_ENABLE_REMOTE is false."); } if ($this->_protocol == "" || $this->_protocol === "file://") { // Get the full path to $file, returns false if the file doesn't exist $realfile = realpath($file); $chroot = $this->get_option("chroot"); if ( strpos($realfile, $chroot) !== 0 ) { throw new DOMPDF_Exception("Permission denied on $file. The file could not be found under the directory specified by DOMPDF_CHROOT."); } $ext = pathinfo($realfile, PATHINFO_EXTENSION); if (!in_array($ext, $this->_allowed_local_file_extensions)) { throw new DOMPDF_Exception("Permission denied on $file."); } if ( !$realfile ) { throw new DOMPDF_Exception("File '$file' not found."); } $file = $realfile; } $contents = file_get_contents($file, null, $this->_http_context); $encoding = null; // See http://the-stickman.com/web-development/php/getting-http-response-headers-when-using-file_get_contents/ if ( isset($http_response_header) ) { foreach($http_response_header as $_header) { if ( preg_match("@Content-Type:\s*[\w/]+;\s*?charset=([^\s]+)@i", $_header, $matches) ) { $encoding = strtoupper($matches[1]); break; } } } $this->restore_locale(); $this->load_html($contents, $encoding); } /** * Loads an HTML string * Parse errors are stored in the global array _dompdf_warnings. * @todo use the $encoding variable * * @param string $str HTML text to load * @param string $encoding Not used yet */ function load_html($str, $encoding = null) { $this->save_locale(); // FIXME: Determine character encoding, switch to UTF8, update meta tag. Need better http/file stream encoding detection, currently relies on text or meta tag. mb_detect_order('auto'); if (mb_detect_encoding($str) !== 'UTF-8') { $metatags = array( '@]*charset\s*=\s*["\']?\s*([^"\' ]+)@i', ); foreach($metatags as $metatag) { if (preg_match($metatag, $str, $matches)) break; } if (mb_detect_encoding($str) == '') { if (isset($matches[1])) { $encoding = strtoupper($matches[1]); } else { $encoding = 'UTF-8'; } } else { if ( isset($matches[1]) ) { $encoding = strtoupper($matches[1]); } else { $encoding = 'auto'; } } if ( $encoding !== 'UTF-8' ) { $str = mb_convert_encoding($str, 'UTF-8', $encoding); } if ( isset($matches[1]) ) { $str = preg_replace('/charset=([^\s"]+)/i', 'charset=UTF-8', $str); } else { $str = str_replace('', '', $str); } } else { $encoding = 'UTF-8'; } // remove BOM mark from UTF-8, it's treated as document text by DOMDocument // FIXME: roll this into the encoding detection using UTF-8/16/32 BOM (http://us2.php.net/manual/en/function.mb-detect-encoding.php#91051)? if ( substr($str, 0, 3) == chr(0xEF).chr(0xBB).chr(0xBF) ) { $str = substr($str, 3); } // if the document contains non utf-8 with a utf-8 meta tag chars and was // detected as utf-8 by mbstring, problems could happen. // http://devzone.zend.com/article/8855 if ( $encoding !== 'UTF-8' ) { $re = '/]*)((?:charset=[^"\' ]+)([^>]*)|(?:charset=["\'][^"\' ]+["\']))([^>]*)>/i'; $str = preg_replace($re, '', $str); } // Store parsing warnings as messages set_error_handler("record_warnings"); // @todo Take the quirksmode into account // http://hsivonen.iki.fi/doctype/ // https://developer.mozilla.org/en/mozilla's_quirks_mode $quirksmode = false; if ( $this->get_option("enable_html5_parser") ) { $tokenizer = new HTML5_Tokenizer($str); $tokenizer->parse(); $doc = $tokenizer->save(); // Remove #text children nodes in nodes that shouldn't have $tag_names = array("html", "table", "tbody", "thead", "tfoot", "tr"); foreach($tag_names as $tag_name) { $nodes = $doc->getElementsByTagName($tag_name); foreach($nodes as $node) { self::remove_text_nodes($node); } } $quirksmode = ($tokenizer->getTree()->getQuirksMode() > HTML5_TreeBuilder::NO_QUIRKS); } else { // loadHTML assumes ISO-8859-1 unless otherwise specified, but there are // bugs in how DOMDocument determines the actual encoding. Converting to // HTML-ENTITIES prior to import appears to resolve the issue. // http://devzone.zend.com/1538/php-dom-xml-extension-encoding-processing/ (see #4) // http://stackoverflow.com/a/11310258/264628 $doc = new DOMDocument(); $doc->preserveWhiteSpace = true; $doc->loadHTML( mb_convert_encoding( $str , 'HTML-ENTITIES' , 'UTF-8' ) ); // If some text is before the doctype, we are in quirksmode if ( preg_match("/^(.+) if ( !$doc->doctype->publicId && !$doc->doctype->systemId ) { $quirksmode = false; } // not XHTML if ( !preg_match("/xhtml/i", $doc->doctype->publicId) ) { $quirksmode = true; } } } $this->_xml = $doc; $this->_quirksmode = $quirksmode; $this->_tree = new Frame_Tree($this->_xml); restore_error_handler(); $this->restore_locale(); } static function remove_text_nodes(DOMNode $node) { $children = array(); for ($i = 0; $i < $node->childNodes->length; $i++) { $child = $node->childNodes->item($i); if ( $child->nodeName === "#text" ) { $children[] = $child; } } foreach($children as $child) { $node->removeChild($child); } } /** * Builds the {@link Frame_Tree}, loads any CSS and applies the styles to * the {@link Frame_Tree} */ protected function _process_html() { $this->_tree->build_tree(); $this->_css->load_css_file(Stylesheet::DEFAULT_STYLESHEET, Stylesheet::ORIG_UA); $acceptedmedia = Stylesheet::$ACCEPTED_GENERIC_MEDIA_TYPES; $acceptedmedia[] = $this->get_option("default_media_type"); // $base_nodes = $this->_xml->getElementsByTagName("base"); if ( $base_nodes->length && ($href = $base_nodes->item(0)->getAttribute("href")) ) { list($this->_protocol, $this->_base_host, $this->_base_path) = explode_url($href); } // Set the base path of the Stylesheet to that of the file being processed $this->_css->set_protocol($this->_protocol); $this->_css->set_host($this->_base_host); $this->_css->set_base_path($this->_base_path); // Get all the stylesheets so that they are processed in document order $xpath = new DOMXPath($this->_xml); $stylesheets = $xpath->query("//*[name() = 'link' or name() = 'style']"); foreach($stylesheets as $tag) { switch (strtolower($tag->nodeName)) { // load tags case "link": if ( mb_strtolower(stripos($tag->getAttribute("rel"), "stylesheet") !== false) || // may be "appendix stylesheet" mb_strtolower($tag->getAttribute("type")) === "text/css" ) { //Check if the css file is for an accepted media type //media not given then always valid $formedialist = preg_split("/[\s\n,]/", $tag->getAttribute("media"),-1, PREG_SPLIT_NO_EMPTY); if ( count($formedialist) > 0 ) { $accept = false; foreach ( $formedialist as $type ) { if ( in_array(mb_strtolower(trim($type)), $acceptedmedia) ) { $accept = true; break; } } if (!$accept) { //found at least one mediatype, but none of the accepted ones //Skip this css file. continue; } } $url = $tag->getAttribute("href"); $url = build_url($this->_protocol, $this->_base_host, $this->_base_path, $url); $this->_css->load_css_file($url, Stylesheet::ORIG_AUTHOR); } break; // load $child = $child->nextSibling; } } else { $css = $tag->nodeValue; } $this->_css->load_css($css); break; } } } /** * Sets the paper size & orientation * * @param string $size 'letter', 'legal', 'A4', etc. {@link CPDF_Adapter::$PAPER_SIZES} * @param string $orientation 'portrait' or 'landscape' */ function set_paper($size, $orientation = "portrait") { $this->_paper_size = $size; $this->_paper_orientation = $orientation; } /** * Enable experimental caching capability * @access private */ function enable_caching($cache_id) { $this->_cache_id = $cache_id; } /** * Sets callbacks for events like rendering of pages and elements. * The callbacks array contains arrays with 'event' set to 'begin_page', * 'end_page', 'begin_frame', or 'end_frame' and 'f' set to a function or * object plus method to be called. * * The function 'f' must take an array as argument, which contains info * about the event. * * @param array $callbacks the set of callbacks to set */ function set_callbacks($callbacks) { if (is_array($callbacks)) { $this->_callbacks = array(); foreach ($callbacks as $c) { if (is_array($c) && isset($c['event']) && isset($c['f'])) { $event = $c['event']; $f = $c['f']; if (is_callable($f) && is_string($event)) { $this->_callbacks[$event][] = $f; } } } } } /** * Get the quirks mode * * @return boolean true if quirks mode is active */ function get_quirksmode(){ return $this->_quirksmode; } function parse_default_view($value) { $valid = array("XYZ", "Fit", "FitH", "FitV", "FitR", "FitB", "FitBH", "FitBV"); $options = preg_split("/\s*,\s*/", trim($value)); $default_view = array_shift($options); if ( !in_array($default_view, $valid) ) { return false; } $this->set_default_view($default_view, $options); return true; } /** * Renders the HTML to PDF */ function render() { $this->save_locale(); $log_output_file = $this->get_option("log_output_file"); if ( $log_output_file ) { if ( !file_exists($log_output_file) && is_writable(dirname($log_output_file)) ) { touch($log_output_file); } $this->_start_time = microtime(true); ob_start(); } //enable_mem_profile(); $this->_process_html(); $this->_css->apply_styles($this->_tree); // @page style rules : size, margins $page_styles = $this->_css->get_page_styles(); $base_page_style = $page_styles["base"]; unset($page_styles["base"]); foreach($page_styles as $_page_style) { $_page_style->inherit($base_page_style); } if ( is_array($base_page_style->size) ) { $this->set_paper(array(0, 0, $base_page_style->size[0], $base_page_style->size[1])); } $this->_pdf = Canvas_Factory::get_instance($this, $this->_paper_size, $this->_paper_orientation); Font_Metrics::init($this->_pdf); if ( $this->get_option("enable_font_subsetting") && $this->_pdf instanceof CPDF_Adapter ) { foreach ($this->_tree->get_frames() as $frame) { $style = $frame->get_style(); $node = $frame->get_node(); // Handle text nodes if ( $node->nodeName === "#text" ) { $this->_pdf->register_string_subset($style->font_family, $node->nodeValue); continue; } // Handle generated content (list items) if ( $style->display === "list-item" ) { $chars = List_Bullet_Renderer::get_counter_chars($style->list_style_type); $this->_pdf->register_string_subset($style->font_family, $chars); continue; } // Handle other generated content (pseudo elements) // FIXME: This only captures the text of the stylesheet declaration, // not the actual generated content, and forces all possible counter // values. See notes in issue #750. if ( $frame->get_node()->nodeName == "dompdf_generated" ) { // all possible counter values $chars = List_Bullet_Renderer::get_counter_chars('decimal'); $this->_pdf->register_string_subset($style->font_family, $chars); $chars = List_Bullet_Renderer::get_counter_chars('upper-alpha'); $this->_pdf->register_string_subset($style->font_family, $chars); $chars = List_Bullet_Renderer::get_counter_chars('lower-alpha'); $this->_pdf->register_string_subset($style->font_family, $chars); $chars = List_Bullet_Renderer::get_counter_chars('lower-greek'); $this->_pdf->register_string_subset($style->font_family, $chars); // the text of the stylesheet declaration $this->_pdf->register_string_subset($style->font_family, $style->content); continue; } } } $root = null; foreach ($this->_tree->get_frames() as $frame) { // Set up the root frame if ( is_null($root) ) { $root = Frame_Factory::decorate_root( $this->_tree->get_root(), $this ); continue; } // Create the appropriate decorators, reflowers & positioners. Frame_Factory::decorate_frame($frame, $this, $root); } // Add meta information $title = $this->_xml->getElementsByTagName("title"); if ( $title->length ) { $this->_pdf->add_info("Title", trim($title->item(0)->nodeValue)); } $metas = $this->_xml->getElementsByTagName("meta"); $labels = array( "author" => "Author", "keywords" => "Keywords", "description" => "Subject", ); foreach($metas as $meta) { $name = mb_strtolower($meta->getAttribute("name")); $value = trim($meta->getAttribute("content")); if ( isset($labels[$name]) ) { $this->_pdf->add_info($labels[$name], $value); continue; } if ( $name === "dompdf.view" && $this->parse_default_view($value) ) { $this->_pdf->set_default_view($this->_default_view, $this->_default_view_options); } } $root->set_containing_block(0, 0, $this->_pdf->get_width(), $this->_pdf->get_height()); $root->set_renderer(new Renderer($this)); // This is where the magic happens: $root->reflow(); // Clean up cached images Image_Cache::clear(); global $_dompdf_warnings, $_dompdf_show_warnings; if ( $_dompdf_show_warnings ) { echo 'DOMPDF Warnings
';
      foreach ($_dompdf_warnings as $msg) {
        echo $msg . "\n";
      }
      echo $this->get_canvas()->get_cpdf()->messages;
      echo '
'; flush(); } $this->restore_locale(); } /** * Add meta information to the PDF after rendering */ function add_info($label, $value) { if ( !is_null($this->_pdf) ) { $this->_pdf->add_info($label, $value); } } /** * Writes the output buffer in the log file * * @return void */ private function write_log() { $log_output_file = $this->get_option("log_output_file"); if ( !$log_output_file || !is_writable($log_output_file) ) { return; } $frames = Frame::$ID_COUNTER; $memory = DOMPDF_memory_usage() / 1024; $time = (microtime(true) - $this->_start_time) * 1000; $out = sprintf( "%6d". "%10.2f KB". "%10.2f ms". " ". ($this->_quirksmode ? " ON" : "OFF"). "
", $frames, $memory, $time); $out .= ob_get_clean(); $log_output_file = $this->get_option("log_output_file"); file_put_contents($log_output_file, $out); } /** * Streams the PDF to the client * * The file will open a download dialog by default. The options * parameter controls the output. Accepted options are: * * 'Accept-Ranges' => 1 or 0 - if this is not set to 1, then this * header is not included, off by default this header seems to * have caused some problems despite the fact that it is supposed * to solve them, so I am leaving it off by default. * * 'compress' = > 1 or 0 - apply content stream compression, this is * on (1) by default * * 'Attachment' => 1 or 0 - if 1, force the browser to open a * download dialog, on (1) by default * * @param string $filename the name of the streamed file * @param array $options header options (see above) */ function stream($filename, $options = null) { $this->save_locale(); $this->write_log(); if ( !is_null($this->_pdf) ) { $this->_pdf->stream($filename, $options); } $this->restore_locale(); } /** * Returns the PDF as a string * * The file will open a download dialog by default. The options * parameter controls the output. Accepted options are: * * * 'compress' = > 1 or 0 - apply content stream compression, this is * on (1) by default * * * @param array $options options (see above) * * @return string */ function output($options = null) { $this->save_locale(); $this->write_log(); if ( is_null($this->_pdf) ) { return null; } $output = $this->_pdf->output( $options ); $this->restore_locale(); return $output; } /** * Returns the underlying HTML document as a string * * @return string */ function output_html() { return $this->_xml->saveHTML(); } } dompdf-0.6.2/include/dompdf_exception.cls.php000066400000000000000000000010471263120276100212350ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Standard exception thrown by DOMPDF classes * * @package dompdf */ class DOMPDF_Exception extends Exception { /** * Class constructor * * @param string $message Error message * @param int $code Error code */ function __construct($message = null, $code = 0) { parent::__construct($message, $code); } } dompdf-0.6.2/include/dompdf_image_exception.cls.php000066400000000000000000000010511263120276100223720ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Image exception thrown by DOMPDF * * @package dompdf */ class DOMPDF_Image_Exception extends DOMPDF_Exception { /** * Class constructor * * @param string $message Error message * @param int $code Error code */ function __construct($message = null, $code = 0) { parent::__construct($message, $code); } } dompdf-0.6.2/include/file.skel000066400000000000000000000003441263120276100162130ustar00rootroot00000000000000 * @author ... * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ dompdf-0.6.2/include/fixed_positioner.cls.php000066400000000000000000000053561263120276100212670ustar00rootroot00000000000000 * @author Fabien Ménager * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Positions fixely positioned frames */ class Fixed_Positioner extends Positioner { function __construct(Frame_Decorator $frame) { parent::__construct($frame); } function position() { $frame = $this->_frame; $style = $frame->get_original_style(); $root = $frame->get_root(); $initialcb = $root->get_containing_block(); $initialcb_style = $root->get_style(); $p = $frame->find_block_parent(); if ( $p ) { $p->add_line(); } // Compute the margins of the @page style $margin_top = $initialcb_style->length_in_pt($initialcb_style->margin_top, $initialcb["h"]); $margin_right = $initialcb_style->length_in_pt($initialcb_style->margin_right, $initialcb["w"]); $margin_bottom = $initialcb_style->length_in_pt($initialcb_style->margin_bottom, $initialcb["h"]); $margin_left = $initialcb_style->length_in_pt($initialcb_style->margin_left, $initialcb["w"]); // The needed computed style of the element $height = $style->length_in_pt($style->height, $initialcb["h"]); $width = $style->length_in_pt($style->width, $initialcb["w"]); $top = $style->length_in_pt($style->top, $initialcb["h"]); $right = $style->length_in_pt($style->right, $initialcb["w"]); $bottom = $style->length_in_pt($style->bottom, $initialcb["h"]); $left = $style->length_in_pt($style->left, $initialcb["w"]); $y = $margin_top; if ( isset($top) ) { $y = $top + $margin_top; if ( $top === "auto" ) { $y = $margin_top; if ( isset($bottom) && $bottom !== "auto" ) { $y = $initialcb["h"] - $bottom - $margin_bottom; $margin_height = $this->_frame->get_margin_height(); if ( $margin_height !== "auto" ) { $y -= $margin_height; } else { $y -= $height; } } } } $x = $margin_left; if ( isset($left) ) { $x = $left + $margin_left; if ( $left === "auto" ) { $x = $margin_left; if ( isset($right) && $right !== "auto" ) { $x = $initialcb["w"] - $right - $margin_right; $margin_width = $this->_frame->get_margin_width(); if ( $margin_width !== "auto" ) { $x -= $margin_width; } else { $x -= $width; } } } } $frame->set_position($x, $y); $children = $frame->get_children(); foreach($children as $child) { $child->set_position($x, $y); } } }dompdf-0.6.2/include/font_metrics.cls.php000066400000000000000000000256661263120276100204170ustar00rootroot00000000000000 * @author Helmut Tischer * @author Fabien Ménager * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ require_once DOMPDF_LIB_DIR . "/class.pdf.php"; /** * Name of the font cache file * * This file must be writable by the webserver process only to update it * with save_font_families() after adding the .afm file references of a new font family * with Font_Metrics::save_font_families(). * This is typically done only from command line with load_font.php on converting * ttf fonts to ufm with php-font-lib. * * Declared here because PHP5 prevents constants from being declared with expressions */ define('__DOMPDF_FONT_CACHE_FILE', DOMPDF_FONT_DIR . "dompdf_font_family_cache.php"); /** * The font metrics class * * This class provides information about fonts and text. It can resolve * font names into actual installed font files, as well as determine the * size of text in a particular font and size. * * @static * @package dompdf */ class Font_Metrics { /** * @see __DOMPDF_FONT_CACHE_FILE */ const CACHE_FILE = __DOMPDF_FONT_CACHE_FILE; /** * Underlying {@link Canvas} object to perform text size calculations * * @var Canvas */ static protected $_pdf = null; /** * Array of font family names to font files * * Usually cached by the {@link load_font.php} script * * @var array */ static protected $_font_lookup = array(); /** * Class initialization * */ static function init(Canvas $canvas = null) { if (!self::$_pdf) { if (!$canvas) { $canvas = Canvas_Factory::get_instance(new DOMPDF()); } self::$_pdf = $canvas; } } /** * Calculates text size, in points * * @param string $text the text to be sized * @param string $font the desired font * @param float $size the desired font size * @param float $word_spacing * @param float $char_spacing * * @internal param float $spacing word spacing, if any * @return float */ static function get_text_width($text, $font, $size, $word_spacing = 0.0, $char_spacing = 0.0) { //return self::$_pdf->get_text_width($text, $font, $size, $word_spacing, $char_spacing); // @todo Make sure this cache is efficient before enabling it static $cache = array(); if ( $text === "" ) { return 0; } // Don't cache long strings $use_cache = !isset($text[50]); // Faster than strlen $key = "$font/$size/$word_spacing/$char_spacing"; if ( $use_cache && isset($cache[$key][$text]) ) { return $cache[$key]["$text"]; } $width = self::$_pdf->get_text_width($text, $font, $size, $word_spacing, $char_spacing); if ( $use_cache ) { $cache[$key][$text] = $width; } return $width; } /** * Calculates font height * * @param string $font * @param float $size * @return float */ static function get_font_height($font, $size) { return self::$_pdf->get_font_height($font, $size); } /** * Resolves a font family & subtype into an actual font file * Subtype can be one of 'normal', 'bold', 'italic' or 'bold_italic'. If * the particular font family has no suitable font file, the default font * ({@link DOMPDF_DEFAULT_FONT}) is used. The font file returned * is the absolute pathname to the font file on the system. * * @param string $family_raw * @param string $subtype_raw * * @return string */ static function get_font($family_raw, $subtype_raw = "normal") { static $cache = array(); if ( isset($cache[$family_raw][$subtype_raw]) ) { return $cache[$family_raw][$subtype_raw]; } /* Allow calling for various fonts in search path. Therefore not immediately * return replacement on non match. * Only when called with NULL try replacement. * When this is also missing there is really trouble. * If only the subtype fails, nevertheless return failure. * Only on checking the fallback font, check various subtypes on same font. */ $subtype = strtolower($subtype_raw); if ( $family_raw ) { $family = str_replace( array("'", '"'), "", strtolower($family_raw)); if ( isset(self::$_font_lookup[$family][$subtype]) ) { return $cache[$family_raw][$subtype_raw] = self::$_font_lookup[$family][$subtype]; } return null; } $family = "serif"; if ( isset(self::$_font_lookup[$family][$subtype]) ) { return $cache[$family_raw][$subtype_raw] = self::$_font_lookup[$family][$subtype]; } if ( !isset(self::$_font_lookup[$family]) ) { return null; } $family = self::$_font_lookup[$family]; foreach ( $family as $sub => $font ) { if (strpos($subtype, $sub) !== false) { return $cache[$family_raw][$subtype_raw] = $font; } } if ($subtype !== "normal") { foreach ( $family as $sub => $font ) { if ($sub !== "normal") { return $cache[$family_raw][$subtype_raw] = $font; } } } $subtype = "normal"; if ( isset($family[$subtype]) ) { return $cache[$family_raw][$subtype_raw] = $family[$subtype]; } return null; } static function get_family($family) { $family = str_replace( array("'", '"'), "", mb_strtolower($family)); if ( isset(self::$_font_lookup[$family]) ) { return self::$_font_lookup[$family]; } return null; } /** * Saves the stored font family cache * * The name and location of the cache file are determined by {@link * Font_Metrics::CACHE_FILE}. This file should be writable by the * webserver process. * * @see Font_Metrics::load_font_families() */ static function save_font_families() { // replace the path to the DOMPDF font directories with the corresponding constants (allows for more portability) $cache_data = sprintf(" $variants) { $cache_data .= sprintf(" '%s' => array(%s", addslashes($family), PHP_EOL); foreach ($variants as $variant => $path) { $path = sprintf("'%s'", $path); $path = str_replace('\'' . DOMPDF_FONT_DIR , 'DOMPDF_FONT_DIR . \'' , $path); $path = str_replace('\'' . DOMPDF_DIR , 'DOMPDF_DIR . \'' , $path); $cache_data .= sprintf(" '%s' => %s,%s", $variant, $path, PHP_EOL); } $cache_data .= sprintf(" ),%s", PHP_EOL); } $cache_data .= ") ?>"; file_put_contents(self::CACHE_FILE, $cache_data); } /** * Loads the stored font family cache * * @see save_font_families() */ static function load_font_families() { $dist_fonts = require_once DOMPDF_DIR . "/lib/fonts/dompdf_font_family_cache.dist.php"; // FIXME: temporary step for font cache created before the font cache fix if ( is_readable( DOMPDF_FONT_DIR . "dompdf_font_family_cache" ) ) { $old_fonts = require_once DOMPDF_FONT_DIR . "dompdf_font_family_cache"; // If the font family cache is still in the old format if ( $old_fonts === 1 ) { $cache_data = file_get_contents(DOMPDF_FONT_DIR . "dompdf_font_family_cache"); file_put_contents(DOMPDF_FONT_DIR . "dompdf_font_family_cache", "<"."?php return $cache_data ?".">"); $old_fonts = require_once DOMPDF_FONT_DIR . "dompdf_font_family_cache"; } $dist_fonts += $old_fonts; } if ( !is_readable(self::CACHE_FILE) ) { self::$_font_lookup = $dist_fonts; return; } $cache_data = require_once self::CACHE_FILE; // If the font family cache is still in the old format if ( self::$_font_lookup === 1 ) { $cache_data = file_get_contents(self::CACHE_FILE); file_put_contents(self::CACHE_FILE, "<"."?php return $cache_data ?".">"); $cache_data = require_once self::CACHE_FILE; } self::$_font_lookup = array(); foreach ($cache_data as $key => $value) { self::$_font_lookup[stripslashes($key)] = $value; } // Merge provided fonts self::$_font_lookup += $dist_fonts; } static function get_type($type) { if (preg_match("/bold/i", $type)) { if (preg_match("/italic|oblique/i", $type)) { $type = "bold_italic"; } else { $type = "bold"; } } elseif (preg_match("/italic|oblique/i", $type)) { $type = "italic"; } else { $type = "normal"; } return $type; } static function install_fonts($files) { $names = array(); foreach($files as $file) { $font = Font::load($file); $records = $font->getData("name", "records"); $type = self::get_type($records[2]); $names[mb_strtolower($records[1])][$type] = $file; } return $names; } static function get_system_fonts() { $files = glob("/usr/share/fonts/truetype/*.ttf") + glob("/usr/share/fonts/truetype/*/*.ttf") + glob("/usr/share/fonts/truetype/*/*/*.ttf") + glob("C:\\Windows\\fonts\\*.ttf") + glob("C:\\WinNT\\fonts\\*.ttf") + glob("/mnt/c_drive/WINDOWS/Fonts/"); return self::install_fonts($files); } /** * Returns the current font lookup table * * @return array */ static function get_font_families() { return self::$_font_lookup; } static function set_font_family($fontname, $entry) { self::$_font_lookup[mb_strtolower($fontname)] = $entry; } static function register_font($style, $remote_file, $context = null) { $fontname = mb_strtolower($style["family"]); $families = Font_Metrics::get_font_families(); $entry = array(); if ( isset($families[$fontname]) ) { $entry = $families[$fontname]; } $local_file = DOMPDF_FONT_DIR . md5($remote_file); $local_temp_file = DOMPDF_TEMP_DIR . "/" . md5($remote_file); $cache_entry = $local_file; $local_file .= ".ttf"; $style_string = Font_Metrics::get_type("{$style['weight']} {$style['style']}"); if ( !isset($entry[$style_string]) ) { $entry[$style_string] = $cache_entry; // Download the remote file file_put_contents($local_temp_file, file_get_contents($remote_file, null, $context)); $font = Font::load($local_temp_file); if (!$font) { unlink($local_temp_file); return false; } $font->parse(); $font->saveAdobeFontMetrics("$cache_entry.ufm"); unlink($local_temp_file); if ( !file_exists("$cache_entry.ufm") ) { return false; } // Save the changes file_put_contents($local_file, file_get_contents($remote_file, null, $context)); Font_Metrics::set_font_family($fontname, $entry); Font_Metrics::save_font_families(); } return true; } } Font_Metrics::load_font_families(); dompdf-0.6.2/include/frame.cls.php000066400000000000000000000667341263120276100170160ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * The main Frame class * * This class represents a single HTML element. This class stores * positioning information as well as containing block location and * dimensions. Style information for the element is stored in a {@link * Style} object. Tree structure is maintained via the parent & children * links. * * @access protected * @package dompdf */ class Frame { /** * The DOMElement or DOMText object this frame represents * * @var DOMElement|DOMText */ protected $_node; /** * Unique identifier for this frame. Used to reference this frame * via the node. * * @var string */ protected $_id; /** * Unique id counter */ static /*protected*/ $ID_COUNTER = 0; /** * This frame's calculated style * * @var Style */ protected $_style; /** * This frame's original style. Needed for cases where frames are * split across pages. * * @var Style */ protected $_original_style; /** * This frame's parent in the document tree. * * @var Frame */ protected $_parent; /** * This frame's children * * @var Frame[] */ protected $_frame_list; /** * This frame's first child. All children are handled as a * doubly-linked list. * * @var Frame */ protected $_first_child; /** * This frame's last child. * * @var Frame */ protected $_last_child; /** * This frame's previous sibling in the document tree. * * @var Frame */ protected $_prev_sibling; /** * This frame's next sibling in the document tree. * * @var Frame */ protected $_next_sibling; /** * This frame's containing block (used in layout): array(x, y, w, h) * * @var float[] */ protected $_containing_block; /** * Position on the page of the top-left corner of the margin box of * this frame: array(x,y) * * @var float[] */ protected $_position; /** * Absolute opacity of this frame * * @var float */ protected $_opacity; /** * This frame's decorator * * @var Frame_Decorator */ protected $_decorator; /** * This frame's containing line box * * @var Line_Box */ protected $_containing_line; protected $_is_cache = array(); /** * Tells wether the frame was already pushed to the next page * * @var bool */ public $_already_pushed = false; public $_float_next_line = false; /** * Tells wether the frame was split * * @var bool */ public $_splitted; static $_ws_state = self::WS_SPACE; const WS_TEXT = 1; const WS_SPACE = 2; /** * Class destructor */ function __destruct() { clear_object($this); } /** * Class constructor * * @param DOMNode $node the DOMNode this frame represents */ function __construct(DOMNode $node) { $this->_node = $node; $this->_parent = null; $this->_first_child = null; $this->_last_child = null; $this->_prev_sibling = $this->_next_sibling = null; $this->_style = null; $this->_original_style = null; $this->_containing_block = array( "x" => null, "y" => null, "w" => null, "h" => null, ); $this->_containing_block[0] =& $this->_containing_block["x"]; $this->_containing_block[1] =& $this->_containing_block["y"]; $this->_containing_block[2] =& $this->_containing_block["w"]; $this->_containing_block[3] =& $this->_containing_block["h"]; $this->_position = array( "x" => null, "y" => null, ); $this->_position[0] =& $this->_position["x"]; $this->_position[1] =& $this->_position["y"]; $this->_opacity = 1.0; $this->_decorator = null; $this->set_id( self::$ID_COUNTER++ ); } // WIP : preprocessing to remove all the unused whitespace protected function ws_trim(){ if ( $this->ws_keep() ) { return; } switch(self::$_ws_state) { case self::WS_SPACE: $node = $this->_node; if ( $node->nodeName === "#text" ) { $node->nodeValue = preg_replace("/[ \t\r\n\f]+/u", " ", $node->nodeValue); // starts with a whitespace if ( isset($node->nodeValue[0]) && $node->nodeValue[0] === " " ) { $node->nodeValue = ltrim($node->nodeValue); } // if not empty if ( $node->nodeValue !== "" ) { // change the current state (text) self::$_ws_state = self::WS_TEXT; // ends with a whitespace if ( preg_match("/[ \t\r\n\f]+$/u", $node->nodeValue) ) { $node->nodeValue = ltrim($node->nodeValue); } } } break; case self::WS_TEXT: } } protected function ws_keep(){ $whitespace = $this->get_style()->white_space; return in_array($whitespace, array("pre", "pre-wrap", "pre-line")); } protected function ws_is_text(){ $node = $this->get_node(); if ($node->nodeName === "img") { return true; } if ( !$this->is_in_flow() ) { return false; } if ($this->is_text_node()) { return trim($node->nodeValue) !== ""; } return true; } /** * "Destructor": forcibly free all references held by this frame * * @param bool $recursive if true, call dispose on all children */ function dispose($recursive = false) { if ( $recursive ) { while ( $child = $this->_first_child ) { $child->dispose(true); } } // Remove this frame from the tree if ( $this->_prev_sibling ) { $this->_prev_sibling->_next_sibling = $this->_next_sibling; } if ( $this->_next_sibling ) { $this->_next_sibling->_prev_sibling = $this->_prev_sibling; } if ( $this->_parent && $this->_parent->_first_child === $this ) { $this->_parent->_first_child = $this->_next_sibling; } if ( $this->_parent && $this->_parent->_last_child === $this ) { $this->_parent->_last_child = $this->_prev_sibling; } if ( $this->_parent ) { $this->_parent->get_node()->removeChild($this->_node); } $this->_style->dispose(); $this->_style = null; unset($this->_style); $this->_original_style->dispose(); $this->_original_style = null; unset($this->_original_style); } // Re-initialize the frame function reset() { $this->_position["x"] = null; $this->_position["y"] = null; $this->_containing_block["x"] = null; $this->_containing_block["y"] = null; $this->_containing_block["w"] = null; $this->_containing_block["h"] = null; $this->_style = null; unset($this->_style); $this->_style = clone $this->_original_style; } //........................................................................ /** * @return DOMElement|DOMText */ function get_node() { return $this->_node; } /** * @return string */ function get_id() { return $this->_id; } /** * @return Style */ function get_style() { return $this->_style; } /** * @return Style */ function get_original_style() { return $this->_original_style; } /** * @return Frame */ function get_parent() { return $this->_parent; } /** * @return Frame_Decorator */ function get_decorator() { return $this->_decorator; } /** * @return Frame */ function get_first_child() { return $this->_first_child; } /** * @return Frame */ function get_last_child() { return $this->_last_child; } /** * @return Frame */ function get_prev_sibling() { return $this->_prev_sibling; } /** * @return Frame */ function get_next_sibling() { return $this->_next_sibling; } /** * @return FrameList|Frame[] */ function get_children() { if ( isset($this->_frame_list) ) { return $this->_frame_list; } $this->_frame_list = new FrameList($this); return $this->_frame_list; } // Layout property accessors /** * Containing block dimensions * * @param $i string The key of the wanted containing block's dimension (x, y, x, h) * * @return float[]|float */ function get_containing_block($i = null) { if ( isset($i) ) { return $this->_containing_block[$i]; } return $this->_containing_block; } /** * Block position * * @param $i string The key of the wanted position value (x, y) * * @return array|float */ function get_position($i = null) { if ( isset($i) ) { return $this->_position[$i]; } return $this->_position; } //........................................................................ /** * Return the height of the margin box of the frame, in pt. Meaningless * unless the height has been calculated properly. * * @return float */ function get_margin_height() { $style = $this->_style; return $style->length_in_pt(array( $style->height, $style->margin_top, $style->margin_bottom, $style->border_top_width, $style->border_bottom_width, $style->padding_top, $style->padding_bottom ), $this->_containing_block["h"]); } /** * Return the width of the margin box of the frame, in pt. Meaningless * unless the width has been calculated properly. * * @return float */ function get_margin_width() { $style = $this->_style; return $style->length_in_pt(array( $style->width, $style->margin_left, $style->margin_right, $style->border_left_width, $style->border_right_width, $style->padding_left, $style->padding_right ), $this->_containing_block["w"]); } function get_break_margins(){ $style = $this->_style; return $style->length_in_pt(array( //$style->height, $style->margin_top, $style->margin_bottom, $style->border_top_width, $style->border_bottom_width, $style->padding_top, $style->padding_bottom ), $this->_containing_block["h"]); } /** * Return the padding box (x,y,w,h) of the frame * * @return array */ function get_padding_box() { $style = $this->_style; $cb = $this->_containing_block; $x = $this->_position["x"] + $style->length_in_pt(array($style->margin_left, $style->border_left_width), $cb["w"]); $y = $this->_position["y"] + $style->length_in_pt(array($style->margin_top, $style->border_top_width), $cb["h"]); $w = $style->length_in_pt(array($style->padding_left, $style->width, $style->padding_right), $cb["w"]); $h = $style->length_in_pt(array($style->padding_top, $style->height, $style->padding_bottom), $cb["h"]); return array(0 => $x, "x" => $x, 1 => $y, "y" => $y, 2 => $w, "w" => $w, 3 => $h, "h" => $h); } /** * Return the border box of the frame * * @return array */ function get_border_box() { $style = $this->_style; $cb = $this->_containing_block; $x = $this->_position["x"] + $style->length_in_pt($style->margin_left, $cb["w"]); $y = $this->_position["y"] + $style->length_in_pt($style->margin_top, $cb["h"]); $w = $style->length_in_pt(array($style->border_left_width, $style->padding_left, $style->width, $style->padding_right, $style->border_right_width), $cb["w"]); $h = $style->length_in_pt(array($style->border_top_width, $style->padding_top, $style->height, $style->padding_bottom, $style->border_bottom_width), $cb["h"]); return array(0 => $x, "x" => $x, 1 => $y, "y" => $y, 2 => $w, "w" => $w, 3 => $h, "h" => $h); } function get_opacity($opacity = null) { if ( $opacity !== null ) { $this->set_opacity($opacity); } return $this->_opacity; } /** * @return Line_Box */ function &get_containing_line() { return $this->_containing_line; } //........................................................................ // Set methods function set_id($id) { $this->_id = $id; // We can only set attributes of DOMElement objects (nodeType == 1). // Since these are the only objects that we can assign CSS rules to, // this shortcoming is okay. if ( $this->_node->nodeType == XML_ELEMENT_NODE ) { $this->_node->setAttribute("frame_id", $id); } } function set_style(Style $style) { if ( is_null($this->_style) ) { $this->_original_style = clone $style; } //$style->set_frame($this); $this->_style = $style; } function set_decorator(Frame_Decorator $decorator) { $this->_decorator = $decorator; } function set_containing_block($x = null, $y = null, $w = null, $h = null) { if ( is_array($x) ){ foreach($x as $key => $val){ $$key = $val; } } if (is_numeric($x)) { $this->_containing_block["x"] = $x; } if (is_numeric($y)) { $this->_containing_block["y"] = $y; } if (is_numeric($w)) { $this->_containing_block["w"] = $w; } if (is_numeric($h)) { $this->_containing_block["h"] = $h; } } function set_position($x = null, $y = null) { if ( is_array($x) ) { list($x, $y) = array($x["x"], $x["y"]); } if ( is_numeric($x) ) { $this->_position["x"] = $x; } if ( is_numeric($y) ) { $this->_position["y"] = $y; } } function set_opacity($opacity) { $parent = $this->get_parent(); $base_opacity = (($parent && $parent->_opacity !== null) ? $parent->_opacity : 1.0); $this->_opacity = $base_opacity * $opacity; } function set_containing_line(Line_Box $line) { $this->_containing_line = $line; } //........................................................................ /** * Tells if the frame is a text node * @return bool */ function is_text_node() { if ( isset($this->_is_cache["text_node"]) ) { return $this->_is_cache["text_node"]; } return $this->_is_cache["text_node"] = ($this->get_node()->nodeName === "#text"); } function is_positionned() { if ( isset($this->_is_cache["positionned"]) ) { return $this->_is_cache["positionned"]; } $position = $this->get_style()->position; return $this->_is_cache["positionned"] = in_array($position, Style::$POSITIONNED_TYPES); } function is_absolute() { if ( isset($this->_is_cache["absolute"]) ) { return $this->_is_cache["absolute"]; } $position = $this->get_style()->position; return $this->_is_cache["absolute"] = ($position === "absolute" || $position === "fixed"); } function is_block() { if ( isset($this->_is_cache["block"]) ) { return $this->_is_cache["block"]; } return $this->_is_cache["block"] = in_array($this->get_style()->display, Style::$BLOCK_TYPES); } function is_in_flow() { if ( isset($this->_is_cache["in_flow"]) ) { return $this->_is_cache["in_flow"]; } $enable_css_float = $this->get_style()->get_stylesheet()->get_dompdf()->get_option("enable_css_float"); return $this->_is_cache["in_flow"] = !($enable_css_float && $this->get_style()->float !== "none" || $this->is_absolute()); } function is_pre(){ if ( isset($this->_is_cache["pre"]) ) { return $this->_is_cache["pre"]; } $white_space = $this->get_style()->white_space; return $this->_is_cache["pre"] = in_array($white_space, array("pre", "pre-wrap")); } function is_table(){ if ( isset($this->_is_cache["table"]) ) { return $this->_is_cache["table"]; } $display = $this->get_style()->display; return $this->_is_cache["table"] = in_array($display, Style::$TABLE_TYPES); } /** * Inserts a new child at the beginning of the Frame * * @param $child Frame The new Frame to insert * @param $update_node boolean Whether or not to update the DOM */ function prepend_child(Frame $child, $update_node = true) { if ( $update_node ) { $this->_node->insertBefore($child->_node, $this->_first_child ? $this->_first_child->_node : null); } // Remove the child from its parent if ( $child->_parent ) { $child->_parent->remove_child($child, false); } $child->_parent = $this; $child->_prev_sibling = null; // Handle the first child if ( !$this->_first_child ) { $this->_first_child = $child; $this->_last_child = $child; $child->_next_sibling = null; } else { $this->_first_child->_prev_sibling = $child; $child->_next_sibling = $this->_first_child; $this->_first_child = $child; } } /** * Inserts a new child at the end of the Frame * * @param $child Frame The new Frame to insert * @param $update_node boolean Whether or not to update the DOM */ function append_child(Frame $child, $update_node = true) { if ( $update_node ) { $this->_node->appendChild($child->_node); } // Remove the child from its parent if ( $child->_parent ) { $child->_parent->remove_child($child, false); } $child->_parent = $this; $child->_next_sibling = null; // Handle the first child if ( !$this->_last_child ) { $this->_first_child = $child; $this->_last_child = $child; $child->_prev_sibling = null; } else { $this->_last_child->_next_sibling = $child; $child->_prev_sibling = $this->_last_child; $this->_last_child = $child; } } /** * Inserts a new child immediately before the specified frame * * @param $new_child Frame The new Frame to insert * @param $ref Frame The Frame after the new Frame * @param $update_node boolean Whether or not to update the DOM * * @throws DOMPDF_Exception */ function insert_child_before(Frame $new_child, Frame $ref, $update_node = true) { if ( $ref === $this->_first_child ) { $this->prepend_child($new_child, $update_node); return; } if ( is_null($ref) ) { $this->append_child($new_child, $update_node); return; } if ( $ref->_parent !== $this ) { throw new DOMPDF_Exception("Reference child is not a child of this node."); } // Update the node if ( $update_node ) { $this->_node->insertBefore($new_child->_node, $ref->_node); } // Remove the child from its parent if ( $new_child->_parent ) { $new_child->_parent->remove_child($new_child, false); } $new_child->_parent = $this; $new_child->_next_sibling = $ref; $new_child->_prev_sibling = $ref->_prev_sibling; if ( $ref->_prev_sibling ) { $ref->_prev_sibling->_next_sibling = $new_child; } $ref->_prev_sibling = $new_child; } /** * Inserts a new child immediately after the specified frame * * @param $new_child Frame The new Frame to insert * @param $ref Frame The Frame before the new Frame * @param $update_node boolean Whether or not to update the DOM * * @throws DOMPDF_Exception */ function insert_child_after(Frame $new_child, Frame $ref, $update_node = true) { if ( $ref === $this->_last_child ) { $this->append_child($new_child, $update_node); return; } if ( is_null($ref) ) { $this->prepend_child($new_child, $update_node); return; } if ( $ref->_parent !== $this ) { throw new DOMPDF_Exception("Reference child is not a child of this node."); } // Update the node if ( $update_node ) { if ( $ref->_next_sibling ) { $next_node = $ref->_next_sibling->_node; $this->_node->insertBefore($new_child->_node, $next_node); } else { $new_child->_node = $this->_node->appendChild($new_child->_node); } } // Remove the child from its parent if ( $new_child->_parent ) { $new_child->_parent->remove_child($new_child, false); } $new_child->_parent = $this; $new_child->_prev_sibling = $ref; $new_child->_next_sibling = $ref->_next_sibling; if ( $ref->_next_sibling ) { $ref->_next_sibling->_prev_sibling = $new_child; } $ref->_next_sibling = $new_child; } /** * Remove a child frame * * @param Frame $child * @param boolean $update_node Whether or not to remove the DOM node * * @throws DOMPDF_Exception * @return Frame The removed child frame */ function remove_child(Frame $child, $update_node = true) { if ( $child->_parent !== $this ) { throw new DOMPDF_Exception("Child not found in this frame"); } if ( $update_node ) { $this->_node->removeChild($child->_node); } if ( $child === $this->_first_child ) { $this->_first_child = $child->_next_sibling; } if ( $child === $this->_last_child ) { $this->_last_child = $child->_prev_sibling; } if ( $child->_prev_sibling ) { $child->_prev_sibling->_next_sibling = $child->_next_sibling; } if ( $child->_next_sibling ) { $child->_next_sibling->_prev_sibling = $child->_prev_sibling; } $child->_next_sibling = null; $child->_prev_sibling = null; $child->_parent = null; return $child; } //........................................................................ // Debugging function: function __toString() { // Skip empty text frames // if ( $this->is_text_node() && // preg_replace("/\s/", "", $this->_node->data) === "" ) // return ""; $str = "" . $this->_node->nodeName . ":
"; //$str .= spl_object_hash($this->_node) . "
"; $str .= "Id: " .$this->get_id() . "
"; $str .= "Class: " .get_class($this) . "
"; if ( $this->is_text_node() ) { $tmp = htmlspecialchars($this->_node->nodeValue); $str .= "
'" .  mb_substr($tmp,0,70) .
        (mb_strlen($tmp) > 70 ? "..." : "") . "'
"; } elseif ( $css_class = $this->_node->getAttribute("class") ) { $str .= "CSS class: '$css_class'
"; } if ( $this->_parent ) { $str .= "\nParent:" . $this->_parent->_node->nodeName . " (" . spl_object_hash($this->_parent->_node) . ") " . "
"; } if ( $this->_prev_sibling ) { $str .= "Prev: " . $this->_prev_sibling->_node->nodeName . " (" . spl_object_hash($this->_prev_sibling->_node) . ") " . "
"; } if ( $this->_next_sibling ) { $str .= "Next: " . $this->_next_sibling->_node->nodeName . " (" . spl_object_hash($this->_next_sibling->_node) . ") " . "
"; } $d = $this->get_decorator(); while ($d && $d != $d->get_decorator()) { $str .= "Decorator: " . get_class($d) . "
"; $d = $d->get_decorator(); } $str .= "Position: " . pre_r($this->_position, true); $str .= "\nContaining block: " . pre_r($this->_containing_block, true); $str .= "\nMargin width: " . pre_r($this->get_margin_width(), true); $str .= "\nMargin height: " . pre_r($this->get_margin_height(), true); $str .= "\nStyle:
". $this->_style->__toString() . "
"; if ( $this->_decorator instanceof Block_Frame_Decorator ) { $str .= "Lines:
";
      foreach ($this->_decorator->get_line_boxes() as $line) {
        foreach ($line->get_frames() as $frame) {
          if ($frame instanceof Text_Frame_Decorator) {
            $str .= "\ntext: ";
            $str .= "'". htmlspecialchars($frame->get_text()) ."'";
          }
          else {
            $str .= "\nBlock: " . $frame->get_node()->nodeName . " (" . spl_object_hash($frame->get_node()) . ")";
          }
        }

        $str .=
          "\ny => " . $line->y . "\n" .
          "w => " . $line->w . "\n" .
          "h => " . $line->h . "\n" .
          "left => " . $line->left . "\n" .
          "right => " . $line->right . "\n";
      }
      $str .= "
"; } $str .= "\n"; if ( php_sapi_name() === "cli" ) { $str = strip_tags(str_replace(array("
","",""), array("\n","",""), $str)); } return $str; } } //------------------------------------------------------------------------ /** * Linked-list IteratorAggregate * * @access private * @package dompdf */ class FrameList implements IteratorAggregate { protected $_frame; function __construct($frame) { $this->_frame = $frame; } function getIterator() { return new FrameListIterator($this->_frame); } } /** * Linked-list Iterator * * Returns children in order and allows for list to change during iteration, * provided the changes occur to or after the current element * * @access private * @package dompdf */ class FrameListIterator implements Iterator { /** * @var Frame */ protected $_parent; /** * @var Frame */ protected $_cur; /** * @var int */ protected $_num; function __construct(Frame $frame) { $this->_parent = $frame; $this->_cur = $frame->get_first_child(); $this->_num = 0; } function rewind() { $this->_cur = $this->_parent->get_first_child(); $this->_num = 0; } /** * @return bool */ function valid() { return isset($this->_cur);// && ($this->_cur->get_prev_sibling() === $this->_prev); } function key() { return $this->_num; } /** * @return Frame */ function current() { return $this->_cur; } /** * @return Frame */ function next() { $ret = $this->_cur; if ( !$ret ) { return null; } $this->_cur = $this->_cur->get_next_sibling(); $this->_num++; return $ret; } } //------------------------------------------------------------------------ /** * Pre-order IteratorAggregate * * @access private * @package dompdf */ class FrameTreeList implements IteratorAggregate { /** * @var Frame */ protected $_root; function __construct(Frame $root) { $this->_root = $root; } /** * @return FrameTreeIterator */ function getIterator() { return new FrameTreeIterator($this->_root); } } /** * Pre-order Iterator * * Returns frames in preorder traversal order (parent then children) * * @access private * @package dompdf */ class FrameTreeIterator implements Iterator { /** * @var Frame */ protected $_root; protected $_stack = array(); /** * @var int */ protected $_num; function __construct(Frame $root) { $this->_stack[] = $this->_root = $root; $this->_num = 0; } function rewind() { $this->_stack = array($this->_root); $this->_num = 0; } /** * @return bool */ function valid() { return count($this->_stack) > 0; } /** * @return int */ function key() { return $this->_num; } /** * @return Frame */ function current() { return end($this->_stack); } /** * @return Frame */ function next() { $b = end($this->_stack); // Pop last element unset($this->_stack[ key($this->_stack) ]); $this->_num++; // Push all children onto the stack in reverse order if ( $c = $b->get_last_child() ) { $this->_stack[] = $c; while ( $c = $c->get_prev_sibling() ) { $this->_stack[] = $c; } } return $b; } } dompdf-0.6.2/include/frame_decorator.cls.php000066400000000000000000000376771263120276100210640ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Base Frame_Decorator class * * @access private * @package dompdf */ abstract class Frame_Decorator extends Frame { const DEFAULT_COUNTER = "-dompdf-default-counter"; public $_counters = array(); // array([id] => counter_value) (for generated content) /** * The root node of the DOM tree * * @var Frame */ protected $_root; /** * The decorated frame * * @var Frame */ protected $_frame; /** * Positioner object used to position this frame (Strategy pattern) * * @var Positioner */ protected $_positioner; /** * Reflower object used to calculate frame dimensions (Strategy pattern) * * @var Frame_Reflower */ protected $_reflower; /** * Reference to the current dompdf instance * * @var DOMPDF */ protected $_dompdf; /** * First block parent * * @var Block_Frame_Decorator */ private $_block_parent; /** * First positionned parent (position: relative | absolute | fixed) * * @var Frame_Decorator */ private $_positionned_parent; /** * Class constructor * * @param Frame $frame The decoration target * @param DOMPDF $dompdf The DOMPDF object */ function __construct(Frame $frame, DOMPDF $dompdf) { $this->_frame = $frame; $this->_root = null; $this->_dompdf = $dompdf; $frame->set_decorator($this); } /** * "Destructor": foribly free all references held by this object * * @param bool $recursive if true, call dispose on all children */ function dispose($recursive = false) { if ( $recursive ) { while ( $child = $this->get_first_child() ) { $child->dispose(true); } } $this->_root = null; unset($this->_root); $this->_frame->dispose(true); $this->_frame = null; unset($this->_frame); $this->_positioner = null; unset($this->_positioner); $this->_reflower = null; unset($this->_reflower); } /** * Return a copy of this frame with $node as its node * * @param DOMNode $node * * @return Frame */ function copy(DOMNode $node) { $frame = new Frame($node); $frame->set_style(clone $this->_frame->get_original_style()); return Frame_Factory::decorate_frame($frame, $this->_dompdf, $this->_root); } /** * Create a deep copy: copy this node and all children * * @return Frame */ function deep_copy() { $frame = new Frame($this->get_node()->cloneNode()); $frame->set_style(clone $this->_frame->get_original_style()); $deco = Frame_Factory::decorate_frame($frame, $this->_dompdf, $this->_root); foreach ($this->get_children() as $child) { $deco->append_child($child->deep_copy()); } return $deco; } /** * Delegate calls to decorated frame object */ function reset() { $this->_frame->reset(); $this->_counters = array(); // Reset all children foreach ($this->get_children() as $child) { $child->reset(); } } // Getters ----------- function get_id() { return $this->_frame->get_id(); } /** * @return Frame */ function get_frame() { return $this->_frame; } /** * @return DOMElement|DOMText */ function get_node() { return $this->_frame->get_node(); } /** * @return Style */ function get_style() { return $this->_frame->get_style(); } /** * @return Style */ function get_original_style() { return $this->_frame->get_original_style(); } /** * @param integer $i * * @return array|float */ function get_containing_block($i = null) { return $this->_frame->get_containing_block($i); } /** * @param integer $i * * @return array|float */ function get_position($i = null) { return $this->_frame->get_position($i); } /** * @return DOMPDF */ function get_dompdf() { return $this->_dompdf; } /** * @return float */ function get_margin_height() { return $this->_frame->get_margin_height(); } /** * @return float */ function get_margin_width() { return $this->_frame->get_margin_width(); } /** * @return array */ function get_padding_box() { return $this->_frame->get_padding_box(); } /** * @return array */ function get_border_box() { return $this->_frame->get_border_box(); } /** * @param integer $id */ function set_id($id) { $this->_frame->set_id($id); } /** * @param Style $style */ function set_style(Style $style) { $this->_frame->set_style($style); } /** * @param float $x * @param float $y * @param float $w * @param float $h */ function set_containing_block($x = null, $y = null, $w = null, $h = null) { $this->_frame->set_containing_block($x, $y, $w, $h); } /** * @param float $x * @param float $y */ function set_position($x = null, $y = null) { $this->_frame->set_position($x, $y); } /** * @return string */ function __toString() { return $this->_frame->__toString(); } /** * @param Frame $child * @param bool $update_node */ function prepend_child(Frame $child, $update_node = true) { while ( $child instanceof Frame_Decorator ) { $child = $child->_frame; } $this->_frame->prepend_child($child, $update_node); } /** * @param Frame $child * @param bool $update_node */ function append_child(Frame $child, $update_node = true) { while ( $child instanceof Frame_Decorator ) { $child = $child->_frame; } $this->_frame->append_child($child, $update_node); } /** * @param Frame $new_child * @param Frame $ref * @param bool $update_node */ function insert_child_before(Frame $new_child, Frame $ref, $update_node = true) { while ( $new_child instanceof Frame_Decorator ) { $new_child = $new_child->_frame; } if ( $ref instanceof Frame_Decorator ) { $ref = $ref->_frame; } $this->_frame->insert_child_before($new_child, $ref, $update_node); } /** * @param Frame $new_child * @param Frame $ref * @param bool $update_node */ function insert_child_after(Frame $new_child, Frame $ref, $update_node = true) { while ( $new_child instanceof Frame_Decorator ) { $new_child = $new_child->_frame; } while ( $ref instanceof Frame_Decorator ) { $ref = $ref->_frame; } $this->_frame->insert_child_after($new_child, $ref, $update_node); } /** * @param Frame $child * @param bool $update_node * * @return Frame */ function remove_child(Frame $child, $update_node = true) { while ( $child instanceof Frame_Decorator ) { $child = $child->_frame; } return $this->_frame->remove_child($child, $update_node); } /** * @return Frame_Decorator */ function get_parent() { $p = $this->_frame->get_parent(); if ( $p && $deco = $p->get_decorator() ) { while ( $tmp = $deco->get_decorator() ) { $deco = $tmp; } return $deco; } else if ( $p ) { return $p; } return null; } /** * @return Frame_Decorator */ function get_first_child() { $c = $this->_frame->get_first_child(); if ( $c && $deco = $c->get_decorator() ) { while ( $tmp = $deco->get_decorator() ) { $deco = $tmp; } return $deco; } else if ( $c ) { return $c; } return null; } /** * @return Frame_Decorator */ function get_last_child() { $c = $this->_frame->get_last_child(); if ( $c && $deco = $c->get_decorator() ) { while ( $tmp = $deco->get_decorator() ) { $deco = $tmp; } return $deco; } else if ( $c ) { return $c; } return null; } /** * @return Frame_Decorator */ function get_prev_sibling() { $s = $this->_frame->get_prev_sibling(); if ( $s && $deco = $s->get_decorator() ) { while ( $tmp = $deco->get_decorator() ) { $deco = $tmp; } return $deco; } else if ( $s ) { return $s; } return null; } /** * @return Frame_Decorator */ function get_next_sibling() { $s = $this->_frame->get_next_sibling(); if ( $s && $deco = $s->get_decorator() ) { while ( $tmp = $deco->get_decorator() ) { $deco = $tmp; } return $deco; } else if ( $s ) { return $s; } return null; } /** * @return FrameTreeList */ function get_subtree() { return new FrameTreeList($this); } function set_positioner(Positioner $posn) { $this->_positioner = $posn; if ( $this->_frame instanceof Frame_Decorator ) { $this->_frame->set_positioner($posn); } } function set_reflower(Frame_Reflower $reflower) { $this->_reflower = $reflower; if ( $this->_frame instanceof Frame_Decorator ) { $this->_frame->set_reflower( $reflower ); } } /** * @return Frame_Reflower */ function get_reflower() { return $this->_reflower; } /** * @param Frame $root */ function set_root(Frame $root) { $this->_root = $root; if ( $this->_frame instanceof Frame_Decorator ) { $this->_frame->set_root($root); } } /** * @return Page_Frame_Decorator */ function get_root() { return $this->_root; } /** * @return Block_Frame_Decorator */ function find_block_parent() { // Find our nearest block level parent $p = $this->get_parent(); while ( $p ) { if ( $p->is_block() ) { break; } $p = $p->get_parent(); } return $this->_block_parent = $p; } /** * @return Frame_Decorator */ function find_positionned_parent() { // Find our nearest relative positionned parent $p = $this->get_parent(); while ( $p ) { if ( $p->is_positionned() ) { break; } $p = $p->get_parent(); } if ( !$p ) { $p = $this->_root->get_first_child(); // } return $this->_positionned_parent = $p; } /** * split this frame at $child. * The current frame is cloned and $child and all children following * $child are added to the clone. The clone is then passed to the * current frame's parent->split() method. * * @param Frame $child * @param boolean $force_pagebreak * * @throws DOMPDF_Exception * @return void */ function split(Frame $child = null, $force_pagebreak = false) { // decrement any counters that were incremented on the current node, unless that node is the body $style = $this->_frame->get_style(); if ( $this->_frame->get_node()->nodeName !== "body" && $style->counter_increment && ($decrement = $style->counter_increment) !== "none" ) { $this->decrement_counters($decrement); } if ( is_null( $child ) ) { // check for counter increment on :before content (always a child of the selected element @link Frame_Reflower::_set_content) // this can push the current node to the next page before counter rules have bubbled up (but only if // it's been rendered, thus the position check) if ( !$this->is_text_node() && $this->get_node()->hasAttribute("dompdf_before_frame_id") ) { foreach($this->_frame->get_children() as $child) { if ( $this->get_node()->getAttribute("dompdf_before_frame_id") == $child->get_id() && $child->get_position('x') !== NULL ) { $style = $child->get_style(); if ( $style->counter_increment && ($decrement = $style->counter_increment) !== "none" ) { $this->decrement_counters($decrement); } } } } $this->get_parent()->split($this, $force_pagebreak); return; } if ( $child->get_parent() !== $this ) { throw new DOMPDF_Exception("Unable to split: frame is not a child of this one."); } $node = $this->_frame->get_node(); $split = $this->copy( $node->cloneNode() ); $split->reset(); $split->get_original_style()->text_indent = 0; $split->_splitted = true; // The body's properties must be kept if ( $node->nodeName !== "body" ) { // Style reset on the first and second parts $style = $this->_frame->get_style(); $style->margin_bottom = 0; $style->padding_bottom = 0; $style->border_bottom = 0; // second $orig_style = $split->get_original_style(); $orig_style->text_indent = 0; $orig_style->margin_top = 0; $orig_style->padding_top = 0; $orig_style->border_top = 0; } $this->get_parent()->insert_child_after($split, $this); // Add $frame and all following siblings to the new split node $iter = $child; while ($iter) { $frame = $iter; $iter = $iter->get_next_sibling(); $frame->reset(); $split->append_child($frame); } $this->get_parent()->split($split, $force_pagebreak); // If this node resets a counter save the current value to use when rendering on the next page if ( $style->counter_reset && ( $reset = $style->counter_reset ) !== "none" ) { $vars = preg_split( '/\s+/' , trim( $reset ) , 2 ); $split->_counters[ '__' . $vars[0] ] = $this->lookup_counter_frame( $vars[0] )->_counters[$vars[0]]; } } function reset_counter($id = self::DEFAULT_COUNTER, $value = 0) { $this->get_parent()->_counters[$id] = intval($value); } function decrement_counters($counters) { foreach($counters as $id => $increment) { $this->increment_counter($id, intval($increment) * -1); } } function increment_counters($counters) { foreach($counters as $id => $increment) { $this->increment_counter($id, intval($increment)); } } function increment_counter($id = self::DEFAULT_COUNTER, $increment = 1) { $counter_frame = $this->lookup_counter_frame($id); if ( $counter_frame ) { if ( !isset($counter_frame->_counters[$id]) ) { $counter_frame->_counters[$id] = 0; } $counter_frame->_counters[$id] += $increment; } } function lookup_counter_frame($id = self::DEFAULT_COUNTER) { $f = $this->get_parent(); while( $f ) { if( isset($f->_counters[$id]) ) { return $f; } $fp = $f->get_parent(); if ( !$fp ) { return $f; } $f = $fp; } } // TODO: What version is the best : this one or the one in List_Bullet_Renderer ? function counter_value($id = self::DEFAULT_COUNTER, $type = "decimal") { $type = mb_strtolower($type); if ( !isset($this->_counters[$id]) ) { $this->_counters[$id] = 0; } $value = $this->_counters[$id]; switch ($type) { default: case "decimal": return $value; case "decimal-leading-zero": return str_pad($value, 2, "0"); case "lower-roman": return dec2roman($value); case "upper-roman": return mb_strtoupper(dec2roman($value)); case "lower-latin": case "lower-alpha": return chr( ($value % 26) + ord('a') - 1); case "upper-latin": case "upper-alpha": return chr( ($value % 26) + ord('A') - 1); case "lower-greek": return unichr($value + 944); case "upper-greek": return unichr($value + 912); } } final function position() { $this->_positioner->position(); } final function move($offset_x, $offset_y, $ignore_self = false) { $this->_positioner->move($offset_x, $offset_y, $ignore_self); } final function reflow(Block_Frame_Decorator $block = null) { // Uncomment this to see the frames before they're laid out, instead of // during rendering. //echo $this->_frame; flush(); $this->_reflower->reflow($block); } final function get_min_max_width() { return $this->_reflower->get_min_max_width(); } } dompdf-0.6.2/include/frame_factory.cls.php000066400000000000000000000151401263120276100205260ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Contains frame decorating logic * * This class is responsible for assigning the correct {@link Frame_Decorator}, * {@link Positioner}, and {@link Frame_Reflower} objects to {@link Frame} * objects. This is determined primarily by the Frame's display type, but * also by the Frame's node's type (e.g. DomElement vs. #text) * * @access private * @package dompdf */ class Frame_Factory { /** * Decorate the root Frame * * @param $root Frame The frame to decorate * @param $dompdf DOMPDF The dompdf instance * @return Page_Frame_Decorator */ static function decorate_root(Frame $root, DOMPDF $dompdf) { $frame = new Page_Frame_Decorator($root, $dompdf); $frame->set_reflower( new Page_Frame_Reflower($frame) ); $root->set_decorator($frame); return $frame; } /** * Decorate a Frame * * @param Frame $frame The frame to decorate * @param DOMPDF $dompdf The dompdf instance * @param Frame $root The frame to decorate * * @throws DOMPDF_Exception * @return Frame_Decorator * FIXME: this is admittedly a little smelly... */ static function decorate_frame(Frame $frame, DOMPDF $dompdf, Frame $root = null) { if ( is_null($dompdf) ) { throw new DOMPDF_Exception("The DOMPDF argument is required"); } $style = $frame->get_style(); // Floating (and more generally out-of-flow) elements are blocks // http://coding.smashingmagazine.com/2007/05/01/css-float-theory-things-you-should-know/ if ( !$frame->is_in_flow() && in_array($style->display, Style::$INLINE_TYPES)) { $style->display = "block"; } $display = $style->display; switch ($display) { case "block": $positioner = "Block"; $decorator = "Block"; $reflower = "Block"; break; case "inline-block": $positioner = "Inline"; $decorator = "Block"; $reflower = "Block"; break; case "inline": $positioner = "Inline"; if ( $frame->is_text_node() ) { $decorator = "Text"; $reflower = "Text"; } else { $enable_css_float = $dompdf->get_option("enable_css_float"); if ( $enable_css_float && $style->float !== "none" ) { $decorator = "Block"; $reflower = "Block"; } else { $decorator = "Inline"; $reflower = "Inline"; } } break; case "table": $positioner = "Block"; $decorator = "Table"; $reflower = "Table"; break; case "inline-table": $positioner = "Inline"; $decorator = "Table"; $reflower = "Table"; break; case "table-row-group": case "table-header-group": case "table-footer-group": $positioner = "Null"; $decorator = "Table_Row_Group"; $reflower = "Table_Row_Group"; break; case "table-row": $positioner = "Null"; $decorator = "Table_Row"; $reflower = "Table_Row"; break; case "table-cell": $positioner = "Table_Cell"; $decorator = "Table_Cell"; $reflower = "Table_Cell"; break; case "list-item": $positioner = "Block"; $decorator = "Block"; $reflower = "Block"; break; case "-dompdf-list-bullet": if ( $style->list_style_position === "inside" ) { $positioner = "Inline"; } else { $positioner = "List_Bullet"; } if ( $style->list_style_image !== "none" ) { $decorator = "List_Bullet_Image"; } else { $decorator = "List_Bullet"; } $reflower = "List_Bullet"; break; case "-dompdf-image": $positioner = "Inline"; $decorator = "Image"; $reflower = "Image"; break; case "-dompdf-br": $positioner = "Inline"; $decorator = "Inline"; $reflower = "Inline"; break; default: // FIXME: should throw some sort of warning or something? case "none": if ( $style->_dompdf_keep !== "yes" ) { // Remove the node and the frame $frame->get_parent()->remove_child($frame); return; } $positioner = "Null"; $decorator = "Null"; $reflower = "Null"; break; } // Handle CSS position $position = $style->position; if ( $position === "absolute" ) { $positioner = "Absolute"; } else if ( $position === "fixed" ) { $positioner = "Fixed"; } $node = $frame->get_node(); // Handle nodeName if ( $node->nodeName === "img" ) { $style->display = "-dompdf-image"; $decorator = "Image"; $reflower = "Image"; } $positioner .= "_Positioner"; $decorator .= "_Frame_Decorator"; $reflower .= "_Frame_Reflower"; $deco = new $decorator($frame, $dompdf); $deco->set_positioner( new $positioner($deco) ); $deco->set_reflower( new $reflower($deco) ); if ( $root ) { $deco->set_root($root); } if ( $display === "list-item" ) { // Insert a list-bullet frame $xml = $dompdf->get_dom(); $bullet_node = $xml->createElement("bullet"); // arbitrary choice $b_f = new Frame($bullet_node); $node = $frame->get_node(); $parent_node = $node->parentNode; if ( $parent_node ) { if ( !$parent_node->hasAttribute("dompdf-children-count") ) { $xpath = new DOMXPath($xml); $count = $xpath->query("li", $parent_node)->length; $parent_node->setAttribute("dompdf-children-count", $count); } if ( is_numeric($node->getAttribute("value")) ) { $index = intval($node->getAttribute("value")); } else { if ( !$parent_node->hasAttribute("dompdf-counter") ) { $index = ($parent_node->hasAttribute("start") ? $parent_node->getAttribute("start") : 1); } else { $index = $parent_node->getAttribute("dompdf-counter")+1; } } $parent_node->setAttribute("dompdf-counter", $index); $bullet_node->setAttribute("dompdf-counter", $index); } $new_style = $dompdf->get_css()->create_style(); $new_style->display = "-dompdf-list-bullet"; $new_style->inherit($style); $b_f->set_style($new_style); $deco->prepend_child( Frame_Factory::decorate_frame($b_f, $dompdf, $root) ); } return $deco; } } dompdf-0.6.2/include/frame_reflower.cls.php000066400000000000000000000312461263120276100207110ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Base reflower class * * Reflower objects are responsible for determining the width and height of * individual frames. They also create line and page breaks as necessary. * * @access private * @package dompdf */ abstract class Frame_Reflower { /** * Frame for this reflower * * @var Frame */ protected $_frame; /** * Cached min/max size * * @var array */ protected $_min_max_cache; function __construct(Frame $frame) { $this->_frame = $frame; $this->_min_max_cache = null; } function dispose() { clear_object($this); } /** * @return DOMPDF */ function get_dompdf() { return $this->_frame->get_dompdf(); } /** * Collapse frames margins * http://www.w3.org/TR/CSS2/box.html#collapsing-margins */ protected function _collapse_margins() { $frame = $this->_frame; $cb = $frame->get_containing_block(); $style = $frame->get_style(); if ( !$frame->is_in_flow() ) { return; } $t = $style->length_in_pt($style->margin_top, $cb["h"]); $b = $style->length_in_pt($style->margin_bottom, $cb["h"]); // Handle 'auto' values if ( $t === "auto" ) { $style->margin_top = "0pt"; $t = 0; } if ( $b === "auto" ) { $style->margin_bottom = "0pt"; $b = 0; } // Collapse vertical margins: $n = $frame->get_next_sibling(); if ( $n && !$n->is_block() ) { while ( $n = $n->get_next_sibling() ) { if ( $n->is_block() ) { break; } if ( !$n->get_first_child() ) { $n = null; break; } } } if ( $n ) { $n_style = $n->get_style(); $b = max($b, $n_style->length_in_pt($n_style->margin_top, $cb["h"])); $n_style->margin_top = "0pt"; $style->margin_bottom = $b."pt"; } // Collapse our first child's margin /*$f = $this->_frame->get_first_child(); if ( $f && !$f->is_block() ) { while ( $f = $f->get_next_sibling() ) { if ( $f->is_block() ) { break; } if ( !$f->get_first_child() ) { $f = null; break; } } } // Margin are collapsed only between block elements if ( $f ) { $f_style = $f->get_style(); $t = max($t, $f_style->length_in_pt($f_style->margin_top, $cb["h"])); $style->margin_top = $t."pt"; $f_style->margin_bottom = "0pt"; }*/ } //........................................................................ abstract function reflow(Block_Frame_Decorator $block = null); //........................................................................ // Required for table layout: Returns an array(0 => min, 1 => max, "min" // => min, "max" => max) of the minimum and maximum widths of this frame. // This provides a basic implementation. Child classes should override // this if necessary. function get_min_max_width() { if ( !is_null($this->_min_max_cache) ) { return $this->_min_max_cache; } $style = $this->_frame->get_style(); // Account for margins & padding $dims = array($style->padding_left, $style->padding_right, $style->border_left_width, $style->border_right_width, $style->margin_left, $style->margin_right); $cb_w = $this->_frame->get_containing_block("w"); $delta = $style->length_in_pt($dims, $cb_w); // Handle degenerate case if ( !$this->_frame->get_first_child() ) { return $this->_min_max_cache = array( $delta, $delta, "min" => $delta, "max" => $delta, ); } $low = array(); $high = array(); for ( $iter = $this->_frame->get_children()->getIterator(); $iter->valid(); $iter->next() ) { $inline_min = 0; $inline_max = 0; // Add all adjacent inline widths together to calculate max width while ( $iter->valid() && in_array( $iter->current()->get_style()->display, Style::$INLINE_TYPES ) ) { $child = $iter->current(); $minmax = $child->get_min_max_width(); if ( in_array( $iter->current()->get_style()->white_space, array("pre", "nowrap") ) ) { $inline_min += $minmax["min"]; } else { $low[] = $minmax["min"]; } $inline_max += $minmax["max"]; $iter->next(); } if ( $inline_max > 0 ) $high[] = $inline_max; if ( $inline_min > 0 ) $low[] = $inline_min; if ( $iter->valid() ) { list($low[], $high[]) = $iter->current()->get_min_max_width(); continue; } } $min = count($low) ? max($low) : 0; $max = count($high) ? max($high) : 0; // Use specified width if it is greater than the minimum defined by the // content. If the width is a percentage ignore it for now. $width = $style->width; if ( $width !== "auto" && !is_percent($width) ) { $width = $style->length_in_pt($width, $cb_w); if ( $min < $width ) $min = $width; if ( $max < $width ) $max = $width; } $min += $delta; $max += $delta; return $this->_min_max_cache = array($min, $max, "min"=>$min, "max"=>$max); } /** * Parses a CSS string containing quotes and escaped hex characters * * @param $string string The CSS string to parse * @param $single_trim * @return string */ protected function _parse_string($string, $single_trim = false) { if ( $single_trim ) { $string = preg_replace('/^[\"\']/', "", $string); $string = preg_replace('/[\"\']$/', "", $string); } else { $string = trim($string, "'\""); } $string = str_replace(array("\\\n",'\\"',"\\'"), array("",'"',"'"), $string); // Convert escaped hex characters into ascii characters (e.g. \A => newline) $string = preg_replace_callback("/\\\\([0-9a-fA-F]{0,6})/", create_function('$matches', 'return unichr(hexdec($matches[1]));'), $string); return $string; } /** * Parses a CSS "quotes" property * * @return array|null An array of pairs of quotes */ protected function _parse_quotes() { // Matches quote types $re = '/(\'[^\']*\')|(\"[^\"]*\")/'; $quotes = $this->_frame->get_style()->quotes; // split on spaces, except within quotes if ( !preg_match_all($re, "$quotes", $matches, PREG_SET_ORDER) ) { return null; } $quotes_array = array(); foreach($matches as &$_quote){ $quotes_array[] = $this->_parse_string($_quote[0], true); } if ( empty($quotes_array) ) { $quotes_array = array('"', '"'); } return array_chunk($quotes_array, 2); } /** * Parses the CSS "content" property * * @return string|null The resulting string */ protected function _parse_content() { // Matches generated content $re = "/\n". "\s(counters?\\([^)]*\\))|\n". "\A(counters?\\([^)]*\\))|\n". "\s([\"']) ( (?:[^\"']|\\\\[\"'])+ )(?_frame->get_style()->content; $quotes = $this->_parse_quotes(); // split on spaces, except within quotes if ( !preg_match_all($re, $content, $matches, PREG_SET_ORDER) ) { return null; } $text = ""; foreach ($matches as $match) { if ( isset($match[2]) && $match[2] !== "" ) { $match[1] = $match[2]; } if ( isset($match[6]) && $match[6] !== "" ) { $match[4] = $match[6]; } if ( isset($match[8]) && $match[8] !== "" ) { $match[7] = $match[8]; } if ( isset($match[1]) && $match[1] !== "" ) { // counters?(...) $match[1] = mb_strtolower(trim($match[1])); // Handle counter() references: // http://www.w3.org/TR/CSS21/generate.html#content $i = mb_strpos($match[1], ")"); if ( $i === false ) { continue; } preg_match( '/(counters?)(^\()*?\(\s*([^\s,]+)\s*(,\s*["\']?([^"\'\)]+)["\']?\s*(,\s*([^\s)]+)\s*)?)?\)/i' , $match[1] , $args ); $counter_id = $args[3]; if ( strtolower( $args[1] ) == 'counter' ) { // counter(name [,style]) if ( isset( $args[5] ) ) { $type = trim( $args[5] ); } else { $type = null; } $p = $this->_frame->lookup_counter_frame( $counter_id ); $text .= $p->counter_value($counter_id, $type); } else if ( strtolower( $args[1] ) == 'counters' ) { // counters(name, string [,style]) if ( isset($args[5]) ) { $string = $this->_parse_string( $args[5] ); } else { $string = ""; } if ( isset( $args[7] ) ) { $type = trim( $args[7] ); } else { $type = null; } $p = $this->_frame->lookup_counter_frame($counter_id); $tmp = array(); while ($p) { // We only want to use the counter values when they actually increment the counter if ( array_key_exists( $counter_id , $p->_counters ) ) { array_unshift( $tmp , $p->counter_value($counter_id, $type) ); } $p = $p->lookup_counter_frame($counter_id); } $text .= implode( $string , $tmp ); } else { // countertops? continue; } } else if ( isset($match[4]) && $match[4] !== "" ) { // String match $text .= $this->_parse_string($match[4]); } else if ( isset($match[7]) && $match[7] !== "" ) { // Directive match if ( $match[7] === "open-quote" ) { // FIXME: do something here $text .= $quotes[0][0]; } else if ( $match[7] === "close-quote" ) { // FIXME: do something else here $text .= $quotes[0][1]; } else if ( $match[7] === "no-open-quote" ) { // FIXME: } else if ( $match[7] === "no-close-quote" ) { // FIXME: } else if ( mb_strpos($match[7],"attr(") === 0 ) { $i = mb_strpos($match[7],")"); if ( $i === false ) { continue; } $attr = mb_substr($match[7], 5, $i - 5); if ( $attr == "" ) { continue; } $text .= $this->_frame->get_parent()->get_node()->getAttribute($attr); } else { continue; } } } return $text; } /** * Sets the generated content of a generated frame */ protected function _set_content(){ $frame = $this->_frame; $style = $frame->get_style(); // if the element was pushed to a new page use the saved counter value, otherwise use the CSS reset value if ( $style->counter_reset && ($reset = $style->counter_reset) !== "none" ) { $vars = preg_split('/\s+/', trim($reset), 2); $frame->reset_counter( $vars[0] , ( isset($frame->_counters['__'.$vars[0]]) ? $frame->_counters['__'.$vars[0]] : ( isset($vars[1]) ? $vars[1] : 0 ) ) ); } if ( $style->counter_increment && ($increment = $style->counter_increment) !== "none" ) { $frame->increment_counters($increment); } if ( $style->content && !$frame->get_first_child() && $frame->get_node()->nodeName === "dompdf_generated" ) { $content = $this->_parse_content(); // add generated content to the font subset // FIXME: This is currently too late because the font subset has already been generated. // See notes in issue #750. if ( $frame->get_dompdf()->get_option("enable_font_subsetting") && $frame->get_dompdf()->get_canvas() instanceof CPDF_Adapter ) { $frame->get_dompdf()->get_canvas()->register_string_subset($style->font_family, $content); } $node = $frame->get_node()->ownerDocument->createTextNode($content); $new_style = $style->get_stylesheet()->create_style(); $new_style->inherit($style); $new_frame = new Frame($node); $new_frame->set_style($new_style); Frame_Factory::decorate_frame($new_frame, $frame->get_dompdf(), $frame->get_root()); $frame->append_child($new_frame); } } } dompdf-0.6.2/include/frame_tree.cls.php000066400000000000000000000135441263120276100200240ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Represents an entire document as a tree of frames * * The Frame_Tree consists of {@link Frame} objects each tied to specific * DOMNode objects in a specific DomDocument. The Frame_Tree has the same * structure as the DomDocument, but adds additional capabalities for * styling and layout. * * @package dompdf * @access protected */ class Frame_Tree { /** * Tags to ignore while parsing the tree * * @var array */ static protected $_HIDDEN_TAGS = array("area", "base", "basefont", "head", "style", "meta", "title", "colgroup", "noembed", "noscript", "param", "#comment"); /** * The main DomDocument * * @see http://ca2.php.net/manual/en/ref.dom.php * @var DomDocument */ protected $_dom; /** * The root node of the FrameTree. * * @var Frame */ protected $_root; /** * Subtrees of absolutely positioned elements * * @var array of Frames */ protected $_absolute_frames; /** * A mapping of {@link Frame} objects to DOMNode objects * * @var array */ protected $_registry; /** * Class constructor * * @param DomDocument $dom the main DomDocument object representing the current html document */ function __construct(DomDocument $dom) { $this->_dom = $dom; $this->_root = null; $this->_registry = array(); } function __destruct() { clear_object($this); } /** * Returns the DomDocument object representing the curent html document * * @return DOMDocument */ function get_dom() { return $this->_dom; } /** * Returns the root frame of the tree * * @return Page_Frame_Decorator */ function get_root() { return $this->_root; } /** * Returns a specific frame given its id * * @param string $id * @return Frame */ function get_frame($id) { return isset($this->_registry[$id]) ? $this->_registry[$id] : null; } /** * Returns a post-order iterator for all frames in the tree * * @return FrameTreeList|Frame[] */ function get_frames() { return new FrameTreeList($this->_root); } /** * Builds the tree */ function build_tree() { $html = $this->_dom->getElementsByTagName("html")->item(0); if ( is_null($html) ) { $html = $this->_dom->firstChild; } if ( is_null($html) ) { throw new DOMPDF_Exception("Requested HTML document contains no data."); } $this->fix_tables(); $this->_root = $this->_build_tree_r($html); } /** * Adds missing TBODYs around TR */ protected function fix_tables(){ $xp = new DOMXPath($this->_dom); // Move table caption before the table // FIXME find a better way to deal with it... $captions = $xp->query("//table/caption"); foreach($captions as $caption) { $table = $caption->parentNode; $table->parentNode->insertBefore($caption, $table); } $rows = $xp->query("//table/tr"); foreach($rows as $row) { $tbody = $this->_dom->createElement("tbody"); $tbody = $row->parentNode->insertBefore($tbody, $row); $tbody->appendChild($row); } } /** * Recursively adds {@link Frame} objects to the tree * * Recursively build a tree of Frame objects based on a dom tree. * No layout information is calculated at this time, although the * tree may be adjusted (i.e. nodes and frames for generated content * and images may be created). * * @param DOMNode $node the current DOMNode being considered * @return Frame */ protected function _build_tree_r(DOMNode $node) { $frame = new Frame($node); $id = $frame->get_id(); $this->_registry[ $id ] = $frame; if ( !$node->hasChildNodes() ) { return $frame; } // Fixes 'cannot access undefined property for object with // overloaded access', fix by Stefan radulian // //foreach ($node->childNodes as $child) { // Store the children in an array so that the tree can be modified $children = array(); for ($i = 0; $i < $node->childNodes->length; $i++) { $children[] = $node->childNodes->item($i); } foreach ($children as $child) { $node_name = mb_strtolower($child->nodeName); // Skip non-displaying nodes if ( in_array($node_name, self::$_HIDDEN_TAGS) ) { if ( $node_name !== "head" && $node_name !== "style" ) { $child->parentNode->removeChild($child); } continue; } // Skip empty text nodes if ( $node_name === "#text" && $child->nodeValue == "" ) { $child->parentNode->removeChild($child); continue; } // Skip empty image nodes if ( $node_name === "img" && $child->getAttribute("src") == "" ) { $child->parentNode->removeChild($child); continue; } $frame->append_child($this->_build_tree_r($child), false); } return $frame; } public function insert_node(DOMNode $node, DOMNode $new_node, $pos) { if ( $pos === "after" || !$node->firstChild ) { $node->appendChild($new_node); } else { $node->insertBefore($new_node, $node->firstChild); } $this->_build_tree_r($new_node); $frame_id = $new_node->getAttribute("frame_id"); $frame = $this->get_frame($frame_id); $parent_id = $node->getAttribute("frame_id"); $parent = $this->get_frame($parent_id); if ( $parent ) { if ( $pos === "before" ) { $parent->prepend_child($frame, false); } else { $parent->append_child($frame, false); } } return $frame_id; } } dompdf-0.6.2/include/functions.inc.php000066400000000000000000000647171263120276100177230ustar00rootroot00000000000000 * @author Helmut Tischer * @author Fabien Ménager * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ if ( !defined('PHP_VERSION_ID') ) { $version = explode('.', PHP_VERSION); define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2])); } /** * Defined a constant if not already defined * * @param string $name The constant name * @param mixed $value The value */ function def($name, $value = true) { if ( !defined($name) ) { define($name, $value); } } if ( !function_exists("pre_r") ) { /** * print_r wrapper for html/cli output * * Wraps print_r() output in < pre > tags if the current sapi is not 'cli'. * Returns the output string instead of displaying it if $return is true. * * @param mixed $mixed variable or expression to display * @param bool $return * * @return string */ function pre_r($mixed, $return = false) { if ( $return ) { return "
" . print_r($mixed, true) . "
"; } if ( php_sapi_name() !== "cli" ) { echo "
";
  }
  
  print_r($mixed);

  if ( php_sapi_name() !== "cli" ) {
    echo "
"; } else { echo "\n"; } flush(); } } if ( !function_exists("pre_var_dump") ) { /** * var_dump wrapper for html/cli output * * Wraps var_dump() output in < pre > tags if the current sapi is not 'cli'. * * @param mixed $mixed variable or expression to display. */ function pre_var_dump($mixed) { if ( php_sapi_name() !== "cli" ) { echo "
";
  }
    
  var_dump($mixed);
  
  if ( php_sapi_name() !== "cli" ) {
    echo "
"; } } } if ( !function_exists("d") ) { /** * generic debug function * * Takes everything and does its best to give a good debug output * * @param mixed $mixed variable or expression to display. */ function d($mixed) { if ( php_sapi_name() !== "cli" ) { echo "
";
  }
    
  // line
  if ( $mixed instanceof Line_Box ) {
    echo $mixed;
  }
  
  // other
  else {
    var_export($mixed);
  }
  
  if ( php_sapi_name() !== "cli" ) {
    echo "
"; } } } /** * builds a full url given a protocol, hostname, base path and url * * @param string $protocol * @param string $host * @param string $base_path * @param string $url * @return string * * Initially the trailing slash of $base_path was optional, and conditionally appended. * However on dynamically created sites, where the page is given as url parameter, * the base path might not end with an url. * Therefore do not append a slash, and **require** the $base_url to ending in a slash * when needed. * Vice versa, on using the local file system path of a file, make sure that the slash * is appended (o.k. also for Windows) */ function build_url($protocol, $host, $base_path, $url) { $protocol = mb_strtolower($protocol); if (strlen($url) == 0) { //return $protocol . $host . rtrim($base_path, "/\\") . "/"; return $protocol . $host . $base_path; } // Is the url already fully qualified or a Data URI? if (mb_strpos($url, "://") !== false || mb_strpos($url, "data:") === 0) { return $url; } $ret = $protocol; if (!in_array(mb_strtolower($protocol), array("http://", "https://", "ftp://", "ftps://"))) { //On Windows local file, an abs path can begin also with a '\' or a drive letter and colon //drive: followed by a relative path would be a drive specific default folder. //not known in php app code, treat as abs path //($url[1] !== ':' || ($url[2]!=='\\' && $url[2]!=='/')) if ($url[0] !== '/' && (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' || ($url[0] !== '\\' && $url[1] !== ':'))) { // For rel path and local acess we ignore the host, and run the path through realpath() $ret .= realpath($base_path) . '/'; } $ret .= $url; $ret = preg_replace('/\?(.*)$/', "", $ret); return $ret; } // Protocol relative urls (e.g. "//example.org/style.css") if (strpos($url, '//') === 0) { $ret .= substr($url, 2); //remote urls with backslash in html/css are not really correct, but lets be genereous } elseif ($url[0] === '/' || $url[0] === '\\') { // Absolute path $ret .= $host . $url; } else { // Relative path //$base_path = $base_path !== "" ? rtrim($base_path, "/\\") . "/" : ""; $ret .= $host . $base_path . $url; } return $ret; } /** * parse a full url or pathname and return an array(protocol, host, path, * file + query + fragment) * * @param string $url * @return array */ function explode_url($url) { $protocol = ""; $host = ""; $path = ""; $file = ""; $arr = parse_url($url); if ( isset($arr["scheme"])) { $arr["scheme"] == mb_strtolower($arr["scheme"]); } // Exclude windows drive letters... if ( isset($arr["scheme"]) && $arr["scheme"] !== "file" && strlen($arr["scheme"]) > 1 ) { $protocol = $arr["scheme"] . "://"; if ( isset($arr["user"]) ) { $host .= $arr["user"]; if ( isset($arr["pass"]) ) { $host .= ":" . $arr["pass"]; } $host .= "@"; } if ( isset($arr["host"]) ) { $host .= $arr["host"]; } if ( isset($arr["port"]) ) { $host .= ":" . $arr["port"]; } if ( isset($arr["path"]) && $arr["path"] !== "" ) { // Do we have a trailing slash? if ( $arr["path"][ mb_strlen($arr["path"]) - 1 ] === "/" ) { $path = $arr["path"]; $file = ""; } else { $path = rtrim(dirname($arr["path"]), '/\\') . "/"; $file = basename($arr["path"]); } } if ( isset($arr["query"]) ) { $file .= "?" . $arr["query"]; } if ( isset($arr["fragment"]) ) { $file .= "#" . $arr["fragment"]; } } else { $i = mb_stripos($url, "file://"); if ( $i !== false ) { $url = mb_substr($url, $i + 7); } $protocol = ""; // "file://"; ? why doesn't this work... It's because of // network filenames like //COMPU/SHARENAME $host = ""; // localhost, really $file = basename($url); $path = dirname($url); // Check that the path exists if ( $path !== false ) { $path .= '/'; } else { // generate a url to access the file if no real path found. $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://'; $host = isset($_SERVER["HTTP_HOST"]) ? $_SERVER["HTTP_HOST"] : php_uname("n"); if ( substr($arr["path"], 0, 1) === '/' ) { $path = dirname($arr["path"]); } else { $path = '/' . rtrim(dirname($_SERVER["SCRIPT_NAME"]), '/') . '/' . $arr["path"]; } } } $ret = array($protocol, $host, $path, $file, "protocol" => $protocol, "host" => $host, "path" => $path, "file" => $file); return $ret; } /** * Converts decimal numbers to roman numerals * * @param int $num * * @throws DOMPDF_Exception * @return string */ function dec2roman($num) { static $ones = array("", "i", "ii", "iii", "iv", "v", "vi", "vii", "viii", "ix"); static $tens = array("", "x", "xx", "xxx", "xl", "l", "lx", "lxx", "lxxx", "xc"); static $hund = array("", "c", "cc", "ccc", "cd", "d", "dc", "dcc", "dccc", "cm"); static $thou = array("", "m", "mm", "mmm"); if ( !is_numeric($num) ) { throw new DOMPDF_Exception("dec2roman() requires a numeric argument."); } if ( $num > 4000 || $num < 0 ) { return "(out of range)"; } $num = strrev((string)$num); $ret = ""; switch (mb_strlen($num)) { case 4: $ret .= $thou[$num[3]]; case 3: $ret .= $hund[$num[2]]; case 2: $ret .= $tens[$num[1]]; case 1: $ret .= $ones[$num[0]]; default: break; } return $ret; } /** * Determines whether $value is a percentage or not * * @param float $value * * @return bool */ function is_percent($value) { return false !== mb_strpos($value, "%"); } /** * Parses a data URI scheme * http://en.wikipedia.org/wiki/Data_URI_scheme * * @param string $data_uri The data URI to parse * * @return array The result with charset, mime type and decoded data */ function parse_data_uri($data_uri) { if (!preg_match('/^data:(?P[a-z0-9\/+-.]+)(;charset=(?P[a-z0-9-])+)?(?P;base64)?\,(?P.*)?/i', $data_uri, $match)) { return false; } $match['data'] = rawurldecode($match['data']); $result = array( 'charset' => $match['charset'] ? $match['charset'] : 'US-ASCII', 'mime' => $match['mime'] ? $match['mime'] : 'text/plain', 'data' => $match['base64'] ? base64_decode($match['data']) : $match['data'], ); return $result; } /** * mb_string compatibility */ if (!extension_loaded('mbstring')) { def('MB_OVERLOAD_MAIL', 1); def('MB_OVERLOAD_STRING', 2); def('MB_OVERLOAD_REGEX', 4); def('MB_CASE_UPPER', 0); def('MB_CASE_LOWER', 1); def('MB_CASE_TITLE', 2); if (!function_exists('mb_convert_encoding')) { function mb_convert_encoding($data, $to_encoding, $from_encoding = 'UTF-8') { if (str_replace('-', '', strtolower($to_encoding)) === 'utf8') { return utf8_encode($data); } return utf8_decode($data); } } if (!function_exists('mb_detect_encoding')) { function mb_detect_encoding($data, $encoding_list = array('iso-8859-1'), $strict = false) { return 'iso-8859-1'; } } if (!function_exists('mb_detect_order')) { function mb_detect_order($encoding_list = array('iso-8859-1')) { return 'iso-8859-1'; } } if (!function_exists('mb_internal_encoding')) { function mb_internal_encoding($encoding = null) { if (isset($encoding)) { return true; } return 'iso-8859-1'; } } if (!function_exists('mb_strlen')) { function mb_strlen($str, $encoding = 'iso-8859-1') { switch (str_replace('-', '', strtolower($encoding))) { case "utf8": return strlen(utf8_encode($str)); case "8bit": return strlen($str); default: return strlen(utf8_decode($str)); } } } if (!function_exists('mb_strpos')) { function mb_strpos($haystack, $needle, $offset = 0) { return strpos($haystack, $needle, $offset); } } if (!function_exists('mb_stripos')) { function mb_stripos($haystack, $needle, $offset = 0) { return stripos($haystack, $needle, $offset); } } if (!function_exists('mb_strrpos')) { function mb_strrpos($haystack, $needle, $offset = 0) { return strrpos($haystack, $needle, $offset); } } if (!function_exists('mb_strtolower')) { function mb_strtolower( $str ) { return strtolower($str); } } if (!function_exists('mb_strtoupper')) { function mb_strtoupper( $str ) { return strtoupper($str); } } if (!function_exists('mb_substr')) { function mb_substr($string, $start, $length = null, $encoding = 'iso-8859-1') { if ( is_null($length) ) { return substr($string, $start); } return substr($string, $start, $length); } } if (!function_exists('mb_substr_count')) { function mb_substr_count($haystack, $needle, $encoding = 'iso-8859-1') { return substr_count($haystack, $needle); } } if (!function_exists('mb_encode_numericentity')) { function mb_encode_numericentity($str, $convmap, $encoding) { return htmlspecialchars($str); } } if (!function_exists('mb_convert_case')) { function mb_convert_case($str, $mode = MB_CASE_UPPER, $encoding = array()) { switch($mode) { case MB_CASE_UPPER: return mb_strtoupper($str); case MB_CASE_LOWER: return mb_strtolower($str); case MB_CASE_TITLE: return ucwords(mb_strtolower($str)); default: return $str; } } } if (!function_exists('mb_list_encodings')) { function mb_list_encodings() { return array( "ISO-8859-1", "UTF-8", "8bit", ); } } } /** * Decoder for RLE8 compression in windows bitmaps * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp * * @param string $str Data to decode * @param integer $width Image width * * @return string */ function rle8_decode ($str, $width){ $lineWidth = $width + (3 - ($width-1) % 4); $out = ''; $cnt = strlen($str); for ($i = 0; $i <$cnt; $i++) { $o = ord($str[$i]); switch ($o){ case 0: # ESCAPE $i++; switch (ord($str[$i])){ case 0: # NEW LINE $padCnt = $lineWidth - strlen($out)%$lineWidth; if ($padCnt<$lineWidth) $out .= str_repeat(chr(0), $padCnt); # pad line break; case 1: # END OF FILE $padCnt = $lineWidth - strlen($out)%$lineWidth; if ($padCnt<$lineWidth) $out .= str_repeat(chr(0), $padCnt); # pad line break 3; case 2: # DELTA $i += 2; break; default: # ABSOLUTE MODE $num = ord($str[$i]); for ($j = 0; $j < $num; $j++) $out .= $str[++$i]; if ($num % 2) $i++; } break; default: $out .= str_repeat($str[++$i], $o); } } return $out; } /** * Decoder for RLE4 compression in windows bitmaps * see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp * * @param string $str Data to decode * @param integer $width Image width * * @return string */ function rle4_decode ($str, $width) { $w = floor($width/2) + ($width % 2); $lineWidth = $w + (3 - ( ($width-1) / 2) % 4); $pixels = array(); $cnt = strlen($str); $c = 0; for ($i = 0; $i < $cnt; $i++) { $o = ord($str[$i]); switch ($o) { case 0: # ESCAPE $i++; switch (ord($str[$i])){ case 0: # NEW LINE while (count($pixels)%$lineWidth != 0) { $pixels[] = 0; } break; case 1: # END OF FILE while (count($pixels)%$lineWidth != 0) { $pixels[] = 0; } break 3; case 2: # DELTA $i += 2; break; default: # ABSOLUTE MODE $num = ord($str[$i]); for ($j = 0; $j < $num; $j++) { if ($j%2 == 0) { $c = ord($str[++$i]); $pixels[] = ($c & 240)>>4; } else { $pixels[] = $c & 15; } } if ($num % 2 == 0) { $i++; } } break; default: $c = ord($str[++$i]); for ($j = 0; $j < $o; $j++) { $pixels[] = ($j%2==0 ? ($c & 240)>>4 : $c & 15); } } } $out = ''; if (count($pixels)%2) { $pixels[] = 0; } $cnt = count($pixels)/2; for ($i = 0; $i < $cnt; $i++) { $out .= chr(16*$pixels[2*$i] + $pixels[2*$i+1]); } return $out; } if ( !function_exists("imagecreatefrombmp") ) { /** * Credit goes to mgutt * http://www.programmierer-forum.de/function-imagecreatefrombmp-welche-variante-laeuft-t143137.htm * Modified by Fabien Menager to support RGB555 BMP format */ function imagecreatefrombmp($filename) { if (!function_exists("imagecreatetruecolor")) { trigger_error("The PHP GD extension is required, but is not installed.", E_ERROR); return false; } // version 1.00 if (!($fh = fopen($filename, 'rb'))) { trigger_error('imagecreatefrombmp: Can not open ' . $filename, E_USER_WARNING); return false; } $bytes_read = 0; // read file header $meta = unpack('vtype/Vfilesize/Vreserved/Voffset', fread($fh, 14)); // check for bitmap if ($meta['type'] != 19778) { trigger_error('imagecreatefrombmp: ' . $filename . ' is not a bitmap!', E_USER_WARNING); return false; } // read image header $meta += unpack('Vheadersize/Vwidth/Vheight/vplanes/vbits/Vcompression/Vimagesize/Vxres/Vyres/Vcolors/Vimportant', fread($fh, 40)); $bytes_read += 40; // read additional bitfield header if ($meta['compression'] == 3) { $meta += unpack('VrMask/VgMask/VbMask', fread($fh, 12)); $bytes_read += 12; } // set bytes and padding $meta['bytes'] = $meta['bits'] / 8; $meta['decal'] = 4 - (4 * (($meta['width'] * $meta['bytes'] / 4)- floor($meta['width'] * $meta['bytes'] / 4))); if ($meta['decal'] == 4) { $meta['decal'] = 0; } // obtain imagesize if ($meta['imagesize'] < 1) { $meta['imagesize'] = $meta['filesize'] - $meta['offset']; // in rare cases filesize is equal to offset so we need to read physical size if ($meta['imagesize'] < 1) { $meta['imagesize'] = @filesize($filename) - $meta['offset']; if ($meta['imagesize'] < 1) { trigger_error('imagecreatefrombmp: Can not obtain filesize of ' . $filename . '!', E_USER_WARNING); return false; } } } // calculate colors $meta['colors'] = !$meta['colors'] ? pow(2, $meta['bits']) : $meta['colors']; // read color palette $palette = array(); if ($meta['bits'] < 16) { $palette = unpack('l' . $meta['colors'], fread($fh, $meta['colors'] * 4)); // in rare cases the color value is signed if ($palette[1] < 0) { foreach ($palette as $i => $color) { $palette[$i] = $color + 16777216; } } } // ignore extra bitmap headers if ($meta['headersize'] > $bytes_read) { fread($fh, $meta['headersize'] - $bytes_read); } // create gd image $im = imagecreatetruecolor($meta['width'], $meta['height']); $data = fread($fh, $meta['imagesize']); // uncompress data switch ($meta['compression']) { case 1: $data = rle8_decode($data, $meta['width']); break; case 2: $data = rle4_decode($data, $meta['width']); break; } $p = 0; $vide = chr(0); $y = $meta['height'] - 1; $error = 'imagecreatefrombmp: ' . $filename . ' has not enough data!'; // loop through the image data beginning with the lower left corner while ($y >= 0) { $x = 0; while ($x < $meta['width']) { switch ($meta['bits']) { case 32: case 24: if (!($part = substr($data, $p, 3 /*$meta['bytes']*/))) { trigger_error($error, E_USER_WARNING); return $im; } $color = unpack('V', $part . $vide); break; case 16: if (!($part = substr($data, $p, 2 /*$meta['bytes']*/))) { trigger_error($error, E_USER_WARNING); return $im; } $color = unpack('v', $part); if (empty($meta['rMask']) || $meta['rMask'] != 0xf800) { $color[1] = (($color[1] & 0x7c00) >> 7) * 65536 + (($color[1] & 0x03e0) >> 2) * 256 + (($color[1] & 0x001f) << 3); // 555 } else { $color[1] = (($color[1] & 0xf800) >> 8) * 65536 + (($color[1] & 0x07e0) >> 3) * 256 + (($color[1] & 0x001f) << 3); // 565 } break; case 8: $color = unpack('n', $vide . substr($data, $p, 1)); $color[1] = $palette[ $color[1] + 1 ]; break; case 4: $color = unpack('n', $vide . substr($data, floor($p), 1)); $color[1] = ($p * 2) % 2 == 0 ? $color[1] >> 4 : $color[1] & 0x0F; $color[1] = $palette[ $color[1] + 1 ]; break; case 1: $color = unpack('n', $vide . substr($data, floor($p), 1)); switch (($p * 8) % 8) { case 0: $color[1] = $color[1] >> 7; break; case 1: $color[1] = ($color[1] & 0x40) >> 6; break; case 2: $color[1] = ($color[1] & 0x20) >> 5; break; case 3: $color[1] = ($color[1] & 0x10) >> 4; break; case 4: $color[1] = ($color[1] & 0x8 ) >> 3; break; case 5: $color[1] = ($color[1] & 0x4 ) >> 2; break; case 6: $color[1] = ($color[1] & 0x2 ) >> 1; break; case 7: $color[1] = ($color[1] & 0x1 ); break; } $color[1] = $palette[ $color[1] + 1 ]; break; default: trigger_error('imagecreatefrombmp: ' . $filename . ' has ' . $meta['bits'] . ' bits and this is not supported!', E_USER_WARNING); return false; } imagesetpixel($im, $x, $y, $color[1]); $x++; $p += $meta['bytes']; } $y--; $p += $meta['decal']; } fclose($fh); return $im; } } /** * getimagesize doesn't give a good size for 32bit BMP image v5 * * @param string $filename * @return array The same format as getimagesize($filename) */ function dompdf_getimagesize($filename, $context = null) { static $cache = array(); if ( isset($cache[$filename]) ) { return $cache[$filename]; } list($width, $height, $type) = getimagesize($filename); if ( $width == null || $height == null ) { $data = file_get_contents($filename, null, $context, 0, 26); if ( substr($data, 0, 2) === "BM" ) { $meta = unpack('vtype/Vfilesize/Vreserved/Voffset/Vheadersize/Vwidth/Vheight', $data); $width = (int)$meta['width']; $height = (int)$meta['height']; $type = IMAGETYPE_BMP; } } return $cache[$filename] = array($width, $height, $type); } /** * Converts a CMYK color to RGB * * @param float|float[] $c * @param float $m * @param float $y * @param float $k * * @return float[] */ function cmyk_to_rgb($c, $m = null, $y = null, $k = null) { if (is_array($c)) { list($c, $m, $y, $k) = $c; } $c *= 255; $m *= 255; $y *= 255; $k *= 255; $r = (1 - round(2.55 * ($c+$k))) ; $g = (1 - round(2.55 * ($m+$k))) ; $b = (1 - round(2.55 * ($y+$k))) ; if ($r < 0) $r = 0; if ($g < 0) $g = 0; if ($b < 0) $b = 0; return array( $r, $g, $b, "r" => $r, "g" => $g, "b" => $b ); } function unichr($c) { if ($c <= 0x7F) { return chr($c); } else if ($c <= 0x7FF) { return chr(0xC0 | $c >> 6) . chr(0x80 | $c & 0x3F); } else if ($c <= 0xFFFF) { return chr(0xE0 | $c >> 12) . chr(0x80 | $c >> 6 & 0x3F) . chr(0x80 | $c & 0x3F); } else if ($c <= 0x10FFFF) { return chr(0xF0 | $c >> 18) . chr(0x80 | $c >> 12 & 0x3F) . chr(0x80 | $c >> 6 & 0x3F) . chr(0x80 | $c & 0x3F); } return false; } if ( !function_exists("date_default_timezone_get") ) { function date_default_timezone_get() { return ""; } function date_default_timezone_set($timezone_identifier) { return true; } } /** * Stores warnings in an array for display later * This function allows warnings generated by the DomDocument parser * and CSS loader ({@link Stylesheet}) to be captured and displayed * later. Without this function, errors are displayed immediately and * PDF streaming is impossible. * @see http://www.php.net/manual/en/function.set-error_handler.php * * @param int $errno * @param string $errstr * @param string $errfile * @param string $errline * * @throws DOMPDF_Exception */ function record_warnings($errno, $errstr, $errfile, $errline) { // Not a warning or notice if ( !($errno & (E_WARNING | E_NOTICE | E_USER_NOTICE | E_USER_WARNING )) ) { throw new DOMPDF_Exception($errstr . " $errno"); } global $_dompdf_warnings; global $_dompdf_show_warnings; if ( $_dompdf_show_warnings ) { echo $errstr . "\n"; } $_dompdf_warnings[] = $errstr; } /** * Print a useful backtrace */ function bt() { if ( php_sapi_name() !== "cli") { echo "
";
  }
    
  $bt = debug_backtrace();

  array_shift($bt); // remove actual bt() call
  echo "\n";

  $i = 0;
  foreach ($bt as $call) {
    $file = basename($call["file"]) . " (" . $call["line"] . ")";
    if ( isset($call["class"]) ) {
      $func = $call["class"] . "->" . $call["function"] . "()";
    }
    else {
      $func = $call["function"] . "()";
    }

    echo "#" . str_pad($i, 2, " ", STR_PAD_RIGHT) . ": " . str_pad($file.":", 42) . " $func\n";
    $i++;
  }
  echo "\n";
  
  if ( php_sapi_name() !== "cli") {
    echo "
"; } } /** * Print debug messages * * @param string $type The type of debug messages to print * @param string $msg The message to show */ function dompdf_debug($type, $msg) { global $_DOMPDF_DEBUG_TYPES, $_dompdf_show_warnings, $_dompdf_debug; if ( isset($_DOMPDF_DEBUG_TYPES[$type]) && ($_dompdf_show_warnings || $_dompdf_debug) ) { $arr = debug_backtrace(); echo basename($arr[0]["file"]) . " (" . $arr[0]["line"] ."): " . $arr[1]["function"] . ": "; pre_r($msg); } } if ( !function_exists("print_memusage") ) { /** * Dump memory usage */ function print_memusage() { global $memusage; echo "Memory Usage\n"; $prev = 0; $initial = reset($memusage); echo str_pad("Initial:", 40) . $initial . "\n\n"; foreach ($memusage as $key=>$mem) { $mem -= $initial; echo str_pad("$key:" , 40); echo str_pad("$mem", 12) . "(diff: " . ($mem - $prev) . ")\n"; $prev = $mem; } echo "\n" . str_pad("Total:", 40) . memory_get_usage() . "\n"; } } if ( !function_exists("enable_mem_profile") ) { /** * Initialize memory profiling code */ function enable_mem_profile() { global $memusage; $memusage = array("Startup" => memory_get_usage()); register_shutdown_function("print_memusage"); } } if ( !function_exists("mark_memusage") ) { /** * Record the current memory usage * * @param string $location a meaningful location */ function mark_memusage($location) { global $memusage; if ( isset($memusage) ) { $memusage[$location] = memory_get_usage(); } } } if ( !function_exists('sys_get_temp_dir')) { /** * Find the current system temporary directory * * @link http://us.php.net/manual/en/function.sys-get-temp-dir.php#85261 */ function sys_get_temp_dir() { if (!empty($_ENV['TMP'])) { return realpath($_ENV['TMP']); } if (!empty($_ENV['TMPDIR'])) { return realpath( $_ENV['TMPDIR']); } if (!empty($_ENV['TEMP'])) { return realpath( $_ENV['TEMP']); } $tempfile=tempnam(uniqid(rand(), true), ''); if (file_exists($tempfile)) { unlink($tempfile); return realpath(dirname($tempfile)); } } } if ( function_exists("memory_get_peak_usage") ) { function DOMPDF_memory_usage(){ return memory_get_peak_usage(true); } } else if ( function_exists("memory_get_usage") ) { function DOMPDF_memory_usage(){ return memory_get_usage(true); } } else { function DOMPDF_memory_usage(){ return "N/A"; } } /** * Affect null to the unused objects * @param mixed $object */ if ( PHP_VERSION_ID < 50300 ) { function clear_object(&$object) { if ( is_object($object) ) { foreach ($object as &$value) { clear_object($value); } } $object = null; unset($object); } } else { function clear_object(&$object) { // void } } dompdf-0.6.2/include/gd_adapter.cls.php000066400000000000000000000464421263120276100200100ustar00rootroot00000000000000 * @author Fabien Ménager * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Image rendering interface * * Renders to an image format supported by GD (jpeg, gif, png, xpm). * Not super-useful day-to-day but handy nonetheless * * @package dompdf */ class GD_Adapter implements Canvas { /** * @var DOMPDF */ private $_dompdf; /** * Resource handle for the image * * @var resource */ private $_img; /** * Image width in pixels * * @var int */ private $_width; /** * Image height in pixels * * @var int */ private $_height; /** * Current page number * * @var int */ private $_page_number; /** * Total number of pages * * @var int */ private $_page_count; /** * Image antialias factor * * @var float */ private $_aa_factor; /** * Allocated colors * * @var array */ private $_colors; /** * Background color * * @var int */ private $_bg_color; /** * Class constructor * * @param mixed $size The size of image to create: array(x1,y1,x2,y2) or "letter", "legal", etc. * @param string $orientation The orientation of the document (either 'landscape' or 'portrait') * @param DOMPDF $dompdf * @param float $aa_factor Anti-aliasing factor, 1 for no AA * @param array $bg_color Image background color: array(r,g,b,a), 0 <= r,g,b,a <= 1 */ function __construct($size, $orientation = "portrait", DOMPDF $dompdf, $aa_factor = 1.0, $bg_color = array(1,1,1,0) ) { if ( !is_array($size) ) { $size = strtolower($size); if ( isset(CPDF_Adapter::$PAPER_SIZES[$size]) ) { $size = CPDF_Adapter::$PAPER_SIZES[$size]; } else { $size = CPDF_Adapter::$PAPER_SIZES["letter"]; } } if ( strtolower($orientation) === "landscape" ) { list($size[2],$size[3]) = array($size[3],$size[2]); } $this->_dompdf = $dompdf; if ( $aa_factor < 1 ) { $aa_factor = 1; } $this->_aa_factor = $aa_factor; $size[2] *= $aa_factor; $size[3] *= $aa_factor; $this->_width = $size[2] - $size[0]; $this->_height = $size[3] - $size[1]; $this->_img = imagecreatetruecolor($this->_width, $this->_height); if ( is_null($bg_color) || !is_array($bg_color) ) { // Pure white bg $bg_color = array(1,1,1,0); } $this->_bg_color = $this->_allocate_color($bg_color); imagealphablending($this->_img, true); imagesavealpha($this->_img, true); imagefill($this->_img, 0, 0, $this->_bg_color); } function get_dompdf(){ return $this->_dompdf; } /** * Return the GF image resource * * @return resource */ function get_image() { return $this->_img; } /** * Return the image's width in pixels * * @return float */ function get_width() { return $this->_width / $this->_aa_factor; } /** * Return the image's height in pixels * * @return float */ function get_height() { return $this->_height / $this->_aa_factor; } /** * Returns the current page number * @return int */ function get_page_number() { return $this->_page_number; } /** * Returns the total number of pages in the document * @return int */ function get_page_count() { return $this->_page_count; } /** * Sets the current page number * * @param int $num */ function set_page_number($num) { $this->_page_number = $num; } /** * Sets the page count * * @param int $count */ function set_page_count($count) { $this->_page_count = $count; } /** * Sets the opacity * * @param $opacity * @param $mode */ function set_opacity($opacity, $mode = "Normal") { // FIXME } /** * Allocate a new color. Allocate with GD as needed and store * previously allocated colors in $this->_colors. * * @param array $color The new current color * @return int The allocated color */ private function _allocate_color($color) { if ( isset($color["c"]) ) { $color = cmyk_to_rgb($color); } // Full opacity if no alpha set if ( !isset($color[3]) ) $color[3] = 0; list($r,$g,$b,$a) = $color; $r *= 255; $g *= 255; $b *= 255; $a *= 127; // Clip values $r = $r > 255 ? 255 : $r; $g = $g > 255 ? 255 : $g; $b = $b > 255 ? 255 : $b; $a = $a > 127 ? 127 : $a; $r = $r < 0 ? 0 : $r; $g = $g < 0 ? 0 : $g; $b = $b < 0 ? 0 : $b; $a = $a < 0 ? 0 : $a; $key = sprintf("#%02X%02X%02X%02X", $r, $g, $b, $a); if ( isset($this->_colors[$key]) ) return $this->_colors[$key]; if ( $a != 0 ) $this->_colors[$key] = imagecolorallocatealpha($this->_img, $r, $g, $b, $a); else $this->_colors[$key] = imagecolorallocate($this->_img, $r, $g, $b); return $this->_colors[$key]; } /** * Draws a line from x1,y1 to x2,y2 * * See {@link Style::munge_color()} for the format of the color array. * See {@link Cpdf::setLineStyle()} for a description of the format of the * $style parameter (aka dash). * * @param float $x1 * @param float $y1 * @param float $x2 * @param float $y2 * @param array $color * @param float $width * @param array $style */ function line($x1, $y1, $x2, $y2, $color, $width, $style = null) { // Scale by the AA factor $x1 *= $this->_aa_factor; $y1 *= $this->_aa_factor; $x2 *= $this->_aa_factor; $y2 *= $this->_aa_factor; $width *= $this->_aa_factor; $c = $this->_allocate_color($color); // Convert the style array if required if ( !is_null($style) ) { $gd_style = array(); if ( count($style) == 1 ) { for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) { $gd_style[] = $c; } for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) { $gd_style[] = $this->_bg_color; } } else { $i = 0; foreach ($style as $length) { if ( $i % 2 == 0 ) { // 'On' pattern for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) $gd_style[] = $c; } else { // Off pattern for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) $gd_style[] = $this->_bg_color; } $i++; } } imagesetstyle($this->_img, $gd_style); $c = IMG_COLOR_STYLED; } imagesetthickness($this->_img, $width); imageline($this->_img, $x1, $y1, $x2, $y2, $c); } function arc($x1, $y1, $r1, $r2, $astart, $aend, $color, $width, $style = array()) { // @todo } /** * Draws a rectangle at x1,y1 with width w and height h * * See {@link Style::munge_color()} for the format of the color array. * See {@link Cpdf::setLineStyle()} for a description of the $style * parameter (aka dash) * * @param float $x1 * @param float $y1 * @param float $w * @param float $h * @param array $color * @param float $width * @param array $style */ function rectangle($x1, $y1, $w, $h, $color, $width, $style = null) { // Scale by the AA factor $x1 *= $this->_aa_factor; $y1 *= $this->_aa_factor; $w *= $this->_aa_factor; $h *= $this->_aa_factor; $c = $this->_allocate_color($color); // Convert the style array if required if ( !is_null($style) ) { $gd_style = array(); foreach ($style as $length) { for ($i = 0; $i < $length; $i++) { $gd_style[] = $c; } } imagesetstyle($this->_img, $gd_style); $c = IMG_COLOR_STYLED; } imagesetthickness($this->_img, $width); imagerectangle($this->_img, $x1, $y1, $x1 + $w, $y1 + $h, $c); } /** * Draws a filled rectangle at x1,y1 with width w and height h * * See {@link Style::munge_color()} for the format of the color array. * * @param float $x1 * @param float $y1 * @param float $w * @param float $h * @param array $color */ function filled_rectangle($x1, $y1, $w, $h, $color) { // Scale by the AA factor $x1 *= $this->_aa_factor; $y1 *= $this->_aa_factor; $w *= $this->_aa_factor; $h *= $this->_aa_factor; $c = $this->_allocate_color($color); imagefilledrectangle($this->_img, $x1, $y1, $x1 + $w, $y1 + $h, $c); } /** * Starts a clipping rectangle at x1,y1 with width w and height h * * @param float $x1 * @param float $y1 * @param float $w * @param float $h */ function clipping_rectangle($x1, $y1, $w, $h) { // @todo } function clipping_roundrectangle($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL) { // @todo } /** * Ends the last clipping shape */ function clipping_end() { // @todo } function save() { // @todo } function restore() { // @todo } function rotate($angle, $x, $y) { // @todo } function skew($angle_x, $angle_y, $x, $y) { // @todo } function scale($s_x, $s_y, $x, $y) { // @todo } function translate($t_x, $t_y) { // @todo } function transform($a, $b, $c, $d, $e, $f) { // @todo } /** * Draws a polygon * * The polygon is formed by joining all the points stored in the $points * array. $points has the following structure: * * array(0 => x1, * 1 => y1, * 2 => x2, * 3 => y2, * ... * ); * * * See {@link Style::munge_color()} for the format of the color array. * See {@link Cpdf::setLineStyle()} for a description of the $style * parameter (aka dash) * * @param array $points * @param array $color * @param float $width * @param array $style * @param bool $fill Fills the polygon if true */ function polygon($points, $color, $width = null, $style = null, $fill = false) { // Scale each point by the AA factor foreach (array_keys($points) as $i) $points[$i] *= $this->_aa_factor; $c = $this->_allocate_color($color); // Convert the style array if required if ( !is_null($style) && !$fill ) { $gd_style = array(); foreach ($style as $length) { for ($i = 0; $i < $length; $i++) { $gd_style[] = $c; } } imagesetstyle($this->_img, $gd_style); $c = IMG_COLOR_STYLED; } imagesetthickness($this->_img, $width); if ( $fill ) imagefilledpolygon($this->_img, $points, count($points) / 2, $c); else imagepolygon($this->_img, $points, count($points) / 2, $c); } /** * Draws a circle at $x,$y with radius $r * * See {@link Style::munge_color()} for the format of the color array. * See {@link Cpdf::setLineStyle()} for a description of the $style * parameter (aka dash) * * @param float $x * @param float $y * @param float $r * @param array $color * @param float $width * @param array $style * @param bool $fill Fills the circle if true */ function circle($x, $y, $r, $color, $width = null, $style = null, $fill = false) { // Scale by the AA factor $x *= $this->_aa_factor; $y *= $this->_aa_factor; $r *= $this->_aa_factor; $c = $this->_allocate_color($color); // Convert the style array if required if ( !is_null($style) && !$fill ) { $gd_style = array(); foreach ($style as $length) { for ($i = 0; $i < $length; $i++) { $gd_style[] = $c; } } imagesetstyle($this->_img, $gd_style); $c = IMG_COLOR_STYLED; } imagesetthickness($this->_img, $width); if ( $fill ) imagefilledellipse($this->_img, $x, $y, $r, $r, $c); else imageellipse($this->_img, $x, $y, $r, $r, $c); } /** * Add an image to the pdf. * The image is placed at the specified x and y coordinates with the * given width and height. * * @param string $img_url the path to the image * @param float $x x position * @param float $y y position * @param int $w width (in pixels) * @param int $h height (in pixels) * @param string $resolution * * @return void * @internal param string $img_type the type (e.g. extension) of the image */ function image($img_url, $x, $y, $w, $h, $resolution = "normal") { $img_type = Image_Cache::detect_type($img_url, $this->_dompdf->get_http_context()); $img_ext = Image_Cache::type_to_ext($img_type); if ( !$img_ext ) { return; } $func = "imagecreatefrom$img_ext"; $src = @$func($img_url); if ( !$src ) { return; // Probably should add to $_dompdf_errors or whatever here } // Scale by the AA factor $x *= $this->_aa_factor; $y *= $this->_aa_factor; $w *= $this->_aa_factor; $h *= $this->_aa_factor; $img_w = imagesx($src); $img_h = imagesy($src); imagecopyresampled($this->_img, $src, $x, $y, 0, 0, $w, $h, $img_w, $img_h); } /** * Writes text at the specified x and y coordinates * See {@link Style::munge_color()} for the format of the color array. * * @param float $x * @param float $y * @param string $text the text to write * @param string $font the font file to use * @param float $size the font size, in points * @param array $color * @param float $word_spacing word spacing adjustment * @param float $char_spacing * @param float $angle Text angle * * @return void */ function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_spacing = 0.0, $char_spacing = 0.0, $angle = 0.0) { // Scale by the AA factor $x *= $this->_aa_factor; $y *= $this->_aa_factor; $size *= $this->_aa_factor; $h = $this->get_font_height($font, $size); $c = $this->_allocate_color($color); $text = mb_encode_numericentity($text, array(0x0080, 0xff, 0, 0xff), 'UTF-8'); $font = $this->get_ttf_file($font); // FIXME: word spacing @imagettftext($this->_img, $size, $angle, $x, $y + $h, $c, $font, $text); } function javascript($code) { // Not implemented } /** * Add a named destination (similar to ... in html) * * @param string $anchorname The name of the named destination */ function add_named_dest($anchorname) { // Not implemented } /** * Add a link to the pdf * * @param string $url The url to link to * @param float $x The x position of the link * @param float $y The y position of the link * @param float $width The width of the link * @param float $height The height of the link */ function add_link($url, $x, $y, $width, $height) { // Not implemented } /** * Add meta information to the PDF * * @param string $label label of the value (Creator, Producer, etc.) * @param string $value the text to set */ function add_info($label, $value) { // N/A } function set_default_view($view, $options = array()) { // N/A } /** * Calculates text size, in points * * @param string $text the text to be sized * @param string $font the desired font * @param float $size the desired font size * @param float $word_spacing word spacing, if any * @param float $char_spacing char spacing, if any * * @return float */ function get_text_width($text, $font, $size, $word_spacing = 0.0, $char_spacing = 0.0) { $font = $this->get_ttf_file($font); $text = mb_encode_numericentity($text, array(0x0080, 0xffff, 0, 0xffff), 'UTF-8'); // FIXME: word spacing list($x1,,$x2) = @imagettfbbox($size, 0, $font, $text); return $x2 - $x1; } function get_ttf_file($font) { if ( strpos($font, '.ttf') === false ) $font .= ".ttf"; /*$filename = substr(strtolower(basename($font)), 0, -4); if ( in_array($filename, DOMPDF::$native_fonts) ) { return "arial.ttf"; }*/ return $font; } /** * Calculates font height, in points * * @param string $font * @param float $size * @return float */ function get_font_height($font, $size) { $font = $this->get_ttf_file($font); $ratio = $this->_dompdf->get_option("font_height_ratio"); // FIXME: word spacing list(,$y2,,,,$y1) = imagettfbbox($size, 0, $font, "MXjpqytfhl"); // Test string with ascenders, descenders and caps return ($y2 - $y1) * $ratio; } function get_font_baseline($font, $size) { $ratio = $this->_dompdf->get_option("font_height_ratio"); return $this->get_font_height($font, $size) / $ratio; } /** * Starts a new page * * Subsequent drawing operations will appear on the new page. */ function new_page() { $this->_page_number++; $this->_page_count++; } function open_object(){ // N/A } function close_object(){ // N/A } function add_object(){ // N/A } function page_text(){ // N/A } /** * Streams the image directly to the browser * * @param string $filename the name of the image file (ignored) * @param array $options associative array, 'type' => jpeg|jpg|png, 'quality' => 0 - 100 (jpeg only) */ function stream($filename, $options = null) { // Perform any antialiasing if ( $this->_aa_factor != 1 ) { $dst_w = $this->_width / $this->_aa_factor; $dst_h = $this->_height / $this->_aa_factor; $dst = imagecreatetruecolor($dst_w, $dst_h); imagecopyresampled($dst, $this->_img, 0, 0, 0, 0, $dst_w, $dst_h, $this->_width, $this->_height); } else { $dst = $this->_img; } if ( !isset($options["type"]) ) $options["type"] = "png"; $type = strtolower($options["type"]); header("Cache-Control: private"); switch ($type) { case "jpg": case "jpeg": if ( !isset($options["quality"]) ) $options["quality"] = 75; header("Content-type: image/jpeg"); imagejpeg($dst, '', $options["quality"]); break; case "png": default: header("Content-type: image/png"); imagepng($dst); break; } if ( $this->_aa_factor != 1 ) imagedestroy($dst); } /** * Returns the PNG as a string * * @param array $options associative array, 'type' => jpeg|jpg|png, 'quality' => 0 - 100 (jpeg only) * @return string */ function output($options = null) { if ( $this->_aa_factor != 1 ) { $dst_w = $this->_width / $this->_aa_factor; $dst_h = $this->_height / $this->_aa_factor; $dst = imagecreatetruecolor($dst_w, $dst_h); imagecopyresampled($dst, $this->_img, 0, 0, 0, 0, $dst_w, $dst_h, $this->_width, $this->_height); } else { $dst = $this->_img; } if ( !isset($options["type"]) ) $options["type"] = "png"; $type = $options["type"]; ob_start(); switch ($type) { case "jpg": case "jpeg": if ( !isset($options["quality"]) ) $options["quality"] = 75; imagejpeg($dst, '', $options["quality"]); break; case "png": default: imagepng($dst); break; } $image = ob_get_clean(); if ( $this->_aa_factor != 1 ) imagedestroy($dst); return $image; } } dompdf-0.6.2/include/image_cache.cls.php000066400000000000000000000134451263120276100201200ustar00rootroot00000000000000 * @author Helmut Tischer * @author Fabien Ménager * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Static class that resolves image urls and downloads and caches * remote images if required. * * @access private * @package dompdf */ class Image_Cache { /** * Array of downloaded images. Cached so that identical images are * not needlessly downloaded. * * @var array */ static protected $_cache = array(); /** * The url to the "broken image" used when images can't be loade * * @var string */ public static $broken_image; /** * Resolve and fetch an image for use. * * @param string $url The url of the image * @param string $protocol Default protocol if none specified in $url * @param string $host Default host if none specified in $url * @param string $base_path Default path if none specified in $url * @param DOMPDF $dompdf The DOMPDF instance * * @throws DOMPDF_Image_Exception * @return array An array with two elements: The local path to the image and the image extension */ static function resolve_url($url, $protocol, $host, $base_path, DOMPDF $dompdf) { $protocol = mb_strtolower($protocol); $parsed_url = explode_url($url); $message = null; $remote = ($protocol && $protocol !== "file://") || ($parsed_url['protocol'] != ""); $data_uri = strpos($parsed_url['protocol'], "data:") === 0; $full_url = null; $enable_remote = $dompdf->get_option("enable_remote"); try { // Remote not allowed and is not DataURI if ( !$enable_remote && $remote && !$data_uri ) { throw new DOMPDF_Image_Exception("DOMPDF_ENABLE_REMOTE is set to FALSE"); } // Remote allowed or DataURI else if ( $enable_remote && $remote || $data_uri ) { // Download remote files to a temporary directory $full_url = build_url($protocol, $host, $base_path, $url); // From cache if ( isset(self::$_cache[$full_url]) ) { $resolved_url = self::$_cache[$full_url]; } // From remote else { $tmp_dir = $dompdf->get_option("temp_dir"); $resolved_url = tempnam($tmp_dir, "ca_dompdf_img_"); $image = ""; if ($data_uri) { if ($parsed_data_uri = parse_data_uri($url)) { $image = $parsed_data_uri['data']; } } else { set_error_handler("record_warnings"); $image = file_get_contents($full_url, null, $dompdf->get_http_context()); restore_error_handler(); } // Image not found or invalid if ( strlen($image) == 0 ) { $msg = ($data_uri ? "Data-URI could not be parsed" : "Image not found"); throw new DOMPDF_Image_Exception($msg); } // Image found, put in cache and process else { //e.g. fetch.php?media=url.jpg&cache=1 //- Image file name might be one of the dynamic parts of the url, don't strip off! //- a remote url does not need to have a file extension at all //- local cached file does not have a matching file extension //Therefore get image type from the content file_put_contents($resolved_url, $image); } } } // Not remote, local image else { $resolved_url = build_url($protocol, $host, $base_path, $url); } // Check if the local file is readable if ( !is_readable($resolved_url) || !filesize($resolved_url) ) { throw new DOMPDF_Image_Exception("Image not readable or empty"); } // Check is the file is an image else { list($width, $height, $type) = dompdf_getimagesize($resolved_url, $dompdf->get_http_context()); // Known image type if ( $width && $height && in_array($type, array(IMAGETYPE_GIF, IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_BMP)) ) { //Don't put replacement image into cache - otherwise it will be deleted on cache cleanup. //Only execute on successful caching of remote image. if ( $enable_remote && $remote || $data_uri ) { self::$_cache[$full_url] = $resolved_url; } } // Unknown image type else { throw new DOMPDF_Image_Exception("Image type unknown"); } } } catch(DOMPDF_Image_Exception $e) { $resolved_url = self::$broken_image; $type = IMAGETYPE_PNG; $message = "Image not found or type unknown"; $_dompdf_warnings[] = $e->getMessage()." :: $url"; } return array($resolved_url, $type, $message); } /** * Unlink all cached images (i.e. temporary images either downloaded * or converted) */ static function clear() { if ( empty(self::$_cache) || DEBUGKEEPTEMP ) return; foreach ( self::$_cache as $file ) { if (DEBUGPNG) print "[clear unlink $file]"; unlink($file); } self::$_cache = array(); } static function detect_type($file, $context = null) { list(, , $type) = dompdf_getimagesize($file, $context); return $type; } static function type_to_ext($type) { $image_types = array( IMAGETYPE_GIF => "gif", IMAGETYPE_PNG => "png", IMAGETYPE_JPEG => "jpeg", IMAGETYPE_BMP => "bmp", ); return (isset($image_types[$type]) ? $image_types[$type] : null); } static function is_broken($url) { return $url === self::$broken_image; } } Image_Cache::$broken_image = DOMPDF_LIB_DIR . "/res/broken_image.png"; dompdf-0.6.2/include/image_frame_decorator.cls.php000066400000000000000000000037711263120276100222120ustar00rootroot00000000000000 * @author Fabien Ménager * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Decorates frames for image layout and rendering * * @access private * @package dompdf */ class Image_Frame_Decorator extends Frame_Decorator { /** * The path to the image file (note that remote images are * downloaded locally to DOMPDF_TEMP_DIR). * * @var string */ protected $_image_url; /** * The image's file error message * * @var string */ protected $_image_msg; /** * Class constructor * * @param Frame $frame the frame to decorate * @param DOMPDF $dompdf the document's dompdf object (required to resolve relative & remote urls) */ function __construct(Frame $frame, DOMPDF $dompdf) { parent::__construct($frame, $dompdf); $url = $frame->get_node()->getAttribute("src"); $debug_png = $dompdf->get_option("debug_png"); if ($debug_png) print '[__construct '.$url.']'; list($this->_image_url, /*$type*/, $this->_image_msg) = Image_Cache::resolve_url( $url, $dompdf->get_protocol(), $dompdf->get_host(), $dompdf->get_base_path(), $dompdf ); if ( Image_Cache::is_broken($this->_image_url) && $alt = $frame->get_node()->getAttribute("alt") ) { $style = $frame->get_style(); $style->width = (4/3)*Font_Metrics::get_text_width($alt, $style->font_family, $style->font_size, $style->word_spacing); $style->height = Font_Metrics::get_font_height($style->font_family, $style->font_size); } } /** * Return the image's url * * @return string The url of this image */ function get_image_url() { return $this->_image_url; } /** * Return the image's error message * * @return string The image's error message */ function get_image_msg() { return $this->_image_msg; } } dompdf-0.6.2/include/image_frame_reflower.cls.php000066400000000000000000000144521263120276100220530ustar00rootroot00000000000000 * @author Fabien Ménager * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Image reflower class * * @access private * @package dompdf */ class Image_Frame_Reflower extends Frame_Reflower { function __construct(Image_Frame_Decorator $frame) { parent::__construct($frame); } function reflow(Block_Frame_Decorator $block = null) { $this->_frame->position(); //FLOAT //$frame = $this->_frame; //$page = $frame->get_root(); //$enable_css_float = $this->get_dompdf()->get_option("enable_css_float"); //if ($enable_css_float && $frame->get_style()->float !== "none" ) { // $page->add_floating_frame($this); //} // Set the frame's width $this->get_min_max_width(); if ( $block ) { $block->add_frame_to_line($this->_frame); } } function get_min_max_width() { if (DEBUGPNG) { // Determine the image's size. Time consuming. Only when really needed? list($img_width, $img_height) = dompdf_getimagesize($this->_frame->get_image_url(), $this->get_dompdf()->get_http_context()); print "get_min_max_width() ". $this->_frame->get_style()->width.' '. $this->_frame->get_style()->height.';'. $this->_frame->get_parent()->get_style()->width." ". $this->_frame->get_parent()->get_style()->height.";". $this->_frame->get_parent()->get_parent()->get_style()->width.' '. $this->_frame->get_parent()->get_parent()->get_style()->height.';'. $img_width. ' '. $img_height.'|' ; } $style = $this->_frame->get_style(); $width_forced = true; $height_forced = true; //own style auto or invalid value: use natural size in px //own style value: ignore suffix text including unit, use given number as px //own style %: walk up parent chain until found available space in pt; fill available space // //special ignored unit: e.g. 10ex: e treated as exponent; x ignored; 10e completely invalid ->like auto $width = ($style->width > 0 ? $style->width : 0); if ( is_percent($width) ) { $t = 0.0; for ($f = $this->_frame->get_parent(); $f; $f = $f->get_parent()) { $f_style = $f->get_style(); $t = $f_style->length_in_pt($f_style->width); if ($t != 0) { break; } } $width = ((float)rtrim($width,"%") * $t)/100; //maybe 0 } elseif ( !mb_strpos($width, 'pt') ) { // Don't set image original size if "%" branch was 0 or size not given. // Otherwise aspect changed on %/auto combination for width/height // Resample according to px per inch // See also List_Bullet_Image_Frame_Decorator::__construct $width = $style->length_in_pt($width); } $height = ($style->height > 0 ? $style->height : 0); if ( is_percent($height) ) { $t = 0.0; for ($f = $this->_frame->get_parent(); $f; $f = $f->get_parent()) { $f_style = $f->get_style(); $t = $f_style->length_in_pt($f_style->height); if ($t != 0) { break; } } $height = ((float)rtrim($height,"%") * $t)/100; //maybe 0 } elseif ( !mb_strpos($height, 'pt') ) { // Don't set image original size if "%" branch was 0 or size not given. // Otherwise aspect changed on %/auto combination for width/height // Resample according to px per inch // See also List_Bullet_Image_Frame_Decorator::__construct $height = $style->length_in_pt($height); } if ($width == 0 || $height == 0) { // Determine the image's size. Time consuming. Only when really needed! list($img_width, $img_height) = dompdf_getimagesize($this->_frame->get_image_url(), $this->get_dompdf()->get_http_context()); // don't treat 0 as error. Can be downscaled or can be catched elsewhere if image not readable. // Resample according to px per inch // See also List_Bullet_Image_Frame_Decorator::__construct if ($width == 0 && $height == 0) { $dpi = $this->_frame->get_dompdf()->get_option("dpi"); $width = (float)($img_width * 72) / $dpi; $height = (float)($img_height * 72) / $dpi; $width_forced = false; $height_forced = false; } elseif ($height == 0 && $width != 0) { $height_forced = false; $height = ($width / $img_width) * $img_height; //keep aspect ratio } elseif ($width == 0 && $height != 0) { $width_forced = false; $width = ($height / $img_height) * $img_width; //keep aspect ratio } } // Handle min/max width/height if ( $style->min_width !== "none" || $style->max_width !== "none" || $style->min_height !== "none" || $style->max_height !== "none" ) { list(/*$x*/, /*$y*/, $w, $h) = $this->_frame->get_containing_block(); $min_width = $style->length_in_pt($style->min_width, $w); $max_width = $style->length_in_pt($style->max_width, $w); $min_height = $style->length_in_pt($style->min_height, $h); $max_height = $style->length_in_pt($style->max_height, $h); if ( $max_width !== "none" && $width > $max_width ) { if ( !$height_forced ) { $height *= $max_width / $width; } $width = $max_width; } if ( $min_width !== "none" && $width < $min_width ) { if ( !$height_forced ) { $height *= $min_width / $width; } $width = $min_width; } if ( $max_height !== "none" && $height > $max_height ) { if ( !$width_forced ) { $width *= $max_height / $height; } $height = $max_height; } if ( $min_height !== "none" && $height < $min_height ) { if ( !$width_forced ) { $width *= $min_height / $height; } $height = $min_height; } } if (DEBUGPNG) print $width.' '.$height.';'; $style->width = $width . "pt"; $style->height = $height . "pt"; $style->min_width = "none"; $style->max_width = "none"; $style->min_height = "none"; $style->max_height = "none"; return array( $width, $width, "min" => $width, "max" => $width); } } dompdf-0.6.2/include/image_renderer.cls.php000066400000000000000000000065611263120276100206640ustar00rootroot00000000000000 * @author Fabien Ménager * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Image renderer * * @access private * @package dompdf */ class Image_Renderer extends Block_Renderer { function render(Frame $frame) { // Render background & borders $style = $frame->get_style(); $cb = $frame->get_containing_block(); list($x, $y, $w, $h) = $frame->get_border_box(); $this->_set_opacity( $frame->get_opacity( $style->opacity ) ); list($tl, $tr, $br, $bl) = $style->get_computed_border_radius($w, $h); $has_border_radius = $tl + $tr + $br + $bl > 0; if ( $has_border_radius ) { $this->_canvas->clipping_roundrectangle( $x, $y, $w, $h, $tl, $tr, $br, $bl ); } if ( ($bg = $style->background_color) !== "transparent" ) { $this->_canvas->filled_rectangle($x, $y, $w, $h, $bg); } if ( ($url = $style->background_image) && $url !== "none" ) { $this->_background_image($url, $x, $y, $w, $h, $style); } if ( $has_border_radius ) { $this->_canvas->clipping_end(); } $this->_render_border($frame); $this->_render_outline($frame); list($x, $y) = $frame->get_padding_box(); $x += $style->length_in_pt($style->padding_left, $cb["w"]); $y += $style->length_in_pt($style->padding_top, $cb["h"]); $w = $style->length_in_pt($style->width, $cb["w"]); $h = $style->length_in_pt($style->height, $cb["h"]); if ( $has_border_radius ) { list($wt, $wr, $wb, $wl) = array( $style->border_top_width, $style->border_right_width, $style->border_bottom_width, $style->border_left_width, ); // we have to get the "inner" radius if ( $tl > 0 ) { $tl -= ($wt + $wl) / 2; } if ( $tr > 0 ) { $tr -= ($wt + $wr) / 2; } if ( $br > 0 ) { $br -= ($wb + $wr) / 2; } if ( $bl > 0 ) { $bl -= ($wb + $wl) / 2; } $this->_canvas->clipping_roundrectangle( $x, $y, $w, $h, $tl, $tr, $br, $bl ); } $src = $frame->get_image_url(); $alt = null; if ( Image_Cache::is_broken($src) && $alt = $frame->get_node()->getAttribute("alt") ) { $font = $style->font_family; $size = $style->font_size; $spacing = $style->word_spacing; $this->_canvas->text($x, $y, $alt, $font, $size, $style->color, $spacing); } else { $this->_canvas->image( $src, $x, $y, $w, $h, $style->image_resolution); } if ( $has_border_radius ) { $this->_canvas->clipping_end(); } if ( $msg = $frame->get_image_msg() ) { $parts = preg_split("/\s*\n\s*/", $msg); $height = 10; $_y = $alt ? $y+$h-count($parts)*$height : $y; foreach($parts as $i => $_part) { $this->_canvas->text($x, $_y + $i*$height, $_part, "times", $height*0.8, array(0.5, 0.5, 0.5)); } } if (DEBUG_LAYOUT && DEBUG_LAYOUT_BLOCKS) { $this->_debug_layout($frame->get_border_box(), "blue"); if (DEBUG_LAYOUT_PADDINGBOX) { $this->_debug_layout($frame->get_padding_box(), "blue", array(0.5, 0.5)); } } } } dompdf-0.6.2/include/inline_frame_decorator.cls.php000066400000000000000000000044521263120276100224030ustar00rootroot00000000000000 * @author Helmut Tischer * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Decorates frames for inline layout * * @access private * @package dompdf */ class Inline_Frame_Decorator extends Frame_Decorator { function __construct(Frame $frame, DOMPDF $dompdf) { parent::__construct($frame, $dompdf); } function split(Frame $frame = null, $force_pagebreak = false) { if ( is_null($frame) ) { $this->get_parent()->split($this, $force_pagebreak); return; } if ( $frame->get_parent() !== $this ) throw new DOMPDF_Exception("Unable to split: frame is not a child of this one."); $split = $this->copy( $this->_frame->get_node()->cloneNode() ); $this->get_parent()->insert_child_after($split, $this); // Unset the current node's right style properties $style = $this->_frame->get_style(); $style->margin_right = 0; $style->padding_right = 0; $style->border_right_width = 0; // Unset the split node's left style properties since we don't want them // to propagate $style = $split->get_style(); $style->margin_left = 0; $style->padding_left = 0; $style->border_left_width = 0; //On continuation of inline element on next line, //don't repeat non-vertically repeatble background images //See e.g. in testcase image_variants, long desriptions if ( ($url = $style->background_image) && $url !== "none" && ($repeat = $style->background_repeat) && $repeat !== "repeat" && $repeat !== "repeat-y" ) { $style->background_image = "none"; } // Add $frame and all following siblings to the new split node $iter = $frame; while ($iter) { $frame = $iter; $iter = $iter->get_next_sibling(); $frame->reset(); $split->append_child($frame); } $page_breaks = array("always", "left", "right"); $frame_style = $frame->get_style(); if( $force_pagebreak || in_array($frame_style->page_break_before, $page_breaks) || in_array($frame_style->page_break_after, $page_breaks) ) { $this->get_parent()->split($split, true); } } } dompdf-0.6.2/include/inline_frame_reflower.cls.php000066400000000000000000000035331263120276100222450ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Reflows inline frames * * @access private * @package dompdf */ class Inline_Frame_Reflower extends Frame_Reflower { function __construct(Frame $frame) { parent::__construct($frame); } //........................................................................ function reflow(Block_Frame_Decorator $block = null) { $frame = $this->_frame; // Check if a page break is forced $page = $frame->get_root(); $page->check_forced_page_break($frame); if ( $page->is_full() ) return; $style = $frame->get_style(); // Generated content $this->_set_content(); $frame->position(); $cb = $frame->get_containing_block(); // Add our margin, padding & border to the first and last children if ( ($f = $frame->get_first_child()) && $f instanceof Text_Frame_Decorator ) { $f_style = $f->get_style(); $f_style->margin_left = $style->margin_left; $f_style->padding_left = $style->padding_left; $f_style->border_left = $style->border_left; } if ( ($l = $frame->get_last_child()) && $l instanceof Text_Frame_Decorator ) { $l_style = $l->get_style(); $l_style->margin_right = $style->margin_right; $l_style->padding_right = $style->padding_right; $l_style->border_right = $style->border_right; } if ( $block ) { $block->add_frame_to_line($this->_frame); } // Set the containing blocks and reflow each child. The containing // block is not changed by line boxes. foreach ( $frame->get_children() as $child ) { $child->set_containing_block($cb); $child->reflow($block); } } } dompdf-0.6.2/include/inline_positioner.cls.php000066400000000000000000000035621263120276100214430ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Positions inline frames * * @access private * @package dompdf */ class Inline_Positioner extends Positioner { function __construct(Frame_Decorator $frame) { parent::__construct($frame); } //........................................................................ function position() { /** * Find our nearest block level parent and access its lines property. * @var Block_Frame_Decorator */ $p = $this->_frame->find_block_parent(); // Debugging code: // pre_r("\nPositioning:"); // pre_r("Me: " . $this->_frame->get_node()->nodeName . " (" . spl_object_hash($this->_frame->get_node()) . ")"); // pre_r("Parent: " . $p->get_node()->nodeName . " (" . spl_object_hash($p->get_node()) . ")"); // End debugging if ( !$p ) throw new DOMPDF_Exception("No block-level parent found. Not good."); $f = $this->_frame; $cb = $f->get_containing_block(); $line = $p->get_current_line_box(); // Skip the page break if in a fixed position element $is_fixed = false; while($f = $f->get_parent()) { if($f->get_style()->position === "fixed") { $is_fixed = true; break; } } $f = $this->_frame; if ( !$is_fixed && $f->get_parent() && $f->get_parent() instanceof Inline_Frame_Decorator && $f->is_text_node() ) { $min_max = $f->get_reflower()->get_min_max_width(); // If the frame doesn't fit in the current line, a line break occurs if ( $min_max["min"] > ($cb["w"] - $line->left - $line->w - $line->right) ) { $p->add_line(); } } $f->set_position($cb["x"] + $line->w, $line->y); } } dompdf-0.6.2/include/inline_renderer.cls.php000066400000000000000000000164411263120276100210560ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Renders inline frames * * @access private * @package dompdf */ class Inline_Renderer extends Abstract_Renderer { //........................................................................ function render(Frame $frame) { $style = $frame->get_style(); if ( !$frame->get_first_child() ) return; // No children, no service // Draw the left border if applicable $bp = $style->get_border_properties(); $widths = array($style->length_in_pt($bp["top"]["width"]), $style->length_in_pt($bp["right"]["width"]), $style->length_in_pt($bp["bottom"]["width"]), $style->length_in_pt($bp["left"]["width"])); // Draw the background & border behind each child. To do this we need // to figure out just how much space each child takes: list($x, $y) = $frame->get_first_child()->get_position(); $w = null; $h = 0; // $x += $widths[3]; // $y += $widths[0]; $this->_set_opacity( $frame->get_opacity( $style->opacity ) ); $first_row = true; foreach ($frame->get_children() as $child) { list($child_x, $child_y, $child_w, $child_h) = $child->get_padding_box(); if ( !is_null($w) && $child_x < $x + $w ) { //This branch seems to be supposed to being called on the first part //of an inline html element, and the part after the if clause for the //parts after a line break. //But because $w initially mostly is 0, and gets updated only on the next //round, this seem to be never executed and the common close always. // The next child is on another line. Draw the background & // borders on this line. // Background: if ( ($bg = $style->background_color) !== "transparent" ) $this->_canvas->filled_rectangle( $x, $y, $w, $h, $bg); if ( ($url = $style->background_image) && $url !== "none" ) { $this->_background_image($url, $x, $y, $w, $h, $style); } // If this is the first row, draw the left border if ( $first_row ) { if ( $bp["left"]["style"] !== "none" && $bp["left"]["color"] !== "transparent" && $bp["left"]["width"] > 0 ) { $method = "_border_" . $bp["left"]["style"]; $this->$method($x, $y, $h + $widths[0] + $widths[2], $bp["left"]["color"], $widths, "left"); } $first_row = false; } // Draw the top & bottom borders if ( $bp["top"]["style"] !== "none" && $bp["top"]["color"] !== "transparent" && $bp["top"]["width"] > 0 ) { $method = "_border_" . $bp["top"]["style"]; $this->$method($x, $y, $w + $widths[1] + $widths[3], $bp["top"]["color"], $widths, "top"); } if ( $bp["bottom"]["style"] !== "none" && $bp["bottom"]["color"] !== "transparent" && $bp["bottom"]["width"] > 0 ) { $method = "_border_" . $bp["bottom"]["style"]; $this->$method($x, $y + $h + $widths[0] + $widths[2], $w + $widths[1] + $widths[3], $bp["bottom"]["color"], $widths, "bottom"); } // Handle anchors & links $link_node = null; if ( $frame->get_node()->nodeName === "a" ) { $link_node = $frame->get_node(); } else if ( $frame->get_parent()->get_node()->nodeName === "a" ){ $link_node = $frame->get_parent()->get_node(); } if ( $link_node && $href = $link_node->getAttribute("href") ) { $this->_canvas->add_link($href, $x, $y, $w, $h); } $x = $child_x; $y = $child_y; $w = $child_w; $h = $child_h; continue; } if ( is_null($w) ) $w = $child_w; else $w += $child_w; $h = max($h, $child_h); if (DEBUG_LAYOUT && DEBUG_LAYOUT_INLINE) { $this->_debug_layout($child->get_border_box(), "blue"); if (DEBUG_LAYOUT_PADDINGBOX) { $this->_debug_layout($child->get_padding_box(), "blue", array(0.5, 0.5)); } } } // Handle the last child if ( ($bg = $style->background_color) !== "transparent" ) $this->_canvas->filled_rectangle( $x + $widths[3], $y + $widths[0], $w, $h, $bg); //On continuation lines (after line break) of inline elements, the style got copied. //But a non repeatable background image should not be repeated on the next line. //But removing the background image above has never an effect, and removing it below //removes it always, even on the initial line. //Need to handle it elsewhere, e.g. on certain ...clone()... usages. // Repeat not given: default is Style::__construct // ... && (!($repeat = $style->background_repeat) || $repeat === "repeat" ... //different position? $this->_background_image($url, $x, $y, $w, $h, $style); if ( ($url = $style->background_image) && $url !== "none" ) $this->_background_image($url, $x + $widths[3], $y + $widths[0], $w, $h, $style); // Add the border widths $w += $widths[1] + $widths[3]; $h += $widths[0] + $widths[2]; // make sure the border and background start inside the left margin $left_margin = $style->length_in_pt($style->margin_left); $x += $left_margin; // If this is the first row, draw the left border too if ( $first_row && $bp["left"]["style"] !== "none" && $bp["left"]["color"] !== "transparent" && $widths[3] > 0 ) { $method = "_border_" . $bp["left"]["style"]; $this->$method($x, $y, $h, $bp["left"]["color"], $widths, "left"); } // Draw the top & bottom borders if ( $bp["top"]["style"] !== "none" && $bp["top"]["color"] !== "transparent" && $widths[0] > 0 ) { $method = "_border_" . $bp["top"]["style"]; $this->$method($x, $y, $w, $bp["top"]["color"], $widths, "top"); } if ( $bp["bottom"]["style"] !== "none" && $bp["bottom"]["color"] !== "transparent" && $widths[2] > 0 ) { $method = "_border_" . $bp["bottom"]["style"]; $this->$method($x, $y + $h, $w, $bp["bottom"]["color"], $widths, "bottom"); } // pre_var_dump(get_class($frame->get_next_sibling())); // $last_row = get_class($frame->get_next_sibling()) !== 'Inline_Frame_Decorator'; // Draw the right border if this is the last row if ( $bp["right"]["style"] !== "none" && $bp["right"]["color"] !== "transparent" && $widths[1] > 0 ) { $method = "_border_" . $bp["right"]["style"]; $this->$method($x + $w, $y, $h, $bp["right"]["color"], $widths, "right"); } // Only two levels of links frames $link_node = null; if ( $frame->get_node()->nodeName === "a" ) { $link_node = $frame->get_node(); if ( ($name = $link_node->getAttribute("name")) || ($name = $link_node->getAttribute("id")) ) { $this->_canvas->add_named_dest($name); } } if ( $frame->get_parent() && $frame->get_parent()->get_node()->nodeName === "a" ){ $link_node = $frame->get_parent()->get_node(); } // Handle anchors & links if ( $link_node ) { if ( $href = $link_node->getAttribute("href") ) $this->_canvas->add_link($href, $x, $y, $w, $h); } } } dompdf-0.6.2/include/javascript_embedder.cls.php000066400000000000000000000013341263120276100217020ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Embeds Javascript into the PDF document * * @access private * @package dompdf */ class Javascript_Embedder { /** * @var DOMPDF */ protected $_dompdf; function __construct(DOMPDF $dompdf) { $this->_dompdf = $dompdf; } function insert($script) { $this->_dompdf->get_canvas()->javascript($script); } function render(Frame $frame) { if ( !$this->_dompdf->get_option("enable_javascript") ) { return; } $this->insert($frame->get_node()->nodeValue); } } dompdf-0.6.2/include/line_box.cls.php000066400000000000000000000117341263120276100175110ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * The line box class * * This class represents a line box * http://www.w3.org/TR/CSS2/visuren.html#line-box * * @access protected * @package dompdf */ class Line_Box { /** * @var Block_Frame_Decorator */ protected $_block_frame; /** * @var Frame[] */ protected $_frames = array(); /** * @var integer */ public $wc = 0; /** * @var float */ public $y = null; /** * @var float */ public $w = 0.0; /** * @var float */ public $h = 0.0; /** * @var float */ public $left = 0.0; /** * @var float */ public $right = 0.0; /** * @var Frame */ public $tallest_frame = null; /** * @var bool[] */ public $floating_blocks = array(); /** * @var bool */ public $br = false; /** * Class constructor * * @param Block_Frame_Decorator $frame the Block_Frame_Decorator containing this line */ function __construct(Block_Frame_Decorator $frame, $y = 0) { $this->_block_frame = $frame; $this->_frames = array(); $this->y = $y; $this->get_float_offsets(); } /** * Returns the floating elements inside the first floating parent * * @param Page_Frame_Decorator $root * * @return Frame[] */ function get_floats_inside(Page_Frame_Decorator $root) { $floating_frames = $root->get_floating_frames(); if ( count($floating_frames) == 0 ) { return $floating_frames; } // Find nearest floating element $p = $this->_block_frame; while( $p->get_style()->float === "none" ) { $parent = $p->get_parent(); if ( !$parent ) { break; } $p = $parent; } if ( $p == $root ) { return $floating_frames; } $parent = $p; $childs = array(); foreach ($floating_frames as $_floating) { $p = $_floating->get_parent(); while (($p = $p->get_parent()) && $p !== $parent); if ( $p ) { $childs[] = $p; } } return $childs; } function get_float_offsets() { $enable_css_float = $this->_block_frame->get_dompdf()->get_option("enable_css_float"); if ( !$enable_css_float ) { return; } static $anti_infinite_loop = 500; // FIXME smelly hack $reflower = $this->_block_frame->get_reflower(); if ( !$reflower ) { return; } $cb_w = null; $block = $this->_block_frame; $root = $block->get_root(); if ( !$root ) { return; } $floating_frames = $this->get_floats_inside($root); foreach ( $floating_frames as $child_key => $floating_frame ) { $id = $floating_frame->get_id(); if ( isset($this->floating_blocks[$id]) ) { continue; } $floating_style = $floating_frame->get_style(); $float = $floating_style->float; $floating_width = $floating_frame->get_margin_width(); if (!$cb_w) { $cb_w = $floating_frame->get_containing_block("w"); } $line_w = $this->get_width(); if ( !$floating_frame->_float_next_line && ($cb_w <= $line_w + $floating_width) && ($cb_w > $line_w) ) { $floating_frame->_float_next_line = true; continue; } // If the child is still shifted by the floating element if ( $anti_infinite_loop-- > 0 && $floating_frame->get_position("y") + $floating_frame->get_margin_height() > $this->y && $block->get_position("x") + $block->get_margin_width() > $floating_frame->get_position("x") ) { if ( $float === "left" ) $this->left += $floating_width; else $this->right += $floating_width; $this->floating_blocks[$id] = true; } // else, the floating element won't shift anymore else { $root->remove_floating_frame($child_key); } } } /** * @return float */ function get_width(){ return $this->left + $this->w + $this->right; } /** * @return Block_Frame_Decorator */ function get_block_frame() { return $this->_block_frame; } /** * @return Frame[] */ function &get_frames() { return $this->_frames; } /** * @param Frame $frame */ function add_frame(Frame $frame) { $this->_frames[] = $frame; } function __toString(){ $props = array("wc", "y", "w", "h", "left", "right", "br"); $s = ""; foreach($props as $prop) { $s .= "$prop: ".$this->$prop."\n"; } $s .= count($this->_frames)." frames\n"; return $s; } /*function __get($prop) { if (!isset($this->{"_$prop"})) return; return $this->{"_$prop"}; }*/ } /* class LineBoxList implements Iterator { private $_p = 0; private $_lines = array(); } */ dompdf-0.6.2/include/list_bullet_frame_decorator.cls.php000066400000000000000000000040101263120276100234350ustar00rootroot00000000000000 * @author Helmut Tischer * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Decorates frames for list bullet rendering * * @access private * @package dompdf */ class List_Bullet_Frame_Decorator extends Frame_Decorator { const BULLET_PADDING = 1; // Distance from bullet to text in pt // As fraction of font size (including descent). See also DECO_THICKNESS. const BULLET_THICKNESS = 0.04; // Thickness of bullet outline. Screen: 0.08, print: better less, e.g. 0.04 const BULLET_DESCENT = 0.3; //descent of font below baseline. Todo: Guessed for now. const BULLET_SIZE = 0.35; // bullet diameter. For now 0.5 of font_size without descent. static $BULLET_TYPES = array("disc", "circle", "square"); //........................................................................ function __construct(Frame $frame, DOMPDF $dompdf) { parent::__construct($frame, $dompdf); } function get_margin_width() { $style = $this->_frame->get_style(); // Small hack to prevent extra indenting of list text on list_style_position === "inside" // and on suppressed bullet if ( $style->list_style_position === "outside" || $style->list_style_type === "none" ) { return 0; } return $style->get_font_size() * self::BULLET_SIZE + 2 * self::BULLET_PADDING; } //hits only on "inset" lists items, to increase height of box function get_margin_height() { $style = $this->_frame->get_style(); if ( $style->list_style_type === "none" ) { return 0; } return $style->get_font_size() * self::BULLET_SIZE + 2 * self::BULLET_PADDING; } function get_width() { return $this->get_margin_height(); } function get_height() { return $this->get_margin_height(); } //........................................................................ } dompdf-0.6.2/include/list_bullet_frame_reflower.cls.php000066400000000000000000000015151263120276100233070ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Reflows list bullets * * @access private * @package dompdf */ class List_Bullet_Frame_Reflower extends Frame_Reflower { function __construct(Frame_Decorator $frame) { parent::__construct($frame); } //........................................................................ function reflow(Block_Frame_Decorator $block = null) { $style = $this->_frame->get_style(); $style->width = $this->_frame->get_width(); $this->_frame->position(); if ( $style->list_style_position === "inside" ) { $p = $this->_frame->find_block_parent(); $p->add_frame_to_line($this->_frame); } } } dompdf-0.6.2/include/list_bullet_image_frame_decorator.cls.php000066400000000000000000000107331263120276100246100ustar00rootroot00000000000000 * @author Helmut Tischer * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Decorates frames for list bullets with custom images * * @access private * @package dompdf */ class List_Bullet_Image_Frame_Decorator extends Frame_Decorator { /** * The underlying image frame * * @var Image_Frame_Decorator */ protected $_img; /** * The image's width in pixels * * @var int */ protected $_width; /** * The image's height in pixels * * @var int */ protected $_height; /** * Class constructor * * @param Frame $frame the bullet frame to decorate * @param DOMPDF $dompdf the document's dompdf object */ function __construct(Frame $frame, DOMPDF $dompdf) { $style = $frame->get_style(); $url = $style->list_style_image; $frame->get_node()->setAttribute("src", $url); $this->_img = new Image_Frame_Decorator($frame, $dompdf); parent::__construct($this->_img, $dompdf); list($width, $height) = dompdf_getimagesize($this->_img->get_image_url(), $dompdf->get_http_context()); // Resample the bullet image to be consistent with 'auto' sized images // See also Image_Frame_Reflower::get_min_max_width // Tested php ver: value measured in px, suffix "px" not in value: rtrim unnecessary. $dpi = $this->_dompdf->get_option("dpi"); $this->_width = ((float)rtrim($width, "px") * 72) / $dpi; $this->_height = ((float)rtrim($height, "px") * 72) / $dpi; //If an image is taller as the containing block/box, the box should be extended. //Neighbour elements are overwriting the overlapping image areas. //Todo: Where can the box size be extended? //Code below has no effect. //See block_frame_reflower _calculate_restricted_height //See generated_frame_reflower, Dompdf:render() "list-item", "-dompdf-list-bullet"S. //Leave for now //if ($style->min_height < $this->_height ) { // $style->min_height = $this->_height; //} //$style->height = "auto"; } /** * Return the bullet's width * * @return int */ function get_width() { //ignore image width, use same width as on predefined bullet List_Bullet_Frame_Decorator //for proper alignment of bullet image and text. Allow image to not fitting on left border. //This controls the distance between bullet image and text //return $this->_width; return $this->_frame->get_style()->get_font_size()*List_Bullet_Frame_Decorator::BULLET_SIZE + 2 * List_Bullet_Frame_Decorator::BULLET_PADDING; } /** * Return the bullet's height * * @return int */ function get_height() { //based on image height return $this->_height; } /** * Override get_margin_width * * @return int */ function get_margin_width() { //ignore image width, use same width as on predefined bullet List_Bullet_Frame_Decorator //for proper alignment of bullet image and text. Allow image to not fitting on left border. //This controls the extra indentation of text to make room for the bullet image. //Here use actual image size, not predefined bullet size //return $this->_frame->get_style()->get_font_size()*List_Bullet_Frame_Decorator::BULLET_SIZE + // 2 * List_Bullet_Frame_Decorator::BULLET_PADDING; // Small hack to prevent indenting of list text // Image Might not exist, then position like on list_bullet_frame_decorator fallback to none. if ( $this->_frame->get_style()->list_style_position === "outside" || $this->_width == 0) return 0; //This aligns the "inside" image position with the text. //The text starts to the right of the image. //Between the image and the text there is an added margin of image width. //Where this comes from is unknown. //The corresponding List_Bullet_Frame_Decorator sets a smaller margin. bullet size? return $this->_width + 2 * List_Bullet_Frame_Decorator::BULLET_PADDING; } /** * Override get_margin_height() * * @return int */ function get_margin_height() { //Hits only on "inset" lists items, to increase height of box //based on image height return $this->_height + 2 * List_Bullet_Frame_Decorator::BULLET_PADDING; } /** * Return image url * * @return string */ function get_image_url() { return $this->_img->get_image_url(); } } dompdf-0.6.2/include/list_bullet_positioner.cls.php000066400000000000000000000051141263120276100225020ustar00rootroot00000000000000 * @author Helmut Tischer * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Positions list bullets * * @access private * @package dompdf */ class List_Bullet_Positioner extends Positioner { function __construct(Frame_Decorator $frame) { parent::__construct($frame); } //........................................................................ function position() { // Bullets & friends are positioned an absolute distance to the left of // the content edge of their parent element $cb = $this->_frame->get_containing_block(); // Note: this differs from most frames in that we must position // ourselves after determining our width $x = $cb["x"] - $this->_frame->get_width(); $p = $this->_frame->find_block_parent(); $y = $p->get_current_line_box()->y; // This is a bit of a hack... $n = $this->_frame->get_next_sibling(); if ( $n ) { $style = $n->get_style(); $line_height = $style->length_in_pt($style->line_height, $style->get_font_size()); $offset = $style->length_in_pt($line_height, $n->get_containing_block("h")) - $this->_frame->get_height(); $y += $offset / 2; } // Now the position is the left top of the block which should be marked with the bullet. // We tried to find out the y of the start of the first text character within the block. // But the top margin/padding does not fit, neither from this nor from the next sibling // The "bit of a hack" above does not work also. // Instead let's position the bullet vertically centered to the block which should be marked. // But for get_next_sibling() the get_containing_block is all zero, and for find_block_parent() // the get_containing_block is paper width and the entire list as height. // if ($p) { // //$cb = $n->get_containing_block(); // $cb = $p->get_containing_block(); // $y += $cb["h"]/2; // print 'cb:'.$cb["x"].':'.$cb["y"].':'.$cb["w"].':'.$cb["h"].':'; // } // Todo: // For now give up on the above. Use Guesswork with font y-pos in the middle of the line spacing /*$style = $p->get_style(); $font_size = $style->get_font_size(); $line_height = $style->length_in_pt($style->line_height, $font_size); $y += ($line_height - $font_size) / 2; */ //Position is x-end y-top of character position of the bullet. $this->_frame->set_position($x, $y); } } dompdf-0.6.2/include/list_bullet_renderer.cls.php000066400000000000000000000145241263120276100221220ustar00rootroot00000000000000 * @author Helmut Tischer * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Renders list bullets * * @access private * @package dompdf */ class List_Bullet_Renderer extends Abstract_Renderer { static function get_counter_chars($type) { static $cache = array(); if ( isset($cache[$type]) ) { return $cache[$type]; } $uppercase = false; $text = ""; switch ($type) { case "decimal-leading-zero": case "decimal": case "1": return "0123456789"; case "upper-alpha": case "upper-latin": case "A": $uppercase = true; case "lower-alpha": case "lower-latin": case "a": $text = "abcdefghijklmnopqrstuvwxyz"; break; case "upper-roman": case "I": $uppercase = true; case "lower-roman": case "i": $text = "ivxlcdm"; break; case "lower-greek": for($i = 0; $i < 24; $i++) { $text .= unichr($i+944); } break; } if ( $uppercase ) { $text = strtoupper($text); } return $cache[$type] = "$text."; } /** * @param integer $n * @param string $type * @param integer $pad * * @return string */ private function make_counter($n, $type, $pad = null){ $n = intval($n); $text = ""; $uppercase = false; switch ($type) { case "decimal-leading-zero": case "decimal": case "1": if ($pad) $text = str_pad($n, $pad, "0", STR_PAD_LEFT); else $text = $n; break; case "upper-alpha": case "upper-latin": case "A": $uppercase = true; case "lower-alpha": case "lower-latin": case "a": $text = chr( ($n % 26) + ord('a') - 1); break; case "upper-roman": case "I": $uppercase = true; case "lower-roman": case "i": $text = dec2roman($n); break; case "lower-greek": $text = unichr($n + 944); break; } if ( $uppercase ) { $text = strtoupper($text); } return "$text."; } function render(Frame $frame) { $style = $frame->get_style(); $font_size = $style->get_font_size(); $line_height = $style->length_in_pt($style->line_height, $frame->get_containing_block("w")); $this->_set_opacity( $frame->get_opacity( $style->opacity ) ); $li = $frame->get_parent(); // Don't render bullets twice if if was split if ($li->_splitted) { return; } // Handle list-style-image // If list style image is requested but missing, fall back to predefined types if ( $style->list_style_image !== "none" && !Image_Cache::is_broken($img = $frame->get_image_url())) { list($x,$y) = $frame->get_position(); //For expected size and aspect, instead of box size, use image natural size scaled to DPI. // Resample the bullet image to be consistent with 'auto' sized images // See also Image_Frame_Reflower::get_min_max_width // Tested php ver: value measured in px, suffix "px" not in value: rtrim unnecessary. //$w = $frame->get_width(); //$h = $frame->get_height(); list($width, $height) = dompdf_getimagesize($img, $this->_dompdf->get_http_context()); $dpi = $this->_dompdf->get_option("dpi"); $w = ((float)rtrim($width, "px") * 72) / $dpi; $h = ((float)rtrim($height, "px") * 72) / $dpi; $x -= $w; $y -= ($line_height - $font_size)/2; //Reverse hinting of list_bullet_positioner $this->_canvas->image( $img, $x, $y, $w, $h); } else { $bullet_style = $style->list_style_type; $fill = false; switch ($bullet_style) { default: case "disc": $fill = true; case "circle": list($x,$y) = $frame->get_position(); $r = ($font_size*(List_Bullet_Frame_Decorator::BULLET_SIZE /*-List_Bullet_Frame_Decorator::BULLET_THICKNESS*/ ))/2; $x -= $font_size*(List_Bullet_Frame_Decorator::BULLET_SIZE/2); $y += ($font_size*(1-List_Bullet_Frame_Decorator::BULLET_DESCENT))/2; $o = $font_size*List_Bullet_Frame_Decorator::BULLET_THICKNESS; $this->_canvas->circle($x, $y, $r, $style->color, $o, null, $fill); break; case "square": list($x, $y) = $frame->get_position(); $w = $font_size*List_Bullet_Frame_Decorator::BULLET_SIZE; $x -= $w; $y += ($font_size*(1-List_Bullet_Frame_Decorator::BULLET_DESCENT-List_Bullet_Frame_Decorator::BULLET_SIZE))/2; $this->_canvas->filled_rectangle($x, $y, $w, $w, $style->color); break; case "decimal-leading-zero": case "decimal": case "lower-alpha": case "lower-latin": case "lower-roman": case "lower-greek": case "upper-alpha": case "upper-latin": case "upper-roman": case "1": // HTML 4.0 compatibility case "a": case "i": case "A": case "I": $pad = null; if ( $bullet_style === "decimal-leading-zero" ) { $pad = strlen($li->get_parent()->get_node()->getAttribute("dompdf-children-count")); } $node = $frame->get_node(); if ( !$node->hasAttribute("dompdf-counter") ) { return; } $index = $node->getAttribute("dompdf-counter"); $text = $this->make_counter($index, $bullet_style, $pad); if ( trim($text) == "" ) { return; } $spacing = 0; $font_family = $style->font_family; $line = $li->get_containing_line(); list($x, $y) = array($frame->get_position("x"), $line->y); $x -= Font_Metrics::get_text_width($text, $font_family, $font_size, $spacing); // Take line-height into account $line_height = $style->line_height; $y += ($line_height - $font_size) / 4; // FIXME I thought it should be 2, but 4 gives better results $this->_canvas->text($x, $y, $text, $font_family, $font_size, $style->color, $spacing); case "none": break; } } } } dompdf-0.6.2/include/null_frame_decorator.cls.php000066400000000000000000000011001263120276100220620ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Dummy decorator * * @access private * @package dompdf */ class Null_Frame_Decorator extends Frame_Decorator { function __construct(Frame $frame, DOMPDF $dompdf) { parent::__construct($frame, $dompdf); $style = $this->_frame->get_style(); $style->width = 0; $style->height = 0; $style->margin = 0; $style->padding = 0; } } dompdf-0.6.2/include/null_frame_reflower.cls.php000066400000000000000000000007331263120276100217400ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Dummy reflower * * @access private * @package dompdf */ class Null_Frame_Reflower extends Frame_Reflower { function __construct(Frame $frame) { parent::__construct($frame); } function reflow(Block_Frame_Decorator $block = null) { return; } } dompdf-0.6.2/include/null_positioner.cls.php000066400000000000000000000007041263120276100211320ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Dummy positioner * * @access private * @package dompdf */ class Null_Positioner extends Positioner { function __construct(Frame_Decorator $frame) { parent::__construct($frame); } function position() { return; } } dompdf-0.6.2/include/page_cache.cls.php000066400000000000000000000073671263120276100177600ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Caches individual rendered PDF pages * * Not totally implemented yet. Use at your own risk ;) * * @access private * @package dompdf * @static */ class Page_Cache { const DB_USER = "dompdf_page_cache"; const DB_PASS = "some meaningful password"; const DB_NAME = "dompdf_page_cache"; static private $__connection = null; static function init() { if ( is_null(self::$__connection) ) { $con_str = "host=" . DB_HOST . " dbname=" . self::DB_NAME . " user=" . self::DB_USER . " password=" . self::DB_PASS; if ( !self::$__connection = pg_connect($con_str) ) throw new Exception("Database connection failed."); } } function __construct() { throw new Exception("Can not create instance of Page_Class. Class is static."); } private static function __query($sql) { if ( !($res = pg_query(self::$__connection, $sql)) ) throw new Exception(pg_last_error(self::$__connection)); return $res; } static function store_page($id, $page_num, $data) { $where = "WHERE id='" . pg_escape_string($id) . "' AND ". "page_num=". pg_escape_string($page_num); $res = self::__query("SELECT timestamp FROM page_cache ". $where); $row = pg_fetch_assoc($res); if ( $row ) self::__query("UPDATE page_cache SET data='" . pg_escape_string($data) . "' " . $where); else self::__query("INSERT INTO page_cache (id, page_num, data) VALUES ('" . pg_escape_string($id) . "', ". pg_escape_string($page_num) . ", ". "'". pg_escape_string($data) . "')"); } static function store_fonts($id, $fonts) { self::__query("BEGIN"); // Update the font information self::__query("DELETE FROM page_fonts WHERE id='" . pg_escape_string($id) . "'"); foreach (array_keys($fonts) as $font) self::__query("INSERT INTO page_fonts (id, font_name) VALUES ('" . pg_escape_string($id) . "', '" . pg_escape_string($font) . "')"); self::__query("COMMIT"); } // static function retrieve_page($id, $page_num) { // $res = self::__query("SELECT data FROM page_cache WHERE id='" . pg_escape_string($id) . "' AND ". // "page_num=". pg_escape_string($page_num)); // $row = pg_fetch_assoc($res); // return pg_unescape_bytea($row["data"]); // } static function get_page_timestamp($id, $page_num) { $res = self::__query("SELECT timestamp FROM page_cache WHERE id='" . pg_escape_string($id) . "' AND ". "page_num=". pg_escape_string($page_num)); $row = pg_fetch_assoc($res); return $row["timestamp"]; } // Adds the cached document referenced by $id to the provided pdf static function insert_cached_document(CPDF_Adapter $pdf, $id, $new_page = true) { $res = self::__query("SELECT font_name FROM page_fonts WHERE id='" . pg_escape_string($id) . "'"); // Ensure that the fonts needed by the cached document are loaded into // the pdf while ($row = pg_fetch_assoc($res)) $pdf->get_cpdf()->selectFont($row["font_name"]); $res = self::__query("SELECT data FROM page_cache WHERE id='" . pg_escape_string($id) . "'"); if ( $new_page ) $pdf->new_page(); $first = true; while ($row = pg_fetch_assoc($res)) { if ( !$first ) $pdf->new_page(); else $first = false; $page = $pdf->reopen_serialized_object($row["data"]); //$pdf->close_object(); $pdf->add_object($page, "add"); } } } Page_Cache::init(); dompdf-0.6.2/include/page_frame_decorator.cls.php000066400000000000000000000414301263120276100220360ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Decorates frames for page layout * * @access private * @package dompdf */ class Page_Frame_Decorator extends Frame_Decorator { /** * y value of bottom page margin * * @var float */ protected $_bottom_page_margin; /** * Flag indicating page is full. * * @var bool */ protected $_page_full; /** * Number of tables currently being reflowed * * @var int */ protected $_in_table; /** * The pdf renderer * * @var Renderer */ protected $_renderer; /** * This page's floating frames * * @var array */ protected $_floating_frames = array(); //........................................................................ /** * Class constructor * * @param Frame $frame the frame to decorate * @param DOMPDF $dompdf */ function __construct(Frame $frame, DOMPDF $dompdf) { parent::__construct($frame, $dompdf); $this->_page_full = false; $this->_in_table = 0; $this->_bottom_page_margin = null; } /** * Set the renderer used for this pdf * * @param Renderer $renderer the renderer to use */ function set_renderer($renderer) { $this->_renderer = $renderer; } /** * Return the renderer used for this pdf * * @return Renderer */ function get_renderer() { return $this->_renderer; } /** * Set the frame's containing block. Overridden to set $this->_bottom_page_margin. * * @param float $x * @param float $y * @param float $w * @param float $h */ function set_containing_block($x = null, $y = null, $w = null, $h = null) { parent::set_containing_block($x,$y,$w,$h); //$w = $this->get_containing_block("w"); if ( isset($h) ) $this->_bottom_page_margin = $h; // - $this->_frame->get_style()->length_in_pt($this->_frame->get_style()->margin_bottom, $w); } /** * Returns true if the page is full and is no longer accepting frames. * * @return bool */ function is_full() { return $this->_page_full; } /** * Start a new page by resetting the full flag. */ function next_page() { $this->_floating_frames = array(); $this->_renderer->new_page(); $this->_page_full = false; } /** * Indicate to the page that a table is currently being reflowed. */ function table_reflow_start() { $this->_in_table++; } /** * Indicate to the page that table reflow is finished. */ function table_reflow_end() { $this->_in_table--; } /** * Return whether we are currently in a nested table or not * * @return bool */ function in_nested_table() { return $this->_in_table > 1; } /** * Check if a forced page break is required before $frame. This uses the * frame's page_break_before property as well as the preceeding frame's * page_break_after property. * * @link http://www.w3.org/TR/CSS21/page.html#forced * * @param Frame $frame the frame to check * @return bool true if a page break occured */ function check_forced_page_break(Frame $frame) { // Skip check if page is already split if ( $this->_page_full ) return null; $block_types = array("block", "list-item", "table", "inline"); $page_breaks = array("always", "left", "right"); $style = $frame->get_style(); if ( !in_array($style->display, $block_types) ) return false; // Find the previous block-level sibling $prev = $frame->get_prev_sibling(); while ( $prev && !in_array($prev->get_style()->display, $block_types) ) $prev = $prev->get_prev_sibling(); if ( in_array($style->page_break_before, $page_breaks) ) { // Prevent cascading splits $frame->split(null, true); // We have to grab the style again here because split() resets // $frame->style to the frame's orignal style. $frame->get_style()->page_break_before = "auto"; $this->_page_full = true; return true; } if ( $prev && in_array($prev->get_style()->page_break_after, $page_breaks) ) { // Prevent cascading splits $frame->split(null, true); $prev->get_style()->page_break_after = "auto"; $this->_page_full = true; return true; } if( $prev && $prev->get_last_child() && $frame->get_node()->nodeName != "body" ) { $prev_last_child = $prev->get_last_child(); if ( in_array($prev_last_child->get_style()->page_break_after, $page_breaks) ) { $frame->split(null, true); $prev_last_child->get_style()->page_break_after = "auto"; $this->_page_full = true; return true; } } return false; } /** * Determine if a page break is allowed before $frame * http://www.w3.org/TR/CSS21/page.html#allowed-page-breaks * * In the normal flow, page breaks can occur at the following places: * * 1. In the vertical margin between block boxes. When a page * break occurs here, the used values of the relevant * 'margin-top' and 'margin-bottom' properties are set to '0'. * 2. Between line boxes inside a block box. * * These breaks are subject to the following rules: * * * Rule A: Breaking at (1) is allowed only if the * 'page-break-after' and 'page-break-before' properties of * all the elements generating boxes that meet at this margin * allow it, which is when at least one of them has the value * 'always', 'left', or 'right', or when all of them are * 'auto'. * * * Rule B: However, if all of them are 'auto' and the * nearest common ancestor of all the elements has a * 'page-break-inside' value of 'avoid', then breaking here is * not allowed. * * * Rule C: Breaking at (2) is allowed only if the number of * line boxes between the break and the start of the enclosing * block box is the value of 'orphans' or more, and the number * of line boxes between the break and the end of the box is * the value of 'widows' or more. * * * Rule D: In addition, breaking at (2) is allowed only if * the 'page-break-inside' property is 'auto'. * * If the above doesn't provide enough break points to keep * content from overflowing the page boxes, then rules B and D are * dropped in order to find additional breakpoints. * * If that still does not lead to sufficient break points, rules A * and C are dropped as well, to find still more break points. * * We will also allow breaks between table rows. However, when * splitting a table, the table headers should carry over to the * next page (but they don't yet). * * @param Frame $frame the frame to check * @return bool true if a break is allowed, false otherwise */ protected function _page_break_allowed(Frame $frame) { $block_types = array("block", "list-item", "table", "-dompdf-image"); dompdf_debug("page-break", "_page_break_allowed(" . $frame->get_node()->nodeName. ")"); $display = $frame->get_style()->display; // Block Frames (1): if ( in_array($display, $block_types) ) { // Avoid breaks within table-cells if ( $this->_in_table ) { dompdf_debug("page-break", "In table: " . $this->_in_table); return false; } // Rules A & B if ( $frame->get_style()->page_break_before === "avoid" ) { dompdf_debug("page-break", "before: avoid"); return false; } // Find the preceeding block-level sibling $prev = $frame->get_prev_sibling(); while ( $prev && !in_array($prev->get_style()->display, $block_types) ) $prev = $prev->get_prev_sibling(); // Does the previous element allow a page break after? if ( $prev && $prev->get_style()->page_break_after === "avoid" ) { dompdf_debug("page-break", "after: avoid"); return false; } // If both $prev & $frame have the same parent, check the parent's // page_break_inside property. $parent = $frame->get_parent(); if ( $prev && $parent && $parent->get_style()->page_break_inside === "avoid" ) { dompdf_debug("page-break", "parent inside: avoid"); return false; } // To prevent cascading page breaks when a top-level element has // page-break-inside: avoid, ensure that at least one frame is // on the page before splitting. if ( $parent->get_node()->nodeName === "body" && !$prev ) { // We are the body's first child dompdf_debug("page-break", "Body's first child."); return false; } // If the frame is the first block-level frame, use the value from // $frame's parent instead. if ( !$prev && $parent ) return $this->_page_break_allowed( $parent ); dompdf_debug("page-break", "block: break allowed"); return true; } // Inline frames (2): else if ( in_array($display, Style::$INLINE_TYPES) ) { // Avoid breaks within table-cells if ( $this->_in_table ) { dompdf_debug("page-break", "In table: " . $this->_in_table); return false; } // Rule C $block_parent = $frame->find_block_parent(); if ( count($block_parent->get_line_boxes() ) < $frame->get_style()->orphans ) { dompdf_debug("page-break", "orphans"); return false; } // FIXME: Checking widows is tricky without having laid out the // remaining line boxes. Just ignore it for now... // Rule D $p = $block_parent; while ($p) { if ( $p->get_style()->page_break_inside === "avoid" ) { dompdf_debug("page-break", "parent->inside: avoid"); return false; } $p = $p->find_block_parent(); } // To prevent cascading page breaks when a top-level element has // page-break-inside: avoid, ensure that at least one frame with // some content is on the page before splitting. $prev = $frame->get_prev_sibling(); while ( $prev && ($prev->is_text_node() && trim($prev->get_node()->nodeValue) == "") ) $prev = $prev->get_prev_sibling(); if ( $block_parent->get_node()->nodeName === "body" && !$prev ) { // We are the body's first child dompdf_debug("page-break", "Body's first child."); return false; } // Skip breaks on empty text nodes if ( $frame->is_text_node() && $frame->get_node()->nodeValue == "" ) return false; dompdf_debug("page-break", "inline: break allowed"); return true; // Table-rows } else if ( $display === "table-row" ) { // Simply check if the parent table's page_break_inside property is // not 'avoid' $p = Table_Frame_Decorator::find_parent_table($frame); while ($p) { if ( $p->get_style()->page_break_inside === "avoid" ) { dompdf_debug("page-break", "parent->inside: avoid"); return false; } $p = $p->find_block_parent(); } // Avoid breaking after the first row of a table if ( $p && $p->get_first_child() === $frame) { dompdf_debug("page-break", "table: first-row"); return false; } // If this is a nested table, prevent the page from breaking if ( $this->_in_table > 1 ) { dompdf_debug("page-break", "table: nested table"); return false; } dompdf_debug("page-break","table-row/row-groups: break allowed"); return true; } else if ( in_array($display, Table_Frame_Decorator::$ROW_GROUPS) ) { // Disallow breaks at row-groups: only split at row boundaries return false; } else { dompdf_debug("page-break", "? " . $frame->get_style()->display . ""); return false; } } /** * Check if $frame will fit on the page. If the frame does not fit, * the frame tree is modified so that a page break occurs in the * correct location. * * @param Frame $frame the frame to check * @return Frame the frame following the page break */ function check_page_break(Frame $frame) { // Do not split if we have already or if the frame was already // pushed to the next page (prevents infinite loops) if ( $this->_page_full || $frame->_already_pushed ) { return false; } // If the frame is absolute of fixed it shouldn't break $p = $frame; do { if ( $p->is_absolute() ) return false; } while ( $p = $p->get_parent() ); $margin_height = $frame->get_margin_height(); // FIXME If the row is taller than the page and // if it the first of the page, we don't break if ( $frame->get_style()->display === "table-row" && !$frame->get_prev_sibling() && $margin_height > $this->get_margin_height() ) return false; // Determine the frame's maximum y value $max_y = $frame->get_position("y") + $margin_height; // If a split is to occur here, then the bottom margins & paddings of all // parents of $frame must fit on the page as well: $p = $frame->get_parent(); while ( $p ) { $style = $p->get_style(); $max_y += $style->length_in_pt(array($style->margin_bottom, $style->padding_bottom, $style->border_bottom_width)); $p = $p->get_parent(); } // Check if $frame flows off the page if ( $max_y <= $this->_bottom_page_margin ) // no: do nothing return false; dompdf_debug("page-break", "check_page_break"); dompdf_debug("page-break", "in_table: " . $this->_in_table); // yes: determine page break location $iter = $frame; $flg = false; $in_table = $this->_in_table; dompdf_debug("page-break","Starting search"); while ( $iter ) { // echo "\nbacktrack: " .$iter->get_node()->nodeName ." ".spl_object_hash($iter->get_node()). ""; if ( $iter === $this ) { dompdf_debug("page-break", "reached root."); // We've reached the root in our search. Just split at $frame. break; } if ( $this->_page_break_allowed($iter) ) { dompdf_debug("page-break","break allowed, splitting."); $iter->split(null, true); $this->_page_full = true; $this->_in_table = $in_table; $frame->_already_pushed = true; return true; } if ( !$flg && $next = $iter->get_last_child() ) { dompdf_debug("page-break", "following last child."); if ( $next->is_table() ) $this->_in_table++; $iter = $next; continue; } if ( $next = $iter->get_prev_sibling() ) { dompdf_debug("page-break", "following prev sibling."); if ( $next->is_table() && !$iter->is_table() ) $this->_in_table++; else if ( !$next->is_table() && $iter->is_table() ) $this->_in_table--; $iter = $next; $flg = false; continue; } if ( $next = $iter->get_parent() ) { dompdf_debug("page-break", "following parent."); if ( $iter->is_table() ) $this->_in_table--; $iter = $next; $flg = true; continue; } break; } $this->_in_table = $in_table; // No valid page break found. Just break at $frame. dompdf_debug("page-break", "no valid break found, just splitting."); // If we are in a table, backtrack to the nearest top-level table row if ( $this->_in_table ) { $iter = $frame; while ($iter && $iter->get_style()->display !== "table-row") $iter = $iter->get_parent(); $iter->split(null, true); } else { $frame->split(null, true); } $this->_page_full = true; $frame->_already_pushed = true; return true; } //........................................................................ function split(Frame $frame = null, $force_pagebreak = false) { // Do nothing } /** * Add a floating frame * * @param Frame $frame * * @return void */ function add_floating_frame(Frame $frame) { array_unshift($this->_floating_frames, $frame); } /** * @return Frame[] */ function get_floating_frames() { return $this->_floating_frames; } public function remove_floating_frame($key) { unset($this->_floating_frames[$key]); } public function get_lowest_float_offset(Frame $child) { $style = $child->get_style(); $side = $style->clear; $float = $style->float; $y = 0; foreach($this->_floating_frames as $key => $frame) { if ( $side === "both" || $frame->get_style()->float === $side ) { $y = max($y, $frame->get_position("y") + $frame->get_margin_height()); if ( $float !== "none" ) { $this->remove_floating_frame($key); } } } return $y; } } dompdf-0.6.2/include/page_frame_reflower.cls.php000066400000000000000000000124741263120276100217070ustar00rootroot00000000000000 * @author Fabien Ménager * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Reflows pages * * @access private * @package dompdf */ class Page_Frame_Reflower extends Frame_Reflower { /** * Cache of the callbacks array * * @var array */ private $_callbacks; /** * Cache of the canvas * * @var Canvas */ private $_canvas; function __construct(Page_Frame_Decorator $frame) { parent::__construct($frame); } function apply_page_style(Frame $frame, $page_number){ $style = $frame->get_style(); $page_styles = $style->get_stylesheet()->get_page_styles(); // http://www.w3.org/TR/CSS21/page.html#page-selectors if ( count($page_styles) > 1 ) { $odd = $page_number % 2 == 1; $first = $page_number == 1; $style = clone $page_styles["base"]; // FIXME RTL if ( $odd && isset($page_styles[":right"]) ) { $style->merge($page_styles[":right"]); } if ( $odd && isset($page_styles[":odd"]) ) { $style->merge($page_styles[":odd"]); } // FIXME RTL if ( !$odd && isset($page_styles[":left"]) ) { $style->merge($page_styles[":left"]); } if ( !$odd && isset($page_styles[":even"]) ) { $style->merge($page_styles[":even"]); } if ( $first && isset($page_styles[":first"]) ) { $style->merge($page_styles[":first"]); } $frame->set_style($style); } } //........................................................................ /** * Paged layout: * http://www.w3.org/TR/CSS21/page.html */ function reflow(Block_Frame_Decorator $block = null) { $fixed_children = array(); $prev_child = null; $child = $this->_frame->get_first_child(); $current_page = 0; while ($child) { $this->apply_page_style($this->_frame, $current_page + 1); $style = $this->_frame->get_style(); // Pages are only concerned with margins $cb = $this->_frame->get_containing_block(); $left = $style->length_in_pt($style->margin_left, $cb["w"]); $right = $style->length_in_pt($style->margin_right, $cb["w"]); $top = $style->length_in_pt($style->margin_top, $cb["h"]); $bottom = $style->length_in_pt($style->margin_bottom, $cb["h"]); $content_x = $cb["x"] + $left; $content_y = $cb["y"] + $top; $content_width = $cb["w"] - $left - $right; $content_height = $cb["h"] - $top - $bottom; // Only if it's the first page, we save the nodes with a fixed position if ($current_page == 0) { $children = $child->get_children(); foreach ($children as $onechild) { if ($onechild->get_style()->position === "fixed") { $fixed_children[] = $onechild->deep_copy(); } } $fixed_children = array_reverse($fixed_children); } $child->set_containing_block($content_x, $content_y, $content_width, $content_height); // Check for begin reflow callback $this->_check_callbacks("begin_page_reflow", $child); //Insert a copy of each node which have a fixed position if ($current_page >= 1) { foreach ($fixed_children as $fixed_child) { $child->insert_child_before($fixed_child->deep_copy(), $child->get_first_child()); } } $child->reflow(); $next_child = $child->get_next_sibling(); // Check for begin render callback $this->_check_callbacks("begin_page_render", $child); // Render the page $this->_frame->get_renderer()->render($child); // Check for end render callback $this->_check_callbacks("end_page_render", $child); if ( $next_child ) { $this->_frame->next_page(); } // Wait to dispose of all frames on the previous page // so callback will have access to them if ( $prev_child ) { $prev_child->dispose(true); } $prev_child = $child; $child = $next_child; $current_page++; } // Dispose of previous page if it still exists if ( $prev_child ) { $prev_child->dispose(true); } } //........................................................................ /** * Check for callbacks that need to be performed when a given event * gets triggered on a page * * @param string $event the type of event * @param Frame $frame the frame that event is triggered on */ protected function _check_callbacks($event, $frame) { if (!isset($this->_callbacks)) { $dompdf = $this->_frame->get_dompdf(); $this->_callbacks = $dompdf->get_callbacks(); $this->_canvas = $dompdf->get_canvas(); } if (is_array($this->_callbacks) && isset($this->_callbacks[$event])) { $info = array(0 => $this->_canvas, "canvas" => $this->_canvas, 1 => $frame, "frame" => $frame); $fs = $this->_callbacks[$event]; foreach ($fs as $f) { if (is_callable($f)) { if (is_array($f)) { $f[0]->$f[1]($info); } else { $f($info); } } } } } } dompdf-0.6.2/include/pdflib_adapter.cls.php000066400000000000000000000671711263120276100206600ustar00rootroot00000000000000 * @author Helmut Tischer * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * PDF rendering interface * * PDFLib_Adapter provides a simple, stateless interface to the one * provided by PDFLib. * * Unless otherwise mentioned, all dimensions are in points (1/72 in). * The coordinate origin is in the top left corner and y values * increase downwards. * * See {@link http://www.pdflib.com/} for more complete documentation * on the underlying PDFlib functions. * * @package dompdf */ class PDFLib_Adapter implements Canvas { /** * Dimensions of paper sizes in points * * @var array; */ static public $PAPER_SIZES = array(); // Set to CPDF_Adapter::$PAPER_SIZES below. /** * Whether to create PDFs in memory or on disk * * @var bool */ static $IN_MEMORY = true; /** * @var DOMPDF */ private $_dompdf; /** * Instance of PDFLib class * * @var PDFlib */ private $_pdf; /** * Name of temporary file used for PDFs created on disk * * @var string */ private $_file; /** * PDF width, in points * * @var float */ private $_width; /** * PDF height, in points * * @var float */ private $_height; /** * Last fill color used * * @var array */ private $_last_fill_color; /** * Last stroke color used * * @var array */ private $_last_stroke_color; /** * Cache of image handles * * @var array */ private $_imgs; /** * Cache of font handles * * @var array */ private $_fonts; /** * List of objects (templates) to add to multiple pages * * @var array */ private $_objs; /** * Current page number * * @var int */ private $_page_number; /** * Total number of pages * * @var int */ private $_page_count; /** * Text to display on every page * * @var array */ private $_page_text; /** * Array of pages for accesing after rendering is initially complete * * @var array */ private $_pages; /** * Class constructor * * @param mixed $paper The size of paper to use either a string (see {@link CPDF_Adapter::$PAPER_SIZES}) or * an array(xmin,ymin,xmax,ymax) * @param string $orientation The orientation of the document (either 'landscape' or 'portrait') * @param DOMPDF $dompdf */ function __construct($paper = "letter", $orientation = "portrait", DOMPDF $dompdf) { if ( is_array($paper) ) { $size = $paper; } else if ( isset(self::$PAPER_SIZES[mb_strtolower($paper)]) ) { $size = self::$PAPER_SIZES[mb_strtolower($paper)]; } else { $size = self::$PAPER_SIZES["letter"]; } if ( mb_strtolower($orientation) === "landscape" ) { list($size[2], $size[3]) = array($size[3], $size[2]); } $this->_width = $size[2] - $size[0]; $this->_height= $size[3] - $size[1]; $this->_dompdf = $dompdf; $this->_pdf = new PDFLib(); if ( defined("DOMPDF_PDFLIB_LICENSE") ) $this->_pdf->set_parameter( "license", DOMPDF_PDFLIB_LICENSE); $this->_pdf->set_parameter("textformat", "utf8"); $this->_pdf->set_parameter("fontwarning", "false"); $this->_pdf->set_info("Creator", "DOMPDF"); // Silence pedantic warnings about missing TZ settings $tz = @date_default_timezone_get(); date_default_timezone_set("UTC"); $this->_pdf->set_info("Date", date("Y-m-d")); date_default_timezone_set($tz); if ( self::$IN_MEMORY ) $this->_pdf->begin_document("",""); else { $tmp_dir = $this->_dompdf->get_options("temp_dir"); $tmp_name = tempnam($tmp_dir, "libdompdf_pdf_"); @unlink($tmp_name); $this->_file = "$tmp_name.pdf"; $this->_pdf->begin_document($this->_file,""); } $this->_pdf->begin_page_ext($this->_width, $this->_height, ""); $this->_page_number = $this->_page_count = 1; $this->_page_text = array(); $this->_imgs = array(); $this->_fonts = array(); $this->_objs = array(); // Set up font paths $families = Font_Metrics::get_font_families(); foreach ($families as $files) { foreach ($files as $file) { $face = basename($file); $afm = null; // Prefer ttfs to afms if ( file_exists("$file.ttf") ) { $outline = "$file.ttf"; } else if ( file_exists("$file.TTF") ) { $outline = "$file.TTF"; } else if ( file_exists("$file.pfb") ) { $outline = "$file.pfb"; if ( file_exists("$file.afm") ) { $afm = "$file.afm"; } } else if ( file_exists("$file.PFB") ) { $outline = "$file.PFB"; if ( file_exists("$file.AFM") ) { $afm = "$file.AFM"; } } else { continue; } $this->_pdf->set_parameter("FontOutline", "\{$face\}=\{$outline\}"); if ( !is_null($afm) ) { $this->_pdf->set_parameter("FontAFM", "\{$face\}=\{$afm\}"); } } } } function get_dompdf(){ return $this->_dompdf; } /** * Close the pdf */ protected function _close() { $this->_place_objects(); // Close all pages $this->_pdf->suspend_page(""); for ($p = 1; $p <= $this->_page_count; $p++) { $this->_pdf->resume_page("pagenumber=$p"); $this->_pdf->end_page_ext(""); } $this->_pdf->end_document(""); } /** * Returns the PDFLib instance * * @return PDFLib */ function get_pdflib() { return $this->_pdf; } /** * Add meta information to the PDF * * @param string $label label of the value (Creator, Producter, etc.) * @param string $value the text to set */ function add_info($label, $value) { $this->_pdf->set_info($label, $value); } /** * Opens a new 'object' (template in PDFLib-speak) * * While an object is open, all drawing actions are recorded to the * object instead of being drawn on the current page. Objects can * be added later to a specific page or to several pages. * * The return value is an integer ID for the new object. * * @see PDFLib_Adapter::close_object() * @see PDFLib_Adapter::add_object() * * @return int */ function open_object() { $this->_pdf->suspend_page(""); $ret = $this->_pdf->begin_template($this->_width, $this->_height); $this->_pdf->save(); $this->_objs[$ret] = array("start_page" => $this->_page_number); return $ret; } /** * Reopen an existing object (NOT IMPLEMENTED) * PDFLib does not seem to support reopening templates. * * @param int $object the ID of a previously opened object * * @throws DOMPDF_Exception * @return void */ function reopen_object($object) { throw new DOMPDF_Exception("PDFLib does not support reopening objects."); } /** * Close the current template * * @see PDFLib_Adapter::open_object() */ function close_object() { $this->_pdf->restore(); $this->_pdf->end_template(); $this->_pdf->resume_page("pagenumber=".$this->_page_number); } /** * Adds the specified object to the document * * $where can be one of: * - 'add' add to current page only * - 'all' add to every page from the current one onwards * - 'odd' add to all odd numbered pages from now on * - 'even' add to all even numbered pages from now on * - 'next' add the object to the next page only * - 'nextodd' add to all odd numbered pages from the next one * - 'nexteven' add to all even numbered pages from the next one * * @param int $object the object handle returned by open_object() * @param string $where */ function add_object($object, $where = 'all') { if ( mb_strpos($where, "next") !== false ) { $this->_objs[$object]["start_page"]++; $where = str_replace("next", "", $where); if ( $where == "" ) $where = "add"; } $this->_objs[$object]["where"] = $where; } /** * Stops the specified template from appearing in the document. * * The object will stop being displayed on the page following the * current one. * * @param int $object */ function stop_object($object) { if ( !isset($this->_objs[$object]) ) return; $start = $this->_objs[$object]["start_page"]; $where = $this->_objs[$object]["where"]; // Place the object on this page if required if ( $this->_page_number >= $start && (($this->_page_number % 2 == 0 && $where === "even") || ($this->_page_number % 2 == 1 && $where === "odd") || ($where === "all")) ) { $this->_pdf->fit_image($object, 0, 0, ""); } $this->_objs[$object] = null; unset($this->_objs[$object]); } /** * Add all active objects to the current page */ protected function _place_objects() { foreach ( $this->_objs as $obj => $props ) { $start = $props["start_page"]; $where = $props["where"]; // Place the object on this page if required if ( $this->_page_number >= $start && (($this->_page_number % 2 == 0 && $where === "even") || ($this->_page_number % 2 == 1 && $where === "odd") || ($where === "all")) ) { $this->_pdf->fit_image($obj,0,0,""); } } } function get_width() { return $this->_width; } function get_height() { return $this->_height; } function get_page_number() { return $this->_page_number; } function get_page_count() { return $this->_page_count; } function set_page_number($num) { $this->_page_number = (int)$num; } function set_page_count($count) { $this->_page_count = (int)$count; } /** * Sets the line style * * @param float $width * @param $cap * @param string $join * @param array $dash * * @return void */ protected function _set_line_style($width, $cap, $join, $dash) { if ( count($dash) == 1 ) $dash[] = $dash[0]; if ( count($dash) > 1 ) $this->_pdf->setdashpattern("dasharray={" . implode(" ", $dash) . "}"); else $this->_pdf->setdash(0,0); switch ( $join ) { case "miter": $this->_pdf->setlinejoin(0); break; case "round": $this->_pdf->setlinejoin(1); break; case "bevel": $this->_pdf->setlinejoin(2); break; default: break; } switch ( $cap ) { case "butt": $this->_pdf->setlinecap(0); break; case "round": $this->_pdf->setlinecap(1); break; case "square": $this->_pdf->setlinecap(2); break; default: break; } $this->_pdf->setlinewidth($width); } /** * Sets the line color * * @param array $color array(r,g,b) */ protected function _set_stroke_color($color) { if($this->_last_stroke_color == $color) return; $this->_last_stroke_color = $color; if (isset($color[3])) { $type = "cmyk"; list($c1, $c2, $c3, $c4) = array($color[0], $color[1], $color[2], $color[3]); } elseif (isset($color[2])) { $type = "rgb"; list($c1, $c2, $c3, $c4) = array($color[0], $color[1], $color[2], null); } else { $type = "gray"; list($c1, $c2, $c3, $c4) = array($color[0], $color[1], null, null); } $this->_pdf->setcolor("stroke", $type, $c1, $c2, $c3, $c4); } /** * Sets the fill color * * @param array $color array(r,g,b) */ protected function _set_fill_color($color) { if($this->_last_fill_color == $color) return; $this->_last_fill_color = $color; if (isset($color[3])) { $type = "cmyk"; list($c1, $c2, $c3, $c4) = array($color[0], $color[1], $color[2], $color[3]); } elseif (isset($color[2])) { $type = "rgb"; list($c1, $c2, $c3, $c4) = array($color[0], $color[1], $color[2], null); } else { $type = "gray"; list($c1, $c2, $c3, $c4) = array($color[0], $color[1], null, null); } $this->_pdf->setcolor("fill", $type, $c1, $c2, $c3, $c4); } /** * Sets the opacity * * @param $opacity * @param $mode */ function set_opacity($opacity, $mode = "Normal") { if ( $mode === "Normal" ) { $gstate = $this->_pdf->create_gstate("opacityfill=$opacity opacitystroke=$opacity"); $this->_pdf->set_gstate($gstate); } } function set_default_view($view, $options = array()) { // TODO // http://www.pdflib.com/fileadmin/pdflib/pdf/manuals/PDFlib-8.0.2-API-reference.pdf /** * fitheight Fit the page height to the window, with the x coordinate left at the left edge of the window. * fitrect Fit the rectangle specified by left, bottom, right, and top to the window. * fitvisible Fit the visible contents of the page (the ArtBox) to the window. * fitvisibleheight Fit the visible contents of the page to the window with the x coordinate left at the left edge of the window. * fitvisiblewidth Fit the visible contents of the page to the window with the y coordinate top at the top edge of the window. * fitwidth Fit the page width to the window, with the y coordinate top at the top edge of the window. * fitwindow Fit the complete page to the window. * fixed */ //$this->_pdf->set_parameter("openaction", $view); } /** * Loads a specific font and stores the corresponding descriptor. * * @param string $font * @param string $encoding * @param string $options * * @return int the font descriptor for the font */ protected function _load_font($font, $encoding = null, $options = "") { // Check if the font is a native PDF font // Embed non-native fonts $test = strtolower(basename($font)); if ( in_array($test, DOMPDF::$native_fonts) ) { $font = basename($font); } else { // Embed non-native fonts $options .= " embedding=true"; } if ( is_null($encoding) ) { // Unicode encoding is only available for the commerical // version of PDFlib and not PDFlib-Lite if ( defined("DOMPDF_PDFLIB_LICENSE") ) $encoding = "unicode"; else $encoding = "auto"; } $key = "$font:$encoding:$options"; if ( isset($this->_fonts[$key]) ) return $this->_fonts[$key]; else { $this->_fonts[$key] = $this->_pdf->load_font($font, $encoding, $options); return $this->_fonts[$key]; } } /** * Remaps y coords from 4th to 1st quadrant * * @param float $y * @return float */ protected function y($y) { return $this->_height - $y; } //........................................................................ /** * @param float $x1 * @param float $y1 * @param float $x2 * @param float $y2 * @param array $color * @param float $width * @param array $style */ function line($x1, $y1, $x2, $y2, $color, $width, $style = null) { $this->_set_line_style($width, "butt", "", $style); $this->_set_stroke_color($color); $y1 = $this->y($y1); $y2 = $this->y($y2); $this->_pdf->moveto($x1, $y1); $this->_pdf->lineto($x2, $y2); $this->_pdf->stroke(); } function arc($x1, $y1, $r1, $r2, $astart, $aend, $color, $width, $style = array()) { $this->_set_line_style($width, "butt", "", $style); $this->_set_stroke_color($color); $y1 = $this->y($y1); $this->_pdf->arc($x1, $y1, $r1, $astart, $aend); $this->_pdf->stroke(); } //........................................................................ function rectangle($x1, $y1, $w, $h, $color, $width, $style = null) { $this->_set_stroke_color($color); $this->_set_line_style($width, "butt", "", $style); $y1 = $this->y($y1) - $h; $this->_pdf->rect($x1, $y1, $w, $h); $this->_pdf->stroke(); } //........................................................................ function filled_rectangle($x1, $y1, $w, $h, $color) { $this->_set_fill_color($color); $y1 = $this->y($y1) - $h; $this->_pdf->rect(floatval($x1), floatval($y1), floatval($w), floatval($h)); $this->_pdf->fill(); } function clipping_rectangle($x1, $y1, $w, $h) { $this->_pdf->save(); $y1 = $this->y($y1) - $h; $this->_pdf->rect(floatval($x1), floatval($y1), floatval($w), floatval($h)); $this->_pdf->clip(); } function clipping_roundrectangle($x1, $y1, $w, $h, $rTL, $rTR, $rBR, $rBL) { // @todo $this->clipping_rectangle($x1, $y1, $w, $h); } function clipping_end() { $this->_pdf->restore(); } function save() { $this->_pdf->save(); } function restore() { $this->_pdf->restore(); } function rotate($angle, $x, $y) { $pdf = $this->_pdf; $pdf->translate($x, $this->_height-$y); $pdf->rotate(-$angle); $pdf->translate(-$x, -$this->_height+$y); } function skew($angle_x, $angle_y, $x, $y) { $pdf = $this->_pdf; $pdf->translate($x, $this->_height-$y); $pdf->skew($angle_y, $angle_x); // Needs to be inverted $pdf->translate(-$x, -$this->_height+$y); } function scale($s_x, $s_y, $x, $y) { $pdf = $this->_pdf; $pdf->translate($x, $this->_height-$y); $pdf->scale($s_x, $s_y); $pdf->translate(-$x, -$this->_height+$y); } function translate($t_x, $t_y) { $this->_pdf->translate($t_x, -$t_y); } function transform($a, $b, $c, $d, $e, $f) { $this->_pdf->concat($a, $b, $c, $d, $e, $f); } //........................................................................ function polygon($points, $color, $width = null, $style = null, $fill = false) { $this->_set_fill_color($color); $this->_set_stroke_color($color); if ( !$fill && isset($width) ) $this->_set_line_style($width, "square", "miter", $style); $y = $this->y(array_pop($points)); $x = array_pop($points); $this->_pdf->moveto($x,$y); while (count($points) > 1) { $y = $this->y(array_pop($points)); $x = array_pop($points); $this->_pdf->lineto($x,$y); } if ( $fill ) $this->_pdf->fill(); else $this->_pdf->closepath_stroke(); } //........................................................................ function circle($x, $y, $r, $color, $width = null, $style = null, $fill = false) { $this->_set_fill_color($color); $this->_set_stroke_color($color); if ( !$fill && isset($width) ) $this->_set_line_style($width, "round", "round", $style); $y = $this->y($y); $this->_pdf->circle($x, $y, $r); if ( $fill ) $this->_pdf->fill(); else $this->_pdf->stroke(); } //........................................................................ function image($img_url, $x, $y, $w, $h, $resolution = "normal") { $w = (int)$w; $h = (int)$h; $img_type = Image_Cache::detect_type($img_url, $this->_dompdf->get_http_context()); $img_ext = Image_Cache::type_to_ext($img_type); if ( !isset($this->_imgs[$img_url]) ) { $this->_imgs[$img_url] = $this->_pdf->load_image($img_ext, $img_url, ""); } $img = $this->_imgs[$img_url]; $y = $this->y($y) - $h; $this->_pdf->fit_image($img, $x, $y, 'boxsize={'."$w $h".'} fitmethod=entire'); } //........................................................................ function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_spacing = 0, $char_spacing = 0, $angle = 0) { $fh = $this->_load_font($font); $this->_pdf->setfont($fh, $size); $this->_set_fill_color($color); $y = $this->y($y) - Font_Metrics::get_font_height($font, $size); $word_spacing = (float)$word_spacing; $char_spacing = (float)$char_spacing; $angle = -(float)$angle; $this->_pdf->fit_textline($text, $x, $y, "rotate=$angle wordspacing=$word_spacing charspacing=$char_spacing "); } //........................................................................ function javascript($code) { if ( defined("DOMPDF_PDFLIB_LICENSE") ) { $this->_pdf->create_action("JavaScript", $code); } } //........................................................................ /** * Add a named destination (similar to ... in html) * * @param string $anchorname The name of the named destination */ function add_named_dest($anchorname) { $this->_pdf->add_nameddest($anchorname,""); } //........................................................................ /** * Add a link to the pdf * * @param string $url The url to link to * @param float $x The x position of the link * @param float $y The y position of the link * @param float $width The width of the link * @param float $height The height of the link */ function add_link($url, $x, $y, $width, $height) { $y = $this->y($y) - $height; if ( strpos($url, '#') === 0 ) { // Local link $name = substr($url,1); if ( $name ) $this->_pdf->create_annotation($x, $y, $x + $width, $y + $height, 'Link', "contents={$url} destname=". substr($url,1) . " linewidth=0"); } else { list($proto, $host, $path, $file) = explode_url($url); if ( $proto == "" || $proto === "file://" ) return; // Local links are not allowed $url = build_url($proto, $host, $path, $file); $url = '{' . rawurldecode($url) . '}'; $action = $this->_pdf->create_action("URI", "url=" . $url); $this->_pdf->create_annotation($x, $y, $x + $width, $y + $height, 'Link', "contents={$url} action={activate=$action} linewidth=0"); } } //........................................................................ function get_text_width($text, $font, $size, $word_spacing = 0, $letter_spacing = 0) { $fh = $this->_load_font($font); // Determine the additional width due to extra spacing $num_spaces = mb_substr_count($text," "); $delta = $word_spacing * $num_spaces; if ( $letter_spacing ) { $num_chars = mb_strlen($text); $delta += ($num_chars - $num_spaces) * $letter_spacing; } return $this->_pdf->stringwidth($text, $fh, $size) + $delta; } //........................................................................ function get_font_height($font, $size) { $fh = $this->_load_font($font); $this->_pdf->setfont($fh, $size); $asc = $this->_pdf->get_value("ascender", $fh); $desc = $this->_pdf->get_value("descender", $fh); // $desc is usually < 0, $ratio = $this->_dompdf->get_option("font_height_ratio"); return $size * ($asc - $desc) * $ratio; } function get_font_baseline($font, $size) { $ratio = $this->_dompdf->get_option("font_height_ratio"); return $this->get_font_height($font, $size) / $ratio * 1.1; } //........................................................................ /** * Writes text at the specified x and y coordinates on every page * * The strings '{PAGE_NUM}' and '{PAGE_COUNT}' are automatically replaced * with their current values. * * See {@link Style::munge_color()} for the format of the color array. * * @param float $x * @param float $y * @param string $text the text to write * @param string $font the font file to use * @param float $size the font size, in points * @param array $color * @param float $word_space word spacing adjustment * @param float $char_space char spacing adjustment * @param float $angle angle to write the text at, measured CW starting from the x-axis */ function page_text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0.0, $char_space = 0.0, $angle = 0.0) { $_t = "text"; $this->_page_text[] = compact("_t", "x", "y", "text", "font", "size", "color", "word_space", "char_space", "angle"); } //........................................................................ /** * Processes a script on every page * * The variables $pdf, $PAGE_NUM, and $PAGE_COUNT are available. * * This function can be used to add page numbers to all pages * after the first one, for example. * * @param string $code the script code * @param string $type the language type for script */ function page_script($code, $type = "text/php") { $_t = "script"; $this->_page_text[] = compact("_t", "code", "type"); } //........................................................................ function new_page() { // Add objects to the current page $this->_place_objects(); $this->_pdf->suspend_page(""); $this->_pdf->begin_page_ext($this->_width, $this->_height, ""); $this->_page_number = ++$this->_page_count; } //........................................................................ /** * Add text to each page after rendering is complete */ protected function _add_page_text() { if ( !count($this->_page_text) ) return; $this->_pdf->suspend_page(""); for ($p = 1; $p <= $this->_page_count; $p++) { $this->_pdf->resume_page("pagenumber=$p"); foreach ($this->_page_text as $pt) { extract($pt); switch ($_t) { case "text": $text = str_replace(array("{PAGE_NUM}","{PAGE_COUNT}"), array($p, $this->_page_count), $text); $this->text($x, $y, $text, $font, $size, $color, $word_space, $char_space, $angle); break; case "script": if (!$eval) { $eval = new PHP_Evaluator($this); } $eval->evaluate($code, array('PAGE_NUM' => $p, 'PAGE_COUNT' => $this->_page_count)); break; } } $this->_pdf->suspend_page(""); } $this->_pdf->resume_page("pagenumber=".$this->_page_number); } //........................................................................ function stream($filename, $options = null) { // Add page text $this->_add_page_text(); if ( isset($options["compress"]) && $options["compress"] != 1 ) $this->_pdf->set_value("compress", 0); else $this->_pdf->set_value("compress", 6); $this->_close(); $data = ""; if ( self::$IN_MEMORY ) { $data = $this->_pdf->get_buffer(); //$size = strlen($data); } else { //$size = filesize($this->_file); } $filename = str_replace(array("\n","'"),"", $filename); $attach = (isset($options["Attachment"]) && $options["Attachment"]) ? "attachment" : "inline"; header("Cache-Control: private"); header("Content-type: application/pdf"); header("Content-Disposition: $attach; filename=\"$filename\""); //header("Content-length: " . $size); if ( self::$IN_MEMORY ) echo $data; else { // Chunked readfile() $chunk = (1 << 21); // 2 MB $fh = fopen($this->_file, "rb"); if ( !$fh ) throw new DOMPDF_Exception("Unable to load temporary PDF file: " . $this->_file); while ( !feof($fh) ) echo fread($fh,$chunk); fclose($fh); //debugpng if (DEBUGPNG) print '[pdflib stream unlink '.$this->_file.']'; if (!DEBUGKEEPTEMP) unlink($this->_file); $this->_file = null; unset($this->_file); } flush(); } //........................................................................ function output($options = null) { // Add page text $this->_add_page_text(); if ( isset($options["compress"]) && $options["compress"] != 1 ) $this->_pdf->set_value("compress", 0); else $this->_pdf->set_value("compress", 6); $this->_close(); if ( self::$IN_MEMORY ) $data = $this->_pdf->get_buffer(); else { $data = file_get_contents($this->_file); //debugpng if (DEBUGPNG) print '[pdflib output unlink '.$this->_file.']'; if (!DEBUGKEEPTEMP) unlink($this->_file); $this->_file = null; unset($this->_file); } return $data; } } // Workaround for idiotic limitation on statics... PDFLib_Adapter::$PAPER_SIZES = CPDF_Adapter::$PAPER_SIZES; dompdf-0.6.2/include/php_evaluator.cls.php000066400000000000000000000020561263120276100205600ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Executes inline PHP code during the rendering process * * @access private * @package dompdf */ class PHP_Evaluator { /** * @var Canvas */ protected $_canvas; function __construct(Canvas $canvas) { $this->_canvas = $canvas; } function evaluate($code, $vars = array()) { if ( !$this->_canvas->get_dompdf()->get_option("enable_php") ) { return; } // Set up some variables for the inline code $pdf = $this->_canvas; $PAGE_NUM = $pdf->get_page_number(); $PAGE_COUNT = $pdf->get_page_count(); // Override those variables if passed in foreach ($vars as $k => $v) { $$k = $v; } //$code = html_entity_decode($code); // @todo uncomment this when tested eval($code); } function render(Frame $frame) { $this->evaluate($frame->get_node()->nodeValue); } } dompdf-0.6.2/include/positioner.cls.php000066400000000000000000000021251263120276100200770ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Base Positioner class * * Defines postioner interface * * @access private * @package dompdf */ abstract class Positioner { /** * @var Frame_Decorator */ protected $_frame; //........................................................................ function __construct(Frame_Decorator $frame) { $this->_frame = $frame; } /** * Class destructor */ function __destruct() { clear_object($this); } //........................................................................ abstract function position(); function move($offset_x, $offset_y, $ignore_self = false) { list($x, $y) = $this->_frame->get_position(); if ( !$ignore_self ) { $this->_frame->set_position($x + $offset_x, $y + $offset_y); } foreach($this->_frame->get_children() as $child) { $child->move($offset_x, $offset_y); } } } dompdf-0.6.2/include/renderer.cls.php000066400000000000000000000161421263120276100175160ustar00rootroot00000000000000 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Concrete renderer * * Instantiates several specific renderers in order to render any given * frame. * * @access private * @package dompdf */ class Renderer extends Abstract_Renderer { /** * Array of renderers for specific frame types * * @var Abstract_Renderer[] */ protected $_renderers; /** * Cache of the callbacks array * * @var array */ private $_callbacks; /** * Class destructor */ function __destruct() { clear_object($this); } /** * Advance the canvas to the next page */ function new_page() { $this->_canvas->new_page(); } /** * Render frames recursively * * @param Frame $frame the frame to render */ function render(Frame $frame) { global $_dompdf_debug; if ( $_dompdf_debug ) { echo $frame; flush(); } $style = $frame->get_style(); if ( in_array($style->visibility, array("hidden", "collapse")) ) { return; } $display = $style->display; // Starts the CSS transformation if ( $style->transform && is_array($style->transform) ) { $this->_canvas->save(); list($x, $y) = $frame->get_padding_box(); $origin = $style->transform_origin; foreach($style->transform as $transform) { list($function, $values) = $transform; if ( $function === "matrix" ) { $function = "transform"; } $values = array_map("floatval", $values); $values[] = $x + $style->length_in_pt($origin[0], $style->width); $values[] = $y + $style->length_in_pt($origin[1], $style->height); call_user_func_array(array($this->_canvas, $function), $values); } } switch ($display) { case "block": case "list-item": case "inline-block": case "table": case "inline-table": $this->_render_frame("block", $frame); break; case "inline": if ( $frame->is_text_node() ) $this->_render_frame("text", $frame); else $this->_render_frame("inline", $frame); break; case "table-cell": $this->_render_frame("table-cell", $frame); break; case "table-row-group": case "table-header-group": case "table-footer-group": $this->_render_frame("table-row-group", $frame); break; case "-dompdf-list-bullet": $this->_render_frame("list-bullet", $frame); break; case "-dompdf-image": $this->_render_frame("image", $frame); break; case "none": $node = $frame->get_node(); if ( $node->nodeName === "script" ) { if ( $node->getAttribute("type") === "text/php" || $node->getAttribute("language") === "php" ) { // Evaluate embedded php scripts $this->_render_frame("php", $frame); } elseif ( $node->getAttribute("type") === "text/javascript" || $node->getAttribute("language") === "javascript" ) { // Insert JavaScript $this->_render_frame("javascript", $frame); } } // Don't render children, so skip to next iter return; default: break; } // Starts the overflow: hidden box if ( $style->overflow === "hidden" ) { list($x, $y, $w, $h) = $frame->get_padding_box(); // get border radii $style = $frame->get_style(); list($tl, $tr, $br, $bl) = $style->get_computed_border_radius($w, $h); if ( $tl + $tr + $br + $bl > 0 ) { $this->_canvas->clipping_roundrectangle($x, $y, $w, $h, $tl, $tr, $br, $bl); } else { $this->_canvas->clipping_rectangle($x, $y, $w, $h); } } $stack = array(); foreach ($frame->get_children() as $child) { // < 0 : nagative z-index // = 0 : no z-index, no stacking context // = 1 : stacking context without z-index // > 1 : z-index $child_style = $child->get_style(); $child_z_index = $child_style->z_index; $z_index = 0; if ( $child_z_index !== "auto" ) { $z_index = intval($child_z_index) + 1; } elseif ( $child_style->float !== "none" || $child->is_positionned()) { $z_index = 1; } $stack[$z_index][] = $child; } ksort($stack); foreach ($stack as $by_index) { foreach($by_index as $child) { $this->render($child); } } // Ends the overflow: hidden box if ( $style->overflow === "hidden" ) { $this->_canvas->clipping_end(); } if ( $style->transform && is_array($style->transform) ) { $this->_canvas->restore(); } // Check for end frame callback $this->_check_callbacks("end_frame", $frame); } /** * Check for callbacks that need to be performed when a given event * gets triggered on a frame * * @param string $event the type of event * @param Frame $frame the frame that event is triggered on */ protected function _check_callbacks($event, $frame) { if (!isset($this->_callbacks)) { $this->_callbacks = $this->_dompdf->get_callbacks(); } if (is_array($this->_callbacks) && isset($this->_callbacks[$event])) { $info = array(0 => $this->_canvas, "canvas" => $this->_canvas, 1 => $frame, "frame" => $frame); $fs = $this->_callbacks[$event]; foreach ($fs as $f) { if (is_callable($f)) { if (is_array($f)) { $f[0]->$f[1]($info); } else { $f($info); } } } } } /** * Render a single frame * * Creates Renderer objects on demand * * @param string $type type of renderer to use * @param Frame $frame the frame to render */ protected function _render_frame($type, $frame) { if ( !isset($this->_renderers[$type]) ) { switch ($type) { case "block": $this->_renderers[$type] = new Block_Renderer($this->_dompdf); break; case "inline": $this->_renderers[$type] = new Inline_Renderer($this->_dompdf); break; case "text": $this->_renderers[$type] = new Text_Renderer($this->_dompdf); break; case "image": $this->_renderers[$type] = new Image_Renderer($this->_dompdf); break; case "table-cell": $this->_renderers[$type] = new Table_Cell_Renderer($this->_dompdf); break; case "table-row-group": $this->_renderers[$type] = new Table_Row_Group_Renderer($this->_dompdf); break; case "list-bullet": $this->_renderers[$type] = new List_Bullet_Renderer($this->_dompdf); break; case "php": $this->_renderers[$type] = new PHP_Evaluator($this->_canvas); break; case "javascript": $this->_renderers[$type] = new Javascript_Embedder($this->_dompdf); break; } } $this->_renderers[$type]->render($frame); } } dompdf-0.6.2/include/style.cls.php000066400000000000000000002157511263120276100170570ustar00rootroot00000000000000 * @author Helmut Tischer * @author Fabien Ménager * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * Represents CSS properties. * * The Style class is responsible for handling and storing CSS properties. * It includes methods to resolve colors and lengths, as well as getters & * setters for many CSS properites. * * Actual CSS parsing is performed in the {@link Stylesheet} class. * * @package dompdf */ class Style { const CSS_IDENTIFIER = "-?[_a-zA-Z]+[_a-zA-Z0-9-]*"; const CSS_INTEGER = "-?\d+"; /** * Default font size, in points. * * @var float */ static $default_font_size = 12; /** * Default line height, as a fraction of the font size. * * @var float */ static $default_line_height = 1.2; /** * Default "absolute" font sizes relative to the default font-size * http://www.w3.org/TR/css3-fonts/#font-size-the-font-size-property * @var array */ static $font_size_keywords = array( "xx-small" => 0.6, // 3/5 "x-small" => 0.75, // 3/4 "small" => 0.889, // 8/9 "medium" => 1, // 1 "large" => 1.2, // 6/5 "x-large" => 1.5, // 3/2 "xx-large" => 2.0, // 2/1 ); /** * List of all inline types. Should really be a constant. * * @var array */ static $INLINE_TYPES = array("inline"); /** * List of all block types. Should really be a constant. * * @var array */ static $BLOCK_TYPES = array("block", "inline-block", "table-cell", "list-item"); /** * List of all positionned types. Should really be a constant. * * @var array */ static $POSITIONNED_TYPES = array("relative", "absolute", "fixed"); /** * List of all table types. Should really be a constant. * * @var array; */ static $TABLE_TYPES = array("table", "inline-table"); /** * List of valid border styles. Should also really be a constant. * * @var array */ static $BORDER_STYLES = array("none", "hidden", "dotted", "dashed", "solid", "double", "groove", "ridge", "inset", "outset"); /** * Default style values. * * @link http://www.w3.org/TR/CSS21/propidx.html * * @var array */ static protected $_defaults = null; /** * List of inherited properties * * @link http://www.w3.org/TR/CSS21/propidx.html * * @var array */ static protected $_inherited = null; /** * Caches method_exists result * * @var array */ static protected $_methods_cache = array(); /** * The stylesheet this style belongs to * * @see Stylesheet * @var Stylesheet */ protected $_stylesheet; // stylesheet this style is attached to /** * Main array of all CSS properties & values * * @var array */ protected $_props; /* var instead of protected would allow access outside of class */ protected $_important_props; /** * Cached property values * * @var array */ protected $_prop_cache; /** * Font size of parent element in document tree. Used for relative font * size resolution. * * @var float */ protected $_parent_font_size; // Font size of parent element protected $_font_family; /** * @var Frame */ protected $_frame; /** * The origin of the style * * @var int */ protected $_origin = Stylesheet::ORIG_AUTHOR; // private members /** * True once the font size is resolved absolutely * * @var bool */ private $__font_size_calculated; // Cache flag /** * The computed border radius */ private $_computed_border_radius = null; /** * @var bool */ public $_has_border_radius = false; /** * Class constructor * * @param Stylesheet $stylesheet the stylesheet this Style is associated with. * @param int $origin */ function __construct(Stylesheet $stylesheet, $origin = Stylesheet::ORIG_AUTHOR) { $this->_props = array(); $this->_important_props = array(); $this->_stylesheet = $stylesheet; $this->_origin = $origin; $this->_parent_font_size = null; $this->__font_size_calculated = false; if ( !isset(self::$_defaults) ) { // Shorthand $d =& self::$_defaults; // All CSS 2.1 properties, and their default values $d["azimuth"] = "center"; $d["background_attachment"] = "scroll"; $d["background_color"] = "transparent"; $d["background_image"] = "none"; $d["background_image_resolution"] = "normal"; $d["_dompdf_background_image_resolution"] = $d["background_image_resolution"]; $d["background_position"] = "0% 0%"; $d["background_repeat"] = "repeat"; $d["background"] = ""; $d["border_collapse"] = "separate"; $d["border_color"] = ""; $d["border_spacing"] = "0"; $d["border_style"] = ""; $d["border_top"] = ""; $d["border_right"] = ""; $d["border_bottom"] = ""; $d["border_left"] = ""; $d["border_top_color"] = ""; $d["border_right_color"] = ""; $d["border_bottom_color"] = ""; $d["border_left_color"] = ""; $d["border_top_style"] = "none"; $d["border_right_style"] = "none"; $d["border_bottom_style"] = "none"; $d["border_left_style"] = "none"; $d["border_top_width"] = "medium"; $d["border_right_width"] = "medium"; $d["border_bottom_width"] = "medium"; $d["border_left_width"] = "medium"; $d["border_width"] = "medium"; $d["border_bottom_left_radius"] = ""; $d["border_bottom_right_radius"] = ""; $d["border_top_left_radius"] = ""; $d["border_top_right_radius"] = ""; $d["border_radius"] = ""; $d["border"] = ""; $d["bottom"] = "auto"; $d["caption_side"] = "top"; $d["clear"] = "none"; $d["clip"] = "auto"; $d["color"] = "#000000"; $d["content"] = "normal"; $d["counter_increment"] = "none"; $d["counter_reset"] = "none"; $d["cue_after"] = "none"; $d["cue_before"] = "none"; $d["cue"] = ""; $d["cursor"] = "auto"; $d["direction"] = "ltr"; $d["display"] = "inline"; $d["elevation"] = "level"; $d["empty_cells"] = "show"; $d["float"] = "none"; $d["font_family"] = $stylesheet->get_dompdf()->get_option("default_font"); $d["font_size"] = "medium"; $d["font_style"] = "normal"; $d["font_variant"] = "normal"; $d["font_weight"] = "normal"; $d["font"] = ""; $d["height"] = "auto"; $d["image_resolution"] = "normal"; $d["_dompdf_image_resolution"] = $d["image_resolution"]; $d["_dompdf_keep"] = ""; $d["left"] = "auto"; $d["letter_spacing"] = "normal"; $d["line_height"] = "normal"; $d["list_style_image"] = "none"; $d["list_style_position"] = "outside"; $d["list_style_type"] = "disc"; $d["list_style"] = ""; $d["margin_right"] = "0"; $d["margin_left"] = "0"; $d["margin_top"] = "0"; $d["margin_bottom"] = "0"; $d["margin"] = ""; $d["max_height"] = "none"; $d["max_width"] = "none"; $d["min_height"] = "0"; $d["min_width"] = "0"; $d["opacity"] = "1.0"; // CSS3 $d["orphans"] = "2"; $d["outline_color"] = ""; // "invert" special color is not supported $d["outline_style"] = "none"; $d["outline_width"] = "medium"; $d["outline"] = ""; $d["overflow"] = "visible"; $d["padding_top"] = "0"; $d["padding_right"] = "0"; $d["padding_bottom"] = "0"; $d["padding_left"] = "0"; $d["padding"] = ""; $d["page_break_after"] = "auto"; $d["page_break_before"] = "auto"; $d["page_break_inside"] = "auto"; $d["pause_after"] = "0"; $d["pause_before"] = "0"; $d["pause"] = ""; $d["pitch_range"] = "50"; $d["pitch"] = "medium"; $d["play_during"] = "auto"; $d["position"] = "static"; $d["quotes"] = ""; $d["richness"] = "50"; $d["right"] = "auto"; $d["size"] = "auto"; // @page $d["speak_header"] = "once"; $d["speak_numeral"] = "continuous"; $d["speak_punctuation"] = "none"; $d["speak"] = "normal"; $d["speech_rate"] = "medium"; $d["stress"] = "50"; $d["table_layout"] = "auto"; $d["text_align"] = "left"; $d["text_decoration"] = "none"; $d["text_indent"] = "0"; $d["text_transform"] = "none"; $d["top"] = "auto"; $d["transform"] = "none"; // CSS3 $d["transform_origin"] = "50% 50%"; // CSS3 $d["_webkit_transform"] = $d["transform"]; // CSS3 $d["_webkit_transform_origin"] = $d["transform_origin"]; // CSS3 $d["unicode_bidi"] = "normal"; $d["vertical_align"] = "baseline"; $d["visibility"] = "visible"; $d["voice_family"] = ""; $d["volume"] = "medium"; $d["white_space"] = "normal"; $d["word_wrap"] = "normal"; $d["widows"] = "2"; $d["width"] = "auto"; $d["word_spacing"] = "normal"; $d["z_index"] = "auto"; // for @font-face $d["src"] = ""; $d["unicode_range"] = ""; // Properties that inherit by default self::$_inherited = array( "azimuth", "background_image_resolution", "border_collapse", "border_spacing", "caption_side", "color", "cursor", "direction", "elevation", "empty_cells", "font_family", "font_size", "font_style", "font_variant", "font_weight", "font", "image_resolution", "letter_spacing", "line_height", "list_style_image", "list_style_position", "list_style_type", "list_style", "orphans", "page_break_inside", "pitch_range", "pitch", "quotes", "richness", "speak_header", "speak_numeral", "speak_punctuation", "speak", "speech_rate", "stress", "text_align", "text_indent", "text_transform", "visibility", "voice_family", "volume", "white_space", "word_wrap", "widows", "word_spacing", ); } } /** * "Destructor": forcibly free all references held by this object */ function dispose() { clear_object($this); } function set_frame(Frame $frame) { $this->_frame = $frame; } function get_frame() { return $this->_frame; } function set_origin($origin) { $this->_origin = $origin; } function get_origin() { return $this->_origin; } /** * returns the {@link Stylesheet} this Style is associated with. * * @return Stylesheet */ function get_stylesheet() { return $this->_stylesheet; } /** * Converts any CSS length value into an absolute length in points. * * length_in_pt() takes a single length (e.g. '1em') or an array of * lengths and returns an absolute length. If an array is passed, then * the return value is the sum of all elements. * * If a reference size is not provided, the default font size is used * ({@link Style::$default_font_size}). * * @param float|array $length the length or array of lengths to resolve * @param float $ref_size an absolute reference size to resolve percentage lengths * @return float */ function length_in_pt($length, $ref_size = null) { static $cache = array(); if ( !is_array($length) ) { $length = array($length); } if ( !isset($ref_size) ) { $ref_size = self::$default_font_size; } $key = implode("@", $length)."/$ref_size"; if ( isset($cache[$key]) ) { return $cache[$key]; } $ret = 0; foreach ($length as $l) { if ( $l === "auto" ) { return "auto"; } if ( $l === "none" ) { return "none"; } // Assume numeric values are already in points if ( is_numeric($l) ) { $ret += $l; continue; } if ( $l === "normal" ) { $ret += $ref_size; continue; } // Border lengths if ( $l === "thin" ) { $ret += 0.5; continue; } if ( $l === "medium" ) { $ret += 1.5; continue; } if ( $l === "thick" ) { $ret += 2.5; continue; } if ( ($i = mb_strpos($l, "px")) !== false ) { $dpi = $this->_stylesheet->get_dompdf()->get_option("dpi"); $ret += ( mb_substr($l, 0, $i) * 72 ) / $dpi; continue; } if ( ($i = mb_strpos($l, "pt")) !== false ) { $ret += (float)mb_substr($l, 0, $i); continue; } if ( ($i = mb_strpos($l, "%")) !== false ) { $ret += (float)mb_substr($l, 0, $i)/100 * $ref_size; continue; } if ( ($i = mb_strpos($l, "rem")) !== false ) { $ret += (float)mb_substr($l, 0, $i) * $this->_stylesheet->get_dompdf()->get_tree()->get_root()->get_style()->font_size; continue; } if ( ($i = mb_strpos($l, "em")) !== false ) { $ret += (float)mb_substr($l, 0, $i) * $this->__get("font_size"); continue; } if ( ($i = mb_strpos($l, "cm")) !== false ) { $ret += mb_substr($l, 0, $i) * 72 / 2.54; continue; } if ( ($i = mb_strpos($l, "mm")) !== false ) { $ret += mb_substr($l, 0, $i) * 72 / 25.4; continue; } // FIXME: em:ex ratio? if ( ($i = mb_strpos($l, "ex")) !== false ) { $ret += mb_substr($l, 0, $i) * $this->__get("font_size") / 2; continue; } if ( ($i = mb_strpos($l, "in")) !== false ) { $ret += (float)mb_substr($l, 0, $i) * 72; continue; } if ( ($i = mb_strpos($l, "pc")) !== false ) { $ret += (float)mb_substr($l, 0, $i) * 12; continue; } // Bogus value $ret += $ref_size; } return $cache[$key] = $ret; } /** * Set inherited properties in this style using values in $parent * * @param Style $parent * * @return Style */ function inherit(Style $parent) { // Set parent font size $this->_parent_font_size = $parent->get_font_size(); foreach (self::$_inherited as $prop) { //inherit the !important property also. //if local property is also !important, don't inherit. if ( isset($parent->_props[$prop]) && ( !isset($this->_props[$prop]) || ( isset($parent->_important_props[$prop]) && !isset($this->_important_props[$prop]) ) ) ) { if ( isset($parent->_important_props[$prop]) ) { $this->_important_props[$prop] = true; } //see __set and __get, on all assignments clear cache! $this->_prop_cache[$prop] = null; $this->_props[$prop] = $parent->_props[$prop]; } } foreach ($this->_props as $prop => $value) { if ( $value === "inherit" ) { if ( isset($parent->_important_props[$prop]) ) { $this->_important_props[$prop] = true; } //do not assign direct, but //implicite assignment through __set, redirect to specialized, get value with __get //This is for computing defaults if the parent setting is also missing. //Therefore do not directly assign the value without __set //set _important_props before that to be able to propagate. //see __set and __get, on all assignments clear cache! //$this->_prop_cache[$prop] = null; //$this->_props[$prop] = $parent->_props[$prop]; //props_set for more obvious explicite assignment not implemented, because //too many implicite uses. // $this->props_set($prop, $parent->$prop); $this->__set($prop, $parent->__get($prop)); } } return $this; } /** * Override properties in this style with those in $style * * @param Style $style */ function merge(Style $style) { //treat the !important attribute //if old rule has !important attribute, override with new rule only if //the new rule is also !important foreach($style->_props as $prop => $val ) { if (isset($style->_important_props[$prop])) { $this->_important_props[$prop] = true; //see __set and __get, on all assignments clear cache! $this->_prop_cache[$prop] = null; $this->_props[$prop] = $val; } else if ( !isset($this->_important_props[$prop]) ) { //see __set and __get, on all assignments clear cache! $this->_prop_cache[$prop] = null; $this->_props[$prop] = $val; } } if ( isset($style->_props["font_size"]) ) { $this->__font_size_calculated = false; } } /** * Returns an array(r, g, b, "r"=> r, "g"=>g, "b"=>b, "hex"=>"#rrggbb") * based on the provided CSS color value. * * @param string $color * @return array */ function munge_color($color) { return CSS_Color::parse($color); } /* direct access to _important_props array from outside would work only when declared as * 'var $_important_props;' instead of 'protected $_important_props;' * Don't call _set/__get on missing attribute. Therefore need a special access. * Assume that __set will be also called when this is called, so do not check validity again. * Only created, if !important exists -> always set true. */ function important_set($prop) { $prop = str_replace("-", "_", $prop); $this->_important_props[$prop] = true; } function important_get($prop) { return isset($this->_important_props[$prop]); } /** * PHP5 overloaded setter * * This function along with {@link Style::__get()} permit a user of the * Style class to access any (CSS) property using the following syntax: * * Style->margin_top = "1em"; * echo (Style->margin_top); * * * __set() automatically calls the provided set function, if one exists, * otherwise it sets the property directly. Typically, __set() is not * called directly from outside of this class. * * On each modification clear cache to return accurate setting. * Also affects direct settings not using __set * For easier finding all assignments, attempted to allowing only explicite assignment: * Very many uses, e.g. frame_reflower.cls.php -> for now leave as it is * function __set($prop, $val) { * throw new DOMPDF_Exception("Implicite replacement of assignment by __set. Not good."); * } * function props_set($prop, $val) { ... } * * @param string $prop the property to set * @param mixed $val the value of the property * */ function __set($prop, $val) { $prop = str_replace("-", "_", $prop); $this->_prop_cache[$prop] = null; if ( !isset(self::$_defaults[$prop]) ) { global $_dompdf_warnings; $_dompdf_warnings[] = "'$prop' is not a valid CSS2 property."; return; } if ( $prop !== "content" && is_string($val) && strlen($val) > 5 && mb_strpos($val, "url") === false ) { $val = mb_strtolower(trim(str_replace(array("\n", "\t"), array(" "), $val))); $val = preg_replace("/([0-9]+) (pt|px|pc|em|ex|in|cm|mm|%)/S", "\\1\\2", $val); } $method = "set_$prop"; if ( !isset(self::$_methods_cache[$method]) ) { self::$_methods_cache[$method] = method_exists($this, $method); } if ( self::$_methods_cache[$method] ) { $this->$method($val); } else { $this->_props[$prop] = $val; } } /** * PHP5 overloaded getter * Along with {@link Style::__set()} __get() provides access to all CSS * properties directly. Typically __get() is not called directly outside * of this class. * On each modification clear cache to return accurate setting. * Also affects direct settings not using __set * * @param string $prop * * @throws DOMPDF_Exception * @return mixed */ function __get($prop) { if ( !isset(self::$_defaults[$prop]) ) { throw new DOMPDF_Exception("'$prop' is not a valid CSS2 property."); } if ( isset($this->_prop_cache[$prop]) && $this->_prop_cache[$prop] != null ) { return $this->_prop_cache[$prop]; } $method = "get_$prop"; // Fall back on defaults if property is not set if ( !isset($this->_props[$prop]) ) { $this->_props[$prop] = self::$_defaults[$prop]; } if ( !isset(self::$_methods_cache[$method]) ) { self::$_methods_cache[$method] = method_exists($this, $method); } if ( self::$_methods_cache[$method] ) { return $this->_prop_cache[$prop] = $this->$method(); } return $this->_prop_cache[$prop] = $this->_props[$prop]; } function get_font_family_raw(){ return trim($this->_props["font_family"], " \t\n\r\x0B\"'"); } /** * Getter for the 'font-family' CSS property. * Uses the {@link Font_Metrics} class to resolve the font family into an * actual font file. * * @link http://www.w3.org/TR/CSS21/fonts.html#propdef-font-family * @throws DOMPDF_Exception * * @return string */ function get_font_family() { if ( isset($this->_font_family) ) { return $this->_font_family; } $DEBUGCSS=DEBUGCSS; //=DEBUGCSS; Allow override of global setting for ad hoc debug // Select the appropriate font. First determine the subtype, then check // the specified font-families for a candidate. // Resolve font-weight $weight = $this->__get("font_weight"); if ( is_numeric($weight) ) { if ( $weight < 600 ) { $weight = "normal"; } else { $weight = "bold"; } } else if ( $weight === "bold" || $weight === "bolder" ) { $weight = "bold"; } else { $weight = "normal"; } // Resolve font-style $font_style = $this->__get("font_style"); if ( $weight === "bold" && ($font_style === "italic" || $font_style === "oblique") ) { $subtype = "bold_italic"; } else if ( $weight === "bold" && $font_style !== "italic" && $font_style !== "oblique" ) { $subtype = "bold"; } else if ( $weight !== "bold" && ($font_style === "italic" || $font_style === "oblique") ) { $subtype = "italic"; } else { $subtype = "normal"; } // Resolve the font family if ( $DEBUGCSS ) { print "
[get_font_family:";
      print '('.$this->_props["font_family"].'.'.$font_style.'.'.$this->__get("font_weight").'.'.$weight.'.'.$subtype.')';
    }
    
    $families = preg_split("/\s*,\s*/", $this->_props["font_family"]);

    $font = null;
    foreach($families as $family) {
      //remove leading and trailing string delimiters, e.g. on font names with spaces;
      //remove leading and trailing whitespace
      $family = trim($family, " \t\n\r\x0B\"'");
      if ( $DEBUGCSS ) {
        print '('.$family.')';
      }
      $font = Font_Metrics::get_font($family, $subtype);

      if ( $font ) {
        if ($DEBUGCSS) print '('.$font.")get_font_family]\n
"; return $this->_font_family = $font; } } $family = null; if ( $DEBUGCSS ) { print '(default)'; } $font = Font_Metrics::get_font($family, $subtype); if ( $font ) { if ( $DEBUGCSS ) print '('.$font.")get_font_family]\n"; return$this->_font_family = $font; } throw new DOMPDF_Exception("Unable to find a suitable font replacement for: '" . $this->_props["font_family"] ."'"); } /** * Returns the resolved font size, in points * * @link http://www.w3.org/TR/CSS21/fonts.html#propdef-font-size * @return float */ function get_font_size() { if ( $this->__font_size_calculated ) { return $this->_props["font_size"]; } if ( !isset($this->_props["font_size"]) ) { $fs = self::$_defaults["font_size"]; } else { $fs = $this->_props["font_size"]; } if ( !isset($this->_parent_font_size) ) { $this->_parent_font_size = self::$default_font_size; } switch ((string)$fs) { case "xx-small": case "x-small": case "small": case "medium": case "large": case "x-large": case "xx-large": $fs = self::$default_font_size * self::$font_size_keywords[$fs]; break; case "smaller": $fs = 8/9 * $this->_parent_font_size; break; case "larger": $fs = 6/5 * $this->_parent_font_size; break; default: break; } // Ensure relative sizes resolve to something if ( ($i = mb_strpos($fs, "em")) !== false ) { $fs = mb_substr($fs, 0, $i) * $this->_parent_font_size; } else if ( ($i = mb_strpos($fs, "ex")) !== false ) { $fs = mb_substr($fs, 0, $i) * $this->_parent_font_size; } else { $fs = $this->length_in_pt($fs); } //see __set and __get, on all assignments clear cache! $this->_prop_cache["font_size"] = null; $this->_props["font_size"] = $fs; $this->__font_size_calculated = true; return $this->_props["font_size"]; } /** * @link http://www.w3.org/TR/CSS21/text.html#propdef-word-spacing * @return float */ function get_word_spacing() { if ( $this->_props["word_spacing"] === "normal" ) { return 0; } return $this->_props["word_spacing"]; } /** * @link http://www.w3.org/TR/CSS21/text.html#propdef-letter-spacing * @return float */ function get_letter_spacing() { if ( $this->_props["letter_spacing"] === "normal" ) { return 0; } return $this->_props["letter_spacing"]; } /** * @link http://www.w3.org/TR/CSS21/visudet.html#propdef-line-height * @return float */ function get_line_height() { $line_height = $this->_props["line_height"]; if ( $line_height === "normal" ) { return self::$default_line_height * $this->get_font_size(); } if ( is_numeric($line_height) ) { return $this->length_in_pt( $line_height . "em", $this->get_font_size()); } return $this->length_in_pt( $line_height, $this->_parent_font_size ); } /** * Returns the color as an array * * The array has the following format: * array(r,g,b, "r" => r, "g" => g, "b" => b, "hex" => "#rrggbb") * * @link http://www.w3.org/TR/CSS21/colors.html#propdef-color * @return array */ function get_color() { return $this->munge_color( $this->_props["color"] ); } /** * Returns the background color as an array * * The returned array has the same format as {@link Style::get_color()} * * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-color * @return array */ function get_background_color() { return $this->munge_color( $this->_props["background_color"] ); } /** * Returns the background position as an array * * The returned array has the following format: * array(x,y, "x" => x, "y" => y) * * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-position * @return array */ function get_background_position() { $tmp = explode(" ", $this->_props["background_position"]); switch ($tmp[0]) { case "left": $x = "0%"; break; case "right": $x = "100%"; break; case "top": $y = "0%"; break; case "bottom": $y = "100%"; break; case "center": $x = "50%"; $y = "50%"; break; default: $x = $tmp[0]; break; } if ( isset($tmp[1]) ) { switch ($tmp[1]) { case "left": $x = "0%"; break; case "right": $x = "100%"; break; case "top": $y = "0%"; break; case "bottom": $y = "100%"; break; case "center": if ( $tmp[0] === "left" || $tmp[0] === "right" || $tmp[0] === "center" ) { $y = "50%"; } else { $x = "50%"; } break; default: $y = $tmp[1]; break; } } else { $y = "50%"; } if ( !isset($x) ) { $x = "0%"; } if ( !isset($y) ) { $y = "0%"; } return array( 0 => $x, "x" => $x, 1 => $y, "y" => $y, ); } /** * Returns the background as it is currently stored * * (currently anyway only for completeness. * not used for further processing) * * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-attachment * @return string */ function get_background_attachment() { return $this->_props["background_attachment"]; } /** * Returns the background_repeat as it is currently stored * * (currently anyway only for completeness. * not used for further processing) * * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-repeat * @return string */ function get_background_repeat() { return $this->_props["background_repeat"]; } /** * Returns the background as it is currently stored * * (currently anyway only for completeness. * not used for further processing, but the individual get_background_xxx) * * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background * @return string */ function get_background() { return $this->_props["background"]; } /**#@+ * Returns the border color as an array * * See {@link Style::get_color()} * * @link http://www.w3.org/TR/CSS21/box.html#border-color-properties * @return array */ function get_border_top_color() { if ( $this->_props["border_top_color"] === "" ) { //see __set and __get, on all assignments clear cache! $this->_prop_cache["border_top_color"] = null; $this->_props["border_top_color"] = $this->__get("color"); } return $this->munge_color($this->_props["border_top_color"]); } function get_border_right_color() { if ( $this->_props["border_right_color"] === "" ) { //see __set and __get, on all assignments clear cache! $this->_prop_cache["border_right_color"] = null; $this->_props["border_right_color"] = $this->__get("color"); } return $this->munge_color($this->_props["border_right_color"]); } function get_border_bottom_color() { if ( $this->_props["border_bottom_color"] === "" ) { //see __set and __get, on all assignments clear cache! $this->_prop_cache["border_bottom_color"] = null; $this->_props["border_bottom_color"] = $this->__get("color"); } return $this->munge_color($this->_props["border_bottom_color"]); } function get_border_left_color() { if ( $this->_props["border_left_color"] === "" ) { //see __set and __get, on all assignments clear cache! $this->_prop_cache["border_left_color"] = null; $this->_props["border_left_color"] = $this->__get("color"); } return $this->munge_color($this->_props["border_left_color"]); } /**#@-*/ /**#@+ * Returns the border width, as it is currently stored * * @link http://www.w3.org/TR/CSS21/box.html#border-width-properties * @return float|string */ function get_border_top_width() { $style = $this->__get("border_top_style"); return $style !== "none" && $style !== "hidden" ? $this->length_in_pt($this->_props["border_top_width"]) : 0; } function get_border_right_width() { $style = $this->__get("border_right_style"); return $style !== "none" && $style !== "hidden" ? $this->length_in_pt($this->_props["border_right_width"]) : 0; } function get_border_bottom_width() { $style = $this->__get("border_bottom_style"); return $style !== "none" && $style !== "hidden" ? $this->length_in_pt($this->_props["border_bottom_width"]) : 0; } function get_border_left_width() { $style = $this->__get("border_left_style"); return $style !== "none" && $style !== "hidden" ? $this->length_in_pt($this->_props["border_left_width"]) : 0; } /**#@-*/ /** * Return an array of all border properties. * * The returned array has the following structure: * * array("top" => array("width" => [border-width], * "style" => [border-style], * "color" => [border-color (array)]), * "bottom" ... ) * * * @return array */ function get_border_properties() { return array( "top" => array( "width" => $this->__get("border_top_width"), "style" => $this->__get("border_top_style"), "color" => $this->__get("border_top_color"), ), "bottom" => array( "width" => $this->__get("border_bottom_width"), "style" => $this->__get("border_bottom_style"), "color" => $this->__get("border_bottom_color"), ), "right" => array( "width" => $this->__get("border_right_width"), "style" => $this->__get("border_right_style"), "color" => $this->__get("border_right_color"), ), "left" => array( "width" => $this->__get("border_left_width"), "style" => $this->__get("border_left_style"), "color" => $this->__get("border_left_color"), ), ); } /** * Return a single border property * * @param string $side * * @return mixed */ protected function _get_border($side) { $color = $this->__get("border_" . $side . "_color"); return $this->__get("border_" . $side . "_width") . " " . $this->__get("border_" . $side . "_style") . " " . $color["hex"]; } /**#@+ * Return full border properties as a string * * Border properties are returned just as specified in CSS: *
[width] [style] [color]
* e.g. "1px solid blue" * * @link http://www.w3.org/TR/CSS21/box.html#border-shorthand-properties * @return string */ function get_border_top() { return $this->_get_border("top"); } function get_border_right() { return $this->_get_border("right"); } function get_border_bottom() { return $this->_get_border("bottom"); } function get_border_left() { return $this->_get_border("left"); } /**#@-*/ function get_computed_border_radius($w, $h) { if ( !empty($this->_computed_border_radius) ) { return $this->_computed_border_radius; } $rTL = $this->__get("border_top_left_radius"); $rTR = $this->__get("border_top_right_radius"); $rBL = $this->__get("border_bottom_left_radius"); $rBR = $this->__get("border_bottom_right_radius"); if ( $rTL + $rTR + $rBL + $rBR == 0 ) { return $this->_computed_border_radius = array( 0, 0, 0, 0, "top-left" => 0, "top-right" => 0, "bottom-right" => 0, "bottom-left" => 0, ); } $t = $this->__get("border_top_width"); $r = $this->__get("border_right_width"); $b = $this->__get("border_bottom_width"); $l = $this->__get("border_left_width"); $rTL = min($rTL, $h - $rBL - $t/2 - $b/2, $w - $rTR - $l/2 - $r/2); $rTR = min($rTR, $h - $rBR - $t/2 - $b/2, $w - $rTL - $l/2 - $r/2); $rBL = min($rBL, $h - $rTL - $t/2 - $b/2, $w - $rBR - $l/2 - $r/2); $rBR = min($rBR, $h - $rTR - $t/2 - $b/2, $w - $rBL - $l/2 - $r/2); return $this->_computed_border_radius = array( $rTL, $rTR, $rBR, $rBL, "top-left" => $rTL, "top-right" => $rTR, "bottom-right" => $rBR, "bottom-left" => $rBL, ); } /**#@-*/ /** * Returns the outline color as an array * * See {@link Style::get_color()} * * @link http://www.w3.org/TR/CSS21/box.html#border-color-properties * @return array */ function get_outline_color() { if ( $this->_props["outline_color"] === "" ) { //see __set and __get, on all assignments clear cache! $this->_prop_cache["outline_color"] = null; $this->_props["outline_color"] = $this->__get("color"); } return $this->munge_color($this->_props["outline_color"]); } /**#@+ * Returns the outline width, as it is currently stored * @return float|string */ function get_outline_width() { $style = $this->__get("outline_style"); return $style !== "none" && $style !== "hidden" ? $this->length_in_pt($this->_props["outline_width"]) : 0; } /**#@+ * Return full outline properties as a string * * Outline properties are returned just as specified in CSS: *
[width] [style] [color]
* e.g. "1px solid blue" * * @link http://www.w3.org/TR/CSS21/box.html#border-shorthand-properties * @return string */ function get_outline() { $color = $this->__get("outline_color"); return $this->__get("outline_width") . " " . $this->__get("outline_style") . " " . $color["hex"]; } /**#@-*/ /** * Returns border spacing as an array * * The array has the format (h_space,v_space) * * @link http://www.w3.org/TR/CSS21/tables.html#propdef-border-spacing * @return array */ function get_border_spacing() { $arr = explode(" ", $this->_props["border_spacing"]); if ( count($arr) == 1 ) { $arr[1] = $arr[0]; } return $arr; } /*==============================*/ /* !important attribute For basic functionality of the !important attribute with overloading of several styles of an element, changes in inherit(), merge() and _parse_properties() are sufficient [helpers var $_important_props, __construct(), important_set(), important_get()] Only for combined attributes extra treatment needed. See below. div { border: 1px red; } div { border: solid; } // Not combined! Only one occurence of same style per context // div { border: 1px red; } div a { border: solid; } // Adding to border style ok by inheritance // div { border-style: solid; } // Adding to border style ok because of different styles div { border: 1px red; } // div { border-style: solid; !important} // border: overrides, even though not !important div { border: 1px dashed red; } // div { border: 1px red; !important } div a { border-style: solid; } // Need to override because not set Special treatment: At individual property like border-top-width need to check whether overriding value is also !important. Also store the !important condition for later overrides. Since not known who is initiating the override, need to get passed !important as parameter. !important Paramter taken as in the original style in the css file. When property border !important given, do not mark subsets like border_style as important. Only individual properties. Note: Setting individual property directly from css with e.g. set_border_top_style() is not needed, because missing set funcions handled by a generic handler __set(), including the !important. Setting individual property of as sub-property is handled below. Implementation see at _set_style_side_type() Callers _set_style_sides_type(), _set_style_type, _set_style_type_important() Related functionality for background, padding, margin, font, list_style */ /* Generalized set function for individual attribute of combined style. * With check for !important * Applicable for background, border, padding, margin, font, list_style * Note: $type has a leading underscore (or is empty), the others not. */ protected function _set_style_side_type($style, $side, $type, $val, $important) { $prop = $style.'_'.$side.$type; if ( !isset($this->_important_props[$prop]) || $important) { //see __set and __get, on all assignments clear cache! $this->_prop_cache[$prop] = null; if ( $important ) { $this->_important_props[$prop] = true; } $this->_props[$prop] = $val; } } protected function _set_style_sides_type($style,$top,$right,$bottom,$left,$type,$important) { $this->_set_style_side_type($style,'top',$type,$top,$important); $this->_set_style_side_type($style,'right',$type,$right,$important); $this->_set_style_side_type($style,'bottom',$type,$bottom,$important); $this->_set_style_side_type($style,'left',$type,$left,$important); } protected function _set_style_type($style,$type,$val,$important) { $val = preg_replace("/\s*\,\s*/", ",", $val); // when rgb() has spaces $arr = explode(" ", $val); switch (count($arr)) { case 1: $this->_set_style_sides_type($style,$arr[0],$arr[0],$arr[0],$arr[0],$type,$important); break; case 2: $this->_set_style_sides_type($style,$arr[0],$arr[1],$arr[0],$arr[1],$type,$important); break; case 3: $this->_set_style_sides_type($style,$arr[0],$arr[1],$arr[2],$arr[1],$type,$important); break; case 4: $this->_set_style_sides_type($style,$arr[0],$arr[1],$arr[2],$arr[3],$type,$important); break; } //see __set and __get, on all assignments clear cache! $this->_prop_cache[$style.$type] = null; $this->_props[$style.$type] = $val; } protected function _set_style_type_important($style,$type,$val) { $this->_set_style_type($style,$type,$val,isset($this->_important_props[$style.$type])); } /* Anyway only called if _important matches and is assigned * E.g. _set_style_side_type($style,$side,'',str_replace("none", "0px", $val),isset($this->_important_props[$style.'_'.$side])); */ protected function _set_style_side_width_important($style,$side,$val) { //see __set and __get, on all assignments clear cache! $this->_prop_cache[$style.'_'.$side] = null; $this->_props[$style.'_'.$side] = str_replace("none", "0px", $val); } protected function _set_style($style,$val,$important) { if ( !isset($this->_important_props[$style]) || $important) { if ( $important ) { $this->_important_props[$style] = true; } //see __set and __get, on all assignments clear cache! $this->_prop_cache[$style] = null; $this->_props[$style] = $val; } } protected function _image($val) { $DEBUGCSS=DEBUGCSS; $parsed_url = "none"; if ( mb_strpos($val, "url") === false ) { $path = "none"; //Don't resolve no image -> otherwise would prefix path and no longer recognize as none } else { $val = preg_replace("/url\(['\"]?([^'\")]+)['\"]?\)/","\\1", trim($val)); // Resolve the url now in the context of the current stylesheet $parsed_url = explode_url($val); if ( $parsed_url["protocol"] == "" && $this->_stylesheet->get_protocol() == "" ) { if ($parsed_url["path"][0] === '/' || $parsed_url["path"][0] === '\\' ) { $path = $_SERVER["DOCUMENT_ROOT"].'/'; } else { $path = $this->_stylesheet->get_base_path(); } $path .= $parsed_url["path"] . $parsed_url["file"]; $path = realpath($path); // If realpath returns FALSE then specifically state that there is no background image if ( !$path ) { $path = 'none'; } } else { $path = build_url($this->_stylesheet->get_protocol(), $this->_stylesheet->get_host(), $this->_stylesheet->get_base_path(), $val); } } if ($DEBUGCSS) { print "
[_image\n";
      print_r($parsed_url);
      print $this->_stylesheet->get_protocol()."\n".$this->_stylesheet->get_base_path()."\n".$path."\n";
      print "_image]
";; } return $path; } /*======================*/ /** * Sets color * * The color parameter can be any valid CSS color value * * @link http://www.w3.org/TR/CSS21/colors.html#propdef-color * @param string $color */ function set_color($color) { $col = $this->munge_color($color); if ( is_null($col) || !isset($col["hex"]) ) { $color = "inherit"; } else { $color = $col["hex"]; } //see __set and __get, on all assignments clear cache, not needed on direct set through __set $this->_prop_cache["color"] = null; $this->_props["color"] = $color; } /** * Sets the background color * * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-color * @param string $color */ function set_background_color($color) { $col = $this->munge_color($color); if ( is_null($col) ) { return; //$col = self::$_defaults["background_color"]; } //see __set and __get, on all assignments clear cache, not needed on direct set through __set $this->_prop_cache["background_color"] = null; $this->_props["background_color"] = is_array($col) ? $col["hex"] : $col; } /** * Set the background image url * @link http://www.w3.org/TR/CSS21/colors.html#background-properties * * @param string $val */ function set_background_image($val) { //see __set and __get, on all assignments clear cache, not needed on direct set through __set $this->_prop_cache["background_image"] = null; $this->_props["background_image"] = $this->_image($val); } /** * Sets the background repeat * * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-repeat * @param string $val */ function set_background_repeat($val) { if ( is_null($val) ) { $val = self::$_defaults["background_repeat"]; } //see __set and __get, on all assignments clear cache, not needed on direct set through __set $this->_prop_cache["background_repeat"] = null; $this->_props["background_repeat"] = $val; } /** * Sets the background attachment * * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-attachment * @param string $val */ function set_background_attachment($val) { if ( is_null($val) ) { $val = self::$_defaults["background_attachment"]; } //see __set and __get, on all assignments clear cache, not needed on direct set through __set $this->_prop_cache["background_attachment"] = null; $this->_props["background_attachment"] = $val; } /** * Sets the background position * * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background-position * @param string $val */ function set_background_position($val) { if ( is_null($val) ) { $val = self::$_defaults["background_position"]; } //see __set and __get, on all assignments clear cache, not needed on direct set through __set $this->_prop_cache["background_position"] = null; $this->_props["background_position"] = $val; } /** * Sets the background - combined options * * @link http://www.w3.org/TR/CSS21/colors.html#propdef-background * @param string $val */ function set_background($val) { $val = trim($val); $important = isset($this->_important_props["background"]); if ( $val === "none" ) { $this->_set_style("background_image", "none", $important); $this->_set_style("background_color", "transparent", $important); } else { $pos = array(); $tmp = preg_replace("/\s*\,\s*/", ",", $val); // when rgb() has spaces $tmp = preg_split("/\s+/", $tmp); foreach($tmp as $attr) { if ( mb_substr($attr, 0, 3) === "url" || $attr === "none" ) { $this->_set_style("background_image", $this->_image($attr), $important); } elseif ( $attr === "fixed" || $attr === "scroll" ) { $this->_set_style("background_attachment", $attr, $important); } elseif ( $attr === "repeat" || $attr === "repeat-x" || $attr === "repeat-y" || $attr === "no-repeat" ) { $this->_set_style("background_repeat", $attr, $important); } elseif ( ($col = $this->munge_color($attr)) != null ) { $this->_set_style("background_color", is_array($col) ? $col["hex"] : $col, $important); } else { $pos[] = $attr; } } if (count($pos)) { $this->_set_style("background_position", implode(" ", $pos), $important); } } //see __set and __get, on all assignments clear cache, not needed on direct set through __set $this->_prop_cache["background"] = null; $this->_props["background"] = $val; } /** * Sets the font size * * $size can be any acceptable CSS size * * @link http://www.w3.org/TR/CSS21/fonts.html#propdef-font-size * @param string|float $size */ function set_font_size($size) { $this->__font_size_calculated = false; //see __set and __get, on all assignments clear cache, not needed on direct set through __set $this->_prop_cache["font_size"] = null; $this->_props["font_size"] = $size; } /** * Sets the font style * * combined attributes * set individual attributes also, respecting !important mark * exactly this order, separate by space. Multiple fonts separated by comma: * font-style, font-variant, font-weight, font-size, line-height, font-family * * Other than with border and list, existing partial attributes should * reset when starting here, even when not mentioned. * If individual attribute is !important and explicite or implicite replacement is not, * keep individual attribute * * require whitespace as delimiters for single value attributes * On delimiter "/" treat first as font height, second as line height * treat all remaining at the end of line as font * font-style, font-variant, font-weight, font-size, line-height, font-family * * missing font-size and font-family might be not allowed, but accept it here and * use default (medium size, enpty font name) * * @link http://www.w3.org/TR/CSS21/generate.html#propdef-list-style * @param $val */ function set_font($val) { $this->__font_size_calculated = false; //see __set and __get, on all assignments clear cache, not needed on direct set through __set $this->_prop_cache["font"] = null; $this->_props["font"] = $val; $important = isset($this->_important_props["font"]); if ( preg_match("/^(italic|oblique|normal)\s*(.*)$/i",$val,$match) ) { $this->_set_style("font_style", $match[1], $important); $val = $match[2]; } else { $this->_set_style("font_style", self::$_defaults["font_style"], $important); } if ( preg_match("/^(small-caps|normal)\s*(.*)$/i",$val,$match) ) { $this->_set_style("font_variant", $match[1], $important); $val = $match[2]; } else { $this->_set_style("font_variant", self::$_defaults["font_variant"], $important); } //matching numeric value followed by unit -> this is indeed a subsequent font size. Skip! if ( preg_match("/^(bold|bolder|lighter|100|200|300|400|500|600|700|800|900|normal)\s*(.*)$/i", $val, $match) && !preg_match("/^(?:pt|px|pc|em|ex|in|cm|mm|%)/",$match[2]) ) { $this->_set_style("font_weight", $match[1], $important); $val = $match[2]; } else { $this->_set_style("font_weight", self::$_defaults["font_weight"], $important); } if ( preg_match("/^(xx-small|x-small|small|medium|large|x-large|xx-large|smaller|larger|\d+\s*(?:pt|px|pc|em|ex|in|cm|mm|%))\s*(.*)$/i",$val,$match) ) { $this->_set_style("font_size", $match[1], $important); $val = $match[2]; if ( preg_match("/^\/\s*(\d+\s*(?:pt|px|pc|em|ex|in|cm|mm|%))\s*(.*)$/i", $val, $match ) ) { $this->_set_style("line_height", $match[1], $important); $val = $match[2]; } else { $this->_set_style("line_height", self::$_defaults["line_height"], $important); } } else { $this->_set_style("font_size", self::$_defaults["font_size"], $important); $this->_set_style("line_height", self::$_defaults["line_height"], $important); } if( strlen($val) != 0 ) { $this->_set_style("font_family", $val, $important); } else { $this->_set_style("font_family", self::$_defaults["font_family"], $important); } } /**#@+ * Sets page break properties * * @link http://www.w3.org/TR/CSS21/page.html#page-breaks * @param string $break */ function set_page_break_before($break) { if ( $break === "left" || $break === "right" ) { $break = "always"; } //see __set and __get, on all assignments clear cache, not needed on direct set through __set $this->_prop_cache["page_break_before"] = null; $this->_props["page_break_before"] = $break; } function set_page_break_after($break) { if ( $break === "left" || $break === "right" ) { $break = "always"; } //see __set and __get, on all assignments clear cache, not needed on direct set through __set $this->_prop_cache["page_break_after"] = null; $this->_props["page_break_after"] = $break; } /**#@-*/ //........................................................................ /**#@+ * Sets the margin size * * @link http://www.w3.org/TR/CSS21/box.html#margin-properties * @param $val */ function set_margin_top($val) { $this->_set_style_side_width_important('margin','top',$val); } function set_margin_right($val) { $this->_set_style_side_width_important('margin','right',$val); } function set_margin_bottom($val) { $this->_set_style_side_width_important('margin','bottom',$val); } function set_margin_left($val) { $this->_set_style_side_width_important('margin','left',$val); } function set_margin($val) { $val = str_replace("none", "0px", $val); $this->_set_style_type_important('margin','',$val); } /**#@-*/ /**#@+ * Sets the padding size * * @link http://www.w3.org/TR/CSS21/box.html#padding-properties * @param $val */ function set_padding_top($val) { $this->_set_style_side_width_important('padding','top',$val); } function set_padding_right($val) { $this->_set_style_side_width_important('padding','right',$val); } function set_padding_bottom($val) { $this->_set_style_side_width_important('padding','bottom',$val); } function set_padding_left($val) { $this->_set_style_side_width_important('padding','left',$val); } function set_padding($val) { $val = str_replace("none", "0px", $val); $this->_set_style_type_important('padding','',$val); } /**#@-*/ /** * Sets a single border * * @param string $side * @param string $border_spec ([width] [style] [color]) * @param boolean $important */ protected function _set_border($side, $border_spec, $important) { $border_spec = preg_replace("/\s*\,\s*/", ",", $border_spec); //$border_spec = str_replace(",", " ", $border_spec); // Why did we have this ?? rbg(10, 102, 10) > rgb(10 102 10) $arr = explode(" ", $border_spec); // FIXME: handle partial values //For consistency of individal and combined properties, and with ie8 and firefox3 //reset all attributes, even if only partially given $this->_set_style_side_type('border',$side,'_style',self::$_defaults['border_'.$side.'_style'],$important); $this->_set_style_side_type('border',$side,'_width',self::$_defaults['border_'.$side.'_width'],$important); $this->_set_style_side_type('border',$side,'_color',self::$_defaults['border_'.$side.'_color'],$important); foreach ($arr as $value) { $value = trim($value); if ( in_array($value, self::$BORDER_STYLES) ) { $this->_set_style_side_type('border',$side,'_style',$value,$important); } else if ( preg_match("/[.0-9]+(?:px|pt|pc|em|ex|%|in|mm|cm)|(?:thin|medium|thick)/", $value ) ) { $this->_set_style_side_type('border',$side,'_width',$value,$important); } else { // must be color $this->_set_style_side_type('border',$side,'_color',$value,$important); } } //see __set and __get, on all assignments clear cache! $this->_prop_cache['border_'.$side] = null; $this->_props['border_'.$side] = $border_spec; } /** * Sets the border styles * * @link http://www.w3.org/TR/CSS21/box.html#border-properties * @param string $val */ function set_border_top($val) { $this->_set_border("top", $val, isset($this->_important_props['border_top'])); } function set_border_right($val) { $this->_set_border("right", $val, isset($this->_important_props['border_right'])); } function set_border_bottom($val) { $this->_set_border("bottom", $val, isset($this->_important_props['border_bottom'])); } function set_border_left($val) { $this->_set_border("left", $val, isset($this->_important_props['border_left'])); } function set_border($val) { $important = isset($this->_important_props["border"]); $this->_set_border("top", $val, $important); $this->_set_border("right", $val, $important); $this->_set_border("bottom", $val, $important); $this->_set_border("left", $val, $important); //see __set and __get, on all assignments clear cache, not needed on direct set through __set $this->_prop_cache["border"] = null; $this->_props["border"] = $val; } function set_border_width($val) { $this->_set_style_type_important('border','_width',$val); } function set_border_color($val) { $this->_set_style_type_important('border','_color',$val); } function set_border_style($val) { $this->_set_style_type_important('border','_style',$val); } /** * Sets the border radius size * * http://www.w3.org/TR/css3-background/#corners */ function set_border_top_left_radius($val) { $this->_set_border_radius_corner($val, "top_left"); } function set_border_top_right_radius($val) { $this->_set_border_radius_corner($val, "top_right"); } function set_border_bottom_left_radius($val) { $this->_set_border_radius_corner($val, "bottom_left"); } function set_border_bottom_right_radius($val) { $this->_set_border_radius_corner($val, "bottom_right"); } function set_border_radius($val) { $val = preg_replace("/\s*\,\s*/", ",", $val); // when border-radius has spaces $arr = explode(" ", $val); switch (count($arr)) { case 1: $this->_set_border_radii($arr[0],$arr[0],$arr[0],$arr[0]); break; case 2: $this->_set_border_radii($arr[0],$arr[1],$arr[0],$arr[1]); break; case 3: $this->_set_border_radii($arr[0],$arr[1],$arr[2],$arr[1]); break; case 4: $this->_set_border_radii($arr[0],$arr[1],$arr[2],$arr[3]); break; } } protected function _set_border_radii($val1, $val2, $val3, $val4) { $this->_set_border_radius_corner($val1, "top_left"); $this->_set_border_radius_corner($val2, "top_right"); $this->_set_border_radius_corner($val3, "bottom_right"); $this->_set_border_radius_corner($val4, "bottom_left"); } protected function _set_border_radius_corner($val, $corner) { $this->_has_border_radius = true; //see __set and __get, on all assignments clear cache! $this->_prop_cache["border_" . $corner . "_radius"] = null; $this->_props["border_" . $corner . "_radius"] = $this->length_in_pt($val); } /** * Sets the outline styles * * @link http://www.w3.org/TR/CSS21/ui.html#dynamic-outlines * @param string $val */ function set_outline($val) { $important = isset($this->_important_props["outline"]); $props = array( "outline_style", "outline_width", "outline_color", ); foreach($props as $prop) { $_val = self::$_defaults[$prop]; if ( !isset($this->_important_props[$prop]) || $important) { //see __set and __get, on all assignments clear cache! $this->_prop_cache[$prop] = null; if ( $important ) { $this->_important_props[$prop] = true; } $this->_props[$prop] = $_val; } } $val = preg_replace("/\s*\,\s*/", ",", $val); // when rgb() has spaces $arr = explode(" ", $val); foreach ($arr as $value) { $value = trim($value); if ( in_array($value, self::$BORDER_STYLES) ) { $this->set_outline_style($value); } else if ( preg_match("/[.0-9]+(?:px|pt|pc|em|ex|%|in|mm|cm)|(?:thin|medium|thick)/", $value ) ) { $this->set_outline_width($value); } else { // must be color $this->set_outline_color($value); } } //see __set and __get, on all assignments clear cache, not needed on direct set through __set $this->_prop_cache["outline"] = null; $this->_props["outline"] = $val; } function set_outline_width($val) { $this->_set_style_type_important('outline','_width',$val); } function set_outline_color($val) { $this->_set_style_type_important('outline','_color',$val); } function set_outline_style($val) { $this->_set_style_type_important('outline','_style',$val); } /** * Sets the border spacing * * @link http://www.w3.org/TR/CSS21/box.html#border-properties * @param float $val */ function set_border_spacing($val) { $arr = explode(" ", $val); if ( count($arr) == 1 ) { $arr[1] = $arr[0]; } //see __set and __get, on all assignments clear cache, not needed on direct set through __set $this->_prop_cache["border_spacing"] = null; $this->_props["border_spacing"] = "$arr[0] $arr[1]"; } /** * Sets the list style image * * @link http://www.w3.org/TR/CSS21/generate.html#propdef-list-style-image * @param $val */ function set_list_style_image($val) { //see __set and __get, on all assignments clear cache, not needed on direct set through __set $this->_prop_cache["list_style_image"] = null; $this->_props["list_style_image"] = $this->_image($val); } /** * Sets the list style * * @link http://www.w3.org/TR/CSS21/generate.html#propdef-list-style * @param $val */ function set_list_style($val) { $important = isset($this->_important_props["list_style"]); $arr = explode(" ", str_replace(",", " ", $val)); static $types = array( "disc", "circle", "square", "decimal-leading-zero", "decimal", "1", "lower-roman", "upper-roman", "a", "A", "lower-greek", "lower-latin", "upper-latin", "lower-alpha", "upper-alpha", "armenian", "georgian", "hebrew", "cjk-ideographic", "hiragana", "katakana", "hiragana-iroha", "katakana-iroha", "none" ); static $positions = array("inside", "outside"); foreach ($arr as $value) { /* http://www.w3.org/TR/CSS21/generate.html#list-style * A value of 'none' for the 'list-style' property sets both 'list-style-type' and 'list-style-image' to 'none' */ if ( $value === "none" ) { $this->_set_style("list_style_type", $value, $important); $this->_set_style("list_style_image", $value, $important); continue; } //On setting or merging or inheriting list_style_image as well as list_style_type, //and url exists, then url has precedence, otherwise fall back to list_style_type //Firefox is wrong here (list_style_image gets overwritten on explicite list_style_type) //Internet Explorer 7/8 and dompdf is right. if ( mb_substr($value, 0, 3) === "url" ) { $this->_set_style("list_style_image", $this->_image($value), $important); continue; } if ( in_array($value, $types) ) { $this->_set_style("list_style_type", $value, $important); } else if ( in_array($value, $positions) ) { $this->_set_style("list_style_position", $value, $important); } } //see __set and __get, on all assignments clear cache, not needed on direct set through __set $this->_prop_cache["list_style"] = null; $this->_props["list_style"] = $val; } function set_size($val) { $length_re = "/(\d+\s*(?:pt|px|pc|em|ex|in|cm|mm|%))/"; $val = mb_strtolower($val); if ( $val === "auto" ) { return; } $parts = preg_split("/\s+/", $val); $computed = array(); if ( preg_match($length_re, $parts[0]) ) { $computed[] = $this->length_in_pt($parts[0]); if ( isset($parts[1]) && preg_match($length_re, $parts[1]) ) { $computed[] = $this->length_in_pt($parts[1]); } else { $computed[] = $computed[0]; } } elseif ( isset(CPDF_Adapter::$PAPER_SIZES[$parts[0]]) ) { $computed = array_slice(CPDF_Adapter::$PAPER_SIZES[$parts[0]], 2, 2); if ( isset($parts[1]) && $parts[1] === "landscape" ) { $computed = array_reverse($computed); } } else { return; } $this->_props["size"] = $computed; } /** * Sets the CSS3 transform property * * @link http://www.w3.org/TR/css3-2d-transforms/#transform-property * @param string $val */ function set_transform($val) { $number = "\s*([^,\s]+)\s*"; $tr_value = "\s*([^,\s]+)\s*"; $angle = "\s*([^,\s]+(?:deg|rad)?)\s*"; if ( !preg_match_all("/[a-z]+\([^\)]+\)/i", $val, $parts, PREG_SET_ORDER) ) { return; } $functions = array( //"matrix" => "\($number,$number,$number,$number,$number,$number\)", "translate" => "\($tr_value(?:,$tr_value)?\)", "translateX" => "\($tr_value\)", "translateY" => "\($tr_value\)", "scale" => "\($number(?:,$number)?\)", "scaleX" => "\($number\)", "scaleY" => "\($number\)", "rotate" => "\($angle\)", "skew" => "\($angle(?:,$angle)?\)", "skewX" => "\($angle\)", "skewY" => "\($angle\)", ); $transforms = array(); foreach($parts as $part) { $t = $part[0]; foreach($functions as $name => $pattern) { if ( preg_match("/$name\s*$pattern/i", $t, $matches) ) { $values = array_slice($matches, 1); switch($name) { // units case "rotate": case "skew": case "skewX": case "skewY": foreach($values as $i => $value) { if ( strpos($value, "rad") ) { $values[$i] = rad2deg(floatval($value)); } else { $values[$i] = floatval($value); } } switch($name) { case "skew": if ( !isset($values[1]) ) { $values[1] = 0; } break; case "skewX": $name = "skew"; $values = array($values[0], 0); break; case "skewY": $name = "skew"; $values = array(0, $values[0]); break; } break; // units case "translate": $values[0] = $this->length_in_pt($values[0], $this->width); if ( isset($values[1]) ) { $values[1] = $this->length_in_pt($values[1], $this->height); } else { $values[1] = 0; } break; case "translateX": $name = "translate"; $values = array($this->length_in_pt($values[0], $this->width), 0); break; case "translateY": $name = "translate"; $values = array(0, $this->length_in_pt($values[0], $this->height)); break; // units case "scale": if ( !isset($values[1]) ) { $values[1] = $values[0]; } break; case "scaleX": $name = "scale"; $values = array($values[0], 1.0); break; case "scaleY": $name = "scale"; $values = array(1.0, $values[0]); break; } $transforms[] = array( $name, $values, ); } } } //see __set and __get, on all assignments clear cache, not needed on direct set through __set $this->_prop_cache["transform"] = null; $this->_props["transform"] = $transforms; } function set__webkit_transform($val) { $this->set_transform($val); } function set__webkit_transform_origin($val) { $this->set_transform_origin($val); } /** * Sets the CSS3 transform-origin property * * @link http://www.w3.org/TR/css3-2d-transforms/#transform-origin * @param string $val */ function set_transform_origin($val) { $values = preg_split("/\s+/", $val); if ( count($values) === 0) { return; } foreach($values as &$value) { if ( in_array($value, array("top", "left")) ) { $value = 0; } if ( in_array($value, array("bottom", "right")) ) { $value = "100%"; } } if ( !isset($values[1]) ) { $values[1] = $values[0]; } //see __set and __get, on all assignments clear cache, not needed on direct set through __set $this->_prop_cache["transform_origin"] = null; $this->_props["transform_origin"] = $values; } protected function parse_image_resolution($val) { // If exif data could be get: // $re = '/^\s*(\d+|normal|auto)(?:\s*,\s*(\d+|normal))?\s*$/'; $re = '/^\s*(\d+|normal|auto)\s*$/'; if ( !preg_match($re, $val, $matches) ) { return null; } return $matches[1]; } // auto | normal | dpi function set_background_image_resolution($val) { $parsed = $this->parse_image_resolution($val); $this->_prop_cache["background_image_resolution"] = null; $this->_props["background_image_resolution"] = $parsed; } // auto | normal | dpi function set_image_resolution($val) { $parsed = $this->parse_image_resolution($val); $this->_prop_cache["image_resolution"] = null; $this->_props["image_resolution"] = $parsed; } function set__dompdf_background_image_resolution($val) { $this->set_background_image_resolution($val); } function set__dompdf_image_resolution($val) { $this->set_image_resolution($val); } function set_z_index($val) { if ( round($val) != $val && $val !== "auto" ) { return; } $this->_prop_cache["z_index"] = null; $this->_props["z_index"] = $val; } function set_counter_increment($val) { $val = trim($val); $value = null; if ( in_array($val, array("none", "inherit")) ) { $value = $val; } else { if ( preg_match_all("/(".self::CSS_IDENTIFIER.")(?:\s+(".self::CSS_INTEGER."))?/", $val, $matches, PREG_SET_ORDER) ){ $value = array(); foreach($matches as $match) { $value[$match[1]] = isset($match[2]) ? $match[2] : 1; } } } $this->_prop_cache["counter_increment"] = null; $this->_props["counter_increment"] = $value; } /** * Generate a string representation of the Style * * This dumps the entire property array into a string via print_r. Useful * for debugging. * * @return string */ /*DEBUGCSS print: see below additional debugging util*/ function __toString() { return print_r(array_merge(array("parent_font_size" => $this->_parent_font_size), $this->_props), true); } /*DEBUGCSS*/ function debug_print() { /*DEBUGCSS*/ print "parent_font_size:".$this->_parent_font_size . ";\n"; /*DEBUGCSS*/ foreach($this->_props as $prop => $val ) { /*DEBUGCSS*/ print $prop.':'.$val; /*DEBUGCSS*/ if (isset($this->_important_props[$prop])) { /*DEBUGCSS*/ print '!important'; /*DEBUGCSS*/ } /*DEBUGCSS*/ print ";\n"; /*DEBUGCSS*/ } /*DEBUGCSS*/ } } dompdf-0.6.2/include/stylesheet.cls.php000066400000000000000000001172131263120276100201020ustar00rootroot00000000000000 * @author Helmut Tischer * @author Fabien Ménager * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License */ /** * The location of the default built-in CSS file. * {@link Stylesheet::DEFAULT_STYLESHEET} */ define('__DEFAULT_STYLESHEET', DOMPDF_LIB_DIR . DIRECTORY_SEPARATOR . "res" . DIRECTORY_SEPARATOR . "html.css"); /** * The master stylesheet class * * The Stylesheet class is responsible for parsing stylesheets and style * tags/attributes. It also acts as a registry of the individual Style * objects generated by the current set of loaded CSS files and style * elements. * * @see Style * @package dompdf */ class Stylesheet { /** * The location of the default built-in CSS file. */ const DEFAULT_STYLESHEET = __DEFAULT_STYLESHEET; /** * User agent stylesheet origin * * @var int */ const ORIG_UA = 1; /** * User normal stylesheet origin * * @var int */ const ORIG_USER = 2; /** * Author normal stylesheet origin * * @var int */ const ORIG_AUTHOR = 3; private static $_stylesheet_origins = array( self::ORIG_UA => -0x0FFFFFFF, // user agent style sheets self::ORIG_USER => -0x0000FFFF, // user normal style sheets self::ORIG_AUTHOR => 0x00000000, // author normal style sheets ); /** * Current dompdf instance * * @var DOMPDF */ private $_dompdf; /** * Array of currently defined styles * * @var Style[] */ private $_styles; /** * Base protocol of the document being parsed * Used to handle relative urls. * * @var string */ private $_protocol; /** * Base hostname of the document being parsed * Used to handle relative urls. * * @var string */ private $_base_host; /** * Base path of the document being parsed * Used to handle relative urls. * * @var string */ private $_base_path; /** * The styles defined by @page rules * * @var array
dompdf-0.6.2/www/demo.php000066400000000000000000000037111263120276100152530ustar00rootroot00000000000000load_html($_POST["html"]); $dompdf->set_paper($_POST["paper"], $_POST["orientation"]); $dompdf->render(); $dompdf->stream("dompdf_out.pdf", array("Attachment" => false)); exit(0); } ?>

Demo

Enter your html snippet in the text box below to see it rendered as a PDF: (Note by default, remote stylesheets, images & inline PHP are disabled.)

" method="post">

Paper size and orientation:

(Note: if you use a KHTML based browser and are having difficulties loading the sample output, try saving it to a file first.)

User input has been disabled for remote connections.

dompdf-0.6.2/www/examples.php000066400000000000000000000067721263120276100161570ustar00rootroot00000000000000

Samples

Below are some sample files. The PDF version is generated on the fly by dompdf. (The source HTML & CSS for these files is included in the test/ directory of the distribution package.)

array(), "css" => array(), "dom" => array(), "image" => array(), "page" => array(), "encoding" => array(), "script" => array(), "quirks" => array(), "other" => array(), ); foreach ( $test_files as $file ) { preg_match("@[\\/](([^_]+)_?(.*))\.(".implode("|", $extensions).")$@i", $file, $matches); $prefix = $matches[2]; if ( array_key_exists($prefix, $sections) ) { $sections[$prefix][] = array($file, $matches[3]); } else { $sections["other"][] = array($file, $matches[1]); } } foreach ( $sections as $section => $files ) { echo "

$section

"; echo "
    "; foreach ( $files as $file ) { $filename = basename($file[0]); $title = $file[1]; $arrow = "images/arrow_0" . rand(1, 6) . ".gif"; echo "
  • \n"; echo " [HTML] [PDF] "; echo $title; echo "
  • \n"; } echo "
"; } include "foot.inc"; dompdf-0.6.2/www/fonts.php000066400000000000000000000117251263120276100154640ustar00rootroot00000000000000

Font manager

Installed fonts

$variants) { ?> $path) { if ($i > 0) { echo ""; } echo " "; foreach ($extensions as $ext) { $v = ""; $class = ""; if (is_readable("$path.$ext")) { // if not cache file if (strpos($ext, ".php") === false) { $class = "ok"; $v = $ext; } // cache file else { // check if old cache format $content = file_get_contents("$path.$ext", null, null, null, 50); if (strpos($content, '$this->')) { $v = "DEPREC."; } else { ob_start(); $d = include "$path.$ext"; ob_end_clean(); if ($d == 1) $v = "DEPREC."; else { $class = "ok"; $v = $d["_version_"]; } } } } echo ""; } echo ""; $i++; } ?>
Font family Variants File versions
TTF AFM AFM cache UFM UFM cache
(default)'; } ?>
".htmlentities($name)." : ".htmlentities($path)."
$v

Install new fonts

Name
Normal
Bold
Bold italic
Italic
dompdf-0.6.2/www/foot.inc000066400000000000000000000005361263120276100152620ustar00rootroot00000000000000 dompdf-0.6.2/www/functions.inc.php000066400000000000000000000026631263120276100171140ustar00rootroot00000000000000Authenticate to access this section'; } function get_php_self(){ return isset($_SERVER['PHP_SELF']) ? htmlentities(strip_tags($_SERVER['PHP_SELF'],''), ENT_QUOTES, 'UTF-8') : ''; } // From apc.php function auth_check() { if ( isset($_GET["login"]) && DOMPDF_ADMIN_PASSWORD == "password" ) { $_SESSION["auth_message"] = "The password must be changed in 'dompdf_config.custom.inc.php'"; return false; } else { $_SESSION["auth_message"] = null; } if ( isset($_GET["login"]) || isset($_SERVER["PHP_AUTH_USER"]) ) { if (!isset($_SERVER["PHP_AUTH_USER"]) || !isset($_SERVER["PHP_AUTH_PW"]) || $_SERVER["PHP_AUTH_USER"] != DOMPDF_ADMIN_USERNAME || $_SERVER["PHP_AUTH_PW"] != DOMPDF_ADMIN_PASSWORD) { $PHP_SELF = get_php_self(); header('WWW-Authenticate: Basic realm="DOMPDF Login"'); header('HTTP/1.0 401 Unauthorized'); echo <<

Rejected!

Wrong Username or Password!
 
  Continue... EOB; exit; } else { $_SESSION["auth_message"] = null; $_SESSION["authenticated"] = true; return true; } } }dompdf-0.6.2/www/head.inc000066400000000000000000000036721263120276100152200ustar00rootroot00000000000000'; } function li_star() { return '
  • '; } auth_check(); ?> dompdf - The PHP 5 HTML to PDF Converter
    dompdf-0.6.2/www/images/000077500000000000000000000000001263120276100150615ustar00rootroot00000000000000dompdf-0.6.2/www/images/arrow_01.gif000066400000000000000000000003551263120276100172050ustar00rootroot00000000000000GIF89a 塝钎~}|zy⭬폎!, j'@80DP@)IV.5  b TDEH&$ҽ%xHA8 OQ7(#C#  ;" 4;!;dompdf-0.6.2/www/images/arrow_02.gif000066400000000000000000000003431263120276100172030ustar00rootroot00000000000000GIF89a 熄wtu갯~||ސޣâž!, `'dih @h1)x-Ǣ%d$g`1g 1Y@D!>DCD` 8B##Grq D % W(!;dompdf-0.6.2/www/images/arrow_03.gif000066400000000000000000000003501263120276100172020ustar00rootroot00000000000000GIF89a Թ򧦧zxw»򃀁⎋!, e'$qd$)*{"R@(!FEDk\AS By$݃  b@ 2&? :) [) "!;dompdf-0.6.2/www/images/arrow_04.gif000066400000000000000000000003731263120276100172100ustar00rootroot00000000000000GIF89a ɸҵؒwusޖ||ёť!, x'ch*eD%(2AY@@4LapfШ `H`b( 1( @" " # "!;dompdf-0.6.2/www/images/arrow_06.gif000066400000000000000000000004141263120276100172060ustar00rootroot00000000000000GIF89a䌊{wt}{¾𪤡!,'dia(z9a"$ !̈́U A|.} 0 AXQGp*Qᴘ>P `q0'W@aQVۓ1LW^p!ϼ}mu>qSsRZ`:Ĭm~SO,wFKaN ]nӕ7x8vZ/ᕢIۘW7DFvX_^ [AW<M0"auPiiIfNw=D8X!ra8MI\Bs i?u_gyVϻ G %@qiWbݥf- >Γ7X*P amb1F@h9 HnTՉB K.92 GQo>i|[Ιf2.tG:Xj K ҇in$e}K>>YYP3{^ @@3jT! pACCcWZ4MF6mq+gТEn>dWejD4CC `3`wh.w #ͷY{y5:w0!L9)MvQKk $@x=1 Hoa>LmWq<3N:7 ]OϤ60)7kI.jid8`Nha~hUI5\GWtK-5ɜ֦Z*Jvr)aA2p~lCT Sp r.1- K|14-WWL@3E2-b/^ ssΘgڞtM̬ӯ1s.{{\ghL neb[~WwNeleګl=N@6A =„L*)w.@cn {WyIHk̲P8LjMuVp+pcK,%f0XItL˼3Vdw|7 nN1u~>ϦVX{؄"1s{#5 `.v ͛pA5yM00 OJE MAtT^+;7Zqj brMx:ɈJ94E (B@mb.pSI\|ʒ (0%RLoN?ׅat1*Dkd)=AR$#(t|Cm%:cT,CI$eZj ?;c4I|wSjJ'K$cL4T?0ThkLKDNI,O SyD1Wi\:1u e^!c2\m˘6Y*2>_ɕ$5<4Q @&%&^ 9t0.]N%KI.kZmQ;ծksn)ѷ4zѿCZ5tkSg@z'U̵]? MF,CiB\&b\a\,4J˳hKA.5TMMjk^`Hs%}쾡j"%ja `[ :|Ԛډ.fP:Kd2`TĨ:{ɥ;0gJ&RU+ml!ΡE8wl:tL,Pp.P0*84zqlCrm G  Fb4;6) +Tw\3tWN&9a6%~J K]4S vUbԘYjo.@Ht~-Bo90ԒuצSE]ُ @!A7\dJ& "M!.K $ ;`dXd 7S=^BgW3gmgqL͜ 9e9ryd) q_ZZd"EcL q*$-wPr;iku͝,#0j<=Vٱ16`h4#$jRrܔаŌUp>;>)ý|. `T)s-X \ߣD:GP[3t>D% ǍE}8k#h(m,2NN;pʀGF{@=cNWj reu~:O (h'SfA32y݆a#b-q-Sk):<[-M#fɋ#10 zM"~Y:43aO֯ 07©QS4EB\t( ]03Zgϧ/;QQL(ơ  L8 pS)*yqC&4]S>F<`TC! ZR#rs ߭X:EvIPS挲d 1ksIuuˉE:Pkx\|DeY*s,u:]"ߏew,YϥмA|j4I2^jX7@Cu`1k0^L#SYV?ff)jD3|2N$MP] R1if3$uS=Uc$+s!YG]f כ8Gt'VX(,0H-ͫ],l6oTJ@ ,gY3344= (1ukU^Wwfy:-ml^ATqh{Tj3G5U֢M5;댲6HȬ&]68&Ojbnu8h)p`P+:-Վ.\gbu4N´\UVoI~JDNhNFsOXB 2)k%^f7 {CdP3uye#nIw9OP׬d@`2IglCDc(|N&ЯKPi]!t=gS !f pL2ݤZjLĘ2p raMf7R[;״}R;o<cHrR&V Ysc)['=TQ48S Km2][[&l]i\cu œY}rv\喻P:tFZ6FM.xt\qsrGMv @cR:嚔S2j)D">GL h}]ɨ+-C^GϺ1Nm/-^yVyܳ.~S}oo|4?~3{I3aώE8N6DLc<~j|v2|pI0.ǖy<k-o+髎?~?n~n gA)IZ 0VuiL$Iz}n9^#=aS":&q9T\4GXIձH񧞼Qo~twIc[ۿ*4Ӌ&{+/R~|;=&5ywSs3UWutpz>zjrDq1ntID'>'ωH1Rv%Y62Q9쌛srotCAܨm(&h_)=yH\S_s, ꃼGݿ~sZ&h{5XW @qr q c07xɵ0 -ysQٿy'>yI }?y FOn̜Hf=?}s!-OaP?3鞴h%Domt{ie+}.690¼' ɍܓ"=cp #nss_+BIWm{m2XQkiggb\fR4Oxusp7v|&{Z|:Q4wey!e T֏lV4 ڥ5Ct۱@Zl~7hi,7ˌԧ)7v,?Xr֎NngCn5wpHk5ZHkT?ϷIENDB`dompdf-0.6.2/www/images/favicon.ico000066400000000000000000000025761263120276100172140ustar00rootroot00000000000000h( {~              dompdf-0.6.2/www/images/favicon.png000066400000000000000000000004641263120276100172200ustar00rootroot00000000000000PNG  IHDR(-S]PLTE茈չѱː핒~{ެ߿SIDATxU Z@h)SC?mNڛķ}R|X],]@)TY-˃+8$32Ȅg+N 7g:7vuu 5 BmAyjj5IENDB`dompdf-0.6.2/www/images/h_bar.gif000066400000000000000000000025061263120276100166260ustar00rootroot00000000000000GIF89aX û! ,X 'dihlp,4͝ZiWpH,Ȥrl:E"T*"JEB\?x< A8 nF!bkH8&袲5hb(~!Yb؉[DXY{)Ih6MK%|PdZ^XRRIa YYЁ"Lp)~mUZUպ򚀧"l诼:F W<amlrq} q6T6Q- %]G1,ElA. T I<0(Vy|f5AT S9Df:5T[= zN^U 5$z$v]ܬyԢTMmxD& qOX+D@%㠡T[-]բF%|e1ta2  ,ЀNJ;` H O Ad8֓;ZմTȔQn(U'Jҏ|cOoH; O\"9C`Sސ< T. m`^Mk/ru`OdGH(L!# 2C!;dompdf-0.6.2/www/images/left_arrow.gif000066400000000000000000000004241263120276100177140ustar00rootroot00000000000000GIF89a ɸҵؒwusޖ||ёť!Created with The GIMP!, x'ґ()\AdXCAFM, A!!$OP(l FD@L(`8Af9܊Ax >#  # j=# p$!;dompdf-0.6.2/www/images/logo.png000066400000000000000000000046741263120276100165420ustar00rootroot00000000000000PNG  IHDRW!7bKGDJf R qIDAThZWW?ܙ3mg3=i6{q5(&((("FG.4M9/{w}k klGX `^}p-O03;A =/;!`ww] Rـ+  È A%2탫V*J?p)U*يcqh5jHDG*mzBU}lo}fP*T_WѵY1}8۷]$8>~,W.F|&O`;7xrh$צJ.ᖛf>`glwk>!:Z.ζqRDjW2[`;T($hb0X "D}=IWjo޼oeM;AG[;ZX".ح.;f57bs3~v 1xr)pWV!Q$u\_CUO ޝ.h8FUtW YPpfs$3h,y b$dYq:3Qz^V$TA%">m.u군16rd4Ngg@<죜7H"A!! ƵǸYw?AUϩ?EoOR XPH4@ ɢGTUv@ NJF(K)2t6rfs:<E&ng ̚Kre`2%uRtܔنƺZrl6B>E/eRRh ^m:>i\}*99G[F,*46[ɥŤfi a!tvx޷1 V)9[ldUO!^.ʠȡiK0E:TK! <2ఘFR[Ӽp:Jd /}6$VoXH5diL dA"}k;~}D : Y]NR͓Sdu2n R8{;i~(3`nGY*f10BVȬ{ d)Zb,TǴ8/`~hZ5혛'9hFuCNMBd)wٷD4˃ޭ6  G#iҨ'eqr9 d7Ņ9^l 6>z͂{L_''Ǽaap  ʮ8p4!FeL$y.Hpz57ҟJ*HpYgiuӊf2TI3$Wಫ[ޟ?y]>Q6?甎cKNs k? gB^S]Uy+cΔ u*Ϳl?j7vfںp3 3Y*Ye/ۏV,z4[>pcl ~/ܫ4*X*:k' hWye?pe~ν?b+NC1""IENDB`dompdf-0.6.2/www/images/logo.xcf000066400000000000000000000205141263120276100165250ustar00rootroot00000000000000gimp xcf fileW!BB$gimp-image-grid(style intersections) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches)  E=  PDF CREATOR      &gimp-text-layer (text "PDF CREATOR") (font "Silkscreen") (font-size 8.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgba 0.568627 0.556863 0.552941 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) q= =       "   " "   $ $    # 6  PDF ENGINE      %gimp-text-layer (text "PDF ENGINE") (font "Silkscreen") (font-size 8.000000) (font-size-unit pixels) (hinting yes) (antialias yes) (language "en-us") (base-direction ltr) (color (color-rgba 0.000000 0.000000 0.000000 1.000000)) (justify left) (box-mode dynamic) (box-unit pixels) 6 6 RqRnRm  0 0  0  0 "  0 0   F F   0 0W!border     W! W! 0@>qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=qq=q?@>nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=nn=n?@>mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=mm=m?@>==============================?qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm+Otitle     NOf 9Ozn1 51 51 5 " 5 "555 "555 "5鯖55 "5ߦ55¥רּ55槜55ӘȰ 55æ55ȱɨ555䫭˒rpШ؝ɩ55Ȓ׼ц}|ʝ㖮ӹr~ﶩ㿤߹5ԉÙȄԑҵޣ۞5֙ɞʔԖDZã뚩ޓ嗳ອ55•߸Șğޞō‹ҋ߱55ʫ55֕ÚݩʔԸĽ55ݩΪαɔɸȼŲ5ə ¾55 ̤555 ǥ 5%lj 5%ᣱ 5& 5& 5& 50 50 50 5>1 51 51 5 " 5 "555 "555 "555 "5㣓55𩄀55饙55֕Ȯ 55ģ55}{ƭǦ555骨ƎomХؚǨ55ɏ׽уzy͜璫}ָoz{ﴧ佢ܷ5ԅƔɀ׍Դޠڛ5Ӗ̚Ҟőґů;藧ޏꔱ丫55ÒߺƕݚÉՇஷ55ɪ55ڒ群ݦő䏚ִ´º55ᤡ¿ϧ̬Đ{Ƿǻ5Ǖտ 滸55 ɡ555 á 5%Ć 5%ޠ 5& 5& 5& 50 50 50 5>1 51 51 5 " 5 "555 ~"555 |"5񫒐55 "5碑55~5555ۓʮ| 55Ȣ55{y휤ĪŤ555mlСۚŧ55ΐЁxwҠ됭}۷nxyﶥ澡ص5҂̑~ۋسࠫٙ鼏5ΔҖҞҎŮ˸䖥ጵ跩55Ǒܓǒŕໜ~ڄ㫶55ʬ55ߐ㽤ﳜ’ߤ˿錚ۯǷ55堞Уʨyŵǻƻ5đڿ 洱ܗ55 ȡ555  5%„ 5%۠ 5& 5& 5& 50 50 50 5>a;g.( )(+%'' '" { UYU  [)(-xrZL?>. !r bOB6- P wh DChp<af][z~-go    " LW chli  9C 16:>>UYW %%! &*&*)& .=2=7=>"5黥55ǯ5555555555ܮ5 5ë5555̲5Ϸ555555 55 55 55 55 55 55 55 55 55 55 55 55 5ȫ5 55 5 "555ȭ5555­555555߭5 5é5555̯5ж555555 55 55 55 55 55 55 55 55 55 55 55 55 5ƨ5 55 5 "5񺠫55ɬ5555Ǭ555555㭪5 5¨5555̬ô5Ѷ555555 55 55 55 55 55 55 55 55 55 55 55 55 5Ƨ5 55 5 "_vqmd4j0p,xy i ~z}lhc_[ |} k   ` t[ 'W! background      W!! !@W!! !0@@@@+dompdf-0.6.2/www/images/php5-power-micro.png000066400000000000000000000004141263120276100207030ustar00rootroot00000000000000PNG  IHDRPbKGDWڲ pHYs  tIME m-BIDATH@0 Ew>q' HhwIIS-}4Oc(K۾Nxe YRAՖU!^L`wl;VCa$9&pNOث.Orp—.` RpPc;IENDB`dompdf-0.6.2/www/images/small_logo.png000066400000000000000000000015671263120276100177300ustar00rootroot00000000000000PNG  IHDRPtEXtCommentCreated with The GIMPd%nIDATHORaUkKjeyAr*ne+*<63h*EHn^Zb=4^Ξ}9.6ոxr;i~vV!A8p"tu"qz b5jhN s+3~R)IH̶+ @0HrdJq|{ggf-lD(t)JӪ5(MzR^OQGF3&Qi>HvPnBa&w`|>$$`tT2Qz{L xIY9.3- IzGix\D&(`/U RS2`ϱCzӼ XPL& rXTq}lh>G> {:ÊDޝ>ˤwd3ʔ.o1M'+3c#/I?2Eۣ'VX, GJ͡ϫbtcQJftv2ԤX$J%j%n,sXpD+-}e8 piO\X5ՁS.ST*6 \62<wr _K 乗]C|^HB>7$_+"sl6[Q2kғ+um[;ߩQä#]Fv&1 ;j7JAR$SݥZ1 [u7AK"H.=?!0POs5~W}tnIENDB`dompdf-0.6.2/www/images/star_01.gif000066400000000000000000000004721263120276100170240ustar00rootroot00000000000000GIF89aꖑӽ稥{yxݎ!,'PTdB@T4  6< # ix)B,Pm %Xl6er8WH z hG_ x$  6 x7)} 5 z$pK# {"#5%`0P  =HC=" /#"!;dompdf-0.6.2/www/images/star_02.gif000066400000000000000000000005041263120276100170210ustar00rootroot00000000000000GIF89aꚗʺø඲DZzwu»|z漾!,'dddŀk,ؕQsH0NBC<C%D8(!8 'P$1A( $ -k b$A S)   t+  01 1 tc+  " *)+!;dompdf-0.6.2/www/images/star_03.gif000066400000000000000000000004701263120276100170240ustar00rootroot00000000000000GIF89a隘ҶȾvrq}{҉ݞ!,'s cP*+Đad 1 @D6(QXTƪIT!H$S 12BL0.@d v{8)}?* 5| `+  n+{ * 6"" If[I+s092g"!;dompdf-0.6.2/www/images/star_04.gif000066400000000000000000000005171263120276100170270ustar00rootroot00000000000000GIF89a茈չѱː핒~{ެ!,' bd+aJLPDR6"fp"d"Lqy ѡ4b@>  b f$   2 z 3  9,  {Q2 D z ˷+f @* $ , $GA~!;dompdf-0.6.2/www/images/star_05.gif000066400000000000000000000005741263120276100170330ustar00rootroot00000000000000GIF89a¼Υߞ~|⮫!,'Xd~*3 (L Ur d4nl$0y@@`D.51tOĠ`@ V|n}  "<}n7 }B# n  q* x()}G )N [ V# 0~ ;  MyZ Mj#  `ARh`F@@HLHpBd ;dompdf-0.6.2/www/images/title.gif000066400000000000000000000056601263120276100167000ustar00rootroot00000000000000GIF89aLqnm»۸ӹ﨩}yw͘~!,L'dihlp,tmx|pH,Ȥrl:ODP2vtPܴ`xޕFcb4< Vz'^~ssab rcmwK O6 LL5b $I]o1}u%H~It2%J mx 7ЃA! iQKސAfo80QH<肱A , n-D  1,Lh t  ͣy4s!gU`)P}- ! O[~*=;B dP̬.́х?e ޢ@? BPp ] \ I9z 0n>_aA0EŒ6l"2EC 6 0 PO p'ab dܖ;Y4_1~mtЁTT 6i``p p!lWs_[`f6L5d]lCeq"U@ iA1xB @`i VȀC x֙DKZ@[: xPeѐRAF&dJ,HBCrЗi5(f 8Itf ,\&|6%&j챊.* @ ~R!SH dZրu0 0}+j8#:!qD4R <Qy0 9yaa %& +@:a@AYRd#2Ϯ@p pj7 !+4"(d18Ir%'|MAӑr0M=XPRBt@)^JX qP(@ H(3 jq'議t$ ȎdT _3Kpp$[D]d {0Şh'ba_mEa$/SxaTHzQ8 `,*k4I+1C 9z@~UpH#LqO@IԠA`p4¹G4УV8gḏًȋo2@;}FɸS@B t1Ae_k @-Q c`0DHbms;X @AuÀnbـ,< g(8GBkaNN2;B e䨣FA絽 <^R b<Ԛ 0p-f p)(8Lhi?2ql)y]NTΆ%^&4a5'p -ga >O~~D\7:74VND{'l,0dƼ ^C̟|)mS1Uɐ06-zB$._3&q ΰBAY1Cih 8@Ԩ @m)A |gmn>=s!X`0=u$N%:P&Cfyv} cAF0H@ GEiI-4(ҁ,\Ì2J V`bXSs=CuH B[K0 0RiÀS8VQG" pe %^v1|XW<0%0.XLgi^"rs,WS)$eX!gxC xx0v$A䒉nfkBab!I1D\dR!Au*(if$@AЧ G:>F84 @U%T |ۅ%ZZ"\Ƒf` K ŦRQA.*鮿KZD=_<ʨ\xn\OCl08i˦Դ&EF-PO `E sEBbۅw lȆ< \(R76b@I)$Z E1b/Xj17t R ds5A2cl#h h{4^ ݅QnB.Ū mêv߀w6D7%/Q@'@HNEn88]cͥ ]mIִ—i\nFHF4Ll_uRWK`b/@!hb ڶN/ANq@04Ak_\q[zHQAEe3`/؜2džxM}v9 ABAnIcW;9NCHxL*+D0P֬ 2ZpFkTH (I'|8 <b5/V p$68@wa|MZeM?;,G\ +bU01%bXƠAJbԭzL,B^Y;M y"3 l)[aU0/wI+k "\6 X7+(7JZtqy2! |",E1N73] (.'PCW@ͭ䵵~8.Du1],0^)&%ʙ5c70IàH*}D/$t-F -_~0v@ Rn!d]tكp@qY:]Hl<cnRߠJ̉cLLsng5 ZِgGKTZ433l,@x@%ۘ/ ߎgOI.i^$92R)t<`3`کm0)7]Y@m݀Z/Er= Y h, gW3Q\J,။mpAXƕ6O;??K;Vpxd dmTՑ631C2GÙ6. 1tEܟ7>[ ;dompdf-0.6.2/www/images/xhtml10.png000066400000000000000000000007411263120276100170660ustar00rootroot00000000000000PNG  IHDRPbKGDJf R pHYs  tIME 'L_3nIDATH1N@E}O@Ip3PР\*pAAi҄'4rWkvvW3NvSdw9YoiZ%"{dj^T9] X`Ę] m'?Ta~ `^J>lSCN:ݳS^ Y'lpr$H %cv$PÊ2|;] |KX/mDb27-ͮ߻m&xIC̚-ÿjQqT3T5תfkTՊHVcjviS^HfU3A50wVnUĄs{_zR ?Oh;'4IENDB`dompdf-0.6.2/www/index.php000066400000000000000000000017711263120276100154420ustar00rootroot00000000000000

    Overview

    dompdf is an HTML to PDF converter. At its heart, dompdf is (mostly) CSS2.1 compliant HTML layout and rendering engine written in PHP. It is a style-driven renderer: it will download and read external stylesheets, inline style tags, and the style attributes of individual HTML elements. It also supports most presentational HTML attributes.

    PDF rendering is currently provided either by PDFLib (www.pdflib.com) or by a bundled version the CPDF class, originally R&OS CPDF written by Wayne Munro but customized by the dompdf team to improve performance and add features. In order to use PDFLib with dompdf the PDFLib PHP extension is required (available from PDFLib). Using PDFLib improves performance and reduces the memory requirements of dompdf somewhat, while the CPDF class, though slightly slower, eliminates any dependencies on external PDF libraries.

    dompdf-0.6.2/www/setup.php000066400000000000000000000223521263120276100154710ustar00rootroot00000000000000

    Setup

    System Configuration

    array( "required" => "5.0", "value" => phpversion(), "result" => version_compare(phpversion(), "5.0"), ), "DOMDocument extension" => array( "required" => true, "value" => phpversion("DOM"), "result" => class_exists("DOMDocument"), ), "PCRE" => array( "required" => true, "value" => phpversion("pcre"), "result" => function_exists("preg_match") && @preg_match("/./u", "a"), "failure" => "PCRE is required with Unicode support (the \"u\" modifier)", ), "Zlib" => array( "required" => true, "value" => phpversion("zlib"), "result" => function_exists("gzcompress"), "fallback" => "Recommended to compress PDF documents", ), "MBString extension" => array( "required" => true, "value" => phpversion("mbstring"), "result" => function_exists("mb_send_mail"), // Should never be reimplemented in dompdf "fallback" => "Recommended, will use fallback functions", ), "GD" => array( "required" => true, "value" => phpversion("gd"), "result" => function_exists("imagecreate"), "fallback" => "Required if you have images in your documents", ), "opcache" => array( "required" => "For better performances", "value" => null, "result" => false, "fallback" => "Recommended for better performances", ), "GMagick or IMagick" => array( "required" => "Better with transparent PNG images", "value" => null, "result" => extension_loaded("gmagick") || extension_loaded("imagick"), "fallback" => "Recommended for better performances", ), ); if (($xc = extension_loaded("xcache")) || ($apc = extension_loaded("apc")) || ($zop = extension_loaded("Zend OPcache")) || ($op = extension_loaded("opcache"))) { $server_configs["opcache"]["result"] = true; $server_configs["opcache"]["value"] = ( $xc ? "XCache ".phpversion("xcache") : ( $apc ? "APC ".phpversion("apc") : ( $zop ? "Zend OPCache ".phpversion("Zend OPcache") : "PHP OPCache ".phpversion("opcache") ) ) ); } if (($gm = extension_loaded("gmagick")) || ($im = extension_loaded("imagick"))) { $server_configs["GMagick or IMagick"]["value"] = ($im ? "IMagick ".phpversion("imagick") : "GMagick ".phpversion("gmagick")); } ?> $server_config) { ?>
    Required Present
    "> No. ".$server_config["fallback"].""; } if (isset($server_config["failure"])) { echo "
    ".$server_config["failure"]."
    "; } } ?>

    DOMPDF Configuration

    array( "desc" => "Root directory of DOMPDF", "success" => "read", ), "DOMPDF_INC_DIR" => array( "desc" => "Include directory of DOMPDF", "success" => "read", ), "DOMPDF_LIB_DIR" => array( "desc" => "Third-party libraries directory of DOMPDF", "success" => "read", ), "DOMPDF_FONT_DIR" => array( "desc" => "Directory containing fonts loaded into DOMPDF", "success" => "write", ), "DOMPDF_FONT_CACHE" => array( "desc" => "Font metrics cache (used mainly by CPDF)", "success" => "write", ), "DOMPDF_TEMP_DIR" => array( "desc" => "Temporary folder", "success" => "write", ), "DOMPDF_CHROOT" => array( "desc" => "Restricted path", "success" => "read", ), "DOMPDF_UNICODE_ENABLED" => array( "desc" => "Unicode support (with supporting fonts)", ), "DOMPDF_ENABLE_FONTSUBSETTING" => array( "desc" => "Enable font subsetting, will make smaller documents when using Unicode fonts", ), "DOMPDF_PDF_BACKEND" => array( "desc" => "Backend library that renders the output (PDF, image)", "success" => "backend", ), "DOMPDF_DEFAULT_MEDIA_TYPE" => array( "desc" => "Default media type (print, screen, ...)", ), "DOMPDF_DEFAULT_PAPER_SIZE" => array( "desc" => "Default paper size (A4, letter, ...)", ), "DOMPDF_DEFAULT_FONT" => array( "desc" => "Default font, used if the specified font in the CSS stylesheet was not found", ), "DOMPDF_DPI" => array( "desc" => "DPI scale of the document", ), "DOMPDF_ENABLE_PHP" => array( "desc" => "Inline PHP support", ), "DOMPDF_ENABLE_JAVASCRIPT" => array( "desc" => "Inline JavaScript support", ), "DOMPDF_ENABLE_REMOTE" => array( "desc" => "Allow remote stylesheets and images", "success" => "remote", ), "DOMPDF_ENABLE_CSS_FLOAT" => array( "desc" => "Enable CSS float support (experimental)", ), "DOMPDF_ENABLE_HTML5PARSER" => array( "desc" => "Enable the HTML5 parser (experimental)", ), "DEBUGPNG" => array( "desc" => "Debug PNG images", ), "DEBUGKEEPTEMP" => array( "desc" => "Keep temporary image files", ), "DEBUGCSS" => array( "desc" => "Debug CSS", ), "DEBUG_LAYOUT" => array( "desc" => "Debug layout", ), "DEBUG_LAYOUT_LINES" => array( "desc" => "Debug text lines layout", ), "DEBUG_LAYOUT_BLOCKS" => array( "desc" => "Debug block elements layout", ), "DEBUG_LAYOUT_INLINE" => array( "desc" => "Debug inline elements layout", ), "DEBUG_LAYOUT_PADDINGBOX" => array( "desc" => "Debug padding boxes layout", ), "DOMPDF_LOG_OUTPUT_FILE" => array( "desc" => "The file in which dompdf will write warnings and messages", "success" => "write", ), "DOMPDF_FONT_HEIGHT_RATIO" => array( "desc" => "The line height ratio to apply to get a render like web browsers", ), "DOMPDF_ENABLE_AUTOLOAD" => array( "desc" => "Enable the DOMPDF autoloader", ), "DOMPDF_AUTOLOAD_PREPEND" => array( "desc" => "Prepend the dompdf autoload function to the SPL autoload functions already registered instead of appending it", ), "DOMPDF_ADMIN_USERNAME" => array( "desc" => "The username required to access restricted sections", "secret" => true, ), "DOMPDF_ADMIN_PASSWORD" => array( "desc" => "The password required to access restricted sections", "secret" => true, "success" => "auth", ), ); ?> $value) { ?>
    Config name Value Description Status
    >
    dompdf-0.6.2/www/style.css000066400000000000000000000076521263120276100155000ustar00rootroot00000000000000body, select { color: #7d7a7a; font-family: 'trebuchet ms', verdana, sans-serif; font-size: 13px; } a:link, a:visited, a:active { color: #5F83BA; text-decoration: none; } a:hover { color: #5f83ba; text-decoration: underline; } img { border: none; } pre, code { font-size: 0.8em; font-family: "lucida console", monospace; } pre { background-color: #f8f8f8; padding: 10px; } select { font-weight: bold; } h2 { margin: 0.3em 0; } .bar { background-image: url('images/h_bar.gif'); background-repeat: repeat-x; background-position: bottom right; } #header { height: 50px; line-height: 30px; } #footer { font-size: 0.75em; padding-top: 12px; background-image: url('images/h_bar.gif'); background-repeat: repeat-x; background-position: top left; height: 35px; vertical-align: middle; clear: both; } #logo { position: absolute; top: 0px; right: 0px; border: none; } .badges { float: right; } #left_col, #content { vertical-align: top; } /* #left_col { padding: 3px 3px 2em 3px; margin-top: 2px; width: 210px; padding-right: 10px; background-image: url('images/v_bar.gif'); background-repeat: repeat-y; background-position: top right; } */ #left_col { padding: 3px 3px 3em 3px; margin-top: 2px; width: 120px; padding-right: 10px; float: left; } #left_col h2 { font-size: 1.0em; margin-top: 0.5em; margin-bottom: 0.25em; } #left_col ul { margin-top: 0.25em; padding-left: 0px; margin-left: 0px; position: fixed; } #left_col ul li { list-style-position: inside; } #left_col iframe { margin-left: 40px; margin-top: 10px; } #content { margin-left: 120px; padding: 1em 1em 1em 2em; min-width: 800px; background-image: url('images/v_bar.gif'); background-repeat: repeat-y; background-position: top left; } .message { margin-top: 1em; border: 1px dashed #5E83BA; } #content li { margin-top: 0.3em; vertical-align: top; } #content>*>li { margin-right: 40px; /* keep things in line */ } #content h2 { text-align: left; color: #4A9166; } #content h3 { margin-top: 2em; } #content p { text-align: justify; } #content table td, #content table th { padding: 0.3em; } #content table td.input { white-space: nowrap; font-family: "lucida console", monospace; font-size: 0.8em; } #content textarea { padding: 4px; width: 100%; border: 1px dashed #5F83BA; -moz-box-shadow: inset 3px 3px 3px rgba(0,0,0,0.1); -webkit-box-shadow: inset 3px 3px 3px rgba(0,0,0,0.1); box-shadow: inset 3px 3px 3px rgba(0,0,0,0.1); } #content button { color: #6d6a6a; font-family: 'trebuchet ms', verdana, sans-serif; } #preview { float: right; height: 800px; min-width: 400px; width: 60%; border: 1px solid #666; margin-left: 1em; -moz-box-shadow: 0px 0px 6px rgba(0,0,0,0.5); -webkit-box-shadow: 0px 0px 6px rgba(0,0,0,0.5); box-shadow: 0px 0px 6px rgba(0,0,0,0.5); } table.setup { border: 1px solid #ccc; border-collapse: collapse; } table.setup td, table.setup th { border: 1px solid #ccc; } table.setup th { background-color: #ddd; } table.setup td.title { background-color: #f6f6f6; } table.setup td.ok, table.setup tr:hover td.ok { background-color: #9e4; } table.setup td.failed, table.setup tr:hover td.failed { background-color: #f43; color: white; } table.setup td.warning, table.setup tr:hover td.warning { background-color: #FCC612; } table.setup tr:hover td { background-color: #EBF1F7; } table.setup tr:hover td.title { background-color: #D0E0F2; } input[type="file"] { width: 30em; } /* Method definitions from phpdoc */ .method-definition { background-image: url('images/h_bar.gif'); background-position: bottom center; background-repeat: repeat-x; padding: 10px 10px 20px 10px; margin-bottom: 1em; } .method-title { color: #5F83BA; } .var-name, .method-name, .method-title { font-weight: bold; } .var-type, .method-result { color: #4A9166; font-style: italic; } dompdf-0.6.2/www/test/000077500000000000000000000000001263120276100145735ustar00rootroot00000000000000dompdf-0.6.2/www/test/backgroundcolor_fontdecoration_pageborder.html000066400000000000000000000110371263120276100261310ustar00rootroot00000000000000

    Background color, text decoration, page border

    see more testcases with background images in image_variants.html

     

    Text

    Link

     

    block inline block _underlinex block _underline stylex block _line-through stylex block _overline stylex block

     

    block inline block _underlinex block _underline stylex block _line-through stylex block _overline stylex block

     

    block inline block _underlinex block _underline stylex block _line-through stylex block _overline stylex block

     

    block inline block _underlinex block _underline stylex block _line-through stylex block _overline stylex block

     

    block inline underline sdfjsfh sdfs sfd sf sf sdfsdfasf asdfasdfa asdfasdf asdf asdfas dfasdf afsafasf asdfasdasdf adfasfasdf block

     

    block inline block underline block underline style block

     

    The PHP 5 HTML to PDF converter

    Fill fill fill fill fill fill fill fill

    Fill fill fill fill fill fill fill fill

    Fill fill fill fill fill fill fill fill

    Fill fill fill fill fill fill fill fill

    Fill fill fill fill fill fill fill fill

    Fill fill fill fill fill fill fill fill

    Fill fill fill fill fill fill fill fill

    dompdf-0.6.2/www/test/css/000077500000000000000000000000001263120276100153635ustar00rootroot00000000000000dompdf-0.6.2/www/test/css/common.css000066400000000000000000000036111263120276100173660ustar00rootroot00000000000000/* Notes -----------------------------------------------------------------------*/ .note_form { display: none; } /* Page -----------------------------------------------------------------------*/ .page { background-color: white; padding: 20px; font-size: 0.7em; margin-bottom: 15px; margin-right: 5px; } .page table.header td h1 { margin: 0px; } .page table.header { border-bottom: 1px solid black; } .page h1 { text-align: center; color: black; font-style: normal; font-size: 2em; } .page h2 { text-align: center; color: black; } .page h3 { color: black; font-size: 1em; } .page p { text-align: justify; font-size: 1em; } .page em { font-weight: bold; font-style: normal; text-decoration: underline; margin-left: 1%; margin-right: 1%; } .money_table { width: 85%; margin-left: auto; margin-right: auto; } .money { text-align: right; padding-right: 20px; } .money_field { text-align: right; padding: 0px 15px 5px 15px; font-weight: bold; } .total_label { border-top: 2px double black; font-weight: bold; } .total_field { border-top: 2px double black; text-align: right; padding: 0px 15px 5px 15px; font-weight: bold; } .written_field { border-bottom: 0.1pt solid black; } .page .indent * { margin-left: 4em; } .checkbox { border: 1px solid black; padding: 1px 2px; font-size: 7px; font-weight: bold; } table.fax_head { width: 100%; font-weight: bold; font-size: 1.1em; border-bottom: 1px solid black; } /* Sales-agreement specific -----------------------------------------------------------------------*/ table.sa_signature_box { margin: 2em auto 2em auto; } table.sa_signature_box tr td { padding-top: 1.5em; vertical-align: top; white-space: nowrap; } .special_conditions { font-style: italic; margin-left: 2em; white-space: pre; font-weight: bold; } .page h2 { text-align: left; } dompdf-0.6.2/www/test/css/importabs.css000066400000000000000000000000511263120276100200710ustar00rootroot00000000000000p.importabs {background-color:#ffffc0;} dompdf-0.6.2/www/test/css/importall.css000066400000000000000000000000471263120276100201010ustar00rootroot00000000000000li.import {background-color:#ffffc0;} dompdf-0.6.2/www/test/css/importdisplay.css000066400000000000000000000000461263120276100207750ustar00rootroot00000000000000p.import {background-color:#c0c0ff;} dompdf-0.6.2/www/test/css/importprint.css000066400000000000000000000000461263120276100204640ustar00rootroot00000000000000p.import {background-color:#eeeeee;} dompdf-0.6.2/www/test/css/importsub.css000066400000000000000000000000511263120276100201150ustar00rootroot00000000000000p.importsub {background-color:#ffffc0;} dompdf-0.6.2/www/test/css/linkall.css000066400000000000000000000000451263120276100175220ustar00rootroot00000000000000li.link {background-color:#ffffc0;} dompdf-0.6.2/www/test/css/linkdefault.css000066400000000000000000000000321263120276100203720ustar00rootroot00000000000000li.link {color:#ff0000;} dompdf-0.6.2/www/test/css/linkdisplay.css000066400000000000000000000000441263120276100204160ustar00rootroot00000000000000p.link {background-color:#c0c0ff;} dompdf-0.6.2/www/test/css/linkprint.css000066400000000000000000000000441263120276100201050ustar00rootroot00000000000000p.link {background-color:#eeeeee;} dompdf-0.6.2/www/test/css/print_static.css000066400000000000000000000247051263120276100206100ustar00rootroot00000000000000/* Default style definitions */ @import url(common.css); @page { margin: 0.25in; } /* General -----------------------------------------------------------------------*/ body { background-color: transparent; color: black; font-family: "verdana", "sans-serif"; margin: 0px; padding-top: 0px; font-size: 1em; } @media print { p { margin: 2px; } } h1 { font-size: 1.1em; font-style: italic; } h2 { font-size: 1.05em; } img { border: none; } pre { font-family: "verdana", "sans-serif"; font-size: 0.7em; } ul { list-style-type: circle; list-style-position: inside; margin: 0px; padding: 3px; } li.alpha { list-style-type: lower-alpha; margin-left: 15px; } p { font-size: 0.8em; } a:link, a:visited { /* font-weight: bold; */ text-decoration: none; color: black; } a:hover { text-decoration: underline; } #body { padding-bottom: 2em; padding-top: 5px; } #body pre { } .center { text-align: center; } .right { text-align: right; } #money { text-align: right; padding-right: 20px; } /* Footer -----------------------------------------------------------------------*/ #footer { color: black; } #copyright { padding: 5px; font-size: 0.6em; background-color: white; } #footer_spacer_row { width: 100%; } #footer_spacer_row td { padding: 0px; border-bottom: 1px solid #000033; background-color: #F7CF07; height: 2px; font-size: 2px; line-height: 2px; } #logos { padding: 5px; float: right; } /* Section Header -----------------------------------------------------------------------*/ #section_header { text-align: center; } #job_header { text-align: left; background-color: white; margin-left: 5px; padding: 5px; border: 1px dashed black; } #job_info { font-weight: bold; } .header_details td { font-size: 0.6em; } .header_label { padding-left: 20px; } .header_field { padding-left: 5px; font-weight: bold; } /* Content -----------------------------------------------------------------------*/ #content { padding: 0.2em 1% 0.2em 1%; min-height: 15em; } .page_buttons { text-align: center; margin: 3px; font-size: 0.7em; white-space: nowrap; font-weight: bold; width: 74%; } .link_bar { font-size: 0.7em; text-align: center; margin: auto; /* white-space: nowrap; */ } .link_bar a { white-space: nowrap; font-weight: bold; } .page_menu li { margin: 5px; font-size: 0.8em; } /* Detail -----------------------------------------------------------------------*/ .detail_table { border-top: 1px solid black; border-bottom: 1px solid black; padding: 3px; margin: 15px; } .detail_head td { background-color: #ddd; color: black; font-weight: bold; padding: 3px; font-size: 0.75em; text-align: center; } .detail_label { padding: 3px; font-size: 0.75em; width: 16%; border-top: 1px solid #fff; border-bottom: 1px solid #fff; background-color: #ddd; } .detail_field { width: 33%; font-size: 0.8em; color: ; text-align: center; padding: 3px; } .detail_sub_table { font-size: 1em; } .detail_spacer_row td { border-top: 1px solid white; border-bottom: 1px solid white; background-color: #999; font-size: 2px; line-height: 2px; } #narrow { width: 50%; } .operation { width: 1%; } .summary_spacer_row { font-size: 0.1em; } .bar { border-top: 1px solid black; } /* Forms -----------------------------------------------------------------------*/ .form { border-top: 1px solid black; border-bottom: 1px solid black; margin-top: 10px; } .form td { padding: 3px; } .form th, .form_head td { background-color: #ddd; border-bottom: 1px solid black; color: black; padding: 3px; text-align: center; font-size: 0.65em; font-weight: bold; } .form_head a:link, .form_head a:visited { color: black; } .form_head a:hover { } .sub_form_head td { border: none; font-size: 0.9em; white-space: nowrap; } .form input { color: black; background-color: white; border: 1px solid black; padding: 1px 2px 1px 2px; text-decoration: none; font-size: 1em; } .form textarea { color: black; background-color: white; border: 1px solid black; font-size: 1em; } .form select { color: black; background-color: white; font-size: 1em; } .button, a.button { color: black; background-color: white; border: 1px solid black; font-weight: normal; white-space: nowrap; text-decoration: none; } a.button { display: inline-block; text-align: center; padding: 2px; } a.button:hover { text-decoration: none; color: black; } .form_field { color: black; background-color: white; font-size: 0.7em; } .form_label { color: black; background-color: #ddd; font-size: 0.7em; padding: 3px; } /* .form_foot { background-color: #E5D9C3; font-size: 0.6em; } */ .form_foot td { background-color: #ddd; border-bottom: 1px solid black; color: black; padding: 3px; text-align: center; font-size: 0.65em; font-weight: bold; } .form_foot a:link, .form_foot a:visited { color: black; } .form_foot a:hover { color: black; } .no_border_input input { border: none; } .no_wrap { white-space: nowrap; } tr.row_form td { white-space: nowrap; } /* Wizards -----------------------------------------------------------------------*/ .wizard { font-size: 0.8em; border-top: 1px solid black; } #no_border { border: none; } .wizard p { text-indent: 2%; } .wizard td { padding: 3px; /* padding-left: 3px; padding-right: 3px; padding-bottom: 3px;*/ } .wizard input { color: black; background-color: white; border: 1px solid black; padding: 1px 2px 1px 2px; text-decoration: none; } .wizard textarea { color: black; background-color: white; border: 1px solid black; } .wizard select { color: black; background-color: white; border: 1px solid black; } .wizard_head { color: black; font-weight: bold; } .wizard_buttons { border-top: 1px solid black; padding-top: 3px; } .wizard_buttons a { background-color: white; border: 1px solid black; padding: 2px 3px 2px 3px; } /* List -----------------------------------------------------------------------*/ .list_table, .notif_list_table { color: black; padding-bottom: 4px; background-color: white; } .list_table td, .notif_list_table td { padding: 3px 5px 3px 5px; } .list_table input { color: black; background-color: white; border: 1px solid black; padding: 1px 2px 1px 2px; text-decoration: none; } .list_head, .notif_list_head { font-weight: bold; background-color: #ddd; font-size: 0.65em; } .list_head td, .notif_list_head td { border-top: 1px solid black; border-bottom: 1px solid black; color: black; text-align: center; white-space: nowrap; } .list_head a:link, .list_head a:visited, .notif_list_head a:link, .notif_list_head a:visited { color: black; } .list_head a:hover, .notif_list_head a:hover { } .list_foot { font-weight: bold; background-color: #ddd; font-size: 0.65em; } .list_foot td { border-top: 1px solid black; border-bottom: 1px solid black; color: black; text-align: right; white-space: nowrap; } .sub_list_head td { border: none; font-size: 0.7em; } .odd_row td { /* background-color: #EDF2F7; border-top: 2px solid #FFFFff;*/ background-color: transparent; border-bottom: 0.9px solid #ddd; /* 0.9 so table borders take precedence */ } .even_row td { /* background-color: #F8EEE4; border-top: 3px solid #FFFFff;*/ background-color: #f6f6f6; border-bottom: 0.9px solid #ddd; } .spacer_row td { line-height: 2px; font-size: 2px; } .phone_table td { border: none; font-size: 0.8em; } div.notif_list_text { margin-bottom: 1px; font-size: 1.1em; } .notif_list_row td.notif_list_job { text-align: center; font-weight: bold; font-size: 0.65em; } .notif_list_row td.notif_list_dismiss table td { text-align: center; font-size: 1em; border: none; padding: 0px 2px 0px 2px; } .notif_list_row td { padding: 5px 5px 7px 5px; border-bottom: 1px dotted #ddd; background-color: white; font-size: 0.6em; } .notif_list_row:hover td { background-color: #ddd; } /* Page -----------------------------------------------------------------------*/ .page { border: none; padding: 0in; margin-right: 0.1in; margin-left: 0.1in; /*margin: 0.33in 0.33in 0.4in 0.33in; */ background-color: transparent; } .page table.header h1{ font-size: 12pt; } .page>h2, .page>p { margin-top: 2pt; margin-bottom: 2pt; } .page h2 { page-break-after: avoid; } .money_table { border-collapse: collapse; font-size: 6pt; } /* Tree -----------------------------------------------------------------------*/ .tree_div { display: none; background-color: #ddd; border: 1px solid #333; } .tree_div .tree_step_bottom_border { border-bottom: 1px dashed #8B9DBE; } .tree_div .button, .tree_row_table .button, .tree_div .no_button { width: 110px; font-size: 0.7em; padding: 3px; text-align: center; } /* .tree_div .button a, .tree_row_table .button a { text-decoration: none; color: #114C8D; } */ .tree_row_desc { font-weight: bold; font-size: 0.7em; text-indent: -10px; } .tree_row_info { font-size: 0.7em; width: 200px; } .tree_div_head a, .tree_row_desc a { color: #000033; text-decoration: none; } .tree_div_head { font-weight: bold; font-size: 0.7em; } /* Summaries -----------------------------------------------------------------------*/ .summary { border: 1px solid black; background-color: white; padding: 1%; font-size: 0.8em; } .summary h1 { color: black; font-style: normal; } /* Sales-agreement specific -----------------------------------------------------------------------*/ table.sa_signature_box { margin: 2em auto 2em auto; } table.sa_signature_box tr td { padding-top: 1.25em; vertical-align: top; white-space: nowrap; } .special_conditions { font-style: italic; margin-left: 2em; white-space: pre; } .sa_head * { font-size: 7pt; } /* Change order specific -----------------------------------------------------------------------*/ table.change_order_items { font-size: 8pt; width: 100%; border-collapse: collapse; margin-top: 2em; margin-bottom: 2em; } table.change_order_items>tbody { border: 1px solid black; } table.change_order_items>tbody>tr>th { border-bottom: 1px solid black; } table.change_order_items>tbody>tr>td { border-right: 1px solid black; padding: 0.5em; } td.change_order_total_col { padding-right: 4pt; text-align: right; } td.change_order_unit_col { padding-left: 2pt; text-align: left; } dompdf-0.6.2/www/test/css_2d_transforms.html000066400000000000000000000100751263120276100211170ustar00rootroot00000000000000

    none

     

    rotate

     

    scale

     
     
     
     

    translate

     
     
     
     

    skew

     
     
     
     

    mixed

     
    dompdf-0.6.2/www/test/css_at_font_face.html000066400000000000000000000021571263120276100207460ustar00rootroot00000000000000

    Give You Glory

    Grumpy wizards make toxic brew for the evil Queen and Jack

    Wallpoet

    Grumpy wizards make toxic brew for the evil Queen and Jack

    Love Ya Like A Sister

    Grumpy wizards make toxic brew for the evil Queen and Jack

    dompdf-0.6.2/www/test/css_baseline.html000066400000000000000000000016511263120276100201160ustar00rootroot00000000000000

    (enter your text here)

    suptestsub

    dompdf-0.6.2/www/test/css_border.html000066400000000000000000000150341263120276100176110ustar00rootroot00000000000000
    dotted dashed solid double
    groove ridge inset outset

    partial attributes merged

    border:thin solid red;
    border:red thin solid;
    { border:thin solid; }{border:blue; } (merged, reset all - color has no effect)
    { border:thin solid; }{border-color:green; } (merged, overwrite only color)
    { border:thin solid; }{border:blue; } (merged, reset all - color has no effect)
    { border:thin solid; }{border-color:green; } (merged, overwrite only color)
    { border:thin blue solid; }{border-color:green; } (merged, overwrite only color)
    { border:thin blue solid; }{border-style:dashed; } (merged, overwrite only style)
    { border:thin blue solid; }{border-width:thick; } (merged, overwrite only width)
    { border:thin blue solid; }{border-width:medium; } (merged, overwrite only width)
    { border:thin blue solid; }{border-width:3pt; } (merged, overwrite only width)

    top:

    border-top:thin solid red;
    border-top:red thin solid;
    { border-top:thin solid; }{border-top-color:green; } (merged, overwrite only color)
    { border-top:thin solid; }{border-top:blue; } (merged, reset all - color has no effect)

    right left bottom:

    border-right:thin solid red;
    border-left:thin solid red;
    border-bottom:thin solid red;

    Individual Attributes

    {border:thin blue solid;}{border-top-color:red;}
    {border:thin blue solid;}{border-right-color:red;}
    {border:thin blue solid;}{border-bottom-color:red;}
    {border:thin blue solid;}{border-left-color:red;}
    {border:thin blue solid;}{border-top-style:dashed;}
    {border:thin blue solid;}{border-right-style:dashed;}
    {border:thin blue solid;}{border-bottom-style:dashed;}
    {border:thin blue solid;}{border-left-style:dashed;}
    {border:thin blue solid;}{border-top-width:medium;}
    {border:thin blue solid;}{border-right-width:medium;}
    {border:thin blue solid;}{border-bottom-width:medium;}
    {border:thin blue solid;}{border-left-width:medium;}

    Individual side specific Attributes

    {border:thin blue solid;}{border-color:red;}
    {border:thin blue solid;}{border-color:red green;}
    {border:thin blue solid;}{border-color:red green blue;}
    {border:thin blue solid;}{border-color:red green blue gray;}
    {border:thin blue solid;}{border-style:dashed;}
    {border:thin blue solid;}{border-style:dashed dotted;}
    {border:thin blue solid;}{border-style:dashed dotted double;}
    {border:thin blue solid;}{border-style:dashed dotted double groove;}
    {border:thin blue solid;}{border-width:1pt;}
    {border:thin blue solid;}{border-width:1pt 2pt;}
    {border:thin blue solid;}{border-width:1pt 2pt 3pt;}
    {border:thin blue solid;}{border-width:1pt 2pt 3pt 4pt;}

    Misc. values

    dompdf-0.6.2/www/test/css_border_radius.html000066400000000000000000000014701263120276100211570ustar00rootroot00000000000000
    dompdf-0.6.2/www/test/css_color_cmyk.html000066400000000000000000000017551263120276100205020ustar00rootroot00000000000000 All these rectangles should look red:


    CMYK JPEG:


    CMYK:
    dompdf-0.6.2/www/test/css_content.html000066400000000000000000000013771263120276100200130ustar00rootroot00000000000000 Look at the HTML source !

    quote <q>

    to

    dompdf-0.6.2/www/test/css_counter.html000066400000000000000000000043501263120276100200120ustar00rootroot00000000000000 12.5b counter-increment

    CSS2 Test Suite: 12.5 counter-increment

    [index page] [section] [Previous] [Next] [Specification]

    The style declarations contained within this page:

    span:before {content: counter(ct1) "|" counter(ct2) "|" counter(ct3) "... ";}
    li span:before {counter-increment: ct1;}
    li li span:before {counter-increment: ct2 2;}
    li li li span:before {counter-increment: ct3 -3;}
    
    

    The list items in the following set of lists all have 'span' elements, and each 'span' should be preceded with generated content in the form "a|b|c... " where the letters are incremented numbers. "a" numbers increment in ones, "b" in twos, and "c" in negative threes. Note that counters are not reset for each sublist, or at any point, and so should use the default '0' as their base point.

    • list item
    • list item
    • list item
      • list item
      • list item
      • list item
        • list item
      • list item
      • list item
        • list item
        • list item
        • list item
        • list item
      • list item
      • list item
    • list item
    • list item

    [index page] [section] [Previous] [Next] [Specification]
    dompdf-0.6.2/www/test/css_float.html000066400000000000000000000206111263120276100174360ustar00rootroot00000000000000
    fooo Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim.
    test foo

    Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum.
    fooo
    dompdf-0.6.2/www/test/css_font_selection.html000066400000000000000000000151141263120276100213460ustar00rootroot00000000000000

    Font Selection

    Available font-family:

    • serif (default) (Aliases: times, times-roman)
    • sans-serif (Aliases: helvetica)
    • monospace (Aliases: fixed, courier)

    Available font-style:

    • normal (default)
    • italic

    Available font-weight:

    • normal (default)
    • bold

    Other variations are falling back to a combination of the above

    Special fonts

    • symbol
    • zapfdingbats

    Font selection

    abcdefghijk ABCDEFGHIJK - (Helvetica) - (sans-serif) - sans-serif

    abcdefghijk ABCDEFGHIJK - (Helvetica) - (sans-serif) - helvetica

    abcdefghijk ABCDEFGHIJK - (Times-Roman) - (serif) - serif

    abcdefghijk ABCDEFGHIJK - (Times-Roman) - (serif) - times

    abcdefghijk ABCDEFGHIJK - (Times-Roman) - (serif) - times-roman

    abcdefghijk ABCDEFGHIJK - (Courier)- (monospace) - mononospace

    abcdefghijk ABCDEFGHIJK - (Courier)- (monospace) - fixed

    abcdefghijk ABCDEFGHIJK - (Courier)- (monospace) - courier

    Font search path

    abcdefghijk ABCDEFGHIJK - serif - "font-family:dummy1,dummy2;"

    abcdefghijk ABCDEFGHIJK - sans-serif - "font-family:dummy1,dummy2,sans-serif;"

    abcdefghijk ABCDEFGHIJK - sans-serif - "font-family:sans-serif,dummy1,dummy2;"

    abcdefghijk ABCDEFGHIJK - sans-serif - "font-family:sans-serif,courier;"

    Font variations

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:normal;"

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:lighter;"

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:100;"

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:200;"

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:300;"

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:400;"

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-style:normal; font-weight:500;"

    abcdefghijk ABCDEFGHIJK - serif - bold - "font-style:normal; font-weight:600;"

    abcdefghijk ABCDEFGHIJK - serif - bold - "font-style:normal; font-weight:700;"

    abcdefghijk ABCDEFGHIJK - serif - bold - "font-style:normal; font-weight:800;"

    abcdefghijk ABCDEFGHIJK - serif - bold - "font-style:normal; font-weight:900;"

    abcdefghijk ABCDEFGHIJK - serif - bold - "font-style:normal; font-weight:bold;"

    abcdefghijk ABCDEFGHIJK - serif - bold - "font-style:normal; font-weight:bolder;"

    abcdefghijk ABCDEFGHIJK - serif - italic - "font-style:italic; font-weight:normal;"

    abcdefghijk ABCDEFGHIJK - serif - italic - "font-style:oblique; font-weight:normal;"

    abcdefghijk ABCDEFGHIJK - serif - bold_italic - "font-style:italic; font-weight:bold;"

    abcdefghijk ABCDEFGHIJK - serif - normal - "font-variant:small-caps; font-style:normal; font-weight:normal;"

    Font size

    abcdefghijk ABCDEFGHIJK - xx-small

    abcdefghijk ABCDEFGHIJK - x-small

    abcdefghijk ABCDEFGHIJK - small

    abcdefghijk ABCDEFGHIJK - medium

    abcdefghijk ABCDEFGHIJK - large

    abcdefghijk ABCDEFGHIJK - x-large

    abcdefghijk ABCDEFGHIJK - xx-large

    abcdefghijk ABCDEFGHIJK - 10pt

    abcdefghijk ABCDEFGHIJK - 12pt

    abcdefghijk ABCDEFGHIJK - l4pt

    abcdefghijk ABCDEFGHIJK - smaller

    abcdefghijk ABCDEFGHIJK - larger

    Line height

    abcdefghijk ABCDEFGHIJK
    abcdefghijk ABCDEFGHIJK 100%

    abcdefghijk ABCDEFGHIJK
    abcdefghijk ABCDEFGHIJK 120%

    abcdefghijk ABCDEFGHIJK
    abcdefghijk ABCDEFGHIJK 140%

    abcdefghijk ABCDEFGHIJK
    abcdefghijk ABCDEFGHIJK 100%

    abcdefghijk ABCDEFGHIJK
    abcdefghijk ABCDEFGHIJK 120%

    abcdefghijk ABCDEFGHIJK
    abcdefghijk ABCDEFGHIJK 140%

    Font combined setting

    style="font:italic small-caps bold 14pt/160% sans-serif;"
    (all attributes)

    style="font:normal 10pt/160% sans-serif;"
    (partial attributes)

    style="font:700 10pt/160% sans-serif;"
    (partial attributes)

    style="font:small sans-serif;"
    (partial attributes)

    inherit style="font:italic small-caps bold 14pt/160% sans-serif;" :

    style="font:small sans-serif;"
    (partial attributes - reset inherited)
    style="font-weight:bold;"
    (partial overwrite)

    (resume partial attributes)

    continue inherited

    dompdf-0.6.2/www/test/css_important_flag.html000066400000000000000000000035131263120276100213410ustar00rootroot00000000000000

    Handling of "!important" property flag

    Normally later css style properties defined later are overriding earlier ones.
    Except if they are marked with the flag "!important".
    Those can only be overridden by style properties which are also marked "!important".

    There are two classes of property overriding

    • inherit (nested html tags)
    • merging (more css properties to the same html tag)

    This is handled similarly for all styles, so we check only examples here

    ul { line-height:160% }

    merge a { border-bottom:dashed 1pt red !important; text-decoration:none !important; }

    dummy links, text decoration/border bottom:

    Inherit .monospace { font-family:monospace !important; }

    font family selection:

    • (default)
    • font-family:sans-serif; (ignored)
    • font-family:sans-serif!important; (override)
    dompdf-0.6.2/www/test/css_letter_spacing.html000066400000000000000000000117571263120276100213470ustar00rootroot00000000000000

    This has letter spacing of 5px

    This has letter spacing of 4px

    This has letter spacing of 3px

    This has letter spacing of 2px

    This has letter spacing of 1px

    This has normal letter spacing

    This has letter spacing of -1px

    This has letter spacing of -2px

    This has letter spacing of -3px

    This has letter spacing of -4px

    This has letter spacing of -5px

    This has letter spacing of 5px

    This has letter spacing of 4px

    This has letter spacing of 3px

    This has letter spacing of 2px

    This has letter spacing of 1px

    This has normal letter spacing

    This has letter spacing of -1px

    This has letter spacing of -2px

    This has letter spacing of -3px

    This has letter spacing of -4px

    This has letter spacing of -5px

    This has letter spacing of 5px

    This has letter spacing of 4px

    This has letter spacing of 3px

    This has letter spacing of 2px

    This has letter spacing of 1px

    This has normal letter spacing

    This has letter spacing of -1px

    This has letter spacing of -2px

    This has letter spacing of -3px

    This has letter spacing of -4px

    This has letter spacing of -5px

    This has letter spacing of 5px. This has letter spacing of 5px. This has letter spacing of 5px.

    This has letter spacing of 4px. This has letter spacing of 4px. This has letter spacing of 4px.

    This has letter spacing of 3px. This has letter spacing of 3px. This has letter spacing of 3px.

    This has letter spacing of 2px. This has letter spacing of 2px. This has letter spacing of 2px.

    This has letter spacing of 1px. This has letter spacing of 1px. This has letter spacing of 1px.

    This has normal letter spacing. This has normal letter spacing. This has normal letter spacing.

    This has letter spacing of -1px. This has letter spacing of -1px. This has letter spacing of -1px.

    This has letter spacing of -2px. This has letter spacing of -2px. This has letter spacing of -2px.

    This has letter spacing of -3px. This has letter spacing of -3px. This has letter spacing of -3px.

    This has letter spacing of -4px. This has letter spacing of -4px. This has letter spacing of -4px.

    This has letter spacing of -5px. This has letter spacing of -5px. This has letter spacing of -5px.

    dompdf-0.6.2/www/test/css_margin.html000066400000000000000000000033471263120276100176150ustar00rootroot00000000000000

    (margin: 1em;) The PHP Development Team would like to announce the immediate availability of PHP 5.0.1. This is a maintenance release that in addition to many non-critical bug fixes also includes new UNIX and Windows installation docs which are now auto-generated from the PHP Manual.

    (margin: 1em 1em 1em 50%;) PHP 4.3.9RC1 has been released for testing. This is the first release candidate and should have a very low number of problems and/or bugs. Nevertheless, please download and test it as much as possible on real-life applications to uncover any remaining issues.

    (margin: 4em 1em 4em 1em;) PHP Tunisie has just released the second issue of its monthly french PHP Magazine. In this issue you'll find a large plan on PostgreSQL, Databases abstractions with PHP, your mini template engine, an article on images generation with PHP, the migration towards PHP5 with EasyPHP1.7... And many other articles and latests PHP news.

    (margin: 1em auto 1em auto;) The traditional International PHP Conference 2004 will be taking place from 7th November to 10th November in Frankfurt (FFM). The Call for Papers has been issued, so if you have an interesting talk, the organizers would love to hear about it! You can expect a gathering of PHP experts and core developers.

    dompdf-0.6.2/www/test/css_media.html000066400000000000000000000053771263120276100174240ustar00rootroot00000000000000

    css @media media types

    Depending on dompdf_config.inc.php setting DOMPDF_DEFAULT_MEDIA_TYPE here the background color appeares different:

    • print: light gray
    • screen: light blue
    • projection: light yellow

    css @import media types

    Depending on dompdf_config.inc.php setting DOMPDF_DEFAULT_MEDIA_TYPE here the background color appeares different:

    • print: light gray
    • screen or projection: light blue
    • all: this line yellow

    yellow by import css from subfolder

    yellow by import css from absolute local folder. Note: Only works if www\test\images/importabs.css was copied to /absimagetest/importabs.css

    css link media types

    • print: light gray
    • screen or projection: light blue

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    x

    dompdf-0.6.2/www/test/css_multiple_class.html000066400000000000000000000007051263120276100213530ustar00rootroot00000000000000

    class="a"

    class="b"

    class="c"

    class="a b"

    class="a b c"

    dompdf-0.6.2/www/test/css_nth_child.html000066400000000000000000000047101263120276100202670ustar00rootroot00000000000000 CSS Selector :nth-child

    nth-child(1)

    1

    2

    3

    4

    5

    nth-child(3)

    1

    2

    3

    4

    5

    nth-child(odd)

    1

    2

    3

    4

    5

    nth-child(even)

    1

    2

    3

    4

    5

    nth-child(n)

    1

    2

    3

    4

    5

    nth-child(3n)

    1

    2

    3

    4

    5

    nth-child(n+2)

    1

    2

    3

    4

    5

    nth-child(2n+1)

    1

    2

    3

    4

    5

    nth-child(3n-2)

    1

    2

    3

    4

    5

    dompdf-0.6.2/www/test/css_opacity.html000066400000000000000000000051571263120276100200110ustar00rootroot00000000000000

    Nested block elements










    Inline elements

    ab cb ef gh ij kl mn op qr st
    ab cb ef gh ij kl mn op qr st
    0.1
    0.2
    0.3
    0.4
    0.5
    0.6
    0.7
    0.8
    0.9
    1.0
    1.0 opacity
    No opacity
    dompdf-0.6.2/www/test/css_outline.html000066400000000000000000000052671263120276100200220ustar00rootroot00000000000000
    The dotted gray line is the border box
    dotted dashed solid double
    groove ridge inset outset

    partial attributes merged

    outline:thin solid red;
    outline:red thin solid;
    { outline:thin solid; }{outline:blue; } (merged, reset all - color has no effect)
    { outline:thin solid; }{outline-color:green; } (merged, overwrite only color)
    { outline:thin solid; }{outline:blue; } (merged, reset all - color has no effect)
    { outline:thin solid; }{outline-color:green; } (merged, overwrite only color)
    { outline:thin blue solid; }{outline-color:green; } (merged, overwrite only color)
    { outline:thin blue solid; }{outline-style:dashed; } (merged, overwrite only style)
    { outline:thin blue solid; }{outline-width:thick; } (merged, overwrite only width)
    { outline:thin blue solid; }{outline-width:medium; } (merged, overwrite only width)
    { outline:thin blue solid; }{outline-width:3pt; } (merged, overwrite only width)
    dompdf-0.6.2/www/test/css_overflow_hidden.html000066400000000000000000000016621263120276100215140ustar00rootroot00000000000000

    overflow: hidden

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor.

    overflow: visible

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor.
    dompdf-0.6.2/www/test/css_position_absolute.html000066400000000000000000000021221263120276100220700ustar00rootroot00000000000000 Printed document
    top/left
    top/right
    top/left/right
    top/left/right/bottom
    bottom/right
    bottom/left
    bottom/left/right
    dompdf-0.6.2/www/test/css_position_fixed.html000066400000000000000000000202131263120276100213520ustar00rootroot00000000000000 Printed document
    Header line 1
    Header line 2
    Header line 3
    Header line 4

    Section 1

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit.


    Section 2

    Ut velit mauris, egestas sed, gravida nec, ornare ut, mi. Aenean ut orci vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, ligula non tempus aliquam, nunc turpis ullamcorper nibh, in tempus sapien eros vitae ligula. Pellentesque rhoncus nunc et augue. Integer id felis. Curabitur aliquet pellentesque diam. Integer quis metus vitae elit lobortis egestas. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi vel erat non mauris convallis vehicula. Nulla et sapien. Integer tortor tellus, aliquam faucibus, convallis id, congue eu, quam. Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum posuere, metus purus iaculis lectus, et tristique ligula justo vitae magna.


    Section 3

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

    dompdf-0.6.2/www/test/css_selectors.html000066400000000000000000000024511263120276100203360ustar00rootroot00000000000000 a[target=equal_1] a[target='equal_2'] a[target="equal_3"] a[href$=ends_1] a[href$='ends_2'] a[href$="ends_3"]

    a[href*=contains_1] a[href*='contains_2'] a[href*="contains_3"]

    a[href^=starts_1] a[href^='starts_2'] a[href^="starts_3"] dompdf-0.6.2/www/test/css_table_height.html000066400000000000000000000005111263120276100207450ustar00rootroot00000000000000
    Some text
    dompdf-0.6.2/www/test/css_table_layout_fixed.html000066400000000000000000000241601263120276100221770ustar00rootroot00000000000000 Insert title here
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    Reallyyyyyyyyyy Looooooong cell conteeeent short Normal cell content
    short ReallyyyyyyyyyyLooooooong cell conteeeent Normal cell content
    dompdf-0.6.2/www/test/css_text_align.html000066400000000000000000000064131263120276100204730ustar00rootroot00000000000000

    text-align: left

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at odio vitae libero tempus convallis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla massa quis velit. Curabitur metus massa, semper mollis, molestie vel, adipiscing nec, massa.
    Phasellus vitae felis sed lectus dapibus facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis turpis vel magna. Cras eu est. Integer porttitor ligula a tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis leo. Nulla pellentesque molestie ante. Quisque vestibulum est id justo. Ut pellentesque ante in neque.

    text-align: center

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at odio vitae libero tempus convallis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla massa quis velit. Curabitur metus massa, semper mollis, molestie vel, adipiscing nec, massa.
    Phasellus vitae felis sed lectus dapibus facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis turpis vel magna. Cras eu est. Integer porttitor ligula a tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis leo. Nulla pellentesque molestie ante. Quisque vestibulum est id justo. Ut pellentesque ante in neque.

    text-align: right

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at odio vitae libero tempus convallis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla massa quis velit. Curabitur metus massa, semper mollis, molestie vel, adipiscing nec, massa.
    Phasellus vitae felis sed lectus dapibus facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis turpis vel magna. Cras eu est. Integer porttitor ligula a tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis leo. Nulla pellentesque molestie ante. Quisque vestibulum est id justo. Ut pellentesque ante in neque.

    text-align: justify

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at odio vitae libero tempus convallis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla massa quis velit. Curabitur metus massa, semper mollis, molestie vel, adipiscing nec, massa.
    Phasellus vitae felis sed lectus dapibus facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis turpis vel magna. Cras eu est. Integer porttitor ligula a tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis leo. Nulla pellentesque molestie ante. Quisque vestibulum est id justo. Ut pellentesque ante in neque.
    dompdf-0.6.2/www/test/css_text_decoration.html000066400000000000000000000102131263120276100215210ustar00rootroot00000000000000

    underline line-through overline

    underline line-through overline

    underline line-through overline

    underline line-through overline

    underline line-through overline

    underline line-through overline

    underline line-through overline

    underline line-through overline

    underline line-through overline

    underline line-through overline

    underline line-through overline

    underline line-through overline

    underline line-through overline

    underline line-through overline

    underline line-through overline

    underline line-through overline

    underline line-through overline

    underline line-through overline

    underline line-through overline

    underline line-through overline

    dompdf-0.6.2/www/test/css_vertical_align.html000066400000000000000000000025031263120276100213140ustar00rootroot00000000000000

    [Image]test

    [Image]test

    [Image]test

    [Image]test

    [Image]test

    [Image]test

    [Image]test

    [Image]test

    dompdf-0.6.2/www/test/css_vertical_align_w3.html000066400000000000000000000360171263120276100217340ustar00rootroot00000000000000 CSS1 Test Suite: 5.4.4 vertical-align

    The style declarations which apply to the text below are:

    P {font-size: 12pt;}
    .one {vertical-align: sub;}
    .two {vertical-align: super;}
    .three {vertical-align: top; font-size: 12pt;}
    .four {vertical-align: text-top; font-size: 12pt;}
    .five {vertical-align: middle; font-size: 12pt;}
    .six {vertical-align: bottom; font-size: 12pt;}
    .seven {vertical-align: text-bottom; font-size: 12pt;}
    .eight {vertical-align: baseline; font-size: 12pt;}
    .nine {vertical-align: 50%; font-size: 12px; line-height: 16px;}
    
    P.example {font-size: 14pt;}
    BIG {font-size: 16pt;}
    SMALL {font-size: 12pt;}
    .ttopalign {vertical-align: text-top;}
    .topalign {vertical-align: top;}
    .midalign {vertical-align: middle;}
    
    

    [Image]The first four words in this sentence should be subscript-aligned. The font size of the superscripted text should not be different from that of the parent element.

    [Image]The first four words in this sentence should be superscript-aligned. The font size of the subscripted text should not be different from that of the parent element.

    [Image]The first four words in this sentence should be top-aligned, which will align their tops with the top of the tallest element in the line (probably the orange rectangle).

    [Image] The first four words in this sentence should be text-top-aligned, which should align their tops with the top of the tallest text in the line.

    [Image] The image at the beginning of this sentence should be middle-aligned, which should align its middle with the point defined as the text baseline plus half the x-height.

    [Image] The first four words in this sentence should be 12pt in size and bottom-aligned, which should align their bottom with the bottom of the lowest element in the line.

    [Image] The first eight words ("eight" has a descender) in this sentence should be 12pt in size and text-bottom-aligned, which should align their bottom with the bottom of the lowest text (including descenders) in the line.

    [Image] The first four words in this sentence should be 12pt in size and baseline-aligned, which should align their baseline with the baseline of the rest of the text in the line.

    [Image]The first four words in this sentence should have a font-size of 12px and a line-height of 16px; they are also 50%-aligned, which should raise them 8px relative to the natural baseline.

    In the following paragraph, all images should be aligned with the top of the 14-point text, which is identical to the first section of text, whereas any size text should be aligned with the text baseline (which is the default value).

    This paragraph [Image] contains many images [Image] of varying heights [Image] and widths [Image] all of which [Image] should be aligned [Image] with the top of [Image] a 14-point text element [Image] regardless of the line in which [Image] the images appear. [Image]

    In the following paragraph, all images should be aligned with the middle of the default text, whereas any text should be aligned with the text baseline (which is the default value).

    This paragraph [Image] contains many images [Image] of varying heights [Image] and widths [Image] all of which [Image] should be aligned [Image] with the middle of [Image] a 14-point text element [Image] regardless of the line in which [Image] the images appear. [Image]

    In the following paragraph, all elements should be aligned with the top of the tallest element on the line, whether that element is an image or not. Each fragment of text has been SPANned appropriately in order to cause this to happen.

    This paragraph [Image] contains many images [Image] and some text [Image] of varying heights [Image] and widths [Image] all of which [Image] should be aligned [Image] with the top of [Image] the tallest element in [Image] whichever line the elements appear. [Image]

    TABLE Testing Section

    [Image]The first four words in this sentence should be subscript-aligned. The font size of the superscripted text should not be different from that of the parent element.

    [Image]The first four words in this sentence should be superscript-aligned. The font size of the subscripted text should not be different from that of the parent element.

    [Image]The first four words in this sentence should be top-aligned, which will align their tops with the top of the tallest element in the line (probably the orange rectangle).

    [Image] The first four words in this sentence should be text-top-aligned, which should align their tops with the top of the tallest text in the line.

    [Image] The image at the beginning of this sentence should be middle-aligned, which should align its middle with the point defined as the text baseline plus half the x-height.

    [Image] The first four words in this sentence should be 12pt in size and bottom-aligned, which should align their bottom with the bottom of the lowest element in the line.

    [Image] The first eight words ("eight" has a descender) in this sentence should be 12pt in size and text-bottom-aligned, which should align their bottom with the bottom of the lowest text (including descenders) in the line.

    [Image] The first four words in this sentence should be 12pt in size and baseline-aligned, which should align their baseline with the baseline of the rest of the text in the line.

    [Image]The first four words in this sentence should have a font-size of 12px and a line-height of 16px; they are also 50%-aligned, which should raise them 8px relative to the natural baseline.

    In the following paragraph, all images should be aligned with the top of the 14-point text, which is identical to the first section of text, whereas any size text should be aligned with the text baseline (which is the default value).

    This paragraph [Image] contains many images [Image] of varying heights [Image] and widths [Image] all of which [Image] should be aligned [Image] with the top of [Image] a 14-point text element [Image] regardless of the line in which [Image] the images appear. [Image]

    In the following paragraph, all images should be aligned with the middle of the default text, whereas any text should be aligned with the text baseline (which is the default value).

    This paragraph [Image] contains many images [Image] of varying heights [Image] and widths [Image] all of which [Image] should be aligned [Image] with the middle of [Image] a 14-point text element [Image] regardless of the line in which [Image] the images appear. [Image]

    In the following paragraph, all elements should be aligned with the top of the tallest element on the line, whether that element is an image or not. Each fragment of text has been SPANned appropriately in order to cause this to happen.

    This paragraph [Image] contains many images [Image] and some text [Image] of varying heights [Image] and widths [Image] all of which [Image] should be aligned [Image] with the top of [Image] the tallest element in [Image] whichever line the elements appear. [Image]

    dompdf-0.6.2/www/test/css_whitespace.html000066400000000000000000000035061263120276100204710ustar00rootroot00000000000000 CSS white-space property

    CSS white-space property

    Given this CSS code:

    p {
      width:100px;
      background-color:orange;
      margin:10px 0;
      font-family:monospace;
    }
    

    and this HTML code:

    <p>
    P
      A
        R
          A
            G
              R
                A
                  P
                    H
    </p>
    

    Depending on the white-space property, the resulting presentation will be:


    normal

    P A R A G R A P H


    nowrap

    P A R A G R A P H


    pre

    P A R A G R A P H


    pre-wrap

    P A R A G R A P H


    pre-line

    P A R A G R A P H

    dompdf-0.6.2/www/test/css_word_wrap.html000066400000000000000000000013671263120276100203440ustar00rootroot00000000000000

    break-word

    I'm a veeeeeeeerryyyyyy loooooooonggggggg teeeeexxxtttt

    http://www.w3.org/TR/2011/WD-css3-text-20110412/

    normal

    I'm a veeeeeeeerryyyyyy loooooooonggggggg teeeeexxxtttt

    http://www.w3.org/TR/2011/WD-css3-text-20110412/

    dompdf-0.6.2/www/test/css_z_index.html000066400000000000000000000025561263120276100200010ustar00rootroot00000000000000 z-index
    z-index: 3, order: 1
    z-index: 2, order: 2
    z-index: 1, order: 3
    z-index: auto, order: 1
    z-index: auto, order: 2
    z-index: auto, order: 3
    dompdf-0.6.2/www/test/demo_01.html000066400000000000000000000136571263120276100167210ustar00rootroot00000000000000

    SCHEDULE A

    Job: 132-003

    Job: 132-003 Purchasers(s): Palmer
    Created: 2004-08-13 Last Change: 2004-08-16 9:28 AM
    Address: 667 Pine Lodge Dr. Legal: N/A
    Model: Franklin Elevation: B Size: 1160 Cu. Ft. Style: Reciprocating

    Standard Items:

    Item Description Quantity Unit Cost Total
    1 Sprockets (13 tooth) 50 $10.00 Ea. $5,000.00
    2 Cogs (Cylindrical) 45 $25.00 Ea. $1125.00
    3 Gears (15 tooth) 32 $19.00 Ea. $608.00
    4 Leaf springs (13 N/m) 6 $125.00 Ea. $750.00
    5 Coil springs (6 N/deg) 7 $11.00 Ea. $77.00
    (Tax is not included; it will be collected on closing.) GRAND TOTAL: $7560.00
    WITNESS:  PURCHASER:X
      Mr. Leland Palmer
    This change order shall have no force or effect until approved and signed by an authorizing signing officer of the supplier. Any change or special request not noted on this document is not contractual.
    ACCEPTED THIS   DAY OF  , 20 . TWIN PEAKS SUPPLY LTD.

    PER:  
    dompdf-0.6.2/www/test/dom_anchor_link.html000066400000000000000000000234221263120276100206120ustar00rootroot00000000000000

    Lorem ipsum dolor sit amet

    Anchor 1

    link to anchor3

    dompdf.github.com

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at odio vitae libero tempus convallis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla massa quis velit. Curabitur metus massa, semper mollis, molestie vel, adipiscing nec, massa. Phasellus vitae felis sed lectus dapibus facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis turpis vel magna. Cras eu est. Integer porttitor ligula a tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis leo. Nulla pellentesque molestie ante. Quisque vestibulum est id justo. Ut pellentesque ante in neque.

    Curabitur ut diam eu dui vestibulum pharetra. Nam pellentesque, justo non hendrerit venenatis, mi orci pretium mi, et vehicula leo arcu quis diam. Nullam mattis laoreet quam. Morbi mollis sem ut tellus. Nam mi massa, lobortis eu, sollicitudin et, iaculis et, massa. Maecenas purus mauris, luctus sit amet, pharetra in, facilisis sit amet, elit. Nullam vel erat tempus purus molestie suscipit. Vestibulum odio lorem, sollicitudin non, volutpat sit amet, tincidunt vel, nunc. Nulla quis ante vestibulum odio feugiat facilisis. Proin lorem nisl, viverra at, rhoncus quis, semper nec, mi. Donec euismod enim vitae velit. Nulla sed lectus. Vivamus placerat, lacus sed vehicula sagittis, arcu massa adipiscing lorem, bibendum luctus nisl tortor vitae leo.

    Etiam a mauris. Proin justo elit, accumsan sit amet, tempus et, blandit id, tellus. Morbi varius, nisi id iaculis aliquam, lacus ligula facilisis velit, ac pharetra ipsum augue a massa. Etiam rhoncus commodo orci. Mauris ullamcorper sagittis turpis. Nullam magna libero, sagittis sed, auctor faucibus, accumsan vitae, urna. Pellentesque volutpat. Aliquam sapien ipsum, eleifend nec, imperdiet vitae, consectetuer id, quam. Donec a urna. Suspendisse sit amet velit. Curabitur quis nisi id dui viverra ornare. Sed condimentum enim quis tortor. Ut condimentum, magna non tempus tincidunt, leo nibh molestie tellus, vitae convallis dolor ante sed ante. Nunc et metus. Phasellus ultricies. Fusce faucibus tortor sit amet mauris.

    Aliquam enim. Duis et diam. Praesent porta, mauris quis pellentesque volutpat, erat elit vulputate eros, vitae pulvinar augue velit sit amet sem. Fusce eu urna eu nisi condimentum posuere. Vivamus sed felis. Duis eget urna vitae eros interdum dignissim. Proin justo eros, eleifend in, porttitor in, malesuada non, neque. Etiam sed augue. Nulla sit amet magna. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Mauris facilisis. Curabitur massa magna, pulvinar a, nonummy eget, egestas vitae, mauris. Quisque vel elit sit amet lorem malesuada facilisis. Vestibulum porta, metus sit amet egestas interdum, urna justo euismod erat, id tristique urna leo quis nibh. Morbi non erat.

    Cras fringilla, nulla id egestas elementum, augue nunc iaculis nibh, ac adipiscing nibh justo id tortor. Donec vel orci a nisi ultricies aliquet. Nunc urna quam, adipiscing molestie, vehicula non, condimentum non, magna. Integer magna. Donec quam metus, pulvinar id, suscipit eget, euismod ac, orci. Nulla facilisi. Nullam nec mauris. Morbi in mi. Etiam urna lectus, pulvinar ac, sollicitudin eu, euismod ac, lectus. Fusce elit. Sed ultricies odio ac felis.

    Cras iaculis. Nulla facilisi.

    Anchor 2

    link to anchor1

    Cras iaculis. Nulla facilisi. Fusce vitae arcu. Integer lectus mauris, ornare vel, accumsan eget, scelerisque vel, nunc. Maecenas justo urna, volutpat vel, vehicula vel, ullamcorper nec, odio. Suspendisse laoreet nisi sed erat. Cras convallis sollicitudin sapien. Phasellus ac erat eu mi rutrum rhoncus. Morbi et velit. Morbi odio nisi, pharetra eget, sollicitudin sed, aliquam at, nisl. Quisque euismod diam in sapien. Integer accumsan urna in risus.

    Proin sit amet nisl. Phasellus dui ipsum, laoreet a, pulvinar id, fringilla ut, libero. In hac habitasse platea dictumst. Maecenas mi magna, cursus sed, rutrum eget, molestie nec, dui. Suspendisse lacus. Vivamus nibh urna, accumsan sit amet, gravida sed, convallis a, leo. Cras sollicitudin orci sit amet eros. Pellentesque eu odio et velit tempor dignissim. Morbi vehicula malesuada enim. Pellentesque tincidunt, tellus ac fringilla tempor, justo libero interdum nunc, eu sollicitudin tortor augue nec tellus. Nullam eget leo quis tellus gravida faucibus. Nam gravida. Curabitur rhoncus egestas nunc. Curabitur mollis, nisi sed suscipit gravida, enim felis interdum justo, vel accumsan magna nunc ut libero. Ut fermentum. Fusce luctus, est sit amet feugiat lobortis, nisl eros bibendum libero, ut suscipit felis ligula in massa. Proin congue elit et nisi. Cras ac nisl. Nunc ullamcorper neque vel diam.

    Ut pellentesque arcu ac lectus.

    Sed ac lorem. Ut pellentesque arcu ac lectus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque ultrices metus sollicitudin pede. Donec fermentum est a velit fringilla mollis. Duis ligula. Fusce viverra laoreet odio. Suspendisse sit amet ligula. Maecenas nunc velit, sagittis eu, bibendum eu, placerat at, nibh. Praesent ut erat eget nisi gravida imperdiet. Quisque vitae sapien. Ut eros.

    Donec eros ligula, dignissim vel, ultricies id, mattis in, massa. Duis lobortis dui nec orci. Sed ullamcorper metus non massa. Aliquam eget mauris ac nulla elementum posuere. Sed porta, augue vitae rhoncus aliquet, felis quam eleifend est, vitae rutrum metus arcu vel lorem. Proin laoreet, mauris sit amet aliquet eleifend, nisl sem molestie nisi, eu varius eros ligula non erat. Integer ac sem. Suspendisse lectus. Aliquam erat volutpat. Fusce sit amet leo faucibus erat molestie ultrices. Maecenas lacinia lectus eget dui. Etiam porta porttitor ante. Phasellus sit amet lacus adipiscing enim mollis iaculis. Fusce congue, nulla a commodo aliquam, erat dui fermentum dui, pellentesque faucibus orci enim at mauris. Pellentesque a diam porta magna tempor posuere. Donec lorem.

    Sed viverra aliquam turpis. Aliquam lacus. Duis id massa. Nullam ante. Suspendisse condimentum. Donec adipiscing, felis vel semper sollicitudin, lacus justo pretium est, sed blandit pede risus eu ante. Praesent ante nulla, fringilla id, ultrices et, feugiat a, metus. Proin ac velit a metus suscipit fermentum. Integer aliquet. Sed sapien nulla, placerat at, rutrum at, condimentum quis, libero. In accumsan, tellus nec tincidunt malesuada, pede arcu commodo ipsum, ac mattis tortor urna vitae enim. Aenean nonummy, mauris eget commodo bibendum, augue sem ultrices nunc, eget rhoncus metus erat placerat lectus. Aliquam mollis lectus in justo. Vivamus iaculis lacus sit amet ligula. Etiam consectetuer convallis diam. Curabitur sollicitudin, felis eu vehicula scelerisque, nisl urna aliquam orci, sit amet laoreet mi turpis id ligula. Donec at enim non nulla adipiscing dapibus. Aenean nisl.

    Ut in lacus nec enim volutpat pellentesque. Integer euismod. In odio eros, malesuada in, mattis vel, tempor nec, sem. In libero tellus, varius vitae, bibendum in, elementum quis, nisl. Duis tortor. Etiam at justo. Pellentesque facilisis mauris non nunc. Praesent eros mi, dapibus eget, placerat ac, lobortis quis, sem. Nulla rhoncus turpis. Nulla vitae mi. Proin id massa. Nunc eros.

    Aliquam molestie pulvinar ligula.

    Anchor 3

    link to anchor2

    Vestibulum dui risus, varius ut, semper et, consequat ultrices, felis. Pellentesque iaculis urna in velit. Ut pharetra. Nunc fringilla, nisi vitae fringilla placerat, enim justo semper erat, mollis feugiat leo neque eu sem. Vestibulum orci urna, suscipit a, accumsan nec, fringilla in, risus. Nullam ante. Nullam nec eros. Nullam varius. Nulla facilisi. In auctor libero in metus. Aliquam porttitor congue eros. Nulla facilisi. Mauris euismod turpis ut felis. Ut nunc nisl, cursus quis, eleifend at, viverra bibendum, lacus. Donec consequat lacus eu sapien. Fusce pulvinar lectus quis nunc. In hac habitasse platea dictumst.

    Aliquam molestie pulvinar ligula. Maecenas imperdiet, urna eget ultrices adipiscing, nibh ante elementum neque, id molestie massa quam ut nunc. Nullam porta. Phasellus a magna in sem volutpat viverra. Quisque aliquet nunc ac turpis. Mauris dolor enim, viverra rutrum, placerat et, laoreet et, justo. In id nulla. Donec erat. Phasellus nec mi sed velit mollis cursus. Vestibulum tincidunt. Praesent dui libero, facilisis eu, vulputate eget, aliquet nec, ipsum. Pellentesque in nisl in mauris pretium euismod.

    dompdf-0.6.2/www/test/dom_br.html000066400000000000000000000037461263120276100167350ustar00rootroot00000000000000

    Line break test

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at odio vitae libero tempus convallis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla massa quis velit. Curabitur metus massa, semper mollis, molestie vel,
    adipiscing nec, massa. Phasellus vitae felis sed lectus dapibus facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis turpis vel magna. Cras eu est. Integer porttitor ligula a

    tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis leo. Nulla pellentesque molestie ante. Quisque vestibulum est id justo. Ut pellentesque ante in neque.

    Line break at beginning of next paragraph:


    Line 2

    Line break within a font tag: ABCDE
    FGHIJK

    Line break within two nested spans: span 1 2
    break

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at odio vitae libero tempus convallis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla massa quis velit. Curabitur metus massa, semper mollis, molestie vel,
    adipiscing nec, massa. Phasellus vitae felis sed lectus dapibus facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis turpis vel magna. Cras eu est. Integer porttitor ligula a

    tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis leo. Nulla pellentesque molestie ante. Quisque vestibulum est id justo. Ut pellentesque ante in neque.

    dompdf-0.6.2/www/test/dom_form_fieldset.html000066400000000000000000000023501263120276100211420ustar00rootroot00000000000000 Insert title here
    legend








    << input type hidden
    << input type image




    dompdf-0.6.2/www/test/dom_large_table.html000066400000000000000000001160551263120276100205710ustar00rootroot00000000000000

    SCHEDULE A

    404-135 - Schedule A

    APPROVED: 2004-11-18
    Job: 404-135 Purchasers: Komant
    Created: 2004-09-28 Last change: 2004-11-18
    Job address: 2904-26 Street Legal: 28B/22/032-5210
    Model: Elevation: Size: Style:
    Item Description Quantity Unit Cost Total
    Standard items:
    1 add bank of drawers - to bathroom vanity 2 $125.00 Ea. $250.00
    2 add sweep outlet - central vac 1 $100.00 Ea. $100.00
    3 run central vac rough in to attached garage c/w separate circuit 1 $120.00 Ea. $120.00
    4 add fan to FIREPLACE 1 $195.00 Ea. $195.00
    5 upgrade to laminate flooring - Entire Main Floor 1 $2,400.00 Ea. $2,400.00
    6 upgrade oh door to insulated (9ft) 1 $95.00 Ea. $95.00
    7 change upper stairwell ledge to painted MDF 1 $45.00 Ea. $45.00
    8 upgrade standard door to pocket door 1 $145.00 Ea. $145.00
    9 add RIDP 1 $400.00 Ea. $400.00
    Standard items:
    1 add bank of drawers - to bathroom vanity 2 $125.00 Ea. $250.00
    2 add sweep outlet - central vac 1 $100.00 Ea. $100.00
    3 run central vac rough in to attached garage c/w separate circuit 1 $120.00 Ea. $120.00
    4 add fan to FIREPLACE 1 $195.00 Ea. $195.00
    5 upgrade to laminate flooring - Entire Main Floor 1 $2,400.00 Ea. $2,400.00
    6 upgrade oh door to insulated (9ft) 1 $95.00 Ea. $95.00
    7 change upper stairwell ledge to painted MDF 1 $45.00 Ea. $45.00
    8 upgrade standard door to pocket door 1 $145.00 Ea. $145.00
    9 add RIDP 1 $400.00 Ea. $400.00
    Custom items:
    1 upgrade to brushed chrome hardware 1 $195.00 Ea. $195.00
    2 box out FIREPLACE as per plan attached 1 $250.00 Ea. $250.00
    3 reduce WIC size by 6" to 8" to allow for large vanity ensuite 1 $0.00 Ea. $0.00
    4 add gas line to basement for future gas FP 1 $300.00 Ea. $300.00
    5 add pocket dorr to ensuite joining WIC and Ensuite. Delete 2 existing doors 1 $0.00 Ea. $0.00
    6 Main floor to be ISLAND Kitchen design 1 $0.00 Ea. $0.00
    7 price adjustment 1 ($0.37) Ea. ($0.37)
    Custom items:
    1 upgrade to brushed chrome hardware 1 $195.00 Ea. $195.00
    2 box out FIREPLACE as per plan attached 1 $250.00 Ea. $250.00
    3 reduce WIC size by 6" to 8" to allow for large vanity ensuite 1 $0.00 Ea. $0.00
    4 add gas line to basement for future gas FP 1 $300.00 Ea. $300.00
    5 add pocket dorr to ensuite joining WIC and Ensuite. Delete 2 existing doors 1 $0.00 Ea. $0.00
    (GST is not included)   Grand total: $4,494.63
    WITNESS:  PURCHASER: X
      Tammy Komant

    This change order shall have no force or effect until approved and signed by an authorizing signing officer of the Builder. Any change or special request not noted on this document is not contractual.

    ACCEPTED THIS 18 DAY OF NOVEMBER, 2004 LINCOLNBERG COMMUNITIES

    PER: Keith Jansen
    dompdf-0.6.2/www/test/dom_long_table.php000066400000000000000000000012411263120276100202470ustar00rootroot00000000000000 " . ($i * $j) . "\n"; } ?>
    Header
    Footer
    dompdf-0.6.2/www/test/dom_nbsp.html000066400000000000000000000032171263120276100172650ustar00rootroot00000000000000 Non-breaking space

    Non-breaking space representations:

    Non-breaking space character 
    &nbsp; 
    &#160; 
    &#xA0; 

    With non-breaking space:  a  b  c 

    Without non-breaking space: a b c

    no wrap no wrap no wrap no wrap no wrap no wrap no wrap no wrap
    dompdf-0.6.2/www/test/dom_nested_table.html000066400000000000000000000016641263120276100207600ustar00rootroot00000000000000
    foo
    bar
    a
    b c
    d
    e
    f
    g h
    dompdf-0.6.2/www/test/dom_ol.html000066400000000000000000000055521263120276100167410ustar00rootroot00000000000000

    none

    1. Item 1
    2. Item 2
    3. Item 3

    decimal

    1. Item 1
    2. Item 2
    3. Item 3

    lower-alpha

    1. Item 1
    2. Item 2
    3. Item 3

    lower-latin

    1. Item 1
    2. Item 2
    3. Item 3

    lower-roman

    1. Item 1
    2. Item 2
    3. Item 3

    lower-greek

    1. Item 1
    2. Item 2
    3. Item 3

    upper-alpha

    1. Item 1
    2. Item 2
    3. Item 3

    upper-latin

    1. Item 1
    2. Item 2
    3. Item 3

    upper-roman

    1. Item 1
    2. Item 2
    3. Item 3

    Advanced

    1. Item 1
    2. Item 2
      1. Item 1
        1. Item 1
        2. Item 2
        3. Item 3
      2. Item 2
      3. Item 3
        1. Item 1
        2. Item 2
        3. Item 3
    3. Item 3

    "start" attribute (8)

    1. Item 1
    2. Item 2
    3. Item 3

    "value" attributes (1, 5, none)

    1. Item 1
    2. Item 2
    3. Item 3

    decimal-leading-zero

    1. Item #
    2. Item #
    3. Item #
    4. Item #
    5. Item #
    6. Item #
    7. Item #
    8. Item #
    9. Item #
    10. Item #
    11. Item #
    12. Item #
    13. Item #
    14. Item #
    15. Item #
    16. Item #
    17. Item #
    18. Item #
    19. Item #
    20. Item #
    21. Item #
    22. Item #
    23. Item #
    24. Item #
    25. Item #
    26. Item #
    dompdf-0.6.2/www/test/dom_simple_ul.html000066400000000000000000000025341263120276100203150ustar00rootroot00000000000000

    Here's a simple list from my favourite website:

    • The Zend Engine II with a new object model and dozens of new features.
    • XML support has been completely redone in PHP 5, all extensions are now focused around the excellent libxml2 library (http://www.xmlsoft.org/).
    • A new SimpleXML extension for easily accessing and manipulating XML as PHP objects. It can also interface with the DOM extension and vice-versa.
    • A brand new built-in SOAP extension for interoperability with Web Services.
    • A new MySQL extension named MySQLi for developers using MySQL 4.1 and later. This new extension includes an object-oriented interface in addition to a traditional interface; as well as support for many of MySQL's new features, such as prepared statements.
    • SQLite has been bundled with PHP. For more information on SQLite, please visit their website.
    • Streams have been greatly improved, including the ability to access low-level socket operations on streams.
    • And lots more...
      • Sublists
      • work
      • too!
    dompdf-0.6.2/www/test/dom_table.html000066400000000000000000000032341263120276100174110ustar00rootroot00000000000000 border-collapse: separate
    head 1 head 2 head 3 head 4
    cell 1 cell 2 cell 3
    cell 4 cell 5
    cell 6
    cell 7
    border-collapse: collapse
    head 1 head 2 head 3 head 4
    cell 1 cell 2 cell 3 cell 4
    cell 5 cell 6 cell 7
    cell 8 cell 9 cell 10
    cell 11
    dompdf-0.6.2/www/test/dom_table_image.html000066400000000000000000000005631263120276100205550ustar00rootroot00000000000000
    Some Text
    More Text Blah
    dompdf-0.6.2/www/test/dom_ul.html000066400000000000000000000362001263120276100167410ustar00rootroot00000000000000
    • Item 1
    • Item 2
    • Item 3
      • Sub 1
      • Sub 2
      • Sub 3
    • Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at odio vitae libero tempus convallis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla massa quis velit. Curabitur metus massa, semper mollis, molestie vel, adipiscing nec, massa. Phasellus vitae felis sed lectus dapibus facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis turpis vel magna. Cras eu est. Integer porttitor ligula a tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis leo. Nulla pellentesque molestie ante. Quisque vestibulum est id justo. Ut pellentesque ante in neque.
    • Curabitur ut diam eu dui vestibulum pharetra. Nam pellentesque, justo non hendrerit venenatis, mi orci pretium mi, et vehicula leo arcu quis diam. Nullam mattis laoreet quam. Morbi mollis sem ut tellus. Nam mi massa, lobortis eu, sollicitudin et, iaculis et, massa. Maecenas purus mauris, luctus sit amet, pharetra in, facilisis sit amet, elit. Nullam vel erat tempus purus molestie suscipit. Vestibulum odio lorem, sollicitudin non, volutpat sit amet, tincidunt vel, nunc. Nulla quis ante vestibulum odio feugiat facilisis. Proin lorem nisl, viverra at, rhoncus quis, semper nec, mi. Donec euismod enim vitae velit. Nulla sed lectus. Vivamus placerat, lacus sed vehicula sagittis, arcu massa adipiscing lorem, bibendum luctus nisl tortor vitae leo.
    • Inside. Aliquam enim. Duis et diam. Praesent porta, mauris quis pellentesque volutpat, erat elit vulputate eros, vitae pulvinar augue velit sit amet sem. Fusce eu urna eu nisi condimentum posuere. Vivamus sed felis. Duis eget urna vitae eros interdum dignissim. Proin justo eros, eleifend in, porttitor in, malesuada non, neque. Etiam sed augue. Nulla sit amet magna. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Mauris facilisis. Curabitur massa magna, pulvinar a, nonummy eget, egestas vitae, mauris. Quisque vel elit sit amet lorem malesuada facilisis. Vestibulum porta, metus sit amet egestas interdum, urna justo euismod erat, id tristique urna leo quis nibh. Morbi non erat.
    • Item 1 disc
    • Item 2 disc
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
    • Item 4 disc
    • Item 1 circle
    • Item 2 circle
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
    • Item 4 circle
    • Item 1 square
    • Item 2 square
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
    • Item 4 square
    • Item 1 image
    • Item 2 image
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
    • Item 4 image
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
    • Outside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
    • Item 7 noimage
      • sub Item 1 image
      • sub Item 2 image
      • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
      • Outside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
      • sub Item 5 noimage
    • Item 1 missing image - fallback square
    • Item 2 missing image - fallback square
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
    • Item 4 missing image - fallback square
    • Item 1 nobullet
    • Item 2 nobullet
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
    • Item 4 nobullet
    • Item 1 missing image - fallback none
    • Item 2 missing image - fallback none
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
    • Item 4 missing image - fallback none
    • Item 1 bigimage
    • Item 2 bigimage
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
    • Item 4 bigimage
    • margin Item 1 image
    • margin Item 2 image
    • Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
    • margin Item 4 image
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
    • Outside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
    • margin Item 7 noimage
      • margin sub Item 1 image
      • margin sub Item 2 image
      • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
      • Outside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
      • margin sub Item 5 noimage
    • padding Item 1 image
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
      • padding sub Item 1 image
      • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
    • margin Item 1 square
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
      • margin sub Item 1 square
      • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
    • padding Item 1 square
    • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
      • padding sub Item 1 square
      • Inside. Lorem ipsum dolor sit amet, consectetuer sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.

    combined list attributes list-style

    • list-style:square inside url(dummy.png);
    • list-style:outside;[overwrites only position]
    • list-style:square inside url(images/png.png);
    • list-style-position:outside;[overwrites only position]
    • list-style-position:outside;[overwrite attributes - firefox3: all; dompdf, internet explorer 8: only position]
    • list-style:none; [resets both, bullet and image]
    dompdf-0.6.2/www/test/encoding_entities.html000066400000000000000000000010061263120276100211500ustar00rootroot00000000000000

    é © « avoir et être α β

    é © « avoir et être α β

    dompdf-0.6.2/www/test/encoding_unicode.html000066400000000000000000000002761263120276100207620ustar00rootroot00000000000000 献给母亲的爱 dompdf-0.6.2/www/test/encoding_unicode_wrapping.html000066400000000000000000000010561263120276100226660ustar00rootroot00000000000000 Wrapping of non-ANSI characters No se tendrá en cuenta el hecho de que las partes tengan sus establecimientos en Estados diferentes cuando ello no resulte del contrato, ni de los tratos entre ellas, ni de información revelada por las partes en cualquier momento antes de la celebración del contrato o en el momento de su celebración. dompdf-0.6.2/www/test/encoding_utf-8.html000066400000000000000000000767101263120276100203050ustar00rootroot00000000000000 Unicode (UTF-8) Test

    Unicode (UTF-8) test

    You can use this document to check if your browser and your installed fonts display multilingual HTML documents in Unicode (UTF-8) correctly.


    Latin extended

    Letters with acute
    AÁ aá   CĆ cć   EÉ eé   IÍ ií   LĹ lĺ   NŃ nń   OÓ oó   RŔ rŕ   SŚ sś   UÚ uú   YÝ yý   ZŹ zź
    Letters with apostrophe (hacek)
    dď   LĽ lľ   tť
    Letters with breve
    AĂ aă   GĞ gğ   UŬ uŭ
    Letters with caron (hacek)
    CČ cč   DĎ   EĚ eě   NŇ nň   RŘ rř   SŠ sš   TŤ   ZŽ zž
    Letters with cedilla (comma)
    CÇ cç   GĢ gģ   KĶ kķ   LĻ lļ   NŅ nņ   RŖ rŗ   SŞ sş   TŢ tţ
    Letters with circumflex
    AÂ aâ   CĈ cĉ   EÊ eê   GĜ gĝ   HĤ hĥ   IÎ iî   JĴ jĵ   OÔ oô   SŜ sŝ   UÛ uû   WŴ wŵ   YŶ yŷ
    Letters with diaeresis (umlaut)
    AÄ aä   EË eë   IÏ iï   OÖ oö   UÜ uü   YŸ yÿ
    Letters with/without dot above
    CĊ cċ   EĖ eė   GĠ gġ   Iİ iı   ZŻ zż
    Letters with double acute
    OŐ oő   UŰ uű
    Letters with grave
    AÀ aà   EÈ eè   IÌ iì   OÒ oò   UÙ uù
    Letters with horn
    OƠ oơ   UƯ uư
    Letters with macron
    AĀ aā   EĒ eē   IĪ iī   OŌ oō   UŪ uū
    Letters with ogonek
    AĄ aą   EĘ eę   IĮ iį   UŲ uų
    Letters with ring above
    AÅ aå   UŮ uů
    Letters with stroke
    DĐ dđ   HĦ hħ   LŁ lł   OØ oø
    Letters with tilde
    AÃ aã   NÑ nñ   OÕ oõ
    Ligatures
    AEÆ aeæ   OEŒ oeœ
    Eth & Thorn
    DÐ dð   THÞ thþ
    German sharp s & long s
    ß   ſ

    Combining diacritical marks
     


    Greek

    Capital letters
    Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω
    Capital letters with tonos
    Ά   Έ   Ή   Ί   Ό   Ύ   Ώ
    Capital letters with dialytika
    Ϊ   Ϋ
    Small letters
    α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ σς τ υ φ χ ψ ω
    Small letters with tonos
    ά   έ   ή   ί   ό   ύ   ώ
    Small letters with dialytika
    ϊ   ϋ
    Small letters with dialytika and tonos
    ΐ   ΰ

    Cyrillic

    Russian alphabet
    А Б В Г Д Е Ё Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я
    а б в г д е ё ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ы ь э ю я
    Belarussian alphabet
    А Б В Г Д Е Ё Ж З І Й К Л М Н О П Р С Т У Ў Ф Х Ц Ч Ш Ы Ь Э Ю Я
    а б в г д е ё ж з і й к л м н о п р с т у ў ф х ц ч ш ы ь э ю я
    Ukrainian alphabet
    А Б В Г Ґ Д Е Є Ж З И І Ї Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ь Ю Я
    а б в г ґ д е є ж з и і ї й к л м н о п р с т у ф х ц ч ш щ ь ю я
    Bulgarian alphabet
    А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ь Ю Я
    а б в г д е ж з и й к л м н о п р с т у ф х ц ч ш щ ъ ь ю я
    Macedonian alphabet
    А Б В Г Д Ѓ Е Ж З Ѕ И Ј К Л Љ М Н Њ О П Р С Т Ќ У Ф Х Ц Ч Џ Ш
    а б в г д ѓ е ж з ѕ и ј к л љ м н њ о п р с т ќ у ф х ц ч џ ш
    Serbian alphabet
    А Б В Г Д Ђ Е Ж З И Ј К Л Љ М Н Њ О П Р С Т Ћ У Ф Х Ц Ч Џ Ш
    а б в г д ђ е ж з и ј к л љ м н њ о п р с т ћ у ф х ц ч џ ш
    Mongolian alphabet
    A B V G D E Ë Zh Z I J K L M N O Ö P R S T U Ü F X C Ch Sh Shh " Y ' E Ju Ja
    А Б В Г Д Е Ё Ж З И Й К Л М Н О Ө П Р С Т У Ү Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я
    а б в г д е ё ж з и й к л м н о ө п р с т у ү ф х ц ч ш щ ъ ы ь э ю я

    Armenian

    Capital letters
    a b g d e z ê ă th   ž i l x c’ k’ h dz ğ   č’ m j n š o č p’ dž   rr s v t’ r c w ph kh   ô f
    Ա Բ Գ Դ Ե Զ Է Ը Թ   Ժ Ի Լ Խ Ծ Կ Հ Ձ Ղ   Ճ Մ Յ Ն Շ Ո Չ Պ Ջ   Ռ Ս Վ Տ Ր Ց Ւ Փ Ք   Օ Ֆ
    Small letters
    a b g d e z ê ă th   ž i l x c’ k’ h dz ğ   č’ m j n š o č p’ dž   rr s v t’ r c w ph kh   ew ô f
    ա բ գ դ ե զ է ը թ   ժ ի լ խ ծ կ հ ձ ղ   ճ մ յ ն շ ո չ պ ջ   ռ ս վ տ ր ց ւ փ ք   և օ ֆ

    Georgian

    Mxedruli (Mkhedruli) script
    a b g d e v z th   i k’ l m n o p’ ž   r s t’ u ph kh ğ q’ š   č c dz c’ č’ x dž h
         

    Hebrew

    Hebrew alphabet
    ’ v g d h w z H T y xx l mm nn s ‘ ff cc q r S ( š ś ) t
      א ב ג ד ה ו ז ח ט י כך ל מם נן ס ע פף צץ ק ר ש ( שׁ שׂ ) ת
    Letters with dagesh (mappiq)
    ’ b g d h w z   T y kk l m  n  s   pp c  q r S ( š ś ) t
      אּ בּ גּ דּ הּ וּ זּ טּ יּ כּךּ לּ מּ נּ סּ פּףּ צּ קּ רּ שּ ( שּׁ שּׂ ) תּ
    Yiddish digraphs
    ww   wy   yy
      װ ױ ײ
    Letters with rafe
    v   x   f
      בֿ   כֿ   פֿ
    Vowels with points
    a   å   o   u   i   ai
      אַ   אָ   וֹ   וּ   יִ   ײַ

    Arabic

    Arabic alphabet
    ’a a b t þ j H x d ð r z s š S D T Z ‘ ğ f v q k l m n h -t w ÿ y -a
     ـآ آ   ـا ا   بـبـب ب   تـتـت ت   ثـثـث ث   جـجـج ج   حـحـح ح   خـخـخ خ   ـد د   ـذ ذ   ـر ر   ـز ز   سـسـس س   شـشـش ش   صـصـص ص   ضـضـض ض   طـطـط ط   ظـظـظ ظ   عـعـع ع   غـغـغ غ   فـفـف ف   ڤـڤـڤ ڤ   قـقـق ق   كـكـك ك   لـلـل ل   مـمـم م   نـنـن ن   هـهـه ه   ـة ة   ـو و   يـيـي ي   یـیـی ی   ـى ى 
    Letters with hamzah  
     ء   ـإ إ   ـأ أ   ـؤ ؤ   ئـئـئ ئ 
    Persian alphabet  
    ’a a b p t s j c H x d z r z ž s š S Z T Z ‘ ğ f q k g l m n v h y
     ـآ آ   ـا ا   بـبـب ب   پـپـپ پ   تـتـت ت   ثـثـث ث   جـجـج ج   چـچـچ چ   حـحـح ح   خـخـخ خ   ـد د   ـذ ذ   ـر ر   ـز ز   ـژ ژ   سـسـس س   شـشـش ش   صـصـص ص   ضـضـض ض   طـطـط ط   ظـظـظ ظ   عـعـع ع   غـغـغ غ   فـفـف ف   قـقـق ق   کـکـک ک   گـگـگ گ   لـلـل ل   مـمـم م   نـنـن ن   ـو و   هـهـه ه   یـیـی ی 
    Urdu alphabet  
    ’a a b p t t. s j c H x d d. z r r. z ž s š S Z T Z ‘ ğ f q k g l m n -n v h h y -e
     ـآ آ   ـا ا   بـبـب ب   پـپـپ پ   تـتـت ت   ٹـٹـٹ ٹ   ثـثـث ث   جـجـج ج   چـچـچ چ   حـحـح ح   خـخـخ خ   ـد د   ـڈ ڈ   ـذ ذ   ـر ر   ـڑ ڑ   ـز ز   ـژ ژ   سـسـس س   شـشـش ش   صـصـص ص   ضـضـض ض   طـطـط ط   ظـظـظ ظ   عـعـع ع   غـغـغ غ   فـفـف ف   قـقـق ق   کـکـک ک   گـگـگ گ   لـلـل ل   مـمـم م   نـنـن ن   ـں ں   ـو و   ہـہـہ ہ   ھـھـھ ھ   یـیـی ی   ـے ے 
    Arabic-Indic digits  
    0 1 2 3 4 5 6 7 8 9 10 11 12
    0 1 2 3 4 5 6 7 8 9 10 11 12
    ٠ ١ ٢ ٣ ٤ ٥ ٦ ٧ ٨ ٩ ١٠ ١١ ١٢
    ۰ ۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲

    Devanagari

    Sanskrit alphabet
    a aa i ii u uu   r rr l   e ai o au
    अ आ इ ई उ ऊ   ऋ ॠ ऌ   ए ऐ ओ औ
    kaa ki kii ku kuu   kr krr kl   ke kai ko kau
    का कि की कु कू   कृ कॄ कॢ   के कै को कौ
    k kh g gh ng   c ch j jh ñ   t. t.h d. d.h n.   t th d dh n   p ph b bh m   y r l. l v   ś s. s h
    क ख ग घ ङ   च छ ज झ ञ   ट ठ ड ढ ण   त थ द ध न   प फ ब भ म   य र ळ ल व   श ष स ह
    Hindi/Urdu letters with nuqta
    q x ğ z r. r.h f
    क़ ख़ ग़ ज़ ड़ ढ़ फ़
    Sample conjuncts
    ks. jñ tt tr rt
    क्ष ज्ञ त्त त्र र्त
    Devanagari digits
    0 1 2 3 4 5 6 7 8 9 10
    ० १ २ ३ ४ ५ ६ ७ ८ ९ १०

    Gujarati

    Sanskrit alphabet
    a aa i ii u uu   r rr   e ai o au
    અ આ ઇ ઈ ઉ ઊ   ઋ ૠ   એ ઐ ઓ ઔ
    kaa ki kii ku kuu   kr krr   ke kai ko kau
    કા કિ કી કુ કૂ   કૃ કૄ   કે કૈ કો કૌ
    k kh g gh ng   c ch j jh ñ   t. t.h d. d.h n.   t th d dh n   p ph b bh m   y r l. l v   ś s. s h
    ક ખ ગ ઘ ઙ   ચ છ જ ઝ ઞ   ટ ઠ ડ ઢ ણ   ત થ દ ધ ન   પ ફ બ ભ મ   ય ર ળ લ વ   શ ષ સ હ
    Sample conjuncts
    ks. jñ tt tr rt
    ક્ષ જ્ઞ ત્ત ત્ર ર્ત
    Gujarati digits
    0 1 2 3 4 5 6 7 8 9 10
    ૦ ૧ ૨ ૩ ૪ ૫ ૬ ૭ ૮ ૯ ૧૦

    Bengali

    Sanskrit alphabet
    a aa i ii u uu   r rr l   e ai o au
    অ আ ই ঈ উ ঊ   ঋ ৠ ঌ   এ ঐ ও ঔ
    kaa ki kii ku kuu   kr krr kl   ke kai ko kau
    কা কি কী কু কূ   কৃ কৄ কৢ   কে কৈ কো কো
    k kh g gh ng   c ch j jh ñ   t. t.h d. d.h n.   t th d dh n   p ph b bh m   y r l v   ś s. s h
    ক খ গ ঘ ঙ   চ ছ জ ঝ ঞ   ট ঠ ড ঢ ণ   ত থ দ ধ ন   প ফ ব ভ ম   য র ল ব   শ ষ স হ
    Letters with nukta & Assamese letters
    r. r.h y.   r v
    ড় ঢ় য়   ৰ ৱ
    Sample conjuncts
    ks. jñ tt tr rt
    ক্ষ জ্ঞ ত্ত ত্র র্ত
    Bengali digits
    0 1 2 3 4 5 6 7 8 9 10
    ০ ১ ২ ৩ ৪ ৫ ৬ ৭ ৮ ৯ ১০

    Gurmukhi

    Panjabi alphabet
    a aa i ii u uu   e ai o au
    ਅ ਆ ਇ ਈ ਉ ਊ   ਏ ਐ ਓ ਔ
    kaa ki kii ku kuu   ke kai ko kau
    ਕਾ ਕਿ ਕੀ ਕੁ ਕੂ   ਕੇ ਕੈ ਕੋ ਕੌ
    k kh g gh ng   c ch j jh ñ   t. t.h d. d.h n.   t th d dh n   p ph b bh m   y r l v r.   s h
    ਕ ਖ ਗ ਘ ਙ   ਚ ਛ ਜ ਝ ਞ   ਟ ਠ ਡ ਢ ਣ   ਤ ਥ ਦ ਧ ਨ   ਪ ਫ ਬ ਭ ਮ   ਯ ਰ ਲ ਵ ੜ   ਸ ਹ
    Letters with nukta
    x ğ z f l. š
    ਖ਼ ਗ਼ ਜ਼ ਫ਼ ਲ਼ ਸ਼
    Gurmukhi digits
    0 1 2 3 4 5 6 7 8 9 10
    ੦ ੧ ੨ ੩ ੪ ੫ ੬ ੭ ੮ ੯ ੧੦

    Symbols

    bullet
    ¢cent sign
    ©copyright sign
    ¤currency sign
    dagger
    °degree sign
    ÷division sign
    «double angle quotation mark (guillemet) <<
    »double angle quotation mark (guillemet) >>
    double quotation mark 66
    double quotation mark 99
    double quotation mark low-99
    ellipsis
    em dash
    en dash
    euro sign
    horizontal bar (quotation dash)
    µmicro sign
    ·middle dot (centered period)
    ·middle dot (centered period, Greek ano teleia)
    ×multiplication sign
    ¬not sign
    numero sign
    per mille (per thousand) sign
    pilcrow (paragraph) sign
    ±plus-minus sign
    £pound sterling sign
    ®registered sign
    §section sign
    sheqel sign
    single angle quotation mark (guillemet) <
    single angle quotation mark (guillemet) >
    single quotation mark 6
    single quotation mark 9 (apostrophe)
    ¹superscript 1
    ²superscript 2
    ³superscript 3
    trademark sign
    ¥yen sign
    ،Arabic comma
    ٫Arabic decimal separator
    ٪Arabic percent sign
    ؟Arabic question mark
    ؛Arabic semicolon
    ۔Arabic-Urdu full stop (Arabic-Urdu period)
    ־Hebrew hyphen (maqaf)
    ׳Hebrew prime (geresh)
    ״Hebrew double prime (gershayim)
    Indic abbreviation sign
    Indic danda
    Indic double danda


    19 February 2010

    dompdf-0.6.2/www/test/encoding_utf-8_all.html000066400000000000000000020641021263120276100211270ustar00rootroot00000000000000
    0020 !"#$%&'()*+,-./0123456789:;<=>?
    0040 @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
    0060 `abcdefghijklmnopqrstuvwxyz{|}~
    0080 €‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ
    00A0  ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿
    00C0 ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞß
    00E0 àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ
    0100 ĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğ
    0120 ĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿ
    0140 ŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞş
    0160 ŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſ
    0180 ƀƁƂƃƄƅƆƇƈƉƊƋƌƍƎƏƐƑƒƓƔƕƖƗƘƙƚƛƜƝƞƟ
    01A0 ƠơƢƣƤƥƦƧƨƩƪƫƬƭƮƯưƱƲƳƴƵƶƷƸƹƺƻƼƽƾƿ
    01C0 ǀǁǂǃDŽDždžLJLjljNJNjnjǍǎǏǐǑǒǓǔǕǖǗǘǙǚǛǜǝǞǟ
    01E0 ǠǡǢǣǤǥǦǧǨǩǪǫǬǭǮǯǰDZDzdzǴǵǶǷǸǹǺǻǼǽǾǿ
    0200 ȀȁȂȃȄȅȆȇȈȉȊȋȌȍȎȏȐȑȒȓȔȕȖȗȘșȚțȜȝȞȟ
    0220 ȠȡȢȣȤȥȦȧȨȩȪȫȬȭȮȯȰȱȲȳȴȵȶȷȸȹȺȻȼȽȾȿ
    0240 ɀɁɂɃɄɅɆɇɈɉɊɋɌɍɎɏɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟ
    0260 ɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿ
    0280 ʀʁʂʃʄʅʆʇʈʉʊʋʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛʜʝʞʟ
    02A0 ʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯʰʱʲʳʴʵʶʷʸʹʺʻʼʽʾʿ
    02C0 ˀˁ˂˃˄˅ˆˇˈˉˊˋˌˍˎˏːˑ˒˓˔˕˖˗˘˙˚˛˜˝˞˟
    02E0 ˠˡˢˣˤ˥˦˧˨˩˪˫ˬ˭ˮ˯˰˱˲˳˴˵˶˷˸˹˺˻˼˽˾˿
    0300 ̛̖̗̘̙̜̝̞̟̀́̂̃̄̅̆̇̈̉̊̋̌̍̎̏̐̑̒̓̔̕̚
    0320 ̴̵̶̷̸̡̢̧̨̠̣̤̥̦̩̪̫̬̭̮̯̰̱̲̳̹̺̻̼̽̾̿
    0340 ͇͈͉͍͎̀́͂̓̈́͆͊͋͌ͅ͏͓͔͕͖͙͚͐͑͒͗͛͘͜͟͝͞
    0360 ͣͤͥͦͧͨͩͪͫͬͭͮͯ͢͠͡ͰͱͲͳʹ͵Ͷͷ͸͹ͺͻͼͽ;Ϳ
    0380 ΀΁΂΃΄΅Ά·ΈΉΊ΋Ό΍ΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟ
    03A0 ΠΡ΢ΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξο
    03C0 πρςστυφχψωϊϋόύώϏϐϑϒϓϔϕϖϗϘϙϚϛϜϝϞϟ
    03E0 ϠϡϢϣϤϥϦϧϨϩϪϫϬϭϮϯϰϱϲϳϴϵ϶ϷϸϹϺϻϼϽϾϿ
    0400 ЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОП
    0420 РСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмноп
    0440 рстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџ
    0460 ѠѡѢѣѤѥѦѧѨѩѪѫѬѭѮѯѰѱѲѳѴѵѶѷѸѹѺѻѼѽѾѿ
    0480 Ҁҁ҂҃҄҅҆҇҈҉ҊҋҌҍҎҏҐґҒғҔҕҖҗҘҙҚқҜҝҞҟ
    04A0 ҠҡҢңҤҥҦҧҨҩҪҫҬҭҮүҰұҲҳҴҵҶҷҸҹҺһҼҽҾҿ
    04C0 ӀӁӂӃӄӅӆӇӈӉӊӋӌӍӎӏӐӑӒӓӔӕӖӗӘәӚӛӜӝӞӟ
    04E0 ӠӡӢӣӤӥӦӧӨөӪӫӬӭӮӯӰӱӲӳӴӵӶӷӸӹӺӻӼӽӾӿ
    0500 ԀԁԂԃԄԅԆԇԈԉԊԋԌԍԎԏԐԑԒԓԔԕԖԗԘԙԚԛԜԝԞԟ
    0520 ԠԡԢԣԤԥԦԧԨԩԪԫԬԭԮԯ԰ԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿ
    0540 ՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՒՓՔՕՖ՗՘ՙ՚՛՜՝՞՟
    0560 ՠաբգդեզէըթժիլխծկհձղճմյնշոչպջռսվտ
    0580 րցւփքօֆևֈ։֊֋֌֍֎֏֐֑֖֛֚֒֓֔֕֗֘֙֜֝֞֟
    05A0 ְֱֲֳִֵֶַָֹֺֻּֽ֢֣֤֥֦֧֪֭֮֠֡֨֩֫֬֯־ֿ
    05C0 ׀ׁׂ׃ׅׄ׆ׇ׈׉׊׋׌׍׎׏אבגדהוזחטיךכלםמן
    05E0 נסעףפץצקרשת׫׬׭׮ׯװױײ׳״׵׶׷׸׹׺׻׼׽׾׿
    0600 ؀؁؂؃؄؅؆؇؈؉؊؋،؍؎؏ؘؙؚؐؑؒؓؔؕؖؗ؛؜؝؞؟
    0620 ؠءآأؤإئابةتثجحخدذرزسشصضطظعغػؼؽؾؿ
    0640 ـفقكلمنهوىيًٌٍَُِّْٕٖٜٟٓٔٗ٘ٙٚٛٝٞ
    0660 ٠١٢٣٤٥٦٧٨٩٪٫٬٭ٮٯٰٱٲٳٴٵٶٷٸٹٺٻټٽپٿ
    0680 ڀځڂڃڄڅچڇڈډڊڋڌڍڎڏڐڑڒړڔڕږڗژڙښڛڜڝڞڟ
    06A0 ڠڡڢڣڤڥڦڧڨکڪګڬڭڮگڰڱڲڳڴڵڶڷڸڹںڻڼڽھڿ
    06C0 ۀہۂۃۄۅۆۇۈۉۊۋیۍێۏېۑےۓ۔ەۖۗۘۙۚۛۜ۝۞۟
    06E0 ۣ۠ۡۢۤۥۦۧۨ۩۪ۭ۫۬ۮۯ۰۱۲۳۴۵۶۷۸۹ۺۻۼ۽۾ۿ
    0700 ܀܁܂܃܄܅܆܇܈܉܊܋܌܍܎܏ܐܑܒܓܔܕܖܗܘܙܚܛܜܝܞܟ
    0720 ܠܡܢܣܤܥܦܧܨܩܪܫܬܭܮܯܱܴܷܸܹܻܼܾܰܲܳܵܶܺܽܿ
    0740 ݂݄݆݈݀݁݃݅݇݉݊݋݌ݍݎݏݐݑݒݓݔݕݖݗݘݙݚݛݜݝݞݟ
    0760 ݠݡݢݣݤݥݦݧݨݩݪݫݬݭݮݯݰݱݲݳݴݵݶݷݸݹݺݻݼݽݾݿ
    0780 ހށނރބޅކއވމފދތލގޏސޑޒޓޔޕޖޗޘޙޚޛޜޝޞޟ
    07A0 ޠޡޢޣޤޥަާިީުޫެޭޮޯްޱ޲޳޴޵޶޷޸޹޺޻޼޽޾޿
    07C0 ߀߁߂߃߄߅߆߇߈߉ߊߋߌߍߎߏߐߑߒߓߔߕߖߗߘߙߚߛߜߝߞߟ
    07E0 ߠߡߢߣߤߥߦߧߨߩߪ߲߫߬߭߮߯߰߱߳ߴߵ߶߷߸߹ߺ߻߼߽߾߿
    0800 ࠀࠁࠂࠃࠄࠅࠆࠇࠈࠉࠊࠋࠌࠍࠎࠏࠐࠑࠒࠓࠔࠕࠖࠗ࠘࠙ࠚࠛࠜࠝࠞࠟ
    0820 ࠠࠡࠢࠣࠤࠥࠦࠧࠨࠩࠪࠫࠬ࠭࠮࠯࠰࠱࠲࠳࠴࠵࠶࠷࠸࠹࠺࠻࠼࠽࠾࠿
    0840 ࡀࡁࡂࡃࡄࡅࡆࡇࡈࡉࡊࡋࡌࡍࡎࡏࡐࡑࡒࡓࡔࡕࡖࡗࡘ࡙࡚࡛࡜࡝࡞࡟
    0860 ࡠࡡࡢࡣࡤࡥࡦࡧࡨࡩࡪ࡫࡬࡭࡮࡯ࡰࡱࡲࡳࡴࡵࡶࡷࡸࡹࡺࡻࡼࡽࡾࡿ
    0880 ࢀࢁࢂࢃࢄࢅࢆࢇ࢈ࢉࢊࢋࢌࢍࢎ࢏࢐࢑࢒࢓࢔࢕࢖࢙࢚࢛ࢗ࢘࢜࢝࢞࢟
    08A0 ࢠࢡࢢࢣࢤࢥࢦࢧࢨࢩࢪࢫࢬࢭࢮࢯࢰࢱࢲࢳࢴࢵࢶࢷࢸࢹࢺࢻࢼࢽࢾࢿ
    08C0 ࣀࣁࣂࣃࣄࣅࣆࣇࣈࣉ࣏࣐࣑࣒࣓࣊࣋࣌࣍࣎ࣔࣕࣖࣗࣘࣙࣚࣛࣜࣝࣞࣟ
    08E0 ࣠࣡࣢ࣰࣱࣲࣣࣦࣩ࣭࣮࣯ࣶࣹࣺࣤࣥࣧࣨ࣪࣫࣬ࣳࣴࣵࣷࣸࣻࣼࣽࣾࣿ
    0900 ऀँंःऄअआइईउऊऋऌऍऎएऐऑऒओऔकखगघङचछजझञट
    0920 ठडढणतथदधनऩपफबभमयरऱलळऴवशषसहऺऻ़ऽाि
    0940 ीुूृॄॅॆेैॉॊोौ्ॎॏॐ॒॑॓॔ॕॖॗक़ख़ग़ज़ड़ढ़फ़य़
    0960 ॠॡॢॣ।॥०१२३४५६७८९॰ॱॲॳॴॵॶॷॸॹॺॻॼॽॾॿ
    0980 ঀঁংঃ঄অআইঈউঊঋঌ঍঎এঐ঑঒ওঔকখগঘঙচছজঝঞট
    09A0 ঠডঢণতথদধন঩পফবভমযর঱ল঳঴঵শষসহ঺঻়ঽাি
    09C0 ীুূৃৄ৅৆েৈ৉৊োৌ্ৎ৏৐৑৒৓৔৕৖ৗ৘৙৚৛ড়ঢ়৞য়
    09E0 ৠৡৢৣ৤৥০১২৩৪৫৬৭৮৯ৰৱ৲৳৴৵৶৷৸৹৺৻ৼ৽৾৿
    0A00 ਀ਁਂਃ਄ਅਆਇਈਉਊ਋਌਍਎ਏਐ਑਒ਓਔਕਖਗਘਙਚਛਜਝਞਟ
    0A20 ਠਡਢਣਤਥਦਧਨ਩ਪਫਬਭਮਯਰ਱ਲਲ਼਴ਵਸ਼਷ਸਹ਺਻਼਽ਾਿ
    0A40 ੀੁੂ੃੄੅੆ੇੈ੉੊ੋੌ੍੎੏੐ੑ੒੓੔੕੖੗੘ਖ਼ਗ਼ਜ਼ੜ੝ਫ਼੟
    0A60 ੠੡੢੣੤੥੦੧੨੩੪੫੬੭੮੯ੰੱੲੳੴੵ੶੷੸੹੺੻੼੽੾੿
    0A80 ઀ઁંઃ઄અઆઇઈઉઊઋઌઍ઎એઐઑ઒ઓઔકખગઘઙચછજઝઞટ
    0AA0 ઠડઢણતથદધન઩પફબભમયર઱લળ઴વશષસહ઺઻઼ઽાિ
    0AC0 ીુૂૃૄૅ૆ેૈૉ૊ોૌ્૎૏ૐ૑૒૓૔૕૖૗૘૙૚૛૜૝૞૟
    0AE0 ૠૡૢૣ૤૥૦૧૨૩૪૫૬૭૮૯૰૱૲૳૴૵૶૷૸ૹૺૻૼ૽૾૿
    0B00 ଀ଁଂଃ଄ଅଆଇଈଉଊଋଌ଍଎ଏଐ଑଒ଓଔକଖଗଘଙଚଛଜଝଞଟ
    0B20 ଠଡଢଣତଥଦଧନ଩ପଫବଭମଯର଱ଲଳ଴ଵଶଷସହ଺଻଼ଽାି
    0B40 ୀୁୂୃୄ୅୆େୈ୉୊ୋୌ୍୎୏୐୑୒୓୔୕ୖୗ୘୙୚୛ଡ଼ଢ଼୞ୟ
    0B60 ୠୡୢୣ୤୥୦୧୨୩୪୫୬୭୮୯୰ୱ୲୳୴୵୶୷୸୹୺୻୼୽୾୿
    0B80 ஀஁ஂஃ஄அஆஇஈஉஊ஋஌஍எஏஐ஑ஒஓஔக஖஗஘ஙச஛ஜ஝ஞட
    0BA0 ஠஡஢ணத஥஦஧நனப஫஬஭மயரறலளழவஶஷஸஹ஺஻஼஽ாி
    0BC0 ீுூ௃௄௅ெேை௉ொோௌ்௎௏ௐ௑௒௓௔௕௖ௗ௘௙௚௛௜௝௞௟
    0BE0 ௠௡௢௣௤௥௦௧௨௩௪௫௬௭௮௯௰௱௲௳௴௵௶௷௸௹௺௻௼௽௾௿
    0C00 ఀఁంఃఄఅఆఇఈఉఊఋఌ఍ఎఏఐ఑ఒఓఔకఖగఘఙచఛజఝఞట
    0C20 ఠడఢణతథదధన఩పఫబభమయరఱలళఴవశషసహ఺఻఼ఽాి
    0C40 ీుూృౄ౅ెేై౉ొోౌ్౎౏౐౑౒౓౔ౕౖ౗ౘౙౚ౛౜ౝ౞౟
    0C60 ౠౡౢౣ౤౥౦౧౨౩౪౫౬౭౮౯౰౱౲౳౴౵౶౷౸౹౺౻౼౽౾౿
    0C80 ಀಁಂಃ಄ಅಆಇಈಉಊಋಌ಍ಎಏಐ಑ಒಓಔಕಖಗಘಙಚಛಜಝಞಟ
    0CA0 ಠಡಢಣತಥದಧನ಩ಪಫಬಭಮಯರಱಲಳ಴ವಶಷಸಹ಺಻಼ಽಾಿ
    0CC0 ೀುೂೃೄ೅ೆೇೈ೉ೊೋೌ್೎೏೐೑೒೓೔ೕೖ೗೘೙೚೛೜ೝೞ೟
    0CE0 ೠೡೢೣ೤೥೦೧೨೩೪೫೬೭೮೯೰ೱೲೳ೴೵೶೷೸೹೺೻೼೽೾೿
    0D00 ഀഁംഃഄഅആഇഈഉഊഋഌ഍എഏഐ഑ഒഓഔകഖഗഘങചഛജഝഞട
    0D20 ഠഡഢണതഥദധനഩപഫബഭമയരറലളഴവശഷസഹഺ഻഼ഽാി
    0D40 ീുൂൃൄ൅െേൈ൉ൊോൌ്ൎ൏൐൑൒൓ൔൕൖൗ൘൙൚൛൜൝൞ൟ
    0D60 ൠൡൢൣ൤൥൦൧൨൩൪൫൬൭൮൯൰൱൲൳൴൵൶൷൸൹ൺൻർൽൾൿ
    0D80 ඀ඁංඃ඄අආඇඈඉඊඋඌඍඎඏඐඑඒඓඔඕඖ඗඘඙කඛගඝඞඟ
    0DA0 චඡජඣඤඥඦටඨඩඪණඬතථදධන඲ඳපඵබභමඹයර඼ල඾඿
    0DC0 වශෂසහළෆ෇෈෉්෋෌෍෎ාැෑිීු෕ූ෗ෘෙේෛොෝෞෟ
    0DE0 ෠෡෢෣෤෥෦෧෨෩෪෫෬෭෮෯෰෱ෲෳ෴෵෶෷෸෹෺෻෼෽෾෿
    0E00 ฀กขฃคฅฆงจฉชซฌญฎฏฐฑฒณดตถทธนบปผฝพฟ
    0E20 ภมยรฤลฦวศษสหฬอฮฯะัาำิีึืฺุู฻฼฽฾฿
    0E40 เแโใไๅๆ็่้๊๋์ํ๎๏๐๑๒๓๔๕๖๗๘๙๚๛๜๝๞๟
    0E60 ๠๡๢๣๤๥๦๧๨๩๪๫๬๭๮๯๰๱๲๳๴๵๶๷๸๹๺๻๼๽๾๿
    0E80 ຀ກຂ຃ຄ຅ຆງຈຉຊ຋ຌຍຎຏຐຑຒຓດຕຖທຘນບປຜຝພຟ
    0EA0 ຠມຢຣ຤ລ຦ວຨຩສຫຬອຮຯະັາຳິີຶື຺ຸູົຼຽ຾຿
    0EC0 ເແໂໃໄ໅ໆ໇່້໊໋໌ໍ໎໏໐໑໒໓໔໕໖໗໘໙໚໛ໜໝໞໟ
    0EE0 ໠໡໢໣໤໥໦໧໨໩໪໫໬໭໮໯໰໱໲໳໴໵໶໷໸໹໺໻໼໽໾໿
    0F00 ༀ༁༂༃༄༅༆༇༈༉༊་༌།༎༏༐༑༒༓༔༕༖༗༘༙༚༛༜༝༞༟
    0F20 ༠༡༢༣༤༥༦༧༨༩༪༫༬༭༮༯༰༱༲༳༴༵༶༷༸༹༺༻༼༽༾༿
    0F40 ཀཁགགྷངཅཆཇ཈ཉཊཋཌཌྷཎཏཐདདྷནཔཕབབྷམཙཚཛཛྷཝཞཟ
    0F60 འཡརལཤཥསཧཨཀྵཪཫཬ཭཮཯཰ཱཱཱིིུུྲྀཷླྀཹེཻོཽཾཿ
    0F80 ྄ཱྀྀྂྃ྅྆྇ྈྉྊྋྌྍྎྏྐྑྒྒྷྔྕྖྗ྘ྙྚྛྜྜྷྞྟ
    0FA0 ྠྡྡྷྣྤྥྦྦྷྨྩྪྫྫྷྭྮྯྰྱྲླྴྵྶྷྸྐྵྺྻྼ྽྾྿
    0FC0 ࿀࿁࿂࿃࿄࿅࿆࿇࿈࿉࿊࿋࿌࿍࿎࿏࿐࿑࿒࿓࿔࿕࿖࿗࿘࿙࿚࿛࿜࿝࿞࿟
    0FE0 ࿠࿡࿢࿣࿤࿥࿦࿧࿨࿩࿪࿫࿬࿭࿮࿯࿰࿱࿲࿳࿴࿵࿶࿷࿸࿹࿺࿻࿼࿽࿾࿿
    1000 ကခဂဃငစဆဇဈဉညဋဌဍဎဏတထဒဓနပဖဗဘမယရလဝသဟ
    1020 ဠအဢဣဤဥဦဧဨဩဪါာိီုူေဲဳဴဵံ့း္်ျြွှဿ
    1040 ၀၁၂၃၄၅၆၇၈၉၊။၌၍၎၏ၐၑၒၓၔၕၖၗၘၙၚၛၜၝၞၟ
    1060 ၠၡၢၣၤၥၦၧၨၩၪၫၬၭၮၯၰၱၲၳၴၵၶၷၸၹၺၻၼၽၾၿ
    1080 ႀႁႂႃႄႅႆႇႈႉႊႋႌႍႎႏ႐႑႒႓႔႕႖႗႘႙ႚႛႜႝ႞႟
    10A0 ႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿ
    10C0 ჀჁჂჃჄჅ჆Ⴧ჈჉჊჋჌Ⴭ჎჏აბგდევზთიკლმნოპჟ
    10E0 რსტუფქღყშჩცძწჭხჯჰჱჲჳჴჵჶჷჸჹჺ჻ჼჽჾჿ
    1100 ᄀᄁᄂᄃᄄᄅᄆᄇᄈᄉᄊᄋᄌᄍᄎᄏᄐᄑᄒᄓᄔᄕᄖᄗᄘᄙᄚᄛᄜᄝᄞᄟ
    1120 ᄠᄡᄢᄣᄤᄥᄦᄧᄨᄩᄪᄫᄬᄭᄮᄯᄰᄱᄲᄳᄴᄵᄶᄷᄸᄹᄺᄻᄼᄽᄾᄿ
    1140 ᅀᅁᅂᅃᅄᅅᅆᅇᅈᅉᅊᅋᅌᅍᅎᅏᅐᅑᅒᅓᅔᅕᅖᅗᅘᅙᅚᅛᅜᅝᅞᅟ
    1160 ᅠᅡᅢᅣᅤᅥᅦᅧᅨᅩᅪᅫᅬᅭᅮᅯᅰᅱᅲᅳᅴᅵᅶᅷᅸᅹᅺᅻᅼᅽᅾᅿ
    1180 ᆀᆁᆂᆃᆄᆅᆆᆇᆈᆉᆊᆋᆌᆍᆎᆏᆐᆑᆒᆓᆔᆕᆖᆗᆘᆙᆚᆛᆜᆝᆞᆟ
    11A0 ᆠᆡᆢᆣᆤᆥᆦᆧᆨᆩᆪᆫᆬᆭᆮᆯᆰᆱᆲᆳᆴᆵᆶᆷᆸᆹᆺᆻᆼᆽᆾᆿ
    11C0 ᇀᇁᇂᇃᇄᇅᇆᇇᇈᇉᇊᇋᇌᇍᇎᇏᇐᇑᇒᇓᇔᇕᇖᇗᇘᇙᇚᇛᇜᇝᇞᇟ
    11E0 ᇠᇡᇢᇣᇤᇥᇦᇧᇨᇩᇪᇫᇬᇭᇮᇯᇰᇱᇲᇳᇴᇵᇶᇷᇸᇹᇺᇻᇼᇽᇾᇿ
    1200 ሀሁሂሃሄህሆሇለሉሊላሌልሎሏሐሑሒሓሔሕሖሗመሙሚማሜምሞሟ
    1220 ሠሡሢሣሤሥሦሧረሩሪራሬርሮሯሰሱሲሳሴስሶሷሸሹሺሻሼሽሾሿ
    1240 ቀቁቂቃቄቅቆቇቈ቉ቊቋቌቍ቎቏ቐቑቒቓቔቕቖ቗ቘ቙ቚቛቜቝ቞቟
    1260 በቡቢባቤብቦቧቨቩቪቫቬቭቮቯተቱቲታቴትቶቷቸቹቺቻቼችቾቿ
    1280 ኀኁኂኃኄኅኆኇኈ኉ኊኋኌኍ኎኏ነኑኒናኔንኖኗኘኙኚኛኜኝኞኟ
    12A0 አኡኢኣኤእኦኧከኩኪካኬክኮኯኰ኱ኲኳኴኵ኶኷ኸኹኺኻኼኽኾ኿
    12C0 ዀ዁ዂዃዄዅ዆዇ወዉዊዋዌውዎዏዐዑዒዓዔዕዖ዗ዘዙዚዛዜዝዞዟ
    12E0 ዠዡዢዣዤዥዦዧየዩዪያዬይዮዯደዱዲዳዴድዶዷዸዹዺዻዼዽዾዿ
    1300 ጀጁጂጃጄጅጆጇገጉጊጋጌግጎጏጐ጑ጒጓጔጕ጖጗ጘጙጚጛጜጝጞጟ
    1320 ጠጡጢጣጤጥጦጧጨጩጪጫጬጭጮጯጰጱጲጳጴጵጶጷጸጹጺጻጼጽጾጿ
    1340 ፀፁፂፃፄፅፆፇፈፉፊፋፌፍፎፏፐፑፒፓፔፕፖፗፘፙፚ፛፜፝፞፟
    1360 ፠፡።፣፤፥፦፧፨፩፪፫፬፭፮፯፰፱፲፳፴፵፶፷፸፹፺፻፼፽፾፿
    1380 ᎀᎁᎂᎃᎄᎅᎆᎇᎈᎉᎊᎋᎌᎍᎎᎏ᎐᎑᎒᎓᎔᎕᎖᎗᎘᎙᎚᎛᎜᎝᎞᎟
    13A0 ᎠᎡᎢᎣᎤᎥᎦᎧᎨᎩᎪᎫᎬᎭᎮᎯᎰᎱᎲᎳᎴᎵᎶᎷᎸᎹᎺᎻᎼᎽᎾᎿ
    13C0 ᏀᏁᏂᏃᏄᏅᏆᏇᏈᏉᏊᏋᏌᏍᏎᏏᏐᏑᏒᏓᏔᏕᏖᏗᏘᏙᏚᏛᏜᏝᏞᏟ
    13E0 ᏠᏡᏢᏣᏤᏥᏦᏧᏨᏩᏪᏫᏬᏭᏮᏯᏰᏱᏲᏳᏴᏵ᏶᏷ᏸᏹᏺᏻᏼᏽ᏾᏿
    1400 ᐀ᐁᐂᐃᐄᐅᐆᐇᐈᐉᐊᐋᐌᐍᐎᐏᐐᐑᐒᐓᐔᐕᐖᐗᐘᐙᐚᐛᐜᐝᐞᐟ
    1420 ᐠᐡᐢᐣᐤᐥᐦᐧᐨᐩᐪᐫᐬᐭᐮᐯᐰᐱᐲᐳᐴᐵᐶᐷᐸᐹᐺᐻᐼᐽᐾᐿ
    1440 ᑀᑁᑂᑃᑄᑅᑆᑇᑈᑉᑊᑋᑌᑍᑎᑏᑐᑑᑒᑓᑔᑕᑖᑗᑘᑙᑚᑛᑜᑝᑞᑟ
    1460 ᑠᑡᑢᑣᑤᑥᑦᑧᑨᑩᑪᑫᑬᑭᑮᑯᑰᑱᑲᑳᑴᑵᑶᑷᑸᑹᑺᑻᑼᑽᑾᑿ
    1480 ᒀᒁᒂᒃᒄᒅᒆᒇᒈᒉᒊᒋᒌᒍᒎᒏᒐᒑᒒᒓᒔᒕᒖᒗᒘᒙᒚᒛᒜᒝᒞᒟ
    14A0 ᒠᒡᒢᒣᒤᒥᒦᒧᒨᒩᒪᒫᒬᒭᒮᒯᒰᒱᒲᒳᒴᒵᒶᒷᒸᒹᒺᒻᒼᒽᒾᒿ
    14C0 ᓀᓁᓂᓃᓄᓅᓆᓇᓈᓉᓊᓋᓌᓍᓎᓏᓐᓑᓒᓓᓔᓕᓖᓗᓘᓙᓚᓛᓜᓝᓞᓟ
    14E0 ᓠᓡᓢᓣᓤᓥᓦᓧᓨᓩᓪᓫᓬᓭᓮᓯᓰᓱᓲᓳᓴᓵᓶᓷᓸᓹᓺᓻᓼᓽᓾᓿ
    1500 ᔀᔁᔂᔃᔄᔅᔆᔇᔈᔉᔊᔋᔌᔍᔎᔏᔐᔑᔒᔓᔔᔕᔖᔗᔘᔙᔚᔛᔜᔝᔞᔟ
    1520 ᔠᔡᔢᔣᔤᔥᔦᔧᔨᔩᔪᔫᔬᔭᔮᔯᔰᔱᔲᔳᔴᔵᔶᔷᔸᔹᔺᔻᔼᔽᔾᔿ
    1540 ᕀᕁᕂᕃᕄᕅᕆᕇᕈᕉᕊᕋᕌᕍᕎᕏᕐᕑᕒᕓᕔᕕᕖᕗᕘᕙᕚᕛᕜᕝᕞᕟ
    1560 ᕠᕡᕢᕣᕤᕥᕦᕧᕨᕩᕪᕫᕬᕭᕮᕯᕰᕱᕲᕳᕴᕵᕶᕷᕸᕹᕺᕻᕼᕽᕾᕿ
    1580 ᖀᖁᖂᖃᖄᖅᖆᖇᖈᖉᖊᖋᖌᖍᖎᖏᖐᖑᖒᖓᖔᖕᖖᖗᖘᖙᖚᖛᖜᖝᖞᖟ
    15A0 ᖠᖡᖢᖣᖤᖥᖦᖧᖨᖩᖪᖫᖬᖭᖮᖯᖰᖱᖲᖳᖴᖵᖶᖷᖸᖹᖺᖻᖼᖽᖾᖿ
    15C0 ᗀᗁᗂᗃᗄᗅᗆᗇᗈᗉᗊᗋᗌᗍᗎᗏᗐᗑᗒᗓᗔᗕᗖᗗᗘᗙᗚᗛᗜᗝᗞᗟ
    15E0 ᗠᗡᗢᗣᗤᗥᗦᗧᗨᗩᗪᗫᗬᗭᗮᗯᗰᗱᗲᗳᗴᗵᗶᗷᗸᗹᗺᗻᗼᗽᗾᗿ
    1600 ᘀᘁᘂᘃᘄᘅᘆᘇᘈᘉᘊᘋᘌᘍᘎᘏᘐᘑᘒᘓᘔᘕᘖᘗᘘᘙᘚᘛᘜᘝᘞᘟ
    1620 ᘠᘡᘢᘣᘤᘥᘦᘧᘨᘩᘪᘫᘬᘭᘮᘯᘰᘱᘲᘳᘴᘵᘶᘷᘸᘹᘺᘻᘼᘽᘾᘿ
    1640 ᙀᙁᙂᙃᙄᙅᙆᙇᙈᙉᙊᙋᙌᙍᙎᙏᙐᙑᙒᙓᙔᙕᙖᙗᙘᙙᙚᙛᙜᙝᙞᙟ
    1660 ᙠᙡᙢᙣᙤᙥᙦᙧᙨᙩᙪᙫᙬ᙭᙮ᙯᙰᙱᙲᙳᙴᙵᙶᙷᙸᙹᙺᙻᙼᙽᙾᙿ
    1680  ᚁᚂᚃᚄᚅᚆᚇᚈᚉᚊᚋᚌᚍᚎᚏᚐᚑᚒᚓᚔᚕᚖᚗᚘᚙᚚ᚛᚜᚝᚞᚟
    16A0 ᚠᚡᚢᚣᚤᚥᚦᚧᚨᚩᚪᚫᚬᚭᚮᚯᚰᚱᚲᚳᚴᚵᚶᚷᚸᚹᚺᚻᚼᚽᚾᚿ
    16C0 ᛀᛁᛂᛃᛄᛅᛆᛇᛈᛉᛊᛋᛌᛍᛎᛏᛐᛑᛒᛓᛔᛕᛖᛗᛘᛙᛚᛛᛜᛝᛞᛟ
    16E0 ᛠᛡᛢᛣᛤᛥᛦᛧᛨᛩᛪ᛫᛬᛭ᛮᛯᛰᛱᛲᛳᛴᛵᛶᛷᛸ᛹᛺᛻᛼᛽᛾᛿
    1700 ᜀᜁᜂᜃᜄᜅᜆᜇᜈᜉᜊᜋᜌᜍᜎᜏᜐᜑᜒᜓ᜔᜕᜖᜗᜘᜙᜚᜛᜜᜝᜞ᜟ
    1720 ᜠᜡᜢᜣᜤᜥᜦᜧᜨᜩᜪᜫᜬᜭᜮᜯᜰᜱᜲᜳ᜴᜵᜶᜷᜸᜹᜺᜻᜼᜽᜾᜿
    1740 ᝀᝁᝂᝃᝄᝅᝆᝇᝈᝉᝊᝋᝌᝍᝎᝏᝐᝑᝒᝓ᝔᝕᝖᝗᝘᝙᝚᝛᝜᝝᝞᝟
    1760 ᝠᝡᝢᝣᝤᝥᝦᝧᝨᝩᝪᝫᝬ᝭ᝮᝯᝰ᝱ᝲᝳ᝴᝵᝶᝷᝸᝹᝺᝻᝼᝽᝾᝿
    1780 កខគឃងចឆជឈញដឋឌឍណតថទធនបផពភមយរលវឝឞស
    17A0 ហឡអឣឤឥឦឧឨឩឪឫឬឭឮឯឰឱឲឳ឴឵ាិីឹឺុូួើឿ
    17C0 ៀេែៃោៅំះៈ៉៊់៌៍៎៏័៑្៓។៕៖ៗ៘៙៚៛ៜ៝៞៟
    17E0 ០១២៣៤៥៦៧៨៩៪៫៬៭៮៯៰៱៲៳៴៵៶៷៸៹៺៻៼៽៾៿
    1800 ᠀᠁᠂᠃᠄᠅᠆᠇᠈᠉᠊᠋᠌᠍᠎᠏᠐᠑᠒᠓᠔᠕᠖᠗᠘᠙᠚᠛᠜᠝᠞᠟
    1820 ᠠᠡᠢᠣᠤᠥᠦᠧᠨᠩᠪᠫᠬᠭᠮᠯᠰᠱᠲᠳᠴᠵᠶᠷᠸᠹᠺᠻᠼᠽᠾᠿ
    1840 ᡀᡁᡂᡃᡄᡅᡆᡇᡈᡉᡊᡋᡌᡍᡎᡏᡐᡑᡒᡓᡔᡕᡖᡗᡘᡙᡚᡛᡜᡝᡞᡟ
    1860 ᡠᡡᡢᡣᡤᡥᡦᡧᡨᡩᡪᡫᡬᡭᡮᡯᡰᡱᡲᡳᡴᡵᡶᡷᡸ᡹᡺᡻᡼᡽᡾᡿
    1880 ᢀᢁᢂᢃᢄᢅᢆᢇᢈᢉᢊᢋᢌᢍᢎᢏᢐᢑᢒᢓᢔᢕᢖᢗᢘᢙᢚᢛᢜᢝᢞᢟ
    18A0 ᢠᢡᢢᢣᢤᢥᢦᢧᢨᢩᢪ᢫᢬᢭᢮᢯ᢰᢱᢲᢳᢴᢵᢶᢷᢸᢹᢺᢻᢼᢽᢾᢿ
    18C0 ᣀᣁᣂᣃᣄᣅᣆᣇᣈᣉᣊᣋᣌᣍᣎᣏᣐᣑᣒᣓᣔᣕᣖᣗᣘᣙᣚᣛᣜᣝᣞᣟ
    18E0 ᣠᣡᣢᣣᣤᣥᣦᣧᣨᣩᣪᣫᣬᣭᣮᣯᣰᣱᣲᣳᣴᣵ᣶᣷᣸᣹᣺᣻᣼᣽᣾᣿
    1900 ᤀᤁᤂᤃᤄᤅᤆᤇᤈᤉᤊᤋᤌᤍᤎᤏᤐᤑᤒᤓᤔᤕᤖᤗᤘᤙᤚᤛᤜᤝᤞ᤟
    1920 ᤠᤡᤢᤣᤤᤥᤦᤧᤨᤩᤪᤫ᤬᤭᤮᤯ᤰᤱᤲᤳᤴᤵᤶᤷᤸ᤻᤹᤺᤼᤽᤾᤿
    1940 ᥀᥁᥂᥃᥄᥅᥆᥇᥈᥉᥊᥋᥌᥍᥎᥏ᥐᥑᥒᥓᥔᥕᥖᥗᥘᥙᥚᥛᥜᥝᥞᥟ
    1960 ᥠᥡᥢᥣᥤᥥᥦᥧᥨᥩᥪᥫᥬᥭ᥮᥯ᥰᥱᥲᥳᥴ᥵᥶᥷᥸᥹᥺᥻᥼᥽᥾᥿
    1980 ᦀᦁᦂᦃᦄᦅᦆᦇᦈᦉᦊᦋᦌᦍᦎᦏᦐᦑᦒᦓᦔᦕᦖᦗᦘᦙᦚᦛᦜᦝᦞᦟ
    19A0 ᦠᦡᦢᦣᦤᦥᦦᦧᦨᦩᦪᦫ᦬᦭᦮᦯ᦰᦱᦲᦳᦴᦵᦶᦷᦸᦹᦺᦻᦼᦽᦾᦿ
    19C0 ᧀᧁᧂᧃᧄᧅᧆᧇᧈᧉ᧊᧋᧌᧍᧎᧏᧐᧑᧒᧓᧔᧕᧖᧗᧘᧙᧚᧛᧜᧝᧞᧟
    19E0 ᧠᧡᧢᧣᧤᧥᧦᧧᧨᧩᧪᧫᧬᧭᧮᧯᧰᧱᧲᧳᧴᧵᧶᧷᧸᧹᧺᧻᧼᧽᧾᧿
    1A00 ᨀᨁᨂᨃᨄᨅᨆᨇᨈᨉᨊᨋᨌᨍᨎᨏᨐᨑᨒᨓᨔᨕᨖᨘᨗᨙᨚᨛ᨜᨝᨞᨟
    1A20 ᨠᨡᨢᨣᨤᨥᨦᨧᨨᨩᨪᨫᨬᨭᨮᨯᨰᨱᨲᨳᨴᨵᨶᨷᨸᨹᨺᨻᨼᨽᨾᨿ
    1A40 ᩀᩁᩂᩃᩄᩅᩆᩇᩈᩉᩊᩋᩌᩍᩎᩏᩐᩑᩒᩓᩔᩕᩖᩗᩘᩙᩚᩛᩜᩝᩞ᩟
    1A60 ᩠ᩡᩢᩣᩤᩥᩦᩧᩨᩩᩪᩫᩬᩭᩮᩯᩰᩱᩲᩳᩴ᩵᩶᩷᩸᩹᩺᩻᩼᩽᩾᩿
    1A80 ᪀᪁᪂᪃᪄᪅᪆᪇᪈᪉᪊᪋᪌᪍᪎᪏᪐᪑᪒᪓᪔᪕᪖᪗᪘᪙᪚᪛᪜᪝᪞᪟
    1AA0 ᪠᪡᪢᪣᪤᪥᪦ᪧ᪨᪩᪪᪫᪬᪭᪮᪯᪵᪶᪷᪸᪹᪺᪽᪰᪱᪲᪳᪴᪻᪼᪾ᪿ
    1AC0 ᫀ᫃᫄᫊᫁᫂᫅᫆᫇᫈᫉᫋ᫌᫍᫎ᫏᫐᫑᫒᫓᫔᫕᫖᫗᫘᫙᫚᫛᫜᫝᫞᫟
    1AE0 ᫠᫡᫢᫣᫤᫥᫦᫧᫨᫩᫪᫫᫬᫭᫮᫯᫰᫱᫲᫳᫴᫵᫶᫷᫸᫹᫺᫻᫼᫽᫾᫿
    1B00 ᬀᬁᬂᬃᬄᬅᬆᬇᬈᬉᬊᬋᬌᬍᬎᬏᬐᬑᬒᬓᬔᬕᬖᬗᬘᬙᬚᬛᬜᬝᬞᬟ
    1B20 ᬠᬡᬢᬣᬤᬥᬦᬧᬨᬩᬪᬫᬬᬭᬮᬯᬰᬱᬲᬳ᬴ᬵᬶᬷᬸᬹᬺᬻᬼᬽᬾᬿ
    1B40 ᭀᭁᭂᭃ᭄ᭅᭆᭇᭈᭉᭊᭋᭌ᭍᭎᭏᭐᭑᭒᭓᭔᭕᭖᭗᭘᭙᭚᭛᭜᭝᭞᭟
    1B60 ᭠᭡᭢᭣᭤᭥᭦᭧᭨᭩᭪᭬᭫᭭᭮᭯᭰᭱᭲᭳᭴᭵᭶᭷᭸᭹᭺᭻᭼᭽᭾᭿
    1B80 ᮀᮁᮂᮃᮄᮅᮆᮇᮈᮉᮊᮋᮌᮍᮎᮏᮐᮑᮒᮓᮔᮕᮖᮗᮘᮙᮚᮛᮜᮝᮞᮟ
    1BA0 ᮠᮡᮢᮣᮤᮥᮦᮧᮨᮩ᮪᮫ᮬᮭᮮᮯ᮰᮱᮲᮳᮴᮵᮶᮷᮸᮹ᮺᮻᮼᮽᮾᮿ
    1BC0 ᯀᯁᯂᯃᯄᯅᯆᯇᯈᯉᯊᯋᯌᯍᯎᯏᯐᯑᯒᯓᯔᯕᯖᯗᯘᯙᯚᯛᯜᯝᯞᯟ
    1BE0 ᯠᯡᯢᯣᯤᯥ᯦ᯧᯨᯩᯪᯫᯬᯭᯮᯯᯰᯱ᯲᯳᯴᯵᯶᯷᯸᯹᯺᯻᯼᯽᯾᯿
    1C00 ᰀᰁᰂᰃᰄᰅᰆᰇᰈᰉᰊᰋᰌᰍᰎᰏᰐᰑᰒᰓᰔᰕᰖᰗᰘᰙᰚᰛᰜᰝᰞᰟ
    1C20 ᰠᰡᰢᰣᰤᰥᰦᰧᰨᰩᰪᰫᰬᰭᰮᰯᰰᰱᰲᰳᰴᰵᰶ᰷᰸᰹᰺᰻᰼᰽᰾᰿
    1C40 ᱀᱁᱂᱃᱄᱅᱆᱇᱈᱉᱊᱋᱌ᱍᱎᱏ᱐᱑᱒᱓᱔᱕᱖᱗᱘᱙ᱚᱛᱜᱝᱞᱟ
    1C60 ᱠᱡᱢᱣᱤᱥᱦᱧᱨᱩᱪᱫᱬᱭᱮᱯᱰᱱᱲᱳᱴᱵᱶᱷᱸᱹᱺᱻᱼᱽ᱾᱿
    1C80 ᲀᲁᲂᲃᲄᲅᲆᲇᲈᲉᲊ᲋᲌᲍᲎᲏ᲐᲑᲒᲓᲔᲕᲖᲗᲘᲙᲚᲛᲜᲝᲞᲟ
    1CA0 ᲠᲡᲢᲣᲤᲥᲦᲧᲨᲩᲪᲫᲬᲭᲮᲯᲰᲱᲲᲳᲴᲵᲶᲷᲸᲹᲺ᲻᲼ᲽᲾᲿ
    1CC0 ᳀᳁᳂᳃᳄᳅᳆᳇᳈᳉᳊᳋᳌᳍᳎᳏᳐᳑᳒᳓᳔᳕᳖᳗᳘᳙᳜᳝᳞᳟᳚᳛
    1CE0 ᳠᳡᳢᳣᳤᳥᳦᳧᳨ᳩᳪᳫᳬ᳭ᳮᳯᳰᳱᳲᳳ᳴ᳵᳶ᳷᳸᳹ᳺ᳻᳼᳽᳾᳿
    1D00 ᴀᴁᴂᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌᴍᴎᴏᴐᴑᴒᴓᴔᴕᴖᴗᴘᴙᴚᴛᴜᴝᴞᴟ
    1D20 ᴠᴡᴢᴣᴤᴥᴦᴧᴨᴩᴪᴫᴬᴭᴮᴯᴰᴱᴲᴳᴴᴵᴶᴷᴸᴹᴺᴻᴼᴽᴾᴿ
    1D40 ᵀᵁᵂᵃᵄᵅᵆᵇᵈᵉᵊᵋᵌᵍᵎᵏᵐᵑᵒᵓᵔᵕᵖᵗᵘᵙᵚᵛᵜᵝᵞᵟ
    1D60 ᵠᵡᵢᵣᵤᵥᵦᵧᵨᵩᵪᵫᵬᵭᵮᵯᵰᵱᵲᵳᵴᵵᵶᵷᵸᵹᵺᵻᵼᵽᵾᵿ
    1D80 ᶀᶁᶂᶃᶄᶅᶆᶇᶈᶉᶊᶋᶌᶍᶎᶏᶐᶑᶒᶓᶔᶕᶖᶗᶘᶙᶚᶛᶜᶝᶞᶟ
    1DA0 ᶠᶡᶢᶣᶤᶥᶦᶧᶨᶩᶪᶫᶬᶭᶮᶯᶰᶱᶲᶳᶴᶵᶶᶷᶸᶹᶺᶻᶼᶽᶾᶿ
    1DC0 ᷐᷎᷂᷊᷏᷀᷁᷃᷄᷅᷆᷇᷈᷉᷋᷌᷑᷒ᷓᷔᷕᷖᷗᷘᷙᷚᷛᷜᷝᷞᷟ᷍
    1DE0 ᷺᷹᷽᷿᷷᷸ᷠᷡᷢᷣᷤᷥᷦᷧᷨᷩᷪᷫᷬᷭᷮᷯᷰᷱᷲᷳᷴ᷵᷻᷾᷶᷼
    1E00 ḀḁḂḃḄḅḆḇḈḉḊḋḌḍḎḏḐḑḒḓḔḕḖḗḘḙḚḛḜḝḞḟ
    1E20 ḠḡḢḣḤḥḦḧḨḩḪḫḬḭḮḯḰḱḲḳḴḵḶḷḸḹḺḻḼḽḾḿ
    1E40 ṀṁṂṃṄṅṆṇṈṉṊṋṌṍṎṏṐṑṒṓṔṕṖṗṘṙṚṛṜṝṞṟ
    1E60 ṠṡṢṣṤṥṦṧṨṩṪṫṬṭṮṯṰṱṲṳṴṵṶṷṸṹṺṻṼṽṾṿ
    1E80 ẀẁẂẃẄẅẆẇẈẉẊẋẌẍẎẏẐẑẒẓẔẕẖẗẘẙẚẛẜẝẞẟ
    1EA0 ẠạẢảẤấẦầẨẩẪẫẬậẮắẰằẲẳẴẵẶặẸẹẺẻẼẽẾế
    1EC0 ỀềỂểỄễỆệỈỉỊịỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞở
    1EE0 ỠỡỢợỤụỦủỨứỪừỬửỮữỰựỲỳỴỵỶỷỸỹỺỻỼỽỾỿ
    1F00 ἀἁἂἃἄἅἆἇἈἉἊἋἌἍἎἏἐἑἒἓἔἕ἖἗ἘἙἚἛἜἝ἞἟
    1F20 ἠἡἢἣἤἥἦἧἨἩἪἫἬἭἮἯἰἱἲἳἴἵἶἷἸἹἺἻἼἽἾἿ
    1F40 ὀὁὂὃὄὅ὆὇ὈὉὊὋὌὍ὎὏ὐὑὒὓὔὕὖὗ὘Ὑ὚Ὓ὜Ὕ὞Ὗ
    1F60 ὠὡὢὣὤὥὦὧὨὩὪὫὬὭὮὯὰάὲέὴήὶίὸόὺύὼώ὾὿
    1F80 ᾀᾁᾂᾃᾄᾅᾆᾇᾈᾉᾊᾋᾌᾍᾎᾏᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾞᾟ
    1FA0 ᾠᾡᾢᾣᾤᾥᾦᾧᾨᾩᾪᾫᾬᾭᾮᾯᾰᾱᾲᾳᾴ᾵ᾶᾷᾸᾹᾺΆᾼ᾽ι᾿
    1FC0 ῀῁ῂῃῄ῅ῆῇῈΈῊΉῌ῍῎῏ῐῑῒΐ῔῕ῖῗῘῙῚΊ῜῝῞῟
    1FE0 ῠῡῢΰῤῥῦῧῨῩῪΎῬ῭΅`῰῱ῲῳῴ῵ῶῷῸΌῺΏῼ´῾῿
    2000            ​‌‍‎‏‐‑‒–—―‖‗‘’‚‛“”„‟
    2020 †‡•‣․‥…‧

‪‫‬‭‮ ‰‱′″‴‵‶‷‸‹›※‼‽‾‿
    2040 ⁀⁁⁂⁃⁄⁅⁆⁇⁈⁉⁊⁋⁌⁍⁎⁏⁐⁑⁒⁓⁔⁕⁖⁗⁘⁙⁚⁛⁜⁝⁞ 
    2060 ⁠⁡⁢⁣⁤⁥⁦⁧⁨⁩⁰ⁱ⁲⁳⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿ
    2080 ₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎₏ₐₑₒₓₔₕₖₗₘₙₚₛₜ₝₞₟
    20A0 ₠₡₢₣₤₥₦₧₨₩₪₫€₭₮₯₰₱₲₳₴₵₶₷₸₹₺₻₼₽₾₿
    20C0 ⃀⃁⃂⃃⃄⃅⃆⃇⃈⃉⃊⃋⃌⃍⃎⃏⃒⃓⃘⃙⃚⃐⃑⃔⃕⃖⃗⃛⃜⃝⃞⃟
    20E0 ⃠⃡⃢⃣⃤⃥⃦⃪⃫⃨⃬⃭⃮⃯⃧⃩⃰⃱⃲⃳⃴⃵⃶⃷⃸⃹⃺⃻⃼⃽⃾⃿
    2100 ℀℁ℂ℃℄℅℆ℇ℈℉ℊℋℌℍℎℏℐℑℒℓ℔ℕ№℗℘ℙℚℛℜℝ℞℟
    2120 ℠℡™℣ℤ℥Ω℧ℨ℩KÅℬℭ℮ℯℰℱℲℳℴℵℶℷℸℹ℺℻ℼℽℾℿ
    2140 ⅀⅁⅂⅃⅄ⅅⅆⅇⅈⅉ⅊⅋⅌⅍ⅎ⅏⅐⅑⅒⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜⅝⅞⅟
    2160 ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅬⅭⅮⅯⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻⅼⅽⅾⅿ
    2180 ↀↁↂↃↄↅↆↇↈ↉↊↋↌↍↎↏←↑→↓↔↕↖↗↘↙↚↛↜↝↞↟
    21A0 ↠↡↢↣↤↥↦↧↨↩↪↫↬↭↮↯↰↱↲↳↴↵↶↷↸↹↺↻↼↽↾↿
    21C0 ⇀⇁⇂⇃⇄⇅⇆⇇⇈⇉⇊⇋⇌⇍⇎⇏⇐⇑⇒⇓⇔⇕⇖⇗⇘⇙⇚⇛⇜⇝⇞⇟
    21E0 ⇠⇡⇢⇣⇤⇥⇦⇧⇨⇩⇪⇫⇬⇭⇮⇯⇰⇱⇲⇳⇴⇵⇶⇷⇸⇹⇺⇻⇼⇽⇾⇿
    2200 ∀∁∂∃∄∅∆∇∈∉∊∋∌∍∎∏∐∑−∓∔∕∖∗∘∙√∛∜∝∞∟
    2220 ∠∡∢∣∤∥∦∧∨∩∪∫∬∭∮∯∰∱∲∳∴∵∶∷∸∹∺∻∼∽∾∿
    2240 ≀≁≂≃≄≅≆≇≈≉≊≋≌≍≎≏≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟
    2260 ≠≡≢≣≤≥≦≧≨≩≪≫≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿
    2280 ⊀⊁⊂⊃⊄⊅⊆⊇⊈⊉⊊⊋⊌⊍⊎⊏⊐⊑⊒⊓⊔⊕⊖⊗⊘⊙⊚⊛⊜⊝⊞⊟
    22A0 ⊠⊡⊢⊣⊤⊥⊦⊧⊨⊩⊪⊫⊬⊭⊮⊯⊰⊱⊲⊳⊴⊵⊶⊷⊸⊹⊺⊻⊼⊽⊾⊿
    22C0 ⋀⋁⋂⋃⋄⋅⋆⋇⋈⋉⋊⋋⋌⋍⋎⋏⋐⋑⋒⋓⋔⋕⋖⋗⋘⋙⋚⋛⋜⋝⋞⋟
    22E0 ⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋮⋯⋰⋱⋲⋳⋴⋵⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿
    2300 ⌀⌁⌂⌃⌄⌅⌆⌇⌈⌉⌊⌋⌌⌍⌎⌏⌐⌑⌒⌓⌔⌕⌖⌗⌘⌙⌚⌛⌜⌝⌞⌟
    2320 ⌠⌡⌢⌣⌤⌥⌦⌧⌨〈〉⌫⌬⌭⌮⌯⌰⌱⌲⌳⌴⌵⌶⌷⌸⌹⌺⌻⌼⌽⌾⌿
    2340 ⍀⍁⍂⍃⍄⍅⍆⍇⍈⍉⍊⍋⍌⍍⍎⍏⍐⍑⍒⍓⍔⍕⍖⍗⍘⍙⍚⍛⍜⍝⍞⍟
    2360 ⍠⍡⍢⍣⍤⍥⍦⍧⍨⍩⍪⍫⍬⍭⍮⍯⍰⍱⍲⍳⍴⍵⍶⍷⍸⍹⍺⍻⍼⍽⍾⍿
    2380 ⎀⎁⎂⎃⎄⎅⎆⎇⎈⎉⎊⎋⎌⎍⎎⎏⎐⎑⎒⎓⎔⎕⎖⎗⎘⎙⎚⎛⎜⎝⎞⎟
    23A0 ⎠⎡⎢⎣⎤⎥⎦⎧⎨⎩⎪⎫⎬⎭⎮⎯⎰⎱⎲⎳⎴⎵⎶⎷⎸⎹⎺⎻⎼⎽⎾⎿
    23C0 ⏀⏁⏂⏃⏄⏅⏆⏇⏈⏉⏊⏋⏌⏍⏎⏏⏐⏑⏒⏓⏔⏕⏖⏗⏘⏙⏚⏛⏜⏝⏞⏟
    23E0 ⏠⏡⏢⏣⏤⏥⏦⏧⏨⏩⏪⏫⏬⏭⏮⏯⏰⏱⏲⏳⏴⏵⏶⏷⏸⏹⏺⏻⏼⏽⏾⏿
    2400 ␀␁␂␃␄␅␆␇␈␉␊␋␌␍␎␏␐␑␒␓␔␕␖␗␘␙␚␛␜␝␞␟
    2420 ␠␡␢␣␤␥␦␧␨␩␪␫␬␭␮␯␰␱␲␳␴␵␶␷␸␹␺␻␼␽␾␿
    2440 ⑀⑁⑂⑃⑄⑅⑆⑇⑈⑉⑊⑋⑌⑍⑎⑏⑐⑑⑒⑓⑔⑕⑖⑗⑘⑙⑚⑛⑜⑝⑞⑟
    2460 ①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿
    2480 ⒀⒁⒂⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛⒜⒝⒞⒟
    24A0 ⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿ
    24C0 ⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟ
    24E0 ⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ⓪⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴⓵⓶⓷⓸⓹⓺⓻⓼⓽⓾⓿
    2500 ─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟
    2520 ┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿
    2540 ╀╁╂╃╄╅╆╇╈╉╊╋╌╍╎╏═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟
    2560 ╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯╰╱╲╳╴╵╶╷╸╹╺╻╼╽╾╿
    2580 ▀▁▂▃▄▅▆▇█▉▊▋▌▍▎▏▐░▒▓▔▕▖▗▘▙▚▛▜▝▞▟
    25A0 ■□▢▣▤▥▦▧▨▩▪▫▬▭▮▯▰▱▲△▴▵▶▷▸▹►▻▼▽▾▿
    25C0 ◀◁◂◃◄◅◆◇◈◉◊○◌◍◎●◐◑◒◓◔◕◖◗◘◙◚◛◜◝◞◟
    25E0 ◠◡◢◣◤◥◦◧◨◩◪◫◬◭◮◯◰◱◲◳◴◵◶◷◸◹◺◻◼◽◾◿
    2600 ☀☁☂☃☄★☆☇☈☉☊☋☌☍☎☏☐☑☒☓☔☕☖☗☘☙☚☛☜☝☞☟
    2620 ☠☡☢☣☤☥☦☧☨☩☪☫☬☭☮☯☰☱☲☳☴☵☶☷☸☹☺☻☼☽☾☿
    2640 ♀♁♂♃♄♅♆♇♈♉♊♋♌♍♎♏♐♑♒♓♔♕♖♗♘♙♚♛♜♝♞♟
    2660 ♠♡♢♣♤♥♦♧♨♩♪♫♬♭♮♯♰♱♲♳♴♵♶♷♸♹♺♻♼♽♾♿
    2680 ⚀⚁⚂⚃⚄⚅⚆⚇⚈⚉⚊⚋⚌⚍⚎⚏⚐⚑⚒⚓⚔⚕⚖⚗⚘⚙⚚⚛⚜⚝⚞⚟
    26A0 ⚠⚡⚢⚣⚤⚥⚦⚧⚨⚩⚪⚫⚬⚭⚮⚯⚰⚱⚲⚳⚴⚵⚶⚷⚸⚹⚺⚻⚼⚽⚾⚿
    26C0 ⛀⛁⛂⛃⛄⛅⛆⛇⛈⛉⛊⛋⛌⛍⛎⛏⛐⛑⛒⛓⛔⛕⛖⛗⛘⛙⛚⛛⛜⛝⛞⛟
    26E0 ⛠⛡⛢⛣⛤⛥⛦⛧⛨⛩⛪⛫⛬⛭⛮⛯⛰⛱⛲⛳⛴⛵⛶⛷⛸⛹⛺⛻⛼⛽⛾⛿
    2700 ✀✁✂✃✄✅✆✇✈✉✊✋✌✍✎✏✐✑✒✓✔✕✖✗✘✙✚✛✜✝✞✟
    2720 ✠✡✢✣✤✥✦✧✨✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼✽✾✿
    2740 ❀❁❂❃❄❅❆❇❈❉❊❋❌❍❎❏❐❑❒❓❔❕❖❗❘❙❚❛❜❝❞❟
    2760 ❠❡❢❣❤❥❦❧❨❩❪❫❬❭❮❯❰❱❲❳❴❵❶❷❸❹❺❻❼❽❾❿
    2780 ➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓➔➕➖➗➘➙➚➛➜➝➞➟
    27A0 ➠➡➢➣➤➥➦➧➨➩➪➫➬➭➮➯➰➱➲➳➴➵➶➷➸➹➺➻➼➽➾➿
    27C0 ⟀⟁⟂⟃⟄⟅⟆⟇⟈⟉⟊⟋⟌⟍⟎⟏⟐⟑⟒⟓⟔⟕⟖⟗⟘⟙⟚⟛⟜⟝⟞⟟
    27E0 ⟠⟡⟢⟣⟤⟥⟦⟧⟨⟩⟪⟫⟬⟭⟮⟯⟰⟱⟲⟳⟴⟵⟶⟷⟸⟹⟺⟻⟼⟽⟾⟿
    2800 ⠀⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟
    2820 ⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿
    2840 ⡀⡁⡂⡃⡄⡅⡆⡇⡈⡉⡊⡋⡌⡍⡎⡏⡐⡑⡒⡓⡔⡕⡖⡗⡘⡙⡚⡛⡜⡝⡞⡟
    2860 ⡠⡡⡢⡣⡤⡥⡦⡧⡨⡩⡪⡫⡬⡭⡮⡯⡰⡱⡲⡳⡴⡵⡶⡷⡸⡹⡺⡻⡼⡽⡾⡿
    2880 ⢀⢁⢂⢃⢄⢅⢆⢇⢈⢉⢊⢋⢌⢍⢎⢏⢐⢑⢒⢓⢔⢕⢖⢗⢘⢙⢚⢛⢜⢝⢞⢟
    28A0 ⢠⢡⢢⢣⢤⢥⢦⢧⢨⢩⢪⢫⢬⢭⢮⢯⢰⢱⢲⢳⢴⢵⢶⢷⢸⢹⢺⢻⢼⢽⢾⢿
    28C0 ⣀⣁⣂⣃⣄⣅⣆⣇⣈⣉⣊⣋⣌⣍⣎⣏⣐⣑⣒⣓⣔⣕⣖⣗⣘⣙⣚⣛⣜⣝⣞⣟
    28E0 ⣠⣡⣢⣣⣤⣥⣦⣧⣨⣩⣪⣫⣬⣭⣮⣯⣰⣱⣲⣳⣴⣵⣶⣷⣸⣹⣺⣻⣼⣽⣾⣿
    2900 ⤀⤁⤂⤃⤄⤅⤆⤇⤈⤉⤊⤋⤌⤍⤎⤏⤐⤑⤒⤓⤔⤕⤖⤗⤘⤙⤚⤛⤜⤝⤞⤟
    2920 ⤠⤡⤢⤣⤤⤥⤦⤧⤨⤩⤪⤫⤬⤭⤮⤯⤰⤱⤲⤳⤴⤵⤶⤷⤸⤹⤺⤻⤼⤽⤾⤿
    2940 ⥀⥁⥂⥃⥄⥅⥆⥇⥈⥉⥊⥋⥌⥍⥎⥏⥐⥑⥒⥓⥔⥕⥖⥗⥘⥙⥚⥛⥜⥝⥞⥟
    2960 ⥠⥡⥢⥣⥤⥥⥦⥧⥨⥩⥪⥫⥬⥭⥮⥯⥰⥱⥲⥳⥴⥵⥶⥷⥸⥹⥺⥻⥼⥽⥾⥿
    2980 ⦀⦁⦂⦃⦄⦅⦆⦇⦈⦉⦊⦋⦌⦍⦎⦏⦐⦑⦒⦓⦔⦕⦖⦗⦘⦙⦚⦛⦜⦝⦞⦟
    29A0 ⦠⦡⦢⦣⦤⦥⦦⦧⦨⦩⦪⦫⦬⦭⦮⦯⦰⦱⦲⦳⦴⦵⦶⦷⦸⦹⦺⦻⦼⦽⦾⦿
    29C0 ⧀⧁⧂⧃⧄⧅⧆⧇⧈⧉⧊⧋⧌⧍⧎⧏⧐⧑⧒⧓⧔⧕⧖⧗⧘⧙⧚⧛⧜⧝⧞⧟
    29E0 ⧠⧡⧢⧣⧤⧥⧦⧧⧨⧩⧪⧫⧬⧭⧮⧯⧰⧱⧲⧳⧴⧵⧶⧷⧸⧹⧺⧻⧼⧽⧾⧿
    2A00 ⨀⨁⨂⨃⨄⨅⨆⨇⨈⨉⨊⨋⨌⨍⨎⨏⨐⨑⨒⨓⨔⨕⨖⨗⨘⨙⨚⨛⨜⨝⨞⨟
    2A20 ⨠⨡⨢⨣⨤⨥⨦⨧⨨⨩⨪⨫⨬⨭⨮⨯⨰⨱⨲⨳⨴⨵⨶⨷⨸⨹⨺⨻⨼⨽⨾⨿
    2A40 ⩀⩁⩂⩃⩄⩅⩆⩇⩈⩉⩊⩋⩌⩍⩎⩏⩐⩑⩒⩓⩔⩕⩖⩗⩘⩙⩚⩛⩜⩝⩞⩟
    2A60 ⩠⩡⩢⩣⩤⩥⩦⩧⩨⩩⩪⩫⩬⩭⩮⩯⩰⩱⩲⩳⩴⩵⩶⩷⩸⩹⩺⩻⩼⩽⩾⩿
    2A80 ⪀⪁⪂⪃⪄⪅⪆⪇⪈⪉⪊⪋⪌⪍⪎⪏⪐⪑⪒⪓⪔⪕⪖⪗⪘⪙⪚⪛⪜⪝⪞⪟
    2AA0 ⪠⪡⪢⪣⪤⪥⪦⪧⪨⪩⪪⪫⪬⪭⪮⪯⪰⪱⪲⪳⪴⪵⪶⪷⪸⪹⪺⪻⪼⪽⪾⪿
    2AC0 ⫀⫁⫂⫃⫄⫅⫆⫇⫈⫉⫊⫋⫌⫍⫎⫏⫐⫑⫒⫓⫔⫕⫖⫗⫘⫙⫚⫛⫝̸⫝⫞⫟
    2AE0 ⫠⫡⫢⫣⫤⫥⫦⫧⫨⫩⫪⫫⫬⫭⫮⫯⫰⫱⫲⫳⫴⫵⫶⫷⫸⫹⫺⫻⫼⫽⫾⫿
    2B00 ⬀⬁⬂⬃⬄⬅⬆⬇⬈⬉⬊⬋⬌⬍⬎⬏⬐⬑⬒⬓⬔⬕⬖⬗⬘⬙⬚⬛⬜⬝⬞⬟
    2B20 ⬠⬡⬢⬣⬤⬥⬦⬧⬨⬩⬪⬫⬬⬭⬮⬯⬰⬱⬲⬳⬴⬵⬶⬷⬸⬹⬺⬻⬼⬽⬾⬿
    2B40 ⭀⭁⭂⭃⭄⭅⭆⭇⭈⭉⭊⭋⭌⭍⭎⭏⭐⭑⭒⭓⭔⭕⭖⭗⭘⭙⭚⭛⭜⭝⭞⭟
    2B60 ⭠⭡⭢⭣⭤⭥⭦⭧⭨⭩⭪⭫⭬⭭⭮⭯⭰⭱⭲⭳⭴⭵⭶⭷⭸⭹⭺⭻⭼⭽⭾⭿
    2B80 ⮀⮁⮂⮃⮄⮅⮆⮇⮈⮉⮊⮋⮌⮍⮎⮏⮐⮑⮒⮓⮔⮕⮖⮗⮘⮙⮚⮛⮜⮝⮞⮟
    2BA0 ⮠⮡⮢⮣⮤⮥⮦⮧⮨⮩⮪⮫⮬⮭⮮⮯⮰⮱⮲⮳⮴⮵⮶⮷⮸⮹⮺⮻⮼⮽⮾⮿
    2BC0 ⯀⯁⯂⯃⯄⯅⯆⯇⯈⯉⯊⯋⯌⯍⯎⯏⯐⯑⯒⯓⯔⯕⯖⯗⯘⯙⯚⯛⯜⯝⯞⯟
    2BE0 ⯠⯡⯢⯣⯤⯥⯦⯧⯨⯩⯪⯫⯬⯭⯮⯯⯰⯱⯲⯳⯴⯵⯶⯷⯸⯹⯺⯻⯼⯽⯾⯿
    2C00 ⰀⰁⰂⰃⰄⰅⰆⰇⰈⰉⰊⰋⰌⰍⰎⰏⰐⰑⰒⰓⰔⰕⰖⰗⰘⰙⰚⰛⰜⰝⰞⰟ
    2C20 ⰠⰡⰢⰣⰤⰥⰦⰧⰨⰩⰪⰫⰬⰭⰮⰯⰰⰱⰲⰳⰴⰵⰶⰷⰸⰹⰺⰻⰼⰽⰾⰿ
    2C40 ⱀⱁⱂⱃⱄⱅⱆⱇⱈⱉⱊⱋⱌⱍⱎⱏⱐⱑⱒⱓⱔⱕⱖⱗⱘⱙⱚⱛⱜⱝⱞⱟ
    2C60 ⱠⱡⱢⱣⱤⱥⱦⱧⱨⱩⱪⱫⱬⱭⱮⱯⱰⱱⱲⱳⱴⱵⱶⱷⱸⱹⱺⱻⱼⱽⱾⱿ
    2C80 ⲀⲁⲂⲃⲄⲅⲆⲇⲈⲉⲊⲋⲌⲍⲎⲏⲐⲑⲒⲓⲔⲕⲖⲗⲘⲙⲚⲛⲜⲝⲞⲟ
    2CA0 ⲠⲡⲢⲣⲤⲥⲦⲧⲨⲩⲪⲫⲬⲭⲮⲯⲰⲱⲲⲳⲴⲵⲶⲷⲸⲹⲺⲻⲼⲽⲾⲿ
    2CC0 ⳀⳁⳂⳃⳄⳅⳆⳇⳈⳉⳊⳋⳌⳍⳎⳏⳐⳑⳒⳓⳔⳕⳖⳗⳘⳙⳚⳛⳜⳝⳞⳟ
    2CE0 ⳠⳡⳢⳣⳤ⳥⳦⳧⳨⳩⳪ⳫⳬⳭⳮ⳯⳰⳱Ⳳⳳ⳴⳵⳶⳷⳸⳹⳺⳻⳼⳽⳾⳿
    2D00 ⴀⴁⴂⴃⴄⴅⴆⴇⴈⴉⴊⴋⴌⴍⴎⴏⴐⴑⴒⴓⴔⴕⴖⴗⴘⴙⴚⴛⴜⴝⴞⴟ
    2D20 ⴠⴡⴢⴣⴤⴥ⴦ⴧ⴨⴩⴪⴫⴬ⴭ⴮⴯ⴰⴱⴲⴳⴴⴵⴶⴷⴸⴹⴺⴻⴼⴽⴾⴿ
    2D40 ⵀⵁⵂⵃⵄⵅⵆⵇⵈⵉⵊⵋⵌⵍⵎⵏⵐⵑⵒⵓⵔⵕⵖⵗⵘⵙⵚⵛⵜⵝⵞⵟ
    2D60 ⵠⵡⵢⵣⵤⵥⵦⵧ⵨⵩⵪⵫⵬⵭⵮ⵯ⵰⵱⵲⵳⵴⵵⵶⵷⵸⵹⵺⵻⵼⵽⵾⵿
    2D80 ⶀⶁⶂⶃⶄⶅⶆⶇⶈⶉⶊⶋⶌⶍⶎⶏⶐⶑⶒⶓⶔⶕⶖ⶗⶘⶙⶚⶛⶜⶝⶞⶟
    2DA0 ⶠⶡⶢⶣⶤⶥⶦ⶧ⶨⶩⶪⶫⶬⶭⶮ⶯ⶰⶱⶲⶳⶴⶵⶶ⶷ⶸⶹⶺⶻⶼⶽⶾ⶿
    2DC0 ⷀⷁⷂⷃⷄⷅⷆ⷇ⷈⷉⷊⷋⷌⷍⷎ⷏ⷐⷑⷒⷓⷔⷕⷖ⷗ⷘⷙⷚⷛⷜⷝⷞ⷟
    2DE0 ⷠⷡⷢⷣⷤⷥⷦⷧⷨⷩⷪⷫⷬⷭⷮⷯⷰⷱⷲⷳⷴⷵⷶⷷⷸⷹⷺⷻⷼⷽⷾⷿ
    2E00 ⸀⸁⸂⸃⸄⸅⸆⸇⸈⸉⸊⸋⸌⸍⸎⸏⸐⸑⸒⸓⸔⸕⸖⸗⸘⸙⸚⸛⸜⸝⸞⸟
    2E20 ⸠⸡⸢⸣⸤⸥⸦⸧⸨⸩⸪⸫⸬⸭⸮ⸯ⸰⸱⸲⸳⸴⸵⸶⸷⸸⸹⸺⸻⸼⸽⸾⸿
    2E40 ⹀⹁⹂⹃⹄⹅⹆⹇⹈⹉⹊⹋⹌⹍⹎⹏⹐⹑⹒⹓⹔⹕⹖⹗⹘⹙⹚⹛⹜⹝⹞⹟
    2E60 ⹠⹡⹢⹣⹤⹥⹦⹧⹨⹩⹪⹫⹬⹭⹮⹯⹰⹱⹲⹳⹴⹵⹶⹷⹸⹹⹺⹻⹼⹽⹾⹿
    2E80 ⺀⺁⺂⺃⺄⺅⺆⺇⺈⺉⺊⺋⺌⺍⺎⺏⺐⺑⺒⺓⺔⺕⺖⺗⺘⺙⺚⺛⺜⺝⺞⺟
    2EA0 ⺠⺡⺢⺣⺤⺥⺦⺧⺨⺩⺪⺫⺬⺭⺮⺯⺰⺱⺲⺳⺴⺵⺶⺷⺸⺹⺺⺻⺼⺽⺾⺿
    2EC0 ⻀⻁⻂⻃⻄⻅⻆⻇⻈⻉⻊⻋⻌⻍⻎⻏⻐⻑⻒⻓⻔⻕⻖⻗⻘⻙⻚⻛⻜⻝⻞⻟
    2EE0 ⻠⻡⻢⻣⻤⻥⻦⻧⻨⻩⻪⻫⻬⻭⻮⻯⻰⻱⻲⻳⻴⻵⻶⻷⻸⻹⻺⻻⻼⻽⻾⻿
    2F00 ⼀⼁⼂⼃⼄⼅⼆⼇⼈⼉⼊⼋⼌⼍⼎⼏⼐⼑⼒⼓⼔⼕⼖⼗⼘⼙⼚⼛⼜⼝⼞⼟
    2F20 ⼠⼡⼢⼣⼤⼥⼦⼧⼨⼩⼪⼫⼬⼭⼮⼯⼰⼱⼲⼳⼴⼵⼶⼷⼸⼹⼺⼻⼼⼽⼾⼿
    2F40 ⽀⽁⽂⽃⽄⽅⽆⽇⽈⽉⽊⽋⽌⽍⽎⽏⽐⽑⽒⽓⽔⽕⽖⽗⽘⽙⽚⽛⽜⽝⽞⽟
    2F60 ⽠⽡⽢⽣⽤⽥⽦⽧⽨⽩⽪⽫⽬⽭⽮⽯⽰⽱⽲⽳⽴⽵⽶⽷⽸⽹⽺⽻⽼⽽⽾⽿
    2F80 ⾀⾁⾂⾃⾄⾅⾆⾇⾈⾉⾊⾋⾌⾍⾎⾏⾐⾑⾒⾓⾔⾕⾖⾗⾘⾙⾚⾛⾜⾝⾞⾟
    2FA0 ⾠⾡⾢⾣⾤⾥⾦⾧⾨⾩⾪⾫⾬⾭⾮⾯⾰⾱⾲⾳⾴⾵⾶⾷⾸⾹⾺⾻⾼⾽⾾⾿
    2FC0 ⿀⿁⿂⿃⿄⿅⿆⿇⿈⿉⿊⿋⿌⿍⿎⿏⿐⿑⿒⿓⿔⿕⿖⿗⿘⿙⿚⿛⿜⿝⿞⿟
    2FE0 ⿠⿡⿢⿣⿤⿥⿦⿧⿨⿩⿪⿫⿬⿭⿮⿯⿰⿱⿲⿳⿴⿵⿶⿷⿸⿹⿺⿻⿼⿽⿾⿿
    3000  、。〃〄々〆〇〈〉《》「」『』【】〒〓〔〕〖〗〘〙〚〛〜〝〞〟
    3020 〠〡〢〣〤〥〦〧〨〩〪〭〮〯〫〬〰〱〲〳〴〵〶〷〸〹〺〻〼〽〾〿
    3040 ぀ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞた
    3060 だちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみ
    3080 むめもゃやゅゆょよらりるれろゎわゐゑをんゔゕゖ゗゘゙゚゛゜ゝゞゟ
    30A0 ゠ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタ
    30C0 ダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミ
    30E0 ムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶヷヸヹヺ・ーヽヾヿ
    3100 ㄀㄁㄂㄃㄄ㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟ
    3120 ㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩㄪㄫㄬㄭㄮㄯ㄰ㄱㄲㄳㄴㄵㄶㄷㄸㄹㄺㄻㄼㄽㄾㄿ
    3140 ㅀㅁㅂㅃㅄㅅㅆㅇㅈㅉㅊㅋㅌㅍㅎㅏㅐㅑㅒㅓㅔㅕㅖㅗㅘㅙㅚㅛㅜㅝㅞㅟ
    3160 ㅠㅡㅢㅣㅤㅥㅦㅧㅨㅩㅪㅫㅬㅭㅮㅯㅰㅱㅲㅳㅴㅵㅶㅷㅸㅹㅺㅻㅼㅽㅾㅿ
    3180 ㆀㆁㆂㆃㆄㆅㆆㆇㆈㆉㆊㆋㆌㆍㆎ㆏㆐㆑㆒㆓㆔㆕㆖㆗㆘㆙㆚㆛㆜㆝㆞㆟
    31A0 ㆠㆡㆢㆣㆤㆥㆦㆧㆨㆩㆪㆫㆬㆭㆮㆯㆰㆱㆲㆳㆴㆵㆶㆷㆸㆹㆺㆻㆼㆽㆾㆿ
    31C0 ㇀㇁㇂㇃㇄㇅㇆㇇㇈㇉㇊㇋㇌㇍㇎㇏㇐㇑㇒㇓㇔㇕㇖㇗㇘㇙㇚㇛㇜㇝㇞㇟
    31E0 ㇠㇡㇢㇣㇤㇥㇦㇧㇨㇩㇪㇫㇬㇭㇮㇯ㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ
    3200 ㈀㈁㈂㈃㈄㈅㈆㈇㈈㈉㈊㈋㈌㈍㈎㈏㈐㈑㈒㈓㈔㈕㈖㈗㈘㈙㈚㈛㈜㈝㈞㈟
    3220 ㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩㈪㈫㈬㈭㈮㈯㈰㈱㈲㈳㈴㈵㈶㈷㈸㈹㈺㈻㈼㈽㈾㈿
    3240 ㉀㉁㉂㉃㉄㉅㉆㉇㉈㉉㉊㉋㉌㉍㉎㉏㉐㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟
    3260 ㉠㉡㉢㉣㉤㉥㉦㉧㉨㉩㉪㉫㉬㉭㉮㉯㉰㉱㉲㉳㉴㉵㉶㉷㉸㉹㉺㉻㉼㉽㉾㉿
    3280 ㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉㊊㊋㊌㊍㊎㊏㊐㊑㊒㊓㊔㊕㊖㊗㊘㊙㊚㊛㊜㊝㊞㊟
    32A0 ㊠㊡㊢㊣㊤㊥㊦㊧㊨㊩㊪㊫㊬㊭㊮㊯㊰㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿
    32C0 ㋀㋁㋂㋃㋄㋅㋆㋇㋈㋉㋊㋋㋌㋍㋎㋏㋐㋑㋒㋓㋔㋕㋖㋗㋘㋙㋚㋛㋜㋝㋞㋟
    32E0 ㋠㋡㋢㋣㋤㋥㋦㋧㋨㋩㋪㋫㋬㋭㋮㋯㋰㋱㋲㋳㋴㋵㋶㋷㋸㋹㋺㋻㋼㋽㋾㋿
    3300 ㌀㌁㌂㌃㌄㌅㌆㌇㌈㌉㌊㌋㌌㌍㌎㌏㌐㌑㌒㌓㌔㌕㌖㌗㌘㌙㌚㌛㌜㌝㌞㌟
    3320 ㌠㌡㌢㌣㌤㌥㌦㌧㌨㌩㌪㌫㌬㌭㌮㌯㌰㌱㌲㌳㌴㌵㌶㌷㌸㌹㌺㌻㌼㌽㌾㌿
    3340 ㍀㍁㍂㍃㍄㍅㍆㍇㍈㍉㍊㍋㍌㍍㍎㍏㍐㍑㍒㍓㍔㍕㍖㍗㍘㍙㍚㍛㍜㍝㍞㍟
    3360 ㍠㍡㍢㍣㍤㍥㍦㍧㍨㍩㍪㍫㍬㍭㍮㍯㍰㍱㍲㍳㍴㍵㍶㍷㍸㍹㍺㍻㍼㍽㍾㍿
    3380 ㎀㎁㎂㎃㎄㎅㎆㎇㎈㎉㎊㎋㎌㎍㎎㎏㎐㎑㎒㎓㎔㎕㎖㎗㎘㎙㎚㎛㎜㎝㎞㎟
    33A0 ㎠㎡㎢㎣㎤㎥㎦㎧㎨㎩㎪㎫㎬㎭㎮㎯㎰㎱㎲㎳㎴㎵㎶㎷㎸㎹㎺㎻㎼㎽㎾㎿
    33C0 ㏀㏁㏂㏃㏄㏅㏆㏇㏈㏉㏊㏋㏌㏍㏎㏏㏐㏑㏒㏓㏔㏕㏖㏗㏘㏙㏚㏛㏜㏝㏞㏟
    33E0 ㏠㏡㏢㏣㏤㏥㏦㏧㏨㏩㏪㏫㏬㏭㏮㏯㏰㏱㏲㏳㏴㏵㏶㏷㏸㏹㏺㏻㏼㏽㏾㏿
    3400 㐀㐁㐂㐃㐄㐅㐆㐇㐈㐉㐊㐋㐌㐍㐎㐏㐐㐑㐒㐓㐔㐕㐖㐗㐘㐙㐚㐛㐜㐝㐞㐟
    3420 㐠㐡㐢㐣㐤㐥㐦㐧㐨㐩㐪㐫㐬㐭㐮㐯㐰㐱㐲㐳㐴㐵㐶㐷㐸㐹㐺㐻㐼㐽㐾㐿
    3440 㑀㑁㑂㑃㑄㑅㑆㑇㑈㑉㑊㑋㑌㑍㑎㑏㑐㑑㑒㑓㑔㑕㑖㑗㑘㑙㑚㑛㑜㑝㑞㑟
    3460 㑠㑡㑢㑣㑤㑥㑦㑧㑨㑩㑪㑫㑬㑭㑮㑯㑰㑱㑲㑳㑴㑵㑶㑷㑸㑹㑺㑻㑼㑽㑾㑿
    3480 㒀㒁㒂㒃㒄㒅㒆㒇㒈㒉㒊㒋㒌㒍㒎㒏㒐㒑㒒㒓㒔㒕㒖㒗㒘㒙㒚㒛㒜㒝㒞㒟
    34A0 㒠㒡㒢㒣㒤㒥㒦㒧㒨㒩㒪㒫㒬㒭㒮㒯㒰㒱㒲㒳㒴㒵㒶㒷㒸㒹㒺㒻㒼㒽㒾㒿
    34C0 㓀㓁㓂㓃㓄㓅㓆㓇㓈㓉㓊㓋㓌㓍㓎㓏㓐㓑㓒㓓㓔㓕㓖㓗㓘㓙㓚㓛㓜㓝㓞㓟
    34E0 㓠㓡㓢㓣㓤㓥㓦㓧㓨㓩㓪㓫㓬㓭㓮㓯㓰㓱㓲㓳㓴㓵㓶㓷㓸㓹㓺㓻㓼㓽㓾㓿
    3500 㔀㔁㔂㔃㔄㔅㔆㔇㔈㔉㔊㔋㔌㔍㔎㔏㔐㔑㔒㔓㔔㔕㔖㔗㔘㔙㔚㔛㔜㔝㔞㔟
    3520 㔠㔡㔢㔣㔤㔥㔦㔧㔨㔩㔪㔫㔬㔭㔮㔯㔰㔱㔲㔳㔴㔵㔶㔷㔸㔹㔺㔻㔼㔽㔾㔿
    3540 㕀㕁㕂㕃㕄㕅㕆㕇㕈㕉㕊㕋㕌㕍㕎㕏㕐㕑㕒㕓㕔㕕㕖㕗㕘㕙㕚㕛㕜㕝㕞㕟
    3560 㕠㕡㕢㕣㕤㕥㕦㕧㕨㕩㕪㕫㕬㕭㕮㕯㕰㕱㕲㕳㕴㕵㕶㕷㕸㕹㕺㕻㕼㕽㕾㕿
    3580 㖀㖁㖂㖃㖄㖅㖆㖇㖈㖉㖊㖋㖌㖍㖎㖏㖐㖑㖒㖓㖔㖕㖖㖗㖘㖙㖚㖛㖜㖝㖞㖟
    35A0 㖠㖡㖢㖣㖤㖥㖦㖧㖨㖩㖪㖫㖬㖭㖮㖯㖰㖱㖲㖳㖴㖵㖶㖷㖸㖹㖺㖻㖼㖽㖾㖿
    35C0 㗀㗁㗂㗃㗄㗅㗆㗇㗈㗉㗊㗋㗌㗍㗎㗏㗐㗑㗒㗓㗔㗕㗖㗗㗘㗙㗚㗛㗜㗝㗞㗟
    35E0 㗠㗡㗢㗣㗤㗥㗦㗧㗨㗩㗪㗫㗬㗭㗮㗯㗰㗱㗲㗳㗴㗵㗶㗷㗸㗹㗺㗻㗼㗽㗾㗿
    3600 㘀㘁㘂㘃㘄㘅㘆㘇㘈㘉㘊㘋㘌㘍㘎㘏㘐㘑㘒㘓㘔㘕㘖㘗㘘㘙㘚㘛㘜㘝㘞㘟
    3620 㘠㘡㘢㘣㘤㘥㘦㘧㘨㘩㘪㘫㘬㘭㘮㘯㘰㘱㘲㘳㘴㘵㘶㘷㘸㘹㘺㘻㘼㘽㘾㘿
    3640 㙀㙁㙂㙃㙄㙅㙆㙇㙈㙉㙊㙋㙌㙍㙎㙏㙐㙑㙒㙓㙔㙕㙖㙗㙘㙙㙚㙛㙜㙝㙞㙟
    3660 㙠㙡㙢㙣㙤㙥㙦㙧㙨㙩㙪㙫㙬㙭㙮㙯㙰㙱㙲㙳㙴㙵㙶㙷㙸㙹㙺㙻㙼㙽㙾㙿
    3680 㚀㚁㚂㚃㚄㚅㚆㚇㚈㚉㚊㚋㚌㚍㚎㚏㚐㚑㚒㚓㚔㚕㚖㚗㚘㚙㚚㚛㚜㚝㚞㚟
    36A0 㚠㚡㚢㚣㚤㚥㚦㚧㚨㚩㚪㚫㚬㚭㚮㚯㚰㚱㚲㚳㚴㚵㚶㚷㚸㚹㚺㚻㚼㚽㚾㚿
    36C0 㛀㛁㛂㛃㛄㛅㛆㛇㛈㛉㛊㛋㛌㛍㛎㛏㛐㛑㛒㛓㛔㛕㛖㛗㛘㛙㛚㛛㛜㛝㛞㛟
    36E0 㛠㛡㛢㛣㛤㛥㛦㛧㛨㛩㛪㛫㛬㛭㛮㛯㛰㛱㛲㛳㛴㛵㛶㛷㛸㛹㛺㛻㛼㛽㛾㛿
    3700 㜀㜁㜂㜃㜄㜅㜆㜇㜈㜉㜊㜋㜌㜍㜎㜏㜐㜑㜒㜓㜔㜕㜖㜗㜘㜙㜚㜛㜜㜝㜞㜟
    3720 㜠㜡㜢㜣㜤㜥㜦㜧㜨㜩㜪㜫㜬㜭㜮㜯㜰㜱㜲㜳㜴㜵㜶㜷㜸㜹㜺㜻㜼㜽㜾㜿
    3740 㝀㝁㝂㝃㝄㝅㝆㝇㝈㝉㝊㝋㝌㝍㝎㝏㝐㝑㝒㝓㝔㝕㝖㝗㝘㝙㝚㝛㝜㝝㝞㝟
    3760 㝠㝡㝢㝣㝤㝥㝦㝧㝨㝩㝪㝫㝬㝭㝮㝯㝰㝱㝲㝳㝴㝵㝶㝷㝸㝹㝺㝻㝼㝽㝾㝿
    3780 㞀㞁㞂㞃㞄㞅㞆㞇㞈㞉㞊㞋㞌㞍㞎㞏㞐㞑㞒㞓㞔㞕㞖㞗㞘㞙㞚㞛㞜㞝㞞㞟
    37A0 㞠㞡㞢㞣㞤㞥㞦㞧㞨㞩㞪㞫㞬㞭㞮㞯㞰㞱㞲㞳㞴㞵㞶㞷㞸㞹㞺㞻㞼㞽㞾㞿
    37C0 㟀㟁㟂㟃㟄㟅㟆㟇㟈㟉㟊㟋㟌㟍㟎㟏㟐㟑㟒㟓㟔㟕㟖㟗㟘㟙㟚㟛㟜㟝㟞㟟
    37E0 㟠㟡㟢㟣㟤㟥㟦㟧㟨㟩㟪㟫㟬㟭㟮㟯㟰㟱㟲㟳㟴㟵㟶㟷㟸㟹㟺㟻㟼㟽㟾㟿
    3800 㠀㠁㠂㠃㠄㠅㠆㠇㠈㠉㠊㠋㠌㠍㠎㠏㠐㠑㠒㠓㠔㠕㠖㠗㠘㠙㠚㠛㠜㠝㠞㠟
    3820 㠠㠡㠢㠣㠤㠥㠦㠧㠨㠩㠪㠫㠬㠭㠮㠯㠰㠱㠲㠳㠴㠵㠶㠷㠸㠹㠺㠻㠼㠽㠾㠿
    3840 㡀㡁㡂㡃㡄㡅㡆㡇㡈㡉㡊㡋㡌㡍㡎㡏㡐㡑㡒㡓㡔㡕㡖㡗㡘㡙㡚㡛㡜㡝㡞㡟
    3860 㡠㡡㡢㡣㡤㡥㡦㡧㡨㡩㡪㡫㡬㡭㡮㡯㡰㡱㡲㡳㡴㡵㡶㡷㡸㡹㡺㡻㡼㡽㡾㡿
    3880 㢀㢁㢂㢃㢄㢅㢆㢇㢈㢉㢊㢋㢌㢍㢎㢏㢐㢑㢒㢓㢔㢕㢖㢗㢘㢙㢚㢛㢜㢝㢞㢟
    38A0 㢠㢡㢢㢣㢤㢥㢦㢧㢨㢩㢪㢫㢬㢭㢮㢯㢰㢱㢲㢳㢴㢵㢶㢷㢸㢹㢺㢻㢼㢽㢾㢿
    38C0 㣀㣁㣂㣃㣄㣅㣆㣇㣈㣉㣊㣋㣌㣍㣎㣏㣐㣑㣒㣓㣔㣕㣖㣗㣘㣙㣚㣛㣜㣝㣞㣟
    38E0 㣠㣡㣢㣣㣤㣥㣦㣧㣨㣩㣪㣫㣬㣭㣮㣯㣰㣱㣲㣳㣴㣵㣶㣷㣸㣹㣺㣻㣼㣽㣾㣿
    3900 㤀㤁㤂㤃㤄㤅㤆㤇㤈㤉㤊㤋㤌㤍㤎㤏㤐㤑㤒㤓㤔㤕㤖㤗㤘㤙㤚㤛㤜㤝㤞㤟
    3920 㤠㤡㤢㤣㤤㤥㤦㤧㤨㤩㤪㤫㤬㤭㤮㤯㤰㤱㤲㤳㤴㤵㤶㤷㤸㤹㤺㤻㤼㤽㤾㤿
    3940 㥀㥁㥂㥃㥄㥅㥆㥇㥈㥉㥊㥋㥌㥍㥎㥏㥐㥑㥒㥓㥔㥕㥖㥗㥘㥙㥚㥛㥜㥝㥞㥟
    3960 㥠㥡㥢㥣㥤㥥㥦㥧㥨㥩㥪㥫㥬㥭㥮㥯㥰㥱㥲㥳㥴㥵㥶㥷㥸㥹㥺㥻㥼㥽㥾㥿
    3980 㦀㦁㦂㦃㦄㦅㦆㦇㦈㦉㦊㦋㦌㦍㦎㦏㦐㦑㦒㦓㦔㦕㦖㦗㦘㦙㦚㦛㦜㦝㦞㦟
    39A0 㦠㦡㦢㦣㦤㦥㦦㦧㦨㦩㦪㦫㦬㦭㦮㦯㦰㦱㦲㦳㦴㦵㦶㦷㦸㦹㦺㦻㦼㦽㦾㦿
    39C0 㧀㧁㧂㧃㧄㧅㧆㧇㧈㧉㧊㧋㧌㧍㧎㧏㧐㧑㧒㧓㧔㧕㧖㧗㧘㧙㧚㧛㧜㧝㧞㧟
    39E0 㧠㧡㧢㧣㧤㧥㧦㧧㧨㧩㧪㧫㧬㧭㧮㧯㧰㧱㧲㧳㧴㧵㧶㧷㧸㧹㧺㧻㧼㧽㧾㧿
    3A00 㨀㨁㨂㨃㨄㨅㨆㨇㨈㨉㨊㨋㨌㨍㨎㨏㨐㨑㨒㨓㨔㨕㨖㨗㨘㨙㨚㨛㨜㨝㨞㨟
    3A20 㨠㨡㨢㨣㨤㨥㨦㨧㨨㨩㨪㨫㨬㨭㨮㨯㨰㨱㨲㨳㨴㨵㨶㨷㨸㨹㨺㨻㨼㨽㨾㨿
    3A40 㩀㩁㩂㩃㩄㩅㩆㩇㩈㩉㩊㩋㩌㩍㩎㩏㩐㩑㩒㩓㩔㩕㩖㩗㩘㩙㩚㩛㩜㩝㩞㩟
    3A60 㩠㩡㩢㩣㩤㩥㩦㩧㩨㩩㩪㩫㩬㩭㩮㩯㩰㩱㩲㩳㩴㩵㩶㩷㩸㩹㩺㩻㩼㩽㩾㩿
    3A80 㪀㪁㪂㪃㪄㪅㪆㪇㪈㪉㪊㪋㪌㪍㪎㪏㪐㪑㪒㪓㪔㪕㪖㪗㪘㪙㪚㪛㪜㪝㪞㪟
    3AA0 㪠㪡㪢㪣㪤㪥㪦㪧㪨㪩㪪㪫㪬㪭㪮㪯㪰㪱㪲㪳㪴㪵㪶㪷㪸㪹㪺㪻㪼㪽㪾㪿
    3AC0 㫀㫁㫂㫃㫄㫅㫆㫇㫈㫉㫊㫋㫌㫍㫎㫏㫐㫑㫒㫓㫔㫕㫖㫗㫘㫙㫚㫛㫜㫝㫞㫟
    3AE0 㫠㫡㫢㫣㫤㫥㫦㫧㫨㫩㫪㫫㫬㫭㫮㫯㫰㫱㫲㫳㫴㫵㫶㫷㫸㫹㫺㫻㫼㫽㫾㫿
    3B00 㬀㬁㬂㬃㬄㬅㬆㬇㬈㬉㬊㬋㬌㬍㬎㬏㬐㬑㬒㬓㬔㬕㬖㬗㬘㬙㬚㬛㬜㬝㬞㬟
    3B20 㬠㬡㬢㬣㬤㬥㬦㬧㬨㬩㬪㬫㬬㬭㬮㬯㬰㬱㬲㬳㬴㬵㬶㬷㬸㬹㬺㬻㬼㬽㬾㬿
    3B40 㭀㭁㭂㭃㭄㭅㭆㭇㭈㭉㭊㭋㭌㭍㭎㭏㭐㭑㭒㭓㭔㭕㭖㭗㭘㭙㭚㭛㭜㭝㭞㭟
    3B60 㭠㭡㭢㭣㭤㭥㭦㭧㭨㭩㭪㭫㭬㭭㭮㭯㭰㭱㭲㭳㭴㭵㭶㭷㭸㭹㭺㭻㭼㭽㭾㭿
    3B80 㮀㮁㮂㮃㮄㮅㮆㮇㮈㮉㮊㮋㮌㮍㮎㮏㮐㮑㮒㮓㮔㮕㮖㮗㮘㮙㮚㮛㮜㮝㮞㮟
    3BA0 㮠㮡㮢㮣㮤㮥㮦㮧㮨㮩㮪㮫㮬㮭㮮㮯㮰㮱㮲㮳㮴㮵㮶㮷㮸㮹㮺㮻㮼㮽㮾㮿
    3BC0 㯀㯁㯂㯃㯄㯅㯆㯇㯈㯉㯊㯋㯌㯍㯎㯏㯐㯑㯒㯓㯔㯕㯖㯗㯘㯙㯚㯛㯜㯝㯞㯟
    3BE0 㯠㯡㯢㯣㯤㯥㯦㯧㯨㯩㯪㯫㯬㯭㯮㯯㯰㯱㯲㯳㯴㯵㯶㯷㯸㯹㯺㯻㯼㯽㯾㯿
    3C00 㰀㰁㰂㰃㰄㰅㰆㰇㰈㰉㰊㰋㰌㰍㰎㰏㰐㰑㰒㰓㰔㰕㰖㰗㰘㰙㰚㰛㰜㰝㰞㰟
    3C20 㰠㰡㰢㰣㰤㰥㰦㰧㰨㰩㰪㰫㰬㰭㰮㰯㰰㰱㰲㰳㰴㰵㰶㰷㰸㰹㰺㰻㰼㰽㰾㰿
    3C40 㱀㱁㱂㱃㱄㱅㱆㱇㱈㱉㱊㱋㱌㱍㱎㱏㱐㱑㱒㱓㱔㱕㱖㱗㱘㱙㱚㱛㱜㱝㱞㱟
    3C60 㱠㱡㱢㱣㱤㱥㱦㱧㱨㱩㱪㱫㱬㱭㱮㱯㱰㱱㱲㱳㱴㱵㱶㱷㱸㱹㱺㱻㱼㱽㱾㱿
    3C80 㲀㲁㲂㲃㲄㲅㲆㲇㲈㲉㲊㲋㲌㲍㲎㲏㲐㲑㲒㲓㲔㲕㲖㲗㲘㲙㲚㲛㲜㲝㲞㲟
    3CA0 㲠㲡㲢㲣㲤㲥㲦㲧㲨㲩㲪㲫㲬㲭㲮㲯㲰㲱㲲㲳㲴㲵㲶㲷㲸㲹㲺㲻㲼㲽㲾㲿
    3CC0 㳀㳁㳂㳃㳄㳅㳆㳇㳈㳉㳊㳋㳌㳍㳎㳏㳐㳑㳒㳓㳔㳕㳖㳗㳘㳙㳚㳛㳜㳝㳞㳟
    3CE0 㳠㳡㳢㳣㳤㳥㳦㳧㳨㳩㳪㳫㳬㳭㳮㳯㳰㳱㳲㳳㳴㳵㳶㳷㳸㳹㳺㳻㳼㳽㳾㳿
    3D00 㴀㴁㴂㴃㴄㴅㴆㴇㴈㴉㴊㴋㴌㴍㴎㴏㴐㴑㴒㴓㴔㴕㴖㴗㴘㴙㴚㴛㴜㴝㴞㴟
    3D20 㴠㴡㴢㴣㴤㴥㴦㴧㴨㴩㴪㴫㴬㴭㴮㴯㴰㴱㴲㴳㴴㴵㴶㴷㴸㴹㴺㴻㴼㴽㴾㴿
    3D40 㵀㵁㵂㵃㵄㵅㵆㵇㵈㵉㵊㵋㵌㵍㵎㵏㵐㵑㵒㵓㵔㵕㵖㵗㵘㵙㵚㵛㵜㵝㵞㵟
    3D60 㵠㵡㵢㵣㵤㵥㵦㵧㵨㵩㵪㵫㵬㵭㵮㵯㵰㵱㵲㵳㵴㵵㵶㵷㵸㵹㵺㵻㵼㵽㵾㵿
    3D80 㶀㶁㶂㶃㶄㶅㶆㶇㶈㶉㶊㶋㶌㶍㶎㶏㶐㶑㶒㶓㶔㶕㶖㶗㶘㶙㶚㶛㶜㶝㶞㶟
    3DA0 㶠㶡㶢㶣㶤㶥㶦㶧㶨㶩㶪㶫㶬㶭㶮㶯㶰㶱㶲㶳㶴㶵㶶㶷㶸㶹㶺㶻㶼㶽㶾㶿
    3DC0 㷀㷁㷂㷃㷄㷅㷆㷇㷈㷉㷊㷋㷌㷍㷎㷏㷐㷑㷒㷓㷔㷕㷖㷗㷘㷙㷚㷛㷜㷝㷞㷟
    3DE0 㷠㷡㷢㷣㷤㷥㷦㷧㷨㷩㷪㷫㷬㷭㷮㷯㷰㷱㷲㷳㷴㷵㷶㷷㷸㷹㷺㷻㷼㷽㷾㷿
    3E00 㸀㸁㸂㸃㸄㸅㸆㸇㸈㸉㸊㸋㸌㸍㸎㸏㸐㸑㸒㸓㸔㸕㸖㸗㸘㸙㸚㸛㸜㸝㸞㸟
    3E20 㸠㸡㸢㸣㸤㸥㸦㸧㸨㸩㸪㸫㸬㸭㸮㸯㸰㸱㸲㸳㸴㸵㸶㸷㸸㸹㸺㸻㸼㸽㸾㸿
    3E40 㹀㹁㹂㹃㹄㹅㹆㹇㹈㹉㹊㹋㹌㹍㹎㹏㹐㹑㹒㹓㹔㹕㹖㹗㹘㹙㹚㹛㹜㹝㹞㹟
    3E60 㹠㹡㹢㹣㹤㹥㹦㹧㹨㹩㹪㹫㹬㹭㹮㹯㹰㹱㹲㹳㹴㹵㹶㹷㹸㹹㹺㹻㹼㹽㹾㹿
    3E80 㺀㺁㺂㺃㺄㺅㺆㺇㺈㺉㺊㺋㺌㺍㺎㺏㺐㺑㺒㺓㺔㺕㺖㺗㺘㺙㺚㺛㺜㺝㺞㺟
    3EA0 㺠㺡㺢㺣㺤㺥㺦㺧㺨㺩㺪㺫㺬㺭㺮㺯㺰㺱㺲㺳㺴㺵㺶㺷㺸㺹㺺㺻㺼㺽㺾㺿
    3EC0 㻀㻁㻂㻃㻄㻅㻆㻇㻈㻉㻊㻋㻌㻍㻎㻏㻐㻑㻒㻓㻔㻕㻖㻗㻘㻙㻚㻛㻜㻝㻞㻟
    3EE0 㻠㻡㻢㻣㻤㻥㻦㻧㻨㻩㻪㻫㻬㻭㻮㻯㻰㻱㻲㻳㻴㻵㻶㻷㻸㻹㻺㻻㻼㻽㻾㻿
    3F00 㼀㼁㼂㼃㼄㼅㼆㼇㼈㼉㼊㼋㼌㼍㼎㼏㼐㼑㼒㼓㼔㼕㼖㼗㼘㼙㼚㼛㼜㼝㼞㼟
    3F20 㼠㼡㼢㼣㼤㼥㼦㼧㼨㼩㼪㼫㼬㼭㼮㼯㼰㼱㼲㼳㼴㼵㼶㼷㼸㼹㼺㼻㼼㼽㼾㼿
    3F40 㽀㽁㽂㽃㽄㽅㽆㽇㽈㽉㽊㽋㽌㽍㽎㽏㽐㽑㽒㽓㽔㽕㽖㽗㽘㽙㽚㽛㽜㽝㽞㽟
    3F60 㽠㽡㽢㽣㽤㽥㽦㽧㽨㽩㽪㽫㽬㽭㽮㽯㽰㽱㽲㽳㽴㽵㽶㽷㽸㽹㽺㽻㽼㽽㽾㽿
    3F80 㾀㾁㾂㾃㾄㾅㾆㾇㾈㾉㾊㾋㾌㾍㾎㾏㾐㾑㾒㾓㾔㾕㾖㾗㾘㾙㾚㾛㾜㾝㾞㾟
    3FA0 㾠㾡㾢㾣㾤㾥㾦㾧㾨㾩㾪㾫㾬㾭㾮㾯㾰㾱㾲㾳㾴㾵㾶㾷㾸㾹㾺㾻㾼㾽㾾㾿
    3FC0 㿀㿁㿂㿃㿄㿅㿆㿇㿈㿉㿊㿋㿌㿍㿎㿏㿐㿑㿒㿓㿔㿕㿖㿗㿘㿙㿚㿛㿜㿝㿞㿟
    3FE0 㿠㿡㿢㿣㿤㿥㿦㿧㿨㿩㿪㿫㿬㿭㿮㿯㿰㿱㿲㿳㿴㿵㿶㿷㿸㿹㿺㿻㿼㿽㿾㿿
    4000 䀀䀁䀂䀃䀄䀅䀆䀇䀈䀉䀊䀋䀌䀍䀎䀏䀐䀑䀒䀓䀔䀕䀖䀗䀘䀙䀚䀛䀜䀝䀞䀟
    4020 䀠䀡䀢䀣䀤䀥䀦䀧䀨䀩䀪䀫䀬䀭䀮䀯䀰䀱䀲䀳䀴䀵䀶䀷䀸䀹䀺䀻䀼䀽䀾䀿
    4040 䁀䁁䁂䁃䁄䁅䁆䁇䁈䁉䁊䁋䁌䁍䁎䁏䁐䁑䁒䁓䁔䁕䁖䁗䁘䁙䁚䁛䁜䁝䁞䁟
    4060 䁠䁡䁢䁣䁤䁥䁦䁧䁨䁩䁪䁫䁬䁭䁮䁯䁰䁱䁲䁳䁴䁵䁶䁷䁸䁹䁺䁻䁼䁽䁾䁿
    4080 䂀䂁䂂䂃䂄䂅䂆䂇䂈䂉䂊䂋䂌䂍䂎䂏䂐䂑䂒䂓䂔䂕䂖䂗䂘䂙䂚䂛䂜䂝䂞䂟
    40A0 䂠䂡䂢䂣䂤䂥䂦䂧䂨䂩䂪䂫䂬䂭䂮䂯䂰䂱䂲䂳䂴䂵䂶䂷䂸䂹䂺䂻䂼䂽䂾䂿
    40C0 䃀䃁䃂䃃䃄䃅䃆䃇䃈䃉䃊䃋䃌䃍䃎䃏䃐䃑䃒䃓䃔䃕䃖䃗䃘䃙䃚䃛䃜䃝䃞䃟
    40E0 䃠䃡䃢䃣䃤䃥䃦䃧䃨䃩䃪䃫䃬䃭䃮䃯䃰䃱䃲䃳䃴䃵䃶䃷䃸䃹䃺䃻䃼䃽䃾䃿
    4100 䄀䄁䄂䄃䄄䄅䄆䄇䄈䄉䄊䄋䄌䄍䄎䄏䄐䄑䄒䄓䄔䄕䄖䄗䄘䄙䄚䄛䄜䄝䄞䄟
    4120 䄠䄡䄢䄣䄤䄥䄦䄧䄨䄩䄪䄫䄬䄭䄮䄯䄰䄱䄲䄳䄴䄵䄶䄷䄸䄹䄺䄻䄼䄽䄾䄿
    4140 䅀䅁䅂䅃䅄䅅䅆䅇䅈䅉䅊䅋䅌䅍䅎䅏䅐䅑䅒䅓䅔䅕䅖䅗䅘䅙䅚䅛䅜䅝䅞䅟
    4160 䅠䅡䅢䅣䅤䅥䅦䅧䅨䅩䅪䅫䅬䅭䅮䅯䅰䅱䅲䅳䅴䅵䅶䅷䅸䅹䅺䅻䅼䅽䅾䅿
    4180 䆀䆁䆂䆃䆄䆅䆆䆇䆈䆉䆊䆋䆌䆍䆎䆏䆐䆑䆒䆓䆔䆕䆖䆗䆘䆙䆚䆛䆜䆝䆞䆟
    41A0 䆠䆡䆢䆣䆤䆥䆦䆧䆨䆩䆪䆫䆬䆭䆮䆯䆰䆱䆲䆳䆴䆵䆶䆷䆸䆹䆺䆻䆼䆽䆾䆿
    41C0 䇀䇁䇂䇃䇄䇅䇆䇇䇈䇉䇊䇋䇌䇍䇎䇏䇐䇑䇒䇓䇔䇕䇖䇗䇘䇙䇚䇛䇜䇝䇞䇟
    41E0 䇠䇡䇢䇣䇤䇥䇦䇧䇨䇩䇪䇫䇬䇭䇮䇯䇰䇱䇲䇳䇴䇵䇶䇷䇸䇹䇺䇻䇼䇽䇾䇿
    4200 䈀䈁䈂䈃䈄䈅䈆䈇䈈䈉䈊䈋䈌䈍䈎䈏䈐䈑䈒䈓䈔䈕䈖䈗䈘䈙䈚䈛䈜䈝䈞䈟
    4220 䈠䈡䈢䈣䈤䈥䈦䈧䈨䈩䈪䈫䈬䈭䈮䈯䈰䈱䈲䈳䈴䈵䈶䈷䈸䈹䈺䈻䈼䈽䈾䈿
    4240 䉀䉁䉂䉃䉄䉅䉆䉇䉈䉉䉊䉋䉌䉍䉎䉏䉐䉑䉒䉓䉔䉕䉖䉗䉘䉙䉚䉛䉜䉝䉞䉟
    4260 䉠䉡䉢䉣䉤䉥䉦䉧䉨䉩䉪䉫䉬䉭䉮䉯䉰䉱䉲䉳䉴䉵䉶䉷䉸䉹䉺䉻䉼䉽䉾䉿
    4280 䊀䊁䊂䊃䊄䊅䊆䊇䊈䊉䊊䊋䊌䊍䊎䊏䊐䊑䊒䊓䊔䊕䊖䊗䊘䊙䊚䊛䊜䊝䊞䊟
    42A0 䊠䊡䊢䊣䊤䊥䊦䊧䊨䊩䊪䊫䊬䊭䊮䊯䊰䊱䊲䊳䊴䊵䊶䊷䊸䊹䊺䊻䊼䊽䊾䊿
    42C0 䋀䋁䋂䋃䋄䋅䋆䋇䋈䋉䋊䋋䋌䋍䋎䋏䋐䋑䋒䋓䋔䋕䋖䋗䋘䋙䋚䋛䋜䋝䋞䋟
    42E0 䋠䋡䋢䋣䋤䋥䋦䋧䋨䋩䋪䋫䋬䋭䋮䋯䋰䋱䋲䋳䋴䋵䋶䋷䋸䋹䋺䋻䋼䋽䋾䋿
    4300 䌀䌁䌂䌃䌄䌅䌆䌇䌈䌉䌊䌋䌌䌍䌎䌏䌐䌑䌒䌓䌔䌕䌖䌗䌘䌙䌚䌛䌜䌝䌞䌟
    4320 䌠䌡䌢䌣䌤䌥䌦䌧䌨䌩䌪䌫䌬䌭䌮䌯䌰䌱䌲䌳䌴䌵䌶䌷䌸䌹䌺䌻䌼䌽䌾䌿
    4340 䍀䍁䍂䍃䍄䍅䍆䍇䍈䍉䍊䍋䍌䍍䍎䍏䍐䍑䍒䍓䍔䍕䍖䍗䍘䍙䍚䍛䍜䍝䍞䍟
    4360 䍠䍡䍢䍣䍤䍥䍦䍧䍨䍩䍪䍫䍬䍭䍮䍯䍰䍱䍲䍳䍴䍵䍶䍷䍸䍹䍺䍻䍼䍽䍾䍿
    4380 䎀䎁䎂䎃䎄䎅䎆䎇䎈䎉䎊䎋䎌䎍䎎䎏䎐䎑䎒䎓䎔䎕䎖䎗䎘䎙䎚䎛䎜䎝䎞䎟
    43A0 䎠䎡䎢䎣䎤䎥䎦䎧䎨䎩䎪䎫䎬䎭䎮䎯䎰䎱䎲䎳䎴䎵䎶䎷䎸䎹䎺䎻䎼䎽䎾䎿
    43C0 䏀䏁䏂䏃䏄䏅䏆䏇䏈䏉䏊䏋䏌䏍䏎䏏䏐䏑䏒䏓䏔䏕䏖䏗䏘䏙䏚䏛䏜䏝䏞䏟
    43E0 䏠䏡䏢䏣䏤䏥䏦䏧䏨䏩䏪䏫䏬䏭䏮䏯䏰䏱䏲䏳䏴䏵䏶䏷䏸䏹䏺䏻䏼䏽䏾䏿
    4400 䐀䐁䐂䐃䐄䐅䐆䐇䐈䐉䐊䐋䐌䐍䐎䐏䐐䐑䐒䐓䐔䐕䐖䐗䐘䐙䐚䐛䐜䐝䐞䐟
    4420 䐠䐡䐢䐣䐤䐥䐦䐧䐨䐩䐪䐫䐬䐭䐮䐯䐰䐱䐲䐳䐴䐵䐶䐷䐸䐹䐺䐻䐼䐽䐾䐿
    4440 䑀䑁䑂䑃䑄䑅䑆䑇䑈䑉䑊䑋䑌䑍䑎䑏䑐䑑䑒䑓䑔䑕䑖䑗䑘䑙䑚䑛䑜䑝䑞䑟
    4460 䑠䑡䑢䑣䑤䑥䑦䑧䑨䑩䑪䑫䑬䑭䑮䑯䑰䑱䑲䑳䑴䑵䑶䑷䑸䑹䑺䑻䑼䑽䑾䑿
    4480 䒀䒁䒂䒃䒄䒅䒆䒇䒈䒉䒊䒋䒌䒍䒎䒏䒐䒑䒒䒓䒔䒕䒖䒗䒘䒙䒚䒛䒜䒝䒞䒟
    44A0 䒠䒡䒢䒣䒤䒥䒦䒧䒨䒩䒪䒫䒬䒭䒮䒯䒰䒱䒲䒳䒴䒵䒶䒷䒸䒹䒺䒻䒼䒽䒾䒿
    44C0 䓀䓁䓂䓃䓄䓅䓆䓇䓈䓉䓊䓋䓌䓍䓎䓏䓐䓑䓒䓓䓔䓕䓖䓗䓘䓙䓚䓛䓜䓝䓞䓟
    44E0 䓠䓡䓢䓣䓤䓥䓦䓧䓨䓩䓪䓫䓬䓭䓮䓯䓰䓱䓲䓳䓴䓵䓶䓷䓸䓹䓺䓻䓼䓽䓾䓿
    4500 䔀䔁䔂䔃䔄䔅䔆䔇䔈䔉䔊䔋䔌䔍䔎䔏䔐䔑䔒䔓䔔䔕䔖䔗䔘䔙䔚䔛䔜䔝䔞䔟
    4520 䔠䔡䔢䔣䔤䔥䔦䔧䔨䔩䔪䔫䔬䔭䔮䔯䔰䔱䔲䔳䔴䔵䔶䔷䔸䔹䔺䔻䔼䔽䔾䔿
    4540 䕀䕁䕂䕃䕄䕅䕆䕇䕈䕉䕊䕋䕌䕍䕎䕏䕐䕑䕒䕓䕔䕕䕖䕗䕘䕙䕚䕛䕜䕝䕞䕟
    4560 䕠䕡䕢䕣䕤䕥䕦䕧䕨䕩䕪䕫䕬䕭䕮䕯䕰䕱䕲䕳䕴䕵䕶䕷䕸䕹䕺䕻䕼䕽䕾䕿
    4580 䖀䖁䖂䖃䖄䖅䖆䖇䖈䖉䖊䖋䖌䖍䖎䖏䖐䖑䖒䖓䖔䖕䖖䖗䖘䖙䖚䖛䖜䖝䖞䖟
    45A0 䖠䖡䖢䖣䖤䖥䖦䖧䖨䖩䖪䖫䖬䖭䖮䖯䖰䖱䖲䖳䖴䖵䖶䖷䖸䖹䖺䖻䖼䖽䖾䖿
    45C0 䗀䗁䗂䗃䗄䗅䗆䗇䗈䗉䗊䗋䗌䗍䗎䗏䗐䗑䗒䗓䗔䗕䗖䗗䗘䗙䗚䗛䗜䗝䗞䗟
    45E0 䗠䗡䗢䗣䗤䗥䗦䗧䗨䗩䗪䗫䗬䗭䗮䗯䗰䗱䗲䗳䗴䗵䗶䗷䗸䗹䗺䗻䗼䗽䗾䗿
    4600 䘀䘁䘂䘃䘄䘅䘆䘇䘈䘉䘊䘋䘌䘍䘎䘏䘐䘑䘒䘓䘔䘕䘖䘗䘘䘙䘚䘛䘜䘝䘞䘟
    4620 䘠䘡䘢䘣䘤䘥䘦䘧䘨䘩䘪䘫䘬䘭䘮䘯䘰䘱䘲䘳䘴䘵䘶䘷䘸䘹䘺䘻䘼䘽䘾䘿
    4640 䙀䙁䙂䙃䙄䙅䙆䙇䙈䙉䙊䙋䙌䙍䙎䙏䙐䙑䙒䙓䙔䙕䙖䙗䙘䙙䙚䙛䙜䙝䙞䙟
    4660 䙠䙡䙢䙣䙤䙥䙦䙧䙨䙩䙪䙫䙬䙭䙮䙯䙰䙱䙲䙳䙴䙵䙶䙷䙸䙹䙺䙻䙼䙽䙾䙿
    4680 䚀䚁䚂䚃䚄䚅䚆䚇䚈䚉䚊䚋䚌䚍䚎䚏䚐䚑䚒䚓䚔䚕䚖䚗䚘䚙䚚䚛䚜䚝䚞䚟
    46A0 䚠䚡䚢䚣䚤䚥䚦䚧䚨䚩䚪䚫䚬䚭䚮䚯䚰䚱䚲䚳䚴䚵䚶䚷䚸䚹䚺䚻䚼䚽䚾䚿
    46C0 䛀䛁䛂䛃䛄䛅䛆䛇䛈䛉䛊䛋䛌䛍䛎䛏䛐䛑䛒䛓䛔䛕䛖䛗䛘䛙䛚䛛䛜䛝䛞䛟
    46E0 䛠䛡䛢䛣䛤䛥䛦䛧䛨䛩䛪䛫䛬䛭䛮䛯䛰䛱䛲䛳䛴䛵䛶䛷䛸䛹䛺䛻䛼䛽䛾䛿
    4700 䜀䜁䜂䜃䜄䜅䜆䜇䜈䜉䜊䜋䜌䜍䜎䜏䜐䜑䜒䜓䜔䜕䜖䜗䜘䜙䜚䜛䜜䜝䜞䜟
    4720 䜠䜡䜢䜣䜤䜥䜦䜧䜨䜩䜪䜫䜬䜭䜮䜯䜰䜱䜲䜳䜴䜵䜶䜷䜸䜹䜺䜻䜼䜽䜾䜿
    4740 䝀䝁䝂䝃䝄䝅䝆䝇䝈䝉䝊䝋䝌䝍䝎䝏䝐䝑䝒䝓䝔䝕䝖䝗䝘䝙䝚䝛䝜䝝䝞䝟
    4760 䝠䝡䝢䝣䝤䝥䝦䝧䝨䝩䝪䝫䝬䝭䝮䝯䝰䝱䝲䝳䝴䝵䝶䝷䝸䝹䝺䝻䝼䝽䝾䝿
    4780 䞀䞁䞂䞃䞄䞅䞆䞇䞈䞉䞊䞋䞌䞍䞎䞏䞐䞑䞒䞓䞔䞕䞖䞗䞘䞙䞚䞛䞜䞝䞞䞟
    47A0 䞠䞡䞢䞣䞤䞥䞦䞧䞨䞩䞪䞫䞬䞭䞮䞯䞰䞱䞲䞳䞴䞵䞶䞷䞸䞹䞺䞻䞼䞽䞾䞿
    47C0 䟀䟁䟂䟃䟄䟅䟆䟇䟈䟉䟊䟋䟌䟍䟎䟏䟐䟑䟒䟓䟔䟕䟖䟗䟘䟙䟚䟛䟜䟝䟞䟟
    47E0 䟠䟡䟢䟣䟤䟥䟦䟧䟨䟩䟪䟫䟬䟭䟮䟯䟰䟱䟲䟳䟴䟵䟶䟷䟸䟹䟺䟻䟼䟽䟾䟿
    4800 䠀䠁䠂䠃䠄䠅䠆䠇䠈䠉䠊䠋䠌䠍䠎䠏䠐䠑䠒䠓䠔䠕䠖䠗䠘䠙䠚䠛䠜䠝䠞䠟
    4820 䠠䠡䠢䠣䠤䠥䠦䠧䠨䠩䠪䠫䠬䠭䠮䠯䠰䠱䠲䠳䠴䠵䠶䠷䠸䠹䠺䠻䠼䠽䠾䠿
    4840 䡀䡁䡂䡃䡄䡅䡆䡇䡈䡉䡊䡋䡌䡍䡎䡏䡐䡑䡒䡓䡔䡕䡖䡗䡘䡙䡚䡛䡜䡝䡞䡟
    4860 䡠䡡䡢䡣䡤䡥䡦䡧䡨䡩䡪䡫䡬䡭䡮䡯䡰䡱䡲䡳䡴䡵䡶䡷䡸䡹䡺䡻䡼䡽䡾䡿
    4880 䢀䢁䢂䢃䢄䢅䢆䢇䢈䢉䢊䢋䢌䢍䢎䢏䢐䢑䢒䢓䢔䢕䢖䢗䢘䢙䢚䢛䢜䢝䢞䢟
    48A0 䢠䢡䢢䢣䢤䢥䢦䢧䢨䢩䢪䢫䢬䢭䢮䢯䢰䢱䢲䢳䢴䢵䢶䢷䢸䢹䢺䢻䢼䢽䢾䢿
    48C0 䣀䣁䣂䣃䣄䣅䣆䣇䣈䣉䣊䣋䣌䣍䣎䣏䣐䣑䣒䣓䣔䣕䣖䣗䣘䣙䣚䣛䣜䣝䣞䣟
    48E0 䣠䣡䣢䣣䣤䣥䣦䣧䣨䣩䣪䣫䣬䣭䣮䣯䣰䣱䣲䣳䣴䣵䣶䣷䣸䣹䣺䣻䣼䣽䣾䣿
    4900 䤀䤁䤂䤃䤄䤅䤆䤇䤈䤉䤊䤋䤌䤍䤎䤏䤐䤑䤒䤓䤔䤕䤖䤗䤘䤙䤚䤛䤜䤝䤞䤟
    4920 䤠䤡䤢䤣䤤䤥䤦䤧䤨䤩䤪䤫䤬䤭䤮䤯䤰䤱䤲䤳䤴䤵䤶䤷䤸䤹䤺䤻䤼䤽䤾䤿
    4940 䥀䥁䥂䥃䥄䥅䥆䥇䥈䥉䥊䥋䥌䥍䥎䥏䥐䥑䥒䥓䥔䥕䥖䥗䥘䥙䥚䥛䥜䥝䥞䥟
    4960 䥠䥡䥢䥣䥤䥥䥦䥧䥨䥩䥪䥫䥬䥭䥮䥯䥰䥱䥲䥳䥴䥵䥶䥷䥸䥹䥺䥻䥼䥽䥾䥿
    4980 䦀䦁䦂䦃䦄䦅䦆䦇䦈䦉䦊䦋䦌䦍䦎䦏䦐䦑䦒䦓䦔䦕䦖䦗䦘䦙䦚䦛䦜䦝䦞䦟
    49A0 䦠䦡䦢䦣䦤䦥䦦䦧䦨䦩䦪䦫䦬䦭䦮䦯䦰䦱䦲䦳䦴䦵䦶䦷䦸䦹䦺䦻䦼䦽䦾䦿
    49C0 䧀䧁䧂䧃䧄䧅䧆䧇䧈䧉䧊䧋䧌䧍䧎䧏䧐䧑䧒䧓䧔䧕䧖䧗䧘䧙䧚䧛䧜䧝䧞䧟
    49E0 䧠䧡䧢䧣䧤䧥䧦䧧䧨䧩䧪䧫䧬䧭䧮䧯䧰䧱䧲䧳䧴䧵䧶䧷䧸䧹䧺䧻䧼䧽䧾䧿
    4A00 䨀䨁䨂䨃䨄䨅䨆䨇䨈䨉䨊䨋䨌䨍䨎䨏䨐䨑䨒䨓䨔䨕䨖䨗䨘䨙䨚䨛䨜䨝䨞䨟
    4A20 䨠䨡䨢䨣䨤䨥䨦䨧䨨䨩䨪䨫䨬䨭䨮䨯䨰䨱䨲䨳䨴䨵䨶䨷䨸䨹䨺䨻䨼䨽䨾䨿
    4A40 䩀䩁䩂䩃䩄䩅䩆䩇䩈䩉䩊䩋䩌䩍䩎䩏䩐䩑䩒䩓䩔䩕䩖䩗䩘䩙䩚䩛䩜䩝䩞䩟
    4A60 䩠䩡䩢䩣䩤䩥䩦䩧䩨䩩䩪䩫䩬䩭䩮䩯䩰䩱䩲䩳䩴䩵䩶䩷䩸䩹䩺䩻䩼䩽䩾䩿
    4A80 䪀䪁䪂䪃䪄䪅䪆䪇䪈䪉䪊䪋䪌䪍䪎䪏䪐䪑䪒䪓䪔䪕䪖䪗䪘䪙䪚䪛䪜䪝䪞䪟
    4AA0 䪠䪡䪢䪣䪤䪥䪦䪧䪨䪩䪪䪫䪬䪭䪮䪯䪰䪱䪲䪳䪴䪵䪶䪷䪸䪹䪺䪻䪼䪽䪾䪿
    4AC0 䫀䫁䫂䫃䫄䫅䫆䫇䫈䫉䫊䫋䫌䫍䫎䫏䫐䫑䫒䫓䫔䫕䫖䫗䫘䫙䫚䫛䫜䫝䫞䫟
    4AE0 䫠䫡䫢䫣䫤䫥䫦䫧䫨䫩䫪䫫䫬䫭䫮䫯䫰䫱䫲䫳䫴䫵䫶䫷䫸䫹䫺䫻䫼䫽䫾䫿
    4B00 䬀䬁䬂䬃䬄䬅䬆䬇䬈䬉䬊䬋䬌䬍䬎䬏䬐䬑䬒䬓䬔䬕䬖䬗䬘䬙䬚䬛䬜䬝䬞䬟
    4B20 䬠䬡䬢䬣䬤䬥䬦䬧䬨䬩䬪䬫䬬䬭䬮䬯䬰䬱䬲䬳䬴䬵䬶䬷䬸䬹䬺䬻䬼䬽䬾䬿
    4B40 䭀䭁䭂䭃䭄䭅䭆䭇䭈䭉䭊䭋䭌䭍䭎䭏䭐䭑䭒䭓䭔䭕䭖䭗䭘䭙䭚䭛䭜䭝䭞䭟
    4B60 䭠䭡䭢䭣䭤䭥䭦䭧䭨䭩䭪䭫䭬䭭䭮䭯䭰䭱䭲䭳䭴䭵䭶䭷䭸䭹䭺䭻䭼䭽䭾䭿
    4B80 䮀䮁䮂䮃䮄䮅䮆䮇䮈䮉䮊䮋䮌䮍䮎䮏䮐䮑䮒䮓䮔䮕䮖䮗䮘䮙䮚䮛䮜䮝䮞䮟
    4BA0 䮠䮡䮢䮣䮤䮥䮦䮧䮨䮩䮪䮫䮬䮭䮮䮯䮰䮱䮲䮳䮴䮵䮶䮷䮸䮹䮺䮻䮼䮽䮾䮿
    4BC0 䯀䯁䯂䯃䯄䯅䯆䯇䯈䯉䯊䯋䯌䯍䯎䯏䯐䯑䯒䯓䯔䯕䯖䯗䯘䯙䯚䯛䯜䯝䯞䯟
    4BE0 䯠䯡䯢䯣䯤䯥䯦䯧䯨䯩䯪䯫䯬䯭䯮䯯䯰䯱䯲䯳䯴䯵䯶䯷䯸䯹䯺䯻䯼䯽䯾䯿
    4C00 䰀䰁䰂䰃䰄䰅䰆䰇䰈䰉䰊䰋䰌䰍䰎䰏䰐䰑䰒䰓䰔䰕䰖䰗䰘䰙䰚䰛䰜䰝䰞䰟
    4C20 䰠䰡䰢䰣䰤䰥䰦䰧䰨䰩䰪䰫䰬䰭䰮䰯䰰䰱䰲䰳䰴䰵䰶䰷䰸䰹䰺䰻䰼䰽䰾䰿
    4C40 䱀䱁䱂䱃䱄䱅䱆䱇䱈䱉䱊䱋䱌䱍䱎䱏䱐䱑䱒䱓䱔䱕䱖䱗䱘䱙䱚䱛䱜䱝䱞䱟
    4C60 䱠䱡䱢䱣䱤䱥䱦䱧䱨䱩䱪䱫䱬䱭䱮䱯䱰䱱䱲䱳䱴䱵䱶䱷䱸䱹䱺䱻䱼䱽䱾䱿
    4C80 䲀䲁䲂䲃䲄䲅䲆䲇䲈䲉䲊䲋䲌䲍䲎䲏䲐䲑䲒䲓䲔䲕䲖䲗䲘䲙䲚䲛䲜䲝䲞䲟
    4CA0 䲠䲡䲢䲣䲤䲥䲦䲧䲨䲩䲪䲫䲬䲭䲮䲯䲰䲱䲲䲳䲴䲵䲶䲷䲸䲹䲺䲻䲼䲽䲾䲿
    4CC0 䳀䳁䳂䳃䳄䳅䳆䳇䳈䳉䳊䳋䳌䳍䳎䳏䳐䳑䳒䳓䳔䳕䳖䳗䳘䳙䳚䳛䳜䳝䳞䳟
    4CE0 䳠䳡䳢䳣䳤䳥䳦䳧䳨䳩䳪䳫䳬䳭䳮䳯䳰䳱䳲䳳䳴䳵䳶䳷䳸䳹䳺䳻䳼䳽䳾䳿
    4D00 䴀䴁䴂䴃䴄䴅䴆䴇䴈䴉䴊䴋䴌䴍䴎䴏䴐䴑䴒䴓䴔䴕䴖䴗䴘䴙䴚䴛䴜䴝䴞䴟
    4D20 䴠䴡䴢䴣䴤䴥䴦䴧䴨䴩䴪䴫䴬䴭䴮䴯䴰䴱䴲䴳䴴䴵䴶䴷䴸䴹䴺䴻䴼䴽䴾䴿
    4D40 䵀䵁䵂䵃䵄䵅䵆䵇䵈䵉䵊䵋䵌䵍䵎䵏䵐䵑䵒䵓䵔䵕䵖䵗䵘䵙䵚䵛䵜䵝䵞䵟
    4D60 䵠䵡䵢䵣䵤䵥䵦䵧䵨䵩䵪䵫䵬䵭䵮䵯䵰䵱䵲䵳䵴䵵䵶䵷䵸䵹䵺䵻䵼䵽䵾䵿
    4D80 䶀䶁䶂䶃䶄䶅䶆䶇䶈䶉䶊䶋䶌䶍䶎䶏䶐䶑䶒䶓䶔䶕䶖䶗䶘䶙䶚䶛䶜䶝䶞䶟
    4DA0 䶠䶡䶢䶣䶤䶥䶦䶧䶨䶩䶪䶫䶬䶭䶮䶯䶰䶱䶲䶳䶴䶵䶶䶷䶸䶹䶺䶻䶼䶽䶾䶿
    4DC0 ䷀䷁䷂䷃䷄䷅䷆䷇䷈䷉䷊䷋䷌䷍䷎䷏䷐䷑䷒䷓䷔䷕䷖䷗䷘䷙䷚䷛䷜䷝䷞䷟
    4DE0 ䷠䷡䷢䷣䷤䷥䷦䷧䷨䷩䷪䷫䷬䷭䷮䷯䷰䷱䷲䷳䷴䷵䷶䷷䷸䷹䷺䷻䷼䷽䷾䷿
    4E00 一丁丂七丄丅丆万丈三上下丌不与丏丐丑丒专且丕世丗丘丙业丛东丝丞丟
    4E20 丠両丢丣两严並丧丨丩个丫丬中丮丯丰丱串丳临丵丶丷丸丹为主丼丽举丿
    4E40 乀乁乂乃乄久乆乇么义乊之乌乍乎乏乐乑乒乓乔乕乖乗乘乙乚乛乜九乞也
    4E60 习乡乢乣乤乥书乧乨乩乪乫乬乭乮乯买乱乲乳乴乵乶乷乸乹乺乻乼乽乾乿
    4E80 亀亁亂亃亄亅了亇予争亊事二亍于亏亐云互亓五井亖亗亘亙亚些亜亝亞亟
    4EA0 亠亡亢亣交亥亦产亨亩亪享京亭亮亯亰亱亲亳亴亵亶亷亸亹人亻亼亽亾亿
    4EC0 什仁仂仃仄仅仆仇仈仉今介仌仍从仏仐仑仒仓仔仕他仗付仙仚仛仜仝仞仟
    4EE0 仠仡仢代令以仦仧仨仩仪仫们仭仮仯仰仱仲仳仴仵件价仸仹仺任仼份仾仿
    4F00 伀企伂伃伄伅伆伇伈伉伊伋伌伍伎伏伐休伒伓伔伕伖众优伙会伛伜伝伞伟
    4F20 传伡伢伣伤伥伦伧伨伩伪伫伬伭伮伯估伱伲伳伴伵伶伷伸伹伺伻似伽伾伿
    4F40 佀佁佂佃佄佅但佇佈佉佊佋佌位低住佐佑佒体佔何佖佗佘余佚佛作佝佞佟
    4F60 你佡佢佣佤佥佦佧佨佩佪佫佬佭佮佯佰佱佲佳佴併佶佷佸佹佺佻佼佽佾使
    4F80 侀侁侂侃侄侅來侇侈侉侊例侌侍侎侏侐侑侒侓侔侕侖侗侘侙侚供侜依侞侟
    4FA0 侠価侢侣侤侥侦侧侨侩侪侫侬侭侮侯侰侱侲侳侴侵侶侷侸侹侺侻侼侽侾便
    4FC0 俀俁係促俄俅俆俇俈俉俊俋俌俍俎俏俐俑俒俓俔俕俖俗俘俙俚俛俜保俞俟
    4FE0 俠信俢俣俤俥俦俧俨俩俪俫俬俭修俯俰俱俲俳俴俵俶俷俸俹俺俻俼俽俾俿
    5000 倀倁倂倃倄倅倆倇倈倉倊個倌倍倎倏倐們倒倓倔倕倖倗倘候倚倛倜倝倞借
    5020 倠倡倢倣値倥倦倧倨倩倪倫倬倭倮倯倰倱倲倳倴倵倶倷倸倹债倻值倽倾倿
    5040 偀偁偂偃偄偅偆假偈偉偊偋偌偍偎偏偐偑偒偓偔偕偖偗偘偙做偛停偝偞偟
    5060 偠偡偢偣偤健偦偧偨偩偪偫偬偭偮偯偰偱偲偳側偵偶偷偸偹偺偻偼偽偾偿
    5080 傀傁傂傃傄傅傆傇傈傉傊傋傌傍傎傏傐傑傒傓傔傕傖傗傘備傚傛傜傝傞傟
    50A0 傠傡傢傣傤傥傦傧储傩傪傫催傭傮傯傰傱傲傳傴債傶傷傸傹傺傻傼傽傾傿
    50C0 僀僁僂僃僄僅僆僇僈僉僊僋僌働僎像僐僑僒僓僔僕僖僗僘僙僚僛僜僝僞僟
    50E0 僠僡僢僣僤僥僦僧僨僩僪僫僬僭僮僯僰僱僲僳僴僵僶僷僸價僺僻僼僽僾僿
    5100 儀儁儂儃億儅儆儇儈儉儊儋儌儍儎儏儐儑儒儓儔儕儖儗儘儙儚儛儜儝儞償
    5120 儠儡儢儣儤儥儦儧儨儩優儫儬儭儮儯儰儱儲儳儴儵儶儷儸儹儺儻儼儽儾儿
    5140 兀允兂元兄充兆兇先光兊克兌免兎兏児兑兒兓兔兕兖兗兘兙党兛兜兝兞兟
    5160 兠兡兢兣兤入兦內全兩兪八公六兮兯兰共兲关兴兵其具典兹兺养兼兽兾兿
    5180 冀冁冂冃冄内円冇冈冉冊冋册再冎冏冐冑冒冓冔冕冖冗冘写冚军农冝冞冟
    51A0 冠冡冢冣冤冥冦冧冨冩冪冫冬冭冮冯冰冱冲决冴况冶冷冸冹冺冻冼冽冾冿
    51C0 净凁凂凃凄凅准凇凈凉凊凋凌凍凎减凐凑凒凓凔凕凖凗凘凙凚凛凜凝凞凟
    51E0 几凡凢凣凤凥処凧凨凩凪凫凬凭凮凯凰凱凲凳凴凵凶凷凸凹出击凼函凾凿
    5200 刀刁刂刃刄刅分切刈刉刊刋刌刍刎刏刐刑划刓刔刕刖列刘则刚创刜初刞刟
    5220 删刡刢刣判別刦刧刨利刪别刬刭刮刯到刱刲刳刴刵制刷券刹刺刻刼刽刾刿
    5240 剀剁剂剃剄剅剆則剈剉削剋剌前剎剏剐剑剒剓剔剕剖剗剘剙剚剛剜剝剞剟
    5260 剠剡剢剣剤剥剦剧剨剩剪剫剬剭剮副剰剱割剳剴創剶剷剸剹剺剻剼剽剾剿
    5280 劀劁劂劃劄劅劆劇劈劉劊劋劌劍劎劏劐劑劒劓劔劕劖劗劘劙劚力劜劝办功
    52A0 加务劢劣劤劥劦劧动助努劫劬劭劮劯劰励劲劳労劵劶劷劸効劺劻劼劽劾势
    52C0 勀勁勂勃勄勅勆勇勈勉勊勋勌勍勎勏勐勑勒勓勔動勖勗勘務勚勛勜勝勞募
    52E0 勠勡勢勣勤勥勦勧勨勩勪勫勬勭勮勯勰勱勲勳勴勵勶勷勸勹勺勻勼勽勾勿
    5300 匀匁匂匃匄包匆匇匈匉匊匋匌匍匎匏匐匑匒匓匔匕化北匘匙匚匛匜匝匞匟
    5320 匠匡匢匣匤匥匦匧匨匩匪匫匬匭匮匯匰匱匲匳匴匵匶匷匸匹区医匼匽匾匿
    5340 區十卂千卄卅卆升午卉半卋卌卍华协卐卑卒卓協单卖南単卙博卛卜卝卞卟
    5360 占卡卢卣卤卥卦卧卨卩卪卫卬卭卮卯印危卲即却卵卶卷卸卹卺卻卼卽卾卿
    5380 厀厁厂厃厄厅历厇厈厉厊压厌厍厎厏厐厑厒厓厔厕厖厗厘厙厚厛厜厝厞原
    53A0 厠厡厢厣厤厥厦厧厨厩厪厫厬厭厮厯厰厱厲厳厴厵厶厷厸厹厺去厼厽厾县
    53C0 叀叁参參叄叅叆叇又叉及友双反収叏叐发叒叓叔叕取受变叙叚叛叜叝叞叟
    53E0 叠叡叢口古句另叧叨叩只叫召叭叮可台叱史右叴叵叶号司叹叺叻叼叽叾叿
    5400 吀吁吂吃各吅吆吇合吉吊吋同名后吏吐向吒吓吔吕吖吗吘吙吚君吜吝吞吟
    5420 吠吡吢吣吤吥否吧吨吩吪含听吭吮启吰吱吲吳吴吵吶吷吸吹吺吻吼吽吾吿
    5440 呀呁呂呃呄呅呆呇呈呉告呋呌呍呎呏呐呑呒呓呔呕呖呗员呙呚呛呜呝呞呟
    5460 呠呡呢呣呤呥呦呧周呩呪呫呬呭呮呯呰呱呲味呴呵呶呷呸呹呺呻呼命呾呿
    5480 咀咁咂咃咄咅咆咇咈咉咊咋和咍咎咏咐咑咒咓咔咕咖咗咘咙咚咛咜咝咞咟
    54A0 咠咡咢咣咤咥咦咧咨咩咪咫咬咭咮咯咰咱咲咳咴咵咶咷咸咹咺咻咼咽咾咿
    54C0 哀品哂哃哄哅哆哇哈哉哊哋哌响哎哏哐哑哒哓哔哕哖哗哘哙哚哛哜哝哞哟
    54E0 哠員哢哣哤哥哦哧哨哩哪哫哬哭哮哯哰哱哲哳哴哵哶哷哸哹哺哻哼哽哾哿
    5500 唀唁唂唃唄唅唆唇唈唉唊唋唌唍唎唏唐唑唒唓唔唕唖唗唘唙唚唛唜唝唞唟
    5520 唠唡唢唣唤唥唦唧唨唩唪唫唬唭售唯唰唱唲唳唴唵唶唷唸唹唺唻唼唽唾唿
    5540 啀啁啂啃啄啅商啇啈啉啊啋啌啍啎問啐啑啒啓啔啕啖啗啘啙啚啛啜啝啞啟
    5560 啠啡啢啣啤啥啦啧啨啩啪啫啬啭啮啯啰啱啲啳啴啵啶啷啸啹啺啻啼啽啾啿
    5580 喀喁喂喃善喅喆喇喈喉喊喋喌喍喎喏喐喑喒喓喔喕喖喗喘喙喚喛喜喝喞喟
    55A0 喠喡喢喣喤喥喦喧喨喩喪喫喬喭單喯喰喱喲喳喴喵営喷喸喹喺喻喼喽喾喿
    55C0 嗀嗁嗂嗃嗄嗅嗆嗇嗈嗉嗊嗋嗌嗍嗎嗏嗐嗑嗒嗓嗔嗕嗖嗗嗘嗙嗚嗛嗜嗝嗞嗟
    55E0 嗠嗡嗢嗣嗤嗥嗦嗧嗨嗩嗪嗫嗬嗭嗮嗯嗰嗱嗲嗳嗴嗵嗶嗷嗸嗹嗺嗻嗼嗽嗾嗿
    5600 嘀嘁嘂嘃嘄嘅嘆嘇嘈嘉嘊嘋嘌嘍嘎嘏嘐嘑嘒嘓嘔嘕嘖嘗嘘嘙嘚嘛嘜嘝嘞嘟
    5620 嘠嘡嘢嘣嘤嘥嘦嘧嘨嘩嘪嘫嘬嘭嘮嘯嘰嘱嘲嘳嘴嘵嘶嘷嘸嘹嘺嘻嘼嘽嘾嘿
    5640 噀噁噂噃噄噅噆噇噈噉噊噋噌噍噎噏噐噑噒噓噔噕噖噗噘噙噚噛噜噝噞噟
    5660 噠噡噢噣噤噥噦噧器噩噪噫噬噭噮噯噰噱噲噳噴噵噶噷噸噹噺噻噼噽噾噿
    5680 嚀嚁嚂嚃嚄嚅嚆嚇嚈嚉嚊嚋嚌嚍嚎嚏嚐嚑嚒嚓嚔嚕嚖嚗嚘嚙嚚嚛嚜嚝嚞嚟
    56A0 嚠嚡嚢嚣嚤嚥嚦嚧嚨嚩嚪嚫嚬嚭嚮嚯嚰嚱嚲嚳嚴嚵嚶嚷嚸嚹嚺嚻嚼嚽嚾嚿
    56C0 囀囁囂囃囄囅囆囇囈囉囊囋囌囍囎囏囐囑囒囓囔囕囖囗囘囙囚四囜囝回囟
    56E0 因囡团団囤囥囦囧囨囩囪囫囬园囮囯困囱囲図围囵囶囷囸囹固囻囼国图囿
    5700 圀圁圂圃圄圅圆圇圈圉圊國圌圍圎圏圐圑園圓圔圕圖圗團圙圚圛圜圝圞土
    5720 圠圡圢圣圤圥圦圧在圩圪圫圬圭圮圯地圱圲圳圴圵圶圷圸圹场圻圼圽圾圿
    5740 址坁坂坃坄坅坆均坈坉坊坋坌坍坎坏坐坑坒坓坔坕坖块坘坙坚坛坜坝坞坟
    5760 坠坡坢坣坤坥坦坧坨坩坪坫坬坭坮坯坰坱坲坳坴坵坶坷坸坹坺坻坼坽坾坿
    5780 垀垁垂垃垄垅垆垇垈垉垊型垌垍垎垏垐垑垒垓垔垕垖垗垘垙垚垛垜垝垞垟
    57A0 垠垡垢垣垤垥垦垧垨垩垪垫垬垭垮垯垰垱垲垳垴垵垶垷垸垹垺垻垼垽垾垿
    57C0 埀埁埂埃埄埅埆埇埈埉埊埋埌埍城埏埐埑埒埓埔埕埖埗埘埙埚埛埜埝埞域
    57E0 埠埡埢埣埤埥埦埧埨埩埪埫埬埭埮埯埰埱埲埳埴埵埶執埸培基埻埼埽埾埿
    5800 堀堁堂堃堄堅堆堇堈堉堊堋堌堍堎堏堐堑堒堓堔堕堖堗堘堙堚堛堜堝堞堟
    5820 堠堡堢堣堤堥堦堧堨堩堪堫堬堭堮堯堰報堲堳場堵堶堷堸堹堺堻堼堽堾堿
    5840 塀塁塂塃塄塅塆塇塈塉塊塋塌塍塎塏塐塑塒塓塔塕塖塗塘塙塚塛塜塝塞塟
    5860 塠塡塢塣塤塥塦塧塨塩塪填塬塭塮塯塰塱塲塳塴塵塶塷塸塹塺塻塼塽塾塿
    5880 墀墁墂境墄墅墆墇墈墉墊墋墌墍墎墏墐墑墒墓墔墕墖増墘墙墚墛墜墝增墟
    58A0 墠墡墢墣墤墥墦墧墨墩墪墫墬墭墮墯墰墱墲墳墴墵墶墷墸墹墺墻墼墽墾墿
    58C0 壀壁壂壃壄壅壆壇壈壉壊壋壌壍壎壏壐壑壒壓壔壕壖壗壘壙壚壛壜壝壞壟
    58E0 壠壡壢壣壤壥壦壧壨壩壪士壬壭壮壯声壱売壳壴壵壶壷壸壹壺壻壼壽壾壿
    5900 夀夁夂夃处夅夆备夈変夊夋夌复夎夏夐夑夒夓夔夕外夗夘夙多夛夜夝夞够
    5920 夠夡夢夣夤夥夦大夨天太夫夬夭央夯夰失夲夳头夵夶夷夸夹夺夻夼夽夾夿
    5940 奀奁奂奃奄奅奆奇奈奉奊奋奌奍奎奏奐契奒奓奔奕奖套奘奙奚奛奜奝奞奟
    5960 奠奡奢奣奤奥奦奧奨奩奪奫奬奭奮奯奰奱奲女奴奵奶奷奸她奺奻奼好奾奿
    5980 妀妁如妃妄妅妆妇妈妉妊妋妌妍妎妏妐妑妒妓妔妕妖妗妘妙妚妛妜妝妞妟
    59A0 妠妡妢妣妤妥妦妧妨妩妪妫妬妭妮妯妰妱妲妳妴妵妶妷妸妹妺妻妼妽妾妿
    59C0 姀姁姂姃姄姅姆姇姈姉姊始姌姍姎姏姐姑姒姓委姕姖姗姘姙姚姛姜姝姞姟
    59E0 姠姡姢姣姤姥姦姧姨姩姪姫姬姭姮姯姰姱姲姳姴姵姶姷姸姹姺姻姼姽姾姿
    5A00 娀威娂娃娄娅娆娇娈娉娊娋娌娍娎娏娐娑娒娓娔娕娖娗娘娙娚娛娜娝娞娟
    5A20 娠娡娢娣娤娥娦娧娨娩娪娫娬娭娮娯娰娱娲娳娴娵娶娷娸娹娺娻娼娽娾娿
    5A40 婀婁婂婃婄婅婆婇婈婉婊婋婌婍婎婏婐婑婒婓婔婕婖婗婘婙婚婛婜婝婞婟
    5A60 婠婡婢婣婤婥婦婧婨婩婪婫婬婭婮婯婰婱婲婳婴婵婶婷婸婹婺婻婼婽婾婿
    5A80 媀媁媂媃媄媅媆媇媈媉媊媋媌媍媎媏媐媑媒媓媔媕媖媗媘媙媚媛媜媝媞媟
    5AA0 媠媡媢媣媤媥媦媧媨媩媪媫媬媭媮媯媰媱媲媳媴媵媶媷媸媹媺媻媼媽媾媿
    5AC0 嫀嫁嫂嫃嫄嫅嫆嫇嫈嫉嫊嫋嫌嫍嫎嫏嫐嫑嫒嫓嫔嫕嫖嫗嫘嫙嫚嫛嫜嫝嫞嫟
    5AE0 嫠嫡嫢嫣嫤嫥嫦嫧嫨嫩嫪嫫嫬嫭嫮嫯嫰嫱嫲嫳嫴嫵嫶嫷嫸嫹嫺嫻嫼嫽嫾嫿
    5B00 嬀嬁嬂嬃嬄嬅嬆嬇嬈嬉嬊嬋嬌嬍嬎嬏嬐嬑嬒嬓嬔嬕嬖嬗嬘嬙嬚嬛嬜嬝嬞嬟
    5B20 嬠嬡嬢嬣嬤嬥嬦嬧嬨嬩嬪嬫嬬嬭嬮嬯嬰嬱嬲嬳嬴嬵嬶嬷嬸嬹嬺嬻嬼嬽嬾嬿
    5B40 孀孁孂孃孄孅孆孇孈孉孊孋孌孍孎孏子孑孒孓孔孕孖字存孙孚孛孜孝孞孟
    5B60 孠孡孢季孤孥学孧孨孩孪孫孬孭孮孯孰孱孲孳孴孵孶孷學孹孺孻孼孽孾孿
    5B80 宀宁宂它宄宅宆宇守安宊宋完宍宎宏宐宑宒宓宔宕宖宗官宙定宛宜宝实実
    5BA0 宠审客宣室宥宦宧宨宩宪宫宬宭宮宯宰宱宲害宴宵家宷宸容宺宻宼宽宾宿
    5BC0 寀寁寂寃寄寅密寇寈寉寊寋富寍寎寏寐寑寒寓寔寕寖寗寘寙寚寛寜寝寞察
    5BE0 寠寡寢寣寤寥實寧寨審寪寫寬寭寮寯寰寱寲寳寴寵寶寷寸对寺寻导寽対寿
    5C00 尀封専尃射尅将將專尉尊尋尌對導小尐少尒尓尔尕尖尗尘尙尚尛尜尝尞尟
    5C20 尠尡尢尣尤尥尦尧尨尩尪尫尬尭尮尯尰就尲尳尴尵尶尷尸尹尺尻尼尽尾尿
    5C40 局屁层屃屄居屆屇屈屉届屋屌屍屎屏屐屑屒屓屔展屖屗屘屙屚屛屜屝属屟
    5C60 屠屡屢屣層履屦屧屨屩屪屫屬屭屮屯屰山屲屳屴屵屶屷屸屹屺屻屼屽屾屿
    5C80 岀岁岂岃岄岅岆岇岈岉岊岋岌岍岎岏岐岑岒岓岔岕岖岗岘岙岚岛岜岝岞岟
    5CA0 岠岡岢岣岤岥岦岧岨岩岪岫岬岭岮岯岰岱岲岳岴岵岶岷岸岹岺岻岼岽岾岿
    5CC0 峀峁峂峃峄峅峆峇峈峉峊峋峌峍峎峏峐峑峒峓峔峕峖峗峘峙峚峛峜峝峞峟
    5CE0 峠峡峢峣峤峥峦峧峨峩峪峫峬峭峮峯峰峱峲峳峴峵島峷峸峹峺峻峼峽峾峿
    5D00 崀崁崂崃崄崅崆崇崈崉崊崋崌崍崎崏崐崑崒崓崔崕崖崗崘崙崚崛崜崝崞崟
    5D20 崠崡崢崣崤崥崦崧崨崩崪崫崬崭崮崯崰崱崲崳崴崵崶崷崸崹崺崻崼崽崾崿
    5D40 嵀嵁嵂嵃嵄嵅嵆嵇嵈嵉嵊嵋嵌嵍嵎嵏嵐嵑嵒嵓嵔嵕嵖嵗嵘嵙嵚嵛嵜嵝嵞嵟
    5D60 嵠嵡嵢嵣嵤嵥嵦嵧嵨嵩嵪嵫嵬嵭嵮嵯嵰嵱嵲嵳嵴嵵嵶嵷嵸嵹嵺嵻嵼嵽嵾嵿
    5D80 嶀嶁嶂嶃嶄嶅嶆嶇嶈嶉嶊嶋嶌嶍嶎嶏嶐嶑嶒嶓嶔嶕嶖嶗嶘嶙嶚嶛嶜嶝嶞嶟
    5DA0 嶠嶡嶢嶣嶤嶥嶦嶧嶨嶩嶪嶫嶬嶭嶮嶯嶰嶱嶲嶳嶴嶵嶶嶷嶸嶹嶺嶻嶼嶽嶾嶿
    5DC0 巀巁巂巃巄巅巆巇巈巉巊巋巌巍巎巏巐巑巒巓巔巕巖巗巘巙巚巛巜川州巟
    5DE0 巠巡巢巣巤工左巧巨巩巪巫巬巭差巯巰己已巳巴巵巶巷巸巹巺巻巼巽巾巿
    5E00 帀币市布帄帅帆帇师帉帊帋希帍帎帏帐帑帒帓帔帕帖帗帘帙帚帛帜帝帞帟
    5E20 帠帡帢帣帤帥带帧帨帩帪師帬席帮帯帰帱帲帳帴帵帶帷常帹帺帻帼帽帾帿
    5E40 幀幁幂幃幄幅幆幇幈幉幊幋幌幍幎幏幐幑幒幓幔幕幖幗幘幙幚幛幜幝幞幟
    5E60 幠幡幢幣幤幥幦幧幨幩幪幫幬幭幮幯幰幱干平年幵并幷幸幹幺幻幼幽幾广
    5E80 庀庁庂広庄庅庆庇庈庉床庋庌庍庎序庐庑庒库应底庖店庘庙庚庛府庝庞废
    5EA0 庠庡庢庣庤庥度座庨庩庪庫庬庭庮庯庰庱庲庳庴庵庶康庸庹庺庻庼庽庾庿
    5EC0 廀廁廂廃廄廅廆廇廈廉廊廋廌廍廎廏廐廑廒廓廔廕廖廗廘廙廚廛廜廝廞廟
    5EE0 廠廡廢廣廤廥廦廧廨廩廪廫廬廭廮廯廰廱廲廳廴廵延廷廸廹建廻廼廽廾廿
    5F00 开弁异弃弄弅弆弇弈弉弊弋弌弍弎式弐弑弒弓弔引弖弗弘弙弚弛弜弝弞弟
    5F20 张弡弢弣弤弥弦弧弨弩弪弫弬弭弮弯弰弱弲弳弴張弶強弸弹强弻弼弽弾弿
    5F40 彀彁彂彃彄彅彆彇彈彉彊彋彌彍彎彏彐彑归当彔录彖彗彘彙彚彛彜彝彞彟
    5F60 彠彡形彣彤彥彦彧彨彩彪彫彬彭彮彯彰影彲彳彴彵彶彷彸役彺彻彼彽彾彿
    5F80 往征徂徃径待徆徇很徉徊律後徍徎徏徐徑徒従徔徕徖得徘徙徚徛徜徝從徟
    5FA0 徠御徢徣徤徥徦徧徨復循徫徬徭微徯徰徱徲徳徴徵徶德徸徹徺徻徼徽徾徿
    5FC0 忀忁忂心忄必忆忇忈忉忊忋忌忍忎忏忐忑忒忓忔忕忖志忘忙忚忛応忝忞忟
    5FE0 忠忡忢忣忤忥忦忧忨忩忪快忬忭忮忯忰忱忲忳忴念忶忷忸忹忺忻忼忽忾忿
    6000 怀态怂怃怄怅怆怇怈怉怊怋怌怍怎怏怐怑怒怓怔怕怖怗怘怙怚怛怜思怞怟
    6020 怠怡怢怣怤急怦性怨怩怪怫怬怭怮怯怰怱怲怳怴怵怶怷怸怹怺总怼怽怾怿
    6040 恀恁恂恃恄恅恆恇恈恉恊恋恌恍恎恏恐恑恒恓恔恕恖恗恘恙恚恛恜恝恞恟
    6060 恠恡恢恣恤恥恦恧恨恩恪恫恬恭恮息恰恱恲恳恴恵恶恷恸恹恺恻恼恽恾恿
    6080 悀悁悂悃悄悅悆悇悈悉悊悋悌悍悎悏悐悑悒悓悔悕悖悗悘悙悚悛悜悝悞悟
    60A0 悠悡悢患悤悥悦悧您悩悪悫悬悭悮悯悰悱悲悳悴悵悶悷悸悹悺悻悼悽悾悿
    60C0 惀惁惂惃惄情惆惇惈惉惊惋惌惍惎惏惐惑惒惓惔惕惖惗惘惙惚惛惜惝惞惟
    60E0 惠惡惢惣惤惥惦惧惨惩惪惫惬惭惮惯惰惱惲想惴惵惶惷惸惹惺惻惼惽惾惿
    6100 愀愁愂愃愄愅愆愇愈愉愊愋愌愍愎意愐愑愒愓愔愕愖愗愘愙愚愛愜愝愞感
    6120 愠愡愢愣愤愥愦愧愨愩愪愫愬愭愮愯愰愱愲愳愴愵愶愷愸愹愺愻愼愽愾愿
    6140 慀慁慂慃慄慅慆慇慈慉慊態慌慍慎慏慐慑慒慓慔慕慖慗慘慙慚慛慜慝慞慟
    6160 慠慡慢慣慤慥慦慧慨慩慪慫慬慭慮慯慰慱慲慳慴慵慶慷慸慹慺慻慼慽慾慿
    6180 憀憁憂憃憄憅憆憇憈憉憊憋憌憍憎憏憐憑憒憓憔憕憖憗憘憙憚憛憜憝憞憟
    61A0 憠憡憢憣憤憥憦憧憨憩憪憫憬憭憮憯憰憱憲憳憴憵憶憷憸憹憺憻憼憽憾憿
    61C0 懀懁懂懃懄懅懆懇懈應懊懋懌懍懎懏懐懑懒懓懔懕懖懗懘懙懚懛懜懝懞懟
    61E0 懠懡懢懣懤懥懦懧懨懩懪懫懬懭懮懯懰懱懲懳懴懵懶懷懸懹懺懻懼懽懾懿
    6200 戀戁戂戃戄戅戆戇戈戉戊戋戌戍戎戏成我戒戓戔戕或戗战戙戚戛戜戝戞戟
    6220 戠戡戢戣戤戥戦戧戨戩截戫戬戭戮戯戰戱戲戳戴戵戶户戸戹戺戻戼戽戾房
    6240 所扁扂扃扄扅扆扇扈扉扊手扌才扎扏扐扑扒打扔払扖扗托扙扚扛扜扝扞扟
    6260 扠扡扢扣扤扥扦执扨扩扪扫扬扭扮扯扰扱扲扳扴扵扶扷扸批扺扻扼扽找承
    6280 技抁抂抃抄抅抆抇抈抉把抋抌抍抎抏抐抑抒抓抔投抖抗折抙抚抛抜抝択抟
    62A0 抠抡抢抣护报抦抧抨抩抪披抬抭抮抯抰抱抲抳抴抵抶抷抸抹抺抻押抽抾抿
    62C0 拀拁拂拃拄担拆拇拈拉拊拋拌拍拎拏拐拑拒拓拔拕拖拗拘拙拚招拜拝拞拟
    62E0 拠拡拢拣拤拥拦拧拨择拪拫括拭拮拯拰拱拲拳拴拵拶拷拸拹拺拻拼拽拾拿
    6300 挀持挂挃挄挅挆指挈按挊挋挌挍挎挏挐挑挒挓挔挕挖挗挘挙挚挛挜挝挞挟
    6320 挠挡挢挣挤挥挦挧挨挩挪挫挬挭挮振挰挱挲挳挴挵挶挷挸挹挺挻挼挽挾挿
    6340 捀捁捂捃捄捅捆捇捈捉捊捋捌捍捎捏捐捑捒捓捔捕捖捗捘捙捚捛捜捝捞损
    6360 捠捡换捣捤捥捦捧捨捩捪捫捬捭据捯捰捱捲捳捴捵捶捷捸捹捺捻捼捽捾捿
    6380 掀掁掂掃掄掅掆掇授掉掊掋掌掍掎掏掐掑排掓掔掕掖掗掘掙掚掛掜掝掞掟
    63A0 掠採探掣掤接掦控推掩措掫掬掭掮掯掰掱掲掳掴掵掶掷掸掹掺掻掼掽掾掿
    63C0 揀揁揂揃揄揅揆揇揈揉揊揋揌揍揎描提揑插揓揔揕揖揗揘揙揚換揜揝揞揟
    63E0 揠握揢揣揤揥揦揧揨揩揪揫揬揭揮揯揰揱揲揳援揵揶揷揸揹揺揻揼揽揾揿
    6400 搀搁搂搃搄搅搆搇搈搉搊搋搌損搎搏搐搑搒搓搔搕搖搗搘搙搚搛搜搝搞搟
    6420 搠搡搢搣搤搥搦搧搨搩搪搫搬搭搮搯搰搱搲搳搴搵搶搷搸搹携搻搼搽搾搿
    6440 摀摁摂摃摄摅摆摇摈摉摊摋摌摍摎摏摐摑摒摓摔摕摖摗摘摙摚摛摜摝摞摟
    6460 摠摡摢摣摤摥摦摧摨摩摪摫摬摭摮摯摰摱摲摳摴摵摶摷摸摹摺摻摼摽摾摿
    6480 撀撁撂撃撄撅撆撇撈撉撊撋撌撍撎撏撐撑撒撓撔撕撖撗撘撙撚撛撜撝撞撟
    64A0 撠撡撢撣撤撥撦撧撨撩撪撫撬播撮撯撰撱撲撳撴撵撶撷撸撹撺撻撼撽撾撿
    64C0 擀擁擂擃擄擅擆擇擈擉擊擋擌操擎擏擐擑擒擓擔擕擖擗擘擙據擛擜擝擞擟
    64E0 擠擡擢擣擤擥擦擧擨擩擪擫擬擭擮擯擰擱擲擳擴擵擶擷擸擹擺擻擼擽擾擿
    6500 攀攁攂攃攄攅攆攇攈攉攊攋攌攍攎攏攐攑攒攓攔攕攖攗攘攙攚攛攜攝攞攟
    6520 攠攡攢攣攤攥攦攧攨攩攪攫攬攭攮支攰攱攲攳攴攵收攷攸改攺攻攼攽放政
    6540 敀敁敂敃敄故敆敇效敉敊敋敌敍敎敏敐救敒敓敔敕敖敗敘教敚敛敜敝敞敟
    6560 敠敡敢散敤敥敦敧敨敩敪敫敬敭敮敯数敱敲敳整敵敶敷數敹敺敻敼敽敾敿
    6580 斀斁斂斃斄斅斆文斈斉斊斋斌斍斎斏斐斑斒斓斔斕斖斗斘料斚斛斜斝斞斟
    65A0 斠斡斢斣斤斥斦斧斨斩斪斫斬断斮斯新斱斲斳斴斵斶斷斸方斺斻於施斾斿
    65C0 旀旁旂旃旄旅旆旇旈旉旊旋旌旍旎族旐旑旒旓旔旕旖旗旘旙旚旛旜旝旞旟
    65E0 无旡既旣旤日旦旧旨早旪旫旬旭旮旯旰旱旲旳旴旵时旷旸旹旺旻旼旽旾旿
    6600 昀昁昂昃昄昅昆昇昈昉昊昋昌昍明昏昐昑昒易昔昕昖昗昘昙昚昛昜昝昞星
    6620 映昡昢昣昤春昦昧昨昩昪昫昬昭昮是昰昱昲昳昴昵昶昷昸昹昺昻昼昽显昿
    6640 晀晁時晃晄晅晆晇晈晉晊晋晌晍晎晏晐晑晒晓晔晕晖晗晘晙晚晛晜晝晞晟
    6660 晠晡晢晣晤晥晦晧晨晩晪晫晬晭普景晰晱晲晳晴晵晶晷晸晹智晻晼晽晾晿
    6680 暀暁暂暃暄暅暆暇暈暉暊暋暌暍暎暏暐暑暒暓暔暕暖暗暘暙暚暛暜暝暞暟
    66A0 暠暡暢暣暤暥暦暧暨暩暪暫暬暭暮暯暰暱暲暳暴暵暶暷暸暹暺暻暼暽暾暿
    66C0 曀曁曂曃曄曅曆曇曈曉曊曋曌曍曎曏曐曑曒曓曔曕曖曗曘曙曚曛曜曝曞曟
    66E0 曠曡曢曣曤曥曦曧曨曩曪曫曬曭曮曯曰曱曲曳更曵曶曷書曹曺曻曼曽曾替
    6700 最朁朂會朄朅朆朇月有朊朋朌服朎朏朐朑朒朓朔朕朖朗朘朙朚望朜朝朞期
    6720 朠朡朢朣朤朥朦朧木朩未末本札朮术朰朱朲朳朴朵朶朷朸朹机朻朼朽朾朿
    6740 杀杁杂权杄杅杆杇杈杉杊杋杌杍李杏材村杒杓杔杕杖杗杘杙杚杛杜杝杞束
    6760 杠条杢杣杤来杦杧杨杩杪杫杬杭杮杯杰東杲杳杴杵杶杷杸杹杺杻杼杽松板
    6780 枀极枂枃构枅枆枇枈枉枊枋枌枍枎枏析枑枒枓枔枕枖林枘枙枚枛果枝枞枟
    67A0 枠枡枢枣枤枥枦枧枨枩枪枫枬枭枮枯枰枱枲枳枴枵架枷枸枹枺枻枼枽枾枿
    67C0 柀柁柂柃柄柅柆柇柈柉柊柋柌柍柎柏某柑柒染柔柕柖柗柘柙柚柛柜柝柞柟
    67E0 柠柡柢柣柤查柦柧柨柩柪柫柬柭柮柯柰柱柲柳柴柵柶柷柸柹柺査柼柽柾柿
    6800 栀栁栂栃栄栅栆标栈栉栊栋栌栍栎栏栐树栒栓栔栕栖栗栘栙栚栛栜栝栞栟
    6820 栠校栢栣栤栥栦栧栨栩株栫栬栭栮栯栰栱栲栳栴栵栶样核根栺栻格栽栾栿
    6840 桀桁桂桃桄桅框桇案桉桊桋桌桍桎桏桐桑桒桓桔桕桖桗桘桙桚桛桜桝桞桟
    6860 桠桡桢档桤桥桦桧桨桩桪桫桬桭桮桯桰桱桲桳桴桵桶桷桸桹桺桻桼桽桾桿
    6880 梀梁梂梃梄梅梆梇梈梉梊梋梌梍梎梏梐梑梒梓梔梕梖梗梘梙梚梛梜條梞梟
    68A0 梠梡梢梣梤梥梦梧梨梩梪梫梬梭梮梯械梱梲梳梴梵梶梷梸梹梺梻梼梽梾梿
    68C0 检棁棂棃棄棅棆棇棈棉棊棋棌棍棎棏棐棑棒棓棔棕棖棗棘棙棚棛棜棝棞棟
    68E0 棠棡棢棣棤棥棦棧棨棩棪棫棬棭森棯棰棱棲棳棴棵棶棷棸棹棺棻棼棽棾棿
    6900 椀椁椂椃椄椅椆椇椈椉椊椋椌植椎椏椐椑椒椓椔椕椖椗椘椙椚椛検椝椞椟
    6920 椠椡椢椣椤椥椦椧椨椩椪椫椬椭椮椯椰椱椲椳椴椵椶椷椸椹椺椻椼椽椾椿
    6940 楀楁楂楃楄楅楆楇楈楉楊楋楌楍楎楏楐楑楒楓楔楕楖楗楘楙楚楛楜楝楞楟
    6960 楠楡楢楣楤楥楦楧楨楩楪楫楬業楮楯楰楱楲楳楴極楶楷楸楹楺楻楼楽楾楿
    6980 榀榁概榃榄榅榆榇榈榉榊榋榌榍榎榏榐榑榒榓榔榕榖榗榘榙榚榛榜榝榞榟
    69A0 榠榡榢榣榤榥榦榧榨榩榪榫榬榭榮榯榰榱榲榳榴榵榶榷榸榹榺榻榼榽榾榿
    69C0 槀槁槂槃槄槅槆槇槈槉槊構槌槍槎槏槐槑槒槓槔槕槖槗様槙槚槛槜槝槞槟
    69E0 槠槡槢槣槤槥槦槧槨槩槪槫槬槭槮槯槰槱槲槳槴槵槶槷槸槹槺槻槼槽槾槿
    6A00 樀樁樂樃樄樅樆樇樈樉樊樋樌樍樎樏樐樑樒樓樔樕樖樗樘標樚樛樜樝樞樟
    6A20 樠模樢樣樤樥樦樧樨権横樫樬樭樮樯樰樱樲樳樴樵樶樷樸樹樺樻樼樽樾樿
    6A40 橀橁橂橃橄橅橆橇橈橉橊橋橌橍橎橏橐橑橒橓橔橕橖橗橘橙橚橛橜橝橞機
    6A60 橠橡橢橣橤橥橦橧橨橩橪橫橬橭橮橯橰橱橲橳橴橵橶橷橸橹橺橻橼橽橾橿
    6A80 檀檁檂檃檄檅檆檇檈檉檊檋檌檍檎檏檐檑檒檓檔檕檖檗檘檙檚檛檜檝檞檟
    6AA0 檠檡檢檣檤檥檦檧檨檩檪檫檬檭檮檯檰檱檲檳檴檵檶檷檸檹檺檻檼檽檾檿
    6AC0 櫀櫁櫂櫃櫄櫅櫆櫇櫈櫉櫊櫋櫌櫍櫎櫏櫐櫑櫒櫓櫔櫕櫖櫗櫘櫙櫚櫛櫜櫝櫞櫟
    6AE0 櫠櫡櫢櫣櫤櫥櫦櫧櫨櫩櫪櫫櫬櫭櫮櫯櫰櫱櫲櫳櫴櫵櫶櫷櫸櫹櫺櫻櫼櫽櫾櫿
    6B00 欀欁欂欃欄欅欆欇欈欉權欋欌欍欎欏欐欑欒欓欔欕欖欗欘欙欚欛欜欝欞欟
    6B20 欠次欢欣欤欥欦欧欨欩欪欫欬欭欮欯欰欱欲欳欴欵欶欷欸欹欺欻欼欽款欿
    6B40 歀歁歂歃歄歅歆歇歈歉歊歋歌歍歎歏歐歑歒歓歔歕歖歗歘歙歚歛歜歝歞歟
    6B60 歠歡止正此步武歧歨歩歪歫歬歭歮歯歰歱歲歳歴歵歶歷歸歹歺死歼歽歾歿
    6B80 殀殁殂殃殄殅殆殇殈殉殊残殌殍殎殏殐殑殒殓殔殕殖殗殘殙殚殛殜殝殞殟
    6BA0 殠殡殢殣殤殥殦殧殨殩殪殫殬殭殮殯殰殱殲殳殴段殶殷殸殹殺殻殼殽殾殿
    6BC0 毀毁毂毃毄毅毆毇毈毉毊毋毌母毎每毐毑毒毓比毕毖毗毘毙毚毛毜毝毞毟
    6BE0 毠毡毢毣毤毥毦毧毨毩毪毫毬毭毮毯毰毱毲毳毴毵毶毷毸毹毺毻毼毽毾毿
    6C00 氀氁氂氃氄氅氆氇氈氉氊氋氌氍氎氏氐民氒氓气氕氖気氘氙氚氛氜氝氞氟
    6C20 氠氡氢氣氤氥氦氧氨氩氪氫氬氭氮氯氰氱氲氳水氵氶氷永氹氺氻氼氽氾氿
    6C40 汀汁求汃汄汅汆汇汈汉汊汋汌汍汎汏汐汑汒汓汔汕汖汗汘汙汚汛汜汝汞江
    6C60 池污汢汣汤汥汦汧汨汩汪汫汬汭汮汯汰汱汲汳汴汵汶汷汸汹決汻汼汽汾汿
    6C80 沀沁沂沃沄沅沆沇沈沉沊沋沌沍沎沏沐沑沒沓沔沕沖沗沘沙沚沛沜沝沞沟
    6CA0 沠没沢沣沤沥沦沧沨沩沪沫沬沭沮沯沰沱沲河沴沵沶沷沸油沺治沼沽沾沿
    6CC0 泀況泂泃泄泅泆泇泈泉泊泋泌泍泎泏泐泑泒泓泔法泖泗泘泙泚泛泜泝泞泟
    6CE0 泠泡波泣泤泥泦泧注泩泪泫泬泭泮泯泰泱泲泳泴泵泶泷泸泹泺泻泼泽泾泿
    6D00 洀洁洂洃洄洅洆洇洈洉洊洋洌洍洎洏洐洑洒洓洔洕洖洗洘洙洚洛洜洝洞洟
    6D20 洠洡洢洣洤津洦洧洨洩洪洫洬洭洮洯洰洱洲洳洴洵洶洷洸洹洺活洼洽派洿
    6D40 浀流浂浃浄浅浆浇浈浉浊测浌浍济浏浐浑浒浓浔浕浖浗浘浙浚浛浜浝浞浟
    6D60 浠浡浢浣浤浥浦浧浨浩浪浫浬浭浮浯浰浱浲浳浴浵浶海浸浹浺浻浼浽浾浿
    6D80 涀涁涂涃涄涅涆涇消涉涊涋涌涍涎涏涐涑涒涓涔涕涖涗涘涙涚涛涜涝涞涟
    6DA0 涠涡涢涣涤涥润涧涨涩涪涫涬涭涮涯涰涱液涳涴涵涶涷涸涹涺涻涼涽涾涿
    6DC0 淀淁淂淃淄淅淆淇淈淉淊淋淌淍淎淏淐淑淒淓淔淕淖淗淘淙淚淛淜淝淞淟
    6DE0 淠淡淢淣淤淥淦淧淨淩淪淫淬淭淮淯淰深淲淳淴淵淶混淸淹淺添淼淽淾淿
    6E00 渀渁渂渃渄清渆渇済渉渊渋渌渍渎渏渐渑渒渓渔渕渖渗渘渙渚減渜渝渞渟
    6E20 渠渡渢渣渤渥渦渧渨温渪渫測渭渮港渰渱渲渳渴渵渶渷游渹渺渻渼渽渾渿
    6E40 湀湁湂湃湄湅湆湇湈湉湊湋湌湍湎湏湐湑湒湓湔湕湖湗湘湙湚湛湜湝湞湟
    6E60 湠湡湢湣湤湥湦湧湨湩湪湫湬湭湮湯湰湱湲湳湴湵湶湷湸湹湺湻湼湽湾湿
    6E80 満溁溂溃溄溅溆溇溈溉溊溋溌溍溎溏源溑溒溓溔溕準溗溘溙溚溛溜溝溞溟
    6EA0 溠溡溢溣溤溥溦溧溨溩溪溫溬溭溮溯溰溱溲溳溴溵溶溷溸溹溺溻溼溽溾溿
    6EC0 滀滁滂滃滄滅滆滇滈滉滊滋滌滍滎滏滐滑滒滓滔滕滖滗滘滙滚滛滜滝滞滟
    6EE0 滠满滢滣滤滥滦滧滨滩滪滫滬滭滮滯滰滱滲滳滴滵滶滷滸滹滺滻滼滽滾滿
    6F00 漀漁漂漃漄漅漆漇漈漉漊漋漌漍漎漏漐漑漒漓演漕漖漗漘漙漚漛漜漝漞漟
    6F20 漠漡漢漣漤漥漦漧漨漩漪漫漬漭漮漯漰漱漲漳漴漵漶漷漸漹漺漻漼漽漾漿
    6F40 潀潁潂潃潄潅潆潇潈潉潊潋潌潍潎潏潐潑潒潓潔潕潖潗潘潙潚潛潜潝潞潟
    6F60 潠潡潢潣潤潥潦潧潨潩潪潫潬潭潮潯潰潱潲潳潴潵潶潷潸潹潺潻潼潽潾潿
    6F80 澀澁澂澃澄澅澆澇澈澉澊澋澌澍澎澏澐澑澒澓澔澕澖澗澘澙澚澛澜澝澞澟
    6FA0 澠澡澢澣澤澥澦澧澨澩澪澫澬澭澮澯澰澱澲澳澴澵澶澷澸澹澺澻澼澽澾澿
    6FC0 激濁濂濃濄濅濆濇濈濉濊濋濌濍濎濏濐濑濒濓濔濕濖濗濘濙濚濛濜濝濞濟
    6FE0 濠濡濢濣濤濥濦濧濨濩濪濫濬濭濮濯濰濱濲濳濴濵濶濷濸濹濺濻濼濽濾濿
    7000 瀀瀁瀂瀃瀄瀅瀆瀇瀈瀉瀊瀋瀌瀍瀎瀏瀐瀑瀒瀓瀔瀕瀖瀗瀘瀙瀚瀛瀜瀝瀞瀟
    7020 瀠瀡瀢瀣瀤瀥瀦瀧瀨瀩瀪瀫瀬瀭瀮瀯瀰瀱瀲瀳瀴瀵瀶瀷瀸瀹瀺瀻瀼瀽瀾瀿
    7040 灀灁灂灃灄灅灆灇灈灉灊灋灌灍灎灏灐灑灒灓灔灕灖灗灘灙灚灛灜灝灞灟
    7060 灠灡灢灣灤灥灦灧灨灩灪火灬灭灮灯灰灱灲灳灴灵灶灷灸灹灺灻灼災灾灿
    7080 炀炁炂炃炄炅炆炇炈炉炊炋炌炍炎炏炐炑炒炓炔炕炖炗炘炙炚炛炜炝炞炟
    70A0 炠炡炢炣炤炥炦炧炨炩炪炫炬炭炮炯炰炱炲炳炴炵炶炷炸点為炻炼炽炾炿
    70C0 烀烁烂烃烄烅烆烇烈烉烊烋烌烍烎烏烐烑烒烓烔烕烖烗烘烙烚烛烜烝烞烟
    70E0 烠烡烢烣烤烥烦烧烨烩烪烫烬热烮烯烰烱烲烳烴烵烶烷烸烹烺烻烼烽烾烿
    7100 焀焁焂焃焄焅焆焇焈焉焊焋焌焍焎焏焐焑焒焓焔焕焖焗焘焙焚焛焜焝焞焟
    7120 焠無焢焣焤焥焦焧焨焩焪焫焬焭焮焯焰焱焲焳焴焵然焷焸焹焺焻焼焽焾焿
    7140 煀煁煂煃煄煅煆煇煈煉煊煋煌煍煎煏煐煑煒煓煔煕煖煗煘煙煚煛煜煝煞煟
    7160 煠煡煢煣煤煥煦照煨煩煪煫煬煭煮煯煰煱煲煳煴煵煶煷煸煹煺煻煼煽煾煿
    7180 熀熁熂熃熄熅熆熇熈熉熊熋熌熍熎熏熐熑熒熓熔熕熖熗熘熙熚熛熜熝熞熟
    71A0 熠熡熢熣熤熥熦熧熨熩熪熫熬熭熮熯熰熱熲熳熴熵熶熷熸熹熺熻熼熽熾熿
    71C0 燀燁燂燃燄燅燆燇燈燉燊燋燌燍燎燏燐燑燒燓燔燕燖燗燘燙燚燛燜燝燞營
    71E0 燠燡燢燣燤燥燦燧燨燩燪燫燬燭燮燯燰燱燲燳燴燵燶燷燸燹燺燻燼燽燾燿
    7200 爀爁爂爃爄爅爆爇爈爉爊爋爌爍爎爏爐爑爒爓爔爕爖爗爘爙爚爛爜爝爞爟
    7220 爠爡爢爣爤爥爦爧爨爩爪爫爬爭爮爯爰爱爲爳爴爵父爷爸爹爺爻爼爽爾爿
    7240 牀牁牂牃牄牅牆片版牉牊牋牌牍牎牏牐牑牒牓牔牕牖牗牘牙牚牛牜牝牞牟
    7260 牠牡牢牣牤牥牦牧牨物牪牫牬牭牮牯牰牱牲牳牴牵牶牷牸特牺牻牼牽牾牿
    7280 犀犁犂犃犄犅犆犇犈犉犊犋犌犍犎犏犐犑犒犓犔犕犖犗犘犙犚犛犜犝犞犟
    72A0 犠犡犢犣犤犥犦犧犨犩犪犫犬犭犮犯犰犱犲犳犴犵状犷犸犹犺犻犼犽犾犿
    72C0 狀狁狂狃狄狅狆狇狈狉狊狋狌狍狎狏狐狑狒狓狔狕狖狗狘狙狚狛狜狝狞狟
    72E0 狠狡狢狣狤狥狦狧狨狩狪狫独狭狮狯狰狱狲狳狴狵狶狷狸狹狺狻狼狽狾狿
    7300 猀猁猂猃猄猅猆猇猈猉猊猋猌猍猎猏猐猑猒猓猔猕猖猗猘猙猚猛猜猝猞猟
    7320 猠猡猢猣猤猥猦猧猨猩猪猫猬猭献猯猰猱猲猳猴猵猶猷猸猹猺猻猼猽猾猿
    7340 獀獁獂獃獄獅獆獇獈獉獊獋獌獍獎獏獐獑獒獓獔獕獖獗獘獙獚獛獜獝獞獟
    7360 獠獡獢獣獤獥獦獧獨獩獪獫獬獭獮獯獰獱獲獳獴獵獶獷獸獹獺獻獼獽獾獿
    7380 玀玁玂玃玄玅玆率玈玉玊王玌玍玎玏玐玑玒玓玔玕玖玗玘玙玚玛玜玝玞玟
    73A0 玠玡玢玣玤玥玦玧玨玩玪玫玬玭玮环现玱玲玳玴玵玶玷玸玹玺玻玼玽玾玿
    73C0 珀珁珂珃珄珅珆珇珈珉珊珋珌珍珎珏珐珑珒珓珔珕珖珗珘珙珚珛珜珝珞珟
    73E0 珠珡珢珣珤珥珦珧珨珩珪珫珬班珮珯珰珱珲珳珴珵珶珷珸珹珺珻珼珽現珿
    7400 琀琁琂球琄琅理琇琈琉琊琋琌琍琎琏琐琑琒琓琔琕琖琗琘琙琚琛琜琝琞琟
    7420 琠琡琢琣琤琥琦琧琨琩琪琫琬琭琮琯琰琱琲琳琴琵琶琷琸琹琺琻琼琽琾琿
    7440 瑀瑁瑂瑃瑄瑅瑆瑇瑈瑉瑊瑋瑌瑍瑎瑏瑐瑑瑒瑓瑔瑕瑖瑗瑘瑙瑚瑛瑜瑝瑞瑟
    7460 瑠瑡瑢瑣瑤瑥瑦瑧瑨瑩瑪瑫瑬瑭瑮瑯瑰瑱瑲瑳瑴瑵瑶瑷瑸瑹瑺瑻瑼瑽瑾瑿
    7480 璀璁璂璃璄璅璆璇璈璉璊璋璌璍璎璏璐璑璒璓璔璕璖璗璘璙璚璛璜璝璞璟
    74A0 璠璡璢璣璤璥璦璧璨璩璪璫璬璭璮璯環璱璲璳璴璵璶璷璸璹璺璻璼璽璾璿
    74C0 瓀瓁瓂瓃瓄瓅瓆瓇瓈瓉瓊瓋瓌瓍瓎瓏瓐瓑瓒瓓瓔瓕瓖瓗瓘瓙瓚瓛瓜瓝瓞瓟
    74E0 瓠瓡瓢瓣瓤瓥瓦瓧瓨瓩瓪瓫瓬瓭瓮瓯瓰瓱瓲瓳瓴瓵瓶瓷瓸瓹瓺瓻瓼瓽瓾瓿
    7500 甀甁甂甃甄甅甆甇甈甉甊甋甌甍甎甏甐甑甒甓甔甕甖甗甘甙甚甛甜甝甞生
    7520 甠甡產産甤甥甦甧用甩甪甫甬甭甮甯田由甲申甴电甶男甸甹町画甼甽甾甿
    7540 畀畁畂畃畄畅畆畇畈畉畊畋界畍畎畏畐畑畒畓畔畕畖畗畘留畚畛畜畝畞畟
    7560 畠畡畢畣畤略畦畧畨畩番畫畬畭畮畯異畱畲畳畴畵當畷畸畹畺畻畼畽畾畿
    7580 疀疁疂疃疄疅疆疇疈疉疊疋疌疍疎疏疐疑疒疓疔疕疖疗疘疙疚疛疜疝疞疟
    75A0 疠疡疢疣疤疥疦疧疨疩疪疫疬疭疮疯疰疱疲疳疴疵疶疷疸疹疺疻疼疽疾疿
    75C0 痀痁痂痃痄病痆症痈痉痊痋痌痍痎痏痐痑痒痓痔痕痖痗痘痙痚痛痜痝痞痟
    75E0 痠痡痢痣痤痥痦痧痨痩痪痫痬痭痮痯痰痱痲痳痴痵痶痷痸痹痺痻痼痽痾痿
    7600 瘀瘁瘂瘃瘄瘅瘆瘇瘈瘉瘊瘋瘌瘍瘎瘏瘐瘑瘒瘓瘔瘕瘖瘗瘘瘙瘚瘛瘜瘝瘞瘟
    7620 瘠瘡瘢瘣瘤瘥瘦瘧瘨瘩瘪瘫瘬瘭瘮瘯瘰瘱瘲瘳瘴瘵瘶瘷瘸瘹瘺瘻瘼瘽瘾瘿
    7640 癀癁療癃癄癅癆癇癈癉癊癋癌癍癎癏癐癑癒癓癔癕癖癗癘癙癚癛癜癝癞癟
    7660 癠癡癢癣癤癥癦癧癨癩癪癫癬癭癮癯癰癱癲癳癴癵癶癷癸癹発登發白百癿
    7680 皀皁皂皃的皅皆皇皈皉皊皋皌皍皎皏皐皑皒皓皔皕皖皗皘皙皚皛皜皝皞皟
    76A0 皠皡皢皣皤皥皦皧皨皩皪皫皬皭皮皯皰皱皲皳皴皵皶皷皸皹皺皻皼皽皾皿
    76C0 盀盁盂盃盄盅盆盇盈盉益盋盌盍盎盏盐监盒盓盔盕盖盗盘盙盚盛盜盝盞盟
    76E0 盠盡盢監盤盥盦盧盨盩盪盫盬盭目盯盰盱盲盳直盵盶盷相盹盺盻盼盽盾盿
    7700 眀省眂眃眄眅眆眇眈眉眊看県眍眎眏眐眑眒眓眔眕眖眗眘眙眚眛眜眝眞真
    7720 眠眡眢眣眤眥眦眧眨眩眪眫眬眭眮眯眰眱眲眳眴眵眶眷眸眹眺眻眼眽眾眿
    7740 着睁睂睃睄睅睆睇睈睉睊睋睌睍睎睏睐睑睒睓睔睕睖睗睘睙睚睛睜睝睞睟
    7760 睠睡睢督睤睥睦睧睨睩睪睫睬睭睮睯睰睱睲睳睴睵睶睷睸睹睺睻睼睽睾睿
    7780 瞀瞁瞂瞃瞄瞅瞆瞇瞈瞉瞊瞋瞌瞍瞎瞏瞐瞑瞒瞓瞔瞕瞖瞗瞘瞙瞚瞛瞜瞝瞞瞟
    77A0 瞠瞡瞢瞣瞤瞥瞦瞧瞨瞩瞪瞫瞬瞭瞮瞯瞰瞱瞲瞳瞴瞵瞶瞷瞸瞹瞺瞻瞼瞽瞾瞿
    77C0 矀矁矂矃矄矅矆矇矈矉矊矋矌矍矎矏矐矑矒矓矔矕矖矗矘矙矚矛矜矝矞矟
    77E0 矠矡矢矣矤知矦矧矨矩矪矫矬短矮矯矰矱矲石矴矵矶矷矸矹矺矻矼矽矾矿
    7800 砀码砂砃砄砅砆砇砈砉砊砋砌砍砎砏砐砑砒砓研砕砖砗砘砙砚砛砜砝砞砟
    7820 砠砡砢砣砤砥砦砧砨砩砪砫砬砭砮砯砰砱砲砳破砵砶砷砸砹砺砻砼砽砾砿
    7840 础硁硂硃硄硅硆硇硈硉硊硋硌硍硎硏硐硑硒硓硔硕硖硗硘硙硚硛硜硝硞硟
    7860 硠硡硢硣硤硥硦硧硨硩硪硫硬硭确硯硰硱硲硳硴硵硶硷硸硹硺硻硼硽硾硿
    7880 碀碁碂碃碄碅碆碇碈碉碊碋碌碍碎碏碐碑碒碓碔碕碖碗碘碙碚碛碜碝碞碟
    78A0 碠碡碢碣碤碥碦碧碨碩碪碫碬碭碮碯碰碱碲碳碴碵碶碷碸碹確碻碼碽碾碿
    78C0 磀磁磂磃磄磅磆磇磈磉磊磋磌磍磎磏磐磑磒磓磔磕磖磗磘磙磚磛磜磝磞磟
    78E0 磠磡磢磣磤磥磦磧磨磩磪磫磬磭磮磯磰磱磲磳磴磵磶磷磸磹磺磻磼磽磾磿
    7900 礀礁礂礃礄礅礆礇礈礉礊礋礌礍礎礏礐礑礒礓礔礕礖礗礘礙礚礛礜礝礞礟
    7920 礠礡礢礣礤礥礦礧礨礩礪礫礬礭礮礯礰礱礲礳礴礵礶礷礸礹示礻礼礽社礿
    7940 祀祁祂祃祄祅祆祇祈祉祊祋祌祍祎祏祐祑祒祓祔祕祖祗祘祙祚祛祜祝神祟
    7960 祠祡祢祣祤祥祦祧票祩祪祫祬祭祮祯祰祱祲祳祴祵祶祷祸祹祺祻祼祽祾祿
    7980 禀禁禂禃禄禅禆禇禈禉禊禋禌禍禎福禐禑禒禓禔禕禖禗禘禙禚禛禜禝禞禟
    79A0 禠禡禢禣禤禥禦禧禨禩禪禫禬禭禮禯禰禱禲禳禴禵禶禷禸禹禺离禼禽禾禿
    79C0 秀私秂秃秄秅秆秇秈秉秊秋秌种秎秏秐科秒秓秔秕秖秗秘秙秚秛秜秝秞租
    79E0 秠秡秢秣秤秥秦秧秨秩秪秫秬秭秮积称秱秲秳秴秵秶秷秸秹秺移秼秽秾秿
    7A00 稀稁稂稃稄稅稆稇稈稉稊程稌稍税稏稐稑稒稓稔稕稖稗稘稙稚稛稜稝稞稟
    7A20 稠稡稢稣稤稥稦稧稨稩稪稫稬稭種稯稰稱稲稳稴稵稶稷稸稹稺稻稼稽稾稿
    7A40 穀穁穂穃穄穅穆穇穈穉穊穋穌積穎穏穐穑穒穓穔穕穖穗穘穙穚穛穜穝穞穟
    7A60 穠穡穢穣穤穥穦穧穨穩穪穫穬穭穮穯穰穱穲穳穴穵究穷穸穹空穻穼穽穾穿
    7A80 窀突窂窃窄窅窆窇窈窉窊窋窌窍窎窏窐窑窒窓窔窕窖窗窘窙窚窛窜窝窞窟
    7AA0 窠窡窢窣窤窥窦窧窨窩窪窫窬窭窮窯窰窱窲窳窴窵窶窷窸窹窺窻窼窽窾窿
    7AC0 竀竁竂竃竄竅竆竇竈竉竊立竌竍竎竏竐竑竒竓竔竕竖竗竘站竚竛竜竝竞竟
    7AE0 章竡竢竣竤童竦竧竨竩竪竫竬竭竮端竰竱竲竳竴竵競竷竸竹竺竻竼竽竾竿
    7B00 笀笁笂笃笄笅笆笇笈笉笊笋笌笍笎笏笐笑笒笓笔笕笖笗笘笙笚笛笜笝笞笟
    7B20 笠笡笢笣笤笥符笧笨笩笪笫第笭笮笯笰笱笲笳笴笵笶笷笸笹笺笻笼笽笾笿
    7B40 筀筁筂筃筄筅筆筇筈等筊筋筌筍筎筏筐筑筒筓答筕策筗筘筙筚筛筜筝筞筟
    7B60 筠筡筢筣筤筥筦筧筨筩筪筫筬筭筮筯筰筱筲筳筴筵筶筷筸筹筺筻筼筽签筿
    7B80 简箁箂箃箄箅箆箇箈箉箊箋箌箍箎箏箐箑箒箓箔箕箖算箘箙箚箛箜箝箞箟
    7BA0 箠管箢箣箤箥箦箧箨箩箪箫箬箭箮箯箰箱箲箳箴箵箶箷箸箹箺箻箼箽箾箿
    7BC0 節篁篂篃範篅篆篇篈築篊篋篌篍篎篏篐篑篒篓篔篕篖篗篘篙篚篛篜篝篞篟
    7BE0 篠篡篢篣篤篥篦篧篨篩篪篫篬篭篮篯篰篱篲篳篴篵篶篷篸篹篺篻篼篽篾篿
    7C00 簀簁簂簃簄簅簆簇簈簉簊簋簌簍簎簏簐簑簒簓簔簕簖簗簘簙簚簛簜簝簞簟
    7C20 簠簡簢簣簤簥簦簧簨簩簪簫簬簭簮簯簰簱簲簳簴簵簶簷簸簹簺簻簼簽簾簿
    7C40 籀籁籂籃籄籅籆籇籈籉籊籋籌籍籎籏籐籑籒籓籔籕籖籗籘籙籚籛籜籝籞籟
    7C60 籠籡籢籣籤籥籦籧籨籩籪籫籬籭籮籯籰籱籲米籴籵籶籷籸籹籺类籼籽籾籿
    7C80 粀粁粂粃粄粅粆粇粈粉粊粋粌粍粎粏粐粑粒粓粔粕粖粗粘粙粚粛粜粝粞粟
    7CA0 粠粡粢粣粤粥粦粧粨粩粪粫粬粭粮粯粰粱粲粳粴粵粶粷粸粹粺粻粼粽精粿
    7CC0 糀糁糂糃糄糅糆糇糈糉糊糋糌糍糎糏糐糑糒糓糔糕糖糗糘糙糚糛糜糝糞糟
    7CE0 糠糡糢糣糤糥糦糧糨糩糪糫糬糭糮糯糰糱糲糳糴糵糶糷糸糹糺系糼糽糾糿
    7D00 紀紁紂紃約紅紆紇紈紉紊紋紌納紎紏紐紑紒紓純紕紖紗紘紙級紛紜紝紞紟
    7D20 素紡索紣紤紥紦紧紨紩紪紫紬紭紮累細紱紲紳紴紵紶紷紸紹紺紻紼紽紾紿
    7D40 絀絁終絃組絅絆絇絈絉絊絋経絍絎絏結絑絒絓絔絕絖絗絘絙絚絛絜絝絞絟
    7D60 絠絡絢絣絤絥給絧絨絩絪絫絬絭絮絯絰統絲絳絴絵絶絷絸絹絺絻絼絽絾絿
    7D80 綀綁綂綃綄綅綆綇綈綉綊綋綌綍綎綏綐綑綒經綔綕綖綗綘継続綛綜綝綞綟
    7DA0 綠綡綢綣綤綥綦綧綨綩綪綫綬維綮綯綰綱網綳綴綵綶綷綸綹綺綻綼綽綾綿
    7DC0 緀緁緂緃緄緅緆緇緈緉緊緋緌緍緎総緐緑緒緓緔緕緖緗緘緙線緛緜緝緞緟
    7DE0 締緡緢緣緤緥緦緧編緩緪緫緬緭緮緯緰緱緲緳練緵緶緷緸緹緺緻緼緽緾緿
    7E00 縀縁縂縃縄縅縆縇縈縉縊縋縌縍縎縏縐縑縒縓縔縕縖縗縘縙縚縛縜縝縞縟
    7E20 縠縡縢縣縤縥縦縧縨縩縪縫縬縭縮縯縰縱縲縳縴縵縶縷縸縹縺縻縼總績縿
    7E40 繀繁繂繃繄繅繆繇繈繉繊繋繌繍繎繏繐繑繒繓織繕繖繗繘繙繚繛繜繝繞繟
    7E60 繠繡繢繣繤繥繦繧繨繩繪繫繬繭繮繯繰繱繲繳繴繵繶繷繸繹繺繻繼繽繾繿
    7E80 纀纁纂纃纄纅纆纇纈纉纊纋續纍纎纏纐纑纒纓纔纕纖纗纘纙纚纛纜纝纞纟
    7EA0 纠纡红纣纤纥约级纨纩纪纫纬纭纮纯纰纱纲纳纴纵纶纷纸纹纺纻纼纽纾线
    7EC0 绀绁绂练组绅细织终绉绊绋绌绍绎经绐绑绒结绔绕绖绗绘给绚绛络绝绞统
    7EE0 绠绡绢绣绤绥绦继绨绩绪绫绬续绮绯绰绱绲绳维绵绶绷绸绹绺绻综绽绾绿
    7F00 缀缁缂缃缄缅缆缇缈缉缊缋缌缍缎缏缐缑缒缓缔缕编缗缘缙缚缛缜缝缞缟
    7F20 缠缡缢缣缤缥缦缧缨缩缪缫缬缭缮缯缰缱缲缳缴缵缶缷缸缹缺缻缼缽缾缿
    7F40 罀罁罂罃罄罅罆罇罈罉罊罋罌罍罎罏罐网罒罓罔罕罖罗罘罙罚罛罜罝罞罟
    7F60 罠罡罢罣罤罥罦罧罨罩罪罫罬罭置罯罰罱署罳罴罵罶罷罸罹罺罻罼罽罾罿
    7F80 羀羁羂羃羄羅羆羇羈羉羊羋羌羍美羏羐羑羒羓羔羕羖羗羘羙羚羛羜羝羞羟
    7FA0 羠羡羢羣群羥羦羧羨義羪羫羬羭羮羯羰羱羲羳羴羵羶羷羸羹羺羻羼羽羾羿
    7FC0 翀翁翂翃翄翅翆翇翈翉翊翋翌翍翎翏翐翑習翓翔翕翖翗翘翙翚翛翜翝翞翟
    7FE0 翠翡翢翣翤翥翦翧翨翩翪翫翬翭翮翯翰翱翲翳翴翵翶翷翸翹翺翻翼翽翾翿
    8000 耀老耂考耄者耆耇耈耉耊耋而耍耎耏耐耑耒耓耔耕耖耗耘耙耚耛耜耝耞耟
    8020 耠耡耢耣耤耥耦耧耨耩耪耫耬耭耮耯耰耱耲耳耴耵耶耷耸耹耺耻耼耽耾耿
    8040 聀聁聂聃聄聅聆聇聈聉聊聋职聍聎聏聐聑聒聓联聕聖聗聘聙聚聛聜聝聞聟
    8060 聠聡聢聣聤聥聦聧聨聩聪聫聬聭聮聯聰聱聲聳聴聵聶職聸聹聺聻聼聽聾聿
    8080 肀肁肂肃肄肅肆肇肈肉肊肋肌肍肎肏肐肑肒肓肔肕肖肗肘肙肚肛肜肝肞肟
    80A0 肠股肢肣肤肥肦肧肨肩肪肫肬肭肮肯肰肱育肳肴肵肶肷肸肹肺肻肼肽肾肿
    80C0 胀胁胂胃胄胅胆胇胈胉胊胋背胍胎胏胐胑胒胓胔胕胖胗胘胙胚胛胜胝胞胟
    80E0 胠胡胢胣胤胥胦胧胨胩胪胫胬胭胮胯胰胱胲胳胴胵胶胷胸胹胺胻胼能胾胿
    8100 脀脁脂脃脄脅脆脇脈脉脊脋脌脍脎脏脐脑脒脓脔脕脖脗脘脙脚脛脜脝脞脟
    8120 脠脡脢脣脤脥脦脧脨脩脪脫脬脭脮脯脰脱脲脳脴脵脶脷脸脹脺脻脼脽脾脿
    8140 腀腁腂腃腄腅腆腇腈腉腊腋腌腍腎腏腐腑腒腓腔腕腖腗腘腙腚腛腜腝腞腟
    8160 腠腡腢腣腤腥腦腧腨腩腪腫腬腭腮腯腰腱腲腳腴腵腶腷腸腹腺腻腼腽腾腿
    8180 膀膁膂膃膄膅膆膇膈膉膊膋膌膍膎膏膐膑膒膓膔膕膖膗膘膙膚膛膜膝膞膟
    81A0 膠膡膢膣膤膥膦膧膨膩膪膫膬膭膮膯膰膱膲膳膴膵膶膷膸膹膺膻膼膽膾膿
    81C0 臀臁臂臃臄臅臆臇臈臉臊臋臌臍臎臏臐臑臒臓臔臕臖臗臘臙臚臛臜臝臞臟
    81E0 臠臡臢臣臤臥臦臧臨臩自臫臬臭臮臯臰臱臲至致臵臶臷臸臹臺臻臼臽臾臿
    8200 舀舁舂舃舄舅舆與興舉舊舋舌舍舎舏舐舑舒舓舔舕舖舗舘舙舚舛舜舝舞舟
    8220 舠舡舢舣舤舥舦舧舨舩航舫般舭舮舯舰舱舲舳舴舵舶舷舸船舺舻舼舽舾舿
    8240 艀艁艂艃艄艅艆艇艈艉艊艋艌艍艎艏艐艑艒艓艔艕艖艗艘艙艚艛艜艝艞艟
    8260 艠艡艢艣艤艥艦艧艨艩艪艫艬艭艮良艰艱色艳艴艵艶艷艸艹艺艻艼艽艾艿
    8280 芀芁节芃芄芅芆芇芈芉芊芋芌芍芎芏芐芑芒芓芔芕芖芗芘芙芚芛芜芝芞芟
    82A0 芠芡芢芣芤芥芦芧芨芩芪芫芬芭芮芯芰花芲芳芴芵芶芷芸芹芺芻芼芽芾芿
    82C0 苀苁苂苃苄苅苆苇苈苉苊苋苌苍苎苏苐苑苒苓苔苕苖苗苘苙苚苛苜苝苞苟
    82E0 苠苡苢苣苤若苦苧苨苩苪苫苬苭苮苯苰英苲苳苴苵苶苷苸苹苺苻苼苽苾苿
    8300 茀茁茂范茄茅茆茇茈茉茊茋茌茍茎茏茐茑茒茓茔茕茖茗茘茙茚茛茜茝茞茟
    8320 茠茡茢茣茤茥茦茧茨茩茪茫茬茭茮茯茰茱茲茳茴茵茶茷茸茹茺茻茼茽茾茿
    8340 荀荁荂荃荄荅荆荇荈草荊荋荌荍荎荏荐荑荒荓荔荕荖荗荘荙荚荛荜荝荞荟
    8360 荠荡荢荣荤荥荦荧荨荩荪荫荬荭荮药荰荱荲荳荴荵荶荷荸荹荺荻荼荽荾荿
    8380 莀莁莂莃莄莅莆莇莈莉莊莋莌莍莎莏莐莑莒莓莔莕莖莗莘莙莚莛莜莝莞莟
    83A0 莠莡莢莣莤莥莦莧莨莩莪莫莬莭莮莯莰莱莲莳莴莵莶获莸莹莺莻莼莽莾莿
    83C0 菀菁菂菃菄菅菆菇菈菉菊菋菌菍菎菏菐菑菒菓菔菕菖菗菘菙菚菛菜菝菞菟
    83E0 菠菡菢菣菤菥菦菧菨菩菪菫菬菭菮華菰菱菲菳菴菵菶菷菸菹菺菻菼菽菾菿
    8400 萀萁萂萃萄萅萆萇萈萉萊萋萌萍萎萏萐萑萒萓萔萕萖萗萘萙萚萛萜萝萞萟
    8420 萠萡萢萣萤营萦萧萨萩萪萫萬萭萮萯萰萱萲萳萴萵萶萷萸萹萺萻萼落萾萿
    8440 葀葁葂葃葄葅葆葇葈葉葊葋葌葍葎葏葐葑葒葓葔葕葖著葘葙葚葛葜葝葞葟
    8460 葠葡葢董葤葥葦葧葨葩葪葫葬葭葮葯葰葱葲葳葴葵葶葷葸葹葺葻葼葽葾葿
    8480 蒀蒁蒂蒃蒄蒅蒆蒇蒈蒉蒊蒋蒌蒍蒎蒏蒐蒑蒒蒓蒔蒕蒖蒗蒘蒙蒚蒛蒜蒝蒞蒟
    84A0 蒠蒡蒢蒣蒤蒥蒦蒧蒨蒩蒪蒫蒬蒭蒮蒯蒰蒱蒲蒳蒴蒵蒶蒷蒸蒹蒺蒻蒼蒽蒾蒿
    84C0 蓀蓁蓂蓃蓄蓅蓆蓇蓈蓉蓊蓋蓌蓍蓎蓏蓐蓑蓒蓓蓔蓕蓖蓗蓘蓙蓚蓛蓜蓝蓞蓟
    84E0 蓠蓡蓢蓣蓤蓥蓦蓧蓨蓩蓪蓫蓬蓭蓮蓯蓰蓱蓲蓳蓴蓵蓶蓷蓸蓹蓺蓻蓼蓽蓾蓿
    8500 蔀蔁蔂蔃蔄蔅蔆蔇蔈蔉蔊蔋蔌蔍蔎蔏蔐蔑蔒蔓蔔蔕蔖蔗蔘蔙蔚蔛蔜蔝蔞蔟
    8520 蔠蔡蔢蔣蔤蔥蔦蔧蔨蔩蔪蔫蔬蔭蔮蔯蔰蔱蔲蔳蔴蔵蔶蔷蔸蔹蔺蔻蔼蔽蔾蔿
    8540 蕀蕁蕂蕃蕄蕅蕆蕇蕈蕉蕊蕋蕌蕍蕎蕏蕐蕑蕒蕓蕔蕕蕖蕗蕘蕙蕚蕛蕜蕝蕞蕟
    8560 蕠蕡蕢蕣蕤蕥蕦蕧蕨蕩蕪蕫蕬蕭蕮蕯蕰蕱蕲蕳蕴蕵蕶蕷蕸蕹蕺蕻蕼蕽蕾蕿
    8580 薀薁薂薃薄薅薆薇薈薉薊薋薌薍薎薏薐薑薒薓薔薕薖薗薘薙薚薛薜薝薞薟
    85A0 薠薡薢薣薤薥薦薧薨薩薪薫薬薭薮薯薰薱薲薳薴薵薶薷薸薹薺薻薼薽薾薿
    85C0 藀藁藂藃藄藅藆藇藈藉藊藋藌藍藎藏藐藑藒藓藔藕藖藗藘藙藚藛藜藝藞藟
    85E0 藠藡藢藣藤藥藦藧藨藩藪藫藬藭藮藯藰藱藲藳藴藵藶藷藸藹藺藻藼藽藾藿
    8600 蘀蘁蘂蘃蘄蘅蘆蘇蘈蘉蘊蘋蘌蘍蘎蘏蘐蘑蘒蘓蘔蘕蘖蘗蘘蘙蘚蘛蘜蘝蘞蘟
    8620 蘠蘡蘢蘣蘤蘥蘦蘧蘨蘩蘪蘫蘬蘭蘮蘯蘰蘱蘲蘳蘴蘵蘶蘷蘸蘹蘺蘻蘼蘽蘾蘿
    8640 虀虁虂虃虄虅虆虇虈虉虊虋虌虍虎虏虐虑虒虓虔處虖虗虘虙虚虛虜虝虞號
    8660 虠虡虢虣虤虥虦虧虨虩虪虫虬虭虮虯虰虱虲虳虴虵虶虷虸虹虺虻虼虽虾虿
    8680 蚀蚁蚂蚃蚄蚅蚆蚇蚈蚉蚊蚋蚌蚍蚎蚏蚐蚑蚒蚓蚔蚕蚖蚗蚘蚙蚚蚛蚜蚝蚞蚟
    86A0 蚠蚡蚢蚣蚤蚥蚦蚧蚨蚩蚪蚫蚬蚭蚮蚯蚰蚱蚲蚳蚴蚵蚶蚷蚸蚹蚺蚻蚼蚽蚾蚿
    86C0 蛀蛁蛂蛃蛄蛅蛆蛇蛈蛉蛊蛋蛌蛍蛎蛏蛐蛑蛒蛓蛔蛕蛖蛗蛘蛙蛚蛛蛜蛝蛞蛟
    86E0 蛠蛡蛢蛣蛤蛥蛦蛧蛨蛩蛪蛫蛬蛭蛮蛯蛰蛱蛲蛳蛴蛵蛶蛷蛸蛹蛺蛻蛼蛽蛾蛿
    8700 蜀蜁蜂蜃蜄蜅蜆蜇蜈蜉蜊蜋蜌蜍蜎蜏蜐蜑蜒蜓蜔蜕蜖蜗蜘蜙蜚蜛蜜蜝蜞蜟
    8720 蜠蜡蜢蜣蜤蜥蜦蜧蜨蜩蜪蜫蜬蜭蜮蜯蜰蜱蜲蜳蜴蜵蜶蜷蜸蜹蜺蜻蜼蜽蜾蜿
    8740 蝀蝁蝂蝃蝄蝅蝆蝇蝈蝉蝊蝋蝌蝍蝎蝏蝐蝑蝒蝓蝔蝕蝖蝗蝘蝙蝚蝛蝜蝝蝞蝟
    8760 蝠蝡蝢蝣蝤蝥蝦蝧蝨蝩蝪蝫蝬蝭蝮蝯蝰蝱蝲蝳蝴蝵蝶蝷蝸蝹蝺蝻蝼蝽蝾蝿
    8780 螀螁螂螃螄螅螆螇螈螉螊螋螌融螎螏螐螑螒螓螔螕螖螗螘螙螚螛螜螝螞螟
    87A0 螠螡螢螣螤螥螦螧螨螩螪螫螬螭螮螯螰螱螲螳螴螵螶螷螸螹螺螻螼螽螾螿
    87C0 蟀蟁蟂蟃蟄蟅蟆蟇蟈蟉蟊蟋蟌蟍蟎蟏蟐蟑蟒蟓蟔蟕蟖蟗蟘蟙蟚蟛蟜蟝蟞蟟
    87E0 蟠蟡蟢蟣蟤蟥蟦蟧蟨蟩蟪蟫蟬蟭蟮蟯蟰蟱蟲蟳蟴蟵蟶蟷蟸蟹蟺蟻蟼蟽蟾蟿
    8800 蠀蠁蠂蠃蠄蠅蠆蠇蠈蠉蠊蠋蠌蠍蠎蠏蠐蠑蠒蠓蠔蠕蠖蠗蠘蠙蠚蠛蠜蠝蠞蠟
    8820 蠠蠡蠢蠣蠤蠥蠦蠧蠨蠩蠪蠫蠬蠭蠮蠯蠰蠱蠲蠳蠴蠵蠶蠷蠸蠹蠺蠻蠼蠽蠾蠿
    8840 血衁衂衃衄衅衆衇衈衉衊衋行衍衎衏衐衑衒術衔衕衖街衘衙衚衛衜衝衞衟
    8860 衠衡衢衣衤补衦衧表衩衪衫衬衭衮衯衰衱衲衳衴衵衶衷衸衹衺衻衼衽衾衿
    8880 袀袁袂袃袄袅袆袇袈袉袊袋袌袍袎袏袐袑袒袓袔袕袖袗袘袙袚袛袜袝袞袟
    88A0 袠袡袢袣袤袥袦袧袨袩袪被袬袭袮袯袰袱袲袳袴袵袶袷袸袹袺袻袼袽袾袿
    88C0 裀裁裂裃裄装裆裇裈裉裊裋裌裍裎裏裐裑裒裓裔裕裖裗裘裙裚裛補裝裞裟
    88E0 裠裡裢裣裤裥裦裧裨裩裪裫裬裭裮裯裰裱裲裳裴裵裶裷裸裹裺裻裼製裾裿
    8900 褀褁褂褃褄褅褆複褈褉褊褋褌褍褎褏褐褑褒褓褔褕褖褗褘褙褚褛褜褝褞褟
    8920 褠褡褢褣褤褥褦褧褨褩褪褫褬褭褮褯褰褱褲褳褴褵褶褷褸褹褺褻褼褽褾褿
    8940 襀襁襂襃襄襅襆襇襈襉襊襋襌襍襎襏襐襑襒襓襔襕襖襗襘襙襚襛襜襝襞襟
    8960 襠襡襢襣襤襥襦襧襨襩襪襫襬襭襮襯襰襱襲襳襴襵襶襷襸襹襺襻襼襽襾西
    8980 覀要覂覃覄覅覆覇覈覉覊見覌覍覎規覐覑覒覓覔覕視覗覘覙覚覛覜覝覞覟
    89A0 覠覡覢覣覤覥覦覧覨覩親覫覬覭覮覯覰覱覲観覴覵覶覷覸覹覺覻覼覽覾覿
    89C0 觀见观觃规觅视觇览觉觊觋觌觍觎觏觐觑角觓觔觕觖觗觘觙觚觛觜觝觞觟
    89E0 觠觡觢解觤觥触觧觨觩觪觫觬觭觮觯觰觱觲觳觴觵觶觷觸觹觺觻觼觽觾觿
    8A00 言訁訂訃訄訅訆訇計訉訊訋訌訍討訏訐訑訒訓訔訕訖託記訙訚訛訜訝訞訟
    8A20 訠訡訢訣訤訥訦訧訨訩訪訫訬設訮訯訰許訲訳訴訵訶訷訸訹診註証訽訾訿
    8A40 詀詁詂詃詄詅詆詇詈詉詊詋詌詍詎詏詐詑詒詓詔評詖詗詘詙詚詛詜詝詞詟
    8A60 詠詡詢詣詤詥試詧詨詩詪詫詬詭詮詯詰話該詳詴詵詶詷詸詹詺詻詼詽詾詿
    8A80 誀誁誂誃誄誅誆誇誈誉誊誋誌認誎誏誐誑誒誓誔誕誖誗誘誙誚誛誜誝語誟
    8AA0 誠誡誢誣誤誥誦誧誨誩說誫説読誮誯誰誱課誳誴誵誶誷誸誹誺誻誼誽誾調
    8AC0 諀諁諂諃諄諅諆談諈諉諊請諌諍諎諏諐諑諒諓諔諕論諗諘諙諚諛諜諝諞諟
    8AE0 諠諡諢諣諤諥諦諧諨諩諪諫諬諭諮諯諰諱諲諳諴諵諶諷諸諹諺諻諼諽諾諿
    8B00 謀謁謂謃謄謅謆謇謈謉謊謋謌謍謎謏謐謑謒謓謔謕謖謗謘謙謚講謜謝謞謟
    8B20 謠謡謢謣謤謥謦謧謨謩謪謫謬謭謮謯謰謱謲謳謴謵謶謷謸謹謺謻謼謽謾謿
    8B40 譀譁譂譃譄譅譆譇譈證譊譋譌譍譎譏譐譑譒譓譔譕譖譗識譙譚譛譜譝譞譟
    8B60 譠譡譢譣譤譥警譧譨譩譪譫譬譭譮譯議譱譲譳譴譵譶護譸譹譺譻譼譽譾譿
    8B80 讀讁讂讃讄讅讆讇讈讉變讋讌讍讎讏讐讑讒讓讔讕讖讗讘讙讚讛讜讝讞讟
    8BA0 讠计订讣认讥讦讧讨让讪讫讬训议讯记讱讲讳讴讵讶讷许讹论讻讼讽设访
    8BC0 诀证诂诃评诅识诇诈诉诊诋诌词诎诏诐译诒诓诔试诖诗诘诙诚诛诜话诞诟
    8BE0 诠诡询诣诤该详诧诨诩诪诫诬语诮误诰诱诲诳说诵诶请诸诹诺读诼诽课诿
    8C00 谀谁谂调谄谅谆谇谈谉谊谋谌谍谎谏谐谑谒谓谔谕谖谗谘谙谚谛谜谝谞谟
    8C20 谠谡谢谣谤谥谦谧谨谩谪谫谬谭谮谯谰谱谲谳谴谵谶谷谸谹谺谻谼谽谾谿
    8C40 豀豁豂豃豄豅豆豇豈豉豊豋豌豍豎豏豐豑豒豓豔豕豖豗豘豙豚豛豜豝豞豟
    8C60 豠象豢豣豤豥豦豧豨豩豪豫豬豭豮豯豰豱豲豳豴豵豶豷豸豹豺豻豼豽豾豿
    8C80 貀貁貂貃貄貅貆貇貈貉貊貋貌貍貎貏貐貑貒貓貔貕貖貗貘貙貚貛貜貝貞貟
    8CA0 負財貢貣貤貥貦貧貨販貪貫責貭貮貯貰貱貲貳貴貵貶買貸貹貺費貼貽貾貿
    8CC0 賀賁賂賃賄賅賆資賈賉賊賋賌賍賎賏賐賑賒賓賔賕賖賗賘賙賚賛賜賝賞賟
    8CE0 賠賡賢賣賤賥賦賧賨賩質賫賬賭賮賯賰賱賲賳賴賵賶賷賸賹賺賻購賽賾賿
    8D00 贀贁贂贃贄贅贆贇贈贉贊贋贌贍贎贏贐贑贒贓贔贕贖贗贘贙贚贛贜贝贞负
    8D20 贠贡财责贤败账货质贩贪贫贬购贮贯贰贱贲贳贴贵贶贷贸费贺贻贼贽贾贿
    8D40 赀赁赂赃资赅赆赇赈赉赊赋赌赍赎赏赐赑赒赓赔赕赖赗赘赙赚赛赜赝赞赟
    8D60 赠赡赢赣赤赥赦赧赨赩赪赫赬赭赮赯走赱赲赳赴赵赶起赸赹赺赻赼赽赾赿
    8D80 趀趁趂趃趄超趆趇趈趉越趋趌趍趎趏趐趑趒趓趔趕趖趗趘趙趚趛趜趝趞趟
    8DA0 趠趡趢趣趤趥趦趧趨趩趪趫趬趭趮趯趰趱趲足趴趵趶趷趸趹趺趻趼趽趾趿
    8DC0 跀跁跂跃跄跅跆跇跈跉跊跋跌跍跎跏跐跑跒跓跔跕跖跗跘跙跚跛跜距跞跟
    8DE0 跠跡跢跣跤跥跦跧跨跩跪跫跬跭跮路跰跱跲跳跴践跶跷跸跹跺跻跼跽跾跿
    8E00 踀踁踂踃踄踅踆踇踈踉踊踋踌踍踎踏踐踑踒踓踔踕踖踗踘踙踚踛踜踝踞踟
    8E20 踠踡踢踣踤踥踦踧踨踩踪踫踬踭踮踯踰踱踲踳踴踵踶踷踸踹踺踻踼踽踾踿
    8E40 蹀蹁蹂蹃蹄蹅蹆蹇蹈蹉蹊蹋蹌蹍蹎蹏蹐蹑蹒蹓蹔蹕蹖蹗蹘蹙蹚蹛蹜蹝蹞蹟
    8E60 蹠蹡蹢蹣蹤蹥蹦蹧蹨蹩蹪蹫蹬蹭蹮蹯蹰蹱蹲蹳蹴蹵蹶蹷蹸蹹蹺蹻蹼蹽蹾蹿
    8E80 躀躁躂躃躄躅躆躇躈躉躊躋躌躍躎躏躐躑躒躓躔躕躖躗躘躙躚躛躜躝躞躟
    8EA0 躠躡躢躣躤躥躦躧躨躩躪身躬躭躮躯躰躱躲躳躴躵躶躷躸躹躺躻躼躽躾躿
    8EC0 軀軁軂軃軄軅軆軇軈軉車軋軌軍軎軏軐軑軒軓軔軕軖軗軘軙軚軛軜軝軞軟
    8EE0 軠軡転軣軤軥軦軧軨軩軪軫軬軭軮軯軰軱軲軳軴軵軶軷軸軹軺軻軼軽軾軿
    8F00 輀輁輂較輄輅輆輇輈載輊輋輌輍輎輏輐輑輒輓輔輕輖輗輘輙輚輛輜輝輞輟
    8F20 輠輡輢輣輤輥輦輧輨輩輪輫輬輭輮輯輰輱輲輳輴輵輶輷輸輹輺輻輼輽輾輿
    8F40 轀轁轂轃轄轅轆轇轈轉轊轋轌轍轎轏轐轑轒轓轔轕轖轗轘轙轚轛轜轝轞轟
    8F60 轠轡轢轣轤轥车轧轨轩轪轫转轭轮软轰轱轲轳轴轵轶轷轸轹轺轻轼载轾轿
    8F80 辀辁辂较辄辅辆辇辈辉辊辋辌辍辎辏辐辑辒输辔辕辖辗辘辙辚辛辜辝辞辟
    8FA0 辠辡辢辣辤辥辦辧辨辩辪辫辬辭辮辯辰辱農辳辴辵辶辷辸边辺辻込辽达辿
    8FC0 迀迁迂迃迄迅迆过迈迉迊迋迌迍迎迏运近迒迓返迕迖迗还这迚进远违连迟
    8FE0 迠迡迢迣迤迥迦迧迨迩迪迫迬迭迮迯述迱迲迳迴迵迶迷迸迹迺迻迼追迾迿
    9000 退送适逃逄逅逆逇逈选逊逋逌逍逎透逐逑递逓途逕逖逗逘這通逛逜逝逞速
    9020 造逡逢連逤逥逦逧逨逩逪逫逬逭逮逯逰週進逳逴逵逶逷逸逹逺逻逼逽逾逿
    9040 遀遁遂遃遄遅遆遇遈遉遊運遌遍過遏遐遑遒道達違遖遗遘遙遚遛遜遝遞遟
    9060 遠遡遢遣遤遥遦遧遨適遪遫遬遭遮遯遰遱遲遳遴遵遶遷選遹遺遻遼遽遾避
    9080 邀邁邂邃還邅邆邇邈邉邊邋邌邍邎邏邐邑邒邓邔邕邖邗邘邙邚邛邜邝邞邟
    90A0 邠邡邢那邤邥邦邧邨邩邪邫邬邭邮邯邰邱邲邳邴邵邶邷邸邹邺邻邼邽邾邿
    90C0 郀郁郂郃郄郅郆郇郈郉郊郋郌郍郎郏郐郑郒郓郔郕郖郗郘郙郚郛郜郝郞郟
    90E0 郠郡郢郣郤郥郦郧部郩郪郫郬郭郮郯郰郱郲郳郴郵郶郷郸郹郺郻郼都郾郿
    9100 鄀鄁鄂鄃鄄鄅鄆鄇鄈鄉鄊鄋鄌鄍鄎鄏鄐鄑鄒鄓鄔鄕鄖鄗鄘鄙鄚鄛鄜鄝鄞鄟
    9120 鄠鄡鄢鄣鄤鄥鄦鄧鄨鄩鄪鄫鄬鄭鄮鄯鄰鄱鄲鄳鄴鄵鄶鄷鄸鄹鄺鄻鄼鄽鄾鄿
    9140 酀酁酂酃酄酅酆酇酈酉酊酋酌配酎酏酐酑酒酓酔酕酖酗酘酙酚酛酜酝酞酟
    9160 酠酡酢酣酤酥酦酧酨酩酪酫酬酭酮酯酰酱酲酳酴酵酶酷酸酹酺酻酼酽酾酿
    9180 醀醁醂醃醄醅醆醇醈醉醊醋醌醍醎醏醐醑醒醓醔醕醖醗醘醙醚醛醜醝醞醟
    91A0 醠醡醢醣醤醥醦醧醨醩醪醫醬醭醮醯醰醱醲醳醴醵醶醷醸醹醺醻醼醽醾醿
    91C0 釀釁釂釃釄釅釆采釈釉释釋里重野量釐金釒釓釔釕釖釗釘釙釚釛釜針釞釟
    91E0 釠釡釢釣釤釥釦釧釨釩釪釫釬釭釮釯釰釱釲釳釴釵釶釷釸釹釺釻釼釽釾釿
    9200 鈀鈁鈂鈃鈄鈅鈆鈇鈈鈉鈊鈋鈌鈍鈎鈏鈐鈑鈒鈓鈔鈕鈖鈗鈘鈙鈚鈛鈜鈝鈞鈟
    9220 鈠鈡鈢鈣鈤鈥鈦鈧鈨鈩鈪鈫鈬鈭鈮鈯鈰鈱鈲鈳鈴鈵鈶鈷鈸鈹鈺鈻鈼鈽鈾鈿
    9240 鉀鉁鉂鉃鉄鉅鉆鉇鉈鉉鉊鉋鉌鉍鉎鉏鉐鉑鉒鉓鉔鉕鉖鉗鉘鉙鉚鉛鉜鉝鉞鉟
    9260 鉠鉡鉢鉣鉤鉥鉦鉧鉨鉩鉪鉫鉬鉭鉮鉯鉰鉱鉲鉳鉴鉵鉶鉷鉸鉹鉺鉻鉼鉽鉾鉿
    9280 銀銁銂銃銄銅銆銇銈銉銊銋銌銍銎銏銐銑銒銓銔銕銖銗銘銙銚銛銜銝銞銟
    92A0 銠銡銢銣銤銥銦銧銨銩銪銫銬銭銮銯銰銱銲銳銴銵銶銷銸銹銺銻銼銽銾銿
    92C0 鋀鋁鋂鋃鋄鋅鋆鋇鋈鋉鋊鋋鋌鋍鋎鋏鋐鋑鋒鋓鋔鋕鋖鋗鋘鋙鋚鋛鋜鋝鋞鋟
    92E0 鋠鋡鋢鋣鋤鋥鋦鋧鋨鋩鋪鋫鋬鋭鋮鋯鋰鋱鋲鋳鋴鋵鋶鋷鋸鋹鋺鋻鋼鋽鋾鋿
    9300 錀錁錂錃錄錅錆錇錈錉錊錋錌錍錎錏錐錑錒錓錔錕錖錗錘錙錚錛錜錝錞錟
    9320 錠錡錢錣錤錥錦錧錨錩錪錫錬錭錮錯錰錱録錳錴錵錶錷錸錹錺錻錼錽錾錿
    9340 鍀鍁鍂鍃鍄鍅鍆鍇鍈鍉鍊鍋鍌鍍鍎鍏鍐鍑鍒鍓鍔鍕鍖鍗鍘鍙鍚鍛鍜鍝鍞鍟
    9360 鍠鍡鍢鍣鍤鍥鍦鍧鍨鍩鍪鍫鍬鍭鍮鍯鍰鍱鍲鍳鍴鍵鍶鍷鍸鍹鍺鍻鍼鍽鍾鍿
    9380 鎀鎁鎂鎃鎄鎅鎆鎇鎈鎉鎊鎋鎌鎍鎎鎏鎐鎑鎒鎓鎔鎕鎖鎗鎘鎙鎚鎛鎜鎝鎞鎟
    93A0 鎠鎡鎢鎣鎤鎥鎦鎧鎨鎩鎪鎫鎬鎭鎮鎯鎰鎱鎲鎳鎴鎵鎶鎷鎸鎹鎺鎻鎼鎽鎾鎿
    93C0 鏀鏁鏂鏃鏄鏅鏆鏇鏈鏉鏊鏋鏌鏍鏎鏏鏐鏑鏒鏓鏔鏕鏖鏗鏘鏙鏚鏛鏜鏝鏞鏟
    93E0 鏠鏡鏢鏣鏤鏥鏦鏧鏨鏩鏪鏫鏬鏭鏮鏯鏰鏱鏲鏳鏴鏵鏶鏷鏸鏹鏺鏻鏼鏽鏾鏿
    9400 鐀鐁鐂鐃鐄鐅鐆鐇鐈鐉鐊鐋鐌鐍鐎鐏鐐鐑鐒鐓鐔鐕鐖鐗鐘鐙鐚鐛鐜鐝鐞鐟
    9420 鐠鐡鐢鐣鐤鐥鐦鐧鐨鐩鐪鐫鐬鐭鐮鐯鐰鐱鐲鐳鐴鐵鐶鐷鐸鐹鐺鐻鐼鐽鐾鐿
    9440 鑀鑁鑂鑃鑄鑅鑆鑇鑈鑉鑊鑋鑌鑍鑎鑏鑐鑑鑒鑓鑔鑕鑖鑗鑘鑙鑚鑛鑜鑝鑞鑟
    9460 鑠鑡鑢鑣鑤鑥鑦鑧鑨鑩鑪鑫鑬鑭鑮鑯鑰鑱鑲鑳鑴鑵鑶鑷鑸鑹鑺鑻鑼鑽鑾鑿
    9480 钀钁钂钃钄钅钆钇针钉钊钋钌钍钎钏钐钑钒钓钔钕钖钗钘钙钚钛钜钝钞钟
    94A0 钠钡钢钣钤钥钦钧钨钩钪钫钬钭钮钯钰钱钲钳钴钵钶钷钸钹钺钻钼钽钾钿
    94C0 铀铁铂铃铄铅铆铇铈铉铊铋铌铍铎铏铐铑铒铓铔铕铖铗铘铙铚铛铜铝铞铟
    94E0 铠铡铢铣铤铥铦铧铨铩铪铫铬铭铮铯铰铱铲铳铴铵银铷铸铹铺铻铼铽链铿
    9500 销锁锂锃锄锅锆锇锈锉锊锋锌锍锎锏锐锑锒锓锔锕锖锗锘错锚锛锜锝锞锟
    9520 锠锡锢锣锤锥锦锧锨锩锪锫锬锭键锯锰锱锲锳锴锵锶锷锸锹锺锻锼锽锾锿
    9540 镀镁镂镃镄镅镆镇镈镉镊镋镌镍镎镏镐镑镒镓镔镕镖镗镘镙镚镛镜镝镞镟
    9560 镠镡镢镣镤镥镦镧镨镩镪镫镬镭镮镯镰镱镲镳镴镵镶長镸镹镺镻镼镽镾长
    9580 門閁閂閃閄閅閆閇閈閉閊開閌閍閎閏閐閑閒間閔閕閖閗閘閙閚閛閜閝閞閟
    95A0 閠閡関閣閤閥閦閧閨閩閪閫閬閭閮閯閰閱閲閳閴閵閶閷閸閹閺閻閼閽閾閿
    95C0 闀闁闂闃闄闅闆闇闈闉闊闋闌闍闎闏闐闑闒闓闔闕闖闗闘闙闚闛關闝闞闟
    95E0 闠闡闢闣闤闥闦闧门闩闪闫闬闭问闯闰闱闲闳间闵闶闷闸闹闺闻闼闽闾闿
    9600 阀阁阂阃阄阅阆阇阈阉阊阋阌阍阎阏阐阑阒阓阔阕阖阗阘阙阚阛阜阝阞队
    9620 阠阡阢阣阤阥阦阧阨阩阪阫阬阭阮阯阰阱防阳阴阵阶阷阸阹阺阻阼阽阾阿
    9640 陀陁陂陃附际陆陇陈陉陊陋陌降陎陏限陑陒陓陔陕陖陗陘陙陚陛陜陝陞陟
    9660 陠陡院陣除陥陦陧陨险陪陫陬陭陮陯陰陱陲陳陴陵陶陷陸陹険陻陼陽陾陿
    9680 隀隁隂隃隄隅隆隇隈隉隊隋隌隍階随隐隑隒隓隔隕隖隗隘隙隚際障隝隞隟
    96A0 隠隡隢隣隤隥隦隧隨隩險隫隬隭隮隯隰隱隲隳隴隵隶隷隸隹隺隻隼隽难隿
    96C0 雀雁雂雃雄雅集雇雈雉雊雋雌雍雎雏雐雑雒雓雔雕雖雗雘雙雚雛雜雝雞雟
    96E0 雠雡離難雤雥雦雧雨雩雪雫雬雭雮雯雰雱雲雳雴雵零雷雸雹雺電雼雽雾雿
    9700 需霁霂霃霄霅霆震霈霉霊霋霌霍霎霏霐霑霒霓霔霕霖霗霘霙霚霛霜霝霞霟
    9720 霠霡霢霣霤霥霦霧霨霩霪霫霬霭霮霯霰霱露霳霴霵霶霷霸霹霺霻霼霽霾霿
    9740 靀靁靂靃靄靅靆靇靈靉靊靋靌靍靎靏靐靑青靓靔靕靖靗靘静靚靛靜靝非靟
    9760 靠靡面靣靤靥靦靧靨革靪靫靬靭靮靯靰靱靲靳靴靵靶靷靸靹靺靻靼靽靾靿
    9780 鞀鞁鞂鞃鞄鞅鞆鞇鞈鞉鞊鞋鞌鞍鞎鞏鞐鞑鞒鞓鞔鞕鞖鞗鞘鞙鞚鞛鞜鞝鞞鞟
    97A0 鞠鞡鞢鞣鞤鞥鞦鞧鞨鞩鞪鞫鞬鞭鞮鞯鞰鞱鞲鞳鞴鞵鞶鞷鞸鞹鞺鞻鞼鞽鞾鞿
    97C0 韀韁韂韃韄韅韆韇韈韉韊韋韌韍韎韏韐韑韒韓韔韕韖韗韘韙韚韛韜韝韞韟
    97E0 韠韡韢韣韤韥韦韧韨韩韪韫韬韭韮韯韰韱韲音韴韵韶韷韸韹韺韻韼韽韾響
    9800 頀頁頂頃頄項順頇須頉頊頋頌頍頎頏預頑頒頓頔頕頖頗領頙頚頛頜頝頞頟
    9820 頠頡頢頣頤頥頦頧頨頩頪頫頬頭頮頯頰頱頲頳頴頵頶頷頸頹頺頻頼頽頾頿
    9840 顀顁顂顃顄顅顆顇顈顉顊顋題額顎顏顐顑顒顓顔顕顖顗願顙顚顛顜顝類顟
    9860 顠顡顢顣顤顥顦顧顨顩顪顫顬顭顮顯顰顱顲顳顴页顶顷顸项顺须顼顽顾顿
    9880 颀颁颂颃预颅领颇颈颉颊颋颌颍颎颏颐频颒颓颔颕颖颗题颙颚颛颜额颞颟
    98A0 颠颡颢颣颤颥颦颧風颩颪颫颬颭颮颯颰颱颲颳颴颵颶颷颸颹颺颻颼颽颾颿
    98C0 飀飁飂飃飄飅飆飇飈飉飊飋飌飍风飏飐飑飒飓飔飕飖飗飘飙飚飛飜飝飞食
    98E0 飠飡飢飣飤飥飦飧飨飩飪飫飬飭飮飯飰飱飲飳飴飵飶飷飸飹飺飻飼飽飾飿
    9900 餀餁餂餃餄餅餆餇餈餉養餋餌餍餎餏餐餑餒餓餔餕餖餗餘餙餚餛餜餝餞餟
    9920 餠餡餢餣餤餥餦餧館餩餪餫餬餭餮餯餰餱餲餳餴餵餶餷餸餹餺餻餼餽餾餿
    9940 饀饁饂饃饄饅饆饇饈饉饊饋饌饍饎饏饐饑饒饓饔饕饖饗饘饙饚饛饜饝饞饟
    9960 饠饡饢饣饤饥饦饧饨饩饪饫饬饭饮饯饰饱饲饳饴饵饶饷饸饹饺饻饼饽饾饿
    9980 馀馁馂馃馄馅馆馇馈馉馊馋馌馍馎馏馐馑馒馓馔馕首馗馘香馚馛馜馝馞馟
    99A0 馠馡馢馣馤馥馦馧馨馩馪馫馬馭馮馯馰馱馲馳馴馵馶馷馸馹馺馻馼馽馾馿
    99C0 駀駁駂駃駄駅駆駇駈駉駊駋駌駍駎駏駐駑駒駓駔駕駖駗駘駙駚駛駜駝駞駟
    99E0 駠駡駢駣駤駥駦駧駨駩駪駫駬駭駮駯駰駱駲駳駴駵駶駷駸駹駺駻駼駽駾駿
    9A00 騀騁騂騃騄騅騆騇騈騉騊騋騌騍騎騏騐騑騒験騔騕騖騗騘騙騚騛騜騝騞騟
    9A20 騠騡騢騣騤騥騦騧騨騩騪騫騬騭騮騯騰騱騲騳騴騵騶騷騸騹騺騻騼騽騾騿
    9A40 驀驁驂驃驄驅驆驇驈驉驊驋驌驍驎驏驐驑驒驓驔驕驖驗驘驙驚驛驜驝驞驟
    9A60 驠驡驢驣驤驥驦驧驨驩驪驫马驭驮驯驰驱驲驳驴驵驶驷驸驹驺驻驼驽驾驿
    9A80 骀骁骂骃骄骅骆骇骈骉骊骋验骍骎骏骐骑骒骓骔骕骖骗骘骙骚骛骜骝骞骟
    9AA0 骠骡骢骣骤骥骦骧骨骩骪骫骬骭骮骯骰骱骲骳骴骵骶骷骸骹骺骻骼骽骾骿
    9AC0 髀髁髂髃髄髅髆髇髈髉髊髋髌髍髎髏髐髑髒髓體髕髖髗高髙髚髛髜髝髞髟
    9AE0 髠髡髢髣髤髥髦髧髨髩髪髫髬髭髮髯髰髱髲髳髴髵髶髷髸髹髺髻髼髽髾髿
    9B00 鬀鬁鬂鬃鬄鬅鬆鬇鬈鬉鬊鬋鬌鬍鬎鬏鬐鬑鬒鬓鬔鬕鬖鬗鬘鬙鬚鬛鬜鬝鬞鬟
    9B20 鬠鬡鬢鬣鬤鬥鬦鬧鬨鬩鬪鬫鬬鬭鬮鬯鬰鬱鬲鬳鬴鬵鬶鬷鬸鬹鬺鬻鬼鬽鬾鬿
    9B40 魀魁魂魃魄魅魆魇魈魉魊魋魌魍魎魏魐魑魒魓魔魕魖魗魘魙魚魛魜魝魞魟
    9B60 魠魡魢魣魤魥魦魧魨魩魪魫魬魭魮魯魰魱魲魳魴魵魶魷魸魹魺魻魼魽魾魿
    9B80 鮀鮁鮂鮃鮄鮅鮆鮇鮈鮉鮊鮋鮌鮍鮎鮏鮐鮑鮒鮓鮔鮕鮖鮗鮘鮙鮚鮛鮜鮝鮞鮟
    9BA0 鮠鮡鮢鮣鮤鮥鮦鮧鮨鮩鮪鮫鮬鮭鮮鮯鮰鮱鮲鮳鮴鮵鮶鮷鮸鮹鮺鮻鮼鮽鮾鮿
    9BC0 鯀鯁鯂鯃鯄鯅鯆鯇鯈鯉鯊鯋鯌鯍鯎鯏鯐鯑鯒鯓鯔鯕鯖鯗鯘鯙鯚鯛鯜鯝鯞鯟
    9BE0 鯠鯡鯢鯣鯤鯥鯦鯧鯨鯩鯪鯫鯬鯭鯮鯯鯰鯱鯲鯳鯴鯵鯶鯷鯸鯹鯺鯻鯼鯽鯾鯿
    9C00 鰀鰁鰂鰃鰄鰅鰆鰇鰈鰉鰊鰋鰌鰍鰎鰏鰐鰑鰒鰓鰔鰕鰖鰗鰘鰙鰚鰛鰜鰝鰞鰟
    9C20 鰠鰡鰢鰣鰤鰥鰦鰧鰨鰩鰪鰫鰬鰭鰮鰯鰰鰱鰲鰳鰴鰵鰶鰷鰸鰹鰺鰻鰼鰽鰾鰿
    9C40 鱀鱁鱂鱃鱄鱅鱆鱇鱈鱉鱊鱋鱌鱍鱎鱏鱐鱑鱒鱓鱔鱕鱖鱗鱘鱙鱚鱛鱜鱝鱞鱟
    9C60 鱠鱡鱢鱣鱤鱥鱦鱧鱨鱩鱪鱫鱬鱭鱮鱯鱰鱱鱲鱳鱴鱵鱶鱷鱸鱹鱺鱻鱼鱽鱾鱿
    9C80 鲀鲁鲂鲃鲄鲅鲆鲇鲈鲉鲊鲋鲌鲍鲎鲏鲐鲑鲒鲓鲔鲕鲖鲗鲘鲙鲚鲛鲜鲝鲞鲟
    9CA0 鲠鲡鲢鲣鲤鲥鲦鲧鲨鲩鲪鲫鲬鲭鲮鲯鲰鲱鲲鲳鲴鲵鲶鲷鲸鲹鲺鲻鲼鲽鲾鲿
    9CC0 鳀鳁鳂鳃鳄鳅鳆鳇鳈鳉鳊鳋鳌鳍鳎鳏鳐鳑鳒鳓鳔鳕鳖鳗鳘鳙鳚鳛鳜鳝鳞鳟
    9CE0 鳠鳡鳢鳣鳤鳥鳦鳧鳨鳩鳪鳫鳬鳭鳮鳯鳰鳱鳲鳳鳴鳵鳶鳷鳸鳹鳺鳻鳼鳽鳾鳿
    9D00 鴀鴁鴂鴃鴄鴅鴆鴇鴈鴉鴊鴋鴌鴍鴎鴏鴐鴑鴒鴓鴔鴕鴖鴗鴘鴙鴚鴛鴜鴝鴞鴟
    9D20 鴠鴡鴢鴣鴤鴥鴦鴧鴨鴩鴪鴫鴬鴭鴮鴯鴰鴱鴲鴳鴴鴵鴶鴷鴸鴹鴺鴻鴼鴽鴾鴿
    9D40 鵀鵁鵂鵃鵄鵅鵆鵇鵈鵉鵊鵋鵌鵍鵎鵏鵐鵑鵒鵓鵔鵕鵖鵗鵘鵙鵚鵛鵜鵝鵞鵟
    9D60 鵠鵡鵢鵣鵤鵥鵦鵧鵨鵩鵪鵫鵬鵭鵮鵯鵰鵱鵲鵳鵴鵵鵶鵷鵸鵹鵺鵻鵼鵽鵾鵿
    9D80 鶀鶁鶂鶃鶄鶅鶆鶇鶈鶉鶊鶋鶌鶍鶎鶏鶐鶑鶒鶓鶔鶕鶖鶗鶘鶙鶚鶛鶜鶝鶞鶟
    9DA0 鶠鶡鶢鶣鶤鶥鶦鶧鶨鶩鶪鶫鶬鶭鶮鶯鶰鶱鶲鶳鶴鶵鶶鶷鶸鶹鶺鶻鶼鶽鶾鶿
    9DC0 鷀鷁鷂鷃鷄鷅鷆鷇鷈鷉鷊鷋鷌鷍鷎鷏鷐鷑鷒鷓鷔鷕鷖鷗鷘鷙鷚鷛鷜鷝鷞鷟
    9DE0 鷠鷡鷢鷣鷤鷥鷦鷧鷨鷩鷪鷫鷬鷭鷮鷯鷰鷱鷲鷳鷴鷵鷶鷷鷸鷹鷺鷻鷼鷽鷾鷿
    9E00 鸀鸁鸂鸃鸄鸅鸆鸇鸈鸉鸊鸋鸌鸍鸎鸏鸐鸑鸒鸓鸔鸕鸖鸗鸘鸙鸚鸛鸜鸝鸞鸟
    9E20 鸠鸡鸢鸣鸤鸥鸦鸧鸨鸩鸪鸫鸬鸭鸮鸯鸰鸱鸲鸳鸴鸵鸶鸷鸸鸹鸺鸻鸼鸽鸾鸿
    9E40 鹀鹁鹂鹃鹄鹅鹆鹇鹈鹉鹊鹋鹌鹍鹎鹏鹐鹑鹒鹓鹔鹕鹖鹗鹘鹙鹚鹛鹜鹝鹞鹟
    9E60 鹠鹡鹢鹣鹤鹥鹦鹧鹨鹩鹪鹫鹬鹭鹮鹯鹰鹱鹲鹳鹴鹵鹶鹷鹸鹹鹺鹻鹼鹽鹾鹿
    9E80 麀麁麂麃麄麅麆麇麈麉麊麋麌麍麎麏麐麑麒麓麔麕麖麗麘麙麚麛麜麝麞麟
    9EA0 麠麡麢麣麤麥麦麧麨麩麪麫麬麭麮麯麰麱麲麳麴麵麶麷麸麹麺麻麼麽麾麿
    9EC0 黀黁黂黃黄黅黆黇黈黉黊黋黌黍黎黏黐黑黒黓黔黕黖黗默黙黚黛黜黝點黟
    9EE0 黠黡黢黣黤黥黦黧黨黩黪黫黬黭黮黯黰黱黲黳黴黵黶黷黸黹黺黻黼黽黾黿
    9F00 鼀鼁鼂鼃鼄鼅鼆鼇鼈鼉鼊鼋鼌鼍鼎鼏鼐鼑鼒鼓鼔鼕鼖鼗鼘鼙鼚鼛鼜鼝鼞鼟
    9F20 鼠鼡鼢鼣鼤鼥鼦鼧鼨鼩鼪鼫鼬鼭鼮鼯鼰鼱鼲鼳鼴鼵鼶鼷鼸鼹鼺鼻鼼鼽鼾鼿
    9F40 齀齁齂齃齄齅齆齇齈齉齊齋齌齍齎齏齐齑齒齓齔齕齖齗齘齙齚齛齜齝齞齟
    9F60 齠齡齢齣齤齥齦齧齨齩齪齫齬齭齮齯齰齱齲齳齴齵齶齷齸齹齺齻齼齽齾齿
    9F80 龀龁龂龃龄龅龆龇龈龉龊龋龌龍龎龏龐龑龒龓龔龕龖龗龘龙龚龛龜龝龞龟
    9FA0 龠龡龢龣龤龥龦龧龨龩龪龫龬龭龮龯龰龱龲龳龴龵龶龷龸龹龺龻龼龽龾龿
    9FC0 鿀鿁鿂鿃鿄鿅鿆鿇鿈鿉鿊鿋鿌鿍鿎鿏鿐鿑鿒鿓鿔鿕鿖鿗鿘鿙鿚鿛鿜鿝鿞鿟
    9FE0 鿠鿡鿢鿣鿤鿥鿦鿧鿨鿩鿪鿫鿬鿭鿮鿯鿰鿱鿲鿳鿴鿵鿶鿷鿸鿹鿺鿻鿼鿽鿾鿿
    A000 ꀀꀁꀂꀃꀄꀅꀆꀇꀈꀉꀊꀋꀌꀍꀎꀏꀐꀑꀒꀓꀔꀕꀖꀗꀘꀙꀚꀛꀜꀝꀞꀟ
    A020 ꀠꀡꀢꀣꀤꀥꀦꀧꀨꀩꀪꀫꀬꀭꀮꀯꀰꀱꀲꀳꀴꀵꀶꀷꀸꀹꀺꀻꀼꀽꀾꀿ
    A040 ꁀꁁꁂꁃꁄꁅꁆꁇꁈꁉꁊꁋꁌꁍꁎꁏꁐꁑꁒꁓꁔꁕꁖꁗꁘꁙꁚꁛꁜꁝꁞꁟ
    A060 ꁠꁡꁢꁣꁤꁥꁦꁧꁨꁩꁪꁫꁬꁭꁮꁯꁰꁱꁲꁳꁴꁵꁶꁷꁸꁹꁺꁻꁼꁽꁾꁿ
    A080 ꂀꂁꂂꂃꂄꂅꂆꂇꂈꂉꂊꂋꂌꂍꂎꂏꂐꂑꂒꂓꂔꂕꂖꂗꂘꂙꂚꂛꂜꂝꂞꂟ
    A0A0 ꂠꂡꂢꂣꂤꂥꂦꂧꂨꂩꂪꂫꂬꂭꂮꂯꂰꂱꂲꂳꂴꂵꂶꂷꂸꂹꂺꂻꂼꂽꂾꂿ
    A0C0 ꃀꃁꃂꃃꃄꃅꃆꃇꃈꃉꃊꃋꃌꃍꃎꃏꃐꃑꃒꃓꃔꃕꃖꃗꃘꃙꃚꃛꃜꃝꃞꃟ
    A0E0 ꃠꃡꃢꃣꃤꃥꃦꃧꃨꃩꃪꃫꃬꃭꃮꃯꃰꃱꃲꃳꃴꃵꃶꃷꃸꃹꃺꃻꃼꃽꃾꃿ
    A100 ꄀꄁꄂꄃꄄꄅꄆꄇꄈꄉꄊꄋꄌꄍꄎꄏꄐꄑꄒꄓꄔꄕꄖꄗꄘꄙꄚꄛꄜꄝꄞꄟ
    A120 ꄠꄡꄢꄣꄤꄥꄦꄧꄨꄩꄪꄫꄬꄭꄮꄯꄰꄱꄲꄳꄴꄵꄶꄷꄸꄹꄺꄻꄼꄽꄾꄿ
    A140 ꅀꅁꅂꅃꅄꅅꅆꅇꅈꅉꅊꅋꅌꅍꅎꅏꅐꅑꅒꅓꅔꅕꅖꅗꅘꅙꅚꅛꅜꅝꅞꅟ
    A160 ꅠꅡꅢꅣꅤꅥꅦꅧꅨꅩꅪꅫꅬꅭꅮꅯꅰꅱꅲꅳꅴꅵꅶꅷꅸꅹꅺꅻꅼꅽꅾꅿ
    A180 ꆀꆁꆂꆃꆄꆅꆆꆇꆈꆉꆊꆋꆌꆍꆎꆏꆐꆑꆒꆓꆔꆕꆖꆗꆘꆙꆚꆛꆜꆝꆞꆟ
    A1A0 ꆠꆡꆢꆣꆤꆥꆦꆧꆨꆩꆪꆫꆬꆭꆮꆯꆰꆱꆲꆳꆴꆵꆶꆷꆸꆹꆺꆻꆼꆽꆾꆿ
    A1C0 ꇀꇁꇂꇃꇄꇅꇆꇇꇈꇉꇊꇋꇌꇍꇎꇏꇐꇑꇒꇓꇔꇕꇖꇗꇘꇙꇚꇛꇜꇝꇞꇟ
    A1E0 ꇠꇡꇢꇣꇤꇥꇦꇧꇨꇩꇪꇫꇬꇭꇮꇯꇰꇱꇲꇳꇴꇵꇶꇷꇸꇹꇺꇻꇼꇽꇾꇿ
    A200 ꈀꈁꈂꈃꈄꈅꈆꈇꈈꈉꈊꈋꈌꈍꈎꈏꈐꈑꈒꈓꈔꈕꈖꈗꈘꈙꈚꈛꈜꈝꈞꈟ
    A220 ꈠꈡꈢꈣꈤꈥꈦꈧꈨꈩꈪꈫꈬꈭꈮꈯꈰꈱꈲꈳꈴꈵꈶꈷꈸꈹꈺꈻꈼꈽꈾꈿ
    A240 ꉀꉁꉂꉃꉄꉅꉆꉇꉈꉉꉊꉋꉌꉍꉎꉏꉐꉑꉒꉓꉔꉕꉖꉗꉘꉙꉚꉛꉜꉝꉞꉟ
    A260 ꉠꉡꉢꉣꉤꉥꉦꉧꉨꉩꉪꉫꉬꉭꉮꉯꉰꉱꉲꉳꉴꉵꉶꉷꉸꉹꉺꉻꉼꉽꉾꉿ
    A280 ꊀꊁꊂꊃꊄꊅꊆꊇꊈꊉꊊꊋꊌꊍꊎꊏꊐꊑꊒꊓꊔꊕꊖꊗꊘꊙꊚꊛꊜꊝꊞꊟ
    A2A0 ꊠꊡꊢꊣꊤꊥꊦꊧꊨꊩꊪꊫꊬꊭꊮꊯꊰꊱꊲꊳꊴꊵꊶꊷꊸꊹꊺꊻꊼꊽꊾꊿ
    A2C0 ꋀꋁꋂꋃꋄꋅꋆꋇꋈꋉꋊꋋꋌꋍꋎꋏꋐꋑꋒꋓꋔꋕꋖꋗꋘꋙꋚꋛꋜꋝꋞꋟ
    A2E0 ꋠꋡꋢꋣꋤꋥꋦꋧꋨꋩꋪꋫꋬꋭꋮꋯꋰꋱꋲꋳꋴꋵꋶꋷꋸꋹꋺꋻꋼꋽꋾꋿ
    A300 ꌀꌁꌂꌃꌄꌅꌆꌇꌈꌉꌊꌋꌌꌍꌎꌏꌐꌑꌒꌓꌔꌕꌖꌗꌘꌙꌚꌛꌜꌝꌞꌟ
    A320 ꌠꌡꌢꌣꌤꌥꌦꌧꌨꌩꌪꌫꌬꌭꌮꌯꌰꌱꌲꌳꌴꌵꌶꌷꌸꌹꌺꌻꌼꌽꌾꌿ
    A340 ꍀꍁꍂꍃꍄꍅꍆꍇꍈꍉꍊꍋꍌꍍꍎꍏꍐꍑꍒꍓꍔꍕꍖꍗꍘꍙꍚꍛꍜꍝꍞꍟ
    A360 ꍠꍡꍢꍣꍤꍥꍦꍧꍨꍩꍪꍫꍬꍭꍮꍯꍰꍱꍲꍳꍴꍵꍶꍷꍸꍹꍺꍻꍼꍽꍾꍿ
    A380 ꎀꎁꎂꎃꎄꎅꎆꎇꎈꎉꎊꎋꎌꎍꎎꎏꎐꎑꎒꎓꎔꎕꎖꎗꎘꎙꎚꎛꎜꎝꎞꎟ
    A3A0 ꎠꎡꎢꎣꎤꎥꎦꎧꎨꎩꎪꎫꎬꎭꎮꎯꎰꎱꎲꎳꎴꎵꎶꎷꎸꎹꎺꎻꎼꎽꎾꎿ
    A3C0 ꏀꏁꏂꏃꏄꏅꏆꏇꏈꏉꏊꏋꏌꏍꏎꏏꏐꏑꏒꏓꏔꏕꏖꏗꏘꏙꏚꏛꏜꏝꏞꏟ
    A3E0 ꏠꏡꏢꏣꏤꏥꏦꏧꏨꏩꏪꏫꏬꏭꏮꏯꏰꏱꏲꏳꏴꏵꏶꏷꏸꏹꏺꏻꏼꏽꏾꏿ
    A400 ꐀꐁꐂꐃꐄꐅꐆꐇꐈꐉꐊꐋꐌꐍꐎꐏꐐꐑꐒꐓꐔꐕꐖꐗꐘꐙꐚꐛꐜꐝꐞꐟ
    A420 ꐠꐡꐢꐣꐤꐥꐦꐧꐨꐩꐪꐫꐬꐭꐮꐯꐰꐱꐲꐳꐴꐵꐶꐷꐸꐹꐺꐻꐼꐽꐾꐿ
    A440 ꑀꑁꑂꑃꑄꑅꑆꑇꑈꑉꑊꑋꑌꑍꑎꑏꑐꑑꑒꑓꑔꑕꑖꑗꑘꑙꑚꑛꑜꑝꑞꑟ
    A460 ꑠꑡꑢꑣꑤꑥꑦꑧꑨꑩꑪꑫꑬꑭꑮꑯꑰꑱꑲꑳꑴꑵꑶꑷꑸꑹꑺꑻꑼꑽꑾꑿ
    A480 ꒀꒁꒂꒃꒄꒅꒆꒇꒈꒉꒊꒋꒌ꒍꒎꒏꒐꒑꒒꒓꒔꒕꒖꒗꒘꒙꒚꒛꒜꒝꒞꒟
    A4A0 ꒠꒡꒢꒣꒤꒥꒦꒧꒨꒩꒪꒫꒬꒭꒮꒯꒰꒱꒲꒳꒴꒵꒶꒷꒸꒹꒺꒻꒼꒽꒾꒿
    A4C0 ꓀꓁꓂꓃꓄꓅꓆꓇꓈꓉꓊꓋꓌꓍꓎꓏ꓐꓑꓒꓓꓔꓕꓖꓗꓘꓙꓚꓛꓜꓝꓞꓟ
    A4E0 ꓠꓡꓢꓣꓤꓥꓦꓧꓨꓩꓪꓫꓬꓭꓮꓯꓰꓱꓲꓳꓴꓵꓶꓷꓸꓹꓺꓻꓼꓽ꓾꓿
    A500 ꔀꔁꔂꔃꔄꔅꔆꔇꔈꔉꔊꔋꔌꔍꔎꔏꔐꔑꔒꔓꔔꔕꔖꔗꔘꔙꔚꔛꔜꔝꔞꔟ
    A520 ꔠꔡꔢꔣꔤꔥꔦꔧꔨꔩꔪꔫꔬꔭꔮꔯꔰꔱꔲꔳꔴꔵꔶꔷꔸꔹꔺꔻꔼꔽꔾꔿ
    A540 ꕀꕁꕂꕃꕄꕅꕆꕇꕈꕉꕊꕋꕌꕍꕎꕏꕐꕑꕒꕓꕔꕕꕖꕗꕘꕙꕚꕛꕜꕝꕞꕟ
    A560 ꕠꕡꕢꕣꕤꕥꕦꕧꕨꕩꕪꕫꕬꕭꕮꕯꕰꕱꕲꕳꕴꕵꕶꕷꕸꕹꕺꕻꕼꕽꕾꕿ
    A580 ꖀꖁꖂꖃꖄꖅꖆꖇꖈꖉꖊꖋꖌꖍꖎꖏꖐꖑꖒꖓꖔꖕꖖꖗꖘꖙꖚꖛꖜꖝꖞꖟ
    A5A0 ꖠꖡꖢꖣꖤꖥꖦꖧꖨꖩꖪꖫꖬꖭꖮꖯꖰꖱꖲꖳꖴꖵꖶꖷꖸꖹꖺꖻꖼꖽꖾꖿ
    A5C0 ꗀꗁꗂꗃꗄꗅꗆꗇꗈꗉꗊꗋꗌꗍꗎꗏꗐꗑꗒꗓꗔꗕꗖꗗꗘꗙꗚꗛꗜꗝꗞꗟ
    A5E0 ꗠꗡꗢꗣꗤꗥꗦꗧꗨꗩꗪꗫꗬꗭꗮꗯꗰꗱꗲꗳꗴꗵꗶꗷꗸꗹꗺꗻꗼꗽꗾꗿ
    A600 ꘀꘁꘂꘃꘄꘅꘆꘇꘈꘉꘊꘋꘌ꘍꘎꘏ꘐꘑꘒꘓꘔꘕꘖꘗꘘꘙꘚꘛꘜꘝꘞꘟ
    A620 ꘠꘡꘢꘣꘤꘥꘦꘧꘨꘩ꘪꘫ꘬꘭꘮꘯꘰꘱꘲꘳꘴꘵꘶꘷꘸꘹꘺꘻꘼꘽꘾꘿
    A640 ꙀꙁꙂꙃꙄꙅꙆꙇꙈꙉꙊꙋꙌꙍꙎꙏꙐꙑꙒꙓꙔꙕꙖꙗꙘꙙꙚꙛꙜꙝꙞꙟ
    A660 ꙠꙡꙢꙣꙤꙥꙦꙧꙨꙩꙪꙫꙬꙭꙮ꙯꙰꙱꙲꙳ꙴꙵꙶꙷꙸꙹꙺꙻ꙼꙽꙾ꙿ
    A680 ꚀꚁꚂꚃꚄꚅꚆꚇꚈꚉꚊꚋꚌꚍꚎꚏꚐꚑꚒꚓꚔꚕꚖꚗꚘꚙꚚꚛꚜꚝꚞꚟ
    A6A0 ꚠꚡꚢꚣꚤꚥꚦꚧꚨꚩꚪꚫꚬꚭꚮꚯꚰꚱꚲꚳꚴꚵꚶꚷꚸꚹꚺꚻꚼꚽꚾꚿ
    A6C0 ꛀꛁꛂꛃꛄꛅꛆꛇꛈꛉꛊꛋꛌꛍꛎꛏꛐꛑꛒꛓꛔꛕꛖꛗꛘꛙꛚꛛꛜꛝꛞꛟ
    A6E0 ꛠꛡꛢꛣꛤꛥꛦꛧꛨꛩꛪꛫꛬꛭꛮꛯ꛰꛱꛲꛳꛴꛵꛶꛷꛸꛹꛺꛻꛼꛽꛾꛿
    A700 ꜀꜁꜂꜃꜄꜅꜆꜇꜈꜉꜊꜋꜌꜍꜎꜏꜐꜑꜒꜓꜔꜕꜖ꜗꜘꜙꜚꜛꜜꜝꜞꜟ
    A720 ꜠꜡ꜢꜣꜤꜥꜦꜧꜨꜩꜪꜫꜬꜭꜮꜯꜰꜱꜲꜳꜴꜵꜶꜷꜸꜹꜺꜻꜼꜽꜾꜿ
    A740 ꝀꝁꝂꝃꝄꝅꝆꝇꝈꝉꝊꝋꝌꝍꝎꝏꝐꝑꝒꝓꝔꝕꝖꝗꝘꝙꝚꝛꝜꝝꝞꝟ
    A760 ꝠꝡꝢꝣꝤꝥꝦꝧꝨꝩꝪꝫꝬꝭꝮꝯꝰꝱꝲꝳꝴꝵꝶꝷꝸꝹꝺꝻꝼꝽꝾꝿ
    A780 ꞀꞁꞂꞃꞄꞅꞆꞇꞈ꞉꞊ꞋꞌꞍꞎꞏꞐꞑꞒꞓꞔꞕꞖꞗꞘꞙꞚꞛꞜꞝꞞꞟ
    A7A0 ꞠꞡꞢꞣꞤꞥꞦꞧꞨꞩꞪꞫꞬꞭꞮꞯꞰꞱꞲꞳꞴꞵꞶꞷꞸꞹꞺꞻꞼꞽꞾꞿ
    A7C0 ꟀꟁꟂꟃꟄꟅꟆꟇꟈꟉꟊꟋꟌꟍ꟎꟏Ꟑꟑ꟒ꟓ꟔ꟕꟖꟗꟘꟙꟚꟛꟜ꟝꟞꟟
    A7E0 ꟠꟡꟢꟣꟤꟥꟦꟧꟨꟩꟪꟫꟬꟭꟮꟯꟰꟱ꟲꟳꟴꟵꟶꟷꟸꟹꟺꟻꟼꟽꟾꟿ
    A800 ꠀꠁꠂꠃꠄꠅ꠆ꠇꠈꠉꠊꠋꠌꠍꠎꠏꠐꠑꠒꠓꠔꠕꠖꠗꠘꠙꠚꠛꠜꠝꠞꠟ
    A820 ꠠꠡꠢꠣꠤꠥꠦꠧ꠨꠩꠪꠫꠬꠭꠮꠯꠰꠱꠲꠳꠴꠵꠶꠷꠸꠹꠺꠻꠼꠽꠾꠿
    A840 ꡀꡁꡂꡃꡄꡅꡆꡇꡈꡉꡊꡋꡌꡍꡎꡏꡐꡑꡒꡓꡔꡕꡖꡗꡘꡙꡚꡛꡜꡝꡞꡟ
    A860 ꡠꡡꡢꡣꡤꡥꡦꡧꡨꡩꡪꡫꡬꡭꡮꡯꡰꡱꡲꡳ꡴꡵꡶꡷꡸꡹꡺꡻꡼꡽꡾꡿
    A880 ꢀꢁꢂꢃꢄꢅꢆꢇꢈꢉꢊꢋꢌꢍꢎꢏꢐꢑꢒꢓꢔꢕꢖꢗꢘꢙꢚꢛꢜꢝꢞꢟ
    A8A0 ꢠꢡꢢꢣꢤꢥꢦꢧꢨꢩꢪꢫꢬꢭꢮꢯꢰꢱꢲꢳꢴꢵꢶꢷꢸꢹꢺꢻꢼꢽꢾꢿ
    A8C0 ꣀꣁꣂꣃ꣄ꣅ꣆꣇꣈꣉꣊꣋꣌꣍꣎꣏꣐꣑꣒꣓꣔꣕꣖꣗꣘꣙꣚꣛꣜꣝꣞꣟
    A8E0 ꣠꣡꣢꣣꣤꣥꣦꣧꣨꣩꣪꣫꣬꣭꣮꣯꣰꣱ꣲꣳꣴꣵꣶꣷ꣸꣹꣺ꣻ꣼ꣽꣾꣿ
    A900 ꤀꤁꤂꤃꤄꤅꤆꤇꤈꤉ꤊꤋꤌꤍꤎꤏꤐꤑꤒꤓꤔꤕꤖꤗꤘꤙꤚꤛꤜꤝꤞꤟ
    A920 ꤠꤡꤢꤣꤤꤥꤦꤧꤨꤩꤪ꤫꤬꤭꤮꤯ꤰꤱꤲꤳꤴꤵꤶꤷꤸꤹꤺꤻꤼꤽꤾꤿ
    A940 ꥀꥁꥂꥃꥄꥅꥆꥇꥈꥉꥊꥋꥌꥍꥎꥏꥐꥑꥒ꥓꥔꥕꥖꥗꥘꥙꥚꥛꥜꥝꥞꥟
    A960 ꥠꥡꥢꥣꥤꥥꥦꥧꥨꥩꥪꥫꥬꥭꥮꥯꥰꥱꥲꥳꥴꥵꥶꥷꥸꥹꥺꥻꥼ꥽꥾꥿
    A980 ꦀꦁꦂꦃꦄꦅꦆꦇꦈꦉꦊꦋꦌꦍꦎꦏꦐꦑꦒꦓꦔꦕꦖꦗꦘꦙꦚꦛꦜꦝꦞꦟ
    A9A0 ꦠꦡꦢꦣꦤꦥꦦꦧꦨꦩꦪꦫꦬꦭꦮꦯꦰꦱꦲ꦳ꦴꦵꦶꦷꦸꦹꦺꦻꦼꦽꦾꦿ
    A9C0 ꧀꧁꧂꧃꧄꧅꧆꧇꧈꧉꧊꧋꧌꧍꧎ꧏ꧐꧑꧒꧓꧔꧕꧖꧗꧘꧙꧚꧛꧜꧝꧞꧟
    A9E0 ꧠꧡꧢꧣꧤꧥꧦꧧꧨꧩꧪꧫꧬꧭꧮꧯ꧰꧱꧲꧳꧴꧵꧶꧷꧸꧹ꧺꧻꧼꧽꧾ꧿
    AA00 ꨀꨁꨂꨃꨄꨅꨆꨇꨈꨉꨊꨋꨌꨍꨎꨏꨐꨑꨒꨓꨔꨕꨖꨗꨘꨙꨚꨛꨜꨝꨞꨟ
    AA20 ꨠꨡꨢꨣꨤꨥꨦꨧꨨꨩꨪꨫꨬꨭꨮꨯꨰꨱꨲꨳꨴꨵꨶ꨷꨸꨹꨺꨻꨼꨽꨾꨿
    AA40 ꩀꩁꩂꩃꩄꩅꩆꩇꩈꩉꩊꩋꩌꩍ꩎꩏꩐꩑꩒꩓꩔꩕꩖꩗꩘꩙꩚꩛꩜꩝꩞꩟
    AA60 ꩠꩡꩢꩣꩤꩥꩦꩧꩨꩩꩪꩫꩬꩭꩮꩯꩰꩱꩲꩳꩴꩵꩶ꩷꩸꩹ꩺꩻꩼꩽꩾꩿ
    AA80 ꪀꪁꪂꪃꪄꪅꪆꪇꪈꪉꪊꪋꪌꪍꪎꪏꪐꪑꪒꪓꪔꪕꪖꪗꪘꪙꪚꪛꪜꪝꪞꪟ
    AAA0 ꪠꪡꪢꪣꪤꪥꪦꪧꪨꪩꪪꪫꪬꪭꪮꪯꪰꪱꪴꪲꪳꪵꪶꪷꪸꪹꪺꪻꪼꪽꪾ꪿
    AAC0 ꫀ꫁ꫂ꫃꫄꫅꫆꫇꫈꫉꫊꫋꫌꫍꫎꫏꫐꫑꫒꫓꫔꫕꫖꫗꫘꫙꫚ꫛꫜꫝ꫞꫟
    AAE0 ꫠꫡꫢꫣꫤꫥꫦꫧꫨꫩꫪꫫꫬꫭꫮꫯ꫰꫱ꫲꫳꫴꫵ꫶꫷꫸꫹꫺꫻꫼꫽꫾꫿
    AB00 ꬀ꬁꬂꬃꬄꬅꬆ꬇꬈ꬉꬊꬋꬌꬍꬎ꬏꬐ꬑꬒꬓꬔꬕꬖ꬗꬘꬙꬚꬛꬜꬝꬞꬟
    AB20 ꬠꬡꬢꬣꬤꬥꬦ꬧ꬨꬩꬪꬫꬬꬭꬮ꬯ꬰꬱꬲꬳꬴꬵꬶꬷꬸꬹꬺꬻꬼꬽꬾꬿ
    AB40 ꭀꭁꭂꭃꭄꭅꭆꭇꭈꭉꭊꭋꭌꭍꭎꭏꭐꭑꭒꭓꭔꭕꭖꭗꭘꭙꭚ꭛ꭜꭝꭞꭟ
    AB60 ꭠꭡꭢꭣꭤꭥꭦꭧꭨꭩ꭪꭫꭬꭭꭮꭯ꭰꭱꭲꭳꭴꭵꭶꭷꭸꭹꭺꭻꭼꭽꭾꭿ
    AB80 ꮀꮁꮂꮃꮄꮅꮆꮇꮈꮉꮊꮋꮌꮍꮎꮏꮐꮑꮒꮓꮔꮕꮖꮗꮘꮙꮚꮛꮜꮝꮞꮟ
    ABA0 ꮠꮡꮢꮣꮤꮥꮦꮧꮨꮩꮪꮫꮬꮭꮮꮯꮰꮱꮲꮳꮴꮵꮶꮷꮸꮹꮺꮻꮼꮽꮾꮿ
    ABC0 ꯀꯁꯂꯃꯄꯅꯆꯇꯈꯉꯊꯋꯌꯍꯎꯏꯐꯑꯒꯓꯔꯕꯖꯗꯘꯙꯚꯛꯜꯝꯞꯟ
    ABE0 ꯠꯡꯢꯣꯤꯥꯦꯧꯨꯩꯪ꯫꯬꯭꯮꯯꯰꯱꯲꯳꯴꯵꯶꯷꯸꯹꯺꯻꯼꯽꯾꯿
    AC00 가각갂갃간갅갆갇갈갉갊갋갌갍갎갏감갑값갓갔강갖갗갘같갚갛개객갞갟
    AC20 갠갡갢갣갤갥갦갧갨갩갪갫갬갭갮갯갰갱갲갳갴갵갶갷갸갹갺갻갼갽갾갿
    AC40 걀걁걂걃걄걅걆걇걈걉걊걋걌걍걎걏걐걑걒걓걔걕걖걗걘걙걚걛걜걝걞걟
    AC60 걠걡걢걣걤걥걦걧걨걩걪걫걬걭걮걯거걱걲걳건걵걶걷걸걹걺걻걼걽걾걿
    AC80 검겁겂것겄겅겆겇겈겉겊겋게겍겎겏겐겑겒겓겔겕겖겗겘겙겚겛겜겝겞겟
    ACA0 겠겡겢겣겤겥겦겧겨격겪겫견겭겮겯결겱겲겳겴겵겶겷겸겹겺겻겼경겾겿
    ACC0 곀곁곂곃계곅곆곇곈곉곊곋곌곍곎곏곐곑곒곓곔곕곖곗곘곙곚곛곜곝곞곟
    ACE0 고곡곢곣곤곥곦곧골곩곪곫곬곭곮곯곰곱곲곳곴공곶곷곸곹곺곻과곽곾곿
    AD00 관괁괂괃괄괅괆괇괈괉괊괋괌괍괎괏괐광괒괓괔괕괖괗괘괙괚괛괜괝괞괟
    AD20 괠괡괢괣괤괥괦괧괨괩괪괫괬괭괮괯괰괱괲괳괴괵괶괷괸괹괺괻괼괽괾괿
    AD40 굀굁굂굃굄굅굆굇굈굉굊굋굌굍굎굏교굑굒굓굔굕굖굗굘굙굚굛굜굝굞굟
    AD60 굠굡굢굣굤굥굦굧굨굩굪굫구국굮굯군굱굲굳굴굵굶굷굸굹굺굻굼굽굾굿
    AD80 궀궁궂궃궄궅궆궇궈궉궊궋권궍궎궏궐궑궒궓궔궕궖궗궘궙궚궛궜궝궞궟
    ADA0 궠궡궢궣궤궥궦궧궨궩궪궫궬궭궮궯궰궱궲궳궴궵궶궷궸궹궺궻궼궽궾궿
    ADC0 귀귁귂귃귄귅귆귇귈귉귊귋귌귍귎귏귐귑귒귓귔귕귖귗귘귙귚귛규귝귞귟
    ADE0 균귡귢귣귤귥귦귧귨귩귪귫귬귭귮귯귰귱귲귳귴귵귶귷그극귺귻근귽귾귿
    AE00 글긁긂긃긄긅긆긇금급긊긋긌긍긎긏긐긑긒긓긔긕긖긗긘긙긚긛긜긝긞긟
    AE20 긠긡긢긣긤긥긦긧긨긩긪긫긬긭긮긯기긱긲긳긴긵긶긷길긹긺긻긼긽긾긿
    AE40 김깁깂깃깄깅깆깇깈깉깊깋까깍깎깏깐깑깒깓깔깕깖깗깘깙깚깛깜깝깞깟
    AE60 깠깡깢깣깤깥깦깧깨깩깪깫깬깭깮깯깰깱깲깳깴깵깶깷깸깹깺깻깼깽깾깿
    AE80 꺀꺁꺂꺃꺄꺅꺆꺇꺈꺉꺊꺋꺌꺍꺎꺏꺐꺑꺒꺓꺔꺕꺖꺗꺘꺙꺚꺛꺜꺝꺞꺟
    AEA0 꺠꺡꺢꺣꺤꺥꺦꺧꺨꺩꺪꺫꺬꺭꺮꺯꺰꺱꺲꺳꺴꺵꺶꺷꺸꺹꺺꺻꺼꺽꺾꺿
    AEC0 껀껁껂껃껄껅껆껇껈껉껊껋껌껍껎껏껐껑껒껓껔껕껖껗께껙껚껛껜껝껞껟
    AEE0 껠껡껢껣껤껥껦껧껨껩껪껫껬껭껮껯껰껱껲껳껴껵껶껷껸껹껺껻껼껽껾껿
    AF00 꼀꼁꼂꼃꼄꼅꼆꼇꼈꼉꼊꼋꼌꼍꼎꼏꼐꼑꼒꼓꼔꼕꼖꼗꼘꼙꼚꼛꼜꼝꼞꼟
    AF20 꼠꼡꼢꼣꼤꼥꼦꼧꼨꼩꼪꼫꼬꼭꼮꼯꼰꼱꼲꼳꼴꼵꼶꼷꼸꼹꼺꼻꼼꼽꼾꼿
    AF40 꽀꽁꽂꽃꽄꽅꽆꽇꽈꽉꽊꽋꽌꽍꽎꽏꽐꽑꽒꽓꽔꽕꽖꽗꽘꽙꽚꽛꽜꽝꽞꽟
    AF60 꽠꽡꽢꽣꽤꽥꽦꽧꽨꽩꽪꽫꽬꽭꽮꽯꽰꽱꽲꽳꽴꽵꽶꽷꽸꽹꽺꽻꽼꽽꽾꽿
    AF80 꾀꾁꾂꾃꾄꾅꾆꾇꾈꾉꾊꾋꾌꾍꾎꾏꾐꾑꾒꾓꾔꾕꾖꾗꾘꾙꾚꾛꾜꾝꾞꾟
    AFA0 꾠꾡꾢꾣꾤꾥꾦꾧꾨꾩꾪꾫꾬꾭꾮꾯꾰꾱꾲꾳꾴꾵꾶꾷꾸꾹꾺꾻꾼꾽꾾꾿
    AFC0 꿀꿁꿂꿃꿄꿅꿆꿇꿈꿉꿊꿋꿌꿍꿎꿏꿐꿑꿒꿓꿔꿕꿖꿗꿘꿙꿚꿛꿜꿝꿞꿟
    AFE0 꿠꿡꿢꿣꿤꿥꿦꿧꿨꿩꿪꿫꿬꿭꿮꿯꿰꿱꿲꿳꿴꿵꿶꿷꿸꿹꿺꿻꿼꿽꿾꿿
    B000 뀀뀁뀂뀃뀄뀅뀆뀇뀈뀉뀊뀋뀌뀍뀎뀏뀐뀑뀒뀓뀔뀕뀖뀗뀘뀙뀚뀛뀜뀝뀞뀟
    B020 뀠뀡뀢뀣뀤뀥뀦뀧뀨뀩뀪뀫뀬뀭뀮뀯뀰뀱뀲뀳뀴뀵뀶뀷뀸뀹뀺뀻뀼뀽뀾뀿
    B040 끀끁끂끃끄끅끆끇끈끉끊끋끌끍끎끏끐끑끒끓끔끕끖끗끘끙끚끛끜끝끞끟
    B060 끠끡끢끣끤끥끦끧끨끩끪끫끬끭끮끯끰끱끲끳끴끵끶끷끸끹끺끻끼끽끾끿
    B080 낀낁낂낃낄낅낆낇낈낉낊낋낌낍낎낏낐낑낒낓낔낕낖낗나낙낚낛난낝낞낟
    B0A0 날낡낢낣낤낥낦낧남납낪낫났낭낮낯낰낱낲낳내낵낶낷낸낹낺낻낼낽낾낿
    B0C0 냀냁냂냃냄냅냆냇냈냉냊냋냌냍냎냏냐냑냒냓냔냕냖냗냘냙냚냛냜냝냞냟
    B0E0 냠냡냢냣냤냥냦냧냨냩냪냫냬냭냮냯냰냱냲냳냴냵냶냷냸냹냺냻냼냽냾냿
    B100 넀넁넂넃넄넅넆넇너넉넊넋넌넍넎넏널넑넒넓넔넕넖넗넘넙넚넛넜넝넞넟
    B120 넠넡넢넣네넥넦넧넨넩넪넫넬넭넮넯넰넱넲넳넴넵넶넷넸넹넺넻넼넽넾넿
    B140 녀녁녂녃년녅녆녇녈녉녊녋녌녍녎녏념녑녒녓녔녕녖녗녘녙녚녛녜녝녞녟
    B160 녠녡녢녣녤녥녦녧녨녩녪녫녬녭녮녯녰녱녲녳녴녵녶녷노녹녺녻논녽녾녿
    B180 놀놁놂놃놄놅놆놇놈놉놊놋놌농놎놏놐놑높놓놔놕놖놗놘놙놚놛놜놝놞놟
    B1A0 놠놡놢놣놤놥놦놧놨놩놪놫놬놭놮놯놰놱놲놳놴놵놶놷놸놹놺놻놼놽놾놿
    B1C0 뇀뇁뇂뇃뇄뇅뇆뇇뇈뇉뇊뇋뇌뇍뇎뇏뇐뇑뇒뇓뇔뇕뇖뇗뇘뇙뇚뇛뇜뇝뇞뇟
    B1E0 뇠뇡뇢뇣뇤뇥뇦뇧뇨뇩뇪뇫뇬뇭뇮뇯뇰뇱뇲뇳뇴뇵뇶뇷뇸뇹뇺뇻뇼뇽뇾뇿
    B200 눀눁눂눃누눅눆눇눈눉눊눋눌눍눎눏눐눑눒눓눔눕눖눗눘눙눚눛눜눝눞눟
    B220 눠눡눢눣눤눥눦눧눨눩눪눫눬눭눮눯눰눱눲눳눴눵눶눷눸눹눺눻눼눽눾눿
    B240 뉀뉁뉂뉃뉄뉅뉆뉇뉈뉉뉊뉋뉌뉍뉎뉏뉐뉑뉒뉓뉔뉕뉖뉗뉘뉙뉚뉛뉜뉝뉞뉟
    B260 뉠뉡뉢뉣뉤뉥뉦뉧뉨뉩뉪뉫뉬뉭뉮뉯뉰뉱뉲뉳뉴뉵뉶뉷뉸뉹뉺뉻뉼뉽뉾뉿
    B280 늀늁늂늃늄늅늆늇늈늉늊늋늌늍늎늏느늑늒늓는늕늖늗늘늙늚늛늜늝늞늟
    B2A0 늠늡늢늣늤능늦늧늨늩늪늫늬늭늮늯늰늱늲늳늴늵늶늷늸늹늺늻늼늽늾늿
    B2C0 닀닁닂닃닄닅닆닇니닉닊닋닌닍닎닏닐닑닒닓닔닕닖닗님닙닚닛닜닝닞닟
    B2E0 닠닡닢닣다닥닦닧단닩닪닫달닭닮닯닰닱닲닳담답닶닷닸당닺닻닼닽닾닿
    B300 대댁댂댃댄댅댆댇댈댉댊댋댌댍댎댏댐댑댒댓댔댕댖댗댘댙댚댛댜댝댞댟
    B320 댠댡댢댣댤댥댦댧댨댩댪댫댬댭댮댯댰댱댲댳댴댵댶댷댸댹댺댻댼댽댾댿
    B340 덀덁덂덃덄덅덆덇덈덉덊덋덌덍덎덏덐덑덒덓더덕덖덗던덙덚덛덜덝덞덟
    B360 덠덡덢덣덤덥덦덧덨덩덪덫덬덭덮덯데덱덲덳덴덵덶덷델덹덺덻덼덽덾덿
    B380 뎀뎁뎂뎃뎄뎅뎆뎇뎈뎉뎊뎋뎌뎍뎎뎏뎐뎑뎒뎓뎔뎕뎖뎗뎘뎙뎚뎛뎜뎝뎞뎟
    B3A0 뎠뎡뎢뎣뎤뎥뎦뎧뎨뎩뎪뎫뎬뎭뎮뎯뎰뎱뎲뎳뎴뎵뎶뎷뎸뎹뎺뎻뎼뎽뎾뎿
    B3C0 돀돁돂돃도독돆돇돈돉돊돋돌돍돎돏돐돑돒돓돔돕돖돗돘동돚돛돜돝돞돟
    B3E0 돠돡돢돣돤돥돦돧돨돩돪돫돬돭돮돯돰돱돲돳돴돵돶돷돸돹돺돻돼돽돾돿
    B400 됀됁됂됃됄됅됆됇됈됉됊됋됌됍됎됏됐됑됒됓됔됕됖됗되됙됚됛된됝됞됟
    B420 될됡됢됣됤됥됦됧됨됩됪됫됬됭됮됯됰됱됲됳됴됵됶됷됸됹됺됻됼됽됾됿
    B440 둀둁둂둃둄둅둆둇둈둉둊둋둌둍둎둏두둑둒둓둔둕둖둗둘둙둚둛둜둝둞둟
    B460 둠둡둢둣둤둥둦둧둨둩둪둫둬둭둮둯둰둱둲둳둴둵둶둷둸둹둺둻둼둽둾둿
    B480 뒀뒁뒂뒃뒄뒅뒆뒇뒈뒉뒊뒋뒌뒍뒎뒏뒐뒑뒒뒓뒔뒕뒖뒗뒘뒙뒚뒛뒜뒝뒞뒟
    B4A0 뒠뒡뒢뒣뒤뒥뒦뒧뒨뒩뒪뒫뒬뒭뒮뒯뒰뒱뒲뒳뒴뒵뒶뒷뒸뒹뒺뒻뒼뒽뒾뒿
    B4C0 듀듁듂듃듄듅듆듇듈듉듊듋듌듍듎듏듐듑듒듓듔듕듖듗듘듙듚듛드득듞듟
    B4E0 든듡듢듣들듥듦듧듨듩듪듫듬듭듮듯듰등듲듳듴듵듶듷듸듹듺듻듼듽듾듿
    B500 딀딁딂딃딄딅딆딇딈딉딊딋딌딍딎딏딐딑딒딓디딕딖딗딘딙딚딛딜딝딞딟
    B520 딠딡딢딣딤딥딦딧딨딩딪딫딬딭딮딯따딱딲딳딴딵딶딷딸딹딺딻딼딽딾딿
    B540 땀땁땂땃땄땅땆땇땈땉땊땋때땍땎땏땐땑땒땓땔땕땖땗땘땙땚땛땜땝땞땟
    B560 땠땡땢땣땤땥땦땧땨땩땪땫땬땭땮땯땰땱땲땳땴땵땶땷땸땹땺땻땼땽땾땿
    B580 떀떁떂떃떄떅떆떇떈떉떊떋떌떍떎떏떐떑떒떓떔떕떖떗떘떙떚떛떜떝떞떟
    B5A0 떠떡떢떣떤떥떦떧떨떩떪떫떬떭떮떯떰떱떲떳떴떵떶떷떸떹떺떻떼떽떾떿
    B5C0 뗀뗁뗂뗃뗄뗅뗆뗇뗈뗉뗊뗋뗌뗍뗎뗏뗐뗑뗒뗓뗔뗕뗖뗗뗘뗙뗚뗛뗜뗝뗞뗟
    B5E0 뗠뗡뗢뗣뗤뗥뗦뗧뗨뗩뗪뗫뗬뗭뗮뗯뗰뗱뗲뗳뗴뗵뗶뗷뗸뗹뗺뗻뗼뗽뗾뗿
    B600 똀똁똂똃똄똅똆똇똈똉똊똋똌똍똎똏또똑똒똓똔똕똖똗똘똙똚똛똜똝똞똟
    B620 똠똡똢똣똤똥똦똧똨똩똪똫똬똭똮똯똰똱똲똳똴똵똶똷똸똹똺똻똼똽똾똿
    B640 뙀뙁뙂뙃뙄뙅뙆뙇뙈뙉뙊뙋뙌뙍뙎뙏뙐뙑뙒뙓뙔뙕뙖뙗뙘뙙뙚뙛뙜뙝뙞뙟
    B660 뙠뙡뙢뙣뙤뙥뙦뙧뙨뙩뙪뙫뙬뙭뙮뙯뙰뙱뙲뙳뙴뙵뙶뙷뙸뙹뙺뙻뙼뙽뙾뙿
    B680 뚀뚁뚂뚃뚄뚅뚆뚇뚈뚉뚊뚋뚌뚍뚎뚏뚐뚑뚒뚓뚔뚕뚖뚗뚘뚙뚚뚛뚜뚝뚞뚟
    B6A0 뚠뚡뚢뚣뚤뚥뚦뚧뚨뚩뚪뚫뚬뚭뚮뚯뚰뚱뚲뚳뚴뚵뚶뚷뚸뚹뚺뚻뚼뚽뚾뚿
    B6C0 뛀뛁뛂뛃뛄뛅뛆뛇뛈뛉뛊뛋뛌뛍뛎뛏뛐뛑뛒뛓뛔뛕뛖뛗뛘뛙뛚뛛뛜뛝뛞뛟
    B6E0 뛠뛡뛢뛣뛤뛥뛦뛧뛨뛩뛪뛫뛬뛭뛮뛯뛰뛱뛲뛳뛴뛵뛶뛷뛸뛹뛺뛻뛼뛽뛾뛿
    B700 뜀뜁뜂뜃뜄뜅뜆뜇뜈뜉뜊뜋뜌뜍뜎뜏뜐뜑뜒뜓뜔뜕뜖뜗뜘뜙뜚뜛뜜뜝뜞뜟
    B720 뜠뜡뜢뜣뜤뜥뜦뜧뜨뜩뜪뜫뜬뜭뜮뜯뜰뜱뜲뜳뜴뜵뜶뜷뜸뜹뜺뜻뜼뜽뜾뜿
    B740 띀띁띂띃띄띅띆띇띈띉띊띋띌띍띎띏띐띑띒띓띔띕띖띗띘띙띚띛띜띝띞띟
    B760 띠띡띢띣띤띥띦띧띨띩띪띫띬띭띮띯띰띱띲띳띴띵띶띷띸띹띺띻라락띾띿
    B780 란랁랂랃랄랅랆랇랈랉랊랋람랍랎랏랐랑랒랓랔랕랖랗래랙랚랛랜랝랞랟
    B7A0 랠랡랢랣랤랥랦랧램랩랪랫랬랭랮랯랰랱랲랳랴략랶랷랸랹랺랻랼랽랾랿
    B7C0 럀럁럂럃럄럅럆럇럈량럊럋럌럍럎럏럐럑럒럓럔럕럖럗럘럙럚럛럜럝럞럟
    B7E0 럠럡럢럣럤럥럦럧럨럩럪럫러럭럮럯런럱럲럳럴럵럶럷럸럹럺럻럼럽럾럿
    B800 렀렁렂렃렄렅렆렇레렉렊렋렌렍렎렏렐렑렒렓렔렕렖렗렘렙렚렛렜렝렞렟
    B820 렠렡렢렣려력렦렧련렩렪렫렬렭렮렯렰렱렲렳렴렵렶렷렸령렺렻렼렽렾렿
    B840 례롁롂롃롄롅롆롇롈롉롊롋롌롍롎롏롐롑롒롓롔롕롖롗롘롙롚롛로록롞롟
    B860 론롡롢롣롤롥롦롧롨롩롪롫롬롭롮롯롰롱롲롳롴롵롶롷롸롹롺롻롼롽롾롿
    B880 뢀뢁뢂뢃뢄뢅뢆뢇뢈뢉뢊뢋뢌뢍뢎뢏뢐뢑뢒뢓뢔뢕뢖뢗뢘뢙뢚뢛뢜뢝뢞뢟
    B8A0 뢠뢡뢢뢣뢤뢥뢦뢧뢨뢩뢪뢫뢬뢭뢮뢯뢰뢱뢲뢳뢴뢵뢶뢷뢸뢹뢺뢻뢼뢽뢾뢿
    B8C0 룀룁룂룃룄룅룆룇룈룉룊룋료룍룎룏룐룑룒룓룔룕룖룗룘룙룚룛룜룝룞룟
    B8E0 룠룡룢룣룤룥룦룧루룩룪룫룬룭룮룯룰룱룲룳룴룵룶룷룸룹룺룻룼룽룾룿
    B900 뤀뤁뤂뤃뤄뤅뤆뤇뤈뤉뤊뤋뤌뤍뤎뤏뤐뤑뤒뤓뤔뤕뤖뤗뤘뤙뤚뤛뤜뤝뤞뤟
    B920 뤠뤡뤢뤣뤤뤥뤦뤧뤨뤩뤪뤫뤬뤭뤮뤯뤰뤱뤲뤳뤴뤵뤶뤷뤸뤹뤺뤻뤼뤽뤾뤿
    B940 륀륁륂륃륄륅륆륇륈륉륊륋륌륍륎륏륐륑륒륓륔륕륖륗류륙륚륛륜륝륞륟
    B960 률륡륢륣륤륥륦륧륨륩륪륫륬륭륮륯륰륱륲륳르륵륶륷른륹륺륻를륽륾륿
    B980 릀릁릂릃름릅릆릇릈릉릊릋릌릍릎릏릐릑릒릓릔릕릖릗릘릙릚릛릜릝릞릟
    B9A0 릠릡릢릣릤릥릦릧릨릩릪릫리릭릮릯린릱릲릳릴릵릶릷릸릹릺릻림립릾릿
    B9C0 맀링맂맃맄맅맆맇마막맊맋만맍많맏말맑맒맓맔맕맖맗맘맙맚맛맜망맞맟
    B9E0 맠맡맢맣매맥맦맧맨맩맪맫맬맭맮맯맰맱맲맳맴맵맶맷맸맹맺맻맼맽맾맿
    BA00 먀먁먂먃먄먅먆먇먈먉먊먋먌먍먎먏먐먑먒먓먔먕먖먗먘먙먚먛먜먝먞먟
    BA20 먠먡먢먣먤먥먦먧먨먩먪먫먬먭먮먯먰먱먲먳먴먵먶먷머먹먺먻먼먽먾먿
    BA40 멀멁멂멃멄멅멆멇멈멉멊멋멌멍멎멏멐멑멒멓메멕멖멗멘멙멚멛멜멝멞멟
    BA60 멠멡멢멣멤멥멦멧멨멩멪멫멬멭멮멯며멱멲멳면멵멶멷멸멹멺멻멼멽멾멿
    BA80 몀몁몂몃몄명몆몇몈몉몊몋몌몍몎몏몐몑몒몓몔몕몖몗몘몙몚몛몜몝몞몟
    BAA0 몠몡몢몣몤몥몦몧모목몪몫몬몭몮몯몰몱몲몳몴몵몶몷몸몹몺못몼몽몾몿
    BAC0 뫀뫁뫂뫃뫄뫅뫆뫇뫈뫉뫊뫋뫌뫍뫎뫏뫐뫑뫒뫓뫔뫕뫖뫗뫘뫙뫚뫛뫜뫝뫞뫟
    BAE0 뫠뫡뫢뫣뫤뫥뫦뫧뫨뫩뫪뫫뫬뫭뫮뫯뫰뫱뫲뫳뫴뫵뫶뫷뫸뫹뫺뫻뫼뫽뫾뫿
    BB00 묀묁묂묃묄묅묆묇묈묉묊묋묌묍묎묏묐묑묒묓묔묕묖묗묘묙묚묛묜묝묞묟
    BB20 묠묡묢묣묤묥묦묧묨묩묪묫묬묭묮묯묰묱묲묳무묵묶묷문묹묺묻물묽묾묿
    BB40 뭀뭁뭂뭃뭄뭅뭆뭇뭈뭉뭊뭋뭌뭍뭎뭏뭐뭑뭒뭓뭔뭕뭖뭗뭘뭙뭚뭛뭜뭝뭞뭟
    BB60 뭠뭡뭢뭣뭤뭥뭦뭧뭨뭩뭪뭫뭬뭭뭮뭯뭰뭱뭲뭳뭴뭵뭶뭷뭸뭹뭺뭻뭼뭽뭾뭿
    BB80 뮀뮁뮂뮃뮄뮅뮆뮇뮈뮉뮊뮋뮌뮍뮎뮏뮐뮑뮒뮓뮔뮕뮖뮗뮘뮙뮚뮛뮜뮝뮞뮟
    BBA0 뮠뮡뮢뮣뮤뮥뮦뮧뮨뮩뮪뮫뮬뮭뮮뮯뮰뮱뮲뮳뮴뮵뮶뮷뮸뮹뮺뮻뮼뮽뮾뮿
    BBC0 므믁믂믃믄믅믆믇믈믉믊믋믌믍믎믏믐믑믒믓믔믕믖믗믘믙믚믛믜믝믞믟
    BBE0 믠믡믢믣믤믥믦믧믨믩믪믫믬믭믮믯믰믱믲믳믴믵믶믷미믹믺믻민믽믾믿
    BC00 밀밁밂밃밄밅밆밇밈밉밊밋밌밍밎및밐밑밒밓바박밖밗반밙밚받발밝밞밟
    BC20 밠밡밢밣밤밥밦밧밨방밪밫밬밭밮밯배백밲밳밴밵밶밷밸밹밺밻밼밽밾밿
    BC40 뱀뱁뱂뱃뱄뱅뱆뱇뱈뱉뱊뱋뱌뱍뱎뱏뱐뱑뱒뱓뱔뱕뱖뱗뱘뱙뱚뱛뱜뱝뱞뱟
    BC60 뱠뱡뱢뱣뱤뱥뱦뱧뱨뱩뱪뱫뱬뱭뱮뱯뱰뱱뱲뱳뱴뱵뱶뱷뱸뱹뱺뱻뱼뱽뱾뱿
    BC80 벀벁벂벃버벅벆벇번벉벊벋벌벍벎벏벐벑벒벓범법벖벗벘벙벚벛벜벝벞벟
    BCA0 베벡벢벣벤벥벦벧벨벩벪벫벬벭벮벯벰벱벲벳벴벵벶벷벸벹벺벻벼벽벾벿
    BCC0 변볁볂볃별볅볆볇볈볉볊볋볌볍볎볏볐병볒볓볔볕볖볗볘볙볚볛볜볝볞볟
    BCE0 볠볡볢볣볤볥볦볧볨볩볪볫볬볭볮볯볰볱볲볳보복볶볷본볹볺볻볼볽볾볿
    BD00 봀봁봂봃봄봅봆봇봈봉봊봋봌봍봎봏봐봑봒봓봔봕봖봗봘봙봚봛봜봝봞봟
    BD20 봠봡봢봣봤봥봦봧봨봩봪봫봬봭봮봯봰봱봲봳봴봵봶봷봸봹봺봻봼봽봾봿
    BD40 뵀뵁뵂뵃뵄뵅뵆뵇뵈뵉뵊뵋뵌뵍뵎뵏뵐뵑뵒뵓뵔뵕뵖뵗뵘뵙뵚뵛뵜뵝뵞뵟
    BD60 뵠뵡뵢뵣뵤뵥뵦뵧뵨뵩뵪뵫뵬뵭뵮뵯뵰뵱뵲뵳뵴뵵뵶뵷뵸뵹뵺뵻뵼뵽뵾뵿
    BD80 부북붂붃분붅붆붇불붉붊붋붌붍붎붏붐붑붒붓붔붕붖붗붘붙붚붛붜붝붞붟
    BDA0 붠붡붢붣붤붥붦붧붨붩붪붫붬붭붮붯붰붱붲붳붴붵붶붷붸붹붺붻붼붽붾붿
    BDC0 뷀뷁뷂뷃뷄뷅뷆뷇뷈뷉뷊뷋뷌뷍뷎뷏뷐뷑뷒뷓뷔뷕뷖뷗뷘뷙뷚뷛뷜뷝뷞뷟
    BDE0 뷠뷡뷢뷣뷤뷥뷦뷧뷨뷩뷪뷫뷬뷭뷮뷯뷰뷱뷲뷳뷴뷵뷶뷷뷸뷹뷺뷻뷼뷽뷾뷿
    BE00 븀븁븂븃븄븅븆븇븈븉븊븋브븍븎븏븐븑븒븓블븕븖븗븘븙븚븛븜븝븞븟
    BE20 븠븡븢븣븤븥븦븧븨븩븪븫븬븭븮븯븰븱븲븳븴븵븶븷븸븹븺븻븼븽븾븿
    BE40 빀빁빂빃비빅빆빇빈빉빊빋빌빍빎빏빐빑빒빓빔빕빖빗빘빙빚빛빜빝빞빟
    BE60 빠빡빢빣빤빥빦빧빨빩빪빫빬빭빮빯빰빱빲빳빴빵빶빷빸빹빺빻빼빽빾빿
    BE80 뺀뺁뺂뺃뺄뺅뺆뺇뺈뺉뺊뺋뺌뺍뺎뺏뺐뺑뺒뺓뺔뺕뺖뺗뺘뺙뺚뺛뺜뺝뺞뺟
    BEA0 뺠뺡뺢뺣뺤뺥뺦뺧뺨뺩뺪뺫뺬뺭뺮뺯뺰뺱뺲뺳뺴뺵뺶뺷뺸뺹뺺뺻뺼뺽뺾뺿
    BEC0 뻀뻁뻂뻃뻄뻅뻆뻇뻈뻉뻊뻋뻌뻍뻎뻏뻐뻑뻒뻓뻔뻕뻖뻗뻘뻙뻚뻛뻜뻝뻞뻟
    BEE0 뻠뻡뻢뻣뻤뻥뻦뻧뻨뻩뻪뻫뻬뻭뻮뻯뻰뻱뻲뻳뻴뻵뻶뻷뻸뻹뻺뻻뻼뻽뻾뻿
    BF00 뼀뼁뼂뼃뼄뼅뼆뼇뼈뼉뼊뼋뼌뼍뼎뼏뼐뼑뼒뼓뼔뼕뼖뼗뼘뼙뼚뼛뼜뼝뼞뼟
    BF20 뼠뼡뼢뼣뼤뼥뼦뼧뼨뼩뼪뼫뼬뼭뼮뼯뼰뼱뼲뼳뼴뼵뼶뼷뼸뼹뼺뼻뼼뼽뼾뼿
    BF40 뽀뽁뽂뽃뽄뽅뽆뽇뽈뽉뽊뽋뽌뽍뽎뽏뽐뽑뽒뽓뽔뽕뽖뽗뽘뽙뽚뽛뽜뽝뽞뽟
    BF60 뽠뽡뽢뽣뽤뽥뽦뽧뽨뽩뽪뽫뽬뽭뽮뽯뽰뽱뽲뽳뽴뽵뽶뽷뽸뽹뽺뽻뽼뽽뽾뽿
    BF80 뾀뾁뾂뾃뾄뾅뾆뾇뾈뾉뾊뾋뾌뾍뾎뾏뾐뾑뾒뾓뾔뾕뾖뾗뾘뾙뾚뾛뾜뾝뾞뾟
    BFA0 뾠뾡뾢뾣뾤뾥뾦뾧뾨뾩뾪뾫뾬뾭뾮뾯뾰뾱뾲뾳뾴뾵뾶뾷뾸뾹뾺뾻뾼뾽뾾뾿
    BFC0 뿀뿁뿂뿃뿄뿅뿆뿇뿈뿉뿊뿋뿌뿍뿎뿏뿐뿑뿒뿓뿔뿕뿖뿗뿘뿙뿚뿛뿜뿝뿞뿟
    BFE0 뿠뿡뿢뿣뿤뿥뿦뿧뿨뿩뿪뿫뿬뿭뿮뿯뿰뿱뿲뿳뿴뿵뿶뿷뿸뿹뿺뿻뿼뿽뿾뿿
    C000 쀀쀁쀂쀃쀄쀅쀆쀇쀈쀉쀊쀋쀌쀍쀎쀏쀐쀑쀒쀓쀔쀕쀖쀗쀘쀙쀚쀛쀜쀝쀞쀟
    C020 쀠쀡쀢쀣쀤쀥쀦쀧쀨쀩쀪쀫쀬쀭쀮쀯쀰쀱쀲쀳쀴쀵쀶쀷쀸쀹쀺쀻쀼쀽쀾쀿
    C040 쁀쁁쁂쁃쁄쁅쁆쁇쁈쁉쁊쁋쁌쁍쁎쁏쁐쁑쁒쁓쁔쁕쁖쁗쁘쁙쁚쁛쁜쁝쁞쁟
    C060 쁠쁡쁢쁣쁤쁥쁦쁧쁨쁩쁪쁫쁬쁭쁮쁯쁰쁱쁲쁳쁴쁵쁶쁷쁸쁹쁺쁻쁼쁽쁾쁿
    C080 삀삁삂삃삄삅삆삇삈삉삊삋삌삍삎삏삐삑삒삓삔삕삖삗삘삙삚삛삜삝삞삟
    C0A0 삠삡삢삣삤삥삦삧삨삩삪삫사삭삮삯산삱삲삳살삵삶삷삸삹삺삻삼삽삾삿
    C0C0 샀상샂샃샄샅샆샇새색샊샋샌샍샎샏샐샑샒샓샔샕샖샗샘샙샚샛샜생샞샟
    C0E0 샠샡샢샣샤샥샦샧샨샩샪샫샬샭샮샯샰샱샲샳샴샵샶샷샸샹샺샻샼샽샾샿
    C100 섀섁섂섃섄섅섆섇섈섉섊섋섌섍섎섏섐섑섒섓섔섕섖섗섘섙섚섛서석섞섟
    C120 선섡섢섣설섥섦섧섨섩섪섫섬섭섮섯섰성섲섳섴섵섶섷세섹섺섻센섽섾섿
    C140 셀셁셂셃셄셅셆셇셈셉셊셋셌셍셎셏셐셑셒셓셔셕셖셗션셙셚셛셜셝셞셟
    C160 셠셡셢셣셤셥셦셧셨셩셪셫셬셭셮셯셰셱셲셳셴셵셶셷셸셹셺셻셼셽셾셿
    C180 솀솁솂솃솄솅솆솇솈솉솊솋소속솎솏손솑솒솓솔솕솖솗솘솙솚솛솜솝솞솟
    C1A0 솠송솢솣솤솥솦솧솨솩솪솫솬솭솮솯솰솱솲솳솴솵솶솷솸솹솺솻솼솽솾솿
    C1C0 쇀쇁쇂쇃쇄쇅쇆쇇쇈쇉쇊쇋쇌쇍쇎쇏쇐쇑쇒쇓쇔쇕쇖쇗쇘쇙쇚쇛쇜쇝쇞쇟
    C1E0 쇠쇡쇢쇣쇤쇥쇦쇧쇨쇩쇪쇫쇬쇭쇮쇯쇰쇱쇲쇳쇴쇵쇶쇷쇸쇹쇺쇻쇼쇽쇾쇿
    C200 숀숁숂숃숄숅숆숇숈숉숊숋숌숍숎숏숐숑숒숓숔숕숖숗수숙숚숛순숝숞숟
    C220 술숡숢숣숤숥숦숧숨숩숪숫숬숭숮숯숰숱숲숳숴숵숶숷숸숹숺숻숼숽숾숿
    C240 쉀쉁쉂쉃쉄쉅쉆쉇쉈쉉쉊쉋쉌쉍쉎쉏쉐쉑쉒쉓쉔쉕쉖쉗쉘쉙쉚쉛쉜쉝쉞쉟
    C260 쉠쉡쉢쉣쉤쉥쉦쉧쉨쉩쉪쉫쉬쉭쉮쉯쉰쉱쉲쉳쉴쉵쉶쉷쉸쉹쉺쉻쉼쉽쉾쉿
    C280 슀슁슂슃슄슅슆슇슈슉슊슋슌슍슎슏슐슑슒슓슔슕슖슗슘슙슚슛슜슝슞슟
    C2A0 슠슡슢슣스슥슦슧슨슩슪슫슬슭슮슯슰슱슲슳슴습슶슷슸승슺슻슼슽슾슿
    C2C0 싀싁싂싃싄싅싆싇싈싉싊싋싌싍싎싏싐싑싒싓싔싕싖싗싘싙싚싛시식싞싟
    C2E0 신싡싢싣실싥싦싧싨싩싪싫심십싮싯싰싱싲싳싴싵싶싷싸싹싺싻싼싽싾싿
    C300 쌀쌁쌂쌃쌄쌅쌆쌇쌈쌉쌊쌋쌌쌍쌎쌏쌐쌑쌒쌓쌔쌕쌖쌗쌘쌙쌚쌛쌜쌝쌞쌟
    C320 쌠쌡쌢쌣쌤쌥쌦쌧쌨쌩쌪쌫쌬쌭쌮쌯쌰쌱쌲쌳쌴쌵쌶쌷쌸쌹쌺쌻쌼쌽쌾쌿
    C340 썀썁썂썃썄썅썆썇썈썉썊썋썌썍썎썏썐썑썒썓썔썕썖썗썘썙썚썛썜썝썞썟
    C360 썠썡썢썣썤썥썦썧써썩썪썫썬썭썮썯썰썱썲썳썴썵썶썷썸썹썺썻썼썽썾썿
    C380 쎀쎁쎂쎃쎄쎅쎆쎇쎈쎉쎊쎋쎌쎍쎎쎏쎐쎑쎒쎓쎔쎕쎖쎗쎘쎙쎚쎛쎜쎝쎞쎟
    C3A0 쎠쎡쎢쎣쎤쎥쎦쎧쎨쎩쎪쎫쎬쎭쎮쎯쎰쎱쎲쎳쎴쎵쎶쎷쎸쎹쎺쎻쎼쎽쎾쎿
    C3C0 쏀쏁쏂쏃쏄쏅쏆쏇쏈쏉쏊쏋쏌쏍쏎쏏쏐쏑쏒쏓쏔쏕쏖쏗쏘쏙쏚쏛쏜쏝쏞쏟
    C3E0 쏠쏡쏢쏣쏤쏥쏦쏧쏨쏩쏪쏫쏬쏭쏮쏯쏰쏱쏲쏳쏴쏵쏶쏷쏸쏹쏺쏻쏼쏽쏾쏿
    C400 쐀쐁쐂쐃쐄쐅쐆쐇쐈쐉쐊쐋쐌쐍쐎쐏쐐쐑쐒쐓쐔쐕쐖쐗쐘쐙쐚쐛쐜쐝쐞쐟
    C420 쐠쐡쐢쐣쐤쐥쐦쐧쐨쐩쐪쐫쐬쐭쐮쐯쐰쐱쐲쐳쐴쐵쐶쐷쐸쐹쐺쐻쐼쐽쐾쐿
    C440 쑀쑁쑂쑃쑄쑅쑆쑇쑈쑉쑊쑋쑌쑍쑎쑏쑐쑑쑒쑓쑔쑕쑖쑗쑘쑙쑚쑛쑜쑝쑞쑟
    C460 쑠쑡쑢쑣쑤쑥쑦쑧쑨쑩쑪쑫쑬쑭쑮쑯쑰쑱쑲쑳쑴쑵쑶쑷쑸쑹쑺쑻쑼쑽쑾쑿
    C480 쒀쒁쒂쒃쒄쒅쒆쒇쒈쒉쒊쒋쒌쒍쒎쒏쒐쒑쒒쒓쒔쒕쒖쒗쒘쒙쒚쒛쒜쒝쒞쒟
    C4A0 쒠쒡쒢쒣쒤쒥쒦쒧쒨쒩쒪쒫쒬쒭쒮쒯쒰쒱쒲쒳쒴쒵쒶쒷쒸쒹쒺쒻쒼쒽쒾쒿
    C4C0 쓀쓁쓂쓃쓄쓅쓆쓇쓈쓉쓊쓋쓌쓍쓎쓏쓐쓑쓒쓓쓔쓕쓖쓗쓘쓙쓚쓛쓜쓝쓞쓟
    C4E0 쓠쓡쓢쓣쓤쓥쓦쓧쓨쓩쓪쓫쓬쓭쓮쓯쓰쓱쓲쓳쓴쓵쓶쓷쓸쓹쓺쓻쓼쓽쓾쓿
    C500 씀씁씂씃씄씅씆씇씈씉씊씋씌씍씎씏씐씑씒씓씔씕씖씗씘씙씚씛씜씝씞씟
    C520 씠씡씢씣씤씥씦씧씨씩씪씫씬씭씮씯씰씱씲씳씴씵씶씷씸씹씺씻씼씽씾씿
    C540 앀앁앂앃아악앆앇안앉않앋알앍앎앏앐앑앒앓암압앖앗았앙앚앛앜앝앞앟
    C560 애액앢앣앤앥앦앧앨앩앪앫앬앭앮앯앰앱앲앳앴앵앶앷앸앹앺앻야약앾앿
    C580 얀얁얂얃얄얅얆얇얈얉얊얋얌얍얎얏얐양얒얓얔얕얖얗얘얙얚얛얜얝얞얟
    C5A0 얠얡얢얣얤얥얦얧얨얩얪얫얬얭얮얯얰얱얲얳어억얶얷언얹얺얻얼얽얾얿
    C5C0 엀엁엂엃엄업없엇었엉엊엋엌엍엎엏에엑엒엓엔엕엖엗엘엙엚엛엜엝엞엟
    C5E0 엠엡엢엣엤엥엦엧엨엩엪엫여역엮엯연엱엲엳열엵엶엷엸엹엺엻염엽엾엿
    C600 였영옂옃옄옅옆옇예옉옊옋옌옍옎옏옐옑옒옓옔옕옖옗옘옙옚옛옜옝옞옟
    C620 옠옡옢옣오옥옦옧온옩옪옫올옭옮옯옰옱옲옳옴옵옶옷옸옹옺옻옼옽옾옿
    C640 와왁왂왃완왅왆왇왈왉왊왋왌왍왎왏왐왑왒왓왔왕왖왗왘왙왚왛왜왝왞왟
    C660 왠왡왢왣왤왥왦왧왨왩왪왫왬왭왮왯왰왱왲왳왴왵왶왷외왹왺왻왼왽왾왿
    C680 욀욁욂욃욄욅욆욇욈욉욊욋욌욍욎욏욐욑욒욓요욕욖욗욘욙욚욛욜욝욞욟
    C6A0 욠욡욢욣욤욥욦욧욨용욪욫욬욭욮욯우욱욲욳운욵욶욷울욹욺욻욼욽욾욿
    C6C0 움웁웂웃웄웅웆웇웈웉웊웋워웍웎웏원웑웒웓월웕웖웗웘웙웚웛웜웝웞웟
    C6E0 웠웡웢웣웤웥웦웧웨웩웪웫웬웭웮웯웰웱웲웳웴웵웶웷웸웹웺웻웼웽웾웿
    C700 윀윁윂윃위윅윆윇윈윉윊윋윌윍윎윏윐윑윒윓윔윕윖윗윘윙윚윛윜윝윞윟
    C720 유육윢윣윤윥윦윧율윩윪윫윬윭윮윯윰윱윲윳윴융윶윷윸윹윺윻으윽윾윿
    C740 은읁읂읃을읅읆읇읈읉읊읋음읍읎읏읐응읒읓읔읕읖읗의읙읚읛읜읝읞읟
    C760 읠읡읢읣읤읥읦읧읨읩읪읫읬읭읮읯읰읱읲읳이익읶읷인읹읺읻일읽읾읿
    C780 잀잁잂잃임입잆잇있잉잊잋잌잍잎잏자작잒잓잔잕잖잗잘잙잚잛잜잝잞잟
    C7A0 잠잡잢잣잤장잦잧잨잩잪잫재잭잮잯잰잱잲잳잴잵잶잷잸잹잺잻잼잽잾잿
    C7C0 쟀쟁쟂쟃쟄쟅쟆쟇쟈쟉쟊쟋쟌쟍쟎쟏쟐쟑쟒쟓쟔쟕쟖쟗쟘쟙쟚쟛쟜쟝쟞쟟
    C7E0 쟠쟡쟢쟣쟤쟥쟦쟧쟨쟩쟪쟫쟬쟭쟮쟯쟰쟱쟲쟳쟴쟵쟶쟷쟸쟹쟺쟻쟼쟽쟾쟿
    C800 저적젂젃전젅젆젇절젉젊젋젌젍젎젏점접젒젓젔정젖젗젘젙젚젛제젝젞젟
    C820 젠젡젢젣젤젥젦젧젨젩젪젫젬젭젮젯젰젱젲젳젴젵젶젷져젹젺젻젼젽젾젿
    C840 졀졁졂졃졄졅졆졇졈졉졊졋졌졍졎졏졐졑졒졓졔졕졖졗졘졙졚졛졜졝졞졟
    C860 졠졡졢졣졤졥졦졧졨졩졪졫졬졭졮졯조족졲졳존졵졶졷졸졹졺졻졼졽졾졿
    C880 좀좁좂좃좄종좆좇좈좉좊좋좌좍좎좏좐좑좒좓좔좕좖좗좘좙좚좛좜좝좞좟
    C8A0 좠좡좢좣좤좥좦좧좨좩좪좫좬좭좮좯좰좱좲좳좴좵좶좷좸좹좺좻좼좽좾좿
    C8C0 죀죁죂죃죄죅죆죇죈죉죊죋죌죍죎죏죐죑죒죓죔죕죖죗죘죙죚죛죜죝죞죟
    C8E0 죠죡죢죣죤죥죦죧죨죩죪죫죬죭죮죯죰죱죲죳죴죵죶죷죸죹죺죻주죽죾죿
    C900 준줁줂줃줄줅줆줇줈줉줊줋줌줍줎줏줐중줒줓줔줕줖줗줘줙줚줛줜줝줞줟
    C920 줠줡줢줣줤줥줦줧줨줩줪줫줬줭줮줯줰줱줲줳줴줵줶줷줸줹줺줻줼줽줾줿
    C940 쥀쥁쥂쥃쥄쥅쥆쥇쥈쥉쥊쥋쥌쥍쥎쥏쥐쥑쥒쥓쥔쥕쥖쥗쥘쥙쥚쥛쥜쥝쥞쥟
    C960 쥠쥡쥢쥣쥤쥥쥦쥧쥨쥩쥪쥫쥬쥭쥮쥯쥰쥱쥲쥳쥴쥵쥶쥷쥸쥹쥺쥻쥼쥽쥾쥿
    C980 즀즁즂즃즄즅즆즇즈즉즊즋즌즍즎즏즐즑즒즓즔즕즖즗즘즙즚즛즜증즞즟
    C9A0 즠즡즢즣즤즥즦즧즨즩즪즫즬즭즮즯즰즱즲즳즴즵즶즷즸즹즺즻즼즽즾즿
    C9C0 지직짂짃진짅짆짇질짉짊짋짌짍짎짏짐집짒짓짔징짖짗짘짙짚짛짜짝짞짟
    C9E0 짠짡짢짣짤짥짦짧짨짩짪짫짬짭짮짯짰짱짲짳짴짵짶짷째짹짺짻짼짽짾짿
    CA00 쨀쨁쨂쨃쨄쨅쨆쨇쨈쨉쨊쨋쨌쨍쨎쨏쨐쨑쨒쨓쨔쨕쨖쨗쨘쨙쨚쨛쨜쨝쨞쨟
    CA20 쨠쨡쨢쨣쨤쨥쨦쨧쨨쨩쨪쨫쨬쨭쨮쨯쨰쨱쨲쨳쨴쨵쨶쨷쨸쨹쨺쨻쨼쨽쨾쨿
    CA40 쩀쩁쩂쩃쩄쩅쩆쩇쩈쩉쩊쩋쩌쩍쩎쩏쩐쩑쩒쩓쩔쩕쩖쩗쩘쩙쩚쩛쩜쩝쩞쩟
    CA60 쩠쩡쩢쩣쩤쩥쩦쩧쩨쩩쩪쩫쩬쩭쩮쩯쩰쩱쩲쩳쩴쩵쩶쩷쩸쩹쩺쩻쩼쩽쩾쩿
    CA80 쪀쪁쪂쪃쪄쪅쪆쪇쪈쪉쪊쪋쪌쪍쪎쪏쪐쪑쪒쪓쪔쪕쪖쪗쪘쪙쪚쪛쪜쪝쪞쪟
    CAA0 쪠쪡쪢쪣쪤쪥쪦쪧쪨쪩쪪쪫쪬쪭쪮쪯쪰쪱쪲쪳쪴쪵쪶쪷쪸쪹쪺쪻쪼쪽쪾쪿
    CAC0 쫀쫁쫂쫃쫄쫅쫆쫇쫈쫉쫊쫋쫌쫍쫎쫏쫐쫑쫒쫓쫔쫕쫖쫗쫘쫙쫚쫛쫜쫝쫞쫟
    CAE0 쫠쫡쫢쫣쫤쫥쫦쫧쫨쫩쫪쫫쫬쫭쫮쫯쫰쫱쫲쫳쫴쫵쫶쫷쫸쫹쫺쫻쫼쫽쫾쫿
    CB00 쬀쬁쬂쬃쬄쬅쬆쬇쬈쬉쬊쬋쬌쬍쬎쬏쬐쬑쬒쬓쬔쬕쬖쬗쬘쬙쬚쬛쬜쬝쬞쬟
    CB20 쬠쬡쬢쬣쬤쬥쬦쬧쬨쬩쬪쬫쬬쬭쬮쬯쬰쬱쬲쬳쬴쬵쬶쬷쬸쬹쬺쬻쬼쬽쬾쬿
    CB40 쭀쭁쭂쭃쭄쭅쭆쭇쭈쭉쭊쭋쭌쭍쭎쭏쭐쭑쭒쭓쭔쭕쭖쭗쭘쭙쭚쭛쭜쭝쭞쭟
    CB60 쭠쭡쭢쭣쭤쭥쭦쭧쭨쭩쭪쭫쭬쭭쭮쭯쭰쭱쭲쭳쭴쭵쭶쭷쭸쭹쭺쭻쭼쭽쭾쭿
    CB80 쮀쮁쮂쮃쮄쮅쮆쮇쮈쮉쮊쮋쮌쮍쮎쮏쮐쮑쮒쮓쮔쮕쮖쮗쮘쮙쮚쮛쮜쮝쮞쮟
    CBA0 쮠쮡쮢쮣쮤쮥쮦쮧쮨쮩쮪쮫쮬쮭쮮쮯쮰쮱쮲쮳쮴쮵쮶쮷쮸쮹쮺쮻쮼쮽쮾쮿
    CBC0 쯀쯁쯂쯃쯄쯅쯆쯇쯈쯉쯊쯋쯌쯍쯎쯏쯐쯑쯒쯓쯔쯕쯖쯗쯘쯙쯚쯛쯜쯝쯞쯟
    CBE0 쯠쯡쯢쯣쯤쯥쯦쯧쯨쯩쯪쯫쯬쯭쯮쯯쯰쯱쯲쯳쯴쯵쯶쯷쯸쯹쯺쯻쯼쯽쯾쯿
    CC00 찀찁찂찃찄찅찆찇찈찉찊찋찌찍찎찏찐찑찒찓찔찕찖찗찘찙찚찛찜찝찞찟
    CC20 찠찡찢찣찤찥찦찧차착찪찫찬찭찮찯찰찱찲찳찴찵찶찷참찹찺찻찼창찾찿
    CC40 챀챁챂챃채책챆챇챈챉챊챋챌챍챎챏챐챑챒챓챔챕챖챗챘챙챚챛챜챝챞챟
    CC60 챠챡챢챣챤챥챦챧챨챩챪챫챬챭챮챯챰챱챲챳챴챵챶챷챸챹챺챻챼챽챾챿
    CC80 첀첁첂첃첄첅첆첇첈첉첊첋첌첍첎첏첐첑첒첓첔첕첖첗처척첚첛천첝첞첟
    CCA0 철첡첢첣첤첥첦첧첨첩첪첫첬청첮첯첰첱첲첳체첵첶첷첸첹첺첻첼첽첾첿
    CCC0 쳀쳁쳂쳃쳄쳅쳆쳇쳈쳉쳊쳋쳌쳍쳎쳏쳐쳑쳒쳓쳔쳕쳖쳗쳘쳙쳚쳛쳜쳝쳞쳟
    CCE0 쳠쳡쳢쳣쳤쳥쳦쳧쳨쳩쳪쳫쳬쳭쳮쳯쳰쳱쳲쳳쳴쳵쳶쳷쳸쳹쳺쳻쳼쳽쳾쳿
    CD00 촀촁촂촃촄촅촆촇초촉촊촋촌촍촎촏촐촑촒촓촔촕촖촗촘촙촚촛촜총촞촟
    CD20 촠촡촢촣촤촥촦촧촨촩촪촫촬촭촮촯촰촱촲촳촴촵촶촷촸촹촺촻촼촽촾촿
    CD40 쵀쵁쵂쵃쵄쵅쵆쵇쵈쵉쵊쵋쵌쵍쵎쵏쵐쵑쵒쵓쵔쵕쵖쵗쵘쵙쵚쵛최쵝쵞쵟
    CD60 쵠쵡쵢쵣쵤쵥쵦쵧쵨쵩쵪쵫쵬쵭쵮쵯쵰쵱쵲쵳쵴쵵쵶쵷쵸쵹쵺쵻쵼쵽쵾쵿
    CD80 춀춁춂춃춄춅춆춇춈춉춊춋춌춍춎춏춐춑춒춓추축춖춗춘춙춚춛출춝춞춟
    CDA0 춠춡춢춣춤춥춦춧춨충춪춫춬춭춮춯춰춱춲춳춴춵춶춷춸춹춺춻춼춽춾춿
    CDC0 췀췁췂췃췄췅췆췇췈췉췊췋췌췍췎췏췐췑췒췓췔췕췖췗췘췙췚췛췜췝췞췟
    CDE0 췠췡췢췣췤췥췦췧취췩췪췫췬췭췮췯췰췱췲췳췴췵췶췷췸췹췺췻췼췽췾췿
    CE00 츀츁츂츃츄츅츆츇츈츉츊츋츌츍츎츏츐츑츒츓츔츕츖츗츘츙츚츛츜츝츞츟
    CE20 츠측츢츣츤츥츦츧츨츩츪츫츬츭츮츯츰츱츲츳츴층츶츷츸츹츺츻츼츽츾츿
    CE40 칀칁칂칃칄칅칆칇칈칉칊칋칌칍칎칏칐칑칒칓칔칕칖칗치칙칚칛친칝칞칟
    CE60 칠칡칢칣칤칥칦칧침칩칪칫칬칭칮칯칰칱칲칳카칵칶칷칸칹칺칻칼칽칾칿
    CE80 캀캁캂캃캄캅캆캇캈캉캊캋캌캍캎캏캐캑캒캓캔캕캖캗캘캙캚캛캜캝캞캟
    CEA0 캠캡캢캣캤캥캦캧캨캩캪캫캬캭캮캯캰캱캲캳캴캵캶캷캸캹캺캻캼캽캾캿
    CEC0 컀컁컂컃컄컅컆컇컈컉컊컋컌컍컎컏컐컑컒컓컔컕컖컗컘컙컚컛컜컝컞컟
    CEE0 컠컡컢컣커컥컦컧컨컩컪컫컬컭컮컯컰컱컲컳컴컵컶컷컸컹컺컻컼컽컾컿
    CF00 케켁켂켃켄켅켆켇켈켉켊켋켌켍켎켏켐켑켒켓켔켕켖켗켘켙켚켛켜켝켞켟
    CF20 켠켡켢켣켤켥켦켧켨켩켪켫켬켭켮켯켰켱켲켳켴켵켶켷켸켹켺켻켼켽켾켿
    CF40 콀콁콂콃콄콅콆콇콈콉콊콋콌콍콎콏콐콑콒콓코콕콖콗콘콙콚콛콜콝콞콟
    CF60 콠콡콢콣콤콥콦콧콨콩콪콫콬콭콮콯콰콱콲콳콴콵콶콷콸콹콺콻콼콽콾콿
    CF80 쾀쾁쾂쾃쾄쾅쾆쾇쾈쾉쾊쾋쾌쾍쾎쾏쾐쾑쾒쾓쾔쾕쾖쾗쾘쾙쾚쾛쾜쾝쾞쾟
    CFA0 쾠쾡쾢쾣쾤쾥쾦쾧쾨쾩쾪쾫쾬쾭쾮쾯쾰쾱쾲쾳쾴쾵쾶쾷쾸쾹쾺쾻쾼쾽쾾쾿
    CFC0 쿀쿁쿂쿃쿄쿅쿆쿇쿈쿉쿊쿋쿌쿍쿎쿏쿐쿑쿒쿓쿔쿕쿖쿗쿘쿙쿚쿛쿜쿝쿞쿟
    CFE0 쿠쿡쿢쿣쿤쿥쿦쿧쿨쿩쿪쿫쿬쿭쿮쿯쿰쿱쿲쿳쿴쿵쿶쿷쿸쿹쿺쿻쿼쿽쿾쿿
    D000 퀀퀁퀂퀃퀄퀅퀆퀇퀈퀉퀊퀋퀌퀍퀎퀏퀐퀑퀒퀓퀔퀕퀖퀗퀘퀙퀚퀛퀜퀝퀞퀟
    D020 퀠퀡퀢퀣퀤퀥퀦퀧퀨퀩퀪퀫퀬퀭퀮퀯퀰퀱퀲퀳퀴퀵퀶퀷퀸퀹퀺퀻퀼퀽퀾퀿
    D040 큀큁큂큃큄큅큆큇큈큉큊큋큌큍큎큏큐큑큒큓큔큕큖큗큘큙큚큛큜큝큞큟
    D060 큠큡큢큣큤큥큦큧큨큩큪큫크큭큮큯큰큱큲큳클큵큶큷큸큹큺큻큼큽큾큿
    D080 킀킁킂킃킄킅킆킇킈킉킊킋킌킍킎킏킐킑킒킓킔킕킖킗킘킙킚킛킜킝킞킟
    D0A0 킠킡킢킣키킥킦킧킨킩킪킫킬킭킮킯킰킱킲킳킴킵킶킷킸킹킺킻킼킽킾킿
    D0C0 타탁탂탃탄탅탆탇탈탉탊탋탌탍탎탏탐탑탒탓탔탕탖탗탘탙탚탛태택탞탟
    D0E0 탠탡탢탣탤탥탦탧탨탩탪탫탬탭탮탯탰탱탲탳탴탵탶탷탸탹탺탻탼탽탾탿
    D100 턀턁턂턃턄턅턆턇턈턉턊턋턌턍턎턏턐턑턒턓턔턕턖턗턘턙턚턛턜턝턞턟
    D120 턠턡턢턣턤턥턦턧턨턩턪턫턬턭턮턯터턱턲턳턴턵턶턷털턹턺턻턼턽턾턿
    D140 텀텁텂텃텄텅텆텇텈텉텊텋테텍텎텏텐텑텒텓텔텕텖텗텘텙텚텛템텝텞텟
    D160 텠텡텢텣텤텥텦텧텨텩텪텫텬텭텮텯텰텱텲텳텴텵텶텷텸텹텺텻텼텽텾텿
    D180 톀톁톂톃톄톅톆톇톈톉톊톋톌톍톎톏톐톑톒톓톔톕톖톗톘톙톚톛톜톝톞톟
    D1A0 토톡톢톣톤톥톦톧톨톩톪톫톬톭톮톯톰톱톲톳톴통톶톷톸톹톺톻톼톽톾톿
    D1C0 퇀퇁퇂퇃퇄퇅퇆퇇퇈퇉퇊퇋퇌퇍퇎퇏퇐퇑퇒퇓퇔퇕퇖퇗퇘퇙퇚퇛퇜퇝퇞퇟
    D1E0 퇠퇡퇢퇣퇤퇥퇦퇧퇨퇩퇪퇫퇬퇭퇮퇯퇰퇱퇲퇳퇴퇵퇶퇷퇸퇹퇺퇻퇼퇽퇾퇿
    D200 툀툁툂툃툄툅툆툇툈툉툊툋툌툍툎툏툐툑툒툓툔툕툖툗툘툙툚툛툜툝툞툟
    D220 툠툡툢툣툤툥툦툧툨툩툪툫투툭툮툯툰툱툲툳툴툵툶툷툸툹툺툻툼툽툾툿
    D240 퉀퉁퉂퉃퉄퉅퉆퉇퉈퉉퉊퉋퉌퉍퉎퉏퉐퉑퉒퉓퉔퉕퉖퉗퉘퉙퉚퉛퉜퉝퉞퉟
    D260 퉠퉡퉢퉣퉤퉥퉦퉧퉨퉩퉪퉫퉬퉭퉮퉯퉰퉱퉲퉳퉴퉵퉶퉷퉸퉹퉺퉻퉼퉽퉾퉿
    D280 튀튁튂튃튄튅튆튇튈튉튊튋튌튍튎튏튐튑튒튓튔튕튖튗튘튙튚튛튜튝튞튟
    D2A0 튠튡튢튣튤튥튦튧튨튩튪튫튬튭튮튯튰튱튲튳튴튵튶튷트특튺튻튼튽튾튿
    D2C0 틀틁틂틃틄틅틆틇틈틉틊틋틌틍틎틏틐틑틒틓틔틕틖틗틘틙틚틛틜틝틞틟
    D2E0 틠틡틢틣틤틥틦틧틨틩틪틫틬틭틮틯티틱틲틳틴틵틶틷틸틹틺틻틼틽틾틿
    D300 팀팁팂팃팄팅팆팇팈팉팊팋파팍팎팏판팑팒팓팔팕팖팗팘팙팚팛팜팝팞팟
    D320 팠팡팢팣팤팥팦팧패팩팪팫팬팭팮팯팰팱팲팳팴팵팶팷팸팹팺팻팼팽팾팿
    D340 퍀퍁퍂퍃퍄퍅퍆퍇퍈퍉퍊퍋퍌퍍퍎퍏퍐퍑퍒퍓퍔퍕퍖퍗퍘퍙퍚퍛퍜퍝퍞퍟
    D360 퍠퍡퍢퍣퍤퍥퍦퍧퍨퍩퍪퍫퍬퍭퍮퍯퍰퍱퍲퍳퍴퍵퍶퍷퍸퍹퍺퍻퍼퍽퍾퍿
    D380 펀펁펂펃펄펅펆펇펈펉펊펋펌펍펎펏펐펑펒펓펔펕펖펗페펙펚펛펜펝펞펟
    D3A0 펠펡펢펣펤펥펦펧펨펩펪펫펬펭펮펯펰펱펲펳펴펵펶펷편펹펺펻펼펽펾펿
    D3C0 폀폁폂폃폄폅폆폇폈평폊폋폌폍폎폏폐폑폒폓폔폕폖폗폘폙폚폛폜폝폞폟
    D3E0 폠폡폢폣폤폥폦폧폨폩폪폫포폭폮폯폰폱폲폳폴폵폶폷폸폹폺폻폼폽폾폿
    D400 퐀퐁퐂퐃퐄퐅퐆퐇퐈퐉퐊퐋퐌퐍퐎퐏퐐퐑퐒퐓퐔퐕퐖퐗퐘퐙퐚퐛퐜퐝퐞퐟
    D420 퐠퐡퐢퐣퐤퐥퐦퐧퐨퐩퐪퐫퐬퐭퐮퐯퐰퐱퐲퐳퐴퐵퐶퐷퐸퐹퐺퐻퐼퐽퐾퐿
    D440 푀푁푂푃푄푅푆푇푈푉푊푋푌푍푎푏푐푑푒푓푔푕푖푗푘푙푚푛표푝푞푟
    D460 푠푡푢푣푤푥푦푧푨푩푪푫푬푭푮푯푰푱푲푳푴푵푶푷푸푹푺푻푼푽푾푿
    D480 풀풁풂풃풄풅풆풇품풉풊풋풌풍풎풏풐풑풒풓풔풕풖풗풘풙풚풛풜풝풞풟
    D4A0 풠풡풢풣풤풥풦풧풨풩풪풫풬풭풮풯풰풱풲풳풴풵풶풷풸풹풺풻풼풽풾풿
    D4C0 퓀퓁퓂퓃퓄퓅퓆퓇퓈퓉퓊퓋퓌퓍퓎퓏퓐퓑퓒퓓퓔퓕퓖퓗퓘퓙퓚퓛퓜퓝퓞퓟
    D4E0 퓠퓡퓢퓣퓤퓥퓦퓧퓨퓩퓪퓫퓬퓭퓮퓯퓰퓱퓲퓳퓴퓵퓶퓷퓸퓹퓺퓻퓼퓽퓾퓿
    D500 픀픁픂픃프픅픆픇픈픉픊픋플픍픎픏픐픑픒픓픔픕픖픗픘픙픚픛픜픝픞픟
    D520 픠픡픢픣픤픥픦픧픨픩픪픫픬픭픮픯픰픱픲픳픴픵픶픷픸픹픺픻피픽픾픿
    D540 핀핁핂핃필핅핆핇핈핉핊핋핌핍핎핏핐핑핒핓핔핕핖핗하학핚핛한핝핞핟
    D560 할핡핢핣핤핥핦핧함합핪핫핬항핮핯핰핱핲핳해핵핶핷핸핹핺핻핼핽핾핿
    D580 햀햁햂햃햄햅햆햇했행햊햋햌햍햎햏햐햑햒햓햔햕햖햗햘햙햚햛햜햝햞햟
    D5A0 햠햡햢햣햤향햦햧햨햩햪햫햬햭햮햯햰햱햲햳햴햵햶햷햸햹햺햻햼햽햾햿
    D5C0 헀헁헂헃헄헅헆헇허헉헊헋헌헍헎헏헐헑헒헓헔헕헖헗험헙헚헛헜헝헞헟
    D5E0 헠헡헢헣헤헥헦헧헨헩헪헫헬헭헮헯헰헱헲헳헴헵헶헷헸헹헺헻헼헽헾헿
    D600 혀혁혂혃현혅혆혇혈혉혊혋혌혍혎혏혐협혒혓혔형혖혗혘혙혚혛혜혝혞혟
    D620 혠혡혢혣혤혥혦혧혨혩혪혫혬혭혮혯혰혱혲혳혴혵혶혷호혹혺혻혼혽혾혿
    D640 홀홁홂홃홄홅홆홇홈홉홊홋홌홍홎홏홐홑홒홓화확홖홗환홙홚홛활홝홞홟
    D660 홠홡홢홣홤홥홦홧홨황홪홫홬홭홮홯홰홱홲홳홴홵홶홷홸홹홺홻홼홽홾홿
    D680 횀횁횂횃횄횅횆횇횈횉횊횋회획횎횏횐횑횒횓횔횕횖횗횘횙횚횛횜횝횞횟
    D6A0 횠횡횢횣횤횥횦횧효횩횪횫횬횭횮횯횰횱횲횳횴횵횶횷횸횹횺횻횼횽횾횿
    D6C0 훀훁훂훃후훅훆훇훈훉훊훋훌훍훎훏훐훑훒훓훔훕훖훗훘훙훚훛훜훝훞훟
    D6E0 훠훡훢훣훤훥훦훧훨훩훪훫훬훭훮훯훰훱훲훳훴훵훶훷훸훹훺훻훼훽훾훿
    D700 휀휁휂휃휄휅휆휇휈휉휊휋휌휍휎휏휐휑휒휓휔휕휖휗휘휙휚휛휜휝휞휟
    D720 휠휡휢휣휤휥휦휧휨휩휪휫휬휭휮휯휰휱휲휳휴휵휶휷휸휹휺휻휼휽휾휿
    D740 흀흁흂흃흄흅흆흇흈흉흊흋흌흍흎흏흐흑흒흓흔흕흖흗흘흙흚흛흜흝흞흟
    D760 흠흡흢흣흤흥흦흧흨흩흪흫희흭흮흯흰흱흲흳흴흵흶흷흸흹흺흻흼흽흾흿
    D780 힀힁힂힃힄힅힆힇히힉힊힋힌힍힎힏힐힑힒힓힔힕힖힗힘힙힚힛힜힝힞힟
    D7A0 힠힡힢힣힤힥힦힧힨힩힪힫힬힭힮힯ힰힱힲힳힴힵힶힷힸힹힺힻힼힽힾힿ
    D7C0 ퟀퟁퟂퟃퟄퟅퟆ퟇퟈퟉퟊ퟋퟌퟍퟎퟏퟐퟑퟒퟓퟔퟕퟖퟗퟘퟙퟚퟛퟜퟝퟞퟟ
    D7E0 ퟠퟡퟢퟣퟤퟥퟦퟧퟨퟩퟪퟫퟬퟭퟮퟯퟰퟱퟲퟳퟴퟵퟶퟷퟸퟹퟺퟻ퟼퟽퟾퟿
    D800 ��������������������������������
    D820 ��������������������������������
    D840 ��������������������������������
    D860 ��������������������������������
    D880 ��������������������������������
    D8A0 ��������������������������������
    D8C0 ��������������������������������
    D8E0 ��������������������������������
    D900 ��������������������������������
    D920 ��������������������������������
    D940 �������������������������������� br />D960 ��������������������������������
    D980 ��������������������������������
    D9A0 ��������������������������������
    D9C0 ��������������������������������
    D9E0 ��������������������������������
    DA00 ��������������������������������
    DA20 ��������������������������������
    DA40 ��������������������������������
    DA60 ��������������������������������
    DA80 ��������������������������������
    DAA0 ��������������������������������
    DAC0 ��������������������������������
    DAE0 ��������������������������������
    DB00 ��������������������������������
    DB20 ��������������������������������
    DB40 ��������������������������������
    DB60 ��������������������������������
    DB80 ��������������������������������
    DBA0 ��������������������������������
    DBC0 ��������������������������������
    DBE0 ��������������������������������
    DC00 ��������������������������������
    DC20 ��������������������������������
    DC40 ��������������������������������
    DC60 ��������������������������������
    DC80 ��������������������������������
    DCA0 ��������������������������������
    DCC0 ��������������������������������
    DCE0 ��������������������������������
    DD00 ��������������������������������
    DD20 ��������������������������������
    DD40 ��������������������������������
    DD60 ��������������������������������
    DD80 ��������������������������������
    DDA0 ��������������������������������
    DDC0 ��������������������������������
    DDE0 ��������������������������������
    DE00 ��������������������������������
    DE20 ��������������������������������
    DE40 ��������������������������������
    DE60 ��������������������������������
    DE80 ��������������������������������
    DEA0 ��������������������������������
    DEC0 ��������������������������������
    DEE0 ��������������������������������
    DF00 ��������������������������������
    DF20 ��������������������������������
    DF40 ��������������������������������
    DF60 ��������������������������������
    DF80 ��������������������������������
    DFA0 ��������������������������������
    DFC0 ��������������������������������
    DFE0 ��������������������������������
    E000 
    E020 
    E040 
    E060 
    E080 
    E0A0 
    E0C0 
    E0E0 
    E100 
    E120 
    E140 
    E160 
    E180 
    E1A0 
    E1C0 
    E1E0 
    E200 
    E220 
    E240 
    E260 
    E280 
    E2A0 
    E2C0 
    E2E0 
    E300 
    E320 
    E340 
    E360 
    E380 
    E3A0 
    E3C0 
    E3E0 
    E400 
    E420 
    E440 
    E460 
    E480 
    E4A0 
    E4C0 
    E4E0 
    E500 
    E520 
    E540 
    E560 
    E580 
    E5A0 
    E5C0 
    E5E0 
    E600 
    E620 
    E640 
    E660 
    E680 
    E6A0 
    E6C0 
    E6E0 
    E700 
    E720 
    E740 
    E760 
    E780 
    E7A0 
    E7C0 
    E7E0 
    E800 
    E820 
    E840 
    E860 
    E880 
    E8A0 
    E8C0 
    E8E0 
    E900 
    E920 
    E940 
    E960 
    E980 
    E9A0 
    E9C0 
    E9E0 
    EA00 
    EA20 
    EA40 
    EA60 
    EA80 
    EAA0 
    EAC0 
    EAE0 
    EB00 
    EB20 
    EB40 
    EB60 
    EB80 
    EBA0 
    EBC0 
    EBE0 
    EC00 
    EC20 
    EC40 
    EC60 
    EC80 
    ECA0 
    ECC0 
    ECE0 
    ED00 
    ED20 
    ED40 
    ED60 
    ED80 
    EDA0 
    EDC0 
    EDE0 
    EE00 
    EE20 
    EE40 
    EE60 
    EE80 
    EEA0 
    EEC0 
    EEE0 
    EF00 
    EF20 
    EF40 
    EF60 
    EF80 
    EFA0 
    EFC0 
    EFE0 
    F000 
    F020 
    F040 
    F060 
    F080 
    F0A0 
    F0C0 
    F0E0 
    F100 
    F120 
    F140 
    F160 
    F180 
    F1A0 
    F1C0 
    F1E0 
    F200 
    F220 
    F240 
    F260 
    F280 
    F2A0 
    F2C0 
    F2E0 
    F300 
    F320 
    F340 
    F360 
    F380 
    F3A0 
    F3C0 
    F3E0 
    F400 
    F420 
    F440 
    F460 
    F480 
    F4A0 
    F4C0 
    F4E0 
    F500 
    F520 
    F540 
    F560 
    F580 
    F5A0 
    F5C0 
    F5E0 
    F600 
    F620 
    F640 
    F660 
    F680 
    F6A0 
    F6C0 
    F6E0 
    F700 
    F720 
    F740 
    F760 
    F780 
    F7A0 
    F7C0 
    F7E0 
    F800 
    F820 
    F840 
    F860 
    F880 
    F8A0 
    F8C0 
    F8E0 
    F900 豈更車賈滑串句龜龜契金喇奈懶癩羅蘿螺裸邏樂洛烙珞落酪駱亂卵欄爛蘭
    F920 鸞嵐濫藍襤拉臘蠟廊朗浪狼郎來冷勞擄櫓爐盧老蘆虜路露魯鷺碌祿綠菉錄
    F940 鹿論壟弄籠聾牢磊賂雷壘屢樓淚漏累縷陋勒肋凜凌稜綾菱陵讀拏樂諾丹寧
    F960 怒率異北磻便復不泌數索參塞省葉說殺辰沈拾若掠略亮兩凉梁糧良諒量勵
    F980 呂女廬旅濾礪閭驪麗黎力曆歷轢年憐戀撚漣煉璉秊練聯輦蓮連鍊列劣咽烈
    F9A0 裂說廉念捻殮簾獵令囹寧嶺怜玲瑩羚聆鈴零靈領例禮醴隸惡了僚寮尿料樂
    F9C0 燎療蓼遼龍暈阮劉杻柳流溜琉留硫紐類六戮陸倫崙淪輪律慄栗率隆利吏履
    F9E0 易李梨泥理痢罹裏裡里離匿溺吝燐璘藺隣鱗麟林淋臨立笠粒狀炙識什茶刺
    FA00 切度拓糖宅洞暴輻行降見廓兀嗀﨎﨏塚﨑晴﨓﨔凞猪益礼神祥福靖精羽﨟
    FA20 蘒﨡諸﨣﨤逸都﨧﨨﨩飯飼館鶴郞隷侮僧免勉勤卑喝嘆器塀墨層屮悔慨憎
    FA40 懲敏既暑梅海渚漢煮爫琢碑社祉祈祐祖祝禍禎穀突節練縉繁署者臭艹艹著
    FA60 褐視謁謹賓贈辶逸難響頻恵𤋮舘﩮﩯並况全侀充冀勇勺喝啕喙嗢塚墳奄奔
    FA80 婢嬨廒廙彩徭惘慎愈憎慠懲戴揄搜摒敖晴朗望杖歹殺流滛滋漢瀞煮瞧爵犯
    FAA0 猪瑱甆画瘝瘟益盛直睊着磌窱節类絛練缾者荒華蝹襁覆視調諸請謁諾諭謹
    FAC0 變贈輸遲醙鉶陼難靖韛響頋頻鬒龜𢡊𢡄𣏕㮝䀘䀹𥉉𥳐𧻓齃龎﫚﫛﫜﫝﫞﫟
    FAE0 﫠﫡﫢﫣﫤﫥﫦﫧﫨﫩﫪﫫﫬﫭﫮﫯﫰﫱﫲﫳﫴﫵﫶﫷﫸﫹﫺﫻﫼﫽﫾﫿
    FB00 fffiflffifflſtst﬇﬈﬉﬊﬋﬌﬍﬎﬏﬐﬑﬒ﬓﬔﬕﬖﬗ﬘﬙﬚﬛﬜יִﬞײַ
    FB20 ﬠﬡﬢﬣﬤﬥﬦﬧﬨ﬩שׁשׂשּׁשּׂאַאָאּבּגּדּהּוּזּ﬷טּיּךּכּלּ﬽מּ﬿
    FB40 נּסּ﭂ףּפּ﭅צּקּרּשּתּוֹבֿכֿפֿﭏﭐﭑﭒﭓﭔﭕﭖﭗﭘﭙﭚﭛﭜﭝﭞﭟ
    FB60 ﭠﭡﭢﭣﭤﭥﭦﭧﭨﭩﭪﭫﭬﭭﭮﭯﭰﭱﭲﭳﭴﭵﭶﭷﭸﭹﭺﭻﭼﭽﭾﭿ
    FB80 ﮀﮁﮂﮃﮄﮅﮆﮇﮈﮉﮊﮋﮌﮍﮎﮏﮐﮑﮒﮓﮔﮕﮖﮗﮘﮙﮚﮛﮜﮝﮞﮟ
    FBA0 ﮠﮡﮢﮣﮤﮥﮦﮧﮨﮩﮪﮫﮬﮭﮮﮯﮰﮱ﮲﮳﮴﮵﮶﮷﮸﮹﮺﮻﮼﮽﮾﮿
    FBC0 ﯀﯁﯂﯃﯄﯅﯆﯇﯈﯉﯊﯋﯌﯍﯎﯏﯐﯑﯒ﯓﯔﯕﯖﯗﯘﯙﯚﯛﯜﯝﯞﯟ
    FBE0 ﯠﯡﯢﯣﯤﯥﯦﯧﯨﯩﯪﯫﯬﯭﯮﯯﯰﯱﯲﯳﯴﯵﯶﯷﯸﯹﯺﯻﯼﯽﯾﯿ
    FC00 ﰀﰁﰂﰃﰄﰅﰆﰇﰈﰉﰊﰋﰌﰍﰎﰏﰐﰑﰒﰓﰔﰕﰖﰗﰘﰙﰚﰛﰜﰝﰞﰟ
    FC20 ﰠﰡﰢﰣﰤﰥﰦﰧﰨﰩﰪﰫﰬﰭﰮﰯﰰﰱﰲﰳﰴﰵﰶﰷﰸﰹﰺﰻﰼﰽﰾﰿ
    FC40 ﱀﱁﱂﱃﱄﱅﱆﱇﱈﱉﱊﱋﱌﱍﱎﱏﱐﱑﱒﱓﱔﱕﱖﱗﱘﱙﱚﱛﱜﱝﱞﱟ
    FC60 ﱠﱡﱢﱣﱤﱥﱦﱧﱨﱩﱪﱫﱬﱭﱮﱯﱰﱱﱲﱳﱴﱵﱶﱷﱸﱹﱺﱻﱼﱽﱾﱿ
    FC80 ﲀﲁﲂﲃﲄﲅﲆﲇﲈﲉﲊﲋﲌﲍﲎﲏﲐﲑﲒﲓﲔﲕﲖﲗﲘﲙﲚﲛﲜﲝﲞﲟ
    FCA0 ﲠﲡﲢﲣﲤﲥﲦﲧﲨﲩﲪﲫﲬﲭﲮﲯﲰﲱﲲﲳﲴﲵﲶﲷﲸﲹﲺﲻﲼﲽﲾﲿ
    FCC0 ﳀﳁﳂﳃﳄﳅﳆﳇﳈﳉﳊﳋﳌﳍﳎﳏﳐﳑﳒﳓﳔﳕﳖﳗﳘﳙﳚﳛﳜﳝﳞﳟ
    FCE0 ﳠﳡﳢﳣﳤﳥﳦﳧﳨﳩﳪﳫﳬﳭﳮﳯﳰﳱﳲﳳﳴﳵﳶﳷﳸﳹﳺﳻﳼﳽﳾﳿ
    FD00 ﴀﴁﴂﴃﴄﴅﴆﴇﴈﴉﴊﴋﴌﴍﴎﴏﴐﴑﴒﴓﴔﴕﴖﴗﴘﴙﴚﴛﴜﴝﴞﴟ
    FD20 ﴠﴡﴢﴣﴤﴥﴦﴧﴨﴩﴪﴫﴬﴭﴮﴯﴰﴱﴲﴳﴴﴵﴶﴷﴸﴹﴺﴻﴼﴽ﴾﴿
    FD40 ﵀﵁﵂﵃﵄﵅﵆﵇﵈﵉﵊﵋﵌﵍﵎﵏ﵐﵑﵒﵓﵔﵕﵖﵗﵘﵙﵚﵛﵜﵝﵞﵟ
    FD60 ﵠﵡﵢﵣﵤﵥﵦﵧﵨﵩﵪﵫﵬﵭﵮﵯﵰﵱﵲﵳﵴﵵﵶﵷﵸﵹﵺﵻﵼﵽﵾﵿ
    FD80 ﶀﶁﶂﶃﶄﶅﶆﶇﶈﶉﶊﶋﶌﶍﶎﶏ﶐﶑ﶒﶓﶔﶕﶖﶗﶘﶙﶚﶛﶜﶝﶞﶟ
    FDA0 ﶠﶡﶢﶣﶤﶥﶦﶧﶨﶩﶪﶫﶬﶭﶮﶯﶰﶱﶲﶳﶴﶵﶶﶷﶸﶹﶺﶻﶼﶽﶾﶿ
    FDC0 ﷀﷁﷂﷃﷄﷅﷆﷇ﷈﷉﷊﷋﷌﷍﷎﷏﷐﷑﷒﷓﷔﷕﷖﷗﷘﷙﷚﷛﷜﷝﷞﷟
    FDE0 ﷠﷡﷢﷣﷤﷥﷦﷧﷨﷩﷪﷫﷬﷭﷮﷯ﷰﷱﷲﷳﷴﷵﷶﷷﷸﷹﷺﷻ﷼﷽﷾﷿
    FE00 ︀︁︂︃︄︅︆︇︈︉︊︋︌︍︎️︐︑︒︓︔︕︖︗︘︙︚︛︜︝︞︟
    FE20 ︧︨︩︪︫︬︭︠︡︢︣︤︥︦︮︯︰︱︲︳︴︵︶︷︸︹︺︻︼︽︾︿
    FE40 ﹀﹁﹂﹃﹄﹅﹆﹇﹈﹉﹊﹋﹌﹍﹎﹏﹐﹑﹒﹓﹔﹕﹖﹗﹘﹙﹚﹛﹜﹝﹞﹟
    FE60 ﹠﹡﹢﹣﹤﹥﹦﹧﹨﹩﹪﹫﹬﹭﹮﹯ﹰﹱﹲﹳﹴ﹵ﹶﹷﹸﹹﹺﹻﹼﹽﹾﹿ
    FE80 ﺀﺁﺂﺃﺄﺅﺆﺇﺈﺉﺊﺋﺌﺍﺎﺏﺐﺑﺒﺓﺔﺕﺖﺗﺘﺙﺚﺛﺜﺝﺞﺟ
    FEA0 ﺠﺡﺢﺣﺤﺥﺦﺧﺨﺩﺪﺫﺬﺭﺮﺯﺰﺱﺲﺳﺴﺵﺶﺷﺸﺹﺺﺻﺼﺽﺾﺿ
    FEC0 ﻀﻁﻂﻃﻄﻅﻆﻇﻈﻉﻊﻋﻌﻍﻎﻏﻐﻑﻒﻓﻔﻕﻖﻗﻘﻙﻚﻛﻜﻝﻞﻟ
    FEE0 ﻠﻡﻢﻣﻤﻥﻦﻧﻨﻩﻪﻫﻬﻭﻮﻯﻰﻱﻲﻳﻴﻵﻶﻷﻸﻹﻺﻻﻼ﻽﻾
    FF00 ＀!"#$%&'()*+,-./0123456789:;<=>?
    FF20 @ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
    FF40 `abcdefghijklmnopqrstuvwxyz{|}~⦅
    FF60 ⦆。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソ
    FF80 タチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚
    FFA0 ᅠᄀᄁᆪᄂᆬᆭᄃᄄᄅᆰᆱᆲᆳᆴᆵᄚᄆᄇᄈᄡᄉᄊᄋᄌᄍᄎᄏᄐᄑᄒ﾿
    FFC0 ￀￁ᅡᅢᅣᅤᅥᅦ￈￉ᅧᅨᅩᅪᅫᅬ￐￑ᅭᅮᅯᅰᅱᅲ￘￙ᅳᅴᅵ￝￞￟
    FFE0 ¢£¬ ̄¦¥₩￧│←↑→↓■○￯￰￱￲￳￴￵￶￷￸� dompdf-0.6.2/www/test/encoding_utf-8_w3.html000066400000000000000000000331211263120276100207030ustar00rootroot00000000000000 UTF-8 test file

    Original by Markus Kuhn, adapted for HTML by Martin Dürst.

     
    UTF-8 encoded sample plain-text file
    ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
     
    Markus Kuhn [ˈmaʳkʊs kuːn] <mkuhn@acm.org> — 1999-08-20
     
     
    The ASCII compatible UTF-8 encoding of ISO 10646 and Unicode
    plain-text files is defined in RFC 2279 and in ISO 10646-1 Annex R.
     
     
    Using Unicode/UTF-8, you can write in emails and source code things such as
     
    Mathematics and Sciences:
     
      ∮ E⋅da = Q,  n → ∞, ∑ f(i) = ∏ g(i), ∀x∈ℝ: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β),
     
      ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ, ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (A ⇔ B),
     
      2H₂ + O₂ ⇌ 2H₂O, R = 4.7 kΩ, ⌀ 200 mm
     
    Linguistics and dictionaries:
     
      ði ıntəˈnæʃənəl fəˈnɛtık əsoʊsiˈeıʃn
      Y [ˈʏpsilɔn], Yen [jɛn], Yoga [ˈjoːgɑ]
     
    APL:
     
      ((V⍳V)=⍳⍴V)/V←,V    ⌷←⍳→⍴∆∇⊃‾⍎⍕⌈
     
    Nicer typography in plain text files:
     
      ╔══════════════════════════════════════════╗
      ║                                          ║
      ║   • ‘single’ and “double” quotes         ║
      ║                                          ║
      ║   • Curly apostrophes: “We’ve been here” ║
      ║                                          ║
      ║   • Latin-1 apostrophe and accents: '´`  ║
      ║                                          ║
      ║   • ‚deutsche‘ „Anführungszeichen“       ║
      ║                                          ║
      ║   • †, ‡, ‰, •, 3–4, —, −5/+5, ™, …      ║
      ║                                          ║
      ║   • ASCII safety test: 1lI|, 0OD, 8B     ║
      ║                      ╭─────────╮         ║
      ║   • the euro symbol: │ 14.95 € │         ║
      ║                      ╰─────────╯         ║
      ╚══════════════════════════════════════════╝
     
    Greek (in Polytonic):
     
      The Greek anthem:
     
      Σὲ γνωρίζω ἀπὸ τὴν κόψη
      τοῦ σπαθιοῦ τὴν τρομερή,
      σὲ γνωρίζω ἀπὸ τὴν ὄψη
      ποὺ μὲ βία μετράει τὴ γῆ.
     
      ᾿Απ᾿ τὰ κόκκαλα βγαλμένη
      τῶν ῾Ελλήνων τὰ ἱερά
      καὶ σὰν πρῶτα ἀνδρειωμένη
      χαῖρε, ὦ χαῖρε, ᾿Ελευθεριά!
     
      From a speech of Demosthenes in the 4th century BC:
     
      Οὐχὶ ταὐτὰ παρίσταταί μοι γιγνώσκειν, ὦ ἄνδρες ᾿Αθηναῖοι,
      ὅταν τ᾿ εἰς τὰ πράγματα ἀποβλέψω καὶ ὅταν πρὸς τοὺς
      λόγους οὓς ἀκούω· τοὺς μὲν γὰρ λόγους περὶ τοῦ
      τιμωρήσασθαι Φίλιππον ὁρῶ γιγνομένους, τὰ δὲ πράγματ᾿ 
      εἰς τοῦτο προήκοντα,  ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αὐτοὶ
      πρότερον κακῶς σκέψασθαι δέον. οὐδέν οὖν ἄλλο μοι δοκοῦσιν
      οἱ τὰ τοιαῦτα λέγοντες ἢ τὴν ὑπόθεσιν, περὶ ἧς βουλεύεσθαι,
      οὐχὶ τὴν οὖσαν παριστάντες ὑμῖν ἁμαρτάνειν. ἐγὼ δέ, ὅτι μέν
      ποτ᾿ ἐξῆν τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον
      τιμωρήσασθαι, καὶ μάλ᾿ ἀκριβῶς οἶδα· ἐπ᾿ ἐμοῦ γάρ, οὐ πάλαι
      γέγονεν ταῦτ᾿ ἀμφότερα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν
      προλαβεῖν ἡμῖν εἶναι τὴν πρώτην, ὅπως τοὺς συμμάχους
      σώσομεν. ἐὰν γὰρ τοῦτο βεβαίως ὑπάρξῃ, τότε καὶ περὶ τοῦ
      τίνα τιμωρήσεταί τις καὶ ὃν τρόπον ἐξέσται σκοπεῖν· πρὶν δὲ
      τὴν ἀρχὴν ὀρθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι περὶ τῆς
      τελευτῆς ὁντινοῦν ποιεῖσθαι λόγον.
     
      Δημοσθένους, Γ´ ᾿Ολυνθιακὸς
     
    Georgian:
     
      From a Unicode conference invitation:
     
      გთხოვთ ახლავე გაიაროთ რეგისტრაცია Unicode-ის მეათე საერთაშორისო
      კონფერენციაზე დასასწრებად, რომელიც გაიმართება 10-12 მარტს,
      ქ. მაინცში, გერმანიაში. კონფერენცია შეჰკრებს ერთად მსოფლიოს
      ექსპერტებს ისეთ დარგებში როგორიცაა ინტერნეტი და Unicode-ი,
      ინტერნაციონალიზაცია და ლოკალიზაცია, Unicode-ის გამოყენება
      ოპერაციულ სისტემებსა, და გამოყენებით პროგრამებში, შრიფტებში,
      ტექსტების დამუშავებასა და მრავალენოვან კომპიუტერულ სისტემებში.
     
    Russian:
     
      From a Unicode conference invitation:
     
      Зарегистрируйтесь сейчас на Десятую Международную Конференцию по
      Unicode, которая состоится 10-12 марта 1997 года в Майнце в Германии.
      Конференция соберет широкий круг экспертов по  вопросам глобального
      Интернета и Unicode, локализации и интернационализации, воплощению и
      применению Unicode в различных операционных системах и программных
      приложениях, шрифтах, верстке и многоязычных компьютерных системах.
     
    Thai (UCS Level 2):
     
      Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese
      classic 'San Gua'):
     
      [----------------------------|------------------------]
        ๏ แผ่นดินฮั่นเสื่อมโทรมแสนสังเวช  พระปกเกศกองบู๊กู้ขึ้นใหม่
      สิบสองกษัตริย์ก่อนหน้าแลถัดไป       สององค์ไซร้โง่เขลาเบาปัญญา
        ทรงนับถือขันทีเป็นที่พึ่ง           บ้านเมืองจึงวิปริตเป็นนักหนา
      โฮจิ๋นเรียกทัพทั่วหัวเมืองมา         หมายจะฆ่ามดชั่วตัวสำคัญ
        เหมือนขับไสไล่เสือจากเคหา      รับหมาป่าเข้ามาเลยอาสัญ
      ฝ่ายอ้องอุ้นยุแยกให้แตกกัน          ใช้สาวนั้นเป็นชนวนชื่นชวนใจ
        พลันลิฉุยกุยกีกลับก่อเหตุ          ช่างอาเพศจริงหนาฟ้าร้องไห้
      ต้องรบราฆ่าฟันจนบรรลัย           ฤๅหาใครค้ำชูกู้บรรลังก์ ฯ
     
      (The above is a two-column text. If combining characters are handled
      correctly, the lines of the second column should be aligned with the
      | character above.)
     
    Ethiopian:
     
      Proverbs in the Amharic language:
     
      ሰማይ አይታረስ ንጉሥ አይከሰስ።
      ብላ ካለኝ እንደአባቴ በቆመጠኝ።
      ጌጥ ያለቤቱ ቁምጥና ነው።
      ደሀ በሕልሙ ቅቤ ባይጠጣ ንጣት በገደለው።
      የአፍ ወለምታ በቅቤ አይታሽም።
      አይጥ በበላ ዳዋ ተመታ።
      ሲተረጉሙ ይደረግሙ።
      ቀስ በቀስ፥ ዕንቁላል በእግሩ ይሄዳል።
      ድር ቢያብር አንበሳ ያስር።
      ሰው እንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርም።
      እግዜር የከፈተውን ጉሮሮ ሳይዘጋው አይድርም።
      የጎረቤት ሌባ፥ ቢያዩት ይስቅ ባያዩት ያጠልቅ።
      ሥራ ከመፍታት ልጄን ላፋታት።
      ዓባይ ማደሪያ የለው፥ ግንድ ይዞ ይዞራል።
      የእስላም አገሩ መካ የአሞራ አገሩ ዋርካ።
      ተንጋሎ ቢተፉ ተመልሶ ባፉ።
      ወዳጅህ ማር ቢሆን ጨርስህ አትላሰው።
      እግርህን በፍራሽህ ልክ ዘርጋ።
     
    Runes:
     
      ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛏ ᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ ᚹᛁᚦ ᚦᚪ ᚹᛖᛥᚫ
     
      (Old English, which transcribed into Latin reads 'He cwaeth that he
      bude thaem lande northweardum with tha Westsae.' and means 'He said
      that he lived in the northern land near the Western Sea.')
     
    Braille:
     
      ⡌⠁⠧⠑ ⠼⠁⠒  ⡍⠜⠇⠑⠹⠰⠎ ⡣⠕⠌
     
      ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠙⠑⠁⠙⠒ ⠞⠕ ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ ⠊⠎ ⠝⠕ ⠙⠳⠃⠞
      ⠱⠁⠞⠑⠧⠻ ⠁⠃⠳⠞ ⠹⠁⠞⠲ ⡹⠑ ⠗⠑⠛⠊⠌⠻ ⠕⠋ ⠙⠊⠎ ⠃⠥⠗⠊⠁⠇ ⠺⠁⠎
      ⠎⠊⠛⠝⠫ ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹⠍⠁⠝⠂ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ ⠥⠝⠙⠻⠞⠁⠅⠻⠂
      ⠁⠝⠙ ⠹⠑ ⠡⠊⠑⠋ ⠍⠳⠗⠝⠻⠲ ⡎⠊⠗⠕⠕⠛⠑ ⠎⠊⠛⠝⠫ ⠊⠞⠲ ⡁⠝⠙
      ⡎⠊⠗⠕⠕⠛⠑⠰⠎ ⠝⠁⠍⠑ ⠺⠁⠎ ⠛⠕⠕⠙ ⠥⠏⠕⠝ ⠰⡡⠁⠝⠛⠑⠂ ⠋⠕⠗ ⠁⠝⠹⠹⠔⠛ ⠙⠑ 
      ⠡⠕⠎⠑ ⠞⠕ ⠏⠥⠞ ⠙⠊⠎ ⠙⠁⠝⠙ ⠞⠕⠲
     
      ⡕⠇⠙ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲
     
      ⡍⠔⠙⠖ ⡊ ⠙⠕⠝⠰⠞ ⠍⠑⠁⠝ ⠞⠕ ⠎⠁⠹ ⠹⠁⠞ ⡊ ⠅⠝⠪⠂ ⠕⠋ ⠍⠹
      ⠪⠝ ⠅⠝⠪⠇⠫⠛⠑⠂ ⠱⠁⠞ ⠹⠻⠑ ⠊⠎ ⠏⠜⠞⠊⠊⠥⠇⠜⠇⠹ ⠙⠑⠁⠙ ⠁⠃⠳⠞
      ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ ⡊ ⠍⠊⠣⠞ ⠙⠁⠧⠑ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ ⠍⠹⠎⠑⠇⠋⠂ ⠞⠕
      ⠗⠑⠛⠜⠙ ⠁ ⠊⠕⠋⠋⠔⠤⠝⠁⠊⠇ ⠁⠎ ⠹⠑ ⠙⠑⠁⠙⠑⠌ ⠏⠊⠑⠊⠑ ⠕⠋ ⠊⠗⠕⠝⠍⠕⠝⠛⠻⠹ 
      ⠔ ⠹⠑ ⠞⠗⠁⠙⠑⠲ ⡃⠥⠞ ⠹⠑ ⠺⠊⠎⠙⠕⠍ ⠕⠋ ⠳⠗ ⠁⠝⠊⠑⠌⠕⠗⠎ 
      ⠊⠎ ⠔ ⠹⠑ ⠎⠊⠍⠊⠇⠑⠆ ⠁⠝⠙ ⠍⠹ ⠥⠝⠙⠁⠇⠇⠪⠫ ⠙⠁⠝⠙⠎
      ⠩⠁⠇⠇ ⠝⠕⠞ ⠙⠊⠌⠥⠗⠃ ⠊⠞⠂ ⠕⠗ ⠹⠑ ⡊⠳⠝⠞⠗⠹⠰⠎ ⠙⠕⠝⠑ ⠋⠕⠗⠲ ⡹⠳
      ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ ⠏⠻⠍⠊⠞ ⠍⠑ ⠞⠕ ⠗⠑⠏⠑⠁⠞⠂ ⠑⠍⠏⠙⠁⠞⠊⠊⠁⠇⠇⠹⠂ ⠹⠁⠞
      ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲
     
      (The first couple of paragraphs of "A Christmas Carol" by Dickens)
     
    Compact font selection example text:
     
      ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789
      abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ
      –—‘“”„†•…‰™œŠŸž€ ΑΒΓΔΩαβγδω АБВГДабвгд
      ∀∂∈ℝ∧∪≡∞ ↑↗↨↻⇣ ┐┼╔╘░►☺♀ fi�⑀₂ἠḂӥẄɐː⍎אԱა
     
    Greetings in various languages:
     
      Hello world, Καλημέρα κόσμε, コンニチハ
     
    Box drawing alignment tests:                                          █
                                                                          ▉
      ╔══╦══╗  ┌──┬──┐  ╭──┬──╮  ╭──┬──╮  ┏━━┳━━┓  ┎┒┏┑   ╷  ╻ ┏┯┓ ┌┰┐    ▊ ╱╲╱╲╳╳╳
      ║┌─╨─┐║  │╔═╧═╗│  │╒═╪═╕│  │╓─╁─╖│  ┃┌─╂─┐┃  ┗╃╄┙  ╶┼╴╺╋╸┠┼┨ ┝╋┥    ▋ ╲╱╲╱╳╳╳
      ║│╲ ╱│║  │║   ║│  ││ │ ││  │║ ┃ ║│  ┃│ ╿ │┃  ┍╅╆┓   ╵  ╹ ┗┷┛ └┸┘    ▌ ╱╲╱╲╳╳╳
      ╠╡ ╳ ╞╣  ├╢   ╟┤  ├┼─┼─┼┤  ├╫─╂─╫┤  ┣┿╾┼╼┿┫  ┕┛┖┚     ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳
      ║│╱ ╲│║  │║   ║│  ││ │ ││  │║ ┃ ║│  ┃│ ╽ │┃  ░░▒▒▓▓██ ┊  ┆ ╎ ╏  ┇ ┋ ▎
      ║└─╥─┘║  │╚═╤═╝│  │╘═╪═╛│  │╙─╀─╜│  ┃└─╂─┘┃  ░░▒▒▓▓██ ┊  ┆ ╎ ╏  ┇ ┋ ▏
      ╚══╩══╝  └──┴──┘  ╰──┴──╯  ╰──┴──╯  ┗━━┻━━┛           └╌╌┘ ╎ ┗╍╍┛ ┋  ▁▂▃▄▅▆▇█
     
    
    dompdf-0.6.2/www/test/image_background.html000066400000000000000000000105751263120276100207520ustar00rootroot00000000000000 Images with background-color, background-image, border, margin and padding

    Lorem ipsum dolor sit amet

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at odio vitae libero tempus convallis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla massa quis velit. Curabitur metus massa, semper mollis, molestie vel, adipiscing nec, massa. Phasellus vitae felis sed lectus dapibus facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis turpis vel magna. Cras eu est. Integer porttitor ligula a tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis leo. Nulla pellentesque molestie ante. Quisque vestibulum est id justo. Ut pellentesque ante in neque.

    Curabitur ut diam eu dui vestibulum pharetra. Nam pellentesque, justo non hendrerit venenatis, mi orci pretium mi, et vehicula leo arcu quis diam. Nullam mattis laoreet quam. Morbi mollis sem ut tellus. Nam mi massa, lobortis eu, sollicitudin et, iaculis et, massa. Maecenas purus mauris, luctus sit amet, pharetra in, facilisis sit amet, elit. Nullam vel erat tempus purus molestie suscipit. Vestibulum odio lorem, sollicitudin non, volutpat sit amet, tincidunt vel, nunc. Nulla quis ante vestibulum odio feugiat facilisis. Proin lorem nisl, viverra at, rhoncus quis, semper nec, mi. Donec euismod enim vitae velit. Nulla sed lectus. Vivamus placerat, lacus sed vehicula sagittis, arcu massa adipiscing lorem, bibendum luctus nisl tortor vitae leo.

    Etiam a mauris. Proin justo elit, accumsan sit amet, tempus et, blandit id, tellus. Morbi varius, nisi id iaculis aliquam, lacus ligula facilisis velit, ac pharetra ipsum augue a massa. Etiam rhoncus commodo orci. Mauris ullamcorper sagittis turpis. Nullam magna libero, sagittis sed, auctor faucibus, accumsan vitae, urna. Pellentesque volutpat. Aliquam sapien ipsum, eleifend nec, imperdiet vitae, consectetuer id, quam. Donec a urna. Suspendisse sit amet velit. Curabitur quis nisi id dui viverra ornare. Sed condimentum enim quis tortor. Ut condimentum, magna non tempus tincidunt, leo nibh molestie tellus, vitae convallis dolor ante sed ante. Nunc et metus. Phasellus ultricies. Fusce faucibus tortor sit amet mauris.

    Aliquam enim. Duis et diam. Praesent porta, mauris quis pellentesque volutpat, erat elit vulputate eros, vitae pulvinar augue velit sit amet sem. Fusce eu urna eu nisi condimentum posuere. Vivamus sed felis. Duis eget urna vitae eros interdum dignissim. Proin justo eros, eleifend in, porttitor in, malesuada non, neque. Etiam sed augue. Nulla sit amet magna. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Mauris facilisis. Curabitur massa magna, pulvinar a, nonummy eget, egestas vitae, mauris. Quisque vel elit sit amet lorem malesuada facilisis. Vestibulum porta, metus sit amet egestas interdum, urna justo euismod erat, id tristique urna leo quis nibh. Morbi non erat.

    Cras fringilla, nulla id egestas elementum, augue nunc iaculis nibh, ac adipiscing nibh justo id tortor. Donec vel orci a nisi ultricies aliquet. Nunc urna quam, adipiscing molestie, vehicula non, condimentum non, magna. Integer magna. Donec quam metus, pulvinar id, suscipit eget, euismod ac, orci. Nulla facilisi. Nullam nec mauris. Morbi in mi. Etiam urna lectus, pulvinar ac, sollicitudin eu, euismod ac, lectus. Fusce elit. Sed ultricies odio ac felis.

    dompdf-0.6.2/www/test/image_basic.html000066400000000000000000000007471263120276100177140ustar00rootroot00000000000000

    The PHP 5 HTML to PDF converter
    dompdf-0.6.2/www/test/image_bmp.html000066400000000000000000000067211263120276100174070ustar00rootroot00000000000000 BMP image test suite

    This test suite was grabbed from http://wvnvaxa.wvnet.edu/vmswww/bmp.html.

    BMP PNG
    1 bit (2 color)
    4 bit
    8 bit
    16 bit
    24 bit
    32 bit
    4 bit compressed
    8 bit compressed
    16 bit 555 bitfield
    16 bit 565 bitfield
    32 bit 888 bitfield
    32 bit 888 bitfield version 4
    32 bit version 5
    32 bit transparent version 4

    Note that as of December 2005, Mozilla and Internet Explorer do not support transparent BMP images.

    The images (except for the last three and the OS/2 version 2 image) are from Jason Summer's BMP Suite.

    dompdf-0.6.2/www/test/image_datauri.html000066400000000000000000000326741263120276100202700ustar00rootroot00000000000000

    Embedded <img> :

    Normal <img> :

    Embedded background image

    Normal background image

    dompdf-0.6.2/www/test/image_dimensions.html000066400000000000000000000016301263120276100207730ustar00rootroot00000000000000

    All these images should be nearly of the same size

    width=150

    width: 40mm

    width: 4cm

    width: 21%

    width: 150px

    width: 110pt

    dompdf-0.6.2/www/test/image_gif.html000066400000000000000000000004021263120276100173640ustar00rootroot00000000000000

    dompdf-0.6.2/www/test/image_remote.html000066400000000000000000000027241263120276100201230ustar00rootroot00000000000000

    Remote CSS & Image Test

    Note: DOMPDF_ENABLE_REMOTE must be enabled for this test to work.

    CSS: https://github.com/dompdf/dompdf/raw/master/www/style.css

    Remote image with extension:

    Remote image without extension:

    Remote image with unknown extension:

    Remote image with unknown extension and params:

    Remote image with unknown extension and advanced params:

    dompdf-0.6.2/www/test/image_transparent_gif.html000066400000000000000000000010141263120276100220050ustar00rootroot00000000000000
    dompdf-0.6.2/www/test/image_transparent_png.html000066400000000000000000000145311263120276100220340ustar00rootroot00000000000000 PNG transparency test

    PNG transparency test

    Examples from http://entropymine.com/jason/testbed/pngtrans/

    Not all possible results are shown; there are too many combinations of background colors and shapes of the opaque region. However, I intend to include every result that actually occurs in a mainstream browser. If I am missing any, please let me know.

    It's come to my attention that my images which show how alpha transparency should look are not quite perfect in regard to precisely how transparent they are at various points. Rather than try to modify this page to test gamma correction issues as well, I've created a separate test page for that.

    This test page was constructed by Jason Summers. Comments may be emailed to jason1@pobox.com.
    There are other test pages listed at the PNG web site.

    Alpha and palette transparency

    Expected result:
    [Test image]

    (T1) 8-bit palette, includes background color:
    [Test image]

    (T2) 8-bit palette, no background color:
    [Test image]

    (T3) 32-bit RGBA, includes background color:
    [Test image]

    (T4) 32-bit RGBA, no background color:
    [Test image]

    (T5) 64-bit RGBA, includes background color:
    [Test image]

    (T6) 64-bit RGBA, no background color:
    [Test image]

    RGB binary transparency

    Expected result:
    [Test image]

    (T7) 24-bit RGB, binary transparency, includes background color:
    [Test image]

    (T8) 24-bit RGB, binary transparency, no background color:
    [Test image]

    (T9) 48-bit RGB, binary transparency, includes background color:
    [Test image]

    (T10) 48-bit RGB, binary transparency, no background color:
    [Test image]

    Grayscale alpha transparency

    Expected result:
    [Test image]

    (G1) 16 bpp grayscale (8 gray + 8 alpha), includes background color:
    [Test image]

    (G2) 16 bpp grayscale (8 gray + 8 alpha), no background color:
    [Test image]

    (G3) 32 bpp grayscale (16 gray + 16 alpha), includes background color:
    [Test image]

    (G4) 32 bpp grayscale (16 gray + 16 alpha), no background color:
    [Test image]

    Grayscale binary transparency

    Expected result:
    [Test image]

    (G5) 8 bpp grayscale (8 gray), includes background color:
    [Test image]

    (G6) 8 bpp grayscale (8 gray), no background color:
    [Test image]

    (G7) 16 bpp grayscale (16 gray), includes background color:
    [Test image]

    (G8) 16 bpp grayscale (16 gray), no background color:
    [Test image]

    Miscellaneous

    (M1) 8-bit palette, no transparency, includes background color:
    Expected result:
    [Test image]
    [Test image]

    (M2) (4-bit) palette, binary transparency only, no background color:
    Expected result:
    [Test image]
    [Test image]
    (This tests a few things that may have slipped through the cracks.)

    dompdf-0.6.2/www/test/image_variants.html000066400000000000000000000230231263120276100204520ustar00rootroot00000000000000

    40% of box width:

    multiple identical images jpg:

    multiple identical images gif (will be recoded to png by dompdf):

    multiple identical images png:

    local png image with alpha channel:

    Attention!

    For external images to work, the following configuration is required:

    dompdf_config.inc.php :
    define("DOMPDF_ENABLE_REMOTE", true);

    external png Image with alpha channel:

    external image, dynamically created with id in url parameter at end of parameter(.jpg):

    external image, dynamically created with id in url parameter not at end of parameter (.jpg):

    external Image without file extension (.jpg):

    Background images

    paragraph link no-repeat position:default

    paragraph text no-repeat position:left-top; more text text more text text bla bla sdfjkhs sdfsjksdfks sdfkjsfsf skjfh ksjdfhsd

    paragraph text no-repeat position:left-center; more text text more text text bla bla sdfjkhs sdfsjksdfks sdfkjsfsf skjfh ksjdfhsd

    The PHP 5 HTML to PDF converter

    dompdf-0.6.2/www/test/images/000077500000000000000000000000001263120276100160405ustar00rootroot00000000000000dompdf-0.6.2/www/test/images/bmp/000077500000000000000000000000001263120276100166165ustar00rootroot00000000000000dompdf-0.6.2/www/test/images/bmp/test1.bmp000066400000000000000000000020761263120276100203630ustar00rootroot00000000000000BM>>(@@@@@?????????????>~???????????????>~?????x?'rp$`?&r@$B?ww?dompdf-0.6.2/www/test/images/bmp/test1.png000066400000000000000000000012021263120276100203570ustar00rootroot00000000000000PNG  IHDR@3ksBIT|d pHYs  ~tEXtCreation Time07/07/10_tEXtSoftwareAdobe Fireworks CS4ӠIDATx]0DQ`ea, ($iF|7cG}ϱ6s3$/#, W\?NG Y7 Y@#䔏 JG}`63ngm;G~Apt: h6 4MCMH2JYӕ<;5?py GwѝWS( ;sSۋA'i;Xp~AptGiYF ;oӕ<;5?py GwѝS( ;4v;cƎCcءc1vh;4v;cƎCcءc1vh;4v;cƎCcءc1vh;4v;cƎCcءc<6~IENDB`dompdf-0.6.2/www/test/images/bmp/test16.bmp000066400000000000000000000400661263120276100204520ustar00rootroot00000000000000BM6@6(@@!Bc)Jk1Rs9Z{  $ ( , 0 48<@DHLPTX\`dhlptx| @` ! %@)`-159=B F@J`NRVZ^c g@k`osw{1111111111111111111111111111111!Bc)Jk1Rs9Z{  $ ( , 0 48<@DHLPTX\`dhlptx| @` ! %@)`-159=B F@J`NRVZ^c g@k`osw{1111111111111111111111111111111!Bc)Jk1Rs9Z{ !"# $%&'( )$*(+,,0-4.8/<0@1D2H3L4P5T6X7\8`9d:h;lx?|!Aa !!%A)a-159=B!FAJaNRVZ^c!gAkaosw{1111111111111111111111111111111!Bc)Jk1Rs9Z{ !"# $%&'( )$*(+,,0-4.8/<0@1D2H3L4P5T6X7\8`9d:h;lx?|!Aa !!%A)a-159=B!FAJaNRVZ^c!gAkaosw{1111111111111111111111111111111!Bc ) J k  1 R s  9 Z { @ABC DEFGH I$J(K,L0M4N8Oy?} )Ii  !)%I)i-159= B)FIJiNRVZ^ c)gIkiosw{9999999999999999999999999999999$!$B$c$$$$$%)%J%k%%%%%&1&R&s&&&&&'9'Z'{''''' !" # $%&'(!)%*)+-,1-5.9/=0A1E2I3M4Q5U6Y7]8a9e:i;my?} )Ii  !)%I)i-159= B)FIJiNRVZ^ c)gIkiosw{9999999999999999999999999999999(!(B(c((((()))J)k)))))*1*R*s*****+9+Z+{+++++@AB C DEFGH!I%J)K-L1M5N9O=PAQERISMTQUUVYW]XaYeZi[m\q]u^y_} *Jj  !*%J)j-159= B*FJJjNRVZ^ c*gJkjosw{9999999999999999999999999999999(!(B(c((((()))J)k)))))*1*R*s*****+9+Z+{+++++@AB C DEFGH!I%J)K-L1M5N9O=PAQERISMTQUUVYW]XaYeZi[m\q]u^y_} *Jj  !*%J)j-159= B*FJJjNRVZ^ c*gJkjosw{9999999999999999999999999999999,!,B,c,,,,,-)-J-k-----.1.R.s...../9/Z/{/////`ab c defgh!i%j)k-l1m5n9o=pAqErIsMtQuUvYw]xayezi{m|q}u~y} +Kk  !+%K)k-159= B+FKJkNRVZ^ c+gKkkosw{9999999999999999999999999999999,!,B,c,,,,,-)-J-k-----.1.R.s...../9/Z/{/////`ab c defgh!i%j)k-l1m5n9o=pAqErIsMtQuUvYw]xayezi{m|q}u~y} +Kk  !+%K)k-159= B+FKJkNRVZ^ c+gKkkosw{99999999999999999999999999999990!0B0c000001)1J1k11111212R2s22222393Z3{33333 !%)-159=AEIMQUY]aeimquy} ,Ll  !,%L)l-159= B,FLJlNRVZ^ c,gLklosw{===============================0!0B0c000001)1J1k11111212R2s22222393Z3{33333 !%)-159=AEIMQUY]aeimquy} ,Ll  !,%L)l-159= B,FLJlNRVZ^ c,gLklosw{===============================4!4B4c444445)5J5k55555616R6s66666797Z7{77777 !%)-159=AEIMQUY]aeimquy} -Mm  !-%M)m-159= B-FMJmNRVZ^ c-gMkmosw{===============================4!4B4c444445)5J5k55555616R6s66666797Z7{77777 !%)-159=AEIMQUY]aeimquy} -Mm  !-%M)m-159= B-FMJmNRVZ^ c-gMkmosw{===============================8!8B8c888889)9J9k99999:1:R:s:::::;9;Z;{;;;;; !%)-159=AEIMQUY]aeimquy}.Nn !.%N)n-159=B.FNJnNRVZ^c.gNknosw{===============================8!8B8c888889)9J9k99999:1:R:s:::::;9;Z;{;;;;; !%)-159=AEIMQUY]aeimquy}.Nn !.%N)n-159=B.FNJnNRVZ^c.gNknosw{===============================1>R>s>>>>>?9?Z?{????? !%)-159=AEIMQUY]aeimquy}/Oo !/%O)o-159=B/FOJoNRVZ^c/gOkoosw{===============================1>R>s>>>>>?9?Z?{????? !%)-159=AEIMQUY]aeimquy}/Oo !/%O)o-159=B/FOJoNRVZ^c/gOkoosw{===============================@!@B@c@@@@@A)AJAkAAAAAB1BRBsBBBBBC9CZC{CCCCC " & * . 2 6:>BFJNRVZ^bfjnrvz~0Pp !0%P)p-159=B0FPJpNRVZ^c0gPkposw{BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB@!@B@c@@@@@A)AJAkAAAAAB1BRBsBBBBBC9CZC{CCCCC " & * . 2 6:>BFJNRVZ^bfjnrvz~0Pp !0%P)p-159=B0FPJpNRVZ^c0gPkposw{BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBD!DBDcDDDDDE)EJEkEEEEEF1FRFsFFFFFG9GZG{GGGGG !" #$%&'(")&**+.,2-6.:/>0B1F2J3N4R5V6Z7^8b9f:j;nz?~1Qq !1%Q)q-159=B1FQJqNRVZ^c1gQkqosw{BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBD!DBDcDDDDDE)EJEkEEEEEF1FRFsFFFFFG9GZG{GGGGG !" #$%&'(")&**+.,2-6.:/>0B1F2J3N4R5V6Z7^8b9f:j;nz?~1Qq !1%Q)q-159=B1FQJqNRVZ^c1gQkqosw{BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBH!HBHcHHHHHI)IJIkIIIIIJ1JRJsJJJJJK9KZK{KKKKK@AB CDEFGH"I&J*K.L2M6N:O>PBQFRJSNTRUVVZW^XbYfZj[n\r]v^z_~2Rr !2%R)r-159=B2FRJrNRVZ^c2gRkrosw{BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBH!HBHcHHHHHI)IJIkIIIIIJ1JRJsJJJJJK9KZK{KKKKK@AB CDEFGH"I&J*K.L2M6N:O>PBQFRJSNTRUVVZW^XbYfZj[n\r]v^z_~2Rr !2%R)r-159=B2FRJrNRVZ^c2gRkrosw{BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBL!LBLcLLLLLM)MJMkMMMMMN1NRNsNNNNNO9OZO{OOOOO`ab cdefgh"i&j*k.l2m6n:o>pBqFrJsNtRuVvZw^xbyfzj{n|r}v~z~3Ss !3%S)s-159=B3FSJsNRVZ^c3gSksosw{BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBL!LBLcLLLLLM)MJMkMMMMMN1NRNsNNNNNO9OZO{OOOOO`ab cdefgh"i&j*k.l2m6n:o>pBqFrJsNtRuVvZw^xbyfzj{n|r}v~z~3Ss !3%S)s-159=B3FSJsNRVZ^c3gSksosw{BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBP!PBPcPPPPPQ)QJQkQQQQQR1RRRsRRRRRS9SZS{SSSSS "&*.26:>BFJNRVZ^bfjnrvz~4Tt !4%T)t-159=B4FTJtNRVZ^c4gTktosw{1F1F1F1F1F1F1F1F2F2F2F2F2F2F2F2F3F3F3F3F3F3F3F3F4F4F4F4F4F4F4FP!PBPcPPPPPQ)QJQkQQQQQR1RRRsRRRRRS9SZS{SSSSS "&*.26:>BFJNRVZ^bfjnrvz~4Tt !4%T)t-159=B4FTJtNRVZ^c4gTktosw{1F1F1F1F1F1F1F2F2F2F2F2F2F2F2F3F3F3F3F3F3F3F3F4F4F4F4F4F4F4F4FT!TBTcTTTTTU)UJUkUUUUUV1VRVsVVVVVW9WZW{WWWWW "&*.26:>BFJNRVZ^bfjnrvz~5Uu !5%U)u-159=B5FUJuNRVZ^c5gUkuosw{1F1F1F1F1F1F2F2F2F2F2F2F2F2F3F3F3F3F3F3F3F3F4F4F4F4F4F4F4F4F5FT!TBTcTTTTTU)UJUkUUUUUV1VRVsVVVVVW9WZW{WWWWW "&*.26:>BFJNRVZ^bfjnrvz~5Uu !5%U)u-159=B5FUJuNRVZ^c5gUkuosw{1F1F1F1F1F2F2F2F2F2F2F2F2F3F3F3F3F3F3F3F3F4F4F4F4F4F4F4F4F5F5FX!XBXcXXXXXY)YJYkYYYYYZ1ZRZsZZZZZ[9[Z[{[[[[[ "&*.26:>BFJNRVZ^bfjnrvz~6Vv !6%V)v-159=B6FVJvNRVZ^c6gVkvosw{1F1F1F1F2F2F2F2F2F2F2F2F3F3F3F3F3F3F3F3F4F4F4F4F4F4F4F4F5F5F5FX!XBXcXXXXXY)YJYkYYYYYZ1ZRZsZZZZZ[9[Z[{[[[[[ "&*.26:>BFJNRVZ^bfjnrvz~6Vv !6%V)v-159=B6FVJvNRVZ^c6gVkvosw{1F1F1F2F2F2F2F2F2F2F2F3F3F3F3F3F3F3F3F4F4F4F4F4F4F4F4F5F5F5F5F\!\B\c\\\\\])]J]k]]]]]^1^R^s^^^^^_9_Z_{_____ "&*.26:>BFJNRVZ^bfjnrvz~7Ww !7%W)w-159=B7FWJwNRVZ^c7gWkwosw{1F1F2F2F2F2F2F2F2F2F3F3F3F3F3F3F3F3F4F4F4F4F4F4F4F4F5F5F5F5F5F\!\B\c\\\\\])]J]k]]]]]^1^R^s^^^^^_9_Z_{_____ "&*.26:>BFJNRVZ^bfjnrvz~7Ww !7%W)w-159=B7FWJwNRVZ^c7gWkwosw{1F2F2F2F2F2F2F2F2F3F3F3F3F3F3F3F3F4F4F4F4F4F4F4F4F5F5F5F5F5F5F`!`B`c`````a)aJakaaaaab1bRbsbbbbbc9cZc{ccccc # ' + / 3 7;?CGKOSW[_cgkosw{8Xx !8%X)x-159=B8FXJxNRVZ^c8gXkxosw{RJRJRJRJRJRJRJRJSJSJSJSJSJSJSJSJTJTJTJTJTJTJTJTJUJUJUJUJUJUJUJ`!`B`c`````a)aJakaaaaab1bRbsbbbbbc9cZc{ccccc # ' + / 3 7;?CGKOSW[_cgkosw{8Xx !8%X)x-159=B8FXJxNRVZ^c8gXkxosw{RJRJRJRJRJRJRJSJSJSJSJSJSJSJSJTJTJTJTJTJTJTJTJUJUJUJUJUJUJUJUJd!dBdcddddde)eJekeeeeef1fRfsfffffg9gZg{ggggg !" #$%&'(#)'*++/,3-7.;/?0C1G2K3O4S5W6[7_8c9g:k;o{?9Yy !9%Y)y-159=B9FYJyNRVZ^c9gYkyosw{RJRJRJRJRJRJSJSJSJSJSJSJSJSJTJTJTJTJTJTJTJTJUJUJUJUJUJUJUJUJVJd!dBdcddddde)eJekeeeeef1fRfsfffffg9gZg{ggggg !" #$%&'(#)'*++/,3-7.;/?0C1G2K3O4S5W6[7_8c9g:k;o{?9Yy !9%Y)y-159=B9FYJyNRVZ^c9gYkyosw{RJRJRJRJRJSJSJSJSJSJSJSJSJTJTJTJTJTJTJTJTJUJUJUJUJUJUJUJUJVJVJh!hBhchhhhhi)iJikiiiiij1jRjsjjjjjk9kZk{kkkkk@AB CDEFGH#I'J+K/L3M7N;O?PCQGRKSOTSUWV[W_XcYgZk[o\s]w^{_:Zz !:%Z)z-159=B:FZJzNRVZ^c:gZkzosw{RJRJRJRJSJSJSJSJSJSJSJSJTJTJTJTJTJTJTJTJUJUJUJUJUJUJUJUJVJVJVJh!hBhchhhhhi)iJikiiiiij1jRjsjjjjjk9kZk{kkkkk@AB CDEFGH#I'J+K/L3M7N;O?PCQGRKSOTSUWV[W_XcYgZk[o\s]w^{_:Zz !:%Z)z-159=B:FZJzNRVZ^c:gZkzosw{RJRJRJSJSJSJSJSJSJSJSJTJTJTJTJTJTJTJTJUJUJUJUJUJUJUJUJVJVJVJVJl!lBlclllllm)mJmkmmmmmn1nRnsnnnnno9oZo{ooooo`ab cdefgh#i'j+k/l3m7n;o?pCqGrKsOtSuWv[w_xcygzk{o|s}w~{;[{ !;%[){-159=B;F[J{NRVZ^c;g[k{osw{RJRJSJSJSJSJSJSJSJSJTJTJTJTJTJTJTJTJUJUJUJUJUJUJUJUJVJVJVJVJVJl!lBlclllllm)mJmkmmmmmn1nRnsnnnnno9oZo{ooooo`ab cdefgh#i'j+k/l3m7n;o?pCqGrKsOtSuWv[w_xcygzk{o|s}w~{;[{ !;%[){-159=B;F[J{NRVZ^c;g[k{osw{RJSJSJSJSJSJSJSJSJTJTJTJTJTJTJTJTJUJUJUJUJUJUJUJUJVJVJVJVJVJVJp!pBpcpppppq)qJqkqqqqqr1rRrsrrrrrs9sZs{sssss #'+/37;?CGKOSW[_cgkosw{<\| !<%\)|-159=B^~ !>%^)~-159=B>F^J~NRVZ^c>g^k~osw{sNsNsNsNtNtNtNtNtNtNtNtNuNuNuNuNuNuNuNuNvNvNvNvNvNvNvNvNwNwNwN1zRzszzzzz{9{Z{{{{{{{ #'+/37;?CGKOSW[_cgkosw{>^~ !>%^)~-159=B>F^J~NRVZ^c>g^k~osw{sNsNsNtNtNtNtNtNtNtNtNuNuNuNuNuNuNuNuNvNvNvNvNvNvNvNvNwNwNwNwN1~R~s~~~~~9Z{ #'+/37;?CGKOSW[_cgkosw{?_ !?%_)-159=B?F_JNRVZ^c?g_kosw{sNsNtNtNtNtNtNtNtNtNuNuNuNuNuNuNuNuNvNvNvNvNvNvNvNvNwNwNwNwNwN1~R~s~~~~~9Z{ #'+/37;?CGKOSW[_cgkosw{?_ !?%_)-159=B?F_JNRVZ^c?g_kosw{sNtNtNtNtNtNtNtNtNuNuNuNuNuNuNuNuNvNvNvNvNvNvNvNvNwNwNwNwNwNwNdompdf-0.6.2/www/test/images/bmp/test16.png000066400000000000000000000013151263120276100204520ustar00rootroot00000000000000PNG  IHDR@3ksBIT|d pHYs  ~tEXtCreation Time07/07/10_tEXtSoftwareAdobe Fireworks CS4Ӡ%IDATx[n0DQ>%$GC&rϩ:c&xǿ4])2L2KyIǧID2^{.2?R*u;nz q2X_?nm]-Mw۽8%C{p~(l hK:'np CW/p|+ Ca8_@]$A?p~htsyn!px]׽n Ox:'np}>/~~V+C??ɡE@ɡ秇~~V+C??ɡE@ɡ秇~~V+C??ɡE@M_Υ79IENDB`dompdf-0.6.2/www/test/images/bmp/test16bf555.bmp000066400000000000000000000401021263120276100212100ustar00rootroot00000000000000BMB@B(@@|!Bc)Jk1Rs9Z{  $ ( , 0 48<@DHLPTX\`dhlptx| @` ! %@)`-159=B F@J`NRVZ^c g@k`osw{1111111111111111111111111111111!Bc)Jk1Rs9Z{  $ ( , 0 48<@DHLPTX\`dhlptx| @` ! %@)`-159=B F@J`NRVZ^c g@k`osw{1111111111111111111111111111111!Bc)Jk1Rs9Z{ !"# $%&'( )$*(+,,0-4.8/<0@1D2H3L4P5T6X7\8`9d:h;lx?|!Aa !!%A)a-159=B!FAJaNRVZ^c!gAkaosw{1111111111111111111111111111111!Bc)Jk1Rs9Z{ !"# $%&'( )$*(+,,0-4.8/<0@1D2H3L4P5T6X7\8`9d:h;lx?|!Aa !!%A)a-159=B!FAJaNRVZ^c!gAkaosw{1111111111111111111111111111111!Bc ) J k  1 R s  9 Z { @ABC DEFGH I$J(K,L0M4N8Oy?} )Ii  !)%I)i-159= B)FIJiNRVZ^ c)gIkiosw{9999999999999999999999999999999$!$B$c$$$$$%)%J%k%%%%%&1&R&s&&&&&'9'Z'{''''' !" # $%&'(!)%*)+-,1-5.9/=0A1E2I3M4Q5U6Y7]8a9e:i;my?} )Ii  !)%I)i-159= B)FIJiNRVZ^ c)gIkiosw{9999999999999999999999999999999(!(B(c((((()))J)k)))))*1*R*s*****+9+Z+{+++++@AB C DEFGH!I%J)K-L1M5N9O=PAQERISMTQUUVYW]XaYeZi[m\q]u^y_} *Jj  !*%J)j-159= B*FJJjNRVZ^ c*gJkjosw{9999999999999999999999999999999(!(B(c((((()))J)k)))))*1*R*s*****+9+Z+{+++++@AB C DEFGH!I%J)K-L1M5N9O=PAQERISMTQUUVYW]XaYeZi[m\q]u^y_} *Jj  !*%J)j-159= B*FJJjNRVZ^ c*gJkjosw{9999999999999999999999999999999,!,B,c,,,,,-)-J-k-----.1.R.s...../9/Z/{/////`ab c defgh!i%j)k-l1m5n9o=pAqErIsMtQuUvYw]xayezi{m|q}u~y} +Kk  !+%K)k-159= B+FKJkNRVZ^ c+gKkkosw{9999999999999999999999999999999,!,B,c,,,,,-)-J-k-----.1.R.s...../9/Z/{/////`ab c defgh!i%j)k-l1m5n9o=pAqErIsMtQuUvYw]xayezi{m|q}u~y} +Kk  !+%K)k-159= B+FKJkNRVZ^ c+gKkkosw{99999999999999999999999999999990!0B0c000001)1J1k11111212R2s22222393Z3{33333 !%)-159=AEIMQUY]aeimquy} ,Ll  !,%L)l-159= B,FLJlNRVZ^ c,gLklosw{===============================0!0B0c000001)1J1k11111212R2s22222393Z3{33333 !%)-159=AEIMQUY]aeimquy} ,Ll  !,%L)l-159= B,FLJlNRVZ^ c,gLklosw{===============================4!4B4c444445)5J5k55555616R6s66666797Z7{77777 !%)-159=AEIMQUY]aeimquy} -Mm  !-%M)m-159= B-FMJmNRVZ^ c-gMkmosw{===============================4!4B4c444445)5J5k55555616R6s66666797Z7{77777 !%)-159=AEIMQUY]aeimquy} -Mm  !-%M)m-159= B-FMJmNRVZ^ c-gMkmosw{===============================8!8B8c888889)9J9k99999:1:R:s:::::;9;Z;{;;;;; !%)-159=AEIMQUY]aeimquy}.Nn !.%N)n-159=B.FNJnNRVZ^c.gNknosw{===============================8!8B8c888889)9J9k99999:1:R:s:::::;9;Z;{;;;;; !%)-159=AEIMQUY]aeimquy}.Nn !.%N)n-159=B.FNJnNRVZ^c.gNknosw{===============================1>R>s>>>>>?9?Z?{????? !%)-159=AEIMQUY]aeimquy}/Oo !/%O)o-159=B/FOJoNRVZ^c/gOkoosw{===============================1>R>s>>>>>?9?Z?{????? !%)-159=AEIMQUY]aeimquy}/Oo !/%O)o-159=B/FOJoNRVZ^c/gOkoosw{===============================@!@B@c@@@@@A)AJAkAAAAAB1BRBsBBBBBC9CZC{CCCCC " & * . 2 6:>BFJNRVZ^bfjnrvz~0Pp !0%P)p-159=B0FPJpNRVZ^c0gPkposw{BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB@!@B@c@@@@@A)AJAkAAAAAB1BRBsBBBBBC9CZC{CCCCC " & * . 2 6:>BFJNRVZ^bfjnrvz~0Pp !0%P)p-159=B0FPJpNRVZ^c0gPkposw{BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBD!DBDcDDDDDE)EJEkEEEEEF1FRFsFFFFFG9GZG{GGGGG !" #$%&'(")&**+.,2-6.:/>0B1F2J3N4R5V6Z7^8b9f:j;nz?~1Qq !1%Q)q-159=B1FQJqNRVZ^c1gQkqosw{BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBD!DBDcDDDDDE)EJEkEEEEEF1FRFsFFFFFG9GZG{GGGGG !" #$%&'(")&**+.,2-6.:/>0B1F2J3N4R5V6Z7^8b9f:j;nz?~1Qq !1%Q)q-159=B1FQJqNRVZ^c1gQkqosw{BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBH!HBHcHHHHHI)IJIkIIIIIJ1JRJsJJJJJK9KZK{KKKKK@AB CDEFGH"I&J*K.L2M6N:O>PBQFRJSNTRUVVZW^XbYfZj[n\r]v^z_~2Rr !2%R)r-159=B2FRJrNRVZ^c2gRkrosw{BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBH!HBHcHHHHHI)IJIkIIIIIJ1JRJsJJJJJK9KZK{KKKKK@AB CDEFGH"I&J*K.L2M6N:O>PBQFRJSNTRUVVZW^XbYfZj[n\r]v^z_~2Rr !2%R)r-159=B2FRJrNRVZ^c2gRkrosw{BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBL!LBLcLLLLLM)MJMkMMMMMN1NRNsNNNNNO9OZO{OOOOO`ab cdefgh"i&j*k.l2m6n:o>pBqFrJsNtRuVvZw^xbyfzj{n|r}v~z~3Ss !3%S)s-159=B3FSJsNRVZ^c3gSksosw{BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBL!LBLcLLLLLM)MJMkMMMMMN1NRNsNNNNNO9OZO{OOOOO`ab cdefgh"i&j*k.l2m6n:o>pBqFrJsNtRuVvZw^xbyfzj{n|r}v~z~3Ss !3%S)s-159=B3FSJsNRVZ^c3gSksosw{BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBP!PBPcPPPPPQ)QJQkQQQQQR1RRRsRRRRRS9SZS{SSSSS "&*.26:>BFJNRVZ^bfjnrvz~4Tt !4%T)t-159=B4FTJtNRVZ^c4gTktosw{1F1F1F1F1F1F1F1F2F2F2F2F2F2F2F2F3F3F3F3F3F3F3F3F4F4F4F4F4F4F4FP!PBPcPPPPPQ)QJQkQQQQQR1RRRsRRRRRS9SZS{SSSSS "&*.26:>BFJNRVZ^bfjnrvz~4Tt !4%T)t-159=B4FTJtNRVZ^c4gTktosw{1F1F1F1F1F1F1F2F2F2F2F2F2F2F2F3F3F3F3F3F3F3F3F4F4F4F4F4F4F4F4FT!TBTcTTTTTU)UJUkUUUUUV1VRVsVVVVVW9WZW{WWWWW "&*.26:>BFJNRVZ^bfjnrvz~5Uu !5%U)u-159=B5FUJuNRVZ^c5gUkuosw{1F1F1F1F1F1F2F2F2F2F2F2F2F2F3F3F3F3F3F3F3F3F4F4F4F4F4F4F4F4F5FT!TBTcTTTTTU)UJUkUUUUUV1VRVsVVVVVW9WZW{WWWWW "&*.26:>BFJNRVZ^bfjnrvz~5Uu !5%U)u-159=B5FUJuNRVZ^c5gUkuosw{1F1F1F1F1F2F2F2F2F2F2F2F2F3F3F3F3F3F3F3F3F4F4F4F4F4F4F4F4F5F5FX!XBXcXXXXXY)YJYkYYYYYZ1ZRZsZZZZZ[9[Z[{[[[[[ "&*.26:>BFJNRVZ^bfjnrvz~6Vv !6%V)v-159=B6FVJvNRVZ^c6gVkvosw{1F1F1F1F2F2F2F2F2F2F2F2F3F3F3F3F3F3F3F3F4F4F4F4F4F4F4F4F5F5F5FX!XBXcXXXXXY)YJYkYYYYYZ1ZRZsZZZZZ[9[Z[{[[[[[ "&*.26:>BFJNRVZ^bfjnrvz~6Vv !6%V)v-159=B6FVJvNRVZ^c6gVkvosw{1F1F1F2F2F2F2F2F2F2F2F3F3F3F3F3F3F3F3F4F4F4F4F4F4F4F4F5F5F5F5F\!\B\c\\\\\])]J]k]]]]]^1^R^s^^^^^_9_Z_{_____ "&*.26:>BFJNRVZ^bfjnrvz~7Ww !7%W)w-159=B7FWJwNRVZ^c7gWkwosw{1F1F2F2F2F2F2F2F2F2F3F3F3F3F3F3F3F3F4F4F4F4F4F4F4F4F5F5F5F5F5F\!\B\c\\\\\])]J]k]]]]]^1^R^s^^^^^_9_Z_{_____ "&*.26:>BFJNRVZ^bfjnrvz~7Ww !7%W)w-159=B7FWJwNRVZ^c7gWkwosw{1F2F2F2F2F2F2F2F2F3F3F3F3F3F3F3F3F4F4F4F4F4F4F4F4F5F5F5F5F5F5F`!`B`c`````a)aJakaaaaab1bRbsbbbbbc9cZc{ccccc # ' + / 3 7;?CGKOSW[_cgkosw{8Xx !8%X)x-159=B8FXJxNRVZ^c8gXkxosw{RJRJRJRJRJRJRJRJSJSJSJSJSJSJSJSJTJTJTJTJTJTJTJTJUJUJUJUJUJUJUJ`!`B`c`````a)aJakaaaaab1bRbsbbbbbc9cZc{ccccc # ' + / 3 7;?CGKOSW[_cgkosw{8Xx !8%X)x-159=B8FXJxNRVZ^c8gXkxosw{RJRJRJRJRJRJRJSJSJSJSJSJSJSJSJTJTJTJTJTJTJTJTJUJUJUJUJUJUJUJUJd!dBdcddddde)eJekeeeeef1fRfsfffffg9gZg{ggggg !" #$%&'(#)'*++/,3-7.;/?0C1G2K3O4S5W6[7_8c9g:k;o{?9Yy !9%Y)y-159=B9FYJyNRVZ^c9gYkyosw{RJRJRJRJRJRJSJSJSJSJSJSJSJSJTJTJTJTJTJTJTJTJUJUJUJUJUJUJUJUJVJd!dBdcddddde)eJekeeeeef1fRfsfffffg9gZg{ggggg !" #$%&'(#)'*++/,3-7.;/?0C1G2K3O4S5W6[7_8c9g:k;o{?9Yy !9%Y)y-159=B9FYJyNRVZ^c9gYkyosw{RJRJRJRJRJSJSJSJSJSJSJSJSJTJTJTJTJTJTJTJTJUJUJUJUJUJUJUJUJVJVJh!hBhchhhhhi)iJikiiiiij1jRjsjjjjjk9kZk{kkkkk@AB CDEFGH#I'J+K/L3M7N;O?PCQGRKSOTSUWV[W_XcYgZk[o\s]w^{_:Zz !:%Z)z-159=B:FZJzNRVZ^c:gZkzosw{RJRJRJRJSJSJSJSJSJSJSJSJTJTJTJTJTJTJTJTJUJUJUJUJUJUJUJUJVJVJVJh!hBhchhhhhi)iJikiiiiij1jRjsjjjjjk9kZk{kkkkk@AB CDEFGH#I'J+K/L3M7N;O?PCQGRKSOTSUWV[W_XcYgZk[o\s]w^{_:Zz !:%Z)z-159=B:FZJzNRVZ^c:gZkzosw{RJRJRJSJSJSJSJSJSJSJSJTJTJTJTJTJTJTJTJUJUJUJUJUJUJUJUJVJVJVJVJl!lBlclllllm)mJmkmmmmmn1nRnsnnnnno9oZo{ooooo`ab cdefgh#i'j+k/l3m7n;o?pCqGrKsOtSuWv[w_xcygzk{o|s}w~{;[{ !;%[){-159=B;F[J{NRVZ^c;g[k{osw{RJRJSJSJSJSJSJSJSJSJTJTJTJTJTJTJTJTJUJUJUJUJUJUJUJUJVJVJVJVJVJl!lBlclllllm)mJmkmmmmmn1nRnsnnnnno9oZo{ooooo`ab cdefgh#i'j+k/l3m7n;o?pCqGrKsOtSuWv[w_xcygzk{o|s}w~{;[{ !;%[){-159=B;F[J{NRVZ^c;g[k{osw{RJSJSJSJSJSJSJSJSJTJTJTJTJTJTJTJTJUJUJUJUJUJUJUJUJVJVJVJVJVJVJp!pBpcpppppq)qJqkqqqqqr1rRrsrrrrrs9sZs{sssss #'+/37;?CGKOSW[_cgkosw{<\| !<%\)|-159=B^~ !>%^)~-159=B>F^J~NRVZ^c>g^k~osw{sNsNsNsNtNtNtNtNtNtNtNtNuNuNuNuNuNuNuNuNvNvNvNvNvNvNvNvNwNwNwN1zRzszzzzz{9{Z{{{{{{{ #'+/37;?CGKOSW[_cgkosw{>^~ !>%^)~-159=B>F^J~NRVZ^c>g^k~osw{sNsNsNtNtNtNtNtNtNtNtNuNuNuNuNuNuNuNuNvNvNvNvNvNvNvNvNwNwNwNwN1~R~s~~~~~9Z{ #'+/37;?CGKOSW[_cgkosw{?_ !?%_)-159=B?F_JNRVZ^c?g_kosw{sNsNtNtNtNtNtNtNtNtNuNuNuNuNuNuNuNuNvNvNvNvNvNvNvNvNwNwNwNwNwN1~R~s~~~~~9Z{ #'+/37;?CGKOSW[_cgkosw{?_ !?%_)-159=B?F_JNRVZ^c?g_kosw{sNtNtNtNtNtNtNtNtNuNuNuNuNuNuNuNuNvNvNvNvNvNvNvNvNwNwNwNwNwNwNdompdf-0.6.2/www/test/images/bmp/test16bf555.png000066400000000000000000000013151263120276100212210ustar00rootroot00000000000000PNG  IHDR@3ksBIT|d pHYs  ~tEXtCreation Time07/07/10_tEXtSoftwareAdobe Fireworks CS4Ӡ%IDATx[n0DQ>%$GC&rϩ:c&xǿ4])2L2KyIǧID2^{.2?R*u;nz q2X_?nm]-Mw۽8%C{p~(l hK:'np CW/p|+ Ca8_@]$A?p~htsyn!px]׽n Ox:'np}>/~~V+C??ɡE@ɡ秇~~V+C??ɡE@ɡ秇~~V+C??ɡE@M_Υ79IENDB`dompdf-0.6.2/www/test/images/bmp/test16bf565.bmp000066400000000000000000000401021263120276100212110ustar00rootroot00000000000000BMB@B(@@AEI MQUY] (08@ H P X ` hpx@!@)19B@JRZc@ks{@@@΀@ c c c c c c c c c c c c c c c ccccccccccccccccAEI MQUY] !"#$ %(&0'8(@)H*P+X,`-h.p/x0123456789:;<=>?@!@)19B@JRZc@ks{@@@΀@ c c c c c c c c c c c c c c cccccccccccccccccA E  I M  Q  U Y]@ABCD E(F0G8H@IHJPKXL`MhNpOxPQRSTUVWXYZ[\]^_A!A)19BAJRZcAks{AAA΁A c c c c c c c c c c c c c ccccccccccccccccccA E  I M  Q  U Y]`abcd e(f0g8h@iHjPkXl`mhnpoxpqrstuvwxyz{|}~A!A)19BAJRZcAks{AAA΁A c c c c c c c c c c c c cccccccccccccccccccAEI MQUY] (08@HPX`hpxȚЛ؜B!B)19BBJRZcBks{BœB½B΂B,c,c,c,c-c-c-c-c-c-c-c-c.c.c.c.c.c.c.c.c/c/c/c/c/c/c/c/c0c0c0cAEI MQUY] (08@HPX`hpxȺлؼB!B)19BBJRZcBks{BœB½B΂B,c,c,c-c-c-c-c-c-c-c-c.c.c.c.c.c.c.c.c/c/c/c/c/c/c/c/c0c0c0c0cAEI MQUY] (08@HPX`hpxЀшҐӘԠըְ׸C!C)19BCJRZcCks{CÜCýC΃C,c,c-c-c-c-c-c-c-c-c.c.c.c.c.c.c.c.c/c/c/c/c/c/c/c/c0c0c0c0c0cAEI MQUY] (08@HPX`hpxC!C)19BCJRZcCks{CÜCýC΃C,c-c-c-c-c-c-c-c-c.c.c.c.c.c.c.c.c/c/c/c/c/c/c/c/c0c0c0c0c0c0c A !E!!!"I""" #M###$Q$$$%U%%%&Y&&&']''' !)19A I Q Y a iqyD!D)19BDJRZcDks{DĜDĽD΄DMkMkMkMkMkMkMkMkNkNkNkNkNkNkNkNkOkOkOkOkOkOkOkOkPkPkPkPkPkPkPk A !E!!!"I""" #M###$Q$$$%U%%%&Y&&&']''' ! "#$!%)&1'9(A)I*Q+Y,a-i.q/y0123456789:;<=>?D!D)19BDJRZcDks{DĜDĽD΄DMkMkMkMkMkMkMkNkNkNkNkNkNkNkNkOkOkOkOkOkOkOkOkPkPkPkPkPkPkPkPk(A((()E)))*I*** +M+++,Q,,,-U---.Y.../]///@A BCD!E)F1G9HAIIJQKYLaMiNqOyPQRSTUVWXYZ[\]^_E!E)19BEJRZcEks{EŜEŽE΅EMkMkMkMkMkMkNkNkNkNkNkNkNkNkOkOkOkOkOkOkOkOkPkPkPkPkPkPkPkPkQk(A((()E)))*I*** +M+++,Q,,,-U---.Y.../]///`a bcd!e)f1g9hAiIjQkYlaminqoypqrstuvwxyz{|}~E!E)19BEJRZcEks{EŜEŽE΅EMkMkMkMkMkNkNkNkNkNkNkNkNkOkOkOkOkOkOkOkOkPkPkPkPkPkPkPkPkQkQk0A0001E1112I222 3M3334Q4445U5556Y6667]777 !)19AIQYaiqyɚћٜF!F)19BFJRZcFks{FƜFƽFΆFmkmkmkmknknknknknknknknkokokokokokokokokpkpkpkpkpkpkpkpkqkqkqk0A0001E1112I222 3M3334Q4445U5556Y6667]777 !)19AIQYaiqyɺѻټF!F)19BFJRZcFks{FƜFƽFΆFmkmkmknknknknknknknknkokokokokokokokokpkpkpkpkpkpkpkpkqkqkqkqk8A8889E999:I::: ;M;;;Y>>>?]??? !)19AIQYaiqyЁщґәԡթֱ׹G!G)19BGJRZcGks{GǜGǽG·Gmkmknknknknknknknknkokokokokokokokokpkpkpkpkpkpkpkpkqkqkqkqkqk8A8889E999:I::: ;M;;;Y>>>?]??? !)19AIQYaiqyG!G)19BGJRZcGks{GǜGǽG·Gmknknknknknknknknkokokokokokokokokpkpkpkpkpkpkpkpkqkqkqkqkqkqk@A@@@AEAAABIBBB CMCCCDQDDDEUEEEFYFFFG]GGG "*2:B J R Z b jrzH!H)19BHJRZcHks{HȜHȽHΈHsssssssssssssssssssssssssssssss@A@@@AEAAABIBBB CMCCCDQDDDEUEEEFYFFFG]GGG ! "#$"%*&2':(B)J*R+Z,b-j.r/z0123456789:;<=>?H!H)19BHJRZcHks{HȜHȽHΈHsssssssssssssssssssssssssssssssHAHHHIEIIIJIJJJ KMKKKLQLLLMUMMMNYNNNO]OOO@A BCD"E*F2G:HBIJJRKZLbMjNrOzPQRSTUVWXYZ[\]^_ I !I)19 BIJRZ cIks{ Iɜ Iɽ IΉ IsssssssssssssssssssssssssssssssHAHHHIEIIIJIJJJ KMKKKLQLLLMUMMMNYNNNO]OOO`a bcd"e*f2g:hBiJjRkZlbmjnrozpqrstuvwxyz{|}~ I !I)19 BIJRZ cIks{ Iɜ Iɽ IΉ IsssssssssssssssssssssssssssssssPAPPPQEQQQRIRRR SMSSSTQTTTUUUUUVYVVVW]WWW "*2:BJRZbjrz™ʚқڜ J !J)19 BJJRZ cJks{ Jʜ Jʽ JΊ JsssssssssssssssssssssssssssssssPAPPPQEQQQRIRRR SMSSSTQTTTUUUUUVYVVVW]WWW "*2:BJRZbjrz¹ʺһڼ J !J)19 BJJRZ cJks{ Jʜ Jʽ JΊ JsssssssssssssssssssssssssssssssXAXXXYEYYYZIZZZ [M[[[\Q\\\]U]]]^Y^^^_]___ "*2:BJRZbjrzЂъҒӚԢժֲ׺ K !K)19 BKJRZ cKks{ K˜ K˽ K΋ KsssssssssssssssssssssssssssssssXAXXXYEYYYZIZZZ [M[[[\Q\\\]U]]]^Y^^^_]___ "*2:BJRZbjrz K !K)19 BKJRZ cKks{ K˜ K˽ K΋ Ksssssssssssssssssssssssssssssss`A```aEaaabIbbb cMcccdQdddeUeeefYfffg]ggg #+3;C K S [ c ks{ L !L)19 BLJRZ cLks{ L̜ L̽ LΌ L{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{`A```aEaaabIbbb cMcccdQdddeUeeefYfffg]ggg ! "#$#%+&3';(C)K*S+[,c-k.s/{0123456789:;<=>? L !L)19 BLJRZ cLks{ L̜ L̽ LΌ L{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{hAhhhiEiiijIjjj kMkkklQlllmUmmmnYnnno]ooo@A BCD#E+F3G;HCIKJSK[LcMkNsO{PQRSTUVWXYZ[\]^_ M !M)19 BMJRZ cMks{ M͜ Mͽ M΍ M{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{hAhhhiEiiijIjjj kMkkklQlllmUmmmnYnnno]ooo`a bcd#e+f3g;hCiKjSk[lcmknso{pqrstuvwxyz{|}~ M !M)19 BMJRZ cMks{ M͜ Mͽ M΍ M{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{pApppqEqqqrIrrr sMssstQtttuUuuuvYvvvw]www #+3;CKS[cks{Ù˚ӛۜN!N)19BNJRZcNks{NΜNνNΎN{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{pApppqEqqqrIrrr sMssstQtttuUuuuvYvvvw]www #+3;CKS[cks{ù˺ӻۼN!N)19BNJRZcNks{NΜNνNΎN{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{xAxxxyEyyyzIzzz {M{{{|Q|||}U}}}~Y~~~] #+3;CKS[cks{Ѓығӛԣիֳ׻O!O)19BOJRZcOks{OϜOϽOΏO{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{xAxxxyEyyyzIzzz {M{{{|Q|||}U}}}~Y~~~] #+3;CKS[cks{O!O)19BOJRZcOks{OϜOϽOΏO{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{AÀEǁI˂ MσQӄUׅYۆ]߇ $,4<D L T \ d lt|P!P)19BPJRZcPks{PМPнPΐPAÀEǁI˂ MσQӄUׅYۆ]߇ ! "#$$%,&4'<(D)L*T+\,d-l.t/|0123456789:;<=>?P!P)19BPJRZcPks{PМPнPΐPAÈEljIˊ MϋQӌU׍Yێ]ߏ@A BCD$E,F4G?T!T)19BTJRZcTks{TԜTԽTΔTQQQQQQQRRRRRRRRSSSSSSSSTTTTTTTTAèEǩI˪ MϫQӬU׭Yۮ]߯@A BCD%E-F5G=HEIMJUK]LeMmNuO}PQRSTUVWXYZ[\]^_U!U)19BUJRZcUks{U՜UսUΕUQQQQQQRRRRRRRRSSSSSSSSTTTTTTTTUAèEǩI˪ MϫQӬU׭Yۮ]߯`a bcd%e-f5g=hEiMjUk]lemmnuo}pqrstuvwxyz{|}~U!U)19BUJRZcUks{U՜UսUΕUQQQQQRRRRRRRRSSSSSSSSTTTTTTTTUUAðEDZI˲ MϳQӴU׵Y۶]߷ %-5=EMU]emu}ř͚՛ݜV!V)19BVJRZcVks{V֜VֽVΖVqqqqrrrrrrrrssssssssttttttttuuuAðEDZI˲ MϳQӴU׵Y۶]߷ %-5=EMU]emu}ŹͺջݼV!V)19BVJRZcVks{V֜VֽVΖVqqqrrrrrrrrssssssssttttttttuuuuAøEǹI˺ MϻQӼU׽Y۾]߿ %-5=EMU]emu}Ѕэҕӝԥխֵ׽W!W)19BWJRZcWks{WלW׽WΗWqqrrrrrrrrssssssssttttttttuuuuuAøEǹI˺ MϻQӼU׽Y۾]߿ %-5=EMU]emu}W!W)19BWJRZcWks{WלW׽WΗWqrrrrrrrrssssssssttttttttuuuuuuAEIŠ MÎQĒUŖYƚ]Ǟ&.6>F N V ^ f nv~X!X)19BXJRZcXks{X؜XؽXΘXAEIŠ MÎQĒUŖYƚ]Ǟ !"#$&%.&6'>(F)N*V+^,f-n.v/~0123456789:;<=>?X!X)19BXJRZcXks{X؜XؽXΘXAȂEɆIʊ MˎQ̒U͖YΚ]Ϟ@ABCD&E.F6G>HFINJVK^LfMnNvO~PQRSTUVWXYZ[\]^_Y!Y)19BYJRZcYks{YٜYٽYΙYAȂEɆIʊ MˎQ̒U͖YΚ]Ϟ`abcd&e.f6g>hFiNjVk^lfmnnvo~pqrstuvwxyz{|}~Y!Y)19BYJRZcYks{YٜYٽYΙYAЂEцIҊ MӎQԒUՖY֚]מ׀&.6>FNV^fnv~ƙΚ֛ޜZ!Z)19BZJRZcZks{ZڜZڽZΚZAЂEцIҊ MӎQԒUՖY֚]מנ&.6>FNV^fnv~ƹκֻ޼Z!Z)19BZJRZcZks{ZڜZڽZΚZA؂EنIڊ MێQܒUݖYޚ]ߞ&.6>FNV^fnv~ІюҖӞԦծֶ׾[![)19B[JRZc[ks{[ۜ[۽[Λ؂EنIڊ MێQܒUݖYޚ]ߞ&.6>FNV^fnv~[![)19B[JRZc[ks{[ۜ[۽[ΛEI MQUY]'/7?G O W _ g ow\!\)19B\JRZc\ks{\ܜ\ܽ\Μ\ӜӜӜӜӜӜӜӜԜԜԜԜԜԜԜԜ՜՜՜՜՜՜՜՜֜֜֜֜֜֜֜QUY] !"#$'%/&7'?(G)O*W+_,g-o.w/0123456789:;<=>?\!\)19B\JRZc\ks{\ܜ\ܽ\Μ\ӜӜӜӜӜӜӜԜԜԜԜԜԜԜԜ՜՜՜՜՜՜՜՜֜֜֜֜֜֜֜֜QUY]@ABCD'E/F7G?HGIOJWK_LgMoNwOPQRSTUVWXYZ[\]^_]!])19B]JRZc]ks{]ݜ]ݽ]Ν]ӜӜӜӜӜӜԜԜԜԜԜԜԜԜ՜՜՜՜՜՜՜՜֜֜֜֜֜֜֜֜לQUY]`abcd'e/f7g?hGiOjWk_lgmonwopqrstuvwxyz{|}~]!])19B]JRZc]ks{]ݜ]ݽ]Ν]ӜӜӜӜӜԜԜԜԜԜԜԜԜ՜՜՜՜՜՜՜՜֜֜֜֜֜֜֜֜ללQUY]'/7?GOW_gowǙϚכߜ^!^)19B^JRZc^ks{^ޜ^޽^Ξ^QUY]'/7?GOW_gowǹϺ׻߼^!^)19B^JRZc^ks{^ޜ^޽^Ξ^QUY]'/7?GOW_gowЇяҗӟԧկַ׿_!_)19B_JRZc_ks{_ߜ_߽_Ο_QUY]'/7?GOW_gow_!_)19B_JRZc_ks{_ߜ_߽_Ο_dompdf-0.6.2/www/test/images/bmp/test16bf565.png000066400000000000000000000014261263120276100212250ustar00rootroot00000000000000PNG  IHDR@3ksBIT|d pHYs  ~tEXtCreation Time07/07/10_tEXtSoftwareAdobe Fireworks CS4ӠnIDATxQn0DR>W_=\HO( $ٝM< Mc%7жw7:vաsN)[n;~NnM7SJ_׏`Ze!X\; ]U4f}usGE_ ??~?L&x>7.~D| /ǔ| ܨnnL.~dl Мj;swr3 xt;0o%?Pz~PCc%"PCcke/ og%?s@|v?3(7[|{@:ÜPCk% J>;E 9WQtϧxt;p%P? p}=bA?"N|%K)t#~1?W?ਟOWΰ+G|';P@Q?ߘsG|P?rwfosG|';P@Q?ߘIw`@Q?ߙ@+8JlڒE^IENDB`dompdf-0.6.2/www/test/images/bmp/test24.bmp000066400000000000000000000600661263120276100204530ustar00rootroot00000000000000BM6`6(@` ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxx```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``{``|``}``~`` ((0088@@HHPPXX``hhppxx  ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxxaaabaacaadaaeaafaagaahaaiaajaakaalaamaanaaoaapaaqaaraasaataauaavaawaaxaayaazaa{aa|aa}aa~aaaa ((0088@@HHPPXX``hhppxx  ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxxbbbcbbdbbebbfbbgbbhbbibbjbbkbblbbmbbnbbobbpbbqbbrbbsbbtbbubbvbbwbbxbbybbzbb{bb|bb}bb~bbbbbb    (( 00 88 @@ HH PP XX `` hh pp xx     ( (0 08 8@ @H HP PX X` `h hp px x    (( 00 88 @@ HH PP XX `` hh pp xx cccdcceccfccgcchcciccjcckcclccmccnccoccpccqccrccscctccuccvccwccxccycczcc{cc|cc}cc~cccccccc ((0088@@HHPPXX``hhppxx  ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxxdddeddfddgddhddiddjddkddlddmddnddoddpddqddrddsddtdduddvddwddxddyddzdd{dd|dd}dd~dddddddddd ((0088@@HHPPXX``hhppxx  ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxxeeefeegeeheeieejeekeeleemeeneeoeepeeqeereeseeteeueeveeweexeeyeezee{ee|ee}ee~eeeeeeeeeeee ((0088@@HHPPXX``hhppxx  ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxxfffgffhffiffjffkfflffmffnffoffpffqffrffsfftffuffvffwffxffyffzff{ff|ff}ff~ffffffffffffff ((0088@@HHPPXX``hhppxx  ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxxggghggiggjggkgglggmggnggoggpggqggrggsggtgguggvggwggxggyggzgg{gg|gg}gg~gggggggggggggggg    (( 00 88 @@ HH PP XX `` hh pp xx     ( (0 08 8@ @H HP PX X` `h hp px x    (( 00 88 @@ HH PP XX `` hh pp xx hhhihhjhhkhhlhhmhhnhhohhphhqhhrhhshhthhuhhvhhwhhxhhyhhzhh{hh|hh}hh~hhhhhhhhhhhhhhhhhh$$$$ $(($00$88$@@$HH$PP$XX$``$hh$pp$xx$$$$$$$$$$$$$$$$$$$$$ $ ($(0$08$8@$@H$HP$PX$X`$`h$hp$px$x$$$$$$$$$$$$$$$$$$$$$ $(($00$88$@@$HH$PP$XX$``$hh$pp$xx$$$$$$$$$$$$$$$$iiijiikiiliimiiniioiipiiqiiriisiitiiuiiviiwiixiiyiizii{ii|ii}ii~iiiiiiiiiiiiiiiiiiii(((( ((((00(88(@@(HH(PP(XX(``(hh(pp(xx((((((((((((((((((((( ( (((0(08(8@(@H(HP(PX(X`(`h(hp(px(x((((((((((((((((((((( ((((00(88(@@(HH(PP(XX(``(hh(pp(xx((((((((((((((((jjjkjjljjmjjnjjojjpjjqjjrjjsjjtjjujjvjjwjjxjjyjjzjj{jj|jj}jj~jjjjjjjjjjjjjjjjjjjjjj,,,, ,((,00,88,@@,HH,PP,XX,``,hh,pp,xx,,,,,,,,,,,,,,,,,,,,, , (,(0,08,8@,@H,HP,PX,X`,`h,hp,px,x,,,,,,,,,,,,,,,,,,,,, ,((,00,88,@@,HH,PP,XX,``,hh,pp,xx,,,,,,,,,,,,,,,,kkklkkmkknkkokkpkkqkkrkkskktkkukkvkkwkkxkkykkzkk{kk|kk}kk~kkkkkkkkkkkkkkkkkkkkkkkk0000 0((0000880@@0HH0PP0XX0``0hh0pp0xx000000000000000000000 0 (0(000808@0@H0HP0PX0X`0`h0hp0px0x000000000000000000000 0((0000880@@0HH0PP0XX0``0hh0pp0xx0000000000000000lllmllnllollpllqllrllslltllullvllwllxllyllzll{ll|ll}ll~llllllllllllllllllllllllll4444 4((4004884@@4HH4PP4XX4``4hh4pp4xx444444444444444444444 4 (4(040848@4@H4HP4PX4X`4`h4hp4px4x444444444444444444444 4((4004884@@4HH4PP4XX4``4hh4pp4xx4444444444444444mmmnmmommpmmqmmrmmsmmtmmummvmmwmmxmmymmzmm{mm|mm}mm~mmmmmmmmmmmmmmmmmmmmmmmmmmmm8888 8((8008888@@8HH8PP8XX8``8hh8pp8xx888888888888888888888 8 (8(080888@8@H8HP8PX8X`8`h8hp8px8x888888888888888888888 8((8008888@@8HH8PP8XX8``8hh8pp8xx8888888888888888nnnonnpnnqnnrnnsnntnnunnvnnwnnxnnynnznn{nn|nn}nn~nnnnnnnnnnnnnnnnnnnnnnnnnnnnnn<<<< <((<00<88<@@8@|p >8@|p >8@|pB{x-[[r/+[[r|a >8@|p >8@|p >8@|pP 2Ġ\tIENDB`dompdf-0.6.2/www/test/images/bmp/test32.bmp000066400000000000000000000774661263120276100204660ustar00rootroot00000000000000BM66(@  ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxx```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``{``|``}``~`` ((0088@@HHPPXX``hhppxx  ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxxaaabaacaadaaeaafaagaahaaiaajaakaalaamaanaaoaapaaqaaraasaataauaavaawaaxaayaazaa{aa|aa}aa~aaaa ((0088@@HHPPXX``hhppxx  ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxxbbbcbbdbbebbfbbgbbhbbibbjbbkbblbbmbbnbbobbpbbqbbrbbsbbtbbubbvbbwbbxbbybbzbb{bb|bb}bb~bbbbbb    (( 00 88 @@ HH PP XX `` hh pp xx     ( (0 08 8@ @H HP PX X` `h hp px x    (( 00 88 @@ HH PP XX `` hh pp xx cccdcceccfccgcchcciccjcckcclccmccnccoccpccqccrccscctccuccvccwccxccycczcc{cc|cc}cc~cccccccc ((0088@@HHPPXX``hhppxx  ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxxdddeddfddgddhddiddjddkddlddmddnddoddpddqddrddsddtdduddvddwddxddyddzdd{dd|dd}dd~dddddddddd ((0088@@HHPPXX``hhppxx  ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxxeeefeegeeheeieejeekeeleemeeneeoeepeeqeereeseeteeueeveeweexeeyeezee{ee|ee}ee~eeeeeeeeeeee ((0088@@HHPPXX``hhppxx  ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxxfffgffhffiffjffkfflffmffnffoffpffqffrffsfftffuffvffwffxffyffzff{ff|ff}ff~ffffffffffffff ((0088@@HHPPXX``hhppxx  ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxxggghggiggjggkgglggmggnggoggpggqggrggsggtgguggvggwggxggyggzgg{gg|gg}gg~gggggggggggggggg    (( 00 88 @@ HH PP XX `` hh pp xx     ( (0 08 8@ @H HP PX X` `h hp px x    (( 00 88 @@ HH PP XX `` hh pp xx hhhihhjhhkhhlhhmhhnhhohhphhqhhrhhshhthhuhhvhhwhhxhhyhhzhh{hh|hh}hh~hhhhhhhhhhhhhhhhhh$$$$ $(($00$88$@@$HH$PP$XX$``$hh$pp$xx$$$$$$$$$$$$$$$$$$$$$ $ ($(0$08$8@$@H$HP$PX$X`$`h$hp$px$x$$$$$$$$$$$$$$$$$$$$$ $(($00$88$@@$HH$PP$XX$``$hh$pp$xx$$$$$$$$$$$$$$$$iiijiikiiliimiiniioiipiiqiiriisiitiiuiiviiwiixiiyiizii{ii|ii}ii~iiiiiiiiiiiiiiiiiiii(((( ((((00(88(@@(HH(PP(XX(``(hh(pp(xx((((((((((((((((((((( ( (((0(08(8@(@H(HP(PX(X`(`h(hp(px(x((((((((((((((((((((( ((((00(88(@@(HH(PP(XX(``(hh(pp(xx((((((((((((((((jjjkjjljjmjjnjjojjpjjqjjrjjsjjtjjujjvjjwjjxjjyjjzjj{jj|jj}jj~jjjjjjjjjjjjjjjjjjjjjj,,,, ,((,00,88,@@,HH,PP,XX,``,hh,pp,xx,,,,,,,,,,,,,,,,,,,,, , (,(0,08,8@,@H,HP,PX,X`,`h,hp,px,x,,,,,,,,,,,,,,,,,,,,, ,((,00,88,@@,HH,PP,XX,``,hh,pp,xx,,,,,,,,,,,,,,,,kkklkkmkknkkokkpkkqkkrkkskktkkukkvkkwkkxkkykkzkk{kk|kk}kk~kkkkkkkkkkkkkkkkkkkkkkkk0000 0((0000880@@0HH0PP0XX0``0hh0pp0xx000000000000000000000 0 (0(000808@0@H0HP0PX0X`0`h0hp0px0x000000000000000000000 0((0000880@@0HH0PP0XX0``0hh0pp0xx0000000000000000lllmllnllollpllqllrllslltllullvllwllxllyllzll{ll|ll}ll~llllllllllllllllllllllllll4444 4((4004884@@4HH4PP4XX4``4hh4pp4xx444444444444444444444 4 (4(040848@4@H4HP4PX4X`4`h4hp4px4x444444444444444444444 4((4004884@@4HH4PP4XX4``4hh4pp4xx4444444444444444mmmnmmommpmmqmmrmmsmmtmmummvmmwmmxmmymmzmm{mm|mm}mm~mmmmmmmmmmmmmmmmmmmmmmmmmmmm8888 8((8008888@@8HH8PP8XX8``8hh8pp8xx888888888888888888888 8 (8(080888@8@H8HP8PX8X`8`h8hp8px8x888888888888888888888 8((8008888@@8HH8PP8XX8``8hh8pp8xx8888888888888888nnnonnpnnqnnrnnsnntnnunnvnnwnnxnnynnznn{nn|nn}nn~nnnnnnnnnnnnnnnnnnnnnnnnnnnnnn<<<< <((<00<88<@@<HH<PP<XX<``<hh<pp<xx<<<<<<<<<<<<<<<<<<<<< < (<(0<08<8@<@H8@|p >8@|p >8@|pB{x-[[r/+[[r|a >8@|p >8@|p >8@|pP 2Ġ\tIENDB`dompdf-0.6.2/www/test/images/bmp/test32bf.bmp000066400000000000000000000775021263120276100207650ustar00rootroot00000000000000BMBB(@  ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxx```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``{``|``}``~`` ((0088@@HHPPXX``hhppxx  ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxxaaabaacaadaaeaafaagaahaaiaajaakaalaamaanaaoaapaaqaaraasaataauaavaawaaxaayaazaa{aa|aa}aa~aaaa ((0088@@HHPPXX``hhppxx  ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxxbbbcbbdbbebbfbbgbbhbbibbjbbkbblbbmbbnbbobbpbbqbbrbbsbbtbbubbvbbwbbxbbybbzbb{bb|bb}bb~bbbbbb    (( 00 88 @@ HH PP XX `` hh pp xx     ( (0 08 8@ @H HP PX X` `h hp px x    (( 00 88 @@ HH PP XX `` hh pp xx cccdcceccfccgcchcciccjcckcclccmccnccoccpccqccrccscctccuccvccwccxccycczcc{cc|cc}cc~cccccccc ((0088@@HHPPXX``hhppxx  ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxxdddeddfddgddhddiddjddkddlddmddnddoddpddqddrddsddtdduddvddwddxddyddzdd{dd|dd}dd~dddddddddd ((0088@@HHPPXX``hhppxx  ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxxeeefeegeeheeieejeekeeleemeeneeoeepeeqeereeseeteeueeveeweexeeyeezee{ee|ee}ee~eeeeeeeeeeee ((0088@@HHPPXX``hhppxx  ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxxfffgffhffiffjffkfflffmffnffoffpffqffrffsfftffuffvffwffxffyffzff{ff|ff}ff~ffffffffffffff ((0088@@HHPPXX``hhppxx  ((0088@@HHPPXX``hhppxx ((0088@@HHPPXX``hhppxxggghggiggjggkgglggmggnggoggpggqggrggsggtgguggvggwggxggyggzgg{gg|gg}gg~gggggggggggggggg    (( 00 88 @@ HH PP XX `` hh pp xx     ( (0 08 8@ @H HP PX X` `h hp px x    (( 00 88 @@ HH PP XX `` hh pp xx hhhihhjhhkhhlhhmhhnhhohhphhqhhrhhshhthhuhhvhhwhhxhhyhhzhh{hh|hh}hh~hhhhhhhhhhhhhhhhhh$$$$ $(($00$88$@@$HH$PP$XX$``$hh$pp$xx$$$$$$$$$$$$$$$$$$$$$ $ ($(0$08$8@$@H$HP$PX$X`$`h$hp$px$x$$$$$$$$$$$$$$$$$$$$$ $(($00$88$@@$HH$PP$XX$``$hh$pp$xx$$$$$$$$$$$$$$$$iiijiikiiliimiiniioiipiiqiiriisiitiiuiiviiwiixiiyiizii{ii|ii}ii~iiiiiiiiiiiiiiiiiiii(((( ((((00(88(@@(HH(PP(XX(``(hh(pp(xx((((((((((((((((((((( ( (((0(08(8@(@H(HP(PX(X`(`h(hp(px(x((((((((((((((((((((( ((((00(88(@@(HH(PP(XX(``(hh(pp(xx((((((((((((((((jjjkjjljjmjjnjjojjpjjqjjrjjsjjtjjujjvjjwjjxjjyjjzjj{jj|jj}jj~jjjjjjjjjjjjjjjjjjjjjj,,,, ,((,00,88,@@,HH,PP,XX,``,hh,pp,xx,,,,,,,,,,,,,,,,,,,,, , (,(0,08,8@,@H,HP,PX,X`,`h,hp,px,x,,,,,,,,,,,,,,,,,,,,, ,((,00,88,@@,HH,PP,XX,``,hh,pp,xx,,,,,,,,,,,,,,,,kkklkkmkknkkokkpkkqkkrkkskktkkukkvkkwkkxkkykkzkk{kk|kk}kk~kkkkkkkkkkkkkkkkkkkkkkkk0000 0((0000880@@0HH0PP0XX0``0hh0pp0xx000000000000000000000 0 (0(000808@0@H0HP0PX0X`0`h0hp0px0x000000000000000000000 0((0000880@@0HH0PP0XX0``0hh0pp0xx0000000000000000lllmllnllollpllqllrllslltllullvllwllxllyllzll{ll|ll}ll~llllllllllllllllllllllllll4444 4((4004884@@4HH4PP4XX4``4hh4pp4xx444444444444444444444 4 (4(040848@4@H4HP4PX4X`4`h4hp4px4x444444444444444444444 4((4004884@@4HH4PP4XX4``4hh4pp4xx4444444444444444mmmnmmommpmmqmmrmmsmmtmmummvmmwmmxmmymmzmm{mm|mm}mm~mmmmmmmmmmmmmmmmmmmmmmmmmmmm8888 8((8008888@@8HH8PP8XX8``8hh8pp8xx888888888888888888888 8 (8(080888@8@H8HP8PX8X`8`h8hp8px8x888888888888888888888 8((8008888@@8HH8PP8XX8``8hh8pp8xx8888888888888888nnnonnpnnqnnrnnsnntnnunnvnnwnnxnnynnznn{nn|nn}nn~nnnnnnnnnnnnnnnnnnnnnnnnnnnnnn<<<< <((<00<88<@@<HH<PP<XX<``<hh<pp<xx<<<<<<<<<<<<<<<<<<<<< < (<(0<08<8@<@H8@|p >8@|p >8@|pB{x-[[r/+[[r|a >8@|p >8@|p >8@|pP 2Ġ\tIENDB`dompdf-0.6.2/www/test/images/bmp/test4.bmp000066400000000000000000000101661263120276100203650ustar00rootroot00000000000000BMvv(@UUU@@@DDDDDDDDDDDDDDDD3333333333333330DDDDDDDDDDDDDDDD3333333333333330DDDDDDDDDDDDDDDD3333333333333330DDDDDDDDDDDDDDDD3333333333333330DDDDDDDDDDDDDDDD3333333333333330DDDDDDDDDDDDDDDD3333333333333330DDDDDDDDDDDDDDDD3333333333333330DDDDDDDDDDDDDDDD3333333333333330DDDDDDDDDDDDDDDD3333333333333330DDDDDDDDDDDDDDDD3333333333333330DDDDDDDDDDDDDDDD3333333333333330DDDDDDDDDDDDDDDD3333333333333330DDDDDDDDDDDDDDDD3333333333333330DDDDDDDDDDDDDDDD3333333333333330DDDDDDDDDDDDDDDD3333333333333330DDDDDDDDDDDDDDDD3333333333333330UUUUUUUUUUUUUUUU""""""""""""""" UUUUUUUUUUUUUUUU""""""""""""""" UUUUUUUUUUUUUUUU""""""""""""""" UUUUUUUUUUUUUUUU""""""""""""""" UUUUUUUUUUUUUUUU""""""""""""""" UUUUUUUUUUUUUUUU""""""""""""""" UUUUUUUUUUUUUUUU""""""""""""""" UUUUUUUUUUUUUUUU""""""""""""""" UUUUUUUUUUUUUUUU""""""""""""""" UUUUUUUUUUUUUUUU""""""""""""""" UUUUUUUUUUUUUUUU""""""""""""""" UUUUUUUUUUUUUUUU""""""""""""""" UUUUUUUUUUUUUUUU""""""""""""""" UUUUUUUUUUUUUUUU""""""""""""""" UUUUUUUUUUUUUUUU""""""""""""""" UUUUUUUUUUUUUUUU""""""""""""""" ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww0330wwwwwww00wwwwwww0030wwwwwww00wwwwwww3333wwwwwwwwwwwwwwdompdf-0.6.2/www/test/images/bmp/test4.png000066400000000000000000000007301263120276100203670ustar00rootroot00000000000000PNG  IHDR@3ksBIT|d pHYs  ~tEXtCreation Time07/07/10_tEXtSoftwareAdobe Fireworks CS4Ӡ0IDATxA@@ѪKxqNֳD$zRu0#bĢȾ:}Ѿ|lru2ۺG+1dfN}_83]4vw{ضl+`3>f|0`3>f|WA>t竄f|0`3>f|0`}+_wKǏU6ەf|0`3>f|0`3>P,IENDB`dompdf-0.6.2/www/test/images/bmp/test4os2v2.bmp000066400000000000000000000066361263120276100212700ustar00rootroot00000000000000BMN@,wyx}gllnvlxd]j]`|x~QMXOQi_UYYiYUev5f"2DDB""B Hs33118TN$$"RD"P!0`= LLDi2` 5 l<$5 oD!!%!R 101u@DD" E" y#SUif"@ `U`_UUYUYUe`VP "#)D!$$DBRaQ138 ND"DT ($&PbemQADiS0!P 2o($aq~nBގ8f;Y3ڇd&/=PZJk u K *k 7~vt1fš3%JEJa$MjuŠ>/5~1uc ufS>a1v&fw2_(+piPw,C{ $s)b[[ZM!mGR Xlhx?bC(r~znL͒(kQ`|n2^ V\sfZ@PD22+*9\E@x+m8rxSf?|uoA>~ݠ;^_Sߧ;|2OWg[Lu^r|qt2 aP*RnBx SYD^~V6 {m6f^BK%lihE%E7^@++2-AT7ט%B"vNx|iG&d eL* CAct!Z5+?O))yO*!e )y5W YISԇ^RI|Di}ylńCίڔZLVh]ț6tRQ+ QH{ǦE$;@[gpm) 9LGˇ= :hy{4o'V^+~пaZ>JO?:=UUx)IXPbNz!cbx JJЅR~vd6rQ+ ej1xdRVc!QHe*3!1Wn␎ I>u_^| `RihiI^Ÿ9X~ٔBC4~ȧ9uU RWʩY.DYfrOw2V* b%p8 |8R/:*t'5wb9nkԸngk|!lj nH֍4eDwkx\Mw-^Jfd]k\`|ǗW -ZA -]-N]͐y~Vrb.$^bӫ#y:vk):;͊ X^i%޴JU{f2\S*|WKRI+-'?idZT>z9_jH\Sn #xYemпY#}?3rl0M:$+m&`ɠóZa1'k)EbU׭^Tg #<ʏϴ-y?̏RJE(DuҎc>Kg(יק,_{ULT&,Yc>m㽪=cb%\oS1c,ɠA~M(۾%c9T7Y/{Yj+jk7Ҵč0- XG;M+*.aʶa^#nⓠlY:\kOH\=huu5Ua2G}HSp/ JNǯR5*輾 STH rWϫ[E,Y{{x5+|6(Q|3.7JJzpAd2ݬMJE֞bh,o)'Vn@)L'~u;=0`Il)!  (mzX%'XAH};aOz:i4z1)(bR/q;C4'|U[+xQhY'-j~'%J)okUsJ֖^~Mku;YgkapebVr渞Rv[[80u{9Q(SYuFC"[7aG/&"G"SFUiL͊.OS%崉$w|Q^L| m __$L"2 </ɛ"RӼn\r>|T\~iAL@--dCYͶ=k{yq2_Rs+UmqG']W |X,7g7R&'^vNdtn`zl(KyE7~zx7)[٤UQϦ :@\k4ylj|kJR7KE{ww8(s [2ǑǮǧL$<8_[Jm }NzE.dK 9/x}T^qk@ILPI{$}~urs E^~ۜ`Ч[r7ѿk W KyFW\OjB܎67ǜZE֧c^ztF6dxc0qfs}Omt;n{;>Ɨ5X#LsWxX!w9Q8ϠW $ݚ|Na:,cu]|w|:Ǹ\7,qcջ7 91󱒙x-s/29^X `Z'S}~=^MF!ƭF/gklDCuL&hH;0/?;;>[F<+??[o9W9WQ }nW9'k#Z)ҽ&gн*Qw)bI-q9ͯ{{3jX\ &BIM|]LDuFbɥlН)s\Nl'\,sngjѐO'Ψɗ1L|n'Sѐr~~h.GC66 ll(Pˍ꺇 mzT^P]/$~y~Rd Yoxh%b'߳PUhOUzYg6P]A\ʃGe Ep~ݕ(V&~ u|{osVWMqoo+[{/Hdˤ{Nj,JL>K.ܟ|*ȖlXFN"/-M* +=ŸMyn\Јu>1" %.~~STf^Oy6ɍʗw2twGGLYq86ܑU(\3Y#>Nx .d//B{LǟM >{Cd&:_E|S(Ra: D2$y܃B&]9XNJ#3?Wyy7e"4#؛*bп{u-[} Jj521UMNZY/g~DyNU"[/&:^&/}4My7ITN8K`gwRA~m3X _ fsX$=8`[[؃+=Ɉot))S}/:MG30CCѭ]qX_~+]=0j*:5cEU*2+ =<ä[!P\aXi2A`9E`~P֞]it7{EKL di) _PySY 8ΌzF46g5 bt|OP[(dwIQַi.-,2NRgyj7]2dkB)2ʁ>n(?粲 (p\O-ڝ"UePLYM뀷g.b=l!-^]hY5q],r M^HNɧ?j,|jFi8ԹԦ2]axt`*0im?@*T(68dRi(@BZQ cUզW\Sl͘潐jJuYWT@YG,#K565V:HjꄋU@(ހ*$ˬۭD2y Hh.R\SY+͙"*z'j5 /o\uYB&,o8ߔ2 e5(Q/ZvCH[B5-Uee*&S^FH4S@իBd)C=%[lzNII1)e1EvwOp+եD-[XfY:뒲joNY$$bG6S)i^)^oU.Wb U,"Ns3 ,^UH۾@j{%*3LAtxH\P԰⎒j0T&7Xr"cVJWmv'Ax 8m7Զ;IbA@Yg1c=rX ||u[.!TB p:eJ7 oEY@p.bAY0=dazSJ&c&2%STĿK̰kP"3("'.aFꉒ$n3,3M1fQڻZ*Më7ϯ6 8p.m(m}5[͞+7V"[ZщAϲ7I&6,>`^]eDSZy']̏Vת}ZfM!(۶Vmy}S-kvդU]$SP?XېFm/SyԎy̓R+$[=/ 2fDp>ޛ?ܬVo#ffXvK^3T?~r¦WYۑr*h{_ѐwu=9& DϏzQծn9` Z=}8͖:tW|`fCA~tP0H&Zg"gWV8j׀oҮl` -)C3kϻ]7R()-Us;zMWy6oXeeK([(h "[ۭ \Jl")5¯6T|+_Iņ}CdswC{GQ%Hɑ<_<-N}[-c2(a0'(ڰKCف55PvN!Z(jH@C¢d>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB===============================CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE:::::::::::::::::::::::::::::::FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9999999999999999999999999999999GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG8888888888888888888888888888888HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH7777777777777777777777777777777IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII6666666666666666666666666666666JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ5555555555555555555555555555555KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK4444444444444444444444444444444LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL3333333333333333333333333333333MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM2222222222222222222222222222222NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN1111111111111111111111111111111OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO0000000000000000000000000000000PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP///////////////////////////////QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ...............................RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR-------------------------------SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT+++++++++++++++++++++++++++++++UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU*******************************VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV)))))))))))))))))))))))))))))))WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW(((((((((((((((((((((((((((((((XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'''''''''''''''''''''''''''''''YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\###############################]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]"""""""""""""""""""""""""""""""^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!________________________________ ````````````````````````````````aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccddddddddddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffffffffffgggggggggggggggggggggggggggggggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkllllllllllllllllllllllllllllllllmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnooooooooooooooooooooooooooooooooppppppppppppppppppppppppppppppppqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr ssssssssssssssssssssssssssssssss tttttttttttttttttttttttttttttttt uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyy????????zzzzzzzzzzzzzzz????{{{{{{{{{{{{{{{???????|||||||||||||||????}}}}}}}}}}}}}}}????????????~~~~~~~~~~~~~~~dompdf-0.6.2/www/test/images/bmp/test8.png000066400000000000000000000010551263120276100203740ustar00rootroot00000000000000PNG  IHDR@3ksBIT|d pHYs  ~tEXtCreation Time07/07/10_tEXtSoftwareAdobe Fireworks CS4ӠIDATxъPE}# v( ׺m~$SUU˕_~1 $>~(X:rs''3hkp/o~3"sї;%֧~;%JC%N߉<'x(>#dsm/>ܶsm/>ܶsm/>6?aN@go_ _8\s%>-\s%>-\s7n[|+L|.m_|.mNl8 cK|n[|K|n[|K|n[|K|n[|K|n[!~o0O ӽKIENDB`dompdf-0.6.2/www/test/images/bmp/test8os2.bmp000066400000000000000000000214321263120276100210130ustar00rootroot00000000000000BM# @  $$$(((,,,000444888<<<@@@DDDHHHLLLPPPUUUYYY]]]aaaeeeiiimmmqqquuuyyy}}}  $(,048<@DHLPUY]aeimquy}  $(,048<@DHLPUY]aeimquy}  $(,048<@DHLPUY]aeimquy}@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@???????????????????????????????AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB===============================CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE:::::::::::::::::::::::::::::::FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF9999999999999999999999999999999GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG8888888888888888888888888888888HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH7777777777777777777777777777777IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII6666666666666666666666666666666JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ5555555555555555555555555555555KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK4444444444444444444444444444444LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL3333333333333333333333333333333MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM2222222222222222222222222222222NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN1111111111111111111111111111111OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO0000000000000000000000000000000PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP///////////////////////////////QQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQ...............................RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR-------------------------------SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT+++++++++++++++++++++++++++++++UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUU*******************************VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV)))))))))))))))))))))))))))))))WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW(((((((((((((((((((((((((((((((XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'''''''''''''''''''''''''''''''YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\###############################]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]"""""""""""""""""""""""""""""""^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!________________________________ ````````````````````````````````aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccddddddddddddddddddddddddddddddddeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeffffffffffffffffffffffffffffffffgggggggggggggggggggggggggggggggghhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiijjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkllllllllllllllllllllllllllllllllmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnooooooooooooooooooooooooooooooooppppppppppppppppppppppppppppppppqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrr ssssssssssssssssssssssssssssssss tttttttttttttttttttttttttttttttt uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyy????????zzzzzzzzzzzzzzz????{{{{{{{{{{{{{{{???????|||||||||||||||????}}}}}}}}}}}}}}}????????????~~~~~~~~~~~~~~~dompdf-0.6.2/www/test/images/bmp/test8os2.png000066400000000000000000000010551263120276100210200ustar00rootroot00000000000000PNG  IHDR@3ksBIT|d pHYs  ~tEXtCreation Time07/07/10_tEXtSoftwareAdobe Fireworks CS4ӠIDATxъPE}# v( ׺m~$SUU˕_~1 $>~(X:rs''3hkp/o~3"sї;%֧~;%JC%N߉<'x(>#dsm/>ܶsm/>ܶsm/>6?aN@go_ _8\s%>-\s%>-\s7n[|+L|.m_|.mNl8 cK|n[|K|n[|K|n[|K|n[|K|n[!~o0O ӽKIENDB`dompdf-0.6.2/www/test/images/bmp/testcompress4.bmp000066400000000000000000000016321263120276100221370ustar00rootroot00000000000000BMv(@$UUU@@@ D 30 D 30 D 30 D 30 D 30 D 30 D 30 D 30 D 30 D 30 D 30 D 30 D 30 D 30 D 30 D 30 U " U " U " U " U " U " U " U " U " U " U " U " U " U " U " U " f  f  f  f  f  f  f  f  f  f  f  f  f  f  f  f  w w w w w w w w w w 0330w 00w 0030w 00w 3333w w dompdf-0.6.2/www/test/images/bmp/testcompress4.png000066400000000000000000000007301263120276100221430ustar00rootroot00000000000000PNG  IHDR@3ksBIT|d pHYs  ~tEXtCreation Time07/07/10_tEXtSoftwareAdobe Fireworks CS4Ӡ0IDATxA@@ѪKxqNֳD$zRu0#bĢȾ:}Ѿ|lru2ۺG+1dfN}_83]4vw{ضl+`3>f|0`3>f|WA>t竄f|0`3>f|0`}+_wKǏU6ەf|0`3>f|0`3>P,IENDB`dompdf-0.6.2/www/test/images/bmp/testcompress8.bmp000066400000000000000000000034341263120276100221450ustar00rootroot00000000000000BM6(@  $$$(((,,,000444888<<<@@@DDDHHHLLLPPPUUUYYY]]]aaaeeeiiimmmqqquuuyyy}}}  $(,048<@DHLPUY]aeimquy}  $(,048<@DHLPUY]aeimquy}  $(,048<@DHLPUY]aeimquy} @ ? A > B = C < D ; E : F 9 G 8 H 7 I 6 J 5 K 4 L 3 M 2 N 1 O 0 P / Q . R - S , T + U * V ) W ( X ' Y & Z % [ $ \ # ] " ^ ! _  `  a  b  c  d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x y ????????z ????{ ???????|  ????} ????????????~  dompdf-0.6.2/www/test/images/bmp/testcompress8.png000066400000000000000000000010551263120276100221500ustar00rootroot00000000000000PNG  IHDR@3ksBIT|d pHYs  ~tEXtCreation Time07/07/10_tEXtSoftwareAdobe Fireworks CS4ӠIDATxъPE}# v( ׺m~$SUU˕_~1 $>~(X:rs''3hkp/o~3"sї;%֧~;%JC%N߉<'x(>#dsm/>ܶsm/>ܶsm/>6?aN@go_ _8\s%>-\s%>-\s7n[|+L|.m_|.mNl8 cK|n[|K|n[|K|n[|K|n[|K|n[!~o0O ӽKIENDB`dompdf-0.6.2/www/test/images/cmyk_test2.jpg000066400000000000000000022417511263120276100206420ustar00rootroot00000000000000JFIFHHExifMM*bj(1r2i ' 'Adobe Photoshop CS3 Windows2007:09:20 02:06:48Ƞ&(.HHJFIFHH Adobe_CMAdobed            " ?   3!1AQa"q2B#$Rb34rC%Scs5&DTdE£t6UeuF'Vfv7GWgw5!1AQaq"2B#R3$brCScs4%&5DTdEU6teuFVfv'7GWgw ?8_kw,ܔGE~CrRS8Y ?9 ^+E~C%%1{c:ΟX]w}:+xޝ|~s{a5tx)K(}:+y))kwO{wYMtW>RQ_IL^X]gOwO{w_#JDE~C%%1{cu?9 =ƺx)+x5_IL^XN?9 =ƺΟ/_KE~C%%1{cu?9 =ƺΟ/_w%/eu5;';ӯw5_KEqqJJ1wg?ձ>k|{a5;']gOwJUlsg?c}[9$kwJUlsg?c}[9'd/y ~s%-[*V5 /y ~s+ }6HIKV8sJ9ճo{ }6HJM?Rձ>k|ql[M?d䔵lsg?c}[9'd/y ~s%-[*V5 s}6HMc;%*9ճoU>k|{cuIuY[zsJ9ճoO{&ΟXN?9 )YE$좿!.wg?ձ>k|S"YE~C%Ik:V5 k"|JJI$$I)I$JRI$I$(=Mӛ7X#%(}K(}Ru5;';ӯw5_KEp8x1wg?ձ>k|{cui =ƺx$V8sOS^O =Z@?33̼˙P- %ƍu?W9*Y~>~ww&@,vckcWgZ]kqiezC-9}}2{U>.ttpiv)ʦom~p]~уCپ̊ l{6jJ}7z魮˝ve[c鹾,fv2dz9mM.ѥͯqƯ<`^.%foY_#}D'fWzf̺#w^5V}}]O`:}[5׆^5bMYN*UknճOͯ6{KzԺeǨ9hmO}M۹d3_Yb8u[`a{?Dk:6ۿRS~wKoWmXq{MjоtO/& @6c~77w/Z;^u`t,fFfF7ֹlovq'D=;0:cqkh-p^H,oIM?NlcD+ S4xql[lsg?XMuIu5tx$V8sJ9ճoO{&ΟXN?9 )YE~_)~Jf1wg?ձ>k|S)e&1hkPc}[9''~ )*?^[ֺ'_6z{=['kI%>]{5N~Hݔ`hm-zmu8_SGRƿʇGCkIObo^6CgPΪoeo5E`oe?=kf>d: GѴ$>g1эuV{g.kXͭ=m\4bfEβ+{i>ÜԒSQ.-qz@y{K2>{Щu+Yֱ2h~uXֺ=K~33 I%)Amm.?*h~ٽ )^+y)]V5 V8sILW>RQ\vJlsg?c}[9$8_XMuR%ܔeu_6akuj|]&1hkRS$I%8G_Fn˱8p>t Ǫ =j[\ןR]W+/? QkTLL(HiNN9c J<<\<_Qܒ׻cvXs7,TOH?P~A!s3ǐ5T7y\ .UYxɤ]ZH \zDZzXqj#bSSVyթbh2B'K}7}rS58`sS!s qyWoTPU.gqF7Uz#!eHVޓ4x{a5;']|~sE~C%"k!JJbkIu:+ÏRS1wg?ձ>k|{a5;']gOwJUlsg?5Б3kw:͍.IIP?cA1LrG%9]GFyn˭4hZ> {Ȫ0^Fh][bh&9#9 H&Xɾ{9  *eY!Ŭvqn~o^nۏ-Ahs4HZ$p(Hܢ Sو'0ūԂ+CA$P~_}2Rk灹6>]9 H$-~Ƃc)a9C&==:'UPtϩ;kKsk|S/eW8Qql[lsg?E~C%"YE~C%F9ճoU>k|S/eGE~C%F9ճoU>k|S"YE~C%/eV5 V8sIL+y){(;RQ_IL^X]gOwO{w_#JDE~C%%1{cu?9 =ƺx)+x5_IL^XN?9 =ƺΟ/_KE~C%%1{cu?9 =ƺΟ/_w%/eu5;';ӯw5_KEqqJJ1wg?ձ>k|{a5;']gOwJUlsg?c}[9$kwJUlsg?c}[9'd/y ~s%-[*V5 /y ~s+ }6HIKV8sJ9ճo{ }6HJM?Rձ>k|ql[M?d䔵lsg?c}[9'd/y ~s%-[*V5 s}6HMc;%*9ճoU>k|{cuIuY[zsJ9ճoO{&ΟXN?9 )YE$좿!.wg?ձ>k|S"YE~C%Ik:V5 k"|JJI$$I)I$JRI$I$(=Mӛ7X#%(}K(}Ru5;';ӯw5_KEp8x1wg?ձ>k|{cui =ƺx$V8sOS^O =Z@?33̼˙P- %ƍu?W9*Y~>~ww&@,vckcWgZ]kqiezC-9}}2{U>.ttpiv)ʦom~p]~уCپ̊ l{6jJ}7z魮˝ve[c鹾,fv2dz9mM.ѥͯqƯ<`^.%foY_#}D'fWzf̺#w^5V}}]O`:}[5׆^5bMYN*UknճOͯ6{KzԺeǨ9hmO}M۹d3_Yb8u[`a{?Dk:6ۿRS~wKoWmXq{MjоtO/& @6c~77w/Z;^u`t,fFfF7ֹlovq'D=;0:cqkh-p^H,oIM?NlcD+ S4xql[lsg?XMuIu5tx$V8sJ9ճoO{&ΟXN?9 )YE~_)~Jf1wg?ձ>k|S)e&1hkPc}[9''~ )*?^[ֺ'_6z{=['kI%>]{5N~Hݔ`hm-zmu8_SGRƿʇGCkIObo^6CgPΪoeo5E`oe?=kf>d: GѴ$>g1эuV{g.kXͭ=m\4bfEβ+{i>ÜԒSQ.-qz@y{K2>{Щu+Yֱ2h~uXֺ=K~33 I%)Amm.?*h~ٽ )^+y)]V5 V8sILW>RQ\vJlsg?c}[9$8_XMuR%ܔeu_6akuj|]&1hkRS$I%8G_Fn˱8p>t Ǫ =j[\ןR]W+/? QkTLL(HiNN9c J<<\<_Qܒ׻cvXs7,TOH?P~A!s3ǐ5T7y\ .UYxɤ]ZH \zDZzXqj#bSSVyթbh2B'K}7}rS58`sS!s qyWoTPU.gqF7Uz#!eHVޓ4x{a5;']|~sE~C%"k!JJbkIu:+ÏRS1wg?ձ>k|{a5;']gOwJUlsg?5Б3kw:͍.IIP?cA1LrG%9]GFyn˭4hZ> {Ȫ0^Fh][bh&9#9 H&Xɾ{9  *eY!Ŭvqn~o^nۏ-Ahs4HZ$p(Hܢ Sو'0ūԂ+CA$P~_}2Rk灹6>]9 H$-~Ƃc)a9C&==:'UPtϩ;kKsk|S/eW8Qql[lsg?E~C%"YE~C%F9ճoU>k|S/eGE~C%F9ճoU>k|S"YE~C%/eV5 V8sIL+y){(; ICC_PROFILE pADBEprtrCMYKLab )5acspAPPLADBE-ADBE desctcprtp+wtptA2B0A2B2A2B1B2A0E8B2A1~t8B2A2(8gamtdescU.S. Web Coated (SWOP) v2textCopyright 2000 Adobe Systems, Inc.XYZ Zg0mft2 $i 6 1^ 2Wy%Y !"#%#&D'f()*+-.(/H0i123457859Q:m;<=>?AB)CBD\EuFGHIJLM,NCOYPoQRSTUVX Y#Z:[Q\f]x^_`abcdfgh#i3jBkRl^mgnqozpqrstuvwxyz{|}~ˀɁǂф{pdXL@3& ֜ȝ|jWE3 תū}kYG6$ڷȸ~kYG5"ŵƣǑ~lYD.оѧҐyaI1ڲۘ}bG,{W3qHvU3sIa)\ Z,      !"#$%&'()*+,-./0123456789:;~<|=|>|?}@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`acdeefghijklmnopqrstuvwxyz{|z}o~dXMA5)ۈʉq`N=, ٖɗmZH6%ؤʥwog`ZTOLIFEDEFHJNRW]cjr{ĄŊƐǖȝɥʭ˶̿*7DQ^kyކߔ ,8CNYcjnoldVD/h 2 R e r xzzzyuph^RE7)4=@?:4 ,!#"#$$%&'()*+,-./|0p1d2Y3M4A566+7!89 ::;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{||}v~oiaZQH>5+! ؎͏Ðxpjc^YURPOOPRUY_fnx̰߱ 8Ql»!Ceª9^ɂʦ2TtҔӲ6Lat݇ޘߧoX\[VL=*b/fMq T p_L7! }tfUA, !"#$%z&d'N(9)%**+,-./01y2g3U4D526"7889:;<=>?@}AoBbCUDIE~% ہ‚rW; ϊ}bG-ޒēx`G/Ԝq_O?0"۬խЮ˯ǰı²µŶȷ͸ӹۺ 0@RfzƏǦȾ *GcЀџҿ'LsٛFsM6+1MZ:{T?~ò~i~L}~cbA~Dad~ty~W~O>~\/~|~`Cx}%H}1X}%z}K} {N}׋<_~7A~-ψ||Dz|+E|[s|z} ^}wO@}-~ċ {Gu{Dz{]Ĭ{f{Zx|[]|ϕM?}R<}Ǝz]YzHħz|z={LNw{\|=>|v|ېI8z/r z;bz'sMzd6zɬqv{D[{0> |;|yyaIy?yazYvzݮ[{^=c{ФI{R*y߄yfUy`VyyuKzZi{ <{z%zȎ~+~}͇}W0}3}HtЄ}Zk}=~zɇ}!~Єd*s}Y<9wpSwuuVrUW؈|;,뇔{RsѲ;:8q)PCV:4.8Ȅ2񡂡?Up Vu9S c bփR.ՁNn U388A/ͬδz6߆өn1T\e7݀tXT)$̯̕6;eCʷˆ imw3SƀV7M \lGNػځNāa5tNzlߴS<H6*-N}o2ن N%է>w֣A}⇤\fXMݘ2, KԐ3g°[} 0e6M _1 ? 1ӣǾI^I|B̯dܪwLe1$: rW] 1S{z|diL g0\ U{[G{!{ ޔ`{&yE{xbie{Jr|/c5}~ ~:f#MKx+Ca|uI~.yW ώәߎ%¡唘[w!^T`^H*- 5GȨ瘎=Π4rv_ҍRGf,ދ̋|,ƕ{ Ҙtٕ^1Fő,;'\A*ىJ nyg؜(VN#q6\DՊB*|i˽?zzhzMџzEzrn8zY,{dBS| '|⃔*Z Ђ`>mۘ:Xc€A'4 uh¨h$nk)l]'Wf@&8[/Թ|zY9_N3kV41@49%wUh 3?Vkؔ.Uٓ|??R~%nVӎȩ5U.k~j9V"U"똬>Ð?%' Ȃ}ˡWml}ʗiRT>OlT$iƝaʚ=\},?iT- =$e0yYq,<-A_|?h@SG=ҩ$leLy)yywydGzPOsz:{ )|qʬί(h䁙~ڀvcc&OS#9tL߮=.v10b䞼 N8ՙ,K.Fpj癪7̥0uPhbQM88Ajʗ׋xAʜڨ†󤔗tuϔaMKMB=(7kua ,̘/1Hsʠ5`\Lk7M (_XĀ⫹}£rs@C`)6OLA;6}Ȕ@(Bat{C rȟH_֧Kť6#̕O&3"^ļ֢qrb_cKu6{ݤ < (ytյy:}Ѱy2ldygZ8dyF冷zj1{r{(B€}b kYdrFl1l;nˉՍވI|ϯkUYz4EƄ0ˀh|RjΌcX}-EYW0,\>շFiba{{4j$W]D?50>R*>6Ā;ٱџziWyZD}p/'g^ȶ6pDzi/W%ԞD9I/Ĝ' J״"ԯzWhy1VߣKC/1ŀٵ˰tzhVﭠCߟ8//)cyxr|xaixPqyS> sy)zjfY{ C7ċ恶q¹JaJm~P ~=_~)]f2ÀDÒG'q^`۳uOY=RZ)#JNO©k#_p鷼`k&O:%=j(Hڧ,O[pt` N֐&<èi(ץc^PbB7pM@s_ϱ ,N&q<Е(¤+8fը*p_oN<}:(nN&Q̺o_Nw }gu~_jx&thxQy7Qẙzi%u7{Z{=v|k|v՟wӾ xѦx Ryosz'kYuzیM1<} #}oha}?'O|}g3}f }É\}Y}|ȸזP|D|mg|˨N|3,}X S}(d}5<|0|nƕ|4~|8f|eNT|2|L |Qvww~~x }1xfyzM(zI28%{1 ։$|y<Ǽ|>ډcΒhU~|nWdQL\15 쇋Z⊩!_+7/0 zXcⅩFK&0D!D $~uI&%ڏ͆.yl bDŽ̋vJQ/nFY k솷&ڸWlΆN]xa„I.~ ҃ᆤh/jhwo`ӃX^H.Е QLr71Nu vf`ҟGHUXu-{8IF,mźg߄ދuނ_gfGǁ-pȑ=ͅtؠ/IzKhu5^ՂGJ,^&J5uYv vw6rw]xEry+Nz|},SP~˛S~~~Sr ~O\~mD΋o~*'C~,lWح46uxp[(/C񊁃)cM &oA(7ȍpofZ0C(e_׃GgϐNanً(AY@RBS( Ѓj<ŏJmQXm@A<'|;Ȇ<[9%_5,~4m,WƈA' U<ϻ6ʱ^ly0W(W@@&֚$`|źm[xR`k7NV@-&H;/ݲàztáHuNvz t9t|uOqEu^sJvJw5Wxk@kx0| |$p|spv4|p]ڜ9|J"|4}-И5}ls?䄅lfo1]Μ=*ڙʜ]1zlʫrզЮb*|Pܟ s>Ԧ*d0vsQysjٶCt+['tJu8vF$R+v Xw {.yzj `xbiAY3I?N7#ףV> J߻bSxPgi5YuߓHU7]ӑ#âk t€ޢ_x ڟdhY9>kH§79,# MbwյZhưkYeH^7 # { >w9hX#H97# `- a{n1rmŶs7_XsPst'@t/E!udukoMw${h@zmz_^kyPpIy@z /RzVG1z_ /|F"{rmÞ_G=PN @}:m/PGw}Iu!{pm}s_gP%ԅ@^/Jn{[emep^P‹@Oߊ/P܊߫Ћ0${9%mT^PՑ@O/aґ {ńumGꜳ^`GP f@[%]/yyK!;΄7z0m?[^,Pa@guY/Vx@jzĝ>m>᫓_ 8[P*̦3@פ/E1gȥFvpswKsxt̢*xu$yvqczwW{Ox;/|1y}!yt~hku~v|}we}ʈxK}p.y3}V[z}:z~ {T}1r̚td_u Fv ~wnxBU>xy8yĂyՂ iq8rsltюLuvmvT*w!7xxpu2q/r+sŖՄtl|viS#w 7wwq?lo pqˣrzwtkXu53R.vA6BvvKNn뷌p[q1r0z̓0!{ ){ͮwӹx*NxelxTyZy,4byqJz!K/z\r zˇ6wswwܳ5x'xx ay'Iyk.yN Bz-Uw>JwQ#_wwwwx$/a x{ITy'.}yAo y~p3qrrڌsvGu `\v5HwU-ńxR܆Oy`Fzꅻzs {u{Wu{_[| Gh|i,؃|/}u\1_rك,tT^QkFǂD+n9 ­Ǐ*1ɂ|q|sB6]5kEՁJ+,x~(Ta؂ uz)Qr-\5TEh*x }0@Wd8EqZ[QDD)D=DI7ˀNdK [p=DZC~")Q~B?θڬ&2`Nos~NY~C ~wp(~^~ܾxӾc$~5n~@IYE~ sB~0(y}^~&\Wo5p!rs.lˋtTWu@v&;w*$yXySCGyyz?k֊_zVf{$@ {%{ۈ}iI ]~׊Sij̉7UJ?6$΀,Mԋˋ>j}*iT·>>k $PYفKIŠ˔8o-|:7h1kS߆a=#ċ%ʁs Y{ygʆq[S1<#,!V5q zٟg՜{Rj"0Ճ'=r'@ zVfQPQƄ;Ο_"a?) Œn;y]eQD;d1!"ospA(~|݈C|BxGgtXUѕB{5.l ʓ@lןzwߕWfɗ/SU/B{@. 'F΀F(wD f9tTAA-ma8KΞNvҤeTQA-X9ub;k)v"xFeAS*A/:-}v 4n~W{oo]p/_yqKNrhSU7Ct214+}pO@bqSb&C%1#!}ip aƫɗRB1Ҡޔz~.Nx}joدPa=RB\p1Jf|yv}6GoЯ+Va]RdB1vɔŅ(rHlemX9nIӷo:up)S4q-p)t{rwtpeÿtX:tIu@:vu)v!uxr:{er{EX&zIֵ$z:{){8n{}.re&WjBIҀ:f)0!rvҊ e_WEIu:QsQ)GIUrQheJWNTIg":Al^)!'XPr0Pe?bW Icϓ:?)8`-!GrӠ`e=̞W՛Id:::ҙ)}yM:qv6eCPWC(Ikwk:E)Q)ЧʜERٵqlrn7touIq-vkrjwtRxu6zyvzyv׷oWwppxGIrAxKsy4ttyivzQPw4z5hx!{>xzmogp–rIs^htOuJ4lvwA"kJmo:pu~r1gWsvNt3uru0zjo;l@̩Tm֔?o^}Rp⏔f%r^Ms2tGtԆ&ik8#lϝan\Q|o*e qh?Lr1s? eshԻjgk+Im{od&p3Lq1:rZ sGhi˶ kSÐ^l֫z/njcWomKpqC0q grybιg`ia}ajںclM`ymmڮbohJpP0p q%Zyk}zdmKzn{hptyU{qb||sJ}t/}v 9dv7wv{>${* I|}9z Xz Əy|zhz1Tzy>z$zjR{݂\y yVy|yh9ySyA=z|$ y͘_{^؋iڜk~mpyofipQbr$; s!tNw$setU u2x?veqvQw;xx jx{j|ۚՇ{|ن} w}!dq4}FP)}u:Qr} U}~цZ>vScyO\yI98ƃoÏۘ"ubgbo֊dNkuJ82n2f{.י~~0\to3a0Mx8EERX 2ȃEvsš`ā7&M͕7ǀvQlWJ#&r&`VLS977ߛD-`3^|r<_|Kz6Xy iNԓ&k#yln̐nj\oIqt3֍rrz쓔rZsM't3mu[čXuHUEv3(ww~{Nb{}~!{mX{Z |G|_2~c|~||lZ+ |~5l YւXFΉӂ 10&,{^kY-F1YPƇXRQ?{7~j5X^ՏFEmԍ0ˇ)MIZ0zy͚iz^=W! DՇ[0^Wh̉إy܊Dh܈ɟWD@I/慽)aV{yVܫ9hNRVCՆ/8kH(؞ĥלLjsߚl4cėmR oI?씆p+Jqlq/}А@qcHrQsˑ{@*Y{q/{%Ϛ̂=nq-ya&P{7>*)ޏ
ґƗYp`O֑ =z)w>{UƓGxp<@` O33`=%j)"]Ƙ~ϙo_z`Nu<(όؒikU~"RCo^͜Nܚ<&O(k8KW=}Ôn^VM[Q;όƠ(!7h7vm\-=nknlpvZoRiʯ(p\WpMTq>p^r-:Isj㣧sF7uav |vi`w\Gw`Mw>(x--xxT^zXu~]h}~[w}M4}=Ǣ},Рj}Z}~uDhX.[τLm=rd,2kٞ;th(urZXL_yX=h,_hҝ#te=gZn#CL<ԟ,0;ڜYVjBt]םg-;Z2VKآ<억+뜓vƐSdt.~gZ.K]<{)+뛾њ|j2f]λ@hP㷖ipC#j4*k#>l!Hksi=n2]Ϻ9nPBoCEwpn4[.q1#sJqpx)iͼud]uPմuC&v4Qv|#vv&|"ir|k]af|P]{Bw{4-{#{g{hiz1]5#PVKB+4#0liN<]PDB 3#:槫i)]GP?Bl3񨛍#2E"Y߀i Y]PDYUBM3ǔ#^?YHh]#IPQ|B%3 n#"V PlmfDn0huojqcl{rndUtOp}LlurP1vs x1s\iqTXkrgmmswogtyquc>rvKasw0txU vtwɈg|`i|\k|_&m|}xoV|bp|JYro}/s+} !t|ǻePh Pj `kw*m̓`o/ITq.q vsdF4)f|Th~juln_nCH`oˆA.p+ rxRc!e?p8gUiS tkG^m!3Gn)-in hq öad@*fUhTksjR]l3FmT,m˒ pa< cĜSeLgri\kmF$l,Ol٘\ pj`b盲d%fNrhکs\]j¥>El7>+l mp_te`uglvqiwZkrxBm\Zy,oESzq+zs}s}Fr=osfq;Zturpuvsqvst[jwquDvx]v*8yw{[xp.zk>qrzrz?s{Bot{ZDu{Csv|2)XwN|?zy|l)n]ʨo31p샖rnxsOY'txBun(u.x1lя)'n2Ôo|PlpmFqXs4RAt-;'tDywdlxklmnM#Col0pِW)r@s'>rVgvރjl$mTInkGoV`q.V@>r8&qޒ#'wJ|i߮>kLl~vmϣjwo"aUpn7?q]&IpwYVib$jɴ#k}m/>inzUoţg?p %pw=p|dM}g}TiW|}kgh}meTD~VoS>~q$r&gtSzn3{'p{zqh{u{rg|:sSS|u=8},v#C}vxqxxyMyyyzKz&zfzzvRf{z*:FEeWqcbEa?b!PX>V e*5qE|czieYlDgx\dirLIkM:6 l%ّ8n ZduΤ[fˌWg/GR6Ґě.'K͒F؋RFn9ab]cU:eGi;gW8Mh'6j*inbmi?ajTFkG@m*87`nS'?1oq-n-simpa9qsTr7Fޢs7ퟹs'rt.sx0lx`xSS,xFjzx73yA&ݜyl2x0|cl(l`8PS+E&71~&p~~k_٣wS%DžE P6؛&o(ƀkd}_ҍRߟ猲E:6&;%Jۀk$_T&R3D_Y6@%a'j𤡝_VRD؛V63%j a|`U|bRIde`"m$gsinji]plFrEo,s&p v*q d%jѭKflhn,jorFlq`\nrEpItS+pu] mthukIaud vNf}vshwpjx\[lyDnpy+nz rz-w_K]aCdlȃfoiiZRkMCl)*Bl~vq~]U `ܕbie nRgbY5iBk9)krY?q[^pa-1cm-fX\Zyc]Vj_1bpl=dޕ1WjgAqh(`h|sYY\b|^_avknc眙Vf,@gɗ''f"Ds XԵ~[?^D~`!jcVe`~@Mf'neș_t̳7n_GpOb1qd~hrgwjt?iUulM?vnw&wZo2{ ql,i{mkoPmP}kpnir pUsxr2>ts%Wutxyruɰ1isk~tߎ{m u{nvhzp0w`Sqx.=rx$ry&yzFg~&if~-k!~.zl~)g8ni~0Ro~;=q~<#p~[zS~+eGgliiy.k flхQnlgonp,\qEUIrL64rcqˈKmkUܐHH;ʂ9V)07vdh'mO'aՊUTEG9vv(ϋQu߀mB a5UyGiӏ8t(pnjрla_}TԘ_G 8r(9ŕ'Ɏ0'ebW[Z^M#`e@[b1dh e emdc'YdMmf@l{hV1Ҝi j Oird+juY kMl?n1o Кo }lo{wcqXkrzLhs?y0z' M-z1 z*b,VWqaKuH>|0UN % b&-WyK$>(܆f/2mD t ΀a՜^+V̚JJӘ=ؕ/Dv~ %z!a˖V$Jŗl=(/Jg[ 숟Y#ZdNR\Bd^5`',b#abhEcZqXpga}McB#jd5.f:':g`gpҦhQvXhhMJ iAЩj588k'l sl|9mxgzWo:Lߪ&oAWp4Uqm&ߣq Nq\rA~WRvLvAv4w3&wm ]w)Ÿx>V}#LP*}J@դ}N4^7}?&t}3}~^V-L)@u4Al&t4G->!zVҋCL2@g42&]!6MVb4~L z"@U4.#&g/&jp&aSYc]6f/`7hqcLkjfFW(li%A*nbk'nmtnų*]daq`fc6h~Kekjh m(Vj@o.@5kq'lr^cu5sANZo]pJM`q|c&rinet TguC?>ivV&Qiew ux"tWy[y܍^ z9{Y`zhc{Se{k>Ng{%f{v$|UxFX΃u[y^łyfaRd=veʁX$dvmRSvfVZx] je_(Qbp pE [pqL.~sǤbmdo7fpxshqa8js&Mlti8mu|m.u~-xe4_wbPx0dxr_fyQ_hyLjzc7kzjz~T|f]}``]-b|&pd^fဤKhԀw6jKkht~uԠc[{+^B `oc ]e@Jg56ChXf~_Yt2\̀_>oa$]coJe܌5fe3~Xas[Y^ [nJ`l\ZbaIhdi57e7:d6~Wة6Z ~]#m_{N[aĜXHcš4dc x~ɀ|6pXq\`}gr_ltbZuDedGvgh2whj`^wkZrmbne|1pAgikqiYrkFtm28to`tovȘjl ?l@m{moUjo&pXpr(Fqst1rt|cr&tzhuiv~ykgwFi:lwWnlxEoyA0pyoy~qeggyl*zGn@{mzsj~t lyp{tn`uoP2vq>w]r]* wsE=yr}ps}kqto)ru_svOOtzwK=guOw)uxivwnk||Po}n p}W^q}zN]r}h-jKO0j,lksjgg>i[ kfM#l=xnd-o}oNq6rp?ofqYr8LJs>=4pt#,mt6t] vq}BwexYy"K]yh[img"ndgQf7\@gPPiCk=4l#mn^l^sf~qm[^nObp*Beq<3슀r #or7rxe}uLZvNvA.wP3fw#w SwN|d|Y0}KNg}{A }2އ}"ن} }dZYRwMh /@vT2Z"X3!GcއEY M/$@?,;2/g"6僠c|X!|L˅MS?O1sn"*ۂ] \URBYXF[E9]+}_I`JamI\]QY_UF7ay9cr+Qe Peߘer1[_dCPeEg9i&*jV&jjwZ@kZP8lDѕm8jan*joݔ3o.p#{eZ LrOs[D0t7ƒ|t*u-u!1*u.YsyO}zCC.z7Qz)zq-z;{XkN>;CL#6폗). PX\`N/:;B66(܍~sG+X7N rBÏ6o(WrT PaTMFbV;M Y=.[i \]`|q.Oƨ[*EĦ]7:_2.` [mb+ǥbleuO=SaE-c:Ae.~fy gVѢg iz<NǤ hDYi9k-IllƠ?l(wo+}NK oqD+kpN93q-+Lqqq5u Mנjv`Cʞv8(wU,뛞wXw؛w^qzTMs}UC}8},7}&]}љ} ~M$YCJsq82, w{{L)C(8dЋ,ٗDݏgZS]W|`[5wPc,^debCPhe;ih#%ipjygl˧V^ Y`\cv _fxcbiOe"k:fm"eeolyqgRhGVUjsYlLt\nb2_oNb^q9ds!btyvbOSrݔzS sڄ| X_|VEb(|1c|cD|dQGg{Q*gh{4jz{oY|\jn^_eaFO'cgd=e ;*Me$,h;WO{Z}m]^_Ndax"W`ixGkZyT6lxy#ml9z qze~bYr7d9dfVpgFiT6j_"i p}`(&q^bZddL4Uf F=g5ph"g nτC} ^p`ԏcdbЎU dkEfP4g ".e؋ m<|]Wp2_ baJTcdaE)d4xe!dbQ knd xyRmzbV` {YQ{])BG|h`0}Ab~ld#dy wv`[Hkw(^/_w`PxcAy}e0tzGg{h~)i|v}s cjte]u gOui@vk/w}m5wm{nuDpkisq:m}\rOnOsEp`?t.q/!trtryt(tmWt7hKnu:[ovNpv?jo}.pR}o}x<~r:i3fjZl Lxm%"=n-nnumx8qgFfiCYxjKk=(l,l߉+kx:qfqehXip"KejŒ\]2D^$g`Oؔ`ԑ biqRˑ ^?Hܐy`g> bm1؏d9#䏯eeggvRBe@Hf=(Kh1/i#TjJjl{<Q9lUGDimߡ;Md|Qg"lUAi{[ XkH[m4\o]Jq$}KtEERހC2SXW)} :qJ@wEhIW;ME\P{2.Q5!gUʆ}08?e=vvBgnG5VKDNԌ1O1T|436;vqABgF KVlJ?cDMY1M^PSϏ|8ZMC]aR v[_V9f}bZ/Ud]C=ga/Oh@diufTmґyUWXZu-[^Je^avTa1dxBcjgJ.d]iNf`jrPaITmcsWfPdZhSV]jAc_m-`ncowbLjGPslqTnVbWRoR)ZYqx@j\r-] t8ats{vHt~Lu{pPvca`T,wW~+V ^dXB[|~G nKDm_OOR~C>XTԄ+TLU]?{DʏmI0J_M&OP=R܊+-RG*]뉛>{C mVG^KNO E=QE*P^i@aN zdRlf&V]h9YMVj.];k`'lcpdhq'\WyH_Zwkca]\{dQ`LYfrc:h)fu'BhhCnhvhnXb`Fw[[bj-^ec[\`gKibj: dl &dmkmzT0iivWykBhZtm Z]0nJ?_pJ9aUq%`r ixr~#2PkrtSsgAW)tXZuI\\v8L^Kwq%g]x ~i1x:M!{sP|f6TG|oWWV|H{Y|7[}C$Z} Ri|~ ~JMrNYa.Yy@[tӄypqsMerQXxsUUJuX;v-\ *wC^x0`~bZxolUcnjYW_o\.Iq6_!; rja*RsZdCt d~g!|mh]bRjx`V6l#cHmei:&ng)oi7p}i~l*l5df`fhThiGj6k9FkmM(ln]mnn~eqja#nF_cfoSedpFgr8hns"(mhsjs~.wi^v^`vwPRbwEd\x7ey'eyxhyg~0{h[K~]]~R` E6a 7c+'Gb/qff$~h%Y]D[Qy^ D_ㅉ6a)&`a&eTD0}gW-\Z3P\^6D"^2"6 _?j&g^ad8~5dz MZYzPN{TA|dW2t}LZ!~] ̀]xe{cEuTXvXLw[@*x]1y`S!zgb |b=jH~aq\W]r_Kta?/uc0ue vxg |yAgoV`md2VoQf4Jph>7qi0r~kYrl? 0vXl t_j\kUlm_Imin=,no/xoOpKoq sqny^vgFsTitHjutX\L`NOCS>7 Va(YVZ\q[i5~WxNS|MVBy`Yq6,\(^I3_C`nmVH{ZZLT|]@A{|_5>}_a'S~ck~d/eVs$U+waK1xc@VyUe4Xyg&zhzi/s}jox Tt9iGJ)uRj?Uv/l63bvml%w7nXGwn^Z{io|rS&q,pICroq>sdr2tsg%7t=stsbyCuRQnwx Hsox=py1qyk$qyr&yxJ{sQl'tGm=Xn1o$eoRBp:\x'Q%j?GolM|np3}6oh(q}}p"}pl ~pvUFy1t]=z-u3\zu'{vrzv |6vl{GFOv{lAUx5:W+>Z:[\Ґ^.i#yt=o}[4P]*_gd`a*c:nV}X<b3tid&)Det"fKfght;ˇi]2j(kkBk?kn0y;;)p)1p'wqyq熮qtS}:|w 1]w|'vew.wIwnz+: ~'0~O' ~1~\~.~mft2 $i 6 1^ 2Wy%Y !"#%#&D'f()*+-.(/H0i123457859Q:m;<=>?AB)CBD\EuFGHIJLM,NCOYPoQRSTUVX Y#Z:[Q\f]x^_`abcdfgh#i3jBkRl^mgnqozpqrstuvwxyz{|}~ˀɁǂф{pdXL@3& ֜ȝ|jWE3 תū}kYG6$ڷȸ~kYG5"ŵƣǑ~lYD.оѧҐyaI1ڲۘ}bG,{W3qHvU3sIa)\ Z,      !"#$%&'()*+,-./0123456789:;~<|=|>|?}@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`acdeefghijklmnopqrstuvwxyz{|z}o~dXMA5)ۈʉq`N=, ٖɗmZH6%ؤʥwog`ZTOLIFEDEFHJNRW]cjr{ĄŊƐǖȝɥʭ˶̿*7DQ^kyކߔ ,8CNYcjnoldVD/h 2 R e r xzzzyuph^RE7)4=@?:4 ,!#"#$$%&'()*+,-./|0p1d2Y3M4A566+7!89 ::;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{||}v~oiaZQH>5+! ؎͏Ðxpjc^YURPOOPRUY_fnx̰߱ 8Ql»!Ceª9^ɂʦ2TtҔӲ6Lat݇ޘߧoX\[VL=*b/fMq T p_L7! }tfUA, !"#$%z&d'N(9)%**+,-./01y2g3U4D526"7889:;<=>?@}AoBbCUDIE~% ہ‚rW; ϊ}bG-ޒēx`G/Ԝq_O?0"۬խЮ˯ǰı²µŶȷ͸ӹۺ 0@RfzƏǦȾ *GcЀџҿ'LsٛFsM6+1MZ:{OX͙~ʹ~y~eL~j~Qc=9~|4~cl@~]̳~nf~C~لOiZ/gP8v}6q}0}>ϲ:}i^},~"hN~uO 7A胬|.A|33|M|WE|ߓ}OgV}ьN~|M6g\7{cߥ{fǪ{ `{ɞi|+~|fn}CAN.}{5~zʸU/zDzCz{,a{}|$Ye|ȕM}5[~_wzRêzF2 z] z;{|{d|`L}5P4~=cyy@yz:z$| {[@dH|Lo|4}uyZy2yƔyj;zdj{w{ @c{̡L |34=}S~6׆}}p}UR*}u{}că~5Lx~5(=}p@kcyԃ-bKÂ4؂zGetMڽos ČX9wxʂʈaiJ͂&L43oۅO_tz莴r wA`ցNjdJh3\lԟ[7—vx`9Iue3${K͂:X2-{6 uȀ_JH䀯:2ՃsV/&ĤuU^THiS2`rփȥ$ƁWSJЀatk.\^)H;20T7Yn#s]ƞGЕV1||c|:;h|G|rʼni} ]}G{~2Q9*ǔR<6W[䂶q҈=\+3F遢1˄ڣ9Wr݌>WpxpЇh[HwFF1T4B،lkȉR9oهZ؊&Eo0샠ᤔÇ [ޘ:OnkY΅J4D=[05 ֵK\wʤĘRL~nY+ΒDsЌ0EڇDէи\Qڗݧ*mwzXbDsl0VŒj¦ψԖч{Ά=[l)X6NC'/тNA̩ՊMĠ'-7lgWԃٜmCx/O{Y{Q{F '{s~{ju|wV"}9B~P/BB̝ҹ<Ւ4 $~ӁiڍcUƋY1A7.zB!DE.Z.7} }iцJUAtp .!c˒ɒW|-Qh )TX@ۆ.e^fDi{ 3gQSm@]a..4ت`"סp 91zL fS6t@0-؆d VבAȣyf cRƈ?熏 -؄.eNĠ!|iDxFeDRk6?A -LŅq͒rƋwx{(e R?p-@ zɠz|zzur{Vb| P*[|=~ ,j;ӽp|Μsn%tŕb ǀO=n5,IY6ܟn웅φAusPaRPNل[= ,,ĻݔОD[ٚ̏~sd`TNf4<,è靎e!4ڔ&rٹޔVj)0Jp ^*L ;+Ņ􈉰(z&z ~z}HzjlJ!z[{J |9j})Ћį\RfԨف|PZk2"Z}Iʀ69!K)k9wkR{|GsGk]HYEsI 8䎛)ςϝ.4js2{{5j\pYTH`8n)GɬjԋIz,iX͕HTŊV8q*фDb7ɥR zi#fXVQH0k8Z* nԫ^D-yhTWGŐM8>*håڊʨly1hTW|Gj8*5%*؇TLdWɴ艴ux՜MAhF WxKGn/38*yǓyqb -RƇC`q:5ل(!ރ,ǘiq[LOa3R#C'Ή@4C(HaB%7y֙paDQ՚~UB84폿(in.֮z@ILp5`%QB֔4Ff(/\ ̀Ҥp^`žQqBT4(YϞM g<4˨s0p(Wd`PQ[HB 4ꎶ( Qy2yPxybiy[gzhL죡{O>|b1}%to<&؆ѻxE\i[~L,>1%܍2k3w+;iM"AZLb>-1@K&68P.TwOh~_t1S&HNBHƸyw3hzZ%XeK'T>k<1˒3&Nj„B]{vᖛhfғYK֟}>_ 1ݒU&RN:hvıQh?AKYإ/KĞ>X-1܉e',ƓM v͡Fh,YɤRK>UD1q'QZtvQh'9Y̤,KǞW>n20'onщ$yp{6y(nfhy/`췎ySxzND~}46~}y-z4*z{;24{Ё||vBd}.MU~6:hxYjxyxҪ^zzɈ}{d{c|_L}}[5L~?w31֮wȗxhبyyTzAzb{K|G4~ ivGUvޢrwާwxAMyy(zrb {K|,o4$}uoӿv'vͦצ7wϏ/xnxyia9z|J_{m3}u{ҝuv7$v=w䣍wQxs`z I{K33M|ˆhtqѰu'u¸{7v+`wqvx_yI^z2|t'tUAtɛLujnv$wux+_jy[Hz2|6♄x͍xxx8yd \z uz_{IU|3|~uႎ\?(e+kt 9^sHu2ZIQAAًnŀM>.s)]5GdX2Vݿ(%ǔ|B\PtKnr\1\Gņt1݀4DBAdz~{~ҝ~JA~q~[~ F{9m1t0~t~1c}X}Ӟņ=}ߚHp~ [9~V6E~Œ;1Q~2l}~\}^ǚ}C!^}Zo}Z}E~\0~ }Ė}:||ͭM|禛o9}-Z}E!~+0~f}J|'|5D|o;|Xn|դ`Y};D}ȓ=0c~tvٿ|wW-wݗ_x|yCmцz4Y{FD{|0Z~kud5<іZelgX@{C̄,/n*&T5ɇʕ4ЅkWm,C+w/ԁΉB7Ώˍvj3V|Bۅ/9K]́ih"4Ɇ~d1jUދBPy.ӄ[iLz6W b}yiGU]TA؋.l f3D^'DŽΧɃڢ|hsTفݓ=AWr~.'ʠǼcՐj{wh 2TiA .VΈ uͷ6,ׁEخ|lKe}v̊ c)bP‡>P,ńK'&t1uegFU7}EqЄ6L(z򂅤j?tqdȖJJTȊ;E%6(d(pcc`OޗCtN<9d<7TJ8DԎ'6ه(ϣ奖ԜVsϘcƕ"S푟 D5g(Nz]s]F+c_gSAD`5ۊ n([B?Hjr>c eSWD3_5ĉό(ٙltiNw@2Ǐ&z)"{ɪ{.ZblYLJ]b?N@GԄ2҃&GΓ\rys᥎qup[wF\x됔1zf۳n#o²apݻr;su~p`u [vwEx1Qza rÚs9(tN@uhdvpbw[3yNF>z1~|գ}f|r}|h}|}|~|oi~m}OZQ~}Ef]~71!~#{|(|`R|(e}kn\}pYq}D~p0uҞztDzi`{5n{.|mU|%X}%fD}焋0/~܂g.yƽyͩz9ݕz{-l[{tW|sC}L/~Ux٦y0ymByؚZzd}kw{W-{َC|ȊI/}ax5Lxz}xǦy4'y˜jzV{VmB|W/W}9whxxGx~ayKjzmVzBR{)/&}0ͯwj^\w_w趔xEZ}x$iyUz^- dƵ*% -6 v2~ٟxcG~̙P~Ҕ>p,Qtո1~_u~ob~iP[~}>2~,չwpFqLrІtsъiunaZvOx=Pz+|~Dy,yzC7zrJ{6`{Nl|[OLR;a^+ s6Z IMȈ 9-ەo`]L$;و4+ mvUjF|n)j] )FK2:؂fh*|HwT̡n\gK]Ғ :^*Rb!8†­)lmNj\a0K :kĎ *ځZo#+q NrQ{ҒsjCuYߎvIxf8dzs)|쪓xqx狏yX{eyj:/zYA{KH|,8H}B)5~×C,؀^z:Oir)X H7)'Ֆ+ňzey[HOh6YW*kG}7) ߁+KА]qxtfgOW`YG5X7]) Uܧ*rߗ1 וpwg) t%lǎۢv}Tf UF/Ґ 7) /ʥ#ޖ<׮ֆIjuNeD'UbsE놁6ۄ) wͣ o[pqq™ssJb4StR#vpCJx>4hqz_&|6w'xp}xq<`y'aByRzB{4A}&ˈ~Ďjiǚ`"pLa:~Q$BF4&H⟲ƍ~~[oՖI`sHQ CXB>&3'T"Ϗᛞ~,Hos_ߒkPxxAi3L9'*BD}ƒn~T_WPHhA3ɈH'@y̚Vn}2)m^ݑO.)A|,39#'S3~DZi|şPm^sO’AAŎG3ԉ'b@8Įڊ<|9n@m$H^FOJaAq3!'nߐo~pBvqhrYڜtKWv9=ʓx0ezN$|ېvڃlwCuʣwgɟxxYqyPKWDzR={r0j|$Љ~hy~yr~)uUk}gMl}Y`~KA~Z=m~03%ӏ`P^t_fĝadXeJTM=;0q%Q6vX¤yt?f1X7qJY%=Y0%=ÔGɒsːKe͎WЗ͋J‰<쏦0rl%!:-$0s>1+e[22W|5:Iݓ-<<׏30%҆צǟseW7.I_<0|%cōrjrrY?dΚ=V7IqD7<:01&WFnxaokƬq&^rQt1Eu8 w,8z="'|҄nvxJvxkw^ͦwQСxDky8{-%'|#0~SLM};w}|kh|^|Q}/DЛU}8~&-N3~#xX(.w\Mj~^-QJDVM8-o[#͉热0wChjF]̣QDvt8 -$YuvjSʍ]ԋP˝ˊDS@8do-$Rz嘞vj+P]N/P*D6 h8-i/$ ްivi릧|] PnDF8zB-ό$Yv;i5i]PX D 8ό-⌛$͇my0nem}oaεJpV r=JG\s>u3ʜw)z1 |yiuomua3vQV"GwJ_x'>ۡyg4z*|q!~>y>|m{aֲ{V {JU|R>j|4(}*U~" ym\aɁU׀JRX4EY*π~"y߀xm?saaUɅQJ-k>Y4`ɂ*ґH"֊8xƻ&Dm-gat؋UJ"ňG>y4zK+R##xlm$apU%2J >ʉ4Nq+2Q#b:]x am"]jasPU6Jn4>;?4ɉY+VB#݃x{&m'ꝑa|UJ$/?4Y+m臉#yڥqm*ƦsQnIJ+tpW uq釴w0sr&xuB\ywGm{y#2}{ضoxqkxrytOyuz4q"w=z[x{Fz|2%|}n[oQDqT{rށ5WtopvZwр=Ey1{4lnE ocqք sCunu Zv鄶EZx81D{QzӢkG}mŬ nprr;mt!Y?vDxJX0z2XjIlvmɛȖTo#q_lsVXuoGD?wJ0z;PikI mXMnşpl-r2WtڑCCw60[yφ"Јhjwlhqn'p kxr+-WUtdCovΎ{0'yuSh|jSHkēm8ojqVsgCvv/y,Szl$zm{(o,{qT"|Ls j|tV}vB~y/{`x/v}xw0Rx?z>-| 'qro(ksKLt?xufFdvRx11?y؍*-{®q*r ٝrܰsƪ'wotd]vL!QwΖS?=y$-{n`{kR݂m?o ^pvrcȁxtQrv>x,{Iuɀvc_vڈKFwu;xbDyP[]z>|,y}&~٪~ƙX~~6~~t~~b ~OZ~=,FII}t6}}}s}ᄯa0~%N~{=~,||9|`|{r|䊜`^}ENb}<~O+v{{ꕦ{'{ГOq|s_|M} <]}c+~жzؤzz͂{q{n_{1Me|x<}@+~- zK8fzZzdDCzfpSzᛂ^p{kL| `;|ۋ+}׆yWy*zy}zozk]zL{F;|+}ׯf;jNlYn~pGn)r#\)t#KWQvI:@x){sjt]u~vmOw[y JAzJ9ك{)}m |H}#[%}>}V}blo}[,}J-D~;9~)ւR (`)ᄡ|kqDZۂIX 95i)Ɓc,/͌ {qjzYUI#8J)v9?^zCi聱XY">H=8o)_ǚv͊{Hyi9X"HYT8o8)0w%dۂԁáyH hX .(G鏆8AҊ)ۅeăd<}E`UxhbWG48C))jNl?--nuvoeqUm sELv6 x'v{5s>teu t:vdꋍw?TډxE=y5dž{~'}Yl){I`{Ń{t|Ed(d|T<}DD}5~<'@~zۃHrtns$҂jcdPS؁DC_45Y'rX\#_r@ψbP6SC䅑5,CC'ȝ͍ڔ.Ӏڊqb\R0*C4'z)/[-rpވYbapLR+C͉1(%ۄyHgАvY4hPZckLA'>Ԇ1%3c0 v?th:YَK⊋=>g8o1&ƃ'惆uʑ4|gYRJK>)ċ1y"&$lO]Ψ?/^ugѠKgFEY*IKD=c-1c@&4%􈀦li|Qkom]bvIoGUqPG)s:fu.;x#!{Wql{rsoGsb#tTvG_w:Cy>.Oo{#y}1 x{kyEn̝Dyaz2TWfzG{:`8|.\z}#Ƈ~ĀJz͟ln a SMFƑ:7G.e$zf P[AE;Z1ٓ0U)Fj"0΂op~7f ![BPY_EE;T\1撠C)k"djpmfr=[M,1P\ǑES;`Ћ1')}"Ρmfni=pkqr^mtolVurX wtDyw'0|Yz>̾jqźjlr`ntpu0rnvgkbtgwWIv~yCtxz0b{x|bh|~j|l|^n|~pp|j\s}AVtu[}Bw}0z~l;fׇ i 9kDmh5})oviNqꂿUtXBEv=/yVǧeP{qgi卞|l{nohLp(TsuSAv@Z/ryX_dִ2f}}hƖMk/zmtLgdojT3rxAKuI/8xσ[c&5e[}gܞrQj.xylfoDSr d@u/x\ębp vdܫg%iwy3kyenbSq@to.wUad`RfWh-xkkemn)Rq\@?t@.wZtf4uhvjxxm0xyosekz.qR|{itP?|w-~zK'rp{sqԜu#svFtgwwtudxw*Qz%x?E{zb-}|Xpzr'zssj{@(t{vxv|cwy|Qy }>z}-R|~H(oYpq݃^s=uPt;bvSPPx <>Ay-|0m{opzrt?s^auQOw+T=y>,{¹luSmoou{psGrlatqOvk?=txj,{ @k mܖnlprxqؔM`WsNuȌ=&x,zj׫4lgmomqq0_s*9N uI_|2so|u]}@vLO}xT;"~z-*|Ly(x*yyr z$yzz~n{D{]{{K||r:}}?* ~%FwzKxx~yDQmz\'z݀K{Ҁw:^|0*~Tۮvvfw`\}xlx[^yᅜJzV:|<*}ktufvV|wkwZyRJz79{*}1Ь&tt̛ku}l{vDEjw7ZxUIy|9{*u|sh$ t$tӟ{2ujYvVYwɓI7y9Kz*h|ersMtTzuuiv>YwKHx9 zL*^|쥋|e;gȈDj,xl{hQnW3qWGrs7rv(jz\nSoqtwƂ\rg~tW v4Fw7#y(k|>wEhpx #xvyofz/VZ{Fh{6ۀ|(k~#H߀ SuezUF6(k^~ˆK~/Y~sIt~]Jd~dMU ~XE}~σY6_5G(k}\}1q}uvs}jd9}~Tv}E~6(~(k8e|ٚR|˜ |vs>|c|S} D}k 5~ (k~ǃJ|4ȑ|$|Cr{c|$Ss|Dj|5}(k~k{{ {4{r{yb{_S|D|5}By(k~!E1d鋩gl}݋hio:Al(`nPއq As3rv%zajmy!o}pnrE_zsPYuAw3Fy&!|0u߉v|1twmkx_^ÆkyFO˅zzDA6{U3|&>}ݖ"#~~G{& ~_lن~q^.~OJ[~@惑~2%&XIf5ˆWȅzG҅+ln]| NۃV@P2&nȔkɎcэZyދkIV\σ)NZ|)@Gꅎ2y&Dž xzj3 \7qMЋ@C2& G_2yxhj~[Ԓ!MnF?ƋJ2x&K:Ʉw i[SOdM#ǒ?Y2m-&(dg sYieߐkXnWJpc{"r}~zsIzgh{L[p{O|4B+|7;S}o,Ox~0"Յ~~vrf=BZܒNـB*7ij,\P#;}}~r4fxO"ZhNMBe@(78,iA#FaN}qǖ*lf Zۋ M2HB-7߅,yY#p9|qeےNYƐ*M}"A튘6؈U,ۅ#||(qW,esY!MANJje6Ç,}#5tPcjOf=_`rhTkHm=op2s(Hv "zbtu5k#jl_-$nnSjpDHrB=tytn2ݑOv)yL |triIs ^ٟtSuSHt#v=_.x02y)B{! }~st(o.w]^`cCcHlVf+;t)i0aldOȯ>tsw[-wnw\-_AMb0ke#SsShA!a7kO|o>#r -v0[Dn^aaShdL%rg{`j哟On-=rfv-vm3Zp]­ `܄cr f؝C` jRNnb=q-vBw~o`^q&ccrfBti quk_wInN1yq<{u8,-}pymjynlpptnRrp/qsr_;utMwv2u6x)Gz_юzb〾eqhbmk~Rր$nCq4u7&y7}Gh}kj}lp}oa~8qR7~sTC#*u4xA' {*{&q{{r~{t&o|2ug`|vQ}AxB}y4N~{.'|y6z?wyz}z!{Loz{`{?|9Q{|BZ|}R4%}}',~w݊|x%|xnnyH _JzP]zLA{3}'9~u)vNovꊍ{wqm9x+2^xOyA{^3|f'C}䁀uA؈u5zvElw>&]xOXy,ABz\3{Ѕ+'L}lltq5u#zUuŖkv{]cwhNx@yҊv3{U'S} sڤtyu01kvu:\vҕ8Nx*@y\3Wz'Y|u_wbviehͅhoZRkXLEni>[Wq0u<$yB˅h.j@ul^h,n{YpKуXr>ul0Ђx $ւ{!pQVqtՂs!g"yK펭gXwOiknjk_EmRekp'E$r9u&-Jw"ք{1ov勋pkTr ^!sQuE"v8腦x-Pz#|`vvwj/xV]y'QTzDąz8{-S}#U~Aq~0uQh~ri\~]BR~PM~Dzk~8"-Z\# ވ9tCLh?\8 PyBXDKh8-]r#LFt5^ hwZ\?O@OgC邡N8Z-ZqW#Ӂ ~؆'sh[ԃ4OC8 ^^-Y#~se"g[uOOCWq8-Sf$QUx3f_)m2bb!dW:gKoj?ln4}q})鉪u= hyPwfmFhbNjVmm͉/}4/U4+d *u"5wtjCԉ _w TYI=6>gg4+* "cjt<ѐlj)(_?JtTO}I o>-4* "(5sIi^SىHӇ؍"> %3*R"ӂmBo^cxaYZdcNgbDLj9ѓAm/qi&όKuByTlec4gYPj#NDlD6 o 9ؑq0[t'w{l1:lbnXoN^qCsp9ŐOu01 w'az|k|s0bt9XuLM"vwCw9y#09z'|A W}k8yalzJWzM{PCv{9~|09}j'~E "jʚրKa=LRWX:M@C69h0<'އ p0jm醤`f,WtMɄB9F0G!n'k!%j'*`V֓iLƑ Bǎ-^9]07(݃+!R|i`"IV˓Y;L`Bōu9*s0Pg(6oZ!v%pb^Y}s`P7cFѠf=ij48m+wqM#uETyUbdY/"fPgi0F\k=q nb4_qK+tZ$hhw-zak$XԥtlOšnxFpj=]wr4mt,1w@$Ō,y|sapqVX}rsOisFS#u =;v4mx=,W_z%{ }a#wxX8Ax!O)xFy=%z~4l}{,vG|%Q#}K~`ݤ]}X }Oq}E~= ~J4ui~,Q%Rυ`fzWANuEO<4u,~E% `v*W؟ON囨xE֗ĆJ<̅/4hׄ*,ۃ>%W D`YWӞNEӗp?|sk2}v%z0xtkumwvoiVw(qh[3xVsCLyu7?){#wI1|y%~|Eqtrruutvh{uUwZyvxLrxy{1{|U& }}Ǝo|q}Strh}gts}YuH~Kw~M>ox~1z~&%}=T"n!Hot pyfruXt4KSu> w1z:^&9|Zl΍|)nTrsVo͋!eqZXis(Ju=w-$1ky&J|$k•vmWrnڑempr/WrFJntYl=v1Wy{&X{Tj&lrAndogWq"J$s=[v1/x&c{imZ{8]o\2a\b~DdU/^h G΁k:o~.2s#lxA~bz~einh aAjTmcGfp=:Js@.|v#z.|`jy|lm}n`}\pS}rF~Qt:^~v.pyU#〽{z.rxztl{uM`.{v~SK|4wFt|y :}zn.g~{$}xDzwx{Ykyu{_Uz|ERz|F{};9|}.c}~f$<*vvwqkxS^xɁR&yEzF9{À.P}$_~XauzNv&vAjWv^wjQx@3P5i+U"Mv~h"la~sa~[VP~<"K~AG?~oy5L~+Z3"ǁ v)}rk}a}zU}bJ}tW?}5~,+_~"Zu|k|ד/`|ʑU|J`|ˌ?[}5}U+W~;#pu^Zf]p\ms`Qd6Fzg;ϊk1zMox'هsqxZo4a`fd [䍉fQL$iFtl};9o1r(pve >z#nheUj[LlPĊQnFq;|s1gv(B;x j1{n;odqZrP7t Eou;:Jwd1o-y9(b+{5 H}@m,vpc=w^Y6xAOy EI z:{1\|0(}=}_!~l䈺}McY}Yh}O-~D~U:~1\~(nZ!@lZbԆƒX׃YNڂDX:1nF(!qQkubXNUDu:I1K(Á*!kᐿbI9XmSNMHDA[:m1F(р!-eޛ1Y\\S`AI픟c@"gh6fkL-Wo_%Wsxbe"G`}\k?c)S.eIh?Xk6jo+-Wr%[vJzd'g,[ԕ?iLR3kI=m?pJ6VDr-u%x{dm[8KoPRYpH͏=r?d t62v-x%܆zc}csWt3ZuIQv`HXwz?$x6z-{d&|~[bzZ=K{:Q7u{Hw|+>p|5r}T-~&(~8rbY5PgGm>v~5؇n-n&Hi 7_b*φYSPG}>n5Ճ=- &h} f6$aYoP㊄Gf݈>r85Ɔ-̄lq& ځ[\XSP\1J垦_BHic&9f1',k )_koL"^s^xhZڢ_pRԟbJ}dBh9 kG1=|n)r`"ϋGv:>zZkeR^gJ!j8Al9^dom1ArM)׍ZuK#-xw†{Z kQmI1o[ApqR91sq1&ـX/zP[Hޔ8@ő=e8Ў1108*_K_$J[cXoP͖)aHɓ~S@8֍z1E*t$c,4i\U+2_Y&c]}Lf0`litd[lhK;pm(;tq,xv媋X_a\ob`3_eW|'cWhLkfkIZjnaJnq:s4u4+wy>UgiY>k\m~z`ojxdqYhsIm7v :@qx+w{vR=ssKVct&Zduy^lviSbwYgy I:kz]9p{+v7}BOw}BS}nX"}x4\d}h[`}XIe~>Hj~9o~+unM Q†=V8w=Zg}_]WdQEH8i9To +t"K)sOׅT*vzY@uf^WcCGhV9"nt+tiIN$!SMuXfD]7VbeGg8m+t+Hp7M{RK\upW!e\;8VXaGDgb8mr+scU5fiY:Ih]'ukxaeqn,dUqhF/t(m77+wq)[{Xw +`0^呣caEeetc0QgCnll05q)|v#bQ1MU"|YnM]Џ_b,,Qf֊Ckp5p)vMUPjT|Xsm\*_OaZPf!Bk)O5zp)uR[k5UVmYV{'n]=mpa^gsdOuLiASwmI3vzq&}w+g^jbiazl dlnLg]pjOsIn@vqk3Fy/u'&|yQdagx fixialkknB\npNuqpr@tut3#wx<'{{Satpad@qwfsWiit[lv5Mow@ s4yb2v{1'*z}.^y.[ayvfdzhg{%[j{Mng|l?r }&2u}'>z~ގ\ƁR_uwc h f1gZYi"Lm+?Rq2u)'Oyk]Zi{^MtagWdԇmYh]IL!l()?p* 2t}']x聫Y\t`L/fc'Y3g`!KkU>o}2ts'ix}ƌX|Y[7s_YvfJbҒXfKdj>n2Ks'rx'rU~LsYqqu)]Odva#WFx eIyiOr7)t.̂wY&y߂=|eǀq,\rS€t JWuz@߀w7sx.zN&Ł | *l}e~w\M5xS3OyIXzf@{j{77R|.}&E~ i dv}d~}[}~R~~Im~!@$~P07(~_.~' +c|([j|Rq|*I>}{@}U7}[.~='~k c{*[{ʊOR|#H|Q?|U6}.}'$~x W^㓈TVXN \fE%`a<~d3h*ˊm#Mr&w^[U^MwvbDep;ȋyi 3 l*dp#u yU]XgbUEddL=gD:jb;}md2.p+s#wl&z\hT jLClCȈo6;+q2̆t.+zv$0{y|e\ oT&pKErECKAs:5u28w+$Fy$aw{}[u uaS{~v|KGwBx:y2z+17|@$}+~Z{S |'Js|B|:n}w2~+GM~$<gZFpRJhTB\:4݀2P7+?$ہ2 Z3HHR'Jy B_τ:b2ZM+|߂$/TܜT#MZWE [>_6&d.`5h'Emm| r҈~wToRaX1R^DteA6lC*sJ>9Dz|JoP`V+R]LD,d}b6k^*rރK(f9k'y7oԃ-}t$ysyTJnXc]EXa@`MUeBj]7`o7-ct@>$ywlsQltWU+buYdVwU]KBxb?zf4|k*W~p!dvuoXkp\La.r_VtscJvbgC?Vx~k04zoO*l}Ds!xtkq`jmcj`4ofVUAqiKJtlX>vo4Oy!r*u{v" ~z{sLhh9igjju_llT|odnIlqqS>{ts4!wve*zy8"M}|/re)ohRgqs^ jsSmBtHpv)>*s2w4vfy*y{"} }q!bwvgexa]phy7RkpzH^nz=q{3uK|*x}"|`pS`k~fc\f5Rei@Gm1W=yp3tW*x("{р8o^f4a\AeAQh3Gxl=!oɂ3sY*w"{]2o9]$e`[deQgG.k%`[nb 5f,Mk$bCq5ՄvaCjWY[OPGJ^G6b=f4Ձ{j,[o8$sRqx`C|^X |aO}dF~.g=~kC4n,Z\rv$OvaIz[_Tye^W"zgN{j_E{l=|o4T}r,N~u% xI{^pvOlVNwnMxoEFyq<{t4|Nv6,B}x%0zkn}G]srUult!MGvunDx!vb.8XfH0j(fo "5sxV]IO;`uGc?vg7(j/nX(Ճr6"vFgzLUҁcNvfSF܂7i?#4k7P(n/,q(?u%"rxЂ{U)j Ml&F9nL>1p7 ar/u_(w"`z)}T_|p[M}qE~sz>-~|u6~v/Mx(z#t|ts~;SzvyL{wEB|{xt=} yn6{}z/k~2{)~|#D~!{3SAx|YLz/|D{&}-={}6@|}/:}R~x)~#o~RwqKxDz=qzX6U{/h||)'}c#~~NؓOHJSAqX:=\2av+#f%AzkqovM̐UGRY}@]_9}?aq2le+jO%lo RsGxM[F,_?Ռ)b8f2i+y1m%q [v/; z>LxaE|d?1g8{j1ɇm+eoqF%jt xM{Kڈ^gESj!>{l8o1q+\t%τwb }zA|KAmDƅo>@qn7Ąs^1s9up+cw%y!&| aN~JsDL t=v"7w{1Lx+Zmz&|![}~JLy/C炗y=z7V^{X1-|2+E} &2~!~ځ,I|~CR~=U~71l~1$0+T|&(!ĀTmft1!  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92FJM`LrLڨPϦYǥdħoxƶ˳Я֫ݥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗92EJL`KqJڪMϩVȨaŪk¬u}ŶʲЫ֤ܚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚᚚ82EJK`IqHۭJЬRɬ]ƯgñqyIJˬХ՝ړޓޓޓޓޓޓޓޓޓޓޓޓޓޓޓޓ82EJJ_HpFܯGҰNʱWȶbźlxŭ˧ϠӘ׏ڏڏڏڏڏڏڏڏڏڏڏڏڏڏڏڏ82DKI_FoDݳCӶH̷Q\lxƩʢΛєԌ׌׌׌׌׌׌׌׌׌׌׌׌׌׌׌׌72DKG^DnA߸>ֽBJ¾\lxƥɞ̘ϑҊԊԊԊԊԊԊԊԊԊԊԊԊԊԊԊԊ72DKF^Bm>};yN_kzpwtuwsyr{q}poˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀoˀ )A$U5eFpTy{avhrnoqmtkwjyizh|g~g~g~g~g~g~g~g~g~g~g~g~g~g~g~g~g~9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@PUPeQuSڢ[РeȝpŜ{œºŸɶ̳ϲҭӭӭӭӭӭӭӭӭӭӭӭӭӭӭ9*F@OTNdOuQڥXѢbɟmşwžùǶ˳ϱԮקէէէէէէէէէէէէէէ9*F@NTMdNtOۧUҥ_ʣiŢt¡}øȵͱӮاڡ֡֡֡֡֡֡֡֡֡֡֡֡֡֡9*F@MTLdLtNܪSҩ[˦fƥpåzøɳϰիڠܛ؛؛؛؛؛؛؛؛؛؛؛؛؛؛8*E@LTKcKsLݭPԬX̪bǪlĪv~¸ɳϬգښܖؖؖؖؖؖؖؖؖؖؖؖؖؖؖ8*E@KSJcIrJްMհUΰ^ɰhƲsò|ɮϥ՜ڕّّّّّّّّّّّّّّܑ8*E@JSHbHqH߳JֵQжZ̸eʽq{ȦΝԔ؎یٌٌٌٌٌٌٌٌٌٌٌٌٌٌ8*E@ISGaFpFGٻNӿWcpyǠ͗Ҏׇه؇؇؇؇؇؇؇؇؇؇؇؇؇؇7*D@HREaDoC}DJTbnxǛ̓Њԃւււււււււււււււ7*DAFRD`BnA{BFRamxƘʐΈтӀӀӀӀӀӀӀӀӀӀӀӀӀӀӀ7*DAEQB_?l>x@FQ`mxŕȎˇ΂6*CACP?]Rcpzċņǂ5*BA?7J0R/U,h0BWgs|2*8=/E)H%R)l1EZit|~~~~~~~~~~~~~~~0*/8&<;#W*o5J]ku{~}{zyyyyyyyyyyyyyyy.*%0-A#Z.o<O_lt~x{{y}xvāuÃtÄs†s†s†s†s†s†s†s†s†s†s†s†s†s†s†$%#,F&[5lDzSb|lxquusxqzp|o~ǹm̂l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄l˄ 1G,Y]?fCmMoNYfqyĆǀ|zyyyyyyyyyyyyy5"B7AE=P;Y69A4H3M6P6g;{HXgr{|zzzzzzzzzzzzzz2":43=.B/A.U3k;~J[is{}{ywwwwwwwwwwwwww1"31+6&6&A,Z3n=M^ktz}|zywussssssssssssss.!*+",-#G+]6oB}R`l~s{wx{v~tǀsƂqńpćnĊnËnËnËnËnËnËnËnËnËnËnËnËnË* "3#J.^FJFVHbKmOwU^lȷqw}Ɣɐˌ̊ɊƊƊƊƊƊƊƊƊƊƊƊ6C.F>EJEUFaIkNtU{ajĺpu{ŎȊʆˆɆƆƆƆƆƆƆƆƆƆƆƆ5B.E=DICTD_GhMpVudzinty~ĈDŽɀʁȂƂƂƂƂƂƂƂƂƂƂƂ5B.D=BHASB]FeMkXmazgmrw}Â}z{}}}}}}}}}}}}5B.B<@G>Q@YD`NcYg`yfkpv{}xvuwwwwwwwwwwww4A.@;=E;N>UDYOZQlZ}biqw~|yvtrrrrrrrrrrrr3A/=::C8J;OENF_KqR[fpx|ywvtttttttttttt3>.975?5D9EBHDRHZNaVgbmgmrx~‚ƒ3A&B3@=@GBOGWM]X``lf~kqv|}{}3A&A2?<>EAMESNVZW^kd}jotzzwtwzzzzzzzzzzz3A&?1<:IDMOMWV]jc{hmsx~ytqnqttttttttttt3@&<0989?%9.656::WEgKuS^h|qxwt}pȂnLJkŋiĐhĖfÞeåeåeåeåeåeåeåeåeåeåeå//*"$!# -55I4N?\JfUoy^urd{nk~jphueyc}bځ`ڄ_ه]؋\א[֔[֔[֔[֔[֔[֔[֔[֔[֔[֔[֔  !.,?7MDXOaxYhq_mjdqgjtdowbty`xz_{{]~|\}[~ZYXXXXXXXXXXX   $//==IIRxTZpZ_i_ddegaji^nk\rm[vnZyoX|pW~pVqUrTsStStStStStStStStStStSt'-49~BCwMJnSPgYUb^X^d[[h]Yl^Wp`VsaUvbTxbS{cR}dQdPeOfOfOfOfOfOfOfOfOfOfOf*(~82vD:mKAeQF_WI[]LXbNUfPSjQRmRPpSOrTNuTMwUMyUL{VK~WJWJWJWJWJWJWJWJWJWJWJW->L.S;WH\Tb`jkrv|䅄|yvsqonmlklţnƢnƢnƢnƢnƢnƢnƢnƢnƢnƢ->L.S;WH\Tb`jkrv|䅄|yvsqonmlklţnƢnƢnƢnƢnƢnƢnƢnƢnƢnƢ->L.S;WH\Tb`jkrv|䅄|yvsqonmlklţnƢnƢnƢnƢnƢnƢnƢnƢnƢnƢ->L.S;WH\Tb`jkrv|䅄|yvsqonmlklţnƢnƢnƢnƢnƢnƢnƢnƢnƢnƢ->L.S;WH\Tb`jkrv|䅄|yvsqonmlklţnƢnƢnƢnƢnƢnƢnƢnƢnƢnƢ->L.S;VG[Ta`hkpuz䇃߂~zwtrpnmll¤nĤoĤoĤoĤoĤoĤoĤoĤoĤoĤoĤ->K.Q:TGXS^_djluv~䊀߅ۀ|yvsqonmn§p§q§q§q§q§q§q§q§q§q§q§->J-O:QFVR[^aihtq~|߉ۃ{wtrpooqrssssssssss->J-M9OESQX\^herm|wߌۇց}yurporstuuuuuuuuuu->I-L9NDQPV[\fbqi{s}ۊքzvsqqtuvwwwwwwwwww->I,J8LCOOTZYe_ofyoyێևҁ|xussuwxyyyyyyyyyy->H,H7JBMMRXWc]mcwkuܒ~ӌ̆ƀ|yvvwyz{{{{{{{{{{->G,G7HAKLPVUa[kati~ޟsԘ}ˑĊ|zyz{}}}}}}}}}}}->F+F6GAIKNUS^Yh`qhz٥s͜zŕ~}}~->E+D5E@HILSR\Xe_mްivҩqȠx~-=D*C5D>FHKQPYWa^iڴisͬo¤v|-=C*B4B=EFJOOVV]`dԸgrȯmtz-=A*@3A2?;BBGINOWS^_˾dqjpv|~,=?(=1>9A@FEMIXK\^cphntz{xwz||||||||||,==';0<7?)F:MKUZ\hbwgm~svypŁjĉfÒbÜ`æ_ô_¨aaaaaaaaaa,51 .#-"3:.B@IPN_Ul\wc~jvqoyk΀g̈dʐbɘ`ɡ_ɫ_ɹ\â\â\â\â\â\â\â\â\â\â,0,'&- 73>EETLbRnXx}`vipqkxheцbύ`Δ^Λ]ͣ\ͭ[ͷ[ͷ[ͷ[ͷ[ͷ[ͷ[ͷ[ͷ[ͷ[ͷ,+$+&48>KGV}Q^vYen_jhendkraqt_vv]{x[yYzX|W}V~TSSSSSSSSSS   +06=@H}KQuTXmZ]g`bcfe_kg\piZtkXxlW|nUoTpSqRqQrPsPsPsPsPsPsPsPsPsPs־ "!..9:|DCtNJlTPeZT`_X]eZZj\Wn^Ur_Tv`RyaQ}bPcOdNdMeLfLfLfLfLfLfLfLfLfLf %1*|<4sF;jLAcSF^YIZ^LVcNThPRlQPoROrSNvTLyUK|UJVIWHXGXGXGXGXGXGXGXGXGXGX'{3$q<,hC2aJ7[P;VV=S\@P`ANdCLhDJkEInFHqFGtGFvHEyHD|ICIBJBJBJBJBJBJBJBJBJBJ( 9H%O1V=\IcTj^qhzp|wx}tqomkihgfeŒe͒fђhҒhҒhҒhҒhҒhҒhҒhҒhҒ( 9H%O1V=\IcTj^qhzp|wx}tqomkihgfeŒe͒fђhҒhҒhҒhҒhҒhҒhҒhҒhҒ( 9H%O1V=\IcTj^qhzp|wx}tqomkihgfeŒe͒fђhҒhҒhҒhҒhҒhҒhҒhҒhҒ( 9H%O1V=\IcTj^qhzp|wx}tqomkihgfeŒe͒fђhҒhҒhҒhҒhҒhҒhҒhҒhҒ( 9G%N1U=[HaSh^ohxp~xz~vspnkjhgffǔfДhГiДiДiДiДiДiДiДiДiД( 9F$M0T >(@0C8H?NEUK޻^TдdeŬksqx~' 7=='?/B6G0C4L6R?YQ¾`bfpl}rx~}xustwx¨x¨x¨x¨x¨x¨x¨x¨x¨' 588#9(<,B.L-O=WP^`doj|pv||vrommp§r§r§r§r§r§r§r§r§r§& 466!6%9'@&I(NNLVY]eco~jxvpnwhc·_ΐ[͚YͥWβV“VДWϕWϕWϕWϕWϕWϕWϕWϕWϕ& ,& '4#=3EBKPR\Xf|_ntfulmzfua}]܆ZۏX٘VءTجTطSɋS֋S֋S֋S֋S֋S֋S֋S֋S֋$ &  &2(;8CFKRR\|Yds^kjdpeluatx^|{[}YVߒUޚSޢRݪQݶQݿQݿQݿQݿQݿQݿQݿQݿQݿ!   &1,;:DGLQ|SZsY`k_fefjamm]tpZzsXtVvTxSyQzP{O|N|N|N|N|N|N|N|N|N|  ' 2.=;EE{MNrTUkZZd`_`gb\meYrgWxiU~jSlQmPnNoMpLqKrKrKrKrKrKrKrKrKr )!4.?9{GAqNHjTNcZR^`VZfXWlZUq\Sv^Qz_O`NaLbKcJdIeHfHfHfHfHfHfHfHfHfͻ, 7+zA4pG;hMAaTE\ZIX_KUeMRjOPnQNrRLwSK{TIUHVGWFWDXDYDYDYDYDYDYDYDYDY".y8%n>-fE2_L7YR;UX>Q]@ObBLfCJjDInEGrFFvGEzHC~HBIAJ@K?K?K?K?K?K?K?K?K?K $w-l3c:$\B(VI,QO/NU1KZ3H^5Fb6Df7Ci8Al8@p9?s:>w:={;<~<:<:=:=:=:=:=:=:=:=:=u$v5wCJ'R3Y>`HhR|oZwybshonlrjugxezd|b}a~`_À_ˁ^Ձ`ہbށc߁c߁c߁c߁c߁c߁c߁c߁u$v5wCJ'R3Y>`HhR|oZwybshonlrjugxezd|b}a~`_À_ˁ^Ձ`ہbށc߁c߁c߁c߁c߁c߁c߁c߁u$v5wCJ'R3Y>`HhR|oZwybshonlrjugxezd|b}a~`_À_ˁ^Ձ`ہbށc߁c߁c߁c߁c߁c߁c߁c߁v$w5yBI'Q2X=_HfQ~nZywbuiqnmskvhyf{d}cba`Ă_΂_׃aۃc݃d݃d݃d݃d݃d݃d݃d݃d݃w$x5|AH'O2V=]GdQlZ|tbxitoptlxj{g~fdba`Dž`Ӆbمd܅eۆeۆeۆeۆeۆeۆeۆeۆeۆx$x5~@G&N1U<[FbPiYqb{{ivprunyk}ifecbaˇbՇdڇeوgىg؉g؉g؉g؉g؉g؉g؉g؉y#y4?F&M0S;ZE`OgYna~xiyptvp{mjgedbÉbЊd؊f؊g׋h֌i֌i֌i֌i֌i֌i֌i֌i֌y#z4>E%L/Q:WD]NeXkati|pwvs|okhfdcnjcԌf֌hՍiԎjԎkԎkԎkԎkԎkԎkԎkԎkԎz#{4=D$J.N8TBZLaVi_phzp{wv|qmjgfeǎfԏhӏjӐkґlґmґmґmґmґmґmґmґmґ{#|4<C$H-L7RAXJ_Tf]nfwo态v{}uqnkihhϓkѓlГmДoГoѓoѓoѓoѓoѓoѓoѓoѓ|#}4;A#F,K5P?VH]Qc[kdumކ~u؀|zvromlkȖmϖoΖpϖqϕrϕrϕrϕrϕrϕrϕrϕrϕ|#}4:@"E+I4NEK2TC[Saahmnwtz{upmjiÜk˛n̚o̙o̙o̙o̙o̙o̙o̙o̙!+ 3214;?I0RBYQ`_fklur~xztojgdcd͘g͘h͗h͗h͗h͗h͗h͗h͗h͗!) 0.,/8 =H.P@XO^]dhjrpz{vt}nhda^]]Д`ДaДaДaДaДaДaДaДaД!( , (& (2 >G,O=VL\Ybehn{ovtu|m|hc_[YXWԎYӏZӐZӐZӐZӐZӐZӐZӐZӐ!'' !  0=F,N:UH[Ua`|gitnpmuvg|{b˄~^ʍZʗWʣUʯT˾SՆTوUىUىUىUىUىUىUىUى% /:"C1J>PJWT|^]tedlljftoa|s\لvYَyU٘{Sڣ|Qڰ}P۾}P|P~QQQQQQQQ  .9'B5IAPK{WSr]Zjc`dje_ri[zlWnSqPrNtLuKvJvJvKuKuKuKuKuKuKuKu !.9*B6JA{RIrWPi\VccZ]i^YpaUwcRfOgMiKkJlImHmGnFnFnFnFnFnFnFnFnӺ "/:+C5zL>qQEhVKa[O\bSWhVToXQuZN|\L]J_H`GaFbEcDdCdCdCdCdCdCdCdCdֲľ %2<)yE2oJ9gO?_UCZ[GUaJRgLOlNMrOKxQI~RGSETCUBVAW@X@X@X@X@X@X@X@X@XƸ  (4w<%mB,eG2]M6WS:SY=O_?LdAJiCHnDFsEDyFB~GAH?I>J=K$[D)TJ,PQ/LW2I\3F`5De6Bi7An8?s9=w:<|;;<9=8=7>6>6>6>6>6>6>6>6>|q$ h+_2W9Q?LF!HM#ER%BW'@[(>_)vF{M)|U3z]=vfFqnMmyTjZf_cbae_h^j\k[lZnYnXoXpXpYpZp]p]p]p]p]p]p]p]pj$i2 l>vF{M)|U3z]=vfFqnMmyTjZf_cbae_h^j\k[lZnYnXoXpXpYpZp]p]p]p]p]p]p]p]pj#i1 n>wE|M(~T3|\E%L.S8ZAaKiS|q[v|bqhmmiqfucxaz`{_|_}b}c~df߀g߀g߀g߀g߀g߀g߀g߀g߀o!o0 ~6<D$L-R6Y@`IfRnZ|yawhrnmsjwgze|c~bÀbӁd߁eނg݂h݃i݃i݃i݃i݃i݃i݃i݃i݃p!r/ 4;C"K+Q4W=]FdOkXu`|hwnrtnyk}hfee˄f܄hۅiۅkۅlۅlۅlۅlۅlۅlۅlۅlۅq!t. 3:C!I)N2T;[DbMiUs^ۂ|f|owurzoljiiĈi؈kوlوmوoڇoڇoڇoڇoڇoڇoڇoڇq v, 2:B G'L/R8X@_IgRڏp\чxfʁo|vw|tqomllϋn׋o؊p؊qىqىqىqىqىqىqىqىr x+ 09AE%J-P4V<\EܛeOғm\ʌufÆ}ov|}xusqppɍqՍs֌t֋t؊t؊t؊t؊t؊t؊t؊t؊s z* /9?C#H*N1T8\@՟bN˘k[Ñrfzow}}ywuttŏuԎvՍwՍw֋w֋w֋w֋w֋w֋w֋w֋s |) /8=A!F'L-R3ܪY?УaMƜiZpewov}~{yxxyӐzԏzՍ{֌{֌{֌{֌{֌{֌{֌{֌t~( .8<?D$J)Q.֮W>˧_MgZneun|v}~}}~Б~ӏ~Ԏ~Ս~Ս~Ս~Ս~Ս~Ս~Ս~Սt'.7:=B H$߷N,ѱU=Ǫ^LeYldsnzv|̑ӐԏՍՍՍՍՍՍՍՍu&- 68;?FڻK+ʹT<®\KcXjcqmwu~|}{ɑ|Ӑ|ԏ}Ս}Ս}Ս}Ս}Ս}Ս}Ս}Սu%- 568=EվI*ȸS;[JbWhbolut|{|yvtƑuӐvԏxՍxՍxՍxՍxՍxՍxՍxՍv$, 235:?H)ĻQ9YH`Ugamktszz{vronÐnӏpԎrՍrՍrՍrՍrՍrՍrՍrՍw", 0 /17 ;F'P8XG_Te_kirqxx~ztoliggՎiՍl֌l֌l֌l֌l֌l֌l֌l֌x!+, * + 29E%N6VE]Rc]igpovvy}|snieca`ҋc׋e؊e؊e؊e؊e؊e؊e؊e؊z )'$$'7C#L4TB[ObZhdnlytrs{xm}hc_][ZЇ\ڇ_ڇ_ڇ_ڇ_ڇ_ڇ_ڇ_ڇ_ڇ~& %5A!K1R?YL`Wf`zlgssmlzsgwb{^~ZXVUρVނX݂X݂X݂X݂X݂X݂X݂X݂ &6@I-Q;XH^R{eZskalrgfylaǁp]ƊtYƔvVşxSƬyRƻzQyQzS|S|S|S|S|S|S|S| &4? G-O9VD{]LsdTlkZfr_ayd\ԂgXԋjUԕmRԠnPԭoNռpMoMpNrNrNrNrNrNrNrNrع  ' 4>$G0N:zTCqZJiaPdhU_pYZx\V_SbPdMeKgJgIgHgJgJgJgJgJgJgJgJg ۱ʽ (5?&G1yN9pT@hZFa`K]gOXnRTuUQ}WNYK[H\F^D_C_B`A`A`A`A`A`A`A`A`ާ˶ +6@&xH/oM6gS<`X@[_DVeGRlIOrKKyMHOEQCRAS?T=U=VLh@InAFuCC|D@F=G4>3?3?3?3?3?3?3?3? y o( g0_7X>RDLJ"HP$DU&AZ'>_);d*:i+8n,6t-4z.3/1000.1-2-2-2-2-2-2-2-2 ujb!Z) S1M8H>CD?JwFxN(wV1t_:nhAjsHf~NbS_V\ZZ\X^W`UaTbScSdRdTdVdXdYeZfZfZfZfZfZfZfb$^/j5 t<zD|L'{T0w\9reAloHh{NdS`X][[^Y`XbVcUdTeSfTfVfYfZg[h\h\h\h\h\h\h\hc$_.m3 w:}BJ&R0|[8wcAplHlwOgTcY`\]_[bYdXfWgVhUhViYh[i\j]k^k^k^k^k^k^k^kd#a-p2 {8@I%Q.Y7|a@viHpsOlUhZd^aa_d]f[hZjYkYkYk[l]m^n_n`o`o`o`o`o`o`oe#d+s0 ~6?H$O-W6^>|fFvpNq{UmZi_ecbf`i^k]l\m\n]n^o_qaqbrcrcrcrcrcrcrcrf#g)w. 5>G"N+U3\_JeUl^sfzlrw|{wtrƒrڃsށt߀uuuuuuuo#+,,16ɻCM.V<]IdTj]qexkqvyzu~qnlkՂmށo߀pppppppq!)'&*5ĿAL-T;[GbRi[ocvj~|oxtsyo|khfeрfh~j~j~j~j~j~j~j~u % "3 @J+S9ZEaPgYm`~tgxzmrrmvhyd|a~_~_~_}b}c|c|c|c|c|c|c|x0 >H(Q6XB_MeVk]xrdryilngrbu_x\zZzYzXz[z]y]y]y]y]y]y]y} . ;F%O3V?]IcRxjYqp_kwdfiam]pYrVtTtStStTuVuVuVuVuVuVuVuٸ +9D"M/T;[DxbMqiSkoYev^`~b\‡fXhUkRlPmOmOlOnPoPoPoPoPoPoPoگͻ +9CK*S5yZ?qaFjhLeoR`vV[~ZWχ]Sϑ_PϜaNϩcLϸcKcLbJeKfKfKfKfKfKfKf ަδ¿ - 9B J*wP3oX;i_AcfF^nJZuNV}QR߆SOߐVMߛWKXIYHYHYGYF[F[F[F[F[F[F[ѭ¸ .:C!vJ*nP1fV7`\<[d@WkCSrFPzIMKJMHNEPCQBQARAR@Q@Q@Q@Q@Q@Q@QԥIJ$1~;tB lH'eO-^U1Y[5Ub8Qh;Mo=Jv?G~ADCBE@F>G4>3?3?3?3?3?3?3? v$n- f5_<XCSINO!JU$F[&C`'@f)>k*;r+9y-6.4/1001.2-3,3,3,3,3,3,3,3}rha'Z/ T7N>IDEJAO>U;Y9_6d4i2p /w!-"+#($'%&&%&%&%&%&%&%&%&xo d\T N'H/C6 ?< sHrQ&oZ.jc6enxqFs{MnSjXg]e`ccae`g_h_i`iajbjcjdieieieieieiei^#i"v#, 6>EL"S*Z2߅e;~mExvMtTpZl^ibgeehdjckclcldmflglhkhkhkhkhkhkhk_#k y"+4 <CJP&X.׊a:΄jE~sMy{Uu[q`ndlgjjhlgngogohoiojnkmkmkmkmkmkmkm_#n{!*2 :AGM!ږU-Ϗ^9ȉgDoM~wUy[v`sephnllnkpkqkrlqmpmpnonnnnnnnnnnnna!p~ )1 8 >DߠJӚR+ʓ\8dCmMtT~|[zawetirmpporosospsprqqqpqpqpqpqpqpqpc r'/6 ;@ڤFΞQ*ŗZ7bBjLrTy[`|eyjwmupssstsutttsuruqupupupupupupet&-4 7 =ԧDɡO)X6`BhKoSvZ~`e}j{nyqxswuwvxuxtxsxqxqxqxqxqxqxqgw$+03ܮ7 ϪCťN(W5_AfJmStZ{`ejn~q}t|u}|v|}v|}t}|s}|r}|q}|q}|q}|q}|q}|qiy#),/ײ4 ˭AL'U4]@dIkRrYy_dimq|tyvwvvvvtwsxrxqxqxqxqxqxqk{!&'ߴ)ҵ2 ǰ@K&S3[>cHiQpXw^~di~mzqvssuqvovptqsrrsqsqsqsqsqsqm~" ں!͸1 ´>I$R1Z=aGhOnWu]|c}hxltpprmtjuiuitksmqmqmqmqmqmqmqpӽȻ/<G#P0X;_EfNlUs[}zawfrjnnjqfsdscscreqgpgpgpgpgpgpgpsپ -:F!O-V9^CdLjS|qYvx_qclhhkdn`p^q]q]p^p`oaoaoaoaoaoaow׵ *8DM+U6\@bI|iPvoVpv[k}`fdbg^j[lXmWmWlWlZlZlZlZlZlZlZl| ح ͸ '6AK(S3Z<}aEvgKpmQjtVe|[`_\bXeUfSgRgRgQhShThThThThThTh ۥαŻ#3 ?H$ICC_PROFILE Q.}X8v_?ofFilKdsP_{T[XW[T]Q_O`M`M_LaMbMbMbMbMbMbMb Ъŵ / <F~O)vV2o^9hd?ckD^sIZzLVʃORʍROʘTMʥVKʳWJWIVIXGYHZHZHZHZHZHZԢǯ !0 ;}DuM$nU+g\2bd7]k;Yr?UzCRڃENڍHLژJIڥKH۳LGLFLFLDOCOCOCOCOCOCOۚʩ %3 {<sDkK"dR(^Y-Y`2Uh5Ro8Ow;L=I?GADBBCAD@D@D@D@C@C@C@C@C@Cͣ (x2 p;iCbJ\P#VW'R^+Oe-Ll0Is2F{4C6A7>9=:;;:<9<8<8<8<8<8<8<8<|t&l0 e8^@XGSMOT KZ"Ha%Eg&Bm(@u*=}+:-8.6/40312212121212121212yog"`,Z4 T<OCJIGOCU@[>a;f9m6t 4}!1#/$-%,&+&*')')')')')')'~ukb[T&N.I5E< AC >H;N8S5X3^1d.j,r*z'%$#"!!!!!!~pg^ VOI C'?.:47:3?0D.I ,N )S 'X %^ #d !l t }L*H3O4T7ZA\JZTW`$Tk*Px/M3J6G9F;EC?B?B@AAAAABABABBADAFBGBGBGBGBGBGBM)J2Q2W6\?^I]SZ^$Wi*Su/P4M7J:HFNW&~a1xj:ssBo|HlMiQfUdXcZa\`^`_`_a_a_c_d_d^d^d^d^d^d^[ ht~#+4 ;CJڊT%Ѓ]0~g:xoBtxHqNnRkViZg\e_dadbdbdbebfag`h`h`h`h`h`h`]jw!)18 ?ݔGҎQ$ʈ[/ƒd9~lAytHu|NrSoWm[k^j`hchdhehdidjckbkakakakakaka_mz'.5; ֘C̓O"čX.a8iA~qHzyNwStXq[o_nbmdlflflfmendncnbnbnbnbnbnbao|$+1ݠ6 ќAǗM!V-_7g@nH~vN{}SxXv\t_rbqepgphpgqfrerdrcrcrcrcrcrccq!',ؤ2̟@ÚK U,]7e?lGsM{S}Wz\x`vcuftgththugvfueududududududet#ߦ&ҧ0ȣ>IS+[6c?jFqMxRW\}`{czf~yh{yizyiyzhzzfzyezydzydzydzydzydzydgv۫Ϊ/Ħ=HQ*Y4a>hEoLvR}W[_~czfw~hu}is~is~ht~ft}eu|du|du|du|du|du|dixծʭ-;FP)X3_bpC^wGZKVNSPPRMTLTKTKTJUJVJVJVJVJVJV֘ɥ(6 AyJrR&lZ-fa2ah7\oqHjPdX%__*[g/Wn3Sv6P9Lӈ;JӔ>GӠ?EԮ@DԿAC@D@BBADADADADADADјå }&u2n<gEaM\U W]$Td'Pk*Ms-J|0H2E4C5A6@7?7?7?6=8=8=8=8=8=8ơyq'j2d; ^CXKSRPYL` Ig#Go%Dw'A)?*=,;-9.8/7/7/6/6/6/6/6/6/{tmf&_/Z8 T@PGLNHUE[Bb@h=p:x8 6"4#2$1%0&/&.&.&.&.&.&.&yphaZ#T+O3J;FB CI @O=U:[8a5h3o0x.,*)('&&&&&&xlc\UOI&D.@4<;9A6F3L1Q .W ,] *d (l %u #! yk^VO IC> 9'5-23.8+=(B&G$L"Q W^enx        B-B2H2L6N<PGPRN_KkHw$E'B*A,?.?/>0=1=2<2<3;3;4;4;4<3<3=4?5?5?5?5?5?5C,D0J0N4Q:SFRQQ]Ni Kt$H(E+C-B/A0@1?2?3>4>4>5=5=5>5>5?4?6A7A7A7A7A7A7D,G.M.Q2T9WDVOTZQf Nr%K})H,F.E0D2C3B4B5A6A6@7@7@7@7A6A7A8C9D9D9D9D9D9E+I,P,U/Y7\B[MXWVc Ro%Oz*L-J0H2G4F5E6E7D8D8D9C9D9D9D9D:E;FH?J@J@J@J@J@J@G*P'X&^*c3f= fGdQ`[ \g&Yr+V}/S3Q5P7N9M;LK>L=K?KAJBLCMCNCNCNCNCNCJ(T$\#c(h0l; lDjNfXab%^m+[x0X4V7T9S;Q=Q>P?O@O@OAOAOCNENFPFQGQGQGQGQGQGM%W!` h&n.r8 rApKmTh^$di*at0^~4[8Y;W>U@TBSCRDRERFRFRHRIRJTJUJUJUJUJUJUJP#[dm$s+w5x>wGtPoZ"ke)go/cy5`:]>[AYCXEWGVIVJUKUKVLVMVMXMYMYMYMYMYMYMS ^hq"x(|1~: }CzLvWra(mk/it6e};b@`C^F]H[KZLYNYOYOZPZPZP[P\P]O]O]O]O]OValu |%.7 ?H}Sw]'rg0np7jxHQ%X._5f<}mAxtFs{KoOkRgUdXaY_Z_Y_Y_XaWaWaWaWaWaWo  ߍҘʢ© /<FO#V,]3}d9wk?rqDnyHiLePaS^U[WZXYWYWYV[U[U[U[U[U[Us ̜ؑå ,9DM T)}\0wb6qi|HuP!oX'j_-ee2`l6\t:X|>UAQDNFLHJHIHIHHIHJHJHJHJHJHJΔ¡ /{; tEnNhV!c]'^d+Zk/Vr3S{6O9LG?F@E@E?DACBCCCCCCCCCC֍ƛ y*r7lBfKaS\[Xb#Ti'Qq*Mz-J΃0HΎ2EΚ4CΨ5Bθ6A5A5@7?9>9>9>9>9>9ʖx sn&h3b> ]HYPUXQ`NgKo Hx#Fށ%Cތ'Aޘ)?ަ*>ߵ*=*=*<+;-:.:.:.:.:.vnic'^2X;TD OLLSI[FbDjAr?{<: 8!7"6#5#4#4#4#4#4#4#4#uid^Y&T0O8K@GG DN AU?\A;G8N5T 3Z 1a /i ,r *} (&%$#""""""sgYSMHC?&:-73390?.D+J)P'V$]"e ny         tgXMGB <840%,+)0%5#: ?DIOV^hr~      9/<0A1D4D:DEEQ C]Ai>v<:9 8!7#7#6$6%6%5&5&5&5&5&6&6&6&6'6(6(6(6(6(9/>/D/F2H8HCHO G[DgBs?=$=%=&<'<(;);););*;*;)<)<*;+;,;-;-;-;-;-<-D)J)N,Q4R>RJ PUMaJmHxE"C$B&A'@(@)?*?+?+?+?,?,?+?,?->/>0?0?0?0?0?0@*H&N&R)V2W<WG UQR]PiMt J#H&G(F)E*D+D,C-C-C.C.C.D-C0B1B2B3C4C4C4C4C4C'K#R"X'\/]9^C [NXXUdRo Pz$M'L)J+I-I.H/G/G0G0G0H0G2G4F5F6F7H7H7H7H7H7F$O V]$a,c5d@ bJ^T[_Xk Uu%S(Q+O-N/M0L1L2K3K4J5K5K6J8J:J:K;L;L;L;L;L;J!S[b"g)i2j< hFePa[^f [q%X{)V,T/R2Q4P5O7N8N9N:N:O;N=N=N>O>P>P>P>P>P>MV_g l&o.p8oB lKiWebal%]v*[~/Y2W5V7T9S;SR?R?R?RARASASATATATATATAPZdlq#u*v3v= sGoSk^fg&cq+`y0^4\7Z:YW@VBVCUCVDVDWDWDXDXDXDXDXDXDS]hpv z&|.|8zD uOpZlc&hl,fu1c}5a9_<]?\A[CZEZFYGZGZG[G[G\F\F\F\F\F\FU`ktz")ނ3@ zLvVq`%nh,kq2hy6f:d=b@`C_E^G^I]J]J^J_I_I`H`G`G`G`G`GXcnw~#և.̃= I{Sv]%se,om2mu7j|;h>fAeDcGbIbKaLaLbLcKcJdIdIdIdIdIdIZfqz݋Ћ,Lj; GQ{Z$wb+tj1qr6oy;m?kBiEhHfJfLeMeNfNgLgKhKhJhJhJhJhJ\ht}֏ˎ*Œ8 DOX#|`+xh1uo6sv;q}?oBmElHkKjMiNiOjOkNkLkKkKkKkKkKkK^kv ۏ Вǒ'6BMV"^*}e0zl5ws:u{>sBrFpIoLnN}nO{mPznPyoNyoMyoLyoKyoKyoKyoKyoK`m y ۋ ԑ ̕•%4AKT!\)c/~j5|q9zx=xBvEuI|sLyrNvrPurPsrPtsOtsMtsLtsLtsLtsLtsLtsLbo { ކՎϔ ǘ#2?IR Z(a.h4o9v=}~A}{EzyIvxLswNqwPovPnwPnwOnwNnwMowLowLowLowLowLd r ~ڈАʗ›!0=GPX'_-f3m8t={{AxEtHq}Km|Nk|Oi{Ph|Ph|Oi|Ni|Mj{Lj{Lj{Lj{Lj{Lf uԋ˓Ě.; ENV%],d2k7zrmBiFeIbK_M^N\N]M]L]K^K^K^K^K^Km|Ոʒ )6 AJR!~Z(y`.tg3on8kuQ@OBMCLCLCKCKDKDKDKDKDKD}ϋ–-}9 wCqLkSfZ"ba&^h+Zo.Vw2S5O8L:JE?E?E?E?E?ڃǑ {(u5o@ iIdQ_X[_ Wf$Tn'Qv*M-J0H2E4C4B5C4B5A7@7@7@7@7@7΋{tp"k0f<aE \NXVT]QdNlKt"H~$EȈ'Cȕ(AȢ*?ȱ+>+>*>+=-<.<.<.<.<.ē{pg d`*\6XATJ PR MZJbGiErB|@؇=ؓ<ء:ٰ 9 9 9 8"7#7#7#7#7#{pe]ZV'R2N<JDGMEU B\ @d>l;v9754221111111{ocXTQM&I/E8A?>G94 0,)&""',16<AHOW a l y 116.:/;2;9;C9O8\ 6h 4t2100//.........//......3/9,=->0?6?A=M<<;::9999999:9!9#9$9$9%9%9%9%<'C#H"L&O/P9NCLO J[HfEqC|BA@?? > >!>!>!>!>!?!>#=%='=(=(=(=(=(=(?#G LQ$U,V5U?SJ PVNbKmIwGFE D!C"C#C#B$B$C$C$C%B(B*B+A+A,A,A,A,A,C JPW![(\2[;YF VQT]QhOrM|K J!I#H$G&G'F(F(F)F*G*F,F.F/F/F/F/F/F/F/FNV\`%b-b7`A]L ZXXcUnRwP"O$M'L(L*K+J,J-J.J/K/J1J2J2K3K3K3K3K3K3JRZaf!h)h2g<dH aT^^[iXr V{$T'R*Q,P.O/O1N2N3N4N4N5O6O6O6O6O6O6O6O6MU_fkm$n,m6kCgOdZ`d]m"[v&Y~)W,V/U1T3S4R6R7R8R8R9S9S9S9T8T8T8T8T8OYcjort&t1q?mKiVf`ci"`q'^y+\.[1Y3X5W7W9V:V;VZ?Z?[>[>\=\<\<\<\<\`>`=`=`=`=Wb l t z ~ ҁȁ'6|B xMuVr_"of'ln,ju0h|3g6e9db@bBbBbCcBcAd@d?d?d?d?d?Yd n w}Ԃ ̄Å$4@ |KyTv\!sd&qk+or/my3k6j9h I}RzZ wa&uh+so/qw3o~6n:m=k?|kByjCxjDvjEvkCvkBvkAvl@vl@vl@vl@vl@] it|ЃɈÊ /< GP~X|_%yf*wm.ut2t|6r9|q=yp@voBtnDrnEpnEpoDpoCqoAqo@qp@qp@qp@qp@_kvˆŋ -: ENV]$~d)|k-zr2}xy5zw9wvf~Ac~Ca}D`}D_}C`}B`}Aa}@a}@a}@a}@a}@gtLj&3? HPX z_%ve*rl.ns2j{6f9c<`?]A[BZCZBZA[@[@[?[?[?[?jx̓Œ#1< FNzVu]#pc(lj,hq0ey4a7^:Z=X?V@T@T@T?U?U>U>U>U>U>o|ȇ .9 CyLtSoZ ja%fh)co-_w0[4X7U9R;P=O=O,=-=-=-=-=-ljsj gc(_5[?WH TP PXM_JfHnExBÂ@Î>Ü<ë ;ü!:!;!9"8$8$8$8$8$uj^YW!U.Q9NCKLISF[ Cc Ak>u<р:ь8њ6ѩ5ѻ45433333uj^TL JH&F2D<BE?M=U;]9f7o 5z 3 1 0..--,,,,,vj^SIEB@$=.:68>6F3M1U/]-e+p){(&%$#""""""wj]QF?<96 3(10.6+=)D'J%R#Z cn{xj]PD:52 .+(!&'#- 39?EMU_jx       yk^PC8/+'$!#(-28? F OYer,/0,2,30160A/M-Z+f)s(~ ' ' ' & &&&&&&&&&&''&&&&&&.,3)5*6-645?3K2W0d.p ,{ , + +****)))))**+***))))1)6&9&:);2;=9H7T5`3l 2w 0 0//.........//.......4&9#=#>&A/A9?E=P;\9h 7s 6~5443333333334332322228#= AE#G,G6F@DLAX?d >o>=========< qInRl[ibgj"fq%dx(c+a.`0_3_5^6^8^8_7~_6~`5~`4~`4~`4~`4~`4U`ipuxz{z/x<uF sPpXn`kg!jn%hu(g|+f.d1c4c6|b7zb9yb9xc8xc7xd6xd5xd5xd5xd5xd5Wblsx{} ~~,|9yD wNtVr]pd nk$lr(kz+j.~i1{h4xg6vf8tf9sf:rf9rg8rg7rh6rh5rh5rh5rh5Yenv{ *7}B {KxTv[tb ri$qp'~ow+{n.xm1vl4sk6pj8nj:mj:lj:mk8mk7mk6mk6mk6mk6mk6[gqy~ (5@ I}R{Yy`wg#|un'ytu*vs}.sr1pq4mp6ko8io:ho:go:go8ho7ho6ho6ho6ho6ho6^jt|%3> GPW~^{|e"xzl&tys*qx{-nw0kv3hu6ft8ds9bs:bs:bs8cs7cs6cs6cs6cs6cs6amw#0<ENU{\wc!sj%oq)l}y,i|/f{2cz5`y7^y8]y9\y9]y8]x7^x6^x5^x5^x5^x5dpz .9C LzSuZqa nh#jo'gw+c.`1]3[6Y7W8W7W7X~6X~5X~5X~5X~5X~5ht~+7A yItQpXl_hf!em%at(^},[/X1U3S5R5Q5Q5R4R4R3R3R3R3ly '~4y>sG oOjVf]cc_j"\r%Y{(U+R.P0N1L2L2L2L2L1L1L1L1L1q~|#w0r;mD hLdT`Z]aYhVp!Sy$P'M)J,H-G-F-F-F.F.F.F.F.F.w}wso,j7eAaI ]QZXW_SfPnMvJ!H$E&C'B(A'A'@(@)@)@)@)@)~ul ie'a3^=ZFVN SU P\McJkGtE~B@> < < < ;!:":#:#:#:#yma]Z X-T8QBNJLRIY F` DhAq?|<:8767554444{ocXP ML%J1G;EDCLAT>\=<&;19;8E6M5V3^1h0s.,ۍ*ܝ)ܭ(('&& & & & ~qeYMC:5 31 0*.3-<+D*L(T']%g#s" reYLA8/- +(&$$+"2!9AIQZersfYK@5,&$ !"(.5<CL V b ougZK?3)!  # (.5=FQ]k{',**+**.&4%?#K!X dp{     )*,'.'-*,2+=)I'U%a#m"x"!!!!!!!!!!!!!"" " ! ! ! ! ! ,&0$1#1&2/1:/F-R+^)i(u''&&&& & & & & & & & ' ' & & & &&&&/#3 57#8,876B4N2Z0e.p-{-, , , + + + + + + , , , , ,,,,,,,37:= ?(?2=>;I9U7a5l4v3 2 2 2 1 1 1 1 1 1 2 2 2111111117;?CF$F.D9BD?P=\FJDVCbAl @u ?~ >==<<<;;;<<<<<<<<<<>DJOQR#Q-O8MEKQI\Gf FpExDCBBAA@@@@AAAAAAAAABG OSVWV%U1S?RLPW Na LjJrIzHGGFFEEEEE F!F!F"F!F!F!F!F!EK S W Z[ZZ+Z;XHVS T\ RePmOuN|MLKJJ!I"I#I$J$J$J%K$K$K$K$K$K$H OV[ ^ ^ _`'_6^C[N YXWaUiTpSxRQP O"N#N%N&N'N'N'O'O'P&P&P&P&P&J SZ_bc ce#e2c@aK ^T\][eYlXsVzU T"T$S&R'R)R*R*S*S)T)T(T(T(T(T(LV]cghhj i/h<eG cQ aZ_a^i\p[wZ~!Y#X%W'W)V+V,V,W,W+X*X*X)X)X)X)OY`gjllmn,l9jDhN fWd^be`l_s^{!]$\&[([*Z,}Z-|Z.zZ.z[-z\,y\+z\*z\*z\*z\*Q[djnpp qq)p7nBlK jTh\fceicpbx!a$`&}_){_+x^-v^.u^/t^/t_.t_,t`+t`+t`+t`+t`+S^gmqss uu't4r?pI nRlYj`ighnfu!}e}$zd&wd)uc+rb-pb/ob/nb/nc.nc-nc,nc+nc+nc+nc+U`iptwwxy$x2v=tG rOpWo^md}lkzks wjz#ti&rh)og,mg.kf/if0if0ig/ig-ig,jg+jg+jg+jg+Xclsxzz{|"|/z;xE wMuUs\{rbxpiuop rnx#om&ml)jl+hk.fk/dj0ck0ck/dk-dk-ek,ek,ek,ek,[fov{~~-9}C {K ~zSzxZvwasugptnmsv"jr&hq(ep+bp-`o/_o/^o/^o/_o-_o,`o,`o,`o,`o,^iry+6@~I yQu}Xr|_n{ekzlhyt"ex}%bw'`v*]u,[u.Zt/Yu/Yt.Yt-Zt,Zt+Zt+Zt+Zt+amv} (4~>yG tOpVm]icfjcr `~z#]}&Z|)X{+V{,T{-S{-Tz-Tz,Ty+Uy*Uy*Uy*Uy*eqz $}1x;sD oL kTgZdaah^p[x!X$U&R)P*O+N+N+N*O*O)O)O)O)ju{!w-r8mBiJ eQbX^_[fXmUvR!O#M%K'I(H(H'I(I'I'I'I'I'o{~wso)k5f?bG_O \VX\UcSkPsM}JG!E#D#C#C#C$C$C$C$C$C$utn jf%c1_;[DXKUS RZ OaMhJqG{DB@>====<< < < |{oc_\Z+W6T@QHNOKW I^ Ff DnAx?<:988776666sgZS QO$M0J:HCFKDRAZ?b=k :u 8 64321100000ui^SGCB@'?2><5-% $#"%!. 7@JS^jx{naTH=3*" &-5=FP[i x }obUG;1'  # ) 08ALXfwqcVH:/% #*2<GTcs")#'#( +1=IVbnx$'&$&$$'"/ :FS_ju'#) ) (#)-'7%C#O![fq{+--. /)/4,?*K(W&b%m$w############$$$$$ $ $ $ $ .1256%6/4:1F/R-],h+r*{***)))))***** + * * * * * * 258;= <*;59A6M4X3c2m2v11000//// 0 0 1 1 111111169>ACB#A.>:=Ft ={ = < <<;;;;;;<<<<<<<<= BH K LLJJ,K;JHHSG]Ff Dn Cv C}BAA@@@@@@AAAAABBB@ FLOP O OQ'Q6PCONMXLa Ji IpHxGGFFEEEEEEFFFFGGGBJPTVU UV"W2V?TJSTQ] PdNlMsLzLKJJIIIIJJKKKKKKEMTY[[Z[\.[;ZFXPVY U`ShRoQvP}PONNNN N!N!O O OPPPPGQX]``^ `a*`7^C]M[U Y]XdWkVrUyTSSRR!R"R#}R#|S"|S!{T!{T {T {T {T JT\addc de'd4c@aJ_R ^Z]a[hZoYvX}XW}V {V"yV#wV$vV$uW$uW#uX"uX!uX!uX!uX!MW_dghghi$h2g=eGdO bW a^_e^l]s}]z{\y[v[!tZ#rZ$qZ%pZ%o[%o[#o["o["o[!o[!o[!OZbgkljkl!l/k:iDhM fU e\db}bizbpxaxu`s_p_!n^#l^%k^&j^&i^%j_$j_#j_"j_"j_"j_"R]eknonopp,o8mBlK jR ~iY{h`wffufnreupd~mckc"ib$gb%eb&db&db&eb$ec#ec"ec"ec"ec"U`hnqsqrst*s6r@pH}oP ymWvl^skdpjlmiski|hhfg!dg#bf%`f&_f&_f&`f$`f#`f#af"af"af"Xckquwuv wx'w3v=|uFxsN urUqq\npckojinqfnzcmal!_k#]k%[k&Zk&Zk%[k$[j#\j"\j"\j"\j"[fnty{yz {|$|1|{;wzDsyL pxS lwZivaguhdtoasx^r\q Zq"Xp$Vp%Up%Up%Up$Vo#Vo"Wo"Wo"Wo"_irx}~!{.w9rBnJk~Q h}Xd|_b{f_zm\yuYxWxTw!Rv"Qv#Pv$Pv#Pu#Qu"Qt!Qt!Qt!Qt!cmv}}yu+q6m?iGeO bV _\\cZkWsT}QO~M~ K}!J}"J}!K|!K{ K{ K{ K{ K{ gr{|vrn'j2f<cD`L\S ZZ WaThQqOzLJHFEEEEEEEEmxtn if"c.`8\AYIVPTW Q^ NfLnIxFDB@????????s~{le`][)X4U=REPMMTK[ Hc Fk CuA><:99998888zuh[V SQ#O/L8JAHIFPCXA_?h=r :} 8 6433322222ymaUKGED'B2A;?C=K;S9[7d5n3y1/.- ,, + + * * * }qdYMB; 875)423;2D1L/U.^,h*t)'&$###""""sg[OD:0* ('&'%0$9#B"K!U _lz͊͜ήuh\PD90(  "+4=HS_m~ߑ wj]PD8.%   ! ) 1 ;EQ^nyk^QC7-#  %.7BN]n{m`RD7+!  !)3>K[l&$%'.:G S _ k u           #!!$,7DP\gr{""! )4@LXcnw%&$%&%$0!;HT_is|)*),,!,+)7'C%O#Z"d!n!w!!!    !!!!""#######,.0332%00.<,I*U*_)i)r(z(((((((((()****** * * 02 6 8975(352B2O1Z1d0m0u0|/////////00 0 0 0 0 0 0 0 3 6< > =<99-:<:I9T9^8g7o7v6}6655 5 5 5 5 5 6 6 6777777;@BB ?>@'A6ADAO@Y?a>i=q=x< < ; ; ; ; :;;;<<<<<<<:@EHHF EG"H1H?GJFTE]DdClBs Bz A A @@@@@@@AAABBBB<DJNOMKMN-N:MFLOKXJ`Ig Hn Gu F|FEEEEEEEFFFGGGG?HOSUSQ RS)S6RBQKPTO\Nc Mj LqKxKJJIIIIJJ~K~K}K}K}K}KCLSXYXV WX%X2W>VHUQTXR_ Rf QmPtO{ONN}N{MzNxNwNwOvOvOvOvOvOFPW\^]Z[\"\/[;ZEYMXUW\ Vc UjTq~Tx|SzRxRvRtRrRqRpRpSpSpSpSpSpSISZ_ba^_``,`8^B]K\R[Y Z` }Yg{XnxXuvW}tWrVoVnVlVkVjVjWjWjWkWkWkWLV^beebbcd)c5b?aH`P}_W z^] w]d u\ks\rp[{n[lZjZhZfZeZeZeZeZeZeZeZeZOYafhief gh'g2f=eF{dMxcT ub[ raa paim`pk_yi_g^e^c^a^`^`^`^`^`^a^a^a^R\dillij jk$k0~j:ziCvhKsgRpgY mf` kefhdnfdvdcbc`b^b\b[b[b[b[b\b\b\b\bU_glpolmno!}o-yo8unArmInlPkkW ik^ fjedilait_h~]g[gYfWfVfVfVfWfWfWfWfWfYbjpsspqr|sxs*ts5ps?mrGjqNgqU dp\ boc_oj]nrZm|XmVlTlRkQkQkQkRkRjRjRjRj\fntwvuvzwvxry'oy2kx<hxDewLbwS_vZ ]ua ZuhXtpUsySsQrOrMqLqKqLqLpMpMoMoMo`jrx{zzz{t| o~l~$i/f9bB_~I]}PZ}W W|^ U|e R{nPzwNzKyIyHxFxFxFwGvGvGuGuGueow}~sl he b,_6\?YFWNTUR\ Oc Mk KtHFDBA@AA~A}A}A}A}ju}yjd`]['X2U;SCPJNRLYI`Gh Er B}@><;:;;;;;;q{se\W TR"P-M6K?IGGNEUC]Ae>o <:9)827;5C4K2S1\/f-q+*('&&%%%%%xk_SH=4/-, +)*2):(C'L&U$_#k"x {nbVJ?5,$ &/8AJUaoƑǤǹ~qdXK@5+#   ! * 4 > I U brԄԘԫsfYL?4*!    (1<GTctuhZM@3(  %.9ESdvwj\O@3'  *5CRcv#!! $ +7DQ]hr{ ) 4 AMYdnw%0=I U ` j s |   ",8DP[fow""!"" '2>KV`jrz&% ( )(& $+!8 DP[emu}   !"""#####) *./ -+("&/&='J'U(_(h(o'w'~''''''((())******-0342 .,.(/70D0O0Y0b0j/q/x///...///00011111058:95 46"818?8J8T7]7d6l6s6y55555555 5 6 6 7 7 7 7 7 3:?BB>;>?,?:?E?O>X=_=g^qF\pMYpTWp[UobSoj Pns Nn~LmJmIlHlGlGlHkHkHjHjHj^gnrrqzqqrktfucv`w(^w3[x<YwCVwKTwRRvYPv`NuhKuq It| GtEsCsBsAsBrBrBqCpCpCpclsvuvuvixcz^|\}Y~$W/U8S@PHN~OL~VJ~]H}eF}nC|y A| ?{ >{<{<{v;9 8 6 6 6 6 6 6 6 6 ox~wk^UNJHG%E/D8B@@G?O=V;_9h7s5310////// / v}peZOFA >=;(:19:7B6J5R3Z1d/o-{,*)(''''''~vj^TI@7210!.*-2,:+C*K)T(^&i%v#" }ocWMC80($#!! )1:BLVao~uh[PE;1' &.7ALW e t zl`SG<1' $,6@LYhy̌˟˳|obUH;0&  "*4?KZj}ݑݤ޶qdVI</$  '1=KZltfXK=/$  #.;J[m  (5ANZenw %1>JVaks{  "-9FQ\fow~( 4 ALWajrz   ".:F R \ e m u |   &3?KV_how}""%$! *8EPZbjqx~   !!""#####%(*+(! !$$%2&?'J'T']'d'l'r'y'''''(((()******(.353-*-.,/:/E0O/X/_/f/m/s.z.....///0011111-5:=<73 46'747@7J7S6Z6a6h5o5u5|555555566777772;ADC?; ;<"=0=;=E=Nk >k `inmmxmlnap[rVt RuPvNw'Lw1Kx9IxAHxIFxPDwWBw_@wh>ws<83245*555@5I5P5W5^5d4k4r4y4~4}4{5y5x5w6v6t7t7t7t7t75=BDB>98::&;1;;;D;L;S:Z~:`}:g{:ny:uw:~v:t:r:q:o;n;m;m<l<l<l<l<9BGHFC?> ??!@-@7@@}@H{@Oy@Vw?]u?cs?jq?rp?zn?l?k?i?h?g@f@f@e@e@e@e@>FKLJGCCCD~D){E4yE=vEEtDLrDSpDYnD`lCgkCoiCwgCfCdCbCaD`D`D_E_E`E`D`DAINOMKGGG|HxH&uI0sI:pIBnIIlHPjHVhH]fHdeHlcHuaG`G^H]H[H[H ZHZIZIZHZHZHELRQPNJJzKvLrL#oL-mM6jL?hLFfLMdLSbLZaLa_Li^Lr\L|ZLYLWLVLUL UL ULULULVLVLHPUTSQMzNuO pOmP jP*gP3eP<cPCaPJ_PQ]PX\P_ZPgYPpWPzUPTPRPQP PP PP PPQPQOQOQOKSWVUT|PuQpR kShTeT'bT1`T9^TA\THZTOYTVWT]VTeTTnRTxQTOTNTLTLT KT LTLSLSMSMSNVZYXWwTpUjVfWbW`X$]X.[Y7YY?WYFVYMTYTSY[QYcOXlNXvLXJXIXHXGXGXGXGWHWHWHWQY\[[}ZrXkYeZ`[]\Z\!X]+V]4T^<S^DQ^KP^RN^YL^aK]jI]tG]E]D]C]B]B]B\B\C[C[C[U]_^^x]m\e]__Z` WaUbRb(Qc1Oc9NcALcHKcOIcVGc^EcgDcqBc}@b?b>b=b`>`>`Yaaaataia_bYdTf QgNgLh$Ki-Ii6Hi>FjEEjLCjTBj\@ie>io=:731 12 3+353>}3F{3My3Tw3Zv3at3gr4oq4wo4n4l4j5i5h5g6f6f6f6f6f67>BA?<8677|8'z81w9:u9Bs9Iq9Pp9Wn9]l9dk9ki9th9~f9d9c:b:a:`;_;_;_;_;_;;BEDC@=;};y<u=#s=-p=6n=?l=Fk=Mi=Sg=Zf=ad=hc=qa>{_>^>\>[?Z?Z?Y?Y?Y?Y?Y??FHGFD@|?w@ s@oA lA*jA3hA;fBCdBJcAPaAW`B^^Be]Bn[BxZBXBWBVCUCTCTCTCTCTCTCBIKJIG}CvCqD mDjEgE'dE0bE8`E?_EG]EM[ETZF[YFcWFlVFvTFSFRGPGPGOGOGOGOGOGPGEMMLKJxFqGlGhHdHaI$_I-]I5[I=YIDWIJVIQUJYTJaRJiQJtOJNJMJLKKKJKJKKKKJKJKJHPOON{MsIlJgKbL_L\M!ZM*XM2VM:TMASNHRNOPNWON_NNgLNrKN}INHNGOFOFOFOFNFNGNGNLRQQQwPnLgNbO]P ZPWQUQ'SQ0QR8PR?NRFMRMLSUJS]ISeHSoFS{ESCSBSASASASARBRBRBQOTTT}SsSiQbR\SXT TURUOV$NV-LW5KW<JWDHWKGXRFXZDXcCXmAXy@X>X=Xc>=cEg4*!  "+5@N]nvgZNB7,"   )4BQbuɊɟʱn`SF:/$  (4CTg|fYL?2$ '5FXk,9EPZckrx~ (4ALV_fmtz "/;GQZbiouz )6AKT\cjpu{ "/;ENW^djpu{'3>HQX_ejpv|   ,7BJRY_ekqw~   $0;DLSZ`flry!%"*5>GNU[agmt|~}|zyxxx"),*'#$/9AIPV\bi} p| xz y!w!u"t"s#r#p$o$o$n$n$)020.*'# #$%*%4&=}&D|&Kz&Rx&Xw&^u&et'lr'tq'}o(n(l(k)j)i*g*g+f+f*f*/66540-*)*|+%y+/w,8u,@s,Gq,Mp,Tn,Zm,ak-hj-ph-zg.e.d.b/a/a0`0_0_0_0_04;::8520{/w0t0!q1+o14m1<k1Cj1Jh2Pg2We2]d2eb2ma3w_3^3]4[4Z5Z5Y5Y5X5X5Y58>>=<:}7x4t4 p5m5j5'h60f68d6?c6Fa6M`6S^7Z]7b\7jZ8tY8W8V9U9T9S:S:S:S:S9S9<A@@?~=x:s8n9j9g9d:$b:,`:4^:<];C[;JZ;PX;WW;_VN>N>M>N>N=N=?CCCBz@s=m<h=d=a>^>!\>)Z>1X>9W>@U?FT?MS?UR@\P@eO@oNAzMAKAJAIBIBIBIBIAIAIACEEEEvCo@h@cA_A \AYBWB&UB.SB6QB=OBCOCKNCRMDZLDcJDmIExHEGEEEEFDFDFDEDEEEEEFHHH{GrFjBcC^DZE VETFQF#OF+NF3LG:KGAJGIIHPHHXGHaFIkDIvCIBIAI@I?J?J?I@I@H@HIJJJwJnIeE^GYHUIQJOJLJ!JK)IK1GK8FL?ELFDLNCMVBM_AMh@Mt>M=MQS=R\U+=V24\F3]N1]W0]a/]l.]z,]+]*]*])]*\*[+[+ZUUUrUgV^VTWLYE[?]:_6` 4a2b1b#0b+/c2.c:-cB,cJ*dS)d](di'dv&d%d$d#d"d#c#b$a$aXXzYnYcYZZP\H^A`:c4f/h ,i*i)j(j&'j.&k5%k=$kF#kO"lY lelrlllkkjihh\\u\i]_]V^LaCdk7n0q)u"x{}}}~"~*~1~:~DNZh x  ~ ~ } } | { zewejeafVhLkBo9s1w*z#~    # + 3=HTaq~jqjgk[lPpFtQez)5AMV_fmty $1=HRZbiouz +7BLU]djpuz%1<GPW^ejpuz +6@JRY_ejouz$/:CLSY_djou{  (3=EMSY_djpv~   ,6? G N T Z _ e k r y  }|{{{ %/9AHOU[agnu}~|zxwutsqqqp%%#! )3<C~J|PzVy\wbvitqszqonlkjihhgg&***(%"|$z.w6v>tErKqQoXn^lek mi vh!f!e"c"b#a#`$`$_$_$_$,///-*(}$z" v#s# q$)o$2m$:k%Aj%Gh%Mf%Te%Zd&ab&ia&r_'}^']([)Z)Z*Y*X*X*X*X*13332/y-u*r( o(k)i)%g*-e*5c*=b*C`*J_+P^+W\+^[,fY,oX-zW-V.T.S/S/R/R/R/R/R/66665y3s1o/k.h-d.b.!`/*^/1\/9[/@Y/FX/MW0SV0[T1cS1lR2wQ2O3N3M3M4L4L4L4L4L39999|9t7n4i3e2a2 ^2\3Z3&X3.V35U4<S4CR4JQ4PP5XN5`M6jL6uK7J7I8H8G8G8G8G8G8G8;<<<x<p:j7d6`6\6 Y7V7T7#R7+P72O89M8@L8GK8NJ9UI9^H:hG:sF;E;D<C<B<B=B<B<B<B;=>>>u>l=f:`9[:W:S;Q;N; L;(K;/I<6G<=G\C>fB?qA?~@??@>@=@=@=@=@>?>?@@A|AqAh@a<[=V>R>N?L?I?G@%F@,D@3C@:BABAAI@AQ?BZ>Bc=CoE8=E?*VF)VO(WY'Wd&Wr%W$W#W"W"W"W#V#U$UMNuNiN_OVOMPER?S9V3X/Z+[*[(\'\$&\+%\3$]:#]C"]L!]V ^a^n^~^^^]]\[[Q~QpQdR[RRSJTAW;Y5[.^(`$b "c!cd d'd.d6e>eGeQe]ejezeeeedcbbTxUkU`VWVOWFY=\6_0b)d#gjllmm!m)m0m9nBnLnXnenu n n m m l k k jYrYfY\ZTZJ\A_9c1f*i$loru www w# w* w3 w< wGwRw_wowwvvuttt{]m]b^Y^N`EcM]pduWyK~?4)  &3ARdy\PD8,!  &5EWkӂӗөҸUI=0%  '8J]r &2=HRZbiouz !,8CMU]djpuz '2=GPX_ejpuz!-7AJRY_ejotz &1;DLSY_diotz  +5>FMTY_dinu{$.7@GNTY^diov~   '19AHNTY_dkrz~}{yxvuu t s s    * 3 ; B I~ O} T{ Zz `x gw nu vt r p omlkjiii~${-y6w=vDtJsPqVp\nbmjksi}hfecbba```"#$#" ~|z wtq(o0n8l?kEiKhQfXe^cfbo`y_]\[ZYXXXX'((('{%v#s q nki#g,e3c:bA`G_M^T\[[bY kX vV!U!T"S"R#Q#Q$Q$Q$Q#+,,-|,t*o(k%i"f!c"a"_#']#/\#6Z#=Y$CW$JV$PU$WS%_R%hQ&sO&N'M(L(K)K)J)J)K)K)./00w/o.j+e*c'_' \'Z'X($V(+U(2S(9R)@P)FO)MN)TM*\L*eJ+pI+|H,G-F-E.E.E.E.E.E-123|3r3k1e/`-],Y, V,T,R, P,(N-/M-6L-<J-CI-JH.QG.YF/cE0mC0zB1A1A2@2?2?2@2@2@2355y6n5f5a2\0W0T0Q0N0L1J1%H1,G12F19D1@C2GB2OA3W@3`?4k>5x=5<6;6;6:6:6;6;6;6678u8k8c7]6W3S4O4K4 I4F5E5"C5)A5/@56?6=>6D=7L<7U;8^:8i99v897:7:6:5:6:6:697989~:r;h;_:Y9S6N7J8F8 D9A9?9>9&<9-;:4::;9;B8;J7;S6<\52>1>1>1>1>2=2=;<{<n=d=\=U<N:I;E<A=>=<=:>9>#7>*6?15?84?@3@H2@P1@Z0Ae/Ar.B-B-B,B+B,B,B-A-A=>w?k?a@Y?R?I>D?@@K9L3N.P(S$T "U UVV$V,V3W;WDWNWYXfXuXXWWWVUUItJfK\KSKKLDM[6_.b&fjmps vx xyyyz&z/z9zDzPz_zpzzzyxxwj[_[V[L\B`9c0h(l ptw{ ~  (1<IWh{e`\`QaFdPdz͑ͤʹMA5) !1CVk !-8CMU]ciotz (3>HPX^djotz#.8BKRY_ejotz (2<EMSY_dintz",6?GMTY^chntz &08@GNSX]chnt| )2:AHMSX]ciow~}{zyxwxx  #,4;BHNS}X|^{dyjxrv{tsqpnmmlll  ~%|.z6x<wCuHtNsTqYp_nfmnkxjhg e d c c b b b }|| x u r (p 0o 7m >l Dk Ji Oh Ug \e cckbu`_]\[ZYYYY~xtqq oli"g*f2d9c?bE`K_Q]X\_ZhYrW}VTSRQQQQQ ""#w"p!ligfca_&]-\4Z;YAXGVMUTS\RdQnOzNMKJJIIIJ$%&{'q&j%f#b!`^ [YW"U)T0S7Q=PCOJMQLXKaIkH wG F!D"D"C"C#C#C#C"')*v*m*e)`'\%Y#W!U!R!P!N!%M",L"3J"9I"@H"FG#ME#UD$^C$iB%u@&?&>'>'='=(=(='>'*+-r-h-a,\+X(T&Q&N% L%J&H&"G&)E&/D&6C'<A'C@'K?(S>)\=)f<*r;*:+9+8,7,7,8,8,8,,.{/o0e0]/X.S+P*L*I* F*D*B*A*%?*,>+3=+9<+@;,H:,P9-Y8.d7.p6/5/4030202030304//1w2k2b2Z2T1O/K-G.D.A.?.=.;."9/)8//7/660>50F51N41W32b22n13}03/4.4-4-4.4/3/313t4h5^5W4Q4K2F1B2?2<2 938363 43&33-24414;05C05L/6U.6`-7l,7{+7*8)8(8(8)8*7*745q6e7[7T7M6G6B5=6:677 472718/8$.8+-92,99+9A*:I*:S);^(;j';y&<%<$<#<#<$<%;%;6|8m9b9X:Q9J9D9=99:5;2;/<-=,=*=!)=((>/'>6&>>%?G$?P#@["@h!@v @AAAA@@ ?9x:i;^<U<M<G<@<8=4>0@-A*B 'B&C$C#C%"C,!D3 D;DDENEYEeEtEFFFEEDD<s=f>[?R?J?D?=@6A1C,D'F$G !H III"I)J0J8JAJKKUKbKqKKKKKJJI?o@aAWBNBGBAB:C2E-G(I#KMO PPPP%P,Q4Q=QGQRQ_RmR~ Q Q Q Q P POyCjD]DSEKEDE>F6H/J)L$OQSV WXXX X( X0 X9 XC XN XZXhXyXXXWWWVsFdGYHPHHHAI:J2M+P%R UXZ] ` ` ```#`+`4`=`I`U`c`s`___^^^lJ_KUKLLEL=N5P.S'V Y\_b eg ghhhi&i.i8iCiOi]imiihhgfffOZOQOJOAQ8T0W([!^beh knp p qqrs!s(s1s<tHsVsfsyssrqqpaSVSOSEU;X2\*`"dhlo rvyzz {|}~"*5AO_q~~}\XTXIZ?]5a,e#josw { ",8FVh~Y]N_Cb8f.l$qw| #.<L^tSdGhHPW^dioty$.9BKRY_dinty )3=EMSY_dinsy #-7?GNSY^chmsz '09AHMSX]bgms{ !*3;AHMRW\agnu~~}}}} $-4;BGMRW\~b}h{pzyxvutrqpppp'}.|6z<yBwGvLuRsWr]qcokntl~kihgfeeee  ~| ywu!s)q0o6n<lBkGjMiRhXf_egcpbz`_^\\[[[[|vsr q nli#g*f1d7c=bCaI_N^U]\[ cZ mX xW V T S R R Q Q Q }tmjggf c a _ %] ,\ 3[ 9Z ?X EW KVQUYSaRkPvNMLKJIIIIvmfb_^^ [YW U'T.S4Q;PAOGNNLUK^IgHsFEDCBBBBB }!q"h"a!\YWUTQON#L*K0J7I=GCFJERCZBdAp?}>=<;;;;<!#x$l%c%\$W#S QOM KHG E&D-C3B9@@?G>O=X<b:m9{8 7!6!5!5!5!6!6!#&t'h(_(X'S&O$L"I G DB@ ? #> )< /;!6:!=9!D8"L7"U6#_4#k3$y2%1%0%0&/&0&0&1%&(q*e*\*U*O)K(H%D$A$?$ =$;$9$7$&6$,5%34%:3&A2&J1'S0']/(i.)w-),)+*****+*+*,)(|*m,b-Y-Q-L,G+C(?(<(9( 7(5(3(2(#0()/)0/*7.*?-+G,+Q+,[*,g)-u(-'-&.%.%.&.&.'-+x-j._/V/N/H.C-?,;,7,4, 2,0-.--- +-'*.-*.5)/=(/E'0N&0Y%1e$1s#1"2!2!2 2!2"1"1-u/g0\1S1K1E1@0;0603001-1 +1)2(2'2$%3+%32$3:#4C"4L!5W 5c5q666666650q2c3Y4P4I4B3=37314.5+5(6 %7$7"7!8" 8(80879@9I:T:`:n:;;;;::9}2m4`5U6M6F6@6:646.8*9&:#; <===>%>->4>=?G?Q?^?l@|@@@@??>y5i7\8R9J9C9=9791:+<'="?AB CCDD"D)D1D:ECENE[EiEy E E E E E D Dt9e:X;O;G<@<:<4<.>(@#BDFHJ JJKK% K- K6 K@ KJ KV KdKtKKKJJJIn<`=T>K>D>=>7?1@*B$EGILNQ Q Q QQ"Q)Q2R;RFRRR_RoRQQQPPPh@[APAHAAA;B4C-E&H KMPSU X XXYYY%Y-Y6YAYMZZZiY|YYXXWWcDVEMEEE?E7G/I(L"ORUX Z ]_ ` `aab b'b1b;bGbUcdbvbbaa``]HRIJHCH:J2M*P#SWZ] `cfgh ijklm"m*m4m@mNm]momllkkjXMNMHL>N5Q,T$X\`d gknprrs uvwxy#z-z9zGzVyhz|yxxwwTQLQBR8U/Y&^bgk oswz|~ %0>M_sRVGWr2x'  #5I^uیܟܫ $/9CKRY_dinsy*4=EMSY^chmsy $.7@GNSY^chmsy(1:AHNSX\aglsz "+3;BHMRW[afmt}%-5<BGLQV[`gn~w}{zxwvvvuu  '/5}<|A{FyKxPwUv[tasiqqp{nmkjjiiii{ ywv"t)s0q6p<oAmFlKkPjVh\gdeldvca`_^^^]] | wtq omki#h*g1e6d<cAbF`L_R^X]_[hZrX~WVUTTSTT zrli g f db`^%]+\1Z7Y<XBWGVNUTS\ReQoO{NMLKJJJJ~sjd`^] ] ZXV U'S-R3Q8P>O DN JL QK YJ bH mG zF D C B B B B B xlc]YVTTS Q O M "L (K .J 4I :GAFGEODWBaAl?y>=;;:::;sg^XSPNLL JHFE$D*B0A7@=?D=L<T;^9i8v76443344|nc Z S NJHFECA?> =';-:39:8A7I5Q4[3f2s0/.---..x j"_#V#O"J!F CA?= ;976#5)40361>0F/O.Y-d,q+*)( ' ' ( ) t#g$\%S%L%G$B#?!=:7 5310 /&.--3, ;+ C*!L)!V("b&"o%#$###"$"$"$#$$##q%c&Y'P(I'C'?&;$8"5"2"0" .","*")"#(#*'#1&$8%%A$%J#&T"&`!'m '}'((((('~%n'`)V)M*F*A)<(7'4&0&-&+' ('''%'$'!#('"(.!)6 )>*H*R+^+k+{,,,,,++z'j*]+S,J,C,>+9+4*0*+*)+&+#,", ,,-%-,-3.<.E/P/\/i0y000000/v*g,Z-P.H.A.;.6-1-,-'/$/!01 1222"2)31393C4M4Y4g5w5555444r,c.W0M0E0>08030/0)1$2!356 77888&8.969@9K9W:d :t : : 9 9 9 9 8n/_1S2J3B3;36312,3'4!689;= >>>># >* >3 >< ?G ?R?`?o???>>>>i3[4P5G5?59545.5)7#8;<?AC D D DD D'D/D8EBENE[EjE|EDDDDCd6W7L8C8<87818+9%; =@BDG I J KKKK#K+K4K>LILWLfLwKKKJJJ_:R;H;@;:;4;.<'>"ACFIK NPQ QRSSS&S/S9SESRSaSrSRRQQQY>N>E>>>8>0@)B#DGJMP SUWX YZZ[\!\*\4\?\M\[\l\[[ZZYTBJBBB^2c'jpx  &8Kaz7j+p x ,@WnԆԛӫ *4=FMSY^chnsy %.8@GNTY^cgmsz )2:BHNSX]bgls{ #,4<BHMRW[`flt}&.5<BGLQUZ`fmv}|||||  (/6<AFK}O|T{Zy`xgvpuzsqponnnnn~|{y"x)w0u6t;r@qEpJoOmTl[kbijhtfecbaaaaa~yuq omlk$k*i0h6f;e@dEcJaO`V_]]e\oZzYXWVVVVVzrligd ca`_%^+]0[6Z;Y@XEWKVQUXSaRjPvONMLLLLL | p h b _ ]\ ZXWV U&S+R1Q6P;OANGMMKUJ]IgGsFEDCCCCC ti`ZVT S S QONL!K'J,I2H7G=ECDJCQBZ@d?p>~=<;::::|nbZTPMKK J IGED#B(A .@ 3? 9> @= G< O: X9 c8 o6 ~5 4 3 2 2 2 2 wi^UOJGECCB @ ? = < $; *9 0877=6E5M3W2b1n/}.-,+++,rdYQKFB?><; :875!4'3-230:/B.K-T+_*l){('&%%%&~n`VMGB>:8754 20/-#,*+0*7)?(H'R&]$j#y"!   zj]S J D >:7420. ,*)' &&%-$5#="F!P [hwwg Z!P"H"A";"7!3 0-+(&%#!!$ *2:C M!Y!f!u"""""!!s d"W#M$E%>$9$4#0",")!&!$!"! !!""!"(#/#8$A$K%W%d&s&&&&&%%p"a$T&J&B'<&6&1%-%)$&$"%%& &''''%(-(5)>)I)U*b*q*** * * *)l$]&Q(H(@)9(4(/(+'''"()*++ ,,,-#-*-2.<.F .R ._ /n / / / .. . .h'Z)N*E+=+7+1*-*)*$* +-./1 222 2 2' 2/ 38 3B 3N3[4j4{333332d*V,K-B-:-4-/,+,&,"-/1246 8 8 888$8,848>9J9W9e9w988887_-R.H/?08/2/-/)/$013579 ;= >>>>!>(>1?;?F?S?a?s?>>===Z0N2D2<25201+1&2 468;= ?AC CDEEE$E-F6FBFNF]FnEEDDCCU4J5A59534.4(5"7:<?A DFHI J KLMN N(N2M=NJNXMiM}LLKKJP8F8=87817*9$;=@CF IKNPQR STUVW#W,W8WDWRVcVwVUTSSK<B<;;5;-<&?BEHK OQTWXZ[\ ]_`bb&b1b>aLa]ap``_^]G@??:?1@)C!FJNQ UX[^acdegh jlno o*o6nEnUnhmmlkjDD>C5D+G#KOTX\`dgkmoprtuw y|~".=~M}a}w|{zyCG9I/L%PU[`ejnrvy|~ %3DWm=N2Q(V\bhnty~ ):Mb{6W,\!bipw~ 0CXp0b%ipx  %8Ne~͖̩ %/8@HNTY^chmsz )3;BHNSX]bgmt{ $,5<CHNRW\agmt}'/6<BGLQUZ`fnv !(06<AFKOTZ`g~o|zzxwutsttt#*}0{6z;x@wEuItNsTqZpanimskihgfeffg|vt rqpp$n*m0k5j:i?hDgIeNdTc[ac`m^y][ZYYYZZ{snjgedccb%a*_0^5]:\>[DYIXOWVV^ThSsQPONNNNO{phb_][ YXWW V%U*S0R4Q9P?ODNKMRKZJcIoG|FEEDDDEq f ^ Y UTRP ONML K&J+I0H5G:F@EFCNBVA_@k>x=<<<;;; x j_WQM K JI H FEDC!B&A+?1>6=<<C;J:R9\8h6u5443333 qdYQKGDB A A ?><;:"9(8-72695?4G3P1Z0f/s.-,++++}l_TLFB><:: : 8 654 2 $1 )0 // 6. =- E, N+ Y) e( s' & % $ # # # xh[QHB=975332 0 / - , !+ '* -)4(;'D%N$Y#e!s sdWME?:520.-, +)(&%$$*#1"9!B KVcqp`TJB<62/,*(&% #" !'.6?ITapl]QG?94/+(&$"  $,4=GR_niZNE= 61-)%#  ")1:EP ] l | eWL!B!:!4!/!* &#    !!"""&#/#7 #A $M $Y $g $x$$$$##bT!I#@#8#2#,#("$!!!!!#$%& ' ' ' '# '+ (4(>(I(U)d)t))((('^"Q$F%=%5%/%*$&$"##$%&() , ,,,,!,(-0-:-E-R.`.q---,,,Z$M&C':'3'-'(&$&!&&')+, . 0 11222%2-263B3N3]3m322111V'J)?*7*0*+)'(#()*,.0 1 45 67888"8*939>9J9Y9i9}88776Q+F,<,4,.,*+%+ ,-/13 5 7:; < =>?@@%@/@:@F@T@e?x?>>==M.B/9/2/-.(."/0257 : <>ABC D FGHH!H*H5HAHOH`GsGFEEDH2>26201+1%2469< ?BDFHJKL NOQRR%R0R<QJQZQmPONMMC6;645/4'5!8;>A DGJMOQSTUW Y[]]]*]6\D\T[g[~ZYXW?98938+9#<?CG JNQTWZ\]_`bd fhkk#j.j<jMi_hugfed==7<.=%@DIM QUZ]`cfhjkmoqt vy{{'z5yExYxmwvut_C^H]N[UZ]XgWrUTSRQQRR|qid`^\ [[ZZY%W*V/U4T8S=RCPIOPNXMbKmJzIHGGFGG~pf^YVSRP OONN M%L*J.I3H8G>FDEKDSC]Ah@u?>====>uh]UPLJIG FEEDC B%A*@/?4>:=@;G:O9Y8d7q6544445~m ` V N H D B@?> =<;;:!9%7*60554<3C2L1U0`/m.}-,,,,,w g ZPIC> ; 9 8 76 54321"0'/,.2-8,@+I*R)](k'z&%%%%%r bVLD>9631 0 0 / .,+*)#()'/&5%=$F#P"\!i ym^RH@:51.,** ) ( ' %$# " &! , 3 ; D O [ i y      iZNE=71-*(&$## "     # * 2:DP\j{eWKB:4/*'$"   !(09CNZiy    bTI?71,($! &-6ALW e u    _QF=5/*%"  # * 3 < G S aq\NC:3,'#      '/9CP^nXKA80*%!   !!!$","5"@#M#Z#k#~#""!!UH> 5 . ( #   " $ % %&&&!')'2'='I(W(g'{''&&%Q E!;"2","&!"!   "# % &( ) +,,,,&-/-9-F-T-d-w,,++*M"A$8$0$)$$#!"""#$& ( *,. / 02333"3+363B3P3`3s22100I%>&4'-'(&#%$%&(* , .0245 7 8::::':2:>:L:\:o98876D):)1)+)&("'()+. 0 2579;<> ? ACCC#C.C9CGBWBjA@?>>?,6,/,*+%*+-/2 58:<?ACEFH JLMMM(M4LBLQKdK{JIHG;03/-/(-"/147 :=@CFHJLNOQS UXYX"X.W<WKV^VsUTRR8312,1%258< @DGJMPSUWYZ\^a dfgf'f4eDdWdkba`^5705(7 :=B FJOSVY\_adegilnq tww v-v=uOtcs{rpo5:+;"?CH MRW\`dhknqsuwz| $3E[r/@%DIN TZafkoty} );Pg)INT[bipw} 0E\t"T[bjs{ &:Qhˁʖ %.6>DJOTY^cipx  (07>DINSW]biqz "*18=CHLQV\bir}zx $+17<AFKPU[bk~u|zxwvurnl %~+|1z6y;w@vDuIsOrUp\odmnlzjhgfeda`}wspoooom%k*i0h4g9f>eCcHbNaU_^^g\s[YXWWWVTulhda` ____]%\*[/Y3X8W=VCUISPRXQaPmN{MLKJJJJrg_ZWUSR RRRQO$N)M.L3K8J=ICHJFRE\DgCuBA@@?@@tg]UOLJHG G FFFED$C)B-A3?8>>=E<N;W:b9o8766666|k^TMGCA?>= =<<<:9$8)7.635:4A3I2S1^0k/{.----.sdWMF@;87654 44321 0$/)./-6,=+E*O)Z(g'w&&%%%&m^ R H @ : 6 2 0..- , ,+*)( '%&+%2$9#B"K"W!d sh Y M C<61 - * ( ' && %$$"!!" (.6?ITapc UI@82-)&# "    %+3<FR_n_QF<5/*&"          " ) 1 : E Q _ n  \NC:2,'#        ( 0; F Q ^ m   XK@70)%!      % - 6 A MZj|UI>5-'"       "*3>JXgzRF;2+%!   '0;GUdwOC90)#    $-8DRbuL@6-&!      !!"!*!5"A"O"_"r!! H=3+$   !" $ &&&''''2'>'K'\'n&&%$#D90(#  !"$&(* + ----$...:.H-X-j-,+*)@ 6!-!&!! ! " $&(+-/0 2 4555 5*565C5S4f4|3210<#2$*$$# "!!#% ' )+.02468: < >>>>&>1>?=N=a@BD F IIH!H,G:GIF[EqDCBA4*,*'("'(*- 0 369<>ACFHJLNP STTS'S4SCRUQjPOML0-+,&+,.2 59=@CFILNQSUWY\_ bccb,a<`N_b^{\[Y/0*/"037;?DHLORUX[]`bdfimp tts%r4rEpYoqmkj.3%58<AGLQUY]aehkmortwz~ +=Rg~): =BHNTZ`dinrvz} !3G^w#CHN U\cjqv{ (<RjNT \dlt|1H_vȎ  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./01123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗 :`˺2ƷPh{ĵ˳Ѱխ٫ܪި᧙㥗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗  9` ˻0ƸOg{ĵ˲ѯխ٫ܩާख़㡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘䡘  9` ˼.ŹMfzŵ˱Ѯլ٪ܧޥ࢚➙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙㞙  9` ˾,ŹLg{Ŵ̰ѭի٨ۥݣߟᛙ⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙⛙  9 ` ˿+ĺLg{Ŵ̰Ѭթئۣݠޝᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚᘚ  8 _ )¹Mh{Ƴ̯Ѫէؤڡܞݚޕ  8 _ )Ni|Ʋ̭ѩԥעٟڛܗݓޓޓޓޓޓޓޓޓޓޓޓޓޓޓޓޓ  7 ^ ǿ+Pj|ư̫Чԣ֟؜٘ڔܐݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐ  7 ^ ľ-Qj|Ʈ̩ХӠ՝ّ֙ؕڎێێێێێێێێێێێێێێێێ  6 _ 0Sl}Ǭ˧ϢўӚՖ֓׏؋ًًًًًًًًًًًًًًًً  5 b 3Um}ƪˤΟЛҗӓԐՌ։׉׉׉׉׉׉׉׉׉׉׉׉׉׉׉׉  7 e 8Xn}Ƨɡ̜ΗϓѐҍӊӇԇԇԇԇԇԇԇԇԇԇԇԇԇԇԇԇ  : h>[o}ģǝʘ˓͐΍ϊχЅхххххххххххххххх  > mD^p}ßřǔɐʍˊˈ̅̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓̓  B rI`p}ÕđƍNJLjȆȄɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂɂ H xGbq|ÊĈĆńŃŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁŁſ% N p9Xlz€€€€€€€€€€€€€€€€€1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ1 S(|̨Dƥ]£pùƷʵͳбҰԯ֮ح٬ڬڬڬڬڬڬڬڬڬڬڬڬڬڬ0 S'|̨Dƥ]¤pùǷʵγбӰկ׭٭ګګګګګګګګګګګګګګګ0S&|˩CƦ\¤o~ùȶ̳ϱҰծ׭٬ܫݧۧۧۧۧۧۧۧۧۧۧۧۧۧۧ0S%|˩BƧ[¥n~ĸɵͲѰԮ׭ګܩߨߣܣܣܣܣܣܣܣܣܣܣܣܣܣܣ0S$|˩AƧZ¥m}ķɴαӯ֭ګܩߧ⤑ࠎܠܠܠܠܠܠܠܠܠܠܠܠܠܠ0S#|˪AƨY¦m}ŷʳϰԮثܩߧ⥗栖ݜݜݜݜݜݜݜݜݜݜݜݜݜݜ 0S"|ʪ@ƨX¦l|Ŷ˳аխڪݧच⟘㝚ᙗݙݙݙݙݙݙݙݙݙݙݙݙݙݙ 0S!|ʫ?ƩW§k{Ŷ˲ѯ֫ڧݤߠ◚ᗜޗޗޗޗޗޗޗޗޗޗޗޗޗޗ /R |ʫ>ƪV¨kyŶ̲Ѭ֨٤ܡݜޗޒޒޒޒޒޒޒޒޒޒޒޒޒޒ /R|ʬ<ƫU¨jwŵ̯Ҫ֥ءڝۙݔސގݎݎݎݎݎݎݎݎݎݎݎݎݎݎ /R|˭:ƬT©is~Ų̬ѧբמؚږۑ܍܋܋܋܋܋܋܋܋܋܋܋܋܋܋܋ /R|˯8ƭR«fo~ưͪѤӟ՛ًُ֗ؓڈڈڈڈڈڈڈڈڈڈڈڈڈڈڈ .Q|˰5ǯOð`l~ǭ̧ϡҜӘԔՐ֍׉؇؇؇؇؇؇؇؇؇؇؇؇؇؇؇ .Q|̳0DZLĸVnǩˣΞϙѕґӎԋԈՅՅՅՅՅՅՅՅՅՅՅՅՅՅՅ  -P|̶*ȷDYpªǦʠ͖̚ΒϏЌщч҅҅҅҅҅҅҅҅҅҅҅҅҅҅҅  ,O{ͼ"¼<^r¦Ţǜɗʓː͈̍͋Ά΄ττττττττττττττ  + N zFbtÞřǔȐɎʋˉˇ̅̃̃̃̃̃̃̃̃̃̃̃̃̃̃̃  ) L ~%OfuÖőƎNjljȇɆɄɂʂʂʂʂʂʂʂʂʂʂʂʂʂʂ ( R -WhuÌĊňņƄƃƁǁǁǁǁǁǁǁǁǁǁǁǁǁǁ - Y +Pgu~ˆ†…ÃÂÁÁÁÁÁÁÁÁÁÁÁÁÁÁÁ 4 [v%E]ny~~~~~~~~~~~~~~~:Uh-x@Vgs~x{|ywÂu„t…srrqqqqqqqqqqqqqqq'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~'*F6iާBǛběr›úƸȷʶ̵ʹϳгѲѰ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~Ѱ~')F5iިAǜaĜq›~ĹǷʵ̴γвұӱԮԬҬҬҬҬҬҬҬҬҬҬҬҬ'(F4jݨ@ǝ`Ĝqœ|ºŸɶ̴ϲѱӰկ֯תէӧӧӧӧӧӧӧӧӧӧӧӧ'(F3jݩ?ǝ`ĝpž{¹Ƿʵγѱӯ֮ح٪٥դԤԤԤԤԤԤԤԤԤԤԤԤ''F2jݩ>Ǟ_ĝoyøȶ̳бӯ֮ج۫ܦڢ֠ԠԠԠԠԠԠԠԠԠԠԠԠ&&F1jݪ=Ǟ^ĝoxĸɵͲѰծج۪ިߢڞ֜ԜԜԜԜԜԜԜԜԜԜԜԜ&&F0jݪ<Ǟ]ĞnvķʴϱӮ׬۪ި⤐ۚיՙՙՙՙՙՙՙՙՙՙՙՙ&%F0jܫ;ǟ]ğlt~ŷʳаխ٪ި⥗柕ۗזՖՖՖՖՖՖՖՖՖՖՖՖ&%F/jܫ:ǟ\Ġjs|Ŷ˳ѯ֬ۨߤ៙㜚ᗖܔؓ֓֓֓֓֓֓֓֓֓֓֓֓ &$F.jܫ:Ǡ\ġhqzŶ̲Ѯשۤޠᖛᕛݒؑבבבבבבבבבבבב &#F-jܬ9Ǡ[ģfnxŶ̰Ҫצڡܛޖߑߑݏُ׏׏׏׏׏׏׏׏׏׏׏׏ &"E,jܭ7ǡZťc©kuų̭ҧ֢؝ژےݎ݌܍ٌ׌׌׌׌׌׌׌׌׌׌׌׌ %"E+jۭ6ǢYŧ_­fp~ưͪѤԞُ֙ؔڋۈۈ؈׈׈׈׈׈׈׈׈׈׈׈׈ % E*jۯ4ȤUƫXó_n~Ǭ̦РқԖՑ֍׉؆؄ׄքքքքքքքքքքքք %E'j۰1ȨMDzNXpǩˢΝЗђҎӋԈՄՂՁՁՁՁՁՁՁՁՁՁՁՁՁ $D%jڲ.ʯ@Ƚ=]r©ƥɟ˙͔ΐόЉц҄ҁҀҀҀҀҀҀҀҀҀҀҀҀҀ $D!jڴ)ͼ(CasšǛɖʑˎ͈̋Ά΃΁πππππππππππππ #Ci#LeuÝŗƓǏȌɉʇʅʃˁˀˀˀˀˀˀˀˀˀˀˀˀˀ "Bh /Thv”ÐčŊƈƇƅǃǁǀǀǀǀǀǀǀǀǀǀǀǀǀ @ _ 4Zkw‰ˆÆÅÃĂāāāāāāāāāāāāā  = c3Sgt}€€€€€€€€€€€€€  Aax2L_nx|}|{zyxxxxxxxxxxxxxx " BZ(j9wI[i|qyvvzt}rqȁpǃoDžnƆmƈlŊlŋlŋlŋlŋlŋlŋlŋlŋlŋlŋlŋlŋlŋ &=N/[?gNq{[yveqlnrkwizg~fՀeԂdԄcӆbӉaҋaҌaҌaҌaҌaҌaҌaҌaҌaҌaҌaҌaҌaҌ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ #1:>YKyٚ\ȕrŕ}×»ĺŹƹǸȸ~ɷ}ʷ|ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ʴ{ "0:=YJy؛[Ǖrŗ{ØúŹǸɷʶ˶~̵}̳|ͯ|˯|˯|˯|˯|˯|˯|˯|˯|˯|˯|˯| !/:}֨DɨOǰSŸYm}Ƭ˥ϟјӒՌ׈ׅ׃քԄффффффффффф%91Z<~׬;ʭDɹEYo~ƨʡ͛ϕЏҊӆԃԁԀӀррррррррррр$9/Z9~ٴ/̸2½@]q~Ťȝʗ̒΍ωЅЂр~}}}}}}}}}}}}"9-Z0z!Hbs~àƙȔɏʋˈ̅͂̀~||||||||||||8)Z$t*Oet›ÖőƍNJȇɅɂʀ~|||||||||||| 7%Zh 2VhuÌĉņńƃƁ}}}}}}}}}}}}6P f6Vjv~†„ƒÁÀ~~~~~~~~~~~~ 4 Eh7Ser{~}||||||||||||  ' Ie%x9O`mux}{z}yĀwÁvƒu„tsrqqqqqqqqqqqq  ,H\1kBvP~~_{iwntsqwpzn}mĺk̓j̅i̇hˉgʌgʌgʌgʌgʌgʌgʌgʌgʌgʌgʌgʌ -A(P9\Hf|Tnw^uqezmk~jphufxe{c~bځaك`م`؇^؊^֍^֍^֍^֍^֍^֍^֍^֍^֍^֍^֍^֍ (7.C=N|KWwV_o]ehbjdinaoq_ss]wu\{v[~wZxYyXzXzW{V|V|V|V|V|V|V|V|V|V|V|V|'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'6/DJRe_~ܓnϒxƒĒÑ~}¼{¼züyøy¸y¸y¸y¸y¸y¸y¸y¸y¸y¸y'5/DJQe^~۔mϒwŒēÒ¼~¼}û{Ļzĺyĵyõyõyõyõyõyõyõyõyõyõy&4/CJPe]ڕi͔tŔ~ĕ•ûĺ~ź}ƺ{ƹzƵzƱzızızızızızızızızızız%4/BJOf\ږf̕qŕ|Ė—úŹƹǸ}ȸ|ɵzɰ{Ǭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{Ŭ{$3/AJOf[٘c̖oŖy׺ŹǸɷʶ}˶|˰{ʬ|Ȩ}Ũ}Ũ}Ũ}Ũ}Ũ}Ũ}Ũ}Ũ}Ũ}Ũ}$2/AKNgYٙa˗mŗwÙĹǸɶ˵ʹ~α|ά}˨}ɥ~ƥ~ƥ~ƥ~ƥ~ƥ~ƥ~ƥ~ƥ~ƥ~ƥ~#2/@KMgWٚ^˘jřtÚ}ºŸȶ˴γвѬ~Ϩ~̤ɡơơơơơơơơơơ#1/?KMgUٜ\ʙhŚrÜzùǷ˴βѱӬӧФ͠ʞƞƞƞƞƞƞƞƞƞƞ"1/?KLgSٝYʛeŜoÝxĸɵͲѰծקԣџ͜ʚǚǚǚǚǚǚǚǚǚǚ"0/>KKhQٟVʜbŝlßu~Ʒ˳ϰԭ٨ڢ՞ћΙʗǗǗǗǗǗǗǗǗǗǗ"0/>KKhO٠Sʞ_Ɵiár|ǵͲҮتߢܜ֙җΕʔǔǔǔǔǔǔǔǔǔǔ!//=KJhM٢Pˠ\ơeänx¸ȴΰիݥ曑ݖהӒϑːȐȐȐȐȐȐȐȐȐȐ!//PUQhS{WԞ_ʛkśuÛ~ŷʴϲҨϣˠǝś™%4%C>NUNhPzRա[˞fƝqÞz¹ǵΰԩ֡Н˚șŗ–%4%B>LULgMyNդV̡aơlâv÷ʲҬؚ۠ї̕ȔœÒ$3%B>JTJfJxK֨Qͦ[ǥeħpzö˯֥族ړґ͐ɐƏÏ$3%A>HTGfGwG٭KϬTȬ^Ưh±s}˥Քޏڍӌ΋ʋNjČ$2%A>FSDdCuB۴DҵJ˷Sʾ_n|©˜ҍ؆هӇχˇȈňˆˆˆˆˆˆˆˆˆ#2%@>CRAc?s=޾;?J]o}ãɖΊӁՁ҂ς̃ɄƅÅÅÅÅÅÅÅÅÅ#1%?>@Q>;O7]3j1u)8Ocsďȇʀ|zyz|}}}}}}}}}}!.%<>6L0Y,b'm&jNCdTH^YL[_OXdRUiTSmURqWPtXOxYN{ZM[L\K]I^H_H_H_H_H_H_H_H_H_H_$y3"p;*hB1aJ6\Q;WW?S]BPbDNgFLlHJpIItJHwKF{LEMDNCNBOAPAPAPAPAPAPAPAPAPAP' ;K/YCdTkcrq|}ㆄނ}zxwutrqppopqqqqqqqqq' ;K/YCdTkcrq|}ㆄނ}zxwutrqppopqqqqqqqqq' ;K/YCdTkcrq|}ㆄނ}zxwutrqppopqqqqqqqqq' ;K/YCdTkcrq|}ㆄނ}zxwutrqppopqqqqqqqqq' ;K0YCcTidprz~≂܅؂}{ywvtsrqqsttttttttt' ;K0YD`UfdmswጀۈՅ҂}{ywvutsuuvvvvvvvvv' ;K0YD^Udejts}ًԈЅ͂}{yxvuvwwxxxxxxxxx' ;J0XD\Uaegtpߏz؍ҋ·˄ȁ}{ywvxxxyyyyyyyyy' ;J1UDYU^edtlޑv؏э͊ɇƄā~{ywxxyyzzzzzzzzz& ;I1SDWU[eathޓr֑{ЏˍNJĆÃ{ywxyyz{{{{{{{{{& :I1QDTTXd]tcޖm֓wБʏƍɄ{yxyz{{|||||||||& 9H1ODRTUcZs_ޙi֖rϓ|ʑŐË{yz{{|}}}}}}}}}}& 9G1MCOSRcVr[ߝdךmЗwʔŒŽ{ijzī{¦|}~& 8G1KBMRPbSqW^؞gЛqʘ{ŕ’ŷ|ɫ|Ǥ}à~& 8F2IBJQM`PoT}Xڤbҡk˝uƚ˜¶ˬ}΢ɝĚ& 7F2GAHPJ_LmP{Tܫ\ԩeΦoȣzßİΠљʖŔ& 7E2E@FOG]IkLxOߴUٵ_ӵiεv|ġΔҐˏƎŽ& 6D1C?CND[EhHtL~Q[kƽqxÔ͉҇̈ljÉ& 6B1@>@L@YAdDoIwR|bhnvπ̂ǃĄ& 5?0==hOCbUG]ZKY`MVePSjQQnSOrTNvUL{VKWIXHYGZF[E\E\E\E\E\E\E\E\E\ ~)u5#l<*dC/^J4XP7TV:Q[Kd@JhAHlBFpCEtDDxEB}FAG@H?I=J=J=J=J=J=J=J=J=J| q$g,_5Y=!TE&OK)LR,HW/F]0Da2Bf3@j5?n6=s7KKPXUdZpa{iޚsו~Ўʅ}xy{}~ 4B$C0E=HILUQaWl]wcm֞y˕~|~ 4A#A/B;EGISN^ShZra{ۯn̦v~ 4?"?.@:BEFPKZRcYk߽drѶlĬsz4=!<-=8@BDLIUQ\Zaboɼipw4; 9+:5=?BGHNQR[Y`mgmt}x|386)82:;?AGETEWX^kd~krzvorwz}~353'4/65=8H8MEVV\ib{howxnhiosvxz{{{{{{{{300#/)2-;,@:HLN\Vl]zem}vsălgefknqstttttttt1-*)"-!3,XFeOpXzzdsmmvhdЈ`ϒ^Ν\ͩ[ιYȚZʜ\ɝ^ɞ^ɞ^ɞ^ɞ^ɞ^ɞ^ɞ^ɞ  "'-96J?XHcRmz\urd{mmhud~`؆]֏Z՘XԢWԮVԼV͐VђWѓWѓWѓWѓWѓWѓWѓWѓ   #*.;8IBUL_zVgs^mkdrflwbtz_|}\ZߋWޓUݜTܥRܯRܻQ̅RڅRڅRڅRڅRڅRڅRڅRڅ  $*09:EFOzQXrX^k^ceeh`lk]rnZypWrUtSvQwPxNyMzMzLzLzLzLzLzLzLzLzظ '(35??yJGpQNiWSb]W^d[Zj^Wp`TvbR|dPeNgLhKiJjIkHlGlGlGlGlGlGlGlGlݯż *#~6-vA6mHk2CE@K=P;U9Y7^!5b"4g#2l$1r%/w&.}'-(+)+)+)+)+)+)+)+)+)vs r1 qCqP&uY3ub?sjIptSn~[kaiggkencqbsau`v^w^x]y\z[z]z^y`y`y`y`y`y`y`y`yvs r1 qCqP&uY3ub?sjIptSn~[kaiggkencqbsau`v^w^x]y\z[z]z^y`y`y`y`y`y`y`y`yvst1 rBtO'xX3y`?wiJsqTq|\nckiimgqetdvbxay`{_|^}]}]}_}`|b}b}b}b}b}b}b}b}wtu1 sBwM'{V4|_@zgKwoUsz^qenkkpisgweyd{b}a~`_ŀ^Ё_ڀaހb߀c߁d߁d߁d߁d߁d߁d߁d߁xuv1 tBzL'U4]@~eLznVvw_tfpmmrkviyg|e~cba`DŽ_ӄaڄc݃d܄e܄e܄e܄e܄e܄e܄e܄e܄yvw0 vB~K'S4\@dLlVzt`whsoptmyk|hfecbaɇaՇdڇeڈfوgوgوgوgوgوgوgوgوzxy0 xAI'R3Z@bLiW~qa{{iwqswp|mjhfdcb΋d֋f֋g֌h֌i֌i֌i֌i֌i֌i֌i֌i֌{yz0 |?H&P3X@_LgWnaxj{rwys~oljgedďdҏgӏhӐjӐkӐlӐlӏlӏlӏlӏlӏlӏlӏ|z{0 >F&N2V?]KdVkask~s{zvrnkhfeʓhѓjДkДlДmДnѓnѓnѓnѓnѓnѓnѓnѓ}{|/ <E%M1S>YJ`Uh`pjyt|zuqmiggΗk͘l͘n͘o͘pΗqΖqϖqϖqϖqϖqϖqϖqϖ~|~/ ;C$K0P(B2G;MDTM[UܰeaΨlqßt|§åţƢȟȟȟȟȟȟȟȟ- 49<&@/E8K?SF\MӶb`ƭipqy¨æŤƢȠȟȟȟȟȟȟȟ+ 279$=,B3I9R>XL̺`_gon~v~~¨æŤƢȠȟȟȟȟȟȟȟ* 146!:(@-H1Q7VK^]enl}s{ytwz§|å}ţ~ơȟȟȟȟȟȟȟȟ( 1236"=&G&L5TI\[cljzqywpln§ræuĤwƢxǡzȟzɞzɞzɞzɞzɞzɞzɞ& /./2:DJ3RGZYaigxnvyohdeŤjţmƢpǡrȟtɝuʝuʝuʝuʝuʝuʝuʝ$ + )),7AI0QDXV_fetl|tqib^]ɞbȟfȟiɞkʝn˛n˛n˛n˛n˛n˛n˛n˛#' " $ 0=$F4NDVR]acokztsk~bȌ\ȜYȱWΖ[͘^̙a̙d͙g͘g͗g͗g͗g͗g͗g͗g͗!  .:)C9JHPVWb_lvhulr}c~\،W؝TװT͌UӏWґZѓ\ѓ_ѓ`ѓ`ѓ`ѓ`ѓ`ѓ`ѓ`ѓ  ,7.@=HJOVV`v^ilepdpw^||YVޗSݦQܸQԄSڇT؉V׊X֋Y֋Y֋Y֋Y֋Y֋Y֋Y֋ ٿ ,!70@>HJPTwW]m]defj_pnZzrVvSyQ{O|M|M|P|QRށSށSށSށSށSށSށSށ ۷ ,#71A=IGxQPnWWe^\`fa[oeVxhSkPmNoLqJrIrHrKrNsNtNtNtNtNtNtNt ެ˺!.#9/B9wJBmPIeVN_^SZeVUmZRu\O~_LaJbHdFeEfDgCgEgFgFgFgFgFgFgFgʹ $0 ~;*tB2kH9cN?]UCX]GSdJPkMMrOJyQGSETCVAW@X?Y>Z>Z=Z=Z=Z=Z=Z=Z=Zҭ &|1q8"h>)`E/ZL3TS7PZ:L`Fm@DtBA{C?E=F;G:I9J8J7K7K7K7K7K7K7K7K w# m*d1\8U@"PH&LO)HU+D[-Ba/?g1=m2;s39z5765738291:0;0;0;0;0;0;0;0;| of^! V)P2K:FABH?N5D2I0N.S,X*])c'i%o$w"~!hd#_/^@cKgT%h]/fg9drAb}H`N]R[VZYX[W]V_U`TaTbScRcRcScTcVbWcWcWcWcWcWcWcie#`._@fIjS%k\0ie:gpBd{IbO_T]X[[Z]X_WaVbUdUeTeSfSfUfVeXeYfYfYfYfYfYfYfjf"a.`?iHmQ&n[0ld:inCgyKdQaV_Z]][`ZbYdXeWgVhUhTiUiWhYhZi[i[i[i[i[i[i[ijg"b.c>lFqP&rY1pb;lkDivLgRdXa\_`]b[eZgYhXiWjVkUlWlYk[k\l]l]l]l]l]l]l]lkh!c-g<pEtN&vW1t`;piEmsMj~TfZc^ab_e]h\jZlYmXnWoWoYo\n]o^p_p_p_p_p_p_p_pli!e-k:tCyL&zU1y]\IdSk]vfoxwr~mjhhЌkՍmՍo֌p֋q؊qىrڇrڇrڇrڇrڇrڇrڇspu&, 6@F'L1R;YE`OhYߎscՆ}nxxsomlȑnґpӐrԏsՍt֌t؊uىuىuىuىuىuىuىtqx$+ 5>C$I.P7VA]JߝgTԕobˍxnÅyyurqsДtђvґwӏwՍw֌x؊x؊x؊x؊x؊x؊x؊ur{#) 4<A"F*M3T<[DףcS̚lb“un~y{xvwϖyДzђzӐzԏzՍz׋z׋z׋z׋z׋z׋z׋us}!) 49>D&J.R5ܯYAϨaRŠiarnzy~|}͗~ϕ~Г~ґ~ӏ}Ս}֋}֋}֋}֋}֋}֋}֋vt ( 37;A"H(P.ԴV@ɭ_Qg`omwx˘ΖДҒӐԎ֌֌֌֌֌֌֌wt'2 48=F!ܿL,ιT?ñ]Pe_lltw|}zǘ|Ζ}Д~ҒӐԎ֌֌֌֌֌֌֌xu&/ 04:DH+ȽS=[Nc]jjqvzytqØsϖvДxґyӐzՎ{֌{֌{֌{֌{֌{֌{֌xv%+ , /6<G)Q;YLa[hhotw~yqlikДnђqґsԏuՍv֋v֋v֋v֋v֋v֋v֋yx#&%(07E'O9WJ_Xfemqu{z~qjebcґgӐjԏmՍn֌p؊p؊p؊p؊p؊p؊p؊{|! $5C$M6UG]Udbkm{svr|~jc^[[Ս_Սc֌f׋h؊jوjوjوjوjوjوjو|%6A!K3SCZQb]~igtqpk{xd~]XVUۆXڇ\ڇ_ڇaۆcۅcۅcۅcۅcۅcۅcۅ~ھ %5@!I/R>YK`Wvhampiezp^̆uX̕yȚ{Qͼ|P|SU߀XށZށ\߁\߁\߁\߁\߁\߁\߁ ۵ % 3>%G2N?UIv]Smf[eoa^zgX܆kSܕoPݦqM޻rMqNtPwRxSyUzUzUzUzUzUzUz ݫ͸ % 3='F3N>vUGl[NdcU]mZXw^SbNeJgGiFiHiKjLmNoOpOpOpOpOpOpOp б '4>'G2vN;lTBdZH]bMWkQRuUMXHZE\B^A_@`C`G_HaIcIcIcIcIcIcIcԩµ )5~@%tF-kL5cR:\Y?V`CPhGLqJG{LCN@P>R=T;U;UA;C9E8F6G5H5I4I7I7I7I7I7I7I7Iɫ~u' l/d7\>VE"PK%KR(FX+A_->g/;o18x364361708/:.;.;-<-<-<-<-<-<-<yne^' W0Q7K>FEAL=R9X6_!4f"1n$/w%-&+())(*'+&,&-&-&-&-&-&-&-}ui _WPI&D. ?6 ;= 7C3I0O.U,[*b'i%r#{!|peZQ IC=8&4-03-9*>'C%I #N !T Z a i r |  \W&Q2N<WE[N\X"[c+Yo2Wz8T=RAPEOGNIMKLLKMJNIOIPHPHPIPKPMOOPOPOPOPOPOPOP\X&R2Q:ZC_M_W#^a+\m3Yy:W?TCRGPIOKNMMOLPKQKRJRISJSKSMRORPSQSQSQSQSQSQS]Y&S1T9]BbKbU#`_,_k4\w;Y@VETHRKQNPOOQNRMSLTKUKULUMUPTQURVSVSVSVSVSVSV^Z%T1X7a@eIfS#d]-bh5_t<\BYGVKTNSPQRPTOUNVMWMXLXNXPXSXTYUYUYUYUYUYUYUY_[%U0\4e=jGkQ$iZ-fd6cp=_|C\IYMWPUSSURWQYPZO[N[O\Q[T[U\V]X]X]X]X]X]X]X]`\$V/`2j;oDpN#oW-ka6gl>cxE`K\OZSWVVYT[S\Q^P_P_R_U_W`XaYb[b[b[b[b[b[b[ba]#Z-e/o8tAvK#uT-q]6lg?hsFdL`R]VZYX\V_T`SbRcScUcXdZe\f]f^f^f^f^f^f^f^fb^#^*i-t5z>|H"{Q,xZ6sc?mmGizNdT`X]\Z`XbVeUfTgVgZg\i]j_j`jajajajajajajajc`"b'n*y2<F!O+X5{`>uiGotNjUf[b__c\fZiYjXkZk]m_naobocndndmdmdmdmdmdmda"f%r'~0 ;EM)U3^=}fFvpNr|Um\hbdfaj_m]o]p^p`rbsdsesfrgqgpgpgpgpgpgpeb!i#w%/ 9CL&S0[:cDlMywUt]nciifncqatauavdwfwhwivjujsksksksksksksfc!m {#. 8AJ#Q-Y7`AiJ߁tSz~]teolkqhufxeze{h{j{kzlxmwmvnunununununugd p~", 7@H N)U3]<ݏfGӈoSˁy^{funqtnxk|j~jl~m}o|pzpypwqwqwqwqwqwqwhd s +5>DK%R-ߝZ7ӕcFʎlSÇu^~g{owuszp~ooʂpށq߀r~s|szsysxsxsxsxsxsxifv*4 ;AH O'آV6̚`EÓiRr^zgo}vy|vttńu݃vށvw}w{vzvyvyvyvyvyvyiix(2 7=DݭK$ЦT5Ɵ^DfRo]wgow~}{zyz܄z݂z߀z~z|yzyyyyyyyyyyyyjk{&03 9AֱG#ʫR4\CdQl\tf}ov}ۅ݃ށ~}}}{|z|z|z|z|z|zkm~$,/4 ݺ:еF!ůQ2ZBbOj[reznv||ywׅx݃zށz{}|{|z|z|z|z|z|zkp"&)/ֿ6ʺD O1X@`NgZodwmu{ztqoхq݃s߁u~v}w{wzwzwzwzwzwzls !&4 ľBM/V>^LeWmbuk~ryyr~mig̓iނl߀o~p|rzryryryryryrymv2 @K,T<\IcUk_rhy{orvk{fb`ʀbe~h|j{lymxmxmxmxmxmxn{ڻ / =I)R8ZFaQh[zpdrykkqdv_z[|Y|Z{^{azcyfwfwfwfwfwfwfwp ٳ Ͼ ,;F&P5XA_M|gVso^kwedk^pYsUuTuSvWvZv\u_t`t`t`t`t`t`tr ٩ε )7D!M0U<}]GtePlmWev^^ācYÎhTÝkQîlOmNmPoSpUpXpYpYpYpYpYpYpwޠϮĹ )7BL)T5u\?mdHelO_vTYҁYTю]Pѝ`MҰbKbJbKfMhOiQiRiRiRiRiRiRi ҦIJ * 7B}J)tQ3kY:daA^kGXuKSOOSKUIWGWFWFYG\I^J`K`K`K`K`K`K`ٞǬ , 9|AsI'jP/bW5\_:Vh?RqBM|FIIFKCM@N?O>NBOCQDSETETETETETET˦ . y7p?hF"`M(ZT-T\1Oe5Km8Gw;C=??D>F>F>F>F>F>FП{t* l3d;]CWJ QQ$LX'H`*Dh,@q.<{192543617/8.9-919393939393939}vme$^- X6R=LEHLCS?Z>>>=>=?>>@>C=D>F?F?F?F?F?F?P K*E5J8M=QHRRQ^Oj%Mw+J/H3F6D8C:B@?@@?@?@>A@@B@E@FAHAHAHAHAHAHAQL)G4M6Q;UFVPU\Rh&Pt,M1J5H8F;EC?CABAABAC@C@CCCFBHCIDJEJEJEJEJEJERM)J2P3U9YCZMYX Vd'Sq-P}3M7K:I=G?FAEBDDDECEBFBFCFFFIFKGLHMHMHMHMHMHMHSN(N/T0Z6^@`J^U [`(Xm/Ty4Q9N=L@JBIDHFGGFHEIDJEJGJJIMKNLOLQLQLQLQLQLQLTP'R,Y-_2d<fGdR a\(]h0Zu6V;R?OCMELHJIIKHLHMHMHNKMNOPPRPSQTQTQTQTQTQTQUQ'V)^*d/j:lElO hY(dc0`p7\|=XBUFSIQKOMNOMPMQLQMQPRRTTUVUWUXUXUXUXUXUXUWR&Z&b&j,q7sBsLpV(k`0fk8cw>_D[HXLVOUQSSRTQUQURVTXVYXZZZ[Y\Y\Y\Y\Y\Y\YXS%^#g#p*w5 z@zJxS&s\/nf7ir?e~EaJ^N\RYUXWWXVYVYV[X]Z^\^]^^]_\_\_\_\_\_\YV#b l u(}3 =GP${Y-vb6qm>lyEhKdQaU^Y\[[^Z_Z`Za\b^b`baabac_c_c_c_c_c_ZY!fpz&1 ;DM!V+~^4yi=ttEoLjSfXc]a`_c^d^e_f`fbfdeedecfbfbfbfbfbfb[\iu~$.8BJR'[0݁f:zpEuzNpUl[i`fddgcibjcjdjfighhgifidididididid[_ly!,6 ?GO"܎X-҇b:ʁlE{uNvVr]nbkfijglgngnimjlkjlilglflflflflflf\bp|)3 <DߚKӔU,ʍ_9‡iEqO|{Wx^tcqhnllolplqmonnolojoiogogogogogog]dr&08 ?؟G͙R+Ē]9fDnNwW}^ydvismqqqrqsrqsosmsksjrhrhrhrhrhrh^gu#,3ݨ9 ѣEǝP*Z8cDlNtW|^d|jynwrvtvtwrwpwnvlvjvivivivivivi^ix',֬4 ˧CN)X6aCiMqVy^djo}r|t}|u|}s||q|{o}zm}yk}yi}yi}yi}yi}yi}yi_k{ ݰ$а2 ƬAL'V5_AgLoUw]din|rwtuutsuqvow~mx}kx|ix|ix|ix|ix|ix|i`n~ֶ˴0?K%T3]@eJlSt[}bhymtqptmtmsoqpormsktitititititiaq ٵ ϹŸ.=I#R1[>cHjQrYz`xfrlmoirfserhpjnllmkninininininicu ܢԭ ϸ ɽ+;G!P/Y;aFhOpWxx^rdkifmbo_p^o`ncmfkgjihihihihihihgy ߚӦ̱ǻ(8DN,W8^BfKxmSqvZk`ed`h[kYlXkYk\j_iahcfcfcfcfcfcfk~ ̪֞Ĵ$5 BL(T3\>ydFqkNktTd~Z__ZbVeSfReRfUfXfZe\d\d\d\d\d\dp ݖΣĮ 1 >I#R.zZ8rb@kjGdsM^|SYWT[P]N^M]K_N`Q`S`U`U`U`U`U`U`wӛƨ ,:FzO'rX1j`8dh?^rEX|ITɈMOɕQLɥSJɹTISGUHXJYLZNZNZNZNZNZNZܓʢ ,9yCqM jV(c_/]g5Xq:S{>OوBKٖEH٦GFںHEGDIBMDOEPGRGRGRGRGRGRϛ~-v8nAfJ_R#Y[)Ud-Pm1Lx5I8F:C<@>?>>>=?=B?D@F@F@F@F@F@F֓ģyq+j6 c?]GWORW!M`$Ii(Fs*B~-?/<1:38465655476989898989898Ȟyskd'^1X; SCMKISEZAc>l;v!7#4%2'0(.)-*,*,*/*/*/*/*/*/*um e^W#R,L4H< CD ?L94%0,,2(8%>"DJQYcn|  rdTKD=7 1,($" ',16<BI Q Z fsD$?.<6@8A=AEAQ @]?j4B6D;DCEO D[Ah?u4@4A4A4A4A4A4G"A,E/I0L5M=NHMTKaHn E{%B(?+>.=/<1<2;3:4:5:5:5:5:5>5A7B8D8E8E8E8E8E8H"C,H,N-Q1S9UESQQ]Nj!Kw&H+E.D0B3A4A6@7?8?8?9?9?9@8C:EH@JAKAMAMAMAMAMAMAJ H'Q%X%]*`3c?bJ`U\a#Ym)Uy.R3P6N9L;K=J?J@I@IAJAJBJDLEOFPFQFQFQFQFQFQFL L$U!]!c'g1j< jGgRc\#_h*\t0Y5V9TeDbI`M^P]S[U[V[V\W]W^V`U`TaSaSaSaSaSaSPZepx$.8 BKW#yb/tl8ov@lFhKfPcSaV`Y_Z_[`[aZcYdXdWeUeUeUeUeUeUP]it}!*4= ܋HхT#^.zh8uq@qzGnMkRhVfYe\d^d^d^f]g\hZhYhWhVhVhVhVhVR_lx%/ޕ8 ӐEʋQ"…[.e8{nAwwHtNpSnWk[j^i`hai`j_k]k\lZlXkXkXkXkXkXTbo{(ؙ3̕BĐN!Y-b7k@|sHy|NvTsXq\o`nbmcnboao_o]o[oYoXoXoXoXoXVdr~ݞ ў1ǚ@L V,`7h@pH~yN{TxYv]tascrdsdtbt`s^~s\~rZ~rY~rY~rY~rY~rYXgu֣ˡ/ž>JT+]6f?nGvNT~Y{]ya}xdzxeyxexybyx`yw^yv\yuZyuZyuZyuZyuZyuZZix ݚ ٢ Цƥ,<HR)[4c>kFsM|SX]zav~ds}eq~eq~cr}`s{^tz\ty[uyZuyZuyZuyZuyZ]l { ܓ՝ ѥ ʪ*:FP(Y3a]xCXGTKPNMPKPKPJQLRNRPRQQQQQQQQQQv݉ʗ%4 |@uJmS#g\*ad0\m6Wv:S?OBKEHFGFGFDIEJGKILJLJLJLJLJLѐž y.r< lGeP_Y!Zb'Uk,Qu0Mρ4Iώ7Fϝ9DЮ;B;C:@>>@@BACBDBDBDBDBD݈ǘx tn+h7aB\MWVS_Oi"Ks%G~(D+B-?/>/>/<19496:8;9;9;9;9;9͒~tnhb*]5W? RHMQJZFcCm@x=!:#8$6&5&4&4&2(2+3,3,3,3,3,}qgb\W'R1M:HB DK AT>\;e8o5{20.,+********{oc[UPK#F,B4><:C7K4S1[ .d +o (| &$"! {n`TNIC?:%6,23/:+A(H%O"W `ly         |m_QGA< 72.*#&)"/5;BIQZf t   }m_PB:5/* &"#(-3 9 AIS^l|9'3254868;6C3N1[ /h -v+))((('''''''''(+-/////:'4181;4;9:A7K5X 3e1s/--,,++++* * * * + +,/!1"3"3"3"3"3";&50;/>1?6>=k;x977 6!5"5#4$4%4%4&4&4&5%5&6(8):)<*<*<*<*<*=%=*C(G)I-J6JAIM GZEgBt@> ="<$;&;':(:(:):):):);):+;-=.?.A.A.A.A.A.>%A&H$L%O)R3Q>QI OVLbJoG{ E#C%B'A)A*@+@,?-?-@-@-@/?1A2C3D3F3F3F3F3F3@$E#L R!V&Y/Y:YF VQT]QjNu!L%J(I+G,G.F/E0E1E1F1F2E5D6G7H8J8K7K7K7K7K7A#IQW\#`,`6`A ^M[XXdUp#S|'P+O.M0L2L3K4K5K5K6J8J:JO@OAQAR@S@T?T?T?T?T?FPYbhl$o.o8nDkNh[dg#`q*]{/[4X8W;U=T?SASBSCSDSETEVDWDXCXBXBXBXBXBHS]fmr!u)v3v> sJoWkb#gl+dv1a7^;\>[AYDXFWGWHXHXIYHZH[G\F\E\E\E\E\EKWakrx{$}-~9{FvSq^$mh,jq3g{8d=bA`E^G]J\K\L\M]L^L_J`I`H`G`G`G`G`GNZdov}'ۄ4ЁC|OxZ#sd,pm3lv:j?gCeGcJbMaO`P`PaObNcLdKdJdHdHdHdHdHP\h rzފ Ҋ0Ɇ@M}W#ya,uj4rr:o{@lDjHhLgOfQeReSfQgPgNhLhKgIgIgIgIgIR_k u ~ ֏̎.Ë= JU"~^+{g3wo:tx@rEoImMlPjSjTjTkSlQlOkMkLkJkJkJkJkJTa n x ܉ ؏ ГƓ+; HR!\+d3|m:yu@w}EuJrNqQoToU}oV|oT|pR{pP{oN{oM{nK{nK{nK{nK{nKWc p|܅ԌГ ʖ)9 FP Z*b2j9r?|zEzJxNvQ{uTxtVvtVutUuuSutQusOvrMvqLvqLvqLvqLvqLYfsֈϐʖĚ&7 DNW(`1h8p?xDI}}Mx{QtzTqyVoyVnzUnzSoyQpwOqvMquLquLquLquLquL[iw݂Ћɓę$4ALU'^/e7m=uC{~HvLrPnSkUhVgUhSi~Qj|Ok{MlyLlyLlyLlyLlyL^ lzֆˏė!2?JS%\-c5k;zsAu|FpKkOgRdTbUaTaRcPeOfMg~Lg~Lg~Lg~Lg~La o~ЉƓ /=HQ"Y+a2yi9tq?oyDjHeLaO^R[RZR[P\O^N`LaKaKaKaKaKdtڂˎ,: EOW(y_/sf5mn;hw@cE_I[LWNUOTNTNUMXLYK[J[J[J[J[JhyчŒ(6 BLxT#r\*ld1gl6bu;]@YCUGQIOJNININIPIRHTGTGTGTGTGnʍ#2~>wIqRkZ%eb+`j0[s5W}9S=O@LBJCIBHCGDIDKDMDMDMDMDMDu҆Ó {-u: oEiOcW^_#Yh(Uq-Q{0M4J7G9E:D9C;B=B>D>E>E>E>E>E>}ɍytp&k5e@ `K[TW]ReNo#Kz&GȆ)DȔ,BȤ.@ȸ/?/?0=3;5<6=7=7=7=7=7цxne c`-[:WF SP OYKbGlDwAׄ>ؓ <أ!;ٷ":":#7'6)4+6-6-6-6-6-ŐwlbZXT)P5L?HIES B\ ?fC;K8T6]3h 0t . ,*(''&&%%%%%vi]QIFB>!;*734:0B-J+S(\%f"s         vi[NC>: 62/#+*(1$7!?FNXcpwhZL@72.*&# &+28@H R ]k}xi[K>2+&!  $ *07@JVdu/++2/104/9+A'L#X!f t    !""""/+.02/3126/>+I)V'c%q$~ # #"""""""""""###$&''''0*1-5+7-624:2E/R-`,m *z )(((''''''''(((')+,,,,1)4)9(;*<.:69B7O5\3i 1v0/..--------..--/122223)8&=$@%A)B3A>?J=W ;d 9p7}655443333345433 6!7!8!8!8!8!5'="B F H%J/I:GFER C_ Ak?w=<<;;:::::;:!:#:%:%<&=&>&>&>&>&9$AGKO"Q+Q6OALM KZIfGrE}CBBA A!@"@"@#A#A$@'@)?*@*B*C*C*C*C*C*< EKQVX'X1W<UH RTPaNmLxJI H"G$G%F&E'E(E)F*E-E.E/F/H/I.I.I.I.I.@IPV\_#`,_7]BZO X\VhSrQ} O$N'M)L+K-J.J/J0K0K2J3K3L3M3N2N2N2N2N2CLT\aef'f1e=cJ `W]bZmWw#U'T+R.Q0P2O4O5O6O6O7P8P8Q7R6S5S5S5S5S5FPX `fjl!m+l7jE gRc^`h ^r&\{*Z.X1W4U6T8T:S;S;TX?X@Y?Y?Z>[<[;[:[:[:[:[:LV ` h o swyy.w> tKpVm`!ji(gr-ez2c6a9`<^?]A]B]C]C^A_@_>_=_<_;_;_;_;NX clsx{ ~~+|;yHvSr]!of(mn.jw3h7f;e>cAbCaEaEbEbCcBc@c>c=c|g=|g=|g=|g=R]irzʃņ&6CN|X y`'wi-tp3ry7pwj>wj>wj>T _lv}Ƀć#4ALU^&|f-yn2wv7u;t?|rCxqFupHsoIqpIqpGqqDrpBroArn?rn>rn>rn>rn>V boýŇ 1? JS\%d,k1}s6~{|;zy?vwBrvEouHluIkuIkuGkuEluCmsAmr?mr?mr?mr?mr?Yer|DŽ /< HQZ$b*i0|q5xz:t>p}Bl|Ei{GfzHd{Hd{Ge{DfzCgxAhv?hv?hv?hv?hv?[iv̀È ,: EOW"_({g.vo3rw8m_A\DZEXEXDXCYA[@]>]>]>]>]>bq~È%4@ JyStZ#ob(jj.fr2a|7]:Y>V@SARBRAR@R?U>V=W=W=W=W=gvɃ!0< xGsPmXh`$dg)_p.[y2W6S9P;N=L=L2@2A2A2A2A2|Š|phfc-^9ZDVN RWO_KiHsE~B ?"=#<#<#:&8(7)8*8+8+8+8+Ʌ|qf[WV#S2P>MHIRF[ Ce@o>{;ω9ϙ7ϫ664210!/!/!/!/!}qf[PG FE'D5A@?K=U:_8i5v 3 1 / .--+*)((((~qeYND? =;#9.684B1K/U-_*k(x&%#""!!     qdXLA85 30.'+0(8&@#I!R]iyrdVI>4.+ (%"&-4<DNYg w   sdVH;0'#  !' . 6>HTbsteVG9-#   &.7AM\m$/%/(/'1$6 >IVdr    %.)-+,+.)3$;FSan{       &-,).(/*-/)7'C$P"] jw             !!!!**/&2$3%2*14/?-L*Y(f&r%~%% % % % $ $ % % % % & & &%%&''''.&4"7 9!8%9/8;5G3T1a/m.y - - , , ,,,,,,---,,,-....2#8<>@"A+@6>B xJuSs\qd"ol'mt+l|/j2i5|h8yg:vf;tf#="=#<%;&;&;&;&;&;&zui^[Y$V1S=PGMPJY Gb DlAw><98775433 3 3 3 vk_TL KI(H5E@CJ@S>];g9s 7ǀ 4ǐ 2ǡ1ȵ00.-,++++xk`TJ@:98(756@4K3U1`/l-z+؋*؝(ٱ''& % $ # # # # yl`TH>5- ,+)*(5'?&J$U#a!n ~zl_SG<2*% #!"+4>HR_n      |m_RE9/&!(0 9 C N\l}n`RC7+"  "*3=IWi~paRC5)  #+6CSez/ ,!,.3<F T a o {                      -#)$)"+08CP^kw#*&&(%''#+3@MZgs~&&*", +"(&'0$<"IUbnz     *".000"0,.7+D(Q&]$i#u#########$$%%$ % % $ $ $ $ $ .35588'734?2K/X.d-o,z,,,,,,,, , -- , -,,,,---27:<?@">-<9:E8R7^6j5t5~44 4 4 3 3 3 3 4 44444344446;> CFFF&D2B?@L?Y>d=o}H |Q{zYwy`swhovp!lux%it(fs+cr.`q/^q0]q0]q.^q,^p+_p)`o(`n(`n(`n(Ubmu{.;~E zNuVq^n}fj|m g{v#cz'`y*]x,Zw.Xw/Ww/Ww.Xv,Xv*Yu)Zt(Zt'Zt'Zt'Yfqz +}8xBtL oTl[hcdkat!]}$Z(W*U~,R~-Q~-Q},R}+R|)S{(Tz'Tz'Tz'Tz'^kv~~{'v4r?mI iQeYb`^hW{!T$Q'O)M*K*K)L)L(L'M&N&N&N&cp{zur"o0j;fEbN _V[]XeUnQxN K#I$G&E&E%E%E%F$F$F$F$F$iv~pkhf*b7_A[JXR TZQbNkKuHEB@ ? ?? >!>!?!?!?!?!p}wi`][$Y1V<SEPNMW J_ GhDsA><:998777777xznbUPNM(K5I?FIDRA[?d+<6;A9K7T5_3j1w/-+**) ( ' ''''rfZOD:0.-,)+5+@*J(V'a&o$#ϑ!ϥ н tg[NC9/' &1<HUbrvh[NB7-$&0: F S b txi[M@4*!  $,7BPauyj\N?2'  '1>M_u|l]N?1%  !+9J]s,)(+0 8DQ^lx)&%',4 @N[ht&!" !#'0<J W c o z                ""$$"",8ER^ju&((&&&(#4 @MYepz*---.-",.):&G$T#`"k"u"~""""""###$$%%%%$$$$.12 4553'14/A-N,Z,e,p+y++++++++,-- - - - - , , , , 15 6: <;97+695G5T5`5j4s4|4433 3 3 3 3 4 4 4444444458<@A A?<"=1>A>O>Z=d=nCKQTTRQS"U3TATLSVQ_ PgOoNwNMLLKKKKLLLMLLLL@GPVYZXWYZ/Z=YIXS W[ VdUkTsS{RQQPP P!P!~Q }Q}Q}Q}Q}Q}Q}QBJTZ^_^\ ^`+`:_E^P \X [`ZhYpXwWVV~U!{U"yT#xU#wU"vV vVvVvVvVvVvVENX^bdcacd(e7dCcMaU `]_e^l]t~\}|[yZ wZ"tY$rY%qY%pZ#oZ"oZ pZpZpZpZpZHR[bfhhfgi%i4h@gJfS e[db~cj{brxazv`s_!p^#n^%l]%j^&i^$i^"j^ j^j^j^j^j^JU_ejlljkm"n1m=lGkP jX|h`xggvgosfxpemd!jc#hb%fb&db&db%db#db!ebebebebebLXbinppnprr.r;qE}pN znVvm^slepkmmjujigi!eh#bg%`g&_g&^g%^g#_g!_f`f`f`f`fO\emrutst vw+w8|vCxuL ttT qs[nrckqkhpseo|bn _m"]l$Zl%Yl%Xl%Yl#Yk!Zk[k[j[j[jS`iqvyywy {|({|5w{@szIoyQ lxYhwaevhbup_tz\tZs!Wr#Ur$Sr$Sr$Sq"Tq TpUpUoUoUoWdmu{~}}|x$u2q=mFiO fV c~^`}f]|nZ{wWzTzQy!Oy"Ny"Mx"Mw!NwNvOuOuOuOu\hrzytq n.j9gCcL`S ][ZcWkTuQNKIH GGH~H}I|I|I|I|anx{pk hf)b5_?\HYPVX S`PhMrJ}HECBAAAABBBBgt~uga^\#Z/W:TDRLOTL\ Ie GoDzA?=;;:::::::n{{nbWRQO(M4K>IGGPDXBa?k =w : 86544333333wsg[OGDCA+@7?A=J;S9\7g5s20.- ,, + * * * * * xk_SH=6 43!2,170A/K.U,`*m){'%$##"!!!!!{naUJ?4+$ ""!* 4?JVcsDžǙȮ}pbVJ>4*" %0<H V e x ֍ ؤ ؾ   rdWI=2(  $.:GVg{teWI<0%  !+7EVh~vfXJ;.#  '4CUixhYK;-! "0@Si(%% '-5AO\it~%"!# (0=KXdpz"" ,9FS`kv(4 A N[fqz     !! $/<IUaku~%%$ ##")5CO[fpy() (+ +)&"#.!; I U `!j!t!|!""""###$%%%%%%%%%, -.11 /+)%(3(B*O+Z+e+n,v,~,,,,,,,--....----/15763/.1,3<4I5U5_5h5p4x444444 4 4 5 5 5 5 5 5 5 5 5 35:>@=7 8:&=6>D>P=Z=c=kGPVXYVSTV%W4W@WJVSU[ Tc TjSrRz}R{QxPvPtPsPqPpQpQpQpQqPqPqP@KTZ]^[XY["\1\=\G[PZX Y` ~Yg{XoyWwvVtVrUoUmTlTjUjUjUjUjUkUkUkUCOX]ab`\^`a.a:`E`N~_V {^] x]ev\ls\tp[}nZkZiYgYeYdYdYdYdYeYeYeYeYFR[aefcabde+e7eB|dKxcSuc[ sbbpajm`rk`{h_f^c^a]`]_]_]_]_]`]`]`]`]JV^eiigef hi(~j5zi?viIshQpgY mg` kfghepedycd`c^b\bZbYbYbZbZa[a[a[a[aMYbhmmkik m|n%xn2un=qnFnmOklV hl^ ekecjm`iv]i[hXgVgUgTgTgTfUfUeVeVeVeQ]flqpon}pxrus!rs/os:lsDirLfrTcq[ `pc ]pk[otXnUnSmQmOmNmNlOkOkPjPjPjPjUajqutt|svuqwoxly+iy7fy@cyI`xQ]wX [w` XvhUuqRu|PtMtKsIsHsIrIqJqJpKpKpKpZfovyxxwyo|j} g~d&b2_=\FZNWUT~] R}e O}oL|yJ|G{E{D{C{CzCyCxDwDvDvDv_kt|~}~rfa^\!Z.X8UBSJPRNZKb Il Fw CA?=<<<===~=~=~fq{ym_XTRP'O3M=KEINFVD_Bh?s = : 8 766555666myrfZPI GE D+C6A@@H>QKZj~̫̔|n`RE9.#  '1>K[nބߛߴpaSE8,!  $/<K]qrcTF7*  +9J^tteVG8*  (7J^v$" !$)2>LYepz! #-:HUalv )6CP\gqz $0>KWblu~ + 8EQ\fpx   $0> J V a j s { " ! ! (6COZdmu}&%&'%! -<I U!_"h"p#x###$$$$%%&&&&&&&&)(-0/+" #&'(6*D+O,Y,b,j-r-z--------..//....,.5996/-0!214>5J5T5]5e5m5t5|554445556666555/4<AB@:69;,<:=F=P=Y=a=h @B'C5DBDLDUC]CdCkBsB{B A A A A~A|AzB yB xB xB xB xA xA 6@HMNMIEFH#I2J>JHJQIYI`IhHoHw G }G zGxFvFuFsFrGqGqG qG qG qF qF 9DLQSRNJKM O.O:OEONOVN]~Nd|Ml yMt wL} uLsLqKoKmKlKkLjLjLjK jK jK jK =HPUXVSOPRT+T7TBTK|TSzSZxSbuRi sRq qQz nQlPjPhPfPePdPdPdPdPeO eO eO ALTY\ZWTU WX'Y4}Y?zYHwXPtXXrW_oWf mVn kVw hUfUdTbT`T_T^T^T_T_T_S _S _S DPX]_][XZ [}\$z]1w]<t]Fq]No\Ul\]j\d h[l eZu cZaY^Y\X[XYYYXYXZXZXZW ZW ZW HS[aba_\^{_xa!ub.rb9obClaKjaSgaZe`b c`j `_s ^^}[^Y]W]U]T]T]T]U\U\U[V[ V[ LV_dedcaybudreof+lg7jg@gfIefQbeX`e`]dg [dp Yc{VcTbRbPbObObOaOaP`P`P` P` OZcihggyesgoiljik(gl4dl=blF_kN]kVZj]Xje Vin Six QhNhLgKgIgIgIfJfJeKe Kd Kd T^gmlkkskmmhn epbq$`q0^q:\qCYqKWqSUpZRpbPpk Nou Ko InGnEnDnCmDlDkEk Ej Ej Ej Xclqpozonpes`u]v[wYx+Wx6Ux?SxHQxOOwWLw_JwhHvs Ev Cu Au?u>u=u>s >r >q ?q ?p ?p ^iquttutiv^yX|T}R~Q&O1M;LCJKHTF\CeAp?~|<~ :~ 9~ 7~ 7} 7{ 7z 7y 8x 8x 8x doxyy{ypzd|XPK HG E+D5C>AG@O>X4*!! + 6 A N \ l teWK@5*!  "+6BP_qćĝĵxj\OA5)  !*5CRcxՏէ{l^PB4(  '3BTg~}n_QB4'  $1AUjqaRD4&!/AVm  %.;IVbmv  *7EQ^hrz%2@LYcmu}  ,:GS^gpx  &3@MXajrz  +9FQ[dlt{   " 0 > J U ^ gov~ (7DOYaiqx"!'*)$"1 >!I"S#\$d$l$s$z%%%%&&&''((''''&)1440)#&(+*8+D,N-W-_-g-n.u.}......////////)18<<92- /1&344@5J5S5[5b5i5q5y5555556}6{6{6z6z6z5z5-7?CD@:679":/<;h >g >f?e?e?d?dWaihg{gqgeh\jXlTnRoPo$Np.Mp8KqAJqIHqQFqYDpbBpl@px>p0$  !,:J]rzk\M?0# +:Maym^O@1"  );Of"+8FS^irz&4BNZdmu} ".<IT_hpx   (6CNYbkry "/<HS\elsz  (5ALV_fnt{  -:EPYahov}   $ 2 >IS[cjqx#%$+8CMV]els{       &-0.(" &!3">#H$Q$Y%`%g&n&v&&''''((~)})|(|(|(|($.5861,&&(!*.+9,D-L-T.\.c.j.r.z//}/{/z/x/v0u0s0s0s/s/s/*5;?<83/.02)354?5I5Q5X~5_}5f{6ny5vx5v5t5r6p6o6m6l6k6k6j6j5j50:ACA>:65 78%:1;<|;Ez"z?.x@8uABsAJrAQpAYnA`lAgjAphAygAeAcAaA`A^A^A]A]@]@]@]@9CJKIGDA~AzBvCtE*qE5oF?mFGkFOjFVhF]fFedFmbFv`F^F\E[EYFXFXFWEWEWDXDXD=GNNLKI}ExFtGpHnI'kJ2jK<hKDfKLdKSbKZ`Kb_Kj]Kt[JYJWJUJTJSJRJRJRIRIRHSHAKQPON~LxHrJnK kMhN$fN/dO9bOBaPI_PQ]PX[O`YOhWOrUO}SORNPNNNMNMNMNMMMMNLNLDNTSRQzPrMlOhP eQcR!aS,_S6]T?[TGZTNXTVVT]TTfRSoPS{NSLSKSISHSHRHRHQIQIPIPHRWVUTvSlQgSbT_V]W[W)YX3XX<VYDUYLSYSQY[OXdMXmKXxIXGWEWDWCXCWCVCUDUDTDTLVZYX{XqWfVaX]YYZW[U\&S]0R]9Q^AO^IM^QL^XJ^aH]kF]vD]B]@]?]>]=\>[>Z>Z>Y?YPZ]\[v[m[a[[]V^R` PaNb"Mb,Lc5Jc>IcFGcNFcVDc^Bch@cs>co=o"JV`hpx~ +8EPZckry  %2?JT]elsz  ,8CNW_gmtz  $1<GQY`gnt{  )5@JS[bhou}  !.:DMU \ c j q x  ! &3>GPW^els|#)*&"!-8BKRY`gow~ } { y!w"v"u"t!t!t!!+11.*&! !(#3$=$F%N&U&\~&c|'k{'sy'|x(v(t(r(q)o)m)l)k)k)k(k((28752-)' (*#+/~,9|,Bz-Jx.Qw.Xu.`s/gr/op/yo/m/k/i/h0g0e0d0c0c/c/c/.8=<:730. /{0x2+v35t3>r4Fp4No5Um5\l5dj5lh5ug5e5c5a6`6_6]6]6\6\5\5\43<A@><96{4w5t7q8'o92m9;k:Cj:Kh;Rg;Ye;ac;ib;r`;}^;\;[;Y;X;ICC_PROFILE W;V;V;V:V:V97ADCB@~>y;t:q:m<k=$i>/g?8e?@d@Hb@Oa@W_@^]@f\@oZ@zX@V@T@S@R@Q@P@P?P?Q>Q>;EGFEDyBt>o?k@ gAeB!cC+aC5_D>^DE]EM[ETYE\XEdVEmTExREQDODMELEKEKDKDKCLBLB?HJIH}GuEnBiCeD bE_F]G(\H2ZH;YICWIJVIRTIYSIaQIkOIvMIKIJIHIGIFIFHFHGGGFGFCLLLKyJpIiFdG_I\JZKXL%VL/UM8SM@RMHQNOONWNN_LNiJNsHMFMEMCMBMAMALALBKBJBJGOONNuMlLcJ^LZMVNTORP"QQ,OQ5NR=MRELRMJRTIR]GRfERqCR~AR?R>R=RW{?\F>]O=]W;]a:]l8]y6]4]3]1]1\1[1Z1Y2Y2XTYXXsWiW`XTYN[H]C_@`>a=a ;b):b29b:8cB7cK6cT4c]3ch1cv/c.c,c+c*c*b*`+_+_+^Y\\{[o[e[\\Q^I`CbKYi{w}uptbuUxI|?4+" "+5BP_q}x|i|[NA6,#  "+7ETf{qaSF9.#  !+8HZnyhYK=1%  +:L`wؒجp`QC5(  *<QggXI:* ,?Un%2?KV`hpx -:FQ[cksy  (5@KU^fmtz ".:EOX`gmtz'3>IRYagmsz !,8BKSZagmtz%1;EMU[bhnu|   )4>GOV\cipx   " . 8 A J Q X ^ e lt}~}zxwwww!$# '2<DLSZ`~h}o{xyxvtsronmmmm )+*($  "-~7|@zHyOwUv\tcskq tp n!l!k!i"h"f"e#d#d"d"d!&/10.+($ ~ {"x#)u$3s%<q%Cp&Kn&Rm'Yk'`j'hi(qg({e(d)b)`)_)^*\*\)\)\)\(,55431-|+y(v'r)p*%m+/k,8j,@h-Gg-Ne.Ud.]c.ea/n_/x^/\/Z/Y/X0V0U0U/U/U.U.1:9876z2u0r.n. k/i0!f1+d24c2=a3D`3K_4R]4Z\4bZ4kY5uW5U5T5R5Q5P5O5O5O4O4O36=<<;{:t7o5l3h4 e5b6`7(^71]8:[8AZ9HY9PW9WV:_T:hS:sQ:O:N:L:K:J:I:I9I9I8J8:@??>w=p;j8f8b9_:\;Z;%Y<.W=7V=>T>FS>MR>UQ>]O?fM?pL?}J?H?G?E?D?D>D>D=D=E<>CBB}As@k?e<`<\>Y>W?U@"SA+RA4PB<OBCNBKMCRKCZJCdHCnGC{ECCCBC@C?C?C?B?A@A@@AEEEyDoDgB`?[AWBTC QDOENE(LF1KF9JGAIGHHGPFGXEGaCHlBHx@H>HCKFBLMALV@L_>LjPC%cG#cQ"d\!didyddddca``_YX{XmXbXYXPYG[>^7`1c*f$i !j jj k(k0k9kBlLlXleltllllkihhg]]u\h\^\U\K^Ba9d2g+j$mps ttt!u)u2u;uFuRu_ un u u ut t s q q pbapadaZaObEe2' $1@Re}o_QC6*  $3DXnшФgWI;.! $6I_x_PB4& %9Og"/;GR[dlsz *6ALV_fmtz $0;FPY`gntz *5@JRZagmsz#.9CLT[agmsz (3=FMU[agmsz!,6?GOU[agnu}   %09AIPV\bipx~}|{{{{  )3<CKQW^dl}t|~z x w u s r p p o o o    # - 6~>|F{MySxZvauhsqq{pnlkihfeeee$$#!|y(v1t:rAqHoOnVl]kdimhwfdca`^]\\\\%*))(%}"yxvro#m-k5i=hDfKeRc Yb aa i_!s]!\!Z"Y"W"V#U#T#T"T"T"+...-|+v(r&o#m! j"g#e$)c$1b%9`&A_&H]&O\'V[']Y'fX(pV(|T(S)Q)P)O)N)M)M)M(N(02221v0p-k+h)f( c(`)^*%\+.[+6Y,=X,DW-LU-ST-[S-cQ.nP.zN.L/K/I/H/H/G/G.G-H-4555{5r4k2f/b._-\.Z/X0"V0+U13S1:R2BQ2IP2PN3XM3aK3kJ3wH4G4E4C4B4B4B4B3B2B28888w8m7f6a3]2Y2W3 T4R5Q5(O60N68L7?K7FJ7NI8VG8_F8iD8uC8A9@9>9=9<9<8=7=7=6;;;;s;j:b9]7X6T7Q8 O9M9K:%J:-H;5G;<F=<=:=9=8=7=7<8;8;8:=>>|>o>f=^=X;S:O;L<I=G>F?"D?*C?2B@:A@A@@I>AQ=AZ@@@xAlAb@[@T?N?J@FADBBC@C?D'>D/:EF9EN8FX6Fb5Fn3F|1F0F.F-F-F-E.D.C.CCCCtChC_CWCPCHCDEAF>G nJnWnenvnmmllkjjZtZfZ\YSYHZ?]6`.c&gjmqt w wwww$x-x7xCxPx^xoxxwvuutt~_n_b^Y^M_Bb9e0h'lptw {~ &0;HWh|weid_cRdGgGNU[agmsz#.7@HOU[`fls{ '1:BIOU[`gmu~ !*3<CIPU[ahp~y|{yxvusssss   $.6>}D|KzQyWw]vdtlsuqonlkihhggg  |y(w0u8s @r Fp Lo Sm Yl aj ii rg ~f d b a ` ^]]]]{xxw sp"n+l3j;iBgIfOdVc]af`o^{\[YWVUTTTT""##"y!sonm jge'c/a7`>^E]K\RZZYbWlVwTRQONMLLMM&''({'r&l$h!fdb_]#[+Z3X:WAV HT OS WQ!_P!iN!tM!K"I"H"G"F#E#E"F"F!*++,v+m*f)b&_$]"[!X"V#T$(S$0R%7P%>O&EN&LL&TK'\I'fH'qF'E(C(A(@(?(?(?(@'@'-./}/q/h.a-]+Z(W'T' R(P)N)%M*,K*4J+;I+BH,IF,QE,ZD,dB-o@-}?-=-<-:-:-:-:-:,:,012y2m2d2]1X/U,Q,O- L-J.I/"G/*F01E08C0?B1GA1O@1W>1a=2m;2{928262524242515150345u5i5`5Y4T3P0L1I1G2E3C3B4'@4.?56>5==5D<6L:6U96_76k66x472717/7/7/6050504667r8f8]7V7P6K4G5D6A7 ?8>8<9$;9,:939::8:B6:J5:S4;]2;h0;v/;-;,;*;);*:*:+9,889|:n:c:Z:S:M:F8B:?;<< :<8=7=!6>)4>03>72??1?G0?P.?Z-@f+@t)@(@&@%@$@$?%>&=&=;<x=j=_=V=O=I=B=<>9?6A4A2B1B/C%.C--C4,D<+DD*DM(DX'Ec%Eq#E"E EEDDC B!A>?t@g@\@S@L@F@>A8C4E0F-G +H*H)H"(I)'I1%I9$IA#JJ"JU JaJoJJJJJIHGGBBpCcCXCPCICBD;E5G0I+K&M $N"N!O O%O,O5O=PGPQP]PkP|PPPPONMME{FkF_GUGMGFG?G7J1L+N&P SU VVV V'V0V9WBWMWYWhWyW W W V V U TSIvJgJ[JQJJJCJ;L3N,Q&T!VY\^ ^^^"^* ^3 ^= ^H ^T^b^s^^^]]\[[NpNbNWNNNGN>O6Q.T'W!Z]`c f gggg$g-g7gBgNg\gmgffeeddczRjS]RTRKRBS9U0X([!_beh kn ooopp'q0q;qHqVqfqyqpoonmmsXeWZWQVFWHRZbiou{ !,8CLT\ciou{ '2<FNV\chnt{!+6?HOV\agmsz %/8AHOU[afls{)2:BIOUZ`flt} #,4<CIOTZ`fnw~|{zxxxxx &.6=C~I}O|Uz[yawiuqt|rqonmlkkkk  | z(x0v8t>sDqJpPnVm]ldjmhwgedca`````| y x usp#n+l3j9i@gFfLeRcYba`j_t]\ZYWV V U U V vqnm m j g e &c .b 5` <_ B^ H\ O[ VY ^XhVsUSQPNMMMMMwoifddb_]![)Z1X8W>VETLSSQ[PeNpL}KIGFEEEEE!"|"q"h!b_\[Z WUT%R-Q4O;NBMHKPJXHbGmEzCB@?>=>>>#$%w&l&c%]$Y"VTS QNM"K)J1I7G>F EE MC UB _@!j?!w=!;!9!8"7"7"7"8!8!&')s)g)_)X(T&Q#O"L"J"H"G#E$&D$.B$4A%;@%C?%J=&S<&\:&g9&u7'5'4'2'1'1'2&2&3%)*},o,d-[,U+P*L(J&G'D' B(A(?)#>)+=)2<*9;*@9*H8+P6+Z5+e3+r1+0,.,,,+,,,,+-*-*,-y.k/`/X/Q.L.H,E+A+?, =,;-:.!9.(7./6/65/>4/E3/N10X00c.0p,0*0)0'0&0&0'/(/(..0v1h2]2U2N1H1D0@/<0:1 71625233%23,13304;/4C-4L,4V*5a)5n'5~%5#5"5!5!4"4#3#213r4e4Z5Q5K4E4@4:374452607/7.7"-8)+81*88)9@(9I&9S%9_#9l!:| :::9988746n7a7W7N7H7B7<75829/:,; *<)<(=&=&%=.$=5#>=">F >P>\?i?y???>>=<<7z8j9^:S:K:E:?:9:2<.>)@&A$B"B!B C#C*C2C:DCDMDYDgDwDDDDCBBA;v<f=Z=P=H=B=<=6>/@*B%D!FH IIII&I.J6J@JJJVJdJtJ J J J I H G G>q?b@V@M@E@?@9A2B+E&G!IKNPPPP!P)P1 P; QF QQ Q_ QoPPPPOONM}BkC]DRDJDCCGOW]ciou|"-7@IPW]chnu| &0:BJPV\agmt| *3;CIOUZ`fmt} $,5<CIOTZ_fmv~&.6=CINTY~`|gzoyzwutrrqpppq !})|0y7x=vCtIsNrTpZobmjktjhgeeddccd~{wurq#o+m2l8j>iDgIfOeVc]be`o_{]\[YYXXXY }v q om kige&c-a3`9_?]E\K[RZYXbWlUxSRQPONNNNtlgec c a^\![(Y/X5V;UBTHSOQVP _N iM vK I H G F E E E E xme_\ZZZ W U S $R +P 1O8N>MEKMJUH^GhEuCA@>====>rg_YUSRR PNL J'I.H4G;EBDICRA[?e>r<:8755667{ m!b!Z!TPMLKIGED$B*A1@8??=F<O:X9c7o5~320///00"w#i$^$V$P#K"H FEC A?>!<';.:59<7D6L4 V3 `1 m/ |-!,!*!)!)!)!* + "%s&e'['S'L&G%D$B!?!=! ;!9"8"6#%5#+4$23$92$A0$J/%S-%^+%k*%z(%&%$%#%#%$%%$%$%'o)b*W*O*I)D(@'=&:%7&5&4'2'1("0()/(0-)7,)?+)G))Q(*\&*i$*x#*!****) )!((|*l+_,T,L,F,A+<+8*5*2+0+ .,-,,,*-&)--(-4'.<&.E$.O#.Z!/g/v////..--+x-h.[/Q/I/C/>.9.4.0.-/+0 )1'1&1%2#$2*#21!39 3B3L3W3d4t44333321.t/e1X1N2F2@1;16111+3(4%5#6 !6 77 7'8.868?8I9U9b9q999888761p2a4U4K4D4=48434-5(7$9 :; <===#=+>3><>F>R>_>o> > > > = = < ;}4k6]7Q7H7A7;75707*9%; =?AC CCCD'D/D9 DC DN D[ DjD|DCCCCBAx8g9Y:N:E:>:8:3:-;'=!@BDFI J J J J#J+J4J>JIJVJeJwJJIIIHHr<b=U>J>B=<=6=/>)@#BEGJL O P QQQQ&Q/Q9QDRQR`QrQQQPPOOl@]AQAGA@@9@2A*C$FHKNQ SVW XXYZ!Z)Z3Z?ZLZZZlZYYXXWWeEXEMEED>D5E-G%JMPSV Y\^_ ` abcd#d-d8dEdTdfd{ccbaa`_JSJJICH9I/L'ORUY ]`cfhij k mnpq&q1p>pNp_psoonmllZOPNHM=N3Q)T X\` dhkortuwx z |}(5EVk~}|{zVTNSBT7V,Z"_ch mrvz} ,;MbzUYHZ;]/a$flr w} !1CWpNa@d3i'nu| %7LdFk9p+w +@XtӒҰ>y1# 3Kd )4?HPX^ekqw~ #.9BJRX^djpv} (2;DKQX]chov~"+4=DKQV\agnv %.6=DJOUZ`fnw'/7=CINTY`goz~|zyxwxxwu !)07}=|CzHyMwSvYtariqsomljihiiii|ywvt#s+q1o7n=lCkHjNhTg[eccmbx`_]]\\\\\xtpm kihf%e,c2b8`=_C^I\O[VZ^XhWsUTRQQQQQR ~ s l heca _]\!['Y-X3V9U?TESKQRPZOdMoL}JIHGGFGG ukc^[ Z Y WUSR#Q)O/N5M;LAJHIOHWFaEmCzB@?>===>|nd\VSQP P OMKI%H +G 1F 8D >C EB M@ U? _= k< y: 8 7 5 5 5 5 6 vi^VPMJIIH F D C!B(@.?5><=C;K:T8^6k4y21/---./qdYQLGDCBA @><;%:+82796@4H3Q1\0h.w,*('&'()}m`VNHC@>=;9865"3(2/160=.F-O+Y*f(t&$"! !"#yi!\"R"J"D!?!< 9854 20/.%-,+3*;)C'M&W$d"r  u"e#Y$O%G%A$<#8#5"3 0 .! ,!+!*"("#'")�%#8##A"$J!$U$a$p$$$$$$##"q$b&V'L'D'>'9&5&1%.$+%)%'&%&$'#' "''!(. (6(>(H)S)_)n))))((('%n'_(S)I*B);)6)2(.(*(&)$*"+ +,,,$-+-3-<-E.P.].l.~.. - - -,,|(j*[+P,F,?,9,4+/+++&,"./0 1112!2(20293C3N3[3i 3z 3 3222 1 1w+f-X.M/C/<.6.1.-.).#02356 7778$8,85 8? 8J 8W 8e8v8877766s.b0T1I1A19141/0+0%2 368:< = = = =! =)=1>;>F>R>a>r>===<<<m2]3P4F4>47423-3'4"68:=? A C DDDD$D-D6DADND\DmDDCCBBBh6X7L8C8;75606)7#9;=@B EGI IJKK K(K2K=LILWKhK}KJJIIIb:T;I;@;9:39,:%<?ADG ILOP P QRTT#T,T7TDTRTcTwTSRRQQ\?O?E?>>7=/>'@ CFIL ORTWXY Z[]^_&_1^=^L^]^q]]\[ZZVDKCCBFLRX]cipx &/7?EKQV\ahpy  (08>DJOUZahq{|{y "*18>CHNT~Z|azixsvusqpoooml ~}|$z+w1u7t=rBqHoMnSlZkbilgxfdba`aaa`|wrp nllk%i,g1f7d=cBbH`N_U]]\fZrYWVUTTTUUunifc a`_^ ]&[,Z2X7W=VCUISPRXQaOlNzLKJIIIIJtjc^[YW VTSR"Q(P-N3M8L>KEJLHTG]FhDuCA@@??@@ y l a Z U R PON LKJI#G)F/E4D:BAAH@P>Z=d<r:9876667 re[SNJH G G EDBA @%>+=1<7;>:E9N7W6b4p210/..-.}l_UNHDA@@ @ > < ; 9 "8 (7 .6 55 ;3 C2 L0 V/ a- o+ * ( ' % % & ' wg[QIC?<:998 7542%1,02/:-B,K*U(a&o$#! scWME@;85432 1/-,"+)*0(7'?&H$S"_ m~o_SJB<741/.,+)(' %&$-#4"= FQ]k|}k\P G ? 941-+)'% $"! #*2:DN[izzgY!M"D"<"6"2!.!* ' $"  !!!"!"'"/"8#A#L#X#g#x# # # # " " !vd"V#K$A$:$4$/#+#(#$# #$%& &&''%','5(?(J(V (d (t ( ('''&&q"`$S&H'?'7&1&-&)%%%"%'(*+ ,,,,",)-2 -; -F -R-`-p--,,,++m%]'O(E)<)5)/(+(''#'(*,.01 1 1 1 1&2.272B2N2\2l2211000h)X*L+A,9,2+-+)*%* +,.024 7 7777"7*838>8J8X8h8|776665c,T.H/>/6.0.+-'-"-/1357 :; <=>>>&>/>:>F>T>d>w>==<<;^0P1D2;241.0)/$02469 ; =@A B CDEF"F+F5FAFOF_FsEEDCCBX4K5A59524-3&4 58:= @ BEGHJ KLNOO%O/O<OJOZNmNMLKKJS9G9>97817)7!9<?B EHJMOQRT UWYZY)Y6YDYTXgXWVUTTN=C=<<5;,<$>ADH KNQTWY[]^` bdgg"f.f<fMe`ewdca`_IBAA:?0@&CFJN RVZ]`cegikmo ruwv&v5uFtYtosrponFF@E5F*H LQV Z_chkoruwy{} +<OfFK:L.O#SX^ diotx| !1D[v?R2U&Z`g mt{ &9Pj7\+ahp x.E_~ɞȾ/i#py #:Tr !+5>GNU[afms{ $.8@HNTZ_ekr{(19@GMSX^dks| !*2:@FLQV\cjs~}| #+29?DJOU[ckv~|zywrpo %,28}={CyHxNvTu[scqnozmljihgedc{xv utsr%p,n2l7j<iBhHfNeUc]bf`r^][ZYYYXXyqmif edcc a&`,^1\7[<ZBXHWOVWT`SlQyPONMMMMMukd`]ZX WVVU!S'R,Q1O7N=MCLJJRI[HfFsEDCBBBCCxjaZURPN M LKJI"H'G-E2D8C>BEAM?V>a=n;~:988899o b X Q LIGFD CBAA?#>)=.;4::9A8I7R6]4j3z210///0 x h \RKE A ? >=< ;:98 6%5+40372>1F/P.Z-g+w*)('''' rcVME@<97 6 6 54210"/(..-4+<*D)N'Y&e$u#"  m^RHA;74200 0 / - , * ) %( +' 2& :$ C# M! X e u       {iZNE=830-+**) (&%$##)!1 9BLXfvweWKB:40,)'&%# "!  '.6@JVdt  saSH?72-)&$"  $+4=HTbr       o^PE<5/*&#! ")1;E Q ^ m k[MB:2-($! !!!!"& ". "7 "A "M"Z"i"|""!! gWJ!@!7"0!*!& "  !#$& & & & &"&*'3'='I'V'f'y'&&%%$c T"G#=$4$.#(#$"!"!"#$&( * ++++,',0,:,E,S,c,v,++**)_#P%D&:&2&+&&%#$$$%')+ -/ 00111#2,262B2O2_2r1100//Z'L(@)7)/))(%'!&'(*,. 024 5 6788 8(829=9K9[8n877655U*H,=,4,-+(*$)*+-/ 1 468:; = >@@@$@.@9@G@V@i@?>=<<P/C/9/2/,-', -/13 6 8;=@ACE FHJJJ(J4IBIQIdH{HGFEDJ3?36301*0#1358 ;>ACFHJLNO QTUU"T.T<TKS^StRQPONE7<756/4&57:= ADHJMPSUWX[] _bbb'b4aE`W`m_]\ZYA<:;49*:!<@C GKOSVY\_acegjm psr r-q=pOoenmkih?@9>.?$BFJ OTX]aehknqsux{~ $4F]v~|z?D3E(HLR W]chmqvz~ )<Rl8K,N SY `gntz 0F`~1U$[aiqy %;TqȒų)biq{ /Ie&0:BIPV\bhov  *3;CIOU[`gnv #,4;BHNSY_fnw~%-4;AFLQW^eny|vsr &-4:?EJPV^f~q|}ywusrnige  }&z-w3u8t>rCpIoOmVl^jhhugedba`\[Z~xsom lkkj h&f,e2c7b<`B_H]O\WZaYmW{VUSRRPOOxngc`]\ [[[Z!X&V,T1S6R<QBOINQM[KfJtIHGFFEEExlb[VSQOO NNML!J&I,H1G7E=DDCLBU@`?n>~=<;;;;<~naXQLIGED CCCB@"?'>,=2;8:?9G8P7[5h4x3211123vfYPIC@><;: :9976#5(4.342;0C/L.W-d,s+*))))*n_ S J B = 9 6543 2110/.$,*+0*7)?(I'T&`$o#"!!!!"{ h Z NE=8 3 0 . - -, +*)('!&'%-$4#="F!Q]lu dUJ@93/,)' ' ' & %$"! $+2:DO\k}q_QF=60+(%#"! !     " ) 1 9 C O \ k ~  m\NC:2-(%"  !(09DP] k |  iXK@70*&" %.7 @ K X gxeUH=4-(#   " ) 2 <GTcuaRE;2+%!   &/8DQ`r^OB8/)#     !#!+!5!@!N!]!o! ZK?5-'" ! " # $%%& &(&2&=&J&Z&l&%%$##UG ;N;`:w98765G);*2*+)%'!&'(*, /1468;=?A CEEE!E,D9DHD[CqBA@?>B-8./-)+$**,. 1 47:<?ADFHJL NPPP'O4OCOUNjMLJIH>251./). .137 :=@DGILOQSUXZ ]_^ ^,]<\N[cZ~XWUT:634-2$369=AEILPSVY[]`behk oon%m4mFk[juhfdb8927(9;?DIMRVZ^behkmpsvy} ,>~T~k{zwu8=,>"AFKQW\bfkotx{~ !3Ib1D%HMSZahnty (>Vs*OT[ bjs{2KfƇ©"[b kt}'?[z ",5=ELRX^djrz %.7>EKPV\bjr|'/7=DIOU[ais{vt  (/6<BGMSYaju|smjh !(/5:@E~K|RzYxbvltyrqomle`^\|zx wxwt!r'p-n3l8k>iDhJfQdZcdap_^]\[WTRQtnjfec ccca!_'],\2Z7Y=WCVKUSS\RhPwONMLKIGG|ne^YWUTS STRQ!O&N+L1K7J=IDGLFVDaCpBA@??>=>ocYQMJHGG FFGED!B&A+@1>7=><G:P9[8i7z6554445teXOHC?=<<; ;;:97!6&5,42391A0K/V.c-s,,++++,l]QH@;74322 2 110/-",(+.*5)=(F'Q&^%n$##""#$weVKB:50-,+*) ))('&%$$*#1"9!C NZi|p_Q F = 5 0 + ( %$## " "!  &.6?JWfxk[ M B 9 1 , ' # !     #+3<GTcug W I>5.($           ! ( 0 : E R a s      c SF;2+%!        ' / 9 E Q ` q      _PC8/(#      $ , 6AN]o\M@6-&!      !)3>KZlXI=3+$     '0;HXjUF:0("     $-8FUg}QC7.&         !!*!5!B!R d zM?4+$  !# %&&&'''2'?&N&`&w%$#"!H<1("  !#%') , ....#...;.J-\-r,+*)(D 8!.!&!  !#%'),.03 5 6666)666E5W5m4210/?$4$+$$#!  !# %(*-/2479;> @AA@%@1@@?R>g=<:98:(0()'#%#$%( *-0368;>@BEGJ MMLL+K:JLIaH|GECB6,-+')#'(*- 037:=@CFHKMPSVY [[Z%Y4XFWZUtTRPO30,.',-/2 6:?BFILORUXZ]`cgk lkk,i=gRfjda_]13,1"259 =BGLPTX[_behknquy} $~5|I{axvsp16&8;@ EKQV[`einrvy|~+@Ys+> AG MT[ahnsy~!5Mi#HNT\dmu| )A\|U\enw6Qn߱  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C#K2UE^Zepl׺p̲tëvy·}˱ӫܥ楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗楗%0:C"K2TE]Zdqjo˸r±twĴ{ͫԢۙᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚᙚ%0:C"K1TE\[cqimɿpruëxʢ|љؐݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐݐ%0:C"K1SE[[argknqsvȚyΒ~ԉ؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉؉%0:C!K1RDZZ`rejmprtĔwʋ{τԄԄԄԄԄԄԄԄԄԄԄԄԄԄԄԄ%0:B!J0RDXZ^rdiloprvƆz%09B J/QCWZ\qdiknoqtx{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}{}$0 9BJ/PBUY[pchkmoqt}ww|w|w|w|w|w|w|w|w|w|w|w|w|w|w|w|w|$0 9BJ-O@SY[ocgjmoqszwt{t{t{t{t{t{t{t{t{t{t{t{t{t{t{t{t{$/ 8AI+M@RXZmbgjmoq{tvwq{q{q{q{q{q{q{q{q{q{q{q{q{q{q{q{q{$/ 8AI(L@QWYkazgknp}sxusxn|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|n|$/ 8AF(LAPUXfatg~korzuuxq{l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~l~#- 6 =F*K@OQX`akhtm{qytuxr{n~kւkւkւkւkւkւkւkւkւkւkւkւkւkւkւkւkւ#,/;E+I=NLWXaaiionytruwuqzwn}yk{i|i|i|i|i|i|i|i|i|i|i|i|i|i|i|i|i|""':B*F9MEVObV~j\wp`sucoxem|gjhhjfkfkfkfkfkfkfkfkfkfkfkfkfkfkfkfkfk& :>'D3K=UE|aKujOppRluTjyVh|WfXdZc[c[c[c[c[c[c[c[c[c[c[c[c[c[c[c[c[ & 6;#A,J4xS:q_?liChoEetGcwHb{Ia~J_J^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K^K"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8AI+S<]Ofcowuؤ{Λȓŷ˴}ϮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮyѮy"- 8@I+R<\Oedmxsըy̟}ŗŶ̲ү֧~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~ӧ~"- 7@I+R<[Pddlyrӭwʤzœ~÷ʲҮئڡաաաաաաաաաաաաաա"- 7@H+QG(N9TNYe`{fjmoruxz}tqqqqqqqqqqqqqqq!, 5>G'M8RLWd_zfjloqt|wv|qnnnnnnnnnnnnnnn!, 5>F%M6OLUc_xeiloq~txws{nkkkkkkkkkkkkkkk!, 5>F"K4OLTb^tdimorzttxp{khhhhhhhhhhhhhhh!+ 4 =EI5NLS_]pd}inq{tvwqym}iŁfąfąfąfąfąfąfąfąfąfąfąfąfąfąfą *3 <BI5MJR[]ietj}o|swwszo}lрhЄeχeχeχeχeχeχeχeχeχeχeχeχeχeχeχ )13 B!H5LFQU]`ejlq}qvwvzsy}o|l߀iރg݇e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉e܉%"2A"E3JAQM]Vf^}ndvshrxkn|mlojpgresctctctctctctctctctctctctctctct1>"B/H:PD\K{gQtnVosYlx[i|]g^f_d`baababababababababababababababab 2:?*F3O:x[@qfElmHhsJfwLd{MbNaO`P^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q^Q  05<$|D+sM1lX5gc9ck;aq=_u>]y?\|@[AZAYBXBXBXBXBXBXBXBXBXBXBXBXBXBXBXB+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>G&Q4[EeWohxyےԋυˀ|yvtqooooooooooooo+ 6>F%P4ZEdWmiw{}ٖюˈǂ~zwuµqórrrrrrrrrrrrr* 5=F%O4YFcXlku}ߣ{՛͒Nj…|ùyǵvʭuƫvīvīvīvīvīvīvīvīvīvīvīvīv* 4=F%N4XFaYjlsݨxӟ~ʖĎŷ˴|ϫxϥyȤyƤyƤyƤyƤyƤyƤyƤyƤyƤyƤyƤyƤy* 4=E%N4WF`YimqܬvФ{Țŷ˴βѤ|џ}ʞ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}Ȟ}* 4<E$M4WF_YgnoڱtϨyş}Ƶ˯ϪҞә̘ʘʘʘʘʘʘʘʘʘʘʘʘ* 4<E$M3VF^Zfomٶsͭwĥ{Ʈ̨ϢҙӔ͓˓˓˓˓˓˓˓˓˓˓˓˓* 3<E$L3UF]Zeolػq̲uí|ƨˡЛӔԏΏˏˏˏˏˏˏˏˏˏˏˏˏ* 3<D#L3UE\ZdojoʹtzƢ˛ϕҏԊΊ̊̊̊̊̊̊̊̊̊̊̊̊* 3<D#L2TE\Zbphmżsx}ŝ˕ϏҋӆΆ̆̆̆̆̆̆̆̆̆̆̆̆) 3;D#L2SEZZ`pflqw|ŗʐΊхҁ΁́́́́́́́́́́́́) 3;D"K1RDYY_pdjoty}Ðȉ̃~}|||||||||||||) 2;D!K1QCWY]ocimptx†}ƀzvvwwwwwwwwwwwww) 2;C K/PBVW[nchlnqt~xw|rmmnnnnnnnnnnnnn) 2:CJ.O@RWZmbgknqtywt{njgfffffffffffff) 1 :BJ+L?QVYka|gknq{tuxp{lhdccccccccccccc(0 9BG(L@QUXhawglo~sxvryn|ifbaaaaaaaaaaaaa'/ 8 AF*L@PSWcapg{mqzutyp|lh̃dˈaʍ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ`ɏ&-4<F+J>OOW\ahhqnx{s}uxq{mjڃgنd׋a֐`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց`Ց#&)<D+H;MIWTa]je|pjvvnqzqm~tkvhwfycza|`|`|`|`|`|`|`|`|`|`|`|`|`|( ;A)F6LAVKaR{kWtq\ov_l{aicgdefcgah_i_j_j_j_j_j_j_j_j_j_j_j_j_j ) 9>&D0K9T@xaFrjJlpMivPf{QdScTaU`V^W]X\X\X\X\X\X\X\X\X\X\X\X\X\X )4:!A)zI0rR6l^:hh=do@atA_yC^}D]E\E[FZGXGXHXHXHXHXHXHXHXHXHXHXHXHXH* 06w>"nG(fP,aZ/]d1[l3Yq5Xu6Vy6V|7U7T8S9R9R9R9R9R9R9R9R9R9R9R9R9R9R9) 5;D!N-YFI3NIT]\nc}imq{usxn|ieb_^^^^^^^^^^^^$,4 =BI3NHRZ[icvio~swwq{lhʃdɈaǎ^ƕ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ\ƛ#*25 BH4LFQU[bdmkvp}yuszn~kׂgՆdԋaӐ^і\ћ\ћ\ћ\ћ\ћ\ћ\ћ\ћ\ћ\ћ\ћ\ћ!&%3B!G3KBPO[Zecljzrptxto|wlzh|f}c`^ߖ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ\ޚ3@"D0I=PH[PeWzm]tsaoydk~ghifjdlbm`n]p\q\q\q\q\q\q\q\q\q\q\q\q 3< B,H6O?ZFxeKqmOlsRiyUf~WdXbYaZ_[^\\][^[^[^[^[^[^[^[^[^[^[^[^  39?&F.zN5sX:mc?ilBerDbwF`|G_H]I\J[KZLXMWMWMWMWMWMWMWMWMWMWMWMWM! .4; vC'mL,fT0b`3^i5\o7Zt8Yy9X}:W;V;UR>R>R>R>R>R>R>R>R>R>R>" )~0s8i@bI#[Q&WZ(Ub*Ri+Qo,Ps-Ow.Nz.N}/M/L0K0K0K0K0K0K0K0K0K0K0K0K0K0(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛ICC_PROFILE (4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(4:BK'W4bBmOx\gq삓y|xtqomlk˜i̚e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛e˛(39BK'V4aBmPw]hr냒{}xtronlk›iʜfʜfʜfʜfʜfʜfʜfʜfʜfʜfʜfʜ'28AJ'T4_CjQt_~l펈x燏―{wtqomlægæiǡiǡiǡiǡiǡiǡiǡiǡiǡiǡiǡ'1 7@I'S4]ChSrb|pꔅ}㋋݄~zuromikmĥmĥmĥmĥmĥmĥmĥmĥmĥmĥmĥ'0 7@H&R4\DfTpdys瘂ߏوҁ{vspmknppppppppppp&0 6?H&Q4[DdUnewvܔԌ΄}xutpoqsssssssssss&/ 6?G&P4YDcUlgux|٘ѐʇł|ztrtvvvvvvvvvvv&. 6>G%O4XDaVjhszz͔֝ƍ}yvxyyyyyyyyyyy&. 5>F%N3WD`Vhip{ުwП|Ǘ~y{}}}}}}}}}}}&- 5>F$M3VD_Vgin}֬sʣz~&- 5=F$M3UD]Vej߸k~ЯqŦx~%, 5=E#L2TC\Vcjڻi~̲pv|‹Š%, 4=E#L2SC[VajԿh~Ƕntz†„%, 4<D"K1RBYU`jf}¹lrx~€%, 4<D!K0QAXT^ie|kpv|}{yzzzzzzzzzzz%+ 3<D J.P?VS]hc{iotzzwtsttttttttttt$+ 3 ;CJ,O=UQ[gbzgmrx~ytpnmnnnnnnnnnnn$*2 :BI)L;SQZe`xfkpv|xrmjgghhhhhhhhhhh#)1 :BG%K;QPYc_tejosuxn}iea__bbbbbbbbbbb!(08 @E&K;OOW`_of|lqzuszlgDŽcƊ_đ\ęZäZİZİZİZİZİZİZİZİZİZİZİ &.3<E(J;NLV[_hgsm|~rvxp}kԂf҇cь_ϒ\ΙY΢XͫXͫXͫXͫXͫXͫXͫXͫXͫXͫXͫ#&);D)I:MHUU_`hhopxuurzym}ie߉bݎ_ܓ]ۙZڡX٨X٨X٨X٨X٨X٨X٨X٨X٨X٨X٨) ;C(G6LCUM_Vi]ypbsvgn|jjmgodqar_t]uZwXxXxXxXxXxXxXxXxXxXxXx ) ;@&E2KG"R-]:iGtS~_ir}yxtpmkjiȓfϕdѓeԎeԎeԎeԎeԎeԎeԎeԎeԎeԎ&0 5=F!P-[;fHqV|bmw耕zuromkiɞeɞg͘iѓiѓiѓiѓiѓiѓiѓiѓiѓiѓ&/ 4=F!O-Z;dIoXyeqꋌ|䃒}xtpmkf§hƢj˛lΖlΖlΖlΖlΖlΖlΖlΖlΖlΖ&. 4<E M-X;bJlYvhu珉ڀzupmkhkæmȟo̙o̙o̙o̙o̙o̙o̙o̙o̙o̙%- 3<D L-W;`KjZtj~y䓆܋Ճ|wtspknpƢrʜrʜrʜrʜrʜrʜrʜrʜrʜrʜ%, 3;DK,U;_Kh\qlz|ߗՎͅǀ{xvupqtĤuɞuɞuɞuɞuɞuɞuɞuɞuɞuɞ%+ 2;CK,T;]Kf\onvՙ}̑Ŋ|zytuwæyǠyǠyǠyǠyǠyǠyǠyǠyǠyǠ%* 2:BJ+S;\Kd]loۥsΝzŕ~}zy{|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ|Ƣ%* 1 :BJ+R:ZKb^jpөpȠw~}ţţţţţţţţţţ$) 1 9BI*P:YKa^ܵgqάoäu|ĥĥĥĥĥĥĥĥĥĥ$) 1 9AI)O9WJ_]ֹfpɰmszææææææææææ$) 0 9AH(N8VJ^]Ѽeoijkqw~ææææææææææ$(0 8@H'N7UH\\̿coipu{~{}}§}§}§}§}§}§}§}§}§}§$(/ 8@G&M5TF[[bnh~nsz~zxuwx§x§x§x§x§x§x§x§x§x§#'/ 7?F#L2REYZ`lf|lrx~}xtqopr§r§r§r§r§r§r§r§r§r§"'. 6>F K.PDXX^kezjpu|}vqmjijkækækækækækækækækækæ &-5 =DH-OBVV]hcxhnt}zvpkgecdeŤeŤeŤeŤeŤeŤeŤeŤeŤeŤ%,3 <@H.MBUT[eatfl~rvyoƁjʼneŒbĝ_ħ]Ĵ^Ĥ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ_Ƞ#)14 AG.LASRZaanhynzur|k҂eψ`͏\̗ZˠX˫W˺Y̙Y̙Y̙Y̙Y̙Y̙Y̙Y̙Y̙Y̙ %$2 @G/K?QNZZbejn}ruux{o~i݄dۊ`ّ]ؘZ֠X֨VմTTTTTTTTTT1@E.JC+H7OAYI}cPwmVptZkz^hadcae_g]hZiXkVlTmTmTmTmTmTmTmTmTmTm 2;A'G1N9zX?sbEnlIisLfzOcQ`S^T\UZWYXWYUZT[T[T[T[T[T[T[T[T[T[Ϳ!17>"}E)uM0nU5i`9ej_w@\~BZCYDWEVFUGSHRIQJQJQJQJQJQJQJQJQJQJϸ#-3y;pC"iJ'bR*]\-Ze0Xm1Vs3Ty4S~5R6P7O8N8M9L:K:K:K:K:K:K:K:K:K:K:"( v/m7e?^GXN!TW#Q_%Ne&Ml'Kq(Jv)I{*H*G+F+E,D,C-C-C-C-C-C-C-C-C-C-t# i*`2Y:SBNIKQHXF]DcCgAl@p?t >x =| qJ}U^g{nvsrxo}ligƆeψb׊aوb݂ccccccccc}y&|. 2:CL'X3c?nLzWbk~syztpljhƏfђbђdՌeۆf݂f݂f݂f݂f݂f݂f݂f݂f݂}z&, 1 :BK&V3a@lMvZfp삔y{uqmkișd˛eΗgґh؊iۆiۆiۆiۆiۆiۆiۆiۆiۆ~{&+ 1 9BJ&T3_AiOs]~j쌈u煑~xrmlkŠgǠh˛jДlՍlىlىlىlىlىlىlىlىlى~{%* 0 8AI&R3]AgPq_{m參zއ~xtqonkţkȟm͘oґp֌p֌p֌p֌p֌p֌p֌p֌p֌|%)/ 8@H%Q2[AdQnavpܑ~҉˂}xusrpæoƢq˛sГtԎtԎtԎtԎtԎtԎtԎtԎtԎ|%(/ 7?G$O2YAbRkbޞrsҕzʍÇ}ywvvsåuɞwϖwґwґwґwґwґwґwґwґwґ}%'. 6?G#N1WA`Rhd֢pt̙wÒ~{zywyǠz͘{ѓ{ѓ{ѓ{ѓ{ѓ{ѓ{ѓ{ѓ{ѓ~$&. 6>F#M0V@^RݮfdХnsƝu|~}{}Ƣ~̙ДДДДДДДДД~$&- 5=E"L0T@]Qײdc˩lsszŤ˛ϕϕϕϕϕϕϕϕϕ$%- 5=E!K.R?[Qѵccƭjrqw~ĥʜΗΗΗΗΗΗΗΗΗ#%, 4 <DK-Q=ZP͸abhqo~u|æɝ͘͘͘͘͘͘͘͘͘"$,3 <CJ+Q;XOȼ`agpm}sy|zzæ{ɞ|͘|͘|͘|͘|͘|͘|͘|͘|͘!$+3 ;BI(O9WN^`eok|qx~}xussæuɞv͙v͙v͙v͙v͙v͙v͙v͙v͙ #*2 :AH%M8UL]^cnj{ov|{vqnlmæoɞp͘p͘p͘p͘p͘p͘p͘p͘p͘")08@F K6TK[\blhxnsz{uokhffŤhʜi͗i͗i͗i͗i͗i͗i͗i͗i͗!'/6 >CJ4RHZZ`ifvlr{xtnieb`_Ša̚bϕbϕbϕbϕbϕbϕbϕbϕbϕ %+18C I3QFXW^edrj||ptwn~hÇc_\[³ZŚ[ϕ\ґ\ґ\ґ\ґ\ґ\ґ\ґ\ґ\ґ!"%7C"H3ODVS]`ck~juup}nwgbЇ^БZМXЧVеUǑVԎV֋V֋V֋V֋V֋V֋V֋V֋V֋&7B#G2L@UM]Xeaylirtol|tgxb{^~[XߧUޱS޾R҃Q܂Q܂Q܂Q܂Q܂Q܂Q܂Q܂Q܂ &8@"F0K!D,J5S>y]ErfJmoNhvRd~UaW_Z\[Z]W^U`SaRaPbPbPbPbPbPbPbPbPb ָ ) 5;B&}I.uQ4o[:ie>enAbuD_|F\HZIXKVLUMSNQOPPOQOQOQOQOQOQOQOQOQگƼ+ 18y@ pG&iO+cX/_b2\k4Zr6Xx8V9T;RN>M?K@JAJAJAJAJAJAJAJAJAȵ & -u5l=eD^L"XT%U]'Re)Pl*Ns+My,L-J.I/H0G0E1D2C2C2C2C2C2C2C2C2C2 }!r( h0`8Z@THOOLWI]Gc Ei Do!Bt"Az"@#?$>$=%<%;&;&;&;&;&;&;&;&;&znd# \+ U3O;IBFIBO@U>Z<_;d9h8m7r6w5|43222222222pl)i3 r7 y>}GQ!~_)|m2y{9v@sEpJnNkQiShUfWcYa[_\^]\^[_Y`Y_Y_Y_Y_Y_Y_Y_Y_pl)i3 r7 y>}GQ!~_)|m2y{9v@sEpJnNkQiShUfWcYa[_\^]\^[_Y`Y_Y_Y_Y_Y_Y_Y_Y_pl)i3 r7 y>}GQ!~_)|m2y{9v@sEpJnNkQiShUfWcYa[_\^]\^[_Y`Y_Y_Y_Y_Y_Y_Y_Y_pl(k1 u6 {<FP!^*~k3{x;xBuHrMpQmTkWiZg\e^b_`a^b\c[dZdZbZbZbZbZbZbZbZbqm(n0 x4 ;DN![+h4u=|EyLvRrVoZm^jahcfecgai_k]l[m\h\g\g\g\g\g\g\g\grn(q. {2 :CL!Y+e5r?~H|PyVu\r`ndlhikgmdpar_s\t\q^l^k^k^k^k^k^k^k^kso't-~1 9BK!V+c6oA{KS|[xatgpkmojshvexbz_|]{_v`p`n`n`n`n`n`n`n`ntp'v+/ 8@I!T,`7lCwMW`zgvnrsnxk|hf͂b؄_܅`azctcrcrcrcrcrcrcrcrtp&y*. 7?H R,^8iDtP[e}nwur|njgeʍbԎb؊c܄e~fxfvfvfvfvfvfvfvfvuq&|(- 6>G P+[8fEpR{_ꅅj~tx}rmjhhÑgђeԏgىh݂i|jyjyjyjyjyjyjyjyvr&', 5=FN+Y8cFmTwboڀ{zuqnlkk˕iДkՍlۆmm|m|m|m|m|m|m|m|vs%&, 4<DL*W8aGjVre،{sυ|zvspooĘm͘oӐp؉qނqqqqqqqqwt%%+ 3 ;CK)T8^GgWڙogϑxsNJ}zwtsrr˚sГt֌u܄uށuށuށuށuށuށuށuށxv$#*2 :BJ(R7\GޥdXѝmfȕus|}{ywvwʜwϖxԎxۆx݃x݃x݃x݃x݃x݃x݃x݃xx##*1 :BI'P6ZFةcW̡kfšrrz|}{{{ƞ{͘|Ӑ|و|܅|܅|܅|܅|܅|܅|܅|܅yz"")1 9AH&O4ߴYEҭaVǥieprw|~ž̚Ғ؉ۆۆۆۆۆۆۆۆy{!"(0 8@G$N3۸WDͰ`V©gdnqu{|˛ѓ؊ڇڇڇڇڇڇڇڇz} !(/ 7?F"N0ռVCȴ^Ufclps{z~~ʜД֋ووووووووz!'.6 >EL/пTBķ]Sdbjoqzw~}zxwʝyϕy֌y؉y؉y؉y؉y؉y؉y؉y؉{ &-5 =DI.SA[Rbainoxu|{wsqpȝrϕsՌt؉t؉t؉t؉t؉t؉t؉t؉|%,3 ;BH,R@ZQa_glmwtzzupljiślДm֌m؉m؉m؉m؉m؉m؉m؉m؉}#)18 :F*P>XO_]ejktq}xztnifcbØeѓf֋gىgىgىgىgىgىgىgى~!&,19D(N;VL]Zcgiqoyzvs}mhc`^\”^Ӑ_ى`چ`چ`چ`چ`چ`چ`چ`چ  ,;D%L8TI[Wachl{nusu{l|gb^ZXWX׋Y܅Y݃Y݃Y݃Y݃Y݃Y݃Y݃Y݃,;D%K5RDYR`]|fftmnlttf|yaͅ}\̎Y̙V̥T̳SąS݃S~T}T}T}T}T}T}T}T} , <C%H3P@YK~`Tvh\oobhwhcl^ވpZޑsWޛuTާwRߴxPxOxOuOtOtOtOtOtOtOtOt۸ - ;A$G/N:~XCwaJpiPjqUeyYa\]_ZaWcUeRfQgOhNhMhMhMhMhMhMhMhMh ݮ̼ / 9?!F*|M2uW9n`?iiCdqGayJ]LZOXQVRSTQUPVNWMWLWLWLWLWLWLWLWLWδ / 6=xD$pL*jT/e^3ag7]o9ZvV?SAQBPCNEMEKFJGIGIGIGIGIGIGIGIGѮ"+ ~2u:lBeI"_Q%ZZ(Wc+Tk-Rr/Py0O1M2K4J5H5G6F7D8D8D8D8D8D8D8D8D8{' q.h6a>ZFUMQUN] Kd"Ik#Gq$Fx%D&C'A(@(?)=)<*<*<*<*<*<*<*<*<*wm"d* \2U9PAKHHOEVB\@a>guEqKoPlTjXh[f]d`ab^c\e[fZc[`][][][][][][][][ie(n+x. 6?HS%`/l8|yAxItPqVnZk_hbfedhbk_m]n[m\h^d________________jf(q){, 5 >GP%]/i:uD|MxUs\oblgikfocrau`w\x^r_m`hbcbcbcbcbcbcbcbckg't'+3 <EN%Z0f;qF|Q|Zvbqilphudzb~aa_~awbrcmdgdgdgdgdgdgdgdglj&w&*2 ;CL$W0bF M-X<٠aL͘jYőreznv}}ywuttƏu֋v݃v|vtvtvtvtvtvtvtvtou%-5 =EL+߫W;Ҥ_KȜhYodwnv}~{yxxzՍzۅz~zvzvzvzvzvzvzvzvpv%,4 <CK)گU:ͨ^J fXmdun|v}~}}ӏ~ڇ~~w~w~w~w~w~w~w~wpx$+2 :BJ'ԳS9ȫ\IdWkcrmyu|Αو߁yxxxxxxxqz#)1 9@ݼH%϶R8ï[HbVjbplwu~||{ˑ|؉}ނ}z}y}y}y}y}y}y}yq|"(/7 ?F$ʺP7YGaUhankut|{|xvtȑv؊w݂wzwzwzwzwzwzwzwzr &-5 <D#ŽO5XF_Tf`mjsszzzuromŐp؊p݃q{q{q{q{q{q{q{q{s$*15B!M4VD^Rd^khqqxx~ytokhgŽi؊j݂k{k{k{k{k{k{k{k{t %*2 AL1TB\Pb\ifonvuy}{smheb`bوcށezezezezezezezezv0 ?J/R?ZMaXgbmkytqr{wl|gb^\Z[ڄ]^x^x^x^x^x^x^x^xz / =H,P;XI_Te^ylfrrlkzrfvaz\}YWUUVzXuXtXtXtXtXtXtXt 1 =F'N7VD]OzdXrj_kreeyj`ɂo[ɋrWȖuTȢwRȯxQxPwQsRoRoRoRoRoRoRoRo ߮м 1 =D&L3T>{\GscOkjVer\`z`[كdWٌgSٗjP٣lNٱmMmLlMjNgNgNgNgNgNgNgNg Ѵſ"3;B$I.{S6s\>ldDglIbtM^|QZTVVSYQZN\M\L]K]J\J\J\J\J\J\J\J\Ԭŷ$2:A xH'pP.jZ4ec8`k<]t?Y|BWDTFQHOJMKKLJMIMHMHMHMHMHMHMHMHMڣDZ'/ }7t?lG fN%`W)\`-Yi0Vq2Sx4Q6O7M9K:I;HD>D>D>D>D>D>D>ˬ$z, p4h<aD[KVS S["Pc$Mk&Ks'Iz)H*F+D,B-A.@.?/>0>0>0>0>0>0>0>0 v l( d0 ]8W@QGMNJVG\DcBi@p?x=; :!8"7"6#5#5#5#5#5#5#5#5#} rh_#X+ Q3 L: GACH@N=T;Z9_7e5k3r1z/.,+********xn cZRK$F,A3 <: 9@ 5E 2J 0P .T,Y*^(d&j%q#x" \"W-X3_6 c= eFfPe^dn"a|'_+^.\1[3Z5Y6X7X9W9V:U;TU>T?S?R@R@R>R>R>R>R>R>R>]!X,\0d3 h: kClNlZjj$gx)d.b2a6_8^:]<\>[?ZAYBWCVDUDTETETDTBTBTBTBTBTBTB^!Y,_.f2 l8 oAoLqWng%ku+h0e5d9b<`>_A^B]D\FZGYHWIVJUJUJVGVEVEVEVEVEVEVE^!Y+b-j0o6 r@tJuUrd&or-l3i8fxHyRw`'tn.p{5m;jAgEeIcLaN`Q^S]U[VZXXYYVZS[O[M[M[M[M[M[M[M` ])h)q+x3 |<}F~P}](yj0uv8q?mEjKgOeSbV`Y_\]^\`ZaZ`[[\W]S^Q^Q^Q^Q^Q^Q^Qa`'k&u)|1 :DMY(f2zr;u~CqKmQiVf[c_`c^f\i[kZk\f^a_\`XaUaUaUaUaUaUaUbc%o$y(0 9BKV(b3n=zyGuPpXk^fdci`m_o^p^q]q_kafbac\cXcXcXcXcXcXcXcf#r"}'. 7@IS(_4j?tKx~Ur^mejjgmepcsbtauavcqdjeef`g\g\g\g\g\g\g\ch!u %-5 >GO([4fAoN}yXw`sgollpisgvfxeyeyfvhoiiicj_j_j_j_j_j_j_dk x$,4 <EM'Y4bB׉lN΃uX}~axhtmprnulxj{i|i}jzlrllmfnbnbnbnbnbnbnbem{#*2 ;CK%V3ږ`AώiNLjrXza}hynusrwpzn}m~mn~pupoqhqdqdqdqdqdqdqdeo~")1 9AI#ޡT1Қ^@ȓgMoXwah}nzswxt{s~qqr؁txtqukufufufufufufuffq!(/7 ?H ئR0̞\@×eMmWta|hn~t{xy|wvuvтxzxsxlxhxhxhxhxhxhxhgs &.5 =߯FҩQ/ǢZ?cLjWr`yhntx}||zzz̓|||u|n|i|i|i|i|i|i|igu%,4 ;۳DͭO.æY>aKhVp_wg~nsx|ʄ}vojjjjjjjhx#*19 շBɰN-W=_JgUn_uf|msx|}{yDŽz{w{p{k{k{k{k{k{k{kiz!'.޽5 к@ĴL,V;^IeTl]sfylrw|{wtrăttxuqvlvlvlvlvlvlvlk}#)0 ˽?J*T:\GcRj\qdwkq~vy{t~pmkmnxoqplplplplplplpln!-=I(R8ZEaQhZobui~|oxtsyn|jgeehxiqjljljljljljljlq+;G&Q6XC`NfXm`~sgwzlrrlvhyd|`}_~^}avbpclclclclclclclt (9E#O3W@^KdT~k\wqcqxikmfrau]x[yYyXyZs\n]j]j]j]j]j]j]jy ܮһ %6B L/T<\GbPwiWpp^jwceh`l\oXqUsSsRsToVjWgWgWgWgWgWgWg ҳɾ#3 @J*R7ZAxaJphQjoWdv\_`ZňdVĒgSĞiPĬjOļkNjOhPdQaQaQaQaQaQaQa Ԫȶ %5 >H%P0xX:p_BigIcnO^vSYWUӉZRӓ]OӠ_Mӭ`KԾ`J`K^L\LZLZLZLZLZLZLZڢʯ (4=D"wN*oW2i_8cg=_oBZwEVISKPNMPKQIRHRHRHQHOHOHOHOHOHOHOͩ *3|;tClK#fT)a]-]f1Yn5Vv7S:PK@IAGBFCECDCDBDBDBDBDBDBDBѢ (y1 p9iAbI\P WY#Tb&Qj(Os*L{,J.H/F1D2C3A4@4?4?5?5?5?5?5?5?5Ī~u%l- d6]>XERMOUL\IdGkDs B|"A#?$=%;&:&9'8'8(8(8(8(8(8(8(zpg!_)X1 R9 MAIHEOBU@\=b;i9p7y5320//.......vlbZS$M+G3 C: ?A ;G 8M 5S3X1^/d-k+s)|'%$#"""""""~pg] TMGA$<+72480=-C*H (M &R $W "] c k s |          R%M/Q2W5Z< [EZOY]XmV{U"S%R'Q)P*P+O,O-N.N.N/N/M0M0L0L0L/L/L/L/L/L/L/S$M/T0Y4]: _C^N]Z[jZy!X$V'U)T+S-R.R/Q0Q1P2P2O3O3N4N4M4N2N2N2N2N2N2N2S$N.V/\2`8 bAbL`X_h]v"[&Y)X,V.U0U1T3S4S5R6R7Q7Q8P8O8O7P5P4P4P4P4P4P4T#P-Y-_0c6 f@fJeUceas#^(\,[/Y1X4W5V7U8U9T:T;SkHjShafp%c}*`/^3\6[8Z:XW?VAUBUCTDSDTAU?U\A[CYEXGWHVJVKULVJWFXCY@Y?Y?Y?Y?Y?Y?W"Y'c&k(q0t9 uCuMuY!qg)mt0j6fHR!~_+yk5su>nFiMeTaY_\]_\a[b[cZc\`_Z`UaQbMbKbKbKbKbKbKY!b nx#+3 <EN![+~f6xpArzKmRiXf\d_bb`d_f^g^h_fc_dYeUePeOeOeOeOeOeOZ eq|")1 :CL X+b7~lCxvLsSoYk^ibfeehcjbkblbkfdg]hXiSiRiRiRiRiRiR[ gt '/7 @IU*ۊ_7фiC}rLx{TtZq_ndkgijglfnfofojhkal[lVlUlUlUlUlUlU\jw%-5 >FޖR)Ґ\7ʉfBÃoL~wTy[u`rephmllnkpjqjqnkodo^pXpWpWpWpWpWpW^lz#+3 ;EכP(̔Z6čcBlLtT~|[z`wetirmppornsosrnsfs`sZsYsYsYsYsYsY_n}")09 ޥCџN'ǘX5aAiKqTy[`|eyjvmuqssstsuvpwhwbw\wZwZwZwZwZwZaq &.6 ة@̣L&œV4_@gJoSvZ~`e}j{nyqxtwuwvzr{j{d{]{\{\{\{\{\{\cs#*2Ҭ>ǦK$U3^?eJmRtY{`ejn~q}t|v}|v}~ske~^~]~]~]~]~]~]eu &۴.ί=êI#S1\>dIkQrYy_dinq|tyvwvvtylyfz_z^z^z^z^z^z^gw!շ*ɳ;H"R0Z=bGiPpXw^~di~myqvsrupvousmsft`t_t_t_t_t_t_izݹϺ(ķ9F P/X;`FgOnVu]|c}hxlsporltjuiulmmgn`n_n_n_n_n_n_l} տʾ&7DN-W9^DeMlUs[|zawfrjmniqfscsbsflgfh`h_h_h_h_h_h_o ڭ Ӹ #5BL*U7\AcJjR|qYvx^pckggkcn_p]p\p_kaeb`b^b^b^b^b^b^s ۥѱ˻ 2 @J'S4Z>aG|hOuoUovZj}_ecag]jYkWlVlXhZc[^\]\]\]\]\]\]x ߜҩɴ¾/ =H#Q/X:|_CufJomPitUd|Z_^[aWdTeRfQfRcT_U[VZVZVZVZVZVZ~ ֡ʭ +:EN*}V4u]=neDhlIcsN^{SYVUYR\O]M^L^L\NYOUPUPUPUPUPUPUݘͦ (7B}K$uT-m\5gc*=+;+;+:+:+:+:+:+:+:+~wog&`/Y7 T?OGKNGVD]Bd@l=u;~9765332 2 2 2 2 2 2 {r jaZ"T*N2I: EA AH >N;U8[6b4i2r/{-+*)('''''''zmd\TMH$B,>3:96@3E0K .Q +W )] 'd $l "v yk_VN GA<7$2*/0+6';%@"E JPV\dmw         I'D1K1P4R:RC QNO\MkLyKIHH G!G"F#F#F$F$F%F%F%F%F%F%F$F#F#F#F#F#F#I'F/M/R2U9UB TMRYPhOwNLK!J"J#I$I%H&H&H'H'H(H(H(H(H(H'H&H&H&H&H&H&J'H-P-U0X6Y@ XKUVTfRtQO!N#M%M&L'K(K)K*J*J+J+J,J,J,J+J)J(J(J(J(J(J(K&K+R+X.[4]> ]IZTYbWqU~ S#R&Q(P*O+N,N-M.M/L0L0L1L1L1M/M-M+M+M+M+M+M+K&N)V)\+`1b; bF`Q^_\mZz#X&V)U,S.R0Q1Q3P4O5O6N7N8N8O5P3Q1Q/Q/Q/Q/Q/Q/L%Q'Z&`(e/h9 hCgNeZbh _v%]*Z.X1W4U6T8S:R;Q=Q>P?P@Q>S;T8U5U3U3U3U3U3U3M$T$]#e%j-m6 n@mKkVhd!eq(b}-_2\6Z:X=W@UBTDSFRHQIRHTDV@X=Y:Y8Y8Y8Y8Y8Y8N$X!a j#p+s4 t>tHrRo_#kl*gw1c7`=]AZEXIVLTNTPTPSQTNWJZE\B\>\<\<\<\<\<\HT"~_.xi8ss@n|GkLhQeTcWbZ`\`^_^__bYeSgNgJgFgFgFgFgFgFWdp{"*2; DފQ!Ԅ\-~f8xoAtwHpMmRjVhYf\e_d`cacbe]iWjQkLkIkIkIkIkIkIYgs~ '/8 B֏N ̉Y-Ńc7}k@ytHu|NrSoWm[k^i`hcgdgdiamZnTnOnKnKnKnKnKnK[iv$,4ܚ?ϔLƎW,`7i@~qHzyNwStXq\o_mbldlfkfmdq\rVrQrMrMrMrMrMrM]ky!(0՞=ʘJT+^6f?nG~vN{}SxXv\t_rcqepgpgpft^vXvRvNvNvNvNvNvN_n{#ݥ+ϡ;ŜHS*\5d?lGsMzS}Wz\x`vcufthththx`zYyTyOyOyOyOyOyOap~ר(˥9FQ)Z4b>jFqLxRW\}`{czf}yh{yizyi||a~~Z~}U~}Q~}Q~}Q~}Q~}Q~}QcrߪѬ&Ǩ7 DO'X3`=hEoLvR}W[_~czfw~hu~is~ivbx[xVyQyQyQyQyQyQeuٯ̯$«5 CN&V1^;fDmKtQ{V[|_xbteqhnimiocr\sVsRsRsRsRsRsRhx ޠ ֩ Ҳ Dz"3 AL$U0]:dBkIrPyU{Zv^rbnekghhghicl\mWmRmRmRmRmRmRk{ ֣Ь ˵ 1 ?J"S.[8b@iHpNzwSu~Xp\l`hcdebf`fbbe\gWgRgRgRgRgRgRn ٛϦɯĹ/=H Q+Y5`>gEznKtuQo|UjYf]b`^b\cZc[`_[`VaRaRaRaRaRaRr ߓџɪ,:EO(W2^:yeBslHnsMizQdV_Y\\X^V_U_U]XXZT[P[P[P[P[P[Pw֘ˤ(7CL$U.y\6rc=mjCgqHbyL^PZTVVSXPYOYOXQTSPTMTMTMTMTMTM}ߏΝè#3 ?IyR(rZ0ka7fh.=.=.=.=-=-=-=-=-=-şztm f*_4Z= TEOLLUI]FeDnAw?=; 9!8"7"6"6"6"6"6"6"6"6"wo g`Z'T0O8J@ FH CO@V=^;e8n6w420/.-,,,,,,,uia [TN"I+D2@:+C(I%O#V!]eoz           ugXNHA ;61-")(%-"28=BHNU]g r }        ?*?0D0H3I9HBFM E[CiAw@?>>====<<<<<==========@*A.G.J1L7K@JK HYFgDuCBAA@@??????????@@@@@@@@*C,I,M/O5P>NI LVJdHrGFEDDCCBB B B!B!B!B!B!C CCCCCCCA)F*L)Q,S2T<TG QRO`MoL|JIHG!G"F#F#F$E%E%E&E&E&E&F$F#G!G!G!G!G!G!B(I'P&U(X/Z9ZD WOU\SjQwON!M#L%K&J'J)I*I*H+H,H,H,I*J(J'K%L%L%L%L%L%C(M$T#Z%^,`6`A ^L[WYfWrU~"S%Q(P*O,N.M/L0L2K3K4J4K3M0N-O+P)P)P)P)P)P)F%P!X _!d*f3f= eHbS`a]m Zy%X)V-T0R3Q5P7N9N;MR@QAPBPCPDPCR?U;W7X4Y2Y1Y1Y1Y1Y1M W`io%r-t7sAqKnXjd$en+ay3^8\IS'[0b8i>pDxI~MzQvUrXoZl\k\kYnRqMrHrGrGrGrGrGf u܏Ҙ̡Ȩ-<GQ%Y/`6g=nC}vHy}LtPpTlWiYf[e[eYhRkMlHlGlGlGlGlGi x֒͜Ƥ+:EO#W-_5f;}lAxsFs{KnOjRfUcX`Y_Z^XbRdMfHfGfGfGfGfGl|ފЖȟ(7 CM!U*\2|c9wj>rqDmyHhLdP`S]UZWYWXV[P]L_G`F`F`F`F`Fp֏ʚ$4 @JS'|Z.va5ph;ko@gwDbH^LZOWQTSSSRRUNWJYFYEYEYEYEYEuϓğ 1=H|P"uX*o_0jf6em;`u?\~CXGUJQLOMMMMMNIPFRCRBRBRBRBRB|׌ș ,: {DtNnV$h]*cd0_l4Zt9V|K=K=K=K=K=͒&z5sAlJfSa[#\b(Xj,Tr0P|3Mņ6JĒ9Gğ;EĮ#<$;$:$9$9#9$9$9$9$9$9$~si d_ Y+T5O>KF GN DWB_?g=p:{8653211111111~qe^ YSN'J0E9A@>H;O 8W 6^ 3g 1p .|,+)(''&&&&&&~pdXR MGC">*:2793?0F-M+T([&c#m!y            ~pcUKF@;73#/)+0(5%;"AGNU^htpbTF?94 /+'#!%*/4:@FN V `lx6-9.>.@2@8>A@J>W *C*F-G2F<EHCU Ab ?p=}<;;::::99999::::::::::9+A'F'J)K/L9KEHQ F^DlByA@@??>>>>==>>>>???????=(E$J#N%Q,R6QAOM LZJgHtGFEDCCBB B B!A!B"B"B CCDDDDDD@%H!O S!W)Y3X>VI RUQcOoM{KJI!H"G$G%F&F'E(E)E)F(G&H$I"I IIIIIC"LSY]&_0_:]E ZPX^UjSvQ!O$M&L)K+J,I.H/H1H1H1I.K+L)M&N%N#N#N#N#N#GPW^c#f,f6dA bL_Y\eYp V{%T)Q-P0O2N3M5M6L7L8L8M5O1Q.R+S)S'S'S'S'S'JT\ci l)m2l= iGfTc`_k"\u(Y-W0U3T6S8R:Q;PU?UATBTBUAW[AZCYDYEXFXF[@^;_7`3a1a1a1a1a1S]hpw|$-;zIuTq_$mh+jp1gy6e:c=a@`C^E^G]H]I\I_Db>c9e6e3e3e3e3e3U`kt{އ'ф7F{Qv[#re+om1lu6j|:h>fAdDcGbIaKaLaLcGeAgm:n7n7n7n7n7Ye q z ݎϏ ƍ2AMV"|_*xg0uo6sv:q}?oBmFlIjKjMiOiOjLmEo?p;q8q8q8q8q8[gs}ކٌ Ց ʒ0?JT!])}e0zl5ws:u{>sBrFpIoLnN|mO{mPznM|qF~sAt=u:u:u:u:u:]jvىҏϔ Ŗ.= HR [(c/~j5|q9zx=xBvEuI|sLyrNvrPtrPtrOvuGxwBzx>{y:{y:{y:{y:{y:_ lyރӋ͒ɗ,; GPY'a.h4o9v=}~A}{EyzIvxLswNpwPnwPmwOpyHr{Ct|>u};u};u};u};u};a o|نώȕÚ*9 ENW&_-f3m8t={{AwEtHp}Km|Nj|Oh|Pg|Pj~ImCn?olBhFeIaK^M]N\M^H`Cb?cHQ ~Y'x`-sg2on7ju];];];];];n~΋ĕ .; F~NxV#r]*md/ik4ds8`{<\?YBUESGQGPGQDS@UΨ&<κ&<&<%;%;%;%;%;%;%;%Óyod ^[ W-S:PDLN IW F_ChAq>|<߉:87665444444ymbXUQ M+I5E>BG?O=X :` 8j 6t 320.--,,,,,,,yl`UN JFC'?0;88@5G3O0W._+i)t' % $ # " ! ! yl_RHC?;7!4)00-7*>'D%K"S \frzl^PD<73 /+(!%'!-28?FMV`l {    {l^OB61,'# !&,1 7 >FOYft./3,7-80764?1K/X,f*t ) ( ( ( ( ' ' ' ' ' ( ( ( ( ( ) ) ) ( ( ( ( ( 0-6*9*;.:48<6I3V1c /q -~ - , , , , , , + , , , , , , - - - , , , , , 2+9(=(?*>0=:}==<<;;;;;;;;;<<======="DIMP&Q0P;NFKS H`FlExDCBAA@@????@@ABBBBBBB@HNRV#X,W7UBRM PZMgLrJ}HGFE D"D#C$C%C&C&D$E"F GGHHHHHDLRX]_(^2]=ZI WUUbRmPwNL"K$J&I(I)H*H+H,H,H+J(K%L"M MMMMMGOV^be$e-d8aC _Q\]XhVrT{"R&P(O*N,N.M/L0L1L2L1N-P*Q'R$R"R"R"R"R"JS[bhjk(k2i>fL bX_c\m Zv$X~(V+U.S0R2R3Q5Q6P7P7R3T.V+W(W%W%W%W%W%MV_ glpq"q,p:lH hTe_bh!_q&]y*[-Z0X3W5V7V8U:U;U;V7X2Z.[+\(\(\(\(\(PY c k ptvw%v6rD nPk[gd!em'bu+`|/_2]4\7[9Z;Y=Y>Y>Z;]5^1_-`*`*`*`*`*R\ f n t x{| {3wA tMpXla!ji'gq+ex/d3b6a8_;^=^?]@]A^?a8b3d0d,e,e,e,e,U_irx|  ́0|? xKuUq^!nf&ln+ju/h}3g6e9db@aBaBbAd;f5g1h.i-i-i-i-W alu{ӀЃ Dž-< }HyRv[ sc&pk+nr/my3k6i:hyn8zo4{p0|p0|p0|p0|p0[fr{ςɇĊ(8DNW|_$yf*wm.ut2t|6r9|q=yp@voBsnDqnEpnErp?sr9us5vt1vt1vt1vt1vt1]it}˅Ċ&5BLU]$~d)|k-zr2}xy5zw9vv HQY!`'{g+wn0su4o}7k;h>eAb~C`~D_~D`@b:d6e3f2f2f2f2dr~LJ .; FOWz^%ue*ql.ms2i{6f9b=_?\AZBYBZ?\:^6_2_2_2_2_2hv͂Œ +8CLyTt\"pc'kj,gq0dy3`7\:Y=W?T@S@T=V9W5Y2Y1Y1Y1Y1m{ȇ'5@ yJsRnYi`$eg(ao,^w0Z3V6S9Q;O&=&=&=%=$=#=#=#=#=#Ljsh`^[,W8TCPLMU J]GfDoAy?ȅ<ȓ:Ȣ9ɳ887766666th]S OM"K0I<FFDOAX?a5;>9G7P4Y2b0m.y,+ ) ( ' ' ' & & & & & th[OE> <96%4.17.?,G)O'W%a#l!zugZMB851.+)&%-#4 ;CKS]jxvgZL?5-*& # #)/5=E N XetwhZK>2'#   "(.5=GR^m~*-.+0+0..5)=%I#W!dr,+0(3(3+11-:+G(T&a$o"|""!!!!!!!!!""""""""""".(3%6%7'5-482D/Q,^*k)w('' ' ' ' ' ' ' ' ' ' '(((((((((2%7":!;#;);49@6M4Z1f0s. . . - - - - - - - - - . . . . . . . . . . 5";?@B&B1@<>H;U9b7n 6y 5 4 4 43333333444455 5 5 5 5 9?CFI#I-H8EDCP@] >i =t <;;::9999999::;;;;;;;=CHLOP(O3M?JJGW Fd DoCyBA@??>>>>>>?@@AAAAAAAGLRVW$V.T9QEOR M^ KiItH}FEEDDCC C!C!C!DEFGGGGGGDKQW[]]([3Y?WMTY RdPnNwLKJ J!I#H$H%H&H'G'I%J"KLLMMMMGO V \`bc!b,`:^H[T X_ViTrRzQ!P#O%N'M(M*L+L,L,M*O&P#Q RRRRRJR Z ` eghg$f5dDaP ^[\dZmXu W}#U%T(S*R,R-Q/Q0Q0Q/S*U&V#V!WWWWM U]di k lml1j@gL dWa`_i]q!\x$Z'Y*X,W.V0U2U3U3U3W-Y)Z%[#[![![![!O Wahmpp rq.o=lI iTg]debm!at%_|(^+]-[0[2Z4Y5Y6Y6\0]+^(_%_#_#_#_#Q Zdlqtu vv*t:qF nQkZibgi!eq%dx(b+a.`1_3^5^7^7^8_3a-b)c&d%d%d%d%S]gotxyzz(x7vD sNpWm_kg!jn%hu(g}+e.d1c4b6|b8zb9yb9yc4ze/{f+|g(|g&|g&|g&|g&U`jrx{}~~%}5zA wLtUr]pd nk$lr(kz+j.~i1{g4xg6vf8tf9sf:sg6ti0uj,vk)wk'wk'wk'wk'Wcmu{#2~? {JySv[tb ri$qp'~ow+{n.xm1ul4sk7pj9nj:mj:mk7om1pn-qn*qo(qo(qo(qo(Yepx~ 0=H}Q{Yy`wg#|un'ytu*vs}.sr1pq4mp7jo9ho:go:gp7iq2kr-ls*ls(ls(ls(ls(\hs{ .;EOW~^{|e"x{l&tys*qx{-nw0kv3hu6et8ct9at:at8cv2ev.fw+gw)gw)gw)gw)_lv +8C LUz\vc!sj%oq)l~y,h}/e|2b{5_z7]z8\z9\z7^{2_{.`|+a|)a|)a|)a|)boz(6A JzRuZqamh#jo'fw+c.`1]4Z6X7V7V6X1Y-[*[)[)[)[)fs~$2> yHtPoWk^he!dm%`u(]~+Z.W1T3R4Q5P4R0S,T)U(U(U(U(kxƒ ~/x;sE nMiUe\ac^j![r%W|(T+Q.N0L1K1J1L-M*N(N&N&N&N&p}~ zu*p7lA gJ cR_Y[aXhTp Qz#N&K)H*F,E,E+E)F'G%G$G$G$G$w„tol$h2d=_F [O XVT^QfNnKxH E"C$A%@%?%?#@"@!@ @ @ @ ~wjca^,Z8WBSKPS M[JcGkDuB?=;:99999999ymbVSR#P0M;JEGNEWB_ @h =r ;~8Ì6Û5ë333221111{ncXMD CB%@2?==G;P9Y6c4n2z0҈.Ҙ -ө ,Ӿ , + * ) ) ) ) ) |ocWLB9 542'120=.G-P+Z*e(q&%#"!  }pcVK@6/-+)"'+%4#<!ENXdqqcVI=3*&$ !")19AJUa o   rcVH;0&  $ + 2;DO\k}sdVG:.# $+3=IVfx%+()))(,#2;GUbp|()+&,&+)(/"8 DR_ly*&.#/"/%,+*5'A$N"[ ht."243 2&22/>,J*W'd&p%{$$$$$$$$$$$$%%%%%%%%%2688:#9-8:5F2R0_.k-v,,+++++++++,,, , ,,,,,,5:=?AA)@4=A:M8Z6e5q4{3 3 2 2 2 2 2 2 2 2 2 3 3 3 3 4 4 4 4 4 9>AEHH$G/D;BG?T>`>>>>>>?@@AAAAA@F K Q STT"R-P;OIMUK` IjHsG{FEEDCCCCCCEEFFGGGGDJPU X YXW$W5UDTPR[ PeNmMvL}KJIIH H!H"H"H"IKKLLLLLG MTZ]] \]]0\?ZLXW V`TiSqQxPOO N!M#M$M%L&L&N"OPQQQQQIPX^bca bc,b;`H]S [\ZdXlWtU{T T"S$R%Q'Q(Q)Q*R&T"UVVVVVLS\bfhggh(g8eEcP aY_a]h\pZwY!X#W%W'V)V*U+V,W)X$Y ZZZZZNW_fjlklm%l5jBgM eVc^be`l_t^{!]$\&[(Z*Z,}Z-|Z.{[+|\&|]"}^}^}^}^}^PYcjnpppq"p2n?lJ jSh[fbeicpbx!a$`&}_){^+x^-v^.u^/t^-u`'va#wb wbwbwbwbR\fmrtttut/r=pG nQlYj`ighnfu!}e}$zd'wc)uc,rb.pb/ob/nb.od(pe$qf!qfqfqfqfT_ipuxxx yx-w:uE rNpVo^md}lkzks wj{#ti&rh)og,lf.jf/if0hf/jh)ki%li"lj lj lj lj Wblsx{|| }|*{8yC wLuTs[{rbxpiuop rnx#om&ll)jl,gk.ek/dk0bk/dl*fm&fm#gn gn gn gn Yeov|(5~A|J ~zRzxYvw`svgptnmsv#jr&gq)dq+bp-`p/^p/]p/_q*`q&ar#br br br br \irz%3>~H yPu~Wq}^n{ekzlhyt"ex}%bw(_v*\v,Zu.Yu.Xu.Yv*[v&\w#\w \w \w \w `lv~!0~;yE tNpUl\icfjbr _{#\~&Y})W|+U|,S|-R|-S|)U|%V|"W| W| W| W| dpz},x8sBnK jSgZca`h]pZy!V$T&Q(O*M*M*M'O$P"PPPPiu~ yu(q5l?hH dP aW]^ZfWnTwQ N#K%I&H'G'G$H"I JJJJn{upm#i0e;aE]M ZT W\TcQkNtKHE C!B"A"A BBCCCCuyjec`+]6Y@VISQ PY M`JiGrD}B?=<;;;;<<<<|}qdZWU#S0P;MDKMHUE] Ce @o >z;97655444444th\PI HF'E3C=AG?P=X:a8k6w4 2 0 / . . - , ,,,,vj^RG=876'534=3G1Q0[.e,q*)̐'̡&ʹ%%$#####xk_RG=4+ &%%%$0#;#E"P![ hvއߙ߬yl_RF;1)!'09CNZgw {m_RE9/% % - 5 ?JWfw}n`RD7,"  '0:ESbupaSC6*  !)4@N^r )"'"'*09E S ` m y             #&%$%$#',5BP]jv         &#( ( &""( 2?LYeq|*,,+)$(/%;"HTamw-0101 0*.6+C(O&\$g#r#|""""""""""###$$$$$$$146798%613=1J.V-b,m+w+*********++,,,,,,,,59: >@? =*;78D6Q5\4g3r3{222111 1 1 1 2 2 3 3 3 3 3 3 3 3 9= @ D FED#A/?<>J=W>>>>>>?@@@@AAA? DJNPO LLM0M?LLKWIa Hi GqFyFEDDCCCCCDEFFFFFFBGOSUUR ST+T;RHQRP\ Nd MlLtK{JJIIHHHHIJKKLLLLEKSX[[XXZ'Z7XDWOUX T` ShQoPvP~ONNMMM M MOPPPQQQGOW]``^]_#_3^@\KZT Y\XdVkUrTzTSRRQ!Q"Q"~R!~S~T~U~U~U~U~UJR[adecbc c0b=aH_Q ^Y \a[hZoYvX~WW}V!{V"yV#wV$vV$vWwXwYwYwYwYwYLV_ehihg hh-g:eEcN bW a^_e^l]s~\{{\y[vZ!tZ#rZ$qZ%oZ%p[ q\q]q]q]q]q]OYbhlmlk ll*k7iChL fT e[cb}bizapxaxu`s_p^"n^$l^%k^&i^&j_!k`kalalalalaQ\ekoqqoop'o5n@lIjR ~iY{h`wffufnrevpd~mckc"ib$fb%eb&db&dc"edfdgdgegegeS_hosuusst$s2r>pG}oO ymWvl^skdpjlmjski|hhfg"cg$af%`f&_g&_g"`hahbhbhbhbhWbkrwyywxx!x/w;|uExtM trUqq\npckojhnqfnzcm`l!^l#\k%Zk&Yl&Zl#[l\m]m]m]m]mZfov{~~||}}-||9wzCsyK pxS lwZivafuhctoasx^r[r Yq"Wq$Uq%Tq%Tq"VqWqWqXqXqXq^isz {)v6r@nIj~P g}Wd|^a{f^zm[zvYyVxSx!Qw"Pw#Ow#Ow!PwQwRwRwRwRwbnw} xt&p2l=hFeN aU ^\[cYkVtS~PNL J!I!I~J~K~K~L~L~L~gs||uom!i.e9bB^K[R XY VaShPqM{JHFDCCDDEEEEmxylfca)^5Z>WGUORV O^ LfJoGyDB@>===>>>>>ssd\ YW"U/R9PCMKJSHZEc Cl @v>;9877666777{wk_RMKJ'H3F=DFBN@V>_;h9s7 4 2 1 0 0 / / / / / / {ocWKA>=;):49>7G6P4Z2d0o.|,*)(('&&&&&~qeYMB8/ -,+)*3)=(G'Q&\%h#v"Ɔ ƘƫsgZNB8/& %/:DP]k|׏ؤٻuh[NB7-$ # - 7 B O ]mwi[NA5*!  "*4?L\myj\N@3(  &0<IZm{l]O@2&  !+7FXk&$$'- 6CP^kv#!!#)2 @ MZgs}""!$/<IV b n y         %&%! !+7EQ^it})*)'(''#3 ?LXdnx-.. //.!,-)9&F$S"^"i!s!|!!!!!!!!""##$$$$$$$02 36 652%02-?,L+X+c*m*v**********++,,,,,,,4 69<< ;85)473F4R3]3g3p2x222211122 2 3 3 3333337:>AA? <:;1<@DGHF@ BD+D;DHCSB\BeAl@t @{ ? ? >>>>>>??@@ A A A A =CINONIIJ&K6KCJNIWH`Gg Fo Fv E}EDDCCCCDEFFF F F F @GOSUTPOP"Q2Q?PJOSN\Mc Lj Kq JyJIIHHHHHJJKKKKKCKSXZZWTVV.V;UFTPSXR_ Qf PmOtO|NNM~M|MzMyMxNxOxOxPxPxPxPFOW\__\Y Z[*[8ZCYLXUW\ Vc UjTqSy}SzRxRvQtQsQqQqRqSqTrTrTrTrTHS[`cca^ __'_5^@]J\R[Y Z` }Yg{XnxXuvW~tVrVoVnUlUkVkVkWkXlXlXlXlXKV^dghfbcd$c2b=aG`O}_V z^] w]d u\ks\sp[{n[lZjZhYfZeZeZe[f[f\g\g\g\NYagjljggg!g/f;eD{dMxcT ub[ raa paim`pk_yi_f^d^b^a^_^_^`_a_a_b_b_b_Q\djnpnkjkk,~k8zjBviJshRpgY mf` keghdnfdwdcac_b]b[bZbZb[c\c\c]c]c]cU_hnrtsoo o}p)yo5un?rmHnlPklW ik^ fjedilaiu_h\hZgXgVgUgUgVgWgWhXgXgXgXckrvxwss |txt&tt2ps=msFjrNgqU dp\ apc_oj\nsZn|WmUlSlQlPlOlQlQlRlRlRlRl\gov{||xzyuyrz#nz/ky:hyCdxKawR_wY \v` YuhWtpTtzRsOsMrLrJrJrKrLrLrMrMrMr`kt{z~snkh,e7b@_H\~PY~WW}^ T|f Q|nO{xL{JzHzFzEzDzEyFyFxGxGxGxepywkf c`'^3[<XEVMSTP[Nc Kl IvFDB@?>??@@@@kvse] ZX!V-S8QANILPJXG`Ei Bs @ ><:98889999r}zm_TONL'J2H<FDDLBT@\>f;p9|7 5 3 2 2 1 1 1 1 1 1 zrfZNE B@?*>4<>;G9O7X5a3l1y/-,+**)))))vj^RF<5 32!1+/5.>-H,Q+[)g't&$#"!!  zm`UI>3*$ "! !* 3=GR^l|}obVJ>3*! %/:F R ` p ΃ Η ά qdWJ>2(  $.9ERbsވߝ߳seXJ=1&  "+6CRbvugYK</$  '3@QcwwhZL<."  #/>Obw#!!$*3AN\ht~  %0=KXdpzICC_PROFILE ! , 9FS_ku~ (4 A N Zfpy ##!#/;IU`jt|'' % & %# (5BOZenw+ ++- ,)& #-!:HT _ h q!y!!!!!"""##$$$$$$$$//232/+'"'2)A*N*Y*b*k*s*z******+++,,,--,,,238995. /1,3;3H4S3\3e3m3t2{222222223344444458>BB?88:&;6EIJGA?A!B1C>CIBSA[Ab@j@q?x?? > > > > >?? @ @ @ AAA<CJOPNIFHI,I:IEHNGWG^FeFlEs E{ D D DCC~C|D{DzE zF zF zF zF zF >HOTUTPL MN(N6NAMKMSLZKaKhJo Jw ~I |IzHxHwHuHtIsIrJrJ rJ rJ rJ rJ BLSXZYVRRS$S2S>RGQPQWP^~Oe{Ol yNs wN{ uMsMqMoMnMlMlMlNlOlO lO lO lO EPW\^^[VVW!X/W;VDVM|UTzT[wTbuSh sSp qRx oRmQkQiQgQfQeReRfSfS fS fS fS ISZ_bb_ZZ[[,[8}[AzZJwYQtXXqX_oWf mWm kVv iVgUeUcUaU`U_U`V`VaWaW aW aW LV^cffd^^__)|_5x_?t^Gq]Oo\Vl\\j[c h[k fZs dZ}bZ_Y^Y\Y[YZY[Z[Z\Z\Z \Z \Z OYafijhbb ~czc&vc2sc<obElaLjaTg`Ze`ac_i a_q _^{]^Z^X]W]V^U^V^V^W^W^ W^ W^ S]djmnmg~g xgtg#qh/ng9kgBhfJefRceX`e_^dg \do ZcyXcUbSbRbQbPbQbQbRbRb Rb Rb V`hnqsqkxkrknlkl,hl7fl@ckH`kO^jV\j]Yie Wim Uiw ShPhNgMgKhKhKgLgLgMg Mg Mg Zdlrvwvyqqqkqhqfr(cr4`r=^rE[qMYqTWp[TpcRok Pot MnKnInGmFnEnFmFmGmGl Gl Gl _iqw{|{uxkwew ax_x$]y0Zy:XyBVxJSxQQwXOw`LvhJvr Hu} EuCuBu@u@u@t@tAs As As As dnv|re]YW U+S6Q>OFMNKUI]FfD~pB~{ ?~ =} <} :}:~ :| :{ :{ :z :z :z it|{n`UPNM&K0I:HBFJDRBZ@c=m;x97 5 4 3 3 3 3 3 3 3 pzuhZOG DCA*@4?==E;M:V8_6i4u20.-,,+++++xzmaUI?976"4,352>1G0P.Z-d+q)'&$###""""reYNB7.)('"&,%5$?#H"S!^ jyuh\PD9/&!*4>ITbq yk^RF:/%   (2=IWfwƋƠŶ{m`SF:.$ '1<IXi|ֿ֧֒~oaTF9-"  $.:IYkqcUG9,  !+8HZmteVH9+  (6GZn  !'0>LYepz!-:HUalv (6CP\gqz  $0>KWblu}  * 8EQ\fow !  #0>J V ` i q y %##$! '5COYcks{('**'" -< I S!]!e"m"t"|"""####$$%%%%%%%,-243.% %'')6*C+N+W+`+g+o+v+}++++++,,---.---03:=<91.0!203=3I3R3Z3b3i3p3w2222223344444443:ADDA;789+:8;D;M:V:]:d:k9r9z9999999:}:|;|;|;|;|;7@GJKIC> ?@&A4A?AIAQ@Y@`@g?m?u?}>}>{> z> x> w? u? t@t@t@s@s@s@;ELOPOJDEF"F0G<FEFNFUE\~Ec|DjzDqyDywDuC sC qC pC nD mD mE lElElElElE?IPTUTPJIJK,L8KBKJ|JRyJXwJ_uIfsImqIvoHmH lH jH hH gH fI fI fI fJfIfIfICMSXYXUNNOO)P5{P?xOGvOOsNUqN\oMcmMjkMriM|gL eL cL bLaM`M`M `N `N `N`N`NGPW[]]ZSR S|S%yT1uT<sSDpSLmRSkRYiR`gQheQpcQyaQ `P ^P \P[QZQZQ ZR [R [Q[Q[QJSZ_aa^WV zWvW"sX.pW9mWAjWIhVPfVWdV^bUe`Um^Uw\U ZU YU WUVUUUUU UU VU VU VUVUMW^beec\{[u[q[n\+k\6h[?e[Gc[NaZU_Z\]Zc[ZkYYuWY UY TY RYQYPYPY QY QY QY QYQYQZafhig}`u_o_k_h`(f`3c`<a`D__L\_S[_ZY_aW^iU^sS^~ Q] O] M] L^K^K^ L^ L] L] L]L]T^ejmmlxeodidedbd%`e0^e:\eBZeJXdQVdXTd_RdgPcqNc{ Lc Jc Hc Gc Fc Fc Fb Gb Gb GbGbXbinqrqtkiici _i\j!Zj-Xk6Vk?UkGSjNQjUOj]MjeJinHiyFi Di Ch Ai @i @h Ah Ag AgBgBg]fmsvwvpreq\pXpVpTq(Rq3Pq<OrDMqKKqSIqZGqbEplCpwAp?p=o ;p ;p :o ;n;n;m;m;mbksy{|{|mz`xVwPwNxLx$Ky.Iy7Hy@FyHDyOByWAy`?xiC=K;S9\7f5q310.----~-}-}-}nx}pcUKA;98"7,654=3F2O1X/b-n+{*(&%%%%%%%vvi\PD:1-,+$*-)6(?'H&R%\#h"w zmaUI=3*! $-6?JUapqdXL@5*" "+ 5 @ K X gxugZNA5+!  "+6AN\mxj\OB5*   "+5AP`rχϝϳzl^PB5) (4AQcw|n`QC5(  $1ASf|paSE6'  !.@Sh  $.<JVcmw *7ER^ir{ %3@MYdmv}  -:GS^hpx  &4AMXbjry  ,9FQ[dlsz   " 1 > J U^fmt{" #$! )7DNW`gnu|&'-/-'"1 =!H"R"Z#b#i#o#w#~#$$$$%%&'''''')06872+%')+*8*C+L+U+\+c+j+q,x,,,,,,-.....~.~..7=??<5/ /1&232>3H3P3X3^3e3l3s3|333}3|3z3y4w5v5u5u5u5u53=CEFC=668!9.999C9L9S9Z9a~9h|9oz9wy9w9u9t9r9q9o:n:n;m;m;m:m:9BHKKID><=>*?5??~?H|?Oz?Vx?]v>dt>kr>sp>|o>m>k>j>i?g?g?f@f@f@f?f?=FLOPOJDA BC&}D2zD<wDDuDLrDSpCYoC`mCgkCoiCyhCfCdCcCaC`D`D`D_D_D`D`DAJPSUSOIG }GyG"vH.sH8qHAnHIlHPjHVhH]fGdeGlcGvaG`G^G\G[HZHZHZIZIZHZHZHDMSWYXTN}KwKsLpL+mL5kL>hLFfLMdLSbLZaLb_Lj^Ls\K~ZKXKWLVL UL TLTMULULULULHQW[\\YSwOqOnPjP(hP2eP;cPCaPJ_PQ]PX\P_ZPgXPqWP{UPSPRPPP PP OPPPPPPPPPPPKTZ^``]|WrTlShTeT$bT/`T8^T@\THZTOYTVWT]UTeTTnRTyPTNTMTKTKT JTKTKTKTKTKTNW^bddbw[mXfX bX_X"]Y,[Y6YY>WYFVYMTYTRY[QYcOYlMYwKXIXHXGYFYEYFYFXFXGXGXR[afhigr`h^a] \]Z]W])V^3T^;R^CQ^JO^RN^YL^aJ^jH^uF^D]C^A^@^@^@]A]A]A\A\V_fjmmlogdd[bVbTbRc%Pc/Nd8Md@KdHJdOHdWFd_EdhCdsAc?c=cr@=rH;rP:rY8rc6rm4rz3r1r/r.r.r.q.p.o.o.ofovz|~}r}d|W{LzBy)G(P'Z&f$s#! t}~qeXL@6,% #"!% .6@IT`n~}wi]PE9.% $-7ALXg w {m`TH<0& $.8DP^nqcVJ=1&  %/9FTdvtfXK>1&  $.:GWi}ɔȪwhZM?1%  "-9IZn߅ߜ߲yk\N@1$   +:K^sm^PA2$ ):Mbx!+9GT_js{ '4BO[env~  "/=JU`iqy  )7DPZcksz "0=IT]emsz  (6BMW_fmtz -:FPX`gnu{   %2?IRZahov}#(*'!,8CLT\bipw     $,131-%  &!2"="G#O#V#]$d$k$r$z$%%%&~&}'{'y(x(x(x(x(+39;:6/('( )-*8+B+J+R+X,_,f,m},u{,~z,x,v-u-t-r.q.p/o/o/n/n/1:?AA>81./0(132=2F}2M{2Ty2[w2au2it2pr2yp3o3m3l3j4i4h5g5g5f5f5f46?DGGD?94 56$|7/y79w8Bt8Ir8Pq8Wo8^m8el8mj8uh8g8e8d9b9a:`:`:_:_:_:_:;CIKLJE?: {:w; t<+r<5o=>m=Fk=Mi=Sh=Zf=ad=ic=ra=}`=^=]>[>Z>Z?Y?Y?Y?Y?Y>?GLPPOKEz@u?q@m@(kA2iA;gABeAIcAPaAW`A^^Af]Bo[BzZBXBWBUCTCTCSCSCTCTCTCBJPSTSPJuEnCkDgE$eE.bE7aE?_EF]EM[ETZF[YFcWFlVFwTFSFQFPGOGNGNGNGNGOGOGFNTWXWT{NpJiH eHbI!_I+]I4[I<YICWIJVIRUJYTJaRJjQJuOJNJLKKKJKIKIKIKJKJKJKIQW[\\YvSkNdM _L\MZM(XM1VM:TMASNHRNOPNWON_MNhLNsJOIOGOFOEODPDOEOEOENENLU[^``^rWgS^QYQWQTQ%RR/QR7OR?NRFMSMLSUJS]ISfGSpES}DSBSAT@T?T?T@S@S@S@RPX^bee}bn\cYYVTVQVOV"MW,LW4JW<IXDHXKGXSEX[DXdBXn@X{?X=X^a<^l;^x9^7^6^5^4_4^5]5]5\5\Yaglnnvlgi\fQdHb DbBbAc$?c->c5=d=s4r 1s0s/s#.s+-t4,t<+tD)tM(uW'uc%uo$u"u!u uutsr q qksy|~tgZM~C~8}/}(} &}$}#~%"~-!~6!~?HR^kz~|{{{rz{m`TH<2( &.7ALXeu {seYLA4*!   & / 9 DP^nwj]PD8,"  '1<HVew{m`SF9-#   (2>L[lqcUG:-"  '2@O`tËáøseWI;-! &2ASf|ٔ٫vgYK<.!  $2CVkj[L>/   #3FZq(7DQ\fow~$2?LWajry ,:FR\eltz  &4@LV_gnt{  -:EOX`hnt{  %2>IRZahnt{  *7BKT[bhnu{  !.: D M U \ b i o v ~  $%" '3>GOV\cipx}||{{!)-/,' !-8AIPW^dks|}|zxwv t!r!q"q!q!q!(05751+# !'"2#<#D~#K|$R{$Yy$_w$fv%nt%ws%q&o&n&m'l'j(i)h)h)h(h(.6;==93-' '("|)-y*7w*?u*Gs+Nq+Tp+[n+bl+jk,ri,}h,f-e-d.c.a/`/`/`/`/`.4<ACC@:4.z-w.s/)q03o0;m0Ck1Ji1Qg1Wf1^d1fc2oa2y`2_2]3\3[4Z4Y5Y5Y4Y4Y48@EHHF@;y5s3o4l4%i5/g57e6?c6Fb6M`6T_6[]7c\7k[7vY7X8V8U8T9S9S:S9R9S9S9<DILLKF}@s;l8 h9e9"c:+`:4^:<]:C[:JZ;PX;XW;`V;hUM>M>M>M>M=M=@HMPQOKyEn@f= b=_=\>(Z>1X>8W>@U?FT?MS?UR@]P@fO@pN@|LAKAJAIBHBHBHBHBHAHADKPTTSPuJjFaB\AYBWB%UB.SB5QB=OBCOCKNCRMDZKDcJDnIEzGEFEEFDFCFCFCFCFCECEGOTWXX~UqOfJ\FWFTFQF"OF+NF3LG:KGAJGIIHPHHXGHaEIlDIxBIAI@J?J>K>J>J>I?I?IJRX[]\{YmSbOWLQJ NJLKJK(IK0GK8FL?ELFDLNCMVBM_@Mj?Mv=NRT2]F1^N0^W/^b-^n,_}*_)_(_'_'_'^'](](\\djnoyonn`kTiIg?e5c 2c0c/d!.d)-d1,d9+eB*eJ(eT'e_&fk$fz#f"f fff e d c!cbjpsuuuit\rOqDo:n0m)l 'l&l%m$$m,#m4"m=!nF nPn[ngnvnooonmlkkiqvy|{q{d{WzJy?x5x+w"vvwww&w.w7x@xJxVxcxrxxxxwvuutqx|wj]PD8.$ '0 9 D P ] l~y~}obUI=1&  )2=IVevtfYL@4(  "+5@N\nxj\OB6) "+6DScw{m_QD6*  !+8GXk~pbSF8*   +:K^sҋҤӻsdVG9* *<Od|fXI;+  +>Sj&4AMXbksz !.<HS]fmu{  )6BNW`hov| #0<GQZbiov|)5AKT\ciou{ ".:DMU\ciou{ '2=FOV\chou|  *5?HPV\ciov  !  # . 8 A I P W ] c jqz~|{zxvuttt&**(#'2;CKQ~W|^{eylwtv~trqonmkjjjj&-131,& "~,{6y>wEuLsSqYp`ngmpkzjhge d!c!b"a"a"a"a",48985/(!{ w!t"'q"1o#9m#Ak#Hi#Nh$Uf$[e$cc%kb%ua%_&^&]'[([(Z)Y)Y)Y)Y(29=??<60y*r&n'k(#i(,f)5e)<c)Ca*J`*Q^*W]*_\+hZ+rY,}X,V-U-T.S.R/R/R.R.R.6=BDDA<{7r1k, g-d-a.(_.1].9\/@Z/FX/MW/TV0\U0dS1nR1zQ1P2N2M3M4L4L4L4L3L3:BFIIGBw=m7d2 `2]2Z2%X3-V35U3<S4CR4JQ4QP4YO5aM5lL6wK6J7H7G8G8F8F8F8F8F7>EJMMK~GsBi=_7Z6W7T7"R7*P72O89M8@L8GK8NJ9VI9_H:iG:uE;D;C<B<A=A=A=A<A<A<BINPQP{LoFeBZ=T;Q;O;M;'K;/I<6G<=G\C>gB?s@???>@=@Ce=Cq;C:D9D8E7E7E7E7D8D8CIPUXYXvVhP]LSHJE FDDDBD"AE)?E1>E8=E?I=I;J&:J.9J58K=7KD6KM4LV3L`2Ll1Mz0M.M-N,N,N,M-M-L-LPX]ab{ap_b[XXNUCQ;O 8O6O5O#4P+3P22P:1PB0QJ.QS-R],Ri+Rx)R(S'S&S&S&S'R'Q'QU\bfgxfme`aU^J[?X5V1U0V.V-V',V/+W6*W>)WG(WP&XZ%Xg$Xu#Y!Y YYYX X W!WZbgkluljk]hQeFc;`1^*] (]&]%^#$^*#^2"^:!^C _L_W_c`q`````_^^]`hnp|rrrfqXnLlAk6i-g#fffff%f-g5g>gHgSh_hnhhhhhgfeegosvxxmx`wSvFt;s1r'qqp pppq'q/q8qBqN q[ qi qz qqqppo n nouy~|t~f~Y~M~@}5}*|!||| | | ||!|)|2|=|H|U|c|t|{{zyyyxw|yl^QE9-#  #,6BN]m~~qcVI<0$  $.9FUexugYL?2&  %/<K[nxj\NA3&  $0?Pbx{m_PB4&  $2CUj̜̃˵paRD6' $5H\scUF8(%8Mc|#0=IT^fnv|  +8DOYaipw}%2>IS\cjqw}  ,8CMV]dkqv|%1<FOW^djpv| *5?HPW^diou|#.8AJQW]ciov} &1:CJQW]cipw~}{zzyxx  )3<DKQW]c}j{rz|x v t s q p o nmmm#&&$   " ,~ 5|=zExKwQuXs^qepnnwlkihfedccbb$*./-("}yv's0q8o?mFlLjShYgaeidrb~a_^\\ZZYYY*15641+%ysol"i+g3e;dAbH`N_U]\\d[nYyXV U T!S!R"R#R#R"R"/6:<;82z-r&j f c!a!&_"/]"6["=Z#DX#JW#QU#XT$aS$jQ%vP%O&N'L'L(K(K)K(K(K(4;?A@>9u3l-c'^&\&Y'"W'+U(2T(9R(@Q(FP)MN)UM)]L*gK*sI+H+G,F-E-E.D.D.E-E-8?CEEC{>q9g4^.X+U+R,P,'O,/M-6L-<J-CI-JH.RG.ZF/dE/pC0~B0A1@2?2?3?3?2?2?2<CGIIHxDm>c9Z4R0 O0L0J0$I1+G12F19D1@C2GB2OA3X@3b?4m>4{=5<6;6:79797:7:6:6@FKMNLuHjC`>V9M5 I4G5E5!C5(A5/@56?6=>6E=7M<7U;8`:8k99y897:5:5;4;4;5;5:5:CJNQR~PsMgH\DR?H:D9A9?9>9&<9-;:4::;9;B8;J71>0?/?/?/?0?0>0>GMRUV|UqRdLYIOEE@?> <>:>9>#7>*6?15?84?@3@H2@Q1A[0Ag.Bu-B,C+C*C)D*C*C+B+BJQVYZyZnWaRWNMKCG:C 6C4C3C 2D'1D/0D6/E=-EF,EO+FY*Fd)Gr(G&G%H$H#H$H%G%G&GOUZ^_w^k\_XUUKQ@M5J0I.I-I,I$+J+*J3(J;'KC&KL%KV$Lb#Lp!L MMMNMLL KSZ_c~dtcia\^R[GXf3e)c a` ````&`.a7a@aKaX af bv b a aaa ` _ _fmq~suujt\sOrCp8o-n$lkkj j j j! j) j2j<kGkSkakqjjjiiihhmsw{zp{c{VzIz=y1x'wvvv v vvvv$u,u6uAuNu\ulu~ttssrrquz~vi[NA5)  &/;GUex~}}|{n`RE9,!  (2?M]prdVH;." )5CTf{ugYK=0# )8HZoxj\M?1# +<NbzƔƭl^OA2$  -@Tk`RC4%  1F\t ,9EPYbjqw~'3?JT]dkrx~ ".9ENW^elrw~ (3>HQX_ekqw} "-7AJRY_ejpv} &1:CKRX^dipv~  *4<DKRX]cipw  #,5>EKQW]cjqz}{ywutrrrqq  %/7>~E}K{QyWx]vdtkrtpnlkihgff e e  ##  |y(v0t8r ?p Eo Lm Rl Xj _h gg pe zc b ` _ ^ \\[[[!(++)${u q n!k*i2g9e@dFcMaS_Z^b\k[vYXVUTSRRRR(.221-'z!rk gda%_-]4\;[BYHXOVVU^SgRrPONLKKJJJJ-47874}/t)l#d^[Y!W)U0T7R=QDOKNRMZKcJnI|GF E!D!C"C"C"C"C"28<>=:y5o0f*^$W T Q O!%N!,L!3K":I"@H"GG"NF#WD#`C$kB$yA%?&>&='='=(=(='='6=@BB?v;l6b0Y*Q% M%K%I%!G&(E&/D&6C&=B'DA'K?(T>(]=)i<)v;*9+8+7,7,7,7,7,8,:@DFF}Ds@h;_6U1L+G)E*C*A*%?*,>+3=+9<+A;,H:,Q9-[8.f6.s5/4/30201111212030>DHJJ{IpEe@[;R6H1B. ?.=.;."9/)8//7/660>50F41O31Y22d12q03/4.4,5,5,5-5-4.4AHLNNyMnJbEX@N<E7=3 93736343&33-24414<05D/5L.6V-6b,7o+7*8(8'9&9'9(9(8)8EKORSwRlO_IVFLBB=88482818/8$.8+-92,99+:A*:J);T(;_'!>"=#=#<IOSVWuVjS]OSLJH@D6@/= -=+=*>!)>((>/'>7&??$?H#@R"@]!Aj AzABBBBBAAMSX[}\r[gX[TQRHN=J3G*C &C%C$C#D%"D,!D4 E<EEEOFZFhFxGGGHGGFFRX]`zap`e^YZOXDT9Q/N&K JJJJ!K(K0K8KBLLLWLeMuMMMNMMLLW]bewfmfcdVaJ^?[5X+V"TR RRRR$R,R4R>SHSTSb Tr T T TT T S R R]dh~ktlkl_jRgEd:b0`&^][Z ZZ [ [' [0 [: [E[Q[^[m[[[[ZZZYdkn{prrgqYpLn@l5k*i!gff e eedd#d,d5d@dLdZdid{dccbbbalquxwmx`wRvFu9t.t#rqq qqp ppoo&o0o;oGoTodounmmlkkksx}{s}e~X~K~>~2~&}|| |}}| ||||!|)|4{@{N{^{ozzyxwvvzxk]OB5)  ",8FVh|}oaSE8+  ".=M^srdVH:,  #1ASgugYJ<-   $5G[rj[M>/! '9Md~ܙܰ]O@2" *?Um  (4ALU]elrx~#/;FPX_flrx~ *5@JRY`flrx~$/9CLSZ`fkqw~ )3=EMTZ_ejpw",6>FMSY^djpw &/7?FLRX]cjqy~|zxxwww (19@FLRW}]{czkxsv}tqpnlkjjjj !~*{2y9w@uFsLrQpWn^mekniwgecb`__^^^  ~ yur#o+m3k:i@gFfLdRcYa`_i^s\ZYWVU T T T T %((%!{tn if d %b -` 4^ :] @[ GZ MX TW \U dT oR {PONLLKKKK&+//-)}$tle_\ZX'V.T5S;RBPHOPNWL`KkIxHFEDCCCCC+14541x+o&f ^W TQO#N*L1K7I>HDGLETD]CgAt@?=<;;<<<069;:~7s2j-a'Y!Q LJHF&E-C3B:AA@H>P=Y<d;q987 6 5!5!5"5!6!4:>??{<p8g2]-T(L"FCA?"> )= 0; 6:!=9!E8"M7"W6#b4#n3$~2$1%/%/&/&/&0&0&8>BCCxAn=c8Z3Q.H(@$ =#;$9$8$&6$,5%34%:3&B2&J1'T0'_/(l.({,)+***)*)+*+**+*<BFGGvElBa=W8N3D.<) 7(5(3(2(#0()/)0/*7.*?-+H,+R+,]*,j(-y'-&.%.$/$/%/%/&.?EIK~LtJjG^BT=K9A48/2- 0-.--- +-'*..).5)/=(/F'0O%0[$1h#1w"2!23333 3!2CIMO|PsOhL\FRCI??;66.2 +2)2(2&2$%3+$32#4:"4C!5M 5X6e6u77788877GMQS{TqSfPZLPIGE=A3=*9 %7#7"8!8" 8(80989A:K:V;c;r;<<==<<;KQUXyYnXdVXQNOEK:G0C'@ > >>>>%>-?5?>?H@S@`ApAAABBAA@PVZ]v^l]b[VWLUAQ6N,K#HE DDEE"E)E1E;FEFPG^ Gm G G GGG G F FU[`}bscjb`aS^GZUJVWVeUwUUUTTSSbhlwnoocnVlIj=h2f'ecba `` ____&_/_:_E_S_a^r^]]\\[[jo}rutju]tOsBr6p+o nml lkk jjjj!i*i4i@iNi\imhhgfeedqvzyp{b{U{Hz;z/z#yxw wwwwv vvvv#v.u:uGuVuht|tsrqppy}vhZL?2%  &2?O`u~~zl^PB5'  (6EWk~paSE7)  *:L`xsdVG9* .@TjgXJ;,  2F]vԒի[L=/ $8Ng $0<GQY`gmsy  +7BKS[agmsy&1;EMU[aglrx  *5>GNU[aflrx $.8@HNTZ_ekqx (19AHNSY^djqz~ "*2:AGMRX]dks}}{xvusqpppp  $,3:}A{GyLwRvWt]rdpmovljigedccbc ~zv%t-q4o:n@lFjLiRgXf_dgbq`|^\[YXXXWW~ w rnjh'e.d4b;`@_F]L\SZZXbWlUwSRPONMMMM"%%"}un g c_]![(Y/W5V;TASGQNPUN^MgKsI H G E D D C C D $),,*&w!nf_Y U S Q "O )M /L 6K <I BH IF QEZDdBp@?><;;;;<)/221|-r(i#aYQLJHF$E+C1B7A>@E>M=V<a:m9|76543444.4786x4n.e*\$TLF B@? ='<-;49:8B7J6S5^3j2y0/.---..28;<<v9k4b/Y*P%G@ <:86#5)40372>1G/P.[-g,v*)(' & ' ( ( 6<?A}@t>i:_5V0M+D%; 6320 /&.--4, ;+ D*!N)!X'"e&"t%###"$!$!%"%"$#$:?CE{DrCg?]:S6J1A,8&1# .","*")"#(#*'#1&$9%%A$%K#&V"&c!'r'(())))(>CGIzIpGfDZ?Q;G7>25-,( ('''%'$'!#('"(.!)6 )?*I*T+`+o,,------AGKMxMnLdIXDO@F==834*/$, !, ,--%-,.4.</F/Q0^0m11122211EKOQvRmPbNVIMFDC;?1:'62 2222"3)314:4D4O5\5k6}66 7 7 666IOS~VuVjU`SUOLLBI8E.A$=:88899&9.97:A:L ;Y ;h ;z ; <<<< ; ;NTX|[r[hZ^XSUIR>N4K*G!DB@ ??? @# @+ @4 @> AJAVAeAvAAAAAA@TY^y`p`f`]^Q[EW:T/Q%OLJH GGGG H(H1H;HGHSHbHsHHHGGGGZ`cwenfefYdL`@]5[*Y WUS RQ PPPP%P.P8PCPPP^PoPOONNMMaf}itllmakSiFg:d/c$a_^ \\[ ZZZY!Y)Y3Y?YLYZYkX~XWWVUUhmzprrgrZqLp?n3m(kjh ggff e eddd$d.d:cGcUcfczba`__^otxwnx`xRwEw8v+v tssrrrqq qpppp'p3o@oPo`ntnmlkjiw|{s}e~WI</"~~~~~~ ~ ~~~ ~+}9}H}Y|m|{zyxwwi[M?2$ "/?Pd{{m^PB4& $4FYppaSD6' '9Md~dUG8),@Vǫ͋XI:,2H`{ !,8CLT[bhntz '2=FOV\bhnsy",7@IPV\bgmsy &0:BJPV[aflrz *3;CIOUZ_ekr{ #,4<CINSY^dks}}{yxwwu&-5<BGMR}X{^yexmvvsqomljihhi  |'z.w5u;tArGpLoRmXk_ifgpe{cb`^]\\[[  { wso!l(j/h5g;eAcFbL`R_Y]a[jYuWUTSQPPPP wqkgda"^)]/[5Y;XAVFUMSTR\PeNpL}KIHGFFFE ""woh a ]YVT#R*P0O5N;LAKHIOGWFaDlCyA@>=<<<<"'))'{#qiaZ S OLJH$G*E0D6C=AC@K> S= ]; h: v8 7 5 4 3 3 3 4 ',//.w*m%d \TLF C A ? > %< +; 2: 88 ?7G6P4Z3f1t0.-,+,,-,145}4t1j+`'X!OG@ ;976!4'3-241;0C.M-W,c*q)'&%$%&&169:{9q6g1]-T(L"C;5 21/.$,*+1*8)@(J'T&`$o#!   4:=>y=o;e7[2R-I(@#80 ,*)' &'%-$5#>"G!R ^l~8=ABwBm@c<Y7O3F.=)5$- ' %#!!$ +2;E O!\!j"{""#####<ADFuFlDbAW<M8D4<03+*&#" !!""!"(#0#8$B%M%Y&h&y&'''(''@EH}JtJjI`FUAL>C::612(- ) ''''(%(-(6)@)K*W*f+w+ , , , , , +DIL|NsOiN^KSGJDB@9=/8%40- ,---#-*.3.= /H /U 0c 0t 0111100HMQzSqTgR]PRLIJ@F5B+>":74 33 3 3 4( 41 5;5F5R6`6q6666665MRVxXoYeX[UQRGOHPW]ciot{#.8BJQX]chnt{ (2<DKQW]bgmt{"+5=EKQV[afmt| %.6>DJPUZ_flu~~| '/7=CINSY_em~w|zxusrqppn !)07}={ByHxMvRtXr_qgopl{jhfecbaaa|xu#r)p0n6m<kAiGhLfRdYc`ai_t][YWVUUTU  {u plhf#c*a0`6^;]A[FZLXSV[TdRnQ{OMLKJIIIy qke a]ZX$V*T0S6Q;PANGMNKVI_GiFvDCA@??>?zrjb\WSPNL%J+H0G6F<DBCIAQ?Z>e<r:9866555 $&&$u ld\T N JGDB @%?+>1<7;>9E8M6V5a3n1~0/-,,,,%*,-{+r'h"_WOHA >;98!6&5,322 91 A/ I. S, ^+ l) |( & % $ # $ % */22y1o.e)\$SKC<5 3 1 / . "- (+ .* 5) ='F&P$\#j"{ /367v6m3c/Y*P%H ?80,*('%$$*#2":!C NZhx37:~;t;k8a4W/N+E&=!4-& #" !'/7AKWev6;>|?s?i=_9U5L0C,:'2"*" $,4>IUct  :?B{DqChB^>S:J6A29-1)(%  ")2<F S a !q ! " " " " " !>CFyHpHgF\DR?I;@884/0','# !!"" "'#/ $9 $D %P %^ &o&&&&&&&BGJxLoLeK[HPDGA?>7;-6$1-*( ' ( ( (% )- )7*B*N+\+l++++++*FKOvQmQcPZMOJGG>D3@)< 841 / ..//#/+050?0L1Y1i1|11000/KP}TuVkVbUXSNPEM:I/E%B>;9 7 6666 6)627=7I7W7g7y766655PV|Zr[i[`[WYLV@R5N*K HFC A@ ?>>>>&>/>:>F>T>d>v==<<;;W\y_paha_aT^G[:W/U%RPM KJI H GGFF"F,F7FCFQF`EsEDDCBB]bwenggh[fNcAa4^)\ZWVTSRQ QPOOO'O2O?OMN]NoNMLKJJe|itlmnbmTkGi:g-e"db` _^^]\[ ZZYY"Y-Y:YHXXXkWWVUTSlypsshsZrLq?p2o%nlk jjiihgff feee'd4dCdSdec{ba`_^}twwny_yQyCy6x)xwv uuuvuttsss rrr r,r;qLq_qtponlk{{r~d~UG9+  #2CVl~}|vhYK<.   '8Lb|j\M?0! -@Vo_PA3# 3Ib~SD5& %;Snߌݩ$/:CKRY^diou| )4=ELSX^cinu} #.7?FMRX]bhnu~'08@FLQV[agnv !)29?EJPUZ`gox}|{zwu #+28>DINS}Y{`yhwqu|spomkjiig }$z+x2v8t=rBqHoMmSlYjahjftda_^\[[ZZz uqnk%i+g1f7d<cAaG_M^S\[ZdXnV{TRQPONNM |unieb_]%[+Y1X6V;UASGQNPUN^LhJuHGEDCBBB{ sle_ [WTQO%N+L0K6I<HBFHEPCYAc?o>~<;:9888uld ]VQ MJGE D&B+A1?6>=<D;K9T7_6k4z210//.."$$z!qg_WP IE A><:!9&7,62483?1G0P.[-g+v*('&%%%#(**w(m%d [RKC = 96310"/'--,4*;)C(M&X%e#t"  (-/~/t.j+a&X!OG?81 .+)('#%)$ 0# 7! @ J U b r       -14|4r3h1_,U'L#D<4-& $ " !   % , 4=GSaq158z9p8g6]2S-J(B$91*# !)1:EQ_o     59<x=o=e:[7R2I.@*7%/!(  &.8BO \ l   8=@wAmAd?Z<P8G3>06+.''# # , 5 @ L Zi|<ADuElEcDYAO=F9>652..%*%!    "*3 > J!W!g!y!!!!! @E}HtJkJbIXFNBE?=<59+4"/+( $ ###$ $(%1%<%H&U&e&w&&&&%%EI{MsOjO`NWKMHDEO2L(HEB@=<; :999 9)949@9N9]9o887765UZv]m_e_]_R\DX8U-R"OLJ HFED C BAAA&A1A=AJAZAl@??>=<\|`scledfYdKa>^2[&YVT RQONML KKJJ"J,J9JGJVIhI~HGFEDcygrjkl`kRiDf7d*b`^ ][ZYXWVV UTTT'T4TBSRSdRyRQPON~jwnpqfqXpJoK=S;]9i7x6432211zph_ XQL HDA?=!<&:,91776>4F3O1Y/e.s,+*)((( !!ulcZR KD@ <8643!1'0,.3-:+B*K(U&a%p$"! "&(|'r%i"_WNF? 84 1.,*)"'(&.$6#>"G R^m~'+-y-p+f(]$TKC;4 - ) &$"! $*2:DO\j| +/1w2n1d.[*Q%I @81)#    ' . 7 A M Z i { /36v6l5c3Y/P+G&>!6.'       # + 4? J X g y37~:t;k:a8X5N0E,='5#-&    ( 2 <HUev6;|>s?j?`=W9M6D1<.4*,&%"   &/:FSbt:?{BrChC_BV?L;C7;430,,$)$   $-8DQ`r>CyFpHhH^FUDK@C=;:37*2 -)% "   " +!6!A!O!^"p"!!! CHxKoLfM]KTIJFBC:@/;%73/ ,)' &%&&!&)&3'?'M'\'m''&%%$HLvPnQeR\QSOJLAI5D+@!<96 20/ .----'-1-=-J-Y-k-,,+**M}RuUlWcW[VSUGQ;M0I%FC? =:87 6 5444$4.4:4G4W4h4}32110S{Xs[j]b][]OZBV6R*O LIGDBA?> ==<s0r#qo nmmmmlkjiiih hhg!g/g?fRffedcbawxmz_zPzBz3{%{zyyyyzzzxxwwwwwwww&v6vIu_uwtsrqq~cTE6(,?UmfWH9*!3IbZK<- '=UpM?/  /HbЀНи  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"$%&()*+-./02346789;<=>@ABDEFGIJKMNOPRSTUWXY[\]^`abcefgijklnopqstuwxyz|}~  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~mft1!  !"#$%&'()*+,-./01123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~  !""#$$%&&'())*+,--./01223456789:;<=>?@BCDEFHIJLMOPRSUWXZ\^`bdfhjmoqtvy|~ICC_PROFILE ݯŌh̜λŽzې[=eu4TӔ~I,Nʳ~emŮ滑tcĚsE&4}U0 `t5 R4Oi  R;5L[ML^`6`ʼϚmZF|>&T<.Sm1 aZ]5\} T}EDd/"7IXkA(?cղ廗wb۞g6 ?^ف9/Z$^w%j}[+L<0 -a''U'%ʝv]J<2-,09GԻ縏jK/og4<ւ;1oBPi7/"y4Ftjc)"aW7hӮ|uqprwۺiiȓe=ێLn|,E*"D}6jXFG5% ' p pUB3& &ӼҩeH,q<O5u#gCH.8thB`z]a$fɬ}vqligfgkpzŪyawݦwP, 1Np`o7@r_M;*3^+ ƣhM2|Fq|/;d tjK0/Ryt6m|i hpaPliZI9X)V/)G .>RhҰw]B( J}EP h6HuiR>3+X"\Jzwz LWhtңzX:)#RiC4yO]:*Ot3grD\A_KW $1?N`t¾~S?0# vuFNDkyf!SJ?w+ EM.*-E`ct˷|xtplhejH- 1B)kZN4 =eNCzt _t,8ESbrٲymd]VQKFA<82-(#K% f=3l 5[/^w^C@^N,>Rj|þm[L@7/(" 4v$Q|yfQ#:62/.1%B} 9b"Hri(N\3.2Rwr/BXpon~dVKC<60+'" RmQ:B#h >m7/Ptr*AZuXDTdu{xvtrsuxO:0(! #i 9c4[I9]{ !8RoX)9IZl~wqlhda^[YXWWY^eq1 V/W|7+a ,Pv0 #;Wvc*;L_tſld^YUQOLJHGFHKPYf&VP:y !2X1Z'KqI/Jhu&8J^urZSOKHFDCBABCGNYi}.VA{ 4`?%Jqf*Db5+>QhvPJGEDDDEFGKQZhA6ce 'Ls/*DbP6Ja{҇|SGIMQV`sV5Pmo>_{Adobed@     u!"1A2# QBa$3Rqb%C&4r 5'S6DTsEF7Gc(UVWdte)8fu*9:HIJXYZghijvwxyzm!1"AQ2aqB#Rb3 $Cr4%ScD&5T6Ed' sFtUeuV7)(GWf8vgwHXhx9IYiy*:JZjz?S5d1Qs,էOO{=YVg[7ʣT¨?,A?mTґi o^Oo35ے$G&Fdjj f# ]O q+[~y\aiyeXªUIOx"LHf"Ȏ@?d<҆[POR?/ΆXFG",ƞTRToOxץo ?_G}MY3L|Tq\):uiOZUITjU'>%(#R8#27Vo}ԩ׃afrOb[HLMAD d:In>t}>{}oï0q-!,kRxU]\yj)/I,Y'~_߸l?\RGPq Y*GKEXӑꑾJ߾C:(xi&i+e'N:☉2">@"9OӋgHJn!By*8e:Q ?~'*$x5H*~~zqHI])qƑ+q7T03]'K1-daFib2 EYR>Eט@8_J<*Tb$Ta,?N/~ζ@Q)#(e #O|hadr",iHU%O!׀jnzYZF~@?_%IH׉$XWJ~SBp))+*>]?Fa~@?~W\!Eꕹ$>\KL:uL!.0Xn~9^#JbJ 1`l[M'ߏ^RO\(i~R+W-UmU2K-ƭL#o.{ց[R!mŅƯ7|+kf[Kr~^$עa]+1O{ *(4tMyh\pCVΛr"-2%3X“cxuTzîc$R-i !{ǎ*g1*X$tŁHfb]o7П~=yH>}r&b@>KP\UT,0B@<@gZ5nHcxU}𭭚mo{_LQ-@OxO^%tO?^K$'xf]7:5p8ut^I[O:oȊ\|t㨗[Tb O%Vǩ׵PPqH.O::$`q!AuB} ThRы-BrVeS$j6 }~hպ"+!VX\j¶j}1D!<?,'OuI=z(ҿ?kFC]\|tqk1?:/{=YV<:߾i>(R}S{i3_,'8X,SpqïЪ~Y,Uiص-?C&#cZ=xWӵ$S-bRċ*O=[4QO>dA1D)RMM"[Zո&mfg~׀ *xӻT1#h?{[\v9 uq rǁZ$|Qzn8 {ӾfYbO53-qƱYu 8~ש^.)UcX?_|5RcjZ"IMG-Uǃz񡢯]E5ykHRWZĥR6>;O[Q]$T Qe{h}q4c5hSD"qMM7/ǯTvcFя_r2㣏\?A~8߉JI JqAOm不||Ğ kg Z8cPeNp?ïSQ\SB[af$~WxjbԴE><<[k{CE^TjN/ NKl|v/H? ?S=lE<ijЧWK%548EmhVo_^(NP($?oqqd5G3~q֕kìLAEꕸKNe<@@qƠeʜ(=^xUIc6}KMũi}$y4yWƆu杬_I#H_OykH=mG$_tP~@%E~z٢y#$ $աO ?Jjhq57Co[0'?QSǮڡQF?Ik?P pf E<~'*'Y&+q?5x)h5@˭8QX{MG:qM o͇嘒l ]᪖R8Hh9oʯ<3׍ z-Q;XG/`:%.:zڏH "J/O߸EFIDIB\,!=[jn.ߩa~O=x];C6K#z M,X3ƫ:3W(aNܳ?[ kJ顡, FD)>_ut"V'W 4:[TUPAPTFj3i'0'K~ ij:oJ]궛Av6@Y μ}C^J ? xi+5%($O ?gߺ$*IaeU$98U:h`5[mg\!D?;r~l/ͯ)+,z#@t1^O+P[ߒ8}}׫uЉZV\Ho}QVIACgRV8fePEͤȜ}/[ߺ4ׯK)vdoxqyd'[G;: z*&(p$?A9F >E(~Ēz䪑%T\Ir/\TxE `8op?@ujpT16|Piyt'dT:F|%cfQZIL<_@}z,΁җf@y:p}ᡝǍByq3?_{@׮Rhaj@=joId` D_I'JXYUE?$NG"G>!XfV`t[faNܳ?[ kJ顡, FD)>_ut"V'W 4:[TUPAPTFj3i'0'K~ ij:oJ]궛Av6@Y μ}C^J ? xi+5%($O ?gߺ$*IaeU$ЂXFG",ƞTRToO\7CLz-OHi^cEQ157{MD.)X'G䓨{A9j)(b MJQB1]rSX~z (^AJĻ[r/eASuĖk y?Ba:(PV P,xI_$/G,%R,p9-~-\ ( *I *y #E>:(PV P,xI_$/G,%R,p9-~-\ ( *I *y #E>:(PV P,xI_<oY!Qh 8?g^Š.uNWԐY,czXFG",ƞTRToOx)eioQ_|!|T4{ 1HE?=^O^gѬIwrI@\=L1 !U_),?Q\=xc ty%b]-y[Jׂ GAQ(gYX Ճ/8߾}x #]Df:B~T 7UX0Pk}dOJV?@~OՏ~u KU{ZEP*?~w׺{^{{u׺{^{{u׺{^{{u׺E5\aoeP\҈`u잸,jYU'roē5mlk{bnBx~XOԟ~dzK _ُԟZВD"qMM7/ǫT~vcFя_tzLMQJR@ƺBV"߸`u+Vnv O$gj#Q06X\ۃ$>[ {.qîƊH$yh*GŠ0 ,LΧY:Tߛq3׉+Q[5[>di薚7T_? s֘AH$yuPF<{jԏ~׽ߺ^~{߽u~׽ߺ^~{߽u~׽ߺ^~{߽u~׽U>*5UC@>'=c=CD1*#:jhq57Co[0'?QSǮڡQF?I}˖26D~)K E X_~׀Yuۿ-<ZH<7͝TDt~masn Ao'߸u)#$9Ѣ_|aX+3:d?R~m|^']FoSPl~-ook,!4eJ5" -b߸{(>.SpV>U'&i+5%($O ?gߺ$UHʪ.Iy$_ykML<|4Ҩ:u׀$I$ЙV D)ҿUOc޸_*~.%Oй{G Z14+~̶U.xxr57"~ }Iz43mD"u1~ײ<:Ʃ͇ \{EKdB@t!`J$<~׉xuAXm~$56Q(RRmOx'X):PPd}rI}:J}{UG{^{{u׺{^{{u׺{^{{u׺{^ߤEGE-iJ[R#PZIZIUf1o?{ ol_qs~ν?Xj.GQdv0l4y_-~ |^7\fi M_H?_|bfꤞA %0 8QiL߸um4Fsa,'QR)P(?Hq.dqҡIO'dkE^y@<Ĵ?[_I6{WW6ǛxЪ(ssz!E6?q?_!VT$~?o$Ԕ? ?OKO0iLLViHG6׍F:+.dHRUI?Q-M-E4+#5XV >!!y#8zd>޸+Q/}Z9)*b$#PfaBHy.n#HĐ8cđE}{^{{u׺{^{{u׺{^{{u׺{^{{_.D3LGr>ߺM2·<+') M}MIy$ߺIȔ? ?OKO0iLLViHG6׍F:+.dHRUI?Q-M-E4+#5XV >!!y#8zd>޸+Q/}Z9)*b$#PfaBHy.n#HĐ8]+9cAsր$i_?OКYaBiːGk\D6[+q:P|]oԪLXTW=T+TzOvF-\^Q)uƄP<X??{H#=EvF`!ΜCģArOxwXR $P/?IPiUޔT(O}^^T4kGI ?}OH Z5O +ɣ[__WŽu $&OO^{uW6,eb6'hmܾɈKBSA.@z$(4YQ{7 ;ci:w3N#y 5#06}:iRmaFzq]7#I;zm|֯4Hdg9CCQ",u1*" 2T7Щu;ow>o7? K"S72W$z#G* h}Uoudnڝ}6,O%)mP UZcYIJdթC GQĎ >C;b{\lRZ1|m4u "AV(2J:K3$ѡw7Nq 1}^+'I4Ut0UA祝%Mh5F`qH*hҳn]0{igo~~wnhsxjﴪxh~ڶHdX H ,Nv^)2PdqsQFQb䧩& AuԿ:R>}d<>cYQbrq,m}$U }^f:iH۳k{< cjq}mmZ뿦@Ezjd };;w^uܛ?mY}]d슟-VR50Q-UeeeT5--4 TTLꈈ}I d(14\u3dY h1PMeuueKOIGIOI,2h Lw UtuGeG]W ME-]Еu4MLӶ,M44YʁԷ!ӞAT!z j*]hj(+r^z*:UAMUV=Ett(Q ABq\Fd0j <5ؼN;#G6]dPɡ >LJT A= x<sbhso3:dFSb0XWaUHM-5wvW}-ſ3CtWR}3'*Z.WV}t({u$4?uiedS*]:s}>V-Qid:QU?,8HM=9YrMkKe؟?g[ *TO?}*!MEL2M穙hkWdiڅ~~u@5=r\`hEߋQoŏTr3Wdf`9J?4$pׇq%:!0EkjcO?{[Aa[Hјr@A߸u yuAMHF8$msy Q?KLI@W^-曙_*ؖF$bOu =o$jny+)VJvy~8KVT E :7bG/v? ϼ_a 4M.%DjTӤB,>j~<޺׮1Kg`E^p8c ks )q#*>hKq~ze.do[@k(B#Ub8bu:u}W"? ~O=5}Mv<~_t955<XMDl{KTV!*{Dg>C`4P0 ]KvQMtXnĪSM9ꍻmZ BnAEW,Sy>u^):=mcS0QKE())QQojC G: bo=YN\Z}SK>9 9^c6=))쿒;ZLrv&OeCC+.;Q)vOs8LG=[ =}dMjO!UIxÃO2.g g-msGs, xƿ`G9ݛ~;|{[[6'ly[ktS,j*;j԰iiZfT Μ?>ؿGd*m۰dZ#ږ#0feC"Q >7?*ˢfyXUbrhu"nGƲK ѢՆAg_yoE{/%.G|e ַ\칆t%^F.eaH#kx{];_'?|5s:7޾o?ݧ?Y 53ç:(cb1niNXjeV6- ni ٻӯt,z>mJHǚYY飐 ݼ_?Z Vd#:>^χ.ȇ)mӼS3 v=_MjryvG(i{ϵEy%۸UBK4/nW׺\n4Փ4G̲VJ!<}>DeZ`oFQs---E}G;-$I ;ğ{@z$jny+)VJvy~8KVT E :7bG/v? ϼ_a 4M.%DjTӤB,>j~<޺׮1Kg`E^p8c ks )q#*>hKq~ze.do[@5d1Qs,էOO{=yVg]7ʣT¨?Њl'7SR?QoU#8Q޸rB=om3 $h-}HDȅGQ%.-\(}w"<3u #aޞI*2 l>idi:||/~xhP՛S!iը?k}__?pr\*:CYb8R.l.9ozxuޏS3K=VTCM:Cabڴk~-Ou4aش_ ^U?TŹ*i-t{u%SoLF_fafD1m(Vd[p @=:[7 T/U]:sv͵6%e~q:RvGEA {9)XI0^hB7RF!Œ:tmo8Ǯ;Kj6̊gJڜX,>K@]dܟl01lB;YE?,^Yܻ3z-Ԙܕ"ﮕ92qz0،%A1+? ڧ>lSv[/޹,f+.+ic2Xl0ܙ8*J 7/*3̐KL ;G?^h~f򫟹6[u#7.+ ŵns}f0Y Á;GJ_jpRw 6P|ے()o#3jVN+Ui" 5 8?=6 ֣ 6q‹mZ^呿^_ yJHMUW7;7WOUS[K#N0cO2-6eo*ڲ-=n˃Qc4Vwɤld '.m4刲ơ3ʛqm5_! ӽa0FrV5z̜_SǪ H`Ԓխw+䊫=#h|^Hʃ/UI &y{cQEܐnK0$=w}Fe)bTi׿:|ܝ_߮{gJ:Ði&gqME[R"\^@xg馌z? {gW\mKG}b^ U,S9z|:Cm4Rim6;c€>Jo݃x&b;i TlQ3SAW+s- S);/@ұ?BM4L ~VZ4Zh1~߽ۢשn:M2»gwBVSUq-9*Ĕ:,+cE=bsOC/uwk:SqOv"nz=ZbhcbH`Qn cq*E5K"I'H+!Web-tVބ|O'Wȯ{؟wd6||mtgr$QJ~o#s6PV5 =o;Eu iz3sY 8܍[W۠d2SeS(\sM>OrlY v>Iaz iedj&g~׽d^jjzHNJa]EUEoy<5NZì1Cvf &UÍ*jG-*o 8HQAǬ10a?GI=.6*ԉJ܈QdxRROϿqŠ+r,c7XP>H oa=䒫!s!ʍcO&!օ Y0pFZ# -Uä5("~׫]xOu?1 ߲Y!8EUF.0 ?OיïC!+rIM}?]+9cAs$,+sҿIڟHbH:#E4׈c[.Ĩ˒SSDZj>6^n~:(<.a3a?jOǼLd<75#HH1^Sh*xe,b KQLV9̂"xѩ黋Ͻ_Y)fPnVڇ{/~r I楪*jy^z]dx&HE 2^Ǩt45URVQE-]-Dm E5MZv=L>l!!u^w+)iL+L4'љM%1GE|0sI?? LJVY[vƩJQW3x]1X:LSHH'F辈Z%oܹ?Ț<av~OdÐf&k58}46AUu&y w9E?= 6epps_?kɯW?k;g']7v-F/{w-ۻ{>_ҥ>.: oR%4'V:[f.]ݛ){vvmZ`v>o K?ckd}k)rqnڌ̐$*^RZ+KodrCP#νk 1kOGb|sٸ]ջo3w?dmYiG4 NOS JK*b6 wkO[N;_s|T.m,]VmNa3uo} p}OoyDP^ܣiՉ>dёp_m|Z홍mNBnoAAze`ddbTT yM'vFwv2*1znǏ!r'IdtATpU(RY8 3 EE20gv ':idvTuOES]yV$c2;smp檦Z6hHb )k~t~Mw9ԙjUV>Qp*dO0o3"ӣ]p(#XP=>D7=M'ȟf\3hu.oQMrۚGtǫ$&j,J~QVgmwڵ=[6Bces]]GPtmpQ# fM1$4R+_>QV+R?;|/|sO{RwVy2x-=xT/~eVi4"Erҡ |ݩCwzV_08ItTG^)@u,5 kYϻĥ#D<@== !Y+ǣm~9o4|i윮レ,^m]m* Ulρ`btE,t_OmOF _KEW.BCUOI_=2zXg,"4'H{^d5G3~qՕkèLAEꕸL~>Zt$i{ZIXV?$=QN׵>=|#ĐtF#}uPy ]nLf0ըy%Eyj xokF?c߫״T류0XK6 ov9 uq rǁZLAEꕸw!8uU>@7ԩ?SHJ~abi q޿=t` }H,‹#%TדJuKi_Tcj)MmP3TFcucvyds{E/mǭ)4F(^OxJ܂M{g!U##P.tXroO}z=: XGX%^ҭG 6qv 8-ï1p"SΧn]_w^{u׺{^{{u׺{^{{u׺{^{{umMt1L4EFP՚AdA4PY٘䓤@=2G.ʧ3h'_3Չi^a-曙_}SAOԇl|(: UA y?~μQچ)R>:cFc` sywUow=_mihF8aWF#ST?mV_Alt{1.c@UYN={ w'^uܗO9ܗrn[o{lemNgpub(?w,3KKO5ո)`NuQr@M{[E0sWͶl6<[=n4$iGHS Nꂬ c>^iMrgqI.5U̪*EX2@ӛof{ /w>vۛYn fv# cer\LpSSAO4-nٶwiybbRK,U#4Vww`=Y#g*Y$p:?ŸNoLm=Uy'w/O; 6#%7lyGicXV>Ijg8`6weU$-}'yl6ޮRݮH`oiGQzfh% I$$׽rD{߽u~׽((d54H1_>_!jnDVvC&7jɚc⣊YIӫO%>Szҭ~βM7ʣT¨?,A?mTґi o^Oo35ے$G&Fdjj f# ]O q+[~y\aiyeXªUIOx"LHf"Ȏ@?d<҆[POR?/ΆXFG",ƞTRToOxץo ?_G}_%IHq_}_޶9u?OwŸ[oo߼#Ͽ?ol<+G-}]N俬G!?#o/s?o\OtC_'\է`~:®׺{^MS5OXb^ʨnO[$uQSQژ$2Y!8EUF.0 ?M٫ìPâHuJܒy}DR㥦_DڦkRy,b?@=N]udE?Ar/xՑХL1%K6[ [ &ǯ)ϮSDҔ]V\4xj*%V[H@)qY WWͭk% c?R}ID]I=kFC]\|tqk1?:/{=YV<:߾i>(R}S{i3_,'8X,SpqïЪ~Y,Uiص-?C&#cZ=xWӵ$S-bRċ*O=[4QO>dA1D)RmgJ+1xjmf}TYeg ʦ꽿[~]e~{ٛOmO7Fbv&?#G`0X~ڙk5ObqXy'HݕT&䫈-9˔H]UEY,ĀI &Byu߾x-b./wH`7yk(a0K,2qU{o?:} 76{Oξ=Os;ۿe͏}[dܛr|d۸w?u^b0\F;ud2lB8)IEDVfyםy6yכv.d..fvh$ BYHWe?yyd}{- IfY-V85gGeDE,('{o {afw_Qz>+ci~fn*Z X:cFc` ~z}ߺʾ\~7K4n? 34yJ(护_ ܋{?fΛM/ye}7cIJ14PI'{!iwNoA[q=`v O#F+M$530C;>e}w؟zk딷`ifiv(@$;*""v!T@|,Ps<*B33TJN$׽?#y'J??279ܓsnXD_^X>n_>[˹/snm{pg=S1،&ݕ9 _+ jh#iQ2װ^{{+ͶM6O<>0nK,nqE 蓙y'7'UU"&It^^׺{^tUiTI 2W?_U$dqW(x FyW[?{#!>:8@5X=\db/TD/oZw,I঺r85 .TGa:5p4*u6bK'wZl~6-KOP#ɣ*>Xַ|^44U먵F4bI@{XFij<q"`+*,S?~SϮ1&L}& pT`~SSCVրn?ɩ~م?_߸=t b1rO?K#z M,X3ƫ:3W(aNܳ?[ kJ顡, FD)>_ut"V'W 4:[TUPAPTFj3i'0'K~ ij:oJ]궛Av6@Y μ}C^J ? xjiS7e? =I"ơTXSIߺ\ߺ^~{߽u~׽ߺ^~{߽u~׽ߺ^~{߽u~׽ߺ^/zpHT^덕<(f?NO$nG"G>!XfV`tVf8aNܳ?[ kJ顡, FD)>_ut"V'W 4:[TUPAPTFj3i'0'K~ ij:oJ]궛Av6@Y μ}C^J ? xi+5%($O ?gߺ$*IaeU$ЂXFG",ƞTRToO\7CLz-OHi^cEQ157{MD.)X'G䓨{A9j)(b MJQB1]rSX~z (^AJĻ[r/e^jSWTF~"MïSQ'˯3h$Q$ ~.xPNZ JSRTkW\}{ 1א}<.܋G<%kOI# Ȭ[e}o>hǮ3!Aп@Ac*(5S'~?'ǁϿq:T]q%Oй{2j}1D!<?,'OuI=oK _ُԟZV_6( 'II'1D]I=媨,lİ R >i.e |&z4S?h:+gּIofOP}F8ߺ$2G,Q=iݫZҫjfL- {ZB83XEY[«S_SaikI?EE~}r%"O¢%mlk{bnBx~XOԟ~ĒzK _ُԟZV_6( 'II'1D]I=媨,lİ R >i.e |&z4S?h:+gּIofOP}F8ߺ$2G,Q=iݫZҫjfL- {ZB83XEY[«S_SaikI?EE~}r%"O¢%mlk{bnBx~XOԟ~ĒzK _ُԟZВD"qMM7/ǫT~vcFя_tzLMQJR@ƺBV"߸`u+Vnv O$gj#Q06X\ۃ$>[ {.qîƊH$yh*GŠ0 ,LΧY:Tߛq3׉+Q[5[>,8HM=9YrMkKe؟?g^ *TO?}jhq57Co[0'?QSǮڡQF?I}˖26D~)K E X_~׀Yuۿ-<ZH<7͝TDt~masn Ao'߸u)#$9Ѣ_|aX+3:d?R~m|^']FoSPl~-ook,!4eJ5" -b߸{(>.SpV>U'|iB+k@z] S}lzEOwj1Dm9'{KM.[$ʔڵD,|k/b-}^fn k] I\o6vR5Q aQ͸2H#}~ײ:hKF}Yx|Z `ueJ-}=x½uMA[@x,Äӕ!*4ָl/W~u LXTW=񦦇Sqt6M q[ {.qîƊH$yh*GŠ0 ,LΧY:Tߛq3׉+Q[5[>,8HM=9YrMkKe؟?g^ *TO?}&i+5%($O ?gߺ$UHʪ.Iy$_ykML<|4Ҩ:uj;O\bG2}7͖\#^D8Ԥԁu1'WG4qCDCgYљ£u lV乾M⥥vv%!A>vؓxO\"MM??辶F >E(~ĒzU"K *'}50x8JC0c_.8߾}xvš2d?S:o-] &G pkI<OzcOM!쮏|h㪆9r1L ap52 oׅGpج-s}#/{KKQ_QKI#B}N'ߺI"D8~SMQ_QI,A }(Q>׉$ڪDUQrO'Zj`qAЇӮabL]7qǿ|=qCe~e @t6ZAsL%yRyR>ײ@,C?]U rbkAdFd {˯ פ1X[G__?6ؖF$bOu =rD57p@[Y*"@Q6}IT,,OM*\ŏ|o~Qz9O鿾lt4ęJ$1$>}dY?4?=񣎪%0*<ւ>%^ïHcb%达:m--E}G;-$I ;ğ~z$jnЙV D)ҿUOc޸_*~.%Oй{G Z14+~̶U.xxr57"~ }Iz43mD"u1~ײ<:Ʃ͇ \{EKdB@t!`J$<~׉xuAXm~$5]\8N?o!⦤~BGpϿqąz8fL8uH}y`AM=+X?V<.}װ-VX~}*8bٌ@͙X+6es~&딌 $BLT!uXGj!>X{9m5HԴl8Zߪ*[%48#̎>T) }I Mhï"k&|qy5#R?n}^$(Q0a?Gȫ ol_qs~ν?\Ij.GQdv0l4y_-~ |^7\fi M_H?_|bfꤞA %0 8QiL߸um4Fsa,'QR)P(?Hq.dqҡIO'dkE^y@<Ĵ?[_I6{WW6ǛxЪ(ssz!E6?q?_EX0Pk}dOJV?@~OՏ~u KU!!y#8zd>޸+Q/}Z9)*b$#PfaBHy.n#HĐ8]+9cAsր$i_?Oxjkl5MAHX+Rէ=#~*IrA"5 agAMAOX2tEXtSoftwareAdobe ImageReadyqe<IDATxbg@31pr~`xf(8@yAK>;;,XfGb_]`d`x ##KGb@,qD2`F(02@`?pF,/?9&&FAvvVVv6v666V.NvN ffba8XYXE>?Ws231h ͻ OLvece WM H K9(r%XYXٙxx8 T.^ edb1`1#,@;,"7DnF$c[̌ Rb< ~c~G8~ Lc933c>.\na0$ꃒ-XM{pR1gf`* ]ĉ bE>!mvNvR,`FLx:[4Krs8 -Mec-[}5MKIk0+)Qb"~N C뺪9]妌24eNܱ_rg) c;(mN @C) Rxˋ -PyPNeaa`gl,l\\HTnh.dR11!p.F&8BacY |}F*(#ı_ `+p`LF V ('L ę-o̰o@߿~,a3*1<}a\;]@A І4w`9T@ Ł Lp] ̥H \ )! ̭ b l\ XH2s*021#^ J -#fDxFXMt߿,$i ՊLټ @~? hh&(F0<}cϱ8Y܀RWR qćSEP5䙙x88 $PpsX\ T.NN`f" HKΐ%*,A_\YВFLF%>IPNOO&??*=6f,>6a`R8Lj{F _c`Q``c`(M3bxrr0K>™ ?t#`.qԧ@/([lLKA-S9*n "UALD \ DP@" X֥?fØrA ~#;3w0@U82 j ß> L#6ua B  UY& G:Xui %??yo&`rkkh3r-5E( ʥTK9,H7V/؛H%&\"?kqA%cdi' C<h^m70<F`X3 {|ayi B  =Ɖ8@xD])RN5r;E5("@gbRX?/+A $H 49K.{xX"wq;Qy,%12tPCAe~~`" N i@wr33 {=e \l~׏/_eaFnƖL$D`te`e$*:~fch bH~ v < L oau0#ЎQ aQ h X_= m*)*,(.po>"#gSCs"5؁Ga3q3񱀋m6&\}`v%xl@Os5(Ϡ->Gà"'KVKGO1I2h2u_!] ipH̿?rR| D0e1C3 -P;l`jS們?{>)0/h|\AYQ@AZR8ϼ'pQ#:~ɍ T 3#49/82C@%@9VXD3fH31C׿28ac'[q.L@M?p Ի.)Y~W`hc▗ ^?[kpgpjgex9CVi3g ąԑ"r $q m@3Fx"9iX+fH\fȏ7& A; -iQ@JT@:.Hğ@ uFTj=9m=9Oj{~Yup>ai|mE pEH2KV&x;%%#Xsom4y Y/LWNjvBK@ q\[!j1uѨY4^ a ,Wi&RQMA"n.:n} />S'q TtҘGSカtKGι&ju:eOVO9 ~ 52KF:垥G0/7XWPD#4Q z({Sج.elM!RdX[҄Lh^݀!f/ hN%Io$v^M1-[f0EᓤNkZEZ+ +݋.|A\ ԅBUTĊi%4tꑃEe軈Ѫyۚ5x#U;U8yp|>g,4(@{Vxc)~/sKH1fM)=L^'`@3SP JI>ϵQ,`(Y MH h؝J"N~~56汼ك ?]:o-(- xfK\"Kt|5AY>8\@_L>C;⟅@# C'@CbT[ 58{>m9v`?*BA "@ 8p x/nϠp5`bAjA0_@ "9*jor=TQnP:~خo?\H^D`6hb3 %u Oak'=WcPrf`VK\A?P-\, 1B3>s .`@߁恪|`Ts P>׫;!@{L\ jcx lWbu0R`è~HW85CPӐ=`xl}@tj*BG49!c@ ȿDZn`CG'RVl'8A&.6>`cJO IOSaP3O:$ ć&aK'2<9p܎9 \@a_߁A_%op ?~>C\&xnb߂Y;Ȉ<ˁIyfH0 e`59sx?#{)@_?`{A9vINp~C"?gaBV&pʰF5`-QT}`1`PIj3ȚBrE8,1@J(0=3:1? w1> ~}@c?!K@1/_2# mFhW b6T"`= ,=8C7! ɠ돐IX (rs4(A-{P7(gR ,!#@=)qF*-dشyCNq#&0G pWF` V?"׃0 e` M{>nf\k?dxNFW7#gTl 0bED'q8>NNnWpLZ$Kޜ$.dzF$dF J6'y[l;C?A Qgoh%z/ֆ4 ,<S < -G(%Lx]+Q|2ɩ*`qMEkޅ^hȁv|cq\૖OxD`@)H̼Il w_,vGMHW݇EKŜstMo~ &貢Go}w Z:Z#y* ًŖX!]AP.PI䘡-.uDwpl3@`9xX3q"Ѡٻ_ vI!V>HCT=J A= Hc`7} Wgt /dt(290H 3|Xq/?4!m bV >>v3g-Acm &9_~1gY [m8At6 p9 `g_b6&F ; JvCͼ]& Ϸt3@ |~ٺeYV.<:LlIY42}0@(fh>I#\lŸ'zGv\ۨx7`3fjw#I-413K*mZ5BD@Sv6#nj?GW54Y,?ڪCױ\3)SÓ!ck`I)og2ĘG{/ \O{y @ Ea7h .桽Pۀ?dx ̱n32@0!~3GZ h;8 U|\,бs/=R g.b`pbc3H2)AlbPT1"Bg m^1<:s w| ԓpzj TPG! X:B"@ñmPn6u ^wyK|yl@x7Q`R-XȐ-td6] ZB<L'n3Vj#wu301v 1|AT}#/7/Ï?\6` yYGf1! T0^ǃt Q +'?![@\@u^ ~fyUPMY.`~W- ;%-d @\K.q6*;&1,[XG?`oAY_A\^ CzT{p/xܶF_k`@l|U&E>ڲX߃zH@lT<˟Wx#1썣 5v&K1A&R@/%qPBՠa]A`#Ň?YP`afwk@6?Ơ@Aa6Z| Zx?kP-nz>&FL/FU)N-9npb7X*񋡪aӺ- | F Р9;" ]\3GLq`x. `q? ~^bAʭ|굻B>8s=JB;F ]6b&H$HX`3jBv!]/*(⅀r(@ 8% ZנHM̄u0wL>|Je0~e.H$4?1յ3߾!JAKh6WA@GQoM@h:n;xf@mܡ.Wow|!]pډ'aPȸ"@ q(S0(1#$am`? ^bTho E._/]g?{F\"n+A ?][n_CFq}_T yN$P?~򌡠ډ3  @ >IaUm?@i@| W2GZLj)1K0ܻpK[h?Y=f&ta {Pe%1 e@B@cd^F i!}K/0mk>s:H=76 AcaP mÌ|Fx;.ԉtwRr*<ː l2A6hi+1iIWAw!Uu Se|;P0C' ρ_g`Rd>q=up;r?bT@( ߼'FE91f{!ۃ t ԅd`^Ƞ.Y_^' \z@]Bf/hxsg-x%L xK@@ڙsrK~?~,Ac :U儡Ӵ (u:rcʇXtA ?…ۿ|`38$AHJk g^g:A~ Ƈ0 )%BK xd ǯ]ͦ"_%'7;;Ûqn4i"e<L <30blbdd2ZɈz 6o,[CF@7H6Muq!!nn#W@*~pSo>Cul* ! l\_EU66% zq49}Wc/퀟!)8l b @E#bM!̈X؈<Ki/z@ظ>3xނE ~bw~C p2hK1s#?JH 7VN@@Ygp7_;]@7 ^+&`P[Vs7Hc<%//à0P 3+`C `HE-^⚝$%>S6d8nZiQdɈ`ē10xDF@3kehjg0Z Z ^HE 48A-}((>\>d!#d*W W.Ўo>2<ahfdv3gj+PU`:!E(M%0?5~s5Y~*ր×E###91bu2&^z=0{cF<2Mf&L`:K%\n/ˠE[n91@r/`Iz3^BtC%37'5+ g| ~~8si*HǏ1(5`)Ai bwݻHNt7``+% Q,wߒxj'Ga ^|< H7d]?I>|=h̓#`˸!u>w^1|}VZ&v`!;'!YY} ,x? ϟXP."?/wXR42\tRx0X>~a?h`+Ag/? !XUDTG2`{ăx>|PRpIA>U`7k 0H s5؆.#1Lp7BL˗ny lK`&xfnA@QaJE1xy=mOFX'[6Ēd4eXn e?>';&L_~>8B_##U`VN 3;Pcgg$4jHtăll .]c+cx{>C?( ? (({pw'?zY "/#?+CSM% w`C?p t,'ûwoj`9V`҄a@>;POr@l{s)3+!,FW<Bǩs oa߁,?/L`֕  Ë^+ l%:Qc+i0yAΜ ‚ |ȇaeЗgagn{;*ۃ(#vn=P@MO98JJ S߾~6OPZײr 9 ,̘*J \Gn n`kU hޗa&|0~9 j|:R2X"!,'R "" 3Z1۷ :?K) x۷N̠ ަ?d;R>Έ{@SL>|`/3|\v@37mTUfU38890AL& T I`#-/%eq1'OK@r+2޿_߽Oق6+ 30k20 n&}^a![7[v{7 %\$ɠ. n:·s>h5 e8!P[UI0|z}'ٸ$eu{&D<)*h0{=VpÛ<@-U6O׏^>~Ť*#_M˜Q^T"u}G@'hϫ kR3]㲃P>b ,~s#P[AE)/[&( 䂴?!.]`c΋/njw~ ؚ,gHN߾bvOhL`IJL(CߌP@: '~ÆX0@ @u0#1aVLg zO~3pJ23q1{#2w/ ]/ O}L\AEyۀEl`oko ,#pvCUMԝЭ+IM6PZ+?o 10Z20"j}4>} 2?|m]Vpч:'s7+ '+i46} ʅ h|p@ڈ9 l(|G_o#\V0jנ. T^h_Jr 0[(dXQqr1&N߼ pֿ ϳC|?3nN0E8PW]~p=%1|ٌxn7Fۖ @0| ~?,ʊ&u1F߿~:+"6~84`pssΪC ~ihjc`oˏ1 lXz؀ !Mp}_܃_`"0IMƐ@Q\ _w#, 03a4`}=`$et &|⼂{o0|03Ax_ͤLHpXZkd~Qj>Ty ŋ ̐IBRUU ~-HMmoo@T|gb}×g߆nAD>z <T\ƪI$f$!_09pe ?k'0҂X= HjJJp1r0XjK,`Lxt_mТOo w1O``a`"#+aI RR ߿"p=ψ1Iz=r)Px|B 9Y9i}\9U@w$@0*+ Gy cP:Э߁?+@-h*UI5xmо11/Hg*X<X]U!~ Uhɳ av```cafdXee[c+|p? >_`@w}x_06*JBB~ K]{l8<0kxܼ V vuY) @ t(UAg//?^c=('ߋ}8< /tQv@;yEMuU0gz Qz}k09zX5noCd`y Z?0-]cc|0sw8A7sFC?k`+Au0w{z - zF ??qOp(|$v))1T;^vouuP5 tP9R@tAG+A~_y/ï?0;3 0`0`5 x=)`q t(ӴXrL\Z @=( xYj,>yßsX-X}4]HPGszgxq 2\;Ú#O.=)=#!g ehnf|a}<)`.p0wZlGHnv7oHJ^*g `wWwn1v X0pr"ֺAxY&P ^6phVBXfC-o?F^&Eiϟcy^{>093z;2WUd8}?|Ǟ01HˀRc0g L >fv@k/;$??!7'\}8ⱏa`daxYHPFvAkH jP嵕rH k{ \zj D]0 vyy^@t"xASc H+|CߌE<mF`gT .\/N LZ* n fso`i2k>1f:4# zvU2C?U+#i^urԽgq7^?JLl & Vf|#6` Vۄ5V(JB顿o'^TB 6D Rz-7ofSD(&H>n9S<  >~~aý^g Mp,*C^ꞽ뗡}pB*5kjS Ugf "5<Ȉ[1oh $c7xTtЅ*븼SJF 0@۹.{@*mqkmbg>Y 2nk0NHۦgQvCα%Z)0@  Ka+/@1sN'4節z9 XU-N_et3_ hXt3K:Pq ٌgC?ë>?P0 l 2#T% /@AfAron- i`BSQAAF|$̈k@92 z+##e< 0p+ Av.q8@ 22_ 2\"@=,,21)) y1[42 m~K*1zK`d»'`xm #W`˟k.A@f:0ao-uT34CB@}`= |`߇ }!P/h0a2]f t?70u]C=uFIQ%!ty%?Rڶ`fc:rd9ogD#Y ADʹ|g8&O(OnVNn1qN~3u׼<| ߀ap>>ї |dea`epqq`2eob@a$d)#Z}٫ }^viIFPv`n}h!ë7t 0_@$dvjOUd;/(Kp1,m9R >QHYQҘ/`'Yx9x8YE,3rxA|"0Np pu~iynQ%zCx%hSȇ 4ihƝ}y ETXA[@41 L@0r-+ Qd41CU* *.]?ˍR\.X NbiՅ&=̹wMXDb%BKL}^ NTSy~Jz 2iìb3/T.9F@H ݀df [k`7j4F%t"7Og[ o [UjA͛N).?v~BjV͝^6]C?ESA"7g$1ڈ(Y0aӧ&V{gy^P?xH]Ƙs%cWB@E BY)LV_LYY( )e4jvs9;4V Q2GT< 3Sn;HG [T'pSr æx oej`) *4IXco%xk"MXDQ$^gtд(/OX?,'./"jez;d3ʀxH:h+/MIo+'LW%g=nRC0 Ukj64L)X 2tJ2<ߠ%2 f~B^@X贐 ^vHD(B AO10H00r5ey95䂔. 9 @&y9_?xO_oe&^` ,`20bި2|B73ó9l}RLTDArN !l<|x>w`WꃇcN׸]ER/ ^ LL>99 ^ԕ?OAU1ǀRUAa`&Y)7FyqEX?iD6%P~vUAg ~C ꁴ 7"9"z h0$~|>6.gI}ae`<@1jS`tD? ;444@ځnx@(he>v1` (W^@81@57>=g8,(,jmlc-bĜu_=^at4@hF `? +hC(4a?<1"n78@.}٠'`+)E11s9jЌۏ}{p5s#fy5eP&Pbba"fΘo#!Hi0hm~j!v`yLm`& CVq+_^2l|x1vfVv#Հ s&,x'hhy8z=t?U؆F2Op3p=#^!+!_sv$NF,8FF&F)  2l3xU3 qVil (@xPD߿G{ ? cx;_#/ -Ƞ#Š#Ƞ @ |zX 8/n4ϟ^޼yO^`qq ϟ?A篑#w_ڪ a`%0@@%(GD9x0aXaDRF.~G2"/#BnA{ ?U~): Z@r3d ٟ?DXF@HQ9 ҲF[J?gק+ë&70~}ѷ *@XN,c 6|T1;rL-#thV%_@opDr5(Š~Kï]An`1d.VE^ E0eN?`}6vK¢ v ,6`e :Fbyɺv-G:wIFRZYV: ط3;>VdA݊WFZ0t7vx͕-j0e!`Ec1^o GL2E er-SY8H yH+}<;p̠`Rp. lmRM,D}QY`R ᔢhY`qȾ@D'!߀X=/q"b w_odF΄LVQ.1?ȢR^]9;q `KWq#%eiZT3W3@`X6@/x?`߁_`o`r]"?l< NܠR  c`74_[JTF\y9&J2 | t3 sބ+^:Lۏ}dfto, !ӗL 522(w??3l~za R!: .: Z@d&(VĐs1!֠:Ь(ghE4@HE2H_h'8! L\,lFaV@l`$@T<>pczk@\)D?`!rm*(20ܾ}ǝ g 㣏?8w:.FPNlA9» }3Cǁعt4~~Vdx4872Zր-? la؟?E6DoxPDz F+0's01 @#6B젥`h;!UW/1A94yiG0< o/>erGn~Af}YVϟŷo 6& _e!whr30Y 0|K =4Dt}_I)Q`^dA9E_ ܌HF8 h\y&&&#*?$O: zp4`2&pgB!@:z٠?A`Jx"Ƃ۬8ߧ Ǣ0r : GĚ7 |cl] ,_xl%CnbX`5CV~5Mh;ԍBD %^&!a8*p?Z7'P`[oL oLx0= |#Ϛ ^fqeqtf01dϿ@ Oӷ_ic1#/_ӣ eΏ`. hh?l<r~#z]ln:ثk>`TE@AJJgccpusf8t.TDb ݻO._!VR>.xt82 ×X`ScA! X2|O{1a _^ȱZ@]PPŁFRc7 Ó+oh ,^UlblP1cmXC#Șh*/`c1{{& PQM`ZDҥ112C5m[4q4z) 8ۧKo^4 Z^-$(G _d16J02d`^yg1c ?I˨8Ā!>% `9"Xᙗ0=`¹ɰfDg2<ADH r#8FFFV5dB.FA_- E^b꞊s 3D(:0Z_6>:pup"_޳1'`-|>e4, ZUt_6W3/)iܔd]],wu} 47i9Y#k2e}ˠ&Đ.{aæ OM9 [VQF J .v`fvr h0 )q2|莝 mdx1ds>A`sH+x`g#r=fF-}Dk~"<_DŌTb@GV|6$W> Vh#]p5cG3DF.@]oo2~y8P6 8.䥋k= @&н""v>^vra?GO/*oy2 3q2왵JZ1\ Ϣ  Qn99؀ NH ]X02|e7峧p`ۑs=3,31 E.lcP2u M\8ooc۟10O<`عsCTt<0p]ON1\~wLJ Ͽ%!ػ=]YXYYf202@$3|dCYl > 4#(pcpTGYM{ &bse,Sz#I9~4(7NE%=<, o?3 ^ fv *Z.0x+ɀz6 } -< X3!?@\7AeaTrbXrw/Ík+Ra_f@Z("Ȉ_^W?7tK a/`ȹ4 #mspWm_YR*| 7.e8y3#jXEHӬ=-1Lê Fp1#MgDXjWw A3>a &} ojo}~Bރڸ9^[ؾV YW~F&`=ޅDr: bO3d60PA,o\c8ChpJ`/u#FN^ {cpc8r5sS. h 5VH 9&W(JXB7e. _8޼{p61<}p X"JF(yzx#>hR݁m/0! _L R1 <'3ʩs & zf~/p[/ %k`4s X&^d\ g8u9>۷oI*ʲ|N0Wϼ7¢ 3 6J3,?F=1d)9yi5R1 /9Q"xl^0'7xFM!ۄ ؃р_/1ں=CY%0T>  M!%D.9%#$F`@<_'ùW7$ի x8<6ACܠR4 -i lر X,*7npwCReO=eصkCPxn7`?tStm #+> B @f&ԭ׌ {`U`a!h!v.)`˟T2 Wv߀W11|S r1ܑ '6nd xv_AHX < C'Xr|<JzFcJ# vy>i=Ap{/3 ,& !pї?\@ # `]Xq f@@??Kki, |5֭m$$e>|?x [!(˰i?>I20~^ ܥPӘ6|,xAYn~ N~7@0-Ahw!F1ܾԎm ޿c``Rhv4`UЪixA3 D^ <~x;6Aqs$8Y  2CLh|.ee6 A}2 +p0|2` J?1\t$@Ї}z |ca ZZ3/-ZE?%>@L?pd:GWJq$'tM*jF$1!@mހlzi2%2L+0lNH h4 8(!W\46"+ϟ!**.NHC"8v'Z*%#pun2 `DJo!G, 49#{`@4a[&0!(q L͆ _5U Wyv/1صڵ ϟ{ NN^r<.1Y82K1 ̯ol 3RBY,q~~>m@T亟= `cDl``b5b/q6R+/gO2\}| W@HO/n|p#`_|L xp 7@6;/dO?_+A{*@;dкjaаݻ `Dn\^!nkXqpp16 [?! ^&ZZ/Z'O2HKÁ"E"4Zp J J|R8@cmWDcHkSM@w䂎7ey|}_@ZƠ@bBJ#hpbrpdt`8~`Mn,FM4ix>l|gbn@1#FP} `) `/p[3y{`${`Dj', Ƭ0|< e04eNb0t&v%p'b- #d\" r ~c80ÍہJASKWd-mW'@nR z:?Dv L&[Z3iȁwÊwP1wE+W18UF+iu"aPU5tlA%<ÏOFV Lж46| 9P\"KˠJa1#ټ qI`ېOA[ x/ g`B;=3\ \F 0q{ + |l  J`O ]]M\uob83NP,h 4PzH]&kZxx 0!J1; ,~3dgoW`|{ pU)=L{l}^InIp;+xSw0g_@ ?%=`;4!'Sv3Yε+ lꁝ~!3 N0{d]=##K-'DXV]AF@Gڱ @d'PzwEwW+} FG^%^r;S![FF"(!s10!x3 3{ 0!WCkPBhn :A€Z nK=F?##7-`' AJ@mv_`LK`7s {`8w ("+  4|dLE%U;`A[|w?A%uDI :BV@Sh˗mJ@KA= ##r&Dy trYYȂɛS~zfa6`ρq4PvBvJ^pYJhB:LT=vq13ȳ3v7|ir4a]s1xa?x`Z{1 2 ؾu(7l_10>4?i&wo߾ J(wʳGFxbA|\ V3Z0(),0u-`F1qq`*tD`PO̖у?+Ïwx;58bg`BxW |90!BFm Ҹ.2 "q 3X)0hr;>zA#Rael JÇ.ưaB|!8<?7i e*P@]FG@%ߠ!n BB|qo߾1,_PMKa3"P둂^H0#yih@h83X8_1|?pg , %v&bh~}?2|&`i?e#Z#.ed@MLH6@ W`ֿMI!@Uޣ 26p3 O1|uQ~Ƞ#Ƞ' +]! o&πP1At~`!Z̜_X Gfxu1ߞ /2 08g*3YJl Ͻ`XD@nf :T 7n`8<@kK;8qgxxyGR .t7D2t '-- aJfca@Ǻ64Q~' ;|@',`_oÑ;͞pf1\ lEKClE،[2AGA$Έ<' ~$N4hwi*Ll 2V 76-:`i (`- /×ex3Lg02e8~z 6{ ofr î;ݹg*'e`{l3@&PgBx]~ ^e&II)_'|AS8XU|(SGA,G9u- , ނ ֍V.pie6 M~A0&4!\Ɨw ڼ" GؚQW d 9 CC,@K MDRa _a:i2X?p_u`"oH_?Fx+lSЪu~4@]BV$3xlr"xʗ@?F&,7i 6kb]<_QdQhd2g Ê36\pO"ീx!{PK+^3\A 8a:`@Jy|?ttiX 8~' U&Qhzt, "N;۷n0s ^b$=g@iDrϟ\]eeŀ0!t뗀-P`: Dv`-U2|`4 4;t:Cxsr 2;Q |5?`O0J`F/ f7/^k-.$|= xq&y[mf JvA i[ |? ]$d(`E~6H7d`h [F >/`t ("?# 3 ' _=cx99 kY%? >]s'+Ơo lms1ܽ~Ȣ= U>:c¹O.90!(q =?9 H C P??s8U+#ó?^L8Oϟ"K݅M\ _dL2F̉G?/uX,!AK,@ϰ.rF&T2o߿6?_>s)$B>0z@5ëWo 8@QDTAYE_AL\ARB |vk^:AAWӳ2aM gMb87;cIvH"tJ)(Yg?=c8" uό?Pz!CWJR>1E tsWYq-0X20\ d _=h} @Q#"!d` . fcx0%?cx 'O^x Y:y rIhCA۳@W 1<}|!)5A"&(Az@ ӁlVV iX`Ȓ/f&Fxo4D;xw0V-peu HkcҷW  v j\bCT:Ǡ(j+X|Kd~6ưiQzoęAkAo012~u- 4ZdqoLЬ???x ydudO$R,8_@aI [l`HJ7@Ce#j!tPT]"z83bp|,j`6`#M~  1Lcذj>cKp3jX"3&$xq=2"N°{s?;}l} ;NC%+ֶA[Y%4x @Q)0=~ßK{Z#TofU`Xf<,[@6.0 LD?dP`3勗 (# mG*W0W3b-& 8e512,3a϶ ON?bx$^bhD&^0{X΂j > X_wAQyBn(h|cvN3l~YH} ]`9MK~``b160|\-0CK8DC] XB \Јh'(♠d1E&(`g@41mr3Zr5=#. poib??#b b^> u72h$7Í bf%Mlh'0>^p#;_3ư{vG)k` X6v ePd7|M+Wÿ?L$GxXKf6)`؈"2@T)-?~: 2rv( ){&.D_3{ˏ Rr 7hE%3GS? x<-s'u훷\p!>0e{+O?s1rf iB+ 37/2H3˃*Y-;Nt:8 < 6 /`ظ.+%I}myK^Q tv߿G]fP `6ݥӧ oauþ.]73u!˜6xd/ <>U7}>vB#֥X0a ؛x;0`jdbH#(K1\v$й ߙPiؤu^X@JӧҲg  ۗo@j={KW0=sų_^efy+OiFnsEf'G߿T|"J#:$+0ܹ} 8#Yo \┷:. MX0ada$&!>K`x7J,Z21g&Î6#/ѓE~j)&JA`[>,-b;c/ b`cTg *&/_f0~~ o{p%ϟ?ad{߇BOٹ_9!)ؽ XO߈c'eì&7W"bff@ L߿gy!ý;w.;ϰo^6.aܚJT0rw@*7Xik ;3?F%0=ޕ(vto,ޘ1|b mBz_uӾ=i 'Ͼˡ>toL T}g`Qf %]Mq_!0b`G9>Yx`WUF?x68C6 m|3A`/oxzd5+D{YAs`r=;n19tŋ UQ{8?C&`[Rt)t_3>ޛT*o@%?`'JM?wEO?[v|İS_̂d\zL@,TLO Wvvo"Ly`6ӛ`lb7^\xĉ, _|ex5HpgN/}/$sʘ&(XV'9 I`6RoЙڌ\48`~/Sho 1'Ik?28b8y5N_,"G9\+,b`33#5K#@|8A GbBKH"E2]-Μ:Ͱonp"Xp ^.]T&#+7`.?Z##ฮ0 |KO]ջKWq$z ShiƋXw+|ŀXPFkԂCE`nDjX0**,\.$'Έi0LF~o-uZ8w1(6CF@ Eɬ&,!U4 a!A>#/ E~K= \h0 cGL?*'/2e2hyxav._N(!,MO>=vK'9bO]e:{ 8\Fr"d"_1x NOL٪}['B+y9`ł_̐X;@CV/56ϻZ.cv?GpB p@7Z_\T& N2XjpH Շ15 lF:`u`i\ E,i=yp2b\e&~hLj}stK2n9+`O۞i3V6@EABBJGˈ"1썴OFp*q~p~xTF=uZEO 72nYsX#Ƀ. ,U+Fꕪkj+W}Oc~>O|hx,DCQ37Қu"D['븩Yoi1?}+\Vߜ 8bBb鴚N)OaJ hfWT yO0!U[`|'E#Uo b$쐹8pC;hr{#*[4;by`]3#rּ0Z5Fu:Cf3 7$/|-XW:R4JkX~fLltI;zf!>R@L}6*$\ mk70 M ,S#[@woH'I:d|)A&n3RU񱸅>PVB} ͮ y{.^3H XX1 /fjbJY Vq *_cS3o D]"b'gQ+&ip6ځvpfGxi"Uf'b%rqC;|ҿ=0]ޏI`՘Y~'v{Dl> 2E<D& q.q~ܼ&4}۷]0pk0|:FpTL[׀W5Fe"DMfˌ %-=5]0AW|UgwO-6^'UsQ_DZ2`%mAꋗ /^:{+}Z^e׮I%l贉ك M9q5.n}DXlbVeBYP$ Jfk;MbӞnʮgބ6ԕUCBj=#5o!-c9Ɨ"jmb#C' *oOnW6~4:Qom]L^<$ ڛ->CP**ifYG'+c(3:)K^r00~W]yQ~=|/6sVI$60\*^y5mfhѴPytl.XyFh&  Z ]TP]xUjxʫxMsdgVH Lg)tG|mRƆe OmNN0_gYٙ0'=dRJg_F ȟDv!75MٍOa5;B:`R[-MqlNġOkjv XYa#.sX g3tL'$0VŻ(9} cY]>ٲ6,d0V br;]ӗf&%>d㯕Xyv~-yr]k| ҧy%7Uwk9.i9Կ|}a{oxT/nᯨ^[WoKG;7[^1[-?p̷K+֐?@{gFJY3f.P.*J 83+Msޓv_CG1y7[u;:gWUS<ūdZWtDکm|kwP/R);7{QގQpe*?ַ{1lpzH ڱ2^gDe^y||zy7~6,-,I,o\°DoR:Gh)FW`O|褶0j2fFtZ棏"'K)%7Bsw^՟X ?I$Ȝq,"mbsI;5Y_-5\oAEɣ?<8f2(0Ⱦ}U.`M O$S=T HlZӨ  O V-ufxd,]vɚ#L ~&A ANFWO5V~[(w_}1PO|nzkؓ\hQMCYy·NloN V)y%o.+}NMbdf!}/])fP)#yV8Q̢5U<’ux1~4[g6d'`=ŧ򖞼+Kmb}SQʋIOߧ-{M5խnVދ%eTʿ>JJxx"" CCބOO݉!!, WpH,@@Ig0 ax J!4(߈c`h.egoj!h c!P WYCIKMGCA;dompdf-0.6.2/www/test/images/grid-36.gif000066400000000000000000000001651263120276100177040ustar00rootroot00000000000000GIF89a$$!,$$L՜N_Hc j6&P}t[v%aVsDEKSWvTCTVmXS;dompdf-0.6.2/www/test/images/html.png000066400000000000000000000013541263120276100175150ustar00rootroot00000000000000PNG  IHDR(-S}PLTEe ,B,C#,>'1<6V"8Y&9_=d>e0 |KO]ջKWq$z ShiƋXw+|ŀXPFkԂCE`nDjX0**,\.$'Έi0LF~o-uZ8w1(6CF@ Eɬ&,!U4 a!A>#/ E~K= \h0 cGL?*'/2e2hyxav._N(!,MO>=vK'9bO]e:{ 8\Fr"d"_1x NOL٪}['B+y9`ł_̐X;@CV/56ϻZ.cv?GpB p@7Z_\T& N2XjpH Շ15 lF:`u`i\ E,i=yp2b\e&~hLj}stK2n9+`O۞i3V6@EABBJGˈ"1썴OFp*q~p~xTF=uZEO 72nYsX#Ƀ. ,U+Fꕪkj+W}Oc~>O|hx,DCQ37Қu"D['븩Yoi1?}+\Vߜ 8bBb鴚N)OaJ hfWT yO0!U[`|'E#Uo b$쐹8pC;hr{#*[4;by`]3#rּ0Z5Fu:Cf3 7$/|-XW:R4JkX~fLltI;zf!>R@L}6*$\ mk70 M ,S#[@woH'I:d|)A&n3RU񱸅>PVB} ͮ y{.^3H XX1 /fjbJY Vq *_cS3o D]"b'gQ+&ip6ځvpfGxi"Uf'b%rqC;|ҿ=0]ޏI`՘Y~'v{Dl> 2E<D& q.q~ܼ&4}۷]0pk0|:FpTL[׀W5Fe"DMfˌ %-=5]0AW|UgwO-6^'UsQ_DZ2`%mAꋗ /^:{+}Z^e׮I%l贉ك M9q5.n}DXlbVeBYP$ Jfk;MbӞnʮgބ6ԕUCBj=#5o!-c9Ɨ"jmb#C' *oOnW6~4:Qom]L^<$ ڛ->CP**ifYG'+c(3:)K^r00~W]yQ~=|/6sVI$60\*^y5mfhѴPytl.XyFh&  Z ]TP]xUjxʫxMsdgVH Lg)tG|mRƆe OmNN0_gYٙ0'=dRJg_F ȟDv!75MٍOa5;B:`R[-MqlNġOkjv XYa#.sX g3tL'$0VŻ(9} cY]>ٲ6,d0V br;]ӗf&%>d㯕Xyv~-yr]k| ҧy%7Uwk9.i9Կ|}a{oxT/nᯨ^[WoKG;7[^1[-?p̷K+֐?@{gFJY3f.P.*J 83+Msޓv_CG1y7[u;:gWUS<ūdZWtDکm|kwP/R);7{QގQpe*?ַ{1lpzH ڱ2^gDe^y||zy7~6,-,I,o\°DoR:Gh)FW`O|褶0j2fFtZ棏"'K)%7Bsw^՟X ?I$Ȝq,"mbsI;5Y_-5\oAEɣ?<8f2(0Ⱦ}U.`M O$S=T HlZӨ  O V-ufxd,]vɚ#L ~&A ANFWO5V~[(w_}1PO|nzkؓ\hQMCYy·NloN V)y%o.+}NMbdf!}/])fP)#yV8Q̢5U<’ux1~4[g6d'`=ŧ򖞼+Kmb}SQʋIOߧ-{M5խnVދ%eTʿPLTEm cs!!)1BB99))99JJ9919JJRZJJBJJJUJJYX]^RRRZabZZeZcgckilnrrvz{~ssss{{Œބđƒ猌ȗəʜ̝ͣԬ֯سﭭ޵ZtRNS@fbKGDH pHYs  ~tIME (sıIDATc```psu236fԔD '`PSV E,dńxYAA)6&*2˜1E8@p. q`~!HvC @q>@~H>.OGRZ&X$` R pCUA&&0~"H, j(gn5IENDB`dompdf-0.6.2/www/test/images/php.gif000066400000000000000000000047331263120276100173250ustar00rootroot00000000000000GIF89axCj97G(%*⡤粴CBXRRrުLKc[\;8qLL>> 2A<B- I"99"/)¡  }MPP}| QQ*rtB3-W(% &q|.llu.2",@7᤬@F ?;LE5Al `CG$5@ɓ(S\yr\ vA+CD\ /0BˣH&#GXrăΝ~ht##X(K6:,@)3.2@u HR_`,Q< e|r˘1| ֬QAΊ@``npC Ybb" % `<8) P$&x)Ht@!! -xx)gGI|Aцp/@>~P3"<4qq;ߙ"ž)@JS}piNKӟ*Ppi7Npl 1F >PX*Pyw=%li a cМ7EPn801Z1)P< l -vBlp #Pf?܋Aptw;dompdf-0.6.2/www/test/images/png.png000066400000000000000000000017511263120276100173360ustar00rootroot00000000000000PNG  IHDR(-S7PLTE y`Wuc]tfhXDmdfGoTiKUȪlLWypYXŒuw]KJ^Ă{|oSw^abeg{Vilxknzdrr~dvjpz{kZ~Ąĝ\t~x}`Ӈ_҈]Ӊ`Ői’iϐbÓs،d–ŕqؐeʜpi̧̠ϧnosʪͫvsÂ԰ŪyzԮ沂շسɓ뿒ヘƧŞĕÈʭӮˬȘʜΠϢڱfRKatRNS@fbKGDH pHYs  ~tIME 6tEXtCommentCreated with The GIMPd%nIDATc```K qg]vn߲inH[7o\F7T$uuNp\u@nE2}``Xe#hn߲rRS gb Kj/^ŠgUސY&p\5QK.1[V|A sf)3O.en=}<w]ےm53O$0_ѱ{Z(Sƌ'Im.R5}=B S&Nj 訩(J qrTxIENDB`dompdf-0.6.2/www/test/images/png/000077500000000000000000000000001263120276100166245ustar00rootroot00000000000000dompdf-0.6.2/www/test/images/png/gray16a.png000066400000000000000000000004001263120276100205760ustar00rootroot00000000000000PNG  IHDRU>_C IDATx10 ʿ 'HيU,{;fVqzͼoǬ85%D 5 j@ԀQD 5 j@ԀQD \ 5 j@ԀQD 5 j@ԀQD 5 j`yzvfSD 5 j@ԀQD 5 j@ԀQD l>PaI_IIENDB`dompdf-0.6.2/www/test/images/png/gray16a_bk.png000066400000000000000000000004161263120276100212610ustar00rootroot00000000000000PNG  IHDRU>_C bKGDP`]>IDATx10 ʿ 'HيU,{;fVqzͼoǬ85%D 5 j@ԀQD 5 j@ԀQD \ 5 j@ԀQD 5 j@ԀQD 5 j`yzvfSD 5 j@ԀQD 5 j@ԀQD l>PaI_IIENDB`dompdf-0.6.2/www/test/images/png/gray16b.png000066400000000000000000000003041263120276100206020ustar00rootroot00000000000000PNG  IHDRU>/=\tRNS:e}IDATx 0EA)o+;-ymX`vg$SPPPPPPPP~+ᠫ*********\c/8AW-U(U(U(U(U(U(U(U(U킿(IIENDB`dompdf-0.6.2/www/test/images/png/gray16b_bk.png000066400000000000000000000003221263120276100212560ustar00rootroot00000000000000PNG  IHDRU>/=\bKGDP`]>tRNS:e}IDATx 0EA)o+;-ymX`vg$SPPPPPPPP~+ᠫ*********\c/8AW-U(U(U(U(U(U(U(U(U킿(IIENDB`dompdf-0.6.2/www/test/images/png/gray8a.png000066400000000000000000000002731263120276100205270ustar00rootroot00000000000000PNG  IHDRU>ϟHIDATx1 0эޮVTp ҥ~HE􈼻?bz.r,2`*TS L%J0BJ0`*TS L%JWJJ0`*TS L%Jhu/EsIENDB`dompdf-0.6.2/www/test/images/png/gray8a_bk.png000066400000000000000000000003111263120276100211740ustar00rootroot00000000000000PNG  IHDRU>ϟHbKGDPrIDATx1 0эޮVTp ҥ~HE􈼻?bz.r,2`*TS L%J0BJ0`*TS L%JWJJ0`*TS L%Jhu/EsIENDB`dompdf-0.6.2/www/test/images/png/gray8b.png000066400000000000000000000002331263120276100205240ustar00rootroot00000000000000PNG  IHDRU>tRNS,~TIDATxK C*: BK١W}TTTTTԛiNjFSn:mIMw {K|m~IENDB`dompdf-0.6.2/www/test/images/png/gray8b_bk.png000066400000000000000000000002511263120276100212000ustar00rootroot00000000000000PNG  IHDRU>bKGDPrtRNS,~TIDATxK C*: BK١W}TTTTTԛiNjFSn:mIMw {K|m~IENDB`dompdf-0.6.2/www/test/images/png/pal.png000066400000000000000000000021601263120276100201050ustar00rootroot00000000000000PNG  IHDRU>mLPLTE@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ŠtRNS<840,($  @DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|SIDATxc8L pX[YZhkij(+)*HKIJ 0021sprq:jꨩԃpP_W[S]UYQ^VZR\TX:jꨩJ3S}{޵sm[l޴quk׬^reK,^pys̞5siSL4qB_oOwWgG{[kKsSc:jꨩ:j*LgIENDB`dompdf-0.6.2/www/test/images/png/pal_bk.png000066400000000000000000000022001263120276100205540ustar00rootroot00000000000000PNG  IHDRU>mOPLTE@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@tRNS<840,($  @DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|  $(,048<@DHLPTX\`dhlptx|SbKGD IDATxc8L pX[YZhkij(+)*HKIJ 0021sprq:jꨩԃpP_W[S]UYQ^VZR\TX:jꨩJ3S}{޵sm[l޴quk׬^reK,^pys̞5siSL4qB_oOwWgG{[kKsSc:jꨩ:j*LgIENDB`dompdf-0.6.2/www/test/images/png/pal_bk_notrns.png000066400000000000000000000016641263120276100221740ustar00rootroot00000000000000PNG  IHDRU>mOPLTE@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@bKGD IDATxc8L pX[YZhkij(+)*HKIJ 0021sprq:jꨩԃpP_W[S]UYQ^VZR\TX:jꨩJ3S}{޵sm[l޴quk׬^reK,^pys̞5siSL4qB_oOwWgG{[kKsSc:jꨩ:j*LgIENDB`dompdf-0.6.2/www/test/images/png/palb.png000066400000000000000000000002351263120276100202500ustar00rootroot00000000000000PNG  IHDRU>JPLTE9@`^tRNS@fquI_ { I赤<D/FP~,cKPU$d uCxTBHQ`=@R-[t$*J<G[n1^ $K2.ьta+kH -LEӈ4=p9lyQ'DJd,C1tl`B#rp:3m6mxE 8i^ !'Eъ=_Cizr.}$Mexf$\ǙO+KS ` X@V/x ]-h! Yp+X U^ F }&4 LX$$ H8`"6H`YϪֵqk]W*LRlK"6mc#;ZCЬz2ZlYњVӺr][va[:o^HXGV.kھP,a Xzw-fY!W!PoX^6k*ۿfnW5!Z6VtW6Ͱ7[^6 qI`3ħYWns嬳8 r|# _ag:^Azg^1}a[a3nrK`=Vn3,dJغ/ίvedwIf[slg1kXϏp g҃Fq\d:8Ɍ&- eg$åUV sigHa;urEk:ξ/a|1;8?ReoN`yv bd4&- d8Ү3mkmPϷl-C_hO&o;[x+77 sf{;\:㞳~n~Z!8ŏk6^ˍ>v!ȕwH?ұR8ãriTW]CH~gQOuxc7'])TO^vu;-;dompdf-0.6.2/www/test/images/png/result_1trns.gif000066400000000000000000000046341263120276100217670ustar00rootroot00000000000000GIF87a_H!!!111999BBBJJJJRRRRZZZZcccckkkkkssss{{{{{Ƶƽ,_HQ" DP@ P" Rtx1cGABcɇ'D9R$C-MdeCqVYM3TgN;炨=X{ǥ=nءeg( (yb*™dщA3Vicx8ɣڡfydl6ɨ.Bhz#^ea"f0JFXt:*N옜)IouNb: F mh.V'`xklΛ@wjoΦ N ך }j:>S}2) 5_J8xM7{ROMkH`Qo:I kS.tM‹Qz*;dLzW xn.7X|S L>@~ ??  @2(@% bW }+!NHݏ 80 au(< ˂?Ğ9>""$ OBگR X,:rD']گ_5UИz[2XFfR ?)󑩴$9t3 -ʼnK"҉)94ST Ӏb󢰫K1S{2L$?)G^S=])K/)ԣt!kO(l/* 4YeА̩I_,k=iTP,g#;*΢H'Lz̬bzgꓗ8Xli+;P[ nwV^nD=wXŵv`„np;]Vȍ.u4rW/vĺuyǻ^!;dompdf-0.6.2/www/test/images/png/result_dith.gif000066400000000000000000000040211263120276100216360ustar00rootroot00000000000000GIF89a_H9{{{,_H$@ A40‚ >$qĊ&RlcNJ#xdI'I>J/E8bL YtfO}2TNGm*ӧPJJիRyׯ`Ê@WV ۑZ"Wxew/Zjٶ͘6ܸҥ9ngܗ/ै7*f\1dhL趗/ zX?kZխzُ- X 5Yañ.8WN,9R'ݸuu6w{O~oEFo0VrqF@o'^Ybg\yZMR)Uq`aD}bi8܆8_Zn}[p7"H_m'`}[M #Ah()[-9+y)x`p*yaf -yIx9wAY8\"lԵ9|)en}'@Vj饘f:VJ騢`duf^iR)~+A2wsM *+h+Zjꊪf,c*b-^~ ;.^묤iBݾ8c[;lVk .VQ ,";뮿z $gK|P#|PW_7/+#v7 P7+`d>fo} $^*r Y),dB ` 0P6 86@pS t[`7`lAwPx!x # &T7Rc{-g@l =7{߀^'NBGyxX+uNo{}::~#^?9 dV-6c9m#|ݪ;n/;'nCՖn[V=.vC7= l ˜7@1y[MOp^=%-[T7ux(4]۷Efx obUx(> 0mi+W1opa`H; 2q1%)$`Nh@.΋ lmV,d+>py dގJv M$U 7!2/G3:% ϊ%B-0b%)hWOđVCE1tYhDҒ~Ehw¡"DHh:ҎDLe0WfL7G8/Lf1OH zϛKc8͇Ŷ0yc'iMa*ь#SڴXJvn#+Z?c{bK{^4'ʷ~|&.eS`PteaDbY Bqx8 b/#ŞƏ@P)%z21A\*Wؕv+ ^׾ ,`[-`AbYXƮ౐]A $19$\czvz -j6+md%KYjXgw[W~=mj[X*md'[كR.-o}іִ ,aY{X66ens'6nVkh[Zwuw YIJ7Ԗ r^vnj[ױ}}k5S- z[굞S<> 01k#:k6k[CEvBrTwQp&I>~ۓMh}0!T p|H9w# ox^C!;dompdf-0.6.2/www/test/images/png/result_mag.gif000066400000000000000000000056421263120276100214640ustar00rootroot00000000000000GIF87a_H!!))11999BBB{JJJsJ{RRRsZZZkccccckkkkcsssZ{{{R{ZRJBJB9ƭ1έ9Ƶ1ν)!)!!)19BJRZcks{,_He(c DP@ P" Rtx1cGABcɇ'D9R$C-MdeCqVYM3TgN;<ȡӧPJJիRyrW @ 8p A 8A .\Ç!H6a+Zx 6pرG?,fJ~-vhղuVܺwI6X1Ɛ#S|9sA ueQ]kx{nĉ?,e QNFm[qڍ6ܻb=Vy^giPs|ҭՖ[fWv%cE6q-`{AtUjoEvmw6`c8exr-fj]ayÝŤ$iFVZ4&%yx=H`Xܗq0Ә_1Y}H׆9n!Fbp'gzz$gYmZh?($qP2PڕNZXkRW&xvY5i\yZw#UZ')+F l1 hj(by\Wrd8l}*`t%IMEl!K/*p>@+,57ֻ@XтRjj譛'enhI-}hh szlgo?asYZE/gs8!l& ơk. v @ < wP@l#P'$ ) . 5T~ :CA8ڦt}w{ "x * C.9c9͹sP=Qr^ͮvAJ,\WA* -z8;  Ǘ@x3^:JR.hN{=mG@!w# BvN&6)Pbi7Ѐ% r}4^0!HLwlR`ln{4't6p̬n&3l()hJ&p۹w3{P*Ât$<[w˚:3NSzM&jl7XK+5$8Q#RKTSE&!g@8]| {* xk/x]-hA Yp+X U,0)X6 P&4 LX$$ H8`"C}*ڶ_;6mc%;YJ! ȅφv=mjW"C%9`[U,a X2ֱq/Ynֳ-iMZղֵ֕lxk^ e1:otKbWd׾5%/p;*$ظŬr9Bӽu5Nd0`5z^8/}J$8w?,ĝe`U2u_Kc~w1cW(N ǘɰŰhzx!& oYsLaZ8ϛ4ZX|.‹ H[ o1=7),A-au2T3鼪yՂvsLd:Intu[jwB󚭜ù}gBZ@E/l\Vj[WxƹZ-m`˛2{ZYu$JWo[cƵ'z49&ďTÂnu;ݖ]S ',u#K~)^s4;/Ɖh#/34[X mKn]纍Y}`Ga}f7[W}F{ݮy{P ;dompdf-0.6.2/www/test/images/png/result_magthr1.gif000066400000000000000000000057131263120276100222620ustar00rootroot00000000000000GIF87a_H!!))1199BBJJRRZZcckkss{{B{JsJ{ZkRssZ{R{Zccckkc99ƭ1έ9ƽ)ֵ1ΌJRBJB!)!!)19BJRZcks{,_Hx DP@ P"E, Rtx1cGABcɇ'D9R$C-MdeCqVYM3TgN;<ȡӧPJJիRyrW @ 8p (X 8x@B#Hx1dȑC=&R䠔b0V-[oέ{7zaÈ3n 92ʗ3w,^C%v-jYW6'dʖ1$N8&]m[qmMڷq+^wPy!ty`skV|5k_v-XwMxC7ҁ)7YV\tIZubga5XYvC]A\K$"gYgv|rFaWXno x@$h .VZ*U8ۅ3fߍy9L[~5$="]h_aۆy@u)|}di'G^#\Ydϩ0arW(;jRz :]2 h~4ib&ҭr''>+SVhWzUvf&[jѦիѥ{i;%Yy}ʒ.봓*9h騬f ȱyKaB^(po 2傩'i&Yl#nsCw쬩$|(2L+@pͨ>*bK?szg6lK A=dxWPX*B ,`x p )4 7`0C 5;=">ڦ 7sm7,p '` ?_ݕp| 4 >㵏scGnozջD v4b y;򭐁.| ":[5;T8EҎ-M򝏉eF05::PX2.xKl(\3e^ a8)MdK)V"xzde4 2ya-?6ȊWG:B ?jR$ŒDn[5Q9@0JL7DL'MКcIx>/7 w*~ )̉ yx1-(H)YGM^ӝ0XL֓ K~s%T9| i cL:٩QIN#&,NTTλIO/K]L;:3*ukE?,~+@K:T`Z} JCgR0D`Hb /| ],-hA YȂP*P SF(@ uBV˄%V JHB#F(B@! A +?F5} ۅVlg?ZҖִOpv6msVAH/x4"wens)kYjhIԮ-xik[ꖷ.zL\U.s[◺ՍOZvKl <#+6s+VW ƮvU]׆x5py^6c# ~GfL^wZ(>6r1lҢ6\.7F.ۜ Yf K4t.,\㓜@[Xʡmc#:u6oQZ^s+](xvs`Z^Ƴp?9MZi4[BZsa<^e5:2kAlk/E5&iiSj8ȡ^KT|XګF_vǬq,s kNb:ns;ǛwCx|v5?Pa-r6x>Sm"g|=,XU܇v?ioۙ`~v{k4 l|Ef66m???2iCx;UUM(y>WY?mVTh`w-E6_ 1AHfl ja{9$zǛJ#Hbp4 B]_4A38"\ 9d]Eb$ xd\v`)\&dlzi@h)tjfjugw.矀 ir#PFji6Jw馘vIdr:jwiFeLʨIjf^}+kiX%R52 J" :E-ۺFߊn{.fm.+ūn*EoN.;dompdf-0.6.2/www/test/images/png/result_nsbug.gif000066400000000000000000000026041263120276100220310ustar00rootroot00000000000000GIF87a_HB,_H Hp,0B >4QĊF8#G+~rcII4H ADPeL5atyMqBJhQ3%T0ӧPJJիX*ׯ`ÊKٳh8T@״pʝ;6@˷tN| A+Z(Ő78e7V9_;&keѨ<ZX@ٳ9Jwn˻ N4QĊF#G+~rcII4H ADPeL5atyMqBJhQ3%TPӧPJJիX*ׯ`;`@ X"@0]:q.XР!E(ʕ.f 9s~"ԑq蝮aÎ Plk0xz.ݺ !o &Xq)WX<263t诣˞-A >Ea¼{3"|81lcPFnz p]d_'gn=bAq]rsF_~^7uj ]x&( <4XDoJ@!pAƅaY}~[ ( W2fCvJDn!5@%ZM8^ P 5\icbIlp_|A )Y 8TP x #n,'*h{~yaG&9_tp]йit' .E a*V`E`j dK>7kJVNƅi%지'-+X@{hejnۭ™b\bZV=l::leT&mqj[i6 uV1 _/ѫY̔mhu\DP]$ۆo?E21[h:iZZ*_P^P_G@JcH&1/Qefϸst,&}˾{sg [V[`{72`k+cyk̇rf~VPIts5lg6c82{!뭻Rξ~õ"lun?Xc<2y"jo=YW]wZ*o] _4c$~}9;_@[ԦJ Ju:Dah9 H-` tP@IP`)H T9A pK@*h ZB0 h09q f2H ~PH(\ ^00@!RZch0$MCd-@UĠ5z% S(g mF66 n@D:" x|P;PurIJ~p!E$JV Oᘅ-uL(81݁HcH@r4$ 2a NlՊ5iPbJrqk?-OBz`m 1` DWд bQ1 kxm8۵e+c ы lDrG.8W g@]_Sܮo]}KREB:UMuLkDg"3v]j$ ip=B%%Ujra0]+J*Gp Y~ęe$ 9zhcюn"),)WKXZpfjtF8=|D4C,bv&Er"Sx14/#}?{򐇉ǃ7WUD-r{ۻށ8xp;xqk\&D]=r[ Z4s>Cҋ"/ɍt/w:.uW]|ŵuy]a7!~{;f?˝T.oAa+QNr_7v«߃wctnQf;yǻ~<7yAxoG/_wꅌPb73O{!?|p?}Su<|C{/{B4Ϗ_[?/Ńw;~ɏyA}7p~Gw7rg~8~8sէxXz z !v_'r˗ot~1r직؁qs q"8ma`{&o.(wshq!(m[ggR?8tvp8qL>UkGo&otp28uhub8JrRXyʷnopurv^}=gTd-hHtgrxIv0XxXssX@Gآgt'7.rlj3'uXu;'w?GE%x|cxȉv^vgyg5|cyV{ivH~`y`z=gw8VYȀ踎xHXxXNBH &:;dompdf-0.6.2/www/test/images/png/result_oprbug.gif000066400000000000000000000045731263120276100222200ustar00rootroot00000000000000GIF87a_H!!!111999JJJJRRRRZZZZcccckkkkkssss{{{{{Ƶƽ,_HQ DP@ P" Rtx1cGABcɇ'D9R$C-MdeCqVYM3TgN;x 'N\wo>BOlff\[.r=F/rÎE`ڶQ!ײT ߅yz%|hg]jر6v}x!x^p`퍴|Αt]6ۀ [$x"r-g(LhZaڽ֡8ێ#z$dgD c~׭Ƥk%x#`#ox"{3mЇtI_^%jN[ &C Wa)ڑ''xRc$O-(xg`b(&NI[!R[WgAr_JꞭ+vzG kz3gwY%.DitŨVj9 z^ ɬIJ2.*wfyv+/F+䖖j;jˣj!݋6f*bVki).A("a*4hrܲg\ZP\w] ,@@ hA"` x *w /.C 2 dYvD/i`fOvkvt"`7 & |B , #& 3cpu$\pe6l w!}:&B ~x1P8b/֘F%]W>6lμpNwz߯8톃/qℾols_:Iny&}qK ;O1[C.-s[gOv]uB p2L 5!/s;@Ez^ag0vOCVXuaf?9tHCQmYbI0d"f@DG*'g~臺/cG+oL%1Pns'<^Љ%L/lq^t!$g'I>qÒVxM&0ql hD;"#iA=c 1 y6&3da.?^o&JPyI=Rlbٻks$aI-22uc9cHFt*6sriN Q=S2~g6#s݌UxPG*T礦+i Q2E{Rady*TAŹ:].2PȡX% Wծz XJV*ZZֳ*l\=8EExa ׾u^J_K[*6G*:6ic'Q,f7MHvMQ@{Y 䳤ElzhmfkVvxpXݦM[BTJFZWҹ:htV$Qҭnva(H{w ^Mw vu]벗Ů{^UH@;dompdf-0.6.2/www/test/images/png/result_thr1.gif000066400000000000000000000046721263120276100216000ustar00rootroot00000000000000GIF87a_H!!!)))1119999BBBBJJJJJRRRRZZZZccccckkkkssss{{{{{ƭƭεν,_H_ DP@ P"E Rtx1cGABcɇ'D9R$C-MdeCqVYM3TgN;<ȡӧPJJիRyrW0, 0p@ 8p *\!C>A (PXb5jܸC>|LA)ӯÎ5V-[oε{7޾6X1!K\rf#; WdE[rv/`IFȒ+[pčlZmU]걱Nf@tpr1wsu^vlf=dYYyC G{]Queab}Ye6 µT *ZAGtҨ_cQvو? YLCW{i=\7c~[Ii9S}ydE#uH[H%Y"X*bXۚ: (q#5imAH&k2W']$y(_h8~f_"z(f>]S√yFQ1ەa שd -z$nΎ$/JGmjXV)"}+ӽ[|F:m;/1t`h'ZMi)Lh^Nj zZ u43B LjPb)!)b\&#j 4=(j+6 4D0X7h "` %pB * . 4Tn 8d<RkKhvۨ-7v㭷|ᆗp).C[~9yg:FYS騟~:0@ݭw>x'?y4\ydC=;n=o={]WnwcGn-t w p!6TLGE0ߓl)w Bl2H= O;|(@nр+"X Yg :z9">XG-'b8?fΌ@pMds'G:f\4!{5ВKlV/ mS]w ($HKyDR(le@AMP3Bh6c$2|^vqvD%#y0Sܔ KL qz h#eN鱝|g,<)z >:T_qD4& H_KQ*Wo-hFihrʫ^׾ `KXH*bSud'KY*ͬfu m'EКV$miOZɲlkgXp~ AnT ) .`ÚVF@,upJzj [φUK}.]^-/v!{+ui;I aͯ~RߢPma#pֿ ;, L ^Ƀ"`Vx 0/,a 7ΰu0!;dompdf-0.6.2/www/test/images/png/result_thr128.gif000066400000000000000000000037641263120276100217530ustar00rootroot00000000000000GIF87a_H!!!)))1119999BBBBJJJJJRRRRZZZZccccckkkkssss{{{{{,_HE(b DP@ P" Rtx1cGABcɇ'D9R$C-MdeCqVYM3TgN;<ȡӧPJJիRyrW0, 0p@ 8p *\!Ơ4*a_kZnʝkn޽},aΈw]LvYkپ+n|38oρC+ٴjۺ;eVn'#t&5Փŋ<3G7=Rzbo+qe<|R[WܻcZwaH!8Pa1zudsiw\|٧ }7uF{ePn rz eƷw˱0"c#\V_lXm@r#oDF^d7v!uL}7$G[ե=h[.F'"Z9!m_: &BQ4fUb(g8)ӠU'ɧf-\V)lgtup5wbՆi2jycKzcO_sR)Q NVK2@tAL@bv~A*l^or-kjnz.!w[c/`-{nn6=ữn߆#7\9^/ L0β*o/ Gۜ4 EO+r*@2] / /v@lNpk~d[,tE{n8܆؆|6z8m)exXe=t̚Ӽ֍/QuW9k39ğ#J];کg7o4ayケ֝/ (3ߤ=S=<҃O&ǟ2}_[z$Ǿu9sX#1r‡ q΂>{y?޺ݼckO?Dǟ{Ut Xg iX!Z)؜rX~i^ nxSb%iXxPZ- 4ֈ8RtX#X 򨐏?Ҹz-G !dMby+$ƋI;A (PXb5jܸC>|Hg2J:XhղuV\w7`È3n,ɕ/gL8Bal%4gѮeܺe X0a/f8ʖ3k6^9M̛}~6ڶn㺮[ᖘb-o{ƹB|IZuu^m[=dYz FjZ\tlV^d)7\.>S]}kg~uc![Fe+"bLLF5\# I)TWNFX(b$%'&C|S6 dC&-B@v'&l;r#nZ&j*.hrjjb)ggHzQz8k#z+FȠ:a],\n6g˒:8ly薊+Ӧv8ʢ'\ jnKz(p>*A 0h2Z jDjl/BL8-y2k殕I3+h/{B mv  <9(r^Ҧnr:Ŏ{Ǹ|\׾J6ipg;*'4 w`T!,h ꏃW8nq&4` q`9"Ё/((M?|,".o}-<>os'EaH9.^N}>\ 8L< FNvo$Xf.z$(i`'uC.qiITJ8:@ma!yRbױYK4fR{$& yiH:0hle/Bѓa"w7J"Pwvbr$dCXE82T #Ju1\' PeåIIN/YQ+E ݬ8q ё'q3a0nj%Jԥ/ǥ@ NIKCP@4Q9Iͩ;gL76S-=GDH4ֶp\Dx[LT+_bƦRudj*Dv+jV+ ^)-jM>sYՊ6l ik=KӗvENKnɆL--_6v)q܁(wm_[$J +ͮvK%h-j^/Z׼] z>~7]zW֗]o~鋔0~lX'됀;dompdf-0.6.2/www/test/images/png/result_yel.gif000066400000000000000000000056231263120276100215100ustar00rootroot00000000000000GIF87a_H!!))11999BBB{JJJ{JsRRRsZZZkccckcckkkcsssZ{{{Z{RRJJBB9911))!!!)19BJRZcks{,_Ha# DP@ P" Rtx1cGABcɇ'D9R$C-MdeCqVYM3TgN;<ȡӧPJJիRyrW @ 8p A 8A .\Ç!H6a+Zx 6pرG?,fJ~-vhղuVܺwI6X1cǐ%S9sA ueQ]kx{nĉ7yWNFm[qڍ6ܻ[cI6e {!{`7tkV~ٕlw-[pQvf &Figշ[qхlya)pwb)RνhY\֛=fh1!Iѡ֌Ayc!!Xd%VBp0_)I}H8n H yuhz$WYlR(fI=bGM !W~2Yau *enVyX#)]ifZg#S`Y(z*F *0 蓛jhZ[납Ndm8,ʺ!}* %5{^,)-@+,4ֻ *07 g+ܾx2ؠAcKߙ3+omj\ؽ? ).^̳)e%:5{ƺfn/g1kͶp3@AL@|cl # ,D 20C pC9>DEoC۪Mw7 {P"( C[y s<~$í~w{w~8) _3<П fO]}sx^;q3P}ȃ@'M+)ǀ g@ws\$@㽏s |`A_en.wC (90c3jP̞d'@ہЧ"xɋWCIm[`ΊIXAi <77r4R./cGC? 7LH7sL`WA0h0;'G>-2[)C=I&s:4@;GD%Wi?8z؋%E7PΠ*Dh4K2V3Li;'*Su$F]*M RC@ֶ `څ.p [؂,` WP*P SHX(5\5#1t[a/ɉ}gf9mgViYծ33d[G:/ޫՈ=ڸb0Ng':,LdžvcFWlW G^kd9r+Zft^8wٝmXݖ7:+HOҗ^t鿆/uObGszQn+:_A9Վ]'nzlܥw;dompdf-0.6.2/www/test/images/png/result_yelthr1.gif000066400000000000000000000056771263120276100223200ustar00rootroot00000000000000GIF87a_H!!))11999BBB{JJJ{JsRRRsZZZkccckcckkkcsssZ{{{Z{RRJJBB9911))!!!)19BJRZcks{,_Ha# DP@ P" Rtx1cGABcɇ'D9R$C-MdeCqVYM3TgN;<ȡӧPJJիRyrW @ 8p A 8A .\Ç!H6a+Zx 6pرG?&R䠔b0V-[oέ{7 ~aÈ3v Y2ʘ3w,4^C%v-jYW6'frߖHqM4۶pεۚ:loݘɖ]&DIiq聥{̭Ֆ[ftX~%nMFeTHhgw[q%k]a)oP0RȝhY\W!~ۆ=߇4g1 ڂˡ֊!}Ά!rXdV&Qq b\ {Hׄ0'm؟wmCRqWvz |'L&Q `xz$=ҩzsdf6yXB)٨BK_t+F -(瑒g: kSIVlW~`Z[uaw"Yq4n\F֣yF, bq1 Խ2贑&I!gf y;`Fk&vfˢV:7ymqǢ)Ӈ %J 'Xsɩ,;% h 0pGP``x7 %~) 2P7ܐC:ġCRkms}yסּ~B⋳O^C9,馫6.7v7ߴ.p)лKN<ˋh}jq?0كf7 .w#X ǩox3:ǼHD;N{{[E܍/qk\en@A3, ~^v PvMơ,?.ʠ6h0v p;ψڷDm^:]g=uX$` >q t#D J&rָA Iz1c ɈO"V崩ў"`8:;#өBI&̃e~e"(i$+XA\&1LTr{% +vӌC&\Q"5[4hSZs\)A[*ڐa`0 ^Hl.la ZB,\ VB@*LRh: Mh%(A IHp#E(v;PQ aX/,d+{nBh@'eka+[%Ƌ̉@1N%ak\:e1Yvv mHkZ쮶lk{nz;ʕos ]Њvnj]{-Ml{ 7/~av pw \݊4$Q{Mn|Kvֳmi dR%D>zU`%xG{L@Ul[,&4c,>F󌣕;Y,0ꗿT=ˋf4}dHCx/v{j:mq[:ja^W|33nuKMĉNM8jRf3+N6t일cN=l&v,kDq"qi,_MО>g煛ewcji} Wr6#j495w9-d낡;8,T{6m#m9EU5n{܁6 Mrd; UӻF7M]Fy3NRC[fau[$QD/FԘqbŁ;>qcH'TH IdM7]Ƅɐ'D2sJJ(H+uӧPJJըC! ׯ`ÊKٯz۷pæ6ݻx Y7߿eD$avL.䈓+k6xc͠FF9i{m>:-NYovۨ_-ݼO~;8b#z^ȣ[OyK>Ͼ~wO>x ?F'x§ M5`o(}*eeXۆGamGie≬+ ]1v_5w`(bQ#{e'IB TViXZY KQf_*S`iffElbf)o.siНx&q}arዅI!]Ydv|6FF*izw陙JJj)y6*;x@NohhUTf$6,)U,OT.ˣ&E l>E;SsjԶz,^km憛j;dompdf-0.6.2/www/test/images/png/resultb_bug.gif000066400000000000000000000030051263120276100216260ustar00rootroot00000000000000GIF87a_H,_H@ A40‚ >QD/FԘqbŁ;>qcH'TH IdM7]Ƅɐ'D2sJJ(H+u ӧPJJըC!ׯ`ÊNe(sطpD;Ykk˷/>0ͽ~8ݴ @rנBVh2e˕;VZeҟA'nysӣ'VflOoL=/i¿c$poW.hA6#;sח>=l'{IZߙs\Լ{HKG}v_\إ`aթu )_Cy{ l>(! &(f4"ma6&Ҏ)hdm<.>h@.NdN&vOdYW]iep%l~f[坩މtI`vwy$u^`yg|IKyB&VaYw*ZfF$%R(١^V*j$ɨv:ʩKUzjm+ +R6쳳F[ݔ>k*w"m|z º&C>kK vgﻔz*躨58YJr,ZAb,@>1f$j#[[2B)C"L챊*k*Cs&ۭC˲b&{PG-THzաbEu ׸.MWmP@;dompdf-0.6.2/www/test/images/png/resultb_mag.gif000066400000000000000000000026421263120276100216230ustar00rootroot00000000000000GIF87a_HB,_H H` DP@ P" Rtx1cGABcɇ'D9R$C-MdeCqVYM3TgN;<(ӧPJJիRy ׯ`Ê[ٳhӪ]VRcʝ˶]n:_w .޿^\F|Kʸr##Ol355o칳ۘG#.mYԪ@ر^\ܤwnc_{s<,MR:vos콱˯uؠٲg{oݣW|޽(hh F`[ `fgӅ f"8 e0 b&*b"X#A7⨡̽c@WPCJbvJ!@?.Xbh^Sv`$A|^BkeKqi%jlBk矀*蠁q&袆'Fg &ڨCf)N験Y)Ji:4ꪤ)묐J ª&&F;蜡)9˨%+ퟔx:-rչ覫.UkdAۮ{FaK+po+S>p Gg;dompdf-0.6.2/www/test/images/png/resultb_moz2.gif000066400000000000000000000032231263120276100217420ustar00rootroot00000000000000GIF87a_H@XG@@@WG@G/XG@G|XUG@OG@NGG`yMLy@M xGG`&L0II-d@IP`II-@IP@H{ @H{`ꬹ4I-s@X@o1@Xo1X&@@oe 1o41&@@4F@88@@X| mW{FJ8(_XT_w#cXȝQ0Ĺȹ(p10PQ0p10bȹ10ٝ10bȹ10yQGq? EGP@q@GGp`G@8GDGccEEм MXMXMXMX_1010@s10@@,_H @ A40‚ >$QD/FԘqbŁ;>qcH'TH IdM7]Ƅɐ'D2sJJ(H+uӧPJJըC! ׯ`ÊkhӢ5ڴm;Pֱxvm\}NK](o7pbܘs_=ZL+doQoStצ==}Ycۿ}㎸wԵ}]nN$QD/FԘqbŁ;>qcH'TH IdM7]Ƅɐ'D2sJJ(H+uӧPJJըC!ׯ`Ê g͢]mڷlPֱxpپ K8ptk˸1l27;,ɟ)'B͜Swm3~KbyIo'mW~s% c`oյԄڵƟe8wFx]uGߊ@^X(oGJeaRUTf #wQwY)&mgfJ =Zb9pv`Yu^Ic‰$hvBKP o٧[Fz8b۔v>i6hV*k:R))ꪬZ*l%갚P6K욃aVz:cj+.jN6>n;x琙A$Y`yZ↛WoزK^8i+F렞 ` ,$<h֡(yl0|R1笳.:%X+ĀJD7 rIZNW Rs 1mP]]5֩;1ymva; tMtܾ6Hd6=4)(p .^x9#^.ʒMȏ˭8Ōo7Ғp i.ǝ /~.:N#]e'O+5Sk8A-,}4^o=Ia3}O8oك~wO>Rڛ˿;dompdf-0.6.2/www/test/images/png/resultb_ok.gif000066400000000000000000000030411263120276100214620ustar00rootroot00000000000000GIF87a_HB,_H @ A40‚ >$QD/FԘqbŁ;>qcH'TH IdM7]Ƅɐ'D2sJJ(H+uӧPJJըC! ׯ`ÊNe (sطpD;Ykk˷/>Pͽ~8ݴ@rנBVh2e˕;VZeҟA'nysӣ'VflOoL=/i¿c%$poW.hA6#;sח>=l'{IZߙs\Լ{HKG}v_\إ`aթu )_Cy{ l>(!h()bF#4(ڋI&@'3JaM-c>c{fVaYZǡczz"#^80*lšgXzBnVczf`&*kk<RVkZ].Q{ 泿霷6sƻ Yi|ޛ/ka,u80Qpbm51Bl1q>ܪjr-H(O3/:$7_:=#KnTƶT"}J/>~N.YU`-S%rN29͵tlwr @;dompdf-0.6.2/www/test/images/png/resultb_whi.gif000066400000000000000000000026051263120276100216450ustar00rootroot00000000000000GIF87a_HJ,_H @ A40‚ >$QD/FԘqbŁ;>qcH'TH IdM7]Ƅɐ'D2sJJ(H+uӧPJJըC! ׯ`Ê[ٳhӪ]V@џ[ʝ;ݻw֌K_x .+&߿^lpOKʸrZ?!OLٲ&gϡ#.eW뺲cg˭͸ܺ'\<37z_遛n.JwvǗo|^`9kCv?;h&xXF(!>&f8 g֐!f" '*-&4j7#up Gg;dompdf-0.6.2/www/test/images/png/resultg_bla.gif000066400000000000000000000043201263120276100216150ustar00rootroot00000000000000GIF87a_H!!!)))111999BBBJJJRRRZZZccckkksss{{{,_H1p0r:X8/=;`%{ϻxfWO:x࠽7`@ W! x  mQhNU^z^{ 8 |Շ~ (Pb  @iVY(n衇1"}X)Ȣ&`ȖYކ~(#.颓28^cn!}i_!2b :^i#WpCiI0.HNЕnf\ Dyd{YO6jFۛX(県i$9h(荾zvdE6Y >aRr#*⮐B+^zNL9'*ߚjbK)PVti(ɾKb)nN+SeުllK oÞ讷=j0*ln|qwl݊>z&q8񨍚+8gjղfȋ|& gZ0g0.Z꠾qIkLqfg3bq܎luxjw k|t`y`okY`zS@Kz@ zǟ0pl~G_9{d驯$(S>ć'<KNG^wnC[CLZЕt;HZQN})7<$g8;3gd$sLƙc4]Da2qĦg;vkg8YiH`R$͈@mR^h ʱ$x6dx'Oer49P~2J*?Ӟ`L=DK'G~NeSu l`yߌJT$oۉUTE WP*լve_TbURud-Xz֬E=a[T>;kZׅ;dompdf-0.6.2/www/test/images/png/resultg_dgr.gif000066400000000000000000000050201263120276100216310ustar00rootroot00000000000000GIF87a_H!!!)))111999BBBJJJRRRZZZccckkksss{{{,_H1! DP@ P"  Rtx1cGABcɇ'D9R$C-MdeCqVYM3TgN;<AӧNB**իVbݪU*Š+6h XvpKnx(`Fp $X@AƎD~)gϦZq֥K@|,uÆ3~,9mf,Z͝;}zݻWp`+-uɹif{ٴj&.8rԩv]Cнwپ%/]Ө-ztw[cٍĝ}pwi 8`v uA|~vz( HYLxQ(wsαg#3#~A"F9#{5G݂ Ax,y!1Kd|P$eXa街 bٛ* Yxe(csoB7Mg[5R&hj^%*h[(fNgjJ†i`Rf/ꛃ^L^V랤eދFdq~Y-n_u뭟N m*oٺ;)5^d9笼4!fWe(-tA*Jk¢n\50?l 43@CH+ҵ5+T1<7;ЀZB M4d'Ӯ[bNSrWӜ9w3a]tK}cQU-ss>F4چ;T˅M35ӽ8=6G37iw\n58+8Ў 蒟a:c.ё-s(o,vl=9ڼO?}]W5gO?a?_ޤo2 sÞ<.V@;nJǼщ't`wA5.tz|mx"/yc!]B-k,2H4io:6/ #{ OGB)F\ B&&D~3 0wWL١-JpP [N$<z6Ԡ $Xy  $' X&9 xRFiRVHV)VF:wN(KK~d8On%)MJUҕ%hYZ$}Ln @FyRZH%V9VJpVKkzyۥ6%K` D2t:Ќ4ەR}V 7dsl:hΓ{=GӢ0yLqbD:NxsvK8bUtFjSt$BYMVZy)R/)Svt9)OiաC-P`T3hM=zS=5)PjK\Zgj[Ѹ2N AGВ*gk8CV2\Tu(E-B@?JPBR,_%B|kWUT5z5lEĴljںcZO▱%MrUֆuculYZݴ6&&jYv6myGędw,o[w_#Ѣ5lwJwT*}#MnWe{ռ*B k.KO 6~Eq!Rue=$Wc ?.N~cH6$ DL(/Y;2;dompdf-0.6.2/www/test/images/png/resultg_lgr.gif000066400000000000000000000047671263120276100216620ustar00rootroot00000000000000GIF87a_H!!!)))111999BBBJJJRRRZZZccckkksss{{{,_H1Đ_:v贋<|;jN}_";w<^:qߋ~Mz o&%_8>f?O~,1]|_?HAn_tB0<DhŰZ`R(2NP|H8LMnX6 6I8<R)D!bpB$Z[2"#EJu[xE3?d'FV1q^D `?n1j Nz(G)J*WJt%6@ZR%.+ҡqP( *SV򕲜,my rp۔=p '2=evt:eiRּ&^ DIc"SD9h²Դfj5EzӒb FJѳ}ldKٸAڎ J1dZZbV<#gJU Ա5ljSӚ'kQ6]pIT"mb=[UئӠmi`+kYJ= bRrtm=/TQiu.{URyIzҵzMklKSrv[ 檃\b6 qDLb'q;#fQb@i1x(,~SE/cxG1|%;99qM;dompdf-0.6.2/www/test/images/png/resultg_no.gif000066400000000000000000000025331263120276100214770ustar00rootroot00000000000000GIF87a_H,_H@ A40‚ >QD/FԘqbŁ;>qcH'TH IdM7]Ƅɐ'D2sJJ(H+u ӧPJJըC!ׯ`ÊKٯz۷pæ6ݻxY7߿eD$avL.䈓+k6xc͠FF9i{m>:-Yovۨ_-ݼO~;8b#z^ȣ[:]G-O]O> 뷟agl&n 6hFRVRZXamihasy(Q(!_&:^* c8#5<@)Di䏂L6AӒPVi=XveZ.dI@iWYlpbi'|F "u}Jt)h 行fbv'JJ^v$KZڧ$Bn.u#ǡJ*H͔^@8y`.J[VK~Kb@;dompdf-0.6.2/www/test/images/png/resultga.gif000066400000000000000000000067651263120276100211570ustar00rootroot00000000000000GIF87a_H #'!!!$$$'''!!+$$/***---''3**7--;00044477700?:::===44C77G::K==OAAAFFFIIILLLOOO@@SCCWFF[II_SSSVVVYYY\\\___LLcOOgSSkVVoYYs\\w__{bbbeeehhhkkkooobbrrruuuxxx{{{~~~eehhkkoorruuxx{{~~ÚǝˣæŧǠϨɩ˪ͫϣӦ׬ѭӮժۭ߰ױٲ۳ݴ߰㳳絵ᶶ㷷嶶븸繹黻빹\\,_H ( DP@HM0%RԸ#DAvt#C#DdCa&Tra͇7'dyRfF;iړK1δӧPJJիRׯ`(p $LPB >0q0l܈!c=|PI'Or3hҴi)T^4%`[FȚE+![p?k |aP0v 9 &ʖ13Gjtg!xòNó^ǴnƵ~˶zQ;zŮz+`JƯ,)HQLjoֹv׺Ȧ׻ؼؽپ&ٿJ#R)g%+yrn4 ΉssB-Hžz簨El*zŮʧul+BqCdj' o7OK&V>.vK_Н"5Q {Wn5-A!yK'tQGHuWgu]vt.-c6­>-dFhIykٸ9yH3u9;%GnD`,d [/|A k< mؗB4': P$HX# WB-nQ X0p* l (A ~  8a W DP1!+jxڂ=( " N'Q  z P* #DQN ‹0*hCbh!FU*#r#811E(AjQ8cEd Jql%rR ̣ J+!d JDd 9#K>؛u^nr a'3xbъ@)QhfH+m( jF-͢aśC83mC:yB/,EIDB*N(",¡($*1F¢.46VF:P<VPA L'HHN7J`xDl{HԓA9TO}("@!UVi,oU^H*8ЬQQu%+3[X׉'a_7*h(gJT1T0( [d!]z!_ ֈ UxX:gj:– /{U3V@,LD$`bOGǮ}j!);0R7Nר\rw:rPxڣJQKs([q-n~ ~9y\3Q{csJH"D# I6įXR)JҺt-$ؗ};8JAu{{7cCM;IwTp5}nH)L #\FYfXf%>>BӃ=QF89QrX:ԡtnF3et6c.F1ajTcRןwAH]t@ZҔ.3N5qT1dmZo+碰?zЅ>hF#ƎюekxvG jF_ktsz6cOőoh6!l6?MpٽhW\!;Q @o-͍/g.ly{!2TvddjW:1b?{&!No1N=/7|ğ]w51}_ž~h|9gi7zit~j}Vە#{{huV~igzbGj|Ї Fg_@Hw}Glw&ihj}Է=fP}n(7o(z mD kJ8 +A)h6y.88lwo$hz6)hmGm/8}fIT0n78 o=xivoFp+E h׃&rhrrEkod{&4WX;?Cptdt(sfwpxssuvvy dgmhlOhTzW~l xfxxzS8TghD+2vŸVyVp  )0 9i9;dompdf-0.6.2/www/test/images/png/resultgb.gif000066400000000000000000000030021263120276100211350ustar00rootroot00000000000000GIF87a_H,_H(p DP@8@%RԸ#DAvt#C#DdCa&Tra͇7'dyRfF;iړK1δӧPJJիRׯ`ÊKV΢B=gײpƽЭ ۮ}+_+Q/^ǭxmLg+,n䤄Bȗg1;^*Ξ'B-QN,:4iׯ&=mۭK wo/VZኴ{C⫡G's:Ekn6s[Oyφ'ɾWJ#Ď}DK|)|U].!WHzv`^ "G ~Xh⇌Y^&hw!(bhhcVl=S9xW[;h:iF-Z7"$cRDeY_mic2 Cb^DͧR-ⷦQԀfމUzfn~$yUXB҈l-ZUAN(9)U":i'}:U>wFYTj뭸뮹^ rKjE+[쓡6묭^FѲ=kmlisvkrukޖ mڶYW暋.ike|Kmw)[*y˛?v0aot@|6UgXUmy֛ FYF@6Y*T! Ԇ v@ Ƞ9d(FЊM0"v5w9bc^=^N)d)hUC*hߒT SxRxY"yPihi)!l)nڜxi*'^^bMH裆FZ"ZzФ$D*Nީen*FhgYZ뇽ƹk'qĊ&RlcNJ#xdI'I>J/E8bL YtfO}2TNGmӧPJJիRy ׯ`ÊٳH!r%˶m۳p*=(`ۻxݛ5ݼ&nNJm|2`ɓ"l/潚7wN9nQG-}.Ԫɲnmvl`6X \û7wr˫jumt)"O~}܍ۇw3Q _O2Pß/wZH nT-u>tB]]NHPNWlY&Jb0(4h#8P7D #}!56yT(esCV se\>F^Ҙd)Kh$|զ7xڜtF eyix) *{XסocF$I JɥR,7ّ꣧jH(Z&Eژ:k :챸;dompdf-0.6.2/www/test/images/png/resultpb_no.gif000066400000000000000000000026351263120276100216550ustar00rootroot00000000000000GIF87a_H9B,_H X8xP@X@B)VT1#FA~tȇ'%D/ETrL7itfO?MhCEu&hpӧPJJիXׯ`Ê6ٳhӪ]6퀭dʝ۶]oy:߮w 6iD̸nޘKڸڷ3#Ol3ᛚ7+y@Тl@ԩ:bBرn\{ܒw3M76ixM m2yR:^zw >|}Ww϶K}s(8~@"hVh!՛o ^a~Zx`lP&()H&HG, Ҕ8%(zDbv $!2ɐOhzTVIDe\%WB6&bTgcQlmi咧|矀9g j衈6s複)$Nf꩞\j駡69Nyj骄ӫ6Zf>jdf::(+(2YFjj%e%kյ Jzۥۮ++Ƌ.{[o>/R|0 /74tRNS@??? JIDATxݱmC1ApaTe*Uw`ՠL3?k.skzŧy &ɟ&iɟ&iɟ&iɟ&iɟ&^g!LpO?M4O?M4O?M4O?M4O?g=cvɘz!niɟ&iɟ&iɟ&iɟ&i|\MIENDB`dompdf-0.6.2/www/test/images/png/rgb16_t_bk.png000066400000000000000000000005021263120276100212470ustar00rootroot00000000000000PNG  IHDRU>4tRNS@??? JbKGDiIDATxݱmC1ApaTe*Uw`ՠL3?k.skzŧy &ɟ&iɟ&iɟ&iɟ&iɟ&^g!LpO?M4O?M4O?M4O?M4O?g=cvɘz!niɟ&iɟ&iɟ&iɟ&i|\MIENDB`dompdf-0.6.2/www/test/images/png/rgb8_t.png000066400000000000000000000003271263120276100205210ustar00rootroot00000000000000PNG  IHDRU>դtRNS?AZfIDATx 0QPKeƕf^QMV^pLm[~6g~6g~%۾lf?lf?l+{ )~6g~6g~mt ){IENDB`dompdf-0.6.2/www/test/images/png/rgb8_t_bk.png000066400000000000000000000003511263120276100211720ustar00rootroot00000000000000PNG  IHDRU>դtRNS?AZfbKGD%~IDATx 0QPKeƕf^QMV^pLm[~6g~6g~%۾lf?lf?l+{ )~6g~6g~mt ){IENDB`dompdf-0.6.2/www/test/images/png/rgba16.png000066400000000000000000000004761263120276100204230ustar00rootroot00000000000000PNG  IHDRU> VIDATx1n0#3c @BiUfseXZ33{a?5f=2O'?5kG]$TJPI* B%A$ TJPI* B%A$ TJug+SpK~TJPI* B%A$ TJPI* B%A$ TJPIL}q| ig TJPI* B%A$ TJPI* B%A$ Tkw@W4#IENDB`dompdf-0.6.2/www/test/images/png/rgba16_bk.png000066400000000000000000000005201263120276100210650ustar00rootroot00000000000000PNG  IHDRU> VbKGDiIDATx1n0#3c @BiUfseXZ33{a?5f=2O'?5kG]$TJPI* B%A$ TJPI* B%A$ TJug+SpK~TJPI* B%A$ TJPI* B%A$ TJPIL}q| ig TJPI* B%A$ TJPI* B%A$ Tkw@W4#IENDB`dompdf-0.6.2/www/test/images/png/rgba8.png000066400000000000000000000004161263120276100203360ustar00rootroot00000000000000PNG  IHDRU>ZWIDATxAB1@x{;9_!hd׋ȶ1uffq93sD 5 j@ԀQD 5 j@ԀQD k|ԂQD 5 j@ԀQD 5 j@ԀQk4{TֲGU5 j@ԀQD 5 j@ԀQD 5 j`m(?У;\}dIENDB`dompdf-0.6.2/www/test/images/png/rgba8_bk.png000066400000000000000000000004401263120276100210070ustar00rootroot00000000000000PNG  IHDRU>ZWbKGD%~IDATxAB1@x{;9_!hd׋ȶ1uffq93sD 5 j@ԀQD 5 j@ԀQD k|ԂQD 5 j@ԀQD 5 j@ԀQk4{TֲGU5 j@ԀQD 5 j@ԀQD 5 j`m(?У;\}dIENDB`dompdf-0.6.2/www/test/images/png/stripe.gif000066400000000000000000000016621263120276100206260ustar00rootroot00000000000000GIF89a ,  I{RD8kjbuT,TbQoijΣ6[yNY.sv-`/iĭT,"G?j s@4*;>eꢷ?rP_ 0 |KO]ջKWq$z ShiƋXw+|ŀXPFkԂCE`nDjX0**,\.$'Έi0LF~o-uZ8w1(6CF@ Eɬ&,!U4 a!A>#/ E~K= \h0 cGL?*'/2e2hyxav._N(!,MO>=vK'9bO]e:{ 8\Fr"d"_1x NOL٪}['B+y9`ł_̐X;@CV/56ϻZ.cv?GpB p@7Z_\T& N2XjpH Շ15 lF:`u`i\ E,i=yp2b\e&~hLj}stK2n9+`O۞i3V6@EABBJGˈ"1썴OFp*q~p~xTF=uZEO 72nYsX#Ƀ. ,U+Fꕪkj+W}Oc~>O|hx,DCQ37Қu"D['븩Yoi1?}+\Vߜ 8bBb鴚N)OaJ hfWT yO0!U[`|'E#Uo b$쐹8pC;hr{#*[4;by`]3#rּ0Z5Fu:Cf3 7$/|-XW:R4JkX~fLltI;zf!>R@L}6*$\ mk70 M ,S#[@woH'I:d|)A&n3RU񱸅>PVB} ͮ y{.^3H XX1 /fjbJY Vq *_cS3o D]"b'gQ+&ip6ځvpfGxi"Uf'b%rqC;|ҿ=0]ޏI`՘Y~'v{Dl> 2E<D& q.q~ܼ&4}۷]0pk0|:FpTL[׀W5Fe"DMfˌ %-=5]0AW|UgwO-6^'UsQ_DZ2`%mAꋗ /^:{+}Z^e׮I%l贉ك M9q5.n}DXlbVeBYP$ Jfk;MbӞnʮgބ6ԕUCBj=#5o!-c9Ɨ"jmb#C' *oOnW6~4:Qom]L^<$ ڛ->CP**ifYG'+c(3:)K^r00~W]yQ~=|/6sVI$60\*^y5mfhѴPytl.XyFh&  Z ]TP]xUjxʫxMsdgVH Lg)tG|mRƆe OmNN0_gYٙ0'=dRJg_F ȟDv!75MٍOa5;B:`R[-MqlNġOkjv XYa#.sX g3tL'$0VŻ(9} cY]>ٲ6,d0V br;]ӗf&%>d㯕Xyv~-yr]k| ҧy%7Uwk9.i9Կ|}a{oxT/nᯨ^[WoKG;7[^1[-?p̷K+֐?@{gFJY3f.P.*J 83+Msޓv_CG1y7[u;:gWUS<ūdZWtDکm|kwP/R);7{QގQpe*?ַ{1lpzH ڱ2^gDe^y||zy7~6,-,I,o\°DoR:Gh)FW`O|褶0j2fFtZ棏"'K)%7Bsw^՟X ?I$Ȝq,"mbsI;5Y_-5\oAEɣ?<8f2(0Ⱦ}U.`M O$S=T HlZӨ  O V-ufxd,]vɚ#L ~&A ANFWO5V~[(w_}1PO|nzkؓ\hQMCYy·NloN V)y%o.+}NMbdf!}/])fP)#yV8Q̢5U<’ux1~4[g6d'`=ŧ򖞼+Kmb}SQʋIOߧ-{M5խnVދ%eTʿ

    Lorem ipsum dolor sit amet

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Donec at odio vitae libero tempus convallis. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum purus mauris, dapibus eu, sagittis quis, sagittis quis, mi. Morbi fringilla massa quis velit. Curabitur metus massa, semper mollis, molestie vel, adipiscing nec, massa. Phasellus vitae felis sed lectus dapibus facilisis. In ultrices sagittis ipsum. In at est. Integer iaculis turpis vel magna. Cras eu est. Integer porttitor ligula a tellus. Curabitur accumsan ipsum a velit. Sed laoreet lectus quis leo. Nulla pellentesque molestie ante. Quisque vestibulum est id justo. Ut pellentesque ante in neque.

    Curabitur ut diam eu dui vestibulum pharetra. Nam pellentesque, justo non hendrerit venenatis, mi orci pretium mi, et vehicula leo arcu quis diam. Nullam mattis laoreet quam. Morbi mollis sem ut tellus. Nam mi massa, lobortis eu, sollicitudin et, iaculis et, massa. Maecenas purus mauris, luctus sit amet, pharetra in, facilisis sit amet, elit. Nullam vel erat tempus purus molestie suscipit. Vestibulum odio lorem, sollicitudin non, volutpat sit amet, tincidunt vel, nunc. Nulla quis ante vestibulum odio feugiat facilisis. Proin lorem nisl, viverra at, rhoncus quis, semper nec, mi. Donec euismod enim vitae velit. Nulla sed lectus. Vivamus placerat, lacus sed vehicula sagittis, arcu massa adipiscing lorem, bibendum luctus nisl tortor vitae leo.

    Etiam a mauris. Proin justo elit, accumsan sit amet, tempus et, blandit id, tellus. Morbi varius, nisi id iaculis aliquam, lacus ligula facilisis velit, ac pharetra ipsum augue a massa. Etiam rhoncus commodo orci. Mauris ullamcorper sagittis turpis. Nullam magna libero, sagittis sed, auctor faucibus, accumsan vitae, urna. Pellentesque volutpat. Aliquam sapien ipsum, eleifend nec, imperdiet vitae, consectetuer id, quam. Donec a urna. Suspendisse sit amet velit. Curabitur quis nisi id dui viverra ornare. Sed condimentum enim quis tortor. Ut condimentum, magna non tempus tincidunt, leo nibh molestie tellus, vitae convallis dolor ante sed ante. Nunc et metus. Phasellus ultricies. Fusce faucibus tortor sit amet mauris.

    Aliquam enim. Duis et diam. Praesent porta, mauris quis pellentesque volutpat, erat elit vulputate eros, vitae pulvinar augue velit sit amet sem. Fusce eu urna eu nisi condimentum posuere. Vivamus sed felis. Duis eget urna vitae eros interdum dignissim. Proin justo eros, eleifend in, porttitor in, malesuada non, neque. Etiam sed augue. Nulla sit amet magna. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Mauris facilisis. Curabitur massa magna, pulvinar a, nonummy eget, egestas vitae, mauris. Quisque vel elit sit amet lorem malesuada facilisis. Vestibulum porta, metus sit amet egestas interdum, urna justo euismod erat, id tristique urna leo quis nibh. Morbi non erat.

    Cras fringilla, nulla id egestas elementum, augue nunc iaculis nibh, ac adipiscing nibh justo id tortor. Donec vel orci a nisi ultricies aliquet. Nunc urna quam, adipiscing molestie, vehicula non, condimentum non, magna. Integer magna. Donec quam metus, pulvinar id, suscipit eget, euismod ac, orci. Nulla facilisi. Nullam nec mauris. Morbi in mi. Etiam urna lectus, pulvinar ac, sollicitudin eu, euismod ac, lectus. Fusce elit. Sed ultricies odio ac felis.

    Cras iaculis. Nulla facilisi.

    Cras iaculis. Nulla facilisi. Fusce vitae arcu. Integer lectus mauris, ornare vel, accumsan eget, scelerisque vel, nunc. Maecenas justo urna, volutpat vel, vehicula vel, ullamcorper nec, odio. Suspendisse laoreet nisi sed erat. Cras convallis sollicitudin sapien. Phasellus ac erat eu mi rutrum rhoncus. Morbi et velit. Morbi odio nisi, pharetra eget, sollicitudin sed, aliquam at, nisl. Quisque euismod diam in sapien. Integer accumsan urna in risus.

    Proin sit amet nisl. Phasellus dui ipsum, laoreet a, pulvinar id, fringilla ut, libero. In hac habitasse platea dictumst. Maecenas mi magna, cursus sed, rutrum eget, molestie nec, dui. Suspendisse lacus. Vivamus nibh urna, accumsan sit amet, gravida sed, convallis a, leo. Cras sollicitudin orci sit amet eros. Pellentesque eu odio et velit tempor dignissim. Morbi vehicula malesuada enim. Pellentesque tincidunt, tellus ac fringilla tempor, justo libero interdum nunc, eu sollicitudin tortor augue nec tellus. Nullam eget leo quis tellus gravida faucibus. Nam gravida. Curabitur rhoncus egestas nunc. Curabitur mollis, nisi sed suscipit gravida, enim felis interdum justo, vel accumsan magna nunc ut libero. Ut fermentum. Fusce luctus, est sit amet feugiat lobortis, nisl eros bibendum libero, ut suscipit felis ligula in massa. Proin congue elit et nisi. Cras ac nisl. Nunc ullamcorper neque vel diam.

    Ut pellentesque arcu ac lectus.

    Sed ac lorem. Ut pellentesque arcu ac lectus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Pellentesque ultrices metus sollicitudin pede. Donec fermentum est a velit fringilla mollis. Duis ligula. Fusce viverra laoreet odio. Suspendisse sit amet ligula. Maecenas nunc velit, sagittis eu, bibendum eu, placerat at, nibh. Praesent ut erat eget nisi gravida imperdiet. Quisque vitae sapien. Ut eros.

    Donec eros ligula, dignissim vel, ultricies id, mattis in, massa. Duis lobortis dui nec orci. Sed ullamcorper metus non massa. Aliquam eget mauris ac nulla elementum posuere. Sed porta, augue vitae rhoncus aliquet, felis quam eleifend est, vitae rutrum metus arcu vel lorem. Proin laoreet, mauris sit amet aliquet eleifend, nisl sem molestie nisi, eu varius eros ligula non erat. Integer ac sem. Suspendisse lectus. Aliquam erat volutpat. Fusce sit amet leo faucibus erat molestie ultrices. Maecenas lacinia lectus eget dui. Etiam porta porttitor ante. Phasellus sit amet lacus adipiscing enim mollis iaculis. Fusce congue, nulla a commodo aliquam, erat dui fermentum dui, pellentesque faucibus orci enim at mauris. Pellentesque a diam porta magna tempor posuere. Donec lorem.

    Sed viverra aliquam turpis. Aliquam lacus. Duis id massa. Nullam ante. Suspendisse condimentum. Donec adipiscing, felis vel semper sollicitudin, lacus justo pretium est, sed blandit pede risus eu ante. Praesent ante nulla, fringilla id, ultrices et, feugiat a, metus. Proin ac velit a metus suscipit fermentum. Integer aliquet. Sed sapien nulla, placerat at, rutrum at, condimentum quis, libero. In accumsan, tellus nec tincidunt malesuada, pede arcu commodo ipsum, ac mattis tortor urna vitae enim. Aenean nonummy, mauris eget commodo bibendum, augue sem ultrices nunc, eget rhoncus metus erat placerat lectus. Aliquam mollis lectus in justo. Vivamus iaculis lacus sit amet ligula. Etiam consectetuer convallis diam. Curabitur sollicitudin, felis eu vehicula scelerisque, nisl urna aliquam orci, sit amet laoreet mi turpis id ligula. Donec at enim non nulla adipiscing dapibus. Aenean nisl.

    Ut in lacus nec enim volutpat pellentesque. Integer euismod. In odio eros, malesuada in, mattis vel, tempor nec, sem. In libero tellus, varius vitae, bibendum in, elementum quis, nisl. Duis tortor. Etiam at justo. Pellentesque facilisis mauris non nunc. Praesent eros mi, dapibus eget, placerat ac, lobortis quis, sem. Nulla rhoncus turpis. Nulla vitae mi. Proin id massa. Nunc eros.

    Aliquam molestie pulvinar ligula.

    Vestibulum dui risus, varius ut, semper et, consequat ultrices, felis. Pellentesque iaculis urna in velit. Ut pharetra. Nunc fringilla, nisi vitae fringilla placerat, enim justo semper erat, mollis feugiat leo neque eu sem. Vestibulum orci urna, suscipit a, accumsan nec, fringilla in, risus. Nullam ante. Nullam nec eros. Nullam varius. Nulla facilisi. In auctor libero in metus. Aliquam porttitor congue eros. Nulla facilisi. Mauris euismod turpis ut felis. Ut nunc nisl, cursus quis, eleifend at, viverra bibendum, lacus. Donec consequat lacus eu sapien. Fusce pulvinar lectus quis nunc. In hac habitasse platea dictumst.

    Aliquam molestie pulvinar ligula. Maecenas imperdiet, urna eget ultrices adipiscing, nibh ante elementum neque, id molestie massa quam ut nunc. Nullam porta. Phasellus a magna in sem volutpat viverra. Quisque aliquet nunc ac turpis. Mauris dolor enim, viverra rutrum, placerat et, laoreet et, justo. In id nulla. Donec erat. Phasellus nec mi sed velit mollis cursus. Vestibulum tincidunt. Praesent dui libero, facilisis eu, vulputate eget, aliquet nec, ipsum. Pellentesque in nisl in mauris pretium euismod.

    dompdf-0.6.2/www/test/print_header_footer.html000066400000000000000000000204041263120276100215030ustar00rootroot00000000000000 Header and Footer example

    Section 1

    Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Sed non risus. Suspendisse lectus tortor, dignissim sit amet, adipiscing nec, ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa, varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis semper. Duis arcu massa, scelerisque vitae, consequat in, pretium a, enim. Pellentesque congue. Ut in risus volutpat libero pharetra tempor. Cras vestibulum bibendum augue. Praesent egestas leo in pede. Praesent blandit odio eu enim. Pellentesque sed dui ut augue blandit sodales. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam nibh. Mauris ac mauris sed pede pellentesque fermentum. Maecenas adipiscing ante non diam sodales hendrerit.


    Section 2

    Ut velit mauris, egestas sed, gravida nec, ornare ut, mi. Aenean ut orci vel massa suscipit pulvinar. Nulla sollicitudin. Fusce varius, ligula non tempus aliquam, nunc turpis ullamcorper nibh, in tempus sapien eros vitae ligula. Pellentesque rhoncus nunc et augue. Integer id felis. Curabitur aliquet pellentesque diam. Integer quis metus vitae elit lobortis egestas. Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Morbi vel erat non mauris convallis vehicula. Nulla et sapien. Integer tortor tellus, aliquam faucibus, convallis id, congue eu, quam. Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum posuere, metus purus iaculis lectus, et tristique ligula justo vitae magna. Morbi vel erat non mauris convallis vehicula. Nulla et sapien. Integer tortor tellus, aliquam faucibus, convallis id, congue eu, quam. Mauris ullamcorper felis vitae erat. Proin feugiat, augue non elementum posuere, metus purus iaculis lectus, et tristique ligula justo vitae magna.


    Section 3

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

    Aliquam convallis sollicitudin purus. Praesent aliquam, enim at fermentum mollis, ligula massa adipiscing nisl, ac euismod nibh nisl eu lectus. Fusce vulputate sem at sapien. Vivamus leo. Aliquam euismod libero eu enim. Nulla nec felis sed leo placerat imperdiet. Aenean suscipit nulla in justo. Suspendisse cursus rutrum augue. Nulla tincidunt tincidunt mi. Curabitur iaculis, lorem vel rhoncus faucibus, felis magna fermentum augue, et ultricies lacus lorem varius purus. Curabitur eu amet.

    dompdf-0.6.2/www/test/quirks_center_table.html000066400000000000000000000004741263120276100215130ustar00rootroot00000000000000
    a b
    c d
    dompdf-0.6.2/www/test/quirks_font_tag.html000066400000000000000000000035451263120276100206670ustar00rootroot00000000000000

    Font tags with absolute size

    size=1 size=2 size=3 size=4 size=5 size=6 size=7

    Span tags with absolute CSS size

    size=1 size=2 size=3 size=4 size=5 size=6 size=7

    Font tags with relative size

    size=-4 size=-3 size=-2 size=-1 size=+1 size=+2 size=+3 size=+4

    Span tags with relative CSS size

    size=-4 size=-3 size=-2 size=-1 size=+1 size=+2 size=+3 size=+4

    Nested font tags

    size=2 size=4 size=2 size=4 size=2 size=4 size=2 size=4 dompdf-0.6.2/www/test/quirks_html_attributes.html000066400000000000000000000043201263120276100222700ustar00rootroot00000000000000
    Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.
    Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.

    Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. table test Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi.
    table test Nam liber tempor cum soluta nobis eleifend option congue nihil imperdiet doming id quod mazim placerat facer possim assum.
    Lorem ipsum dolor sit amet.
    table test table test
    table test table test table test table test
    dompdf-0.6.2/www/test/script_javascript.html000066400000000000000000000006551263120276100212210ustar00rootroot00000000000000 Javascript test This page will be printed automatically

    A title

    dompdf-0.6.2/www/test/script_php.php000066400000000000000000000014621263120276100174620ustar00rootroot00000000000000 Here's some dynamically generated text and some random circles...

    "; ?> Current PHP version: " . phpversion() . ". "; echo "Today is " . strftime("%A") . " the " . strftime("%e").date("S").strftime(" of %B, %Y %T") . "

    "; ?>