diff --git a/.idea/PyRIGS.iml b/.idea/PyRIGS.iml index 2b9ccb41..20d6af48 100644 --- a/.idea/PyRIGS.iml +++ b/.idea/PyRIGS.iml @@ -11,7 +11,7 @@ - + diff --git a/reportlab/MANIFEST.in b/reportlab/MANIFEST.in deleted file mode 100644 index 86f3442f..00000000 --- a/reportlab/MANIFEST.in +++ /dev/null @@ -1,6 +0,0 @@ -global-include *.dtd *.txt *.xml *.yml -global-include *.c *.h *.in *.mashed -global-include *.gif *.png *.jpg .a85 -global-include *.AFM *.PFB *.ttf -global-include README -include changes diff --git a/reportlab/__init__.py b/reportlab/__init__.py deleted file mode 100644 index e9ee039c..00000000 --- a/reportlab/__init__.py +++ /dev/null @@ -1,48 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/__init__.py -__version__=''' $Id$ ''' -__doc__="""The Reportlab PDF generation library.""" -Version = "3.1.43" - -import sys, os, imp - -if sys.version_info[0:2]!=(2, 7) and sys.version_info<(3, 3): - raise ImportError("""reportlab requires Python 2.7+ or 3.3+; 3.0-3.2 are not supported.""") - -#define these early in reportlab's life -isPy3 = sys.version_info[0]==3 -if isPy3: - def cmp(a,b): - return -1 if ab else 0) - - import builtins - builtins.cmp = cmp - builtins.xrange = range - del cmp, builtins -else: - from future_builtins import ascii - import __builtin__ - __builtin__.ascii = ascii - del ascii, __builtin__ - -#try to use dynamic modifications from -#reportlab.local_rl_mods.py -#reportlab_mods.py or ~/.reportlab_mods -try: - import reportlab.local_rl_mods -except ImportError: - pass - -def _fake_import(fn,name): - if os.path.isfile(fn): - with open(fn,'rb') as f: - imp.load_source(name,fn,f) - -try: - import reportlab_mods #application specific modifications can be anywhere on python path -except ImportError: - try: - _fake_import(os.path.expanduser(os.path.join('~','.reportlab_mods')),'reportlab_mods') - except ImportError: - pass diff --git a/reportlab/fonts/00readme.txt b/reportlab/fonts/00readme.txt deleted file mode 100644 index 08d545a8..00000000 --- a/reportlab/fonts/00readme.txt +++ /dev/null @@ -1,8 +0,0 @@ -This directory is a convenient place to put -fonts where Reportlab will find them. If running -in a server environment, this is a good place to -put Type 1 fonts needed by your application. If -in a desktop environment, you might prefer to add -your font directories to the T1SearchPath in -reportlab/rl_config.py instead. - diff --git a/reportlab/fonts/DarkGarden-changelog.txt b/reportlab/fonts/DarkGarden-changelog.txt deleted file mode 100644 index 48b3b52c..00000000 --- a/reportlab/fonts/DarkGarden-changelog.txt +++ /dev/null @@ -1,14 +0,0 @@ -2004-05-18 Michal Kosmulski - * Version 1.1 - * Changed license to GNU GPL with Font Exception - * Added Zacute character - * Added basic hinting - * Added kerning information -2000 Michal Kosmulski - * Version 1.0 - * Added Polish and German diacritic characters except for Zacute - -1999 Michal Kosmulski - * Version 0.9 - * Includes only the 26 letters of the English alphabet - * Distributed under a freeware license diff --git a/reportlab/fonts/DarkGarden-copying-gpl.txt b/reportlab/fonts/DarkGarden-copying-gpl.txt deleted file mode 100644 index e77696ae..00000000 --- a/reportlab/fonts/DarkGarden-copying-gpl.txt +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 675 Mass Ave, Cambridge, MA 02139, USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Library General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -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 Program or any portion -of it, thus forming a work based on the Program, 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) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -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 Program, 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 Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) 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; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, 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 executable. However, as a -special exception, the source code 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. - -If distribution of executable or 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 counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program 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. - - 5. 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 Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program 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 to -this License. - - 7. 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 Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program 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 Program. - -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. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program 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. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies 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 Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, 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 - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. 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 PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) 19yy - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) 19yy name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Library General -Public License instead of this License. diff --git a/reportlab/fonts/DarkGarden-copying.txt b/reportlab/fonts/DarkGarden-copying.txt deleted file mode 100644 index 38cad893..00000000 --- a/reportlab/fonts/DarkGarden-copying.txt +++ /dev/null @@ -1,26 +0,0 @@ -Copyright (C) 1999, 2000, 2004 Michal Kosmulski - - -This font is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This font is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this font; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -As a special exception, if you create a document which uses -this font, and embed this font or unaltered portions of this font into -the document, this font does not by itself cause the resulting -document to be covered by the GNU General Public License. This -exception does not however invalidate any other reasons why the -document might be covered by the GNU General Public License. If you -modify this font, you may extend this exception to your version of the -font, but you are not obligated to do so. If you do not wish to do so, -delete this exception statement from your version. diff --git a/reportlab/fonts/DarkGarden-readme.txt b/reportlab/fonts/DarkGarden-readme.txt deleted file mode 100644 index ceeeb103..00000000 --- a/reportlab/fonts/DarkGarden-readme.txt +++ /dev/null @@ -1,106 +0,0 @@ -Dark Garden -=========== - - - -GENERAL - -Dark Garden is a decorative outline font of unusual shape. The typeface -is based on author's original hand drawings. The letterform is complex, -with all characters decorated with spikes resembling thorns or flames, -character spacing is very dense. Such a theme makes it a great font for -titles, banners, logos etc. - -As of version 1.1, Dark Garden includes letters of the English alphabet, -Polish and German diacritic characters and some punctuation. Unicode -encoding is used. The font is equipped with hinting information to allow -high quality rendering at small point sizes. Only horizontal and -vertical hints are currently used, future versions might take advantage -of truetype hinting instructions some day. There are also a lot of -kerning pairs defined in the font - they were chosen after looking at a -choice of Polish and English texts and selecting the character pairs -that needed manual kerning. - -The font was created with PfaEdit / FontForge -(http://fontforge.sourceforge.net/) - an opensource font editing tool. -Pfaedit uses its own text-based file format which can then be exported -to truetype, postscript, opentype and many other font formats. This -makes it possible to generate font files for Dark Garden in any of the -many supported formats, so it can be used on almost any platform. So -far, the truetype version has been tested on X11 (Linux) and Windows, -the opentype version worked on Windows but not X11. Truetype should also -work on Mac OS. - - - -INSTALLATION - -Installation is described for the truetype version of the font (which is -what most users will need). - -On Windows: -* Extract .ttf files from the archive into a temporary directory -* In the Control Panel choose Fonts -* From the File menu choose Install New Font -* Browse to the temporary directory you chose -* "Dark Garden" should appear in the font list - click OK (this may - require Administrator privileges) - -On Linux / UNIX (using KDE): -* Extract .ttf files from the archive into a temporary directory -* In the Control Center choose Font Installer in the System - Administration tree -* Click on "Administrator Mode" and enter root's password -* Click on "Add Fonts" icon -* Select the .ttf file extracted from the archive and click OK - -On Linux / UNIX (using commandline) - unzip darkgarden-*.ttf.zip - su - ginstall -o root -m 644 DarkGardenMK.ttf /usr/X11R6/lib/fonts/TTF - fc-cache -f - - - -COPYRIGHT AND LICENSE - -Copyright (C) 1999, 2000, 2004 Michal Kosmulski - - -This font is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This font is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this font; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -As a special exception, if you create a document which uses -this font, and embed this font or unaltered portions of this font into -the document, this font does not by itself cause the resulting -document to be covered by the GNU General Public License. This -exception does not however invalidate any other reasons why the -document might be covered by the GNU General Public License. If you -modify this font, you may extend this exception to your version of the -font, but you are not obligated to do so. If you do not wish to do so, -delete this exception statement from your version. - -The text of this license can be found in file COPYING.txt in the -distribution archives. The GNU General Public License text can be found -in file COPYING-GPL.txt. - - - -CONTACTING THE AUTHOR - -Send e-mail with questions, bug reports and patches to Michal Kosmulski, -mkosmul@users.sourceforge.net - -The homepage of Dark Garden Font is located at -http://darkgarden.sourceforge.net/. diff --git a/reportlab/fonts/DarkGarden.sfd b/reportlab/fonts/DarkGarden.sfd deleted file mode 100644 index cd0a1825..00000000 --- a/reportlab/fonts/DarkGarden.sfd +++ /dev/null @@ -1,11067 +0,0 @@ -SplineFontDB: 1.0 -FontName: DarkGardenMK -FullName: Dark Garden -FamilyName: Dark Garden -Weight: Medium -Copyright: Copyright (C) 1999, 2000, 2004 Michal Kosmulski \n\n\nThis font is free software; you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation; either version 2 of the License, or\n(at your option) any later version.\n\nThis font is distributed in the hope that it will be useful,\nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this font; if not, write to the Free Software\nFoundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n\nAs a special exception, if you create a document which uses\nthis font, and embed this font or unaltered portions of this font into\nthe document, this font does not by itself cause the resulting\ndocument to be covered by the GNU General Public License. This\nexception does not however invalidate any other reasons why the\ndocument might be covered by the GNU General Public License. If you\nmodify this font, you may extend this exception to your version of the\nfont, but you are not obligated to do so. If you do not wish to do so,\ndelete this exception statement from your version.\n -Version: 1.1 -ItalicAngle: 0 -UnderlinePosition: -420 -UnderlineWidth: 80 -Ascent: 1638 -Descent: 410 -Order2: 1 -NeedsXUIDChange: 1 -FSType: 0 -PfmFamily: 81 -TTFWeight: 500 -TTFWidth: 5 -Panose: 2 11 6 3 5 6 0 0 2 4 -LineGap: 0 -VLineGap: 0 -OS2TypoAscent: 2311 -OS2TypoDescent: -708 -OS2WinAscent: 2311 -OS2WinDescent: 708 -ScriptLang: 1 - 1 latn 1 dflt -LangName: 1033 "" "" "Regular" "DarkGarden (Michal Kosmulski)" "" "" "" "" "Micha+AUIA Kosmulski" "Micha+AUIA Kosmulski" -Encoding: unicode -UnicodeInterp: none -DisplaySize: -48 -AntiAlias: 1 -FitToEm: 1 -WinInfo: 64 16 4 -TeXData: 1 10485760 0 524288 262144 174762 810240 -1048576 174762 783286 444596 497025 792723 393216 433062 380633 303038 157286 324010 404750 52429 2506097 1059062 262144 -BeginChars: 65538 86 -StartChar: .notdef -Encoding: 0 -1 0 -Width: 2048 -Flags: MW -VStem: 2 1085<0 1821> -Fore -2 0 m 1,0,-1 - 2 1821 l 0,1,-1 - 1087 1821 l 0,2,-1 - 1087 0 l 0,3,-1 - 2 0 l 1,0,-1 -EndSplineSet -EndChar -StartChar: glyph1 -Encoding: 1 -1 1 -Width: 0 -Flags: W -EndChar -StartChar: glyph2 -Encoding: 2 -1 2 -Width: 2048 -Flags: W -EndChar -StartChar: space -Encoding: 32 32 3 -Width: 1024 -Flags: W -EndChar -StartChar: comma -Encoding: 44 44 6 -Width: 267 -Flags: HMW -HStem: -1.6875 173.812<6.75 231.188> -VStem: 120.938 110.25<-133.875 -1.6875> -Fore -40.5 -154.125 m 1,0,1 - 96.75 -106.875 96.75 -106.875 106.875 -77.625 c 0,2,3 - 117 -48.375 117 -48.375 117 -37.125 c 0,4,5 - 123.75 -4.5 123.75 -4.5 91.125 -4.5 c 0,6,7 - 58.5 -4.5 58.5 -4.5 54 -2.25 c 0,8,9 - 4.5 11.25 4.5 11.25 2.25 81 c 0,10,11 - -1.125 133.875 -1.125 133.875 6.75 172.125 c 0,12,13 - 24.75 208.125 24.75 208.125 48.375 208.125 c 0,14,15 - 116.999 208.125 116.999 208.125 158.062 214.875 c 0,16,17 - 179.095 214.82 l 0,18,19 - 205.824 209.75 205.824 209.75 223.875 177.75 c 0,20,-1 - 248.062 129.938 l 0,21,22 - 251.423 123.475 251.423 123.475 251.338 108.103 c 0,23,24 - 251.239 90.0244 251.239 90.0244 246.375 59.625 c 0,25,-1 - 231.188 -1.6875 l 0,26,27 - 219.376 -49.4989 219.376 -49.4989 191.25 -88.875 c 0,28,29 - 164.25 -119.25 164.25 -119.25 120.938 -133.875 c 0,30,31 - 77.625 -148.5 77.625 -148.5 40.5 -154.125 c 1,0,1 -EndSplineSet -EndChar -StartChar: hyphen -Encoding: 45 45 7 -Width: 1252 -Flags: HMW -HStem: 843.75 163.5<206.75 1005.5> -Fore -379.25 809.25 m 1,0,1 - 319.25 789.75 319.25 789.75 266 800.25 c 0,2,3 - 212.75 810.75 212.75 810.75 212.75 866.25 c 0,4,-1 - 261.5 836.25 l 0,5,6 - 310.25 806.25 310.25 806.25 323.75 890.25 c 0,7,8 - 326.75 932.25 326.75 932.25 268.25 938.25 c 0,9,10 - 209.75 944.25 209.75 944.25 155.75 932.25 c 0,11,12 - 122.75 911.25 122.75 911.25 120.5 863.25 c 0,13,14 - 118.25 815.25 118.25 815.25 118.25 807.75 c 0,15,16 - 74.75 891.75 74.75 891.75 111.5 943.5 c 0,17,18 - 148.25 995.25 148.25 995.25 206.75 1007.25 c 0,19,20 - 344.75 1016.25 344.75 1016.25 464 972 c 0,21,22 - 583.25 927.75 583.25 927.75 718.25 927.75 c 0,23,24 - 764.75 932.25 764.75 932.25 821.75 932.25 c 0,25,26 - 878.75 932.25 878.75 932.25 889.25 966.75 c 0,27,28 - 884.75 1011.75 884.75 1011.75 844.25 1002.75 c 0,29,30 - 803.75 993.75 803.75 993.75 782.75 972.75 c 0,31,32 - 794.75 1005.75 794.75 1005.75 812.75 1033.5 c 0,33,34 - 830.75 1061.25 830.75 1061.25 878.75 1062.75 c 0,35,36 - 934.25 1047.75 934.25 1047.75 950.75 1032.75 c 0,37,38 - 967.25 1017.75 967.25 1017.75 982.25 969.75 c 0,39,40 - 982.25 936.75 982.25 936.75 998.75 915 c 0,41,42 - 1015.25 893.25 1015.25 893.25 1082.75 906.75 c 0,43,44 - 1121.75 921.75 1121.75 921.75 1145.75 947.25 c 0,45,46 - 1139.75 927.75 1139.75 927.75 1123.25 897.75 c 0,47,48 - 1106.75 867.75 1106.75 867.75 1079.75 854.25 c 0,49,-1 - 1079.75 854.25 l 0,50,-1 - 1079.75 854.25 l 0,51,52 - 1066.25 840.75 1066.25 840.75 1005.5 843.75 c 0,53,54 - 944.75 846.75 944.75 846.75 929.75 846.75 c 0,55,56 - 872.75 855.75 872.75 855.75 831.5 858 c 0,57,58 - 790.25 860.25 790.25 860.25 736.25 842.25 c 0,59,60 - 668.75 824.25 668.75 824.25 693.5 791.25 c 0,61,62 - 718.25 758.25 718.25 758.25 784.25 815.25 c 0,63,64 - 772.25 789.75 772.25 789.75 747.5 762 c 0,65,66 - 722.75 734.25 722.75 734.25 613.25 755.25 c 0,67,68 - 523.25 777.75 523.25 777.75 497.75 791.25 c 0,69,70 - 472.25 804.75 472.25 804.75 379.25 809.25 c 1,0,1 -EndSplineSet -KernsSLIF: 90 -260 0 0 122 -208 0 0 88 -182 0 0 120 -156 0 0 89 -130 0 0 121 -104 0 0 87 -182 0 0 119 -182 0 0 84 -286 0 0 116 -273 0 0 83 -234 0 0 115 -156 0 0 65 -234 0 0 97 -234 0 0 -EndChar -StartChar: period -Encoding: 46 46 5 -Width: 270 -Flags: HMW -HStem: 57.9375 152.438<9 235.688> -Fore -142.875 2.25 m 0,0,1 - 103.5 -1.125 103.5 -1.125 92.25 14.625 c 0,2,3 - 81 29.25 81 29.25 63 34.875 c 0,4,5 - 6.75 51.75 6.75 51.75 4.5 120.375 c 0,6,7 - 0 172.125 0 172.125 9 210.375 c 0,8,9 - 27 246.375 27 246.375 50.625 246.375 c 0,10,11 - 119.249 246.375 119.249 246.375 160.312 253.125 c 0,12,13 - 181.345 253.07 l 0,14,15 - 208.074 248 208.074 248 226.125 216 c 0,16,-1 - 250.312 168.188 l 0,17,18 - 253.673 161.725 253.673 161.725 253.588 146.353 c 0,19,20 - 253.489 128.274 253.489 128.274 248.625 97.875 c 0,21,22 - 245.249 84.3705 245.249 84.3705 235.688 57.9375 c 0,23,24 - 226.126 31.5004 226.126 31.5004 214.875 24.75 c 0,25,26 - 180 4.5 180 4.5 142.875 2.25 c 0,0,1 -EndSplineSet -EndChar -StartChar: colon -Encoding: 58 58 34 -Width: 384 -Flags: HMW -HStem: 23.625 211.5<86.625 239.062> 678.75 191.25<108.75 288.75> -Fore -108.75 870 m 1,0,1 - 166.125 930.75 166.125 930.75 202.125 909.938 c 0,2,3 - 238.125 889.125 238.125 889.125 295.5 832.875 c 0,4,5 - 325.875 802.5 325.875 802.5 325.312 754.125 c 0,6,7 - 324.75 705.75 324.75 705.75 288.75 678.75 c 0,8,9 - 211.125 621.375 211.125 621.375 189.75 618 c 0,10,11 - 168.375 614.625 168.375 614.625 131.25 636 c 0,12,13 - 80.625 663 80.625 663 75 680.438 c 0,14,15 - 69.375 697.875 69.375 697.875 68.25 731.625 c 0,16,17 - 64.875 775.5 64.875 775.5 67.6875 803.062 c 0,18,19 - 70.5 830.625 70.5 830.625 108.75 870 c 0,20,-1 - 108.75 870 l 1,0,1 -86.625 235.125 m 0,16,17 - 95.625 275.625 95.625 275.625 164.25 279 c 0,18,19 - 232.875 282.375 232.875 282.375 252 271.125 c 0,20,21 - 273.375 257.625 273.375 257.625 289.688 189.562 c 0,22,23 - 301.323 141.017 301.323 141.017 301.225 117.366 c 0,24,25 - 301.185 107.859 301.185 107.859 299.25 102.375 c 0,26,27 - 273.375 34.875 273.375 34.875 239.062 23.625 c 0,28,29 - 204.749 12.375 204.749 12.375 160.875 12.375 c 0,30,31 - 145.124 12.375 145.124 12.375 128.812 39.9375 c 0,32,33 - 112.499 67.5003 112.499 67.5003 95.625 75.375 c 0,34,35 - 68.625 86.625 68.625 86.625 73.125 142.875 c 0,36,37 - 77.625 199.125 77.625 199.125 86.625 235.125 c 0,16,17 -EndSplineSet -EndChar -StartChar: semicolon -Encoding: 59 59 35 -Width: 384 -Flags: HMW -HStem: 45 132.75<91.125 303.75> 738 180<118.875 291> -VStem: 154.125 149.625<-200.25 45> -Fore -118.875 918 m 1,0,1 - 177.375 977.625 177.375 977.625 212.25 957.375 c 0,2,3 - 247.125 937.125 247.125 937.125 305.625 880.875 c 0,4,5 - 366.375 821.25 366.375 821.25 291 738 c 0,6,7 - 238.125 679.5 238.125 679.5 230.25 678.938 c 0,8,9 - 222.375 678.375 222.375 678.375 141.375 682.875 c 0,10,11 - 82.875 686.25 82.875 686.25 81.1875 716.062 c 0,12,13 - 79.5 745.875 79.5 745.875 77.25 779.625 c 0,14,15 - 73.875 823.5 73.875 823.5 77.25 850.5 c 0,16,17 - 80.625 877.5 80.625 877.5 118.875 918 c 0,18,-1 - 118.875 918 l 1,0,1 -91.125 177.75 m 0,15,16 - 100.125 218.251 100.125 218.251 169.312 222.188 c 0,17,18 - 225.136 222.126 l 0,19,20 - 247.88 220.056 247.88 220.056 257.625 213.75 c 0,21,22 - 278.999 200.25 278.999 200.25 293.062 133.312 c 0,23,24 - 307.125 66.375 307.125 66.375 303.75 45 c 0,25,26 - 292.5 -19.125 292.5 -19.125 246.938 -110.25 c 0,27,28 - 202.357 -199.411 202.357 -199.411 154.125 -200.25 c 0,29,30 - 201.375 -173.25 201.375 -173.25 201.375 -86.625 c 0,31,32 - 201.375 0 201.375 0 174.375 6.75 c 0,33,34 - 140.074 9.61226 l 0,35,36 - 138.95 9.59327 138.95 9.59327 137.812 9.5625 c 0,37,38 - 113.206 12.6329 l 0,39,40 - 106.394 14.6566 106.394 14.6566 100.125 18 c 0,41,42 - 73.125 30.375 73.125 30.375 77.625 85.5 c 0,43,44 - 82.125 140.625 82.125 140.625 91.125 177.75 c 0,15,16 -EndSplineSet -EndChar -StartChar: A -Encoding: 65 65 55 -Width: 1447 -Flags: W -Fore -1268 -330 m 1,0,1 - 1304.01 -261.985 1304.01 -261.985 1321 -184 c 0,2,3 - 1324.46 -150.427 l 0,4,5 - 1323.49 -92.1465 1323.49 -92.1465 1272 -43 c 0,6,7 - 1221.01 4.9888 1221.01 4.9888 1171 38 c 0,8,9 - 1121.01 71 1121.01 71 1066 52 c 0,10,11 - 1028.99 38 1028.99 38 1019.5 -17 c 0,12,13 - 1010.01 -72 1010.01 -72 1006 -72 c 0,14,15 - 965 9 965 9 1013.5 102 c 0,16,17 - 1059.21 189.663 1059.21 189.663 1059.17 266.65 c 0,18,19 - 1059.17 271.346 1059.17 271.346 1059 276 c 0,20,21 - 1053 434.993 1053 434.993 1006 491.5 c 0,22,23 - 959.002 547.999 959.002 547.999 895 573 c 0,24,25 - 861.093 585.849 861.093 585.849 831.581 585.768 c 0,26,27 - 778.406 585.622 778.406 585.622 739.5 543.5 c 0,28,29 - 679.002 478.002 679.002 478.002 616 450 c 0,30,31 - 577 432 577 432 533.5 448.5 c 0,32,33 - 490 465 490 465 487 510 c 0,34,35 - 532 492 532 492 543.5 499.5 c 0,36,37 - 555 507 555 507 558 514 c 0,38,39 - 579 558 579 558 530 570 c 0,40,41 - 424 595 424 595 383 514 c 0,42,43 - 347 446 347 446 318.5 347 c 0,44,45 - 290 248 290 248 328 164 c 0,46,47 - 336.295 144.644 336.295 144.644 336.228 116.448 c 0,48,49 - 336.198 103.856 336.198 103.856 334.5 89.5 c 0,50,51 - 328.999 42.9997 328.999 42.9997 283 27 c 0,52,53 - 302 105 302 105 245 98 c 0,54,55 - 188 91 188 91 157 57 c 0,56,57 - 89.0005 -17 89.0005 -17 55 -80 c 0,58,59 - 21 -143 21 -143 33 -233 c 0,60,61 - 7.11917 -206.16 7.11917 -206.16 6.9652 -142.109 c 0,62,63 - 6.95854 -139.339 6.95854 -139.339 7 -136.5 c 0,64,65 - 8 -67.9999 8 -67.9999 27 -36 c 0,66,67 - 60 22 60 22 93.5 73.5 c 0,68,69 - 126.999 124.999 126.999 124.999 128 188 c 0,70,71 - 128 227 128 227 100 243 c 0,72,73 - 89.0676 246.192 l 0,74,75 - 81.8899 245.118 81.8899 245.118 81.7695 231.241 c 0,76,77 - 87 197 l 0,78,79 - 60.9999 218 60.9999 218 60.5 237 c 0,80,81 - 63 272 l 0,82,83 - 105 461 105 461 237.5 625 c 0,84,85 - 370.001 789.001 370.001 789.001 396 894 c 0,86,87 - 431.998 1045.99 431.998 1045.99 450 1180 c 0,88,89 - 458 1246.01 458 1246.01 501 1303.5 c 0,90,91 - 526.01 1336.94 526.01 1336.94 555.08 1337.06 c 0,92,93 - 575.989 1337.15 575.989 1337.15 599 1320 c 0,94,95 - 545 1309.01 545 1309.01 543 1280.5 c 0,96,97 - 541 1252 541 1252 552 1240 c 0,98,99 - 570.499 1217.04 570.499 1217.04 589 1216.86 c 0,100,101 - 599.5 1216.76 599.5 1216.76 610 1224 c 0,102,103 - 666.003 1261.01 666.003 1261.01 702.5 1381 c 0,104,105 - 739 1501 739 1501 737 1567 c 0,106,107 - 734 1633 734 1633 690 1672 c 0,108,109 - 669.348 1690.31 669.348 1690.31 646.491 1690.32 c 0,110,111 - 620.654 1690.35 620.654 1690.35 592 1667 c 0,112,113 - 628 1758.99 628 1758.99 682.5 1745 c 0,114,115 - 737 1731.01 737 1731.01 792.5 1671.5 c 0,116,117 - 848.023 1611.97 848.023 1611.97 896 1539 c 0,118,119 - 944 1465.99 944 1465.99 966 1440 c 0,120,121 - 1000.99 1397.01 1000.99 1397.01 1047 1369 c 0,122,123 - 1092.99 1341 1092.99 1341 1112 1302 c 0,124,125 - 1127.05 1269.26 1127.05 1269.26 1127.11 1243.37 c 0,126,127 - 1127.19 1210.74 1127.19 1210.74 1103.5 1189 c 0,128,129 - 1081.08 1168.42 1081.08 1168.42 1054.61 1168.45 c 0,130,131 - 1030.93 1168.47 1030.93 1168.47 1004 1185 c 0,132,133 - 1024.39 1186.95 l 0,134,135 - 1038.73 1191.67 1038.73 1191.67 1040 1207 c 0,136,137 - 1040 1232 1040 1232 1000.5 1252 c 0,138,139 - 992.466 1256.07 992.466 1256.07 986.066 1256.04 c 0,140,141 - 961 1255.93 961 1255.93 961 1193 c 0,142,143 - 961 1164.99 961 1164.99 974 1131.5 c 0,144,145 - 987 1098.01 987 1098.01 995 1082 c 0,146,147 - 1018.3 1023.02 1018.3 1023.02 1032.59 1022.63 c 0,148,149 - 1036.22 1022.53 1036.22 1022.53 1039.27 1026.22 c 0,150,151 - 1040.7 1027.94 1040.7 1027.94 1042 1030.5 c 0,152,153 - 1057 1060.01 1057 1060.01 1039 1080 c 0,154,155 - 1077.99 1080 1077.99 1080 1091 1030.5 c 0,156,157 - 1104 981.019 1104 981.019 1104 968 c 0,158,159 - 1104 893.057 1104 893.057 1094.5 786.5 c 0,160,161 - 1092.76 724.816 l 0,162,163 - 1095.42 659.144 1095.42 659.144 1119 612 c 0,164,165 - 1129.97 589.052 1129.97 589.052 1171 527.5 c 0,166,167 - 1211.99 466.005 1211.99 466.005 1230 456 c 0,168,169 - 1251.99 443.008 1251.99 443.008 1272.5 399.5 c 0,170,171 - 1278.45 386.871 1278.45 386.871 1278.38 375.043 c 0,172,173 - 1278.2 346.131 1278.2 346.131 1242 322 c 0,174,175 - 1248.76 340.824 1248.76 340.824 1248.69 354.457 c 0,176,177 - 1248.53 387.176 1248.53 387.176 1209 390 c 0,178,179 - 1180.02 387.742 l 0,180,181 - 1171.73 385.453 1171.73 385.453 1169 380 c 0,182,183 - 1166.86 361.224 l 0,184,185 - 1167.14 356.858 1167.14 356.858 1168 352 c 0,186,187 - 1183 234.001 1183 234.001 1270 167 c 0,188,189 - 1357.01 99.9952 1357.01 99.9952 1368 -1 c 0,190,191 - 1372.17 -39.7089 1372.17 -39.7089 1372.1 -75.0335 c 0,192,193 - 1371.98 -132.791 1371.98 -132.791 1360.5 -181.5 c 0,194,195 - 1342.01 -259.987 1342.01 -259.987 1268 -330 c 1,0,1 -701 705 m 0,116,117 - 736.5 753 l 0,118,119 - 755 778 755 778 776 793 c 0,120,121 - 839 831 839 831 860 763 c 0,122,123 - 831.214 778.397 831.214 778.397 813.857 778.333 c 0,124,125 - 805.285 778.302 805.285 778.302 799.5 774.5 c 0,126,127 - 790.855 768.819 790.855 768.819 790.629 758.624 c 0,128,129 - 794.49 742.017 l 0,130,131 - 796.315 737.74 796.315 737.74 799 733 c 0,132,133 - 827 679 827 679 877 735 c 0,134,135 - 927 791 927 791 912 878 c 0,136,137 - 904.001 918.996 904.001 918.996 851 1051 c 0,138,139 - 798 1183 798 1183 759 1150 c 0,140,141 - 734.385 1130 734.385 1130 734.326 1102.31 c 0,142,143 - 734.308 1094 734.308 1094 736.5 1085 c 0,144,145 - 746 1046 746 1046 750 1010 c 0,146,147 - 756 938 756 938 726 869.5 c 0,148,149 - 696 801 696 801 585 843 c 0,150,151 - 616 840 616 840 661 864.5 c 0,152,153 - 706 889 706 889 654 934 c 0,154,155 - 635 949 635 949 610.5 934.5 c 0,156,157 - 585.998 919.998 585.998 919.998 571 901 c 0,158,159 - 531.263 848.664 531.263 848.664 530.978 805.134 c 0,160,161 - 530.881 790.211 530.881 790.211 535.419 776.324 c 0,162,163 - 544.962 747.125 544.962 747.125 575 722.5 c 0,164,165 - 661 652 661 652 701 705 c 0,116,117 -EndSplineSet -KernsSLIF: 67 -52 0 0 99 -130 0 0 77 -104 0 0 109 -78 0 0 104 -130 0 0 72 -104 0 0 45 -169 0 0 115 -286 0 0 83 -247 0 0 121 -299 0 0 89 -257 0 0 116 -299 0 0 84 -299 0 0 118 -65 0 0 119 -230 0 0 86 -50 0 0 87 -193 0 0 -EndChar -StartChar: B -Encoding: 66 66 16 -Width: 1278 -Flags: HMW -HStem: 48 189<429.6 747.3> 726 257<422.4 754.5> 1447 200<399 696> 1549 111<30 212.7> -VStem: 246 153<-28 1647> -Fore -502 218 m 1,0,1 - 561.4 216.556 l 0,2,3 - 622.601 219 622.601 219 691 237 c 0,4,5 - 793.6 264 793.6 264 865.6 297 c 0,6,7 - 926.8 324 926.8 324 994 397 c 0,8,9 - 1036 442.625 1036 442.625 1036.28 481.219 c 0,10,11 - 1036.38 494.855 1036.38 494.855 1031.27 507.613 c 0,12,13 - 1027.71 516.52 1027.71 516.52 1021.6 525 c 0,14,15 - 1007.2 544 1007.2 544 977.2 551.5 c 0,16,17 - 947.2 559 947.2 559 923.2 535 c 0,18,19 - 907.6 519 907.6 519 914.2 492 c 0,20,21 - 920.8 465 920.8 465 962.8 448 c 0,22,23 - 930.4 424 930.4 424 872.8 455.5 c 0,24,25 - 815.2 487 815.2 487 824.8 540 c 0,26,27 - 834.4 599 834.4 599 892 634.5 c 0,28,29 - 949.6 670 949.6 670 930.4 721 c 0,30,31 - 914.8 760 914.8 760 828.4 789 c 0,32,33 - 742 818 742 818 659.2 824 c 0,34,35 - 583.6 829 583.6 829 518.2 821 c 0,36,37 - 452.8 813 452.8 813 422.8 749 c 0,38,39 - 397.6 699 397.6 699 394 644 c 0,40,41 - 392.642 563.434 l 0,42,43 - 393.092 550.121 393.092 550.121 394 537 c 0,44,45 - 394 505 394 505 425.8 479 c 0,46,47 - 441.204 466.405 441.204 466.405 461.255 466.482 c 0,48,49 - 482.596 466.563 482.596 466.563 509.2 481 c 0,50,51 - 563.2 511 563.2 511 547 549.5 c 0,52,53 - 530.8 588 530.8 588 487.6 600 c 0,54,55 - 535.6 628 535.6 628 587.2 607 c 0,56,57 - 641.417 584.409 641.417 584.409 641.743 534.874 c 0,58,59 - 641.778 529.59 641.778 529.59 641.2 524 c 0,60,61 - 635.2 466 635.2 466 600.4 434 c 0,62,63 - 568 404 568 404 494.8 354.5 c 0,64,65 - 421.6 305 421.6 305 432.4 260 c 0,66,67 - 439.6 222.999 439.6 222.999 502 218 c 0,68,-1 - 502 218 l 1,0,1 -407.399 1024 m 1,44,45 - 440.211 988.385 440.211 988.385 494.485 988.133 c 0,46,47 - 515.008 988.038 515.008 988.038 538.6 993 c 0,48,49 - 710.352 1029.12 710.352 1029.12 715 1040 c 0,50,-1 - 855 1160 l 0,51,52 - 892.587 1216.39 892.587 1216.39 895 1340 c 0,53,54 - 891.78 1368.18 l 0,55,56 - 877.492 1424.08 877.492 1424.08 800.199 1467 c 0,57,58 - 718.469 1511.32 718.469 1511.32 663.365 1511.34 c 0,59,60 - 653.779 1511.34 653.779 1511.34 645 1510 c 0,61,62 - 624.821 1506.71 624.821 1506.71 624.832 1481.94 c 0,63,64 - 624.843 1459.52 624.843 1459.52 641.399 1419.5 c 0,65,66 - 656.36 1382.55 656.36 1382.55 656.399 1347.14 c 0,67,68 - 656.445 1304.45 656.445 1304.45 634.8 1264 c 0,69,70 - 577.198 1157.99 577.198 1157.99 480 1165 c 0,71,72 - 542.913 1179.56 542.913 1179.56 543.048 1262.94 c 0,73,74 - 543.052 1265.44 543.052 1265.44 543 1268 c 0,75,76 - 541.199 1356 541.199 1356 471.6 1356 c 0,77,78 - 412.814 1356 412.814 1356 390 1175 c 0,79,80 - 385.232 1137.17 385.232 1137.17 385.253 1108.14 c 0,81,82 - 385.299 1045.82 385.299 1045.82 407.399 1024 c 0,83,-1 - 407.399 1024 l 1,44,45 -329 42.5 m 145,-1,-1 - 217.398 -13.5 l 0,45,46 - 189.653 -11.4947 l 0,47,48 - 152.289 -3.04026 152.289 -3.04026 148.549 38.5 c 0,49,50 - 143.6 93.5001 143.6 93.5001 170.6 138.5 c 0,51,52 - 171.034 92.1899 l 0,53,54 - 175.03 55.9341 175.03 55.9341 193.049 55.9206 c 0,55,56 - 196.817 55.9177 196.817 55.9177 201.199 57.5 c 0,57,58 - 237.199 70.5001 237.199 70.5001 243.049 146 c 0,59,60 - 245.057 225.875 l 0,61,62 - 244.13 266.908 244.13 266.908 239.449 311.5 c 0,63,64 - 230 401.5 230 401.5 212.449 482.5 c 0,65,66 - 194.897 563.5 194.897 563.5 185.898 586.5 c 0,67,68 - 148.1 672.5 148.1 672.5 131 707 c 0,69,70 - 109.776 749.815 109.776 749.815 62.5996 814.5 c 0,71,72 - 25.0875 865.935 25.0875 865.935 25.0878 930.344 c 0,73,74 - 25.0878 938.566 25.0878 938.566 25.6992 947 c 0,75,76 - 31.099 1021.51 31.099 1021.51 84.1992 1062.5 c 0,77,78 - 105.439 1078.95 105.439 1078.95 132.197 1079.03 c 0,79,80 - 142.86 1079.06 142.86 1079.06 154.398 1076.5 c 0,81,82 - 194.898 1067.5 194.898 1067.5 199.398 984.5 c 0,83,84 - 181.495 1010.2 181.495 1010.2 153.067 1010.13 c 0,85,86 - 147.206 1010.11 147.206 1010.11 140.898 1009 c 0,87,88 - 108.919 1003.37 108.919 1003.37 108.71 956.798 c 0,89,90 - 108.678 949.633 108.678 949.633 109.398 941.5 c 0,91,92 - 113.898 888.5 113.898 888.5 153.5 887 c 0,93,94 - 177.527 889.565 l 0,95,96 - 198.558 895.607 198.558 895.607 209.299 915.5 c 0,97,98 - 244.941 978.864 244.941 978.864 244.85 1117 c 0,99,100 - 244.398 1254.51 244.398 1254.51 239 1337.5 c 0,101,102 - 234.5 1398.51 234.5 1398.51 214.699 1474 c 0,103,104 - 197.487 1539.63 197.487 1539.63 136.544 1539.54 c 0,105,106 - 125.889 1539.52 125.889 1539.52 113.898 1537.5 c 0,107,108 - 53.5987 1527.32 53.5987 1527.32 53.5019 1477.59 c 0,109,110 - 53.4845 1468.68 53.4845 1468.68 55.3984 1458.5 c 0,111,112 - 67.9981 1391.51 67.9981 1391.51 95 1387.5 c 0,113,114 - 71.1185 1384.55 l 0,115,116 - 33.5813 1386.31 33.5813 1386.31 9.04883 1432 c 0,117,118 - -9.05229 1465.71 -9.05229 1465.71 -9.0989 1503.43 c 0,119,120 - -9.13456 1532.29 -9.13456 1532.29 1.39844 1563.5 c 0,121,122 - 48.8936 1701.35 48.8936 1701.35 184.1 1674.5 c 0,123,-1 - 277.25 1656 l 0,124,125 - 288.387 1652.52 288.387 1652.52 303.567 1652.53 c 0,126,127 - 337.485 1652.56 337.485 1652.56 391.6 1670 c 0,128,129 - 439.6 1686.01 439.6 1686.01 478.6 1730 c 0,130,131 - 517.645 1774.05 517.645 1774.05 550 1807 c 0,132,133 - 571.608 1830 571.608 1830 616.6 1849.5 c 0,134,135 - 661.6 1869 661.6 1869 701.2 1863 c 0,136,137 - 757.593 1855.01 757.593 1855.01 810.4 1807 c 0,138,139 - 844.491 1776.01 844.491 1776.01 844.565 1732.09 c 0,140,141 - 844.604 1708.46 844.604 1708.46 834.4 1680 c 0,142,143 - 826.002 1712.99 826.002 1712.99 757 1759 c 0,144,145 - 732.891 1775.07 732.891 1775.07 713.659 1775.14 c 0,146,147 - 686.315 1775.24 686.315 1775.24 668.833 1742.98 c 0,148,149 - 664.282 1734.59 664.282 1734.59 660.4 1724 c 0,150,151 - 659.954 1711.82 l 0,152,153 - 668.693 1677.46 668.693 1677.46 782.8 1621.5 c 0,154,155 - 918.4 1555.01 918.4 1555.01 954.4 1515 c 0,156,157 - 1044.4 1411.99 1044.4 1411.99 1061.8 1300 c 0,158,159 - 1069.05 1253.31 1069.05 1253.31 1068.98 1209.14 c 0,160,161 - 1068.86 1141.63 1068.86 1141.63 1051.6 1080 c 0,162,163 - 1043.2 1049.99 1043.2 1049.99 997 1004.5 c 0,164,165 - 964.388 972.382 964.388 972.382 932.075 972.403 c 0,166,167 - 918.612 972.412 918.612 972.412 905.2 978 c 0,168,169 - 938.8 1012.99 938.8 1012.99 905.2 1026 c 0,170,171 - 886.612 1029.18 l 0,172,173 - 869.691 1027.82 869.691 1027.82 865.6 1006 c 0,174,175 - 857.2 961 857.2 961 951.4 850 c 0,176,177 - 1046.91 737.47 1046.91 737.47 1080.4 784 c 0,178,179 - 1098.4 809 1098.4 809 1080.4 844 c 0,180,181 - 1062.4 879 1062.4 879 1025.2 906 c 0,182,183 - 1133.2 903 1133.2 903 1181.2 815.5 c 0,184,185 - 1229.2 728 1229.2 728 1231.6 695 c 0,186,187 - 1235.2 629 1235.2 629 1196.2 526 c 0,188,189 - 1157.2 423 1157.2 423 1157.2 339 c 0,190,191 - 1157.2 237.999 1157.2 237.999 1142.8 158 c 0,192,193 - 1128.4 78.0005 1128.4 78.0005 1085.2 27 c 0,194,195 - 1033.6 -33 1033.6 -33 947.2 -50 c 0,196,197 - 904 -59 904 -59 830.2 -52 c 0,198,199 - 756.4 -45 756.4 -45 725.2 -20 c 0,200,201 - 780.4 -32 780.4 -32 833.2 -4.5 c 0,202,203 - 887.95 24.0156 887.95 24.0156 856 71 c 0,204,205 - 835.6 101 835.6 101 731.2 97 c 0,206,207 - 626.8 92.9999 626.8 92.9999 584.8 90 c 0,208,-1 - 450.4 79.5 l 0,209,210 - 396.73 69.5341 396.73 69.5341 329 42.5 c 145,-1,-1 -EndSplineSet -EndChar -StartChar: C -Encoding: 67 67 9 -Width: 1268 -Flags: W -Fore -47 1225 m 0,0,1 - 49.4717 1250.42 l 0,2,3 - 59.182 1290.3 59.182 1290.3 105 1339.5 c 0,4,5 - 139.698 1376.76 139.698 1376.76 170.189 1376.97 c 0,6,7 - 184.334 1377.07 184.334 1377.07 197.574 1369.19 c 0,8,9 - 205.969 1364.2 205.969 1364.2 214 1356 c 0,10,11 - 161.521 1347.64 161.521 1347.64 161.103 1310.92 c 0,12,13 - 165.255 1287.2 l 0,14,15 - 165.612 1286.11 165.612 1286.11 166 1285 c 0,16,17 - 173.846 1261.46 173.846 1261.46 188.296 1261.14 c 0,18,19 - 201.91 1265.14 l 0,20,21 - 214.659 1272.25 214.659 1272.25 231 1292 c 0,22,23 - 279.011 1350.02 279.011 1350.02 288 1369 c 0,24,25 - 316.999 1432 316.999 1432 325.5 1494 c 0,26,27 - 334.002 1556.01 334.002 1556.01 375 1609 c 0,28,29 - 407.609 1651.5 407.609 1651.5 461 1651.5 c 0,30,31 - 513.998 1651.01 513.998 1651.01 527 1612 c 0,32,33 - 477.134 1610.54 477.134 1610.54 476.205 1594.01 c 0,34,35 - 479.67 1583.33 l 0,36,37 - 480.687 1581.71 480.687 1581.71 482 1580 c 0,38,39 - 503 1550 503 1550 539 1571 c 0,40,41 - 575.016 1592.01 575.016 1592.01 592 1608 c 0,42,43 - 625.211 1639.88 625.211 1639.88 625.553 1659.63 c 0,44,45 - 622.289 1671.21 l 0,46,47 - 620.426 1674.05 620.426 1674.05 617.5 1676.5 c 0,48,49 - 605.555 1686.5 605.555 1686.5 590.873 1686.63 c 0,50,51 - 579.546 1686.73 579.546 1686.73 566.589 1680.95 c 0,52,53 - 561.901 1678.86 561.901 1678.86 557 1676 c 0,54,55 - 561.001 1724.01 561.001 1724.01 599 1730.5 c 0,56,57 - 631.988 1732.53 l 0,58,59 - 649.19 1731.37 649.19 1731.37 663 1725 c 0,60,61 - 774.955 1671.02 774.955 1671.02 848.5 1627 c 0,62,63 - 922.028 1582.99 922.028 1582.99 944 1574 c 0,64,65 - 980.724 1556.52 980.724 1556.52 1013.99 1556.61 c 0,66,67 - 1018.78 1556.62 1018.78 1556.62 1023.5 1557 c 0,68,69 - 1065.63 1556.28 l 0,70,71 - 1085.75 1554.21 1085.75 1554.21 1108 1549 c 0,72,73 - 1133.01 1543 1133.01 1543 1141 1509 c 0,74,75 - 1144.76 1476.5 l 0,76,77 - 1144.64 1459.48 1144.64 1459.48 1140 1443 c 0,78,79 - 1100.54 1480.38 1100.54 1480.38 1075.21 1480.38 c 0,80,81 - 1063.96 1480.38 1063.96 1480.38 1055.5 1473 c 0,82,83 - 1028 1449 1028 1449 1027 1379 c 0,84,85 - 1025.99 1342.76 1025.99 1342.76 1023.5 1308 c 0,86,87 - 1024.8 1274.25 l 0,88,89 - 1027.4 1257.24 1027.4 1257.24 1034 1241 c 0,90,91 - 1056.99 1187 1056.99 1187 1104 1173.5 c 0,92,93 - 1150.99 1160 1150.99 1160 1208 1157 c 0,94,95 - 1193.22 1128.26 1193.22 1128.26 1142.36 1128.18 c 0,96,97 - 1131.28 1128.16 1131.28 1128.16 1118.5 1129.5 c 0,98,99 - 1046.99 1137 1046.99 1137 1024 1155 c 0,100,101 - 960.474 1201.53 960.474 1201.53 960.191 1248.45 c 0,102,103 - 960.158 1253.97 960.158 1253.97 961 1259.5 c 0,104,105 - 961.658 1293.31 l 0,106,107 - 957.59 1340.52 957.59 1340.52 929 1412 c 0,108,109 - 904.002 1471.99 904.002 1471.99 828.5 1485 c 0,110,111 - 753 1498.01 753 1498.01 702 1440 c 0,112,113 - 663 1395 663 1395 633 1335 c 0,114,115 - 603.007 1275.01 603.007 1275.01 567 1229 c 0,116,117 - 553 1211 553 1211 495 1212.5 c 0,118,119 - 442.472 1213.86 442.472 1213.86 441.617 1243.51 c 0,120,121 - 441.528 1246.6 441.528 1246.6 442 1250 c 0,122,123 - 476 1233.01 476 1233.01 508 1254.5 c 0,124,125 - 538.826 1275.21 538.826 1275.21 539 1309 c 0,126,127 - 538.026 1346.98 538.026 1346.98 516 1347.5 c 0,128,129 - 494.008 1347.01 494.008 1347.01 476 1335 c 0,130,131 - 422.998 1299 422.998 1299 400 1269 c 0,132,133 - 376.997 1239 376.997 1239 363 1178 c 0,134,135 - 350.291 1125.16 350.291 1125.16 350.334 1075.45 c 0,136,137 - 350.354 1050.84 350.354 1050.84 353.5 1027 c 0,138,-1 - 373 875 l 0,139,140 - 377 833 377 833 392.5 790.5 c 0,141,142 - 408 748 408 748 402 708 c 0,143,144 - 384 597 384 597 276 601 c 0,145,146 - 297 615 297 615 321 643.5 c 0,147,148 - 345 672 345 672 327 704 c 0,149,150 - 317.431 720.586 317.431 720.586 296.467 720.691 c 0,151,152 - 284.569 720.75 284.569 720.75 269 715.5 c 0,153,154 - 226 701 226 701 222 674 c 0,155,156 - 203.999 574.997 203.999 574.997 203.5 494 c 0,157,158 - 207.196 446.84 l 0,159,160 - 216.755 387.21 216.755 387.21 251 323 c 0,161,162 - 274 279 274 279 310 272.5 c 0,163,164 - 325.021 273.259 l 0,165,166 - 349.347 280.951 349.347 280.951 361 333 c 0,167,168 - 367 358 367 358 360.5 370.5 c 0,169,170 - 354.013 382.975 354.013 382.975 340 408 c 0,171,172 - 364 402 364 402 386 395.5 c 0,173,174 - 408 389 408 389 420 365 c 0,175,176 - 444 317 444 317 448 270 c 0,177,178 - 452.001 223 452.001 223 469 172 c 0,179,180 - 485.999 112 485.999 112 527 100 c 0,181,182 - 549.843 92.7319 549.843 92.7319 568.743 92.6397 c 0,183,184 - 589.209 92.5398 589.209 92.5398 605.053 100.853 c 0,185,186 - 630.948 114.44 630.948 114.44 644.5 150.5 c 0,187,188 - 674 228.999 674 228.999 713 284 c 0,189,190 - 728 306 728 306 758.5 303 c 0,191,192 - 789 300 789 300 807 272 c 0,193,194 - 822.48 247.06 822.48 247.06 822.428 228.037 c 0,195,196 - 822.42 224.94 822.42 224.94 822 222 c 0,197,198 - 806.151 230.453 806.151 230.453 792.255 230.533 c 0,199,200 - 779.849 230.604 779.849 230.604 769 224 c 0,201,202 - 756.895 216.632 756.895 216.632 756.701 206.493 c 0,203,204 - 760.654 193.505 l 0,205,206 - 762.764 189.883 762.764 189.883 766 186 c 0,207,208 - 778.697 169.395 778.697 169.395 794.376 169.248 c 0,209,210 - 804.891 169.149 804.891 169.149 816.746 176.451 c 0,211,212 - 823.411 180.556 823.411 180.556 830.5 187 c 0,213,214 - 869 221.999 869 221.999 872 275 c 0,215,216 - 875 343 875 343 864 401 c 0,217,218 - 853.002 458.994 853.002 458.994 830 527 c 0,219,220 - 819 558 819 558 829.5 632 c 0,221,222 - 840 706 840 706 877 760 c 0,223,224 - 871 705 871 705 863.5 649.5 c 0,225,226 - 856 594 856 594 874 540 c 0,227,228 - 887.006 500.985 887.006 500.985 903 460.5 c 0,229,230 - 919 420 919 420 937 388 c 0,231,232 - 967.999 333.002 967.999 333.002 997 302 c 0,233,234 - 1020.46 276.921 1020.46 276.921 1064.21 276.712 c 0,235,236 - 1074.54 276.663 1074.54 276.663 1086 278 c 0,237,238 - 1110.37 280.089 1110.37 280.089 1110.5 306.429 c 0,239,240 - 1110.55 317.912 1110.55 317.912 1106 334 c 0,241,242 - 1118.66 334.754 l 0,243,244 - 1131.52 331.594 1131.52 331.594 1143 312 c 0,245,246 - 1157.23 287.716 1157.23 287.716 1157.45 273.956 c 0,247,248 - 1157.49 271.279 1157.49 271.279 1157 269 c 0,249,250 - 1148 226.995 1148 226.995 1130.5 212 c 0,251,252 - 1112.99 197 1112.99 197 1075 185 c 0,253,254 - 1046.42 174.52 1046.42 174.52 1011.5 174.5 c 0,255,256 - 978 174.999 978 174.999 951 161 c 0,257,258 - 914 141.001 914 141.001 909.5 67 c 0,259,260 - 905 -6.99995 905 -6.99995 884 -48 c 0,261,262 - 861 -91.0001 861 -91.0001 795 -104 c 0,263,264 - 769 -108.999 769 -108.999 721.5 -100 c 0,265,266 - 674 -91 674 -91 675 -49 c 0,267,268 - 706 -76 706 -76 748 -55 c 0,269,270 - 771 -41 771 -41 760.5 -12 c 0,271,272 - 750 17 750 17 728 23 c 0,273,274 - 701 27 701 27 672 20 c 0,275,276 - 643 12.9999 643 12.9999 618 4 c 0,277,278 - 510.997 -35.0014 510.997 -35.0014 450.5 -65 c 0,279,280 - 390 -95 390 -95 288 -50 c 0,281,282 - 255.001 -35.0002 255.001 -35.0002 248 19 c 0,283,284 - 240.999 73 240.999 73 266 90 c 0,285,286 - 268.764 57.7708 l 0,287,288 - 273.271 37.2823 273.271 37.2823 285 23.5 c 0,289,290 - 305 -3.8147e-06 305 -3.8147e-06 326 18 c 0,291,292 - 351 42 351 42 330 84.5 c 0,293,294 - 309 126.999 309 126.999 270 170 c 0,295,296 - 231.004 212.997 231.004 212.997 189 247 c 0,297,298 - 147 281 147 281 132 287 c 0,299,300 - 90.8733 273.479 90.8733 273.479 90.2146 252.658 c 0,301,302 - 93.6925 239.052 l 0,303,304 - 99.219 228.316 99.219 228.316 113.5 216 c 0,305,306 - 168.001 168.999 168.001 168.999 208 167 c 0,307,308 - 164.966 164.347 l 0,309,310 - 113.852 166.12 113.852 166.12 87.5 195 c 0,311,312 - 51 235.001 51 235.001 27 291 c 0,313,314 - -18 394 -18 394 7 532 c 0,315,316 - 21 601 21 601 58.5 666.5 c 0,317,318 - 96 732 96 732 100 804 c 0,319,320 - 104.001 909 104.001 909 77.5 1014 c 0,321,322 - 50.9998 1119 50.9998 1119 47 1225 c 0,0,1 -EndSplineSet -KernsSLIF: 83 -143 0 0 115 -130 0 0 65 -65 0 0 97 -91 0 0 -EndChar -StartChar: D -Encoding: 68 68 59 -Width: 1497 -Flags: HMW -VStem: 205 177.5<-118.5 1622> -Fore -365 -163 m 1,0,1 - 416.469 -202.888 416.469 -202.888 460.901 -203.041 c 0,2,3 - 485.532 -203.126 485.532 -203.126 508 -191 c 0,4,5 - 571 -156.999 571 -156.999 570 -140 c 0,6,7 - 568.069 -103.299 568.069 -103.299 511.5 -103 c 0,8,9 - 454.994 -104.001 454.994 -104.001 382.5 -118.5 c 0,10,11 - 309.985 -133.004 309.985 -133.004 241 -149.5 c 0,12,13 - 187.813 -162.219 187.813 -162.219 159.581 -162.162 c 0,14,15 - 151.188 -162.146 151.188 -162.146 145 -161 c 0,16,17 - 87.0002 -150.001 87.0002 -150.001 36.5 -93.5 c 0,18,19 - -14 -37 -14 -37 31 65 c 0,20,21 - 32 -35 32 -35 80 -60.5 c 0,22,23 - 106.871 -74.7751 106.871 -74.7751 136.405 -74.7912 c 0,24,25 - 159.629 -74.8038 159.629 -74.8038 184.5 -66 c 0,26,27 - 241 -46.0003 241 -46.0003 287.5 5 c 0,28,29 - 334 56 334 56 334 110 c 0,30,31 - 334 134.001 334 134.001 303 181 c 0,32,33 - 272 227.999 272 227.999 240 223 c 0,34,35 - 200.921 216.053 200.921 216.053 200.681 163.856 c 0,36,37 - 200.645 155.947 200.645 155.947 201.5 147 c 0,38,39 - 207.999 79.0005 207.999 79.0005 242 55 c 0,40,41 - 198 57 198 57 186 69.5 c 0,42,43 - 173.999 82.0008 173.999 82.0008 166 102 c 0,44,45 - 146.175 148.259 146.175 148.259 146.18 200.646 c 0,46,47 - 146.186 259.24 146.186 259.24 171 325.5 c 0,48,49 - 217.997 450.995 217.997 450.995 255 533 c 0,50,51 - 281 592 281 592 288.5 644.5 c 0,52,53 - 296 697 296 697 284 804 c 0,54,55 - 272 905.001 272 905.001 200.5 994 c 0,56,57 - 129.006 1082.99 129.006 1082.99 113 1136 c 0,58,59 - 105.918 1159.37 105.918 1159.37 105.92 1182.3 c 0,60,61 - 105.924 1224.13 105.924 1224.13 129.5 1264.5 c 0,62,63 - 159.568 1315.99 159.568 1315.99 217.121 1316.24 c 0,64,65 - 229.432 1316.29 229.432 1316.29 243 1314 c 0,66,67 - 217.999 1303.01 217.999 1303.01 202.5 1270.5 c 0,68,69 - 197.239 1259.47 197.239 1259.47 197.22 1249.64 c 0,70,71 - 197.184 1230.54 197.184 1230.54 217 1216 c 0,72,73 - 229.554 1206.32 229.554 1206.32 239.508 1206.15 c 0,74,75 - 250.481 1209.35 l 0,76,77 - 269.179 1221.62 269.179 1221.62 275 1281 c 0,78,79 - 280.343 1335.49 280.343 1335.49 280.262 1373.43 c 0,80,81 - 280.192 1406.51 280.192 1406.51 276 1427 c 0,82,83 - 265.002 1483.99 265.002 1483.99 241 1527 c 0,84,85 - 216.996 1570.01 216.996 1570.01 205 1622 c 0,86,87 - 198.585 1647.66 198.585 1647.66 198.623 1675.88 c 0,88,89 - 198.661 1704.84 198.661 1704.84 205.5 1736.5 c 0,90,91 - 218.999 1799 218.999 1799 263 1838 c 0,92,93 - 292.994 1866 292.994 1866 351 1867.5 c 0,94,95 - 385.17 1864.86 l 0,96,97 - 415.91 1858.47 415.91 1858.47 430 1837 c 0,98,99 - 440 1820.01 440 1820.01 448 1802.5 c 0,100,101 - 451.449 1794.95 451.449 1794.95 451.366 1783.78 c 0,102,103 - 451.257 1769.05 451.257 1769.05 445 1748 c 0,104,105 - 439 1775 439 1775 383 1796 c 0,106,107 - 370.726 1800.6 370.726 1800.6 360.326 1800.69 c 0,108,109 - 348.764 1800.79 348.764 1800.79 339.517 1795.3 c 0,110,111 - 319.131 1783.21 319.131 1783.21 310 1744 c 0,112,113 - 296 1690 296 1690 342.5 1657 c 0,114,115 - 389.022 1623.98 389.022 1623.98 438 1601 c 0,116,117 - 481.975 1580.01 481.975 1580.01 619 1544.5 c 0,118,119 - 667.085 1532.04 667.085 1532.04 700.019 1532.08 c 0,120,121 - 760.914 1532.16 760.914 1532.16 770 1575 c 0,122,123 - 774.3 1598.65 774.3 1598.65 774.32 1618.05 c 0,124,125 - 774.385 1679.86 774.385 1679.86 731 1698.5 c 0,126,127 - 703.091 1710.49 703.091 1710.49 679.502 1710.62 c 0,128,129 - 662.09 1710.72 662.09 1710.72 647.03 1704.36 c 0,130,131 - 635 1698 l 0,132,133 - 635 1743 635 1743 670 1758.5 c 0,134,135 - 704.999 1773.99 704.999 1773.99 713 1775 c 0,136,137 - 760 1774.5 l 0,138,139 - 802.004 1770.17 802.004 1770.17 824 1750.5 c 0,140,141 - 857.006 1720.99 857.006 1720.99 872 1694 c 0,142,143 - 896.002 1649 896.002 1649 913.5 1585 c 0,144,145 - 930.999 1521 930.999 1521 973 1494 c 0,146,147 - 1042 1450.01 1042 1450.01 1072 1440 c 0,148,149 - 1102 1429.99 1102 1429.99 1177 1419 c 0,150,151 - 1282.99 1403 1282.99 1403 1308 1317 c 0,152,153 - 1313.32 1295.3 1313.32 1295.3 1313.3 1276.45 c 0,154,155 - 1313.22 1206.7 1313.22 1206.7 1240 1176 c 0,156,157 - 1260.26 1204.06 1260.26 1204.06 1260.48 1235.14 c 0,158,159 - 1260.55 1243.95 1260.55 1243.95 1259 1253 c 0,160,161 - 1252.76 1289.51 1252.76 1289.51 1206.87 1289.54 c 0,162,163 - 1201.23 1289.55 1201.23 1289.55 1195 1289 c 0,164,165 - 1174.85 1287.11 1174.85 1287.11 1174.92 1260.84 c 0,166,167 - 1174.96 1245.39 1174.96 1245.39 1182 1221.5 c 0,168,169 - 1201.02 1156.95 1201.02 1156.95 1214 1130 c 0,170,171 - 1274.01 1003.97 1274.01 1003.97 1353 887 c 0,172,173 - 1432 770.008 1432 770.008 1438 703 c 0,174,175 - 1437.29 667.063 l 0,176,177 - 1429.48 607.261 1429.48 607.261 1377 554 c 0,178,179 - 1359 536 1359 536 1318.5 532.5 c 0,180,181 - 1285.16 533.1 l 0,182,183 - 1266.74 535.756 1266.74 535.756 1253 544 c 0,184,185 - 1292 544 1292 544 1311.5 575 c 0,186,187 - 1320.25 588.918 1320.25 588.918 1320.44 600.216 c 0,188,189 - 1317.5 612.987 l 0,190,191 - 1314.39 618.996 1314.39 618.996 1308 624 c 0,192,193 - 1266 653 1266 653 1237.5 607.5 c 0,194,195 - 1209 562 1209 562 1200 535 c 0,196,197 - 1198.96 531.908 1198.96 531.908 1180 489.5 c 0,198,199 - 1161.01 447.043 1161.01 447.043 1144.5 396.5 c 0,200,201 - 1128 346 1128 346 1123.5 303.5 c 0,202,203 - 1124.19 278.807 l 0,204,205 - 1128.4 260.303 1128.4 260.303 1146 259 c 0,206,207 - 1188 255 1188 255 1203 276 c 0,208,209 - 1218.01 297.013 1218.01 297.013 1232 339 c 0,210,211 - 1252.93 293.919 1252.93 293.919 1253.12 259.927 c 0,212,213 - 1253.22 242.802 1253.22 242.802 1248.05 228.491 c 0,214,215 - 1244.37 218.279 1244.37 218.279 1238 209.5 c 0,216,217 - 1205 164 1205 164 1175 152 c 0,218,219 - 1085 115.002 1085 115.002 1029.5 103.5 c 0,220,221 - 974 91.9999 974 91.9999 930.5 75.5 c 0,222,223 - 887 59 887 59 844.5 22.5 c 0,224,225 - 801.998 -14.0021 801.998 -14.0021 740 -103 c 0,226,227 - 619.211 -271.373 619.211 -271.373 522.285 -271.438 c 0,228,229 - 513.29 -271.444 513.29 -271.444 504.5 -270 c 0,230,231 - 401 -253 401 -253 365 -163 c 1,0,1 -725 192 m 0,122,123 - 749 216 749 216 794.5 272 c 0,124,125 - 840 328 840 328 855 355 c 0,126,127 - 879.999 397.998 879.999 397.998 888.5 438.5 c 0,128,129 - 897 479 897 479 906 529 c 0,130,131 - 922 613 922 613 979 629.5 c 0,132,133 - 1000.57 635.743 1000.57 635.743 1016.41 635.759 c 0,134,135 - 1042.44 635.784 1042.44 635.784 1053 619 c 0,136,137 - 1002 619 1002 619 984 586 c 0,138,139 - 966 553 966 553 977 538 c 0,140,141 - 989.486 518.904 989.486 518.904 1004.74 518.755 c 0,142,143 - 1015.01 518.656 1015.01 518.656 1026.55 527.159 c 0,144,145 - 1044.5 540.4 1044.5 540.4 1065.5 574.5 c 0,146,147 - 1120 663.009 1120 663.009 1126 744 c 0,148,149 - 1130.99 817 1130.99 817 1094.5 950.5 c 0,150,151 - 1066.07 1054.48 1066.07 1054.48 1021.56 1054.42 c 0,152,153 - 1008.93 1054.4 1008.93 1054.4 995 1046 c 0,154,155 - 975.667 1034 975.667 1034 975.667 1018 c 0,156,157 - 975.667 1010 975.667 1010 980.5 1001 c 0,158,159 - 995.002 973.998 995.002 973.998 1038 962 c 0,160,161 - 954 929 954 929 929.5 1003.5 c 0,162,163 - 904.996 1078.02 904.996 1078.02 894 1138 c 0,164,165 - 876.999 1227 876.999 1227 805.5 1282.5 c 0,166,167 - 734 1338 734 1338 651.5 1350 c 0,168,169 - 605.665 1352.79 l 0,170,171 - 548.883 1351.23 548.883 1351.23 498 1324 c 0,172,173 - 427.002 1286.01 427.002 1286.01 412 1188 c 0,174,175 - 405 1146 405 1146 419.5 1117.5 c 0,176,177 - 434 1089 434 1089 470 1098 c 0,178,179 - 485 1101.75 485 1101.75 485.375 1115.63 c 0,180,181 - 484 1126 l 0,182,183 - 477.997 1149.01 477.997 1149.01 454 1166 c 0,184,185 - 479.875 1167.62 l 0,186,187 - 516.252 1164.25 516.252 1164.25 538 1126 c 0,188,189 - 546.998 1108 546.998 1108 553 1077.5 c 0,190,191 - 553.751 1052.78 l 0,192,193 - 551.262 1032.3 551.262 1032.3 539 1009 c 0,194,195 - 458.999 855.998 458.999 855.998 437.5 671.5 c 0,196,197 - 416 487 416 487 428 407 c 0,198,199 - 445 284 445 284 488.5 279.5 c 0,200,201 - 532 275 532 275 539 318 c 0,202,203 - 538.454 335.091 l 0,204,205 - 531.345 359 531.345 359 484 359 c 0,206,207 - 490 374 490 374 509.5 376 c 0,208,209 - 529 378 529 378 541 381 c 0,210,211 - 567.678 382.442 l 0,212,213 - 608.823 378.097 608.823 378.097 618.5 327 c 0,214,215 - 630.999 261.003 630.999 261.003 643 220 c 0,216,217 - 652 181 652 181 678 176.5 c 0,218,219 - 697.181 176.647 l 0,220,221 - 712.042 179.66 712.042 179.66 725 192 c 0,122,123 -EndSplineSet -KernsSLIF: 90 -182 0 0 122 -143 0 0 97 -207 0 0 65 -150 0 0 -EndChar -StartChar: E -Encoding: 69 69 53 -Width: 1257 -Flags: HMW -HStem: 47 32.5<30 142.5> 89 202.5<224.5 921.5> 729 161<354 767> 1357 203<404 858> -VStem: 117.5 176.5<365 1523> -Fore -702 114 m 1,0,1 - 611.006 112.001 611.006 112.001 515.5 93.5 c 0,2,3 - 420 75.0001 420 75.0001 339 36 c 0,4,5 - 268 1.99995 268 1.99995 178.5 -13.5 c 0,6,7 - 88.9995 -29 88.9995 -29 30 47 c 0,8,9 - -15 107 -15 107 15 159.5 c 0,10,11 - 40.0002 203.25 40.0002 203.25 98.3333 203.597 c 0,12,13 - 110 203.667 110 203.667 123 202 c 0,14,-1 - 82.5 186.5 l 0,15,16 - 64.901 179.851 64.901 179.851 64.7384 152.708 c 0,17,18 - 64.6931 145.149 64.6931 145.149 66 136 c 0,19,20 - 75 70 75 70 142.5 79.5 c 0,21,22 - 210 88.9999 210 88.9999 225 162 c 0,23,24 - 229.413 184.556 229.413 184.556 229.378 216.128 c 0,25,26 - 229.341 248.943 229.341 248.943 224.5 291.5 c 0,27,28 - 215.001 375 215.001 375 152 384 c 0,29,30 - 129.001 387 129.001 387 117.5 365 c 0,31,32 - 105.999 343 105.999 343 110 322 c 0,33,34 - 117.001 279 117.001 279 152 244 c 0,35,36 - 84.0005 262 84.0005 262 60 326 c 0,37,38 - 14 446 14 446 47.5 574 c 0,39,40 - 80.9999 702 80.9999 702 102 820 c 0,41,42 - 121.001 932.001 121.001 932.001 124.5 984 c 0,43,44 - 124.02 1053.51 l 0,45,46 - 121.855 1094.37 121.855 1094.37 116 1150 c 0,47,48 - 103.999 1246.01 103.999 1246.01 60.5 1348.5 c 0,49,50 - 17 1450.99 17 1450.99 22 1545 c 0,51,52 - 24 1585.01 24 1585.01 32 1606.5 c 0,53,54 - 40 1627.99 40 1627.99 71 1653 c 0,55,56 - 106.829 1682.31 106.829 1682.31 136.69 1682.29 c 0,57,58 - 180.171 1682.25 180.171 1682.25 211 1620 c 0,59,60 - 188.421 1640.26 188.421 1640.26 166.513 1640.58 c 0,61,62 - 147.914 1637.21 l 0,63,64 - 141.427 1634.75 141.427 1634.75 135 1630.5 c 0,65,66 - 110.758 1614.45 110.758 1614.45 110.555 1588.31 c 0,67,68 - 110.455 1575.46 110.455 1575.46 117 1558 c 0,69,70 - 135.515 1508.3 135.515 1508.3 195 1508 c 0,71,72 - 253.999 1509.01 253.999 1509.01 294 1523 c 0,73,74 - 395.012 1556 395.012 1556 501.5 1639.5 c 0,75,76 - 591.424 1710.01 591.424 1710.01 685.277 1710.28 c 0,77,78 - 702.572 1710.33 702.572 1710.33 720 1708 c 0,79,80 - 764 1702 764 1702 787.5 1661.5 c 0,81,82 - 811 1621 811 1621 787 1582 c 0,83,84 - 776.899 1645.98 776.899 1645.98 721.089 1646.53 c 0,85,86 - 698.5 1644.5 l 0,87,88 - 623.013 1631.18 623.013 1631.18 623 1584 c 0,89,90 - 623 1526.01 623 1526.01 680.99 1525.71 c 0,91,92 - 698 1525.62 698 1525.62 720 1530.5 c 0,93,94 - 817.381 1552.08 817.381 1552.08 858 1560 c 0,95,96 - 911.778 1569.96 911.778 1569.96 983.5 1580 c 0,97,98 - 1036.93 1583.69 l 0,99,100 - 1076.51 1583.35 1076.51 1583.35 1110 1573 c 0,101,102 - 1244.01 1531 1244.01 1531 1255 1399 c 0,103,104 - 1249 1432 1249 1432 1232 1452 c 0,105,106 - 1215.02 1471.98 1215.02 1471.98 1200 1485 c 0,107,108 - 1153.97 1523.47 1153.97 1523.47 1089.78 1523.48 c 0,109,110 - 1060.52 1523.48 1060.52 1523.48 1027.5 1515.5 c 0,111,112 - 921.99 1490 921.99 1490 863 1441 c 0,113,114 - 833.001 1415.01 833.001 1415.01 827.5 1379 c 0,115,116 - 828.033 1360.63 l 0,117,118 - 833.454 1337.82 833.454 1337.82 864 1324 c 0,119,120 - 869.974 1321.01 869.974 1321.01 888.5 1315.5 c 0,121,122 - 900.641 1311.89 900.641 1311.89 918.181 1311.94 c 0,123,124 - 927.351 1311.97 927.351 1311.97 938 1313 c 0,125,126 - 875 1259 875 1259 740 1322 c 0,127,128 - 605 1385 605 1385 514 1385 c 0,129,130 - 441.992 1383.99 441.992 1383.99 404 1357 c 0,131,132 - 378.16 1338.64 378.16 1338.64 378.214 1299.01 c 0,133,134 - 378.239 1280.81 378.239 1280.81 384 1257 c 0,135,136 - 393 1218 393 1218 423.5 1164 c 0,137,138 - 454 1110 454 1110 434 1071 c 0,139,140 - 409 1021.01 409 1021.01 358 1023 c 0,141,142 - 408 1083 408 1083 370 1108.5 c 0,143,144 - 353.553 1119.54 353.553 1119.54 338.791 1119.8 c 0,145,146 - 322.286 1116.51 l 0,147,148 - 312.191 1112.14 312.191 1112.14 303 1102 c 0,149,150 - 273.134 1069.54 273.134 1069.54 273.197 1022.74 c 0,151,152 - 273.231 997.463 273.231 997.463 282 968 c 0,153,154 - 307 884 307 884 385 891 c 0,155,156 - 455 897 455 897 507.5 911 c 0,157,158 - 559.99 924.997 559.99 924.997 623 948 c 0,159,160 - 702 976 702 976 804 940 c 0,161,162 - 906 904 906 904 884 793 c 0,163,164 - 876 837 876 837 846 869.5 c 0,165,166 - 816 902 816 902 767 890 c 0,167,168 - 726.999 879.999 726.999 879.999 705.5 844.5 c 0,169,170 - 684 809 684 809 677 773 c 0,171,172 - 658 674 658 674 626 610.5 c 0,173,174 - 604.458 567.752 604.458 567.752 542.58 567.831 c 0,175,176 - 512.542 567.869 512.542 567.869 473 578 c 0,177,178 - 561 602 561 602 561 645 c 0,179,180 - 561 720 561 720 485.5 729 c 0,181,182 - 447.32 733.551 447.32 733.551 414.125 733.499 c 0,183,184 - 381.68 733.449 381.68 733.449 354 729 c 0,185,186 - 284 717 284 717 283 654 c 0,187,188 - 280 600 280 600 315 596.5 c 0,189,190 - 328.846 598.578 l 0,191,192 - 344.765 606.4 344.765 606.4 344.877 641.401 c 0,193,194 - 344.905 649.899 344.905 649.899 344 660 c 0,195,196 - 392 607 392 607 391 573 c 0,197,198 - 389.999 514.999 389.999 514.999 357.5 484.5 c 0,199,200 - 325 454.001 325 454.001 325 410 c 0,201,202 - 325 332 325 332 369 336.5 c 0,203,204 - 413 341 413 341 471 370 c 0,205,206 - 529.005 399.002 529.005 399.002 585.5 422.5 c 0,207,208 - 606.644 431.295 606.644 431.295 623.377 431.196 c 0,209,210 - 651.356 431.031 651.356 431.031 667 406 c 0,211,212 - 677.588 389.235 677.588 389.235 677.666 368.967 c 0,213,214 - 677.676 366.265 677.676 366.265 677.5 363.5 c 0,215,216 - 676 340 676 340 652 333 c 0,217,218 - 652.989 347.212 l 0,219,220 - 650.646 358.106 650.646 358.106 635.616 358.287 c 0,221,222 - 630.147 358.352 630.147 358.352 623 357 c 0,223,224 - 563 343 563 343 603 291 c 0,225,226 - 630 254 630 254 697.5 254 c 0,227,228 - 765 254 765 254 800 275 c 0,229,230 - 851 305 851 305 888 352 c 0,231,232 - 925 399 925 399 976 426 c 0,233,234 - 993.321 434.66 993.321 434.66 1010.43 434.679 c 0,235,236 - 1046.68 434.717 1046.68 434.717 1082 396 c 0,237,238 - 1134.01 339 1134.01 339 1076 291 c 0,239,240 - 1101.99 369 1101.99 369 1025 361 c 0,241,242 - 967.999 353.999 967.999 353.999 961.5 300.5 c 0,243,244 - 960.341 260.536 l 0,245,246 - 962.497 231.61 962.497 231.61 974 208 c 0,247,248 - 998 157 998 157 1055 116.5 c 0,249,250 - 1112 76 1112 76 1148 34 c 0,251,252 - 1185 -7.99286 1185 -7.99286 1197 -81.5 c 0,253,254 - 1199.64 -120.957 l 0,255,256 - 1197.74 -168.802 1197.74 -168.802 1169 -204 c 0,257,258 - 1173.43 -171.487 1173.43 -171.487 1173.38 -146.126 c 0,259,260 - 1173.32 -120.019 1173.32 -120.019 1168.5 -101.5 c 0,261,262 - 1159.01 -65.0068 1159.01 -65.0068 1111 -17 c 0,263,264 - 1028.99 64.0016 1028.99 64.0016 921.5 89 c 0,265,266 - 814.002 114 814.002 114 702 114 c 1,0,1 -EndSplineSet -KernsSLIF: 83 -130 0 0 115 -130 0 0 -EndChar -StartChar: F -Encoding: 70 70 8 -Width: 1352 -Flags: MW -HStem: 705 181<397 741> 1396 225<414 1092> -VStem: 110 217<38 1678> -Fore -642 839 m 1,0,1 - 644 729 644 729 741 705 c 0,2,3 - 769.434 702.509 l 0,4,5 - 803.088 704.294 803.088 704.294 834.5 729 c 0,6,7 - 879 763 l 0,8,9 - 873 739 873 739 845.5 693 c 0,10,11 - 818 647 818 647 773 627 c 0,12,13 - 719 607 719 607 685.5 614.5 c 0,14,15 - 652 622 652 622 613 634 c 0,16,17 - 562 653 562 653 505.5 704 c 0,18,19 - 466.31 739.375 466.31 739.375 424.956 739.628 c 0,20,21 - 408.667 739.728 408.667 739.728 392.041 734.379 c 0,22,23 - 390.023 733.73 390.023 733.73 388 733 c 0,24,25 - 340 708 340 708 329.5 679.5 c 0,26,27 - 319 651 319 651 312 621 c 0,28,29 - 306 585 306 585 292 478 c 0,30,31 - 278 371 278 371 370 376 c 0,32,33 - 424 427 424 427 347 473 c 0,34,35 - 419 467 419 467 446 407 c 0,36,37 - 446 353 446 353 433.5 330 c 0,38,39 - 420.995 306.989 420.995 306.989 401 265 c 0,40,41 - 375.999 232 375.999 232 362 187.5 c 0,42,-1 - 346 137 l 0,43,44 - 324 87.0005 324 87.0005 327 38 c 0,45,46 - 327 -20 327 -20 350.5 -86.5 c 0,47,48 - 374.001 -153.001 374.001 -153.001 428 -195 c 0,49,50 - 365.001 -195 365.001 -195 323.5 -122.5 c 0,51,52 - 282.002 -50.0044 282.002 -50.0044 266 -3 c 0,53,54 - 256 75 256 75 228.5 101.5 c 0,55,56 - 201.001 128.001 201.001 128.001 170 137 c 0,57,58 - 165.999 137 165.999 137 132.5 129.5 c 0,59,60 - 99.0005 122 99.0005 122 101 62 c 0,61,-1 - 115.5 33.5 l 0,62,63 - 130.001 5 130.001 5 178 -5 c 0,64,65 - 150.278 -14.0397 150.278 -14.0397 128.549 -13.9998 c 0,66,67 - 114.222 -13.9735 114.222 -13.9735 102.5 -10 c 0,68,69 - 72.9999 4.76837e-06 72.9999 4.76837e-06 61 3 c 0,70,71 - 32 18 32 18 20 48.5 c 0,72,73 - 8 78.9999 8 78.9999 8 97 c 0,74,75 - 15.0001 179.999 15.0001 179.999 77 241 c 0,76,77 - 93.9998 251.999 93.9998 251.999 105 282 c 0,78,79 - 115.999 312 115.999 312 123 336 c 0,80,81 - 128.001 354.007 128.001 354.007 140.5 444.5 c 0,82,83 - 149 506.041 149 506.041 148.946 535.905 c 0,84,85 - 148.92 549.96 148.92 549.96 147 557 c 0,86,87 - 146.947 572.694 l 0,88,89 - 142.652 589.782 142.652 589.782 119 603 c 0,90,91 - 78.9999 606 78.9999 606 86.5 552.5 c 0,92,93 - 93.9998 499.001 93.9998 499.001 108 486 c 0,94,95 - 69 486 69 486 44 527 c 0,96,97 - 20 554 20 554 23 583 c 0,98,99 - 26 612 26 612 35 640 c 0,100,101 - 53 689 53 689 86 731.5 c 0,102,103 - 119 774 119 774 143 820 c 0,104,105 - 145.997 843.974 145.997 843.974 152.5 889 c 0,106,107 - 152.986 918.716 l 0,108,109 - 149.654 945.423 149.654 945.423 132 967 c 0,110,111 - 129 973 129 973 83 1040.5 c 0,112,113 - 38 1106.99 38 1106.99 37 1108 c 0,114,115 - 30.0021 1120 30.0021 1120 17 1176 c 0,116,117 - 9.22428 1209.49 9.22428 1209.49 9.31933 1241.2 c 0,118,119 - 9.38319 1262.5 9.38319 1262.5 13 1283 c 0,120,121 - 13 1311.99 13 1311.99 42.5 1349 c 0,122,123 - 70.2188 1383.77 70.2188 1383.77 104.576 1384.1 c 0,124,125 - 106.774 1384.12 106.774 1384.12 109 1384 c 0,126,127 - 82 1339 82 1339 95.5 1289.5 c 0,128,129 - 109 1240 109 1240 161 1252 c 0,130,131 - 176.009 1255 176.009 1255 193.5 1268 c 0,132,133 - 211.001 1281.01 211.001 1281.01 227 1329 c 0,134,135 - 236 1369.99 236 1369.99 233 1411.5 c 0,136,137 - 230.001 1452.99 230.001 1452.99 224 1495 c 0,138,139 - 215 1547.99 215 1547.99 149 1537 c 0,140,141 - 113 1516.15 113 1516.15 113 1499 c 0,142,143 - 114.998 1483 114.998 1483 130 1444 c 0,144,145 - 68.9998 1495 68.9998 1495 66 1559 c 0,146,147 - 66.2889 1594.43 l 0,148,149 - 72.286 1642.5 72.286 1642.5 110 1678 c 0,150,151 - 159.023 1705.71 159.023 1705.71 195.936 1705.91 c 0,152,153 - 210.973 1705.99 210.973 1705.99 224 1701.5 c 0,154,155 - 269 1686.01 269 1686.01 328 1658 c 0,156,-1 - 414 1621 l 0,157,158 - 452.534 1610.88 452.534 1610.88 492.001 1610.98 c 0,159,160 - 534.461 1611.08 534.461 1611.08 578 1623 c 0,161,162 - 662 1645.99 662 1645.99 743 1662 c 0,163,164 - 815 1672.01 815 1672.01 877.5 1668 c 0,165,166 - 940.046 1663.99 940.046 1663.99 1010 1652 c 0,167,168 - 1102.99 1608.01 1102.99 1608.01 1115 1592.5 c 0,169,-1 - 1148 1551 l 0,170,171 - 1128.02 1558.99 1128.02 1558.99 1114 1568.5 c 0,172,173 - 1099.99 1578.01 1099.99 1578.01 1070 1583 c 0,174,175 - 991 1583 991 1583 986 1543.5 c 0,176,177 - 981 1504 981 1504 972 1504 c 0,178,179 - 987.996 1452.01 987.996 1452.01 1008 1434.5 c 0,180,181 - 1027.99 1417 1027.99 1417 1092 1396 c 0,182,183 - 1224 1402 1224 1402 1237.5 1459.5 c 0,184,185 - 1251.02 1517.06 1251.02 1517.06 1288 1628 c 0,186,-1 - 1272.5 1524 l 0,187,188 - 1257.99 1426.99 1257.99 1426.99 1240 1409 c 0,189,190 - 1215.99 1375.99 1215.99 1375.99 1174.5 1356 c 0,191,192 - 1132.97 1335.99 1132.97 1335.99 1112 1334 c 0,193,194 - 1075.74 1331.76 l 0,195,196 - 1068.75 1331.8 1068.75 1331.8 1060.5 1332 c 0,197,198 - 1017.99 1333.01 1017.99 1333.01 1006 1345 c 0,199,200 - 979 1355.01 979 1355.01 957.5 1369 c 0,201,-1 - 913 1398 l 0,202,203 - 764 1482 764 1482 702.5 1477.5 c 0,204,205 - 640.987 1473 640.987 1473 496 1409 c 0,206,207 - 460 1383.99 460 1383.99 473.5 1352 c 0,208,209 - 487.002 1320 487.002 1320 518 1320 c 0,210,211 - 543.105 1321.01 543.105 1321.01 572.5 1325 c 0,212,213 - 602.002 1329.01 602.002 1329.01 626 1383 c 0,214,215 - 623 1369.01 623 1369.01 623.5 1336.5 c 0,216,217 - 620.162 1310.39 l 0,218,219 - 615.024 1291.76 615.024 1291.76 602 1274 c 0,220,221 - 521.986 1225.99 521.986 1225.99 436.5 1203 c 0,222,223 - 351.002 1180.01 351.002 1180.01 333 1058 c 0,224,225 - 329.412 1045.28 329.412 1045.28 329.388 1030.91 c 0,226,227 - 329.34 1001.22 329.34 1001.22 344.5 964.5 c 0,228,229 - 367 910 367 910 397 886 c 0,230,231 - 406.248 868.824 406.248 868.824 439.281 868.668 c 0,232,233 - 456.251 868.588 456.251 868.588 479.5 873 c 0,234,235 - 548 886 548 886 557 934 c 0,236,237 - 560 994 560 994 526 1001.5 c 0,238,239 - 492 1009 492 1009 457 991 c 0,240,241 - 475.004 1027.01 475.004 1027.01 505 1044 c 0,242,243 - 600 1080 600 1080 630 996 c 0,244,245 - 635 961 635 961 637.5 918 c 0,246,-1 - 642 839 l 1,0,1 -EndSplineSet -KernsSLIF: 116 -286 0 0 84 -169 0 0 45 -208 0 0 46 -234 0 0 44 -273 0 0 65 -491 0 0 97 -470 0 0 -EndChar -StartChar: G -Encoding: 71 71 12 -Width: 1278 -Flags: W -Fore -586 -123 m 0,0,1 - 512 -115.001 512 -115.001 398.5 -55.5 c 0,2,3 - 285.001 3.99925 285.001 3.99925 251 54 c 0,4,5 - 140.158 218.532 140.158 218.532 139.923 377.813 c 0,6,7 - 139.886 402.469 139.886 402.469 142.5 427 c 0,8,9 - 162 610 162 610 93 791 c 0,10,11 - 70.9999 847 70.9999 847 40 906.5 c 0,12,13 - 8.99995 966 8.99995 966 12 1002 c 0,14,15 - 17 1065 17 1065 57 1086 c 0,16,17 - 97.0001 1107 97.0001 1107 130 1095 c 0,18,19 - 112.083 1092.92 l 0,20,21 - 89.0771 1084.96 89.0771 1084.96 75.5 1049 c 0,22,23 - 70.7155 1036.33 70.7155 1036.33 70.5795 1026.33 c 0,24,25 - 73.8997 1010.88 l 0,26,27 - 81.7288 995.636 81.7288 995.636 108 991 c 0,28,29 - 192 975 192 975 163.5 1093.5 c 0,30,31 - 135.001 1212 135.001 1212 134 1245 c 0,32,33 - 127.998 1329.02 127.998 1329.02 125 1379.5 c 0,34,35 - 122 1430.01 122 1430.01 161 1516 c 0,36,37 - 180.003 1560 180.003 1560 240 1560 c 0,38,39 - 300.012 1560 300.012 1560 330 1547 c 0,40,41 - 279 1544 279 1544 259.5 1515.5 c 0,42,43 - 250.674 1502.6 250.674 1502.6 250.759 1491.65 c 0,44,45 - 250.863 1478.4 250.863 1478.4 264 1468 c 0,46,47 - 279.59 1455.3 279.59 1455.3 296.138 1455.14 c 0,48,49 - 306.108 1455.04 306.108 1455.04 316.425 1459.5 c 0,50,51 - 348.303 1473.27 348.303 1473.27 383.5 1530.5 c 0,52,53 - 430.286 1606.57 430.286 1606.57 430.388 1650.76 c 0,54,55 - 430.429 1668.43 430.429 1668.43 423 1681 c 0,56,57 - 405 1709.99 405 1709.99 376 1709.5 c 0,58,59 - 347.026 1709.01 347.026 1709.01 320 1698 c 0,60,61 - 293.003 1686 293.003 1686 277.5 1657 c 0,62,63 - 262 1628.01 262 1628.01 244 1600 c 0,64,65 - 242.736 1626.39 l 0,66,67 - 245.946 1664.86 245.946 1664.86 274.5 1724.5 c 0,68,69 - 314 1807 314 1807 381 1810 c 0,70,71 - 436.151 1813.01 436.151 1813.01 515.5 1820 c 0,72,73 - 595.113 1827.01 595.113 1827.01 640 1833 c 0,74,75 - 754 1848 754 1848 911 1809 c 0,76,77 - 1067.95 1770.01 1067.95 1770.01 1167 1743 c 0,78,79 - 1216.13 1728.55 1216.13 1728.55 1216.08 1665.83 c 0,80,81 - 1216.07 1663.45 1216.07 1663.45 1216 1661 c 0,82,83 - 1214.01 1594.01 1214.01 1594.01 1170 1566 c 0,84,85 - 1173.89 1576.83 1173.89 1576.83 1173.84 1587.2 c 0,86,87 - 1173.72 1614.17 1173.72 1614.17 1147 1638 c 0,88,89 - 1131.29 1652.01 1131.29 1652.01 1115.75 1652.32 c 0,90,91 - 1099.92 1649.06 l 0,92,93 - 1086.9 1643.41 1086.9 1643.41 1074 1628 c 0,94,95 - 1061.39 1613.19 1061.39 1613.19 1061.26 1591.32 c 0,96,97 - 1061.16 1575.07 1061.16 1575.07 1067.94 1554.92 c 0,98,99 - 1068.68 1552.73 1068.68 1552.73 1069.5 1550.5 c 0,100,-1 - 1100 1467 l 0,101,102 - 1130.03 1374.92 1130.03 1374.92 1152 1321 c 0,103,104 - 1160.8 1299.4 1160.8 1299.4 1160.8 1271.08 c 0,105,106 - 1160.8 1229.03 1160.8 1229.03 1141 1171 c 0,107,108 - 1119 1108.01 1119 1108.01 1067.5 1054.5 c 0,109,110 - 1016.01 1001 1016.01 1001 901 976 c 0,111,112 - 945.016 1009.01 945.016 1009.01 1008.5 1039.5 c 0,113,114 - 1068.86 1068.49 1068.86 1068.49 1069.13 1152.16 c 0,115,116 - 1069.15 1156.51 1069.15 1156.51 1069 1161 c 0,117,118 - 1066 1201 1066 1201 1016.5 1247.5 c 0,119,120 - 967 1294 967 1294 918 1273 c 0,121,122 - 867.288 1251.94 867.288 1251.94 866.93 1207.55 c 0,123,124 - 867 1203.5 l 0,125,126 - 868.999 1156 868.999 1156 887 1111 c 0,127,128 - 830 1150 830 1150 838.5 1231 c 0,129,130 - 847 1311.99 847 1311.99 876 1343 c 0,131,132 - 889.997 1358 889.997 1358 904 1387 c 0,133,134 - 914.347 1408.43 914.347 1408.43 914.315 1423.31 c 0,135,136 - 914.304 1428.57 914.304 1428.57 913 1433 c 0,137,138 - 901.003 1475.99 901.003 1475.99 839 1511.5 c 0,139,140 - 809.887 1528.17 809.887 1528.17 782.758 1528.19 c 0,141,142 - 752.113 1528.22 752.113 1528.22 724 1507 c 0,143,144 - 697 1486 697 1486 708 1436.5 c 0,145,146 - 718.999 1387 718.999 1387 720 1355 c 0,147,148 - 721 1269.01 721 1269.01 625 1256 c 0,149,150 - 604.735 1257.19 l 0,151,152 - 590.855 1260.5 590.855 1260.5 576 1270.5 c 0,153,154 - 549.997 1288.01 549.997 1288.01 542 1325 c 0,155,156 - 563.197 1315.63 563.197 1315.63 580.749 1315.5 c 0,157,158 - 593.765 1315.4 593.765 1315.4 604.776 1320.38 c 0,159,160 - 609.038 1322.31 609.038 1322.31 613 1325 c 0,161,162 - 641 1344.01 641 1344.01 623 1391 c 0,163,164 - 614 1412 614 1412 563.5 1424 c 0,165,166 - 540.067 1429.57 540.067 1429.57 521.906 1429.54 c 0,167,168 - 500.936 1429.5 500.936 1429.5 487 1422 c 0,169,170 - 421 1386 421 1386 401 1249 c 0,171,172 - 394.695 1205.81 394.695 1205.81 394.751 1169.67 c 0,173,174 - 394.872 1091.19 394.872 1091.19 425 1046 c 0,175,176 - 484.994 954.01 484.994 954.01 527 883 c 0,177,178 - 548.851 846.061 548.851 846.061 548.778 807.498 c 0,179,180 - 548.71 771.939 548.71 771.939 530 735 c 0,181,182 - 518 711 518 711 463 699 c 0,183,184 - 408 687 408 687 387 707 c 0,185,186 - 440 716 440 716 450 752 c 0,187,188 - 465 819 465 819 386 842 c 0,189,190 - 358.249 844.514 l 0,191,192 - 341.329 844.06 341.329 844.06 319 840 c 0,193,194 - 275 832 275 832 254 795 c 0,195,196 - 241.999 773.999 241.999 773.999 241.5 703 c 0,197,198 - 245.037 633.868 l 0,199,200 - 249.259 594.007 249.259 594.007 258.5 551.5 c 0,201,202 - 276 471 276 471 315 401 c 0,203,204 - 354 331 354 331 422 313 c 0,205,206 - 493 294 493 294 551.5 330 c 0,207,208 - 610 366 610 366 663 385 c 0,209,210 - 725.305 407.252 725.305 407.252 765.019 407.222 c 0,211,212 - 796.695 407.198 796.695 407.198 814 393 c 0,213,214 - 835.408 374.111 835.408 374.111 835.407 352.249 c 0,215,216 - 835.407 339.389 835.407 339.389 828 325.5 c 0,217,218 - 808 288 808 288 772 291 c 0,219,220 - 791.412 305.236 791.412 305.236 791.564 318.842 c 0,221,222 - 791.647 326.265 791.647 326.265 786 333.5 c 0,223,224 - 772.461 350.846 772.461 350.846 760 351 c 0,225,226 - 709 337 709 337 715.5 305.5 c 0,227,228 - 722 274 722 274 746 262 c 0,229,230 - 761.411 253.594 761.411 253.594 778.11 253.469 c 0,231,232 - 791.358 253.369 791.358 253.369 805.415 258.481 c 0,233,234 - 824.232 265.322 824.232 265.322 844.5 281.5 c 0,235,236 - 899 325 899 325 918 361 c 0,237,238 - 930 383 930 383 921 437 c 0,239,240 - 912 491 912 491 885 502 c 0,241,242 - 809.779 529.799 809.779 529.799 747.592 529.855 c 0,243,244 - 733.722 529.868 733.722 529.868 720.5 528.5 c 0,245,246 - 648 521 648 521 548 528 c 0,247,248 - 409 537 409 537 353 577 c 0,249,250 - 297 617 297 617 297 668 c 0,251,252 - 297 691 297 691 315.5 722 c 0,253,254 - 334 753 334 753 392 761 c 0,255,256 - 341 742 341 742 334 692.5 c 0,257,258 - 334.029 667.297 l 0,259,260 - 339.17 637.192 339.17 637.192 371 622 c 0,261,262 - 467 573 467 573 574 628 c 0,263,264 - 681 683 681 683 717 734 c 0,265,266 - 757 791 757 791 829 799.5 c 0,267,268 - 880.389 802.174 l 0,269,270 - 911.309 800.99 911.309 800.99 926 791 c 0,271,272 - 944 778 944 778 955 748 c 0,273,274 - 966 718 966 718 942 693 c 0,275,276 - 943 744 943 744 896.5 738.5 c 0,277,278 - 850 733 850 733 849 715 c 0,279,280 - 846 677 846 677 881 642.5 c 0,281,282 - 916 608 916 608 985 612 c 0,283,284 - 1048 615 1048 615 1120 580 c 0,285,286 - 1192 545 1192 545 1198 506 c 0,287,288 - 1198.65 470.761 l 0,289,290 - 1196.72 451.59 1196.72 451.59 1189.5 435 c 0,291,292 - 1176 404.001 1176 404.001 1138 403 c 0,293,294 - 1151.85 417.478 1151.85 417.478 1152.03 429.782 c 0,295,296 - 1152.12 436.49 1152.12 436.49 1147.5 443.5 c 0,297,298 - 1139.48 454.732 1139.48 454.732 1127.95 455.048 c 0,299,300 - 1114 452 l 0,301,302 - 1085.01 439 1085.01 439 1096 405.5 c 0,303,304 - 1107.01 371.953 1107.01 371.953 1113 345 c 0,305,306 - 1134 242.792 1134 242.792 1133.93 166.08 c 0,307,308 - 1133.9 133.199 1133.9 133.199 1130 105 c 0,309,310 - 1116.99 10.9955 1116.99 10.9955 1090 -10 c 0,311,312 - 1051 -40.0026 1051 -40.0026 994.5 -57 c 0,313,314 - 938 -73.9999 938 -73.9999 869 -34 c 0,315,316 - 845.649 -21.9218 845.649 -21.9218 845.639 20.6278 c 0,317,318 - 845.636 30.9221 845.636 30.9221 847 43 c 0,319,320 - 852 15 852 15 888 9 c 0,321,322 - 924 3 924 3 940 59 c 0,323,324 - 949 90.9999 949 90.9999 903.5 101 c 0,325,326 - 858 111.001 858 111.001 798.5 108.5 c 0,327,328 - 739 105.999 739 105.999 685 95.5 c 0,329,330 - 631 85 631 85 624 78 c 0,331,332 - 597 47 597 47 595.5 32 c 0,333,334 - 594 17 594 17 608 -31 c 0,335,336 - 623 -82 623 -82 686 -82 c 0,337,338 - 749 -82 749 -82 791 -47 c 0,339,340 - 761 -124 761 -124 677.5 -123.5 c 0,341,342 - 594 -123.001 594 -123.001 586 -123 c 0,0,1 -EndSplineSet -EndChar -StartChar: H -Encoding: 72 72 10 -Width: 1352 -Flags: HMW -HStem: 699 320<465.5 883.5> -VStem: 115.5 242.5<36.5 1488> 928 212<-51 1523> -Fore -105.5 816.5 m 132,-1,0 - 36 880 36 880 19 967 c 0,1,2 - 14.9504 986.091 14.9504 986.091 15.0006 1004.26 c 0,3,4 - 15.124 1048.91 15.124 1048.91 40 1088 c 0,5,6 - 73.0086 1139.88 73.0086 1139.88 122.035 1140.15 c 0,7,8 - 124.99 1140.17 124.99 1140.17 128 1140 c 0,9,10 - 170 1137 170 1137 170 1095 c 0,11,12 - 156.052 1106.77 156.052 1106.77 143.148 1106.76 c 0,13,14 - 126.45 1106.74 126.45 1106.74 111.5 1087 c 0,15,16 - 97.7055 1068.78 97.7055 1068.78 97.5949 1049.75 c 0,17,18 - 97.496 1032.71 97.496 1032.71 109 1014 c 0,19,20 - 115.998 1001 115.998 1001 160.5 996.5 c 0,21,22 - 178.23 997.922 l 0,23,24 - 206.536 1006.49 206.536 1006.49 212 1058 c 0,25,26 - 222.998 1168.99 222.998 1168.99 239 1270.5 c 0,27,28 - 244.978 1308.42 244.978 1308.42 244.954 1336.5 c 0,29,30 - 244.913 1383.58 244.913 1383.58 228 1403 c 0,31,32 - 220.944 1410.45 220.944 1410.45 209.816 1410.6 c 0,33,34 - 189.949 1406.38 l 0,35,36 - 178.932 1402.1 178.932 1402.1 165.5 1393.5 c 0,37,38 - 142.118 1378.53 142.118 1378.53 141.789 1354.85 c 0,39,40 - 145.468 1333.76 l 0,41,42 - 149.976 1320.42 149.976 1320.42 160 1305 c 0,43,44 - 110.509 1338.17 110.509 1338.17 110.36 1375.64 c 0,45,46 - 110.26 1400.77 110.26 1400.77 132.369 1427.84 c 0,47,48 - 139.897 1437.06 139.897 1437.06 150 1446.5 c 0,49,50 - 233.996 1524.99 233.996 1524.99 267 1597 c 0,51,52 - 299.996 1670 299.996 1670 353.5 1734.5 c 0,53,54 - 407 1799 407 1799 500 1793 c 0,55,56 - 537.011 1779.99 537.011 1779.99 559.5 1762 c 0,57,58 - 582 1744 582 1744 597 1693 c 0,59,60 - 593.998 1713.01 593.998 1713.01 517.5 1749.5 c 0,61,62 - 500.595 1757.56 500.595 1757.56 484.643 1757.69 c 0,63,64 - 472.549 1757.79 472.549 1757.79 461.003 1753.33 c 0,65,66 - 418.855 1737.05 418.855 1737.05 384 1660 c 0,67,68 - 356.523 1601.82 356.523 1601.82 356.476 1525.34 c 0,69,70 - 356.465 1507.19 356.465 1507.19 358 1488 c 0,71,72 - 364 1398 364 1398 429 1310.5 c 0,73,74 - 477.324 1245.45 477.324 1245.45 477.562 1182.33 c 0,75,76 - 477.644 1160.55 477.644 1160.55 472 1139 c 0,77,78 - 464.998 1111.99 464.998 1111.99 417.5 1102.5 c 0,79,80 - 377.156 1097.63 l 0,81,82 - 363.646 1097.77 363.646 1097.77 358 1102 c 0,83,84 - 394 1106.99 394 1106.99 407 1129 c 0,85,86 - 420 1151 420 1151 420 1152 c 0,87,88 - 416.971 1176.71 l 0,89,90 - 409.979 1201.86 409.979 1201.86 387 1224.5 c 0,91,92 - 371.888 1239.39 371.888 1239.39 359.543 1239.36 c 0,93,94 - 344.11 1239.33 344.11 1239.33 333 1216 c 0,95,96 - 320 1189 320 1189 317 1122 c 0,97,98 - 314 1056 314 1056 314 1055 c 0,99,100 - 322.999 994.003 322.999 994.003 347.5 955.5 c 0,101,102 - 371.999 917.001 371.999 917.001 375 916 c 0,103,104 - 399 895 399 895 428 897.5 c 0,105,106 - 457 900 457 900 472 906 c 0,107,108 - 580 955.999 580 955.999 618 1003 c 0,109,110 - 649.772 1042.29 649.772 1042.29 713.695 1042.45 c 0,111,112 - 726.23 1042.48 726.23 1042.48 740 1041 c 0,113,114 - 769.004 1029 769.004 1029 783.5 1008.5 c 0,115,116 - 798 988 798 988 786 934 c 0,117,118 - 772 898 772 898 735 893 c 0,119,120 - 753 911 753 911 744.5 933.5 c 0,121,122 - 736 956 736 956 712 938 c 0,123,124 - 682.31 915.493 682.31 915.493 681.858 898.26 c 0,125,126 - 685.012 887.021 l 0,127,128 - 692.164 875.551 692.164 875.551 715.5 867 c 0,129,130 - 781 843 781 843 823 846 c 0,131,132 - 838 846 838 846 893 863 c 0,133,134 - 948 880 948 880 923 962 c 0,135,136 - 912.999 995.001 912.999 995.001 883.5 1019 c 0,137,138 - 854 1043 854 1043 851 1083 c 0,139,140 - 851.18 1119.3 l 0,141,142 - 855.8 1158.5 855.8 1158.5 881 1183 c 0,143,144 - 899.015 1200.01 899.015 1200.01 940.5 1211 c 0,145,146 - 964.418 1213.55 l 0,147,148 - 991.024 1211.78 991.024 1211.78 1012 1188 c 0,149,150 - 982.048 1185.47 l 0,151,152 - 938.654 1175.69 938.654 1175.69 931 1129 c 0,153,154 - 921 1067.99 921 1067.99 999 1051 c 0,155,156 - 1015.67 1050.34 l 0,157,158 - 1049.51 1057.23 1049.51 1057.23 1060.5 1137 c 0,159,160 - 1071.56 1217.31 1071.56 1217.31 1071.55 1255.32 c 0,161,162 - 1071.54 1263.69 1071.54 1263.69 1071 1270 c 0,163,164 - 1065 1317.02 1065 1317.02 1002.5 1406 c 0,165,166 - 940 1494.99 940 1494.99 928 1523 c 0,167,168 - 913.999 1551.01 913.999 1551.01 901.5 1616 c 0,169,170 - 899.156 1647.62 l 0,171,172 - 901.5 1693.75 901.5 1693.75 939 1732 c 0,173,174 - 965.005 1758 965.005 1758 1000.5 1759.5 c 0,175,176 - 1054.31 1757.68 l 0,177,178 - 1064.53 1756.61 1064.53 1756.61 1075 1755 c 0,179,180 - 1138 1744.99 1138 1744.99 1193 1697 c 0,181,182 - 1183.01 1697 1183.01 1697 1154 1711 c 0,183,184 - 1124.99 1725 1124.99 1725 1102 1725 c 0,185,186 - 1042.01 1725 1042.01 1725 1002 1697.5 c 0,187,188 - 972.596 1677.29 972.596 1677.29 972.372 1645.99 c 0,189,190 - 972.292 1634.72 972.292 1634.72 976 1622 c 0,191,192 - 1011 1494.87 1011 1494.87 1077.42 1494.19 c 0,193,194 - 1083.09 1494.13 1083.09 1494.13 1089 1495 c 0,195,196 - 1164 1505.99 1164 1505.99 1170 1527 c 0,197,198 - 1175.83 1549.08 1175.83 1549.08 1175.85 1567.34 c 0,199,200 - 1175.87 1592.92 1175.87 1592.92 1164.5 1611 c 0,201,202 - 1145.03 1641.96 1145.03 1641.96 1119 1672 c 0,203,204 - 1155 1672 1155 1672 1198.5 1617.5 c 0,205,206 - 1242 1563.01 1242 1563.01 1242 1530 c 0,207,208 - 1242 1458.02 1242 1458.02 1226.5 1372 c 0,209,210 - 1221.92 1346.59 1221.92 1346.59 1222.01 1316.99 c 0,211,212 - 1222.23 1246.41 1222.23 1246.41 1249 1152 c 0,213,214 - 1263.99 1099.03 1263.99 1099.03 1276 1049.5 c 0,215,216 - 1288 1000 1288 1000 1288 951 c 0,217,218 - 1288 925.992 1288 925.992 1263 891 c 0,219,220 - 1237.99 856 1237.99 856 1181 853 c 0,221,222 - 1181 854 1181 854 1215.5 880.5 c 0,223,224 - 1250 907 1250 907 1235 955 c 0,225,226 - 1223 970 1223 970 1200.5 959.5 c 0,227,228 - 1178.01 949.003 1178.01 949.003 1165 925 c 0,229,230 - 1153 903 1153 903 1142.5 844.5 c 0,231,232 - 1134.87 801.972 1134.87 801.972 1134.9 772.936 c 0,233,234 - 1134.91 762.016 1134.91 762.016 1136 753 c 0,235,236 - 1142 687.014 1142 687.014 1166.5 635 c 0,237,238 - 1191 582.981 1191 582.981 1200 539 c 0,239,240 - 1216.99 446 1216.99 446 1204.5 409 c 0,241,242 - 1192.01 372.012 1192.01 372.012 1177 353 c 0,243,244 - 1165 346.001 1165 346.001 1137.5 341 c 0,245,246 - 1115.12 340.89 l 0,247,248 - 1098.65 343.703 1098.65 343.703 1082 355 c 0,249,250 - 1129 359.001 1129 359.001 1142 378 c 0,251,-1 - 1149.5 410.5 l 0,252,253 - 1149.4 425.528 l 0,254,255 - 1143.56 444.551 1143.56 444.551 1105 449 c 0,256,257 - 1090.45 446.644 l 0,258,259 - 1076.15 440.772 1076.15 440.772 1061 421 c 0,260,261 - 1042.72 397.15 1042.72 397.15 1042.76 337.294 c 0,262,263 - 1042.77 321.845 1042.77 321.845 1044 304 c 0,264,265 - 1051.99 195 1051.99 195 1084.5 123 c 0,266,267 - 1117.01 51 1117.01 51 1140 -51 c 0,268,269 - 1152.45 -109.993 1152.45 -109.993 1152.38 -156.242 c 0,270,271 - 1152.21 -266.008 1152.21 -266.008 1081.5 -304 c 0,272,273 - 982.005 -358 982.005 -358 981 -358 c 0,274,275 - 948 -362 948 -362 901.5 -360.5 c 0,276,277 - 855 -359 855 -359 819 -330 c 0,278,279 - 852 -343 852 -343 896.5 -345 c 0,280,281 - 935.359 -343.042 l 0,282,283 - 957.07 -339.654 957.07 -339.654 976 -331 c 0,284,285 - 1035 -300.996 1035 -300.996 1071 -255.5 c 0,286,287 - 1086.62 -235.762 1086.62 -235.762 1086.8 -212.544 c 0,288,289 - 1086.9 -200.455 1086.9 -200.455 1082.82 -187.422 c 0,290,291 - 1076.66 -167.782 1076.66 -167.782 1061 -146 c 0,292,293 - 992 -51.0001 992 -51.0001 903 -31 c 0,294,295 - 814 -11 814 -11 793 6 c 0,296,297 - 732.585 56.9527 732.585 56.9527 732.57 111.614 c 0,298,299 - 732.564 132.048 732.564 132.048 741 153 c 0,300,301 - 770.744 226.878 770.744 226.878 814 227 c 0,302,303 - 846 224 846 224 876 185 c 0,304,305 - 857.344 193.955 857.344 193.955 843.281 194.139 c 0,306,307 - 828.019 191.183 l 0,308,309 - 815.839 185.689 815.839 185.689 809 170 c 0,310,311 - 785 113 785 113 838 98.5 c 0,312,313 - 891 83.9999 891 83.9999 891 106 c 0,314,315 - 903.199 124.977 903.199 124.977 903.227 166.688 c 0,316,317 - 903.239 186.524 903.239 186.524 900.5 211.5 c 0,318,319 - 891.999 289.006 891.999 289.006 886 323 c 0,320,321 - 831 412 831 412 787.5 416.5 c 0,322,323 - 744 421 744 421 716 452 c 0,324,325 - 672 498.001 672 498.001 669 527.5 c 0,326,327 - 666 557 666 557 678 593 c 0,328,329 - 700 659 700 659 766 632 c 0,330,331 - 746 620 746 620 739 595.5 c 0,332,333 - 732 571 732 571 765 574 c 0,334,335 - 798 577 798 577 825 590.5 c 0,336,337 - 852 604 852 604 844 646 c 0,338,339 - 825 745 825 745 684 751.5 c 0,340,341 - 543 758 543 758 498 734 c 0,342,343 - 481.002 713.002 481.002 713.002 465.5 699 c 0,344,345 - 459.145 693.26 459.145 693.26 459.094 675.417 c 0,346,347 - 459.02 649.739 459.02 649.739 472 599 c 0,348,349 - 478 574 478 574 486.5 528.5 c 0,350,351 - 487.651 503.031 l 0,352,353 - 484.37 476.319 484.37 476.319 460 461 c 0,354,355 - 434.294 445.021 434.294 445.021 398.454 444.97 c 0,356,357 - 382.705 444.947 382.705 444.947 365 448 c 0,358,359 - 401 454 401 454 423 491 c 0,360,361 - 445 528 445 528 391 537 c 0,362,363 - 375.319 535.564 l 0,364,365 - 361.023 530.93 361.023 530.93 348 514 c 0,366,367 - 328 488 328 488 328 458 c 0,368,369 - 330.048 395.957 l 0,370,371 - 337.072 324.887 337.072 324.887 366 269.5 c 0,372,373 - 407 191.001 407 191.001 398 127 c 0,374,375 - 391 82 391 82 375.5 71 c 0,376,377 - 360.001 60.0004 360.001 60.0004 328 53 c 0,378,379 - 336 77 336 77 343.5 92.5 c 0,380,381 - 351 107.999 351 107.999 330 127 c 0,382,383 - 321.857 133.786 321.857 133.786 311.873 133.895 c 0,384,385 - 307.143 133.946 307.143 133.946 302 132.5 c 0,386,387 - 286 128 286 128 277 125 c 0,388,389 - 231.23 107.948 231.23 107.948 230.966 58.6818 c 0,390,391 - 230.936 53.0513 230.936 53.0513 231.5 47 c 0,392,393 - 236.927 -11.2137 236.927 -11.2137 258 -28 c 0,394,395 - 281 -45 281 -45 318.5 -59.5 c 0,396,397 - 356 -74.0001 356 -74.0001 443 -45 c 0,398,-1 - 492.5 -13.5 l 0,399,400 - 542 18 542 18 587 123 c 0,401,402 - 552.999 9.99854 552.999 9.99854 486 -60 c 0,403,404 - 463 -82.9999 463 -82.9999 363 -111.5 c 0,405,406 - 333.213 -119.989 333.213 -119.989 304.491 -119.916 c 0,407,408 - 236.788 -119.745 236.788 -119.745 175 -72 c 0,409,410 - 117 -27.0004 117 -27.0004 115.5 36.5 c 0,411,412 - 114 99.9999 114 99.9999 117 118 c 0,413,414 - 121.001 160.001 121.001 160.001 167.5 263 c 0,415,416 - 214 366.001 214 366.001 214 376 c 0,417,418 - 214 397.991 214 397.991 220.5 508.5 c 0,419,420 - 221.507 585.118 l 0,421,422 - 219.117 635.948 219.117 635.948 207 662 c 0,423,424 - 175.001 752.999 175.001 752.999 105.5 816.5 c 132,-1,0 -EndSplineSet -KernsSLIF: 65 -91 0 0 -EndChar -StartChar: I -Encoding: 73 73 51 -Width: 582 -Flags: HMW -VStem: 256 244.5<240.5 1423> -Fore -232 519 m 0,0,1 - 224.001 624.998 224.001 624.998 126 719 c 0,2,3 - 45.602 796.117 45.602 796.117 45.2953 885.347 c 0,4,5 - 45.2282 904.883 45.2282 904.883 49 925 c 0,6,7 - 63.999 1002.99 63.999 1002.99 117.5 1022 c 0,8,9 - 128.072 1025.76 128.072 1025.76 137.726 1025.68 c 0,10,11 - 176.928 1025.39 176.928 1025.39 201 962 c 0,12,-1 - 190 978 l 0,13,14 - 171.382 993.709 171.382 993.709 155.81 994.016 c 0,15,16 - 141.649 990.804 l 0,17,18 - 138.235 989.102 138.235 989.102 135 986.5 c 0,19,20 - 112.001 968 112.001 968 108 936.5 c 0,21,22 - 108.64 911.78 l 0,23,24 - 112 893.601 112 893.601 124 876.5 c 0,25,26 - 143.999 848 143.999 848 199 857 c 0,27,28 - 226 861 226 861 232 911 c 0,29,30 - 235.1 972.442 l 0,31,32 - 234.847 996.834 234.847 996.834 232.5 1023.5 c 0,33,34 - 227 1086 227 1086 213.5 1143 c 0,35,36 - 200 1200 200 1200 189 1218 c 0,37,38 - 124.986 1314.02 124.986 1314.02 83.5 1358 c 0,39,40 - 49.5783 1393.96 49.5783 1393.96 49.397 1447.97 c 0,41,42 - 49.3565 1460.04 49.3565 1460.04 51 1473 c 0,43,44 - 69.0007 1610 69.0007 1610 219 1646 c 0,45,46 - 145.001 1608.01 145.001 1608.01 126 1542.5 c 0,47,48 - 114.33 1502.27 114.33 1502.27 114.355 1474.3 c 0,49,50 - 114.371 1456.73 114.371 1456.73 119 1444 c 0,51,52 - 138.175 1413.96 138.175 1413.96 172.467 1413.74 c 0,53,54 - 187.822 1413.65 187.822 1413.65 206.21 1419.53 c 0,55,56 - 211.002 1421.06 211.002 1421.06 216 1423 c 0,57,58 - 282.992 1448.99 282.992 1448.99 296 1464 c 0,59,60 - 403 1587 403 1587 365 1725 c 0,61,62 - 327 1863 327 1863 152 1908 c 0,63,64 - 259 1908 259 1908 351 1815 c 0,65,66 - 443.001 1722 443.001 1722 455 1619 c 0,67,68 - 461 1534.99 461 1534.99 483.5 1458 c 0,69,70 - 505.993 1381.03 505.993 1381.03 524 1292 c 0,71,72 - 532 1247 532 1247 544 1211 c 0,73,74 - 554.285 1180.14 554.285 1180.14 554.286 1161.04 c 0,75,76 - 554.286 1157.86 554.286 1157.86 554 1155 c 0,77,78 - 546.001 1064 546.001 1064 450 1064 c 0,79,80 - 492.002 1097 492.002 1097 501.5 1152 c 0,81,82 - 501.656 1171.25 l 0,83,84 - 495.027 1204.71 495.027 1204.71 434.075 1205.07 c 0,85,86 - 430.622 1205.09 430.622 1205.09 427 1205 c 0,87,88 - 392 1206.99 392 1206.99 380.5 1160 c 0,89,90 - 369 1113.01 369 1113.01 369 1052.5 c 0,91,92 - 369 992.005 369 992.005 375.5 935.5 c 0,93,94 - 381.993 879.057 381.993 879.057 384 864 c 0,95,96 - 390 795 390 795 443 801 c 0,97,98 - 478.903 805.065 478.903 805.065 479.013 846.3 c 0,99,100 - 479.065 865.936 479.065 865.936 471 894 c 0,101,102 - 463 918 463 918 426 958 c 0,103,104 - 441 949 441 949 456 938.5 c 0,105,106 - 471 928 471 928 496 897 c 0,107,108 - 528.83 854.008 528.83 854.008 528.971 808.268 c 0,109,110 - 529.011 795.491 529.011 795.491 526.5 782.5 c 0,111,112 - 515 723 515 723 485 660 c 0,113,-1 - 425 532.5 l 0,114,115 - 395 468 395 468 400 404 c 0,116,117 - 407.001 308.999 407.001 308.999 460.5 240.5 c 0,118,119 - 514 172 514 172 517 82 c 0,120,121 - 519 10 519 10 455.5 -13 c 0,122,123 - 392 -36 392 -36 331 -34 c 0,124,125 - 409 -20 409 -20 407 52.5 c 0,126,127 - 405 124.999 405 124.999 321 131 c 0,128,129 - 291.816 129.369 l 0,130,131 - 231.611 117.594 231.611 117.594 231.312 32.2265 c 0,132,133 - 231.26 17.4636 231.26 17.4636 233 0.5 c 0,134,135 - 246.999 -135.998 246.999 -135.998 280 -188 c 0,136,137 - 328 -263 328 -263 391 -299.5 c 0,138,139 - 454 -336 454 -336 487 -366 c 0,140,141 - 427.995 -346.998 427.995 -346.998 394 -329.5 c 0,142,143 - 360.005 -312.002 360.005 -312.002 314 -283 c 0,144,145 - 314 -282 314 -282 276.5 -245 c 0,146,147 - 238.998 -207.997 238.998 -207.997 219 -168 c 0,148,149 - 174.999 -79.9963 174.999 -79.9963 161 11 c 0,150,151 - 157.704 57.9995 l 0,152,153 - 158.567 121.5 158.567 121.5 188.158 185 c 0,154,155 - 190.022 189 190.022 189 192 193 c 0,156,157 - 228 266.001 228 266.001 232.5 352.5 c 0,158,159 - 234.331 462.476 l 0,160,161 - 233.742 491.132 233.742 491.132 232 519 c 0,0,1 -EndSplineSet -EndChar -StartChar: J -Encoding: 74 74 63 -Width: 1235 -Flags: MW -HStem: -181.5 278.5<390.5 1080> 1374 216<210.5 730> -VStem: 262 128.5<-181.5 574> 753 279.5<121 1629> -Fore -266 -186 m 0,0,1 - 224.001 -180 224.001 -180 177.5 -136 c 0,2,3 - 131 -92.0005 131 -92.0005 119 -17 c 0,4,5 - 153.477 -76.1043 153.477 -76.1043 181 -84 c 0,6,7 - 209.646 -85.7528 l 0,8,9 - 237.766 -83.402 237.766 -83.402 252.5 -62.5 c 0,10,11 - 274 -32 274 -32 274 11 c 0,12,13 - 274 74.0005 274 74.0005 219 127 c 0,14,15 - 194.8 150.32 194.8 150.32 182.216 150.408 c 0,16,17 - 168.769 150.502 168.769 150.502 168.586 124.068 c 0,18,19 - 168.551 119.018 168.551 119.018 169 113 c 0,20,21 - 171.948 59.931 171.948 59.931 224 55 c 0,22,23 - 206.644 34.5454 206.644 34.5454 187.56 34.4533 c 0,24,25 - 176.342 34.3991 176.342 34.3991 163.5 42 c 0,26,27 - 131.001 61.999 131.001 61.999 121 82 c 0,28,29 - 86.9999 146.001 86.9999 146.001 115 239 c 0,30,31 - 140.998 329.994 140.998 329.994 180.5 414 c 0,32,33 - 219.995 497.991 219.995 497.991 262 574 c 0,34,35 - 319 680 319 680 419 771.5 c 0,36,37 - 519 863 519 863 639 891 c 0,38,39 - 497 834 497 834 403.5 649 c 0,40,41 - 310 464 310 464 340 317 c 0,42,43 - 350 268 350 268 386.5 238 c 0,44,45 - 402.291 225.021 402.291 225.021 417.613 224.77 c 0,46,47 - 434.195 228.284 l 0,48,49 - 445.735 233.41 445.735 233.41 457 246 c 0,50,51 - 481 273 481 273 479.5 310.5 c 0,52,53 - 478 348 478 348 469 369 c 0,54,55 - 455 396 455 396 417 413 c 0,56,57 - 468 425 468 425 503.5 388.5 c 0,58,59 - 538.999 352.002 538.999 352.002 546 319 c 0,60,61 - 550 297 550 297 546 262 c 0,62,63 - 542 227.005 542 227.005 542 215 c 0,64,65 - 541.282 157.714 l 0,66,67 - 543.818 120.228 543.818 120.228 556 105 c 0,68,69 - 576 79.9999 576 79.9999 613 70 c 0,70,71 - 646 60 646 60 689 75.5 c 0,72,73 - 732 90.9999 732 90.9999 753 121 c 0,74,75 - 789 170.999 789 170.999 805.5 237.5 c 0,76,77 - 822 304 822 304 831 368 c 0,78,79 - 833.059 429.818 l 0,80,81 - 833.031 430.907 833.031 430.907 833 432 c 0,82,83 - 832 467 832 467 796 467 c 0,84,85 - 762 467 762 467 761 439.5 c 0,86,87 - 760 412 760 412 769 394 c 0,88,89 - 748 394 748 394 725.5 408.5 c 0,90,91 - 703 423 703 423 702 480 c 0,92,93 - 701 516 701 516 723.5 545 c 0,94,95 - 746 574 746 574 761 607 c 0,96,97 - 801 694 801 694 807.5 724 c 0,98,99 - 811.571 742.789 811.571 742.789 811.523 776.872 c 0,100,101 - 811.495 797.214 811.495 797.214 810 823 c 0,102,103 - 804 898 804 898 711 1003 c 0,104,105 - 664.04 1056.02 664.04 1056.02 663.74 1107 c 0,106,107 - 663.641 1123.83 663.641 1123.83 668.627 1140.44 c 0,108,109 - 678.449 1173.15 678.449 1173.15 708 1205 c 0,110,111 - 723 1221.99 723 1221.99 764.5 1218.5 c 0,112,113 - 806 1215.01 806 1215.01 815 1166 c 0,114,115 - 800.85 1174.76 800.85 1174.76 784.879 1174.89 c 0,116,117 - 777.153 1174.96 777.153 1174.96 769 1173 c 0,118,119 - 744 1167 744 1167 744 1149 c 0,120,121 - 744 1087.99 744 1087.99 782.5 1101 c 0,122,123 - 821.009 1114.01 821.009 1114.01 844 1135 c 0,124,125 - 871 1160.99 871 1160.99 876 1273 c 0,126,127 - 875.964 1349.1 l 0,128,129 - 872.849 1400.52 872.849 1400.52 860 1425 c 0,130,131 - 849.326 1445.59 849.326 1445.59 825.576 1445.54 c 0,132,133 - 818.173 1445.52 818.173 1445.52 809.5 1443.5 c 0,134,135 - 773 1434.99 773 1434.99 772 1417 c 0,136,137 - 768 1373.01 768 1373.01 798 1373.5 c 0,138,139 - 828 1373.99 828 1373.99 840 1384 c 0,140,141 - 838.397 1364.37 l 0,142,143 - 833.435 1347.78 833.435 1347.78 815.5 1338 c 0,144,145 - 793.685 1326.1 793.685 1326.1 779.113 1326.16 c 0,146,147 - 775.31 1326.17 775.31 1326.17 772 1327 c 0,148,149 - 715 1339 715 1339 678.5 1375 c 0,150,151 - 642.016 1410.98 642.016 1410.98 603 1436 c 0,152,153 - 556.039 1464.7 556.039 1464.7 506.748 1464.68 c 0,154,155 - 480.455 1464.68 480.455 1464.68 453.5 1456.5 c 0,156,157 - 375.96 1432.98 375.96 1432.98 334 1415 c 0,158,159 - 280.973 1391.99 280.973 1391.99 210.5 1374 c 0,160,161 - 146.8 1357.74 146.8 1357.74 121.868 1357.8 c 0,162,163 - 119.215 1357.81 119.215 1357.81 117 1358 c 0,164,165 - 18.9988 1365.01 18.9988 1365.01 8 1466.5 c 0,166,167 - -3 1568.01 -3 1568.01 89 1594 c 0,168,169 - 66.0001 1576 66.0001 1576 44 1532.5 c 0,170,171 - 22 1489 22 1489 63 1447 c 0,172,173 - 85.4007 1423 85.4007 1423 118.04 1422.75 c 0,174,175 - 147.044 1426.67 l 0,176,177 - 163.949 1431.1 163.949 1431.1 183 1440.5 c 0,178,179 - 261 1479.01 261 1479.01 285 1517 c 0,180,181 - 327.531 1585.52 327.531 1585.52 327.879 1616.21 c 0,182,183 - 327.973 1624.48 327.973 1624.48 325 1630 c 0,184,185 - 311 1655.99 311 1655.99 281 1648 c 0,186,187 - 273.001 1646.01 273.001 1646.01 270 1629.5 c 0,188,189 - 270.92 1617.45 l 0,190,191 - 274.131 1609.04 274.131 1609.04 285 1603 c 0,192,193 - 268.51 1595.15 268.51 1595.15 254.565 1595 c 0,194,195 - 245.213 1594.91 245.213 1594.91 237.005 1598.27 c 0,196,197 - 226.275 1602.68 226.275 1602.68 217.5 1613 c 0,198,199 - 199.327 1634.38 199.327 1634.38 199.184 1669.47 c 0,200,201 - 199.126 1683.62 199.126 1683.62 202 1700 c 0,202,203 - 208 1739 208 1739 249.5 1751 c 0,204,205 - 291 1763 291 1763 311 1757 c 0,206,207 - 421.988 1725.01 421.988 1725.01 511.5 1660.5 c 0,208,209 - 601 1596 601 1596 730 1590 c 0,210,211 - 805.281 1589.97 l 0,212,213 - 827.921 1590.97 827.921 1590.97 854 1593 c 0,214,215 - 931 1599 931 1599 931 1659 c 0,216,217 - 931 1679.99 931 1679.99 896.5 1697.5 c 0,218,219 - 870.907 1710.49 870.907 1710.49 857.692 1710.53 c 0,220,221 - 853.097 1710.55 853.097 1710.55 850 1709 c 0,222,223 - 822.999 1692.99 822.999 1692.99 822.5 1675.5 c 0,224,225 - 822 1657.99 822 1657.99 824 1632 c 0,226,227 - 797.428 1640.59 797.428 1640.59 797.12 1672.1 c 0,228,229 - 797.034 1680.9 797.034 1680.9 799 1691.5 c 0,230,231 - 808.001 1740 808.001 1740 838 1755 c 0,232,233 - 861.517 1766.1 861.517 1766.1 891.215 1766.11 c 0,234,235 - 906.986 1766.12 906.986 1766.12 924.5 1763 c 0,236,237 - 974.999 1754 974.999 1754 991 1730 c 0,238,239 - 1028 1673.01 1028 1673.01 1032.5 1629 c 0,240,241 - 1036.27 1592.18 1036.27 1592.18 1036.18 1540.01 c 0,242,243 - 1036 1519 l 0,244,-1 - 1022.5 1335.5 l 0,245,246 - 1020.56 1260.23 l 0,247,248 - 1022.51 1199.19 1022.51 1199.19 1038 1165 c 0,249,250 - 1058 1119.98 1058 1119.98 1081.5 1083.5 c 0,251,-1 - 1125 1013 l 0,252,253 - 1149.01 966.986 1149.01 966.986 1163 858 c 0,254,255 - 1166.9 800.919 l 0,256,257 - 1166.23 743.613 1166.23 743.613 1141 731 c 0,258,259 - 1139.08 769.983 l 0,260,261 - 1132.48 813.66 1132.48 813.66 1105.5 848 c 0,262,263 - 1086.38 872.329 1086.38 872.329 1068.62 872.499 c 0,264,265 - 1058.42 872.597 1058.42 872.597 1048.66 864.714 c 0,266,267 - 1041.2 858.688 1041.2 858.688 1034 848 c 0,268,269 - 1013.01 817.011 1013.01 817.011 994 741 c 0,270,271 - 988.449 718.797 988.449 718.797 988.361 701.972 c 0,272,273 - 988.262 683.23 988.262 683.23 994.94 671.159 c 0,274,275 - 1002.79 656.972 1002.79 656.972 1020 652 c 0,276,277 - 1041.52 648.472 l 0,278,279 - 1063.24 649.314 1063.24 649.314 1068.5 673.5 c 0,280,281 - 1076 708 1076 708 1052 744 c 0,282,283 - 1084 744 1084 744 1102 704 c 0,284,285 - 1115.59 674.668 1115.59 674.668 1115.69 641.818 c 0,286,287 - 1115.78 607.006 1115.78 607.006 1100.73 568.244 c 0,288,289 - 1090.27 541.324 1090.27 541.324 1072.5 512.5 c 0,290,291 - 1005 403 1005 403 975 328 c 0,292,293 - 957 285 957 285 952 227.5 c 0,294,295 - 947 169.995 947 169.995 947 128 c 0,296,297 - 947 113 947 113 956.5 94 c 0,298,299 - 966 74.9999 966 74.9999 988 84 c 0,300,301 - 1020.91 98.9589 1020.91 98.9589 1020.81 124.823 c 0,302,303 - 1020.78 133.542 1020.78 133.542 1017 143.5 c 0,304,305 - 1002 183 1002 183 981 201 c 0,306,307 - 993.355 202.547 l 0,308,309 - 1012.86 199.6 1012.86 199.6 1041.5 166.5 c 0,310,311 - 1080 122.005 1080 122.005 1080 97 c 0,312,313 - 1080 56.9999 1080 56.9999 1066.5 -3 c 0,314,315 - 1053 -63 1053 -63 1008 -77 c 0,316,317 - 967 -89 967 -89 923.5 -86 c 0,318,319 - 880 -83 880 -83 838 -86 c 0,320,321 - 754 -96.0001 754 -96.0001 667.5 -104.5 c 0,322,323 - 580.997 -113.001 580.997 -113.001 506 -144 c 0,324,325 - 444 -168 444 -168 390.5 -181.5 c 0,326,327 - 337 -195 337 -195 266 -186 c 0,0,1 -EndSplineSet -EndChar -StartChar: K -Encoding: 75 75 13 -Width: 1310 -Flags: HMW -VStem: 48 294<-13 1634> -Fore -638 316 m 0,0,1 - 591 315 591 315 620 274 c 0,2,3 - 644.538 239.308 644.538 239.308 683.396 238.982 c 0,4,5 - 690.462 238.923 690.462 238.923 698 240 c 0,6,7 - 679.098 223.619 679.098 223.619 649.677 223.513 c 0,8,9 - 632.402 223.451 632.402 223.451 611.5 229 c 0,10,11 - 555.001 244 555.001 244 536 277 c 0,12,13 - 501 334 501 334 480 444 c 0,14,15 - 459 554 459 554 376 588 c 0,16,17 - 361 594 361 594 328.5 585.5 c 0,18,19 - 296.001 577 296.001 577 286 551 c 0,20,21 - 271 514 271 514 294.5 482 c 0,22,-1 - 342 415 l 0,23,24 - 369 370 369 370 374 303 c 0,25,26 - 373.24 263.147 l 0,27,28 - 368.196 223.29 368.196 223.29 345 196 c 0,29,30 - 344 200.001 344 200.001 342 245.5 c 0,31,32 - 340.55 278.486 340.55 278.486 312.624 278.424 c 0,33,34 - 300.363 278.397 300.363 278.397 283 272 c 0,35,36 - 264.001 265 264.001 265 255.5 165.5 c 0,37,38 - 246.999 66.0001 246.999 66.0001 290 66 c 0,39,40 - 329 66 329 66 323.5 89 c 0,41,42 - 318 111.999 318 111.999 304 127 c 0,43,44 - 361 109 361 109 366.5 63 c 0,45,46 - 372 17 372 17 342 -13 c 0,47,48 - 289.002 -63.9983 289.002 -63.9983 222.5 -104 c 0,49,50 - 156 -144.001 156 -144.001 156 -222 c 0,51,52 - 156 -296.001 156 -296.001 230.5 -329.5 c 0,53,54 - 300.803 -361.112 300.803 -361.112 396.485 -361.113 c 0,55,56 - 402.198 -361.113 402.198 -361.113 408 -361 c 0,57,58 - 348.507 -372.092 348.507 -372.092 301.95 -371.999 c 0,59,60 - 209.993 -371.816 209.993 -371.816 168.5 -328 c 0,61,62 - 107.913 -264.02 107.913 -264.02 98 -181 c 0,63,64 - 97.2541 -142.611 l 0,65,66 - 101.102 -94.0729 101.102 -94.0729 129 -44 c 0,67,68 - 167.999 25.9991 167.999 25.9991 169 95 c 0,69,70 - 169 157.001 169 157.001 144 198 c 0,71,72 - 135.64 212.08 135.64 212.08 124.957 213.576 c 0,73,74 - 111.932 211.149 l 0,75,76 - 103.533 207.148 103.533 207.148 94 197 c 0,77,78 - 62.9999 164 62.9999 164 112 113 c 0,79,80 - 73 102.001 73 102.001 47.5 132 c 0,81,82 - 38.9939 142.007 38.9939 142.007 21 180 c 0,83,84 - 4.00904 215.876 4.00904 215.876 35 283.5 c 0,85,86 - 54.7141 326.518 54.7141 326.518 77 381 c 0,87,88 - 109.344 460.071 109.344 460.071 111.5 491.5 c 0,89,90 - 119.119 602.598 119.119 602.598 121 605 c 0,91,92 - 123.409 606.637 123.409 606.637 123.374 613.538 c 0,93,94 - 123.309 626.595 123.309 626.595 114.5 658.5 c 0,95,96 - 93.5096 731.735 93.5096 731.735 48 800 c 0,97,98 - 36 818 36 818 32 867 c 0,99,100 - 28 916 28 916 67 942 c 0,101,102 - 58.6356 921.335 58.6356 921.335 58.6489 907.841 c 0,103,104 - 58.6678 888.725 58.6678 888.725 75.5 884 c 0,105,106 - 106 876 106 876 130 924 c 0,107,108 - 154.741 970.912 154.741 970.912 154.837 1000.58 c 0,109,110 - 154.848 1004.17 154.848 1004.17 154.5 1007.5 c 0,111,112 - 145.981 1070.48 145.981 1070.48 127 1074 c 0,113,114 - 105.667 1074.72 l 0,115,116 - 91.2499 1071.94 91.2499 1071.94 90.8002 1057.34 c 0,117,118 - 90.73 1055.06 90.73 1055.06 91 1052.5 c 0,119,120 - 94 1024 94 1024 106 1012 c 0,121,122 - 73.004 1012 73.004 1012 53.5 1036.5 c 0,123,124 - 34 1060.99 34 1060.99 34 1076 c 0,125,126 - 31 1122.99 31 1122.99 53 1185.5 c 0,127,128 - 75.0055 1248.02 75.0055 1248.02 88 1296 c 0,129,130 - 97.938 1333.68 97.938 1333.68 97.9311 1370.59 c 0,131,132 - 97.9214 1422.82 97.9214 1422.82 78 1473.5 c 0,133,134 - 44 1560.01 44 1560.01 48 1634 c 0,135,136 - 49.9995 1682.99 49.9995 1682.99 79.5 1717 c 0,137,138 - 99.8632 1740.47 99.8632 1740.47 129.045 1740.59 c 0,139,140 - 142.135 1740.65 142.135 1740.65 157 1736 c 0,141,142 - 110.002 1719.01 110.002 1719.01 102 1688.5 c 0,143,144 - 98.2452 1661.63 l 0,145,146 - 98.4527 1649.59 98.4527 1649.59 103 1641 c 0,147,148 - 122.999 1599 122.999 1599 169 1605 c 0,149,150 - 215.001 1611 215.001 1611 229 1641 c 0,151,152 - 244.674 1677.15 244.674 1677.15 244.693 1707.92 c 0,153,154 - 244.732 1773.36 244.732 1773.36 174 1814.5 c 0,155,156 - 69.9617 1875.02 69.9617 1875.02 36 1886 c 0,157,158 - 165.006 1859 165.006 1859 219 1802.5 c 0,159,160 - 273.003 1745.99 273.003 1745.99 287 1698 c 0,161,162 - 298.866 1655.73 298.866 1655.73 298.907 1618.68 c 0,163,164 - 298.921 1605.77 298.921 1605.77 297.5 1593.5 c 0,165,166 - 292.001 1546.01 292.001 1546.01 277 1488 c 0,167,168 - 266.593 1447.11 266.593 1447.11 266.685 1393.79 c 0,169,170 - 266.717 1375.39 266.717 1375.39 268 1355.5 c 0,171,172 - 272.58 1284.5 272.58 1284.5 328.353 1283.58 c 0,173,174 - 333.462 1283.5 333.462 1283.5 339 1284 c 0,175,176 - 402 1290 402 1290 393 1344 c 0,177,178 - 384 1398 384 1398 334 1410 c 0,179,180 - 359.97 1413.09 l 0,181,182 - 381.98 1412.55 381.98 1412.55 406.5 1402 c 0,183,184 - 445.998 1385.01 445.998 1385.01 455 1355 c 0,185,186 - 475 1280 475 1280 435.5 1215.5 c 0,187,188 - 398.21 1154.61 398.21 1154.61 394 1076 c 0,189,190 - 391.08 1021.49 391.08 1021.49 447 1046 c 0,191,192 - 520 1077.99 520 1077.99 595 1205 c 0,193,194 - 622 1250 622 1250 650 1371.5 c 0,195,196 - 677.466 1490.68 677.466 1490.68 718 1522 c 0,197,198 - 740 1538.99 740 1538.99 774.5 1547.5 c 0,199,200 - 799.731 1550.51 l 0,201,202 - 815.211 1549.79 815.211 1549.79 824 1541 c 0,203,204 - 755 1536.01 755 1536.01 755 1490 c 0,205,206 - 755 1458.99 755 1458.99 785 1466 c 0,207,208 - 875 1482.01 875 1482.01 883.5 1543.5 c 0,209,210 - 892.001 1605.01 892.001 1605.01 931 1655 c 0,211,212 - 958 1689.99 958 1689.99 1005.5 1685 c 0,213,214 - 1052.99 1680.01 1052.99 1680.01 1066 1658 c 0,215,216 - 1046.78 1662.27 1046.78 1662.27 1031.01 1662.3 c 0,217,218 - 987.727 1662.39 987.727 1662.39 970.5 1630.5 c 0,219,220 - 961.129 1613.15 961.129 1613.15 961.06 1596.68 c 0,221,222 - 960.961 1572.89 960.961 1572.89 982 1549 c 0,223,224 - 1006.17 1522.41 1006.17 1522.41 1048.2 1522.44 c 0,225,226 - 1058.33 1522.45 1058.33 1522.45 1069.5 1524 c 0,227,228 - 1126.99 1531.99 1126.99 1531.99 1174.5 1568 c 0,229,230 - 1222.01 1604 1222.01 1604 1242 1662.5 c 0,231,232 - 1248.19 1680.62 1248.19 1680.62 1248.15 1699.75 c 0,233,234 - 1248.06 1742.38 1248.06 1742.38 1217 1790 c 0,235,236 - 1275 1744 1275 1744 1278 1669 c 0,237,238 - 1275.94 1627.18 l 0,239,240 - 1268.9 1580.13 1268.9 1580.13 1240 1547 c 0,241,242 - 1216 1519 1216 1519 1155 1484.5 c 0,243,244 - 1093.98 1449.99 1093.98 1449.99 1031 1426 c 0,245,246 - 936.739 1390.05 936.739 1390.05 861 1257 c 0,247,248 - 824.002 1192.01 824.002 1192.01 803.5 1131 c 0,249,250 - 783.002 1070 783.002 1070 718 989 c 0,251,252 - 674.001 934.001 674.001 934.001 603 927 c 0,253,254 - 639 942 639 942 662 975.5 c 0,255,256 - 670.036 987.205 670.036 987.205 670.015 995.797 c 0,257,258 - 669.976 1011.8 669.976 1011.8 642 1017 c 0,259,260 - 621.612 1016.71 l 0,261,262 - 601.663 1012.85 601.663 1012.85 581.5 995 c 0,263,264 - 552.458 969.292 552.458 969.292 545 932 c 0,265,266 - 533 872 533 872 565.5 844.5 c 0,267,268 - 599.679 815.578 599.679 815.578 619 851 c 0,269,270 - 620.942 860.69 l 0,271,272 - 618.273 876.636 618.273 876.636 575 889 c 0,273,274 - 597.521 905.746 597.521 905.746 617.708 905.986 c 0,275,276 - 636.286 902.519 l 0,277,278 - 641.221 900.562 641.221 900.562 646 897.5 c 0,279,280 - 678 877 678 877 687 847 c 0,281,282 - 711 767 711 767 672 722 c 0,283,284 - 634.562 678.803 634.562 678.803 645 604 c 0,285,286 - 657 518 657 518 757.5 474.5 c 0,287,288 - 858 431 858 431 945 402 c 0,289,290 - 1041.01 369.999 1041.01 369.999 1070 311 c 0,291,292 - 1092.11 266.008 1092.11 266.008 1092.13 243.118 c 0,293,294 - 1092.14 235.987 1092.14 235.987 1090 231 c 0,295,296 - 1064.99 311.001 1064.99 311.001 991 328 c 0,297,298 - 956.966 331.206 l 0,299,300 - 912.173 329.667 912.173 329.667 900 291 c 0,301,302 - 897.698 271.598 l 0,303,304 - 900.902 224.978 900.902 224.978 985 168.5 c 0,305,306 - 1087 99.9995 1087 99.9995 1132 65 c 0,307,308 - 1174.01 30.9915 1174.01 30.9915 1210.5 -27.5 c 0,309,310 - 1239.73 -74.3571 1239.73 -74.3571 1239.78 -117.036 c 0,311,312 - 1239.79 -127.648 1239.79 -127.648 1238 -138 c 0,313,314 - 1209.34 -300.784 1209.34 -300.784 1045 -336 c 0,315,316 - 1025 -340.286 1025 -340.286 992.499 -340.235 c 0,317,318 - 979.5 -340.214 979.5 -340.214 964.5 -339.5 c 0,319,320 - 912 -337 912 -337 868 -322 c 0,321,322 - 880.727 -325.182 880.727 -325.182 912.893 -325.124 c 0,323,324 - 931.273 -325.091 931.273 -325.091 956 -324 c 0,325,326 - 1024 -321 1024 -321 1051 -309 c 0,327,328 - 1115 -279.003 1115 -279.003 1154 -208 c 0,329,330 - 1171.45 -176.237 1171.45 -176.237 1171.48 -142.472 c 0,331,332 - 1171.53 -100.763 1171.53 -100.763 1145 -56 c 0,333,334 - 1131.01 -32.0164 1131.01 -32.0164 1093 -0.5 c 0,335,336 - 1055.01 31 1055.01 31 1012 44 c 0,337,338 - 903 75.0001 903 75.0001 906 29 c 0,339,340 - 906 6.00005 906 6.00005 933.5 6 c 0,341,342 - 961 6 961 6 979 -1 c 0,343,344 - 937 -25 937 -25 890.5 -12.5 c 0,345,346 - 844 -4.76837e-06 844 -4.76837e-06 838 15 c 0,347,348 - 822.002 44.9949 822.002 44.9949 806 92 c 0,349,-1 - 782 172 l 0,350,351 - 772.999 202.002 772.999 202.002 725.5 259.5 c 0,352,353 - 679.085 315.686 679.085 315.686 638 316 c 0,0,1 -EndSplineSet -KernsSLIF: 111 -104 0 0 79 -52 0 0 115 -221 0 0 83 -208 0 0 103 -182 0 0 71 -78 0 0 99 -234 0 0 67 -143 0 0 -EndChar -StartChar: L -Encoding: 76 76 65 -Width: 1349 -Flags: MW -HStem: 5.5 212.5<394 867> -VStem: 77 263<33 1557> -Fore -81 187 m 1,0,1 - 95.8849 195.931 95.8849 195.931 113.845 196 c 0,2,3 - 138.115 196.092 138.115 196.092 168 180 c 0,4,5 - 135.47 181.975 l 0,6,7 - 106.046 179.89 106.046 179.89 86.5 162 c 0,8,9 - 56.9999 135 56.9999 135 75 99 c 0,10,11 - 87.3838 72.0972 87.3838 72.0972 106.059 71.9092 c 0,12,13 - 115.619 71.8129 115.619 71.8129 126.827 78.7173 c 0,14,15 - 144.998 89.91 144.998 89.91 167.5 119.5 c 0,16,17 - 205.326 169.241 205.326 169.241 205.362 225.545 c 0,18,19 - 205.386 263.76 205.386 263.76 188 305 c 0,20,21 - 168.819 348.157 168.819 348.157 146.118 348.141 c 0,22,23 - 135.681 348.134 135.681 348.134 124.5 339 c 0,24,25 - 110.569 327.62 110.569 327.62 110.42 313.007 c 0,26,27 - 110.325 303.613 110.325 303.613 115.924 292.882 c 0,28,29 - 123.812 277.767 123.812 277.767 143 260 c 0,30,31 - 66.9999 285 66.9999 285 64 377 c 0,32,33 - 61 446 61 446 93.5 520.5 c 0,34,35 - 125.999 594.997 125.999 594.997 142 665 c 0,36,37 - 158.584 741.182 158.584 741.182 158.516 811.993 c 0,38,39 - 158.453 877.817 158.453 877.817 144 939 c 0,40,41 - 129 1001 129 1001 109 1061 c 0,42,43 - 89.0001 1121 89.0001 1121 83 1190 c 0,44,45 - 85.4002 1207.77 l 0,46,47 - 89.192 1219.98 89.192 1219.98 98.5 1237 c 0,48,49 - 113.063 1263.62 113.063 1263.62 148.738 1263.94 c 0,50,51 - 155.94 1264.01 155.94 1264.01 164 1263 c 0,52,53 - 151.987 1262.88 l 0,54,55 - 137.206 1258.28 137.206 1258.28 125 1231 c 0,56,57 - 121 1222.06 121 1222.06 120.765 1215.44 c 0,58,59 - 123.205 1205.69 l 0,60,61 - 129.228 1196.59 129.228 1196.59 150.025 1196.62 c 0,62,63 - 154.213 1196.62 154.213 1196.62 159 1197 c 0,64,65 - 193.073 1199.62 193.073 1199.62 193.561 1233.92 c 0,66,67 - 193.632 1238.88 193.632 1238.88 193 1244.5 c 0,68,69 - 188.004 1288.98 188.004 1288.98 180 1342 c 0,70,71 - 168.003 1405.99 168.003 1405.99 142.5 1462.5 c 0,72,73 - 116.992 1519.02 116.992 1519.02 96 1579 c 0,74,75 - 90.8969 1591.93 90.8969 1591.93 90.9442 1607.29 c 0,76,77 - 91.0361 1637.08 91.0361 1637.08 110.5 1676 c 0,78,79 - 127.596 1710.19 127.596 1710.19 157.618 1710.13 c 0,80,81 - 179.407 1710.08 179.407 1710.08 208 1692 c 0,82,83 - 184.001 1692 184.001 1692 154.5 1675.5 c 0,84,85 - 133.787 1663.92 133.787 1663.92 133.533 1633.84 c 0,86,87 - 137 1605 l 0,88,89 - 148.796 1548.97 148.796 1548.97 196 1548.5 c 0,90,91 - 242.998 1548.99 242.998 1548.99 264 1609 c 0,92,93 - 272.991 1635.97 272.991 1635.97 273.066 1660.18 c 0,94,95 - 273.164 1691.87 273.164 1691.87 257.991 1718.82 c 0,96,97 - 240.916 1749.16 240.916 1749.16 204.5 1773.5 c 0,98,99 - 111.01 1836 111.01 1836 31 1848 c 0,100,101 - 98.7863 1845.34 l 0,102,103 - 181.869 1836.9 181.869 1836.9 234 1802.5 c 0,104,105 - 306.003 1754.99 306.003 1754.99 324 1710 c 0,106,107 - 354 1632 354 1632 340 1557 c 0,108,109 - 326 1482 326 1482 326 1409 c 0,110,111 - 329.503 1348.47 l 0,112,113 - 338.221 1276.68 338.221 1276.68 368.5 1193.5 c 0,114,115 - 412 1073.99 412 1073.99 345 1027 c 0,116,117 - 355.31 1043.14 355.31 1043.14 355.372 1059.38 c 0,118,119 - 355.448 1079.36 355.448 1079.36 340 1099.5 c 0,120,121 - 328.21 1114.87 328.21 1114.87 316.244 1115.25 c 0,122,123 - 304.078 1111.81 l 0,124,125 - 293.606 1105.55 293.606 1105.55 283 1088 c 0,126,127 - 268.001 1064 268.001 1064 262.5 975 c 0,128,129 - 263.074 928.003 l 0,130,131 - 268.216 880.218 268.216 880.218 295 864 c 0,132,133 - 304.791 858.066 304.791 858.066 312.778 857.81 c 0,134,135 - 323.721 860.607 l 0,136,137 - 334.485 867.085 334.485 867.085 340.5 888.5 c 0,138,139 - 353 933 353 933 317 972 c 0,140,141 - 358 972 358 972 376.5 918 c 0,142,143 - 395 864 395 864 374 823 c 0,144,145 - 363 801 363 801 348.5 704.5 c 0,146,147 - 334.001 608.009 334.001 608.009 330 500 c 0,148,149 - 330.05 399.127 l 0,150,151 - 332.138 349.53 332.138 349.53 338.5 305.5 c 0,152,153 - 350.999 219.001 350.999 219.001 394 218 c 0,154,155 - 419.375 220.375 l 0,156,157 - 455.75 229.75 455.75 229.75 482 274 c 0,158,159 - 514.832 329.345 514.832 329.345 585.501 329.254 c 0,160,161 - 590.168 329.248 590.168 329.248 595 329 c 0,162,163 - 628 326 628 326 647 296.5 c 0,164,165 - 662.048 273.136 662.048 273.136 662.042 247.577 c 0,166,167 - 662.04 240.864 662.04 240.864 661 234 c 0,168,169 - 640 285 640 285 592 281.5 c 0,170,171 - 544 278 544 278 559 218 c 0,172,173 - 562 200 562 200 599 188 c 0,174,175 - 609.533 184.584 609.533 184.584 625.171 184.652 c 0,176,177 - 664.468 184.825 664.468 184.825 736 207 c 0,178,179 - 792.993 224.998 792.993 224.998 906 266 c 0,180,181 - 1019 307 1019 307 1004 187 c 0,182,183 - 985.478 232.409 985.478 232.409 960.708 233.016 c 0,184,185 - 945.201 229.307 l 0,186,187 - 935.283 224.505 935.283 224.505 924.5 213.5 c 0,188,189 - 876 164 876 164 920 146 c 0,190,191 - 1049 93.0005 1049 93.0005 1151 165.5 c 0,192,193 - 1239.19 228.186 1239.19 228.186 1239.17 375.713 c 0,194,195 - 1239.17 398.817 1239.17 398.817 1237 424 c 0,196,197 - 1285 262 1285 262 1235.5 175 c 0,198,199 - 1186 87.9974 1186 87.9974 1087.5 49 c 0,200,201 - 988.995 9.99982 988.995 9.99982 867 5.5 c 0,202,203 - 745 1 745 1 648 5 c 0,204,205 - 588 8 588 8 517 22 c 0,206,207 - 446 36 446 36 341 8 c 0,208,209 - 291.986 -4.7862 291.986 -4.7862 239.44 -4.70537 c 0,210,211 - 218.014 -4.67242 218.014 -4.67242 196 -2.5 c 0,212,213 - 120.001 4.99989 120.001 4.99989 77 33 c 0,214,215 - 44 54 44 54 38 104 c 0,216,217 - 38.6834 129.312 l 0,218,219 - 44.988 162.747 44.988 162.747 81 187 c 1,0,1 -EndSplineSet -KernsSLIF: 116 -417 0 0 84 -417 0 0 89 -234 0 0 121 -234 0 0 105 -130 0 0 73 -143 0 0 45 -221 0 0 83 -234 0 0 119 -273 0 0 87 -286 0 0 -EndChar -StartChar: M -Encoding: 77 77 14 -Width: 1706 -Flags: HMW -VStem: 94 134<-53 110> 103 219.5<176.5 1679> 352.5 105.5<62.5 376> 1204 234<80 1735> 1320.5 117.5<-254 80> -Fore -1191 -391 m 1,0,1 - 1254.99 -348.011 1254.99 -348.011 1320.5 -254 c 0,2,3 - 1378.85 -170.264 1378.85 -170.264 1378.87 -61.11 c 0,4,5 - 1378.87 -47.7462 1378.87 -47.7462 1378 -34 c 0,6,7 - 1375 5.9856 1375 5.9856 1352 60.5 c 0,8,9 - 1329.01 115 1329.01 115 1271 121 c 0,10,11 - 1236.18 118.355 l 0,12,13 - 1233.88 117.956 1233.88 117.956 1231.5 117.5 c 0,14,15 - 1208 113.001 1208 113.001 1202 95 c 0,16,17 - 1190.15 63.5722 1190.15 63.5722 1190.25 38.2553 c 0,18,19 - 1190.33 14.4222 1190.33 14.4222 1201 -4 c 0,20,21 - 1217.66 -32.7714 1217.66 -32.7714 1249.22 -32.8796 c 0,22,23 - 1259.34 -32.9143 1259.34 -32.9143 1271 -30 c 0,24,25 - 1254.04 -59.2158 1254.04 -59.2158 1207.32 -59.1209 c 0,26,27 - 1204.46 -59.1151 1204.46 -59.1151 1201.5 -59 c 0,28,29 - 1150.01 -57 1150.01 -57 1122 -27 c 0,30,31 - 1082.65 11.5429 1082.65 11.5429 1082.64 73.3058 c 0,32,33 - 1082.64 88.4541 1082.64 88.4541 1085 105 c 0,34,35 - 1098.01 201.049 1098.01 201.049 1129 292 c 0,36,37 - 1159.99 382.965 1159.99 382.965 1178 473 c 0,38,39 - 1190.02 533.081 1190.02 533.081 1210 677.5 c 0,40,41 - 1230 822.036 1230 822.036 1230 885 c 0,42,43 - 1230 933.068 1230 933.068 1224.5 1007.5 c 0,44,45 - 1219 1082 1219 1082 1165 1107 c 0,46,47 - 1145.79 1115.87 1145.79 1115.87 1125.63 1115.79 c 0,48,49 - 1091.2 1115.67 1091.2 1115.67 1054 1089.5 c 0,50,51 - 1014.77 1061.9 1014.77 1061.9 1014.45 1027.45 c 0,52,53 - 1018.33 1004.4 l 0,54,55 - 1020.54 997.811 1020.54 997.811 1024 991 c 0,56,57 - 1037.79 964.081 1037.79 964.081 1054.81 963.673 c 0,58,59 - 1068.33 967.252 l 0,60,61 - 1070.88 968.617 1070.88 968.617 1073.5 970.5 c 0,62,63 - 1101.99 990.995 1101.99 990.995 1112 1029 c 0,64,65 - 1134.99 955 1134.99 955 1094 895 c 0,66,67 - 1058 843.999 1058 843.999 976 836 c 0,68,69 - 893.995 828 893.995 828 830 828 c 0,70,71 - 769 828 769 828 740 797.5 c 0,72,73 - 710.999 766.999 710.999 766.999 709 736 c 0,74,75 - 706 698 706 698 723.5 653.5 c 0,76,77 - 741 609 741 609 768 595 c 0,78,79 - 855 548 855 548 890 574 c 0,80,81 - 925.001 600 925.001 600 936 631 c 0,82,83 - 943 595 943 595 916.5 562 c 0,84,85 - 890 529 890 529 869 526 c 0,86,87 - 790 509 790 509 758.5 527 c 0,88,89 - 727 545 727 545 700 574 c 0,90,91 - 640.999 634.001 640.999 634.001 622.5 739 c 0,92,93 - 604 844 604 844 603 915 c 0,94,95 - 601 959 601 959 577.5 1002.5 c 0,96,97 - 554 1046 554 1046 503 1049 c 0,98,99 - 469 1050.01 469 1050.01 470 1014.5 c 0,100,101 - 470.546 995.136 470.546 995.136 486.86 994.963 c 0,102,103 - 496.177 994.864 496.177 994.864 510.639 1001.02 c 0,104,105 - 517.277 1003.85 517.277 1003.85 525 1008 c 0,106,107 - 515 966 515 966 484 963.5 c 0,108,109 - 455.502 964.925 l 0,110,111 - 440.947 967.75 440.947 967.75 428 975 c 0,112,113 - 397.999 990 397.999 990 397.5 1036 c 0,114,115 - 400.858 1097.86 l 0,116,117 - 402.845 1115.12 402.845 1115.12 406 1133 c 0,118,119 - 408.23 1168.25 l 0,120,121 - 406.474 1196.11 406.474 1196.11 391 1209 c 0,122,123 - 377 1220.38 377 1220.38 365.042 1220.31 c 0,124,125 - 336 1220.15 336 1220.15 319 1152.5 c 0,126,127 - 295 1056.99 295 1056.99 295 999 c 0,128,129 - 295 826.001 295 826.001 348 638 c 0,130,131 - 364 575 364 575 402 506.5 c 0,132,133 - 440 438 440 438 458 376 c 0,134,135 - 480.369 294.514 480.369 294.514 480.4 228.983 c 0,136,137 - 480.408 212.486 480.408 212.486 479 197 c 0,138,139 - 467 54.9995 467 54.9995 376 26 c 0,140,141 - 292 -2 292 -2 265 54 c 0,142,143 - 303 41 303 41 352.5 62.5 c 0,144,145 - 399.923 83.0977 399.923 83.0977 400.077 129.854 c 0,146,147 - 400.084 131.902 400.084 131.902 400 134 c 0,148,149 - 396.484 183.929 396.484 183.929 359.587 184.653 c 0,150,151 - 334.74 180.746 l 0,152,153 - 328.882 179.009 328.882 179.009 322.5 176.5 c 0,154,155 - 250.001 148 250.001 148 228 110 c 0,156,157 - 192.001 48.0011 192.001 48.0011 185 -25 c 0,158,159 - 182.436 -88.491 l 0,160,161 - 183.31 -118.758 183.31 -118.758 189 -141 c 0,162,163 - 223.999 -293.999 223.999 -293.999 290 -361 c 0,164,165 - 356 -428 356 -428 425 -482 c 0,166,167 - 285 -455 285 -455 187.5 -325 c 0,168,169 - 93.943 -200.257 93.943 -200.257 93.8425 -64.4657 c 0,170,171 - 93.8382 -58.7428 93.8382 -58.7428 94 -53 c 0,172,173 - 97 43 97 43 146 140 c 0,174,175 - 195.001 237.001 195.001 237.001 209 333 c 0,176,177 - 214.998 371.988 214.998 371.988 227.5 438.5 c 0,178,179 - 230.901 474.219 l 0,180,181 - 230.041 510.432 230.041 510.432 207 523 c 0,182,183 - 191.903 530.839 191.903 530.839 180.346 530.839 c 0,184,185 - 152.097 530.839 152.097 530.839 145 484 c 0,186,187 - 143.091 450.184 l 0,188,189 - 145.56 415.36 145.56 415.36 171 409 c 0,190,191 - 97.0005 409 97.0005 409 90 474 c 0,192,193 - 82.9999 539 82.9999 539 90 588 c 0,194,195 - 96 634 96 634 127 686 c 0,196,197 - 158 738 158 738 164 783 c 0,198,199 - 168.088 814.428 168.088 814.428 167.998 844.615 c 0,200,201 - 167.736 932.573 167.736 932.573 132 1010 c 0,202,203 - 84.004 1113.99 84.004 1113.99 53 1222 c 0,204,205 - 22.9998 1322.01 22.9998 1322.01 20.5 1382 c 0,206,207 - 18 1442 18 1442 70 1544 c 0,208,209 - 89.997 1582.99 89.997 1582.99 126.5 1590 c 0,210,211 - 154.046 1592.08 l 0,212,213 - 168.318 1590.79 168.318 1590.79 175 1583 c 0,214,215 - 124.999 1578.99 124.999 1578.99 114.5 1508.5 c 0,216,217 - 112.6 1474.11 l 0,218,219 - 115.168 1439.36 115.168 1439.36 144 1436 c 0,220,221 - 173.178 1437.94 l 0,222,223 - 208.051 1445.24 208.051 1445.24 224 1477.5 c 0,224,225 - 246 1522 246 1522 252 1575 c 0,226,227 - 256.999 1620 256.999 1620 246 1672.5 c 0,228,229 - 236.506 1717.81 236.506 1717.81 172.622 1718.06 c 0,230,231 - 162.495 1718.09 162.495 1718.09 151 1717 c 0,232,233 - 128.007 1715.01 128.007 1715.01 115.5 1696.5 c 0,234,235 - 103.708 1679.05 103.708 1679.05 103 1679 c 0,236,237 - 105.806 1714.01 l 0,238,239 - 117.15 1769.34 117.15 1769.34 173.5 1784.5 c 0,240,241 - 189.642 1788.84 189.642 1788.84 205.164 1788.8 c 0,242,243 - 259.359 1788.64 259.359 1788.64 306 1735 c 0,244,245 - 363.005 1667.99 363.005 1667.99 396.5 1582.5 c 0,246,247 - 430 1497 430 1497 473 1428 c 0,248,-1 - 530 1343.5 l 0,249,250 - 566.99 1288.67 566.99 1288.67 595.556 1288.37 c 0,251,252 - 605.034 1288.27 605.034 1288.27 613.585 1294.17 c 0,253,254 - 618.977 1297.89 618.977 1297.89 624 1304 c 0,255,256 - 634.821 1316.98 634.821 1316.98 634.87 1331.28 c 0,257,258 - 634.933 1350.01 634.933 1350.01 616.5 1371 c 0,259,260 - 588.485 1402.9 588.485 1402.9 554.892 1402.84 c 0,261,262 - 549.517 1402.83 549.517 1402.83 544 1402 c 0,263,264 - 562.993 1424.95 562.993 1424.95 587.931 1425.04 c 0,265,266 - 594.509 1425.07 594.509 1425.07 601.5 1423.5 c 0,267,268 - 634.987 1416 634.987 1416 653 1405 c 0,269,270 - 689.001 1379.99 689.001 1379.99 694 1326 c 0,271,272 - 695.999 1271.01 695.999 1271.01 723.5 1217.5 c 0,273,274 - 742.767 1180.01 742.767 1180.01 771.12 1180.09 c 0,275,276 - 783.231 1180.12 783.231 1180.12 797 1187 c 0,277,278 - 839.999 1208 839.999 1208 857.5 1263.5 c 0,279,280 - 874.99 1318.97 874.99 1318.97 901 1389 c 0,281,282 - 937 1485 937 1485 1034.5 1600.5 c 0,283,284 - 1131.99 1715.99 1131.99 1715.99 1204 1735 c 0,285,286 - 1299.18 1758.55 1299.18 1758.55 1414.62 1758.51 c 0,287,288 - 1416.82 1758.51 1416.82 1758.51 1419 1758.5 c 0,289,290 - 1536.99 1758.01 1536.99 1758.01 1624 1696 c 0,291,292 - 1668.01 1662.99 1668.01 1662.99 1715 1607 c 0,293,294 - 1762 1551 1762 1551 1762 1486 c 0,295,296 - 1762 1451.98 1762 1451.98 1753.5 1420.5 c 0,297,298 - 1745 1389 1745 1389 1706 1367 c 0,299,300 - 1732.07 1398.62 1732.07 1398.62 1732.14 1440.1 c 0,301,302 - 1732.19 1473.38 1732.19 1473.38 1715.5 1513 c 0,303,304 - 1678 1602 1678 1602 1606 1635 c 0,305,306 - 1531.03 1668.99 1531.03 1668.99 1449.5 1673 c 0,307,308 - 1424.97 1670.67 l 0,309,310 - 1367.02 1655.35 1367.02 1655.35 1362 1544 c 0,311,312 - 1364.34 1517.8 l 0,313,314 - 1372.6 1483.53 1372.6 1483.53 1408 1448.5 c 0,315,316 - 1438.06 1418.76 1438.06 1418.76 1459.46 1418.54 c 0,317,318 - 1468.94 1418.44 1468.94 1418.44 1476.72 1424.14 c 0,319,320 - 1480.01 1426.55 1480.01 1426.55 1483 1430 c 0,321,322 - 1503.71 1453.3 1503.71 1453.3 1503.69 1471.35 c 0,323,324 - 1503.68 1481.2 1503.68 1481.2 1497.5 1489.5 c 0,325,326 - 1480.01 1512.99 1480.01 1512.99 1451 1523 c 0,327,328 - 1462.95 1538.93 1462.95 1538.93 1480.07 1538.84 c 0,329,330 - 1493.05 1538.77 1493.05 1538.77 1509 1529.5 c 0,331,332 - 1545.99 1508.01 1545.99 1508.01 1552 1497 c 0,333,334 - 1562.18 1474.09 1562.18 1474.09 1562.51 1446 c 0,335,336 - 1558.74 1407.05 l 0,337,338 - 1554 1387 l 0,339,340 - 1536 1321.99 1536 1321.99 1500 1278 c 0,341,342 - 1416.04 1176.16 1416.04 1176.16 1416.08 1061.63 c 0,343,344 - 1416.1 1028.84 1416.1 1028.84 1423 995 c 0,345,346 - 1444 887.992 1444 887.992 1476.5 845 c 0,347,348 - 1508.97 802.053 1508.97 802.053 1539 757 c 0,349,350 - 1602.07 662.786 1602.07 662.786 1602.09 561.896 c 0,351,352 - 1602.09 533.218 1602.09 533.218 1597 504 c 0,353,354 - 1589.99 464.981 1589.99 464.981 1573.5 427.5 c 0,355,356 - 1557 389.995 1557 389.995 1514 360 c 0,357,358 - 1503.02 353.01 1503.02 353.01 1475.5 342.5 c 0,359,360 - 1455.47 338.636 l 0,361,362 - 1439.99 338.866 1439.99 338.866 1427 350 c 0,363,364 - 1484 377 1484 377 1494.5 417.5 c 0,365,366 - 1501.7 445.258 1501.7 445.258 1501.61 472.323 c 0,367,368 - 1501.57 484.735 1501.57 484.735 1500 497 c 0,369,370 - 1497 524 1497 524 1451 525.5 c 0,371,372 - 1429 522.813 l 0,373,374 - 1401.07 514.148 1401.07 514.148 1390 478 c 0,375,376 - 1374.99 431.982 1374.99 431.982 1373 369.5 c 0,377,378 - 1371.01 307 1371.01 307 1379 259 c 0,379,380 - 1389.99 190.017 1389.99 190.017 1406.5 154 c 0,381,382 - 1423 118 1423 118 1438 80 c 0,383,384 - 1469.99 -7 1469.99 -7 1453 -101 c 0,385,386 - 1436.99 -185.011 1436.99 -185.011 1383 -266 c 0,387,388 - 1329 -347 1329 -347 1191 -391 c 1,0,1 -EndSplineSet -KernsSLIF: 65 -104 0 0 97 -104 0 0 105 78 0 0 -EndChar -StartChar: N -Encoding: 78 78 49 -Width: 1258 -Flags: MW -VStem: 112 207<77 1354> 762 258<69 1428.5> -Fore -74 -62 m 1,0,1 - 41 43 41 43 64.5 150 c 0,2,3 - 87.9992 256.995 87.9992 256.995 108 359 c 0,4,5 - 138 521 138 521 61 677 c 0,6,7 - -16 833 -16 833 17 954 c 0,8,9 - 20 965 20 965 44 986 c 0,10,11 - 68 1007 68 1007 101 992 c 0,12,13 - 9.00005 947 9.00005 947 77.5 905.5 c 0,14,15 - 146.001 864 146.001 864 146 964 c 0,16,17 - 146 1059 146 1059 129 1160 c 0,18,19 - 112 1261 112 1261 112 1354 c 0,20,21 - 114.761 1469.81 l 0,22,23 - 116.564 1501.21 116.564 1501.21 119.5 1533.5 c 0,24,25 - 128.001 1627 128.001 1627 184 1684 c 0,26,27 - 203.611 1704.22 203.611 1704.22 228.297 1704.54 c 0,28,29 - 251.074 1700.94 l 0,30,31 - 256.195 1699.33 256.195 1699.33 261.5 1697 c 0,32,33 - 307 1677 307 1677 307 1650 c 0,34,35 - 268.794 1682.55 268.794 1682.55 241.845 1682.8 c 0,36,37 - 231.258 1682.9 231.258 1682.9 221.5 1677.5 c 0,38,39 - 189.999 1659 189.999 1659 180.5 1611.5 c 0,40,41 - 176.467 1591.33 176.467 1591.33 176.489 1569.19 c 0,42,43 - 176.519 1539.16 176.519 1539.16 184 1505.5 c 0,44,45 - 196.999 1447.01 196.999 1447.01 233 1413 c 0,46,47 - 295.992 1350.01 295.992 1350.01 386 1314.5 c 0,48,49 - 476.011 1278.99 476.011 1278.99 519 1224 c 0,50,51 - 545.623 1187.93 545.623 1187.93 545.694 1151.12 c 0,52,53 - 545.706 1145.07 545.706 1145.07 545 1139 c 0,54,55 - 540.001 1096 540.001 1096 480 1066 c 0,56,-1 - 502 1105 l 0,57,58 - 514 1126 514 1126 506 1153 c 0,59,60 - 497 1178.99 497 1178.99 477.5 1184.5 c 0,61,62 - 464.262 1184.99 l 0,63,64 - 453.62 1182.33 453.62 1182.33 446 1169 c 0,65,66 - 437.906 1155.92 437.906 1155.92 437.953 1128.31 c 0,67,68 - 437.981 1111.58 437.981 1111.58 441 1089.5 c 0,69,70 - 449 1031 449 1031 469.5 969.5 c 0,71,72 - 490 908 490 908 517.5 862 c 0,73,74 - 541.915 821.159 541.915 821.159 565.149 820.52 c 0,75,76 - 568.084 820.439 568.084 820.439 571 821 c 0,77,78 - 643 833 643 833 617 883.5 c 0,79,80 - 591.001 933.999 591.001 933.999 559 960 c 0,81,82 - 673 931 673 931 681 835.5 c 0,83,84 - 689 740 689 740 689 645 c 0,85,86 - 689 567.999 689 567.999 744 530 c 0,87,88 - 757.572 520.623 757.572 520.623 768.89 520.563 c 0,89,90 - 787.453 520.463 787.453 520.463 799.956 545.418 c 0,91,92 - 810.726 566.914 810.726 566.914 817 607 c 0,93,94 - 826.998 675.985 826.998 675.985 832.5 743.5 c 0,95,96 - 838 811 838 811 819 882 c 0,97,98 - 808 921 808 921 781.5 974.5 c 0,99,100 - 755 1028.01 755 1028.01 755 1075 c 0,101,102 - 755 1120 755 1120 773 1156 c 0,103,104 - 789.176 1188.35 789.176 1188.35 831.992 1188.4 c 0,105,106 - 836.826 1188.41 836.826 1188.41 842 1188 c 0,107,108 - 822 1170 822 1170 807 1140 c 0,109,110 - 792 1110 792 1110 813 1092 c 0,111,112 - 823 1082.67 823 1082.67 831.5 1082.67 c 0,113,114 - 848.499 1082.67 848.499 1082.67 859.5 1120 c 0,115,116 - 876 1175.99 876 1175.99 876 1188 c 0,117,118 - 876 1262 876 1262 839 1314.5 c 0,119,120 - 802 1367 802 1367 794 1439 c 0,121,122 - 794.095 1471.9 l 0,123,124 - 800.447 1521.51 800.447 1521.51 845.5 1560.5 c 0,125,126 - 905 1611.99 905 1611.99 953 1535 c 0,127,128 - 919.238 1535.44 l 0,129,130 - 871.273 1529.7 871.273 1529.7 870.734 1481.68 c 0,131,132 - 870.688 1477.5 870.688 1477.5 871 1473 c 0,133,134 - 876 1401 876 1401 936 1401 c 0,135,136 - 989.994 1401 989.994 1401 1020 1428.5 c 0,137,138 - 1050 1455.99 1050 1455.99 1071 1499 c 0,139,140 - 1093.96 1545.56 1093.96 1545.56 1093.94 1612.45 c 0,141,142 - 1093.93 1650.44 1093.93 1650.44 1086.5 1695 c 0,143,144 - 1065.99 1818.01 1065.99 1818.01 1006 1877 c 0,145,146 - 1102.01 1814 1102.01 1814 1125 1699 c 0,147,148 - 1148 1583.97 1148 1583.97 1148 1560 c 0,149,150 - 1148 1485.01 1148 1485.01 1116 1422.5 c 0,151,152 - 1083.99 1359.96 1083.99 1359.96 1070 1297 c 0,153,154 - 1062.93 1266.38 1062.93 1266.38 1062.96 1238.99 c 0,155,156 - 1062.99 1196.62 1062.99 1196.62 1080 1162 c 0,157,158 - 1107.99 1105.03 1107.99 1105.03 1134 1043 c 0,159,160 - 1168.01 955 1168.01 955 1183.5 886 c 0,161,162 - 1198.99 817 1198.99 817 1083 760 c 0,163,-1 - 1113 802.5 l 0,164,165 - 1130 827.007 1130 827.007 1130 852 c 0,166,167 - 1130 892 1130 892 1104 892 c 0,168,169 - 1077.42 889.157 l 0,170,171 - 1028.81 876.802 1028.81 876.802 1024 811 c 0,172,173 - 1015 687 1015 687 1003 556.5 c 0,174,175 - 991 426 991 426 966 305 c 0,176,177 - 948 222.001 948 222.001 863 62 c 0,178,179 - 778 -98 778 -98 670 -79 c 0,180,181 - 720 -55 720 -55 736.5 -18.5 c 0,182,183 - 753 18 753 18 762 69 c 0,184,185 - 775 138 775 138 725.5 292.5 c 0,186,187 - 676 447 676 447 593 435 c 0,188,189 - 565 431 565 431 569 395 c 0,190,191 - 572.22 366.025 572.22 366.025 596.817 365.553 c 0,192,193 - 610 367 l 0,194,195 - 596.188 350 596.188 350 578.988 349.934 c 0,196,197 - 563.812 349.875 563.812 349.875 546 363 c 0,198,199 - 508 391 508 391 502 411 c 0,200,201 - 467 518.001 467 518.001 461 595 c 0,202,203 - 455 671.999 455 671.999 423 770 c 0,204,205 - 400 839 400 839 373 847 c 0,206,207 - 364.788 846.446 l 0,208,209 - 359.164 842.844 359.164 842.844 359.247 828.26 c 0,210,211 - 359.369 806.668 359.369 806.668 372 761 c 0,212,213 - 381.671 725.158 381.671 725.158 381.633 684.301 c 0,214,215 - 381.604 653.34 381.604 653.34 376 619.5 c 0,216,217 - 363 541 363 541 267 579 c 0,218,219 - 351 576 351 576 313.5 641.5 c 0,220,221 - 276 707 276 707 249 644 c 0,222,223 - 234.53 609.272 234.53 609.272 234.5 559 c 0,224,225 - 234.999 510.002 234.999 510.002 247 479 c 0,226,227 - 294.999 346.002 294.999 346.002 326.5 289.5 c 0,228,229 - 340.656 264.108 340.656 264.108 340.574 218.621 c 0,230,231 - 340.473 162.892 340.473 162.892 319 77 c 0,232,233 - 309 36 309 36 268 13 c 0,234,235 - 227.001 -9.99947 227.001 -9.99947 186 -20 c 0,236,237 - 230.999 2.99969 230.999 2.99969 250 78.5 c 0,238,239 - 253.611 106.897 l 0,240,241 - 252.175 152.133 252.175 152.133 189 152 c 0,242,243 - 144.001 150.001 144.001 150.001 131 95.5 c 0,244,245 - 117.999 41 117.999 41 118 -7 c 0,246,247 - 118 -142 118 -142 217.5 -203.5 c 0,248,249 - 317 -265 317 -265 431 -271 c 0,250,251 - 395.576 -276.239 395.576 -276.239 363.232 -276.188 c 0,252,253 - 265.925 -276.034 265.925 -276.034 196.5 -228 c 0,254,255 - 104 -164 104 -164 74 -62 c 1,0,1 -EndSplineSet -KernsSLIF: 65 -234 0 0 97 -208 0 0 -EndChar -StartChar: O -Encoding: 79 79 47 -Width: 1417 -Flags: HW -Fore -263 27 m 1,0,1 - 233 13.5 233 13.5 202 13.5 c 0,2,3 - 171 13.5 171 13.5 139 27 c 0,4,5 - 22 76.0001 22 76.0001 22 185 c 0,6,7 - 22 261.001 22 261.001 75 455 c 0,8,-1 - 147 721 l 0,9,10 - 153.999 750.993 153.999 750.993 158 796 c 0,11,12 - 156.573 817.294 l 0,13,14 - 149.813 841.812 149.813 841.812 117 844 c 0,15,16 - 89.2061 842.225 l 0,17,18 - 46.2343 832.476 46.2343 832.476 46.0801 776.017 c 0,19,20 - 46.0569 767.536 46.0569 767.536 47 758 c 0,21,22 - 19.3514 778.513 19.3514 778.513 19.1465 836.017 c 0,23,24 - 19.1216 842.987 19.1216 842.987 19.5 850.5 c 0,25,26 - 23 920 23 920 41.5 1005.5 c 0,27,28 - 60 1091 60 1091 83.5 1178 c 0,29,30 - 106.998 1264.99 106.998 1264.99 116 1324 c 0,31,32 - 128.001 1411.01 128.001 1411.01 174 1492.5 c 0,33,34 - 201.989 1542.09 201.989 1542.09 257.37 1542.25 c 0,35,36 - 289.993 1542.35 289.993 1542.35 332.12 1525.3 c 0,37,38 - 336.018 1523.72 336.018 1523.72 340 1522 c 0,39,40 - 232.57 1519.34 232.57 1519.34 231.558 1459.92 c 0,41,42 - 233 1444 l 0,43,44 - 246.622 1371.02 246.622 1371.02 295 1370 c 0,45,46 - 373.997 1370 373.997 1370 454 1495 c 0,47,48 - 502.516 1570.8 502.516 1570.8 502.485 1611.67 c 0,49,50 - 502.465 1638.19 502.465 1638.19 482 1650 c 0,51,52 - 451.482 1667.25 451.482 1667.25 427.613 1667.38 c 0,53,54 - 409.651 1667.48 409.651 1667.48 395.456 1657.88 c 0,55,56 - 385.869 1651.4 385.869 1651.4 378 1640.5 c 0,57,58 - 343 1592.01 343 1592.01 330 1567 c 0,59,60 - 325.922 1585.8 325.922 1585.8 325.899 1602.66 c 0,61,62 - 325.82 1660.2 325.82 1660.2 373 1695 c 0,63,64 - 427.818 1735.44 427.818 1735.44 511.724 1735.5 c 0,65,66 - 521.177 1735.51 521.177 1735.51 531 1735 c 0,67,68 - 630.999 1729 630.999 1729 758 1669 c 0,69,70 - 885.004 1609 885.004 1609 924 1539 c 0,71,-1 - 949.5 1479.5 l 0,72,73 - 970.969 1429.07 970.969 1429.07 999.5 1372.5 c 0,74,75 - 1027.99 1316.02 1027.99 1316.02 1060 1270.5 c 0,76,77 - 1089.79 1228.14 1089.79 1228.14 1118 1228 c 0,78,79 - 1188.94 1234.16 1188.94 1234.16 1189.13 1280.17 c 0,80,81 - 1189.18 1293.83 1189.18 1293.83 1183 1311 c 0,82,83 - 1156 1386.01 1156 1386.01 1090 1388 c 0,84,85 - 1116.63 1392.13 1116.63 1392.13 1138.87 1392.1 c 0,86,87 - 1224.37 1392 1224.37 1392 1245 1330.5 c 0,88,89 - 1260.02 1285.72 1260.02 1285.72 1260.02 1250.8 c 0,90,91 - 1260.03 1225.27 1260.03 1225.27 1252 1205 c 0,92,93 - 1227.01 1143.05 1227.01 1143.05 1162 963 c 0,94,95 - 1114.5 831.456 1114.5 831.456 1114.53 767.21 c 0,96,97 - 1114.54 743.538 1114.54 743.538 1121 729 c 0,98,99 - 1134.99 694 1134.99 694 1190 694.5 c 0,100,101 - 1245 695 1245 695 1257 742 c 0,102,103 - 1261.16 756.544 1261.16 756.544 1261.24 768.805 c 0,104,105 - 1261.34 782.452 1261.34 782.452 1256.4 793.271 c 0,106,107 - 1242.28 824.188 1242.28 824.188 1187 832 c 0,108,109 - 1197.02 844.659 1197.02 844.659 1221.79 844.798 c 0,110,111 - 1239.24 844.897 1239.24 844.897 1264.01 838.779 c 0,112,113 - 1270.74 837.119 1270.74 837.119 1278 835 c 0,114,115 - 1347.81 814.638 1347.81 814.638 1348.05 740.675 c 0,116,117 - 1348.06 738.365 1348.06 738.365 1348 736 c 0,118,119 - 1343.01 576.009 1343.01 576.009 1216.5 460.5 c 0,120,121 - 1090 344.992 1090 344.992 1030 216 c 0,122,123 - 1024.6 204.557 1024.6 204.557 1024.65 193.874 c 0,124,125 - 1024.76 170.939 1024.76 170.939 1050 151.5 c 0,126,127 - 1063.03 141.468 1063.03 141.468 1082.37 141.534 c 0,128,129 - 1117.97 141.656 1117.97 141.656 1175 176 c 0,130,131 - 1155.01 125 1155.01 125 1091 97 c 0,132,133 - 1026.98 68.9955 1026.98 68.9955 952.5 52.5 c 0,134,135 - 878 36 878 36 810.5 25.5 c 0,136,137 - 743 15 743 15 718 1 c 0,138,139 - 658 -32 658 -32 567 -58 c 0,140,141 - 522.468 -70.7233 522.468 -70.7233 476.5 -70.7546 c 0,142,143 - 428.532 -70.7873 428.532 -70.7873 379 -57 c 0,144,145 - 367 -53 367 -53 343.5 -37 c 0,146,147 - 320 -21 320 -21 315 11 c 0,148,149 - 368 -31 368 -31 410 -27 c 0,150,151 - 452 -23 452 -23 473 -1 c 0,152,153 - 497 25 497 25 456 54.5 c 0,154,155 - 415 84.0001 415 84.0001 353.5 106.5 c 0,156,157 - 292 129 292 129 233.5 138 c 0,158,159 - 189.68 141.609 l 0,160,161 - 170.8 140.934 170.8 140.934 166 134 c 0,162,163 - 152.476 114.369 152.476 114.369 152.56 97.6881 c 0,164,165 - 152.668 76.131 152.668 76.131 175.5 59.5 c 0,166,167 - 216 30 216 30 263 27 c 1,0,1 -887 310 m 1,85,86 - 899 334 899 334 890.5 373 c 0,87,88 - 882 412 882 412 832 394 c 0,89,90 - 781 376 781 376 788 333 c 0,91,92 - 795 290 795 290 818 288 c 0,93,94 - 749 286 749 286 745 349 c 0,95,96 - 739 418 739 418 790 450.5 c 0,97,98 - 841 483 841 483 889 534 c 0,99,100 - 904 551 904 551 945 692.5 c 0,101,102 - 986 834 986 834 968 910 c 0,103,104 - 946 999 946 999 872.5 1038 c 0,105,106 - 799 1077 799 1077 799 1186 c 0,107,108 - 799 1200.99 799 1200.99 817 1212.5 c 0,109,110 - 826.229 1218.4 826.229 1218.4 836.25 1218.38 c 0,111,112 - 845.767 1218.36 845.767 1218.36 856 1213 c 0,113,114 - 840.205 1210.37 840.205 1210.37 839.81 1193.49 c 0,115,116 - 839.755 1191.13 839.755 1191.13 840 1188.5 c 0,117,118 - 842 1167.01 842 1167.01 860 1166 c 0,119,120 - 872.806 1168.21 l 0,121,122 - 884.747 1174.44 884.747 1174.44 884.653 1197.6 c 0,123,124 - 884.553 1222.09 884.553 1222.09 871 1265.5 c 0,125,126 - 839 1367.99 839 1367.99 736 1390 c 0,127,128 - 628 1412.99 628 1412.99 550.5 1369 c 0,129,130 - 473 1325.01 473 1325.01 473 1256 c 0,131,132 - 473 1230.99 473 1230.99 505 1214 c 0,133,134 - 525.872 1202.91 525.872 1202.91 548.866 1202.89 c 0,135,136 - 561.131 1202.87 561.131 1202.87 574 1206 c 0,137,138 - 603.86 1213.31 603.86 1213.31 604.012 1235.48 c 0,139,140 - 604.11 1249.69 604.11 1249.69 592 1270 c 0,141,142 - 628.292 1265.05 628.292 1265.05 628.527 1221.67 c 0,143,144 - 628.577 1212.45 628.577 1212.45 627 1201.5 c 0,145,146 - 618.002 1139.01 618.002 1139.01 585 1126 c 0,147,148 - 547.001 1111 547.001 1111 491 1102 c 0,149,150 - 435.018 1093 435.018 1093 388 1073 c 0,151,152 - 356.003 1059.01 356.003 1059.01 331 996 c 0,153,154 - 306 933 306 933 289.5 859 c 0,155,156 - 273 785 273 785 264.5 719 c 0,157,158 - 256 653 256 653 257 632 c 0,159,160 - 260 542 260 542 312.5 522.5 c 0,161,162 - 365 503 365 503 416 449 c 0,163,164 - 443 420 443 420 441 370.5 c 0,165,166 - 439 321 439 321 402 316 c 0,167,168 - 411.192 332.085 411.192 332.085 411.143 345.2 c 0,169,170 - 411.106 354.915 411.106 354.915 406 363 c 0,171,172 - 394 382 394 382 360 373 c 0,173,174 - 322 363 322 363 328.5 317.5 c 0,175,176 - 335 272 335 272 371 252 c 0,177,178 - 468.098 195.621 468.098 195.621 594.015 195.652 c 0,179,180 - 628.902 195.661 628.902 195.661 666 200 c 0,181,182 - 837 220 837 220 887 310 c 1,85,86 -EndSplineSet -KernsSLIF: 121 -78 0 0 89 -91 0 0 97 -156 0 0 65 -156 0 0 120 -156 0 0 88 -156 0 0 87 -234 0 0 116 -286 0 0 84 -365 0 0 -EndChar -StartChar: P -Encoding: 80 80 61 -Width: 1329 -Flags: MW -VStem: 197 325<73 1477> -Fore -518 874 m 0,0,1 - 606 816 606 816 627 886 c 0,2,3 - 650 964 650 964 611 956.5 c 0,4,5 - 572 949 572 949 555 928 c 0,6,7 - 543 943 543 943 554.5 971.5 c 0,8,9 - 566 1000 566 1000 578 1012 c 0,10,11 - 627 1061.01 627 1061.01 677 1025.5 c 0,12,13 - 726.986 990.005 726.986 990.005 783 974 c 0,14,15 - 852 953 852 953 878.5 1050 c 0,16,17 - 905.001 1147.01 905.001 1147.01 910 1231 c 0,18,19 - 908.901 1282.34 l 0,20,21 - 904.241 1331.41 904.241 1331.41 886 1384.5 c 0,22,23 - 857.997 1466 857.997 1466 788 1505 c 0,24,25 - 746.02 1526.99 746.02 1526.99 701 1528 c 0,26,27 - 656 1529.01 656 1529.01 661 1453 c 0,28,29 - 663 1415 663 1415 696.5 1410.5 c 0,30,31 - 726.891 1410.32 l 0,32,33 - 746.742 1412.61 746.742 1412.61 768 1421 c 0,34,35 - 761.001 1388.01 761.001 1388.01 727 1373.5 c 0,36,37 - 705.194 1364.2 705.194 1364.2 689.55 1364.16 c 0,38,39 - 680.813 1364.13 680.813 1364.13 674 1367 c 0,40,41 - 603.995 1394 603.995 1394 569.5 1438.5 c 0,42,43 - 535.012 1482.99 535.012 1482.99 511 1493 c 0,44,45 - 487.022 1501.95 487.022 1501.95 468.037 1502.06 c 0,46,47 - 451.651 1502.15 451.651 1502.15 438.986 1495.66 c 0,48,49 - 425.329 1488.66 425.329 1488.66 416 1474 c 0,50,51 - 393 1439 393 1439 391.5 1350.5 c 0,52,53 - 394.035 1261.13 l 0,54,55 - 397.399 1214.16 397.399 1214.16 405 1165 c 0,56,57 - 419.999 1068 419.999 1068 449.5 984 c 0,58,59 - 479 900 479 900 518 874 c 0,0,1 -235 -68 m 0,36,37 - 233.325 25.6653 l 0,38,39 - 237.033 178.49 237.033 178.49 283 327.5 c 0,40,41 - 319.793 446.772 319.793 446.772 319.734 573.376 c 0,42,43 - 319.697 653.229 319.697 653.229 305 736 c 0,44,45 - 288.001 824.999 288.001 824.999 232 888 c 0,46,47 - 176 951.001 176 951.001 164 1029 c 0,48,49 - 162.356 1058.78 l 0,50,51 - 163.651 1078.43 163.651 1078.43 170.5 1102 c 0,52,53 - 182.999 1145.01 182.999 1145.01 222 1150 c 0,54,55 - 205.412 1107.34 205.412 1107.34 205.203 1079.82 c 0,56,57 - 205.105 1067.02 205.105 1067.02 208.55 1057.49 c 0,58,59 - 216.453 1035.63 216.453 1035.63 243 1031 c 0,60,61 - 265.996 1030.34 l 0,62,63 - 303.391 1035.78 303.391 1035.78 312 1089 c 0,64,65 - 310.993 1137.94 l 0,66,67 - 308.867 1164.38 308.867 1164.38 304 1202 c 0,68,69 - 293.002 1286.99 293.002 1286.99 266 1363.5 c 0,70,71 - 239.003 1439.99 239.003 1439.99 197 1477 c 0,72,73 - 181.88 1490.32 181.88 1490.32 164.686 1490.29 c 0,74,75 - 134.121 1490.24 134.121 1490.24 97 1448 c 0,76,77 - 59.3301 1404.67 59.3301 1404.67 59.3529 1351.6 c 0,78,79 - 59.3544 1348.32 59.3544 1348.32 59.5 1345 c 0,80,81 - 62 1288 62 1288 83 1261 c 0,82,83 - 101 1237 101 1237 109 1222 c 0,84,85 - 117.003 1206.99 117.003 1206.99 141 1199 c 0,86,87 - 78 1208 78 1208 67.5 1221.5 c 0,88,89 - 56.9847 1235.02 56.9847 1235.02 33 1258 c 0,90,91 - 10.9999 1303 10.9999 1303 10 1340 c 0,92,93 - 12.5953 1401.58 l 0,94,95 - 13.6097 1411.57 13.6097 1411.57 15 1422 c 0,96,97 - 27.0018 1502.01 27.0018 1502.01 71 1555 c 0,98,99 - 176 1676.01 176 1676.01 269 1705 c 0,100,101 - 353.428 1731.32 353.428 1731.32 498.8 1731.28 c 0,102,103 - 513.581 1731.28 513.581 1731.28 529 1731 c 0,104,105 - 694.016 1728 694.016 1728 811 1689.5 c 0,106,107 - 928.032 1650.98 928.032 1650.98 1071 1557 c 0,108,109 - 1142.03 1508.98 1142.03 1508.98 1204 1436 c 0,110,111 - 1238.68 1395.16 1238.68 1395.16 1238.63 1344.64 c 0,112,113 - 1238.59 1304.83 1238.59 1304.83 1217 1259 c 0,114,115 - 1201 1225 1201 1225 1177.5 1206 c 0,116,117 - 1154.01 1187.01 1154.01 1187.01 1103 1183 c 0,118,119 - 1122 1215.99 1122 1215.99 1129.5 1250 c 0,120,121 - 1130.62 1272.67 l 0,122,123 - 1127.86 1294.49 1127.86 1294.49 1110 1315 c 0,124,125 - 1098.99 1326.01 1098.99 1326.01 1065.5 1334 c 0,126,127 - 1032.01 1341.99 1032.01 1341.99 1031 1289 c 0,128,129 - 1032.07 1159.01 l 0,130,131 - 1033.01 1135.15 1033.01 1135.15 1034.5 1111.5 c 0,132,133 - 1035.52 1032.62 l 0,134,135 - 1033.73 983.704 1033.73 983.704 1026 934 c 0,136,137 - 1017 876.978 1017 876.978 968 749.5 c 0,138,139 - 919 622 919 622 836 589 c 0,140,141 - 782 568 782 568 699.5 588 c 0,142,143 - 617 608 617 608 596 671 c 0,144,145 - 653 642 653 642 708 645 c 0,146,147 - 773 648 773 648 777 682 c 0,148,149 - 774.961 695.917 l 0,150,151 - 764.158 721.263 764.158 721.263 701 741 c 0,152,153 - 651 756 651 756 596 745.5 c 0,154,155 - 541 735 541 735 509 694 c 0,156,157 - 485.999 663.998 485.999 663.998 466 566 c 0,158,159 - 454.824 511.235 454.824 511.235 454.889 464.59 c 0,160,161 - 454.941 427.764 454.941 427.764 462 396 c 0,162,163 - 481.006 309.979 481.006 309.979 500.5 233 c 0,164,165 - 520.001 155.999 520.001 155.999 522 73 c 0,166,167 - 525 -94 525 -94 450 -233 c 0,168,169 - 423 -283 423 -283 341.5 -349 c 0,170,171 - 260.001 -415 260.001 -415 201 -415 c 0,172,173 - 287 -373 287 -373 379 -249.5 c 0,174,175 - 442.033 -164.885 442.033 -164.885 442.164 -90.362 c 0,176,177 - 442.224 -56.1152 442.224 -56.1152 429 -24 c 0,178,179 - 405 31 405 31 363 27.5 c 0,180,181 - 321 24 321 24 289 -18 c 0,182,183 - 268 -46 268 -46 275.5 -98.5 c 0,184,185 - 283 -151 283 -151 294 -175 c 0,186,187 - 239.001 -134.001 239.001 -134.001 235 -68 c 0,36,37 -EndSplineSet -KernsSLIF: 45 -208 0 0 46 -260 0 0 44 -286 0 0 116 -91 0 0 84 -195 0 0 321 -363 0 0 322 -363 0 0 65 -342 0 0 97 -363 0 0 -EndChar -StartChar: Q -Encoding: 81 81 32 -Width: 1255 -Flags: W -Fore -946 1665 m 1,0,1 - 972.261 1677.88 972.261 1677.88 999.749 1678 c 0,2,3 - 1023.34 1678.1 1023.34 1678.1 1047.83 1668.8 c 0,4,5 - 1052.4 1667.06 1052.4 1667.06 1057 1665 c 0,6,7 - 1162 1612.99 1162 1612.99 1162 1503 c 0,8,9 - 1162 1424.01 1162 1424.01 1114 1225 c 0,10,11 - 1066.03 1026.12 1066.03 1026.12 1050 953 c 0,12,13 - 1042.99 921 1042.99 921 1039.5 875 c 0,14,15 - 1036.01 829 1036.01 829 1077 826 c 0,16,17 - 1100.59 827.702 l 0,18,19 - 1139.62 837.667 1139.62 837.667 1139.65 898.428 c 0,20,21 - 1139.65 906.288 1139.65 906.288 1139 915 c 0,22,23 - 1170.9 877.5 1170.9 877.5 1171.01 822.931 c 0,24,25 - 1171.1 779.997 1171.1 779.997 1151.5 726.5 c 0,26,27 - 1107 605.014 1107 605.014 1107 504 c 0,28,29 - 1107 402.008 1107 402.008 1139 350.5 c 0,30,31 - 1170.99 299 1170.99 299 1163 239 c 0,32,33 - 1152.01 149.012 1152.01 149.012 1110 77.5 c 0,34,35 - 1086.04 36.7115 1086.04 36.7115 1040.93 36.4396 c 0,36,37 - 1024.38 36.3399 1024.38 36.3399 1005 41.6884 c 0,38,39 - 984.575 47.3221 984.575 47.3221 961 59 c 0,40,41 - 1067.99 61 1067.99 61 1055.5 138 c 0,42,43 - 1043.33 212.974 1043.33 212.974 1001 214 c 0,44,45 - 983 214 983 214 942 177.5 c 0,46,47 - 901 141.001 901 141.001 901 95 c 0,48,49 - 899 34 899 34 925 15 c 0,50,51 - 951 -4.00001 951 -4.00001 985 -23 c 0,52,53 - 1018.99 -41.9901 1018.99 -41.9901 1050 -81.5 c 0,54,55 - 1080.99 -120.985 1080.99 -120.985 1091 -223 c 0,56,57 - 1055 -129.996 1055 -129.996 979 -79.5 c 0,58,59 - 903 -29 903 -29 877 -98 c 0,60,61 - 859 -144.999 859 -144.999 956.5 -251 c 0,62,63 - 1054 -357 1054 -357 1183 -365 c 0,64,65 - 1121.24 -362.563 l 0,66,67 - 1028.23 -352.747 1028.23 -352.747 951.5 -305.5 c 0,68,69 - 850 -243 850 -243 782 -175 c 0,70,71 - 723.983 -116.983 723.983 -116.983 724 -55 c 0,72,73 - 725 6.00005 725 6.00005 698 16 c 0,74,75 - 684.054 21.1892 684.054 21.1892 671.37 21.1191 c 0,76,77 - 644.946 20.973 644.946 20.973 624 -2 c 0,78,79 - 593 -36 593 -36 522 -50 c 0,80,81 - 244 -101 244 -101 220 54 c 0,82,83 - 286 0 286 0 337 21 c 0,84,85 - 388 42 388 42 355 114 c 0,86,87 - 351.005 121.989 351.005 121.989 332 173.5 c 0,88,89 - 313 224.999 313 224.999 287 283 c 0,90,91 - 261 341 261 341 232.5 387.5 c 0,92,93 - 204.564 433.08 204.564 433.08 182 433 c 0,94,95 - 99.0005 424 99.0005 424 123 346.5 c 0,96,97 - 147 269 147 269 207 269 c 0,98,99 - 187.571 253.572 187.571 253.572 167.49 253.49 c 0,100,101 - 152.429 253.429 152.429 253.429 137 262 c 0,102,103 - 101 282 101 282 95 291 c 0,104,105 - 42 354 42 354 65 457 c 0,106,107 - 71 489 71 489 93.5 559 c 0,108,-1 - 138.5 705 l 0,109,110 - 160.999 780.995 160.999 780.995 175.5 848.5 c 0,111,112 - 190.001 916 190.001 916 180 944 c 0,113,114 - 166.999 979 166.999 979 117.5 979 c 0,115,116 - 68 979 68 979 58 932 c 0,117,118 - 39 851 39 851 120 839 c 0,119,120 - 102 815 102 815 39.5 836 c 0,121,122 - -23 857 -23 857 -22 937 c 0,123,124 - -17.9997 1101.01 -17.9997 1101.01 94.5 1220 c 0,125,126 - 206.996 1338.99 206.996 1338.99 261 1471 c 0,127,128 - 276 1507 276 1507 241 1522 c 0,129,130 - 206.001 1537 206.001 1537 154 1459 c 0,131,132 - 158.999 1543 158.999 1543 213.5 1582 c 0,133,134 - 268.01 1621.01 268.01 1621.01 335 1638 c 0,135,136 - 402.083 1655.02 402.083 1655.02 462.5 1663 c 0,137,138 - 522.996 1670.99 522.996 1670.99 540 1692 c 0,139,140 - 572 1732.01 572 1732.01 504 1761 c 0,141,142 - 482.218 1770.29 482.218 1770.29 461.258 1770.34 c 0,143,144 - 423.561 1770.44 423.561 1770.44 388.522 1740.68 c 0,145,146 - 382.218 1735.32 382.218 1735.32 376 1729 c 0,147,148 - 382.001 1806.01 382.001 1806.01 465.5 1821.5 c 0,149,150 - 549 1836.99 549 1836.99 587 1820 c 0,151,152 - 656 1787 656 1787 697 1740.5 c 0,153,154 - 738.065 1693.93 738.065 1693.93 756 1672 c 0,155,156 - 819.012 1591.99 819.012 1591.99 912.5 1554 c 0,157,158 - 958.669 1535.24 958.669 1535.24 988.622 1535.25 c 0,159,160 - 1019.33 1535.26 1019.33 1535.26 1033 1555 c 0,161,162 - 1046.31 1574.97 1046.31 1574.97 1046.33 1592.08 c 0,163,164 - 1046.36 1613.54 1046.36 1613.54 1025.5 1630.5 c 0,165,166 - 988 1660.99 988 1660.99 946 1665 c 0,167,-1 - 946 1665 l 1,0,1 -735 1510 m 0,105,106 - 636 1511.01 636 1511.01 529.5 1478.5 c 0,107,108 - 422.998 1445.99 422.998 1445.99 389 1374 c 0,109,110 - 377 1350 377 1350 384.5 1309.5 c 0,111,112 - 389.617 1281.87 389.617 1281.87 412.654 1281.93 c 0,113,114 - 423.383 1281.96 423.383 1281.96 438 1288 c 0,115,116 - 476.322 1303.68 476.322 1303.68 476.716 1339.08 c 0,117,118 - 476.774 1344.32 476.774 1344.32 476 1350 c 0,119,120 - 469.999 1394 469.999 1394 451 1397 c 0,121,122 - 475.763 1394.05 l 0,123,124 - 512.154 1383.46 512.154 1383.46 516 1335 c 0,125,126 - 514.434 1298.61 l 0,127,128 - 507.433 1254.61 507.433 1254.61 474.5 1230 c 0,129,130 - 428.988 1195.99 428.988 1195.99 387 1145 c 0,131,132 - 371.997 1127 371.997 1127 332.5 980.5 c 0,133,134 - 304.311 875.949 304.311 875.949 304.388 806.797 c 0,135,136 - 304.418 779.049 304.418 779.049 309 757 c 0,137,138 - 328.001 664.999 328.001 664.999 402.5 593 c 0,139,140 - 477 521 477 521 477 410 c 0,141,142 - 477 395 477 395 460.5 382.5 c 0,143,144 - 444 370 444 370 426 382 c 0,145,146 - 441 385 441 385 439 407 c 0,147,148 - 437 429 437 429 422 431 c 0,149,150 - 383 434 383 434 376 361.5 c 0,151,152 - 369 289 369 289 435 243 c 0,153,154 - 476 213 476 213 527 201 c 0,155,156 - 578 189 578 189 608 204 c 0,157,158 - 667 229.999 667 229.999 656 285 c 0,159,160 - 645 340 645 340 582 376 c 0,161,162 - 678 371 678 371 691.5 318.5 c 0,163,164 - 705 266 705 266 768 262 c 0,165,166 - 807 259 807 259 826.5 295 c 0,167,168 - 846 331 846 331 846 349 c 0,169,170 - 846 373.999 846 373.999 817 391.5 c 0,171,172 - 797.184 403.458 797.184 403.458 776.433 403.509 c 0,173,174 - 766.817 403.533 766.817 403.533 757 401 c 0,175,176 - 729.121 393.121 729.121 393.121 728.791 370.55 c 0,177,178 - 732.807 350.482 l 0,179,180 - 735.501 343.222 735.501 343.222 740 335 c 0,181,182 - 706.857 339.971 706.857 339.971 706.668 384.761 c 0,183,184 - 706.629 394.028 706.629 394.028 708 405 c 0,185,186 - 716 469 716 469 746 483 c 0,187,188 - 779 498 779 498 846 517.5 c 0,189,190 - 913 537 913 537 937 598 c 0,191,192 - 961 661 961 661 940 875.5 c 0,193,194 - 919 1089.99 919 1089.99 810 1232 c 0,195,196 - 787.5 1260.13 787.5 1260.13 787.412 1305.83 c 0,197,198 - 787.406 1308.88 787.406 1308.88 787.5 1312 c 0,199,200 - 789 1362 789 1362 822 1368 c 0,201,202 - 813.495 1350.99 813.495 1350.99 813.349 1337.68 c 0,203,204 - 813.25 1328.63 813.25 1328.63 818 1319.5 c 0,205,206 - 825.334 1307.17 825.334 1307.17 841.555 1307.06 c 0,207,208 - 849.667 1307 849.667 1307 860 1310 c 0,209,210 - 893 1320.01 893 1320.01 893 1371 c 0,211,212 - 893 1421.99 893 1421.99 869 1450 c 0,213,214 - 845.986 1476.01 845.986 1476.01 805.5 1493 c 0,215,216 - 764.988 1510 764.988 1510 735 1510 c 0,105,106 -EndSplineSet -EndChar -StartChar: R -Encoding: 82 82 57 -Width: 1327 -Flags: MW -VStem: 112 318<-13 1619> -Fore -1128 -43 m 0,0,1 - 1125 20.0058 1125 20.0058 1077.5 71.5 c 0,2,3 - 1029.99 123.002 1029.99 123.002 969 136 c 0,4,5 - 942.51 137.844 l 0,6,7 - 911.739 135.321 911.739 135.321 893.5 108.5 c 0,8,9 - 868 71 868 71 903 37 c 0,10,11 - 933 7 933 7 951 20 c 0,12,13 - 969 33 969 33 987 57 c 0,14,15 - 1005 -25 1005 -25 930 -45 c 0,16,17 - 855 -65 855 -65 813 -4 c 0,18,19 - 780 44 780 44 770.5 108.5 c 0,20,21 - 761 173 761 173 745 227 c 0,22,23 - 716.999 318.002 716.999 318.002 642.5 454 c 0,24,25 - 568 590 568 590 472 611 c 0,26,27 - 436 617 436 617 386 598.5 c 0,28,29 - 337.069 580.396 337.069 580.396 337 505 c 0,30,31 - 337 368 337 368 381 245 c 0,32,33 - 425 122 425 122 416 -26 c 0,34,35 - 411.001 -102.999 411.001 -102.999 341.5 -186 c 0,36,37 - 272 -269.001 272 -269.001 200 -295 c 0,38,39 - 147.999 -313 147.999 -313 102 -320.5 c 0,40,41 - 55.9999 -328 55.9999 -328 -1 -319 c 0,42,43 - 64 -309 64 -309 138 -277 c 0,44,45 - 181.001 -256 181.001 -256 248.5 -196.5 c 0,46,47 - 316.001 -136.999 316.001 -136.999 321 -47 c 0,48,49 - 324 14 324 14 310 68 c 0,50,51 - 296 122 296 122 220 121 c 0,52,53 - 161.371 119.046 161.371 119.046 161 33.5 c 0,54,55 - 162.001 -52.0001 162.001 -52.0001 222 -74 c 0,56,57 - 185.921 -72.0319 l 0,58,59 - 160.223 -67.6052 160.223 -67.6052 146 -54 c 0,60,61 - 122.998 -31.9977 122.998 -31.9977 112 -13 c 0,62,63 - 87.1224 30.6532 87.1224 30.6532 87.0314 92.7034 c 0,64,65 - 86.9318 160.706 86.9318 160.706 116.602 250.804 c 0,66,67 - 117.536 253.642 117.536 253.642 118.5 256.5 c 0,68,69 - 177.998 432.992 177.998 432.992 200 529 c 0,70,71 - 213.298 586.794 213.298 586.794 213.255 619.738 c 0,72,73 - 213.214 651.206 213.214 651.206 201 660 c 0,74,75 - 189.636 668.182 189.636 668.182 179.512 668.306 c 0,76,77 - 171.681 668.402 171.681 668.402 164.591 663.676 c 0,78,79 - 160.683 661.07 160.683 661.07 157 657 c 0,80,81 - 138.001 636.001 138.001 636.001 135.5 602 c 0,82,83 - 136.939 576.347 l 0,84,85 - 140.286 561.572 140.286 561.572 150 553 c 0,86,87 - 81 556 81 556 73.5 615.5 c 0,88,89 - 66 675 66 675 75 710 c 0,90,91 - 88.9999 771 88.9999 771 129 837.5 c 0,92,93 - 168.998 903.996 168.998 903.996 185 966 c 0,94,95 - 209 1063.01 209 1063.01 200 1164 c 0,96,97 - 187.999 1302.01 187.999 1302.01 165.5 1448 c 0,98,99 - 161.539 1473.7 161.539 1473.7 161.56 1498.62 c 0,100,101 - 161.659 1615.3 161.659 1615.3 249 1715 c 0,102,103 - 332.004 1811.01 332.004 1811.01 498.5 1823.5 c 0,104,105 - 542.128 1823.16 l 0,106,107 - 666.124 1810.3 666.124 1810.3 673 1653 c 0,108,109 - 633 1746 633 1746 526 1740 c 0,110,111 - 429.612 1734.6 429.612 1734.6 428.979 1640.74 c 0,112,113 - 428.909 1630.41 428.909 1630.41 430 1619 c 0,114,115 - 433 1582 433 1582 480 1559.5 c 0,116,117 - 527.013 1536.99 527.013 1536.99 583 1530.5 c 0,118,119 - 634.872 1528.19 l 0,120,121 - 661.46 1529.07 661.46 1529.07 685.5 1534.5 c 0,122,123 - 732 1545 732 1545 734 1575 c 0,124,125 - 730.88 1592.46 l 0,126,127 - 720.662 1615.48 720.662 1615.48 677.121 1615.69 c 0,128,129 - 669.123 1615.73 669.123 1615.73 660 1615 c 0,130,131 - 696.965 1635.92 696.965 1635.92 737.127 1635.89 c 0,132,133 - 779.53 1635.87 779.53 1635.87 825.5 1612.5 c 0,134,135 - 914.997 1567.01 914.997 1567.01 949 1468 c 0,136,137 - 974.001 1390 974.001 1390 1011 1367.5 c 0,138,139 - 1047.99 1345.01 1047.99 1345.01 1111 1288 c 0,140,141 - 1137.99 1262.01 1137.99 1262.01 1149.5 1203.5 c 0,142,143 - 1150.82 1178.98 l 0,144,145 - 1146.53 1137.32 1146.53 1137.32 1095 1110 c 0,146,147 - 1121.6 1139.56 1121.6 1139.56 1121.65 1165.79 c 0,148,149 - 1121.68 1183.94 1121.68 1183.94 1109 1200.5 c 0,150,151 - 1088.51 1227.26 1088.51 1227.26 1070.66 1227.17 c 0,152,153 - 1061.48 1227.12 1061.48 1227.12 1053 1220 c 0,154,155 - 1037.03 1206.94 1037.03 1206.94 1036.99 1173.85 c 0,156,157 - 1036.94 1138.57 1036.94 1138.57 1055 1080.5 c 0,158,159 - 1089.99 968 1089.99 968 1064 859 c 0,160,161 - 1038.99 757 1038.99 757 945.5 742.5 c 0,162,163 - 852 728 852 728 813 764 c 0,164,165 - 854.001 765 854.001 765 885 788.5 c 0,166,167 - 916 812 916 812 907 857 c 0,168,169 - 892 927 892 927 809 855.5 c 0,170,171 - 726 784 726 784 738 710 c 0,172,173 - 744 666 744 666 803.5 620 c 0,174,175 - 863 574 863 574 887 593 c 0,176,177 - 897.886 601.165 897.886 601.165 898.107 612.144 c 0,178,179 - 894.131 627.135 l 0,180,181 - 892.791 629.758 892.791 629.758 891 632.5 c 0,182,183 - 875 657 875 657 833 657 c 0,184,185 - 837 687 837 687 889 687 c 0,186,187 - 941 687 941 687 967 659 c 0,188,189 - 1000 620 1000 620 991 539 c 0,190,191 - 982 458 982 458 982 408 c 0,192,193 - 982 300.001 982 300.001 1059 269.5 c 0,194,195 - 1135.99 239.001 1135.99 239.001 1191 158 c 0,196,197 - 1234 94.0096 1234 94.0096 1249 7.5 c 0,198,199 - 1257.42 -41.0666 1257.42 -41.0666 1257.33 -82.5396 c 0,200,201 - 1257.26 -114.933 1257.26 -114.933 1252 -143 c 0,202,203 - 1196.01 -418.993 1196.01 -418.993 985.5 -531 c 0,204,205 - 775.003 -642.999 775.003 -642.999 531 -677 c 0,206,207 - 771.001 -609.999 771.001 -609.999 956.5 -466.5 c 0,208,209 - 1128.86 -333.171 1128.86 -333.171 1128.98 -81.9849 c 0,210,211 - 1128.99 -62.8342 1128.99 -62.8342 1128 -43 c 0,0,1 -596 909 m 0,125,126 - 622 881 622 881 659.5 894.5 c 0,127,128 - 697 908 697 908 739 937 c 0,129,130 - 788 971 788 971 817.5 1042.5 c 0,131,132 - 846.999 1114 846.999 1114 852.5 1183.5 c 0,133,134 - 853.032 1236.31 l 0,135,136 - 850.538 1272.97 850.538 1272.97 839.5 1302.5 c 0,137,138 - 824.154 1343.56 824.154 1343.56 789.89 1343.68 c 0,139,140 - 782.845 1343.71 782.845 1343.71 775 1342 c 0,141,142 - 736 1333 736 1333 732.5 1301.5 c 0,143,144 - 734.396 1286.82 l 0,145,146 - 743.097 1264.03 743.097 1264.03 788 1245 c 0,147,148 - 704 1231.99 704 1231.99 664.5 1276.5 c 0,149,150 - 625.002 1321 625.002 1321 584 1347 c 0,151,152 - 543.637 1371.84 543.637 1371.84 506.754 1372.04 c 0,153,154 - 488.577 1372.14 488.577 1372.14 471.246 1366.26 c 0,155,156 - 455.786 1361.01 455.786 1361.01 441 1351 c 0,157,158 - 376.004 1307.01 376.004 1307.01 346 1215 c 0,159,160 - 331 1171.01 331 1171.01 322 1032 c 0,161,162 - 313 893 313 893 394 878 c 0,163,164 - 420.822 875.578 l 0,165,166 - 464.908 878.309 464.908 878.309 465.305 934.977 c 0,167,168 - 465.342 940.254 465.342 940.254 465 946 c 0,169,170 - 461.845 983.859 461.845 983.859 419.498 984.392 c 0,171,172 - 394 982 l 0,173,174 - 395.633 992.939 l 0,175,176 - 401.858 1006 401.858 1006 429 1016 c 0,177,178 - 449.668 1023.61 449.668 1023.61 464.713 1023.54 c 0,179,180 - 477.334 1023.47 477.334 1023.47 486 1018 c 0,181,182 - 561 967 561 967 552.5 965.5 c 0,183,184 - 544 964 544 964 596 909 c 0,125,126 -EndSplineSet -KernsSLIF: 89 -143 0 0 121 -130 0 0 83 -208 0 0 71 -104 0 0 116 -286 0 0 84 -313 0 0 86 -22 0 0 87 -150 0 0 -EndChar -StartChar: S -Encoding: 83 83 15 -Width: 1364 -Flags: HW -Fore -598 -86 m 0,0,1 - 580 -78.0001 580 -78.0001 553.5 -52 c 0,2,3 - 531.24 -30.1606 531.24 -30.1606 531.206 -9.7312 c 0,4,5 - 531.2 -5.8401 531.2 -5.8401 532 -2 c 0,6,7 - 556.993 -17.9955 556.993 -17.9955 582 -36.5 c 0,8,9 - 594 -45.38 594 -45.38 606 -45.62 c 0,10,11 - 622 -42.1 l 0,12,13 - 627 -39.8 627 -39.8 632 -36 c 0,14,15 - 649.627 -22.339 649.627 -22.339 649.777 -9.26058 c 0,16,17 - 649.872 -0.893791 649.872 -0.893791 642.815 7.23458 c 0,18,19 - 635.87 15.2327 635.87 15.2327 622 23 c 0,20,21 - 572 51 572 51 493 79 c 0,22,-1 - 335.5 134 l 0,23,24 - 256.999 161 256.999 161 240 188 c 0,25,26 - 211.999 230 211.999 230 219 294.5 c 0,27,28 - 226 359 226 359 283 372 c 0,29,30 - 283.268 329.648 l 0,31,32 - 286.957 296.146 286.957 296.146 303 278.5 c 0,33,34 - 328 251 328 251 403 274 c 0,35,36 - 445 286 445 286 436.5 339 c 0,37,38 - 427.999 392.001 427.999 392.001 414 421 c 0,39,40 - 384 481 384 481 302.5 515.5 c 0,41,42 - 221.001 550 221.001 550 157 560 c 0,43,44 - 122.001 565 122.001 565 83.5 557.5 c 0,45,46 - 45 550 45 550 8 542 c 0,47,48 - 79 596 79 596 130.5 595.5 c 0,49,50 - 182.001 595 182.001 595 200 594 c 0,51,52 - 248 591 248 591 326.5 558 c 0,53,54 - 405 525 405 525 438 494 c 0,55,56 - 492.001 441.998 492.001 441.998 546 351 c 0,57,58 - 599.621 260.638 599.621 260.638 666 208 c 0,59,60 - 704 176.999 704 176.999 783 160 c 0,61,62 - 809.78 154.237 809.78 154.237 831.963 154.22 c 0,63,64 - 875.22 154.187 875.22 154.187 901 176 c 0,65,66 - 998 261.999 998 261.999 1013 374.5 c 0,67,68 - 1028 487 1028 487 992 570 c 0,69,70 - 974 612 974 612 893.5 669 c 0,71,72 - 813 726 813 726 754 729 c 0,73,74 - 721.157 727.957 l 0,75,76 - 684 721.514 684 721.514 684 688 c 0,77,78 - 684 637 684 637 705 625.5 c 0,79,-1 - 764 593 l 0,80,81 - 740.845 584.699 740.845 584.699 718.262 584.796 c 0,82,83 - 689.155 584.922 689.155 584.922 661 599 c 0,84,85 - 611 624 611 624 592 672 c 0,86,-1 - 546.5 782 l 0,87,88 - 510 870 510 870 460.5 963 c 0,89,90 - 411.009 1055.98 411.009 1055.98 356.5 1124.5 c 0,91,92 - 311.764 1180.73 311.764 1180.73 272.75 1180.69 c 0,93,94 - 264.239 1180.69 264.239 1180.69 256 1178 c 0,95,96 - 220.5 1166.49 220.5 1166.49 220.442 1108.94 c 0,97,98 - 220.439 1106.51 220.439 1106.51 220.5 1104 c 0,99,100 - 222 1041.99 222 1041.99 256 1034 c 0,101,102 - 231.657 1031.21 l 0,103,104 - 199.094 1032.81 199.094 1032.81 182 1067 c 0,105,106 - 159 1113.01 159 1113.01 159 1134 c 0,107,108 - 159 1199 159 1199 174 1247 c 0,109,110 - 189 1295 189 1295 213 1343 c 0,111,112 - 270.997 1462.99 270.997 1462.99 412.5 1566 c 0,113,114 - 554 1669.01 554 1669.01 611 1704 c 0,115,116 - 689.946 1749.97 689.946 1749.97 763 1779.5 c 0,117,118 - 836 1809.01 836 1809.01 1021 1775 c 0,119,120 - 1123.01 1755.99 1123.01 1755.99 1179 1697 c 0,121,122 - 1235 1638 1235 1638 1241 1590 c 0,123,124 - 1170.01 1684.01 1170.01 1684.01 1043 1644 c 0,125,126 - 1000.99 1630.99 1000.99 1630.99 980 1586.5 c 0,127,128 - 959 1541.99 959 1541.99 963 1495 c 0,129,130 - 972.959 1370.96 972.959 1370.96 1086.21 1370.29 c 0,131,132 - 1098.04 1370.22 1098.04 1370.22 1111 1371.5 c 0,133,134 - 1247.98 1385 1247.98 1385 1338 1414 c 0,135,136 - 1283 1338 1283 1338 1180 1315.5 c 0,137,138 - 1110.41 1300.3 1110.41 1300.3 1067.29 1300.39 c 0,139,140 - 1046.6 1300.43 1046.6 1300.43 1032 1304 c 0,141,142 - 943.012 1323.99 943.012 1323.99 902 1366.5 c 0,143,144 - 861 1408.99 861 1408.99 803 1461 c 0,145,146 - 761.569 1497.43 761.569 1497.43 707.898 1497.38 c 0,147,148 - 686.428 1497.36 686.428 1497.36 663 1491.5 c 0,149,150 - 580.997 1470.99 580.997 1470.99 545 1396 c 0,151,152 - 519 1340 519 1340 509.5 1233.5 c 0,153,154 - 508.766 1185.28 l 0,155,156 - 513.672 1116.51 513.672 1116.51 556 1084 c 0,157,158 - 651.097 1007.76 651.097 1007.76 701.05 1007.84 c 0,159,160 - 709.406 1007.85 709.406 1007.85 716.5 1010 c 0,161,162 - 766 1025 766 1025 839 1016 c 0,163,164 - 880 1010 880 1010 922 975 c 0,165,166 - 964 940 964 940 941 883 c 0,167,168 - 914 952 914 952 883 955.5 c 0,169,170 - 861.719 954.539 l 0,171,172 - 845.625 950.75 845.625 950.75 835 937 c 0,173,174 - 802 895 802 895 901.5 820 c 0,175,176 - 1001 745 1001 745 1040 733 c 0,177,178 - 1057.62 726.748 1057.62 726.748 1077.66 726.795 c 0,179,180 - 1092.88 726.831 1092.88 726.831 1109.5 730.5 c 0,181,182 - 1124.23 733.752 1124.23 733.752 1124.54 745.418 c 0,183,184 - 1120.41 761.043 l 0,185,186 - 1112.25 778.324 1112.25 778.324 1088 805 c 0,187,188 - 1169.99 797.002 1169.99 797.002 1178.5 720 c 0,189,190 - 1187.01 643 1187.01 643 1177 597 c 0,191,192 - 1168 559 1168 559 1154.5 451 c 0,193,194 - 1150.46 418.662 1150.46 418.662 1150.5 389.819 c 0,195,196 - 1150.58 322.343 1150.58 322.343 1173 274 c 0,197,198 - 1198 217.001 1198 217.001 1222.5 204 c 0,199,200 - 1247.01 190.994 1247.01 190.994 1261 104 c 0,201,202 - 1265.01 72.0001 1265.01 72.0001 1243 6.5 c 0,203,204 - 1220.99 -59.0006 1220.99 -59.0006 1146 -68 c 0,205,206 - 1159.01 -44 1159.01 -44 1198.5 14 c 0,207,208 - 1211.67 33.3338 1211.67 33.3338 1211.67 47.4445 c 0,209,210 - 1211.67 75.6671 1211.67 75.6671 1159 83 c 0,211,212 - 1127.99 86 1127.99 86 1099 43 c 0,213,214 - 1067 -5 l 0,215,216 - 1002.99 -102.001 1002.99 -102.001 853 -118.5 c 0,217,218 - 703 -135 703 -135 598 -86 c 0,0,1 -EndSplineSet -KernsSLIF: 69 52 0 0 101 39 0 0 83 -117 0 0 116 -182 0 0 84 -65 0 0 -EndChar -StartChar: T -Encoding: 84 84 83 -Width: 1699 -Flags: MW -HStem: 1371 258<399 1229> -VStem: 705 217.5<139 1333> -Fore -705 139 m 0,0,1 - 725.954 259.212 725.954 259.212 725.928 369.54 c 0,2,3 - 725.906 459.29 725.906 459.29 712 542.5 c 0,4,5 - 681 728 681 728 631 926 c 0,6,7 - 620 965 620 965 632 1042.5 c 0,8,9 - 643.026 1113.72 643.026 1113.72 696.275 1114.42 c 0,10,11 - 700.974 1114.49 700.974 1114.49 706 1114 c 0,12,13 - 697 1114 697 1114 684.5 1091.5 c 0,14,15 - 673.19 1071.14 673.19 1071.14 673 1060 c 0,16,17 - 675.939 1014.92 675.939 1014.92 711.5 1010 c 0,18,19 - 725.288 1011.93 l 0,20,21 - 744.108 1020.83 744.108 1020.83 744.233 1066.63 c 0,22,23 - 744.248 1072.06 744.248 1072.06 744 1078 c 0,24,25 - 743.001 1100.95 743.001 1100.95 742 1158.5 c 0,26,27 - 740.999 1216.01 740.999 1216.01 731.5 1272 c 0,28,29 - 722.001 1327.99 722.001 1327.99 700.5 1366.5 c 0,30,31 - 679 1405.01 679 1405.01 637 1392 c 0,32,33 - 622 1387.01 622 1387.01 530 1380 c 0,34,35 - 438 1372.99 438 1372.99 399 1371 c 0,36,37 - 356.557 1372.66 l 0,38,39 - 304.306 1379.74 304.306 1379.74 259.5 1412 c 0,40,41 - 218.599 1441.45 218.599 1441.45 218.597 1490.6 c 0,42,43 - 218.596 1516.55 218.596 1516.55 230 1548 c 0,44,45 - 230 1463.01 230 1463.01 275 1459 c 0,46,47 - 301.917 1458.98 l 0,48,49 - 336.366 1464.11 336.366 1464.11 336.475 1500.02 c 0,50,51 - 336.498 1507.58 336.498 1507.58 335 1516.5 c 0,52,53 - 324.001 1582 324.001 1582 287 1594 c 0,54,55 - 194 1622 194 1622 138 1627 c 0,56,57 - 106.672 1625.72 l 0,58,59 - 60.8195 1618.5 60.8195 1618.5 2 1581 c 0,60,61 - 24.9947 1632.99 24.9947 1632.99 83 1653.5 c 0,62,63 - 133.741 1671.44 133.741 1671.44 175.312 1671.38 c 0,64,65 - 181.25 1671.37 181.25 1671.37 187 1671 c 0,66,67 - 392.272 1652.98 392.272 1652.98 641 1626.5 c 0,68,69 - 817.488 1607.71 817.488 1607.71 957.858 1607.77 c 0,70,71 - 1015.48 1607.8 1015.48 1607.8 1067 1611 c 0,72,73 - 1160 1615.99 1160 1615.99 1229 1629 c 0,74,75 - 1270.13 1636.75 1270.13 1636.75 1317.67 1636.68 c 0,76,77 - 1349.86 1636.64 1349.86 1636.64 1385 1633 c 0,78,79 - 1485.29 1621 1485.29 1621 1485.65 1571.16 c 0,80,81 - 1485.72 1562.86 1485.72 1562.86 1483 1553.5 c 0,82,83 - 1467.25 1499.22 1467.25 1499.22 1464 1501 c 0,84,85 - 1459.01 1586.99 1459.01 1586.99 1387.5 1573 c 0,86,87 - 1316 1559.01 1316 1559.01 1307 1530 c 0,88,89 - 1302.26 1515.52 1302.26 1515.52 1302.17 1502.75 c 0,90,91 - 1302.07 1489.7 1302.07 1489.7 1306.81 1478.42 c 0,92,93 - 1315.06 1458.77 1315.06 1458.77 1338 1444.5 c 0,94,95 - 1387.01 1414.01 1387.01 1414.01 1450.5 1414.5 c 0,96,97 - 1513.99 1414.99 1513.99 1414.99 1566 1449.5 c 0,98,99 - 1608.59 1477.75 1608.59 1477.75 1608.92 1533.85 c 0,100,101 - 1608.99 1546.24 1608.99 1546.24 1607 1560 c 0,102,103 - 1611.51 1543.45 1611.51 1543.45 1611.5 1523.93 c 0,104,105 - 1611.47 1491.55 1611.47 1491.55 1599 1451 c 0,106,107 - 1579.01 1386.01 1579.01 1386.01 1484 1358 c 0,108,109 - 1393.64 1330.95 1393.64 1330.95 1315.57 1330.98 c 0,110,111 - 1249.36 1331 1249.36 1331 1192 1350.5 c 0,112,113 - 1067.01 1392.99 1067.01 1392.99 968 1394 c 0,114,115 - 923 1394 923 1394 922.5 1333 c 0,116,117 - 925.664 1227.25 l 0,118,119 - 926.274 1218.14 926.274 1218.14 927 1209 c 0,120,121 - 927 1208.01 927 1208.01 936 1130.5 c 0,122,123 - 944.999 1053.01 944.999 1053.01 1029 941 c 0,124,125 - 1068 889 1068 889 1047 764.5 c 0,126,127 - 1026 640 1026 640 928 653 c 0,128,129 - 992.426 653 992.426 653 992.628 741.926 c 0,130,131 - 992.648 751 992.648 751 992 761 c 0,132,133 - 985 869 985 869 935 827 c 0,134,135 - 899 797 899 797 892.5 771.5 c 0,136,137 - 886 746 886 746 891 671 c 0,138,139 - 901.999 494.004 901.999 494.004 941.5 392.5 c 0,140,141 - 975.036 306.325 975.036 306.325 975.054 132.577 c 0,142,143 - 975.057 101.673 975.057 101.673 974 68 c 0,144,145 - 968 -93.9994 968 -93.9994 861 -122 c 0,146,147 - 913.644 -62.4528 913.644 -62.4528 913.78 -24.1307 c 0,148,149 - 913.801 -18.048 913.801 -18.048 912.5 -12.5 c 0,150,151 - 903.001 27.9999 903.001 27.9999 869.5 34.5 c 0,152,153 - 836 41 836 41 801.5 11 c 0,154,155 - 767 -19 767 -19 779 -94 c 0,156,157 - 806 -273 806 -273 858.5 -319.5 c 0,158,159 - 911 -366 911 -366 944 -399 c 0,160,161 - 801 -369 801 -369 740.5 -184 c 0,162,163 - 697.607 -52.8381 697.607 -52.8381 697.69 54.6971 c 0,164,165 - 697.724 98.8389 697.724 98.8389 705 139 c 0,0,1 -EndSplineSet -KernsSLIF: 322 -391 0 0 321 -469 0 0 85 -117 0 0 117 -143 0 0 104 -234 0 0 72 -156 0 0 45 -300 0 0 46 -260 0 0 44 -260 0 0 243 -300 0 0 211 -208 0 0 115 -286 0 0 83 -260 0 0 111 -208 0 0 79 -143 0 0 65 -512 0 0 97 -512 0 0 -EndChar -StartChar: U -Encoding: 85 85 68 -Width: 1411 -Flags: W -Fore -46 241 m 0,0,1 - -23 339 -23 339 50.5 416.5 c 0,2,3 - 124 494 124 494 164 494 c 0,4,5 - 118.001 458.001 118.001 458.001 103.5 368.5 c 0,6,7 - 88.9999 279 88.9999 279 192 310 c 0,8,9 - 222 319 222 319 232 422 c 0,10,11 - 237.34 477.005 237.34 477.005 237.262 527.732 c 0,12,13 - 237.194 571.994 237.194 571.994 233 613 c 0,14,15 - 224 705 224 705 177.5 757 c 0,16,17 - 164.022 772.073 164.022 772.073 155.879 772.61 c 0,18,19 - 149.279 769.765 l 0,20,21 - 143.401 762.964 143.401 762.964 143.449 740.018 c 0,22,23 - 148 688 l 0,24,25 - 64 754 64 754 96 903 c 0,26,27 - 119.323 1011.6 119.323 1011.6 119.273 1144.11 c 0,28,29 - 119.254 1193.4 119.254 1193.4 116 1246 c 0,30,31 - 113.225 1341.01 l 0,32,33 - 115.265 1478.14 115.265 1478.14 156 1561.5 c 0,34,35 - 209.993 1671.99 209.993 1671.99 280 1722.5 c 0,36,37 - 350 1773.01 350 1773.01 410 1781 c 0,38,39 - 469.016 1789 l 0,40,41 - 469 1789 l 0,42,43 - 388 1774 388 1774 314.5 1694.5 c 0,44,45 - 240.996 1615 240.996 1615 209 1527 c 0,46,47 - 191.706 1479.44 191.706 1479.44 191.644 1438.16 c 0,48,49 - 191.592 1403.06 191.592 1403.06 204 1372.5 c 0,50,51 - 226.472 1317.16 226.472 1317.16 314.735 1316.87 c 0,52,53 - 332.531 1316.82 332.531 1316.82 353 1319 c 0,54,55 - 435 1328 435 1328 409.5 1419.5 c 0,56,57 - 386.796 1500.97 386.796 1500.97 317.708 1501.18 c 0,58,59 - 309.205 1501.2 309.205 1501.2 300 1500 c 0,60,61 - 328.11 1504.8 328.11 1504.8 351.378 1504.8 c 0,62,63 - 458.89 1504.76 458.89 1504.76 463 1402 c 0,64,65 - 468 1277.01 468 1277.01 444 1246 c 0,66,67 - 350.001 1126 350.001 1126 344.5 922 c 0,68,69 - 339 718 339 718 348 571 c 0,70,71 - 354 470.999 354 470.999 395.5 365 c 0,72,73 - 437 259 437 259 527 295 c 0,74,75 - 563 309.063 563 309.063 562.93 332.617 c 0,76,77 - 562.875 350.937 562.875 350.937 541 375 c 0,78,79 - 491 430 491 430 466 364 c 0,80,81 - 451 427 451 427 493.5 441.5 c 0,82,83 - 536 456 536 456 560 449 c 0,84,85 - 659 416 659 416 654 337 c 0,86,87 - 649.001 258.004 649.001 258.004 643 233 c 0,88,89 - 640.623 210.278 l 0,90,91 - 643.022 170.739 643.022 170.739 693.5 141 c 0,92,93 - 710.928 130.733 710.928 130.733 732.042 130.759 c 0,94,95 - 789.073 130.83 789.073 130.83 873 206 c 0,96,97 - 891 222.001 891 222.001 931 287.5 c 0,98,99 - 970.999 352.998 970.999 352.998 997.5 431 c 0,100,101 - 1024.01 509 1024.01 509 1017 580 c 0,102,103 - 1009.99 651.002 1009.99 651.002 934 679 c 0,104,105 - 883 697 883 697 885.5 635.5 c 0,106,107 - 888 574 888 574 932 546 c 0,108,109 - 829 595 829 595 823 689 c 0,110,111 - 817 783 817 783 850.5 898.5 c 0,112,113 - 884.003 1014.01 884.003 1014.01 929.5 1137.5 c 0,114,115 - 975 1261 975 1261 975 1369 c 0,116,117 - 975 1384.99 975 1384.99 996.5 1507.5 c 0,118,119 - 1014.74 1611.48 1014.74 1611.48 1106.84 1612.07 c 0,120,121 - 1142 1609 l 0,122,123 - 1114 1609 1114 1609 1084 1578 c 0,124,125 - 1065.83 1559.22 1065.83 1559.22 1065.63 1537.15 c 0,126,127 - 1065.54 1526.11 1065.54 1526.11 1069.93 1514.25 c 0,128,129 - 1071.26 1510.66 1071.26 1510.66 1073 1507 c 0,130,131 - 1097.08 1458.24 1097.08 1458.24 1127.69 1458.04 c 0,132,133 - 1143.25 1457.94 1143.25 1457.94 1160.49 1470.39 c 0,134,135 - 1165.67 1474.13 1165.67 1474.13 1171 1479 c 0,136,137 - 1199.69 1504.1 1199.69 1504.1 1199.8 1560.46 c 0,138,139 - 1199.87 1598.4 1199.87 1598.4 1187 1650.5 c 0,140,141 - 1160.61 1757.3 1160.61 1757.3 1045.79 1757.66 c 0,142,143 - 1021.39 1757.73 1021.39 1757.73 993 1753 c 0,144,145 - 1034.65 1774 1034.65 1774 1074.09 1774.11 c 0,146,147 - 1108.32 1774.21 1108.32 1774.21 1140.89 1758.58 c 0,148,149 - 1178.03 1740.77 1178.03 1740.77 1213 1702.5 c 0,150,151 - 1266.02 1644.49 1266.02 1644.49 1266.13 1556.31 c 0,152,153 - 1266.23 1476.51 1266.23 1476.51 1223 1372 c 0,154,155 - 1187.02 1285.05 1187.02 1285.05 1145.5 1165.5 c 0,156,157 - 1104 1046.01 1104 1046.01 1101 977 c 0,158,159 - 1102.08 933.908 l 0,160,161 - 1108.46 884.297 1108.46 884.297 1140.5 864.5 c 0,162,163 - 1185.01 837 1185.01 837 1224.5 853.5 c 0,164,165 - 1264.01 870.005 1264.01 870.005 1270.5 923 c 0,166,167 - 1269.24 946.944 l 0,168,169 - 1259.55 992.592 1259.55 992.592 1196 1053 c 0,170,171 - 1338.99 1039.01 1338.99 1039.01 1341.5 918 c 0,172,173 - 1338.83 854.387 l 0,174,175 - 1329.25 760.063 1329.25 760.063 1286.5 653 c 0,176,177 - 1229.01 509 1229.01 509 1151.5 384.5 c 0,178,179 - 1073.98 259.972 1073.98 259.972 1059 241 c 0,180,181 - 1020.99 192.985 1020.99 192.985 991 128 c 0,182,183 - 961 63.0001 961 63.0001 1048 81 c 0,184,185 - 1093 90 1093 90 1088.5 126 c 0,186,187 - 1084 161.999 1084 161.999 1069 208 c 0,188,189 - 1143.1 168.331 1143.1 168.331 1143.53 96.7311 c 0,190,191 - 1139.54 60.7425 l 0,192,193 - 1137.87 53.0215 1137.87 53.0215 1135.5 45 c 0,194,195 - 1102.99 -65.0001 1102.99 -65.0001 1012 -66 c 0,196,197 - 578 -72 578 -72 336.5 49.5 c 0,198,199 - 94.9995 171 94.9995 171 46 241 c 0,0,1 -EndSplineSet -KernsSLIF: 116 -78 0 0 84 -65 0 0 88 -130 0 0 -EndChar -StartChar: V -Encoding: 86 86 69 -Width: 1266 -Flags: W -Fore -346 1049 m 1,0,1 - 445 1021 445 1021 449 940.5 c 0,2,3 - 450.299 842.065 l 0,4,5 - 449.624 820.845 449.624 820.845 448 802 c 0,6,7 - 442 735 442 735 432.5 682.5 c 0,8,9 - 431.139 654.738 l 0,10,11 - 434.544 623.651 434.544 623.651 463 608 c 0,12,13 - 498 588 498 588 514.5 635 c 0,14,15 - 531 682 531 682 536 749 c 0,16,17 - 540.231 805.7 540.231 805.7 540.166 859.521 c 0,18,19 - 540.154 869.308 540.154 869.308 540 879 c 0,20,21 - 539 942 539 942 539 954 c 0,22,23 - 539 1034.01 539 1034.01 544.5 1098.5 c 0,24,25 - 550 1163 550 1163 574 1239 c 0,26,27 - 590.997 1292.99 590.997 1292.99 629.5 1337.5 c 0,28,29 - 667.985 1381.99 667.985 1381.99 699 1398 c 0,30,31 - 713.755 1401.18 l 0,32,33 - 723.716 1400.86 723.716 1400.86 734 1394 c 0,34,35 - 752 1382 752 1382 752 1369 c 0,36,37 - 698 1397.99 698 1397.99 700 1322.5 c 0,38,39 - 702 1247 702 1247 733 1247 c 0,40,41 - 765.998 1247 765.998 1247 779.5 1279 c 0,42,43 - 793 1310.99 793 1310.99 793 1337 c 0,44,45 - 793 1433 793 1433 808.5 1505 c 0,46,47 - 823.997 1576.99 823.997 1576.99 850 1667 c 0,48,49 - 857.997 1696.99 857.997 1696.99 884.5 1729.5 c 0,50,51 - 911.003 1762.01 911.003 1762.01 927 1776 c 0,52,53 - 956 1801.01 956 1801.01 1012.5 1800 c 0,54,55 - 1069 1798.99 1069 1798.99 1076 1765 c 0,56,57 - 1057.04 1782.69 1057.04 1782.69 1033.2 1782.91 c 0,58,59 - 1009.58 1779.2 l 0,60,61 - 986.018 1771.95 986.018 1771.95 958.5 1750.5 c 0,62,63 - 915 1716.6 915 1716.6 914.88 1673.88 c 0,64,65 - 914.8 1645.4 914.8 1645.4 934 1613 c 0,66,67 - 951.778 1582.33 951.778 1582.33 978.643 1582.38 c 0,68,69 - 1012.23 1582.44 1012.23 1582.44 1060 1630.5 c 0,70,71 - 1146 1717.01 1146 1717.01 1158 1756 c 0,72,73 - 1179.24 1823.78 1179.24 1823.78 1179.24 1871.65 c 0,74,75 - 1179.24 1929.72 1179.24 1929.72 1148 1958.5 c 0,76,77 - 1091 2011 1091 2011 1074 2028 c 0,78,79 - 1142.02 1994.99 1142.02 1994.99 1174 1955 c 0,80,81 - 1206 1914.99 1206 1914.99 1206 1828 c 0,82,83 - 1206 1746.01 1206 1746.01 1164 1676 c 0,84,85 - 1122 1605.99 1122 1605.99 1076 1552 c 0,86,87 - 964.997 1423 964.997 1423 911 1267.5 c 0,88,89 - 857 1111.99 857 1111.99 854 945 c 0,90,91 - 853 915 853 915 856 832 c 0,92,93 - 859 749 859 749 852.5 655 c 0,94,95 - 846.001 561.005 846.001 561.005 824.5 478 c 0,96,97 - 803 395 803 395 754 365 c 0,98,99 - 793 446 793 446 792.5 514 c 0,100,101 - 792 582 792 582 750 613 c 0,102,103 - 675 665 675 665 637 563 c 0,104,105 - 599 461 599 461 589 409 c 0,106,107 - 571 325 571 325 559 244.5 c 0,108,109 - 547 163.999 547 163.999 642 168 c 0,110,111 - 651 168 651 168 666 188.5 c 0,112,113 - 681 209.001 681 209.001 675 238 c 0,114,115 - 666 281 666 281 604 292 c 0,116,117 - 629.82 313.633 629.82 313.633 653.449 313.839 c 0,118,119 - 663.68 313.928 663.68 313.928 673.5 310 c 0,120,121 - 706.001 296.999 706.001 296.999 724 266 c 0,122,123 - 744.16 227.514 744.16 227.514 744.167 188.094 c 0,124,125 - 744.171 162.987 744.171 162.987 736 137.5 c 0,126,127 - 715 71.9999 715 71.9999 681 52 c 0,128,-1 - 575 -7.5 l 0,129,130 - 530 -32 530 -32 530 -128 c 0,131,132 - 530 -264.001 530 -264.001 624.5 -318.5 c 0,133,134 - 719 -373 719 -373 839 -367 c 0,135,136 - 744 -397 744 -397 654.5 -374.5 c 0,137,138 - 565 -352 565 -352 530 -313 c 0,139,140 - 412 -179.999 412 -179.999 410.5 -4 c 0,141,142 - 409 171.999 409 171.999 320 295 c 0,143,144 - 304 316 304 316 265 333 c 0,145,146 - 226 350 226 350 211 297 c 0,147,148 - 185.001 208.001 185.001 208.001 274 186 c 0,149,150 - 239.736 185.285 l 0,151,152 - 218.405 187.152 218.405 187.152 195 194.5 c 0,153,154 - 152.001 208 152.001 208 124 277 c 0,155,156 - 106.733 319 106.733 319 106.78 364.267 c 0,157,158 - 106.834 416 106.834 416 129.5 472 c 0,159,160 - 172 577.001 172 577.001 172 669 c 0,161,162 - 172 813.002 172 813.002 124.5 942.5 c 0,163,164 - 76.9999 1071.99 76.9999 1071.99 48 1208 c 0,165,166 - 39 1248.01 39 1248.01 22.5 1335.5 c 0,167,168 - 8.49056 1409.79 8.49056 1409.79 8.53863 1491.66 c 0,169,170 - 8.54717 1506.21 8.54717 1506.21 9 1521 c 0,171,172 - 10.9999 1588.01 10.9999 1588.01 45 1680 c 0,173,174 - 79.004 1772.01 79.004 1772.01 133 1780 c 0,175,176 - 110.001 1747 110.001 1747 92.5 1700.5 c 0,177,178 - 78.865 1664.27 78.865 1664.27 78.8889 1635.02 c 0,179,180 - 78.8957 1626.73 78.8957 1626.73 80 1619 c 0,181,182 - 92.9678 1535.64 92.9678 1535.64 186.577 1535.49 c 0,183,184 - 194.034 1535.48 194.034 1535.48 202 1536 c 0,185,186 - 257 1539 257 1539 266 1632.5 c 0,187,188 - 270.261 1713.86 l 0,189,190 - 270.153 1752.18 270.153 1752.18 265 1780 c 0,191,192 - 258 1814.01 258 1814.01 223 1843 c 0,193,194 - 187.993 1872 187.993 1872 152 1878 c 0,195,196 - 193.862 1879.28 l 0,197,198 - 284.127 1872.85 284.127 1872.85 312.5 1779.5 c 0,199,200 - 347 1665.99 347 1665.99 338 1592 c 0,201,202 - 329.999 1541.99 329.999 1541.99 303.5 1446 c 0,203,204 - 277.002 1350.01 277.002 1350.01 267 1293 c 0,205,206 - 263.07 1274.13 263.07 1274.13 263.156 1218.51 c 0,207,208 - 263.179 1203.37 263.179 1203.37 263.5 1185.5 c 0,209,210 - 265 1102.01 265 1102.01 276 1018.5 c 0,211,212 - 286.999 935.003 286.999 935.003 310 881 c 0,213,214 - 333 827 333 827 372 863 c 0,215,216 - 415 902 415 902 399 960.5 c 0,217,218 - 382.999 1019 382.999 1019 346 1049 c 1,0,1 -EndSplineSet -KernsSLIF: 214 -193 0 0 246 -224 0 0 111 -195 0 0 79 -156 0 0 45 -208 0 0 46 -247 0 0 44 -247 0 0 73 -104 0 0 105 -182 0 0 97 -321 0 0 65 -270 0 0 -EndChar -StartChar: W -Encoding: 87 87 11 -Width: 2018 -Flags: HW -Fore -1198 -258 m 0,0,1 - 1141 -241.001 1141 -241.001 1105 -191 c 0,2,3 - 1068.99 -140.988 1068.99 -140.988 1055 -100 c 0,4,5 - 1028 -25 1028 -25 1011.5 75 c 0,6,7 - 995 175 995 175 962 235 c 0,8,9 - 914 318 914 318 882 324 c 0,10,11 - 850 330 850 330 808 271 c 0,12,13 - 777.835 228.58 777.835 228.58 777.883 126.621 c 0,14,15 - 777.885 120.42 777.885 120.42 778 114 c 0,16,17 - 780 1.99995 780 1.99995 814 -37 c 0,18,19 - 839 -67 839 -67 899 -79 c 0,20,21 - 848.175 -107.756 848.175 -107.756 793.772 -107.666 c 0,22,23 - 766.825 -107.622 766.825 -107.622 739 -100.5 c 0,24,25 - 655 -79.0001 655 -79.0001 620 -45 c 0,26,27 - 586 -12 586 -12 561.5 25.5 c 0,28,29 - 537 63 537 63 513 105 c 0,30,31 - 485.998 152.002 485.998 152.002 472.5 171.5 c 0,32,33 - 459 190.999 459 190.999 402 210 c 0,34,35 - 384.54 209.64 l 0,36,37 - 369.5 205 l 0,38,39 - 349.001 197.001 349.001 197.001 345 185 c 0,40,41 - 321 119 321 119 383 104 c 0,42,43 - 344 84.9999 344 84.9999 314 110 c 0,44,45 - 284 135.001 284 135.001 281 163 c 0,46,47 - 273.557 211.38 273.557 211.38 273.604 252.976 c 0,48,49 - 273.646 289.62 273.646 289.62 279.5 321 c 0,50,51 - 292 388 292 388 314 462 c 0,52,53 - 357.094 610.435 357.094 610.435 357.085 756.122 c 0,54,55 - 357.085 762.561 357.085 762.561 357 769 c 0,56,57 - 355 920.999 355 920.999 289 1064 c 0,58,59 - 254.025 1136.95 254.025 1136.95 214 1204 c 0,60,61 - 174 1271 174 1271 171 1359 c 0,62,63 - 171.789 1419.71 l 0,64,65 - 181.716 1538.68 181.716 1538.68 263 1546 c 0,66,67 - 291.179 1544.62 l 0,68,69 - 330 1536.43 330 1536.43 330 1490 c 0,70,71 - 306 1512.01 306 1512.01 271.5 1497.5 c 0,72,73 - 249.617 1488.3 249.617 1488.3 249.661 1455.57 c 0,74,75 - 249.686 1436.7 249.686 1436.7 257 1410 c 0,76,77 - 266.64 1374.41 266.64 1374.41 302.395 1374 c 0,78,79 - 330.5 1378 l 0,80,81 - 391 1394.01 391 1394.01 391 1442 c 0,82,83 - 389.999 1546 389.999 1546 327 1586.5 c 0,84,85 - 264 1627 264 1627 190 1627 c 0,86,87 - 89.9968 1627 89.9968 1627 57 1575 c 0,88,89 - 24 1522.99 24 1522.99 9 1497 c 0,90,91 - 19 1585.99 19 1585.99 67 1623 c 0,92,93 - 114.993 1660 114.993 1660 196 1666 c 0,94,95 - 240.049 1665.23 l 0,96,97 - 302.45 1658.55 302.45 1658.55 356 1619.5 c 0,98,99 - 428 1567 428 1567 456 1513 c 0,100,101 - 534 1360 534 1360 502 1271.5 c 0,102,103 - 470 1183 470 1183 460 1017 c 0,104,105 - 457 966 457 966 456 896.5 c 0,106,107 - 455 827 455 827 489 788 c 0,108,109 - 521 752 521 752 541.5 763.5 c 0,110,111 - 560.877 774.37 560.877 774.37 561 800 c 0,112,113 - 559.001 821.999 559.001 821.999 553.5 841 c 0,114,115 - 548 860 548 860 494 864 c 0,116,117 - 527.206 880.794 527.206 880.794 554.148 880.98 c 0,118,119 - 568.225 881.078 568.225 881.078 580.592 876.641 c 0,120,121 - 606.569 867.323 606.569 867.323 625 838 c 0,122,123 - 648.561 798.453 648.561 798.453 648.756 767.399 c 0,124,125 - 648.793 761.549 648.793 761.549 648 756 c 0,126,127 - 643 721 643 721 637 688 c 0,128,129 - 618 590 618 590 617.5 538 c 0,130,131 - 617 486 617 486 659 456 c 0,132,133 - 686 435 686 435 741 542.5 c 0,134,135 - 796 650 796 650 820 704 c 0,136,137 - 846 761 846 761 873 797.5 c 0,138,139 - 900 834 900 834 984 873 c 0,140,141 - 934 801 934 801 920.5 759 c 0,142,143 - 907 717 907 717 919 639 c 0,144,145 - 925 592.001 925 592.001 942 552.5 c 0,146,147 - 959 513 959 513 999 509 c 0,148,149 - 1027.6 508.97 l 0,150,151 - 1090.09 517.856 1090.09 517.856 1127 608.5 c 0,152,153 - 1172 719 1172 719 1178 779 c 0,154,155 - 1179.01 791 1179.01 791 1199 889 c 0,156,157 - 1218.99 987 1218.99 987 1175 987 c 0,158,159 - 1148 987 1148 987 1139 958.5 c 0,160,161 - 1130 930 1130 930 1151 911 c 0,162,163 - 1104.99 919 1104.99 919 1104.5 966 c 0,164,165 - 1104.01 1013 1104.01 1013 1115 1031 c 0,166,167 - 1151 1088 1151 1088 1203 1129.5 c 0,168,169 - 1255.02 1171.01 1255.02 1171.01 1287 1210 c 0,170,171 - 1335 1270 1335 1270 1348.5 1294 c 0,172,173 - 1362 1318 1362 1318 1383 1381 c 0,174,175 - 1399.89 1431.69 1399.89 1431.69 1439.5 1540 c 0,176,177 - 1478.99 1647.99 1478.99 1647.99 1529 1698 c 0,178,179 - 1572.99 1741.99 1572.99 1741.99 1607 1759.5 c 0,180,181 - 1627.24 1769.92 1627.24 1769.92 1653.15 1769.88 c 0,182,183 - 1670.76 1769.86 1670.76 1769.86 1691 1765 c 0,184,-1 - 1607 1716.5 l 0,185,186 - 1567 1694 1567 1694 1543 1631 c 0,187,188 - 1528.58 1595.35 1528.58 1595.35 1528.56 1547.03 c 0,189,190 - 1528.55 1531.66 1528.55 1531.66 1530 1515 c 0,191,192 - 1536 1446 1536 1446 1594 1440 c 0,193,194 - 1663 1432.01 1663 1432.01 1721.5 1474.5 c 0,195,196 - 1779.99 1516.99 1779.99 1516.99 1808 1580 c 0,197,198 - 1825.98 1621.95 1825.98 1621.95 1847.5 1662.5 c 0,199,200 - 1868.99 1703 1868.99 1703 1864 1805 c 0,201,202 - 1858 1913 1858 1913 1703 1994 c 0,203,204 - 1884.99 1955 1884.99 1955 1910 1785 c 0,205,206 - 1914.52 1754.1 1914.52 1754.1 1914.43 1721.43 c 0,207,208 - 1914.28 1667.39 1914.28 1667.39 1901.5 1608.5 c 0,209,210 - 1881 1514.01 1881 1514.01 1819 1444 c 0,211,212 - 1731 1344 1731 1344 1622 1262 c 0,213,214 - 1579.99 1230 1579.99 1230 1512 1140.5 c 0,215,216 - 1444.01 1050.99 1444.01 1050.99 1491 995 c 0,217,218 - 1503 980 1503 980 1533 987 c 0,219,220 - 1562.99 993.999 1562.99 993.999 1570 1021 c 0,221,222 - 1575.85 1043.49 1575.85 1043.49 1575.93 1057.9 c 0,223,224 - 1576.02 1075.5 1576.02 1075.5 1567.5 1081 c 0,225,-1 - 1530 1106 l 0,226,227 - 1561.81 1109.98 l 0,228,229 - 1606.38 1109.6 1606.38 1109.6 1617 1067.5 c 0,230,231 - 1624.51 1037.74 1624.51 1037.74 1624.54 1010.13 c 0,232,233 - 1624.56 986.259 1624.56 986.259 1619 964 c 0,234,235 - 1601 892 1601 892 1535 861 c 0,236,237 - 1469.01 830.005 1469.01 830.005 1417 786 c 0,238,239 - 1355.99 735 1355.99 735 1307.5 681 c 0,240,241 - 1259 626.993 1259 626.993 1247 548 c 0,242,243 - 1240.43 507.416 1240.43 507.416 1240.43 473.856 c 0,244,245 - 1240.44 420.581 1240.44 420.581 1257 385 c 0,246,-1 - 1322 239 l 0,247,248 - 1349.01 173.984 1349.01 173.984 1357 99.5 c 0,249,250 - 1356.76 63.9884 l 0,251,252 - 1349.8 2.65468 1349.8 2.65468 1299 -72 c 0,253,254 - 1299 -39.0261 1299 -39.0261 1313 33 c 0,255,256 - 1326.99 105 1326.99 105 1259 147 c 0,257,258 - 1243.74 155.902 1243.74 155.902 1229.44 156.01 c 0,259,260 - 1217.62 156.1 1217.62 156.1 1206.45 150.18 c 0,261,262 - 1188.64 140.736 1188.64 140.736 1172.5 116 c 0,263,264 - 1134 57.0082 1134 57.0082 1131 -57 c 0,265,266 - 1133.57 -92.4594 l 0,267,268 - 1139.35 -124.071 1139.35 -124.071 1157.5 -157.5 c 0,269,270 - 1186 -210.003 1186 -210.003 1232 -232 c 0,271,272 - 1277 -253.001 1277 -253.001 1373 -255 c 0,273,274 - 1341.01 -271 1341.01 -271 1289 -270 c 0,275,276 - 1237 -269 1237 -269 1198 -258 c 0,0,1 -EndSplineSet -KernsSLIF: 214 -180 0 0 246 -212 0 0 322 -469 0 0 321 -508 0 0 72 -260 0 0 104 -300 0 0 45 -234 0 0 46 -326 0 0 44 -364 0 0 115 -326 0 0 83 -260 0 0 105 -182 0 0 73 -91 0 0 243 -313 0 0 211 -365 0 0 111 -273 0 0 79 -221 0 0 196 -313 0 0 228 -270 0 0 261 -342 0 0 260 -342 0 0 97 -449 0 0 65 -398 0 0 -EndChar -StartChar: X -Encoding: 88 88 29 -Width: 1415 -Flags: HW -Fore -760 1490 m 0,0,1 - 714 1479.88 714 1479.88 713.706 1446.06 c 0,2,3 - 714 1440 l 0,4,5 - 718 1402.01 718 1402.01 718 1401 c 0,6,7 - 668 1425 668 1425 677 1494 c 0,8,9 - 684.998 1557.99 684.998 1557.99 760 1577 c 0,10,11 - 801.957 1587.98 801.957 1587.98 857.5 1609 c 0,12,13 - 913 1630 913 1630 949 1654 c 0,14,15 - 964.003 1663 964.003 1663 980 1697 c 0,16,17 - 995.999 1731 995.999 1731 1000 1751 c 0,18,19 - 1004.07 1771.56 1004.07 1771.56 1004.04 1788.43 c 0,20,21 - 1003.92 1854.44 1003.92 1854.44 941 1864 c 0,22,23 - 966.36 1866.94 l 0,24,25 - 988.032 1865.85 988.032 1865.85 1004.5 1851 c 0,26,27 - 1030 1828.01 1030 1828.01 1030 1798 c 0,28,29 - 1030 1772.94 1030 1772.94 1023 1683.5 c 0,30,31 - 1021.96 1629.04 l 0,32,33 - 1024.61 1594 1024.61 1594 1039 1594 c 0,34,35 - 1071 1594 1071 1594 1092 1637 c 0,36,37 - 1115.99 1692.98 1115.99 1692.98 1117 1744.5 c 0,38,39 - 1118.01 1796.02 1118.01 1796.02 1140 1845 c 0,40,41 - 1161.01 1890.01 1161.01 1890.01 1202.5 1920.5 c 0,42,43 - 1237.05 1945.88 1237.05 1945.88 1267.77 1945.99 c 0,44,45 - 1273.96 1946.01 1273.96 1946.01 1280 1945 c 0,46,47 - 1246.99 1934 1246.99 1934 1221 1903 c 0,48,49 - 1195 1871.99 1195 1871.99 1195 1851 c 0,50,51 - 1195 1802 1195 1802 1249 1802 c 0,52,53 - 1272 1802 1272 1802 1280.5 1824 c 0,54,55 - 1285.39 1836.65 1285.39 1836.65 1285.48 1847.98 c 0,56,57 - 1285.55 1856.35 1285.55 1856.35 1283 1864 c 0,58,59 - 1322 1859.99 1322 1859.99 1322 1811.5 c 0,60,61 - 1322 1762.99 1322 1762.99 1310 1743 c 0,62,63 - 1292 1713 1292 1713 1253 1672.5 c 0,64,65 - 1213.92 1631.92 1213.92 1631.92 1189 1609 c 0,66,-1 - 1070 1500 l 0,67,68 - 975.004 1414 975.004 1414 945 1346 c 0,69,70 - 928.994 1309.99 928.994 1309.99 891 1189 c 0,71,72 - 874.988 1138.01 874.988 1138.01 874.956 1101.76 c 0,73,74 - 874.912 1051.98 874.912 1051.98 905 1030 c 0,75,76 - 919.654 1018.16 919.654 1018.16 935.262 1018.24 c 0,77,78 - 947.346 1018.3 947.346 1018.3 960 1025.5 c 0,79,80 - 989.007 1042 989.007 1042 1001 1058 c 0,81,82 - 1029.99 1095.99 1029.99 1095.99 999.5 1122.5 c 0,83,84 - 969 1149.01 969 1149.01 947 1151 c 0,85,86 - 966.65 1157.25 966.65 1157.25 984.599 1157.22 c 0,87,88 - 1006.85 1157.19 1006.85 1157.19 1026.5 1147.5 c 0,89,90 - 1062 1130 1062 1130 1068 1110 c 0,91,92 - 1076.18 1081.05 1076.18 1081.05 1076.24 1057.88 c 0,93,94 - 1076.34 1019.14 1076.34 1019.14 1053.71 996.609 c 0,95,96 - 1046.89 989.817 1046.89 989.817 1038 984.5 c 0,97,98 - 981.995 950.994 981.995 950.994 928 898 c 0,99,100 - 874 844 874 844 871.5 803 c 0,101,102 - 869 762 869 762 875 720 c 0,103,104 - 884 659 884 659 935 574.5 c 0,105,106 - 986.02 489.967 986.02 489.967 1051.5 404.5 c 0,107,-1 - 1181 243 l 0,108,-1 - 1280 125 l 0,109,110 - 1306.99 91.0083 1306.99 91.0083 1326 11.5 c 0,111,112 - 1345.01 -68 1345.01 -68 1302 -109 c 0,113,114 - 1315.29 -83.1647 1315.29 -83.1647 1315.22 -54.808 c 0,115,116 - 1315.11 -6.33775 1315.11 -6.33775 1276 49.5 c 0,117,118 - 1214.01 137.998 1214.01 137.998 1155 149 c 0,119,120 - 1125.06 150.232 l 0,121,122 - 1088.17 146.304 1088.17 146.304 1077.5 111 c 0,123,124 - 1070.42 87.5735 1070.42 87.5735 1070.37 67.0018 c 0,125,126 - 1070.32 45.43 1070.32 45.43 1078 27 c 0,127,128 - 1121.01 -73 1121.01 -73 1192 -106.5 c 0,129,130 - 1263 -140 1263 -140 1331 -140.5 c 0,131,132 - 1395.74 -137.331 l 0,133,134 - 1424.13 -134.077 1424.13 -134.077 1448 -127.5 c 0,135,136 - 1479 -118.959 1479 -118.959 1490.39 -119.024 c 0,137,138 - 1497 -119.061 1497 -119.061 1497 -122 c 0,139,140 - 1387.98 -157.22 1387.98 -157.22 1301.63 -157.28 c 0,141,142 - 1233.52 -157.327 1233.52 -157.327 1179.5 -135.5 c 0,143,144 - 1057 -86.0024 1057 -86.0024 1009 38 c 0,145,146 - 980.998 110.003 980.998 110.003 940 229.5 c 0,147,148 - 899 349 899 349 868 352 c 0,149,150 - 804 358 804 358 804 299 c 0,151,152 - 804 263 804 263 821.5 256.5 c 0,153,154 - 833.616 252 833.616 252 844.533 252.053 c 0,155,156 - 849.385 252.077 849.385 252.077 854 253 c 0,157,158 - 835.564 229.6 835.564 229.6 815.619 229.581 c 0,159,160 - 807.436 229.573 807.436 229.573 799 233.5 c 0,161,162 - 770 247.001 770 247.001 758 272 c 0,163,164 - 731.999 325.002 731.999 325.002 727 386 c 0,165,166 - 722 447 722 447 722 518 c 0,167,168 - 722 542 722 542 711 588.5 c 0,169,170 - 700 635 700 635 667 639 c 0,171,172 - 590 648 590 648 536.5 513 c 0,173,174 - 499.347 419.251 499.347 419.251 499.087 386.264 c 0,175,176 - 498.992 374.272 498.992 374.272 506 369 c 0,177,178 - 527 361 527 361 548 384 c 0,179,180 - 572 408 572 408 537 446 c 0,181,182 - 558 446 558 446 574.5 422.5 c 0,183,184 - 591 399 591 399 591 378 c 0,185,186 - 591 338 591 338 558.5 289 c 0,187,188 - 526 240 526 240 485 229 c 0,189,190 - 431 215.001 431 215.001 385 185.5 c 0,191,192 - 339 155.999 339 155.999 327 100 c 0,193,194 - 313.005 37.0199 313.005 37.0199 297.5 -20 c 0,195,196 - 282 -77 282 -77 255 -114 c 0,197,198 - 243 -129 243 -129 201.5 -141 c 0,199,200 - 179.007 -147.504 179.007 -147.504 161.656 -147.545 c 0,201,202 - 146.992 -147.58 146.992 -147.58 136 -143 c 0,203,204 - 195 -134 195 -134 224 -81 c 0,205,206 - 242.001 -46.999 242.001 -46.999 242.5 20 c 0,207,208 - 242.999 87.0001 242.999 87.0001 187 87 c 0,209,210 - 124 87 124 87 90 12.5 c 0,211,212 - 55.9999 -62 55.9999 -62 56 -116 c 0,213,214 - 56 -207.001 56 -207.001 149 -254 c 0,215,216 - 80 -254 80 -254 48.5 -209 c 0,217,218 - 17 -164 17 -164 14 -116 c 0,219,220 - 3 2.00005 3 2.00005 77 106 c 0,221,222 - 112.997 157.997 112.997 157.997 232 284 c 0,223,224 - 351 410 351 410 349 463 c 0,225,226 - 347 495 347 495 306 495 c 0,227,228 - 284.978 495 284.978 495 284.5 472.5 c 0,229,230 - 284.999 450.002 284.999 450.002 293 440 c 0,231,232 - 269 433 269 433 245.5 460 c 0,233,234 - 221.999 487 221.999 487 247 535 c 0,235,236 - 267 574 267 574 325.5 608 c 0,237,238 - 384.003 642.002 384.003 642.002 417 673 c 0,239,240 - 450.002 704.002 450.002 704.002 490.5 765 c 0,241,242 - 531 826 531 826 531 877 c 0,243,244 - 531 910 531 910 503 924 c 0,245,246 - 475 938 475 938 448 938 c 0,247,248 - 379.456 935.397 379.456 935.397 378.665 895.53 c 0,249,250 - 380 882.5 l 0,251,252 - 391 830 391 830 421 830 c 0,253,254 - 369 821 369 821 328 845 c 0,255,256 - 287 869 287 869 287 926 c 0,257,258 - 287 970 287 970 312 1017.5 c 0,259,260 - 337.001 1065.01 337.001 1065.01 347 1104 c 0,261,262 - 355 1140 355 1140 355.5 1190 c 0,263,264 - 356 1239.99 356 1239.99 344 1274 c 0,265,266 - 319.003 1339.99 319.003 1339.99 266 1395 c 0,267,268 - 213 1450.01 213 1450.01 213 1535 c 0,269,270 - 213 1557.99 213 1557.99 237.5 1602.5 c 0,271,272 - 261.997 1647 261.997 1647 302 1647 c 0,273,274 - 263 1609.99 263 1609.99 263 1559 c 0,275,276 - 263 1544.99 263 1544.99 276 1522 c 0,277,278 - 289.003 1499 289.003 1499 310 1499 c 0,279,280 - 374 1499 374 1499 374 1562 c 0,281,282 - 374 1752.53 374 1752.53 219.724 1752.48 c 0,283,284 - 212.053 1752.47 212.053 1752.47 204 1752 c 0,285,286 - 247.833 1765.11 247.833 1765.11 282.611 1765.1 c 0,287,288 - 340.669 1765.08 340.669 1765.08 373.5 1728.5 c 0,289,290 - 426.001 1670 426.001 1670 448 1582 c 0,291,292 - 466 1505.99 466 1505.99 475.5 1424.5 c 0,293,294 - 485.001 1342.99 485.001 1342.99 506 1269 c 0,295,296 - 515.003 1235.99 515.003 1235.99 552 1178.5 c 0,297,298 - 581.04 1133.37 581.04 1133.37 613.156 1132.9 c 0,299,300 - 631 1136 l 0,301,302 - 680.005 1152.01 680.005 1152.01 722.5 1212 c 0,303,304 - 765 1272 765 1272 783 1320 c 0,305,306 - 789 1336.01 789 1336.01 801.5 1419 c 0,307,308 - 803.564 1454.98 l 0,309,310 - 800.907 1490.88 800.907 1490.88 773.555 1491.5 c 0,311,312 - 760 1490 l 0,0,1 -EndSplineSet -KernsSLIF: 45 -208 0 0 -EndChar -StartChar: Y -Encoding: 89 89 17 -Width: 1321 -Flags: MW -VStem: 406 327<-12 893> -Fore -587 -427 m 1,0,1 - 650 -373 650 -373 691.5 -193 c 0,2,3 - 733 -13 733 -13 673 39 c 0,4,5 - 647 61 647 61 574 65.5 c 0,6,7 - 501 70 501 70 520 10 c 0,8,9 - 531 -25 531 -25 563.5 -31 c 0,10,11 - 591.368 -32.2583 l 0,12,13 - 609.425 -30.504 609.425 -30.504 627 -22 c 0,14,15 - 627 -68 627 -68 526 -76 c 0,16,17 - 425 -83.9999 425 -83.9999 406 -12 c 0,18,19 - 398.427 14.7027 398.427 14.7027 398.479 42.0412 c 0,20,21 - 398.558 83.2966 398.558 83.2966 416 126 c 0,22,23 - 445 197.002 445 197.002 469 265 c 0,24,25 - 474.004 280.013 474.004 280.013 489.5 337.5 c 0,26,27 - 505 395.003 505 395.003 515.5 458.5 c 0,28,29 - 525.179 517.032 525.179 517.032 525.086 565.366 c 0,30,31 - 525.078 569.468 525.078 569.468 525 573.5 c 0,32,33 - 524 625.001 524 625.001 496 630 c 0,34,35 - 473.874 629.028 l 0,36,37 - 461.395 626.368 461.395 626.368 448.5 619 c 0,38,39 - 425.042 605.596 425.042 605.596 425 572 c 0,40,41 - 425 548 425 548 473 539 c 0,42,43 - 435 526 435 526 387.5 534.5 c 0,44,45 - 340 543 340 543 324 580 c 0,46,47 - 317.399 594.852 317.399 594.852 317.497 610.957 c 0,48,49 - 317.697 643.648 317.697 643.648 345.5 681.5 c 0,50,51 - 387 738 387 738 398 783 c 0,52,53 - 404.119 810.154 404.119 810.154 404.095 837.382 c 0,54,55 - 404.056 881.345 404.056 881.345 388 925.5 c 0,56,57 - 362 997 362 997 319 1042 c 0,58,59 - 310.857 1049.71 310.857 1049.71 301.979 1049.9 c 0,60,61 - 289.326 1046.54 l 0,62,63 - 283.314 1043.31 283.314 1043.31 277 1037 c 0,64,65 - 263.787 1023.79 263.787 1023.79 263.445 1010.25 c 0,66,67 - 267.068 995.034 l 0,68,69 - 268.318 992.522 268.318 992.522 270 990 c 0,70,71 - 282 972 282 972 290.5 967 c 0,72,73 - 299 962 299 962 341 962 c 0,74,75 - 333.001 943 333.001 943 281.5 940 c 0,76,77 - 245.179 941.292 l 0,78,79 - 219.509 945.159 219.509 945.159 203 958 c 0,80,81 - 158 992 158 992 173 1067 c 0,82,83 - 188 1142 188 1142 188 1190 c 0,84,85 - 188 1298 188 1298 111 1360 c 0,86,87 - 34.0009 1421.99 34.0009 1421.99 19 1521 c 0,88,89 - 14.7895 1547.84 14.7895 1547.84 14.8726 1575.69 c 0,90,91 - 15.1051 1653.65 15.1051 1653.65 49 1739.5 c 0,92,93 - 94.9978 1856 94.9978 1856 234 1913 c 0,94,95 - 139.993 1851.99 139.993 1851.99 89.5 1755 c 0,96,97 - 39 1657.99 39 1657.99 84 1557 c 0,98,99 - 113.309 1491.05 113.309 1491.05 188.767 1490.96 c 0,100,101 - 195.689 1490.95 195.689 1490.95 203 1491.5 c 0,102,103 - 289.995 1497.99 289.995 1497.99 332 1546 c 0,104,105 - 346.769 1562.25 346.769 1562.25 346.875 1578.25 c 0,106,107 - 346.974 1593.24 346.974 1593.24 334.206 1608.02 c 0,108,109 - 332.918 1609.51 332.918 1609.51 331.5 1611 c 0,110,111 - 310.872 1632.64 310.872 1632.64 278.582 1632.79 c 0,112,113 - 263.126 1632.86 263.126 1632.86 245 1628 c 0,114,115 - 281 1653.99 281 1653.99 325.5 1653.5 c 0,116,117 - 369.993 1653.01 369.993 1653.01 392 1635 c 0,118,119 - 421.654 1608.64 421.654 1608.64 421.779 1569.91 c 0,120,121 - 421.843 1549.86 421.843 1549.86 414 1526.5 c 0,122,123 - 391.987 1460.93 391.987 1460.93 391.958 1414.16 c 0,124,125 - 391.957 1412.06 391.957 1412.06 392 1410 c 0,126,127 - 393 1358.01 393 1358.01 402.5 1279 c 0,128,129 - 411.998 1200.01 411.998 1200.01 433.5 1129.5 c 0,130,131 - 455.002 1058.99 455.002 1058.99 490.5 1016.5 c 0,132,133 - 526 974 526 974 580 997 c 0,134,135 - 623.004 1015 623.004 1015 668 1086.5 c 0,136,137 - 713.005 1158.01 713.005 1158.01 722 1192 c 0,138,139 - 722.967 1213.49 l 0,140,141 - 720.821 1232.68 720.821 1232.68 709.5 1259 c 0,142,143 - 697.668 1286.51 697.668 1286.51 678.264 1287.01 c 0,144,145 - 662.531 1283.53 l 0,146,147 - 658.396 1281.73 658.396 1281.73 654 1279 c 0,148,149 - 623 1259.99 623 1259.99 644 1238.5 c 0,150,151 - 665.005 1217 665.005 1217 689 1217 c 0,152,153 - 668.538 1203.36 668.538 1203.36 648.887 1203.12 c 0,154,155 - 628.401 1206.6 l 0,156,157 - 623.929 1208.19 623.929 1208.19 619.5 1210.5 c 0,158,159 - 586 1228.01 586 1228.01 580 1254 c 0,160,161 - 577.345 1283.47 l 0,162,163 - 580.493 1350.79 580.493 1350.79 672.5 1397 c 0,164,165 - 783.992 1452.99 783.992 1452.99 842 1519 c 0,166,167 - 883.993 1565.99 883.993 1565.99 911.5 1631 c 0,168,169 - 939.004 1696.01 939.004 1696.01 975 1747 c 0,170,-1 - 1009 1799 l 0,171,172 - 1034.59 1838.13 1034.59 1838.13 1076.6 1838.19 c 0,173,174 - 1090.41 1838.21 1090.41 1838.21 1106 1834 c 0,175,176 - 1048 1818 1048 1818 1029 1767.5 c 0,177,178 - 1023.79 1753.67 1023.79 1753.67 1023.77 1741.52 c 0,179,180 - 1023.69 1709.34 1023.69 1709.34 1060 1689 c 0,181,182 - 1070.52 1682.59 1070.52 1682.59 1083.77 1682.47 c 0,183,184 - 1107.18 1686.44 l 0,185,186 - 1112.9 1688.29 1112.9 1688.29 1119 1691 c 0,187,188 - 1155.02 1707.01 1155.02 1707.01 1164 1717 c 0,189,190 - 1211.36 1773.83 1211.36 1773.83 1211.75 1816.12 c 0,191,192 - 1208.36 1838.44 l 0,193,194 - 1199.16 1866.33 1199.16 1866.33 1165 1886.5 c 0,195,196 - 1070.99 1942.01 1070.99 1942.01 1047 1951 c 0,197,198 - 1137.99 1935 1137.99 1935 1181 1897 c 0,199,200 - 1223.99 1859.02 1223.99 1859.02 1227 1853 c 0,201,202 - 1246.97 1809.61 1246.97 1809.61 1247.02 1775.71 c 0,203,204 - 1247.05 1760.39 1247.05 1760.39 1243 1747 c 0,205,206 - 1229.99 1703.99 1229.99 1703.99 1186 1636 c 0,207,208 - 1142.01 1570.01 1142.01 1570.01 1043 1495 c 0,209,210 - 944 1420 944 1420 935 1345 c 0,211,212 - 926 1282 926 1282 945.5 1214.5 c 0,213,214 - 965 1147 965 1147 967 1084 c 0,215,216 - 967 1054 967 1054 943.5 963 c 0,217,218 - 920 872 920 872 815 866 c 0,219,220 - 857 879 857 879 883.5 956.5 c 0,221,222 - 889.484 974.001 889.484 974.001 889.681 987.55 c 0,223,224 - 886.68 1005.75 l 0,225,226 - 875.526 1034 875.526 1034 823 1034 c 0,227,228 - 771 1034 771 1034 752 980 c 0,229,230 - 733 926 733 926 733 893 c 0,231,232 - 733 811.001 733 811.001 801 798 c 0,233,234 - 834.18 791.758 834.18 791.758 860.508 791.83 c 0,235,236 - 914.319 791.977 914.319 791.977 939.5 818.5 c 0,237,238 - 960.695 840.826 960.695 840.826 960.646 863.631 c 0,239,240 - 960.608 881.174 960.608 881.174 948 899 c 0,241,242 - 978 896 978 896 989.5 866 c 0,243,244 - 1001 836 1001 836 997 821 c 0,245,246 - 961 701 961 701 866.5 644.5 c 0,247,248 - 772 588 772 588 736 460 c 0,249,250 - 723.002 415.009 723.002 415.009 713 360 c 0,251,252 - 703 305 703 305 703 257 c 0,253,254 - 703 207.999 703 207.999 723.5 154.5 c 0,255,256 - 744.007 100.984 744.007 100.984 763 57 c 0,257,258 - 807 -46.0001 807 -46.0001 731.5 -214 c 0,259,260 - 656 -382 656 -382 587 -427 c 1,0,1 -EndSplineSet -KernsSLIF: 79 -91 0 0 111 -182 0 0 321 -313 0 0 83 -260 0 0 45 -195 0 0 46 -234 0 0 44 -234 0 0 97 -427 0 0 65 -385 0 0 -EndChar -StartChar: Z -Encoding: 90 90 30 -Width: 1724 -Flags: HMW -HStem: 39.5 156<312 1458.5> 1435 135<408 1265> -Fore -237 -220 m 0,0,1 - 177 -220 177 -220 153.5 -186 c 0,2,3 - 130.001 -152.001 130.001 -152.001 126 -106 c 0,4,5 - 124.999 -98.9995 124.999 -98.9995 130.5 -45 c 0,6,7 - 136.001 9.00019 136.001 9.00019 178 20 c 0,8,9 - 160 3.8147e-06 160 3.8147e-06 154 -37 c 0,10,11 - 153.534 -61.664 l 0,12,13 - 156.519 -80.2962 156.519 -80.2962 171 -91 c 0,14,15 - 195.849 -108.749 195.849 -108.749 220.619 -108.763 c 0,16,17 - 258.651 -108.785 258.651 -108.785 296.5 -67 c 0,18,19 - 359 2 359 2 350 74 c 0,20,21 - 341 140 341 140 312 195.5 c 0,22,23 - 284.062 248.969 284.062 248.969 283.967 326.1 c 0,24,25 - 283.963 329.032 283.963 329.032 284 332 c 0,26,27 - 284 367 284 367 308.5 416 c 0,28,29 - 332.999 464.999 332.999 464.999 375 475 c 0,30,31 - 386 478 386 478 412.5 479 c 0,32,33 - 439 480 439 480 445 464 c 0,34,35 - 421 479 421 479 380 457.5 c 0,36,37 - 339 436 339 436 336 411 c 0,38,39 - 333 384 333 384 340 349 c 0,40,41 - 347 314 347 314 386 314 c 0,42,43 - 433 314 433 314 491 438 c 0,44,45 - 549 562 549 562 561 604 c 0,46,47 - 588.999 708.994 588.999 708.994 597.5 802.5 c 0,48,49 - 606.002 896.013 606.002 896.013 622 989 c 0,50,51 - 626.002 1016.01 626.002 1016.01 642 1055.5 c 0,52,53 - 658 1094.99 658 1094.99 679 1114 c 0,54,55 - 732.993 1163 732.993 1163 790 1170.5 c 0,56,57 - 847 1178 847 1178 861 1157 c 0,58,59 - 839.005 1159.27 l 0,60,61 - 804.088 1157.18 804.088 1157.18 761.5 1121 c 0,62,63 - 729.029 1093.41 729.029 1093.41 728.761 1068.8 c 0,64,65 - 728.666 1060.01 728.666 1060.01 732.68 1051.59 c 0,66,67 - 736.981 1042.58 736.981 1042.58 746 1034 c 0,68,69 - 758.751 1021.72 758.751 1021.72 775.514 1021.82 c 0,70,71 - 794.252 1021.93 794.252 1021.93 818 1037.5 c 0,72,73 - 863 1067.01 863 1067.01 878 1087 c 0,74,-1 - 938.5 1169.5 l 0,75,76 - 971.986 1215.98 971.986 1215.98 996 1257 c 0,77,78 - 1019.99 1299.98 1019.99 1299.98 1034.5 1347 c 0,79,80 - 1037.69 1368.81 l 0,81,82 - 1036.86 1402.8 1036.86 1402.8 998 1431 c 0,83,84 - 953.018 1461.99 953.018 1461.99 882 1470.5 c 0,85,86 - 811.043 1479 811.043 1479 758 1479 c 0,87,88 - 637.993 1479 637.993 1479 585 1440.5 c 0,89,-1 - 461 1347 l 0,90,91 - 452 1341 452 1341 431.5 1324.5 c 0,92,93 - 411 1308 411 1308 399 1308 c 0,94,95 - 373 1306.01 373 1306.01 328.5 1318.5 c 0,96,97 - 284 1330.99 284 1330.99 273 1377 c 0,98,99 - 281.997 1358 281.997 1358 348.5 1347.5 c 0,100,101 - 370.966 1347.4 l 0,102,103 - 408.317 1354.47 408.317 1354.47 408.663 1416.16 c 0,104,105 - 408.713 1425.02 408.713 1425.02 408 1435 c 0,106,107 - 402.001 1507.99 402.001 1507.99 309.5 1513.5 c 0,108,109 - 225.463 1515.21 l 0,110,111 - 196.474 1514.14 196.474 1514.14 179 1510 c 0,112,113 - 52.0235 1476.53 52.0235 1476.53 51.5 1402.5 c 0,114,115 - 52 1292 l 0,116,117 - 29.2774 1353.48 29.2774 1353.48 29.1846 1400.28 c 0,118,119 - 29.0851 1450.43 29.0851 1450.43 54.9838 1483.72 c 0,120,121 - 59.1549 1489.08 59.1549 1489.08 64 1494 c 0,122,123 - 126.992 1558 126.992 1558 183 1576 c 0,124,125 - 251.935 1596.94 251.935 1596.94 326.223 1596.94 c 0,126,127 - 337.056 1596.94 337.056 1596.94 348 1596.5 c 0,128,129 - 433.929 1593.01 433.929 1593.01 515 1584 c 0,130,131 - 572 1578 572 1578 630.5 1582.5 c 0,132,133 - 673.739 1585.83 673.739 1585.83 674.092 1615.65 c 0,134,135 - 669.821 1637.75 l 0,136,137 - 669.427 1638.86 669.427 1638.86 669 1640 c 0,138,139 - 656.558 1671.11 656.558 1671.11 625.717 1671.15 c 0,140,141 - 611.944 1671.17 611.944 1671.17 594.5 1665 c 0,142,143 - 538.001 1645.01 538.001 1645.01 534 1629 c 0,144,145 - 532.47 1656.34 l 0,146,147 - 534.846 1679.14 534.846 1679.14 551 1694 c 0,148,149 - 576.009 1717 576.009 1717 597 1723 c 0,150,151 - 636 1732 636 1732 696 1727.5 c 0,152,153 - 755.989 1723 755.989 1723 794 1703 c 0,154,-1 - 917 1635.5 l 0,155,156 - 983.989 1598.01 983.989 1598.01 1039 1585 c 0,157,158 - 1102 1570 1102 1570 1150.5 1568.5 c 0,159,160 - 1260.41 1569.8 l 0,161,162 - 1262.69 1569.9 1262.69 1569.9 1265 1570 c 0,163,164 - 1349.93 1567.33 l 0,165,166 - 1365.77 1566.16 1365.77 1566.16 1382.5 1564.5 c 0,167,168 - 1447.99 1558.01 1447.99 1558.01 1490 1519 c 0,169,170 - 1518.99 1492 1518.99 1492 1521.5 1422.5 c 0,171,172 - 1519.34 1385.52 l 0,173,174 - 1512.2 1343.51 1512.2 1343.51 1483 1320 c 0,175,176 - 1461.18 1301.94 1461.18 1301.94 1419.52 1302 c 0,177,178 - 1405.83 1302.02 1405.83 1302.02 1390 1304 c 0,179,180 - 1421.01 1305.01 1421.01 1305.01 1454.5 1361.5 c 0,181,182 - 1468.24 1384.68 1468.24 1384.68 1468.27 1407.09 c 0,183,184 - 1468.31 1439.33 1468.31 1439.33 1440 1470 c 0,185,186 - 1427.39 1482.61 1427.39 1482.61 1405.3 1482.6 c 0,187,188 - 1387.11 1482.58 1387.11 1482.58 1362.5 1474 c 0,189,190 - 1308 1454.99 1308 1454.99 1290 1435 c 0,191,192 - 1215 1352.01 1215 1352.01 1139.5 1219.5 c 0,193,194 - 1064.02 1087.02 1064.02 1087.02 1018 985 c 0,195,196 - 988.999 918.996 988.999 918.996 972 828 c 0,197,198 - 955 737 955 737 946 665 c 0,199,200 - 935.001 593.002 935.001 593.002 894 557.5 c 0,201,202 - 853 522 853 522 760 561 c 0,203,204 - 793 555 793 555 837.5 579 c 0,205,206 - 882 603 882 603 864 663 c 0,207,208 - 853.377 695.377 853.377 695.377 831.749 695.891 c 0,209,210 - 814.459 692.007 l 0,211,212 - 798.784 685.202 798.784 685.202 779 666.5 c 0,213,214 - 715 606.001 715 606.001 712 568 c 0,215,216 - 706.001 503.007 706.001 503.007 703.5 387 c 0,217,218 - 706.084 344.04 l 0,219,220 - 718.324 266.367 718.324 266.367 787 248 c 0,221,222 - 835.997 235 835.997 235 897.5 226 c 0,223,224 - 959 217 959 217 1018 217 c 0,225,226 - 1110.99 217 1110.99 217 1154 286 c 0,227,228 - 1197.03 355.037 1197.03 355.037 1245 418 c 0,229,230 - 1311.58 504.619 1311.58 504.619 1367.71 504.744 c 0,231,232 - 1398.42 504.812 1398.42 504.812 1426 479 c 0,233,234 - 1498.75 410.917 1498.75 410.917 1499.3 379.363 c 0,235,236 - 1499.34 377.087 1499.34 377.087 1499 375 c 0,237,238 - 1482.01 402 1482.01 402 1418 425.5 c 0,239,240 - 1397.57 433 1397.57 433 1380.61 432.912 c 0,241,242 - 1344.43 432.724 1344.43 432.724 1324 398 c 0,243,244 - 1304 362.992 1304 362.992 1304 298 c 0,245,246 - 1304 260.996 1304 260.996 1348.5 222 c 0,247,248 - 1393.01 183 1393.01 183 1419 174 c 0,249,250 - 1456.01 159 1456.01 159 1509 141 c 0,251,252 - 1562.02 122.991 1562.02 122.991 1598 108 c 0,253,254 - 1669.01 77.9939 1669.01 77.9939 1713 17.5 c 0,255,256 - 1745.17 -26.7446 1745.17 -26.7446 1745.27 -73.9191 c 0,257,258 - 1745.3 -91.2615 1745.3 -91.2615 1741 -109 c 0,259,260 - 1722.99 -65.9799 1722.99 -65.9799 1692 -19.5 c 0,261,262 - 1660.99 27.0011 1660.99 27.0011 1582 35 c 0,263,264 - 1536.43 39.8826 1536.43 39.8826 1483.24 39.7986 c 0,265,266 - 1471.07 39.7794 1471.07 39.7794 1458.5 39.5 c 0,267,268 - 1390.99 37.9999 1390.99 37.9999 1335 24 c 0,269,270 - 1287 10.9999 1287 10.9999 1240.5 -17.5 c 0,271,272 - 1194 -46 1194 -46 1152 -63 c 0,273,274 - 1090.99 -86.0012 1090.99 -86.0012 1044.5 -92.5 c 0,275,276 - 998 -98.9999 998 -98.9999 964 -63 c 0,277,278 - 949 -48 949 -48 951.5 -26 c 0,279,280 - 954 -3.99995 954 -3.99995 962 1 c 0,281,282 - 969.999 -44 969.999 -44 999 -44 c 0,283,284 - 1042.99 -44 1042.99 -44 1050 -2 c 0,285,286 - 1048.42 12.7096 l 0,287,288 - 1038.21 37.5233 1038.21 37.5233 973.184 37.7045 c 0,289,290 - 961.698 37.7366 961.698 37.7366 948.5 37 c 0,291,292 - 841.002 31.0001 841.002 31.0001 828 29 c 0,293,294 - 699 6.99995 699 6.99995 604 -48.5 c 0,295,296 - 509 -104 509 -104 397 -161 c 0,297,-1 - 320 -198 l 0,298,299 - 274.001 -220 274.001 -220 237 -220 c 0,0,1 -EndSplineSet -KernsSLIF: 121 -117 0 0 89 -104 0 0 322 -182 0 0 321 -169 0 0 105 -52 0 0 73 -65 0 0 101 -65 0 0 98 -78 0 0 66 -78 0 0 45 -208 0 0 -EndChar -StartChar: a -Encoding: 97 97 56 -Width: 1254 -Flags: W -Fore -1101 -190 m 1,0,1 - 1130.99 -133.017 1130.99 -133.017 1145.5 -66.5 c 0,2,3 - 1160.01 -5.34058e-05 1160.01 -5.34058e-05 1105 52 c 0,4,5 - 1061.98 94.0183 1061.98 94.0183 1019 122 c 0,6,7 - 976 150.001 976 150.001 929 134 c 0,8,9 - 898.001 122 898.001 122 889.5 75 c 0,10,11 - 881 28 881 28 878 28 c 0,12,13 - 843 97 843 97 885 176 c 0,14,15 - 924.162 249.663 924.162 249.663 924.2 314.63 c 0,16,17 - 924.203 319.338 924.203 319.338 924 324 c 0,18,19 - 918 460 918 460 878 508 c 0,20,21 - 838 556 838 556 784 577 c 0,22,23 - 755.159 588.038 755.159 588.038 730.121 588.046 c 0,24,25 - 684.841 588.061 684.841 588.061 652 552 c 0,26,27 - 601 496 601 496 547 472 c 0,28,29 - 514 457 514 457 477.5 471 c 0,30,31 - 441 485 441 485 438 524 c 0,32,33 - 464.8 513.421 464.8 513.421 477.424 513.287 c 0,34,35 - 482.7 513.232 482.7 513.232 485.5 515 c 0,36,37 - 495 521 495 521 498 527 c 0,38,39 - 515 563 515 563 474 575 c 0,40,41 - 385 595 385 595 349 527 c 0,42,43 - 319 469 319 469 294.5 385 c 0,44,45 - 270 301 270 301 302 230 c 0,46,47 - 308.851 213.559 308.851 213.559 308.896 189.844 c 0,48,49 - 308.917 178.941 308.917 178.941 307.5 166.5 c 0,50,51 - 303 126.999 303 126.999 264 113 c 0,52,53 - 267.965 142.506 l 0,54,55 - 267.628 173.422 267.628 173.422 240.722 174.061 c 0,56,57 - 231.5 173.5 l 0,58,59 - 183 167 183 167 157 138 c 0,60,61 - 98.9995 73.9999 98.9995 73.9999 70 21 c 0,62,63 - 41 -32 41 -32 51 -108 c 0,64,65 - 27 -84 27 -84 28.5 -26.5 c 0,66,67 - 30 31 30 31 46 58 c 0,68,69 - 74.9999 109 74.9999 109 103 152.5 c 0,70,71 - 131.001 196 131.001 196 133 250 c 0,72,73 - 133 283 133 283 109 296.5 c 0,74,75 - 85 310 85 310 97 257 c 0,76,77 - 68.0001 282 68.0001 282 77 321 c 0,78,79 - 111.999 481 111.999 481 225.5 621 c 0,80,81 - 338.999 760.998 338.999 760.998 360 850 c 0,82,83 - 374.002 908.012 374.002 908.012 386 973.5 c 0,84,85 - 398.006 1039.04 398.006 1039.04 406 1093 c 0,86,87 - 412.001 1150.01 412.001 1150.01 448.5 1198.5 c 0,88,89 - 469.7 1226.67 469.7 1226.67 494.444 1226.67 c 0,90,91 - 512.299 1226.67 512.299 1226.67 532 1212 c 0,92,93 - 487 1203 487 1203 485.5 1178.5 c 0,94,95 - 484 1154.01 484 1154.01 493 1144 c 0,96,97 - 508.183 1124.39 508.183 1124.39 523.767 1124.39 c 0,98,99 - 532.816 1124.39 532.816 1124.39 542 1131 c 0,100,101 - 590 1162.99 590 1162.99 620.5 1264.5 c 0,102,103 - 650.032 1362.79 650.032 1362.79 650 1422 c 0,104,105 - 647 1478 647 1478 609.5 1511 c 0,106,107 - 591.999 1526.4 591.999 1526.4 572.867 1526.56 c 0,108,109 - 561.011 1526.65 561.011 1526.65 548.53 1520.9 c 0,110,111 - 537.988 1516.04 537.988 1516.04 527 1507 c 0,112,113 - 557 1585 557 1585 603.5 1573 c 0,114,115 - 650.006 1561 650.006 1561 697.5 1510.5 c 0,116,117 - 745 1459.99 745 1459.99 785.5 1398 c 0,118,119 - 826 1336.01 826 1336.01 844 1314 c 0,120,121 - 873.983 1277.02 873.983 1277.02 913.5 1253.5 c 0,122,123 - 953.003 1229.99 953.003 1229.99 969 1197 c 0,124,125 - 981.772 1169.25 981.772 1169.25 981.839 1147.23 c 0,126,127 - 981.924 1119.24 981.924 1119.24 961.5 1100.5 c 0,128,129 - 942.278 1082.86 942.278 1082.86 919.867 1082.83 c 0,130,131 - 899.721 1082.8 899.721 1082.8 877 1097 c 0,132,133 - 907 1097 907 1097 907 1116 c 0,134,135 - 907 1136.99 907 1136.99 873.5 1154.5 c 0,136,137 - 859.98 1158.04 l 0,138,139 - 840.37 1156.54 840.37 1156.54 840 1104 c 0,140,141 - 840 1080 840 1080 851.5 1052 c 0,142,-1 - 869 1010 l 0,143,144 - 896 941 896 941 908.5 966 c 0,145,146 - 921 991 921 991 906 1008 c 0,147,148 - 939 1008 939 1008 950.5 966 c 0,149,150 - 962 924 962 924 962 913 c 0,151,152 - 962 849 962 849 953.5 758.5 c 0,153,154 - 945 668 945 668 975 611 c 0,155,156 - 984 591 984 591 1019 539 c 0,157,158 - 1053.42 487.858 1053.42 487.858 1069 478 c 0,159,160 - 1087.99 466.009 1087.99 466.009 1105.5 429.5 c 0,161,162 - 1110.37 419.346 1110.37 419.346 1110.48 409.695 c 0,163,164 - 1110.57 401.279 1110.57 401.279 1107.05 393.244 c 0,165,166 - 1100.08 377.377 1100.08 377.377 1079 363 c 0,167,168 - 1084.24 378.447 1084.24 378.447 1084.46 389.787 c 0,169,170 - 1081.44 405.63 l 0,171,172 - 1074.39 420.005 1074.39 420.005 1051 421 c 0,173,174 - 1032.22 419.204 l 0,175,176 - 1015.67 414.069 1015.67 414.069 1015.63 395.11 c 0,177,178 - 1015.62 392.216 1015.62 392.216 1016 389 c 0,179,180 - 1028 288.996 1028 288.996 1102.5 232 c 0,181,182 - 1177 175.004 1177 175.004 1186 88 c 0,183,184 - 1189.26 21.1694 l 0,185,186 - 1188.68 -24.9163 1188.68 -24.9163 1179.5 -64 c 0,187,188 - 1164.01 -129.994 1164.01 -129.994 1101 -190 c 1,0,1 -619 690 m 1,115,116 - 634 708 634 708 649.5 729.5 c 0,117,118 - 665 751 665 751 683 764 c 0,119,120 - 703.141 776.451 703.141 776.451 718.052 776.43 c 0,121,122 - 743.859 776.394 743.859 776.394 754 739 c 0,123,124 - 718 758 718 758 703 748 c 0,125,126 - 695.286 742.857 695.286 742.857 695.242 733.747 c 0,127,128 - 695.2 725.143 695.2 725.143 702 713 c 0,129,130 - 726 668 726 668 768.5 715 c 0,131,132 - 801.516 751.512 801.516 751.512 801.642 804.32 c 0,133,134 - 801.678 819.488 801.678 819.488 799 836 c 0,135,136 - 793 871 793 871 747 983 c 0,137,138 - 710.201 1072.6 710.201 1072.6 681.72 1073.24 c 0,139,140 - 670.911 1070.1 l 0,141,142 - 669.443 1069.18 669.443 1069.18 668 1068 c 0,143,144 - 641 1045.99 641 1045.99 649.5 1012.5 c 0,145,146 - 658 979 658 979 661 948 c 0,147,148 - 660.631 904.308 l 0,149,150 - 656.786 866.042 656.786 866.042 640.5 829 c 0,151,152 - 615 771 615 771 521 807 c 0,153,154 - 548 804 548 804 586 824.5 c 0,155,156 - 624 845 624 845 579 884 c 0,157,158 - 570.784 890.676 570.784 890.676 561.249 890.627 c 0,159,160 - 552.216 890.581 552.216 890.581 542 884.5 c 0,161,162 - 521 872 521 872 509 856 c 0,163,164 - 440 763 440 763 512.5 704 c 0,165,166 - 585 645 585 645 619 690 c 1,115,116 -EndSplineSet -KernsSLIF: 99 -130 0 0 109 -78 0 0 104 -117 0 0 45 -182 0 0 115 -208 0 0 121 -299 0 0 116 -342 0 0 118 -43 0 0 119 -221 0 0 -EndChar -StartChar: b -Encoding: 98 98 18 -Width: 1083 -Flags: HMW -HStem: 40.8 160.65<365.16 635.205> 617.1 218.45<359.04 641.325> 1229.95 170<339.15 591.6> 1316.65 94.35<25.5 180.795> -VStem: 209.1 130.05<-23.8 1399.95> -Fore -426.7 185.3 m 1,0,1 - 482.159 184.3 l 0,2,3 - 531.98 186.879 531.98 186.879 587.35 201.45 c 0,4,5 - 674.56 224.4 674.56 224.4 735.76 252.45 c 0,6,7 - 787.78 275.4 787.78 275.4 844.9 337.45 c 0,8,9 - 880.496 376.117 880.496 376.117 880.837 408.843 c 0,10,11 - 877.226 429.789 l 0,12,13 - 874.124 438.244 874.124 438.244 868.359 446.25 c 0,14,15 - 856.121 462.4 856.121 462.4 830.62 468.775 c 0,16,17 - 805.12 475.15 805.12 475.15 784.721 454.75 c 0,18,19 - 775.451 445.243 775.451 445.243 775.402 431.167 c 0,20,21 - 775.382 425.107 775.382 425.107 777.07 418.2 c 0,22,23 - 782.68 395.25 782.68 395.25 818.38 380.8 c 0,24,25 - 790.84 360.4 790.84 360.4 741.88 387.175 c 0,26,27 - 700.418 409.849 700.418 409.849 699.92 445.63 c 0,28,29 - 699.83 452.101 699.83 452.101 701.08 459 c 0,30,31 - 709.24 509.15 709.24 509.15 758.2 539.325 c 0,32,33 - 807.16 569.5 807.16 569.5 790.84 612.85 c 0,34,35 - 777.58 646 777.58 646 704.141 670.65 c 0,36,37 - 630.699 695.299 630.699 695.299 560.32 700.4 c 0,38,39 - 496.06 704.649 496.06 704.649 440.47 697.85 c 0,40,41 - 384.88 691.051 384.88 691.051 359.38 636.65 c 0,42,43 - 337.96 594.151 337.96 594.151 334.9 547.4 c 0,44,45 - 333.928 474.045 l 0,46,47 - 334.294 465.198 334.294 465.198 334.9 456.45 c 0,48,49 - 334.9 429.25 334.9 429.25 361.93 407.15 c 0,50,51 - 374.852 396.585 374.852 396.585 391.621 396.51 c 0,52,53 - 409.928 396.428 409.928 396.428 432.82 408.85 c 0,54,55 - 467.684 428.219 467.684 428.219 468.122 451.755 c 0,56,57 - 464.95 467.075 l 0,58,59 - 451.18 499.8 451.18 499.8 414.46 510 c 0,60,61 - 437.91 523.68 437.91 523.68 462.372 523.6 c 0,62,63 - 480.469 523.54 480.469 523.54 499.12 515.95 c 0,64,65 - 545.059 496.808 545.059 496.808 545.48 454.907 c 0,66,67 - 545.527 450.291 545.527 450.291 545.021 445.4 c 0,68,69 - 539.919 396.099 539.919 396.099 510.34 368.9 c 0,70,71 - 482.8 343.4 482.8 343.4 420.58 301.325 c 0,72,73 - 358.359 259.25 358.359 259.25 367.54 221 c 0,74,75 - 373.66 189.549 373.66 189.549 426.7 185.3 c 0,76,-1 - 426.7 185.3 l 1,0,1 -346.289 870.4 m 1,44,45 - 374.387 839.903 374.387 839.903 420.997 839.912 c 0,46,47 - 438.15 839.915 438.15 839.915 457.81 844.05 c 0,48,49 - 603.802 874.755 603.802 874.755 607.75 884 c 0,50,-1 - 726.75 986 l 0,51,52 - 758.7 1033.93 758.7 1033.93 760.75 1139 c 0,53,54 - 757.517 1164.82 l 0,55,56 - 744.581 1211.19 744.581 1211.19 680.169 1246.95 c 0,57,58 - 610.978 1284.48 610.978 1284.48 564.236 1284.64 c 0,59,60 - 555.885 1284.66 555.885 1284.66 548.25 1283.5 c 0,61,62 - 515.57 1278.17 515.57 1278.17 545.189 1206.58 c 0,63,64 - 573.239 1137.3 573.239 1137.3 539.58 1074.4 c 0,65,66 - 493.969 990.462 493.969 990.462 419.145 989.885 c 0,67,68 - 413.651 989.843 413.651 989.843 408 990.25 c 0,69,70 - 461.193 1002.56 461.193 1002.56 461.588 1072.75 c 0,71,72 - 461.602 1075.24 461.602 1075.24 461.55 1077.8 c 0,73,74 - 460.02 1152.6 460.02 1152.6 400.859 1152.6 c 0,75,76 - 350.893 1152.6 350.893 1152.6 331.5 998.75 c 0,77,78 - 327.473 940.051 l 0,79,80 - 327.837 888.625 327.837 888.625 346.289 870.4 c 0,81,-1 - 346.289 870.4 l 1,44,45 -279.65 36.125 m 145,-1,-1 - 184.789 -11.4746 l 0,45,46 - 159.502 -9.35944 l 0,47,48 - 129.359 -1.62558 129.359 -1.62558 126.267 32.7246 c 0,49,50 - 126.948 66.7202 l 0,51,52 - 130.7 93.8745 130.7 93.8745 145.01 117.725 c 0,53,54 - 140.419 37.8253 140.419 37.8253 171.02 48.875 c 0,55,56 - 201.62 59.9251 201.62 59.9251 206.592 124.1 c 0,57,58 - 211.563 188.275 211.563 188.275 203.532 264.775 c 0,59,60 - 195.5 341.275 195.5 341.275 180.582 410.125 c 0,61,62 - 165.665 478.973 165.665 478.973 158.014 498.525 c 0,63,64 - 125.887 571.621 125.887 571.621 111.35 600.95 c 0,65,66 - 93.3115 637.34 93.3115 637.34 53.21 692.325 c 0,67,68 - 21.4043 735.935 21.4043 735.935 21.3251 790.518 c 0,69,70 - 21.3148 797.641 21.3148 797.641 21.8447 804.95 c 0,71,72 - 26.4336 868.276 26.4336 868.276 71.5693 903.125 c 0,73,74 - 89.6215 917.105 89.6215 917.105 112.368 917.176 c 0,75,76 - 121.43 917.204 121.43 917.204 131.238 915.025 c 0,77,78 - 165.664 907.375 165.664 907.375 169.488 836.825 c 0,79,80 - 154.453 858.406 154.453 858.406 130.692 858.606 c 0,81,82 - 125.441 858.65 125.441 858.65 119.764 857.65 c 0,83,84 - 88.4003 852.125 88.4003 852.125 92.9883 800.275 c 0,85,86 - 96.8135 755.225 96.8135 755.225 130.475 753.95 c 0,87,88 - 152.528 756.629 l 0,89,90 - 169.195 762.046 169.195 762.046 177.904 778.175 c 0,91,92 - 208.147 831.941 208.147 831.941 208.122 949.45 c 0,93,94 - 207.738 1066.34 207.738 1066.34 203.15 1136.88 c 0,95,96 - 199.325 1188.72 199.325 1188.72 182.494 1252.9 c 0,97,98 - 167.916 1308.49 167.916 1308.49 116.417 1308.61 c 0,99,100 - 107.206 1308.63 107.206 1308.63 96.8135 1306.88 c 0,101,102 - 45.3775 1298.19 45.3775 1298.19 45.4768 1255.64 c 0,103,104 - 45.4942 1248.2 45.4942 1248.2 47.0889 1239.72 c 0,105,106 - 57.7988 1182.79 57.7988 1182.79 80.75 1179.38 c 0,107,108 - 59.2039 1176.94 l 0,109,110 - 28.1379 1179.12 28.1379 1179.12 7.69141 1217.2 c 0,111,112 - -7.80302 1246.06 -7.80302 1246.06 -7.73372 1278.37 c 0,113,114 - -7.68156 1302.69 -7.68156 1302.69 1.18848 1328.97 c 0,115,116 - 34.7996 1426.53 34.7996 1426.53 120.092 1427.05 c 0,117,118 - 156.484 1423.33 l 0,119,-1 - 235.662 1407.6 l 0,120,121 - 259.896 1404.67 l 0,122,123 - 288.348 1405.15 288.348 1405.15 332.859 1419.5 c 0,124,125 - 373.66 1433.1 373.66 1433.1 406.81 1470.5 c 0,126,127 - 440.005 1507.95 440.005 1507.95 467.5 1535.95 c 0,128,129 - 485.874 1555.51 485.874 1555.51 524.109 1572.08 c 0,130,131 - 553.312 1584.73 553.312 1584.73 579.849 1584.75 c 0,132,133 - 588.062 1584.76 588.062 1584.76 596.021 1583.55 c 0,134,135 - 643.954 1576.76 643.954 1576.76 688.84 1535.95 c 0,136,137 - 717.922 1509.51 717.922 1509.51 717.881 1472.01 c 0,138,139 - 717.858 1452.1 717.858 1452.1 709.24 1428 c 0,140,141 - 702.102 1456.04 702.102 1456.04 643.45 1495.15 c 0,142,143 - 623.166 1508.67 623.166 1508.67 606.944 1508.87 c 0,144,145 - 598.781 1508.97 598.781 1508.97 591.647 1505.69 c 0,146,147 - 572.968 1497.11 572.968 1497.11 561.34 1465.4 c 0,148,149 - 550.12 1434.8 550.12 1434.8 665.38 1378.28 c 0,150,151 - 780.658 1321.74 780.658 1321.74 811.24 1287.75 c 0,152,153 - 887.742 1200.19 887.742 1200.19 902.53 1105 c 0,154,155 - 908.699 1065.29 908.699 1065.29 908.628 1027.72 c 0,156,157 - 908.519 970.361 908.519 970.361 893.859 918 c 0,158,159 - 886.72 892.498 886.72 892.498 847.45 853.825 c 0,160,161 - 819.755 826.55 819.755 826.55 792.314 826.543 c 0,162,163 - 780.845 826.539 780.845 826.539 769.42 831.3 c 0,164,165 - 797.979 861.049 797.979 861.049 769.42 872.1 c 0,166,167 - 753.683 874.809 l 0,168,169 - 739.244 873.686 739.244 873.686 735.76 855.1 c 0,170,171 - 728.62 816.85 728.62 816.85 808.69 722.5 c 0,172,173 - 889.862 626.849 889.862 626.849 918.34 666.4 c 0,174,175 - 933.641 687.651 933.641 687.651 918.34 717.4 c 0,176,177 - 903.04 747.15 903.04 747.15 871.42 770.1 c 0,178,179 - 963.221 767.55 963.221 767.55 1004.02 693.175 c 0,180,181 - 1044.82 618.8 1044.82 618.8 1046.86 590.75 c 0,182,183 - 1044.78 549.144 l 0,184,185 - 1038.75 505.432 1038.75 505.432 1016.77 447.1 c 0,186,187 - 983.62 359.55 983.62 359.55 983.62 288.15 c 0,188,189 - 983.62 202.3 983.62 202.3 971.38 134.3 c 0,190,191 - 959.141 66.2997 959.141 66.2997 922.42 22.9502 c 0,192,193 - 878.56 -28.0498 878.56 -28.0498 805.12 -42.5 c 0,194,195 - 768.4 -50.1505 768.4 -50.1505 705.67 -44.2002 c 0,196,197 - 642.94 -38.25 642.94 -38.25 616.42 -17 c 0,198,199 - 647.676 -20.065 l 0,200,201 - 678.398 -19.3574 678.398 -19.3574 708.221 -3.8252 c 0,202,203 - 737.354 11.3484 737.354 11.3484 737.606 32.6744 c 0,204,205 - 737.702 40.8109 737.702 40.8109 733.594 49.8429 c 0,206,207 - 731.27 54.953 731.27 54.953 727.6 60.3496 c 0,208,209 - 710.26 85.8496 710.26 85.8496 621.521 82.4502 c 0,210,211 - 532.781 79.0499 532.781 79.0499 497.08 76.5 c 0,212,-1 - 382.84 67.5752 l 0,213,214 - 337.222 59.1049 337.222 59.1049 279.65 36.125 c 145,-1,-1 -EndSplineSet -EndChar -StartChar: c -Encoding: 99 99 19 -Width: 1171 -Flags: W -Fore -130 1163 m 1,0,1 - 132.395 1186.83 l 0,2,3 - 140.998 1220.08 140.998 1220.08 178.5 1260.5 c 0,4,5 - 207.417 1291.66 207.417 1291.66 233.339 1292.09 c 0,6,7 - 251.453 1288.48 l 0,8,9 - 261.996 1284 261.996 1284 272 1274 c 0,10,11 - 226.25 1267.25 226.25 1267.25 226.063 1236.88 c 0,12,13 - 226 1226.75 226 1226.75 231 1214 c 0,14,15 - 238.091 1193.2 238.091 1193.2 250.769 1193.3 c 0,16,17 - 264.909 1193.4 264.909 1193.4 286 1219.5 c 0,18,19 - 325.995 1268.99 325.995 1268.99 334 1286 c 0,20,21 - 358.997 1338.99 358.997 1338.99 366 1392 c 0,22,23 - 373.001 1445 373.001 1445 409 1490 c 0,24,25 - 436.611 1525.5 436.611 1525.5 481.5 1525.5 c 0,26,27 - 525.998 1525.01 525.998 1525.01 538 1492 c 0,28,29 - 480 1492 480 1492 499 1465 c 0,30,31 - 509.578 1449.72 509.578 1449.72 524.471 1449.64 c 0,32,33 - 534.923 1449.58 534.923 1449.58 547.5 1457 c 0,34,35 - 577.986 1474.99 577.986 1474.99 593 1489 c 0,36,37 - 621.242 1516.57 621.242 1516.57 621.224 1533.29 c 0,38,39 - 621.216 1541.43 621.216 1541.43 614.5 1547 c 0,40,41 - 594 1563.99 594 1563.99 564 1547 c 0,42,43 - 567.001 1588.01 567.001 1588.01 599.5 1593 c 0,44,45 - 630.619 1594.13 l 0,46,47 - 643.508 1592.77 643.508 1592.77 654 1588 c 0,48,49 - 749.093 1541.95 749.093 1541.95 811.5 1505 c 0,50,51 - 874 1467.99 874 1467.99 892 1460 c 0,52,53 - 923.249 1445.25 923.249 1445.25 951.459 1445.18 c 0,54,55 - 955.764 1445.17 955.764 1445.17 960 1445.5 c 0,56,57 - 1000.05 1444.5 l 0,58,59 - 1015.33 1442.75 1015.33 1442.75 1032 1439 c 0,60,61 - 1053.01 1433 1053.01 1433 1059.5 1404.5 c 0,62,63 - 1065.99 1376 1065.99 1376 1058 1349 c 0,64,65 - 1024.88 1380.05 1024.88 1380.05 1003.65 1380.15 c 0,66,67 - 994.125 1380.2 994.125 1380.2 987 1374 c 0,68,69 - 964 1354.01 964 1354.01 963 1294 c 0,70,71 - 961.999 1263.98 961.999 1263.98 959.5 1234 c 0,72,73 - 957 1204 957 1204 969 1177 c 0,74,75 - 988.003 1130 988.003 1130 1028 1119.5 c 0,76,77 - 1068.01 1109 1068.01 1109 1116 1106 c 0,78,79 - 1103.78 1081.57 1103.78 1081.57 1061.37 1081.35 c 0,80,81 - 1051.72 1081.3 1051.72 1081.3 1040.5 1082.5 c 0,82,83 - 980.007 1088.99 980.007 1088.99 961 1104 c 0,84,85 - 906.204 1143.52 906.204 1143.52 905.876 1183.45 c 0,86,87 - 905.839 1187.97 905.839 1187.97 906.5 1192.5 c 0,88,89 - 906.604 1224.3 l 0,90,91 - 902.367 1263.58 902.367 1263.58 879 1322 c 0,92,93 - 857.998 1373.01 857.998 1373.01 794 1384 c 0,94,95 - 762.159 1385.67 l 0,96,97 - 718.588 1382.3 718.588 1382.3 686 1346 c 0,98,99 - 653.006 1308.01 653.006 1308.01 627.5 1257 c 0,100,101 - 602 1206 602 1206 572 1167 c 0,102,103 - 560.987 1152.31 560.987 1152.31 518.784 1152.37 c 0,104,105 - 515.018 1152.38 515.018 1152.38 511 1152.5 c 0,106,107 - 466.355 1153.87 466.355 1153.87 465.708 1179.72 c 0,108,109 - 465.644 1182.24 465.644 1182.24 466 1185 c 0,110,111 - 495 1170 495 1170 522 1188 c 0,112,113 - 547.852 1205.23 547.852 1205.23 548 1235 c 0,114,115 - 547.031 1266.97 547.031 1266.97 528.5 1267 c 0,116,117 - 509.991 1265.99 509.991 1265.99 495 1257 c 0,118,119 - 450.683 1226.47 450.683 1226.47 430 1200.5 c 0,120,121 - 409.998 1175 409.998 1175 398 1123 c 0,122,123 - 387.25 1077.98 387.25 1077.98 387.334 1035.68 c 0,124,125 - 387.375 1015.02 387.375 1015.02 390 995 c 0,126,-1 - 407 865 l 0,127,128 - 410 830 410 830 423.5 794 c 0,129,130 - 437 758 437 758 432 724 c 0,131,132 - 415.795 633.439 415.795 633.439 333.252 632.842 c 0,133,134 - 329.206 632.813 329.206 632.813 325 633 c 0,135,136 - 342 645 342 645 362.5 669 c 0,137,138 - 383 693 383 693 368 720 c 0,139,140 - 355 742 355 742 318.5 730 c 0,141,142 - 282 718 282 718 279 695 c 0,143,144 - 264 611 264 611 263 541.5 c 0,145,146 - 266.367 498.172 l 0,147,148 - 274.626 448.904 274.626 448.904 303 397 c 0,149,150 - 322.999 359.001 322.999 359.001 353.5 353.5 c 0,151,152 - 384 348 384 348 397 405 c 0,153,154 - 399.148 427.344 l 0,155,156 - 398.563 432.875 398.563 432.875 396.5 437 c 0,157,158 - 391 448 391 448 379 469 c 0,159,160 - 399.007 462.998 399.007 462.998 417.5 458 c 0,161,162 - 436 453 436 453 447 433 c 0,163,164 - 468 391 468 391 471 351 c 0,165,166 - 474 311.003 474 311.003 488 268 c 0,167,168 - 504 216 504 216 538 207 c 0,169,170 - 557.5 200.76 557.5 200.76 573.62 200.638 c 0,171,172 - 586.718 200.539 586.718 200.539 597.585 204.479 c 0,173,174 - 624.781 214.339 624.781 214.339 638 249.5 c 0,175,176 - 663 316 663 316 696 364 c 0,177,178 - 709 382 709 382 735 379.5 c 0,179,180 - 761 377 761 377 776 353 c 0,181,182 - 791 329 791 329 788 311 c 0,183,184 - 763 325 763 325 743.5 313 c 0,185,186 - 724 301 724 301 741 281 c 0,187,188 - 751.698 266.413 751.698 266.413 764.877 266.011 c 0,189,190 - 779.807 269.701 l 0,191,192 - 787.321 273.45 787.321 273.45 795.5 281 c 0,193,194 - 828 311 828 311 831 356 c 0,195,196 - 829.957 415.261 l 0,197,198 - 823.929 488.15 823.929 488.15 795 570 c 0,199,200 - 790.425 583.218 790.425 583.218 790.501 606.128 c 0,201,202 - 790.575 628.283 790.575 628.283 795 659.5 c 0,203,204 - 804 723 804 723 835 768 c 0,205,206 - 830.002 721.017 830.002 721.017 824 674 c 0,207,208 - 818 627 818 627 833 581 c 0,209,210 - 844 548 844 548 857.5 513.5 c 0,211,212 - 871 479 871 479 886 452 c 0,213,214 - 913 405 913 405 937.5 378.5 c 0,215,216 - 962 352 962 352 1013 358 c 0,217,218 - 1033.63 360.063 1033.63 360.063 1033.93 381.977 c 0,219,220 - 1030 406 l 0,221,222 - 1046.99 412 1046.99 412 1061.5 387.5 c 0,223,224 - 1073.22 367.704 1073.22 367.704 1073.51 356.063 c 0,225,226 - 1073.58 353.302 1073.58 353.302 1073 351 c 0,227,228 - 1062.99 299 1062.99 299 1004 279 c 0,229,230 - 978 270 978 270 949.5 270.5 c 0,231,232 - 921 271 921 271 898 259 c 0,233,234 - 867 242.001 867 242.001 863.5 178.5 c 0,235,236 - 860 115.001 860 115.001 842 81 c 0,237,238 - 821 43 821 43 766 33 c 0,239,240 - 744 28 744 28 703.5 36 c 0,241,242 - 663 44 663 44 664 80 c 0,243,244 - 691 55 691 55 725 75 c 0,245,246 - 745 85.9999 745 85.9999 736 111.5 c 0,247,248 - 727 137 727 137 708 141 c 0,249,250 - 679.592 141.611 l 0,251,252 - 652.565 138.87 652.565 138.87 616 125 c 0,253,254 - 525 90.9996 525 90.9996 473 65 c 0,255,256 - 421 39 421 39 335 79 c 0,257,258 - 306 91 306 91 300.5 137.5 c 0,259,260 - 300.225 168.721 l 0,261,262 - 303.157 189.438 303.157 189.438 316 198 c 0,263,264 - 316 161.999 316 161.999 332.5 142 c 0,265,266 - 341.348 131.275 341.348 131.275 350.627 130.902 c 0,267,268 - 361.932 134.19 l 0,269,270 - 364.451 135.734 364.451 135.734 367 138 c 0,271,272 - 381.21 150.918 381.21 150.918 381.339 168.895 c 0,273,274 - 381.439 182.643 381.439 182.643 373.303 199.348 c 0,275,276 - 359.136 228.439 359.136 228.439 320 266.5 c 0,277,278 - 229 355 229 355 202 366 c 0,279,280 - 166.426 353.951 166.426 353.951 166.407 335.647 c 0,281,282 - 166.393 322.049 166.393 322.049 186 305 c 0,283,284 - 231.999 265.001 231.999 265.001 267 264 c 0,285,286 - 196.001 254 196.001 254 165 288 c 0,287,288 - 134.001 321.999 134.001 321.999 113 369 c 0,289,290 - 87.6341 423.536 87.6341 423.536 87.6032 491.344 c 0,291,292 - 87.5854 530.464 87.5854 530.464 96 574 c 0,293,294 - 108 633 108 633 140 689 c 0,295,296 - 172 745 172 745 175 806 c 0,297,298 - 178 896 178 896 155.5 984.5 c 0,299,300 - 133 1073 133 1073 130 1163 c 1,0,1 -EndSplineSet -KernsSLIF: 115 -117 0 0 97 -104 0 0 -EndChar -StartChar: d -Encoding: 100 100 60 -Width: 1313 -Flags: MW -VStem: 197 151.5<8.5 1487> -Fore -334 -30 m 1,0,1 - 377.834 -63.5206 377.834 -63.5206 415.436 -63.5899 c 0,2,3 - 436.165 -63.6281 436.165 -63.6281 455 -53.5 c 0,4,5 - 508 -25 508 -25 508 -10 c 0,6,7 - 506 21 506 21 458 20.5 c 0,8,9 - 410 20 410 20 348.5 8.5 c 0,10,11 - 287 -3 287 -3 228 -17.5 c 0,12,13 - 181.952 -28.8171 181.952 -28.8171 157.832 -28.8647 c 0,14,15 - 151.049 -28.8781 151.049 -28.8781 146 -28 c 0,16,17 - 98 -19 98 -19 54.5 29 c 0,18,19 - 11 77 11 77 50 164 c 0,20,21 - 51.0001 77.9999 51.0001 77.9999 91.5 56.5 c 0,22,23 - 132 35 132 35 180 52 c 0,24,25 - 227.999 68.9997 227.999 68.9997 268 112.5 c 0,26,27 - 308 155.999 308 155.999 308 203 c 0,28,29 - 308 222.999 308 222.999 281.5 263 c 0,30,31 - 257.972 298.514 257.972 298.514 234.05 298.555 c 0,32,33 - 231.028 298.561 231.028 298.561 228 298 c 0,34,35 - 193.875 292.75 193.875 292.75 193.82 247.688 c 0,36,37 - 193.812 241.25 193.812 241.25 194.5 234 c 0,38,39 - 200.001 175.999 200.001 175.999 229 156 c 0,40,41 - 191.999 157.001 191.999 157.001 181 168 c 0,42,43 - 170 179 170 179 164 196 c 0,44,45 - 147.605 234.879 147.605 234.879 147.667 279.024 c 0,46,47 - 147.737 329.122 147.737 329.122 169 386 c 0,48,49 - 209.007 493.016 209.007 493.016 240 562 c 0,50,51 - 262.001 612 262.001 612 268.5 657 c 0,52,53 - 270.99 707.825 l 0,54,55 - 270.407 743.335 270.407 743.335 265 792 c 0,56,57 - 254.001 877.999 254.001 877.999 193.5 953.5 c 0,58,59 - 133.003 1028.99 133.003 1028.99 120 1074 c 0,60,61 - 113.455 1094.73 113.455 1094.73 113.455 1114.93 c 0,62,63 - 113.455 1150.28 113.455 1150.28 133.5 1184 c 0,64,65 - 159.451 1227.66 159.451 1227.66 208.138 1227.89 c 0,66,67 - 218.549 1227.94 218.549 1227.94 230 1226 c 0,68,69 - 208.997 1217 208.997 1217 195.5 1189 c 0,70,71 - 190.804 1179.26 190.804 1179.26 190.888 1170.73 c 0,72,73 - 191.044 1154.74 191.044 1154.74 208 1143 c 0,74,75 - 219.174 1134.49 219.174 1134.49 227.907 1134.36 c 0,76,77 - 234.827 1134.26 234.827 1134.26 240.213 1139.43 c 0,78,79 - 253.577 1152.25 253.577 1152.25 257.5 1197.5 c 0,80,81 - 265 1284.01 265 1284.01 258 1322 c 0,82,83 - 248.999 1370.01 248.999 1370.01 228 1406.5 c 0,84,85 - 207.005 1442.99 207.005 1442.99 197 1487 c 0,86,87 - 191.696 1508.7 191.696 1508.7 191.74 1532.38 c 0,88,89 - 191.787 1557.8 191.787 1557.8 198 1585.5 c 0,90,91 - 209.999 1639 209.999 1639 247 1672 c 0,92,93 - 272.994 1695.99 272.994 1695.99 322 1697 c 0,94,95 - 353.127 1694.13 l 0,96,97 - 377.447 1688.33 377.447 1688.33 389 1671 c 0,98,99 - 398 1656 398 1656 404.5 1641 c 0,100,101 - 407.204 1623.97 l 0,102,103 - 406.891 1611.85 406.891 1611.85 402 1595 c 0,104,105 - 396 1617.99 396 1617.99 349 1635.5 c 0,106,107 - 302 1653.01 302 1653.01 287 1592 c 0,108,109 - 275 1545.01 275 1545.01 314.5 1517 c 0,110,111 - 353.959 1489.02 353.959 1489.02 396 1470 c 0,112,113 - 433.024 1451.99 433.024 1451.99 549.5 1421.5 c 0,114,115 - 589.846 1410.94 589.846 1410.94 617.657 1410.87 c 0,116,117 - 657.976 1410.77 657.976 1410.77 671.957 1432.72 c 0,118,119 - 676.18 1439.36 676.18 1439.36 678 1448 c 0,120,121 - 681.935 1486.52 l 0,122,123 - 681.575 1537.19 681.575 1537.19 645 1552.5 c 0,124,125 - 621.099 1562.5 621.099 1562.5 601.002 1562.63 c 0,126,127 - 584.9 1562.73 584.9 1562.73 571.241 1556.48 c 0,128,129 - 567.003 1554.55 567.003 1554.55 563 1552 c 0,130,131 - 563 1590.99 563 1590.99 593 1604 c 0,132,133 - 622.962 1616.99 622.962 1616.99 629 1618 c 0,134,135 - 695 1621 695 1621 723.5 1597 c 0,136,137 - 752 1573 752 1573 765 1549 c 0,138,139 - 785.996 1510.01 785.996 1510.01 800.5 1455.5 c 0,140,141 - 815 1401.01 815 1401.01 851 1379 c 0,142,143 - 908.983 1342.01 908.983 1342.01 934.5 1333 c 0,144,145 - 960 1324 960 1324 1024 1315 c 0,146,147 - 1112.99 1301.99 1112.99 1301.99 1135 1228 c 0,148,149 - 1140.22 1208.71 1140.22 1208.71 1140.13 1192.05 c 0,150,151 - 1139.85 1135.97 1139.85 1135.97 1078 1109 c 0,152,153 - 1094.92 1132.07 1094.92 1132.07 1094.98 1158.11 c 0,154,155 - 1095 1165.92 1095 1165.92 1093.5 1174 c 0,156,157 - 1087.84 1204.5 1087.84 1204.5 1050.65 1204.62 c 0,158,159 - 1045.17 1204.64 1045.17 1204.64 1039 1204 c 0,160,161 - 1022.33 1202.15 1022.33 1202.15 1022.05 1180.66 c 0,162,163 - 1026.65 1151.28 l 0,164,165 - 1027.28 1148.94 1027.28 1148.94 1028 1146.5 c 0,166,167 - 1044.01 1091.99 1044.01 1091.99 1056 1070 c 0,168,169 - 1105.98 963.021 1105.98 963.021 1173.5 863.5 c 0,170,171 - 1241.01 763.992 1241.01 763.992 1246 707 c 0,172,173 - 1244.58 673.304 l 0,174,175 - 1236.64 624.131 1236.64 624.131 1194 580 c 0,176,177 - 1179 565 1179 565 1144.5 562 c 0,178,179 - 1110 559 1110 559 1089 571 c 0,180,181 - 1122 571 1122 571 1138.5 597.5 c 0,182,183 - 1145.85 609.313 1145.85 609.313 1145.96 618.841 c 0,184,185 - 1146.05 627.748 1146.05 627.748 1139.81 634.659 c 0,186,187 - 1137.75 636.938 1137.75 636.938 1135 639 c 0,188,189 - 1121.36 648.356 1121.36 648.356 1109.39 648.29 c 0,190,191 - 1090.64 648.186 1090.64 648.186 1076 625 c 0,192,193 - 1052 587.002 1052 587.002 1043 564 c 0,194,195 - 1041.99 559.967 1041.99 559.967 997 446.5 c 0,196,197 - 974.979 390.957 974.979 390.957 974.75 361.637 c 0,198,199 - 974.65 348.854 974.65 348.854 978.693 341.055 c 0,200,201 - 984.326 330.189 984.326 330.189 998 329 c 0,202,203 - 1023.15 329.34 l 0,204,205 - 1039.03 332.237 1039.03 332.237 1046.5 343 c 0,206,207 - 1059 361.014 1059 361.014 1071 397 c 0,208,209 - 1088.77 358.229 1088.77 358.229 1088.85 329.175 c 0,210,211 - 1088.93 304.269 1088.93 304.269 1076 286.5 c 0,212,213 - 1048 248.001 1048 248.001 1022 238 c 0,214,215 - 869.999 176 869.999 176 814.5 173 c 0,216,217 - 759 170 759 170 652 20 c 0,218,219 - 541 -136 541 -136 452.5 -121 c 0,220,221 - 364 -106 364 -106 334 -30 c 1,0,1 -640 273 m 0,118,119 - 660 292 660 292 698.5 340 c 0,120,121 - 737 388 737 388 751 411 c 0,122,123 - 772 447 772 447 779 481.5 c 0,124,-1 - 794 558 l 0,125,126 - 807 630 807 630 855.5 644 c 0,127,128 - 904 658 904 658 919 635 c 0,129,130 - 875 635 875 635 860 607 c 0,131,132 - 850.854 589.926 850.854 589.926 850.631 578.431 c 0,133,134 - 853.459 566.831 l 0,135,136 - 854 566 l 0,137,138 - 884 522 884 522 929.5 597.5 c 0,139,140 - 975 673 975 673 981 742 c 0,141,142 - 979.57 790.509 l 0,143,144 - 974.2 842.742 974.2 842.742 953.5 917 c 0,145,146 - 929.084 1004.59 929.084 1004.59 891.747 1005.06 c 0,147,148 - 875.211 1001.29 l 0,149,150 - 872.143 999.898 872.143 999.898 869 998 c 0,151,152 - 845 983 845 983 857 959.5 c 0,153,154 - 869 936 869 936 905 927 c 0,155,156 - 883.461 918.384 883.461 918.384 866.562 918.432 c 0,157,158 - 828.539 918.538 828.539 918.538 814 962.5 c 0,159,160 - 793.002 1025.99 793.002 1025.99 784 1077 c 0,161,162 - 769.001 1151.99 769.001 1151.99 708.5 1199.5 c 0,163,164 - 648 1247.01 648 1247.01 578 1256.5 c 0,165,166 - 508 1265.99 508 1265.99 447.5 1234 c 0,167,168 - 387.002 1202.01 387.002 1202.01 374 1119 c 0,169,170 - 372.342 1087.63 l 0,171,172 - 373.653 1071.46 373.653 1071.46 380 1058.5 c 0,173,174 - 392 1034.01 392 1034.01 423 1042 c 0,175,176 - 440 1046.01 440 1046.01 435.5 1066 c 0,177,178 - 430.999 1086 430.999 1086 410 1101 c 0,179,180 - 433.116 1101.63 l 0,181,182 - 462.692 1097.49 462.692 1097.49 481 1066 c 0,183,184 - 489 1051 489 1051 494 1025 c 0,185,186 - 494.287 1001.71 l 0,187,188 - 491.796 985.017 491.796 985.017 482 966 c 0,189,190 - 413.999 836.997 413.999 836.997 395.5 680 c 0,191,192 - 383.413 577.424 383.413 577.424 383.492 512.842 c 0,193,194 - 383.533 478.573 383.533 478.573 387 455 c 0,195,196 - 402 350 402 350 439 346.5 c 0,197,198 - 476 343 476 343 482 379 c 0,199,200 - 486 415 486 415 435 415 c 0,201,202 - 439 427 439 427 456 428.5 c 0,203,204 - 473.001 430 473.001 430 484 433 c 0,205,206 - 538 442 538 442 549 386.5 c 0,207,208 - 560 331 560 331 570 296 c 0,209,210 - 578 263 578 263 600 259 c 0,211,212 - 622 255 622 255 640 273 c 0,118,119 -EndSplineSet -KernsSLIF: 122 -91 0 0 97 -150 0 0 -EndChar -StartChar: e -Encoding: 101 101 54 -Width: 1080 -Flags: HMW -HStem: 142 27<40 136.5> 177.5 172<205.5 798> 722 137<316 666> 1260.15 167.854<365 744> -VStem: 114.5 149.5<412 1397> -Fore -611 199 m 0,0,1 - 532.994 197.999 532.994 197.999 452 182 c 0,2,3 - 370.998 165.999 370.998 165.999 302 133 c 0,4,5 - 242 103 242 103 166 89.5 c 0,6,7 - 89.9995 76 89.9995 76 40 142 c 0,8,9 - 16.5184 172.707 16.5184 172.707 16.6003 201.057 c 0,10,11 - 16.6544 219.793 16.6544 219.793 27 237.5 c 0,12,13 - 49.0431 275.228 49.0431 275.228 99.8393 275.219 c 0,14,15 - 108.956 275.217 108.956 275.217 119 274 c 0,16,-1 - 84 260.5 l 0,17,18 - 68.7059 254.765 68.7059 254.765 68.6159 232.948 c 0,19,20 - 68.5882 226.235 68.5882 226.235 70 218 c 0,21,22 - 77.7819 168.715 77.7819 168.715 121.824 168.025 c 0,23,24 - 136.5 169 l 0,25,26 - 194 177 194 177 206 240 c 0,27,28 - 209.42 259.054 209.42 259.054 209.379 285.629 c 0,29,30 - 209.336 313.444 209.336 313.444 205.5 349.5 c 0,31,32 - 198 420 198 420 144 428 c 0,33,34 - 130.002 426.996 l 0,35,36 - 120.296 423.593 120.296 423.593 114.5 412 c 0,37,38 - 105.001 393 105.001 393 108 376 c 0,39,40 - 114 339 114 339 144 310 c 0,41,42 - 85.9995 325 85.9995 325 65 379 c 0,43,44 - 26 481 26 481 54.5 590 c 0,45,46 - 83.0006 699.003 83.0006 699.003 101 799 c 0,47,48 - 117.001 895 117.001 895 120 939.5 c 0,49,50 - 123 984 123 984 113 1080 c 0,51,52 - 102.999 1161 102.999 1161 66 1248 c 0,53,54 - 32.5449 1326.66 32.5449 1326.66 32.6099 1399.61 c 0,55,56 - 32.6168 1407.34 32.6168 1407.34 33 1415 c 0,57,58 - 35.9995 1475.99 35.9995 1475.99 75 1507 c 0,59,60 - 104.849 1532.01 104.849 1532.01 129.979 1532.28 c 0,61,62 - 149.015 1528.68 l 0,63,64 - 174.29 1518.42 174.29 1518.42 194 1479 c 0,65,66 - 174.301 1496.91 174.301 1496.91 155.139 1496.82 c 0,67,68 - 142.197 1496.77 142.197 1496.77 129.5 1488.5 c 0,69,70 - 98 1467.99 98 1467.99 114 1427 c 0,71,72 - 129.519 1384.33 129.519 1384.33 180 1384 c 0,73,74 - 230.015 1385.01 230.015 1385.01 264 1397 c 0,75,76 - 349.99 1424 349.99 1424 440.5 1495 c 0,77,78 - 517.902 1555.72 517.902 1555.72 599.319 1555.73 c 0,79,80 - 613.102 1555.74 613.102 1555.74 627 1554 c 0,81,82 - 663.003 1548 663.003 1548 683.5 1514 c 0,83,84 - 693.597 1497.25 693.597 1497.25 693.627 1480.75 c 0,85,86 - 693.657 1463.75 693.657 1463.75 683 1447 c 0,87,88 - 675.449 1501.53 675.449 1501.53 628.135 1501.87 c 0,89,90 - 619.051 1501.93 619.051 1501.93 608.5 1500 c 0,91,92 - 543 1488 543 1488 544 1449 c 0,93,94 - 544 1398.96 544 1398.96 594.427 1399.05 c 0,95,96 - 608.5 1399.07 608.5 1399.07 626.5 1403 c 0,97,98 - 708.714 1420.94 708.714 1420.94 744 1428 c 0,99,100 - 789.909 1436.98 789.909 1436.98 850.5 1445.5 c 0,101,102 - 898.275 1448.51 l 0,103,104 - 930.453 1447.79 930.453 1447.79 958 1439 c 0,105,106 - 1070.99 1404.01 1070.99 1404.01 1081 1291 c 0,107,108 - 1073.99 1330 1073.99 1330 1034 1364 c 0,109,110 - 994.899 1396.93 994.899 1396.93 940.501 1397.15 c 0,111,112 - 916.073 1397.25 916.073 1397.25 887.5 1390.5 c 0,113,114 - 798.009 1369.01 798.009 1369.01 749 1327 c 0,115,116 - 721.998 1304.99 721.998 1304.99 717.5 1274 c 0,117,118 - 718.413 1256.86 l 0,119,120 - 723.722 1238.24 723.722 1238.24 749 1227 c 0,121,122 - 777 1215 777 1215 812 1218 c 0,123,124 - 787.164 1197.3 787.164 1197.3 749.528 1197.34 c 0,125,126 - 705.755 1197.38 705.755 1197.38 643.5 1226 c 0,127,128 - 528.99 1279 528.99 1279 452 1279 c 0,129,130 - 393.915 1279 393.915 1279 365 1260.15 c 0,131,132 - 336.453 1241.55 336.453 1241.55 336.306 1204.56 c 0,133,134 - 336.246 1189.34 336.246 1189.34 341 1171 c 0,135,136 - 348.997 1138.01 348.997 1138.01 374.5 1092 c 0,137,138 - 389.671 1064.63 389.671 1064.63 389.799 1041.87 c 0,139,140 - 389.886 1026.37 389.886 1026.37 383 1013 c 0,141,142 - 362.985 972.016 362.985 972.016 319 972 c 0,143,144 - 342.462 1000.49 342.462 1000.49 342.676 1019.78 c 0,145,146 - 342.77 1028.23 342.77 1028.23 338.391 1034.92 c 0,147,148 - 334.882 1040.28 334.882 1040.28 328.5 1044.5 c 0,149,150 - 314.406 1053.82 314.406 1053.82 301.912 1054.03 c 0,151,152 - 287.322 1050.91 l 0,153,154 - 279.271 1047.18 279.271 1047.18 272 1039 c 0,155,156 - 233 997 233 997 254 925.5 c 0,157,158 - 275 854 275 854 342 860 c 0,159,160 - 401 865 401 865 445.5 876.5 c 0,161,162 - 490 888 490 888 544 908 c 0,163,164 - 611 932 611 932 698 901.5 c 0,165,166 - 769.056 876.59 769.056 876.59 769.404 808.654 c 0,167,168 - 769.482 793.41 769.482 793.41 766 776 c 0,169,170 - 758.999 814.001 758.999 814.001 733.5 841.5 c 0,171,172 - 714.8 861.667 714.8 861.667 687.227 861.667 c 0,173,174 - 677.2 861.667 677.2 861.667 666 859 c 0,175,176 - 633 850 633 850 614.5 819.5 c 0,177,178 - 596 789 596 789 590 759 c 0,179,180 - 573 675 573 675 546.5 621 c 0,181,182 - 520 567 520 567 416 594 c 0,183,184 - 492 614 492 614 492 650 c 0,185,186 - 492 714 492 714 427.5 721.5 c 0,187,188 - 363 729 363 729 316 722 c 0,189,190 - 256.001 712 256.001 712 255 658 c 0,191,192 - 252 612 252 612 282 609 c 0,193,194 - 312 606 312 606 307 663 c 0,195,196 - 347 619 347 619 347 589 c 0,197,198 - 345.999 539.999 345.999 539.999 318 514 c 0,199,200 - 290 488 290 488 290 451 c 0,201,202 - 290 385 290 385 327.5 389 c 0,203,204 - 365 393 365 393 414.5 417 c 0,205,206 - 464 441 464 441 512 461 c 0,207,208 - 529.829 468.428 529.829 468.428 544.07 468.407 c 0,209,210 - 568.171 468.371 568.171 468.371 582 447 c 0,211,212 - 611 399 611 399 569 385 c 0,213,214 - 574 412 574 412 544 406 c 0,215,216 - 494 394 494 394 527 349 c 0,217,218 - 550 318 550 318 607 318 c 0,219,220 - 664 318 664 318 694 336 c 0,221,222 - 738 361 738 361 769 401.5 c 0,223,224 - 800 442 800 442 845 464 c 0,225,226 - 890 487 890 487 934 439 c 0,227,228 - 954.533 416.6 954.533 416.6 954.813 395.507 c 0,229,230 - 951.306 377.599 l 0,231,232 - 945.296 362.968 945.296 362.968 929 349 c 0,233,234 - 934.5 365.5 934.5 365.5 934.563 377.5 c 0,235,236 - 934.661 396.45 934.661 396.45 921.2 404.178 c 0,237,238 - 911.841 409.551 911.841 409.551 895.928 409.5 c 0,239,240 - 891.247 409.484 891.247 409.484 886 409 c 0,241,242 - 837.001 403 837.001 403 831.5 357.5 c 0,243,244 - 830.802 321.967 l 0,245,246 - 833.038 298.338 833.038 298.338 843 279 c 0,247,248 - 862.999 236.001 862.999 236.001 911 201.5 c 0,249,250 - 959 167 959 167 990 131 c 0,251,252 - 1021.99 93.9995 1021.99 93.9995 1032 32.5 c 0,253,254 - 1042.01 -29 1042.01 -29 1008 -71 c 0,255,256 - 1011.87 -21.0033 l 0,257,258 - 1011.65 -0.13516 1011.65 -0.13516 1007.5 15 c 0,259,260 - 998.993 46.0079 998.993 46.0079 959 87 c 0,261,262 - 888.999 156.001 888.999 156.001 798 177.5 c 0,263,264 - 706.997 199 706.997 199 611 199 c 0,0,1 -EndSplineSet -KernsSLIF: 115 -78 0 0 -EndChar -StartChar: f -Encoding: 102 102 20 -Width: 1155 -Flags: HMW -HStem: 714 154<374 666> 1301 192<389 965> -VStem: 130 185<147 1541> -Fore -582 828 m 1,0,1 - 584 733 584 733 666 714 c 0,2,3 - 708 705 708 705 746 735 c 0,4,5 - 784 765 784 765 784 764 c 0,6,7 - 778 743 778 743 755 704 c 0,8,9 - 732 665 732 665 694 648 c 0,10,11 - 647 631 647 631 619 637 c 0,12,13 - 591 643 591 643 558 654 c 0,14,15 - 515 670 515 670 466.5 713.5 c 0,16,17 - 418 757 418 757 366 739 c 0,18,19 - 325 717 325 717 316.5 692.5 c 0,20,21 - 308 668 308 668 302 643 c 0,22,23 - 297 613 297 613 285 522 c 0,24,25 - 273 431 273 431 351 435 c 0,26,27 - 369.915 452.305 369.915 452.305 370.366 468.962 c 0,28,29 - 367.282 483.295 l 0,30,31 - 359.337 500.505 359.337 500.505 331 517 c 0,32,33 - 391 513 391 513 416 461 c 0,34,35 - 416 416 416 416 405 396.5 c 0,36,37 - 393.995 376.989 393.995 376.989 377 341 c 0,38,39 - 356 312 356 312 344.5 274.5 c 0,40,41 - 332.999 236.998 332.999 236.998 331 232 c 0,42,43 - 314.682 193.354 314.682 193.354 314.591 158.394 c 0,44,45 - 314.576 152.647 314.576 152.647 315 147 c 0,46,47 - 315 96 315 96 334.5 40.5 c 0,48,49 - 354 -15 354 -15 400 -50 c 0,50,51 - 347 -50 347 -50 312 10.5 c 0,52,53 - 276.998 71.004 276.998 71.004 263 112 c 0,54,55 - 254 179 254 179 231 202 c 0,56,57 - 208.001 224.999 208.001 224.999 181 232 c 0,58,59 - 178.002 232 178.002 232 149.5 225.5 c 0,60,61 - 121.991 219.226 121.991 219.226 122 168 c 0,62,-1 - 135 143.5 l 0,63,64 - 148.001 119 148.001 119 188 110 c 0,65,66 - 149 96.0005 149 96.0005 123.5 105 c 0,67,68 - 98 114 98 114 89 118 c 0,69,70 - 64.9997 130 64.9997 130 54.5 156.5 c 0,71,72 - 44 183.001 44 183.001 44 198 c 0,73,74 - 49 267 49 267 102 320 c 0,75,76 - 117 329 117 329 126 354.5 c 0,77,78 - 135 380 135 380 141 401 c 0,79,80 - 145.001 416 145.001 416 156 493 c 0,81,82 - 166.999 570 166.999 570 162 588 c 0,83,84 - 166.001 613 166.001 613 138 628 c 0,85,86 - 103.999 631 103.999 631 110 585.5 c 0,87,88 - 116 540 116 540 128 528 c 0,89,90 - 95 528 95 528 74 563 c 0,91,92 - 54 587 54 587 56.5 611 c 0,93,94 - 59 635 59 635 66 659 c 0,95,96 - 81 701 81 701 109.5 737 c 0,97,98 - 138.001 773.002 138.001 773.002 158 812 c 0,99,-1 - 166 870.5 l 0,100,101 - 165.864 898.01 l 0,102,103 - 162.564 919.121 162.564 919.121 149 937 c 0,104,105 - 146 943 146 943 107 1000 c 0,106,107 - 69.0001 1055.99 69.0001 1055.99 68 1057 c 0,108,109 - 61.9965 1067.01 61.9965 1067.01 51.5 1114.5 c 0,110,111 - 45.1768 1143.11 45.1768 1143.11 45.2001 1170.08 c 0,112,113 - 45.2154 1187.89 45.2154 1187.89 48 1205 c 0,114,115 - 48 1230 48 1230 73 1261.5 c 0,116,117 - 97.1265 1291.9 97.1265 1291.9 130 1292 c 0,118,119 - 113.751 1265.6 113.751 1265.6 113.775 1238.05 c 0,120,121 - 113.786 1224.91 113.786 1224.91 117.5 1211.5 c 0,122,123 - 126.928 1177.48 126.928 1177.48 158.199 1177.4 c 0,124,125 - 165.072 1177.38 165.072 1177.38 173 1179 c 0,126,127 - 185.001 1181 185.001 1181 200.5 1192.5 c 0,128,129 - 215.999 1204.01 215.999 1204.01 229 1245 c 0,130,131 - 235.158 1271.18 235.158 1271.18 235.095 1298.23 c 0,132,133 - 235.076 1306.33 235.076 1306.33 234.5 1314.5 c 0,134,135 - 231.999 1350.02 231.999 1350.02 228 1386 c 0,136,137 - 221.477 1421.88 221.477 1421.88 182.376 1422.52 c 0,138,139 - 163 1421 l 0,140,141 - 133 1404.12 133 1404.12 132.5 1389 c 0,142,143 - 134.001 1375 134.001 1375 147 1342 c 0,144,145 - 95.9994 1385.01 95.9994 1385.01 93 1440 c 0,146,147 - 93.4391 1473.01 l 0,148,149 - 98.921 1513.54 98.921 1513.54 130 1541 c 0,150,151 - 171.776 1564.77 171.776 1564.77 203.429 1564.68 c 0,152,153 - 215.728 1564.64 215.728 1564.64 226.5 1561 c 0,154,155 - 264.999 1548 264.999 1548 316 1525 c 0,156,-1 - 389 1493 l 0,157,158 - 421.777 1484.32 421.777 1484.32 455.251 1484.36 c 0,159,160 - 491.223 1484.4 491.223 1484.4 528 1494.5 c 0,161,162 - 599.07 1514.02 599.07 1514.02 668 1528 c 0,163,164 - 710.819 1534.32 710.819 1534.32 749.674 1534.23 c 0,165,166 - 766.196 1534.19 766.196 1534.19 782 1533 c 0,167,168 - 835.112 1528.99 835.112 1528.99 895 1519 c 0,169,170 - 974.006 1481.99 974.006 1481.99 984.5 1468.5 c 0,171,-1 - 1013 1433 l 0,172,173 - 995 1439 995 1439 983.5 1448 c 0,174,175 - 972.008 1456.99 972.008 1456.99 946 1461 c 0,176,177 - 879.001 1461 879.001 1461 874.5 1427.5 c 0,178,179 - 869.999 1394 869.999 1394 863 1394 c 0,180,181 - 876.001 1349 876.001 1349 893.5 1334 c 0,182,183 - 911 1319 911 1319 965 1301 c 0,184,185 - 1077 1307 1077 1307 1088.5 1356 c 0,186,187 - 1100.02 1405.08 1100.02 1405.08 1131 1499 c 0,188,189 - 1130.03 1493.23 1130.03 1493.23 1118 1410.5 c 0,190,191 - 1106 1327.99 1106 1327.99 1090 1313 c 0,192,193 - 1070.01 1284.99 1070.01 1284.99 1034.5 1268 c 0,194,195 - 998.966 1250.99 998.966 1250.99 982 1249 c 0,196,197 - 975 1247.01 975 1247.01 938.5 1247.5 c 0,198,199 - 902 1247.99 902 1247.99 892 1258 c 0,200,201 - 868.998 1267 868.998 1267 850.5 1279 c 0,202,-1 - 813 1303 l 0,203,204 - 687 1373.99 687 1373.99 634 1370.5 c 0,205,206 - 581.013 1367.01 581.013 1367.01 458 1313 c 0,207,208 - 436.041 1297.63 436.041 1297.63 436.049 1278.77 c 0,209,210 - 436.052 1271.87 436.052 1271.87 439 1264.5 c 0,211,212 - 450.002 1237 450.002 1237 477 1237 c 0,213,214 - 498 1238.01 498 1238.01 523 1241.5 c 0,215,216 - 547.997 1244.99 547.997 1244.99 569 1290 c 0,217,218 - 566 1278 566 1278 566.5 1251 c 0,219,220 - 563.262 1227.75 l 0,221,222 - 558.754 1212.71 558.754 1212.71 548 1198 c 0,223,224 - 480.001 1158 480.001 1158 407.5 1138 c 0,225,226 - 335.001 1118.01 335.001 1118.01 320 1014 c 0,227,228 - 311 981 311 981 330 935 c 0,229,230 - 349.001 888.999 349.001 888.999 374 868 c 0,231,232 - 386 846 386 846 444 856.5 c 0,233,234 - 502 867 502 867 510 909 c 0,235,236 - 513 960 513 960 484 966.5 c 0,237,238 - 455 973 455 973 425 958 c 0,239,240 - 442 990 442 990 466 1003 c 0,241,242 - 489.104 1011.77 489.104 1011.77 507.76 1011.91 c 0,243,244 - 521.278 1012.01 521.278 1012.01 532.462 1007.57 c 0,245,246 - 558.618 997.189 558.618 997.189 572 962 c 0,247,248 - 576 932 576 932 578 895.5 c 0,249,250 - 579.994 859.099 579.994 859.099 582 828 c 1,0,1 -EndSplineSet -KernsSLIF: 116 -130 0 0 45 -156 0 0 46 -247 0 0 44 -260 0 0 97 -427 0 0 -EndChar -StartChar: g -Encoding: 103 103 21 -Width: 1125 -Flags: HW -Fore -531 22 m 0,0,1 - 468 28 468 28 371.5 79 c 0,2,3 - 275.001 130 275.001 130 247 174 c 0,4,5 - 152.809 313.125 152.809 313.125 152.707 448.145 c 0,6,7 - 152.69 469.373 152.69 469.373 155 490.5 c 0,8,9 - 158.749 561.265 l 0,10,11 - 158.332 681.08 158.332 681.08 112 800 c 0,12,13 - 92.9999 848 92.9999 848 67 898.5 c 0,14,15 - 41 949 41 949 44 979 c 0,16,17 - 48 1033 48 1033 82 1051 c 0,18,19 - 102.837 1062.03 102.837 1062.03 121.423 1062.17 c 0,20,21 - 133.16 1062.26 133.16 1062.26 144 1058 c 0,22,23 - 112.999 1059.99 112.999 1059.99 98 1019 c 0,24,25 - 94.0204 1008.12 94.0204 1008.12 94.0529 999.568 c 0,26,27 - 94.1429 975.877 94.1429 975.877 125 970 c 0,28,29 - 148.219 968.74 l 0,30,31 - 178.448 972.724 178.448 972.724 178.718 1012.41 c 0,32,33 - 174.332 1048.98 l 0,34,35 - 173.496 1052.89 173.496 1052.89 172.5 1057 c 0,36,37 - 148.001 1157.99 148.001 1157.99 147 1186 c 0,38,39 - 142.997 1257.03 142.997 1257.03 140 1300 c 0,40,41 - 142.052 1332.31 l 0,42,43 - 148.094 1367.54 148.094 1367.54 170 1416 c 0,44,45 - 186.001 1453.01 186.001 1453.01 237 1453.5 c 0,46,47 - 288 1453.99 288 1453.99 314 1443 c 0,48,49 - 270 1440 270 1440 253.5 1416 c 0,50,51 - 246.487 1405.8 246.487 1405.8 246.248 1397.05 c 0,52,53 - 249.324 1385.34 l 0,54,55 - 252.262 1380.37 252.262 1380.37 258 1376 c 0,56,57 - 303 1338.01 303 1338.01 359 1428.5 c 0,58,59 - 398.875 1492.94 398.875 1492.94 399.203 1530.76 c 0,60,61 - 399.299 1541.98 399.299 1541.98 395.92 1550.85 c 0,62,63 - 394.69 1554.08 394.69 1554.08 393 1557 c 0,64,65 - 377.944 1581.09 377.944 1581.09 349.102 1581.24 c 0,66,67 - 330.49 1581.34 330.49 1581.34 305 1571 c 0,68,69 - 281.994 1560.99 281.994 1560.99 269 1536 c 0,70,71 - 256.013 1511.02 256.013 1511.02 241 1487 c 0,72,73 - 239.456 1510.96 l 0,74,75 - 242.089 1543.47 242.089 1543.47 266.5 1593 c 0,76,77 - 300.997 1663 300.997 1663 358 1666 c 0,78,79 - 404.325 1669.02 404.325 1669.02 472 1674.5 c 0,80,81 - 540.002 1680.01 540.002 1680.01 578 1685 c 0,82,83 - 636.783 1688.22 l 0,84,85 - 712.691 1687.58 712.691 1687.58 807.5 1664.5 c 0,86,87 - 941 1631.99 941 1631.99 1025 1609 c 0,88,89 - 1068.99 1597 1068.99 1597 1067 1540 c 0,90,91 - 1065.01 1483.01 1065.01 1483.01 1027 1459 c 0,92,93 - 1030.32 1478.67 l 0,94,95 - 1029.52 1500.41 1029.52 1500.41 1008 1519.5 c 0,96,97 - 994.786 1531.22 994.786 1531.22 981.755 1531.41 c 0,98,99 - 966.92 1527.85 l 0,100,101 - 956.905 1522.89 956.905 1522.89 947 1511 c 0,102,103 - 935.923 1498.81 935.923 1498.81 935.889 1480.19 c 0,104,105 - 935.861 1465.19 935.861 1465.19 943 1446 c 0,106,107 - 959 1402.99 959 1402.99 968 1374 c 0,108,109 - 993.985 1296.05 993.985 1296.05 1012.5 1250.5 c 0,110,111 - 1019.83 1232.48 1019.83 1232.48 1019.86 1208.73 c 0,112,113 - 1019.91 1172.52 1019.91 1172.52 1003 1123 c 0,114,115 - 984.998 1068.99 984.998 1068.99 941 1023.5 c 0,116,117 - 897 978 897 978 799 957 c 0,118,119 - 836 986 836 986 890.5 1011.5 c 0,120,121 - 941.81 1035.51 941.81 1035.51 942.154 1105.16 c 0,122,123 - 942.176 1109.49 942.176 1109.49 942 1114 c 0,124,125 - 939.001 1147.99 939.001 1147.99 897 1188 c 0,126,127 - 868.002 1215.62 868.002 1215.62 839 1215.59 c 0,128,129 - 826 1215.57 826 1215.57 813 1210 c 0,130,131 - 770.269 1191.95 770.269 1191.95 769.918 1154.53 c 0,132,133 - 769.899 1152.54 769.899 1152.54 770 1150.5 c 0,134,135 - 772 1110 772 1110 787 1072 c 0,136,137 - 745.147 1100.77 745.147 1100.77 745.109 1156.53 c 0,138,139 - 745.103 1164.73 745.103 1164.73 746 1173.5 c 0,140,141 - 753 1242 753 1242 778 1269 c 0,142,143 - 790 1282.01 790 1282.01 801.5 1306.5 c 0,144,145 - 810.671 1326.03 810.671 1326.03 810.62 1339.53 c 0,146,147 - 810.608 1342.96 810.608 1342.96 810 1346 c 0,148,149 - 797.998 1382.01 797.998 1382.01 746 1412.5 c 0,150,151 - 694 1442.99 694 1442.99 649 1408 c 0,152,153 - 626 1390 626 1390 635 1348 c 0,154,155 - 644 1306 644 1306 645 1279 c 0,156,157 - 642.621 1251.41 l 0,158,159 - 630.999 1203.16 630.999 1203.16 565 1196 c 0,160,161 - 541.843 1195.8 l 0,162,163 - 505.619 1202.1 505.619 1202.1 494 1254 c 0,164,165 - 530 1237.99 530 1237.99 554 1254 c 0,166,167 - 568.571 1263.72 568.571 1263.72 568.767 1282.28 c 0,168,169 - 564.575 1305.54 l 0,170,171 - 563.85 1307.73 563.85 1307.73 563 1310 c 0,172,173 - 556.002 1327.99 556.002 1327.99 512.5 1338 c 0,174,175 - 492.91 1342.51 492.91 1342.51 477.678 1342.55 c 0,176,177 - 459.093 1342.6 459.093 1342.6 447 1336 c 0,178,179 - 390.999 1306 390.999 1306 374 1189.5 c 0,180,181 - 368.629 1152.69 368.629 1152.69 368.648 1121.92 c 0,182,183 - 368.69 1055.3 368.69 1055.3 394 1017 c 0,184,185 - 445 939 445 939 481 878.5 c 0,186,187 - 517 818 517 818 484 752 c 0,188,189 - 474 732 474 732 427 722 c 0,190,191 - 394.04 718.32 l 0,192,193 - 373.463 718.785 373.463 718.785 362 729 c 0,194,195 - 408 737 408 737 416 767 c 0,196,197 - 418.16 790.251 l 0,198,199 - 414.789 827.474 414.789 827.474 362 843 c 0,200,201 - 342 849 342 849 308 846.5 c 0,202,203 - 274.001 844 274.001 844 249 803 c 0,204,205 - 235.692 781.805 235.692 781.805 235.746 730.244 c 0,206,207 - 235.801 677.194 235.801 677.194 250 592 c 0,208,209 - 278 424 278 424 392 394 c 0,210,211 - 452 377 452 377 502 407.5 c 0,212,213 - 552.003 438.002 552.003 438.002 597 455 c 0,214,215 - 692 489 692 489 726 461 c 0,216,217 - 743.193 445.649 743.193 445.649 743.419 427.659 c 0,218,219 - 739.897 410.197 l 0,220,221 - 738.664 407.132 738.664 407.132 737 404 c 0,222,223 - 720 372 720 372 689 374 c 0,224,225 - 706.383 386.233 706.383 386.233 706.771 397.844 c 0,226,227 - 703.446 408.525 l 0,228,229 - 702 410.5 l 0,230,231 - 689.827 425.717 689.827 425.717 679 426 c 0,232,233 - 636 414 636 414 641.5 387.5 c 0,234,235 - 647 361 647 361 668 350 c 0,236,237 - 682.869 341.783 682.869 341.783 698.428 341.834 c 0,238,239 - 722.631 341.913 722.631 341.913 748.5 362 c 0,240,241 - 791.001 395.001 791.001 395.001 814 434 c 0,242,243 - 822.957 450.72 822.957 450.72 823 472.252 c 0,244,245 - 823.029 486.78 823.029 486.78 819 503.5 c 0,246,247 - 809 545 809 545 785 554 c 0,248,249 - 707 584 707 584 645.5 577 c 0,250,251 - 584 570 584 570 500 576 c 0,252,253 - 381.002 583.999 381.002 583.999 333 617.5 c 0,254,255 - 286.238 650.135 286.238 650.135 286 695 c 0,256,257 - 286 715 286 715 301.5 741.5 c 0,258,259 - 316.999 767.999 316.999 767.999 367 775 c 0,260,261 - 324 758 324 758 317.5 716 c 0,262,263 - 311 674 311 674 349 656 c 0,264,265 - 431 614 431 614 521.5 661 c 0,266,267 - 612 708 612 708 643 751 c 0,268,269 - 677 800 677 800 738 807 c 0,270,271 - 784.905 809.042 l 0,272,273 - 808.475 807.683 808.475 807.683 820 800 c 0,274,275 - 834.999 789.001 834.999 789.001 845 763 c 0,276,277 - 848.309 744.846 l 0,278,279 - 847.766 729.405 847.766 729.405 835 716 c 0,280,281 - 835 760 835 760 795.5 755 c 0,282,283 - 756 750 756 750 755 735 c 0,284,285 - 756.786 713.323 l 0,286,287 - 762.156 693.016 762.156 693.016 781.5 674 c 0,288,289 - 811 645 811 645 871 648 c 0,290,291 - 910.248 645.529 l 0,292,293 - 947.216 639.656 947.216 639.656 986.5 620.5 c 0,294,295 - 1047.01 590.994 1047.01 590.994 1052 558 c 0,296,297 - 1062.99 471 1062.99 471 1001 471 c 0,298,299 - 1019 489 1019 489 1008.5 504 c 0,300,301 - 998 519 998 519 980 512 c 0,302,303 - 956 500 956 500 964.5 472.5 c 0,304,305 - 973 445 973 445 979 421 c 0,306,307 - 1007 296 1007 296 995 216.5 c 0,308,309 - 983 137 983 137 959 119 c 0,310,311 - 926 92 926 92 878 77.5 c 0,312,313 - 830 62.9999 830 62.9999 772 97 c 0,314,315 - 752.299 108.492 752.299 108.492 752.139 146.266 c 0,316,317 - 752.105 154.507 752.105 154.507 753 164 c 0,318,319 - 757.001 139.999 757.001 139.999 788 135 c 0,320,321 - 803.325 136.102 l 0,322,323 - 822.734 142.8 822.734 142.8 833 178 c 0,324,325 - 833.161 192.353 l 0,326,327 - 828.613 207.514 828.613 207.514 801.5 213.5 c 0,328,329 - 763 222.001 763 222.001 712 219.5 c 0,330,331 - 660.992 216.999 660.992 216.999 615.5 208.5 c 0,332,333 - 569.999 199.999 569.999 199.999 564 194 c 0,334,335 - 540 166.999 540 166.999 539.5 154 c 0,336,337 - 545.209 121.479 l 0,338,339 - 547.604 112.321 547.604 112.321 551 101 c 0,340,341 - 563 56 563 56 616.5 56.5 c 0,342,343 - 670 57 670 57 706 87 c 0,344,345 - 679 21 679 21 608.5 21 c 0,346,347 - 538 21 538 21 531 22 c 0,0,1 -EndSplineSet -EndChar -StartChar: h -Encoding: 104 104 22 -Width: 1191 -Flags: HMW -HStem: 703 272.5<432 788> -VStem: 135 206<140 1374> 826 179<65 1404> -Fore -127 803.5 m 128,-1,0 - 68.0001 857 68.0001 857 53 931 c 0,1,2 - 49.5493 964.928 l 0,3,4 - 50.165 1001.61 50.165 1001.61 70.5 1034 c 0,5,6 - 98.0227 1077.85 98.0227 1077.85 139.03 1078.18 c 0,7,8 - 141.981 1078.2 141.981 1078.2 145 1078 c 0,9,10 - 181 1075 181 1075 181 1040 c 0,11,12 - 169.272 1049.99 169.272 1049.99 158.394 1049.98 c 0,13,14 - 144.227 1049.97 144.227 1049.97 131.5 1033 c 0,15,16 - 109 1003 109 1003 130 971 c 0,17,18 - 136.001 959.999 136.001 959.999 173.5 956.5 c 0,19,20 - 189.848 958.247 l 0,21,22 - 212.456 966.35 212.456 966.35 217 1008 c 0,23,24 - 225.997 1101.98 225.997 1101.98 239.5 1188.5 c 0,25,26 - 244.674 1221.65 244.674 1221.65 244.634 1246.07 c 0,27,28 - 244.568 1285.35 244.568 1285.35 231 1302 c 0,29,30 - 225.057 1308.34 225.057 1308.34 215.502 1308.4 c 0,31,32 - 200.945 1308.49 200.945 1308.49 178 1294 c 0,33,34 - 157.734 1281.2 157.734 1281.2 157.662 1260.72 c 0,35,36 - 157.6 1242.8 157.6 1242.8 173 1219 c 0,37,38 - 130.636 1246.72 130.636 1246.72 130.124 1278.13 c 0,39,40 - 133.771 1297.81 l 0,41,42 - 141.244 1317.48 141.244 1317.48 164 1338.5 c 0,43,44 - 235.991 1404.99 235.991 1404.99 264 1467 c 0,45,46 - 292.005 1530.01 292.005 1530.01 337.5 1584.5 c 0,47,48 - 378.252 1633.31 378.252 1633.31 445.867 1633.59 c 0,49,50 - 453.751 1633.63 453.751 1633.63 462 1633 c 0,51,52 - 492.977 1622.01 492.977 1622.01 512.5 1606.5 c 0,53,54 - 532 1591.01 532 1591.01 544 1548 c 0,55,56 - 540.999 1565 540.999 1565 476 1596.5 c 0,57,58 - 461.045 1603.75 461.045 1603.75 446.989 1603.66 c 0,59,60 - 399.957 1603.38 399.957 1603.38 363 1521 c 0,61,62 - 335 1458 335 1458 341 1374 c 0,63,64 - 345.999 1298.01 345.999 1298.01 401 1223.5 c 0,65,66 - 456 1148.99 456 1148.99 438 1078 c 0,67,68 - 432 1055.01 432 1055.01 392 1046.5 c 0,69,70 - 356.819 1042.14 l 0,71,72 - 345.962 1042.39 345.962 1042.39 341 1046 c 0,73,74 - 372 1050.01 372 1050.01 383 1068.5 c 0,75,76 - 394 1087 394 1087 394 1089 c 0,77,78 - 391.033 1111.52 l 0,79,80 - 384.862 1131.96 384.862 1131.96 366 1150.5 c 0,81,82 - 337 1179 337 1179 319 1143 c 0,83,84 - 308 1120 308 1120 306 1063 c 0,85,86 - 304 1007.01 304 1007.01 304 1006 c 0,87,88 - 311.001 954.998 311.001 954.998 331.5 922 c 0,89,90 - 352 889 352 889 355 888 c 0,91,92 - 376 870 376 870 401 872 c 0,93,94 - 426 874 426 874 438 880 c 0,95,96 - 530 922 530 922 561.5 962 c 0,97,98 - 593 1002 593 1002 665 995 c 0,99,100 - 690 984 690 984 702.5 966.5 c 0,101,102 - 709.4 956.839 709.4 956.839 709.444 938.8 c 0,103,104 - 709.48 924.16 709.48 924.16 705 904 c 0,105,106 - 693 873 693 873 662 868 c 0,107,108 - 677 883 677 883 670 902.5 c 0,109,110 - 663 922 663 922 642 907 c 0,111,112 - 616.157 887.496 616.157 887.496 616.111 872.628 c 0,113,114 - 616.062 857.004 616.062 857.004 644.5 846.5 c 0,115,116 - 700 826 700 826 736 829 c 0,117,118 - 749 829 749 829 796 843 c 0,119,120 - 828.07 852.553 828.07 852.553 828.48 888.646 c 0,121,122 - 824.428 919.069 l 0,123,124 - 823.356 923.414 823.356 923.414 822 928 c 0,125,126 - 813 955 813 955 788 975.5 c 0,127,128 - 763 996 763 996 760 1030 c 0,129,130 - 761.054 1063.96 l 0,131,132 - 765.883 1095.56 765.883 1095.56 786 1115 c 0,133,134 - 801 1130 801 1130 836 1139 c 0,135,136 - 856.93 1140.92 l 0,137,138 - 879.097 1138.97 879.097 1138.97 897 1119 c 0,139,140 - 870.531 1116.71 l 0,141,142 - 834.782 1108.19 834.782 1108.19 828 1069 c 0,143,144 - 819 1016.99 819 1016.99 886 1003 c 0,145,146 - 901.604 1002.82 l 0,147,148 - 929.362 1010.06 929.362 1010.06 938.5 1076 c 0,149,150 - 947.659 1142.1 947.659 1142.1 947.621 1174.59 c 0,151,152 - 947.611 1182.89 947.611 1182.89 947 1189 c 0,153,154 - 941 1229.01 941 1229.01 888.5 1304.5 c 0,155,156 - 836.007 1379.99 836.007 1379.99 826 1404 c 0,157,158 - 814 1428 814 1428 803.5 1483.5 c 0,159,160 - 801.65 1512.46 l 0,161,162 - 804.299 1550.56 804.299 1550.56 835 1582 c 0,163,164 - 857.909 1604.91 857.909 1604.91 909.781 1604.88 c 0,165,166 - 928.085 1604.87 928.085 1604.87 950 1602 c 0,167,168 - 1004 1593 1004 1593 1051 1552 c 0,169,170 - 1042.01 1552 1042.01 1552 1017 1564 c 0,171,172 - 991.995 1576 991.995 1576 974 1576 c 0,173,174 - 922.993 1576 922.993 1576 888.5 1552.5 c 0,175,176 - 854 1528.99 854 1528.99 866 1488 c 0,177,178 - 895.617 1379.71 895.617 1379.71 952.652 1379.79 c 0,179,180 - 957.237 1379.79 957.237 1379.79 962 1380.5 c 0,181,182 - 1026 1389.99 1026 1389.99 1031 1408 c 0,183,184 - 1035.9 1426.38 1035.9 1426.38 1035.96 1441.59 c 0,185,186 - 1036.05 1463.62 1036.05 1463.62 1026 1479 c 0,187,188 - 1008.99 1505.02 1008.99 1505.02 988 1531 c 0,189,190 - 1019.01 1531 1019.01 1531 1055.5 1484.5 c 0,191,192 - 1092 1437.99 1092 1437.99 1092 1410 c 0,193,194 - 1092 1347.98 1092 1347.98 1079 1275 c 0,195,196 - 1075.15 1253.41 1075.15 1253.41 1075.25 1228.33 c 0,197,198 - 1075.46 1168.59 1075.46 1168.59 1098 1089 c 0,199,-1 - 1121 1002 l 0,200,201 - 1132 959.981 1132 959.981 1132 918 c 0,202,203 - 1132 897.007 1132 897.007 1110.5 867 c 0,204,205 - 1089.01 837 1089.01 837 1041 834 c 0,206,207 - 1041 835.996 1041 835.996 1070 858 c 0,208,209 - 1089.94 873.128 1089.94 873.128 1090.02 897.703 c 0,210,211 - 1090.06 908.876 1090.06 908.876 1086 922 c 0,212,213 - 1080.13 929.035 1080.13 929.035 1071.18 929.025 c 0,214,215 - 1064.86 929.017 1064.86 929.017 1057 925.5 c 0,216,217 - 1037.99 917 1037.99 917 1027 896 c 0,218,219 - 1017 877.014 1017 877.014 1008 827 c 0,220,221 - 999 777 999 777 1002 750 c 0,222,223 - 1008 693 1008 693 1029 649 c 0,224,225 - 1049.99 605.018 1049.99 605.018 1057 568 c 0,226,227 - 1065.62 522.606 1065.62 522.606 1065.65 492.89 c 0,228,229 - 1065.68 470.899 1065.68 470.899 1061 457.5 c 0,230,231 - 1050.01 426 1050.01 426 1037 410 c 0,232,233 - 1026.99 403.997 1026.99 403.997 1003.5 399.5 c 0,234,235 - 980 395 980 395 956 412 c 0,236,237 - 996 414 996 414 1007 431 c 0,238,-1 - 1013.5 458.5 l 0,239,240 - 1019.99 486 1019.99 486 976 492 c 0,241,242 - 958 493 958 493 938 468 c 0,243,244 - 918 443 918 443 924 368 c 0,245,246 - 930 275 930 275 958.5 213.5 c 0,247,248 - 987 152 987 152 1005 65 c 0,249,250 - 1015.71 15.0325 1015.71 15.0325 1015.71 -24.0976 c 0,251,252 - 1015.72 -116.534 1015.72 -116.534 956 -148.5 c 0,253,254 - 871.999 -194 871.999 -194 871 -194 c 0,255,256 - 807.664 -196.104 l 0,257,258 - 805.354 -196.059 805.354 -196.059 803 -196 c 0,259,260 - 762.999 -194.999 762.999 -194.999 733 -171 c 0,261,262 - 769.5 -185 769.5 -185 803 -185 c 0,263,264 - 836.5 -185 836.5 -185 867 -171 c 0,265,266 - 916 -147 916 -147 946.5 -108 c 0,267,268 - 977 -69 977 -69 938 -15 c 0,269,270 - 880 65 880 65 804.5 82 c 0,271,272 - 729 98.9999 729 98.9999 711 115 c 0,273,274 - 659.39 157.887 659.39 157.887 659.297 204.209 c 0,275,276 - 659.263 221.612 659.263 221.612 666.5 239.5 c 0,277,278 - 692.165 302.937 692.165 302.937 729 303 c 0,279,280 - 755 301 755 301 782 267 c 0,281,282 - 765.311 274.586 765.311 274.586 752.937 274.547 c 0,283,284 - 732.689 274.483 732.689 274.483 724 254 c 0,285,286 - 717.578 239.322 717.578 239.322 717.375 227.964 c 0,287,288 - 720.614 212.702 l 0,289,290 - 727.42 199.291 727.42 199.291 748.5 193.5 c 0,291,292 - 777.978 188.543 l 0,293,294 - 794 188.725 794 188.725 794 200 c 0,295,296 - 804.307 216.492 804.307 216.492 804.227 252.578 c 0,297,298 - 804.19 269.008 804.19 269.008 802 289.5 c 0,299,300 - 795 355 795 355 790 384 c 0,301,302 - 743 459 743 459 706 463 c 0,303,304 - 669 467 669 467 646 494 c 0,305,306 - 608 533 608 533 605 558 c 0,307,308 - 605.804 586.508 l 0,309,310 - 607.893 599.607 607.893 599.607 613 614 c 0,311,312 - 633 671 633 671 688 646 c 0,313,314 - 671 636.999 671 636.999 664.5 615.5 c 0,315,316 - 658 594 658 594 687 597 c 0,317,318 - 715 600 715 600 738 611.5 c 0,319,320 - 755.674 620.337 755.674 620.337 755.633 643.64 c 0,321,322 - 755.621 650.663 755.621 650.663 754 659 c 0,323,324 - 738 743 738 743 618 748.5 c 0,325,326 - 536.449 748.89 l 0,327,328 - 483.089 746.152 483.089 746.152 460 734 c 0,329,330 - 445 715 445 715 432 703 c 0,331,332 - 419 691 419 691 438 619 c 0,333,334 - 443 598 443 598 450 559 c 0,335,336 - 450.723 535.595 l 0,337,338 - 447.5 513.776 447.5 513.776 428 501 c 0,339,340 - 405.482 487.63 405.482 487.63 374.545 487.63 c 0,341,342 - 361.519 487.63 361.519 487.63 347 490 c 0,343,344 - 377 495 377 495 395.5 526.5 c 0,345,346 - 414 558 414 558 369 566 c 0,347,348 - 349 569 349 569 332.5 547 c 0,349,350 - 316 525 316 525 316 498 c 0,351,352 - 313 405 313 405 348 338.5 c 0,353,354 - 383 272 383 272 375 218 c 0,355,356 - 369 179 369 179 356 170 c 0,357,358 - 343 161.001 343 161.001 316 154 c 0,359,360 - 321.999 174.997 321.999 174.997 328.5 188 c 0,361,362 - 335 201.001 335 201.001 317 218 c 0,363,364 - 311.667 222.445 311.667 222.445 302.185 222.543 c 0,365,366 - 277.896 218.022 l 0,367,368 - 275.037 217.104 275.037 217.104 272 216 c 0,369,370 - 233.492 201.671 233.492 201.671 233.078 159.275 c 0,371,372 - 233.03 154.328 233.03 154.328 233.5 149 c 0,373,374 - 238 98 238 98 256 85 c 0,375,376 - 275.001 69.9993 275.001 69.9993 307.5 58 c 0,377,378 - 318.436 53.9621 318.436 53.9621 333.958 54.0004 c 0,379,380 - 364.564 54.0758 364.564 54.0758 413 70 c 0,381,-1 - 455 97 l 0,382,383 - 497 124 497 124 536 214 c 0,384,385 - 507.999 117.999 507.999 117.999 450 58 c 0,386,387 - 431 37 431 37 345.5 14 c 0,388,389 - 260 -8.99999 260 -8.99999 185 48 c 0,390,391 - 136.001 84.9993 136.001 84.9993 135 140 c 0,392,393 - 136 210 l 0,394,395 - 139 246.001 139 246.001 179 333 c 0,396,397 - 219 419.999 219 419.999 219 429 c 0,398,399 - 219 448.008 219 448.008 224.5 542 c 0,400,401 - 225.127 611.157 l 0,402,403 - 222.808 651.23 222.808 651.23 213 672 c 0,404,405 - 186 749.999 186 749.999 127 803.5 c 128,-1,0 -EndSplineSet -KernsSLIF: 97 -104 0 0 -EndChar -StartChar: i -Encoding: 105 105 52 -Width: 526 -Flags: HMW -VStem: 191.5 208.5<315 1320> -Fore -205 552 m 0,0,1 - 199 642 199 642 115 721.5 c 0,2,3 - 31 801 31 801 50 897 c 0,4,5 - 62 963 62 963 107.5 979 c 0,6,7 - 126.311 982.037 l 0,8,9 - 158.637 980.476 158.637 980.476 179 928 c 0,10,-1 - 170 941 l 0,11,12 - 150.714 957.786 150.714 957.786 136.276 958.117 c 0,13,14 - 124.188 955.041 l 0,15,16 - 107.697 945.447 107.697 945.447 100 906 c 0,17,18 - 83.9999 824 83.9999 824 177 839 c 0,19,20 - 211.046 843.346 211.046 843.346 211.247 915.645 c 0,21,22 - 211.323 943.154 211.323 943.154 206.5 980.5 c 0,23,24 - 188.999 1116 188.999 1116 169 1146 c 0,25,26 - 113.997 1227 113.997 1227 78.5 1264.5 c 0,27,28 - 43 1302 43 1302 52 1362 c 0,29,30 - 65.9993 1475.99 65.9993 1475.99 194 1510 c 0,31,32 - 131 1477 131 1477 115 1421.5 c 0,33,34 - 105.515 1388.6 105.515 1388.6 105.519 1365.36 c 0,35,36 - 105.521 1349.4 105.521 1349.4 110 1338 c 0,37,38 - 126.105 1312.23 126.105 1312.23 155.28 1312.19 c 0,39,40 - 171.396 1312.17 171.396 1312.17 191.5 1320 c 0,41,42 - 248.008 1342.01 248.008 1342.01 260 1354 c 0,43,44 - 351 1459 351 1459 318.5 1576 c 0,45,46 - 285.999 1693 285.999 1693 138 1732 c 0,47,48 - 229.001 1732 229.001 1732 307.5 1652.5 c 0,49,50 - 386 1573 386 1573 395 1486 c 0,51,52 - 399.999 1414.01 399.999 1414.01 419.5 1348.5 c 0,53,54 - 439.003 1282.98 439.003 1282.98 454 1208 c 0,55,56 - 460.003 1169.99 460.003 1169.99 470.5 1139.5 c 0,57,58 - 480.116 1111.57 480.116 1111.57 480 1092 c 0,59,60 - 472 1015 472 1015 391 1015 c 0,61,62 - 426 1042 426 1042 434 1089 c 0,63,64 - 433.926 1106.55 l 0,65,66 - 427.642 1134.17 427.642 1134.17 377.246 1134.08 c 0,67,68 - 374.678 1134.08 374.678 1134.08 372 1134 c 0,69,70 - 313 1138.99 313 1138.99 322.5 1005 c 0,71,72 - 331.999 871.009 331.999 871.009 335 845 c 0,73,74 - 340 786 340 786 385 790.5 c 0,75,76 - 430 795 430 795 409 870 c 0,77,78 - 403 889 403 889 371 925 c 0,79,80 - 383 918 383 918 396 908.5 c 0,81,82 - 409 899 409 899 430 872 c 0,83,84 - 502 780 502 780 421 671 c 0,85,86 - 340 562 340 562 349 454 c 0,87,88 - 355 373 355 373 400 315 c 0,89,90 - 445 257 445 257 448 179 c 0,91,92 - 450 117.999 450 117.999 396 98 c 0,93,94 - 342 78.0001 342 78.0001 290 81 c 0,95,96 - 354.192 91.6986 354.192 91.6986 354.5 154 c 0,97,98 - 353 216 353 216 282 222 c 0,99,100 - 255.63 220.575 l 0,101,102 - 205.536 210.268 205.536 210.268 205.16 138.129 c 0,103,104 - 205.095 125.728 205.095 125.728 206.5 111.5 c 0,105,106 - 218.001 -5.00005 218.001 -5.00005 247 -50 c 0,107,108 - 286 -113 286 -113 340.5 -144.5 c 0,109,110 - 395.002 -176.002 395.002 -176.002 422 -201 c 0,111,112 - 371.997 -183.999 371.997 -183.999 343 -169.5 c 0,113,114 - 313.991 -154.995 313.991 -154.995 275 -130 c 0,115,116 - 275 -129 275 -129 243 -97.5 c 0,117,118 - 210.998 -65.998 210.998 -65.998 194 -32 c 0,119,120 - 157 40.9986 157 40.9986 145 119 c 0,121,122 - 142.267 162.201 l 0,123,124 - 143.819 218.362 143.819 218.362 172 274 c 0,125,126 - 202.001 337.001 202.001 337.001 205.5 410.5 c 0,127,128 - 206.608 515.08 l 0,129,130 - 206.074 533.739 206.074 533.739 205 552 c 0,0,1 -EndSplineSet -EndChar -StartChar: j -Encoding: 106 106 64 -Width: 1080 -Flags: MW -HStem: -47.5 237.5<360.5 947> 1275.5 183.5<208 649> -VStem: 252 108.5<-47.5 596> 669 237.5<211 1492.5> -Fore -255 -50 m 0,0,1 - 219 -44 219 -44 180 -8 c 0,2,3 - 140.999 28.0006 140.999 28.0006 130 92 c 0,4,5 - 161.001 39 161.001 39 184 36 c 0,6,7 - 226 27 226 27 244 53 c 0,8,9 - 262 78.9999 262 78.9999 262 117 c 0,10,11 - 262 170.001 262 170.001 215.5 215.5 c 0,12,13 - 195.259 235.306 195.259 235.306 184.586 235.69 c 0,14,15 - 177.625 232.939 l 0,16,17 - 172.716 227.713 172.716 227.713 172.683 212.589 c 0,18,19 - 172.675 208.633 172.675 208.633 173 204 c 0,20,21 - 175.94 158.921 175.94 158.921 220 154 c 0,22,23 - 205.32 137.485 205.32 137.485 189.331 137.245 c 0,24,25 - 173.596 140.802 l 0,26,27 - 171.063 141.962 171.063 141.962 168.5 143.5 c 0,28,29 - 141 160 141 160 132 177 c 0,30,31 - 116.083 207.737 116.083 207.737 116.132 244.8 c 0,32,33 - 116.173 275.264 116.173 275.264 127 310 c 0,34,35 - 149.002 388.004 149.002 388.004 183 459.5 c 0,36,37 - 217.001 531 217.001 531 252 596 c 0,38,39 - 300 686 300 686 385 763.5 c 0,40,41 - 470 841 470 841 572 865 c 0,42,43 - 452 817 452 817 372 659 c 0,44,45 - 292 501 292 501 319 377 c 0,46,47 - 327 335 327 335 358 309.5 c 0,48,49 - 389 284 389 284 418 317 c 0,50,51 - 439 340 439 340 437 371.5 c 0,52,53 - 435 403 435 403 428 421 c 0,54,55 - 415 445 415 445 383 459 c 0,56,57 - 427 468 427 468 457 437.5 c 0,58,59 - 487 407 487 407 493 379 c 0,60,61 - 493.982 342.219 l 0,62,63 - 493.618 336.582 493.618 336.582 493 330.5 c 0,64,65 - 490 301 490 301 490 290 c 0,66,67 - 485 218 485 218 501.5 197 c 0,68,69 - 518 176 518 176 550 167 c 0,70,71 - 568.655 161.454 568.655 161.454 585.468 161.5 c 0,72,73 - 635.344 161.638 635.344 161.638 669 211 c 0,74,75 - 699 253 699 253 713.5 309.5 c 0,76,77 - 727.999 365.993 727.999 365.993 735 420 c 0,78,79 - 737.068 472.341 l 0,80,81 - 737.037 473.416 737.037 473.416 737 474.5 c 0,82,83 - 736 504 736 504 706 504 c 0,84,85 - 677 504 677 504 676 481 c 0,86,87 - 678.327 455.139 l 0,88,89 - 680.053 448.527 680.053 448.527 683 443 c 0,90,91 - 665 443 665 443 646 455 c 0,92,93 - 627 466.999 627 466.999 626 516 c 0,94,95 - 625 546 625 546 644 570.5 c 0,96,97 - 662.998 594.996 662.998 594.996 676 623 c 0,98,99 - 709.998 696.995 709.998 696.995 715.5 722.5 c 0,100,101 - 721 748 721 748 717 807 c 0,102,103 - 712 871 712 871 633 960 c 0,104,105 - 593.041 1005.01 593.041 1005.01 592.994 1048.5 c 0,106,107 - 592.948 1090.98 592.948 1090.98 631 1132 c 0,108,109 - 641.561 1144.18 641.561 1144.18 666.649 1144.16 c 0,110,111 - 672.436 1144.16 672.436 1144.16 679 1143.5 c 0,112,113 - 714 1140.01 714 1140.01 722 1098 c 0,114,115 - 704 1108.99 704 1108.99 683 1104 c 0,116,117 - 662 1099.01 662 1099.01 662 1084 c 0,118,119 - 662 1042.15 662 1042.15 683.378 1041.11 c 0,120,121 - 695 1043 l 0,122,123 - 727.992 1053.99 727.992 1053.99 746 1072 c 0,124,125 - 770 1094.01 770 1094.01 774 1189 c 0,126,127 - 773.549 1259.71 l 0,128,129 - 770.677 1299.08 770.677 1299.08 761 1319 c 0,130,131 - 752.033 1336.18 752.033 1336.18 732.184 1336.34 c 0,132,133 - 725.465 1336.4 725.465 1336.4 717.5 1334.5 c 0,134,135 - 686 1327 686 1327 685 1312 c 0,136,137 - 686.41 1290.57 l 0,138,139 - 690.959 1275 690.959 1275 707.5 1275 c 0,140,141 - 733 1275 733 1275 744 1284 c 0,142,143 - 742.032 1266.13 l 0,144,145 - 737.373 1252.41 737.373 1252.41 722.5 1244.5 c 0,146,147 - 704.631 1235 704.631 1235 692.267 1235.03 c 0,148,149 - 688.359 1235.04 688.359 1235.04 685 1236 c 0,150,151 - 637 1246.01 637 1246.01 605.5 1276.5 c 0,152,153 - 573.985 1307.01 573.985 1307.01 541 1328 c 0,154,155 - 501.957 1352.08 501.957 1352.08 460.364 1352.02 c 0,156,157 - 438.049 1351.98 438.049 1351.98 415 1345 c 0,158,159 - 349.045 1325.02 349.045 1325.02 313 1310 c 0,160,161 - 268 1290.99 268 1290.99 208 1275.5 c 0,162,163 - 154.836 1261.77 154.836 1261.77 133.861 1261.77 c 0,164,165 - 131.164 1261.77 131.164 1261.77 129 1262 c 0,166,167 - 44.9994 1268 44.9994 1268 35.5 1354.5 c 0,168,169 - 35.3657 1387.6 l 0,170,171 - 42.3818 1445.56 42.3818 1445.56 105 1463 c 0,172,173 - 85.0001 1448 85.0001 1448 66.5 1410.5 c 0,174,175 - 48 1373 48 1373 83 1337 c 0,176,177 - 101.794 1316.6 101.794 1316.6 129.668 1316.66 c 0,178,179 - 153.708 1316.72 153.708 1316.72 184.5 1332 c 0,180,181 - 250.996 1365 250.996 1365 271 1397 c 0,182,183 - 317 1470.99 317 1470.99 305.5 1493 c 0,184,185 - 296.454 1510.31 296.454 1510.31 278.433 1510.29 c 0,186,187 - 273.547 1510.28 273.547 1510.28 268 1509 c 0,188,189 - 262.002 1507.01 262.002 1507.01 259 1493 c 0,190,191 - 259.794 1481.77 l 0,192,193 - 262.522 1475.09 262.522 1475.09 271 1470 c 0,194,195 - 256.877 1463.14 256.877 1463.14 244.871 1463.2 c 0,196,197 - 227.122 1463.29 227.122 1463.29 214 1478.5 c 0,198,199 - 198.496 1496.47 198.496 1496.47 198.388 1526.11 c 0,200,201 - 198.342 1538.53 198.342 1538.53 201 1553 c 0,202,203 - 207.001 1586.01 207.001 1586.01 242 1595.5 c 0,204,205 - 266.917 1602.26 266.917 1602.26 282.695 1602.19 c 0,206,207 - 289.097 1602.16 289.097 1602.16 294 1601 c 0,208,209 - 387 1574 387 1574 463.5 1518.5 c 0,210,211 - 539.993 1463.01 539.993 1463.01 649 1459 c 0,212,213 - 689 1457.01 689 1457.01 755 1462 c 0,214,215 - 821 1466.99 821 1466.99 821 1518 c 0,216,217 - 821 1536 821 1536 791.5 1551 c 0,218,219 - 770.962 1561.44 770.962 1561.44 759.876 1561.71 c 0,220,221 - 752 1560 l 0,222,223 - 728.999 1546.99 728.999 1546.99 728.5 1532 c 0,224,225 - 730 1495 l 0,226,227 - 707.38 1502.02 707.38 1502.02 706.967 1528.51 c 0,228,229 - 708.5 1545 l 0,230,231 - 716 1585.99 716 1585.99 742 1599 c 0,232,233 - 772 1614 772 1614 815 1606.5 c 0,234,235 - 858 1599 858 1599 872 1578 c 0,236,237 - 903 1528.99 903 1528.99 906.5 1492.5 c 0,238,239 - 910 1456 910 1456 910 1399 c 0,240,-1 - 898.5 1243 l 0,241,242 - 896.911 1175.05 l 0,243,244 - 898.939 1126.57 898.939 1126.57 912 1098 c 0,245,246 - 927.997 1059.01 927.997 1059.01 948.5 1028 c 0,247,248 - 969.009 996.982 969.009 996.982 985 968 c 0,249,250 - 1005.99 929.012 1005.99 929.012 1017.5 836.5 c 0,251,252 - 1020.61 785.11 l 0,253,254 - 1019.37 739.187 1019.37 739.187 999 729 c 0,255,256 - 996.499 765.333 l 0,257,258 - 990.165 800.003 990.165 800.003 968.5 828 c 0,259,260 - 952.652 848.479 952.652 848.479 937.876 848.987 c 0,261,262 - 925.717 845.927 l 0,263,264 - 916.644 840.966 916.644 840.966 908 828 c 0,265,266 - 890 801 890 801 874 737 c 0,267,268 - 869.307 718.227 869.307 718.227 869.26 704.013 c 0,269,270 - 869.16 673.848 869.16 673.848 889.99 664.225 c 0,271,272 - 892.805 662.925 892.805 662.925 896 662 c 0,273,274 - 915.755 658.584 l 0,275,276 - 933.115 659.596 933.115 659.596 937.5 679.5 c 0,277,278 - 938.669 701.65 l 0,279,280 - 936.562 720.529 936.562 720.529 924 740 c 0,281,282 - 950 740 950 740 966 706 c 0,283,284 - 998 636 998 636 940.5 543 c 0,285,286 - 883 450 883 450 858 387 c 0,287,288 - 843 349.999 843 349.999 838.5 301 c 0,289,290 - 834 252 834 252 834 216 c 0,291,292 - 834 203.999 834 203.999 842.5 187 c 0,293,294 - 847.793 176.415 847.793 176.415 856.768 175.91 c 0,295,296 - 869 179 l 0,297,298 - 896.475 191.623 896.475 191.623 896.655 213.346 c 0,299,300 - 896.718 220.876 896.718 220.876 893.5 229.5 c 0,301,302 - 881 262.999 881 262.999 863 279 c 0,303,304 - 874.769 279.858 l 0,305,306 - 891.15 276.301 891.15 276.301 914.5 249 c 0,307,308 - 947 211.001 947 211.001 947 190 c 0,309,310 - 947 156.003 947 156.003 936 104 c 0,311,312 - 925 51.9999 925 51.9999 886 41 c 0,313,314 - 856.875 32.6783 856.875 32.6783 826.709 32.6667 c 0,315,316 - 820.626 32.6643 820.626 32.6643 814.5 33 c 0,317,318 - 778 35 778 35 742 34 c 0,319,320 - 670 25 670 25 596.5 17.5 c 0,321,322 - 523 10 523 10 459 -15 c 0,323,324 - 406.003 -35.9992 406.003 -35.9992 360.5 -47.5 c 0,325,326 - 315 -59 315 -59 255 -50 c 0,0,1 -EndSplineSet -EndChar -StartChar: k -Encoding: 107 107 23 -Width: 1113 -Flags: HMW -VStem: 40.7998 249.9<-11.0498 1388.9> -Fore -542.3 268.6 m 0,0,1 - 502.35 267.749 502.35 267.749 527 232.9 c 0,2,3 - 547.932 203.306 547.932 203.306 581.122 203.133 c 0,4,5 - 587.018 203.102 587.018 203.102 593.3 204 c 0,6,7 - 577.164 190.016 577.164 190.016 552.009 189.986 c 0,8,9 - 537.411 189.968 537.411 189.968 519.775 194.65 c 0,10,11 - 471.751 207.4 471.751 207.4 455.6 235.45 c 0,12,13 - 425.85 283.901 425.85 283.901 408 377.4 c 0,14,15 - 390.15 470.899 390.15 470.899 319.6 499.8 c 0,16,17 - 306.85 504.9 306.85 504.9 279.225 497.675 c 0,18,19 - 251.601 490.45 251.601 490.45 243.1 468.35 c 0,20,21 - 238.176 456.204 238.176 456.204 238.133 444.692 c 0,22,23 - 238.064 426.395 238.064 426.395 250.325 409.7 c 0,24,-1 - 290.7 352.75 l 0,25,26 - 313.651 314.499 313.651 314.499 317.9 257.55 c 0,27,28 - 316.954 221.448 l 0,29,30 - 312.315 189.03 312.315 189.03 293.25 166.6 c 0,31,32 - 292.4 170.001 292.4 170.001 290.7 208.675 c 0,33,34 - 289.493 236.149 289.493 236.149 266.675 236.651 c 0,35,36 - 244.032 232.428 l 0,37,38 - 242.322 231.853 242.322 231.853 240.55 231.2 c 0,39,40 - 224.401 225.25 224.401 225.25 217.175 140.675 c 0,41,42 - 209.949 56.0996 209.949 56.0996 246.5 56.0996 c 0,43,44 - 274.994 56.0996 274.994 56.0996 275.542 70.5434 c 0,45,46 - 275.632 72.904 275.632 72.904 274.975 75.6504 c 0,47,48 - 270.299 95.2002 270.299 95.2002 258.4 107.95 c 0,49,50 - 306.849 92.6506 306.849 92.6506 311.525 53.5498 c 0,51,52 - 316.201 14.4502 316.201 14.4502 290.7 -11.0498 c 0,53,54 - 245.652 -54.3987 245.652 -54.3987 189.125 -88.4004 c 0,55,56 - 132.6 -122.4 132.6 -122.4 132.6 -188.7 c 0,57,58 - 132.6 -251.601 132.6 -251.601 195.925 -280.075 c 0,59,60 - 255.893 -307.04 255.893 -307.04 337.584 -306.945 c 0,61,62 - 342.157 -306.94 342.157 -306.94 346.8 -306.85 c 0,63,64 - 196.35 -334.9 196.35 -334.9 143.225 -278.8 c 0,65,66 - 91.7255 -224.418 91.7255 -224.418 83.2998 -153.85 c 0,67,68 - 82.957 -117.949 l 0,69,70 - 86.8762 -78.2765 86.8762 -78.2765 109.65 -37.4004 c 0,71,72 - 142.799 22.0987 142.799 22.0987 143.65 80.75 c 0,73,74 - 143.65 133.451 143.65 133.451 122.4 168.3 c 0,75,76 - 106.25 195.499 106.25 195.499 79.9004 167.45 c 0,77,78 - 53.5498 139.4 53.5498 139.4 95.2002 96.0498 c 0,79,80 - 62.0497 86.7002 62.0497 86.7002 40.375 112.2 c 0,81,82 - 33.1445 120.707 33.1445 120.707 17.8496 153 c 0,83,84 - 3.40722 183.493 3.40722 183.493 29.75 240.975 c 0,85,86 - 46.5068 277.54 46.5068 277.54 65.4502 323.85 c 0,87,88 - 92.9434 391.062 92.9434 391.062 94.7754 417.775 c 0,89,90 - 101.251 512.209 101.251 512.209 102.85 514.25 c 0,91,92 - 104.836 522.868 l 0,93,94 - 104.373 534.203 104.373 534.203 97.3252 559.725 c 0,95,96 - 79.4824 621.977 79.4824 621.977 40.7998 680 c 0,97,98 - 30.5996 695.3 30.5996 695.3 27.2002 736.95 c 0,99,100 - 23.7999 778.6 23.7999 778.6 56.9502 800.7 c 0,101,102 - 49.8754 783.221 49.8754 783.221 49.8519 771.778 c 0,103,104 - 49.8182 755.43 49.8182 755.43 64.1748 751.4 c 0,105,106 - 90.0996 744.6 90.0996 744.6 110.5 785.4 c 0,107,108 - 131.413 825.057 131.413 825.057 131.609 850.216 c 0,109,110 - 131.634 853.413 131.634 853.413 131.325 856.375 c 0,111,112 - 124.084 909.899 124.084 909.899 107.95 912.9 c 0,113,114 - 74.7999 918.85 74.7999 918.85 77.3496 894.625 c 0,115,116 - 79.9004 870.4 79.9004 870.4 90.0996 860.2 c 0,117,118 - 62.0502 860.2 62.0502 860.2 45.4746 881.025 c 0,119,120 - 28.9003 901.849 28.9003 901.849 28.9004 914.6 c 0,121,122 - 30.6431 951.441 l 0,123,124 - 34.4008 977.421 34.4008 977.421 45.0498 1007.67 c 0,125,126 - 63.75 1060.8 63.75 1060.8 74.7998 1101.6 c 0,127,128 - 95.2003 1178.96 95.2003 1178.96 66.2998 1252.47 c 0,129,130 - 40.3659 1318.45 40.3659 1318.45 40.4422 1375.88 c 0,131,132 - 40.451 1382.45 40.451 1382.45 40.7998 1388.9 c 0,133,134 - 42.4996 1430.54 42.4996 1430.54 67.5752 1459.45 c 0,135,136 - 85.036 1479.58 85.036 1479.58 110.125 1479.5 c 0,137,138 - 121.062 1479.47 121.062 1479.47 133.45 1475.6 c 0,139,140 - 93.4999 1461.15 93.4999 1461.15 86.7002 1435.22 c 0,141,142 - 83.601 1410.01 l 0,143,144 - 84.1391 1401.29 84.1391 1401.29 87.5498 1394.85 c 0,145,146 - 102.429 1363.6 102.429 1363.6 134.236 1363.61 c 0,147,148 - 138.771 1363.61 138.771 1363.61 143.65 1364.25 c 0,149,150 - 182.75 1369.35 182.75 1369.35 194.65 1394.85 c 0,151,152 - 208.059 1425.77 208.059 1425.77 207.989 1452.07 c 0,153,154 - 207.84 1507.45 207.84 1507.45 147.9 1542.33 c 0,155,156 - 59.481 1593.76 59.481 1593.76 30.5996 1603.1 c 0,157,158 - 140.25 1580.15 140.25 1580.15 186.15 1532.12 c 0,159,160 - 232.049 1484.11 232.049 1484.11 243.95 1443.3 c 0,161,162 - 257.551 1394.85 257.551 1394.85 252.875 1354.47 c 0,163,164 - 248.199 1314.1 248.199 1314.1 235.45 1264.8 c 0,165,166 - 226.614 1230.08 226.614 1230.08 226.682 1184.83 c 0,167,168 - 226.706 1169.13 226.706 1169.13 227.8 1152.17 c 0,169,170 - 231.7 1091.72 231.7 1091.72 279.269 1091.04 c 0,171,172 - 283.534 1090.98 283.534 1090.98 288.15 1091.4 c 0,173,174 - 341.7 1096.5 341.7 1096.5 334.05 1142.4 c 0,175,176 - 326.4 1188.3 326.4 1188.3 283.9 1198.5 c 0,177,178 - 308.183 1201.04 l 0,179,180 - 325.909 1200.14 325.909 1200.14 345.525 1191.7 c 0,181,182 - 379.098 1177.26 379.098 1177.26 386.75 1151.75 c 0,183,184 - 392.424 1130.47 392.424 1130.47 392.464 1110.19 c 0,185,186 - 392.543 1069.7 392.543 1069.7 370.175 1033.17 c 0,187,188 - 338.479 981.419 338.479 981.419 334.9 914.6 c 0,189,190 - 332.417 868.263 332.417 868.263 379.95 889.1 c 0,191,192 - 442 916.299 442 916.299 505.75 1024.25 c 0,193,194 - 528.697 1062.5 528.697 1062.5 552.5 1165.78 c 0,195,196 - 575.844 1267.07 575.844 1267.07 610.3 1293.7 c 0,197,198 - 629.01 1308.15 629.01 1308.15 658.325 1315.38 c 0,199,200 - 681.508 1317.82 l 0,201,202 - 693.431 1316.82 693.431 1316.82 700.4 1309.85 c 0,203,204 - 641.75 1305.6 641.75 1305.6 641.75 1266.5 c 0,205,206 - 641.75 1240.15 641.75 1240.15 667.25 1246.1 c 0,207,208 - 743.751 1259.71 743.751 1259.71 750.975 1311.97 c 0,209,210 - 758.202 1364.26 758.202 1364.26 791.35 1406.75 c 0,211,212 - 811.401 1432.74 811.401 1432.74 844.752 1432.78 c 0,213,214 - 849.575 1432.79 849.575 1432.79 854.675 1432.25 c 0,215,216 - 895.049 1428.01 895.049 1428.01 906.1 1409.3 c 0,217,218 - 874.516 1412.94 l 0,219,220 - 839.2 1412.34 839.2 1412.34 824.925 1385.92 c 0,221,222 - 817.061 1371.36 817.061 1371.36 816.904 1357.53 c 0,223,224 - 820.58 1338.22 l 0,225,226 - 824.994 1327.19 824.994 1327.19 834.7 1316.65 c 0,227,228 - 855.055 1294.26 855.055 1294.26 890.312 1294.08 c 0,229,230 - 899.217 1294.03 899.217 1294.03 909.075 1295.4 c 0,231,232 - 957.942 1302.19 957.942 1302.19 998.325 1332.8 c 0,233,234 - 1038.71 1363.41 1038.71 1363.41 1055.7 1413.12 c 0,235,236 - 1060.93 1428.44 1060.93 1428.44 1060.93 1444.6 c 0,237,238 - 1060.92 1480.92 1060.92 1480.92 1034.45 1521.5 c 0,239,240 - 1083.75 1482.4 1083.75 1482.4 1086.3 1418.65 c 0,241,242 - 1084.19 1380.81 l 0,243,244 - 1077.86 1342.3 1077.86 1342.3 1054 1314.95 c 0,245,246 - 1033.61 1291.16 1033.61 1291.16 981.75 1261.83 c 0,247,248 - 929.871 1232.49 929.871 1232.49 876.35 1212.1 c 0,249,250 - 796.23 1181.55 796.23 1181.55 731.85 1068.45 c 0,251,252 - 700.406 1013.22 700.406 1013.22 682.975 961.35 c 0,253,254 - 665.549 909.5 665.549 909.5 610.3 840.65 c 0,255,256 - 572.901 793.901 572.901 793.901 512.55 787.95 c 0,257,258 - 543.15 800.7 543.15 800.7 562.7 829.175 c 0,259,260 - 569.503 839.084 569.503 839.084 569.513 846.368 c 0,261,262 - 569.531 860.017 569.531 860.017 545.7 864.45 c 0,263,264 - 520.2 868.7 520.2 868.7 494.275 845.75 c 0,265,266 - 469.591 823.898 469.591 823.898 463.25 792.2 c 0,267,268 - 460.627 761.739 l 0,269,270 - 462.103 733.539 462.103 733.539 480.675 717.825 c 0,271,272 - 493.756 706.756 493.756 706.756 504.277 706.775 c 0,273,274 - 517.122 706.798 517.122 706.798 526.15 723.35 c 0,275,276 - 527.626 732.428 l 0,277,278 - 524.386 745.468 524.386 745.468 488.75 755.65 c 0,279,280 - 508.168 770.089 508.168 770.089 525.544 770.091 c 0,281,282 - 537.833 770.093 537.833 770.093 549.1 762.875 c 0,283,284 - 576.3 745.449 576.3 745.449 583.95 719.95 c 0,285,286 - 604.35 651.951 604.35 651.951 571.2 613.7 c 0,287,288 - 546.358 585.035 546.358 585.035 546.316 540 c 0,289,290 - 546.304 527.346 546.304 527.346 548.25 513.4 c 0,291,292 - 558.45 440.3 558.45 440.3 643.875 403.325 c 0,293,294 - 729.3 366.35 729.3 366.35 803.25 341.7 c 0,295,296 - 884.85 314.5 884.85 314.5 909.5 264.35 c 0,297,298 - 928.35 226 928.35 226 928.312 206.538 c 0,299,300 - 928.3 200.55 928.3 200.55 926.5 196.35 c 0,301,302 - 905.249 264.351 905.249 264.351 842.35 278.8 c 0,303,304 - 811.077 281.413 l 0,305,306 - 775.025 279.194 775.025 279.194 765 247.35 c 0,307,308 - 763.193 229.147 l 0,309,310 - 767.307 190.197 767.307 190.197 837.25 143.225 c 0,311,312 - 923.95 84.9995 923.95 84.9995 962.2 55.25 c 0,313,314 - 997.9 26.3497 997.9 26.3497 1028.92 -23.375 c 0,315,316 - 1053.67 -63.0368 1053.67 -63.0368 1053.81 -99.1914 c 0,317,318 - 1053.85 -108.358 1053.85 -108.358 1052.3 -117.3 c 0,319,320 - 1027.92 -255.669 1027.92 -255.669 888.25 -285.6 c 0,321,322 - 871.057 -289.284 871.057 -289.284 843.002 -289.198 c 0,323,324 - 832.216 -289.165 832.216 -289.165 819.825 -288.575 c 0,325,326 - 775.198 -286.449 775.198 -286.449 737.8 -273.7 c 0,327,328 - 748.664 -276.416 748.664 -276.416 776.189 -276.355 c 0,329,330 - 791.737 -276.32 791.737 -276.32 812.6 -275.4 c 0,331,332 - 870.4 -272.85 870.4 -272.85 893.35 -262.65 c 0,333,334 - 947.749 -237.15 947.749 -237.15 980.9 -176.8 c 0,335,336 - 1014.05 -116.451 1014.05 -116.451 973.25 -47.5996 c 0,337,338 - 961.351 -27.202 961.351 -27.202 929.05 -0.424805 c 0,339,340 - 896.751 26.3496 896.751 26.3496 860.2 37.4004 c 0,341,342 - 823.078 47.9578 823.078 47.9578 801.239 48.0084 c 0,343,344 - 770.67 48.0793 770.67 48.0793 770.1 24.6504 c 0,345,346 - 770.1 5.09961 770.1 5.09961 793.475 5.09961 c 0,347,348 - 816.85 5.09961 816.85 5.09961 832.15 -0.849609 c 0,349,350 - 796.45 -21.25 796.45 -21.25 756.925 -10.625 c 0,351,352 - 717.4 -4.76837e-06 717.4 -4.76837e-06 712.3 12.75 c 0,353,354 - 698.702 38.2446 698.702 38.2446 685.1 78.2002 c 0,355,-1 - 664.7 146.2 l 0,356,357 - 657.049 171.702 657.049 171.702 616.675 220.575 c 0,358,359 - 577.384 268.136 577.384 268.136 542.3 268.6 c 0,0,1 -EndSplineSet -KernsSLIF: 111 -65 0 0 115 -104 0 0 103 -65 0 0 99 -156 0 0 -EndChar -StartChar: l -Encoding: 108 108 66 -Width: 1076 -Flags: HMW -HStem: 136.5 181.5<307 709> -VStem: 37 223.5<161 1456.5> -Fore -41 292 m 0,0,1 - 70 310 70 310 114 285 c 0,2,3 - 70.0001 294 70.0001 294 45 270.5 c 0,4,5 - 29.3458 255.785 29.3458 255.785 29.375 238.521 c 0,6,7 - 29.3925 228.215 29.3925 228.215 35 217 c 0,8,9 - 45.7595 193.759 45.7595 193.759 61.8905 193.765 c 0,10,11 - 83.2405 193.772 83.2405 193.772 114 234.5 c 0,12,13 - 146.057 276.946 146.057 276.946 146.044 324.502 c 0,14,15 - 146.035 357.054 146.035 357.054 131 392 c 0,16,17 - 107 446 107 446 77 421 c 0,18,19 - 47 396 47 396 93 354 c 0,20,21 - 27 375 27 375 26 453 c 0,22,23 - 27.8452 496.459 l 0,24,25 - 32.9898 535.068 32.9898 535.068 50.5 575.5 c 0,26,27 - 77.9997 638.999 77.9997 638.999 92 698 c 0,28,29 - 119 824 119 824 94 931 c 0,30,31 - 81.9967 983.015 81.9967 983.015 64.5 1034.5 c 0,32,33 - 47.0011 1085.99 47.0011 1085.99 42 1145 c 0,34,35 - 45.7278 1163.7 l 0,36,37 - 48.9752 1172.67 48.9752 1172.67 55 1184.5 c 0,38,39 - 68.9999 1211.99 68.9999 1211.99 111 1207 c 0,40,41 - 100.366 1206.12 l 0,42,43 - 88.4565 1201.3 88.4565 1201.3 78 1179 c 0,44,45 - 74.1633 1163.65 l 0,46,47 - 75.1096 1150.58 75.1096 1150.58 97.0824 1150.55 c 0,48,49 - 101.177 1150.55 101.177 1150.55 106 1151 c 0,50,51 - 134.875 1152.75 134.875 1152.75 135.422 1182.06 c 0,52,53 - 135.5 1186.25 135.5 1186.25 135 1191 c 0,54,55 - 130.996 1229.03 130.996 1229.03 124 1274 c 0,56,57 - 113.999 1328 113.999 1328 92.5 1376 c 0,58,59 - 71.0001 1424 71.0001 1424 53 1475 c 0,60,61 - 49.0488 1485.54 49.0488 1485.54 49.109 1498.02 c 0,62,63 - 49.2317 1523.47 49.2317 1523.47 66 1557 c 0,64,65 - 80.4583 1585.91 80.4583 1585.91 105.952 1586.07 c 0,66,67 - 122.383 1586.17 122.383 1586.17 143.398 1574.32 c 0,68,69 - 146.159 1572.76 146.159 1572.76 149 1571 c 0,70,71 - 128.01 1571 128.01 1571 103 1557 c 0,72,73 - 77.9999 1543.01 77.9999 1543.01 88 1497 c 0,74,75 - 96.8173 1449.97 96.8173 1449.97 137.5 1449.5 c 0,76,77 - 177.998 1449.99 177.998 1449.99 196 1501 c 0,78,79 - 203.796 1524.39 203.796 1524.39 203.751 1545.28 c 0,80,81 - 203.629 1602.11 203.629 1602.11 145.5 1640.5 c 0,82,83 - 66.01 1692.99 66.01 1692.99 -2 1703 c 0,84,85 - 59.4295 1700.45 l 0,86,87 - 127.09 1692.99 127.09 1692.99 170 1664.5 c 0,88,89 - 230.996 1624 230.996 1624 247 1586 c 0,90,91 - 264.567 1541.41 264.567 1541.41 264.558 1497.95 c 0,92,93 - 264.554 1477.09 264.554 1477.09 260.5 1456.5 c 0,94,95 - 248 1393 248 1393 248 1330 c 0,96,97 - 248 1249 248 1249 285 1147 c 0,98,99 - 322 1045 322 1045 265 1006 c 0,100,101 - 284 1036 284 1036 260 1067.5 c 0,102,103 - 249.5 1081.28 249.5 1081.28 239 1081.18 c 0,104,105 - 225.501 1081.06 225.501 1081.06 212 1058 c 0,106,107 - 200.001 1037 200.001 1037 194.5 961.5 c 0,108,109 - 194.818 919.869 l 0,110,111 - 199.301 880.069 199.301 880.069 222 867 c 0,112,113 - 230.364 862.221 230.364 862.221 237.166 862.215 c 0,114,115 - 253.136 862.201 253.136 862.201 260.5 888.5 c 0,116,117 - 271 926 271 926 241 959 c 0,118,119 - 276.001 959 276.001 959 291.5 913 c 0,120,121 - 298.669 891.725 298.669 891.725 298.672 873.017 c 0,122,123 - 298.675 851.275 298.675 851.275 289 833 c 0,124,125 - 280 814 280 814 268 731.5 c 0,126,127 - 255.999 648.995 255.999 648.995 252.5 557.5 c 0,128,129 - 252.749 465.02 l 0,130,131 - 254.6 426.799 254.6 426.799 259.5 392.5 c 0,132,133 - 270 319 270 319 307 318 c 0,134,135 - 352 316 352 316 381.5 366 c 0,136,137 - 411 416 411 416 477 413 c 0,138,139 - 545 407 545 407 533 332 c 0,140,141 - 517.466 372.206 517.466 372.206 481.891 372.75 c 0,142,143 - 478.534 372.802 478.534 372.802 475 372.5 c 0,144,145 - 443.78 369.835 443.78 369.835 443.871 339.628 c 0,146,147 - 443.899 330.165 443.899 330.165 447 318 c 0,148,149 - 450 303 450 303 481 292.5 c 0,150,151 - 503.812 289.566 l 0,152,153 - 536.914 289.914 536.914 289.914 597 309 c 0,154,155 - 646 324 646 324 742 359 c 0,156,157 - 838 394 838 394 825 292 c 0,158,159 - 798 357 798 357 757 314.5 c 0,160,161 - 716 272 716 272 754 257 c 0,162,163 - 800.183 238.107 800.183 238.107 842.224 238.075 c 0,164,165 - 900.317 238.031 900.317 238.031 950.5 274 c 0,166,167 - 1024.75 327.219 1024.75 327.219 1024.95 450.456 c 0,168,169 - 1024.98 470.777 1024.98 470.777 1023 493 c 0,170,171 - 1042.44 425.955 1042.44 425.955 1042.51 374.013 c 0,172,173 - 1042.59 319.048 1042.59 319.048 1021 281 c 0,174,175 - 978.999 206.999 978.999 206.999 896 173.5 c 0,176,177 - 812.998 139.999 812.998 139.999 709 136.5 c 0,178,179 - 566.939 135.419 l 0,180,181 - 543.748 135.952 543.748 135.952 522 137 c 0,182,183 - 471.006 138.999 471.006 138.999 411 151.5 c 0,184,185 - 390.2 155.833 390.2 155.833 365.795 155.78 c 0,186,187 - 319.799 155.68 319.799 155.68 261 140 c 0,188,189 - 219.505 128.553 219.505 128.553 174.425 128.623 c 0,190,191 - 156.496 128.65 156.496 128.65 138 130.5 c 0,192,193 - 73.0009 136.999 73.0009 136.999 37 161 c 0,194,195 - 8.00005 179 8.00005 179 3.5 221.5 c 0,196,197 - -1 263.999 -1 263.999 41 292 c 0,0,1 -EndSplineSet -KernsSLIF: 116 -286 0 0 121 -156 0 0 105 -78 0 0 45 -156 0 0 115 -130 0 0 119 -195 0 0 -EndChar -StartChar: m -Encoding: 109 109 24 -Width: 1471 -Flags: HMW -VStem: 93 114<55 195> 100 187<251 1528> 312.5 89.5<154.5 421> 1036 199<169 1576> 1134.5 100.5<-115 169> -Fore -1025 -231 m 1,0,1 - 1079 -195 1079 -195 1134.5 -115 c 0,2,3 - 1190 -35 1190 -35 1184 71 c 0,4,5 - 1181 106 1181 106 1161.5 152 c 0,6,7 - 1142 198.001 1142 198.001 1093 204 c 0,8,9 - 1079 204 1079 204 1059.5 200.5 c 0,10,11 - 1040 197.001 1040 197.001 1034 182 c 0,12,13 - 1024.39 155.698 1024.39 155.698 1024.37 134.251 c 0,14,15 - 1024.36 113.308 1024.36 113.308 1033.5 97 c 0,16,17 - 1047.33 72.3194 1047.33 72.3194 1073.76 72.2502 c 0,18,19 - 1082.67 72.2269 1082.67 72.2269 1093 75 c 0,20,21 - 1078.76 49.3729 1078.76 49.3729 1038.4 49.4211 c 0,22,23 - 1036.24 49.4237 1036.24 49.4237 1034 49.5 c 0,24,25 - 990 51.0002 990 51.0002 966 77 c 0,26,27 - 933.272 109.728 933.272 109.728 933.041 162.846 c 0,28,29 - 932.982 176.272 932.982 176.272 935 191 c 0,30,31 - 946 272 946 272 972.5 349.5 c 0,32,33 - 999 426.998 999 426.998 1014 503 c 0,34,35 - 1024.01 554 1024.01 554 1041 677 c 0,36,37 - 1058 800.036 1058 800.036 1058 853 c 0,38,39 - 1058 893 1058 893 1053.5 957 c 0,40,41 - 1049 1021 1049 1021 1003 1042 c 0,42,43 - 987.084 1049.23 987.084 1049.23 970.385 1049.21 c 0,44,45 - 940.911 1049.16 940.911 1049.16 909 1026.5 c 0,46,47 - 875.767 1002.9 875.767 1002.9 875.667 973.785 c 0,48,49 - 875.617 959.096 875.617 959.096 884 943 c 0,50,51 - 895.195 919.951 895.195 919.951 909.426 919.67 c 0,52,53 - 921.873 923.425 l 0,54,55 - 923.421 924.349 923.421 924.349 925 925.5 c 0,56,57 - 949 943 949 943 958 976 c 0,58,59 - 977 914 977 914 943 862 c 0,60,61 - 911.999 817.999 911.999 817.999 842.5 811.5 c 0,62,63 - 773 805 773 805 718 805 c 0,64,65 - 667 805 667 805 642 779 c 0,66,67 - 617 753 617 753 615 726 c 0,68,69 - 612 694 612 694 627 656.5 c 0,70,71 - 642 619 642 619 665 607 c 0,72,73 - 739 567 739 567 769 589 c 0,74,75 - 799 611 799 611 808 638 c 0,76,77 - 808.615 615.462 l 0,78,79 - 805.87 596.063 805.87 596.063 791.5 578.5 c 0,80,81 - 769 551 769 551 751 548 c 0,82,83 - 684 533 684 533 658 548.5 c 0,84,85 - 632 564 632 564 608 589 c 0,86,87 - 558 640 558 640 542 729.5 c 0,88,89 - 526.001 818.995 526.001 818.995 525 879 c 0,90,91 - 524 915.999 524 915.999 504 953 c 0,92,93 - 484 990 484 990 441 992 c 0,94,95 - 411 993 411 993 412.5 963.5 c 0,96,97 - 414 934 414 934 459 958 c 0,98,99 - 450 922 450 922 424 920 c 0,100,101 - 398 918 398 918 377 930 c 0,102,103 - 351 942 351 942 350.5 981.5 c 0,104,105 - 350 1020.99 350 1020.99 358 1064 c 0,106,107 - 359.954 1094.75 l 0,108,109 - 358.246 1117.65 358.246 1117.65 345 1129 c 0,110,111 - 333.574 1137.92 333.574 1137.92 323.779 1138.06 c 0,112,113 - 317.203 1138.15 317.203 1138.15 311.363 1134.29 c 0,114,115 - 294.684 1123.27 294.684 1123.27 284 1080 c 0,116,117 - 264 999 264 999 264 950 c 0,118,119 - 264 801.001 264 801.001 308 643 c 0,120,121 - 323 590 323 590 354.5 531.5 c 0,122,123 - 386 473 386 473 402 421 c 0,124,125 - 426 337 426 337 420 268 c 0,126,127 - 409.999 148.999 409.999 148.999 332 123 c 0,128,129 - 307.489 114.489 307.489 114.489 288.773 114.554 c 0,130,131 - 252.511 114.681 252.511 114.681 238 147 c 0,132,133 - 249.812 142.94 249.812 142.94 263.055 142.899 c 0,134,135 - 285.688 142.829 285.688 142.829 312.5 154.5 c 0,136,137 - 352.19 171.777 352.19 171.777 352.198 209.549 c 0,138,139 - 352.198 212.223 352.198 212.223 352 215 c 0,140,141 - 349 275 349 275 287 251 c 0,142,143 - 225 227 225 227 207 195 c 0,144,145 - 176.999 141.999 176.999 141.999 170.5 79.5 c 0,146,147 - 167.94 21.3888 l 0,148,149 - 168.706 -1.8226 168.706 -1.8226 173 -19 c 0,150,151 - 203 -149 203 -149 259.5 -205.5 c 0,152,153 - 315.999 -261.999 315.999 -261.999 374 -308 c 0,154,155 - 254 -285.999 254 -285.999 172 -175.5 c 0,156,157 - 89.9995 -64.9995 89.9995 -64.9995 93 55 c 0,158,159 - 95 136 95 136 136.5 219.5 c 0,160,161 - 178 302.999 178 302.999 190 384 c 0,162,163 - 194.996 416.975 194.996 416.975 206 474 c 0,164,165 - 209 507.333 l 0,166,167 - 207.667 536 207.667 536 189 546 c 0,168,169 - 176.804 551.963 176.804 551.963 167.289 552.233 c 0,170,171 - 153.866 549.07 l 0,172,173 - 139.867 541.011 139.867 541.011 135.5 512.5 c 0,174,175 - 126.999 457 126.999 457 158 448 c 0,176,177 - 95 448 95 448 89 503.5 c 0,178,179 - 83 559 83 559 89 601 c 0,180,181 - 95 640 95 640 120.5 683.5 c 0,182,183 - 146 727 146 727 152 766 c 0,184,185 - 155.588 821.346 l 0,186,187 - 155.088 894.71 155.088 894.71 125.5 959 c 0,188,189 - 84.9961 1047.01 84.9961 1047.01 58 1140 c 0,190,191 - 32.9998 1225.01 32.9998 1225.01 30.5 1276 c 0,192,193 - 28 1327 28 1327 73 1414 c 0,194,195 - 89.0001 1447 89.0001 1447 120.5 1453 c 0,196,197 - 145.355 1454.66 l 0,198,199 - 156.698 1453.36 156.698 1453.36 162 1447 c 0,200,201 - 119.001 1444 119.001 1444 110 1383.5 c 0,202,203 - 101 1323.01 101 1323.01 135 1322 c 0,204,205 - 161.228 1323.78 l 0,206,207 - 189.587 1330.18 189.587 1330.18 203 1357 c 0,208,209 - 222 1394.99 222 1394.99 227 1440 c 0,210,211 - 227.387 1482.88 l 0,212,213 - 225.876 1502 225.876 1502 221.5 1522.5 c 0,214,215 - 213.181 1561.47 213.181 1561.47 157.691 1561.71 c 0,216,217 - 149.82 1561.75 149.82 1561.75 141 1561 c 0,218,219 - 122.004 1558 122.004 1558 111.5 1542.5 c 0,220,221 - 101.718 1528.07 101.718 1528.07 100 1528 c 0,222,223 - 103.126 1559.45 l 0,224,225 - 113.773 1604.2 113.773 1604.2 160.5 1617.5 c 0,226,227 - 174.44 1621.47 174.44 1621.47 187.84 1621.5 c 0,228,229 - 224.431 1621.6 224.431 1621.6 257.003 1592.39 c 0,230,231 - 265.126 1585.11 265.126 1585.11 273 1576 c 0,232,233 - 321.005 1518.99 321.005 1518.99 350 1446 c 0,234,235 - 379 1372.99 379 1372.99 415 1314 c 0,236,-1 - 463 1243 l 0,237,238 - 511 1172.01 511 1172.01 543 1210 c 0,239,240 - 552 1220.72 552 1220.72 552.092 1232.53 c 0,241,242 - 552.188 1244.99 552.188 1244.99 542.38 1258.68 c 0,243,244 - 539.786 1262.3 539.786 1262.3 536.5 1266 c 0,245,246 - 513.03 1292.46 513.03 1292.46 484.812 1292.69 c 0,247,248 - 479.976 1292.73 479.976 1292.73 475 1292 c 0,249,250 - 490.916 1311.9 490.916 1311.9 512.538 1312.16 c 0,251,252 - 518.082 1312.22 518.082 1312.22 524 1311 c 0,253,254 - 553 1305 553 1305 568 1296 c 0,255,256 - 599.001 1273.99 599.001 1273.99 602 1228 c 0,257,258 - 604 1180.99 604 1180.99 627.5 1135.5 c 0,259,260 - 651 1090.01 651 1090.01 690 1110 c 0,261,262 - 726 1128 726 1128 741 1174.5 c 0,263,264 - 756 1221 756 1221 779 1281 c 0,265,266 - 808.994 1362.99 808.994 1362.99 892.5 1461.5 c 0,267,268 - 975.99 1559.99 975.99 1559.99 1036 1576 c 0,269,270 - 1115.38 1596.09 1115.38 1596.09 1210.29 1596.05 c 0,271,272 - 1214.63 1596.04 1214.63 1596.04 1219 1596 c 0,273,274 - 1319.01 1594.99 1319.01 1594.99 1393 1542 c 0,275,276 - 1431.02 1514.98 1431.02 1514.98 1470.5 1467 c 0,277,278 - 1510 1418.99 1510 1418.99 1510 1364 c 0,279,280 - 1510 1333.99 1510 1333.99 1503 1307.5 c 0,281,282 - 1496 1281 1496 1281 1463 1263 c 0,283,284 - 1484.46 1289.96 1484.46 1289.96 1484.42 1324.94 c 0,285,286 - 1484.39 1353.54 1484.39 1353.54 1470 1387.5 c 0,287,288 - 1438.01 1462.99 1438.01 1462.99 1378 1491 c 0,289,290 - 1313.98 1520 1313.98 1520 1244.5 1523 c 0,291,292 - 1222.23 1520.55 l 0,293,294 - 1174.12 1506.48 1174.12 1506.48 1170 1414 c 0,295,296 - 1172.56 1390 l 0,297,298 - 1180.15 1360.99 1180.15 1360.99 1209.5 1332 c 0,299,300 - 1235.32 1306.5 1235.32 1306.5 1253.58 1306.53 c 0,301,302 - 1264.68 1306.55 1264.68 1306.55 1273 1316 c 0,303,304 - 1290.28 1335.2 1290.28 1335.2 1290.36 1350.31 c 0,305,306 - 1290.4 1358.8 1290.4 1358.8 1285 1366 c 0,307,308 - 1269.99 1386 1269.99 1386 1246 1395 c 0,309,310 - 1256 1408.33 1256 1408.33 1270.17 1408.55 c 0,311,312 - 1286.92 1404.85 l 0,313,314 - 1291.08 1403.1 1291.08 1403.1 1295.5 1400.5 c 0,315,316 - 1327 1382 1327 1382 1332 1373 c 0,317,318 - 1340.68 1353.09 1340.68 1353.09 1340.88 1329 c 0,319,320 - 1337.14 1293.77 l 0,321,322 - 1335.62 1286.54 1335.62 1286.54 1333.5 1279 c 0,323,324 - 1318.01 1224.02 1318.01 1224.02 1288 1187 c 0,325,326 - 1193.99 1074.99 1193.99 1074.99 1222 947 c 0,327,328 - 1240 856.01 1240 856.01 1267.5 819 c 0,329,-1 - 1321 744 l 0,330,331 - 1374.27 666.794 1374.27 666.794 1374.49 580.64 c 0,332,333 - 1374.56 555.209 1374.56 555.209 1370 529 c 0,334,335 - 1364 496.019 1364 496.019 1350 464.5 c 0,336,337 - 1336.01 433.005 1336.01 433.005 1300 407 c 0,338,339 - 1291 401 1291 401 1267 392.5 c 0,340,341 - 1248.3 389.491 l 0,342,343 - 1235.95 390.219 1235.95 390.219 1226 399 c 0,344,345 - 1274 422 1274 422 1283 456 c 0,346,347 - 1289.22 479.507 1289.22 479.507 1289.23 503 c 0,348,349 - 1289.24 513.5 1289.24 513.5 1288 524 c 0,350,351 - 1285 547 1285 547 1246 548 c 0,352,353 - 1225.66 544.999 l 0,354,355 - 1203.25 536.886 1203.25 536.886 1194 507 c 0,356,357 - 1182 468 1182 468 1180.5 415 c 0,358,359 - 1182.17 345.543 l 0,360,361 - 1183.28 332.776 1183.28 332.776 1185 321 c 0,362,363 - 1194 262.984 1194 262.984 1208.5 232.5 c 0,364,365 - 1222.98 202.047 1222.98 202.047 1235 169 c 0,366,367 - 1253.25 119.481 1253.25 119.481 1253.23 68.6809 c 0,368,369 - 1253.23 41.5239 1253.23 41.5239 1248 14 c 0,370,371 - 1234.01 -55.9778 1234.01 -55.9778 1188.5 -125 c 0,372,373 - 1143.01 -193.999 1143.01 -193.999 1025 -231 c 1,0,1 -EndSplineSet -KernsSLIF: 97 -91 0 0 105 65 0 0 -EndChar -StartChar: n -Encoding: 110 110 50 -Width: 1072 -Flags: HMW -VStem: 116 176<173 1259> 669 262<167 1382> -Fore -84 54 m 0,0,1 - 67.6022 106.707 67.6022 106.707 67.6669 159.757 c 0,2,3 - 67.7127 197.292 67.7127 197.292 76 235 c 0,4,5 - 95.9999 326 95.9999 326 112 413 c 0,6,7 - 119.449 452.538 119.449 452.538 119.387 491.624 c 0,8,9 - 119.234 588.963 119.234 588.963 72.5 683.5 c 0,10,11 - 6.99995 816 6.99995 816 36 919 c 0,12,13 - 38 928 38 928 58.5 946 c 0,14,15 - 79.0001 964 79.0001 964 107 951 c 0,16,17 - 28 913 28 913 86.5 877.5 c 0,18,19 - 145 842 145 842 145 927 c 0,20,21 - 145 1008.01 145 1008.01 130.5 1094 c 0,22,23 - 115.999 1179.99 115.999 1179.99 116 1259 c 0,24,25 - 116 1331.99 116 1331.99 122.5 1411.5 c 0,26,27 - 128.999 1491 128.999 1491 177 1539 c 0,28,29 - 193.772 1556.4 193.772 1556.4 215.176 1556.62 c 0,30,31 - 236.709 1552.9 l 0,32,33 - 239.815 1551.85 239.815 1551.85 243 1550.5 c 0,34,35 - 282 1534 282 1534 282 1511 c 0,36,37 - 244.773 1542.56 244.773 1542.56 220.07 1543.1 c 0,38,39 - 205.24 1540.12 l 0,40,41 - 181.674 1529.11 181.674 1529.11 174.5 1477.5 c 0,42,43 - 171.376 1428.44 l 0,44,45 - 172.982 1352.49 172.982 1352.49 219 1308 c 0,46,47 - 273.009 1255 273.009 1255 349.5 1225 c 0,48,49 - 425.994 1195 425.994 1195 462 1148 c 0,50,51 - 488.105 1114.38 488.105 1114.38 488.397 1086.39 c 0,52,53 - 485.131 1066.6 l 0,54,55 - 474.466 1036.51 474.466 1036.51 429 1014 c 0,56,-1 - 448 1047 l 0,57,58 - 453.854 1057.54 453.854 1057.54 453.882 1069.79 c 0,59,60 - 453.903 1078.47 453.903 1078.47 451 1088 c 0,61,62 - 444 1110.01 444 1110.01 427 1115 c 0,63,64 - 414.31 1115.26 l 0,65,66 - 405.925 1112.67 405.925 1112.67 400 1102 c 0,67,68 - 392.365 1089.51 392.365 1089.51 392.438 1065.21 c 0,69,70 - 392.576 1019.49 392.576 1019.49 420 932 c 0,71,72 - 462 798 462 798 506 806 c 0,73,74 - 550.453 813.17 550.453 813.17 551.467 837.304 c 0,75,76 - 548.076 853.531 l 0,77,78 - 546.968 856.195 546.968 856.195 545.5 859 c 0,79,80 - 523.001 901.999 523.001 901.999 496 924 c 0,81,82 - 594 900 594 900 600.5 818.5 c 0,83,84 - 607 737 607 737 607 656 c 0,85,86 - 607 591 607 591 653.5 558.5 c 0,87,88 - 665.214 550.313 665.214 550.313 674.992 550.407 c 0,89,90 - 704.03 550.687 704.03 550.687 716 624 c 0,91,92 - 725 682 725 682 729 739.5 c 0,93,94 - 733 797 733 797 717 858 c 0,95,96 - 708 891 708 891 685.5 936.5 c 0,97,98 - 663 982 663 982 663 1022 c 0,99,100 - 663 1060.01 663 1060.01 678 1090.5 c 0,101,102 - 691.45 1117.84 691.45 1117.84 727.403 1118.26 c 0,103,104 - 731.552 1118.31 731.552 1118.31 736 1118 c 0,105,106 - 719.991 1101.99 719.991 1101.99 707 1077 c 0,107,108 - 701.61 1066.63 701.61 1066.63 701.549 1057.82 c 0,109,110 - 701.463 1045.37 701.463 1045.37 712 1036 c 0,111,112 - 737 1012 737 1012 751 1060 c 0,113,114 - 765 1108 765 1108 765 1118 c 0,115,116 - 765 1180.99 765 1180.99 733.5 1225.5 c 0,117,118 - 701.999 1270.01 701.999 1270.01 696 1331 c 0,119,120 - 696.659 1361.08 l 0,121,122 - 702.981 1402.43 702.981 1402.43 740 1435 c 0,123,124 - 759.78 1452.4 759.78 1452.4 778.152 1452.6 c 0,125,126 - 787.631 1452.7 787.631 1452.7 796.735 1448.21 c 0,127,128 - 814.589 1439.42 814.589 1439.42 831 1413 c 0,129,130 - 757 1422 757 1422 761.5 1360.5 c 0,131,132 - 766 1299 766 1299 817 1299 c 0,133,134 - 891.998 1299 891.998 1299 931 1382 c 0,135,136 - 950.863 1422.37 950.863 1422.37 950.815 1479.56 c 0,137,138 - 950.788 1511.64 950.788 1511.64 944.5 1549 c 0,139,140 - 926.997 1653.01 926.997 1653.01 876 1703 c 0,141,142 - 957.002 1649 957.002 1649 977 1552 c 0,143,144 - 997 1454.99 997 1454.99 997 1434 c 0,145,146 - 997 1371 997 1371 969.5 1318 c 0,147,148 - 942.002 1265.01 942.002 1265.01 930 1211 c 0,149,150 - 924.391 1186.32 924.391 1186.32 924.235 1164.02 c 0,151,152 - 927.798 1128.33 l 0,153,154 - 931.489 1111.34 931.489 1111.34 939 1096 c 0,155,156 - 963 1046.99 963 1046.99 985 994 c 0,157,158 - 1013.99 919 1013.99 919 1027 860.5 c 0,159,160 - 1028.01 839.43 l 0,161,162 - 1021.88 793.213 1021.88 793.213 941 754 c 0,163,164 - 953 769 953 769 967.5 790 c 0,165,166 - 982 811 982 811 982 832 c 0,167,168 - 982 866 982 866 959 866 c 0,169,170 - 934.737 863.08 l 0,171,172 - 896.5 851.954 896.5 851.954 892 797 c 0,173,-1 - 873 581 l 0,174,175 - 863 470 863 470 842 367 c 0,176,177 - 827 297.001 827 297.001 755 159.5 c 0,178,179 - 683 21.9999 683 21.9999 591 40 c 0,180,181 - 633 60 633 60 646.5 91.5 c 0,182,183 - 660 123 660 123 669 167 c 0,184,185 - 680 225.001 680 225.001 638 356 c 0,186,187 - 596 487 596 487 525 478 c 0,188,189 - 501 474 501 474 504.5 443.5 c 0,190,191 - 507.29 419.188 507.29 419.188 527.552 418.703 c 0,192,193 - 539 420 l 0,194,195 - 517 393 517 393 485 416.5 c 0,196,197 - 452.999 440.001 452.999 440.001 448 457 c 0,198,199 - 417.999 548.003 417.999 548.003 413 613.5 c 0,200,201 - 408 679 408 679 381 763 c 0,202,203 - 361.001 820.999 361.001 820.999 338 828 c 0,204,205 - 315 835 315 835 338 754 c 0,206,207 - 345.7 724.299 345.7 724.299 345.686 690.97 c 0,208,209 - 345.675 663.7 345.675 663.7 340.5 634 c 0,210,211 - 329 568 329 568 248 600 c 0,212,213 - 320 597 320 597 288 653 c 0,214,215 - 256 709 256 709 232 655 c 0,216,217 - 218.999 625 218.999 625 220 583.5 c 0,218,219 - 221.001 541.997 221.001 541.997 231 515 c 0,220,221 - 272 401 272 401 298.5 353.5 c 0,222,223 - 310.319 332.316 310.319 332.316 310.303 294.126 c 0,224,225 - 310.283 246.685 310.283 246.685 292 173 c 0,226,227 - 283 137.999 283 137.999 248.5 118 c 0,228,229 - 213.999 97.9998 213.999 97.9998 179 90 c 0,230,231 - 216.999 109.999 216.999 109.999 233 174.5 c 0,232,233 - 236.04 199.261 l 0,234,235 - 234.584 237.113 234.584 237.113 182 237 c 0,236,237 - 142.999 235.999 142.999 235.999 132 189.5 c 0,238,239 - 121.001 143 121.001 143 121 101 c 0,240,241 - 121 -12.9997 121 -12.9997 205.5 -65.5 c 0,242,243 - 290 -118 290 -118 387 -123 c 0,244,245 - 331.946 -127.042 l 0,246,247 - 248.215 -126.958 248.215 -126.958 188.5 -85.5 c 0,248,249 - 109.999 -30.9992 109.999 -30.9992 84 54 c 0,0,1 -EndSplineSet -KernsSLIF: 97 -208 0 0 -EndChar -StartChar: o -Encoding: 111 111 48 -Width: 1255 -Flags: W -Fore -273 143 m 1,0,1 - 247 130.5 247 130.5 220.5 130.5 c 0,2,3 - 194 130.5 194 130.5 167 143 c 0,4,5 - 68 183.001 68 183.001 68 276 c 0,6,7 - 68 342 68 342 113 506.5 c 0,8,-1 - 174 733 l 0,9,10 - 180.001 758.004 180.001 758.004 183.5 796 c 0,11,12 - 181.908 815.246 l 0,13,14 - 175.585 834.878 175.585 834.878 148 837 c 0,15,16 - 82 841 82 841 89 763 c 0,17,18 - 37 804 37 804 84.5 974.5 c 0,19,20 - 132.003 1145.01 132.003 1145.01 147 1245 c 0,21,22 - 158 1319 158 1319 197 1388 c 0,23,24 - 220.787 1430.08 220.787 1430.08 268.011 1430.13 c 0,25,26 - 298.212 1430.16 298.212 1430.16 338 1413 c 0,27,28 - 247.27 1410.33 247.27 1410.33 246.344 1359.79 c 0,29,30 - 247.5 1346.5 l 0,31,32 - 258.818 1284.01 258.818 1284.01 300 1284 c 0,33,34 - 367.003 1284 367.003 1284 435.5 1390 c 0,35,36 - 504 1496.01 504 1496.01 459 1522 c 0,37,38 - 433.333 1536.36 433.333 1536.36 413.25 1536.61 c 0,39,40 - 394.256 1533.23 l 0,41,42 - 380.637 1527.76 380.637 1527.76 370.5 1513.5 c 0,43,44 - 340.989 1471.98 340.989 1471.98 330 1451 c 0,45,46 - 326.246 1484.15 l 0,47,48 - 326.881 1531.42 326.881 1531.42 366 1560 c 0,49,50 - 414.154 1595.18 414.154 1595.18 488.874 1595.22 c 0,51,52 - 494.849 1595.22 494.849 1595.22 501 1595 c 0,53,54 - 584.988 1590.01 584.988 1590.01 693.5 1539 c 0,55,56 - 802 1488 802 1488 835 1428 c 0,57,-1 - 899 1286.5 l 0,58,59 - 954.143 1164.13 954.143 1164.13 999 1164 c 0,60,61 - 1059.17 1168.63 1059.17 1168.63 1059.54 1207.77 c 0,62,63 - 1059.63 1218.49 1059.63 1218.49 1054.5 1234 c 0,64,65 - 1032 1297.99 1032 1297.99 975 1299 c 0,66,67 - 1019.99 1302.45 l 0,68,69 - 1090.79 1301.3 1090.79 1301.3 1107.5 1250 c 0,70,71 - 1119.87 1212.01 1119.87 1212.01 1119.83 1182.65 c 0,72,73 - 1119.79 1160.98 1119.79 1160.98 1113 1144 c 0,74,75 - 1092.07 1091.19 1092.07 1091.19 1037 938 c 0,76,77 - 996.721 825.96 996.721 825.96 996.666 771.829 c 0,78,79 - 996.647 752.046 996.647 752.046 1002 740 c 0,80,81 - 1014 710 1014 710 1060.5 710.5 c 0,82,83 - 1107 711 1107 711 1118 750 c 0,84,85 - 1120.72 775.054 l 0,86,87 - 1118.42 818.286 1118.42 818.286 1059 827 c 0,88,89 - 1066.89 837.526 1066.89 837.526 1087.53 837.526 c 0,90,91 - 1106.1 837.526 1106.1 837.526 1135 829 c 0,92,93 - 1196.01 811 1196.01 811 1195 746 c 0,94,95 - 1190.99 608.991 1190.99 608.991 1083.5 510.5 c 0,96,97 - 976.003 412.007 976.003 412.007 925 303 c 0,98,99 - 910 273 910 273 941.5 249 c 0,100,101 - 973 225 973 225 1048 270 c 0,102,103 - 1015 183 1015 183 859 163.5 c 0,104,105 - 703 144 703 144 659 120 c 0,106,107 - 608 91.9995 608 91.9995 531 69.5 c 0,108,109 - 493.463 58.5313 493.463 58.5313 454.499 58.6135 c 0,110,111 - 413.537 58.7 413.537 58.7 371 71 c 0,112,113 - 361 72.9999 361 72.9999 341 87 c 0,114,115 - 321 101 321 101 317 129 c 0,116,117 - 362 91.9995 362 91.9995 398 95 c 0,118,119 - 434 98 434 98 452 118 c 0,120,121 - 459.368 126.105 459.368 126.105 459.271 134.686 c 0,122,123 - 459.105 149.395 459.105 149.395 437 165.5 c 0,124,125 - 402.002 190.999 402.002 190.999 350 210 c 0,126,127 - 298 229.001 298 229.001 248 237 c 0,128,129 - 209.512 240.063 l 0,130,131 - 194.138 239.207 194.138 239.207 190 233 c 0,132,133 - 178.857 216.286 178.857 216.286 178.827 202.327 c 0,134,135 - 178.786 183.714 178.786 183.714 198.5 170 c 0,136,137 - 233 146 233 146 273 143 c 1,0,1 -803 384 m 0,79,80 - 814 403 814 403 806.5 436 c 0,81,82 - 799 469 799 469 757 454 c 0,83,84 - 714 439 714 439 719.5 402.5 c 0,85,86 - 725.001 365.999 725.001 365.999 744 364 c 0,87,88 - 686 364 686 364 682 416 c 0,89,90 - 682.987 446.036 l 0,91,92 - 689.14 481.814 689.14 481.814 720.5 502 c 0,93,94 - 764 530 764 530 805 574 c 0,95,96 - 818 588 818 588 852.5 708 c 0,97,98 - 887 828 887 828 872 893 c 0,99,100 - 852.999 968.001 852.999 968.001 790.5 1001.5 c 0,101,102 - 728 1034.99 728 1034.99 728 1128 c 0,103,104 - 728 1139.99 728 1139.99 743.5 1150 c 0,105,106 - 751.596 1155.23 751.596 1155.23 760.376 1155.26 c 0,107,108 - 768.402 1155.3 768.402 1155.3 777 1151 c 0,109,110 - 764.093 1148.42 764.093 1148.42 763.773 1134.36 c 0,111,112 - 763.721 1132.08 763.721 1132.08 764 1129.5 c 0,113,114 - 766 1111 766 1111 781 1111 c 0,115,116 - 792.638 1113.28 l 0,117,118 - 801.466 1118.77 801.466 1118.77 801.409 1136.92 c 0,119,120 - 801.343 1157.82 801.343 1157.82 789.5 1195.5 c 0,121,122 - 761.999 1283 761.999 1283 675 1301 c 0,123,124 - 582 1320.01 582 1320.01 516.5 1283 c 0,125,126 - 451 1245.99 451 1245.99 451 1187 c 0,127,128 - 451 1166.01 451 1166.01 478.5 1151.5 c 0,129,130 - 496.123 1142.2 496.123 1142.2 515.194 1142.16 c 0,131,132 - 525.87 1142.13 525.87 1142.13 537 1145 c 0,133,134 - 579 1154 579 1154 553 1199 c 0,135,136 - 583.043 1194.13 583.043 1194.13 583.417 1158.6 c 0,137,138 - 582 1140.5 l 0,139,140 - 574 1087.99 574 1087.99 547 1077 c 0,141,142 - 514.021 1064 514.021 1064 466 1056.5 c 0,143,144 - 418.018 1049 418.018 1049 379 1032 c 0,145,146 - 325 1008 325 1008 295.5 850.5 c 0,147,148 - 267.83 702.772 267.83 702.772 267.873 661.932 c 0,149,150 - 267.876 659.233 267.876 659.233 268 657 c 0,151,152 - 270 581 270 581 314.5 564 c 0,153,154 - 359 547 359 547 403 502 c 0,155,156 - 425 477 425 477 423.5 434.5 c 0,157,158 - 422 392 422 392 391 389 c 0,159,160 - 404 412 404 412 394 428 c 0,161,162 - 387.333 438.667 387.333 438.667 372.222 438.667 c 0,163,164 - 364.667 438.667 364.667 438.667 355 436 c 0,165,166 - 323 427 323 427 329 389 c 0,167,168 - 335 350.999 335 350.999 365 334 c 0,169,170 - 446.945 286.393 446.945 286.393 553.56 286.295 c 0,171,172 - 583.554 286.268 583.554 286.268 615.5 290 c 0,173,174 - 760.999 306.999 760.999 306.999 803 384 c 0,79,80 -EndSplineSet -KernsSLIF: 121 -65 0 0 97 -156 0 0 120 -143 0 0 119 -195 0 0 116 -313 0 0 -EndChar -StartChar: p -Encoding: 112 112 62 -Width: 1149 -Flags: MW -VStem: 186 277<161 1354.5> -Fore -459 842 m 0,0,1 - 533 791 533 791 552 852 c 0,2,3 - 571 918 571 918 538 911.5 c 0,4,5 - 505.001 905.001 505.001 905.001 490 888 c 0,6,7 - 484.931 894.589 484.931 894.589 485.001 903.875 c 0,8,9 - 485.068 912.911 485.068 912.911 490 924.5 c 0,10,11 - 500.001 948.002 500.001 948.002 510 959 c 0,12,13 - 552 1001 552 1001 594.5 970.5 c 0,14,15 - 636.999 940.001 636.999 940.001 684 927 c 0,16,17 - 743 909 743 909 765.5 991.5 c 0,18,19 - 788 1074 788 1074 793 1146 c 0,20,21 - 791.31 1194.24 l 0,22,23 - 786.836 1233.11 786.836 1233.11 772.5 1275.5 c 0,24,25 - 748.997 1345 748.997 1345 689 1378 c 0,26,27 - 653.011 1395.99 653.011 1395.99 614.5 1397 c 0,28,29 - 576 1398.01 576 1398.01 580 1334 c 0,30,31 - 582 1300.99 582 1300.99 610.5 1297.5 c 0,32,33 - 640.125 1297.91 l 0,34,35 - 655.135 1300.05 655.135 1300.05 671 1306 c 0,36,37 - 664.999 1278.99 664.999 1278.99 636.5 1266.5 c 0,38,39 - 618.241 1258.49 618.241 1258.49 605.122 1258.49 c 0,40,41 - 597.752 1258.48 597.752 1258.48 592 1261 c 0,42,43 - 532.006 1283.99 532.006 1283.99 502.5 1321.5 c 0,44,45 - 473 1359 473 1359 453 1368 c 0,46,47 - 432.95 1375.16 432.95 1375.16 416.875 1375.14 c 0,48,49 - 388.049 1375.11 388.049 1375.11 372 1352 c 0,50,51 - 352 1322 352 1322 350.5 1246.5 c 0,52,53 - 352.925 1165.25 l 0,54,55 - 355.829 1127.66 355.829 1127.66 362 1088.5 c 0,56,57 - 375.001 1005.99 375.001 1005.99 400 935 c 0,58,59 - 425.001 864 425.001 864 459 842 c 0,0,1 -219 40 m 0,36,37 - 217.856 126.542 l 0,38,39 - 221.958 253.051 221.958 253.051 260 376.5 c 0,40,41 - 291.04 477.228 291.04 477.228 290.964 584.069 c 0,42,43 - 290.915 652.771 290.915 652.771 278 724 c 0,44,45 - 263 800 263 800 215.5 853.5 c 0,46,47 - 168.001 906.999 168.001 906.999 158 973 c 0,48,49 - 157.625 1002.88 l 0,50,51 - 159.2 1017.98 159.2 1017.98 164 1035.5 c 0,52,53 - 174.001 1071.99 174.001 1071.99 208 1076 c 0,54,55 - 194.139 1039.57 194.139 1039.57 193.923 1016.15 c 0,56,57 - 196.953 996.417 l 0,58,59 - 203.629 978.699 203.629 978.699 225 975 c 0,60,61 - 246.691 974.559 l 0,62,63 - 276.931 980 276.931 980 283 1024 c 0,64,65 - 282.228 1068.73 l 0,66,67 - 280.438 1090.45 280.438 1090.45 276.5 1120.5 c 0,68,69 - 266.999 1193.01 266.999 1193.01 244.5 1258 c 0,70,71 - 221.997 1323 221.997 1323 186 1354.5 c 0,72,73 - 173.294 1365.62 173.294 1365.62 158.969 1365.71 c 0,74,75 - 144.032 1365.81 144.032 1365.81 127.335 1353.92 c 0,76,77 - 114.674 1344.91 114.674 1344.91 101 1329 c 0,78,79 - 68.9429 1292.23 68.9429 1292.23 68.889 1247.01 c 0,80,81 - 68.8857 1244.27 68.8857 1244.27 69 1241.5 c 0,82,83 - 70.9999 1193.01 70.9999 1193.01 89 1171 c 0,84,85 - 104.009 1149.99 104.009 1149.99 111 1137 c 0,86,87 - 117.997 1124 117.997 1124 139 1118 c 0,88,89 - 85.8527 1124.89 85.8527 1124.89 76 1137 c 0,90,91 - 66.9851 1149.02 66.9851 1149.02 47 1169 c 0,92,93 - 28 1206.99 28 1206.99 27 1238 c 0,94,95 - 26 1269.01 26 1269.01 32 1307 c 0,96,97 - 42.001 1376.01 42.001 1376.01 79 1420 c 0,98,99 - 169 1523.01 169 1523.01 248 1547.5 c 0,100,101 - 321.281 1570.22 321.281 1570.22 448.769 1570.15 c 0,102,103 - 458.716 1570.14 458.716 1570.14 469 1570 c 0,104,105 - 609.017 1567 609.017 1567 708.5 1534.5 c 0,106,107 - 808 1501.99 808 1501.99 929 1422 c 0,108,109 - 988.991 1381.01 988.991 1381.01 1042 1319 c 0,110,111 - 1071.32 1284.7 1071.32 1284.7 1071.57 1242.43 c 0,112,113 - 1071.66 1225.04 1071.66 1225.04 1066.84 1206.3 c 0,114,115 - 1062.2 1188.27 1062.2 1188.27 1053 1169 c 0,116,117 - 1025 1111.01 1025 1111.01 956 1104 c 0,118,119 - 978.832 1141.7 978.832 1141.7 979.109 1171.22 c 0,120,121 - 975.706 1193.58 l 0,122,123 - 971.477 1206.24 971.477 1206.24 962 1217 c 0,124,125 - 952.994 1226.01 952.994 1226.01 924 1232.5 c 0,126,127 - 895 1238.99 895 1238.99 895 1195 c 0,128,129 - 893 1118.01 893 1118.01 898 1043.5 c 0,130,131 - 898.872 971.375 l 0,132,133 - 897.219 932.389 897.219 932.389 891 893 c 0,134,135 - 883 845 883 845 841.5 736 c 0,136,137 - 800 627 800 627 729 600 c 0,138,139 - 704.81 590.534 704.81 590.534 673.984 590.609 c 0,140,141 - 646.19 590.677 646.19 590.677 613 598.5 c 0,142,143 - 543 615 543 615 526 669 c 0,144,145 - 568.61 646.769 568.61 646.769 613.795 646.846 c 0,146,147 - 617.39 646.853 617.39 646.853 621 647 c 0,148,149 - 675 650 675 650 679 678.5 c 0,150,151 - 676.92 691.447 l 0,152,153 - 667.063 711.922 667.063 711.922 615 728 c 0,154,155 - 572 741 572 741 525.5 732 c 0,156,157 - 479 723 479 723 452 689 c 0,158,159 - 432 663 432 663 414.5 579.5 c 0,160,161 - 397 496 397 496 412 436 c 0,162,163 - 428 362 428 362 444.5 296.5 c 0,164,165 - 461.001 230.997 461.001 230.997 463 161 c 0,166,167 - 464 15.9999 464 15.9999 401 -99 c 0,168,169 - 376.999 -141.002 376.999 -141.002 308.5 -197 c 0,170,171 - 239.999 -253 239.999 -253 190 -253 c 0,172,173 - 262 -218.001 262 -218.001 340.5 -113.5 c 0,174,175 - 419 -8.99995 419 -8.99995 383 78 c 0,176,177 - 363 124.999 363 124.999 327 121.5 c 0,178,179 - 291 118.001 291 118.001 264 82 c 0,180,181 - 251.066 64.7553 251.066 64.7553 251.04 37.4438 c 0,182,183 - 251.029 26.7444 251.029 26.7444 253 14.5 c 0,184,185 - 260 -29 260 -29 269 -50 c 0,186,187 - 220.999 -15.9996 220.999 -15.9996 219 40 c 0,36,37 -EndSplineSet -KernsSLIF: 45 -104 0 0 46 -221 0 0 44 -208 0 0 116 -195 0 0 322 -299 0 0 97 -299 0 0 -EndChar -StartChar: q -Encoding: 113 113 33 -Width: 1161 -Flags: W -Fore -894 1526 m 1,0,1 - 939 1548.01 939 1548.01 988 1526 c 0,2,3 - 1076 1482.01 1076 1482.01 1076 1388 c 0,4,5 - 1076 1319.99 1076 1319.99 1035.5 1151.5 c 0,6,7 - 995.011 983.049 995.011 983.049 982 920 c 0,8,9 - 976 893 976 893 973 854.5 c 0,10,11 - 970 816 970 816 1005 813 c 0,12,13 - 1025.76 814.377 l 0,14,15 - 1058.35 822.828 1058.35 822.828 1058.55 874.124 c 0,16,17 - 1058.58 881.159 1058.58 881.159 1058 889 c 0,18,19 - 1084.77 857.216 1084.77 857.216 1084.79 810.971 c 0,20,21 - 1084.81 774.286 1084.81 774.286 1068 728.5 c 0,22,23 - 1030 624.986 1030 624.986 1030 539 c 0,24,25 - 1030 452 1030 452 1057 408 c 0,26,27 - 1084 364 1084 364 1078 313 c 0,28,29 - 1069 237.011 1069 237.011 1032.5 176 c 0,30,31 - 1011.58 141.039 1011.58 141.039 973.09 140.897 c 0,32,33 - 946.128 140.797 946.128 140.797 910.547 157.778 c 0,34,35 - 908.291 158.855 908.291 158.855 906 160 c 0,36,37 - 997 161.999 997 161.999 986.5 227.5 c 0,38,39 - 976 293 976 293 940 293 c 0,40,41 - 924.998 291.999 924.998 291.999 890 261 c 0,42,43 - 855 229.999 855 229.999 855 191 c 0,44,45 - 854 138.001 854 138.001 876 122 c 0,46,47 - 897.996 106.003 897.996 106.003 926.5 90 c 0,48,49 - 955 73.9999 955 73.9999 981.5 40.5 c 0,50,51 - 1008.01 6.99366 1008.01 6.99366 1016 -79 c 0,52,53 - 985 -1 985 -1 920.5 42 c 0,54,55 - 856 85.0001 856 85.0001 835 26 c 0,56,57 - 820 -13 820 -13 902.5 -103 c 0,58,59 - 985 -193 985 -193 1095 -199 c 0,60,61 - 1038.78 -196.757 l 0,62,63 - 961.445 -188.18 961.445 -188.18 897.5 -149 c 0,64,65 - 811 -96.0005 811 -96.0005 754 -39 c 0,66,67 - 703 10 703 10 704 62.5 c 0,68,69 - 705 115 705 115 683 124 c 0,70,71 - 671.055 128.52 671.055 128.52 660.204 128.453 c 0,72,73 - 637.445 128.315 637.445 128.315 619.5 108 c 0,74,75 - 593 78 593 78 533 67 c 0,76,77 - 296 22 296 22 276 156 c 0,78,79 - 332 109.001 332 109.001 375.5 127.5 c 0,80,81 - 419 145.999 419 145.999 391 207 c 0,82,83 - 384 220.999 384 220.999 333 351 c 0,84,85 - 282 481 282 481 244 478 c 0,86,87 - 190.301 472.63 190.301 472.63 189.566 432.54 c 0,88,89 - 193.349 407.215 l 0,90,91 - 193.662 406.115 193.662 406.115 194 405 c 0,92,93 - 213.999 339 213.999 339 265 339 c 0,94,95 - 248.288 325.169 248.288 325.169 231.244 325.121 c 0,96,97 - 218.712 325.085 218.712 325.085 206 332.5 c 0,98,99 - 175.998 350.001 175.998 350.001 170 357 c 0,100,101 - 138.31 395.028 138.31 395.028 138.359 449.918 c 0,102,103 - 138.38 472.972 138.38 472.972 144 499 c 0,104,105 - 155.998 553.993 155.998 553.993 207.5 709.5 c 0,106,107 - 258.999 865 258.999 865 242 913 c 0,108,109 - 230.225 942.439 230.225 942.439 188.5 942.5 c 0,110,111 - 147 942 147 942 138 903 c 0,112,113 - 135.388 876.036 l 0,114,115 - 137.633 831.849 137.633 831.849 191 824 c 0,116,117 - 176 803 176 803 122 821 c 0,118,119 - 68 839 68 839 69 907 c 0,120,121 - 72.0001 1046.01 72.0001 1046.01 168 1147 c 0,122,123 - 263.993 1247.99 263.993 1247.99 311 1361 c 0,124,125 - 314.463 1377.59 l 0,126,127 - 314.082 1394.93 314.082 1394.93 293.5 1404 c 0,128,129 - 280.413 1405.97 l 0,130,131 - 254.722 1403.08 254.722 1403.08 220 1351 c 0,132,133 - 224.001 1422 224.001 1422 270.5 1455 c 0,134,135 - 316.989 1487.99 316.989 1487.99 374 1502.5 c 0,136,137 - 431 1517.01 431 1517.01 482 1523.5 c 0,138,139 - 532.995 1529.99 532.995 1529.99 548 1548 c 0,140,141 - 556.237 1558.37 556.237 1558.37 556.563 1567.91 c 0,142,143 - 553.491 1580.23 l 0,144,145 - 545.526 1594.7 545.526 1594.7 517 1607 c 0,146,147 - 459 1632.01 459 1632.01 408 1580 c 0,148,149 - 414 1645.99 414 1645.99 485 1659 c 0,150,151 - 518.084 1665.06 518.084 1665.06 542.705 1665.04 c 0,152,153 - 570.911 1665.01 570.911 1665.01 588 1657 c 0,154,155 - 646.008 1630 646.008 1630 681 1590 c 0,156,-1 - 732 1531 l 0,157,158 - 785.011 1462.99 785.011 1462.99 864.5 1431 c 0,159,160 - 902.895 1415.55 902.895 1415.55 928.109 1415.49 c 0,161,162 - 955.109 1415.42 955.109 1415.42 967 1433 c 0,163,164 - 992 1470.01 992 1470.01 960.5 1496 c 0,165,166 - 929 1521.99 929 1521.99 894 1526 c 0,167,-1 - 894 1526 l 1,0,1 -714 1394 m 1,101,102 - 629.017 1394 629.017 1394 539 1366.5 c 0,103,104 - 449 1339.01 449 1339.01 420 1278 c 0,105,106 - 413.818 1265.02 413.818 1265.02 413.751 1247.07 c 0,107,108 - 413.709 1235.98 413.709 1235.98 416 1223 c 0,109,110 - 422 1188.99 422 1188.99 461 1205 c 0,111,112 - 499 1220 499 1220 494 1257.5 c 0,113,114 - 489.001 1295 489.001 1295 472 1298 c 0,115,116 - 494.625 1295.06 l 0,117,118 - 524.25 1285.5 524.25 1285.5 528 1245 c 0,119,120 - 526.001 1211.45 l 0,121,122 - 519.32 1176.2 519.32 1176.2 492.5 1156 c 0,123,124 - 454.022 1127.02 454.022 1127.02 418 1083 c 0,125,126 - 406 1068 406 1068 372 943.5 c 0,127,128 - 347.868 855.136 347.868 855.136 347.917 796.743 c 0,129,130 - 347.937 772.865 347.937 772.865 352 754 c 0,131,132 - 368 676 368 676 431 615 c 0,133,134 - 494 554 494 554 494 459 c 0,135,136 - 494 446.001 494 446.001 480 436 c 0,137,138 - 466 426 466 426 451 435 c 0,139,140 - 462.186 437.581 462.186 437.581 462.266 451.639 c 0,141,142 - 462.279 453.919 462.279 453.919 462 456.5 c 0,143,144 - 460 475 460 475 448 477 c 0,145,146 - 415 479 415 479 409 417.5 c 0,147,148 - 403 356 403 356 459 317 c 0,149,150 - 543 254 543 254 606 284 c 0,151,152 - 656 306 656 306 647 353 c 0,153,154 - 638 400 638 400 584 430 c 0,155,156 - 665 426 665 426 676.5 381 c 0,157,158 - 688 336 688 336 742 333 c 0,159,160 - 775 330 775 330 792 361 c 0,161,162 - 809 392 809 392 809 407 c 0,163,164 - 806 469 806 469 732 451 c 0,165,166 - 693 440 693 440 718 395 c 0,167,168 - 684 401 684 401 691 455 c 0,169,170 - 698 509 698 509 724 521 c 0,171,172 - 752.003 533.001 752.003 533.001 808.5 549.5 c 0,173,174 - 865 566 865 566 886 619 c 0,175,176 - 906 672 906 672 888 854.5 c 0,177,178 - 870 1037 870 1037 777 1157 c 0,179,180 - 757.882 1180.9 757.882 1180.9 758 1225 c 0,181,182 - 759 1268.01 759 1268.01 788 1273 c 0,183,184 - 780.325 1258.24 780.325 1258.24 780.318 1246.44 c 0,185,186 - 780.313 1238.26 780.313 1238.26 784 1231.5 c 0,187,188 - 793 1215 793 1215 820 1224 c 0,189,190 - 848 1233 848 1233 848 1276 c 0,191,192 - 848 1319 848 1319 828 1343 c 0,193,194 - 784 1391 784 1391 714 1394 c 1,101,102 -EndSplineSet -EndChar -StartChar: r -Encoding: 114 114 58 -Width: 1124 -Flags: HMW -VStem: 91 270<64 1451> -Fore -955 37 m 0,0,1 - 952 91 952 91 911.5 135 c 0,2,3 - 870.999 179 870.999 179 819 191 c 0,4,5 - 794.703 192.621 l 0,6,7 - 770.125 190 770.125 190 755 168 c 0,8,9 - 745.623 154.361 745.623 154.361 745.693 141.266 c 0,10,11 - 745.787 123.639 745.787 123.639 763 107 c 0,12,13 - 789 80 789 80 804 91.5 c 0,14,15 - 819 103 819 103 834 124 c 0,16,17 - 849 52 849 52 786 35 c 0,18,19 - 723 18 723 18 687 71 c 0,20,21 - 657.999 113.002 657.999 113.002 650 167.5 c 0,22,23 - 642 221.999 642 221.999 629 268 c 0,24,25 - 605 346 605 346 541.5 461.5 c 0,26,27 - 478 577 478 577 396 594 c 0,28,29 - 366 600 366 600 324 584 c 0,30,31 - 282 568 282 568 282 504 c 0,32,33 - 282 388 282 388 319 283 c 0,34,35 - 356 178 356 178 349 52 c 0,36,37 - 345 -12 345 -12 286 -82.5 c 0,38,39 - 227.001 -152.999 227.001 -152.999 166 -175 c 0,40,41 - 73 -208 73 -208 -6 -196 c 0,42,43 - 48 -188.001 48 -188.001 113 -160 c 0,44,45 - 149.001 -141.999 149.001 -141.999 206.5 -91 c 0,46,47 - 263.999 -40 263.999 -40 268 35 c 0,48,49 - 267.157 86.4993 l 0,50,51 - 264.878 110.469 264.878 110.469 259 133 c 0,52,53 - 247.316 177.79 247.316 177.79 183 178 c 0,54,55 - 132.68 176.027 132.68 176.027 132.5 103 c 0,56,57 - 132.999 30.0002 132.999 30.0002 184 11 c 0,58,59 - 139 9 139 9 119.5 27.5 c 0,60,61 - 100 46 100 46 91 64 c 0,62,63 - 46 143.001 46 143.001 96.5 293 c 0,64,65 - 146.998 442.991 146.998 442.991 166 525 c 0,66,67 - 187 621 187 621 166 636.5 c 0,68,69 - 156.351 643.621 156.351 643.621 147.758 643.671 c 0,70,71 - 137.649 643.73 137.649 643.73 129 634 c 0,72,73 - 113.001 616.001 113.001 616.001 110.5 587 c 0,74,75 - 107.999 558 107.999 558 123 546 c 0,76,77 - 64.9999 548 64.9999 548 58.5 598.5 c 0,78,79 - 52 649 52 649 59 679 c 0,80,81 - 71 730 71 730 105 787 c 0,82,83 - 139.001 844 139.001 844 153 896 c 0,84,85 - 167.911 959.375 167.911 959.375 167.814 1022.19 c 0,86,87 - 167.781 1043.63 167.781 1043.63 166 1065 c 0,88,89 - 155.002 1181.99 155.002 1181.99 136 1306 c 0,90,91 - 132.713 1352.23 l 0,92,93 - 134.048 1449.51 134.048 1449.51 207 1533 c 0,94,95 - 277.995 1615 277.995 1615 419.5 1625.5 c 0,96,97 - 561 1636 561 1636 567 1480 c 0,98,99 - 533 1558 533 1558 442.5 1553.5 c 0,100,101 - 360.829 1549.44 360.829 1549.44 360.191 1469.23 c 0,102,103 - 360.122 1460.56 360.122 1460.56 361 1451 c 0,104,105 - 366 1387.99 366 1387.99 491.5 1375.5 c 0,106,107 - 547.456 1373.25 l 0,108,109 - 617.51 1376 617.51 1376 619 1414 c 0,110,111 - 616.188 1429.37 l 0,112,113 - 607.359 1448.45 607.359 1448.45 570.946 1448.57 c 0,114,115 - 564.416 1448.59 564.416 1448.59 557 1448 c 0,116,117 - 588.229 1465.3 588.229 1465.3 621.879 1465.4 c 0,118,119 - 654.905 1465.5 654.905 1465.5 690.262 1449.03 c 0,120,121 - 693.869 1447.35 693.869 1447.35 697.5 1445.5 c 0,122,123 - 773.003 1406.99 773.003 1406.99 802 1323 c 0,124,125 - 823 1257 823 1257 854.5 1237.5 c 0,126,127 - 886 1218 886 1218 940 1170 c 0,128,129 - 964.001 1147.99 964.001 1147.99 973 1098.5 c 0,130,131 - 982 1049 982 1049 926 1019 c 0,132,133 - 964 1061 964 1061 938 1095.5 c 0,134,135 - 921.406 1117.52 921.406 1117.52 906.846 1118.56 c 0,136,137 - 894.877 1115.67 l 0,138,139 - 892.918 1114.55 892.918 1114.55 891 1113 c 0,140,141 - 877.293 1101.25 877.293 1101.25 877.365 1072.37 c 0,142,143 - 877.441 1042.25 877.441 1042.25 892.5 993.5 c 0,144,145 - 922 898 922 898 900 805 c 0,146,147 - 879 719 879 719 799.5 707 c 0,148,149 - 720 695 720 695 687 725 c 0,150,151 - 721 725 721 725 748 745 c 0,152,153 - 768.483 760.172 768.483 760.172 768.823 785.704 c 0,154,155 - 767 803 l 0,156,157 - 755 863 755 863 684 802.5 c 0,158,159 - 622.198 749.838 622.198 749.838 621.768 695.282 c 0,160,161 - 621.704 687.162 621.704 687.162 623 679 c 0,162,163 - 628 642 628 642 678.5 602.5 c 0,164,165 - 714.169 574.601 714.169 574.601 735.12 574.389 c 0,166,167 - 743.832 574.301 743.832 574.301 750 579 c 0,168,169 - 767 593 767 593 753 613.5 c 0,170,171 - 739 634 739 634 703 634 c 0,172,173 - 706.918 659.463 706.918 659.463 751.5 659.5 c 0,174,175 - 796 659 796 659 817 635 c 0,176,177 - 845 602 845 602 837.5 533 c 0,178,179 - 830 464 830 464 830 422 c 0,180,181 - 830 331.001 830 331.001 895 304.5 c 0,182,183 - 960 278 960 278 1008 210 c 0,184,185 - 1044.01 154.989 1044.01 154.989 1056.5 81 c 0,186,187 - 1063.49 39.6195 1063.49 39.6195 1063.44 4.82321 c 0,188,189 - 1063.41 -22.6343 1063.41 -22.6343 1059 -46 c 0,190,191 - 1012.01 -279.997 1012.01 -279.997 833 -375 c 0,192,193 - 654 -470 654 -470 447 -500 c 0,194,195 - 651 -443 651 -443 809 -321.5 c 0,196,197 - 967 -200 967 -200 955 37 c 0,0,1 -502 848 m 0,122,123 - 524 824 524 824 556 836 c 0,124,125 - 588 848 588 848 624 872 c 0,126,127 - 708 930 708 930 720 1081.5 c 0,128,129 - 721.045 1138.14 l 0,130,131 - 716.188 1217.67 716.188 1217.67 668.868 1217.71 c 0,132,133 - 661.895 1217.72 661.895 1217.72 654 1216 c 0,134,135 - 621 1208.01 621 1208.01 618 1181.5 c 0,136,137 - 619.974 1168.14 l 0,138,139 - 627.885 1149.33 627.885 1149.33 665 1133 c 0,140,141 - 627.903 1130.74 l 0,142,143 - 584.539 1132.87 584.539 1132.87 560.5 1160.5 c 0,144,145 - 527.011 1198.99 527.011 1198.99 492 1220 c 0,146,147 - 456.982 1241.43 456.982 1241.43 425.381 1241.41 c 0,148,149 - 396.515 1241.4 396.515 1241.4 370.5 1223.5 c 0,150,151 - 315.999 1186 315.999 1186 290 1108 c 0,152,153 - 276.999 1070.99 276.999 1070.99 269.5 953 c 0,154,155 - 269.879 905.901 l 0,156,157 - 277.054 832.123 277.054 832.123 330 822 c 0,158,159 - 394 808 394 808 391 879 c 0,160,161 - 387.786 911.935 387.786 911.935 350.375 911.961 c 0,162,163 - 341.213 911.967 341.213 911.967 330 910 c 0,164,165 - 327 927 327 927 359.5 939 c 0,166,167 - 392 951 392 951 409 941 c 0,168,169 - 472 898 472 898 464.5 896.5 c 0,170,171 - 457 895 457 895 502 848 c 0,122,123 -EndSplineSet -KernsSLIF: 121 -156 0 0 115 -182 0 0 103 -104 0 0 116 -339 0 0 118 -43 0 0 119 -150 0 0 -EndChar -StartChar: s -Encoding: 115 115 25 -Width: 1163 -Flags: HW -Fore -509 51 m 0,0,1 - 494 57 494 57 471.5 79 c 0,2,3 - 449 101 449 101 453 122 c 0,4,-1 - 495.5 92.5 l 0,5,6 - 517 77.0001 517 77.0001 538 93 c 0,7,8 - 553.149 104.584 553.149 104.584 553.111 115.871 c 0,9,10 - 553.064 129.916 553.064 129.916 529.5 143.5 c 0,11,12 - 487 167.999 487 167.999 420 191.5 c 0,13,-1 - 286.5 238 l 0,14,15 - 220 261 220 261 205 285 c 0,16,17 - 181 321 181 321 187 375.5 c 0,18,19 - 193 430.001 193 430.001 241 441 c 0,20,21 - 233.001 324 233.001 324 343 358 c 0,22,23 - 379 369 379 369 372 414 c 0,24,25 - 365 459 365 459 353 483 c 0,26,27 - 327 534 327 534 258 563 c 0,28,29 - 188.998 592 188.998 592 134 601 c 0,30,31 - 96.4745 601.959 l 0,32,33 - 84.3876 601.016 84.3876 601.016 72 598.5 c 0,34,-1 - 8 586 l 0,35,36 - 67.4219 631.557 67.4219 631.557 112 631.5 c 0,37,38 - 156 631 156 631 171 630 c 0,39,40 - 212.002 627 212.002 627 278.5 599 c 0,41,42 - 345 571 345 571 373 545 c 0,43,44 - 420.001 499.999 420.001 499.999 465.5 423 c 0,45,46 - 511 346 511 346 567 302 c 0,47,48 - 599 275 599 275 666.5 261 c 0,49,50 - 689 256.333 689 256.333 707.667 256.333 c 0,51,52 - 745 256.333 745 256.333 767 275 c 0,53,54 - 849 347 849 347 861.5 443 c 0,55,56 - 874 539 874 539 844 610 c 0,57,58 - 828.999 645.001 828.999 645.001 760.5 693.5 c 0,59,60 - 692 742 692 742 642 745 c 0,61,62 - 582 748 582 748 582 710 c 0,63,64 - 582 667 582 667 600 657.5 c 0,65,-1 - 650 630 l 0,66,67 - 605 613 605 613 562.5 634.5 c 0,68,69 - 520 656 520 656 504 696 c 0,70,-1 - 465 789.5 l 0,71,72 - 434 864 434 864 392 943.5 c 0,73,74 - 350 1023 350 1023 304 1081.5 c 0,75,76 - 266.656 1128.99 266.656 1128.99 233.93 1129.36 c 0,77,78 - 226.341 1129.45 226.341 1129.45 219 1127 c 0,79,80 - 188.007 1116.35 188.007 1116.35 188 1063.5 c 0,81,82 - 189 1011 189 1011 219 1004 c 0,83,84 - 196.609 1001.73 l 0,85,86 - 170.282 1003.7 170.282 1003.7 155.5 1032 c 0,87,88 - 136 1071 136 1071 136 1089 c 0,89,90 - 136 1144 136 1144 148.5 1184.5 c 0,91,92 - 160.999 1225 160.999 1225 182 1267 c 0,93,94 - 231.001 1368 231.001 1368 351 1456 c 0,95,96 - 471 1544.01 471 1544.01 521 1573 c 0,97,98 - 587 1612 587 1612 649.5 1637.5 c 0,99,100 - 678.818 1649.46 678.818 1649.46 728.714 1649.43 c 0,101,102 - 785.176 1649.39 785.176 1649.39 868 1634 c 0,103,104 - 955.012 1617.99 955.012 1617.99 1003 1567.5 c 0,105,106 - 1051.01 1516.99 1051.01 1516.99 1056 1476 c 0,107,108 - 1013.4 1532.09 1013.4 1532.09 946.088 1532.22 c 0,109,110 - 918.604 1532.28 918.604 1532.28 887 1523 c 0,111,112 - 851 1511 851 1511 833.5 1473.5 c 0,113,114 - 819.161 1442.77 819.161 1442.77 819.256 1410.37 c 0,115,116 - 819.277 1403.23 819.277 1403.23 820 1396 c 0,117,118 - 829 1279 829 1279 945 1291 c 0,119,120 - 1061.01 1303 1061.01 1303 1138 1327 c 0,121,122 - 1091 1261.99 1091 1261.99 1004 1243.5 c 0,123,124 - 945.303 1231.02 945.303 1231.02 908.464 1231.06 c 0,125,126 - 890.69 1231.07 890.69 1231.07 878 1234 c 0,127,128 - 803 1250.01 803 1250.01 768 1286.5 c 0,129,130 - 732.944 1323.05 732.944 1323.05 683 1367 c 0,131,132 - 648.004 1397.71 648.004 1397.71 602.286 1397.82 c 0,133,134 - 584.001 1397.86 584.001 1397.86 564 1393 c 0,135,136 - 494 1376.01 494 1376.01 464 1312 c 0,137,138 - 442.001 1264 442.001 1264 433.5 1173.5 c 0,139,140 - 425 1083.01 425 1083.01 473 1046 c 0,141,142 - 567 971 567 971 609.5 983.5 c 0,143,144 - 635.732 991.215 635.732 991.215 669.393 991.121 c 0,145,146 - 690.268 991.062 690.268 991.062 714 988 c 0,147,148 - 749 983 749 983 784.5 953.5 c 0,149,150 - 820 924 820 924 801 876 c 0,151,152 - 778 934 778 934 751.5 937 c 0,153,154 - 725 940 725 940 710 921 c 0,155,156 - 703.558 912.65 703.558 912.65 703.463 902.677 c 0,157,158 - 703.364 892.286 703.364 892.286 710.156 880.133 c 0,159,160 - 724.167 855.064 724.167 855.064 767.5 822.5 c 0,161,162 - 852 759 852 759 885 749 c 0,163,164 - 912 740 912 740 944.5 746.5 c 0,165,166 - 957.24 749.048 957.24 749.048 957.149 759.202 c 0,167,168 - 957.008 774.952 957.008 774.952 926 809 c 0,169,170 - 995 803 995 803 1002.5 737.5 c 0,171,172 - 1006.09 675.401 l 0,173,174 - 1005.75 651.29 1005.75 651.29 1002 633 c 0,175,176 - 994 600 994 600 982.5 508.5 c 0,177,178 - 971 417 971 417 998 358 c 0,179,180 - 1019 310 1019 310 1040 298.5 c 0,181,182 - 1061 286.999 1061 286.999 1073 214 c 0,183,184 - 1071.38 184.394 l 0,185,186 - 1067.63 161.887 1067.63 161.887 1057 130 c 0,187,188 - 1037.99 72.9995 1037.99 72.9995 975 67 c 0,189,190 - 985.997 86.995 985.997 86.995 1019.5 137 c 0,191,192 - 1030.29 153.102 1030.29 153.102 1030.65 164.951 c 0,193,194 - 1027.91 176.689 l 0,195,196 - 1019.57 191.491 1019.57 191.491 986 196 c 0,197,198 - 959 199 959 199 935 161.5 c 0,199,200 - 911 124 911 124 908 120 c 0,201,202 - 854 37.0001 854 37.0001 726 23 c 0,203,204 - 659.279 19.5269 l 0,205,206 - 573.801 20.4195 573.801 20.4195 509 51 c 0,0,1 -EndSplineSet -KernsSLIF: 99 -52 0 0 115 -104 0 0 116 -78 0 0 -EndChar -StartChar: t -Encoding: 116 116 84 -Width: 1471 -Flags: HMW -HStem: 1266 219.5<365 1069.5> -VStem: 624 185.5<219 1233.5> -Fore -624 219 m 0,0,1 - 642.376 322.018 642.376 322.018 642.302 416.663 c 0,2,3 - 642.244 491.983 642.244 491.983 630.5 562 c 0,4,5 - 604 720 604 720 562 888 c 0,6,7 - 553 921 553 921 563 987 c 0,8,9 - 572.193 1047.67 572.193 1047.67 616.886 1048.34 c 0,10,11 - 620.807 1048.4 620.807 1048.4 625 1048 c 0,12,13 - 616.998 1048 616.998 1048 607 1029 c 0,14,15 - 597 1009.99 597 1009.99 597 1002 c 0,16,17 - 599 963.001 599 963.001 629.5 959 c 0,18,19 - 641.54 960.523 l 0,20,21 - 657.957 968.155 657.957 968.155 658.121 1008.79 c 0,22,23 - 658.137 1012.74 658.137 1012.74 658 1017 c 0,24,25 - 656.003 1055.96 656.003 1055.96 647 1181.5 c 0,26,27 - 639.493 1286.18 639.493 1286.18 588.846 1287.54 c 0,28,29 - 567 1284 l 0,30,31 - 554.021 1280 554.021 1280 476 1274 c 0,32,33 - 397.691 1267.98 397.691 1267.98 365 1266 c 0,34,35 - 299 1263 299 1263 245.5 1300.5 c 0,36,37 - 210.991 1324.69 210.991 1324.69 210.807 1365.73 c 0,38,39 - 210.708 1387.86 210.708 1387.86 221 1416 c 0,40,41 - 221 1344.01 221 1344.01 259 1340 c 0,42,43 - 283.415 1340.61 l 0,44,45 - 310.784 1345.98 310.784 1345.98 311.168 1375.6 c 0,46,47 - 311.254 1382.2 311.254 1382.2 310 1390 c 0,48,49 - 301 1445.99 301 1445.99 269 1456 c 0,50,51 - 189.025 1479.99 189.025 1479.99 142 1484 c 0,52,53 - 113.297 1482.43 l 0,54,55 - 75.4871 1475.66 75.4871 1475.66 27 1445 c 0,56,57 - 46 1488.99 46 1488.99 95.5 1506.5 c 0,58,59 - 137.72 1521.43 137.72 1521.43 172.316 1521.44 c 0,60,61 - 178.271 1521.44 178.271 1521.44 184 1521 c 0,62,63 - 358 1506 358 1506 570 1483.5 c 0,64,65 - 782 1461 782 1461 932 1470 c 0,66,67 - 1011.07 1474.01 1011.07 1474.01 1069.5 1485.5 c 0,68,69 - 1104.15 1492.31 1104.15 1492.31 1144.26 1492.28 c 0,70,71 - 1171.84 1492.26 1171.84 1492.26 1202 1489 c 0,72,73 - 1287.72 1478.71 1287.72 1478.71 1288.21 1436.1 c 0,74,75 - 1286 1421 l 0,76,77 - 1272.84 1374.96 1272.84 1374.96 1270 1376 c 0,78,79 - 1266.61 1438.7 1266.61 1438.7 1221.94 1439.3 c 0,80,81 - 1204.5 1437.5 l 0,82,83 - 1143.01 1425.01 1143.01 1425.01 1136 1401 c 0,84,85 - 1131.97 1388.36 1131.97 1388.36 1131.98 1377.27 c 0,86,87 - 1132.03 1347.14 1132.03 1347.14 1162 1328.5 c 0,88,89 - 1202.99 1303 1202.99 1303 1257 1303 c 0,90,91 - 1311 1303 1311 1303 1355.5 1332.5 c 0,92,93 - 1392.39 1356.95 1392.39 1356.95 1392.51 1405.11 c 0,94,95 - 1392.54 1415.05 1392.54 1415.05 1391 1426 c 0,96,97 - 1394.7 1412.33 1394.7 1412.33 1394.7 1396.19 c 0,98,99 - 1394.72 1368.69 1394.72 1368.69 1384 1334 c 0,100,101 - 1367.01 1279 1367.01 1279 1286 1255 c 0,102,103 - 1209.95 1231.81 1209.95 1231.81 1143.93 1231.74 c 0,104,105 - 1087.56 1231.69 1087.56 1231.69 1038.5 1248.5 c 0,106,107 - 931.985 1285 931.985 1285 848 1285 c 0,108,109 - 810 1285 810 1285 809.5 1233.5 c 0,110,111 - 812.56 1134.13 l 0,112,113 - 812.772 1131.07 812.772 1131.07 813 1128 c 0,114,-1 - 820.5 1062 l 0,115,116 - 828 996 828 996 900 901 c 0,117,118 - 933 856 933 856 915 750 c 0,119,120 - 897 644 897 644 814 656 c 0,121,122 - 874 656 874 656 868 747.5 c 0,123,124 - 862 839 862 839 820 803 c 0,125,126 - 789 777.001 789 777.001 784 755.5 c 0,127,128 - 781.13 743.159 781.13 743.159 781.225 717.148 c 0,129,130 - 781.296 697.84 781.296 697.84 783 671 c 0,131,132 - 792 520.002 792 520.002 825.5 433.5 c 0,133,134 - 859 347 859 347 853 158 c 0,135,136 - 847 17 847 17 757 -3 c 0,137,138 - 808 55 808 55 800 89.5 c 0,139,140 - 792 124 792 124 763.5 129.5 c 0,141,142 - 744.112 129.608 l 0,143,144 - 725.165 126.183 725.165 126.183 706 109 c 0,145,146 - 684.494 89.7188 684.494 89.7188 684.436 50.0908 c 0,147,148 - 684.416 36.2807 684.416 36.2807 687 20 c 0,149,150 - 709.999 -130.999 709.999 -130.999 754.5 -171 c 0,151,-1 - 828 -238 l 0,152,153 - 706 -212 706 -212 654.5 -55.5 c 0,154,155 - 603 101 603 101 624 219 c 0,0,1 -EndSplineSet -KernsSLIF: 322 -326 0 0 117 -117 0 0 104 -169 0 0 45 -221 0 0 46 -260 0 0 44 -260 0 0 243 -208 0 0 115 -208 0 0 111 -182 0 0 97 -448 0 0 -EndChar -StartChar: u -Encoding: 117 117 67 -Width: 1204 -Flags: W -Fore -46 335 m 0,0,1 - -12 419 -12 419 50.5 484.5 c 0,2,3 - 113 550 113 550 146 550 c 0,4,5 - 107 520 107 520 95 443.5 c 0,6,7 - 83 367 83 367 171 394 c 0,8,9 - 196.001 402 196.001 402 204 489 c 0,10,11 - 208.642 539.483 208.642 539.483 208.57 585.923 c 0,12,13 - 208.518 619.519 208.518 619.519 206 651 c 0,14,15 - 198.001 728.999 198.001 728.999 158.5 773 c 0,16,17 - 147.119 785.678 147.119 785.678 140.179 786.152 c 0,18,19 - 134.174 783.358 l 0,20,21 - 129.301 777.2 129.301 777.2 129.337 757.553 c 0,22,23 - 129.368 740.725 129.368 740.725 133 714 c 0,24,25 - 81.8411 754.35 81.8411 754.35 81.5628 831.304 c 0,26,27 - 81.4631 858.861 81.4631 858.861 87.8877 891.11 c 0,28,29 - 88.4213 893.788 88.4213 893.788 89 896.5 c 0,30,31 - 116 1023 116 1023 106 1188 c 0,32,33 - 103.71 1273.97 l 0,34,35 - 106.169 1385.74 106.169 1385.74 140 1454.5 c 0,36,37 - 186.008 1548.01 186.008 1548.01 245 1590.5 c 0,38,39 - 303.999 1632.99 303.999 1632.99 355.5 1640 c 0,40,41 - 405.982 1646.87 405.982 1646.87 406 1647 c 0,42,43 - 337.006 1635 337.006 1635 274.5 1567 c 0,44,45 - 212.006 1499.01 212.006 1499.01 185 1425 c 0,46,47 - 170.414 1385.03 170.414 1385.03 170.42 1350.16 c 0,48,49 - 170.425 1320.48 170.425 1320.48 181 1294.5 c 0,50,51 - 200.164 1247.42 200.164 1247.42 274.889 1247.21 c 0,52,53 - 289.833 1247.17 289.833 1247.17 307 1249 c 0,54,55 - 359.668 1254.35 359.668 1254.35 359.608 1300.76 c 0,56,57 - 359.589 1315.16 359.589 1315.16 354.5 1333.5 c 0,58,59 - 335.326 1402.62 335.326 1402.62 276.773 1402.94 c 0,60,61 - 269.676 1402.97 269.676 1402.97 262 1402 c 0,62,63 - 286.672 1406.42 286.672 1406.42 306.953 1406.43 c 0,64,65 - 396.829 1406.48 396.829 1406.48 400.5 1320 c 0,66,67 - 400.121 1249.19 l 0,68,69 - 396.789 1203.44 396.789 1203.44 384 1187 c 0,70,71 - 304 1085 304 1085 299.5 912.5 c 0,72,73 - 295 740 295 740 303 615 c 0,74,75 - 307.999 531.003 307.999 531.003 343 441 c 0,76,77 - 378 351 378 351 454 381 c 0,78,79 - 508 402 508 402 466 449 c 0,80,81 - 424 496 424 496 403 440 c 0,82,83 - 400.021 467.968 l 0,84,85 - 401.42 496.722 401.42 496.722 426 505.5 c 0,86,87 - 461 518 461 518 482 512 c 0,88,89 - 561.579 485.473 561.579 485.473 561.729 423.945 c 0,90,91 - 561.737 420.526 561.737 420.526 561.5 417 c 0,92,93 - 557 350 557 350 553 329 c 0,94,95 - 551.037 308.068 l 0,96,97 - 553.844 275.341 553.844 275.341 595.5 250.5 c 0,98,99 - 610.331 241.656 610.331 241.656 628.383 241.735 c 0,100,101 - 676.669 241.947 676.669 241.947 748 306 c 0,102,103 - 763 319 763 319 797 375 c 0,104,105 - 830.998 430.995 830.998 430.995 853 497 c 0,106,107 - 875 563 875 563 869.5 623 c 0,108,109 - 863.999 683 863.999 683 800 707 c 0,110,111 - 780.712 710.301 l 0,112,113 - 758.425 708.952 758.425 708.952 758.366 675.576 c 0,114,115 - 758.361 672.891 758.361 672.891 758.5 670 c 0,116,117 - 761 617.999 761 617.999 798 594 c 0,118,119 - 711.001 634.999 711.001 634.999 705.5 715 c 0,120,121 - 700 795 700 795 728.5 892.5 c 0,122,123 - 757 990 757 990 795.5 1095 c 0,124,125 - 834 1200 834 1200 835 1292 c 0,126,127 - 835 1305.01 835 1305.01 852.5 1409 c 0,128,129 - 867.429 1497.72 867.429 1497.72 946.032 1497.66 c 0,130,131 - 959.572 1497.64 959.572 1497.64 975 1495 c 0,132,133 - 951.995 1495 951.995 1495 926.5 1468.5 c 0,134,135 - 911.116 1452.51 911.116 1452.51 910.836 1433.8 c 0,136,137 - 914.401 1414.21 l 0,138,139 - 915.524 1411.14 915.524 1411.14 917 1408 c 0,140,141 - 937.073 1367.26 937.073 1367.26 962.372 1366.61 c 0,142,143 - 978.379 1369.98 l 0,144,145 - 988.798 1374.48 988.798 1374.48 1000 1385 c 0,146,147 - 1024 1406.6 1024 1406.6 1024.06 1454.48 c 0,148,149 - 1024.1 1486.4 1024.1 1486.4 1013.5 1530 c 0,150,151 - 987 1639.01 987 1639.01 850 1617 c 0,152,153 - 950 1666.99 950 1666.99 1035.5 1573.5 c 0,154,155 - 1080.31 1524.5 1080.31 1524.5 1080.48 1450.07 c 0,156,157 - 1080.58 1406.75 1080.58 1406.75 1065.56 1354.82 c 0,158,159 - 1057.15 1325.76 1057.15 1325.76 1044 1294 c 0,160,161 - 1013.95 1220.87 1013.95 1220.87 979 1119.5 c 0,162,163 - 944 1017.99 944 1017.99 941 959 c 0,164,165 - 936 887 936 887 974 864 c 0,166,167 - 997.65 849.686 997.65 849.686 1019.56 849.509 c 0,168,169 - 1031.83 849.41 1031.83 849.41 1045.5 854.5 c 0,170,171 - 1079 868.002 1079 868.002 1085 913 c 0,172,173 - 1091 958 1091 958 1022 1023 c 0,174,175 - 1143.01 1012 1143.01 1012 1145 909 c 0,176,177 - 1142.12 849.83 l 0,178,179 - 1133.28 771.826 1133.28 771.826 1098 684 c 0,180,181 - 1048.99 561.998 1048.99 561.998 984 456.5 c 0,182,183 - 919 351 919 351 906 335 c 0,184,185 - 872.999 294.998 872.999 294.998 847.5 240 c 0,186,187 - 840.928 225.825 840.928 225.825 840.965 216.299 c 0,188,189 - 841.041 196.841 841.041 196.841 868.696 196.786 c 0,190,191 - 880.031 196.763 880.031 196.763 896 200 c 0,192,193 - 930.895 206.264 930.895 206.264 931.366 231.74 c 0,194,195 - 931.421 234.737 931.421 234.737 931 238 c 0,196,197 - 927 269 927 269 913 308 c 0,198,199 - 977.209 274.007 977.209 274.007 977.222 212.054 c 0,200,201 - 977.226 191.993 977.226 191.993 970.5 169 c 0,202,203 - 943.001 75.0001 943.001 75.0001 865 74 c 0,204,205 - 732.561 75.6253 l 0,206,207 - 459.222 87.5019 459.222 87.5019 292.5 172 c 0,208,209 - 88.0008 275.999 88.0008 275.999 46 335 c 0,0,1 -EndSplineSet -KernsSLIF: 116 -78 0 0 120 -104 0 0 -EndChar -StartChar: v -Encoding: 118 118 70 -Width: 1087 -Flags: W -Fore -305 1015 m 1,0,1 - 390 991 390 991 393 922.5 c 0,2,3 - 393.509 829.461 l 0,4,5 - 392.953 816.677 392.953 816.677 392 805 c 0,6,7 - 386 748 386 748 378.5 703.5 c 0,8,9 - 377.807 678.574 l 0,10,11 - 381.441 653.166 381.441 653.166 405 640 c 0,12,13 - 413.621 635.115 413.621 635.115 420.879 634.937 c 0,14,15 - 431.632 637.67 l 0,16,17 - 441.986 643.7 441.986 643.7 448.5 663 c 0,18,19 - 462 703 462 703 466.5 760 c 0,20,21 - 471 817 471 817 470 870.5 c 0,22,23 - 469 923.975 469 923.975 469 934 c 0,24,25 - 469 1002 469 1002 473.5 1056.5 c 0,26,27 - 478.001 1111.01 478.001 1111.01 499 1176 c 0,28,29 - 514.003 1223 514.003 1223 546.5 1260.5 c 0,30,31 - 578.993 1297.99 578.993 1297.99 605 1311 c 0,32,33 - 619 1313.94 l 0,34,35 - 626.997 1313.57 626.997 1313.57 635 1308.5 c 0,36,37 - 650 1299.01 650 1299.01 650 1287 c 0,38,39 - 637.454 1293.55 637.454 1293.55 628.479 1293.58 c 0,40,41 - 606.104 1293.67 606.104 1293.67 605.918 1253.32 c 0,42,43 - 605.905 1250.51 605.905 1250.51 606 1247.5 c 0,44,45 - 608 1184 608 1184 634 1184 c 0,46,47 - 662 1184 662 1184 673.5 1211 c 0,48,49 - 685 1238 685 1238 685 1259 c 0,50,51 - 685 1341.01 685 1341.01 698.5 1403 c 0,52,53 - 712.006 1465.02 712.006 1465.02 734 1540 c 0,54,55 - 740.003 1566.01 740.003 1566.01 763 1593.5 c 0,56,57 - 786.018 1621.02 786.018 1621.02 799 1633 c 0,58,59 - 822.005 1653.13 822.005 1653.13 871 1653 c 0,60,61 - 919 1651.99 919 1651.99 925 1623 c 0,62,63 - 888 1659 888 1659 826 1611 c 0,64,65 - 764 1563 764 1563 805 1494 c 0,66,67 - 819.935 1468.52 819.935 1468.52 842.394 1468.42 c 0,68,69 - 863.65 1468.32 863.65 1468.32 891.649 1490.95 c 0,70,71 - 901.414 1498.84 901.414 1498.84 912 1509.5 c 0,72,73 - 985 1583 985 1583 996 1616 c 0,74,75 - 1013.4 1672.65 1013.4 1672.65 1013.38 1712.89 c 0,76,77 - 1013.36 1762.85 1013.36 1762.85 986.5 1787.5 c 0,78,79 - 937.961 1832.04 937.961 1832.04 924 1847 c 0,80,81 - 981.007 1818.99 981.007 1818.99 1008.5 1784.5 c 0,82,83 - 1036 1749.99 1036 1749.99 1036 1677 c 0,84,85 - 1036 1607.99 1036 1607.99 1000.5 1547.5 c 0,86,87 - 964.989 1486.99 964.989 1486.99 926 1442 c 0,88,89 - 743 1230.01 743 1230.01 737 927 c 0,90,91 - 736 901 736 901 738.5 830.5 c 0,92,93 - 741 760 741 760 735.5 680 c 0,94,95 - 729.999 599.996 729.999 599.996 712 529 c 0,96,97 - 694 458 694 458 652 433 c 0,98,99 - 688.123 508.663 688.123 508.663 688.026 560.736 c 0,100,101 - 687.924 615.337 687.924 615.337 648 644 c 0,102,103 - 585 689 585 689 553 602 c 0,104,105 - 521 515 521 515 512 471 c 0,106,107 - 497 399 497 399 486.5 331 c 0,108,109 - 476 263 476 263 557 266 c 0,110,111 - 564 266 564 266 577 283.5 c 0,112,113 - 586.241 295.94 586.241 295.94 586.386 311.664 c 0,114,115 - 586.446 318.06 586.446 318.06 585 325 c 0,116,117 - 577 361 577 361 524 372 c 0,118,119 - 556 398 556 398 584 387 c 0,120,121 - 612 376 612 376 627 349 c 0,122,123 - 655 295 655 295 637 239.5 c 0,124,125 - 619 184.001 619 184.001 590 168 c 0,126,-1 - 500 116 l 0,127,128 - 462 93.9995 462 93.9995 462 13 c 0,129,130 - 462 -101 462 -101 542 -147.5 c 0,131,132 - 614.087 -189.401 614.087 -189.401 704.039 -189.485 c 0,133,134 - 713.912 -189.494 713.912 -189.494 724 -189 c 0,135,136 - 678.195 -202.572 678.195 -202.572 634.149 -202.553 c 0,137,138 - 600.305 -202.538 600.305 -202.538 567.5 -194.5 c 0,139,140 - 492 -176.001 492 -176.001 462 -143 c 0,141,142 - 361 -30.0001 361 -30.0001 359.5 119.5 c 0,143,144 - 358 269 358 269 283 374 c 0,145,146 - 269 392 269 392 236 406.5 c 0,147,148 - 220.144 410.016 l 0,149,150 - 200.816 409.305 200.816 409.305 190 376 c 0,151,152 - 169 298 169 298 244 282 c 0,153,154 - 211.123 281.752 l 0,155,156 - 195.064 283.447 195.064 283.447 177.5 288.5 c 0,157,158 - 141 299 141 299 117 359 c 0,159,160 - 102.015 394.589 102.015 394.589 101.942 433.139 c 0,161,162 - 101.858 476.911 101.858 476.911 121 524.5 c 0,163,164 - 157 614 157 614 157 692 c 0,165,166 - 157 815 157 815 116.5 925 c 0,167,168 - 75.9978 1035.01 75.9978 1035.01 52 1150 c 0,169,170 - 43.9902 1184.05 43.9902 1184.05 30 1258.5 c 0,171,172 - 16 1333.01 16 1333.01 19 1416 c 0,173,174 - 20.0001 1473.01 20.0001 1473.01 49.5 1551.5 c 0,175,176 - 79.0021 1630 79.0021 1630 124 1636 c 0,177,178 - 104.996 1609 104.996 1609 90 1569 c 0,179,180 - 75 1528.99 75 1528.99 80 1500 c 0,181,182 - 90.1461 1428.98 90.1461 1428.98 169.197 1428.57 c 0,183,184 - 175.854 1428.53 175.854 1428.53 183 1429 c 0,185,186 - 230 1432 230 1432 237.5 1511 c 0,187,188 - 241.099 1585.22 l 0,189,190 - 240.776 1614.29 240.776 1614.29 237 1636 c 0,191,192 - 222 1708 222 1708 140 1720 c 0,193,194 - 248 1733.01 248 1733.01 277.5 1636 c 0,195,196 - 307 1538.99 307 1538.99 298 1477 c 0,197,198 - 292.001 1435.01 292.001 1435.01 269.5 1353 c 0,199,200 - 246.994 1270.97 246.994 1270.97 238 1222 c 0,201,202 - 235.011 1207.06 235.011 1207.06 235.093 1163.63 c 0,203,204 - 235.121 1148.94 235.121 1148.94 235.5 1131 c 0,205,206 - 237 1060.01 237 1060.01 246 988.5 c 0,207,208 - 255 917 255 917 274.5 871.5 c 0,209,210 - 294 826 294 826 327 856 c 0,211,212 - 363 890 363 890 350 940 c 0,213,214 - 337 990 337 990 305 1015 c 1,0,1 -EndSplineSet -KernsSLIF: 246 -172 0 0 111 -143 0 0 45 -182 0 0 46 -182 0 0 44 -208 0 0 105 -104 0 0 97 -257 0 0 -EndChar -StartChar: w -Encoding: 119 119 26 -Width: 1586 -Flags: HW -Fore -1014 -90 m 0,0,1 - 965 -75 965 -75 934.5 -33.5 c 0,2,3 - 904 8 904 8 892 43 c 0,4,5 - 868.999 107.005 868.999 107.005 855 192.5 c 0,6,7 - 841 278 841 278 813 329 c 0,8,9 - 773 399 773 399 745.5 404 c 0,10,11 - 718 409 718 409 682 359 c 0,12,13 - 655 320 655 320 656.5 224.5 c 0,14,15 - 658 129.001 658 129.001 687 96 c 0,16,17 - 710 69 710 69 759 61 c 0,18,19 - 715.03 35.2941 715.03 35.2941 668.313 35.2145 c 0,20,21 - 645.97 35.1765 645.97 35.1765 623 41 c 0,22,23 - 552 59 552 59 522 89 c 0,24,25 - 493 116 493 116 472.5 149 c 0,26,-1 - 431 218 l 0,27,28 - 408 257 408 257 396.5 274 c 0,29,30 - 385 291 385 291 337 307 c 0,31,32 - 328 310 328 310 309.5 303 c 0,33,34 - 291 296 291 296 288 285 c 0,35,36 - 282.97 270.441 282.97 270.441 282.916 258.825 c 0,37,38 - 282.819 238.131 282.819 238.131 298.512 226.777 c 0,39,40 - 307.287 220.428 307.287 220.428 321 217 c 0,41,42 - 306.593 210.22 306.593 210.22 293.802 210.084 c 0,43,44 - 284.612 209.986 284.612 209.986 276.255 213.318 c 0,45,46 - 268.795 216.292 268.795 216.292 262 222 c 0,47,48 - 237 243 237 243 234 267 c 0,49,50 - 227.71 307.884 227.71 307.884 227.739 342.862 c 0,51,52 - 227.766 374.615 227.766 374.615 233 401.5 c 0,53,54 - 243.998 457.993 243.998 457.993 262 521 c 0,55,56 - 301 653 301 653 299 782.5 c 0,57,58 - 297.001 911.997 297.001 911.997 241 1033 c 0,59,60 - 210.985 1095.03 210.985 1095.03 177 1152 c 0,61,62 - 143 1209 143 1209 140 1284 c 0,63,64 - 141.271 1338.67 l 0,65,66 - 151.107 1435.81 151.107 1435.81 219 1443 c 0,67,68 - 276 1447.01 276 1447.01 276 1395 c 0,69,70 - 264.083 1406.32 264.083 1406.32 248.788 1406.46 c 0,71,72 - 238.421 1406.55 238.421 1406.55 226.5 1401.5 c 0,73,74 - 207.837 1393.6 207.837 1393.6 207.785 1366.27 c 0,75,76 - 207.755 1350.41 207.755 1350.41 214 1328 c 0,77,78 - 222.184 1296.75 222.184 1296.75 252.786 1296.23 c 0,79,80 - 276.5 1299.5 l 0,81,82 - 328 1313 328 1313 328 1354 c 0,83,84 - 327 1443 327 1443 273.5 1477 c 0,85,86 - 220.007 1511 220.007 1511 157 1511 c 0,87,88 - 72.0033 1511 72.0033 1511 43.5 1467 c 0,89,90 - 15 1423.01 15 1423.01 3 1401 c 0,91,92 - 17 1534.99 17 1534.99 162 1545 c 0,93,94 - 237 1549.99 237 1549.99 298 1504.5 c 0,95,96 - 358.995 1459.01 358.995 1459.01 383 1414 c 0,97,98 - 429.636 1322.85 429.636 1322.85 429.838 1258.41 c 0,99,100 - 429.922 1231.65 429.922 1231.65 422 1209.5 c 0,101,102 - 395 1134.01 395 1134.01 386 993 c 0,103,104 - 383 950 383 950 382.5 891 c 0,105,106 - 382 832 382 832 411 799 c 0,107,108 - 431.326 774.91 431.326 774.91 446.268 774.622 c 0,109,110 - 451.174 774.528 451.174 774.528 455.5 777 c 0,111,112 - 473 787 473 787 472 808 c 0,113,114 - 470.999 827.004 470.999 827.004 465.5 843.5 c 0,115,116 - 460 860 460 860 415 863 c 0,117,118 - 443.027 877.205 443.027 877.205 466.042 877.26 c 0,119,120 - 502.973 877.348 502.973 877.348 527 841 c 0,121,122 - 551 801 551 801 546.5 771 c 0,123,124 - 542 741 542 741 537 714 c 0,125,126 - 521 630 521 630 520.5 586 c 0,127,128 - 523.692 560.121 l 0,129,130 - 531 533.828 531 533.828 555 516 c 0,131,132 - 578 498 578 498 624.5 589.5 c 0,133,134 - 671 681 671 681 692 727 c 0,135,136 - 714 775 714 775 737 806.5 c 0,137,138 - 759.999 837.999 759.999 837.999 831 871 c 0,139,140 - 789 810 789 810 777.5 774 c 0,141,142 - 766 738 766 738 776 672 c 0,143,144 - 781 632 781 632 795.5 598.5 c 0,145,146 - 810 565 810 565 845 561 c 0,147,148 - 915 552 915 552 953 646 c 0,149,150 - 991 740 991 740 997 791 c 0,151,152 - 998.001 801.003 998.001 801.003 1014.5 884.5 c 0,153,154 - 1019.54 910.001 1019.54 910.001 1019.59 927.713 c 0,155,156 - 1019.69 963 1019.69 963 999.982 967.379 c 0,157,158 - 997.19 968 997.19 968 994 968 c 0,159,160 - 970 968 970 968 962.5 943.5 c 0,161,162 - 955 919 955 919 973 903 c 0,163,164 - 934 909 934 909 934 949.5 c 0,165,166 - 934 990 934 990 943 1005 c 0,167,168 - 972.994 1052.99 972.994 1052.99 1017.5 1088.5 c 0,169,170 - 1062 1124 1062 1124 1089 1157 c 0,171,172 - 1131.02 1208.03 1131.02 1208.03 1142 1228.5 c 0,173,174 - 1153.01 1249.04 1153.01 1249.04 1171 1303 c 0,175,176 - 1184.99 1346.01 1184.99 1346.01 1219 1438 c 0,177,178 - 1253.01 1530.01 1253.01 1530.01 1295 1572 c 0,179,180 - 1354.39 1631.39 1354.39 1631.39 1409.01 1631.59 c 0,181,182 - 1420.61 1631.63 1420.61 1631.63 1432 1629 c 0,183,-1 - 1361.5 1588 l 0,184,185 - 1328 1568.99 1328 1568.99 1307 1515 c 0,186,187 - 1293.8 1483.93 1293.8 1483.93 1293.87 1441.71 c 0,188,189 - 1293.88 1429.57 1293.88 1429.57 1295 1416.5 c 0,190,191 - 1299.99 1358 1299.99 1358 1350 1352 c 0,192,193 - 1408.01 1346 1408.01 1346 1458 1382 c 0,194,195 - 1508 1418.01 1508 1418.01 1532 1472 c 0,196,197 - 1546.97 1507.94 1546.97 1507.94 1565.5 1542 c 0,198,199 - 1580.79 1570.11 1580.79 1570.11 1580.71 1634.4 c 0,200,201 - 1580.7 1647.9 1580.7 1647.9 1580 1663 c 0,202,203 - 1574 1753.99 1574 1753.99 1443 1824 c 0,204,205 - 1597 1790 1597 1790 1619 1646 c 0,206,207 - 1622.07 1590.37 l 0,208,209 - 1621.42 1545.07 1621.42 1545.07 1611 1496 c 0,210,211 - 1594 1416 1594 1416 1542 1356 c 0,212,213 - 1468.98 1272.99 1468.98 1272.99 1374 1201 c 0,214,215 - 1337.98 1173.98 1337.98 1173.98 1280.5 1098 c 0,216,217 - 1246.65 1053.25 1246.65 1053.25 1246.59 1018.22 c 0,218,219 - 1246.55 993.741 1246.55 993.741 1263 974 c 0,220,221 - 1269.62 966.056 1269.62 966.056 1283.03 966 c 0,222,223 - 1289.88 965.972 1289.88 965.972 1298.5 968 c 0,224,225 - 1324 974 1324 974 1330 996 c 0,226,227 - 1334.96 1014.94 1334.96 1014.94 1334.94 1027.17 c 0,228,229 - 1334.91 1042.06 1334.91 1042.06 1327.5 1047 c 0,230,-1 - 1295 1069 l 0,231,232 - 1323.65 1072.59 l 0,233,234 - 1361.04 1071.97 1361.04 1071.97 1370 1036.5 c 0,235,236 - 1376.58 1010.46 1376.58 1010.46 1376.55 986.389 c 0,237,238 - 1376.52 966.529 1376.52 966.529 1372 948 c 0,239,240 - 1355.99 885.999 1355.99 885.999 1300 860 c 0,241,242 - 1243.99 833.995 1243.99 833.995 1199 797 c 0,243,244 - 1148.02 754.015 1148.02 754.015 1106.5 707.5 c 0,245,246 - 1065.01 661.014 1065.01 661.014 1055 595 c 0,247,248 - 1049.56 560.034 1049.56 560.034 1049.63 531.26 c 0,249,250 - 1049.74 485.962 1049.74 485.962 1063.5 456 c 0,251,-1 - 1119 332 l 0,252,253 - 1141.99 276 1141.99 276 1149 213 c 0,254,255 - 1148.59 180.883 l 0,256,257 - 1142.04 129.433 1142.04 129.433 1099 66 c 0,258,259 - 1099 93 1099 93 1111 155.5 c 0,260,261 - 1112.74 183.814 l 0,262,263 - 1109.16 226.59 1109.16 226.59 1065 254 c 0,264,265 - 1024.01 278 1024.01 278 991.5 228 c 0,266,267 - 959 178.001 959 178.001 957 79 c 0,268,269 - 955 38 955 38 979 -6 c 0,270,271 - 1003 -50 1003 -50 1042 -68 c 0,272,273 - 1079.01 -86 1079.01 -86 1162 -88 c 0,274,275 - 1136.9 -100.085 1136.9 -100.085 1097.11 -100.071 c 0,276,277 - 1094.1 -100.07 1094.1 -100.07 1091 -100 c 0,278,279 - 1047 -98.9998 1047 -98.9998 1014 -90 c 0,0,1 -EndSplineSet -KernsSLIF: 246 -42 0 0 322 -300 0 0 104 -104 0 0 45 -117 0 0 46 -195 0 0 44 -208 0 0 115 -91 0 0 105 13 0 0 243 -156 0 0 111 -91 0 0 228 -228 0 0 261 -313 0 0 97 -342 0 0 -EndChar -StartChar: x -Encoding: 120 120 28 -Width: 1239 -Flags: HW -Fore -659 1394 m 0,0,1 - 619.965 1385.64 619.965 1385.64 619.801 1356.11 c 0,2,3 - 619.788 1353.86 619.788 1353.86 620 1351.5 c 0,4,5 - 623 1318.99 623 1318.99 623 1318 c 0,6,7 - 587.525 1334.5 587.525 1334.5 587.443 1378.22 c 0,8,9 - 587.425 1387.5 587.425 1387.5 589 1398 c 0,10,11 - 594 1451.01 594 1451.01 659 1468 c 0,12,13 - 695.043 1477.01 695.043 1477.01 742 1494.5 c 0,14,15 - 789.016 1512.01 789.016 1512.01 820 1533 c 0,16,17 - 832 1542 832 1542 845.5 1570.5 c 0,18,19 - 858.997 1598.99 858.997 1598.99 863 1616 c 0,20,21 - 879 1701.99 879 1701.99 812 1712 c 0,22,23 - 845 1721 845 1721 866.5 1701.5 c 0,24,25 - 888 1682 888 1682 888 1656 c 0,26,27 - 888 1633.99 888 1633.99 882 1558.5 c 0,28,29 - 881.281 1511.03 l 0,30,31 - 883.815 1483 883.815 1483 896 1483 c 0,32,33 - 912.786 1485.53 l 0,34,35 - 929.979 1492.51 929.979 1492.51 941 1518 c 0,36,37 - 960.999 1566 960.999 1566 962 1610 c 0,38,39 - 963.001 1654 963.001 1654 982 1696 c 0,40,41 - 999.999 1735 999.999 1735 1035.5 1760 c 0,42,43 - 1065.03 1780.8 1065.03 1780.8 1090.77 1780.83 c 0,44,45 - 1095.96 1780.84 1095.96 1780.84 1101 1780 c 0,46,47 - 1029 1757.99 1029 1757.99 1029 1701 c 0,48,49 - 1029 1659 1029 1659 1074 1659 c 0,50,51 - 1094 1659 1094 1659 1101 1678 c 0,52,53 - 1105.12 1689.17 1105.12 1689.17 1105.08 1698.97 c 0,54,55 - 1105.06 1705.82 1105.06 1705.82 1103 1712 c 0,56,57 - 1136 1707.99 1136 1707.99 1136 1667 c 0,58,59 - 1136 1625.99 1136 1625.99 1126 1609 c 0,60,61 - 1111 1583.01 1111 1583.01 1078 1549 c 0,62,-1 - 1024 1495 l 0,63,-1 - 922 1402 l 0,64,65 - 840.994 1328.99 840.994 1328.99 816 1271 c 0,66,67 - 801.993 1240.98 801.993 1240.98 770 1138 c 0,68,69 - 756.589 1094.83 756.589 1094.83 756.527 1063.96 c 0,70,71 - 756.441 1021.17 756.441 1021.17 782 1002 c 0,72,73 - 804 985 804 985 828.5 999 c 0,74,75 - 852.987 1012.99 852.987 1012.99 864 1027 c 0,76,77 - 875.229 1041.97 875.229 1041.97 875.513 1054.86 c 0,78,79 - 872.132 1069.17 l 0,80,81 - 868.752 1075.66 868.752 1075.66 862 1081.5 c 0,82,83 - 835.994 1104.01 835.994 1104.01 818 1106 c 0,84,85 - 855 1118 855 1118 885 1103 c 0,86,87 - 914.998 1088 914.998 1088 921 1071 c 0,88,89 - 942 993 942 993 894.5 964.5 c 0,90,91 - 847 936 847 936 802 891 c 0,92,93 - 754.999 845.999 754.999 845.999 753 810.5 c 0,94,95 - 751 775 751 775 757 739 c 0,96,97 - 772 636 772 636 907 471 c 0,98,-1 - 1101 234 l 0,99,100 - 1123.99 205.001 1123.99 205.001 1140 136 c 0,101,102 - 1156.01 67 1156.01 67 1119 34 c 0,103,104 - 1150.99 92.9999 1150.99 92.9999 1098 169 c 0,105,106 - 1045.01 244.998 1045.01 244.998 995 254 c 0,107,108 - 968.167 255.138 l 0,109,110 - 937.522 251.594 937.522 251.594 928.5 222 c 0,111,112 - 922.338 201.789 922.338 201.789 922.373 184.251 c 0,113,114 - 922.408 166.211 922.408 166.211 929 151 c 0,115,116 - 965 65.0001 965 65.0001 1025.5 36.5 c 0,117,118 - 1085.99 8 1085.99 8 1144 7 c 0,119,120 - 1202.59 9.65475 l 0,121,122 - 1224.73 12.2988 1224.73 12.2988 1243.5 17.5 c 0,123,124 - 1271 25.1205 1271 25.1205 1280.28 25.0566 c 0,125,126 - 1285 25.0241 1285 25.0241 1285 23 c 0,127,128 - 1192.24 -6.79408 1192.24 -6.79408 1118.61 -6.88269 c 0,129,130 - 1061.26 -6.95171 1061.26 -6.95171 1015.5 11 c 0,131,132 - 911 52 911 52 870 160 c 0,133,134 - 845.997 221.008 845.997 221.008 811.5 322.5 c 0,135,136 - 777 424 777 424 750 427 c 0,137,138 - 696 431 696 431 696 382 c 0,139,140 - 696 336 696 336 739 342 c 0,141,142 - 717 315 717 315 691.5 326 c 0,143,144 - 666 337 666 337 657 358 c 0,145,146 - 635.001 402.998 635.001 402.998 631 455.5 c 0,147,148 - 627 508 627 508 627 568 c 0,149,150 - 627 589 627 589 617 628 c 0,151,152 - 607 667 607 667 580 671 c 0,153,154 - 514 678 514 678 468.5 563 c 0,155,156 - 436.8 482.877 436.8 482.877 436.894 455.18 c 0,157,158 - 436.935 443.123 436.935 443.123 443 441 c 0,159,160 - 455.538 439.465 l 0,161,162 - 466.861 441.222 466.861 441.222 479 454 c 0,163,164 - 500 475 500 475 469 506 c 0,165,166 - 487 506 487 506 501 486.5 c 0,167,168 - 515 467 515 467 515 449 c 0,169,170 - 515 414 515 414 487.5 372.5 c 0,171,172 - 460.001 331 460.001 331 425 322 c 0,173,174 - 379 310 379 310 340.5 285 c 0,175,176 - 302 260 302 260 291 212 c 0,177,178 - 278.998 157.992 278.998 157.992 266 109 c 0,179,180 - 253 59.9999 253 59.9999 230 30 c 0,181,182 - 219.999 16.9999 219.999 16.9999 184 7 c 0,183,184 - 163.709 1.36363 163.709 1.36363 148.819 1.44562 c 0,185,186 - 137.291 1.50909 137.291 1.50909 129 5 c 0,187,188 - 177.001 11.0001 177.001 11.0001 203 57 c 0,189,190 - 219 85.9999 219 85.9999 219.5 143.5 c 0,191,192 - 216.668 168.843 l 0,193,194 - 207.895 201 207.895 201 172 201 c 0,195,196 - 119 201 119 201 89.5 137 c 0,197,198 - 59.9999 72.9999 59.9999 72.9999 60 28 c 0,199,200 - 60 -48.0001 60 -48.0001 140 -88 c 0,201,202 - 81.0005 -88 81.0005 -88 54 -50 c 0,203,204 - 27 -12 27 -12 24 28 c 0,205,206 - 16 129 16 129 78 217 c 0,207,208 - 109 262 109 262 210 369 c 0,209,210 - 311 476 311 476 309 521 c 0,211,212 - 309 548 309 548 273 548 c 0,213,214 - 255 548 255 548 254.5 529 c 0,215,216 - 254.999 510 254.999 510 262 501 c 0,217,218 - 241 495 241 495 221.5 518.5 c 0,219,220 - 212.134 529.788 212.134 529.788 212.111 544.881 c 0,221,222 - 212.087 561.212 212.087 561.212 223 582 c 0,223,224 - 239.999 615 239.999 615 289 644 c 0,225,226 - 337.997 672.998 337.997 672.998 367 699 c 0,227,228 - 395 726 395 726 429.5 778 c 0,229,230 - 464 830 464 830 464 873 c 0,231,232 - 464 901 464 901 440.5 913 c 0,233,234 - 417 925 417 925 394 925 c 0,235,236 - 327 922 327 922 336 877.5 c 0,237,238 - 345 833 345 833 371 833 c 0,239,240 - 338.017 831.603 l 0,241,242 - 312.765 833.673 312.765 833.673 291.5 846 c 0,243,244 - 257 866 257 866 257 914 c 0,245,246 - 257 952 257 952 278 992 c 0,247,248 - 299.005 1032.01 299.005 1032.01 307 1066 c 0,249,250 - 313.999 1095.99 313.999 1095.99 315 1138.5 c 0,251,252 - 312.455 1183.29 l 0,253,254 - 310.196 1197.83 310.196 1197.83 306 1210 c 0,255,256 - 284 1267 284 1267 239 1313.5 c 0,257,258 - 194 1360 194 1360 194 1432 c 0,259,260 - 194 1451.01 194 1451.01 215 1489 c 0,261,262 - 236 1526.99 236 1526.99 270 1528 c 0,263,264 - 236 1496.01 236 1496.01 236 1452 c 0,265,266 - 236 1440 236 1440 247 1420.5 c 0,267,268 - 257.999 1401 257.999 1401 277 1401 c 0,269,270 - 331 1401 331 1401 331 1456 c 0,271,272 - 331 1616.55 331 1616.55 200.138 1616.46 c 0,273,274 - 193.252 1616.45 193.252 1616.45 186 1616 c 0,275,276 - 285 1646 285 1646 330 1596.5 c 0,277,278 - 375 1547 375 1547 394 1472 c 0,279,280 - 409 1407.01 409 1407.01 417 1338 c 0,281,282 - 425 1269 425 1269 443 1206 c 0,283,284 - 449.999 1179.01 449.999 1179.01 481.5 1130 c 0,285,286 - 506.465 1091.16 506.465 1091.16 534.26 1090.65 c 0,287,288 - 549 1093 l 0,289,290 - 590.995 1106.99 590.995 1106.99 627 1158 c 0,291,292 - 662.996 1208.99 662.996 1208.99 678 1250 c 0,293,294 - 683.003 1263.01 683.003 1263.01 694 1333.5 c 0,295,296 - 695.76 1365.97 l 0,297,298 - 693.084 1394.55 693.084 1394.55 670.648 1395.23 c 0,299,300 - 659 1394 l 0,0,1 -EndSplineSet -KernsSLIF: 45 -208 0 0 -EndChar -StartChar: y -Encoding: 121 121 27 -Width: 1145 -Flags: HMW -VStem: 362 278<103 873> -Fore -516 -249 m 1,0,1 - 569 -202.999 569 -202.999 604.5 -50.5 c 0,2,3 - 640 102 640 102 589 147 c 0,4,5 - 567.001 165.999 567.001 165.999 504.5 170 c 0,6,7 - 477.767 168.457 l 0,8,9 - 455.328 163.118 455.328 163.118 455.365 142.228 c 0,10,11 - 455.38 133.861 455.38 133.861 459 123 c 0,12,13 - 468 92.0002 468 92.0002 495.5 86.5 c 0,14,15 - 519.369 85.4306 l 0,16,17 - 534.421 87.1496 534.421 87.1496 549 95 c 0,18,19 - 549 54.9999 549 54.9999 463 48.5 c 0,20,21 - 377 42 377 42 362 103 c 0,22,23 - 355.586 126.249 355.586 126.249 355.68 149.9 c 0,24,25 - 355.821 185.251 355.821 185.251 370.5 221.5 c 0,26,27 - 395.006 282.015 395.006 282.015 415 340 c 0,28,29 - 424 366 424 366 455 504 c 0,30,31 - 486 642 486 642 438 650 c 0,32,33 - 419 653 419 653 398 640.5 c 0,34,35 - 377 628 377 628 378 601 c 0,36,37 - 378 580.999 378 580.999 418 573 c 0,38,39 - 386 561 386 561 346 568.5 c 0,40,41 - 306 576 306 576 292 607 c 0,42,43 - 286.399 619.52 286.399 619.52 286.497 633.18 c 0,44,45 - 286.697 660.981 286.697 660.981 310.5 693.5 c 0,46,47 - 345.999 741.998 345.999 741.998 355 780 c 0,48,49 - 369 840 369 840 346.5 900.5 c 0,50,51 - 324 961 324 961 288 1000 c 0,52,53 - 272 1015 272 1015 252 995.5 c 0,54,55 - 232.001 976 232.001 976 246 956 c 0,56,57 - 256.001 940.999 256.001 940.999 263 936.5 c 0,58,59 - 270 932 270 932 306 932 c 0,60,61 - 300 916.001 300 916.001 256.5 913.5 c 0,62,63 - 213 911 213 911 189 929 c 0,64,65 - 151.001 958 151.001 958 163.5 1022 c 0,66,67 - 176 1086.01 176 1086.01 176 1126 c 0,68,69 - 176 1218 176 1218 110.5 1270.5 c 0,70,71 - 44.9999 1323 44.9999 1323 33 1407 c 0,72,73 - 18 1494 18 1494 57.5 1593 c 0,74,75 - 96.9998 1692 96.9998 1692 216 1740 c 0,76,77 - 135 1689 135 1689 92 1606.5 c 0,78,79 - 69.4154 1563.17 69.4154 1563.17 69.4513 1518.87 c 0,80,81 - 69.4837 1478.83 69.4837 1478.83 88 1438 c 0,82,83 - 112.858 1381.83 112.858 1381.83 177.572 1381.62 c 0,84,85 - 183.138 1381.6 183.138 1381.6 189 1382 c 0,86,87 - 262.991 1386.99 262.991 1386.99 299 1428 c 0,88,89 - 310.937 1441.84 310.937 1441.84 311.247 1455.12 c 0,90,91 - 308.015 1469.67 l 0,92,93 - 304.702 1476.67 304.702 1476.67 298 1483.5 c 0,94,95 - 280.194 1501.65 280.194 1501.65 252.532 1501.74 c 0,96,97 - 239.809 1501.78 239.809 1501.78 225 1498 c 0,98,99 - 263.544 1524.4 263.544 1524.4 296.233 1524.59 c 0,100,101 - 312.955 1524.69 312.955 1524.69 328.145 1517.93 c 0,102,103 - 339.5 1512.88 339.5 1512.88 350 1504 c 0,104,105 - 374.854 1481.76 374.854 1481.76 375.11 1449.04 c 0,106,107 - 371.339 1421.03 l 0,108,109 - 370.117 1416.35 370.117 1416.35 368.5 1411.5 c 0,110,111 - 349.989 1355.97 349.989 1355.97 349.951 1317.11 c 0,112,113 - 349.949 1315.03 349.949 1315.03 350 1313 c 0,114,115 - 351.001 1224.99 351.001 1224.99 385 1074.5 c 0,116,117 - 411.928 955.304 411.928 955.304 474.61 954.347 c 0,118,119 - 499.5 958.184 l 0,120,121 - 504.651 959.766 504.651 959.766 510 962 c 0,122,123 - 546 977 546 977 584 1038 c 0,124,125 - 622.001 1099.01 622.001 1099.01 630 1128 c 0,126,127 - 631.185 1147.49 l 0,128,129 - 629.345 1163.19 629.345 1163.19 620 1184.5 c 0,130,131 - 609.445 1208.57 609.445 1208.57 592.368 1208.51 c 0,132,133 - 583.553 1208.47 583.553 1208.47 573 1202 c 0,134,135 - 556.8 1191.8 556.8 1191.8 556.8 1181.24 c 0,136,137 - 556.8 1174.2 556.8 1174.2 564 1167 c 0,138,139 - 582 1149 582 1149 603 1149 c 0,140,141 - 571 1128 571 1128 542.5 1143 c 0,142,143 - 514 1158 514 1158 510 1180 c 0,144,145 - 507.91 1207.16 l 0,146,147 - 511.963 1262.94 511.963 1262.94 588.5 1301 c 0,148,149 - 682.991 1347.99 682.991 1347.99 732 1405 c 0,150,151 - 768.009 1445.01 768.009 1445.01 792 1500 c 0,152,153 - 816 1555.01 816 1555.01 846 1599 c 0,154,-1 - 874.5 1643 l 0,155,156 - 903 1686.99 903 1686.99 957 1673 c 0,157,158 - 907.003 1659.01 907.003 1659.01 891.5 1616.5 c 0,159,160 - 887.421 1605.32 887.421 1605.32 887.324 1595.41 c 0,161,162 - 887.226 1585.39 887.226 1585.39 891.206 1576.68 c 0,163,164 - 898.238 1561.29 898.238 1561.29 918 1550 c 0,165,166 - 937 1538 937 1538 967.5 1551.5 c 0,167,168 - 998.009 1565 998.009 1565 1006 1574 c 0,169,170 - 1046.5 1622 1046.5 1622 1046.75 1658 c 0,171,172 - 1046.85 1672.4 1046.85 1672.4 1040.51 1684.88 c 0,173,174 - 1031 1703.6 1031 1703.6 1007 1718 c 0,175,176 - 927.02 1765.99 927.02 1765.99 906 1773 c 0,177,178 - 983.986 1759.01 983.986 1759.01 1020.5 1727 c 0,179,180 - 1057 1695 1057 1695 1060 1689 c 0,181,182 - 1076.31 1652.31 1076.31 1652.31 1076.45 1623.69 c 0,183,184 - 1076.52 1610.2 1076.52 1610.2 1073 1598.5 c 0,185,186 - 1062.01 1562.02 1062.01 1562.02 1024 1505 c 0,187,188 - 987.005 1448.01 987.005 1448.01 903.5 1384 c 0,189,190 - 819.999 1319.99 819.999 1319.99 811 1257 c 0,191,192 - 809.173 1213.58 l 0,193,194 - 810.601 1181.82 810.601 1181.82 820.5 1146.5 c 0,195,196 - 837 1089 837 1089 839 1036 c 0,197,198 - 839 1010 839 1010 819 933 c 0,199,200 - 799 856 799 856 709 850 c 0,201,202 - 745 861 745 861 768 927 c 0,203,204 - 791 993 791 993 716 993 c 0,205,206 - 672 993 672 993 656 947 c 0,207,208 - 640 901.001 640 901.001 640 873 c 0,209,210 - 640 803 640 803 697 793 c 0,211,212 - 726.152 787.237 726.152 787.237 749.1 787.335 c 0,213,214 - 793.848 787.525 793.848 787.525 815 810 c 0,215,216 - 833.353 829.5 833.353 829.5 833.285 849 c 0,217,218 - 833.235 863.5 833.235 863.5 823 878 c 0,219,220 - 848 875 848 875 858 850 c 0,221,222 - 865.632 830.921 865.632 830.921 865.692 818.831 c 0,223,224 - 865.711 815.079 865.711 815.079 865 812 c 0,225,226 - 835 710 835 710 753.5 661.5 c 0,227,228 - 672 613 672 613 642 505 c 0,229,230 - 631 467 631 467 622.5 420.5 c 0,231,232 - 614 374 614 374 614 333 c 0,233,234 - 614 291 614 291 631.5 245 c 0,235,236 - 649.004 198.989 649.004 198.989 665 162 c 0,237,238 - 678.513 129.86 678.513 129.86 678.555 90.5183 c 0,239,240 - 678.626 22.1387 678.626 22.1387 638 -68 c 0,241,242 - 573.999 -210.001 573.999 -210.001 516 -249 c 1,0,1 -EndSplineSet -KernsSLIF: 111 -130 0 0 322 -260 0 0 115 -208 0 0 45 -169 0 0 46 -195 0 0 44 -208 0 0 97 -363 0 0 -EndChar -StartChar: z -Encoding: 122 122 31 -Width: 1565 -Flags: HMW -HStem: 147 132.5<256.5 1230.5> 1333 115<337 1066> -Fore -192 -73 m 0,0,1 - 107 -73 107 -73 98 23 c 0,2,3 - 96.9999 29 96.9999 29 101.5 75 c 0,4,5 - 106 121.001 106 121.001 142 130 c 0,6,7 - 127 112 127 112 121.5 80.5 c 0,8,9 - 121.118 58.5858 l 0,10,11 - 123.865 43.8878 123.865 43.8878 136 36 c 0,12,13 - 157.196 21.0841 157.196 21.0841 178.239 21.0364 c 0,14,15 - 210.804 20.9627 210.804 20.9627 243 56.5 c 0,16,17 - 288.962 107.232 288.962 107.232 289.049 160.597 c 0,18,19 - 289.062 168.768 289.062 168.768 288 177 c 0,20,21 - 281 231.999 281 231.999 256.5 279.5 c 0,22,23 - 233.051 324.964 233.051 324.964 232.961 390.117 c 0,24,25 - 232.957 393.038 232.957 393.038 233 396 c 0,26,27 - 233 426.002 233 426.002 253.5 467 c 0,28,29 - 274 508 274 508 310 517 c 0,30,31 - 319 520 319 520 341.5 521 c 0,32,33 - 358.339 518.81 l 0,34,35 - 366.273 515.636 366.273 515.636 369 508 c 0,36,37 - 349 520 349 520 313.5 502 c 0,38,39 - 278.001 484.001 278.001 484.001 277 463 c 0,40,41 - 274 439 274 439 280 410 c 0,42,43 - 286 381 286 381 319 381 c 0,44,45 - 358 381 358 381 408 486 c 0,46,47 - 458 591 458 591 467 627 c 0,48,49 - 491 716 491 716 498.5 795.5 c 0,50,51 - 506 875 506 875 519 955 c 0,52,53 - 522 977.999 522 977.999 536 1011.5 c 0,54,55 - 550.003 1045 550.003 1045 568 1060 c 0,56,57 - 614.007 1102.01 614.007 1102.01 662.5 1108.5 c 0,58,59 - 695.795 1109.75 l 0,60,61 - 715.86 1107.71 715.86 1107.71 723 1097 c 0,62,63 - 702.171 1098.72 l 0,64,65 - 673.014 1096.04 673.014 1096.04 638 1066.5 c 0,66,67 - 590 1026 590 1026 625 993 c 0,68,69 - 635.364 982.636 635.364 982.636 649.389 982.592 c 0,70,71 - 665.136 982.541 665.136 982.541 685.5 995.5 c 0,72,73 - 723.984 1019.98 723.984 1019.98 737 1037 c 0,74,-1 - 789 1107.5 l 0,75,76 - 816.971 1146.95 816.971 1146.95 837 1182 c 0,77,78 - 858 1218 858 1218 870.5 1258.5 c 0,79,80 - 873.186 1278.82 l 0,81,82 - 871.615 1307.02 871.615 1307.02 839 1330 c 0,83,84 - 801.009 1356.99 801.009 1356.99 740.5 1364 c 0,85,86 - 680.044 1371 680.044 1371 635 1371 c 0,87,88 - 532.993 1371 532.993 1371 488 1338.5 c 0,89,-1 - 383 1259 l 0,90,-1 - 358.5 1239 l 0,91,92 - 340.993 1225 340.993 1225 330 1225 c 0,93,94 - 299.544 1226.95 l 0,95,96 - 286.046 1229.27 286.046 1229.27 269.5 1234 c 0,97,98 - 231.001 1244.99 231.001 1244.99 222 1284 c 0,99,100 - 229.997 1268 229.997 1268 286.5 1259 c 0,101,102 - 306.838 1259.13 l 0,103,104 - 337.526 1265.89 337.526 1265.89 337.576 1317.74 c 0,105,106 - 337.583 1324.94 337.583 1324.94 337 1333 c 0,107,108 - 332 1395.01 332 1395.01 253.5 1400 c 0,109,110 - 178.634 1401.45 l 0,111,112 - 156.61 1400.4 156.61 1400.4 143 1397 c 0,113,114 - 33.0001 1368.01 33.0001 1368.01 34.5 1305.5 c 0,115,116 - 35 1212 l 0,117,118 - 14.6647 1264.87 14.6647 1264.87 14.6483 1304.98 c 0,119,120 - 14.6284 1353.63 14.6284 1353.63 44.5 1383.5 c 0,121,122 - 99.0072 1438 99.0072 1438 147 1453 c 0,123,124 - 205.397 1470.43 205.397 1470.43 268.328 1470.39 c 0,125,126 - 277.615 1470.39 277.615 1470.39 287 1470 c 0,127,128 - 360.084 1467 360.084 1467 429 1460 c 0,129,130 - 489.53 1456.4 l 0,131,132 - 508.127 1456.49 508.127 1456.49 527 1458 c 0,133,134 - 563.734 1460.94 563.734 1460.94 564.304 1486.01 c 0,135,136 - 560.419 1505.87 l 0,137,138 - 560 1507 l 0,139,140 - 549.725 1533.71 549.725 1533.71 523.728 1534.15 c 0,141,142 - 499.826 1530.11 l 0,143,144 - 498.185 1529.59 498.185 1529.59 496.5 1529 c 0,145,146 - 448.004 1512.01 448.004 1512.01 444 1498 c 0,147,148 - 443.297 1522.75 l 0,149,150 - 445.875 1541.5 445.875 1541.5 459 1554 c 0,151,152 - 480.015 1574.01 480.015 1574.01 498 1579 c 0,153,154 - 519.22 1584.14 519.22 1584.14 547.867 1584.12 c 0,155,156 - 563.788 1584.11 563.788 1584.11 582 1582.5 c 0,157,158 - 632.988 1578 632.988 1578 666 1561 c 0,159,-1 - 770 1503.5 l 0,160,161 - 827.016 1471.99 827.016 1471.99 874 1461 c 0,162,163 - 926.975 1448 926.975 1448 969 1446.5 c 0,164,165 - 1061.49 1447.76 l 0,166,167 - 1063.75 1447.88 1063.75 1447.88 1066 1448 c 0,168,169 - 1144.4 1445.44 l 0,170,171 - 1155 1444.6 1155 1444.6 1166 1443.5 c 0,172,173 - 1221.01 1437.99 1221.01 1437.99 1257 1405 c 0,174,175 - 1282.01 1381 1282.01 1381 1284 1322.5 c 0,176,177 - 1281.53 1288.39 l 0,178,179 - 1274.87 1255.1 1274.87 1255.1 1251 1236 c 0,180,181 - 1233.82 1220.31 1233.82 1220.31 1198.24 1220.25 c 0,182,183 - 1186.18 1220.23 1186.18 1220.23 1172 1222 c 0,184,185 - 1199 1223.01 1199 1223.01 1227.5 1271 c 0,186,187 - 1239.27 1290.83 1239.27 1290.83 1239.19 1309.97 c 0,188,189 - 1239.06 1337.18 1239.06 1337.18 1215 1363 c 0,190,191 - 1204.09 1373.91 1204.09 1373.91 1185.45 1373.96 c 0,192,193 - 1169.91 1374 1169.91 1374 1149 1366.5 c 0,194,195 - 1103 1350 1103 1350 1088 1334 c 0,196,197 - 1024.02 1263.03 1024.02 1263.03 959.5 1150.5 c 0,198,199 - 895 1038 895 1038 856 951 c 0,200,201 - 832.001 895.003 832.001 895.003 817.5 818 c 0,202,203 - 803 741.002 803 741.002 795 679 c 0,204,205 - 786 618 786 618 751 587.5 c 0,206,207 - 716 557 716 557 637 590 c 0,208,209 - 659.766 589.972 l 0,210,211 - 678.989 592.981 678.989 592.981 702.5 605.5 c 0,212,213 - 741 626 741 626 725 677 c 0,214,215 - 707 731 707 731 653 680 c 0,216,217 - 599 629 599 629 596 596 c 0,218,219 - 590 541 590 541 588.5 442 c 0,220,221 - 587 343 587 343 660 325 c 0,222,223 - 760 298 760 298 856 298 c 0,224,225 - 936 298 936 298 972 357 c 0,226,227 - 1007.98 415.974 1007.98 415.974 1049 469 c 0,228,229 - 1105.57 542.286 1105.57 542.286 1153.05 542.837 c 0,230,231 - 1173.67 539.5 l 0,232,233 - 1188.84 534.299 1188.84 534.299 1203 521 c 0,234,235 - 1265.25 462.519 1265.25 462.519 1265 433 c 0,236,237 - 1250 456 1250 456 1196 475.5 c 0,238,239 - 1178.91 481.671 1178.91 481.671 1164.73 481.583 c 0,240,241 - 1134.09 481.393 1134.09 481.393 1117 452 c 0,242,243 - 1099 422 1099 422 1099 367 c 0,244,245 - 1099 335.005 1099 335.005 1137 302.5 c 0,246,247 - 1174.99 270 1174.99 270 1197 261 c 0,248,249 - 1228.05 248.984 1228.05 248.984 1273 233 c 0,250,251 - 1317.95 217.016 1317.95 217.016 1349 205 c 0,252,253 - 1409 179.999 1409 179.999 1446.5 127.5 c 0,254,255 - 1474.23 88.6715 1474.23 88.6715 1474.35 48.4816 c 0,256,257 - 1474.39 34.3255 1474.39 34.3255 1471 20 c 0,258,259 - 1456 56 1456 56 1429 96.5 c 0,260,261 - 1402 136.999 1402 136.999 1336 144 c 0,262,263 - 1246.66 147.183 l 0,264,265 - 1238.67 147.142 1238.67 147.142 1230.5 147 c 0,266,267 - 1172.99 145.999 1172.99 145.999 1126 134 c 0,268,269 - 1084 123.001 1084 123.001 1045 98 c 0,270,271 - 1006 72.9999 1006 72.9999 970 59 c 0,272,273 - 918 39 918 39 879 33.5 c 0,274,275 - 840 28 840 28 810 59 c 0,276,277 - 797 71 797 71 799.5 90 c 0,278,279 - 802 109.001 802 109.001 808 115 c 0,280,281 - 816 76 816 76 840 76 c 0,282,283 - 878 76 878 76 883 111 c 0,284,285 - 881.225 124.68 l 0,286,287 - 871.742 145.173 871.742 145.173 818.066 145.18 c 0,288,289 - 808.269 145.181 808.269 145.181 797 144.5 c 0,290,291 - 705.966 138.997 705.966 138.997 695 138 c 0,292,293 - 584.998 118.999 584.998 118.999 504.5 71.5 c 0,294,295 - 424 24 424 24 329 -23 c 0,296,-1 - 262.5 -54 l 0,297,298 - 223.001 -73.0001 223.001 -73.0001 192 -73 c 0,0,1 -EndSplineSet -KernsSLIF: 121 -195 0 0 322 -247 0 0 105 -143 0 0 101 -104 0 0 98 -156 0 0 45 -364 0 0 -EndChar -StartChar: Adieresis -Encoding: 196 196 75 -Width: 1568 -Flags: HW -Fore -128 -308 m 1,0,1 - 33 -174 33 -174 20.5 -51 c 0,2,3 - 8.00005 72 8.00005 72 37.5 184.5 c 0,4,5 - 67 297 67 297 118.5 399.5 c 0,6,7 - 170.001 502.002 170.001 502.002 203 595 c 0,8,9 - 224 654 224 654 227 761.5 c 0,10,11 - 230 869 230 869 240.5 978.5 c 0,12,13 - 251.001 1088.01 251.001 1088.01 282.5 1177 c 0,14,15 - 314.004 1266.01 314.004 1266.01 394 1289 c 0,16,17 - 318 1214 318 1214 362.5 1157 c 0,18,19 - 379.049 1136.49 379.049 1136.49 415 1148 c 0,20,21 - 441.428 1156.46 441.428 1156.46 466 1283 c 0,22,23 - 486 1386.01 486 1386.01 583.5 1530.5 c 0,24,25 - 678.497 1672.92 678.497 1672.92 755.5 1733.5 c 0,26,27 - 805.557 1772.89 805.557 1772.89 859.876 1772.89 c 0,28,29 - 912.441 1772.89 912.441 1772.89 969 1736 c 0,30,31 - 934.103 1737 l 0,32,33 - 864.411 1730.95 864.411 1730.95 851 1653 c 0,34,35 - 847.071 1630.16 847.071 1630.16 847.122 1606.63 c 0,36,37 - 847.278 1534.34 847.278 1534.34 885 1455.5 c 0,38,39 - 932.227 1356.79 932.227 1356.79 966 1356 c 0,40,41 - 1004 1360.01 1004 1360.01 1007 1379.5 c 0,42,43 - 1007.48 1398.72 l 0,44,45 - 1003.15 1423.01 1003.15 1423.01 974 1448 c 0,46,47 - 1089.92 1426.41 1089.92 1426.41 1090.5 1312.5 c 0,48,49 - 1090.4 1270.56 1090.4 1270.56 1109.82 1163.16 c 0,50,51 - 1116.69 1125.17 1116.69 1125.17 1126 1079 c 0,52,53 - 1150 959.018 1150 959.018 1168.5 919.5 c 0,54,55 - 1188.08 877.713 1188.08 877.713 1221 891 c 0,56,57 - 1269.26 910.472 1269.26 910.472 1260 966 c 0,58,59 - 1248 1038 1248 1038 1209 1083 c 0,60,61 - 1296 1030 1296 1030 1320.5 961 c 0,62,63 - 1341.19 902.719 1341.19 902.719 1341.2 841.959 c 0,64,65 - 1341.2 830.773 1341.2 830.773 1340.5 819.5 c 0,66,67 - 1336 746.97 1336 746.97 1320 679 c 0,68,69 - 1309.29 633.487 1309.29 633.487 1309.33 596.017 c 0,70,71 - 1309.36 577.528 1309.36 577.528 1312 561 c 0,72,73 - 1327 457.016 1327 457.016 1374 353 c 0,74,75 - 1420.99 249 1420.99 249 1453.5 137 c 0,76,77 - 1481.72 39.766 1481.72 39.766 1481.67 -66.1854 c 0,78,79 - 1481.66 -82.2438 1481.66 -82.2438 1481 -98.5 c 0,80,81 - 1476.01 -221.982 1476.01 -221.982 1387 -366 c 0,82,83 - 1415.72 -269.572 1415.72 -269.572 1415.68 -151.161 c 0,84,85 - 1415.66 -96.4285 1415.66 -96.4285 1409.5 -37 c 0,86,87 - 1390.4 147.188 1390.4 147.188 1260.35 147.146 c 0,88,89 - 1256.72 147.145 1256.72 147.145 1253 147 c 0,90,91 - 1175.99 144 1175.99 144 1153 79.5 c 0,92,93 - 1130.01 15 1130.01 15 1156 -73 c 0,94,95 - 1040.99 -4 1040.99 -4 1078 170 c 0,96,97 - 1113.08 334.959 1113.08 334.959 1113.1 447.845 c 0,98,99 - 1113.1 454.001 1113.1 454.001 1113 460 c 0,100,101 - 1111.01 586.996 1111.01 586.996 1030 636 c 0,102,103 - 949 685 949 685 856 667 c 0,104,105 - 753.973 646.352 753.973 646.352 720.5 592 c 0,106,107 - 673.661 518 673.661 518 608 518 c 0,108,109 - 554 518 554 518 528 537 c 0,110,111 - 627.133 541.425 627.133 541.425 627.252 603.216 c 0,112,113 - 627.265 610.238 627.265 610.238 626 618 c 0,114,115 - 614.656 687.608 614.656 687.608 539 671 c 0,116,117 - 470.971 656.062 470.971 656.062 437.5 614 c 0,118,119 - 381.001 543.002 381.001 543.002 365 441 c 0,120,121 - 353.351 369.356 353.351 369.356 353.406 284.484 c 0,122,123 - 353.445 223.641 353.445 223.641 359.5 156 c 0,124,125 - 374 -6 374 -6 262 -68 c 0,126,127 - 308.115 30.5945 308.115 30.5945 274 92 c 0,128,129 - 254.66 126.814 254.66 126.814 187.626 127.026 c 0,130,131 - 185.341 127.033 185.341 127.033 183 127 c 0,132,133 - 153.87 123.844 l 0,134,135 - 79.7216 105.672 79.7216 105.672 79 -17 c 0,136,137 - 77.9999 -186.999 77.9999 -186.999 128 -308 c 1,0,1 -564 987 m 0,77,78 - 564 913 564 913 632.5 878.5 c 0,79,80 - 701 844 701 844 782.5 839.5 c 0,81,82 - 871.984 834.559 871.984 834.559 930.5 856 c 0,83,84 - 996 880 996 880 993 914 c 0,85,86 - 987.893 969.548 987.893 969.548 889.5 1045 c 0,87,88 - 832.997 1088.33 832.997 1088.33 832.548 1133.03 c 0,89,90 - 836.254 1156.84 l 0,91,92 - 842.636 1176.79 842.636 1176.79 860 1197 c 0,93,94 - 858.922 1165.93 l 0,95,96 - 861.742 1140.27 861.742 1140.27 880.656 1139.92 c 0,97,98 - 893.5 1142 l 0,99,100 - 919.125 1149.84 919.125 1149.84 919.484 1172.94 c 0,101,102 - 915.537 1194.44 l 0,103,104 - 913.05 1201.75 913.05 1201.75 909 1210 c 0,105,106 - 881.004 1263.99 881.004 1263.99 815 1328 c 0,107,108 - 767.167 1374.39 767.167 1374.39 731.412 1374.55 c 0,109,110 - 717.835 1374.61 717.835 1374.61 706 1368 c 0,111,112 - 658 1341 658 1341 664.5 1294.5 c 0,113,114 - 670.998 1248.01 670.998 1248.01 689 1196 c 0,115,116 - 707.001 1143.99 707.001 1143.99 714.5 1094.5 c 0,117,118 - 722 1045 722 1045 677 1012 c 0,119,120 - 698 1091.99 698 1091.99 617 1078 c 0,121,122 - 564.452 1070.36 564.452 1070.36 563.972 992.397 c 0,123,124 - 563.956 989.741 563.956 989.741 564 987 c 0,77,78 -509 1815 m 1,99,100 - 455 1950 455 1950 538 2068.5 c 0,101,102 - 614.315 2177.46 614.315 2177.46 728.667 2177.78 c 0,103,104 - 738.687 2177.81 738.687 2177.81 749 2177 c 0,105,106 - 618.485 2101.78 618.485 2101.78 618.174 2040.1 c 0,107,108 - 618.142 2033.73 618.142 2033.73 619.5 2027.5 c 0,109,110 - 627.779 1989.54 627.779 1989.54 673.706 1989.54 c 0,111,112 - 708.221 1989.55 708.221 1989.55 764 2011 c 0,113,114 - 745.001 1939.01 745.001 1939.01 646.5 1914 c 0,115,116 - 548 1888.99 548 1888.99 509 1815 c 1,99,100 -1081 1812 m 1,108,109 - 1077.59 1842.42 l 0,110,111 - 1078.03 1909.94 1078.03 1909.94 1140 2017 c 0,112,113 - 1210.35 2138.52 1210.35 2138.52 1316.61 2138.99 c 0,114,115 - 1326.64 2139.04 1326.64 2139.04 1337 2138 c 0,116,117 - 1282.21 2087.85 1282.21 2087.85 1282.18 2034.27 c 0,118,119 - 1282.18 2030.14 1282.18 2030.14 1282.5 2026 c 0,120,121 - 1285.05 1993.14 1285.05 1993.14 1326.92 1993.02 c 0,122,123 - 1358.95 1992.93 1358.95 1992.93 1414 2012 c 0,124,125 - 1358.01 1928 1358.01 1928 1264.5 1910 c 0,126,127 - 1171.01 1892 1171.01 1892 1081 1812 c 1,108,109 -EndSplineSet -EndChar -StartChar: Oacute -Encoding: 211 211 45 -Width: 1442 -Flags: W -Fore -702 -166 m 0,0,1 - 595.001 -155.001 595.001 -155.001 494.5 -66 c 0,2,3 - 394 23 394 23 316.5 126.5 c 0,4,5 - 239 230 239 230 192 315 c 0,6,7 - 145 400.001 145 400.001 145 402 c 0,8,9 - 128.001 450 128.001 450 92.5 525.5 c 0,10,11 - 57.0008 600.998 57.0008 600.998 34 678 c 0,12,13 - 11 755 11 755 16 820.5 c 0,14,15 - 20.9999 885.999 20.9999 885.999 86 914 c 0,16,17 - 120.999 928 120.999 928 151 910 c 0,18,19 - 76 883 76 883 92 806.5 c 0,20,21 - 108.001 730 108.001 730 144 769 c 0,22,23 - 185.999 812.998 185.999 812.998 246 939.5 c 0,24,25 - 281.016 1013.32 281.016 1013.32 281.292 1054.96 c 0,26,27 - 281.388 1069.49 281.388 1069.49 277.259 1080.1 c 0,28,29 - 272.94 1091.19 272.94 1091.19 264 1098 c 0,30,31 - 250.79 1107.15 250.79 1107.15 239.416 1107.23 c 0,32,33 - 226.112 1107.32 226.112 1107.32 215.319 1095.02 c 0,34,35 - 208.425 1087.16 208.425 1087.16 202 1073 c 0,36,37 - 191.968 1050.32 191.968 1050.32 192.019 1029.54 c 0,38,39 - 192.085 1002.68 192.085 1002.68 209 979 c 0,40,41 - 143.612 1022.32 143.612 1022.32 143.36 1067.98 c 0,42,43 - 143.304 1078.18 143.304 1078.18 146.5 1088.5 c 0,44,45 - 164.001 1145.01 164.001 1145.01 222 1193.5 c 0,46,47 - 280.032 1242.02 280.032 1242.02 350 1277 c 0,48,49 - 420.039 1312.01 420.039 1312.01 445 1321 c 0,50,51 - 491 1339 491 1339 595 1370.5 c 0,52,53 - 671.347 1393.62 671.347 1393.62 672.246 1429.41 c 0,54,55 - 668.639 1446.62 l 0,56,57 - 666.47 1451.7 666.47 1451.7 663 1457 c 0,58,59 - 646.528 1481.71 646.528 1481.71 625.907 1481.67 c 0,60,61 - 611.47 1481.65 611.47 1481.65 595 1469.5 c 0,62,63 - 554.997 1439.99 554.997 1439.99 543 1410 c 0,64,65 - 535.72 1416.76 535.72 1416.76 535.606 1430.01 c 0,66,67 - 535.507 1441.42 535.507 1441.42 541.5 1460 c 0,68,69 - 553.997 1497 553.997 1497 564 1506 c 0,70,71 - 632 1564.99 632 1564.99 717.5 1536 c 0,72,73 - 802.989 1507.01 802.989 1507.01 890 1438 c 0,74,75 - 977.001 1369 977.001 1369 1057 1284.5 c 0,76,77 - 1136.96 1200.04 1136.96 1200.04 1194 1148 c 0,78,79 - 1225.01 1119.01 1225.01 1119.01 1236 1169 c 0,80,81 - 1236.66 1189.31 l 0,82,83 - 1230.47 1227.67 1230.47 1227.67 1167 1261 c 0,84,85 - 1307.99 1261 1307.99 1261 1328.5 1135 c 0,86,87 - 1337.08 1082.31 1337.08 1082.31 1336.99 1022.87 c 0,88,89 - 1336.87 940.211 1336.87 940.211 1320 844.5 c 0,90,91 - 1291.02 680.102 1291.02 680.102 1247 520.5 c 0,92,93 - 1213.1 397.602 1213.1 397.602 1213.03 329.64 c 0,94,95 - 1213.01 309.382 1213.01 309.382 1216 294 c 0,96,97 - 1219 276 1219 276 1243 276.5 c 0,98,99 - 1266.99 276.999 1266.99 276.999 1283 295 c 0,100,101 - 1337 358 1337 358 1292 429 c 0,102,103 - 1349 412.001 1349 412.001 1358 350 c 0,104,105 - 1360.83 303.874 l 0,106,107 - 1358.57 224.182 1358.57 224.182 1302.5 174 c 0,108,109 - 1230.99 109.998 1230.99 109.998 1124.5 74.5 c 0,110,111 - 1018 39 1018 39 903.5 23 c 0,112,113 - 789 6.99995 789 6.99995 720 -9 c 0,114,115 - 666 -21 666 -21 709 -76.5 c 0,116,117 - 724.904 -97.0275 724.904 -97.0275 749.016 -96.9665 c 0,118,119 - 790.096 -96.8626 790.096 -96.8626 855 -37 c 0,120,121 - 843 -89.0001 843 -89.0001 797 -129.5 c 0,122,123 - 755.357 -166.164 755.357 -166.164 711.257 -166.359 c 0,124,125 - 706.642 -166.379 706.642 -166.379 702 -166 c 0,0,1 -529 896 m 0,66,67 - 484.999 861 484.999 861 450 857.5 c 0,68,69 - 415 854 415 854 385 860 c 0,70,71 - 514 904 514 904 484 1000 c 0,72,73 - 479.058 1014.83 479.058 1014.83 459.197 1014.73 c 0,74,75 - 454.941 1014.71 454.941 1014.71 450 1014 c 0,76,77 - 421.994 1009.99 421.994 1009.99 409 998 c 0,78,79 - 370.001 960.001 370.001 960.001 332.5 887.5 c 0,80,81 - 295 815 295 815 274 739 c 0,82,83 - 253 663 253 663 256 600 c 0,84,85 - 259 537 259 537 301 521 c 0,86,87 - 406 479 406 479 388.5 555 c 0,88,89 - 371 631 371 631 317 642 c 0,90,91 - 370 663 370 663 417.5 617 c 0,92,93 - 465.001 570.999 465.001 570.999 497 502.5 c 0,94,95 - 529.001 433.997 529.001 433.997 541 365.5 c 0,96,97 - 553 297 553 297 535 273 c 0,98,99 - 534 318.001 534 318.001 504.5 336 c 0,100,101 - 475 354 475 354 448 323 c 0,102,103 - 414.348 283.229 414.348 283.229 414.233 251.128 c 0,104,105 - 414.135 223.66 414.135 223.66 438.591 201.807 c 0,106,107 - 441.609 199.111 441.609 199.111 445 196.5 c 0,108,109 - 508 148.001 508 148.001 617.5 141 c 0,110,111 - 727 133.999 727 133.999 842 174 c 0,112,113 - 957 214 957 214 996 314 c 0,114,115 - 1004.81 337.305 1004.81 337.305 1004.94 355.037 c 0,116,117 - 1005.04 368.522 1005.04 368.522 1000.11 378.784 c 0,118,119 - 988.723 402.504 988.723 402.504 950.5 409 c 0,120,121 - 874 422 874 422 893 308 c 0,122,123 - 855.407 364.132 855.407 364.132 855.207 406.739 c 0,124,125 - 855.109 427.468 855.109 427.468 863.863 444.996 c 0,126,127 - 872.055 461.4 872.055 461.4 888 475 c 0,128,129 - 956.012 533.01 956.012 533.01 1034 609 c 0,130,131 - 1157 729 1157 729 1139 875.5 c 0,132,133 - 1121 1022 1121 1022 995 1139 c 0,134,135 - 911.451 1215.28 911.451 1215.28 853.874 1215.69 c 0,136,137 - 848.054 1215.73 848.054 1215.73 842.5 1215 c 0,138,139 - 782 1207.01 782 1207.01 734 1153.5 c 0,140,141 - 685.991 1099.98 685.991 1099.98 639.5 1023.5 c 0,142,143 - 593 947 593 947 529 896 c 0,66,67 -834 1616 m 1,109,110 - 771.325 1690.07 771.325 1690.07 771.259 1771.76 c 0,111,112 - 771.244 1790.43 771.244 1790.43 774.5 1809.5 c 0,113,114 - 792 1911.99 792 1911.99 860 1982 c 0,115,116 - 927.993 2052 927.993 2052 1025.5 2068.5 c 0,117,118 - 1123 2085 1123 2085 1207 2004 c 0,119,120 - 1142.86 2052.29 1142.86 2052.29 1091.17 2052.27 c 0,121,122 - 1071.15 2052.26 1071.15 2052.26 1053 2045 c 0,123,124 - 988.002 2019 988.002 2019 956.5 1966.5 c 0,125,126 - 925 1914 925 1914 933 1867.5 c 0,127,128 - 938.015 1838.35 938.015 1838.35 963.071 1838.08 c 0,129,130 - 985.38 1842.18 l 0,131,132 - 992.25 1844.45 992.25 1844.45 1000 1848 c 0,133,134 - 1013.12 1852.92 1013.12 1852.92 1013.09 1871.6 c 0,135,136 - 1013.06 1887.07 1013.06 1887.07 1004 1912 c 0,137,138 - 1040.78 1864.25 1040.78 1864.25 1040.82 1834.9 c 0,139,140 - 1040.83 1826.74 1040.83 1826.74 1038 1820 c 0,141,142 - 1025 1789 1025 1789 986 1764 c 0,143,-1 - 900.5 1708 l 0,144,145 - 853.995 1676.99 853.995 1676.99 834 1616 c 1,109,110 -EndSplineSet -KernsSLIF: 84 -286 0 0 87 -182 0 0 -EndChar -StartChar: Odieresis -Encoding: 214 214 79 -Width: 1622 -Flags: HW -Fore -1078 -11 m 0,0,1 - 1064.01 0.998647 1064.01 0.998647 973.5 11.5 c 0,2,3 - 883 22 883 22 778 24 c 0,4,5 - 673 26 673 26 585.5 15 c 0,6,7 - 499.124 4.14128 499.124 4.14128 491 -27 c 0,8,9 - 485 -50 485 -50 507.5 -75 c 0,10,11 - 530 -100 530 -100 615 -130 c 0,12,13 - 563.194 -132.16 l 0,14,15 - 497.059 -129.791 497.059 -129.791 433 -101 c 0,16,17 - 325.829 -52.8336 325.829 -52.8336 300 23 c 0,18,19 - 240.001 203.998 240.001 203.998 222.5 289 c 0,20,21 - 190.738 481.604 190.738 481.604 176 512 c 0,22,23 - 128 611 128 611 44.5 753.5 c 0,24,25 - -39.0001 896 -39.0001 896 43 1037 c 0,26,27 - 37 930 37 930 69 916.5 c 0,28,29 - 101 903 101 903 132 921 c 0,30,31 - 165 941 165 941 227 1097.5 c 0,32,33 - 289.014 1254.03 289.014 1254.03 306 1300 c 0,34,35 - 321.216 1342.27 321.216 1342.27 321.243 1370.28 c 0,36,37 - 321.265 1394.44 321.265 1394.44 310 1408 c 0,38,39 - 289.612 1432.55 289.612 1432.55 262.475 1432.69 c 0,40,41 - 243.542 1432.78 243.542 1432.78 221.325 1421 c 0,42,43 - 198.844 1409.08 198.844 1409.08 173 1385 c 0,44,45 - 183 1455 183 1455 225 1491 c 0,46,47 - 283.465 1538.64 283.465 1538.64 372.5 1543 c 0,48,49 - 411.143 1545.55 411.143 1545.55 546 1607.5 c 0,50,51 - 605.628 1634.94 605.628 1634.94 705 1636 c 0,52,53 - 799.002 1637.01 799.002 1637.01 813 1682 c 0,54,55 - 832 1746.01 832 1746.01 714 1766 c 0,56,57 - 744.427 1778.86 744.427 1778.86 774.49 1778.95 c 0,58,59 - 807.009 1779.05 807.009 1779.05 839.1 1764.21 c 0,60,61 - 846.561 1760.76 846.561 1760.76 854 1756.5 c 0,62,63 - 922.99 1717.01 922.99 1717.01 985.5 1648 c 0,64,65 - 1048.01 1579 1048.01 1579 1101 1501 c 0,66,67 - 1153.99 1423.01 1153.99 1423.01 1193 1376 c 0,68,69 - 1258.99 1295.01 1258.99 1295.01 1395.5 1208.5 c 0,70,71 - 1531.99 1122 1531.99 1122 1545 955 c 0,72,73 - 1493.91 1031.63 1493.91 1031.63 1456.6 1031.78 c 0,74,75 - 1450.09 1031.8 1450.09 1031.8 1444 1029.5 c 0,76,77 - 1403 1014 1403 1014 1395 988 c 0,78,79 - 1368.69 904.7 1368.69 904.7 1368.67 830.234 c 0,80,81 - 1368.66 785.795 1368.66 785.795 1378 744.5 c 0,82,83 - 1413.42 587.936 1413.42 587.936 1437 543.5 c 0,84,85 - 1485.01 452.991 1485.01 452.991 1485.5 381.5 c 0,86,87 - 1487.95 300.016 1487.95 300.016 1436 257 c 0,88,89 - 1444.29 298.88 1444.29 298.88 1444.3 328.871 c 0,90,91 - 1444.31 367.613 1444.31 367.613 1430.5 386.5 c 0,92,93 - 1412.56 411.031 1412.56 411.031 1386.84 411.164 c 0,94,95 - 1377.44 411.213 1377.44 411.213 1367 408 c 0,96,97 - 1341.99 400 1341.99 400 1311.5 301 c 0,98,99 - 1281.05 202.142 1281.05 202.142 1240 93.5 c 0,100,101 - 1189.08 -41.2672 1189.08 -41.2672 1145 -92 c 0,102,103 - 1105.04 -137.992 1105.04 -137.992 1053.71 -137.938 c 0,104,105 - 1036.96 -137.921 1036.96 -137.921 1019 -133 c 0,106,107 - 1091 -116.999 1091 -116.999 1100 -78.5 c 0,108,109 - 1101.97 -55.1353 l 0,110,111 - 1099.91 -29.7823 1099.91 -29.7823 1078 -11 c 0,0,1 -645 195 m 0,62,63 - 762.759 189.131 762.759 189.131 808.5 268.5 c 0,64,65 - 885 399 885 399 996 351 c 0,66,67 - 909.315 332.426 909.315 332.426 948 261 c 0,68,69 - 966.315 227.184 966.315 227.184 1035 231 c 0,70,71 - 1090.8 234.1 1090.8 234.1 1138 328.5 c 0,72,73 - 1210.49 473.474 1210.49 473.474 1218 561.5 c 0,74,75 - 1224.79 641.024 1224.79 641.024 1224.69 711.756 c 0,76,77 - 1224.62 765.961 1224.62 765.961 1220.5 815 c 0,78,79 - 1206.48 958.433 1206.48 958.433 1193 985 c 0,80,81 - 1174.69 1020.77 1174.69 1020.77 1130 1010.5 c 0,82,83 - 1085.67 1001.18 1085.67 1001.18 1085.09 966.896 c 0,84,85 - 1089.04 942.902 l 0,86,87 - 1092.23 932.685 1092.23 932.685 1098 921 c 0,88,89 - 1018.73 960.128 1018.73 960.128 1008 1035 c 0,90,91 - 1008.69 1052 1008.69 1052 1016.5 1197 c 0,92,93 - 1019.84 1268.11 1019.84 1268.11 961 1356 c 0,94,95 - 933.657 1396.84 933.657 1396.84 792 1419 c 0,96,97 - 759.176 1420.36 l 0,98,99 - 704.916 1416.09 704.916 1416.09 658.5 1367.5 c 0,100,101 - 570.656 1275.53 570.656 1275.53 568 1232.5 c 0,102,103 - 553.425 996.171 553.425 996.171 549 981 c 0,104,105 - 515.298 859.438 515.298 859.438 442.5 819 c 0,106,107 - 486.422 946.219 486.422 946.219 363 948.5 c 0,108,109 - 309.74 949.484 309.74 949.484 312 819 c 0,110,111 - 314.316 685.281 314.316 685.281 318 642 c 0,112,113 - 327.896 514.557 327.896 514.557 374 427 c 0,114,115 - 450.349 282.004 450.349 282.004 489 249 c 0,116,117 - 547.345 199.867 547.345 199.867 645 195 c 0,62,63 -290 1856 m 1,94,95 - 294.001 1943.01 294.001 1943.01 364.5 2072.5 c 0,96,97 - 435 2202 435 2202 526 2218 c 0,98,99 - 467.076 2106.95 467.076 2106.95 466.932 2058.68 c 0,100,101 - 466.886 2043.05 466.886 2043.05 473 2034 c 0,102,103 - 497.993 1997.01 497.993 1997.01 583 1993 c 0,104,105 - 571.999 1943 571.999 1943 455 1914.5 c 0,106,107 - 338 1886 338 1886 290 1856 c 1,94,95 -1051 1877 m 1,103,104 - 1063 1958.01 1063 1958.01 1145 2049.5 c 0,105,106 - 1227.01 2141 1227.01 2141 1326 2165 c 0,107,108 - 1259 2099.01 1259 2099.01 1245.5 2036 c 0,109,110 - 1244.66 2015.26 l 0,111,112 - 1251.83 1967.83 1251.83 1967.83 1347 1943 c 0,113,114 - 1311.37 1914.87 1311.37 1914.87 1267.16 1914.68 c 0,115,116 - 1244.88 1914.58 1244.88 1914.58 1220.42 1921.57 c 0,117,118 - 1215.75 1922.91 1215.75 1922.91 1211 1924.5 c 0,119,120 - 1190.26 1931.46 1190.26 1931.46 1169.39 1931.49 c 0,121,122 - 1110.74 1931.58 1110.74 1931.58 1051 1877 c 1,103,104 -EndSplineSet -EndChar -StartChar: Udieresis -Encoding: 220 220 77 -Width: 1564 -Flags: HW -Fore -934.5 -28 m 128,-1,0 - 945 -89.9999 945 -89.9999 1050 -50 c 0,1,2 - 1006.09 -119.363 1006.09 -119.363 934.178 -119.579 c 0,3,4 - 901.082 -119.678 901.082 -119.678 862.054 -105.131 c 0,5,6 - 855.121 -102.547 855.121 -102.547 848 -99.5 c 0,7,8 - 819.129 -87.1482 819.129 -87.1482 609 -54 c 0,9,-1 - 445 -26 l 0,10,11 - 324 -27 324 -27 318 108 c 0,12,13 - 370.439 64.3008 370.439 64.3008 408.5 112 c 0,14,15 - 417.639 123.453 417.639 123.453 417.618 139.02 c 0,16,17 - 417.598 154.083 417.598 154.083 409 173 c 0,18,19 - 389.182 216.601 389.182 216.601 357 252 c 0,20,-1 - 307 307 l 0,21,22 - 283.139 331.714 283.139 331.714 245 311.5 c 0,23,24 - 213.696 295.848 213.696 295.848 213.789 268.858 c 0,25,26 - 213.854 250.152 213.854 250.152 229 226 c 0,27,28 - 164.711 239.834 164.711 239.834 164.281 312.053 c 0,29,30 - 164.189 327.45 164.189 327.45 167 345.5 c 0,31,32 - 171.076 371.671 171.076 371.671 171.038 399.582 c 0,33,34 - 170.963 454.432 170.963 454.432 155 516 c 0,35,36 - 106.307 701.036 106.307 701.036 57.5 767.5 c 0,37,38 - -42 906 -42 906 28 1063 c 0,39,40 - 30.0443 991.442 30.0443 991.442 69.5 991.5 c 0,41,42 - 98.0043 991.542 98.0043 991.542 112 1027 c 0,43,44 - 115.628 1036.19 115.628 1036.19 115.6 1052.67 c 0,45,46 - 115.51 1104.31 115.51 1104.31 79.5 1227.5 c 0,47,48 - 34.0309 1383.05 34.0309 1383.05 33.9195 1433.69 c 0,49,50 - 33.9145 1435.95 33.9145 1435.95 34 1438 c 0,51,52 - 38.9997 1630.99 38.9997 1630.99 161 1782 c 0,53,54 - 121.48 1676.06 121.48 1676.06 121.46 1567.79 c 0,55,56 - 121.453 1531.03 121.453 1531.03 126 1494 c 0,57,58 - 145.116 1338.34 145.116 1338.34 247 1320 c 0,59,60 - 271.932 1319.82 l 0,61,62 - 301.474 1323.99 301.474 1323.99 340 1347.5 c 0,63,64 - 408.002 1389.01 408.002 1389.01 429 1501 c 0,65,66 - 469 1403.01 469 1403.01 434.5 1315 c 0,67,68 - 402.62 1233.68 402.62 1233.68 390 1118 c 0,69,70 - 386.268 1050.09 l 0,71,72 - 386.641 983.869 386.641 983.869 404.5 934 c 0,73,74 - 411.708 913.872 411.708 913.872 411.703 895.446 c 0,75,76 - 411.688 846.128 411.688 846.128 360 809 c 0,77,78 - 372 866 372 866 354 888.5 c 0,79,80 - 328.77 920.038 328.77 920.038 300 866 c 0,81,82 - 291.392 849.833 291.392 849.833 291.384 816.023 c 0,83,84 - 291.375 776.696 291.375 776.696 303 713.5 c 0,85,86 - 322.001 607.499 322.001 607.499 337 567.5 c 0,87,88 - 362.966 495.17 362.966 495.17 399 435 c 0,89,90 - 463.641 335.174 463.641 335.174 520 288 c 0,91,92 - 563.185 268.568 563.185 268.568 581 283.5 c 0,93,94 - 615 312 615 312 572 367 c 0,95,96 - 694.138 356.907 694.138 356.907 709.5 243 c 0,97,98 - 720.458 160.941 720.458 160.941 775.5 166.5 c 0,99,100 - 843.666 172.427 843.666 172.427 885 261 c 0,101,102 - 923.283 343.035 923.283 343.035 944.5 420.5 c 0,103,104 - 975.867 535.024 975.867 535.024 981 573 c 0,105,106 - 996.001 687.004 996.001 687.004 1069 738 c 0,107,108 - 1054.05 699.755 1054.05 699.755 1053.95 673.431 c 0,109,110 - 1053.85 648.277 1053.85 648.277 1067.3 634.007 c 0,111,112 - 1072.24 628.771 1072.24 628.771 1079 625 c 0,113,114 - 1089.88 618.928 1089.88 618.928 1101.28 618.984 c 0,115,116 - 1117.15 619.061 1117.15 619.061 1134 631 c 0,117,118 - 1158.82 648.023 1158.82 648.023 1158.75 739.476 c 0,119,120 - 1158.72 776.982 1158.72 776.982 1154.5 827 c 0,121,122 - 1139.2 1008.54 1139.2 1008.54 1122 1097 c 0,123,124 - 1097.76 1221.73 1097.76 1221.73 1080.5 1273.5 c 0,125,126 - 1063.07 1325.8 1063.07 1325.8 1063.03 1375.37 c 0,127,128 - 1062.97 1455.21 1062.97 1455.21 1108 1528 c 0,129,130 - 1118.73 1412.85 1118.73 1412.85 1175.5 1374.5 c 0,131,132 - 1218.91 1345.17 1218.91 1345.17 1245.11 1344.85 c 0,133,134 - 1260.78 1347.91 l 0,135,136 - 1263.55 1349.19 1263.55 1349.19 1266 1351 c 0,137,138 - 1338.58 1407.54 1338.58 1407.54 1358 1591.5 c 0,139,140 - 1363.39 1642.57 1363.39 1642.57 1363.33 1689.38 c 0,141,142 - 1363.21 1781.42 1363.21 1781.42 1342 1857 c 0,143,144 - 1407.99 1746.01 1407.99 1746.01 1425.5 1582 c 0,145,146 - 1431.64 1524.47 1431.64 1524.47 1431.56 1469.76 c 0,147,148 - 1431.42 1368.54 1431.42 1368.54 1410 1277 c 0,149,150 - 1389.43 1189.71 1389.43 1189.71 1389.41 1113.87 c 0,151,152 - 1389.4 1053.29 1389.4 1053.29 1402.5 1000 c 0,153,154 - 1413.81 954.001 1413.81 954.001 1413.73 916.817 c 0,155,156 - 1413.6 857.002 1413.6 857.002 1384 820 c 0,157,158 - 1382.46 849.538 l 0,159,160 - 1377.56 874.521 1377.56 874.521 1359.5 887 c 0,161,162 - 1353.45 891.18 1353.45 891.18 1347.91 891.101 c 0,163,164 - 1328.26 890.82 1328.26 890.82 1315 837 c 0,165,166 - 1299.92 775.08 1299.92 775.08 1299.92 700.686 c 0,167,168 - 1299.92 636.926 1299.92 636.926 1311 564 c 0,169,170 - 1335 406 1335 406 1272 322 c 0,171,172 - 1272 435 1272 435 1221 426 c 0,173,174 - 1166.23 416.106 1166.23 416.106 1047 219 c 0,175,176 - 926.422 19.6906 926.422 19.6906 934.5 -28 c 128,-1,0 -194 1948 m 1,92,93 - 246.065 1994.11 246.065 1994.11 269.5 2145.5 c 0,94,95 - 287.998 2264.99 287.998 2264.99 402 2296 c 0,96,97 - 332.966 2219.29 332.966 2219.29 333.064 2156.71 c 0,98,99 - 333.094 2137.71 333.094 2137.71 339.5 2120 c 0,100,101 - 358.415 2064.52 358.415 2064.52 387.209 2063.76 c 0,102,103 - 403.103 2067.17 l 0,104,105 - 425.939 2077.12 425.939 2077.12 454 2116 c 0,106,107 - 465.818 2098.7 465.818 2098.7 465.962 2079.71 c 0,108,109 - 466.059 2067.01 466.059 2067.01 460.94 2053.55 c 0,110,111 - 447.15 2017.29 447.15 2017.29 395.5 1975.5 c 0,112,113 - 335.507 1926.96 335.507 1926.96 274.599 1926.96 c 0,114,115 - 234.497 1926.96 234.497 1926.96 194 1948 c 1,92,93 -1193 1962 m 1,101,102 - 1226.99 1976.99 1226.99 1976.99 1252 2032.5 c 0,103,104 - 1276.85 2085.8 1276.85 2085.8 1297 2142.5 c 0,105,106 - 1319.99 2197.98 1319.99 2197.98 1351.5 2236.5 c 0,107,108 - 1374 2264 1374 2264 1409 2264.2 c 0,109,110 - 1423 2264.29 1423 2264.29 1439 2260 c 0,111,112 - 1405.72 2244.42 1405.72 2244.42 1380.5 2194 c 0,113,114 - 1358.7 2150.38 1358.7 2150.38 1358.67 2098.08 c 0,115,116 - 1358.67 2091.61 1358.67 2091.61 1359 2085 c 0,117,118 - 1361.09 2061.73 1361.09 2061.73 1403 2050.5 c 0,119,120 - 1424.24 2049.35 l 0,121,122 - 1450 2052.01 1450 2052.01 1490 2071 c 0,123,124 - 1442.32 1997.88 1442.32 1997.88 1335 1953.5 c 0,125,126 - 1299.06 1938.64 1299.06 1938.64 1267.06 1938.64 c 0,127,128 - 1227.48 1938.63 1227.48 1938.63 1193 1962 c 1,101,102 -EndSplineSet -EndChar -StartChar: germandbls -Encoding: 223 223 85 -Width: 1114 -Flags: HMW -VStem: 55 281<-368 1583> -Fore -118 967 m 0,0,1 - 118 1084.53 118 1084.53 88 1118 c 0,2,3 - 34 1178 34 1178 62 1274 c 0,4,5 - 69.7902 1199.99 69.7902 1199.99 124 1247 c 0,6,7 - 134.791 1256.36 134.791 1256.36 148 1330 c 0,8,9 - 154 1363.45 154 1363.45 154 1436 c 0,10,11 - 154 1497.94 154 1497.94 119 1533 c 0,12,13 - 94.3849 1557.65 94.3849 1557.65 55.2625 1557.79 c 0,14,15 - 32.9829 1557.87 32.9829 1557.87 6 1550 c 0,16,17 - 97.9904 1627.49 97.9904 1627.49 183.416 1627.57 c 0,18,19 - 201.861 1627.59 201.861 1627.59 220 1624 c 0,20,21 - 251.926 1617.67 251.926 1617.67 371 1574 c 0,22,23 - 389.214 1567.32 389.214 1567.32 544 1540 c 0,24,25 - 583.266 1536.42 l 0,26,27 - 621.488 1537.23 621.488 1537.23 632 1560 c 0,28,29 - 637.571 1573 637.571 1573 637.538 1582.98 c 0,30,31 - 637.428 1616 637.428 1616 576 1616 c 0,32,33 - 659.582 1645.07 659.582 1645.07 698 1581.5 c 0,34,35 - 744.865 1503.95 744.865 1503.95 786 1494 c 0,36,37 - 830.007 1483.99 830.007 1483.99 908 1436 c 0,38,39 - 943.792 1413.98 943.792 1413.98 944.051 1385.79 c 0,40,41 - 944.151 1374.93 944.151 1374.93 938.978 1363.16 c 0,42,43 - 938.07 1361.09 938.07 1361.09 937 1359 c 0,44,45 - 927.441 1382.05 927.441 1382.05 909.851 1382.55 c 0,46,47 - 893.461 1378.91 l 0,48,49 - 884.467 1375.02 884.467 1375.02 874 1367 c 0,50,51 - 867.597 1362.09 867.597 1362.09 867.581 1353.42 c 0,52,53 - 867.53 1327.07 867.53 1327.07 926.5 1266 c 0,54,55 - 972.687 1218.16 972.687 1218.16 972.762 1181.23 c 0,56,57 - 972.794 1165.07 972.794 1165.07 964 1151 c 0,58,59 - 968.156 1203.53 968.156 1203.53 920 1172 c 0,60,61 - 891.619 1153.41 891.619 1153.41 880 1096 c 0,62,63 - 873.279 1062.79 873.279 1062.79 873.335 1041.2 c 0,64,65 - 873.41 1011.87 873.41 1011.87 886 1004 c 0,66,67 - 896.666 997.333 896.666 997.333 906.222 997.333 c 0,68,69 - 925.333 997.333 925.333 997.333 940 1024 c 0,70,71 - 955.756 941.28 955.756 941.28 762 870 c 0,72,73 - 695.301 845.461 695.301 845.461 708 774 c 0,74,75 - 719.596 708.712 719.596 708.712 767.426 708.519 c 0,76,77 - 774.784 708.489 774.784 708.489 783 710 c 0,78,79 - 957 742 957 742 951 626 c 0,80,81 - 924.609 688.556 924.609 688.556 882 666 c 0,82,83 - 858.918 653.781 858.918 653.781 909 525 c 0,84,85 - 972.715 358.127 972.715 358.127 993 357 c 0,86,87 - 1035 354 1035 354 1041 411 c 0,88,89 - 1056.22 397.957 1056.22 397.957 1056.4 376.249 c 0,90,91 - 1056.5 364.686 1056.5 364.686 1052.34 350.665 c 0,92,93 - 1042.74 318.359 1042.74 318.359 1010.5 273 c 0,94,95 - 945.852 179.834 945.852 179.834 945.454 148.336 c 0,96,97 - 945.372 141.868 945.372 141.868 948 138 c 0,98,99 - 917.598 92.499 917.598 92.499 840.5 36 c 0,100,101 - 786.888 -3.30363 786.888 -3.30363 794 -41 c 0,102,103 - 804 -93.9999 804 -93.9999 890 -68 c 0,104,105 - 866.618 -120.33 866.618 -120.33 733.273 -120.517 c 0,106,107 - 685.65 -120.584 685.65 -120.584 624 -114 c 0,108,109 - 418 -91.9999 418 -91.9999 394 -45 c 0,110,111 - 625.996 -66.7838 625.996 -66.7838 714 75 c 0,112,113 - 722.786 89.1553 722.786 89.1553 723.001 101.566 c 0,114,115 - 719.591 117.104 l 0,116,117 - 716.737 123.045 716.737 123.045 711.5 128.5 c 0,118,119 - 701.576 138.839 701.576 138.839 689.308 138.97 c 0,120,121 - 680.36 139.067 680.36 139.067 670.166 133.733 c 0,122,123 - 660.629 128.743 660.629 128.743 650 119 c 0,124,125 - 652 165 652 165 701.5 187.5 c 0,126,127 - 780.66 223.482 780.66 223.482 796 242.5 c 0,128,129 - 815.469 266.638 815.469 266.638 819 351 c 0,130,131 - 816.128 388.012 l 0,132,133 - 807.98 434.589 807.98 434.589 777.5 498.5 c 0,134,135 - 759.191 536.891 759.191 536.891 723 585 c 0,136,137 - 680.348 641.698 680.348 641.698 644 645 c 0,138,139 - 628.856 642.918 l 0,140,141 - 618.212 638.877 618.212 638.877 608.5 627.5 c 0,142,143 - 590 608 590 608 613 579 c 0,144,145 - 588.638 580.55 l 0,146,147 - 552.063 589.3 552.063 589.3 534.5 638.5 c 0,148,149 - 513.743 696.65 513.743 696.65 469 735 c 0,150,151 - 474.064 740.88 474.064 740.88 406 801.5 c 0,152,153 - 386.095 819.228 386.095 819.228 385.923 839.472 c 0,154,155 - 385.827 850.808 385.827 850.808 393 865 c 0,156,157 - 399.384 832.1 399.384 832.1 431.868 831.868 c 0,158,159 - 445.55 831.771 445.55 831.771 463.862 837.468 c 0,160,161 - 478.251 841.945 478.251 841.945 495.5 850 c 0,162,163 - 592 896 592 896 607 919 c 0,164,165 - 617.211 934.495 617.211 934.495 618 948.5 c 0,166,167 - 620 984 620 984 578 969 c 0,168,169 - 582.733 1004.49 582.733 1004.49 686.5 1026 c 0,170,171 - 737.466 1036.56 737.466 1036.56 755 1073.5 c 0,172,173 - 768.109 1101.59 768.109 1101.59 768.067 1145.9 c 0,174,175 - 768.064 1148.91 768.064 1148.91 768 1152 c 0,176,177 - 766.896 1205.52 766.896 1205.52 759 1212.5 c 0,178,179 - 725 1242.5 725 1242.5 722 1197.5 c 0,180,181 - 679.373 1223.49 679.373 1223.49 678.841 1259.22 c 0,182,183 - 682.49 1282.11 l 0,184,185 - 684.128 1287.22 684.128 1287.22 686.5 1292.5 c 0,186,187 - 693.835 1309.57 693.835 1309.57 693.858 1326.34 c 0,188,189 - 693.884 1345.87 693.884 1345.87 684 1365 c 0,190,191 - 659.831 1408.89 659.831 1408.89 558 1389 c 0,192,193 - 488.278 1375.38 488.278 1375.38 467 1359 c 0,194,195 - 440.515 1338.04 440.515 1338.04 416.774 1338.07 c 0,196,197 - 397.482 1338.1 397.482 1338.1 380 1352 c 0,198,199 - 415.734 1352 415.734 1352 427 1363 c 0,200,201 - 436.501 1372.28 436.501 1372.28 436.539 1387.56 c 0,202,203 - 436.555 1393.78 436.555 1393.78 435 1401 c 0,204,205 - 428.085 1432.13 428.085 1432.13 417 1435 c 0,206,207 - 398.473 1439.81 398.473 1439.81 384.817 1439.86 c 0,208,209 - 366.071 1439.92 366.071 1439.92 356.5 1431 c 0,210,211 - 277.822 1354.86 277.822 1354.86 302 1306.5 c 0,212,213 - 328.119 1254.26 328.119 1254.26 328.201 1225.13 c 0,214,215 - 328.269 1201.37 328.269 1201.37 311 1193 c 0,216,217 - 311 1216.07 311 1216.07 295.615 1216.67 c 0,218,219 - 285 1215 l 0,220,221 - 255.639 1204.93 255.639 1204.93 255.571 1140.69 c 0,222,223 - 255.562 1132.76 255.562 1132.76 256 1124 c 0,224,225 - 259.68 1050.41 259.68 1050.41 271 1033 c 0,226,227 - 286.562 1010.12 286.562 1010.12 302.5 1009.5 c 0,228,229 - 323.004 1009.7 323.004 1009.7 328 1038 c 0,230,231 - 355 996 355 996 330.5 920.5 c 0,232,233 - 306.001 845.001 306.001 845.001 302 807 c 0,234,235 - 299.425 755.455 l 0,236,237 - 301.69 689.489 301.69 689.489 338 668 c 0,238,239 - 387 639 387 639 360 579 c 0,240,241 - 355.031 622.897 355.031 622.897 321.24 623.294 c 0,242,243 - 315.096 623.366 315.096 623.366 308 622 c 0,244,245 - 271.879 615.048 271.879 615.048 266.5 483.5 c 0,246,247 - 266.151 393.507 l 0,248,249 - 268.939 337.887 268.939 337.887 281 321 c 0,250,251 - 294.707 301.81 294.707 301.81 317 304.5 c 0,252,253 - 343.999 307.999 343.999 307.999 348 349 c 0,254,255 - 378 316 378 316 352.5 227 c 0,256,257 - 323.944 127.336 323.944 127.336 291 51 c 0,258,259 - 272.96 9.19997 272.96 9.19997 272.925 -44.2157 c 0,260,261 - 272.88 -112.2 272.88 -112.2 302 -199 c 0,262,263 - 328 -276.499 328 -276.499 328 -326.999 c 0,264,265 - 328 -376.818 328 -376.818 302 -401 c 0,266,267 - 302.608 -376.581 l 0,268,269 - 298.602 -349.953 298.602 -349.953 272.5 -332.5 c 0,270,271 - 242.027 -312.125 242.027 -312.125 218 -312 c 0,272,273 - 175.052 -314.051 175.052 -314.051 141 -347.5 c 0,274,275 - 121.999 -366 121.999 -366 105 -421 c 0,276,277 - 92 -461 92 -461 89.5 -519 c 0,278,279 - 86.9999 -577 86.9999 -577 94 -622 c 0,280,281 - 74.9999 -568 74.9999 -568 61 -503 c 0,282,283 - 47.9576 -442.447 47.9576 -442.447 55 -368 c 0,284,285 - 62 -294 62 -294 91 -142.5 c 0,286,287 - 119.999 9 119.999 9 81 94 c 0,288,289 - 63.9996 128.001 63.9996 128.001 48 196.5 c 0,290,291 - 41.9721 222.307 41.9721 222.307 42.0474 243.927 c 0,292,293 - 42.1721 279.693 42.1721 279.693 59 304 c 0,294,295 - 56.1273 271.443 56.1273 271.443 79 271 c 0,296,297 - 95.4265 270.777 95.4265 270.777 110 288 c 0,298,299 - 130.215 313.73 130.215 313.73 136 360 c 0,300,301 - 140.9 399.204 140.9 399.204 127 465 c 0,302,303 - 121.971 496.186 121.971 496.186 101 501 c 0,304,305 - 51.9536 514 51.9536 514 58 450 c 0,306,307 - 42.0932 466.57 42.0932 466.57 42.0707 502.115 c 0,308,309 - 42.0269 571.209 42.0269 571.209 102 712 c 0,310,311 - 118.001 749.562 118.001 749.562 118 967 c 0,0,1 -EndSplineSet -KernsSLIF: 116 -195 0 0 84 -313 0 0 -EndChar -StartChar: adieresis -Encoding: 228 228 76 -Width: 1332 -Flags: HW -Fore -108.8 -261.8 m 1,0,1 - 28.0497 -147.901 28.0497 -147.901 17.4248 -43.3496 c 0,2,3 - 6.79985 61.2002 6.79985 61.2002 31.875 156.825 c 0,4,5 - 56.9505 252.451 56.9505 252.451 100.725 339.575 c 0,6,7 - 144.501 426.702 144.501 426.702 172.55 505.75 c 0,8,9 - 190.4 555.899 190.4 555.899 192.95 647.275 c 0,10,11 - 195.5 738.65 195.5 738.65 204.425 831.725 c 0,12,13 - 213.35 924.8 213.35 924.8 240.125 1000.45 c 0,14,15 - 266.904 1076.11 266.904 1076.11 334.9 1095.65 c 0,16,17 - 270.299 1031.9 270.299 1031.9 308.125 983.45 c 0,18,19 - 322.192 966.021 322.192 966.021 352.75 975.8 c 0,20,21 - 375.215 982.988 375.215 982.988 396.1 1090.55 c 0,22,23 - 413.098 1178.1 413.098 1178.1 495.975 1300.92 c 0,24,25 - 576.726 1421.98 576.726 1421.98 642.175 1473.47 c 0,26,27 - 684.84 1507.04 684.84 1507.04 731.145 1506.95 c 0,28,29 - 775.711 1506.86 775.711 1506.86 823.65 1475.6 c 0,30,31 - 791.682 1476.23 l 0,32,33 - 734.526 1470.01 734.526 1470.01 723.35 1405.05 c 0,34,35 - 720.073 1363.06 l 0,36,37 - 720.858 1302.78 720.858 1302.78 752.25 1237.17 c 0,38,39 - 794.078 1149.77 794.078 1149.77 821.1 1152.6 c 0,40,41 - 853.4 1156.01 853.4 1156.01 855.95 1172.58 c 0,42,43 - 856.239 1189.56 l 0,44,45 - 852.29 1209.9 852.29 1209.9 827.9 1230.8 c 0,46,47 - 926.311 1212.47 926.311 1212.47 926.925 1115.62 c 0,48,49 - 926.826 1076.61 926.826 1076.61 946.613 970.938 c 0,50,51 - 951.299 945.912 951.299 945.912 957.1 917.15 c 0,52,53 - 977.5 815.151 977.5 815.151 993.225 781.575 c 0,54,55 - 1005.77 754.812 1005.77 754.812 1024.74 754.627 c 0,56,57 - 1030.95 754.566 1030.95 754.566 1037.85 757.35 c 0,58,59 - 1078.88 773.9 1078.88 773.9 1071 821.1 c 0,60,61 - 1060.8 882.3 1060.8 882.3 1027.65 920.55 c 0,62,63 - 1101.6 875.501 1101.6 875.501 1122.42 816.85 c 0,64,65 - 1139.96 767.482 1139.96 767.482 1140.01 715.971 c 0,66,67 - 1140.02 706.31 1140.02 706.31 1139.42 696.575 c 0,68,69 - 1135.59 634.892 1135.59 634.892 1122 577.15 c 0,70,71 - 1112.87 538.38 1112.87 538.38 1112.93 506.472 c 0,72,73 - 1112.96 490.835 1112.96 490.835 1115.2 476.85 c 0,74,75 - 1127.95 388.465 1127.95 388.465 1167.9 300.05 c 0,76,77 - 1207.87 211.588 1207.87 211.588 1235.47 116.45 c 0,78,79 - 1259.51 33.6266 1259.51 33.6266 1259.42 -56.6199 c 0,80,81 - 1258.85 -83.7246 l 0,82,83 - 1254.61 -188.683 1254.61 -188.683 1178.95 -311.1 c 0,84,85 - 1203.42 -228.959 1203.42 -228.959 1203.33 -128.066 c 0,86,87 - 1203.3 -81.7345 1203.3 -81.7345 1198.08 -31.4502 c 0,88,89 - 1181.92 124.337 1181.92 124.337 1072.39 125.071 c 0,90,91 - 1068.77 125.095 1068.77 125.095 1065.05 124.95 c 0,92,93 - 1000.37 122.43 1000.37 122.43 980.05 67.5752 c 0,94,95 - 960.501 12.75 960.501 12.75 982.6 -62.0498 c 0,96,97 - 884.849 -3.4004 884.849 -3.4004 916.3 144.5 c 0,98,99 - 946.219 285.196 946.219 285.196 946.137 381.283 c 0,100,101 - 946.133 386.201 946.133 386.201 946.05 391 c 0,102,103 - 944.351 498.949 944.351 498.949 875.5 540.6 c 0,104,105 - 806.65 582.25 806.65 582.25 727.6 566.95 c 0,106,107 - 640.877 549.399 640.877 549.399 612.425 503.2 c 0,108,109 - 572.61 440.3 572.61 440.3 516.8 440.3 c 0,110,111 - 470.899 440.3 470.899 440.3 448.8 456.45 c 0,112,113 - 542.639 460.64 542.639 460.64 532.1 525.3 c 0,114,115 - 524.543 571.665 524.543 571.665 483.418 573.028 c 0,116,117 - 458.15 570.35 l 0,118,119 - 400.326 557.651 400.326 557.651 371.875 521.9 c 0,120,121 - 323.851 461.552 323.851 461.552 310.25 374.85 c 0,122,123 - 300.338 313.888 300.338 313.888 300.395 241.659 c 0,124,125 - 300.436 190.01 300.436 190.01 305.575 132.6 c 0,126,127 - 317.9 -5.09955 317.9 -5.09955 222.7 -57.7998 c 0,128,129 - 261.896 26.0049 261.896 26.0049 232.9 78.2002 c 0,130,131 - 216.34 108.009 216.34 108.009 155.55 107.95 c 0,132,133 - 128.74 104.737 l 0,134,135 - 67.7534 88.1114 67.7534 88.1114 67.1504 -14.4502 c 0,136,137 - 66.2997 -158.949 66.2997 -158.949 108.8 -261.8 c 1,0,1 -479.4 838.95 m 0,77,78 - 479.4 776.051 479.4 776.051 537.625 746.725 c 0,79,80 - 595.851 717.4 595.851 717.4 665.125 713.575 c 0,81,82 - 724.336 714 l 0,83,84 - 762.062 717.024 762.062 717.024 790.925 727.6 c 0,85,86 - 843.456 746.848 843.456 746.848 844.05 776.9 c 0,87,88 - 839.707 824.116 839.707 824.116 756.075 888.25 c 0,89,90 - 707.698 925.347 707.698 925.347 707.663 963.627 c 0,91,92 - 707.638 990.253 707.638 990.253 731 1017.45 c 0,93,94 - 730.287 989.406 l 0,95,96 - 733.091 969.257 733.091 969.257 748.499 968.932 c 0,97,98 - 759.475 970.7 l 0,99,100 - 781.225 977.353 781.225 977.353 781.56 996.947 c 0,101,102 - 777.499 1017.28 l 0,103,104 - 775.544 1022.6 775.544 1022.6 772.65 1028.5 c 0,105,106 - 748.854 1074.39 748.854 1074.39 692.75 1128.8 c 0,107,108 - 652.395 1167.94 652.395 1167.94 622.154 1168.36 c 0,109,110 - 604.83 1165.09 l 0,111,112 - 602.425 1164.1 602.425 1164.1 600.1 1162.8 c 0,113,114 - 564.525 1142.79 564.525 1142.79 564.17 1110.18 c 0,115,116 - 564.118 1105.39 564.118 1105.39 564.825 1100.33 c 0,117,118 - 570.349 1060.81 570.349 1060.81 585.65 1016.6 c 0,119,120 - 600.95 972.4 600.95 972.4 607.325 930.325 c 0,121,122 - 613.7 888.25 613.7 888.25 575.45 860.2 c 0,123,124 - 593.3 928.2 593.3 928.2 524.45 916.3 c 0,125,126 - 479.456 909.755 479.456 909.755 479.4 838.95 c 0,77,78 -432.65 1542.75 m 1,99,100 - 414.656 1587.74 414.656 1587.74 414.559 1630.56 c 0,101,102 - 414.46 1674.09 414.46 1674.09 432.846 1715.39 c 0,103,104 - 442.516 1737.11 442.516 1737.11 457.3 1758.22 c 0,105,106 - 522.348 1851.09 522.348 1851.09 619.897 1851.11 c 0,107,108 - 628.156 1851.11 628.156 1851.11 636.65 1850.45 c 0,109,110 - 525.809 1786.57 525.809 1786.57 525.449 1734.18 c 0,111,112 - 525.411 1728.72 525.411 1728.72 526.575 1723.38 c 0,113,114 - 533.582 1691.24 533.582 1691.24 572.317 1691.11 c 0,115,116 - 601.716 1691.01 601.716 1691.01 649.4 1709.35 c 0,117,118 - 633.251 1648.15 633.251 1648.15 549.525 1626.9 c 0,119,120 - 465.8 1605.65 465.8 1605.65 432.65 1542.75 c 1,99,100 -918.85 1540.2 m 1,108,109 - 915.999 1568.74 l 0,110,111 - 917.542 1625.56 917.542 1625.56 969 1714.45 c 0,112,113 - 1028.97 1818.05 1028.97 1818.05 1119.65 1818.14 c 0,114,115 - 1127.92 1818.15 1127.92 1818.15 1136.45 1817.3 c 0,116,117 - 1089.98 1774.77 1089.98 1774.77 1089.85 1729.33 c 0,118,119 - 1089.84 1725.72 1089.84 1725.72 1090.12 1722.1 c 0,120,121 - 1092.3 1693.97 1092.3 1693.97 1128.39 1694.07 c 0,122,123 - 1155.54 1694.14 1155.54 1694.14 1201.9 1710.2 c 0,124,125 - 1154.31 1638.8 1154.31 1638.8 1074.83 1623.5 c 0,126,127 - 995.359 1608.2 995.359 1608.2 918.85 1540.2 c 1,108,109 -EndSplineSet -EndChar -StartChar: oacute -Encoding: 243 243 46 -Width: 1230 -Flags: HW -Fore -601 -2 m 0,0,1 - 510 5.99999 510 5.99999 424.5 82 c 0,2,3 - 338.998 158.003 338.998 158.003 273 246 c 0,4,5 - 207.001 333.999 207.001 333.999 167 406 c 0,6,7 - 127 477.999 127 477.999 127 480 c 0,8,9 - 113.001 520 113.001 520 83 584.5 c 0,10,11 - 53 649 53 649 33.5 714.5 c 0,12,13 - 14 780 14 780 18 835.5 c 0,14,15 - 22 891 22 891 77 915 c 0,16,17 - 106 927 106 927 133 912 c 0,18,19 - 80.6363 893.182 80.6363 893.182 80.1529 846.248 c 0,20,21 - 82.5 824 l 0,22,23 - 96 759 96 759 127 792 c 0,24,25 - 162.002 830.002 162.002 830.002 213.5 937.5 c 0,26,27 - 243.557 1000.24 243.557 1000.24 243.809 1035.56 c 0,28,29 - 243.905 1049 243.905 1049 239.684 1058.47 c 0,30,31 - 235.993 1066.76 235.993 1066.76 229 1072 c 0,32,33 - 217.589 1079.95 217.589 1079.95 207.672 1079.89 c 0,34,35 - 188.912 1079.78 188.912 1079.78 175.5 1051 c 0,36,37 - 166.787 1032.3 166.787 1032.3 166.655 1015.05 c 0,38,39 - 166.556 1002.3 166.556 1002.3 171.139 990.344 c 0,40,41 - 174.951 980.399 174.951 980.399 182 971 c 0,42,43 - 126.43 1007.77 126.43 1007.77 126.29 1046.55 c 0,44,45 - 126.258 1055.23 126.258 1055.23 129 1064 c 0,46,47 - 143.998 1111.99 143.998 1111.99 193.5 1153.5 c 0,48,49 - 242.971 1194.98 242.971 1194.98 302.5 1224.5 c 0,50,51 - 362 1254.01 362 1254.01 383 1262 c 0,52,53 - 421.942 1276.98 421.942 1276.98 510 1303.5 c 0,54,55 - 598 1330.01 598 1330.01 568 1377 c 0,56,57 - 553.93 1398.1 553.93 1398.1 536.426 1398.25 c 0,58,59 - 524.536 1398.34 524.536 1398.34 510 1388 c 0,60,61 - 476 1362.99 476 1362.99 465 1337 c 0,62,63 - 458.647 1342.82 458.647 1342.82 458.741 1354.39 c 0,64,65 - 458.824 1364.68 458.824 1364.68 464 1379.5 c 0,66,67 - 475.002 1411.01 475.002 1411.01 484 1419 c 0,68,69 - 541 1468.99 541 1468.99 614 1444.5 c 0,70,71 - 686.989 1420.01 686.989 1420.01 760.5 1361.5 c 0,72,73 - 834 1303 834 1303 902 1231 c 0,74,75 - 970.031 1158.97 970.031 1158.97 1019 1115 c 0,76,77 - 1028.75 1105.97 1028.75 1105.97 1036.15 1105.75 c 0,78,79 - 1043.94 1108.44 l 0,80,81 - 1051.13 1114.23 1051.13 1114.23 1055 1132.5 c 0,82,83 - 1055.19 1151.12 l 0,84,85 - 1048.84 1183.02 1048.84 1183.02 996 1211 c 0,86,87 - 1116 1211 1116 1211 1133.5 1103.5 c 0,88,89 - 1140.87 1058.24 1140.87 1058.24 1140.79 1007.3 c 0,90,91 - 1140.68 937.275 1140.68 937.275 1126.5 856.5 c 0,92,93 - 1102.01 717.049 1102.01 717.049 1064.5 581.5 c 0,94,95 - 1035.57 476.98 1035.57 476.98 1035.51 419.158 c 0,96,97 - 1035.49 402.028 1035.49 402.028 1038 389 c 0,98,99 - 1039.99 374 1039.99 374 1060.5 374.5 c 0,100,101 - 1080.99 374.999 1080.99 374.999 1094 390 c 0,102,103 - 1119.37 418.072 1119.37 418.072 1119.68 448.764 c 0,104,105 - 1115.99 473.526 l 0,106,107 - 1111.6 487.99 1111.6 487.99 1102 503 c 0,108,109 - 1150 489 1150 489 1159 437 c 0,110,111 - 1161.09 395.311 l 0,112,113 - 1158.04 329.427 1158.04 329.427 1111.5 287.5 c 0,114,115 - 1051.01 233.004 1051.01 233.004 960.5 202.5 c 0,116,117 - 869.996 171.999 869.996 171.999 772.5 158 c 0,118,119 - 675.01 144.002 675.01 144.002 616 130 c 0,120,121 - 570 119.001 570 119.001 607 72.5 c 0,122,123 - 620.616 55.388 620.616 55.388 641.139 55.4071 c 0,124,125 - 676.384 55.44 676.384 55.44 732 106 c 0,126,127 - 721 61 721 61 682 28 c 0,128,129 - 643 -5 643 -5 601 -2 c 0,0,1 -454 901 m 0,66,67 - 416 871 416 871 387 867.5 c 0,68,69 - 358 864 358 864 331 870 c 0,70,71 - 419.739 899.849 419.739 899.849 419.97 958.983 c 0,72,73 - 420.025 973.151 420.025 973.151 415 989 c 0,74,75 - 411.054 1000.84 411.054 1000.84 395.575 1001.15 c 0,76,77 - 391.448 1001.24 391.448 1001.24 386.5 1000.5 c 0,78,79 - 363 997 363 997 352 987 c 0,80,81 - 286 924 286 924 237 767 c 0,82,83 - 217.135 703.352 217.135 703.352 217.157 660.905 c 0,84,85 - 217.189 598.649 217.189 598.649 260 582 c 0,86,87 - 350 546 350 546 334.5 610.5 c 0,88,89 - 319 675 319 675 273 684 c 0,90,91 - 318 702 318 702 358.5 663 c 0,92,93 - 399 624 399 624 426.5 566 c 0,94,95 - 454 508 454 508 464 449.5 c 0,96,97 - 474 391 474 391 459 371 c 0,98,99 - 458 408 458 408 432.5 424 c 0,100,101 - 407 440 407 440 385 413 c 0,102,103 - 356.738 379.691 356.738 379.691 356.366 352.75 c 0,104,105 - 359.552 334.59 l 0,106,107 - 365.495 319.032 365.495 319.032 382.5 306 c 0,108,109 - 436 265 436 265 529 259 c 0,110,111 - 622 253 622 253 720 287 c 0,112,113 - 818 321.001 818 321.001 851 406 c 0,114,115 - 877 475 877 475 812 486.5 c 0,116,117 - 790.15 486.903 l 0,118,119 - 759.741 481.142 759.741 481.142 759.84 434.141 c 0,120,121 - 759.871 419.164 759.871 419.164 763 400 c 0,122,123 - 731.127 447.81 731.127 447.81 730.967 483.991 c 0,124,125 - 730.869 506.399 730.869 506.399 742.934 524.347 c 0,126,127 - 749.283 533.791 749.283 533.791 759 542 c 0,128,129 - 817 591 817 591 883 657 c 0,130,131 - 988 759 988 759 973 883 c 0,132,133 - 958.001 1006.99 958.001 1006.99 850 1107 c 0,134,135 - 778.288 1172.36 778.288 1172.36 729.654 1172.62 c 0,136,137 - 724.708 1172.65 724.708 1172.65 720 1172 c 0,138,139 - 668.989 1164.99 668.989 1164.99 628 1119 c 0,140,141 - 586.987 1072.98 586.987 1072.98 547.5 1008.5 c 0,142,143 - 508 944 508 944 454 901 c 0,66,67 -713 1513 m 1,107,108 - 659.89 1575.91 659.89 1575.91 659.855 1645.51 c 0,109,110 - 659.847 1661.09 659.847 1661.09 662.5 1677 c 0,111,112 - 677 1764 677 1764 735 1823.5 c 0,113,114 - 793 1883.01 793 1883.01 876 1897 c 0,115,116 - 911.02 1899.19 l 0,117,118 - 974.217 1896.21 974.217 1896.21 1030 1842 c 0,119,120 - 976.262 1882.84 976.262 1882.84 932.539 1883.13 c 0,121,122 - 917.33 1883.23 917.33 1883.23 903.333 1878.42 c 0,123,124 - 901.405 1877.76 901.405 1877.76 899.5 1877 c 0,125,126 - 843.996 1854.99 843.996 1854.99 817 1810 c 0,127,128 - 795.751 1774.59 795.751 1774.59 795.56 1742.58 c 0,129,130 - 795.509 1733.91 795.509 1733.91 797 1725.5 c 0,131,132 - 804 1686.01 804 1686.01 854 1709 c 0,133,134 - 864.909 1713.36 864.909 1713.36 865.107 1729.33 c 0,135,136 - 860.634 1755.7 l 0,137,138 - 859.468 1759.69 859.468 1759.69 858 1764 c 0,139,140 - 887.56 1724.58 887.56 1724.58 888.396 1699.82 c 0,141,142 - 886 1685.5 l 0,143,144 - 875.003 1659 875.003 1659 842 1638 c 0,145,-1 - 769.5 1591 l 0,146,147 - 729.999 1565 729.999 1565 713 1513 c 1,107,108 -EndSplineSet -KernsSLIF: 116 -234 0 0 119 -156 0 0 -EndChar -StartChar: odieresis -Encoding: 246 246 80 -Width: 1378 -Flags: HW -Fore -916.3 -9.34961 m 0,0,1 - 904.401 0.849471 904.401 0.849471 827.475 9.77539 c 0,2,3 - 750.552 18.7001 750.552 18.7001 661.3 20.4004 c 0,4,5 - 572.05 22.0996 572.05 22.0996 497.675 12.75 c 0,6,7 - 424.255 3.52052 424.255 3.52052 417.35 -22.9502 c 0,8,9 - 412.25 -42.5 412.25 -42.5 431.375 -63.75 c 0,10,11 - 450.5 -85.0001 450.5 -85.0001 522.75 -110.5 c 0,12,13 - 475.333 -112.195 l 0,14,15 - 420.862 -109.586 420.862 -109.586 368.05 -85.8496 c 0,16,17 - 276.266 -44.5988 276.266 -44.5988 255 19.5498 c 0,18,19 - 204.001 173.398 204.001 173.398 189.125 245.65 c 0,20,21 - 162.128 409.363 162.128 409.363 149.6 435.2 c 0,22,23 - 108.8 519.35 108.8 519.35 37.8252 640.475 c 0,24,25 - -33.1504 761.6 -33.1504 761.6 36.5498 881.45 c 0,26,27 - 36.886 828.045 l 0,28,29 - 40.8577 786.531 40.8577 786.531 58.6504 779.025 c 0,30,31 - 85.8496 767.55 85.8496 767.55 112.2 782.85 c 0,32,33 - 140.25 799.849 140.25 799.849 192.95 932.875 c 0,34,35 - 245.705 1066.04 245.705 1066.04 260.1 1105 c 0,36,37 - 272.902 1140.56 272.902 1140.56 273.054 1164.26 c 0,38,39 - 273.151 1179.36 273.151 1179.36 268.108 1189.64 c 0,40,41 - 266.18 1193.57 266.18 1193.57 263.5 1196.8 c 0,42,43 - 246.17 1217.66 246.17 1217.66 223.104 1217.78 c 0,44,45 - 203.924 1217.88 203.924 1217.88 180.779 1203.64 c 0,46,47 - 164.853 1193.84 164.853 1193.84 147.05 1177.25 c 0,48,49 - 155.55 1236.75 155.55 1236.75 191.25 1267.35 c 0,50,51 - 240.928 1307.83 240.928 1307.83 316.625 1311.55 c 0,52,53 - 349.497 1313.73 349.497 1313.73 464.1 1366.38 c 0,54,55 - 514.772 1389.7 514.772 1389.7 599.25 1390.6 c 0,56,57 - 679.152 1391.46 679.152 1391.46 691.05 1429.7 c 0,58,59 - 707.201 1484.1 707.201 1484.1 606.9 1501.1 c 0,60,61 - 667.25 1526.6 667.25 1526.6 725.9 1493.03 c 0,62,63 - 784.558 1459.44 784.558 1459.44 837.675 1400.8 c 0,64,65 - 890.8 1342.15 890.8 1342.15 935.85 1275.85 c 0,66,67 - 980.915 1209.53 980.915 1209.53 1014.05 1169.6 c 0,68,69 - 1070.16 1100.74 1070.16 1100.74 1186.17 1027.22 c 0,70,71 - 1302.19 953.7 1302.19 953.7 1313.25 811.75 c 0,72,73 - 1269.97 876.665 1269.97 876.665 1238.32 877.009 c 0,74,75 - 1232.68 877.07 1232.68 877.07 1227.4 875.075 c 0,76,77 - 1192.54 861.896 1192.54 861.896 1185.75 839.8 c 0,78,79 - 1163.33 768.803 1163.33 768.803 1163.37 705.357 c 0,80,81 - 1163.39 667.767 1163.39 667.767 1171.3 632.825 c 0,82,83 - 1201.41 499.741 1201.41 499.741 1221.45 461.975 c 0,84,85 - 1262.25 385.05 1262.25 385.05 1262.67 324.275 c 0,86,87 - 1260.17 287.831 l 0,88,89 - 1252.31 244.712 1252.31 244.712 1220.6 218.45 c 0,90,91 - 1236.76 300.05 1236.76 300.05 1215.92 328.525 c 0,92,93 - 1200.89 349.086 1200.89 349.086 1179.42 349.482 c 0,94,95 - 1161.95 346.8 l 0,96,97 - 1140.7 340.002 1140.7 340.002 1114.78 255.85 c 0,98,99 - 1088.84 171.7 1088.84 171.7 1054 79.4746 c 0,100,101 - 1010.71 -35.0859 1010.71 -35.0859 973.25 -78.2002 c 0,102,103 - 939.558 -116.979 939.558 -116.979 896.355 -117.246 c 0,104,105 - 881.793 -117.336 881.793 -117.336 866.15 -113.05 c 0,106,107 - 927.35 -99.4494 927.35 -99.4494 935 -66.7246 c 0,108,109 - 936.469 -44.7745 l 0,110,111 - 934.018 -24.5366 934.018 -24.5366 916.3 -9.34961 c 0,0,1 -548.25 165.75 m 0,62,63 - 648.347 160.761 648.347 160.761 687.225 228.225 c 0,64,65 - 752.25 339.15 752.25 339.15 846.6 298.35 c 0,66,67 - 772.919 282.561 772.919 282.561 805.8 221.85 c 0,68,69 - 821.369 193.105 821.369 193.105 879.75 196.35 c 0,70,71 - 927.179 198.985 927.179 198.985 967.3 279.225 c 0,72,73 - 1028.91 402.453 1028.91 402.453 1035.3 477.275 c 0,74,75 - 1041.05 544.612 1041.05 544.612 1040.99 604.498 c 0,76,77 - 1040.95 650.853 1040.95 650.853 1037.42 692.75 c 0,78,79 - 1025.49 814.679 1025.49 814.679 1014.05 837.25 c 0,80,81 - 998.48 867.665 998.48 867.665 960.5 858.925 c 0,82,83 - 922.666 850.974 922.666 850.974 922.325 821.624 c 0,84,85 - 926.362 799.386 l 0,86,87 - 928.982 791.603 928.982 791.603 933.3 782.85 c 0,88,89 - 865.909 816.107 865.909 816.107 856.8 879.75 c 0,90,91 - 857.365 893.879 857.365 893.879 864.025 1017.45 c 0,92,93 - 866.867 1077.89 866.867 1077.89 816.85 1152.6 c 0,94,95 - 793.608 1187.32 793.608 1187.32 673.2 1206.15 c 0,96,97 - 610.858 1215.9 610.858 1215.9 559.725 1162.38 c 0,98,99 - 485.058 1084.22 485.058 1084.22 482.8 1047.62 c 0,100,101 - 470.41 846.737 470.41 846.737 466.65 833.85 c 0,102,103 - 438.003 730.523 438.003 730.523 376.125 696.15 c 0,104,105 - 413.458 804.286 413.458 804.286 308.55 806.225 c 0,106,107 - 294.277 803.159 l 0,108,109 - 265.044 788.558 265.044 788.558 265.122 704.552 c 0,110,111 - 265.126 700.434 265.126 700.434 265.2 696.15 c 0,112,113 - 267.169 582.489 267.169 582.489 270.3 545.7 c 0,114,115 - 278.711 437.373 278.711 437.373 317.9 362.95 c 0,116,117 - 383.163 239.008 383.163 239.008 415.65 211.65 c 0,118,119 - 465.243 169.889 465.243 169.889 548.25 165.75 c 0,62,63 -246.5 1577.6 m 1,94,95 - 249.901 1651.55 249.901 1651.55 309.825 1761.62 c 0,96,97 - 369.744 1871.69 369.744 1871.69 447.1 1885.3 c 0,98,99 - 396.908 1790.71 396.908 1790.71 396.892 1749.7 c 0,100,101 - 396.887 1736.54 396.887 1736.54 402.05 1728.9 c 0,102,103 - 423.294 1697.46 423.294 1697.46 495.55 1694.05 c 0,104,105 - 486.201 1651.56 486.201 1651.56 386.75 1627.33 c 0,106,107 - 287.314 1603.11 287.314 1603.11 246.5 1577.6 c 1,94,95 -893.35 1595.45 m 1,103,104 - 903.551 1664.31 903.551 1664.31 973.25 1742.08 c 0,105,106 - 1042.95 1819.85 1042.95 1819.85 1127.1 1840.25 c 0,107,108 - 1070.15 1784.15 1070.15 1784.15 1058.67 1730.6 c 0,109,110 - 1047.2 1677.05 1047.2 1677.05 1144.95 1651.55 c 0,111,112 - 1114.52 1627.53 1114.52 1627.53 1076.72 1627.48 c 0,113,114 - 1054.33 1627.45 1054.33 1627.45 1029.35 1635.83 c 0,115,116 - 962.2 1658.34 962.2 1658.34 893.35 1595.45 c 1,103,104 -EndSplineSet -EndChar -StartChar: udieresis -Encoding: 252 252 78 -Width: 1329 -Flags: HW -Fore -794.325 -23.7998 m 128,-1,0 - 803.25 -76.5 803.25 -76.5 892.5 -42.5 c 0,1,2 - 855.06 -101.644 855.06 -101.644 793.666 -101.642 c 0,3,4 - 760.689 -101.641 760.689 -101.641 720.8 -84.5752 c 0,5,6 - 696.261 -74.0762 696.261 -74.0762 517.65 -45.9004 c 0,7,-1 - 378.25 -22.0996 l 0,8,9 - 345.296 -18.8683 l 0,10,11 - 274.509 -2.90244 274.509 -2.90244 270.3 91.7998 c 0,12,13 - 314.873 54.6553 314.873 54.6553 347.225 95.2002 c 0,14,15 - 354.846 104.75 354.846 104.75 354.974 117.666 c 0,16,17 - 355.071 127.561 355.071 127.561 350.77 139.432 c 0,18,19 - 349.425 143.144 349.425 143.144 347.65 147.05 c 0,20,21 - 330.805 184.111 330.805 184.111 303.45 214.2 c 0,22,-1 - 260.95 260.95 l 0,23,24 - 240.668 281.956 240.668 281.956 208.25 264.775 c 0,25,26 - 181.797 251.548 181.797 251.548 181.721 228.796 c 0,27,28 - 181.667 212.801 181.667 212.801 194.65 192.1 c 0,29,30 - 140.102 203.838 140.102 203.838 139.64 265.025 c 0,31,32 - 139.541 278.203 139.541 278.203 141.95 293.675 c 0,33,34 - 145.373 341.637 l 0,35,36 - 145.028 387.385 145.028 387.385 131.75 438.6 c 0,37,38 - 90.3602 595.881 90.3602 595.881 48.875 652.375 c 0,39,40 - -35.7002 770.099 -35.7002 770.099 23.7998 903.55 c 0,41,42 - 25.5382 842.726 25.5382 842.726 59.0752 842.775 c 0,43,44 - 83.3029 842.811 83.3029 842.811 95.2002 872.95 c 0,45,46 - 107.95 905.249 107.95 905.249 67.5752 1043.38 c 0,47,48 - 27.2001 1181.5 27.2001 1181.5 28.9004 1222.3 c 0,49,50 - 33.1501 1386.34 33.1501 1386.34 136.85 1514.7 c 0,51,52 - 91.8515 1394.07 91.8515 1394.07 107.1 1269.9 c 0,53,54 - 123.35 1137.58 123.35 1137.58 209.95 1122 c 0,55,56 - 232.44 1122.04 l 0,57,58 - 257.102 1125.91 257.102 1125.91 289 1145.38 c 0,59,60 - 346.8 1180.65 346.8 1180.65 364.65 1275.85 c 0,61,62 - 398.65 1192.55 398.65 1192.55 369.325 1117.75 c 0,63,64 - 342.227 1048.63 342.227 1048.63 331.5 950.3 c 0,65,66 - 328.38 887.9 l 0,67,68 - 329.279 834.519 329.279 834.519 343.825 793.9 c 0,69,70 - 350.026 776.584 350.026 776.584 349.946 760.75 c 0,71,72 - 349.736 719.066 349.736 719.066 306 687.65 c 0,73,74 - 316.2 736.1 316.2 736.1 300.9 755.225 c 0,75,76 - 279.454 782.031 279.454 782.031 255 736.1 c 0,77,78 - 239.174 706.375 239.174 706.375 257.55 606.475 c 0,79,80 - 273.701 516.374 273.701 516.374 286.45 482.375 c 0,81,82 - 308.524 420.886 308.524 420.886 339.15 369.75 c 0,83,84 - 394.097 284.896 394.097 284.896 442 244.8 c 0,85,86 - 462.424 235.609 462.424 235.609 476.172 235.462 c 0,87,88 - 485.273 235.364 485.273 235.364 493.85 240.975 c 0,89,90 - 506.463 251.547 506.463 251.547 506.61 266.41 c 0,91,92 - 506.707 276.331 506.707 276.331 501.251 288.163 c 0,93,94 - 496.151 299.222 496.151 299.222 486.2 311.95 c 0,95,96 - 590.019 303.37 590.019 303.37 603.075 206.55 c 0,97,98 - 612.388 136.8 612.388 136.8 659.175 141.525 c 0,99,100 - 717.115 146.564 717.115 146.564 752.25 221.85 c 0,101,102 - 784.79 291.579 784.79 291.579 802.825 357.425 c 0,103,104 - 829.489 454.781 829.489 454.781 833.85 487.05 c 0,105,106 - 846.6 583.95 846.6 583.95 908.65 627.3 c 0,107,108 - 879.354 552.334 879.354 552.334 917.15 531.25 c 0,109,110 - 939.276 518.908 939.276 518.908 963.9 536.35 c 0,111,112 - 984.9 550.75 984.9 550.75 984.935 627.832 c 0,113,114 - 984.95 659.95 984.95 659.95 981.325 702.95 c 0,115,116 - 968.318 857.227 968.318 857.227 953.7 932.45 c 0,117,118 - 933.107 1038.42 933.107 1038.42 918.425 1082.47 c 0,119,120 - 903.528 1127.16 903.528 1127.16 903.575 1169.52 c 0,121,122 - 903.651 1237.13 903.651 1237.13 941.8 1298.8 c 0,123,124 - 950.924 1200.93 950.924 1200.93 999.175 1168.33 c 0,125,126 - 1036.52 1143.09 1036.52 1143.09 1058.89 1143.12 c 0,127,128 - 1069.04 1143.14 1069.04 1143.14 1076.1 1148.35 c 0,129,130 - 1137.78 1196.39 1137.78 1196.39 1154.3 1352.78 c 0,131,132 - 1158.92 1396.53 1158.92 1396.53 1158.83 1436.6 c 0,133,134 - 1158.66 1514.46 1158.66 1514.46 1140.7 1578.45 c 0,135,136 - 1196.81 1484.09 1196.81 1484.09 1211.67 1344.7 c 0,137,138 - 1216.91 1295.64 1216.91 1295.64 1216.83 1248.99 c 0,139,140 - 1216.68 1163.11 1216.68 1163.11 1198.5 1085.45 c 0,141,142 - 1180.94 1010.95 1180.94 1010.95 1181 946.244 c 0,143,144 - 1181.05 895.058 1181.05 895.058 1192.12 850 c 0,145,146 - 1217.2 748 1217.2 748 1176.4 697 c 0,147,148 - 1174.77 723.682 l 0,149,150 - 1170.35 743.741 1170.35 743.741 1155.58 753.95 c 0,151,152 - 1132.2 770.1 1132.2 770.1 1117.75 711.45 c 0,153,154 - 1104.92 658.776 1104.92 658.776 1104.93 595.482 c 0,155,156 - 1104.94 541.33 1104.94 541.33 1114.35 479.4 c 0,157,158 - 1120.07 441.729 1120.07 441.729 1119.98 409.006 c 0,159,160 - 1119.73 325.072 1119.73 325.072 1081.2 273.7 c 0,161,162 - 1081.2 362.144 1081.2 362.144 1044.44 362.661 c 0,163,164 - 1041.28 362.706 1041.28 362.706 1037.85 362.1 c 0,165,166 - 991.308 353.69 991.308 353.69 889.95 186.15 c 0,167,168 - 787.459 16.7373 787.459 16.7373 794.325 -23.7998 c 128,-1,0 -164.9 1655.8 m 1,92,93 - 209.152 1694.99 209.152 1694.99 229.075 1823.67 c 0,94,95 - 244.799 1925.24 244.799 1925.24 341.7 1951.6 c 0,96,97 - 283.098 1886.48 283.098 1886.48 283.104 1833.34 c 0,98,99 - 283.106 1817.11 283.106 1817.11 288.575 1802 c 0,100,101 - 304.802 1754.41 304.802 1754.41 329.579 1754.19 c 0,102,103 - 340.419 1754.09 340.419 1754.09 352.896 1763.06 c 0,104,105 - 368.171 1774.03 368.171 1774.03 385.9 1798.6 c 0,106,107 - 420.75 1747.6 420.75 1747.6 336.175 1679.17 c 0,108,109 - 251.6 1610.76 251.6 1610.76 164.9 1655.8 c 1,92,93 -1014.05 1667.7 m 1,101,102 - 1042.95 1680.45 1042.95 1680.45 1064.2 1727.62 c 0,103,104 - 1085.34 1772.94 1085.34 1772.94 1102.45 1821.12 c 0,105,106 - 1121.99 1868.28 1121.99 1868.28 1148.78 1901.03 c 0,107,108 - 1168 1924.51 1168 1924.51 1197.93 1924.57 c 0,109,110 - 1209.71 1924.6 1209.71 1924.6 1223.15 1921 c 0,111,112 - 1194.86 1907.76 1194.86 1907.76 1173.42 1864.9 c 0,113,114 - 1154.85 1827.74 1154.85 1827.74 1154.87 1783.15 c 0,115,116 - 1154.87 1777.75 1154.87 1777.75 1155.15 1772.25 c 0,117,118 - 1156.92 1752.48 1156.92 1752.48 1192.55 1742.92 c 0,119,120 - 1216.35 1736.55 1216.35 1736.55 1266.5 1760.35 c 0,121,122 - 1225.96 1698.19 1225.96 1698.19 1134.75 1660.47 c 0,123,124 - 1104.12 1647.8 1104.12 1647.8 1076.85 1647.84 c 0,125,126 - 1042.83 1647.88 1042.83 1647.88 1014.05 1667.7 c 1,101,102 -EndSplineSet -EndChar -StartChar: Aogonek -Encoding: 260 260 79 -Width: 1433 -Flags: HW -Fore -1029 333 m 0,0,1 - 1023.7 401.322 1023.7 401.322 971 464 c 0,2,3 - 877 590 877 590 812.5 602.5 c 0,4,5 - 744.95 615.59 744.95 615.59 699 592.5 c 0,6,-1 - 607.5 541.5 l 0,7,8 - 546 534 546 534 522 591 c 0,9,10 - 512.517 613.165 512.517 613.165 518.5 646.5 c 0,11,12 - 521.999 665.998 521.999 665.998 539 687 c 0,13,14 - 554.303 602.429 554.303 602.429 598 660.5 c 0,15,16 - 637.977 713.627 637.977 713.627 580 748 c 0,17,18 - 442.531 829.503 442.531 829.503 400.5 697 c 0,19,20 - 371.001 604.004 371.001 604.004 365.5 479 c 0,21,22 - 359.999 353.995 359.999 353.995 330.5 250 c 0,23,24 - 306.258 164.54 306.258 164.54 200.652 164.16 c 0,25,26 - 177.741 164.078 177.741 164.078 151 168 c 0,27,28 - 207 174 207 174 229.5 192 c 0,29,30 - 253.321 209.628 253.321 209.628 253.516 233.935 c 0,31,32 - 253.613 245.962 253.613 245.962 247.925 259.624 c 0,33,34 - 246.616 262.768 246.616 262.768 245 266 c 0,35,36 - 210.517 328.87 210.517 328.87 161 300.5 c 0,37,38 - 113.001 273.001 113.001 273.001 98.5 206.5 c 0,39,40 - 94.6267 188.736 94.6267 188.736 94.7136 170.045 c 0,41,42 - 94.9521 118.764 94.9521 118.764 125 60.5 c 0,43,44 - 165.999 -18.9998 165.999 -18.9998 307 -62 c 0,45,46 - 102 -62 102 -62 35 76.5 c 0,47,48 - 3.95718 140.67 3.95718 140.67 3.82694 205.378 c 0,49,50 - 3.72716 254.951 3.72716 254.951 21.7708 304.839 c 0,51,52 - 31.0079 330.378 31.0079 330.378 45 356 c 0,53,54 - 110.993 472.988 110.993 472.988 207.5 625.5 c 0,55,56 - 332.475 822.999 332.475 822.999 312 1096 c 0,57,58 - 312.923 1135.59 l 0,59,60 - 320.24 1195.69 320.24 1195.69 363.5 1255.5 c 0,61,62 - 399.342 1306.42 399.342 1306.42 444.631 1306.68 c 0,63,64 - 461.621 1306.78 461.621 1306.78 479.94 1299.75 c 0,65,66 - 494.548 1294.14 494.548 1294.14 510 1284 c 0,67,68 - 479.738 1283.76 l 0,69,70 - 447.266 1279 447.266 1279 427 1253.5 c 0,71,72 - 411.213 1233.8 411.213 1233.8 411.267 1214.56 c 0,73,74 - 411.319 1196.07 411.319 1196.07 426 1178 c 0,75,76 - 442.916 1157.08 442.916 1157.08 460.13 1156.77 c 0,77,78 - 475.394 1160.51 l 0,79,80 - 489.351 1167.58 489.351 1167.58 503.5 1188 c 0,81,82 - 542.995 1244.99 542.995 1244.99 580 1337 c 0,83,84 - 617 1428.99 617 1428.99 648.5 1523 c 0,85,86 - 679.997 1617 679.997 1617 703 1644 c 0,87,88 - 769 1722 769 1722 840 1714.5 c 0,89,90 - 911 1707 911 1707 911 1580 c 0,91,92 - 893.378 1613.83 893.378 1613.83 870.288 1613.88 c 0,93,94 - 860.623 1613.9 860.623 1613.9 850 1608 c 0,95,96 - 821.002 1591.01 821.002 1591.01 809 1529 c 0,97,98 - 800.755 1486.41 800.755 1486.41 800.771 1440.51 c 0,99,100 - 800.779 1419.59 800.779 1419.59 802.5 1398 c 0,101,102 - 808.001 1328.99 808.001 1328.99 832 1273 c 0,103,104 - 855.257 1218.74 855.257 1218.74 900 1215 c 0,105,106 - 936 1212 936 1212 927 1249.5 c 0,107,108 - 918 1287 918 1287 891 1320 c 0,109,110 - 949.002 1302 949.002 1302 969 1233.5 c 0,111,112 - 989 1164.99 989 1164.99 993 1080.5 c 0,113,114 - 995.825 937.374 l 0,115,116 - 995.723 924.927 995.723 924.927 995.5 912.5 c 0,117,118 - 994 829 994 829 1010 782 c 0,119,120 - 1023.01 742 1023.01 742 1098.5 638 c 0,121,122 - 1173.99 534 1173.99 534 1242.5 420 c 0,123,124 - 1311 306.016 1311 306.016 1338 208.5 c 0,125,126 - 1344.72 184.225 1344.72 184.225 1344.69 164.443 c 0,127,128 - 1344.59 104.775 1344.59 104.775 1283 86 c 0,129,130 - 1297.93 112.12 1297.93 112.12 1297.96 128.075 c 0,131,132 - 1298 152.964 1298 152.964 1261.79 153.122 c 0,133,134 - 1259 153.134 1259 153.134 1256 153 c 0,135,136 - 1228.22 152.133 1228.22 152.133 1228.3 114.634 c 0,137,138 - 1228.35 90.4386 1228.35 90.4386 1240 51 c 0,139,140 - 1280.48 -87.1799 1280.48 -87.1799 1280.48 -185.313 c 0,141,142 - 1280.48 -249.802 1280.48 -249.802 1263 -297 c 0,143,144 - 1234.55 -373.8 1234.55 -373.8 1191 -416 c 0,145,146 - 1107.92 -495.703 1107.92 -495.703 1027.5 -512.5 c 0,147,148 - 888.41 -542.467 888.41 -542.467 798 -505 c 0,149,150 - 874.226 -508.555 874.226 -508.555 927 -498 c 0,151,152 - 980.597 -487.281 980.597 -487.281 1038 -441 c 0,153,154 - 1076.94 -409.604 1076.94 -409.604 1099.5 -351.5 c 0,155,156 - 1104.33 -339.051 1104.33 -339.051 1104.24 -327.737 c 0,157,158 - 1104 -295.17 1104 -295.17 1063 -272 c 0,159,160 - 1048.68 -263.905 1048.68 -263.905 1035.82 -263.715 c 0,161,162 - 1019.54 -266.886 l 0,163,164 - 1002.14 -274.218 1002.14 -274.218 987 -300 c 0,165,166 - 975 -321 975 -321 984 -386 c 0,167,168 - 945.74 -313.824 945.74 -313.824 963 -263 c 0,169,170 - 981 -209.999 981 -209.999 1021 -191.5 c 0,171,172 - 1131.73 -140.111 1131.73 -140.111 1152 -75 c 0,173,174 - 1177.68 7.50585 1177.68 7.50585 1116 21 c 0,175,176 - 1069.64 31.1432 1069.64 31.1432 1059 18 c 0,177,178 - 1050.41 7.81504 1050.41 7.81504 1050.19 -3.31424 c 0,179,180 - 1053.95 -19.2845 l 0,181,182 - 1060.04 -32.0857 1060.04 -32.0857 1076 -46 c 0,183,184 - 1003.72 -45.1274 1003.72 -45.1274 1016 57 c 0,185,186 - 1031.7 187.605 1031.7 187.605 1031.61 272.387 c 0,187,188 - 1031.58 306.378 1031.58 306.378 1029 333 c 0,0,1 -733 888 m 0,93,94 - 763.873 888.762 l 0,95,96 - 796.902 894.015 796.902 894.015 817.5 919.5 c 0,97,98 - 846.999 955.998 846.999 955.998 852.5 997.5 c 0,99,100 - 853.215 1029.13 l 0,101,102 - 851 1049.91 851 1049.91 841 1065.5 c 0,103,104 - 822.658 1086.53 822.658 1086.53 805.386 1086.66 c 0,105,106 - 795.518 1086.74 795.518 1086.74 786 1080 c 0,107,108 - 767.953 1069.48 767.953 1069.48 767.749 1054.02 c 0,109,110 - 767.651 1046.6 767.651 1046.6 771.657 1038.05 c 0,111,112 - 773.597 1033.91 773.597 1033.91 776.5 1029.5 c 0,113,114 - 789.996 1009 789.996 1009 823 997 c 0,115,116 - 746.568 970.543 746.568 970.543 715 1020 c 0,117,118 - 700.983 1041.96 700.983 1041.96 701.047 1068.4 c 0,119,120 - 701.12 1098.54 701.12 1098.54 719.5 1134.5 c 0,121,122 - 754.648 1203.27 754.648 1203.27 717 1220 c 0,123,124 - 681 1236.01 681 1236.01 640 1190 c 0,125,126 - 598.998 1143.99 598.998 1143.99 585.5 1079.5 c 0,127,128 - 572 1015 572 1015 600.5 956 c 0,129,130 - 629 897 629 897 733 888 c 0,93,94 -EndSplineSet -KernsSLIF: 87 -208 0 0 -EndChar -StartChar: aogonek -Encoding: 261 261 80 -Width: 1218 -Flags: HW -Fore -874.65 283.05 m 0,0,1 - 870.156 341.119 870.156 341.119 825.35 394.4 c 0,2,3 - 745.449 501.501 745.449 501.501 690.625 512.125 c 0,4,5 - 669.512 516.217 669.512 516.217 650.882 516.15 c 0,6,7 - 618.846 516.035 618.846 516.035 594.15 503.625 c 0,8,-1 - 516.375 460.275 l 0,9,10 - 464.1 453.9 464.1 453.9 443.7 502.35 c 0,11,12 - 438.716 514.002 438.716 514.002 438.758 529.284 c 0,13,14 - 438.785 538.714 438.785 538.714 440.725 549.525 c 0,15,16 - 443.699 566.098 443.699 566.098 458.15 583.95 c 0,17,18 - 465.711 542.167 465.711 542.167 481.426 541.346 c 0,19,20 - 492.256 544.975 l 0,21,22 - 499.619 549.888 499.619 549.888 508.3 561.425 c 0,23,24 - 542.28 606.583 542.28 606.583 493 635.8 c 0,25,26 - 448.906 661.942 448.906 661.942 416.364 662.182 c 0,27,28 - 402.973 662.28 402.973 662.28 391.537 657.992 c 0,29,30 - 357.121 645.087 357.121 645.087 340.425 592.45 c 0,31,32 - 315.351 513.404 315.351 513.404 310.675 407.15 c 0,33,34 - 305.999 300.895 305.999 300.895 280.925 212.5 c 0,35,36 - 260.287 139.743 260.287 139.743 170.268 139.535 c 0,37,38 - 150.912 139.491 150.912 139.491 128.35 142.8 c 0,39,40 - 175.95 147.9 175.95 147.9 195.075 163.2 c 0,41,42 - 215.219 178.107 215.219 178.107 215.486 198.634 c 0,43,44 - 211.531 218.694 l 0,45,46 - 210.136 222.328 210.136 222.328 208.25 226.1 c 0,47,48 - 178.939 279.538 178.939 279.538 136.85 255.425 c 0,49,50 - 96.05 232.05 96.05 232.05 83.7246 175.525 c 0,51,52 - 80.5269 142.666 l 0,53,54 - 81.2572 99.8871 81.2572 99.8871 106.25 51.4248 c 0,55,56 - 141.1 -16.1504 141.1 -16.1504 260.95 -52.7002 c 0,57,58 - 86.7002 -52.7002 86.7002 -52.7002 29.75 65.0254 c 0,59,60 - 3.24371 119.818 3.24371 119.818 3.25233 175.071 c 0,61,62 - 3.26224 238.532 3.26224 238.532 38.25 302.6 c 0,63,64 - 94.3515 402.053 94.3515 402.053 176.375 531.675 c 0,65,66 - 267.729 676.043 267.729 676.043 267.65 867.872 c 0,67,68 - 267.637 899.106 267.637 899.106 265.2 931.6 c 0,69,70 - 266.376 968.254 l 0,71,72 - 273.284 1017.82 273.284 1017.82 308.975 1067.17 c 0,73,74 - 339.503 1110.54 339.503 1110.54 378.091 1110.68 c 0,75,76 - 403.982 1110.77 403.982 1110.77 433.5 1091.4 c 0,77,78 - 406.329 1090.97 l 0,79,80 - 379.719 1086.58 379.719 1086.58 362.95 1065.47 c 0,81,82 - 336.635 1032.64 336.635 1032.64 362.1 1001.3 c 0,83,84 - 376.748 983.182 376.748 983.182 391.659 983.246 c 0,85,86 - 409.627 983.323 409.627 983.323 427.975 1009.8 c 0,87,88 - 461.545 1058.24 461.545 1058.24 493 1136.45 c 0,89,90 - 524.45 1214.65 524.45 1214.65 551.225 1294.55 c 0,91,92 - 577.997 1374.45 577.997 1374.45 597.55 1397.4 c 0,93,94 - 648.354 1457.44 648.354 1457.44 702.637 1457.89 c 0,95,96 - 708.3 1457.93 708.3 1457.93 714 1457.33 c 0,97,98 - 774.35 1450.95 774.35 1450.95 774.35 1343 c 0,99,100 - 759.658 1371.21 759.658 1371.21 740.495 1371.79 c 0,101,102 - 725.624 1368.4 l 0,103,104 - 722.5 1366.8 l 0,105,106 - 697.852 1352.36 697.852 1352.36 687.65 1299.65 c 0,107,108 - 680.656 1263.52 680.656 1263.52 680.656 1224.58 c 0,109,110 - 680.655 1206.73 680.655 1206.73 682.125 1188.3 c 0,111,112 - 686.801 1129.64 686.801 1129.64 707.2 1082.05 c 0,113,114 - 726.976 1035.91 726.976 1035.91 765 1032.75 c 0,115,116 - 780.597 1034.61 l 0,117,118 - 789.506 1038.67 789.506 1038.67 789.48 1050.78 c 0,119,120 - 789.469 1055.75 789.469 1055.75 787.95 1062.08 c 0,121,122 - 780.302 1093.95 780.302 1093.95 757.35 1122 c 0,123,124 - 806.651 1106.7 806.651 1106.7 823.65 1048.47 c 0,125,126 - 840.518 990.703 840.518 990.703 844.05 918.425 c 0,127,128 - 847.451 846.6 847.451 846.6 846.175 775.625 c 0,129,130 - 848.559 712.944 l 0,131,132 - 851.634 684.868 851.634 684.868 858.5 664.7 c 0,133,134 - 869.551 630.7 869.551 630.7 933.725 542.3 c 0,135,136 - 997.93 453.859 997.93 453.859 1056.12 357 c 0,137,138 - 1114.35 260.1 1114.35 260.1 1137.3 177.225 c 0,139,140 - 1143.06 156.431 1143.06 156.431 1142.98 139.517 c 0,141,142 - 1142.76 89.0173 1142.76 89.0173 1090.55 73.0996 c 0,143,144 - 1103.06 94.9886 1103.06 94.9886 1103.26 108.48 c 0,145,146 - 1100.22 120.124 l 0,147,148 - 1093.75 129.824 1093.75 129.824 1073.52 130.144 c 0,149,150 - 1070.7 130.189 1070.7 130.189 1067.6 130.05 c 0,151,152 - 1043.98 129.312 1043.98 129.312 1044.05 97.4379 c 0,153,154 - 1044.09 76.8749 1044.09 76.8749 1054 43.3496 c 0,155,156 - 1088.46 -74.2999 1088.46 -74.2999 1088.41 -157.795 c 0,157,158 - 1088.37 -212.434 1088.37 -212.434 1073.55 -252.45 c 0,159,160 - 1049.17 -318.284 1049.17 -318.284 1012.35 -353.6 c 0,161,162 - 941.723 -421.348 941.723 -421.348 873.375 -435.625 c 0,163,164 - 755.148 -461.096 755.148 -461.096 678.3 -429.25 c 0,165,166 - 745.832 -428.787 l 0,167,168 - 768.723 -427.145 768.723 -427.145 787.95 -423.3 c 0,169,170 - 833.506 -414.188 833.506 -414.188 882.3 -374.85 c 0,171,172 - 915.4 -348.164 915.4 -348.164 934.575 -298.775 c 0,173,174 - 950.506 -257.74 950.506 -257.74 903.55 -231.2 c 0,175,176 - 891.257 -224.252 891.257 -224.252 880.236 -224.155 c 0,177,178 - 869.238 -224.059 869.238 -224.059 859.507 -230.783 c 0,179,180 - 848.405 -238.453 848.405 -238.453 838.95 -255 c 0,181,182 - 833.076 -265.28 833.076 -265.28 833.122 -287.966 c 0,183,184 - 833.156 -304.67 833.156 -304.67 836.4 -328.1 c 0,185,186 - 803.878 -266.751 803.878 -266.751 818.55 -223.55 c 0,187,188 - 833.851 -178.499 833.851 -178.499 867.85 -162.775 c 0,189,190 - 961.975 -119.091 961.975 -119.091 979.2 -63.75 c 0,191,192 - 1001.03 6.37995 1001.03 6.37995 948.6 17.8496 c 0,193,194 - 909.195 26.4718 909.195 26.4718 900.15 15.2998 c 0,195,196 - 892.906 6.70984 892.906 6.70984 892.667 -2.67166 c 0,197,198 - 896.39 -17.4706 l 0,199,200 - 901.706 -27.8569 901.706 -27.8569 914.6 -39.0996 c 0,201,202 - 853.165 -38.3584 853.165 -38.3584 863.6 48.4502 c 0,203,204 - 876.96 159.575 876.96 159.575 876.87 231.658 c 0,205,206 - 876.835 260.474 876.835 260.474 874.65 283.05 c 0,0,1 -623.05 754.8 m 0,93,94 - 651.68 755.862 l 0,95,96 - 678.117 760.841 678.117 760.841 694.875 781.575 c 0,97,98 - 719.949 812.598 719.949 812.598 724.625 847.875 c 0,99,100 - 724.988 876.826 l 0,101,102 - 722.85 893.204 722.85 893.204 714.85 905.675 c 0,103,104 - 699.258 923.547 699.258 923.547 684.578 923.664 c 0,105,106 - 676.19 923.731 676.19 923.731 668.1 918 c 0,107,108 - 652.852 909.109 652.852 909.109 652.589 896.07 c 0,109,110 - 656.305 881.517 l 0,111,112 - 657.846 878.384 657.846 878.384 660.025 875.075 c 0,113,114 - 671.5 857.65 671.5 857.65 699.55 847.45 c 0,115,116 - 677.045 839.66 677.045 839.66 659.116 839.612 c 0,117,118 - 625.288 839.523 625.288 839.523 607.75 867 c 0,119,120 - 595.874 885.605 595.874 885.605 595.89 907.989 c 0,121,122 - 595.907 933.67 595.907 933.67 611.575 964.325 c 0,123,124 - 625.829 992.219 625.829 992.219 625.998 1010.04 c 0,125,126 - 626.093 1020.15 626.093 1020.15 621.652 1027.02 c 0,127,128 - 617.518 1033.42 617.518 1033.42 609.45 1037 c 0,129,130 - 592.831 1040.51 l 0,131,132 - 569.558 1040.18 569.558 1040.18 544 1011.5 c 0,133,134 - 509.15 972.399 509.15 972.399 497.675 917.575 c 0,135,136 - 486.2 862.75 486.2 862.75 510.425 812.6 c 0,137,138 - 534.65 762.451 534.65 762.451 623.05 754.8 c 0,93,94 -EndSplineSet -KernsSLIF: 119 -182 0 0 -EndChar -StartChar: Cacute -Encoding: 262 262 81 -Width: 1221 -Flags: W -Fore -769 -106 m 0,0,1 - 471 -10 471 -10 308.5 95.5 c 0,2,3 - 146.001 200.999 146.001 200.999 52 521 c 0,4,5 - -21 771 -21 771 61.5 803 c 0,6,7 - 144 835 144 835 183 814 c 0,8,9 - 100 809 100 809 92 748 c 0,10,11 - 87.9999 724 87.9999 724 107 703.5 c 0,12,13 - 113.742 696.226 113.742 696.226 123.506 696.065 c 0,14,15 - 140.554 700.134 l 0,16,17 - 153.145 705.726 153.145 705.726 169 719 c 0,18,19 - 250.999 787.999 250.999 787.999 313.5 936.5 c 0,20,21 - 345.304 1012.07 345.304 1012.07 345.388 1061.87 c 0,22,23 - 345.468 1109.93 345.468 1109.93 316 1134 c 0,24,25 - 297.495 1147.88 297.495 1147.88 285.093 1147.79 c 0,26,27 - 268.004 1147.66 268.004 1147.66 262.5 1121 c 0,28,29 - 259.612 1088.31 l 0,30,31 - 260.551 1059.54 260.551 1059.54 274 1032 c 0,32,33 - 211.33 1083.77 211.33 1083.77 211.355 1131.42 c 0,34,35 - 211.358 1136.23 211.358 1136.23 212 1141 c 0,36,37 - 219 1193 219 1193 230 1211 c 0,38,39 - 257 1259 257 1259 334 1308.5 c 0,40,-1 - 490.5 1405 l 0,41,42 - 570 1451.99 570 1451.99 629 1495 c 0,43,44 - 680.531 1532.56 680.531 1532.56 680.952 1564.77 c 0,45,46 - 681.013 1569.44 681.013 1569.44 680 1574 c 0,47,48 - 673.091 1599.91 673.091 1599.91 657.729 1600.63 c 0,49,50 - 643.631 1596.94 l 0,51,52 - 637.511 1593.8 637.511 1593.8 630.5 1588 c 0,53,54 - 595.679 1559.21 595.679 1559.21 596 1532 c 0,55,56 - 592.844 1540.68 592.844 1540.68 592.879 1559.48 c 0,57,58 - 592.931 1588.32 592.931 1588.32 600.5 1641 c 0,59,60 - 613 1728 613 1728 715 1686 c 0,61,62 - 978.009 1575 978.009 1575 1049 1418 c 0,63,64 - 1076.75 1356.64 1076.75 1356.64 1076.7 1303.38 c 0,65,66 - 1076.62 1220.35 1076.62 1220.35 1009 1157 c 0,67,68 - 1022 1185.98 1022 1185.98 1029.5 1285.5 c 0,69,70 - 1028.57 1316.85 l 0,71,72 - 1021.6 1358.1 1021.6 1358.1 980.781 1358.56 c 0,73,74 - 950.888 1354.61 l 0,75,76 - 941.948 1352.41 941.948 1352.41 932 1349 c 0,77,78 - 853.592 1320.96 853.592 1320.96 853.408 1261.41 c 0,79,80 - 853.309 1229.29 853.309 1229.29 875.979 1188 c 0,81,82 - 877.205 1185.76 877.205 1185.76 878.5 1183.5 c 0,83,84 - 948 1062 948 1062 1087 1047 c 0,85,86 - 1059.4 1041.56 1059.4 1041.56 1030.84 1041.64 c 0,87,88 - 991.108 1041.74 991.108 1041.74 949.5 1052.5 c 0,89,90 - 878.012 1070.99 878.012 1070.99 860 1091 c 0,91,92 - 812 1144 812 1144 810 1175.5 c 0,93,94 - 808.001 1206.99 808.001 1206.99 786 1292 c 0,95,96 - 763 1376 763 1376 698.5 1364 c 0,97,98 - 633.992 1352 633.992 1352 569 1292.5 c 0,99,100 - 504 1232.99 504 1232.99 460.5 1151.5 c 0,101,102 - 430.805 1095.87 430.805 1095.87 430.701 1053.04 c 0,103,104 - 430.653 1033.14 430.653 1033.14 437 1016 c 0,105,106 - 454 967 454 967 502 988 c 0,107,108 - 538.099 1003.79 538.099 1003.79 538 1030.05 c 0,109,110 - 537.967 1038.71 537.967 1038.71 534 1048.5 c 0,111,112 - 517.997 1088 517.997 1088 478 1100 c 0,113,114 - 498.94 1109.19 498.94 1109.19 516.623 1109.26 c 0,115,116 - 533.557 1109.31 533.557 1109.31 547.5 1101 c 0,117,118 - 575.996 1084.01 575.996 1084.01 588 1063 c 0,119,120 - 600.251 1038.5 600.251 1038.5 600.196 1012.93 c 0,121,122 - 600.043 942.503 600.043 942.503 506.5 864 c 0,123,124 - 379 757 379 757 334 658 c 0,125,126 - 235 442 235 442 332 274 c 0,127,128 - 383.944 184.036 383.944 184.036 477.181 184.115 c 0,129,130 - 558.055 184.183 558.055 184.183 670 252 c 0,131,132 - 682.002 259.002 682.002 259.002 725.5 306.5 c 0,133,134 - 769 354 769 354 819.5 396 c 0,135,136 - 870 438 870 438 915 451 c 0,137,138 - 934.367 452.983 l 0,139,140 - 963.5 449.533 963.5 449.533 975 402 c 0,141,142 - 939 430 939 430 905 404.5 c 0,143,144 - 871 379 871 379 857.5 341.5 c 0,145,146 - 844 304 844 304 861 274 c 0,147,148 - 871.446 255.566 871.446 255.566 900.392 255.633 c 0,149,150 - 918.554 255.675 918.554 255.675 944 263 c 0,151,152 - 1110.72 309.975 1110.72 309.975 1110.72 453.253 c 0,153,154 - 1110.72 465.522 1110.72 465.522 1109.5 478.5 c 0,155,156 - 1094.01 642.999 1094.01 642.999 988 698 c 0,157,158 - 1127.99 642 1127.99 642 1145.5 504 c 0,159,160 - 1163.01 366 1163.01 366 1090 284 c 0,161,162 - 1042 228.999 1042 228.999 932.5 158 c 0,163,164 - 823 87.0005 823 87.0005 852 36 c 0,165,166 - 891 -36 891 -36 945.5 18 c 0,167,168 - 1000.01 72.0056 1000.01 72.0056 1002 120 c 0,169,170 - 1020 14 1020 14 942.5 -61.5 c 0,171,172 - 887.78 -114.807 887.78 -114.807 823.84 -115.023 c 0,173,174 - 797.219 -115.113 797.219 -115.113 769 -106 c 0,0,1 -885 1767 m 1,90,91 - 839 1752 839 1752 797 1798.5 c 0,92,93 - 754.997 1845 754.997 1845 735 1912 c 0,94,95 - 722.259 1954.69 722.259 1954.69 722.302 1997.77 c 0,96,97 - 722.326 2022.32 722.326 2022.32 726.5 2047 c 0,98,99 - 738.001 2115 738.001 2115 798 2142 c 0,100,101 - 765 2105 765 2105 766 2047.5 c 0,102,103 - 766.946 1993.17 766.946 1993.17 807.179 1992.85 c 0,104,105 - 809.523 1992.83 809.523 1992.83 812 1993 c 0,106,107 - 865.773 1996.58 865.773 1996.58 866.085 2049.52 c 0,108,109 - 866.183 2066.19 866.183 2066.19 860.977 2087.76 c 0,110,111 - 859.658 2093.22 859.658 2093.22 858 2099 c 0,112,113 - 888.014 2051.29 888.014 2051.29 888.119 2012.75 c 0,114,115 - 888.15 2001.21 888.15 2001.21 885.5 1990.5 c 0,116,117 - 873.997 1943.99 873.997 1943.99 855.5 1906 c 0,118,119 - 837.001 1868.01 837.001 1868.01 833 1835 c 0,120,121 - 834.75 1818.37 l 0,122,123 - 843.001 1793.25 843.001 1793.25 885 1767 c 1,90,91 -EndSplineSet -EndChar -StartChar: cacute -Encoding: 263 263 82 -Width: 1053 -Flags: W -Fore -667 50 m 0,0,1 - 414.002 130.999 414.002 130.999 276 221.5 c 0,2,3 - 138 312 138 312 58 584 c 0,4,5 - -3.99995 797 -3.99995 797 66 824 c 0,6,7 - 136.001 851 136.001 851 169 833 c 0,8,9 - 98.9995 830 98.9995 830 91 777 c 0,10,11 - 88 756 88 756 104.5 739 c 0,12,13 - 110.314 733.01 110.314 733.01 118.55 732.979 c 0,14,15 - 133.686 732.924 133.686 732.924 157 753 c 0,16,17 - 226 811 226 811 279.5 937 c 0,18,19 - 333 1063 333 1063 282 1105 c 0,20,21 - 245 1133.99 245 1133.99 237 1094.5 c 0,22,23 - 234.565 1064.17 l 0,24,25 - 235.643 1040.93 235.643 1040.93 246 1019 c 0,26,27 - 193.643 1062.33 193.643 1062.33 193.438 1102.81 c 0,28,29 - 193.416 1107.17 193.416 1107.17 194 1111.5 c 0,30,31 - 199.999 1156 199.999 1156 209 1171 c 0,32,33 - 231.999 1211.01 231.999 1211.01 297.5 1253.5 c 0,34,-1 - 430.5 1336 l 0,35,36 - 498 1376.01 498 1376.01 548 1412.5 c 0,37,38 - 591.233 1444.06 591.233 1444.06 591.851 1470.76 c 0,39,40 - 591.947 1474.94 591.947 1474.94 591 1479 c 0,41,42 - 581 1516.99 581 1516.99 549 1491 c 0,43,44 - 519.723 1467.22 519.723 1467.22 520 1444 c 0,45,46 - 517.162 1451.3 517.162 1451.3 517.2 1467.88 c 0,47,48 - 517.257 1492.2 517.257 1492.2 523.5 1536.5 c 0,49,50 - 530.554 1586.55 530.554 1586.55 572.133 1586.73 c 0,51,52 - 592.446 1586.82 592.446 1586.82 621 1575 c 0,53,54 - 843.999 1481 843.999 1481 905 1347 c 0,55,56 - 928.906 1294.49 928.906 1294.49 928.852 1249.04 c 0,57,58 - 928.771 1179.09 928.771 1179.09 871 1125 c 0,59,60 - 882.999 1149 882.999 1149 888.5 1233.5 c 0,61,62 - 886.96 1262.72 l 0,63,64 - 879.922 1295.56 879.922 1295.56 846.301 1295.86 c 0,65,66 - 818.321 1291.76 l 0,67,68 - 812.409 1290.18 812.409 1290.18 806 1288 c 0,69,70 - 739.114 1264.43 739.114 1264.43 738.776 1213.88 c 0,71,72 - 738.677 1198.96 738.677 1198.96 744.373 1181.69 c 0,73,74 - 749.675 1165.61 749.675 1165.61 760 1147.5 c 0,75,76 - 818.997 1044.01 818.997 1044.01 937 1031 c 0,77,78 - 914.022 1026.49 914.022 1026.49 890.21 1026.52 c 0,79,80 - 855.966 1026.56 855.966 1026.56 820 1036 c 0,81,82 - 759 1052.01 759 1052.01 744 1069 c 0,83,84 - 703 1114 703 1114 701.5 1140.5 c 0,85,86 - 700 1167 700 1167 682 1239 c 0,87,88 - 662 1311 662 1311 607 1300.5 c 0,89,90 - 552.008 1290 552.008 1290 497 1240 c 0,91,92 - 442.012 1190.02 442.012 1190.02 405 1120.5 c 0,93,94 - 379.853 1073.27 379.853 1073.27 379.65 1036.89 c 0,95,96 - 379.554 1019.74 379.554 1019.74 385 1005 c 0,97,98 - 394.672 975.982 394.672 975.982 417.234 975.605 c 0,99,100 - 436.705 979.633 l 0,101,102 - 438.331 980.267 438.331 980.267 440 981 c 0,103,104 - 470 994.5 470 994.5 470.188 1017 c 0,105,106 - 470.25 1024.5 470.25 1024.5 467 1033 c 0,107,108 - 454.002 1067 454.002 1067 419 1076 c 0,109,110 - 436.939 1083.69 436.939 1083.69 452.123 1083.76 c 0,111,112 - 466.558 1083.82 466.558 1083.82 478.5 1077 c 0,113,114 - 502.995 1063.01 502.995 1063.01 513 1045 c 0,115,116 - 552 967 552 967 444 876 c 0,117,118 - 336 785 336 785 297 701 c 0,119,120 - 213 518 213 518 295.5 374.5 c 0,121,122 - 339.547 297.884 339.547 297.884 418.515 297.806 c 0,123,124 - 487.451 297.739 487.451 297.739 583 356 c 0,125,126 - 592.998 361.999 592.998 361.999 630 402.5 c 0,127,128 - 667.002 443.001 667.002 443.001 710 478.5 c 0,129,130 - 753 514 753 514 791.5 524.5 c 0,131,132 - 830 535 830 535 842 483 c 0,133,134 - 812 506 812 506 783 484.5 c 0,135,136 - 754.001 463.001 754.001 463.001 742.5 431 c 0,137,138 - 737.254 416.404 737.254 416.404 737.314 403.264 c 0,139,140 - 737.386 387.597 737.386 387.597 745 374 c 0,141,142 - 759 349 759 349 816 365 c 0,143,144 - 969 407 969 407 956 547.5 c 0,145,146 - 943 688 943 688 853 735 c 0,147,148 - 972.001 687 972.001 687 987.5 569.5 c 0,149,150 - 1003 452 1003 452 940 382 c 0,151,152 - 898 336 898 336 806 275.5 c 0,153,154 - 714 215.001 714 215.001 738 172 c 0,155,156 - 771 109 771 109 817 156 c 0,157,158 - 863 202.999 863 202.999 865 244 c 0,159,160 - 880 152.999 880 152.999 814 88 c 0,161,162 - 748 23 748 23 667 50 c 0,0,1 -766 1644 m 1,90,91 - 727 1630.01 727 1630.01 691 1669.5 c 0,92,93 - 655.004 1708.99 655.004 1708.99 638.5 1766.5 c 0,94,95 - 628.026 1803 628.026 1803 628.029 1839.5 c 0,96,97 - 628.031 1860.5 628.031 1860.5 631.5 1881.5 c 0,98,99 - 641.001 1939.01 641.001 1939.01 692 1962 c 0,100,101 - 664.696 1930.8 664.696 1930.8 664.5 1881.5 c 0,102,103 - 664.967 1836.2 664.967 1836.2 699.025 1835.83 c 0,104,105 - 701.429 1835.8 701.429 1835.8 704 1836 c 0,106,107 - 749.303 1838.88 749.303 1838.88 749.618 1883.64 c 0,108,109 - 749.718 1897.74 749.718 1897.74 745.351 1916 c 0,110,111 - 744.304 1920.38 744.304 1920.38 743 1925 c 0,112,113 - 768.109 1884.68 768.109 1884.68 768.324 1852.45 c 0,114,115 - 768.391 1842.33 768.391 1842.33 766 1833 c 0,116,117 - 756.002 1794.01 756.002 1794.01 740.5 1761.5 c 0,118,119 - 725.516 1730.08 725.516 1730.08 721.5 1701.5 c 0,120,121 - 723.355 1686.49 l 0,122,123 - 730.94 1665.91 730.94 1665.91 766 1644 c 1,90,91 -EndSplineSet -EndChar -StartChar: Eogonek -Encoding: 280 280 83 -Width: 1514 -Flags: HMW -HStem: -25.5 188.5<428 1169.5> 701.5 157<313.5 758.5> 1353 218<196 987> -VStem: 82 215<-28 1037> 585 218.5<-320.5 -47> -Fore -500 -334 m 132,-1,0 - 530 -270.001 530 -270.001 573 -221 c 0,1,2 - 616.001 -171.999 616.001 -171.999 637 -132 c 0,3,4 - 658 -91.9995 658 -91.9995 585 -47 c 0,5,6 - 556 -29 556 -29 469.5 -23 c 0,7,8 - 383 -17 383 -17 297 -28 c 0,9,10 - 211 -39 211 -39 155.5 -70.5 c 0,11,12 - 100 -102 100 -102 133 -159 c 0,13,14 - 154 -195.001 154 -195.001 230 -206 c 0,15,16 - 203.189 -212.105 203.189 -212.105 180.923 -212.01 c 0,17,18 - 119.311 -211.745 119.311 -211.745 92.5 -164 c 0,19,20 - 56.0001 -99.0005 56.0001 -99.0005 53 -3.5 c 0,21,22 - 50 92 50 92 65 190 c 0,23,24 - 80 288 80 288 82 330 c 0,25,26 - 83.3538 453.119 l 0,27,28 - 81.2241 552.794 81.2241 552.794 68.5 649 c 0,29,30 - 48 804 48 804 12 960 c 0,31,32 - 0 1020 0 1020 8.5 1078.5 c 0,33,34 - 17 1137 17 1137 83 1158 c 0,35,36 - 45 1137 45 1137 38 1069.5 c 0,37,38 - 38.125 1042.16 l 0,39,40 - 41.0576 1025.78 41.0576 1025.78 52.8586 1025.08 c 0,41,42 - 68.1897 1028.89 l 0,43,44 - 74.4608 1031.83 74.4608 1031.83 82 1037 c 0,45,46 - 149.999 1082 149.999 1082 190.5 1236.5 c 0,47,48 - 206.042 1295.79 206.042 1295.79 206.047 1335.86 c 0,49,50 - 206.056 1400.21 206.056 1400.21 166 1415 c 0,51,52 - 79 1445 79 1445 58 1386.5 c 0,53,54 - 37 1328 37 1328 52 1256 c 0,55,56 - 11.599 1313.04 11.599 1313.04 11.6157 1374.49 c 0,57,58 - 11.6272 1416.47 11.6272 1416.47 30.5 1460.5 c 0,59,60 - 77.0044 1569.01 77.0044 1569.01 196 1571 c 0,61,62 - 295 1572.01 295 1572.01 408.5 1527.5 c 0,63,64 - 462.924 1506.16 462.924 1506.16 512.867 1506.09 c 0,65,66 - 567.073 1506.02 567.073 1506.02 616 1531 c 0,67,68 - 632.022 1539.01 632.022 1539.01 754 1572 c 0,69,70 - 876.019 1605.01 876.019 1605.01 1026.5 1607 c 0,71,72 - 1102.39 1604.14 l 0,73,74 - 1212.74 1594.25 1212.74 1594.25 1317.5 1551 c 0,75,76 - 1458.01 1492.99 1458.01 1492.99 1511 1320 c 0,77,78 - 1461 1392 1461 1392 1429.5 1422.5 c 0,79,80 - 1397.99 1453 1397.99 1453 1350 1474 c 0,81,82 - 1328.96 1482.01 1328.96 1482.01 1257.5 1498.5 c 0,83,84 - 1185.99 1515 1185.99 1515 1115 1513.5 c 0,85,86 - 1043.99 1512 1043.99 1512 999 1478 c 0,87,88 - 973.44 1458.69 973.44 1458.69 973.045 1420.99 c 0,89,90 - 977.026 1386.64 l 0,91,92 - 980.5 1370.93 980.5 1370.93 987 1353 c 0,93,94 - 1002 1309.01 1002 1309.01 1053 1329 c 0,95,96 - 1104 1348.99 1104 1348.99 1119 1395 c 0,97,98 - 1116 1316 1116 1316 1076 1295 c 0,99,100 - 1046.63 1279.59 1046.63 1279.59 1009.73 1279.53 c 0,101,102 - 996.362 1279.51 996.362 1279.51 982 1281.5 c 0,103,104 - 928.02 1289 928.02 1289 872.5 1310.5 c 0,105,106 - 816.976 1332 816.976 1332 783 1338 c 0,107,108 - 724.708 1347.93 724.708 1347.93 671.147 1347.88 c 0,109,110 - 514.287 1347.73 514.287 1347.73 398 1262 c 0,111,112 - 281.569 1176.17 281.569 1176.17 281.56 1027.39 c 0,113,114 - 281.557 976.831 281.557 976.831 295 919 c 0,115,116 - 312.784 837.568 312.784 837.568 406.788 837.613 c 0,117,118 - 413.215 837.616 413.215 837.616 420 838 c 0,119,120 - 526 844 526 844 481 923 c 0,121,122 - 453 971 453 971 418 937 c 0,123,124 - 383 903 383 903 391 882 c 0,125,126 - 387.648 921.385 l 0,127,128 - 389.057 996.13 389.057 996.13 462.658 996.742 c 0,129,130 - 470.653 996.808 470.653 996.808 479.5 996 c 0,131,132 - 589.005 985.999 589.005 985.999 678 958 c 0,133,134 - 716 946 716 946 799.5 969 c 0,135,136 - 845.412 981.646 845.412 981.646 887.847 981.595 c 0,137,138 - 922.589 981.553 922.589 981.553 955 973 c 0,139,140 - 1018.01 954.998 1018.01 954.998 1056 886 c 0,141,142 - 1093.99 817 1093.99 817 1026 698 c 0,143,144 - 1060.99 815 1060.99 815 1008 860.5 c 0,145,146 - 958.847 902.697 958.847 902.697 894.212 902.75 c 0,147,148 - 889.153 902.754 889.153 902.754 884 902.5 c 0,149,150 - 813 899 813 899 758.5 858.5 c 0,151,152 - 704 818 704 818 737 763 c 0,153,154 - 743 753 743 753 781.5 754.5 c 0,155,156 - 820 756 820 756 808 801 c 0,157,158 - 856 777 856 777 837.5 748 c 0,159,160 - 819 719 819 719 798 709 c 0,161,162 - 733.814 680.116 733.814 680.116 661.903 680.2 c 0,163,164 - 644.186 680.221 644.186 680.221 626 682 c 0,165,166 - 534 691 534 691 453 701.5 c 0,167,168 - 372 712 372 712 313.5 701.5 c 0,169,170 - 255 691 255 691 245 615 c 0,171,172 - 236.91 558.37 236.91 558.37 236.919 518.43 c 0,173,174 - 236.932 459.629 236.932 459.629 254.5 437 c 0,175,176 - 284 399 284 399 314 408 c 0,177,178 - 344 417 344 417 349 445.5 c 0,179,180 - 347.674 456.176 l 0,181,182 - 340.847 469.073 340.847 469.073 305.92 469.043 c 0,183,184 - 296.076 469.035 296.076 469.035 284 468 c 0,185,186 - 294.001 486 294.001 486 322 487.5 c 0,187,188 - 350 489 350 489 361 486 c 0,189,190 - 428 463 428 463 423.5 394.5 c 0,191,192 - 419 326.002 419 326.002 411.5 262 c 0,193,194 - 404 197.999 404 197.999 428 163 c 0,195,196 - 452 128.001 452 128.001 577 172 c 0,197,198 - 622.009 187.003 622.009 187.003 761.5 242 c 0,199,200 - 901 297 901 297 925 216 c 0,201,202 - 903.999 228.001 903.999 228.001 882 228.5 c 0,203,204 - 866.839 226.005 l 0,205,206 - 859.566 222.478 859.566 222.478 859 214 c 0,207,208 - 860.873 195.111 l 0,209,210 - 873.894 153.483 873.894 153.483 969.23 153.319 c 0,211,212 - 975.913 153.308 975.913 153.308 983 153.5 c 0,213,214 - 1111.99 156.999 1111.99 156.999 1122 226 c 0,215,216 - 1121.24 242.091 l 0,217,218 - 1117.86 253.528 1117.86 253.528 1104.73 253.833 c 0,219,220 - 1091.5 252 l 0,221,222 - 1056.99 242.999 1056.99 242.999 1043 213 c 0,223,224 - 1059.01 279 1059.01 279 1095.5 286.5 c 0,225,226 - 1131.99 294 1131.99 294 1173.5 277.5 c 0,227,228 - 1214.99 261.005 1214.99 261.005 1255.5 236 c 0,229,230 - 1296 210.999 1296 210.999 1320 212 c 0,231,232 - 1442.73 214.707 1442.73 214.707 1443.3 346.089 c 0,233,234 - 1443.37 360.293 1443.37 360.293 1442 376 c 0,235,236 - 1499 268 1499 268 1409 178 c 0,237,238 - 1319 88 1319 88 1184 43 c 0,239,240 - 1148.59 31.1974 1148.59 31.1974 1148.41 11.023 c 0,241,242 - 1148.31 0.467999 1148.31 0.467999 1157.85 -12.3787 c 0,243,244 - 1162.52 -18.6647 1162.52 -18.6647 1169.5 -25.5 c 0,245,246 - 1187.51 -43.1428 1187.51 -43.1428 1204.22 -43.058 c 0,247,248 - 1232.49 -42.9144 1232.49 -42.9144 1257 8 c 0,249,250 - 1255.01 -59.9961 1255.01 -59.9961 1220 -73.5 c 0,251,252 - 1185.01 -87 1185.01 -87 1139 -76.5 c 0,253,254 - 1092.99 -66 1092.99 -66 1049 -46.5 c 0,255,256 - 1009.26 -28.8871 1009.26 -28.8871 987 -29 c 0,257,258 - 934 -34 934 -34 850.5 -63.5 c 0,259,260 - 767 -93.0001 767 -93.0001 776 -225 c 0,261,262 - 778.351 -264.189 778.351 -264.189 799.132 -264.677 c 0,263,264 - 812 -262 l 0,265,266 - 845 -248.999 845 -248.999 863 -195 c 0,267,268 - 858 -305.999 858 -305.999 803.5 -320.5 c 0,269,270 - 749 -335 749 -335 686.5 -332.5 c 0,271,272 - 636.585 -334.226 l 0,273,274 - 602.996 -338.11 602.996 -338.11 573.5 -349.5 c 0,275,276 - 523 -369 523 -369 526 -491 c 0,277,278 - 470 -398 470 -398 500 -334 c 132,-1,0 -EndSplineSet -EndChar -StartChar: eogonek -Encoding: 281 281 84 -Width: 1305 -Flags: HMW -HStem: 148 160.5<389.5 1019.5> 766 133.5<291.5 670> 1320.5 185<192 865> -VStem: 96 182<145 1051.5> 523 185.5<-102 129.5> -Fore -451 -113 m 132,-1,0 - 476 -58.5001 476 -58.5001 512.5 -17 c 0,1,2 - 549 24.5 549 24.5 566.5 58 c 0,3,4 - 570.294 65.2622 570.294 65.2622 570.398 72.736 c 0,5,6 - 566.895 87.9464 l 0,7,8 - 557.508 108.003 557.508 108.003 523 129.5 c 0,9,10 - 497.999 144.501 497.999 144.501 424.5 149.5 c 0,11,12 - 351 154.499 351 154.499 278 145 c 0,13,14 - 205.003 135.501 205.003 135.501 157.5 109.5 c 0,15,16 - 109.999 83.5001 109.999 83.5001 138 35.5 c 0,17,18 - 156 5.50008 156 5.50008 221 -4.5 c 0,19,20 - 135.001 -23.5 135.001 -23.5 104 31.5 c 0,21,22 - 72.9999 86.5001 72.9999 86.5001 70.5 167.5 c 0,23,24 - 67.9999 248.5 67.9999 248.5 81 331.5 c 0,25,26 - 94.0001 414.5 94.0001 414.5 96 450.5 c 0,27,28 - 102 589.5 102 589.5 84 721.5 c 0,29,30 - 66 853.5 66 853.5 36 985.5 c 0,31,32 - 28.6337 1016.81 28.6337 1016.81 28.6154 1047.74 c 0,33,34 - 28.604 1067.2 28.604 1067.2 31.5 1086.5 c 0,35,36 - 39.0008 1136.5 39.0008 1136.5 96 1154.5 c 0,37,38 - 63 1136.5 63 1136.5 57.5 1079.5 c 0,39,40 - 58.1818 1054.81 l 0,41,42 - 61.2307 1042.02 61.2307 1042.02 71.4697 1041.73 c 0,43,44 - 86.6965 1046.05 l 0,45,46 - 91.0331 1048.23 91.0331 1048.23 96 1051.5 c 0,47,48 - 152.998 1090.5 152.998 1090.5 187 1221.5 c 0,49,50 - 200.06 1271.82 200.06 1271.82 200.136 1305.76 c 0,51,52 - 200.234 1349.58 200.234 1349.58 178.69 1366.1 c 0,53,54 - 173.478 1370.1 173.478 1370.1 167 1372.5 c 0,55,56 - 141.459 1381.35 141.459 1381.35 122.587 1381.45 c 0,57,58 - 103.52 1381.55 103.52 1381.55 91.2603 1372.71 c 0,59,60 - 80.0198 1364.61 80.0198 1364.61 74.5 1349 c 0,61,62 - 64.4434 1320.55 64.4434 1320.55 64.459 1288.31 c 0,63,64 - 64.4706 1264.45 64.4706 1264.45 70 1238.5 c 0,65,66 - 35.4682 1286.73 35.4682 1286.73 35.4975 1338.85 c 0,67,68 - 35.5174 1374.28 35.5174 1374.28 51.5 1411.5 c 0,69,70 - 91.0043 1503.51 91.0043 1503.51 192 1505.5 c 0,71,72 - 276 1505.5 276 1505.5 372.5 1468 c 0,73,74 - 418.698 1450.05 418.698 1450.05 461.118 1450.09 c 0,75,76 - 507.299 1450.13 507.299 1450.13 549 1471.5 c 0,77,78 - 561.963 1478.48 561.963 1478.48 666 1506.5 c 0,79,80 - 769.98 1534.5 769.98 1534.5 898 1536 c 0,81,82 - 968.2 1532.96 l 0,83,84 - 1059.08 1523.94 1059.08 1523.94 1145.5 1488.5 c 0,85,86 - 1265 1439.5 1265 1439.5 1310 1291.5 c 0,87,88 - 1267.99 1352.52 1267.99 1352.52 1241.5 1378.5 c 0,89,90 - 1214.98 1404.51 1214.98 1404.51 1173 1422.5 c 0,91,92 - 1155.08 1429.48 1155.08 1429.48 1094.5 1444 c 0,93,94 - 1039.52 1457.18 1039.52 1457.18 984.499 1457.14 c 0,95,96 - 979.002 1457.14 979.002 1457.14 973.5 1457 c 0,97,98 - 912.999 1455.5 912.999 1455.5 875 1427 c 0,99,100 - 853.056 1410.54 853.056 1410.54 853.121 1377.58 c 0,101,102 - 853.169 1353.46 853.169 1353.46 865 1320.5 c 0,103,104 - 873.107 1295.5 873.107 1295.5 895.597 1295.15 c 0,105,106 - 917.149 1299.25 l 0,107,108 - 918.801 1299.84 918.801 1299.84 920.5 1300.5 c 0,109,110 - 963.998 1317.49 963.998 1317.49 976 1356.5 c 0,111,112 - 972.121 1252.54 972.121 1252.54 904.433 1251.81 c 0,113,114 - 874.102 1255.82 l 0,115,116 - 867.279 1257.54 867.279 1257.54 860 1260 c 0,117,118 - 749.03 1297.49 749.03 1297.49 691 1307.5 c 0,119,120 - 496 1340.5 496 1340.5 363.5 1243 c 0,121,122 - 231 1145.5 231 1145.5 276 950.5 c 0,123,124 - 290.949 882.298 290.949 882.298 370.925 882.18 c 0,125,126 - 376.552 882.171 376.552 882.171 382.5 882.5 c 0,127,128 - 445.726 885.993 445.726 885.993 445.745 920.236 c 0,129,130 - 445.753 935.007 445.753 935.007 434 955.5 c 0,131,132 - 410 994.5 410 994.5 380.5 966.5 c 0,133,134 - 351 938.5 351 938.5 358 920.5 c 0,135,136 - 355.178 956.588 l 0,137,138 - 357.557 1016.96 357.557 1016.96 418.311 1017.63 c 0,139,140 - 425.273 1017.71 425.273 1017.71 433 1017 c 0,141,142 - 526.022 1008.49 526.022 1008.49 602 984.5 c 0,143,144 - 613.184 981.005 613.184 981.005 629.133 981.052 c 0,145,146 - 658.816 981.14 658.816 981.14 705 993.5 c 0,147,148 - 776 1012.51 776 1012.51 837 996.5 c 0,149,150 - 891 981.5 891 981.5 923 923 c 0,151,152 - 955 864.5 955 864.5 898 763.5 c 0,153,154 - 909.411 802.85 909.411 802.85 909.365 832.678 c 0,155,156 - 909.292 878.65 909.292 878.65 882 902 c 0,157,158 - 837 940.5 837 940.5 776.5 937.5 c 0,159,160 - 716 934.5 716 934.5 670 899.5 c 0,161,162 - 624 864.5 624 864.5 652 818.5 c 0,163,164 - 657 809.5 657 809.5 689.5 810.5 c 0,165,166 - 722 811.5 722 811.5 712 850.5 c 0,167,168 - 741.022 836.343 741.022 836.343 741.734 819.93 c 0,169,170 - 738.701 808.047 l 0,171,172 - 738.15 807.027 738.15 807.027 737.5 806 c 0,173,174 - 722 781.499 722 781.499 704 773.5 c 0,175,176 - 649.462 748.636 649.462 748.636 588.167 748.539 c 0,177,178 - 573.039 748.515 573.039 748.515 557.5 750 c 0,179,180 - 479 757.5 479 757.5 410 766.5 c 0,181,182 - 341 775.5 341 775.5 291.5 766 c 0,183,184 - 242 756.5 242 756.5 233 692.5 c 0,185,186 - 226.133 644.427 226.133 644.427 226.201 610.552 c 0,187,188 - 226.301 560.572 226.301 560.572 241.5 541.5 c 0,189,190 - 267 509.5 267 509.5 292.5 517 c 0,191,192 - 318 524.5 318 524.5 322 548.5 c 0,193,194 - 320.371 558.225 l 0,195,196 - 313.925 568.374 313.925 568.374 285.403 568.362 c 0,197,198 - 277.13 568.358 277.13 568.358 267 567.5 c 0,199,200 - 276 582.5 276 582.5 299.5 584.5 c 0,201,202 - 323 586.5 323 586.5 332 583.5 c 0,203,204 - 389 563.5 389 563.5 385.5 505.5 c 0,205,206 - 382.001 447.516 382.001 447.516 375.5 393 c 0,207,208 - 374.494 354.701 l 0,209,210 - 376.885 326.961 376.885 326.961 389.5 308.5 c 0,211,212 - 398.494 295.338 398.494 295.338 423.946 295.265 c 0,213,214 - 456.506 295.172 456.506 295.172 516 316.5 c 0,215,216 - 555 329.5 555 329.5 673.5 376 c 0,217,218 - 792 422.5 792 422.5 812 353.5 c 0,219,220 - 794.002 363.499 794.002 363.499 775 364.5 c 0,221,222 - 762.368 362.683 l 0,223,224 - 756 359.605 756 359.605 756 351.5 c 0,225,226 - 752 297.5 752 297.5 861 300.5 c 0,227,228 - 970 303.5 970 303.5 979 361.5 c 0,229,230 - 983 391.5 983 391.5 953.5 384.5 c 0,231,232 - 924 377.5 924 377.5 912 351.5 c 0,233,234 - 940 462.5 940 462.5 1023 406 c 0,235,236 - 1104.66 350.411 1104.66 350.411 1147 350.5 c 0,237,238 - 1251.4 352.3 1251.4 352.3 1252.12 464.26 c 0,239,240 - 1252.2 476.7 1252.2 476.7 1251 490.5 c 0,241,242 - 1269.94 454.563 1269.94 454.563 1270.06 421.088 c 0,243,244 - 1270.15 393.428 1270.15 393.428 1257.4 367.45 c 0,245,246 - 1245.66 343.511 1245.66 343.511 1223 321 c 0,247,248 - 1146.01 244.502 1146.01 244.502 1032 206.5 c 0,249,250 - 978 188.5 978 188.5 1019.5 148 c 0,251,252 - 1034.82 133.05 1034.82 133.05 1048.98 133.021 c 0,253,254 - 1073.18 132.97 1073.18 132.97 1094 176.5 c 0,255,256 - 1092.56 92.98 1092.56 92.98 1041.35 92.1448 c 0,257,258 - 1015.84 95.942 l 0,259,260 - 1005.59 98.8556 1005.59 98.8556 994 104 c 0,261,262 - 896 147.5 896 147.5 865 144.5 c 0,263,264 - 820 139.501 820 139.501 749 114.5 c 0,265,266 - 684.311 91.7219 684.311 91.7219 684.372 -1.61601 c 0,267,268 - 684.378 -10.7222 684.378 -10.7222 685 -20.5 c 0,269,270 - 688 -62.5 688 -62.5 716 -52 c 0,271,272 - 744 -41.5 744 -41.5 759 4.5 c 0,273,274 - 755 -89.5 755 -89.5 708.5 -102 c 0,275,276 - 662 -114.499 662 -114.499 609 -112.5 c 0,277,278 - 556 -110.501 556 -110.501 513 -127 c 0,279,280 - 472.855 -142.404 472.855 -142.404 472.804 -234.077 c 0,281,282 - 472.801 -240.595 472.801 -240.595 473 -247.5 c 0,283,284 - 442.424 -195.455 442.424 -195.455 442.32 -154.203 c 0,285,286 - 442.264 -132.044 442.264 -132.044 451 -113 c 132,-1,0 -EndSplineSet -EndChar -StartChar: Lslash -Encoding: 321 321 85 -Width: 1737 -Flags: HMW -HStem: 8 320<774 1387> -VStem: 583 159<31.5 1459> -Fore -687 1538 m 1,0,1 - 655 1514 655 1514 655.5 1490 c 0,2,3 - 656 1465.99 656 1465.99 694 1464 c 0,4,5 - 708.349 1466.74 l 0,6,7 - 744.986 1483.48 744.986 1483.48 776 1600 c 0,8,9 - 786.895 1640.93 786.895 1640.93 786.865 1673.36 c 0,10,11 - 786.795 1751.08 786.795 1751.08 724 1780 c 0,12,13 - 790 1796.01 790 1796.01 821 1709.5 c 0,14,15 - 841.964 1651 841.964 1651 841.891 1584.05 c 0,16,17 - 841.856 1551.99 841.856 1551.99 837 1518 c 0,18,19 - 828.998 1467.99 828.998 1467.99 808.5 1382.5 c 0,20,21 - 788 1297 788 1297 775 1212 c 0,22,23 - 762 1126.99 762 1126.99 768 1062 c 0,24,25 - 774 996.999 774 996.999 820 989 c 0,26,27 - 877 977 877 977 952 1030 c 0,28,29 - 1000.71 1064.42 1000.71 1064.42 1001.33 1095.05 c 0,30,31 - 997.749 1112.28 l 0,32,33 - 994.418 1119.76 994.418 1119.76 988 1127 c 0,34,35 - 949 1170.01 949 1170.01 921.5 1131.5 c 0,36,37 - 893.998 1092.99 893.998 1092.99 880 1058 c 0,38,39 - 883 1167.99 883 1167.99 947.5 1188.5 c 0,40,41 - 1011.96 1208.99 1011.96 1208.99 1098.5 1213 c 0,42,43 - 1185.01 1217.01 1185.01 1217.01 1273 1242.5 c 0,44,45 - 1361 1268 1361 1268 1412 1389 c 0,46,47 - 1401.99 1282.99 1401.99 1282.99 1351 1231.5 c 0,48,49 - 1300.01 1180.01 1300.01 1180.01 1239.5 1144.5 c 0,50,51 - 1178.91 1108.94 1178.91 1108.94 1124.5 1070 c 0,52,53 - 1070.01 1031 1070.01 1031 1054 951 c 0,54,55 - 1048 927 1048 927 1070.5 924.5 c 0,56,57 - 1095.88 925.692 l 0,58,59 - 1107.45 927.889 1107.45 927.889 1120 933 c 0,60,61 - 1158 947.001 1158 947.001 1158 999 c 0,62,63 - 1201.99 920 1201.99 920 1156.5 883.5 c 0,64,65 - 1111.01 847.004 1111.01 847.004 1037 831 c 0,66,67 - 963 815 963 815 889.5 808.5 c 0,68,69 - 816 802 816 802 804 783 c 0,70,71 - 744 693 744 693 729 563 c 0,72,73 - 714 433 714 433 774 328 c 0,74,75 - 837 215.001 837 215.001 958 230.5 c 0,76,77 - 1078.99 245.997 1078.99 245.997 1204.5 286 c 0,78,79 - 1330.01 326.002 1330.01 326.002 1433 337 c 0,80,81 - 1465.48 336.915 l 0,82,83 - 1540.7 327.344 1540.7 327.344 1564 225 c 0,84,85 - 1540 267.001 1540 267.001 1489.5 277 c 0,86,87 - 1438.99 287 1438.99 287 1419 266 c 0,88,89 - 1353 195.001 1353 195.001 1416 150.5 c 0,90,91 - 1464.57 116.195 1464.57 116.195 1534.23 116.061 c 0,92,93 - 1554.93 116.022 1554.93 116.022 1577.5 119 c 0,94,95 - 1676 132 1676 132 1764.5 216 c 0,96,97 - 1853 300 1853 300 1838 486 c 0,98,99 - 1857.76 416.141 1857.76 416.141 1857.67 356.651 c 0,100,101 - 1857.47 208.36 1857.47 208.36 1734 124.5 c 0,102,103 - 1562.5 8.01583 1562.5 8.01583 1387 8 c 0,104,105 - 1300.01 8 1300.01 8 1176 51.5 c 0,106,107 - 1051.99 95 1051.99 95 1035 3 c 0,108,109 - 1033.55 -20.8143 l 0,110,111 - 1037.84 -57.1116 1037.84 -57.1116 1089.5 -57.5 c 0,112,113 - 1155.99 -58 1155.99 -58 1196 -13 c 0,114,115 - 1155.11 -117.502 1155.11 -117.502 1089.03 -117.958 c 0,116,117 - 1082.39 -118.004 1082.39 -118.004 1075.5 -117 c 0,118,119 - 1000 -106 1000 -106 914.5 -57.5 c 0,120,121 - 829 -9.00005 829 -9.00005 742 31.5 c 0,122,123 - 655 72 655 72 587 17 c 0,124,125 - 496 -56.0001 496 -56.0001 575 -133 c 0,126,127 - 650.982 -207.057 650.982 -207.057 726.037 -207.112 c 0,128,129 - 729.019 -207.115 729.019 -207.115 732 -207 c 0,130,131 - 685.805 -218.957 685.805 -218.957 649.06 -218.951 c 0,132,133 - 618.756 -218.946 618.756 -218.946 594 -210.5 c 0,134,135 - 541 -192 541 -192 496 -135 c 0,136,137 - 445 -70.0001 445 -70.0001 467 29 c 0,138,139 - 489.002 128.007 489.002 128.007 524.5 231 c 0,140,141 - 560 334 560 334 578.5 424.5 c 0,142,143 - 583.04 446.711 583.04 446.711 582.973 466.241 c 0,144,145 - 582.766 526.289 582.766 526.289 539 561 c 0,146,147 - 488 600 488 600 440 572.5 c 0,148,149 - 392 545 392 545 343 505 c 0,150,151 - 293.999 464.999 293.999 464.999 242 439.5 c 0,152,153 - 222.917 430.142 222.917 430.142 203.161 430.009 c 0,154,155 - 188.511 429.911 188.511 429.911 173.491 434.885 c 0,156,157 - 153.571 441.481 153.571 441.481 133 457 c 0,158,159 - 239.999 453 239.999 453 251.5 513 c 0,160,161 - 254.696 548.121 l 0,162,163 - 253.566 580.482 253.566 580.482 234 596 c 0,164,165 - 171 642 171 642 127.5 606 c 0,166,167 - 84 570 84 570 66.5 503.5 c 0,168,169 - 49 437 49 437 61 365.5 c 0,170,171 - 72.9998 294.001 72.9998 294.001 121 269 c 0,172,173 - 13 315 13 315 16.5 463.5 c 0,174,175 - 20 612 20 612 57 656 c 0,176,177 - 163.999 785 163.999 785 306 763 c 0,178,179 - 337.145 758.175 337.145 758.175 367.568 758.208 c 0,180,181 - 475.854 758.327 475.854 758.327 575 820 c 0,182,183 - 593 830 593 830 581.5 953.5 c 0,184,185 - 570.001 1076.98 570.001 1076.98 566 1215.5 c 0,186,187 - 566.756 1320.01 l 0,188,189 - 570.322 1395.61 570.322 1395.61 583 1459 c 0,190,191 - 599.759 1542.8 599.759 1542.8 656.009 1543.16 c 0,192,193 - 670.24 1543.25 670.24 1543.25 687 1538 c 1,0,1 -EndSplineSet -KernsSLIF: 89 -156 0 0 121 -78 0 0 84 -208 0 0 87 -321 0 0 -EndChar -StartChar: lslash -Encoding: 322 322 86 -Width: 1480 -Flags: HMW -HStem: 128 272<667 1188> -VStem: 505 135<147.5 1361> -Fore -593 1428 m 1,0,1 - 567.318 1408.02 567.318 1408.02 566.5 1387 c 0,2,3 - 567 1366.99 567 1366.99 599 1365 c 0,4,5 - 637 1362 637 1362 668.5 1480.5 c 0,6,7 - 677.632 1514.85 677.632 1514.85 677.729 1542.19 c 0,8,9 - 677.827 1569.77 677.827 1569.77 668.732 1590.2 c 0,10,11 - 655.742 1619.38 655.742 1619.38 624 1634 c 0,12,13 - 647.265 1635.96 l 0,14,15 - 686.64 1632.06 686.64 1632.06 707 1574.5 c 0,16,17 - 724.413 1525.27 724.413 1525.27 724.333 1468.65 c 0,18,19 - 724.294 1440.72 724.294 1440.72 720 1411 c 0,20,21 - 714.001 1369.01 714.001 1369.01 696.5 1296 c 0,22,23 - 678.997 1222.99 678.997 1222.99 668 1151 c 0,24,25 - 660.378 1101.11 660.378 1101.11 660.438 1059.38 c 0,26,27 - 660.465 1040.89 660.465 1040.89 662 1024 c 0,28,29 - 666.999 969.001 666.999 969.001 706 962 c 0,30,31 - 755 952 755 952 818.5 997 c 0,32,33 - 860.317 1026.63 860.317 1026.63 860.285 1052.8 c 0,34,35 - 860.268 1066.36 860.268 1066.36 849 1079 c 0,36,37 - 831.104 1097.95 831.104 1097.95 816.257 1097.92 c 0,38,39 - 802.894 1097.9 802.894 1097.9 792 1082.5 c 0,40,41 - 768.995 1049.99 768.995 1049.99 758 1020 c 0,42,43 - 760 1114.01 760 1114.01 815 1131 c 0,44,45 - 870.001 1147.99 870.001 1147.99 943 1152 c 0,46,47 - 1016 1156.01 1016 1156.01 1091 1177.5 c 0,48,49 - 1165.99 1198.99 1165.99 1198.99 1209 1302 c 0,50,51 - 1200 1211.99 1200 1211.99 1157 1168 c 0,52,53 - 1113.98 1123.99 1113.98 1123.99 1062.5 1094 c 0,54,55 - 1011.02 1064.01 1011.02 1064.01 964.5 1030.5 c 0,56,57 - 918.002 997.006 918.002 997.006 905 929 c 0,58,59 - 904.926 915.649 l 0,60,61 - 907.773 908.182 907.773 908.182 919 907 c 0,62,63 - 938 905 938 905 961 914 c 0,64,65 - 993 926 993 926 993 970 c 0,66,67 - 1011.22 936.52 1011.22 936.52 1011.25 912.127 c 0,68,69 - 1011.29 886.983 1011.29 886.983 992 871.5 c 0,70,71 - 954 841 954 841 891 827.5 c 0,72,73 - 828 814 828 814 765 808.5 c 0,74,75 - 702 803 702 803 692 787 c 0,76,77 - 641 709 641 709 628.5 599 c 0,78,79 - 626.227 545.05 l 0,80,81 - 628.814 466.638 628.814 466.638 667 400 c 0,82,83 - 721 304 721 304 824 317.5 c 0,84,85 - 927 331 927 331 1033.5 364.5 c 0,86,87 - 1140 398.001 1140 398.001 1227 407.5 c 0,88,89 - 1314 417 1314 417 1338 313 c 0,90,91 - 1317 348 1317 348 1275 356.5 c 0,92,93 - 1246.05 359.1 l 0,94,95 - 1226.37 357.983 1226.37 357.983 1216 347 c 0,96,97 - 1160.01 286 1160.01 286 1213 248.5 c 0,98,99 - 1254.39 219.212 1254.39 219.212 1314.7 219.203 c 0,100,101 - 1331.61 219.201 1331.61 219.201 1350 221.5 c 0,102,103 - 1433.99 231.999 1433.99 231.999 1508.5 303.5 c 0,104,105 - 1572.66 365.071 1572.66 365.071 1572.66 491.539 c 0,106,107 - 1572.67 511.925 1572.67 511.925 1571 534 c 0,108,109 - 1629.01 327 1629.01 327 1482.5 227 c 0,110,111 - 1337.49 128.018 1337.49 128.018 1188 128 c 0,112,113 - 1115 128 1115 128 1009.5 164.5 c 0,114,115 - 975.793 176.162 975.793 176.162 951.324 176.135 c 0,116,117 - 899.207 176.079 899.207 176.079 889 123 c 0,118,119 - 879 70.9999 879 70.9999 935.5 70.5 c 0,120,121 - 992 70.0001 992 70.0001 1025 109 c 0,122,123 - 987 11 987 11 923 20.5 c 0,124,125 - 859 30 859 30 786.5 71.5 c 0,126,127 - 714.005 112.997 714.005 112.997 640 147.5 c 0,128,129 - 608.606 162.136 608.606 162.136 580.092 162.104 c 0,130,131 - 541.931 162.061 541.931 162.061 508 135 c 0,132,133 - 430 72 430 72 497.5 7.5 c 0,134,135 - 565 -57 565 -57 632 -55 c 0,136,137 - 559 -74.0001 559 -74.0001 514 -58 c 0,138,139 - 469 -42 469 -42 431 5 c 0,140,141 - 400.295 42.6839 400.295 42.6839 400.27 95.4635 c 0,142,143 - 400.259 118.317 400.259 118.317 406 144 c 0,144,145 - 425.001 229.002 425.001 229.002 455 317 c 0,146,147 - 485 405 485 405 501 482 c 0,148,149 - 504.875 518.125 l 0,150,151 - 504.5 568.75 504.5 568.75 467 598 c 0,152,153 - 424 631 424 631 383 607.5 c 0,154,155 - 341.997 583.997 341.997 583.997 300.5 550 c 0,156,157 - 259.003 516.002 259.003 516.002 215 494 c 0,158,159 - 171.001 472 171.001 472 122 509 c 0,160,161 - 213.001 506 213.001 506 222.5 557 c 0,162,163 - 225.013 589.347 l 0,164,165 - 223.428 614.785 223.428 614.785 208 627 c 0,166,167 - 177.736 648.857 177.736 648.857 152.812 648.885 c 0,168,169 - 133.264 648.906 133.264 648.906 117 635.5 c 0,170,171 - 79.9999 605 79.9999 605 65 548.5 c 0,172,173 - 50 492 50 492 60.5 431.5 c 0,174,175 - 71 371 71 371 112 350 c 0,176,177 - 20 389 20 389 23 515 c 0,178,179 - 26 641 26 641 57 679 c 0,180,181 - 134.265 772.396 134.265 772.396 233.155 772.797 c 0,182,183 - 250.736 772.868 250.736 772.868 269 770 c 0,184,185 - 390 751 390 751 498 818 c 0,186,187 - 513 827 513 827 503.5 931.5 c 0,188,189 - 493.999 1036.03 493.999 1036.03 490.5 1154 c 0,190,191 - 487 1272.01 487 1272.01 505 1361 c 0,192,193 - 519.319 1431.8 519.319 1431.8 566.539 1432.36 c 0,194,195 - 591.921 1428.33 l 0,196,197 - 593 1428 l 1,0,1 -EndSplineSet -KernsSLIF: 121 -104 0 0 116 -208 0 0 119 -385 0 0 -EndChar -StartChar: Nacute -Encoding: 323 323 87 -Width: 1285 -Flags: MW -VStem: 131 270.5<220 1558.5> 626 189<1760.5 1967> 822.5 107<83 1472> -Fore -324 1593 m 0,0,1 - 346.986 1609 346.986 1609 395 1624 c 0,2,3 - 417.177 1627.12 l 0,4,5 - 451.57 1625.67 451.57 1625.67 479 1583 c 0,6,7 - 455.226 1594.71 455.226 1594.71 438.565 1595.02 c 0,8,9 - 422.575 1592.01 l 0,10,11 - 406.252 1584.52 406.252 1584.52 401.5 1558.5 c 0,12,13 - 397.146 1534.66 397.146 1534.66 397.177 1505.92 c 0,14,15 - 397.22 1465.34 397.22 1465.34 406 1415 c 0,16,17 - 421.004 1328.98 421.004 1328.98 446.5 1246 c 0,18,19 - 471.753 1163.81 471.753 1163.81 480 1146 c 0,20,21 - 493 1111.01 493 1111.01 527.5 1101 c 0,22,23 - 547.556 1098.57 l 0,24,25 - 567.655 1100.11 567.655 1100.11 580 1120 c 0,26,27 - 604 1160.01 604 1160.01 572.5 1183 c 0,28,29 - 547.425 1201.3 547.425 1201.3 515.706 1201.24 c 0,30,31 - 507.571 1201.22 507.571 1201.22 499 1200 c 0,32,33 - 536.359 1222.03 536.359 1222.03 565.234 1222.04 c 0,34,35 - 596.638 1222.05 596.638 1222.05 618 1196 c 0,36,37 - 658.999 1146.01 658.999 1146.01 679 1080 c 0,38,39 - 688 1047 688 1047 704 978 c 0,40,41 - 720 909 720 909 741.5 846.5 c 0,42,43 - 763 784 763 784 790 750.5 c 0,44,45 - 817 717 817 717 849 755 c 0,46,47 - 888.427 802.159 888.427 802.159 888.409 889.659 c 0,48,49 - 888.404 915.342 888.404 915.342 885 944.5 c 0,50,51 - 870.005 1072.96 870.005 1072.96 847 1212 c 0,52,53 - 824 1351.01 824 1351.01 822.5 1472 c 0,54,55 - 821 1593.01 821 1593.01 899 1640 c 0,56,57 - 893.009 1624.02 893.009 1624.02 861.5 1558 c 0,58,59 - 852.5 1539.14 852.5 1539.14 852.357 1523.63 c 0,60,61 - 852.259 1512.93 852.259 1512.93 856.378 1503.82 c 0,62,63 - 867.182 1479.93 867.182 1479.93 907 1467 c 0,64,65 - 923.542 1461.31 923.542 1461.31 938.201 1461.19 c 0,66,67 - 960.888 1464.7 l 0,68,69 - 1010.83 1481.53 1010.83 1481.53 1033.5 1579 c 0,70,71 - 1045.45 1630.38 1045.45 1630.38 1045.5 1672.21 c 0,72,73 - 1045.59 1747.62 1045.59 1747.62 1007 1792 c 0,74,75 - 1087.86 1740.37 1087.86 1740.37 1088.52 1642.23 c 0,76,77 - 1088.54 1639.63 1088.54 1639.63 1088.5 1637 c 0,78,79 - 1087 1535.03 1087 1535.03 1067 1436.5 c 0,80,81 - 1046.99 1337.91 1046.99 1337.91 1042 1269.5 c 0,82,83 - 1043.5 1244.33 l 0,84,85 - 1050.72 1214.15 1050.72 1214.15 1086.69 1213.97 c 0,86,87 - 1098.34 1213.91 1098.34 1213.91 1113 1217 c 0,88,89 - 1169.68 1227.56 1169.68 1227.56 1169.6 1287.95 c 0,90,91 - 1169.6 1290.43 1169.6 1290.43 1169.5 1293 c 0,92,93 - 1166.99 1358 1166.99 1358 1116 1404 c 0,94,95 - 1221 1357.99 1221 1357.99 1222.5 1273.5 c 0,96,97 - 1219.36 1222.38 l 0,98,99 - 1210.9 1161.16 1210.9 1161.16 1180 1095.5 c 0,100,101 - 1136 1001.99 1136 1001.99 1076.5 914 c 0,102,103 - 1017 826.012 1017 826.012 1002 774 c 0,104,105 - 982.94 710.755 982.94 710.755 983.02 577.323 c 0,106,107 - 983.032 556.746 983.032 556.746 983.5 534.5 c 0,108,109 - 987 368 987 368 981 279 c 0,110,111 - 973.999 187.997 973.999 187.997 929.5 83 c 0,112,113 - 885 -22 885 -22 805 -81 c 0,114,115 - 844 36 844 36 846 218 c 0,116,117 - 848 400 848 400 728 455 c 0,118,119 - 712.982 458.284 l 0,120,121 - 695.093 457.395 695.093 457.395 685 430 c 0,122,123 - 671 392 671 392 695 371 c 0,124,125 - 715.996 352.003 715.996 352.003 721.5 348 c 0,126,127 - 727 344 727 344 753 335 c 0,128,129 - 678 326 678 326 656.5 358 c 0,130,131 - 634.999 390.001 634.999 390.001 630 442 c 0,132,133 - 610.999 635.01 610.999 635.01 588.5 804 c 0,134,135 - 566 973 566 973 379 1038 c 0,136,137 - 359.306 1041.07 l 0,138,139 - 316.358 1039.59 316.358 1039.59 295 959.5 c 0,140,141 - 269 862 269 862 316 823 c 0,142,143 - 352 793 352 793 387.5 821.5 c 0,144,145 - 423 850 423 850 381 902 c 0,146,147 - 407.792 899.407 l 0,148,149 - 449.736 888.761 449.736 888.761 449.941 835.163 c 0,150,151 - 449.973 826.849 449.973 826.849 449 817.5 c 0,152,153 - 440 731.001 440 731.001 398 617.5 c 0,154,155 - 356 504 356 504 309 395.5 c 0,156,157 - 263.887 291.355 263.887 291.355 264 246 c 0,158,159 - 271.999 70.0008 271.999 70.0008 326.5 23 c 0,160,161 - 380.996 -23.9972 380.996 -23.9972 485 -93 c 0,162,163 - 359 -70.9999 359 -70.9999 260.5 12.5 c 0,164,165 - 162.001 95.9991 162.001 95.9991 131 220 c 0,166,167 - 95 367 95 367 155.5 536 c 0,168,169 - 184.99 618.377 184.99 618.377 185.137 667.728 c 0,170,171 - 185.236 701.109 185.236 701.109 171.911 719.38 c 0,172,173 - 164.52 729.514 164.52 729.514 153 735 c 0,174,175 - 130 745.667 130 745.667 114.167 745.833 c 0,176,177 - 104.718 745.933 104.718 745.933 97.8211 742.293 c 0,178,179 - 81.6048 733.734 81.6048 733.734 79.5 704.5 c 0,180,181 - 75 642 75 642 111 630 c 0,182,183 - 31 635 31 635 21 692 c 0,184,185 - 10.9999 749 10.9999 749 33.5 820.5 c 0,186,187 - 56 892 56 892 91 960 c 0,188,189 - 125.995 1027.99 125.995 1027.99 137 1055 c 0,190,191 - 169.999 1143.99 169.999 1143.99 217.5 1347.5 c 0,192,193 - 264.999 1551 264.999 1551 324 1593 c 0,0,1 -587 1669 m 1,98,99 - 630 1708 630 1708 626 1760.5 c 0,100,101 - 621.997 1813.03 621.997 1813.03 615 1866 c 0,102,103 - 608 1918.99 608 1918.99 621 1965 c 0,104,105 - 634 2011.01 634 2011.01 711 2037 c 0,106,107 - 679.998 2023.99 679.998 2023.99 666.5 1988 c 0,108,109 - 662.585 1968.38 l 0,110,111 - 662.9 1947.8 662.9 1947.8 686 1938 c 0,112,113 - 760 1906.01 760 1906.01 767 2010 c 0,114,115 - 767.449 2068.65 l 0,116,117 - 763.629 2125.31 763.629 2125.31 741 2150 c 0,118,119 - 743.995 2150 743.995 2150 782.5 2104.5 c 0,120,121 - 815.68 2065.29 815.68 2065.29 815.809 1991.54 c 0,122,123 - 815.829 1979.71 815.829 1979.71 815 1967 c 0,124,125 - 798 1712.99 798 1712.99 587 1669 c 1,98,99 -EndSplineSet -EndChar -StartChar: nacute -Encoding: 324 324 88 -Width: 1095 -Flags: MW -VStem: 114 229<334 1471> 534.5 160.5<1643 1818> 701.5 91<216 1398> -Fore -278 1500 m 0,0,1 - 297 1513.99 297 1513.99 338 1527 c 0,2,3 - 358.082 1529.67 l 0,4,5 - 386.604 1527.83 386.604 1527.83 409 1492 c 0,6,7 - 352 1520.01 352 1520.01 343 1471 c 0,8,9 - 339.238 1450.51 339.238 1450.51 339.32 1425.84 c 0,10,11 - 339.434 1391.49 339.434 1391.49 347 1349 c 0,12,13 - 360 1276 360 1276 382 1205.5 c 0,14,15 - 404 1135 404 1135 410 1120 c 0,16,17 - 422 1091.01 422 1091.01 451 1082.5 c 0,18,19 - 469.146 1080.48 l 0,20,21 - 485.113 1082.18 485.113 1082.18 495 1098 c 0,22,23 - 516 1132.01 516 1132.01 489 1152 c 0,24,25 - 468.094 1167.48 468.094 1167.48 442.398 1167.38 c 0,26,27 - 434.903 1167.35 434.903 1167.35 427 1166 c 0,28,29 - 458.365 1184.53 458.365 1184.53 482.731 1184.66 c 0,30,31 - 501.908 1184.76 501.908 1184.76 516.747 1173.46 c 0,32,33 - 522.726 1168.9 522.726 1168.9 528 1162.5 c 0,34,35 - 562.996 1120.01 562.996 1120.01 580 1064 c 0,36,37 - 588 1035.99 588 1035.99 601.5 977 c 0,38,39 - 615 918 615 918 633 865.5 c 0,40,41 - 651 813 651 813 674 784 c 0,42,43 - 697 755 697 755 724 788 c 0,44,45 - 757.888 828.051 757.888 828.051 757.965 901.911 c 0,46,47 - 757.988 923.95 757.988 923.95 755 949 c 0,48,49 - 742 1058 742 1058 722.5 1176.5 c 0,50,51 - 703 1295 703 1295 701.5 1398 c 0,52,53 - 704.502 1442.42 l 0,54,55 - 715.57 1510.06 715.57 1510.06 767 1540 c 0,56,57 - 760.949 1525.89 760.949 1525.89 734.5 1470 c 0,58,59 - 726.928 1454 726.928 1454 726.826 1440.86 c 0,60,61 - 726.731 1428.6 726.731 1428.6 733.137 1418.82 c 0,62,63 - 743.897 1402.4 743.897 1402.4 773 1393 c 0,64,65 - 787.331 1388.1 787.331 1388.1 799.999 1388.12 c 0,66,67 - 857.17 1388.22 857.17 1388.22 880.5 1488.5 c 0,68,69 - 909 1611.01 909 1611.01 858 1670 c 0,70,71 - 926.936 1625.68 926.936 1625.68 927 1538.5 c 0,72,73 - 926 1452 926 1452 909.5 1368 c 0,74,75 - 893 1284 893 1284 888.5 1225.5 c 0,76,77 - 889.952 1203 l 0,78,79 - 896.331 1178.48 896.331 1178.48 926.052 1178.3 c 0,80,81 - 936.173 1178.24 936.173 1178.24 949 1181 c 0,82,83 - 998 1190 998 1190 995.5 1245.5 c 0,84,85 - 993 1301 993 1301 951 1340 c 0,86,87 - 1040.99 1301 1040.99 1301 1042 1229 c 0,88,89 - 1038.7 1182.13 l 0,90,91 - 1031 1131.55 1031 1131.55 1005.5 1077.5 c 0,92,93 - 968 998 968 998 917.5 923 c 0,94,95 - 867.001 848.003 867.001 848.003 854 804 c 0,96,97 - 838.122 749.311 838.122 749.311 838.195 632.77 c 0,98,99 - 838.205 617.187 838.205 617.187 838.5 600.5 c 0,100,101 - 838.195 430.678 l 0,102,103 - 837.386 404.787 837.386 404.787 836 384 c 0,104,105 - 830 306 830 306 792.5 216 c 0,106,107 - 755 126 755 126 687 77 c 0,108,109 - 720 177 720 177 721.5 331.5 c 0,110,111 - 723 486 723 486 621 534 c 0,112,113 - 607.018 536.132 l 0,114,115 - 593.061 533.918 593.061 533.918 584.5 512 c 0,116,117 - 572 480 572 480 593 462 c 0,118,119 - 616 440 616 440 643 431 c 0,120,121 - 579 424 579 424 560.5 450.5 c 0,122,123 - 542 477 542 477 538 522 c 0,124,125 - 521.997 687.025 521.997 687.025 503 830.5 c 0,126,127 - 484 974 484 974 325 1029 c 0,128,129 - 306.614 1031.48 l 0,130,131 - 270.724 1028.86 270.724 1028.86 253 962 c 0,132,133 - 230.999 879 230.999 879 271 846 c 0,134,135 - 302 820 302 820 332 844 c 0,136,137 - 362 868 362 868 326 913 c 0,138,139 - 392 915 392 915 384 841.5 c 0,140,141 - 376 768 376 768 340.5 671.5 c 0,142,143 - 304.992 574.979 304.992 574.979 265 483 c 0,144,145 - 226.89 395.349 226.89 395.349 227 356 c 0,146,147 - 233 206 233 206 280 165 c 0,148,149 - 327.001 124 327.001 124 414 67 c 0,150,151 - 307 85 307 85 223.5 156.5 c 0,152,153 - 139.999 228.001 139.999 228.001 114 334 c 0,154,155 - 82.9999 459 82.9999 459 135 602.5 c 0,156,157 - 160.46 672.76 160.46 672.76 160.509 714.612 c 0,158,159 - 160.561 758.24 160.561 758.24 133 771 c 0,160,161 - 73 798 73 798 69.5 745 c 0,162,163 - 66.0001 692 66.0001 692 97 682 c 0,164,165 - 29 686 29 686 20.5 734.5 c 0,166,167 - 17.9648 771.712 l 0,168,169 - 18.9725 805.202 18.9725 805.202 31 843.5 c 0,170,171 - 50 904 50 904 80 962 c 0,172,173 - 110 1020.01 110 1020.01 119 1043 c 0,174,175 - 146.995 1117.98 146.995 1117.98 187 1291 c 0,176,177 - 227.002 1464 227.002 1464 278 1500 c 0,0,1 -501 1565 m 1,97,98 - 534.679 1595.04 534.679 1595.04 534.802 1635.02 c 0,99,100 - 534.814 1638.96 534.814 1638.96 534.5 1643 c 0,101,102 - 531 1688 531 1688 525.5 1733 c 0,103,104 - 520 1778 520 1778 530.5 1817 c 0,105,106 - 541 1856 541 1856 607 1877 c 0,107,108 - 580.003 1866.01 580.003 1866.01 568.5 1836 c 0,109,110 - 565.261 1819.15 l 0,111,112 - 565.976 1802.29 565.976 1802.29 586 1794 c 0,113,114 - 649 1767 649 1767 654.5 1855.5 c 0,115,116 - 660 1944 660 1944 633 1974 c 0,117,118 - 636 1974 636 1974 668 1935 c 0,119,120 - 700 1896 700 1896 695 1818 c 0,121,122 - 681.056 1601.86 681.056 1601.86 501 1565 c 1,97,98 -EndSplineSet -EndChar -StartChar: Sacute -Encoding: 346 346 89 -Width: 1144 -Flags: HW -Fore -683 -50 m 0,0,1 - 575 -44 575 -44 470.5 -51 c 0,2,3 - 366 -58 366 -58 278.5 -43.5 c 0,4,5 - 191.001 -29 191.001 -29 128.5 23 c 0,6,7 - 65.9999 75 65.9999 75 43 201 c 0,8,9 - 70.0002 133 70.0002 133 142 103 c 0,10,11 - 155.224 97.4898 155.224 97.4898 166.729 97.3099 c 0,12,13 - 184.056 100.442 l 0,14,15 - 220.947 115.345 220.947 115.345 235 201 c 0,16,17 - 236.947 234.883 l 0,18,19 - 233.812 282.336 233.812 282.336 194 307.5 c 0,20,21 - 161.449 328.075 161.449 328.075 120.976 328.092 c 0,22,23 - 95.5509 328.102 95.5509 328.102 67 320 c 0,24,25 - 131.999 431 131.999 431 228 360 c 0,26,27 - 324 289 324 289 360 229 c 0,28,29 - 453 70 453 70 534 100 c 0,30,31 - 615 130 615 130 656.5 224.5 c 0,32,33 - 698 319 698 319 685 417 c 0,34,35 - 674.43 496.682 674.43 496.682 610.31 497.032 c 0,36,37 - 595.57 497.112 595.57 497.112 578 493 c 0,38,39 - 551 486 551 486 551.5 462 c 0,40,41 - 552 438 552 438 573 419 c 0,42,43 - 600 392 600 392 641 423 c 0,44,45 - 608.573 339.022 608.573 339.022 568.541 339.041 c 0,46,47 - 560.427 339.045 560.427 339.045 552 342.5 c 0,48,49 - 502 363.001 502 363.001 456 430 c 0,50,51 - 410 497 410 497 375.5 573 c 0,52,53 - 341 649 341 649 333 658 c 0,54,55 - 198.002 796.998 198.002 796.998 75.5 956.5 c 0,56,57 - 9.56444 1042.35 9.56444 1042.35 9.53848 1139.94 c 0,58,59 - 9.5162 1223.65 9.5162 1223.65 58 1316 c 0,60,61 - 71.9999 1343 71.9999 1343 107 1359.5 c 0,62,63 - 116.032 1363.76 116.032 1363.76 124.532 1363.79 c 0,64,65 - 148.967 1363.87 148.967 1363.87 169 1329 c 0,66,67 - 153.833 1338.39 153.833 1338.39 140.232 1338.32 c 0,68,69 - 116.166 1338.21 116.166 1338.21 97 1308.5 c 0,70,71 - 83.5354 1287.63 83.5354 1287.63 83.5672 1272.7 c 0,72,73 - 83.6063 1254.37 83.6063 1254.37 104 1245 c 0,74,75 - 114.919 1239.84 114.919 1239.84 126.863 1239.92 c 0,76,77 - 175.081 1240.25 175.081 1240.25 240 1326 c 0,78,79 - 321 1432.99 321 1432.99 276 1491 c 0,80,81 - 263.212 1506.89 263.212 1506.89 248.323 1507.16 c 0,82,83 - 233.127 1503.63 l 0,84,85 - 215.806 1495.55 215.806 1495.55 196 1469 c 0,86,87 - 195.152 1498.14 l 0,88,89 - 201.306 1554.44 201.306 1554.44 273 1577 c 0,90,91 - 362 1605.01 362 1605.01 480.5 1604 c 0,92,93 - 599.036 1602.99 599.036 1602.99 711.5 1586.5 c 0,94,95 - 824 1570 824 1570 859 1561 c 0,96,97 - 944.601 1539.42 944.601 1539.42 944.717 1476.2 c 0,98,99 - 944.767 1448.57 944.767 1448.57 928.5 1413 c 0,100,101 - 874.997 1295.99 874.997 1295.99 785 1261 c 0,102,103 - 814.991 1296.99 814.991 1296.99 845 1350 c 0,104,105 - 875 1402.99 875 1402.99 848 1434 c 0,106,107 - 826.995 1457 826.995 1457 788.5 1458.5 c 0,108,109 - 770.041 1455.64 l 0,110,111 - 743.053 1445.86 743.053 1445.86 722 1403 c 0,112,113 - 685.428 1330.43 685.428 1330.43 685.265 1283.65 c 0,114,115 - 685.167 1255.51 685.167 1255.51 698.253 1236.7 c 0,116,117 - 701.476 1232.07 701.476 1232.07 705.5 1228 c 0,118,119 - 751.965 1181.05 751.965 1181.05 842.5 1181 c 0,120,121 - 932.029 1182.01 932.029 1182.01 1028.5 1217.5 c 0,122,123 - 1124.99 1253.01 1124.99 1253.01 1159 1294 c 0,124,125 - 1084 1171 1084 1171 940 1120 c 0,126,127 - 870.72 1095.46 870.72 1095.46 800.75 1095.46 c 0,128,129 - 725.277 1095.46 725.277 1095.46 649 1124 c 0,130,131 - 571.991 1151 571.991 1151 521 1198.5 c 0,132,133 - 470 1246.01 470 1246.01 430.5 1275 c 0,134,135 - 400.256 1297.2 400.256 1297.2 373.833 1297.43 c 0,136,137 - 365.737 1297.49 365.737 1297.49 358 1295.5 c 0,138,139 - 324.998 1286.99 324.998 1286.99 285 1203 c 0,140,141 - 261.211 1152.62 261.211 1152.62 261.165 1096.13 c 0,142,143 - 261.145 1071.88 261.145 1071.88 265.5 1046.5 c 0,144,145 - 280 962 280 962 355 904 c 0,146,147 - 370.918 891.619 370.918 891.619 387.13 891.556 c 0,148,149 - 407.581 891.476 407.581 891.476 428.5 911 c 0,150,151 - 466 946 466 946 411 982 c 0,152,153 - 441.509 992.17 441.509 992.17 466.463 992.083 c 0,154,155 - 495.49 991.981 495.49 991.981 517 978 c 0,156,157 - 556.998 952.002 556.998 952.002 612 865 c 0,158,159 - 631.998 832.002 631.998 832.002 712 740 c 0,160,161 - 792.002 647.997 792.002 647.997 863 543 c 0,162,163 - 934 438 934 438 961 343 c 0,164,165 - 967.496 320.143 967.496 320.143 967.451 300.585 c 0,166,167 - 967.308 238.857 967.308 238.857 902 210 c 0,168,169 - 899.454 252.437 l 0,170,171 - 897.919 262.322 897.919 262.322 895.5 272 c 0,172,173 - 888 302 888 302 851 293 c 0,174,175 - 848 292 848 292 819.5 250 c 0,176,177 - 791 208 791 208 770 161.5 c 0,178,179 - 749 115 749 115 751.5 82 c 0,180,181 - 754 49 754 49 814 66 c 0,182,183 - 838 72 838 72 836.5 92.5 c 0,184,185 - 835 113.001 835 113.001 839 137 c 0,186,187 - 914 60.0001 914 60.0001 819.5 4 c 0,188,189 - 725 -52 725 -52 683 -50 c 0,0,1 -414 1714 m 1,98,99 - 395.009 1728.03 395.009 1728.03 395.108 1801.05 c 0,100,101 - 395.129 1816.46 395.129 1816.46 396 1834.5 c 0,102,103 - 401 1938 401 1938 446.5 2042 c 0,104,105 - 491.999 2145.99 491.999 2145.99 585.5 2208.5 c 0,106,107 - 631.398 2239.18 631.398 2239.18 691.879 2239.14 c 0,108,109 - 754.596 2239.09 754.596 2239.09 833 2206 c 0,110,111 - 746.818 2206.21 l 0,112,113 - 690.669 2203.56 690.669 2203.56 649 2193 c 0,114,115 - 578 2175 578 2175 545 2079 c 0,116,117 - 530.449 2035.69 530.449 2035.69 530.302 2007.15 c 0,118,119 - 530.21 1989.43 530.21 1989.43 535.67 1977.4 c 0,120,121 - 546.801 1952.87 546.801 1952.87 581 1952 c 0,122,123 - 606.959 1954.33 l 0,124,125 - 630.094 1960.29 630.094 1960.29 630.065 1981.19 c 0,126,127 - 630.039 1999.11 630.039 1999.11 613 2028 c 0,128,129 - 669 2013 669 2013 673.5 1945 c 0,130,131 - 672.229 1913.5 l 0,132,133 - 665.109 1871.18 665.109 1871.18 627 1854 c 0,134,135 - 536.013 1812.01 536.013 1812.01 491.5 1808 c 0,136,137 - 446.998 1803.99 446.998 1803.99 414 1714 c 1,98,99 -EndSplineSet -EndChar -StartChar: sacute -Encoding: 347 347 90 -Width: 1004 -Flags: HW -Fore -589 120 m 0,0,1 - 406 130.001 406 130.001 245 125.5 c 0,2,3 - 204.652 128.097 l 0,4,5 - 78.8561 149.094 78.8561 149.094 45 334 c 0,6,7 - 67 277 67 277 128.5 251.5 c 0,8,9 - 190 226 190 226 208 334 c 0,10,11 - 208.984 365.264 l 0,12,13 - 205.085 404.631 205.085 404.631 172.5 425.5 c 0,14,15 - 145.386 442.865 145.386 442.865 111.404 442.967 c 0,16,17 - 89.6139 443.033 89.6139 443.033 65 436 c 0,18,19 - 98.2419 492.813 98.2419 492.813 141.164 493.188 c 0,20,21 - 152.496 493.287 152.496 493.287 164.502 489.453 c 0,22,23 - 182.263 483.78 182.263 483.78 201.5 469.5 c 0,24,25 - 282.999 409 282.999 409 314 358 c 0,26,27 - 393 223 393 223 462 248.5 c 0,28,29 - 531 274 531 274 566 354.5 c 0,30,31 - 601 435 601 435 590 518 c 0,32,33 - 581.055 585.495 581.055 585.495 526.482 585.539 c 0,34,35 - 513.945 585.55 513.945 585.55 499 582 c 0,36,37 - 475 576 475 576 476 556 c 0,38,39 - 477 536 477 536 495 520 c 0,40,41 - 505.707 509.293 505.707 509.293 519.014 509.205 c 0,42,43 - 533.844 509.107 533.844 509.107 553 523 c 0,44,45 - 525.682 451.808 525.682 451.808 491.854 451.542 c 0,46,47 - 484.818 451.487 484.818 451.487 477.5 454.5 c 0,48,49 - 435 472 435 472 396 529 c 0,50,51 - 357 586 357 586 327.5 650.5 c 0,52,53 - 297.998 715.003 297.998 715.003 291 723 c 0,54,55 - 175.998 841.002 175.998 841.002 71 977 c 0,56,57 - 14.885 1049.69 14.885 1049.69 14.7503 1131.79 c 0,58,59 - 14.651 1192.36 14.651 1192.36 45.0218 1258.07 c 0,60,61 - 50.513 1269.95 50.513 1269.95 57 1282 c 0,62,63 - 69.0071 1305.01 69.0071 1305.01 98.5 1319 c 0,64,65 - 114.087 1322.62 l 0,66,67 - 134.507 1322.16 134.507 1322.16 152 1293 c 0,68,69 - 139.415 1300.69 139.415 1300.69 128.112 1300.87 c 0,70,71 - 113.474 1297.69 l 0,72,73 - 101.083 1291.89 101.083 1291.89 90.5 1275.5 c 0,74,75 - 79.2991 1258.15 79.2991 1258.15 78.9994 1245.72 c 0,76,77 - 81.6689 1234.06 l 0,78,79 - 85.7401 1226.63 85.7401 1226.63 96 1222 c 0,80,81 - 105.319 1217.64 105.319 1217.64 115.503 1217.7 c 0,82,83 - 156.677 1217.94 156.677 1217.94 212 1290.5 c 0,84,85 - 256.445 1348.79 256.445 1348.79 256.495 1390.28 c 0,86,87 - 256.523 1413.21 256.523 1413.21 243 1431 c 0,88,89 - 232.294 1444.38 232.294 1444.38 219.834 1444.75 c 0,90,91 - 206.014 1441.43 l 0,92,93 - 191.532 1434.32 191.532 1434.32 175 1412 c 0,94,95 - 174.516 1438.21 l 0,96,97 - 180.593 1484.96 180.593 1484.96 240.5 1504 c 0,98,99 - 314.701 1527.59 314.701 1527.59 417 1527.5 c 0,100,101 - 518 1527.01 518 1527.01 613 1512.5 c 0,102,103 - 708.126 1497.98 708.126 1497.98 738 1491 c 0,104,105 - 810.628 1472.32 810.628 1472.32 811.25 1418.96 c 0,106,107 - 807.364 1391.21 l 0,108,109 - 803.94 1378.58 803.94 1378.58 797.5 1364.5 c 0,110,111 - 751.998 1265 751.998 1265 675 1235 c 0,112,113 - 700.011 1266.02 700.011 1266.02 726 1311 c 0,114,115 - 739.549 1334.45 739.549 1334.45 739.791 1352.74 c 0,116,117 - 736.569 1370.08 l 0,118,119 - 733.894 1376.47 733.894 1376.47 729 1382 c 0,120,121 - 710.995 1402 710.995 1402 678 1403.5 c 0,122,123 - 661.255 1400.79 l 0,124,125 - 638.683 1392.11 638.683 1392.11 621 1356 c 0,126,127 - 567 1248 567 1248 607.5 1207.5 c 0,128,129 - 646.962 1168.04 646.962 1168.04 724 1168 c 0,130,131 - 800.014 1169.01 800.014 1169.01 882 1199 c 0,132,133 - 963.994 1229 963.994 1229 993 1264 c 0,134,135 - 930.004 1159.01 930.004 1159.01 807.5 1116 c 0,136,137 - 685 1072.99 685 1072.99 560 1119 c 0,138,139 - 431.01 1165.99 431.01 1165.99 374.5 1247.5 c 0,140,141 - 354.599 1276.2 354.599 1276.2 333.396 1277.06 c 0,142,143 - 317.756 1273.98 l 0,144,145 - 285.794 1260.26 285.794 1260.26 251 1186 c 0,146,147 - 229.83 1142.95 229.83 1142.95 229.824 1094.68 c 0,148,149 - 229.821 1074.55 229.821 1074.55 233.5 1053.5 c 0,150,151 - 245.999 982 245.999 982 310 932 c 0,152,153 - 340 908 340 908 372 938 c 0,154,155 - 404 968 404 968 357 998 c 0,156,157 - 414 1017.01 414 1017.01 447.5 995 c 0,158,159 - 481.001 972.998 481.001 972.998 528 899 c 0,160,161 - 544.996 871.005 544.996 871.005 613 793 c 0,162,163 - 681.005 714.993 681.005 714.993 741.5 625.5 c 0,164,165 - 802.001 535.997 802.001 535.997 825 455 c 0,166,167 - 830.495 435.646 830.495 435.646 830.51 419.09 c 0,168,169 - 830.557 366.353 830.557 366.353 775 342 c 0,170,171 - 775 369 775 369 769 394.5 c 0,172,173 - 763 420 763 420 731 412 c 0,174,175 - 728 411 728 411 704 376 c 0,176,177 - 680.003 341.004 680.003 341.004 662.5 301.5 c 0,178,179 - 646.815 266.098 646.815 266.098 646.795 239.931 c 0,180,181 - 646.793 236.903 646.793 236.903 647 234 c 0,182,183 - 648.32 215.509 648.32 215.509 671.01 215.335 c 0,184,185 - 682.679 215.245 682.679 215.245 700 220 c 0,186,187 - 719.174 225.478 719.174 225.478 719.5 243 c 0,188,189 - 720.689 277.847 l 0,190,191 - 720.838 278.919 720.838 278.919 721 280 c 0,192,193 - 748.912 251.652 748.912 251.652 749.34 226.442 c 0,194,195 - 745.982 208.436 l 0,196,197 - 737.062 186.118 737.062 186.118 704.5 166.5 c 0,198,199 - 624 118.001 624 118.001 589 120 c 0,0,1 -360 1621 m 1,94,95 - 340 1634.99 340 1634.99 344.5 1723 c 0,96,97 - 349 1811 349 1811 388 1899.5 c 0,98,99 - 427.003 1988.01 427.003 1988.01 506 2041 c 0,100,101 - 544.749 2066.99 544.749 2066.99 596.004 2067.01 c 0,102,103 - 649.255 2067.03 649.255 2067.03 716 2039 c 0,104,105 - 636.712 2038.65 l 0,106,107 - 592.755 2036.02 592.755 2036.02 559.5 2027.5 c 0,108,109 - 499 2012.01 499 2012.01 472 1930 c 0,110,111 - 436 1825 436 1825 502 1823.5 c 0,112,113 - 568 1822 568 1822 529 1888 c 0,114,115 - 577.001 1874.99 577.001 1874.99 580.5 1817 c 0,116,117 - 578.704 1787.04 l 0,118,119 - 571.864 1754.29 571.864 1754.29 541 1740 c 0,120,121 - 462.986 1703.99 462.986 1703.99 425.5 1700.5 c 0,122,123 - 388 1697.01 388 1697.01 360 1621 c 1,94,95 -EndSplineSet -EndChar -StartChar: Zacute -Encoding: 377 377 91 -Width: 1478 -Flags: HMW -HStem: -67.4639 277.536<303.18 1275.14> 1344.32 217.56<298.476 1314.54> 1899.4 128.77<686.556 1148.72> -Fore -1282.79 1570.7 m 0,0,1 - 1372.16 1569.53 1372.16 1569.53 1401.56 1504.26 c 0,2,3 - 1421.76 1459.42 1421.76 1459.42 1421.7 1406.8 c 0,4,5 - 1421.67 1382.84 1421.67 1382.84 1417.44 1357.26 c 0,6,7 - 1403.93 1275.56 1403.93 1275.56 1357.46 1202.62 c 0,8,9 - 1311 1129.7 1311 1129.7 1249.86 1114.42 c 0,10,11 - 1352.93 1230.64 1352.93 1230.64 1352.86 1291.21 c 0,12,13 - 1352.82 1328.08 1352.82 1328.08 1314.54 1344.32 c 0,14,15 - 1293.11 1353.42 1293.11 1353.42 1272.11 1353.51 c 0,16,17 - 1250.07 1353.61 1250.07 1353.61 1228.5 1343.8 c 0,18,19 - 1173.58 1318.83 1173.58 1318.83 1121.68 1229.66 c 0,20,21 - 1084.05 1164.98 1084.05 1164.98 1074.64 1051.5 c 0,22,23 - 1065.23 938.016 1065.23 938.016 1046.41 863.928 c 0,24,25 - 1028.77 800.421 1028.77 800.421 986.436 744.563 c 0,26,27 - 944.1 688.704 944.1 688.704 870.012 734.568 c 0,28,29 - 920.58 743.976 920.58 743.976 926.46 779.256 c 0,30,31 - 932.34 814.536 932.34 814.536 901.764 815.712 c 0,32,33 - 839.436 816.888 839.436 816.888 810.036 749.268 c 0,34,35 - 780.636 681.646 780.636 681.646 759.468 600.504 c 0,36,37 - 738.3 519.36 738.3 519.36 714.78 452.328 c 0,38,39 - 691.26 385.296 691.26 385.296 643.044 390 c 0,40,41 - 681.852 437.04 681.852 437.04 669.504 464.088 c 0,42,43 - 657.156 491.136 657.156 491.136 635.988 486.432 c 0,44,45 - 583.066 473.496 583.066 473.496 536.616 361.188 c 0,46,47 - 490.164 248.88 490.164 248.88 506.628 213.6 c 0,48,49 - 532.5 153.624 532.5 153.624 653.628 151.271 c 0,50,51 - 718.72 153.447 l 0,52,53 - 779.51 159.89 779.51 159.89 790.044 184.2 c 0,54,55 - 805.332 218.304 805.332 218.304 770.052 233.592 c 0,56,57 - 734.771 248.88 734.771 248.88 718.308 224.184 c 0,58,59 - 753.588 322.968 753.588 322.968 848.256 248.88 c 0,60,61 - 942.924 174.792 942.924 174.792 1031.12 157.152 c 0,62,63 - 1075.81 147.744 1075.81 147.744 1142.84 174.792 c 0,64,65 - 1209.88 201.84 1209.88 201.84 1275.14 210.072 c 0,66,67 - 1340.41 218.304 1340.41 218.304 1392.74 178.908 c 0,68,69 - 1445.07 139.512 1445.07 139.512 1460.36 -1.6084 c 0,70,71 - 1422.73 93.6475 1422.73 93.6475 1351.58 86.5918 c 0,72,73 - 1280.44 79.5361 1280.44 79.5361 1203.41 28.9678 c 0,74,75 - 1126.37 -21.611 1126.37 -21.611 1058.76 -84.5156 c 0,76,77 - 991.14 -147.432 991.14 -147.432 961.74 -167.424 c 0,78,79 - 922.932 -190.944 922.932 -190.944 842.964 -180.36 c 0,80,81 - 762.996 -169.776 762.996 -169.776 750.06 -123.912 c 0,82,83 - 769.443 -127.877 769.443 -127.877 787.093 -127.799 c 0,84,85 - 816.561 -127.668 816.561 -127.668 841.2 -116.269 c 0,86,87 - 857.586 -108.687 857.586 -108.687 858.002 -97.3406 c 0,88,89 - 854.262 -84.773 l 0,90,91 - 847.346 -72.9171 847.346 -72.9171 827.676 -58.0557 c 0,92,93 - 767.7 -12.1925 767.7 -12.1925 569.544 -27.4805 c 0,94,95 - 371.388 -42.7687 371.388 -42.7687 303.18 -67.4639 c 0,96,97 - 220.858 -95.6885 220.858 -95.6885 118.548 -67.4639 c 0,98,99 - 16.2354 -39.2402 16.2354 -39.2402 16.2354 38.376 c 0,100,101 - 85.6201 -29.832 85.6201 -29.832 165 -9.25195 c 0,102,103 - 244.38 11.3281 244.38 11.3281 263.196 112.464 c 0,104,105 - 274.956 177.144 274.956 177.144 259.668 261.816 c 0,106,107 - 244.38 346.488 244.38 346.488 244.38 418.224 c 0,108,109 - 244.38 489.96 244.38 489.96 280.836 532.296 c 0,110,111 - 317.292 574.632 317.292 574.632 434.892 554.64 c 0,112,113 - 377.268 542.88 377.268 542.88 370.212 521.712 c 0,114,115 - 364.587 510.863 364.587 510.863 364.316 503.172 c 0,116,117 - 366.552 493.963 l 0,118,119 - 370.814 487.229 370.814 487.229 383.147 485.256 c 0,120,121 - 460.764 467.616 460.764 467.616 557.784 590.508 c 0,122,123 - 654.804 713.4 654.804 713.4 577.188 774.552 c 0,124,125 - 541.908 800.424 541.908 800.424 519.563 766.908 c 0,126,127 - 497.219 733.39 497.219 733.39 486.636 702.816 c 0,128,129 - 459.588 771.022 459.588 771.022 540.144 836.88 c 0,130,131 - 620.7 902.736 620.7 902.736 721.836 973.884 c 0,132,133 - 822.936 1045 822.936 1045 900 1125 c 0,134,135 - 954.038 1181.1 954.038 1181.1 953.961 1245.89 c 0,136,137 - 953.928 1273.45 953.928 1273.45 944.1 1302.58 c 0,138,139 - 936.209 1323.38 936.209 1323.38 914.101 1323.4 c 0,140,141 - 899.961 1323.41 899.961 1323.41 880.008 1314.92 c 0,142,143 - 828.957 1293.22 828.957 1293.22 771.228 1271.41 c 0,144,145 - 713.604 1249.66 713.604 1249.66 668.328 1255.54 c 0,146,147 - 623.052 1261.42 623.052 1261.42 623.052 1349.62 c 0,148,149 - 673.62 1284.94 673.62 1284.94 723.012 1320.22 c 0,150,151 - 739.476 1330.8 739.476 1330.8 740.063 1354.32 c 0,152,153 - 737.416 1374.98 l 0,154,155 - 734.913 1381.67 734.913 1381.67 730.067 1384.9 c 0,156,157 - 667.74 1423.71 667.74 1423.71 607.764 1389.01 c 0,158,159 - 547.788 1354.31 547.788 1354.31 488.988 1308.46 c 0,160,161 - 430.188 1262.59 430.188 1262.59 370.212 1237.9 c 0,162,163 - 310.234 1213.2 310.234 1213.2 249.084 1273.18 c 0,164,165 - 213.804 1304.93 213.804 1304.93 213.804 1361.38 c 0,166,167 - 217.335 1346.08 217.335 1346.08 264.96 1316.1 c 0,168,169 - 297.51 1295.61 297.51 1295.61 325.383 1295.71 c 0,170,171 - 338.304 1295.75 338.304 1295.75 350.22 1300.22 c 0,172,173 - 385.506 1313.17 385.506 1313.17 402.552 1333.74 c 0,174,175 - 414.513 1348.18 414.513 1348.18 414.612 1380.26 c 0,176,177 - 414.655 1393.92 414.655 1393.92 412.548 1410.77 c 0,178,179 - 393.73 1541.3 393.73 1541.3 254.964 1490.15 c 0,180,181 - 116.189 1438.98 116.189 1438.98 72.6836 1360.2 c 0,182,183 - 45.6312 1311.97 45.6312 1311.97 30.3477 1250.83 c 0,184,185 - 28.8703 1292.72 l 0,186,187 - 30.8234 1327.58 30.8234 1327.58 43.2842 1363.14 c 0,188,189 - 63.2687 1420.17 63.2687 1420.17 86.7959 1451.93 c 0,190,191 - 162.06 1557.77 162.06 1557.77 298.476 1561.88 c 0,192,193 - 434.892 1566.01 434.892 1566.01 547.788 1534.25 c 0,194,195 - 615.363 1515.28 615.363 1515.28 705.509 1515.29 c 0,196,197 - 794.181 1515.29 794.181 1515.29 904.704 1533.66 c 0,198,199 - 1127.58 1570.7 1127.58 1570.7 1282.79 1570.7 c 0,0,1 -1148.72 2028.17 m 1,119,120 - 1051.12 1851.78 1051.12 1851.78 857.076 1850.59 c 0,121,122 - 775.932 1849.42 775.932 1849.42 745.944 1796.5 c 0,123,124 - 715.958 1743.58 715.958 1743.58 699.492 1669.49 c 0,125,126 - 655.406 1731.47 655.406 1731.47 655.406 1793.96 c 0,127,128 - 655.405 1846.49 655.405 1846.49 686.556 1899.4 c 0,129,130 - 754.76 2015.22 754.76 2015.22 860.604 2057.57 c 0,131,132 - 898.203 2071.67 898.203 2071.67 939.396 2074.03 c 0,133,134 - 980.556 2076.39 980.556 2076.39 988.788 2050.51 c 0,135,136 - 946.452 2061.1 946.452 2061.1 915.288 2031.7 c 0,137,138 - 884.124 2002.3 884.124 2002.3 911.172 1978.78 c 0,139,140 - 946.337 1945.68 946.337 1945.68 985.142 1945.74 c 0,141,142 - 1012.52 1945.77 1012.52 1945.77 1041.71 1962.31 c 0,143,144 - 1112.3 2002.32 1112.3 2002.32 1148.72 2028.17 c 1,119,120 -EndSplineSet -EndChar -StartChar: zacute -Encoding: 378 378 92 -Width: 1265 -Flags: HMW -HStem: 9 236<259 1085.5> 1209.5 185<255 1119> 1681.5 109.5<585 978> -Fore -1092 1402 m 0,0,1 - 1168 1400.99 1168 1400.99 1193 1345.5 c 0,2,3 - 1210.2 1307.32 1210.2 1307.32 1210.13 1262.5 c 0,4,5 - 1206.5 1220.5 l 0,6,7 - 1194.99 1150.99 1194.99 1150.99 1155.5 1089 c 0,8,9 - 1116.01 1027.01 1116.01 1027.01 1064 1014 c 0,10,11 - 1151.63 1112.81 1151.63 1112.81 1151.58 1164.32 c 0,12,13 - 1151.55 1195.69 1151.55 1195.69 1119 1209.5 c 0,14,15 - 1100.65 1217.29 1100.65 1217.29 1082.66 1217.31 c 0,16,17 - 1016.35 1217.4 1016.35 1217.4 955 1112 c 0,18,19 - 922.999 1056.99 922.999 1056.99 915 960.5 c 0,20,21 - 907 864 907 864 891 801 c 0,22,23 - 876 747 876 747 840 699.5 c 0,24,25 - 804 652 804 652 741 691 c 0,26,27 - 784 699 784 699 789 729 c 0,28,29 - 794 759 794 759 768 760 c 0,30,31 - 743.841 757.016 l 0,32,33 - 708.911 746.994 708.911 746.994 690 703.5 c 0,34,35 - 665 646 665 646 647 577 c 0,36,37 - 629 508 629 508 609 451 c 0,38,39 - 590.312 397.737 590.312 397.737 553.287 397.738 c 0,40,41 - 550.689 397.738 550.689 397.738 548 398 c 0,42,43 - 581 438 581 438 570.5 461 c 0,44,45 - 561.842 479.965 561.842 479.965 548.085 480.573 c 0,46,47 - 542 480 l 0,48,49 - 497 469 497 469 457.5 373.5 c 0,50,51 - 418 278 418 278 432 248 c 0,52,53 - 454.001 196.999 454.001 196.999 557 195 c 0,54,55 - 614.825 197.124 l 0,56,57 - 664.258 202.828 664.258 202.828 673 223 c 0,58,59 - 686 251.999 686 251.999 656 265 c 0,60,61 - 626 278 626 278 612 257 c 0,62,63 - 642 341 642 341 722.5 278 c 0,64,65 - 803 215 803 215 878 200 c 0,66,67 - 916 192.001 916 192.001 973 215 c 0,68,69 - 1030 237.999 1030 237.999 1085.5 245 c 0,70,71 - 1118.85 245.448 l 0,72,73 - 1154.79 241.615 1154.79 241.615 1185.5 218.5 c 0,74,75 - 1229.99 185.009 1229.99 185.009 1243 65 c 0,76,77 - 1213.43 139.87 1213.43 139.87 1159.49 140.41 c 0,78,79 - 1155.08 140.454 1155.08 140.454 1150.5 140 c 0,80,81 - 1090.01 134 1090.01 134 1024.5 91 c 0,82,83 - 959 48 959 48 901.5 -5.5 c 0,84,85 - 844 -59 844 -59 819 -76 c 0,86,87 - 786 -95.9999 786 -95.9999 718 -87 c 0,88,89 - 649.999 -77.9999 649.999 -77.9999 639 -39 c 0,90,91 - 673.033 -42.2686 l 0,92,93 - 696.616 -41.7 696.616 -41.7 716.5 -32.5 c 0,94,95 - 750 -17 750 -17 705 17 c 0,96,97 - 654 56 654 56 485.5 43 c 0,98,99 - 317 30 317 30 259 9 c 0,100,101 - 223.777 -3.07646 223.777 -3.07646 184.25 -2.99951 c 0,102,103 - 145.223 -2.92354 145.223 -2.92354 102 9 c 0,104,105 - 15 33 15 33 15 99 c 0,106,107 - 74 41 74 41 141.5 58.5 c 0,108,109 - 208.999 75.9999 208.999 75.9999 225 162 c 0,110,111 - 229.41 186.252 229.41 186.252 229.347 213.809 c 0,112,113 - 229.268 248.748 229.268 248.748 222 289 c 0,114,115 - 209 360.997 209 360.997 209 422 c 0,116,117 - 209 483.001 209 483.001 240 519 c 0,118,119 - 261.061 543.458 261.061 543.458 313.971 543.453 c 0,120,121 - 338.939 543.45 338.939 543.45 371 538 c 0,122,123 - 322 528 322 528 316 510 c 0,124,125 - 311.032 500.419 311.032 500.419 310.975 493.735 c 0,126,127 - 310.877 482.339 310.877 482.339 327 479 c 0,128,129 - 393 464 393 464 475.5 568.5 c 0,130,131 - 521.099 626.259 521.099 626.259 521.332 667.979 c 0,132,133 - 521.432 685.754 521.432 685.754 513.296 700.618 c 0,134,135 - 505.978 713.987 505.978 713.987 492 725 c 0,136,137 - 462 747 462 747 443 718.5 c 0,138,139 - 424 690 424 690 415 664 c 0,140,141 - 409.149 678.754 409.149 678.754 409.22 693.379 c 0,142,143 - 409.425 736.246 409.425 736.246 460.5 778 c 0,144,145 - 529.009 834.007 529.009 834.007 615 894.5 c 0,146,147 - 700.997 954.997 700.997 954.997 766.5 1023 c 0,148,149 - 812.481 1070.73 812.481 1070.73 812.385 1125.86 c 0,150,151 - 812.344 1149.27 812.344 1149.27 804 1174 c 0,152,153 - 793 1202.99 793 1202.99 749.5 1184.5 c 0,154,155 - 705.784 1165.91 705.784 1165.91 657 1147.5 c 0,156,157 - 618.64 1133.02 618.64 1133.02 586.715 1132.94 c 0,158,159 - 577.86 1132.92 577.86 1132.92 569.5 1134 c 0,160,161 - 531 1138.99 531 1138.99 531 1214 c 0,162,163 - 558.823 1178.41 558.823 1178.41 586.228 1178.41 c 0,164,165 - 601.176 1178.41 601.176 1178.41 616 1189 c 0,166,167 - 630 1198 630 1198 630.5 1218 c 0,168,169 - 627.915 1236.42 l 0,170,171 - 625.807 1241.46 625.807 1241.46 622 1244 c 0,172,173 - 593.97 1261.45 593.97 1261.45 566.502 1261.43 c 0,174,175 - 542.028 1261.4 542.028 1261.4 518 1247.5 c 0,176,177 - 466.973 1217.98 466.973 1217.98 417 1179 c 0,178,179 - 367 1140 367 1140 316 1119 c 0,180,181 - 301.146 1112.88 301.146 1112.88 286.207 1112.88 c 0,182,183 - 249.855 1112.85 249.855 1112.85 213 1149 c 0,184,185 - 183 1176 183 1176 183 1224 c 0,186,187 - 185.999 1211 185.999 1211 226.5 1185.5 c 0,188,189 - 267 1160 267 1160 299 1172 c 0,190,191 - 329 1182.99 329 1182.99 343.5 1200.5 c 0,192,193 - 353.794 1212.93 353.794 1212.93 353.756 1240.72 c 0,194,195 - 353.74 1252.08 353.74 1252.08 352 1266 c 0,196,197 - 340.537 1345.52 340.537 1345.52 276.723 1345.75 c 0,198,199 - 251.463 1345.84 251.463 1345.84 218 1333.5 c 0,200,201 - 99.9967 1290 99.9967 1290 63 1223 c 0,202,203 - 40 1182.01 40 1182.01 27 1130 c 0,204,205 - 25.9714 1169.14 l 0,206,207 - 28.0316 1197.06 28.0316 1197.06 38 1225.5 c 0,208,209 - 55.0032 1274 55.0032 1274 75 1301 c 0,210,211 - 139.004 1391.01 139.004 1391.01 255 1394.5 c 0,212,213 - 335.599 1393.09 l 0,214,215 - 405.421 1388.32 405.421 1388.32 467 1371 c 0,216,217 - 524.66 1354.82 524.66 1354.82 601.628 1354.88 c 0,218,219 - 676.847 1354.93 676.847 1354.93 770.5 1370.5 c 0,220,221 - 960 1402 960 1402 1092 1402 c 0,0,1 -978 1791 m 1,119,120 - 895.003 1641.01 895.003 1641.01 730 1640 c 0,121,122 - 660.997 1638.99 660.997 1638.99 635.5 1594 c 0,123,124 - 610 1549 610 1549 596 1486 c 0,125,126 - 558.765 1538.35 558.765 1538.35 558.513 1591.13 c 0,127,128 - 558.415 1611.74 558.415 1611.74 563.958 1632.42 c 0,129,130 - 570.523 1656.91 570.523 1656.91 585 1681.5 c 0,131,132 - 642.997 1780 642.997 1780 733 1816 c 0,133,134 - 765.015 1828.01 765.015 1828.01 800 1830 c 0,135,136 - 822.603 1828.04 l 0,137,138 - 837.667 1823.62 837.667 1823.62 842 1810 c 0,139,140 - 818.356 1812.17 l 0,141,142 - 796.883 1810.4 796.883 1810.4 779.5 1794 c 0,143,144 - 765.367 1780.66 765.367 1780.66 765.313 1768.75 c 0,145,146 - 765.267 1758.33 765.267 1758.33 776 1749 c 0,147,148 - 805.866 1720.89 805.866 1720.89 838.816 1720.9 c 0,149,150 - 862.136 1720.91 862.136 1720.91 887 1735 c 0,151,152 - 947.068 1769.04 947.068 1769.04 978 1791 c 1,119,120 -EndSplineSet -EndChar -StartChar: Zdotaccent -Encoding: 379 379 93 -Width: 1555 -Flags: HMW -HStem: -105.28 182.83<79.9004 1308.01> 1407.18 141.47<120.32 1356.42> 1778.01 73.79<756.7 935.3> -Fore -899.58 1112.02 m 1,0,1 - 885.839 1123.16 885.839 1123.16 875.473 1123.15 c 0,2,3 - 859.6 1123.14 859.6 1123.14 851.64 1096.98 c 0,4,5 - 838.48 1053.73 838.48 1053.73 837.54 1039.64 c 0,6,7 - 802.76 1085.7 802.76 1085.7 843.18 1152.44 c 0,8,9 - 883.574 1219.13 883.574 1219.13 912.27 1277.46 c 0,10,11 - 926.839 1307.07 926.839 1307.07 926.965 1330.74 c 0,12,13 - 927.063 1349.1 927.063 1349.1 918.475 1363.88 c 0,14,15 - 916.345 1367.54 916.345 1367.54 913.68 1370.99 c 0,16,17 - 886.421 1406.24 886.421 1406.24 716.28 1389.32 c 0,18,19 - 660.522 1383.74 660.522 1383.74 630.27 1370.05 c 0,20,21 - 612.219 1361.74 612.219 1361.74 611.81 1344.53 c 0,22,23 - 615.659 1325.47 l 0,24,25 - 616.892 1322.25 616.892 1322.25 618.52 1318.82 c 0,26,27 - 633.4 1284.81 633.4 1284.81 658.163 1284.45 c 0,28,29 - 675.39 1287.8 l 0,30,31 - 712.521 1301.9 712.521 1301.9 742.6 1332.92 c 0,32,33 - 742.6 1263.36 742.6 1263.36 691.84 1237.04 c 0,34,35 - 641.08 1210.71 641.08 1210.71 574.81 1211.66 c 0,36,37 - 508.505 1212.61 508.505 1212.61 444.62 1231.87 c 0,38,39 - 380.701 1251.15 380.701 1251.15 354.38 1272.76 c 0,40,41 - 279.181 1331.03 279.181 1331.03 195.05 1417.99 c 0,42,43 - 153.956 1460.46 153.956 1460.46 120.822 1460.88 c 0,44,45 - 102.421 1457.64 l 0,46,47 - 78.9938 1448.77 78.9938 1448.77 60.1602 1415.64 c 0,48,49 - 48.9799 1395.91 48.9799 1395.91 48.8423 1384.23 c 0,50,51 - 48.7833 1379.22 48.7833 1379.22 50.7598 1375.69 c 0,52,53 - 57.38 1363.87 57.38 1363.87 71.4404 1342.32 c 0,54,55 - -2.82025 1366.76 -2.82025 1366.76 7.51953 1438.2 c 0,56,57 - 23.5391 1548.56 23.5391 1548.56 110.343 1548.95 c 0,58,59 - 115.22 1548.97 115.22 1548.97 120.32 1548.65 c 0,60,61 - 199.929 1547.52 l 0,62,63 - 257.241 1549.51 257.241 1549.51 315.84 1559.46 c 0,64,65 - 345.926 1565.1 345.926 1565.1 379.29 1598.47 c 0,66,67 - 400.507 1619.69 400.507 1619.69 400.634 1635.02 c 0,68,69 - 400.707 1643.79 400.707 1643.79 393.86 1650.64 c 0,70,71 - 368.48 1673.2 368.48 1673.2 344.98 1664.74 c 0,72,73 - 321.479 1656.28 321.479 1656.28 291.4 1642.18 c 0,74,75 - 331.304 1714.47 331.304 1714.47 372.273 1715.24 c 0,76,77 - 390.844 1711.94 l 0,78,79 - 407.307 1705.8 407.307 1705.8 423.94 1688.24 c 0,80,81 - 491.602 1616.81 491.602 1616.81 547.08 1574.5 c 0,82,83 - 628.867 1510.58 628.867 1510.58 781.14 1499.3 c 0,84,85 - 854.669 1497.47 l 0,86,87 - 948.034 1500.65 948.034 1500.65 988.88 1535.96 c 0,88,89 - 998.844 1545.01 998.844 1545.01 998.771 1553.85 c 0,90,91 - 998.693 1563.36 998.693 1563.36 987 1572.62 c 0,92,93 - 960.068 1591.04 960.068 1591.04 941.426 1591.04 c 0,94,95 - 935.336 1591.04 935.336 1591.04 930.13 1589.07 c 0,96,97 - 908.941 1581.06 908.941 1581.06 880.78 1563.22 c 0,98,99 - 886.421 1611.17 886.421 1611.17 938.12 1632.78 c 0,100,101 - 949.999 1637.46 949.999 1637.46 966.568 1637.38 c 0,102,103 - 993.252 1637.26 993.252 1637.26 1032.12 1624.79 c 0,104,105 - 1095.13 1604.58 1095.13 1604.58 1169.36 1586.72 c 0,106,107 - 1233.67 1571.25 1233.67 1571.25 1298.71 1571.3 c 0,108,109 - 1308.76 1571.3 1308.76 1571.3 1318.82 1571.68 c 0,110,111 - 1394.03 1574.5 1394.03 1574.5 1449.48 1634.66 c 0,112,113 - 1507.75 1698.57 1507.75 1698.57 1441.02 1767.2 c 0,114,115 - 1512.47 1741.82 1512.47 1741.82 1512.93 1690.12 c 0,116,117 - 1509.33 1652.82 l 0,118,119 - 1502.52 1618.66 1502.52 1618.66 1482.85 1582.96 c 0,120,121 - 1452.26 1527.44 1452.26 1527.44 1410.47 1477.68 c 0,122,123 - 1368.67 1427.9 1368.67 1427.9 1356.42 1407.18 c 0,124,125 - 1319.75 1342.31 1319.75 1342.31 1317.88 1291.56 c 0,126,127 - 1316.11 1243.75 1316.11 1243.75 1225.93 1243.47 c 0,128,129 - 1220.37 1243.46 1220.37 1243.46 1214.48 1243.62 c 0,130,131 - 1256.77 1262.41 1256.77 1262.41 1278.87 1299.55 c 0,132,133 - 1287.73 1314.43 1287.73 1314.43 1288.05 1325.17 c 0,134,135 - 1284.94 1337.23 l 0,136,137 - 1280.54 1344.11 1280.54 1344.11 1269.94 1347.96 c 0,138,139 - 1254.4 1352.93 1254.4 1352.93 1239.99 1352.87 c 0,140,141 - 1210.82 1352.75 1210.82 1352.75 1186.28 1331.98 c 0,142,143 - 1149.62 1300.96 1149.62 1300.96 1128 1256.78 c 0,144,145 - 1106.39 1212.61 1106.39 1212.61 1102.62 1171.71 c 0,146,147 - 1103.32 1145.19 l 0,148,149 - 1106.66 1129.34 1106.66 1129.34 1118.6 1127.06 c 0,150,151 - 1149.01 1123.83 l 0,152,153 - 1183.71 1125.42 1183.71 1125.42 1184.4 1159.02 c 0,154,155 - 1181.58 1187.33 l 0,156,157 - 1175.31 1213.23 1175.31 1213.23 1155.26 1229.52 c 0,158,159 - 1207.9 1213.54 1207.9 1213.54 1220.12 1178.76 c 0,160,161 - 1226.02 1159.08 1226.02 1159.08 1226.03 1142.66 c 0,162,163 - 1226.05 1112.03 1226.05 1112.03 1205.55 1092.75 c 0,164,165 - 1174.05 1063.13 1174.05 1063.13 1128 1038.7 c 0,166,167 - 1081.99 1014.29 1081.99 1014.29 1040.58 984.18 c 0,168,169 - 999.219 954.096 999.219 954.096 997.34 898.64 c 0,170,171 - 995.46 844.12 995.46 844.12 1074.42 873.26 c 0,172,173 - 1063.14 833.78 1063.14 833.78 1026.48 814.98 c 0,174,175 - 989.819 796.18 989.819 796.18 960.68 786.78 c 0,176,177 - 862.921 756.701 862.921 756.701 761.4 647.66 c 0,178,179 - 659.881 538.622 659.881 538.622 606.3 418.3 c 0,180,181 - 567.675 331.563 567.675 331.563 567.641 256.305 c 0,182,183 - 567.628 227.167 567.628 227.167 573.4 199.75 c 0,184,185 - 594.081 101.52 594.081 101.52 740.72 94.9404 c 0,186,187 - 764.158 96.9563 l 0,188,189 - 790.657 103.873 790.657 103.873 806.99 132.54 c 0,190,191 - 817.439 150.879 817.439 150.879 817.342 166.896 c 0,192,193 - 817.225 186.181 817.225 186.181 801.82 202.1 c 0,194,195 - 774.56 227.48 774.56 227.48 739.78 213.38 c 0,196,197 - 705 199.28 705 199.28 684.32 175.78 c 0,198,199 - 694.659 249.099 694.659 249.099 734.61 259.91 c 0,200,201 - 749.507 263.941 749.507 263.941 765.712 263.855 c 0,202,203 - 792.962 263.709 792.962 263.709 823.91 251.92 c 0,204,205 - 873.255 233.122 873.255 233.122 923.55 200.22 c 0,206,207 - 973.841 167.32 973.841 167.32 1004.86 155.1 c 0,208,209 - 1213.54 67.6797 1213.54 67.6797 1308.01 77.5498 c 0,210,211 - 1402.48 87.42 1402.48 87.42 1532.2 208.68 c 0,212,213 - 1532.2 110.917 1532.2 110.917 1428.33 42.7695 c 0,214,215 - 1324.45 -25.381 1324.45 -25.381 1247.38 -31.96 c 0,216,217 - 1181.98 -32.991 l 0,218,219 - 1127.84 -30.5965 1127.84 -30.5965 1074.42 -17.3896 c 0,220,221 - 1048.4 -10.9567 1048.4 -10.9567 1024.38 -10.9157 c 0,222,223 - 969.438 -10.8217 969.438 -10.8217 924.96 -44.1797 c 0,224,225 - 895.82 -63.9199 895.82 -63.9199 926.84 -93.0596 c 0,226,227 - 952.966 -116.283 952.966 -116.283 970.127 -116.534 c 0,228,229 - 975.194 -116.609 975.194 -116.609 979.48 -114.68 c 0,230,-1 - 1023.66 -94.9404 l 0,231,232 - 1010.51 -152.28 1010.51 -152.28 970.08 -156.51 c 0,233,234 - 929.659 -160.74 929.659 -160.74 881.25 -141.94 c 0,235,236 - 832.84 -123.14 832.84 -123.14 786.31 -95.4102 c 0,237,238 - 739.78 -67.6797 739.78 -67.6797 714.4 -61.0996 c 0,239,240 - 634.502 -38.5407 634.502 -38.5407 561.65 2.82031 c 0,241,242 - 528.265 21.7742 528.265 21.7742 498.729 21.7766 c 0,243,244 - 463.815 21.7794 463.815 21.7794 434.28 -4.7002 c 0,245,246 - 419.28 -18.2478 419.28 -18.2478 419.225 -32.0451 c 0,247,248 - 419.172 -45.0517 419.172 -45.0517 432.4 -58.2803 c 0,249,250 - 449.496 -77.2754 449.496 -77.2754 469.951 -77.5578 c 0,251,252 - 489.438 -73.8738 l 0,253,254 - 500.884 -69.5507 500.884 -69.5507 513.24 -60.1602 c 0,255,256 - 513.24 -103.401 513.24 -103.401 457.31 -113.74 c 0,257,258 - 401.38 -124.08 401.38 -124.08 364.72 -107.16 c 0,259,260 - 349.68 -99.6393 349.68 -99.6393 302.21 -62.5098 c 0,261,262 - 254.739 -25.3793 254.739 -25.3793 203.98 -2.82031 c 0,263,264 - 153.22 19.7402 153.22 19.7402 114.68 6.11035 c 0,265,266 - 76.1396 -7.51953 76.1396 -7.51953 79.9004 -105.28 c 0,267,268 - 80.8399 -158.86 80.8399 -158.86 137.71 -173.43 c 0,269,270 - 166.776 -180.876 166.776 -180.876 194.982 -180.834 c 0,271,272 - 221.964 -180.794 221.964 -180.794 248.16 -173.9 c 0,273,274 - 210.53 -210.624 210.53 -210.624 164.261 -210.829 c 0,275,276 - 141.869 -210.928 141.869 -210.928 117.454 -202.474 c 0,277,278 - 87.722 -192.179 87.722 -192.179 54.9902 -169.2 c 0,279,280 - -60.1601 -88.3605 -60.1601 -88.3605 20.6797 40.4199 c 0,281,282 - 101.52 169.2 101.52 169.2 232.65 252.39 c 0,283,284 - 363.779 335.579 363.779 335.579 440.86 465.3 c 0,285,286 - 506.658 578.096 506.658 578.096 568.23 757.17 c 0,287,288 - 629.8 936.24 629.8 936.24 731.32 956.92 c 0,289,290 - 715.341 942.82 715.341 942.82 710.17 918.38 c 0,291,292 - 705 893.94 705 893.94 719.1 878.9 c 0,293,294 - 731.321 864.8 731.321 864.8 767.04 894.41 c 0,295,296 - 802.76 924.02 802.76 924.02 837.54 967.73 c 0,297,298 - 872.326 1011.45 872.326 1011.45 893.47 1054.68 c 0,299,300 - 905.768 1079.82 905.768 1079.82 905.83 1095.11 c 0,301,302 - 905.875 1106.12 905.875 1106.12 899.58 1112.02 c 1,0,1 -830.02 1714.56 m 0,157,158 - 744.479 1724.89 744.479 1724.89 756.7 1778.01 c 0,159,160 - 768.919 1831.12 768.919 1831.12 815.92 1867.78 c 0,161,162 - 850.152 1894.18 850.152 1894.18 877.328 1894.33 c 0,163,164 - 894.699 1894.43 894.699 1894.43 909.187 1883.81 c 0,165,166 - 923.688 1873.18 923.688 1873.18 935.3 1851.8 c 0,167,168 - 940.628 1841.7 940.628 1841.7 940.686 1829.77 c 0,169,170 - 940.784 1809.32 940.784 1809.32 925.404 1783.45 c 0,171,172 - 919.676 1773.82 919.676 1773.82 911.8 1763.44 c 0,173,174 - 874.489 1714.25 874.489 1714.25 837.937 1714.03 c 0,175,176 - 833.974 1714.01 833.974 1714.01 830.02 1714.56 c 0,157,158 -EndSplineSet -EndChar -StartChar: zdotaccent -Encoding: 380 380 94 -Width: 1343 -Flags: HMW -HStem: -17.54 156.04<86.6797 1130.55> 1268.38 120.79<120.989 1172.38> 1583.75 62.51<661.489 814.239> -Fore -783.22 1017.4 m 0,0,1 - 772.103 1026.72 772.103 1026.72 763.586 1027.15 c 0,2,3 - 754.464 1024.58 l 0,4,5 - 747.245 1019.63 747.245 1019.63 742.8 1005.18 c 0,6,7 - 731.52 968.522 731.52 968.522 731.52 956.301 c 0,8,9 - 717.44 974.78 717.44 974.78 717.468 996.967 c 0,10,11 - 717.499 1022.18 717.499 1022.18 735.75 1052.18 c 0,12,13 - 770.065 1108.59 770.065 1108.59 794.029 1157.93 c 0,14,15 - 806.23 1183.05 806.23 1183.05 806.254 1203.18 c 0,16,17 - 806.278 1222.59 806.278 1222.59 794.97 1237.36 c 0,18,19 - 779.213 1257.94 779.213 1257.94 706.485 1257.84 c 0,20,21 - 672.904 1257.79 672.904 1257.79 627.18 1253.34 c 0,22,23 - 520.02 1242.06 520.02 1242.06 544.46 1194.12 c 0,24,25 - 557.187 1164.42 557.187 1164.42 578.153 1163.98 c 0,26,27 - 592.869 1166.86 l 0,28,29 - 624.375 1179.09 624.375 1179.09 649.739 1205.4 c 0,30,31 - 649.739 1146.18 649.739 1146.18 606.5 1124.09 c 0,32,33 - 565.004 1102.89 565.004 1102.89 511.821 1102.9 c 0,34,35 - 509.586 1102.9 509.586 1102.9 507.33 1102.94 c 0,36,37 - 451.4 1103.89 451.4 1103.89 396.88 1119.86 c 0,38,39 - 342.376 1135.83 342.376 1135.83 319.8 1154.64 c 0,40,41 - 255.841 1203.55 255.841 1203.55 183.97 1277.78 c 0,42,43 - 148.579 1314.33 148.579 1314.33 120.359 1314.45 c 0,44,45 - 96.4207 1314.55 96.4207 1314.55 77.6431 1288.43 c 0,46,47 - 73.5809 1282.78 73.5809 1282.78 69.7598 1275.9 c 0,48,49 - 55.6592 1252.4 55.6592 1252.4 61.7695 1242.06 c 0,50,-1 - 79.1592 1213.86 l 0,51,52 - 23.9276 1232.27 23.9276 1232.27 23.9089 1277.95 c 0,53,54 - 23.9056 1285.91 23.9056 1285.91 25.5801 1294.7 c 0,55,56 - 39.6797 1394.34 39.6797 1394.34 120.989 1389.17 c 0,57,58 - 193.089 1388.53 l 0,59,60 - 239.478 1390.61 239.478 1390.61 286.899 1399.04 c 0,61,62 - 312.279 1402.81 312.279 1402.81 340.949 1431.47 c 0,63,64 - 359.124 1449.64 359.124 1449.64 359.356 1462.34 c 0,65,66 - 356.047 1472.51 l 0,67,68 - 355.007 1473.89 355.007 1473.89 353.64 1475.18 c 0,69,70 - 337.706 1489.73 337.706 1489.73 322.537 1489.73 c 0,71,72 - 317.125 1489.72 317.125 1489.72 311.81 1487.87 c 0,73,74 - 291.561 1480.81 291.561 1480.81 266.22 1468.6 c 0,75,76 - 300.537 1530.26 300.537 1530.26 335.576 1530.55 c 0,77,78 - 347.721 1530.65 347.721 1530.65 359.953 1523.37 c 0,79,80 - 369.46 1517.72 369.46 1517.72 379.02 1507.61 c 0,81,82 - 436.376 1446.96 436.376 1446.96 484.3 1411.26 c 0,83,84 - 553.867 1357.67 553.867 1357.67 683.109 1347.34 c 0,85,86 - 812.359 1337 812.359 1337 859.359 1378.36 c 0,87,88 - 867.431 1385.58 867.431 1385.58 867.823 1392.61 c 0,89,90 - 864.543 1402.45 l 0,91,92 - 861.995 1405.94 861.995 1405.94 857.479 1409.38 c 0,93,94 - 834.929 1424.89 834.929 1424.89 819.247 1425.07 c 0,95,96 - 814.01 1425.13 814.01 1425.13 809.54 1423.48 c 0,97,98 - 791.682 1416.9 791.682 1416.9 768.18 1400.92 c 0,99,100 - 771.939 1442.27 771.939 1442.27 816.119 1460.14 c 0,101,102 - 826.07 1464.56 826.07 1464.56 840.359 1464.58 c 0,103,104 - 862.506 1464.6 862.506 1464.6 895.08 1454.03 c 0,105,106 - 948.721 1436.62 948.721 1436.62 1012.11 1421.13 c 0,107,108 - 1066.09 1407.93 1066.09 1407.93 1120.42 1408.01 c 0,109,110 - 1129.95 1408.02 1129.95 1408.02 1139.48 1408.44 c 0,111,112 - 1203.41 1411.26 1203.41 1411.26 1250.4 1462.02 c 0,113,114 - 1273.28 1487.06 1273.28 1487.06 1273.56 1512.89 c 0,115,116 - 1269.86 1534.57 l 0,117,118 - 1262.91 1554.47 1262.91 1554.47 1242.88 1574.82 c 0,119,120 - 1303.99 1552.26 1303.99 1552.26 1304.45 1508.55 c 0,121,122 - 1300.89 1474.26 l 0,123,124 - 1294.94 1446.53 1294.94 1446.53 1279.07 1417.37 c 0,125,126 - 1253.26 1369.95 1253.26 1369.95 1217.5 1328.07 c 0,127,128 - 1181.77 1286.22 1181.77 1286.22 1172.38 1268.38 c 0,129,130 - 1140.42 1213.86 1140.42 1213.86 1139.01 1170.62 c 0,131,132 - 1137.7 1130.33 1137.7 1130.33 1062.53 1130.03 c 0,133,134 - 1057.02 1130.01 1057.02 1130.01 1051.12 1130.2 c 0,135,136 - 1087.78 1145.25 1087.78 1145.25 1105.64 1177.2 c 0,137,138 - 1112.71 1189.84 1112.71 1189.84 1113.01 1198.95 c 0,139,140 - 1110.36 1209.59 l 0,141,142 - 1106.73 1215.37 1106.73 1215.37 1098.12 1218.56 c 0,143,144 - 1082.16 1223.88 1082.16 1223.88 1067.74 1223.88 c 0,145,146 - 1010.8 1223.89 1010.8 1223.89 977.8 1141.01 c 0,147,148 - 954.788 1083.22 954.788 1083.22 954.764 1055.55 c 0,149,150 - 954.744 1033.48 954.744 1033.48 969.34 1030.56 c 0,151,152 - 996.981 1028.25 l 0,153,154 - 1025.07 1030.62 1025.07 1030.62 1025.74 1058.29 c 0,155,156 - 1022.83 1084.53 l 0,157,158 - 1017.29 1104.61 1017.29 1104.61 1001.3 1117.04 c 0,159,160 - 1045.49 1104.81 1045.49 1104.81 1055.82 1074.74 c 0,161,162 - 1069.92 1026.8 1069.92 1026.8 1043.13 1001.42 c 0,163,164 - 1016.33 976.035 1016.33 976.035 977.33 955.36 c 0,165,166 - 938.317 934.68 938.317 934.68 903.069 909.301 c 0,167,168 - 867.819 883.919 867.819 883.919 866.88 836.92 c 0,169,170 - 869.21 820.455 l 0,171,172 - 874.76 806.996 874.76 806.996 893.248 806.83 c 0,173,174 - 904.345 806.73 904.345 806.73 920.103 811.419 c 0,175,176 - 925.633 813.065 925.633 813.065 931.739 815.301 c 0,177,178 - 921.4 781.459 921.4 781.459 890.85 765.48 c 0,179,180 - 860.294 749.498 860.294 749.498 834.92 741.98 c 0,181,182 - 752.2 716.601 752.2 716.601 665.72 623.54 c 0,183,184 - 579.239 530.48 579.239 530.48 534.119 428.021 c 0,185,186 - 501.638 354.259 501.638 354.259 501.553 290.485 c 0,187,188 - 501.519 265.672 501.519 265.672 506.39 242.37 c 0,189,190 - 523.779 159.181 523.779 159.181 648.8 153.54 c 0,191,192 - 669.809 155.334 l 0,193,194 - 691.55 161.305 691.55 161.305 705.199 185.03 c 0,195,196 - 714.026 200.372 714.026 200.372 714.019 213.929 c 0,197,198 - 714.011 230.69 714.011 230.69 700.5 244.721 c 0,199,200 - 677 266.341 677 266.341 647.39 254.591 c 0,201,202 - 617.78 242.842 617.78 242.842 599.92 223.101 c 0,203,204 - 612.578 307.278 612.578 307.278 662.312 307.291 c 0,205,206 - 686.442 307.297 686.442 307.297 719.3 287.49 c 0,207,208 - 819.881 226.859 819.881 226.859 873.46 205.24 c 0,209,210 - 1050.18 130.04 1050.18 130.04 1130.55 138.5 c 0,211,212 - 1210.92 146.96 1210.92 146.96 1320.9 250.36 c 0,213,214 - 1320.9 166.696 1320.9 166.696 1232.54 108.42 c 0,215,216 - 1144.17 50.1396 1144.17 50.1396 1078.38 44.5 c 0,217,218 - 1005.06 38.8605 1005.06 38.8605 931.739 57.6602 c 0,219,220 - 858.42 76.46 858.42 76.46 804.84 35.1006 c 0,221,222 - 792.66 26.0785 792.66 26.0785 792.604 15.9739 c 0,223,224 - 792.542 5.02315 792.542 5.02315 806.72 -7.19922 c 0,225,226 - 835.859 -33.5195 835.859 -33.5195 850.899 -26.4697 c 0,227,-1 - 888.5 -9.08008 l 0,228,229 - 866.88 -104.96 866.88 -104.96 768.18 -48.5596 c 0,230,231 - 669.478 7.84116 669.478 7.84116 626.239 20.0605 c 0,232,233 - 557.619 38.8602 557.619 38.8602 496.05 74.5801 c 0,234,235 - 434.479 110.301 434.479 110.301 388.42 68 c 0,236,237 - 375.162 55.7245 375.162 55.7245 375.242 43.7057 c 0,238,239 - 375.315 32.7157 375.315 32.7157 386.54 21.9404 c 0,240,241 - 415.681 -10.96 415.681 -10.96 455.159 21 c 0,242,243 - 455.159 -16.5997 455.159 -16.5997 407.689 -25.5293 c 0,244,245 - 371.209 -28.8155 l 0,246,247 - 347.38 -28.2343 347.38 -28.2343 329.199 -19.4199 c 0,248,249 - 316.039 -13.7793 316.039 -13.7793 275.619 18.1807 c 0,250,251 - 235.197 50.1417 235.197 50.1417 192.43 69.8809 c 0,252,253 - 149.659 89.6201 149.659 89.6201 116.76 77.4004 c 0,254,255 - 83.8595 65.1806 83.8595 65.1806 86.6797 -17.54 c 0,256,257 - 87.6191 -62.6592 87.6191 -62.6592 136.029 -74.8799 c 0,258,259 - 184.439 -87.0996 184.439 -87.0996 229.56 -74.8799 c 0,260,261 - 197.553 -106.429 197.553 -106.429 157.984 -106.507 c 0,262,263 - 116.206 -106.589 116.206 -106.589 66 -71.5898 c 0,264,265 - -31.7607 -3.4394 -31.7607 -3.4394 35.9199 107.48 c 0,266,267 - 104.54 216.521 104.54 216.521 216.399 287.021 c 0,268,269 - 328.261 357.522 328.261 357.522 393.119 468.44 c 0,270,271 - 449.521 564.32 449.521 564.32 501.689 716.601 c 0,272,273 - 553.859 868.881 553.859 868.881 640.34 885.801 c 0,274,275 - 617.12 865.821 617.12 865.821 617.166 847.081 c 0,276,277 - 617.2 833.201 617.2 833.201 630 820 c 0,278,279 - 634.076 815.747 634.076 815.747 640.206 815.804 c 0,280,281 - 666.594 816.047 666.594 816.047 731.05 896.141 c 0,282,283 - 810.479 994.839 810.479 994.839 783.22 1017.4 c 0,0,1 -724 1529.7 m 0,147,148 - 660.063 1537.08 660.063 1537.08 660.1 1572.69 c 0,149,150 - 660.106 1577.92 660.106 1577.92 661.489 1583.75 c 0,151,152 - 672.301 1629.34 672.301 1629.34 712.72 1660.36 c 0,153,154 - 741.575 1683.03 741.575 1683.03 764.646 1683.11 c 0,155,156 - 794.183 1683.21 794.183 1683.21 814.239 1646.26 c 0,157,158 - 828.341 1618.06 828.341 1618.06 793.56 1571.53 c 0,159,160 - 762.282 1529.69 762.282 1529.69 731 1529.27 c 0,161,162 - 727.499 1529.23 727.499 1529.23 724 1529.7 c 0,147,148 -EndSplineSet -EndChar -EndChars -EndSplineFont diff --git a/reportlab/fonts/DarkGardenMK.afm b/reportlab/fonts/DarkGardenMK.afm deleted file mode 100644 index 66ed3610..00000000 --- a/reportlab/fonts/DarkGardenMK.afm +++ /dev/null @@ -1,429 +0,0 @@ -StartFontMetrics 2.0 -Comment Generated by FontForge 20071110 -Comment Creation Date: Wed Sep 10 17:07:49 2008 -FontName DarkGardenMK -FullName Dark Garden -FamilyName Dark Garden -Weight Medium -Notice (Copyright (C) 1999, 2000, 2004 Michal Kosmulski ) -Comment -Comment -Comment This font is free software; you can redistribute it and/or modify -Comment it under the terms of the GNU General Public License as published by -Comment the Free Software Foundation; either version 2 of the License, or -Comment (at your option) any later version. -Comment -Comment This font is distributed in the hope that it will be useful, -Comment but WITHOUT ANY WARRANTY; without even the implied warranty of -Comment MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -Comment GNU General Public License for more details. -Comment -Comment You should have received a copy of the GNU General Public License -Comment along with this font; if not, write to the Free Software -Comment Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -Comment -Comment As a special exception, if you create a document which uses -Comment this font, and embed this font or unaltered portions of this font into -Comment the document, this font does not by itself cause the resulting -Comment document to be covered by the GNU General Public License. This -Comment exception does not however invalidate any other reasons why the -Comment document might be covered by the GNU General Public License. If you -Comment modify this font, you may extend this exception to your version of the -Comment font, but you are not obligated to do so. If you do not wish to do so, -Comment delete this exception statement from your version. -Comment -ItalicAngle 0 -IsFixedPitch false -UnderlinePosition -420 -UnderlineThickness 80 -Version 1.1 -EncodingScheme ISO10646-1 -FontBBox -11 -331 935 1122 -CapHeight 931 -XHeight 869 -Ascender 831 -Descender -123 -StartCharMetrics 86 -C 0 ; WX 1000 ; N .notdef ; B 0 0 531 890 ; -C 1 ; WX 0 ; N glyph1 ; B 0 0 0 0 ; -C 2 ; WX 1000 ; N glyph2 ; B 0 0 0 0 ; -C 32 ; WX 500 ; N space ; B 0 0 0 0 ; -C 44 ; WX 130 ; N comma ; B 0 -76 123 105 ; -C 45 ; WX 611 ; N hyphen ; B 46 364 560 519 ; -C 46 ; WX 131 ; N period ; B 1 0 124 124 ; -C 58 ; WX 187 ; N colon ; B 32 6 159 447 ; -C 59 ; WX 187 ; N semicolon ; B 36 -98 163 470 ; -C 65 ; WX 706 ; N A ; B 3 -162 670 853 ; -C 66 ; WX 624 ; N B ; B -5 -27 602 911 ; -C 67 ; WX 619 ; N C ; B -1 -52 590 846 ; -C 68 ; WX 730 ; N D ; B 4 -133 703 912 ; -C 69 ; WX 613 ; N E ; B 1 -100 613 836 ; -C 70 ; WX 660 ; N F ; B 3 -96 629 833 ; -C 71 ; WX 624 ; N G ; B 5 -61 594 898 ; -C 72 ; WX 660 ; N H ; B 7 -177 629 876 ; -C 73 ; WX 284 ; N I ; B 22 -179 271 932 ; -C 74 ; WX 603 ; N J ; B 3 -93 570 863 ; -C 75 ; WX 639 ; N K ; B 7 -182 625 921 ; -C 76 ; WX 658 ; N L ; B 15 -3 616 903 ; -C 77 ; WX 833 ; N M ; B 9 -236 861 874 ; -C 78 ; WX 614 ; N N ; B 3 -135 579 917 ; -C 79 ; WX 691 ; N O ; B 9 -35 659 848 ; -C 80 ; WX 648 ; N P ; B 4 -203 605 846 ; -C 81 ; WX 612 ; N Q ; B -11 -179 578 894 ; -C 82 ; WX 647 ; N R ; B -1 -331 614 891 ; -C 83 ; WX 666 ; N S ; B 3 -60 654 876 ; -C 84 ; WX 829 ; N T ; B 0 -195 787 817 ; -C 85 ; WX 688 ; N U ; B 6 -33 656 874 ; -C 86 ; WX 618 ; N V ; B 4 -188 589 991 ; -C 87 ; WX 985 ; N W ; B 4 -132 935 974 ; -C 88 ; WX 690 ; N X ; B 6 -125 731 951 ; -C 89 ; WX 645 ; N Y ; B 7 -209 609 953 ; -C 90 ; WX 841 ; N Z ; B 14 -108 853 845 ; -C 97 ; WX 612 ; N a ; B 13 -93 581 769 ; -C 98 ; WX 528 ; N b ; B -4 -23 512 774 ; -C 99 ; WX 571 ; N c ; B 42 15 545 779 ; -C 100 ; WX 641 ; N d ; B 15 -60 609 829 ; -C 101 ; WX 527 ; N e ; B 8 -35 528 760 ; -C 102 ; WX 563 ; N f ; B 21 -25 553 765 ; -C 103 ; WX 549 ; N g ; B 21 10 522 825 ; -C 104 ; WX 581 ; N h ; B 24 -96 553 798 ; -C 105 ; WX 256 ; N i ; B 22 -99 235 846 ; -C 106 ; WX 527 ; N j ; B 17 -27 499 786 ; -C 107 ; WX 543 ; N k ; B 6 -155 531 783 ; -C 108 ; WX 525 ; N l ; B -1 62 510 832 ; -C 109 ; WX 718 ; N m ; B 14 -151 738 792 ; -C 110 ; WX 523 ; N n ; B 13 -63 502 832 ; -C 111 ; WX 612 ; N o ; B 30 28 584 779 ; -C 112 ; WX 561 ; N p ; B 13 -124 524 767 ; -C 113 ; WX 566 ; N q ; B 33 -98 535 814 ; -C 114 ; WX 548 ; N r ; B -3 -245 520 795 ; -C 115 ; WX 567 ; N s ; B 3 9 556 806 ; -C 116 ; WX 718 ; N t ; B 13 -117 682 743 ; -C 117 ; WX 587 ; N u ; B 8 36 560 805 ; -C 118 ; WX 530 ; N v ; B 9 -99 506 902 ; -C 119 ; WX 774 ; N w ; B 1 -49 793 891 ; -C 120 ; WX 604 ; N x ; B 11 -43 628 870 ; -C 121 ; WX 559 ; N y ; B 14 -122 526 866 ; -C 122 ; WX 764 ; N z ; B 7 -36 720 774 ; -C 196 ; WX 765 ; N Adieresis ; B 8 -179 724 1064 ; -C 211 ; WX 704 ; N Oacute ; B 7 -82 665 1012 ; -C 214 ; WX 791 ; N Odieresis ; B 1 -68 755 1084 ; -C 220 ; WX 763 ; N Udieresis ; B -1 -59 728 1122 ; -C 223 ; WX 543 ; N germandbls ; B 2 -304 516 795 ; -C 228 ; WX 650 ; N adieresis ; B 6 -152 615 904 ; -C 243 ; WX 600 ; N oacute ; B 8 -2 567 928 ; -C 246 ; WX 672 ; N odieresis ; B 0 -58 642 921 ; -C 252 ; WX 648 ; N udieresis ; B -1 -50 619 953 ; -C -1 ; WX 699 ; N Aogonek ; B 1 -257 657 838 ; -C -1 ; WX 594 ; N aogonek ; B 1 -219 559 712 ; -C -1 ; WX 596 ; N Cacute ; B 8 -57 561 1046 ; -C -1 ; WX 514 ; N cacute ; B 14 20 484 959 ; -C -1 ; WX 739 ; N Eogonek ; B 2 -240 738 785 ; -C -1 ; WX 637 ; N eogonek ; B 13 -121 640 750 ; -C -1 ; WX 848 ; N Lslash ; B 8 -107 908 871 ; -C -1 ; WX 722 ; N lslash ; B 11 -32 776 799 ; -C -1 ; WX 627 ; N Nacute ; B 8 -46 597 1050 ; -C -1 ; WX 534 ; N nacute ; B 8 32 509 964 ; -C -1 ; WX 558 ; N Sacute ; B 4 -27 566 1094 ; -C -1 ; WX 490 ; N sacute ; B 7 58 485 1010 ; -C -1 ; WX 721 ; N Zacute ; B 7 -90 714 1013 ; -C -1 ; WX 617 ; N zacute ; B 7 -44 607 894 ; -C -1 ; WX 759 ; N Zdotaccent ; B -7 -103 749 925 ; -C -1 ; WX 655 ; N zdotaccent ; B 4 -53 645 822 ; -EndCharMetrics -StartKernData -StartKernPairs 291 -KPX hyphen Z -126 -KPX hyphen z -101 -KPX hyphen X -88 -KPX hyphen x -76 -KPX hyphen Y -63 -KPX hyphen y -50 -KPX hyphen W -88 -KPX hyphen w -88 -KPX hyphen T -139 -KPX hyphen t -133 -KPX hyphen S -114 -KPX hyphen s -76 -KPX hyphen A -114 -KPX hyphen a -114 -KPX A C -25 -KPX A c -63 -KPX A M -50 -KPX A m -38 -KPX A h -63 -KPX A H -50 -KPX A hyphen -82 -KPX A s -139 -KPX A S -120 -KPX A y -145 -KPX A Y -125 -KPX A t -145 -KPX A T -145 -KPX A v -31 -KPX A w -112 -KPX A V -24 -KPX A W -94 -KPX C S -69 -KPX C s -63 -KPX C A -31 -KPX C a -44 -KPX D Z -88 -KPX D z -69 -KPX D a -101 -KPX D A -73 -KPX E S -63 -KPX E s -63 -KPX F t -139 -KPX F T -82 -KPX F hyphen -101 -KPX F period -114 -KPX F comma -133 -KPX F A -239 -KPX F a -229 -KPX H A -44 -KPX K o -50 -KPX K O -25 -KPX K s -107 -KPX K S -101 -KPX K g -88 -KPX K G -38 -KPX K c -114 -KPX K C -69 -KPX L t -203 -KPX L T -203 -KPX L Y -114 -KPX L y -114 -KPX L i -63 -KPX L I -69 -KPX L hyphen -107 -KPX L S -114 -KPX L w -133 -KPX L W -139 -KPX M A -50 -KPX M a -50 -KPX M i 38 -KPX N A -114 -KPX N a -101 -KPX O y -38 -KPX O Y -44 -KPX O a -76 -KPX O A -76 -KPX O x -76 -KPX O X -76 -KPX O W -114 -KPX O t -139 -KPX O T -178 -KPX P hyphen -101 -KPX P period -126 -KPX P comma -139 -KPX P t -44 -KPX P T -95 -KPX P Lslash -177 -KPX P lslash -177 -KPX P A -166 -KPX P a -177 -KPX R Y -69 -KPX R y -63 -KPX R S -101 -KPX R G -50 -KPX R t -139 -KPX R T -152 -KPX R V -10 -KPX R W -73 -KPX S E 25 -KPX S e 19 -KPX S S -57 -KPX S t -88 -KPX S T -31 -KPX T lslash -190 -KPX T Lslash -229 -KPX T U -57 -KPX T u -69 -KPX T h -114 -KPX T H -76 -KPX T hyphen -146 -KPX T period -126 -KPX T comma -126 -KPX T oacute -146 -KPX T Oacute -101 -KPX T s -139 -KPX T S -126 -KPX T o -101 -KPX T O -69 -KPX T A -250 -KPX T a -250 -KPX U t -38 -KPX U T -31 -KPX U X -63 -KPX V Odieresis -94 -KPX V odieresis -109 -KPX V o -95 -KPX V O -76 -KPX V hyphen -101 -KPX V period -120 -KPX V comma -120 -KPX V I -50 -KPX V i -88 -KPX V a -156 -KPX V A -131 -KPX W Odieresis -87 -KPX W odieresis -103 -KPX W lslash -229 -KPX W Lslash -248 -KPX W H -126 -KPX W h -146 -KPX W hyphen -114 -KPX W period -159 -KPX W comma -177 -KPX W s -159 -KPX W S -126 -KPX W i -88 -KPX W I -44 -KPX W oacute -152 -KPX W Oacute -178 -KPX W o -133 -KPX W O -107 -KPX W Adieresis -152 -KPX W adieresis -131 -KPX W aogonek -166 -KPX W Aogonek -166 -KPX W a -219 -KPX W A -194 -KPX X hyphen -101 -KPX Y O -44 -KPX Y o -88 -KPX Y Lslash -152 -KPX Y S -126 -KPX Y hyphen -95 -KPX Y period -114 -KPX Y comma -114 -KPX Y a -208 -KPX Y A -187 -KPX Z y -57 -KPX Z Y -50 -KPX Z lslash -88 -KPX Z Lslash -82 -KPX Z i -25 -KPX Z I -31 -KPX Z e -31 -KPX Z b -38 -KPX Z B -38 -KPX Z hyphen -101 -KPX a c -63 -KPX a m -38 -KPX a h -57 -KPX a hyphen -88 -KPX a s -101 -KPX a y -145 -KPX a t -166 -KPX a v -20 -KPX a w -107 -KPX c s -57 -KPX c a -50 -KPX d z -44 -KPX d a -73 -KPX e s -38 -KPX f t -63 -KPX f hyphen -76 -KPX f period -120 -KPX f comma -126 -KPX f a -208 -KPX h a -50 -KPX k o -31 -KPX k s -50 -KPX k g -31 -KPX k c -76 -KPX l t -139 -KPX l y -76 -KPX l i -38 -KPX l hyphen -76 -KPX l s -63 -KPX l w -95 -KPX m a -44 -KPX m i 31 -KPX n a -101 -KPX o y -31 -KPX o a -76 -KPX o x -69 -KPX o w -95 -KPX o t -152 -KPX p hyphen -50 -KPX p period -107 -KPX p comma -101 -KPX p t -95 -KPX p lslash -145 -KPX p a -145 -KPX r y -76 -KPX r s -88 -KPX r g -50 -KPX r t -165 -KPX r v -20 -KPX r w -73 -KPX s c -25 -KPX s s -50 -KPX s t -38 -KPX t lslash -159 -KPX t u -57 -KPX t h -82 -KPX t hyphen -107 -KPX t period -126 -KPX t comma -126 -KPX t oacute -101 -KPX t s -101 -KPX t o -88 -KPX t a -218 -KPX u t -38 -KPX u x -50 -KPX v odieresis -83 -KPX v o -69 -KPX v hyphen -88 -KPX v period -88 -KPX v comma -101 -KPX v i -50 -KPX v a -125 -KPX w odieresis -20 -KPX w lslash -146 -KPX w h -50 -KPX w hyphen -57 -KPX w period -95 -KPX w comma -101 -KPX w s -44 -KPX w i 6 -KPX w oacute -76 -KPX w o -44 -KPX w adieresis -111 -KPX w aogonek -152 -KPX w a -166 -KPX x hyphen -101 -KPX y o -63 -KPX y lslash -126 -KPX y s -101 -KPX y hyphen -82 -KPX y period -95 -KPX y comma -101 -KPX y a -177 -KPX z y -95 -KPX z lslash -120 -KPX z i -69 -KPX z e -50 -KPX z b -76 -KPX z hyphen -177 -KPX Oacute T -139 -KPX Oacute W -88 -KPX germandbls t -95 -KPX germandbls T -152 -KPX oacute t -114 -KPX oacute w -76 -KPX Aogonek W -101 -KPX aogonek w -88 -KPX Lslash Y -76 -KPX Lslash y -38 -KPX Lslash T -101 -KPX Lslash W -156 -KPX lslash y -50 -KPX lslash t -101 -KPX lslash w -187 -EndKernPairs -EndKernData -EndFontMetrics diff --git a/reportlab/fonts/DarkGardenMK.pfb b/reportlab/fonts/DarkGardenMK.pfb deleted file mode 100644 index 79e97026..00000000 Binary files a/reportlab/fonts/DarkGardenMK.pfb and /dev/null differ diff --git a/reportlab/fonts/Vera.ttf b/reportlab/fonts/Vera.ttf deleted file mode 100644 index 58cd6b5e..00000000 Binary files a/reportlab/fonts/Vera.ttf and /dev/null differ diff --git a/reportlab/fonts/VeraBI.ttf b/reportlab/fonts/VeraBI.ttf deleted file mode 100644 index b55eee39..00000000 Binary files a/reportlab/fonts/VeraBI.ttf and /dev/null differ diff --git a/reportlab/fonts/VeraBd.ttf b/reportlab/fonts/VeraBd.ttf deleted file mode 100644 index 51d6111d..00000000 Binary files a/reportlab/fonts/VeraBd.ttf and /dev/null differ diff --git a/reportlab/fonts/VeraIt.ttf b/reportlab/fonts/VeraIt.ttf deleted file mode 100644 index cc23c9ef..00000000 Binary files a/reportlab/fonts/VeraIt.ttf and /dev/null differ diff --git a/reportlab/fonts/bitstream-vera-license.txt b/reportlab/fonts/bitstream-vera-license.txt deleted file mode 100644 index e651be1c..00000000 --- a/reportlab/fonts/bitstream-vera-license.txt +++ /dev/null @@ -1,124 +0,0 @@ -Bitstream Vera Fonts Copyright - -The fonts have a generous copyright, allowing derivative works (as -long as "Bitstream" or "Vera" are not in the names), and full -redistribution (so long as they are not *sold* by themselves). They -can be be bundled, redistributed and sold with any software. - -The fonts are distributed under the following copyright: - -Copyright -========= - -Copyright (c) 2003 by Bitstream, Inc. All Rights Reserved. Bitstream -Vera is a trademark of Bitstream, Inc. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of the fonts accompanying this license ("Fonts") and associated -documentation files (the "Font Software"), to reproduce and distribute -the Font Software, including without limitation the rights to use, -copy, merge, publish, distribute, and/or sell copies of the Font -Software, and to permit persons to whom the Font Software is furnished -to do so, subject to the following conditions: - -The above copyright and trademark notices and this permission notice -shall be included in all copies of one or more of the Font Software -typefaces. - -The Font Software may be modified, altered, or added to, and in -particular the designs of glyphs or characters in the Fonts may be -modified and additional glyphs or characters may be added to the -Fonts, only if the fonts are renamed to names not containing either -the words "Bitstream" or the word "Vera". - -This License becomes null and void to the extent applicable to Fonts -or Font Software that has been modified and is distributed under the -"Bitstream Vera" names. - -The Font Software may be sold as part of a larger software package but -no copy of one or more of the Font Software typefaces may be sold by -itself. - -THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT -OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL -BITSTREAM OR THE GNOME FOUNDATION BE LIABLE FOR ANY CLAIM, DAMAGES OR -OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, -OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR -OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT -SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. - -Except as contained in this notice, the names of Gnome, the Gnome -Foundation, and Bitstream Inc., shall not be used in advertising or -otherwise to promote the sale, use or other dealings in this Font -Software without prior written authorization from the Gnome Foundation -or Bitstream Inc., respectively. For further information, contact: -fonts at gnome dot org. - -Copyright FAQ -============= - - 1. I don't understand the resale restriction... What gives? - - Bitstream is giving away these fonts, but wishes to ensure its - competitors can't just drop the fonts as is into a font sale system - and sell them as is. It seems fair that if Bitstream can't make money - from the Bitstream Vera fonts, their competitors should not be able to - do so either. You can sell the fonts as part of any software package, - however. - - 2. I want to package these fonts separately for distribution and - sale as part of a larger software package or system. Can I do so? - - Yes. A RPM or Debian package is a "larger software package" to begin - with, and you aren't selling them independently by themselves. - See 1. above. - - 3. Are derivative works allowed? - Yes! - - 4. Can I change or add to the font(s)? - Yes, but you must change the name(s) of the font(s). - - 5. Under what terms are derivative works allowed? - - You must change the name(s) of the fonts. This is to ensure the - quality of the fonts, both to protect Bitstream and Gnome. We want to - ensure that if an application has opened a font specifically of these - names, it gets what it expects (though of course, using fontconfig, - substitutions could still could have occurred during font - opening). You must include the Bitstream copyright. Additional - copyrights can be added, as per copyright law. Happy Font Hacking! - - 6. If I have improvements for Bitstream Vera, is it possible they might get - adopted in future versions? - - Yes. The contract between the Gnome Foundation and Bitstream has - provisions for working with Bitstream to ensure quality additions to - the Bitstream Vera font family. Please contact us if you have such - additions. Note, that in general, we will want such additions for the - entire family, not just a single font, and that you'll have to keep - both Gnome and Jim Lyles, Vera's designer, happy! To make sense to add - glyphs to the font, they must be stylistically in keeping with Vera's - design. Vera cannot become a "ransom note" font. Jim Lyles will be - providing a document describing the design elements used in Vera, as a - guide and aid for people interested in contributing to Vera. - - 7. I want to sell a software package that uses these fonts: Can I do so? - - Sure. Bundle the fonts with your software and sell your software - with the fonts. That is the intent of the copyright. - - 8. If applications have built the names "Bitstream Vera" into them, - can I override this somehow to use fonts of my choosing? - - This depends on exact details of the software. Most open source - systems and software (e.g., Gnome, KDE, etc.) are now converting to - use fontconfig (see www.fontconfig.org) to handle font configuration, - selection and substitution; it has provisions for overriding font - names and subsituting alternatives. An example is provided by the - supplied local.conf file, which chooses the family Bitstream Vera for - "sans", "serif" and "monospace". Other software (e.g., the XFree86 - core server) has other mechanisms for font substitution. - diff --git a/reportlab/graphics/__init__.py b/reportlab/graphics/__init__.py deleted file mode 100644 index 3fe98c44..00000000 --- a/reportlab/graphics/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/__init__.py -__version__=''' $Id$ ''' -__doc__='''Framework for reusable object graphics, in PDF or bitmap form''' - diff --git a/reportlab/graphics/barcode/README b/reportlab/graphics/barcode/README deleted file mode 100644 index ac21e23b..00000000 --- a/reportlab/graphics/barcode/README +++ /dev/null @@ -1,59 +0,0 @@ -Symbologies Currently Supported -=============================== - -The following have, at a minimum, been verified to scan with a WASP -CCD barcode scanner (found one bug in my code, two in the scanner!). -Some have had more extensive testing: - - Interleaved 2 of 5 - MSI - Codabar - Code 39 (Standard Character Set) - Code 39 (Extended Character Set) - Code 93 (Standard Character Set) - Code 93 (Extended Character Set) - Code 128 (Automatic use of A, B, C, with some optimizations -- - more coming) - -The following have been tested by sending a fair number of mailpieces -with them: - - USPS FIM - USPS POSTNET - -The following have not been tested, as none of the scanners I have -access to support them: - - Code 11 - - -Future Plans, Consulting -======================== - -Soon: - -I plan to implement the following linear codes soon: - - UPC/EAN(/JAN) - -The following are in progress, but I lack a way to verify them -(scanners I have access to don't read them), and I don't have complete -specs for the UK style. - - Royal Mail 4-State (UK/NL/etc style, and Australian style) - -Down the road, I'd like to do some 2D symbologies. Likely first candidate -is PDF417. MaxiCode, Aztec Code, and some of the stacked symbologies are -also good candidates. - -I am available to do implementation of additional symbologies for hire. -Because I enjoy hacking barcodes, my rates for work in this particular -area are very low and are mainly to help offset costs associated with -obtaining related documents and/or to buy or gain access to scanning -equipment for symbologies if I don't already have a scanner that -supports them. Loans of equipment are also accepted. - -For more information, contact: - -Ty Sarna -tsarna@sarna.org diff --git a/reportlab/graphics/barcode/TODO b/reportlab/graphics/barcode/TODO deleted file mode 100644 index 01b29bca..00000000 --- a/reportlab/graphics/barcode/TODO +++ /dev/null @@ -1,24 +0,0 @@ -See also README for some plans and info on consulting. - -- Overall framework docs - -- Finish Aussie Rules 4-State, for which I have complete docs now (yay - USPS and aupost.com.au for putting specs online. Too bad UKPost doesn't.) - -- Investigate USPS PLANET stuff - -- Higher-level objects that handle barcoded address blocks with correct - spacings and such (US, AU, UK/etc?) - -- Even higher-level objects that represent mailpieces and place the - above-style address block objects, FIM codes, "place stamp here" blocks, - etc, correctly? - -- Framework for laying out labels on various styles of n-up label - sheets, like Avery labels, etc? - -- Decide if Plessey is worth doing. MSI-like (MSI is actually derived from - it), but specs were never formalized. Probably only useful for legacy - applications. If you need it, mail me. - -- Get someone to test Code 11, or find a scanner that handles it diff --git a/reportlab/graphics/barcode/VERSION b/reportlab/graphics/barcode/VERSION deleted file mode 100644 index b63ba696..00000000 --- a/reportlab/graphics/barcode/VERSION +++ /dev/null @@ -1 +0,0 @@ -0.9 diff --git a/reportlab/graphics/barcode/__init__.py b/reportlab/graphics/barcode/__init__.py deleted file mode 100644 index 2812d64e..00000000 --- a/reportlab/graphics/barcode/__init__.py +++ /dev/null @@ -1,136 +0,0 @@ -# -# Copyright (c) 1996-2000 Tyler C. Sarna -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. All advertising materials mentioning features or use of this software -# must display the following acknowledgement: -# This product includes software developed by Tyler C. Sarna. -# 4. Neither the name of the author nor the names of contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS -# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -__version__ = '0.9' -__doc__='''Popular barcodes available as reusable widgets''' - -def getCodes(): - """Returns a dict mapping code names to widgets""" - - from reportlab.graphics.barcode.widgets import BarcodeI2of5, BarcodeCode128, BarcodeStandard93,\ - BarcodeExtended93, BarcodeStandard39, BarcodeExtended39,\ - BarcodeMSI, BarcodeCodabar, BarcodeCode11, BarcodeFIM,\ - BarcodePOSTNET, BarcodeUSPS_4State - - #newer codes will typically get their own module - from reportlab.graphics.barcode.eanbc import Ean13BarcodeWidget, Ean8BarcodeWidget, UPCA - from reportlab.graphics.barcode.qr import QrCodeWidget - - - #the module exports a dictionary of names to widgets, to make it easy for - #apps and doc tools to display information about them. - codes = {} - for widget in ( - BarcodeI2of5, - BarcodeCode128, - BarcodeStandard93, - BarcodeExtended93, - BarcodeStandard39, - BarcodeExtended39, - BarcodeMSI, - BarcodeCodabar, - BarcodeCode11, - BarcodeFIM, - BarcodePOSTNET, - BarcodeUSPS_4State, - Ean13BarcodeWidget, - Ean8BarcodeWidget, - UPCA, - QrCodeWidget, - ): - codeName = widget.codeName - codes[codeName] = widget - - return codes - -def getCodeNames(): - """Returns sorted list of supported bar code names""" - return sorted(getCodes().keys()) - -def createBarcodeDrawing(codeName, **options): - """This creates and returns a drawing with a barcode. - """ - from reportlab.graphics.shapes import Drawing, Group - - codes = getCodes() - bcc = codes[codeName] - width = options.pop('width',None) - height = options.pop('height',None) - isoScale = options.pop('isoScale',0) - kw = {} - for k,v in options.items(): - if k.startswith('_') or k in bcc._attrMap: kw[k] = v - bc = bcc(**kw) - - - #Robin's new ones validate when setting the value property. - #Ty Sarna's old ones do not. We need to test. - if hasattr(bc, 'validate'): - bc.validate() #raise exception if bad value - if not bc.valid: - raise ValueError("Illegal barcode with value '%s' in code '%s'" % (options.get('value',None), codeName)) - - #size it after setting the data - x1, y1, x2, y2 = bc.getBounds() - w = float(x2 - x1) - h = float(y2 - y1) - sx = width not in ('auto',None) - sy = height not in ('auto',None) - if sx or sy: - sx = sx and width/w or 1.0 - sy = sy and height/h or 1.0 - if isoScale: - if sx<1.0 and sy<1.0: - sx = sy = max(sx,sy) - else: - sx = sy = min(sx,sy) - - w *= sx - h *= sy - else: - sx = sy = 1 - - #bc.x = -sx*x1 - #bc.y = -sy*y1 - d = Drawing(width=w,height=h,transform=[sx,0,0,sy,-sx*x1,-sy*y1]) - d.add(bc, "_bc") - return d - -def createBarcodeImageInMemory(codeName,**options): - """This creates and returns barcode as an image in memory. - Takes same arguments as createBarcodeDrawing and also an - optional format keyword which can be anything acceptable - to Drawing.asString eg gif, pdf, tiff, py ...... - """ - format = options.pop('format','png') - d = createBarcodeDrawing(codeName, **options) - return d.asString(format) diff --git a/reportlab/graphics/barcode/code128.py b/reportlab/graphics/barcode/code128.py deleted file mode 100644 index 6c537c0f..00000000 --- a/reportlab/graphics/barcode/code128.py +++ /dev/null @@ -1,321 +0,0 @@ -# -# Copyright (c) 2000 Tyler C. Sarna -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. All advertising materials mentioning features or use of this software -# must display the following acknowledgement: -# This product includes software developed by Tyler C. Sarna. -# 4. Neither the name of the author nor the names of contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS -# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -from reportlab.lib.units import inch -from reportlab.lib.utils import asNative -from reportlab.graphics.barcode.common import MultiWidthBarcode -from string import digits - -_patterns = { - 0 : 'BaBbBb', 1 : 'BbBaBb', 2 : 'BbBbBa', - 3 : 'AbAbBc', 4 : 'AbAcBb', 5 : 'AcAbBb', - 6 : 'AbBbAc', 7 : 'AbBcAb', 8 : 'AcBbAb', - 9 : 'BbAbAc', 10 : 'BbAcAb', 11 : 'BcAbAb', - 12 : 'AaBbCb', 13 : 'AbBaCb', 14 : 'AbBbCa', - 15 : 'AaCbBb', 16 : 'AbCaBb', 17 : 'AbCbBa', - 18 : 'BbCbAa', 19 : 'BbAaCb', 20 : 'BbAbCa', - 21 : 'BaCbAb', 22 : 'BbCaAb', 23 : 'CaBaCa', - 24 : 'CaAbBb', 25 : 'CbAaBb', 26 : 'CbAbBa', - 27 : 'CaBbAb', 28 : 'CbBaAb', 29 : 'CbBbAa', - 30 : 'BaBaBc', 31 : 'BaBcBa', 32 : 'BcBaBa', - 33 : 'AaAcBc', 34 : 'AcAaBc', 35 : 'AcAcBa', - 36 : 'AaBcAc', 37 : 'AcBaAc', 38 : 'AcBcAa', - 39 : 'BaAcAc', 40 : 'BcAaAc', 41 : 'BcAcAa', - 42 : 'AaBaCc', 43 : 'AaBcCa', 44 : 'AcBaCa', - 45 : 'AaCaBc', 46 : 'AaCcBa', 47 : 'AcCaBa', - 48 : 'CaCaBa', 49 : 'BaAcCa', 50 : 'BcAaCa', - 51 : 'BaCaAc', 52 : 'BaCcAa', 53 : 'BaCaCa', - 54 : 'CaAaBc', 55 : 'CaAcBa', 56 : 'CcAaBa', - 57 : 'CaBaAc', 58 : 'CaBcAa', 59 : 'CcBaAa', - 60 : 'CaDaAa', 61 : 'BbAdAa', 62 : 'DcAaAa', - 63 : 'AaAbBd', 64 : 'AaAdBb', 65 : 'AbAaBd', - 66 : 'AbAdBa', 67 : 'AdAaBb', 68 : 'AdAbBa', - 69 : 'AaBbAd', 70 : 'AaBdAb', 71 : 'AbBaAd', - 72 : 'AbBdAa', 73 : 'AdBaAb', 74 : 'AdBbAa', - 75 : 'BdAbAa', 76 : 'BbAaAd', 77 : 'DaCaAa', - 78 : 'BdAaAb', 79 : 'AcDaAa', 80 : 'AaAbDb', - 81 : 'AbAaDb', 82 : 'AbAbDa', 83 : 'AaDbAb', - 84 : 'AbDaAb', 85 : 'AbDbAa', 86 : 'DaAbAb', - 87 : 'DbAaAb', 88 : 'DbAbAa', 89 : 'BaBaDa', - 90 : 'BaDaBa', 91 : 'DaBaBa', 92 : 'AaAaDc', - 93 : 'AaAcDa', 94 : 'AcAaDa', 95 : 'AaDaAc', - 96 : 'AaDcAa', 97 : 'DaAaAc', 98 : 'DaAcAa', - 99 : 'AaCaDa', 100 : 'AaDaCa', 101 : 'CaAaDa', - 102 : 'DaAaCa', 103 : 'BaAdAb', 104 : 'BaAbAd', - 105 : 'BaAbCb', 106 : 'BcCaAaB' -} - -starta, startb, startc, stop = 103, 104, 105, 106 - -seta = { - ' ' : 0, '!' : 1, '"' : 2, '#' : 3, - '$' : 4, '%' : 5, '&' : 6, '\'' : 7, - '(' : 8, ')' : 9, '*' : 10, '+' : 11, - ',' : 12, '-' : 13, '.' : 14, '/' : 15, - '0' : 16, '1' : 17, '2' : 18, '3' : 19, - '4' : 20, '5' : 21, '6' : 22, '7' : 23, - '8' : 24, '9' : 25, ':' : 26, ';' : 27, - '<' : 28, '=' : 29, '>' : 30, '?' : 31, - '@' : 32, 'A' : 33, 'B' : 34, 'C' : 35, - 'D' : 36, 'E' : 37, 'F' : 38, 'G' : 39, - 'H' : 40, 'I' : 41, 'J' : 42, 'K' : 43, - 'L' : 44, 'M' : 45, 'N' : 46, 'O' : 47, - 'P' : 48, 'Q' : 49, 'R' : 50, 'S' : 51, - 'T' : 52, 'U' : 53, 'V' : 54, 'W' : 55, - 'X' : 56, 'Y' : 57, 'Z' : 58, '[' : 59, - '\\' : 60, ']' : 61, '^' : 62, '_' : 63, - '\x00' : 64, '\x01' : 65, '\x02' : 66, '\x03' : 67, - '\x04' : 68, '\x05' : 69, '\x06' : 70, '\x07' : 71, - '\x08' : 72, '\x09' : 73, '\x0a' : 74, '\x0b' : 75, - '\x0c' : 76, '\x0d' : 77, '\x0e' : 78, '\x0f' : 79, - '\x10' : 80, '\x11' : 81, '\x12' : 82, '\x13' : 83, - '\x14' : 84, '\x15' : 85, '\x16' : 86, '\x17' : 87, - '\x18' : 88, '\x19' : 89, '\x1a' : 90, '\x1b' : 91, - '\x1c' : 92, '\x1d' : 93, '\x1e' : 94, '\x1f' : 95, - '\xf3' : 96, '\xf2' : 97, 'SHIFT' : 98, 'TO_C' : 99, - 'TO_B' : 100, '\xf4' : 101, '\xf1' : 102 -} - -setb = { - ' ' : 0, '!' : 1, '"' : 2, '#' : 3, - '$' : 4, '%' : 5, '&' : 6, '\'' : 7, - '(' : 8, ')' : 9, '*' : 10, '+' : 11, - ',' : 12, '-' : 13, '.' : 14, '/' : 15, - '0' : 16, '1' : 17, '2' : 18, '3' : 19, - '4' : 20, '5' : 21, '6' : 22, '7' : 23, - '8' : 24, '9' : 25, ':' : 26, ';' : 27, - '<' : 28, '=' : 29, '>' : 30, '?' : 31, - '@' : 32, 'A' : 33, 'B' : 34, 'C' : 35, - 'D' : 36, 'E' : 37, 'F' : 38, 'G' : 39, - 'H' : 40, 'I' : 41, 'J' : 42, 'K' : 43, - 'L' : 44, 'M' : 45, 'N' : 46, 'O' : 47, - 'P' : 48, 'Q' : 49, 'R' : 50, 'S' : 51, - 'T' : 52, 'U' : 53, 'V' : 54, 'W' : 55, - 'X' : 56, 'Y' : 57, 'Z' : 58, '[' : 59, - '\\' : 60, ']' : 61, '^' : 62, '_' : 63, - '`' : 64, 'a' : 65, 'b' : 66, 'c' : 67, - 'd' : 68, 'e' : 69, 'f' : 70, 'g' : 71, - 'h' : 72, 'i' : 73, 'j' : 74, 'k' : 75, - 'l' : 76, 'm' : 77, 'n' : 78, 'o' : 79, - 'p' : 80, 'q' : 81, 'r' : 82, 's' : 83, - 't' : 84, 'u' : 85, 'v' : 86, 'w' : 87, - 'x' : 88, 'y' : 89, 'z' : 90, '{' : 91, - '|' : 92, '}' : 93, '~' : 94, '\x7f' : 95, - '\xf3' : 96, '\xf2' : 97, 'SHIFT' : 98, 'TO_C' : 99, - '\xf4' : 100, 'TO_A' : 101, '\xf1' : 102 -} - -setc = { - '00': 0, '01': 1, '02': 2, '03': 3, '04': 4, - '05': 5, '06': 6, '07': 7, '08': 8, '09': 9, - '10':10, '11':11, '12':12, '13':13, '14':14, - '15':15, '16':16, '17':17, '18':18, '19':19, - '20':20, '21':21, '22':22, '23':23, '24':24, - '25':25, '26':26, '27':27, '28':28, '29':29, - '30':30, '31':31, '32':32, '33':33, '34':34, - '35':35, '36':36, '37':37, '38':38, '39':39, - '40':40, '41':41, '42':42, '43':43, '44':44, - '45':45, '46':46, '47':47, '48':48, '49':49, - '50':50, '51':51, '52':52, '53':53, '54':54, - '55':55, '56':56, '57':57, '58':58, '59':59, - '60':60, '61':61, '62':62, '63':63, '64':64, - '65':65, '66':66, '67':67, '68':68, '69':69, - '70':70, '71':71, '72':72, '73':73, '74':74, - '75':75, '76':76, '77':77, '78':78, '79':79, - '80':80, '81':81, '82':82, '83':83, '84':84, - '85':85, '86':86, '87':87, '88':88, '89':89, - '90':90, '91':91, '92':92, '93':93, '94':94, - '95':95, '96':96, '97':97, '98':98, '99':99, - - 'TO_B' : 100, 'TO_A' : 101, '\xf1' : 102 -} - -setmap = { - 'TO_A' : (seta, setb), - 'TO_B' : (setb, seta), - 'TO_C' : (setc, None), - 'START_A' : (starta, seta, setb), - 'START_B' : (startb, setb, seta), - 'START_C' : (startc, setc, None), -} -tos = list(setmap.keys()) - -class Code128(MultiWidthBarcode): - """ - Code 128 is a very compact symbology that can encode the entire - 128 character ASCII set, plus 4 special control codes, - (FNC1-FNC4, expressed in the input string as \xf1 to \xf4). - Code 128 can also encode digits at double density (2 per byte) - and has a mandatory checksum. Code 128 is well supported and - commonly used -- for example, by UPS for tracking labels. - - Because of these qualities, Code 128 is probably the best choice - for a linear symbology today (assuming you have a choice). - - Options that may be passed to constructor: - - value (int, or numeric string. required.): - The value to encode. - - barWidth (float, default .0075): - X-Dimension, or width of the smallest element - Minumum is .0075 inch (7.5 mils). - - barHeight (float, see default below): - Height of the symbol. Default is the height of the two - bearer bars (if they exist) plus the greater of .25 inch - or .15 times the symbol's length. - - quiet (bool, default 1): - Wether to include quiet zones in the symbol. - - lquiet (float, see default below): - Quiet zone size to left of code, if quiet is true. - Default is the greater of .25 inch, or 10 barWidth - - rquiet (float, defaults as above): - Quiet zone size to right left of code, if quiet is true. - - Sources of Information on Code 128: - - http://www.semiconductor.agilent.com/barcode/sg/Misc/code_128.html - http://www.adams1.com/pub/russadam/128code.html - http://www.barcodeman.com/c128.html - - Official Spec, "ANSI/AIM BC4-1999, ISS" is available for US$45 from - http://www.aimglobal.org/aimstore/ - """ - barWidth = inch * 0.0075 - lquiet = None - rquiet = None - quiet = 1 - barHeight = None - def __init__(self, value='', **args): - value = str(value) if isinstance(value,int) else asNative(value) - - for k, v in args.items(): - setattr(self, k, v) - - if self.quiet: - if self.lquiet is None: - self.lquiet = max(inch * 0.25, self.barWidth * 10.0) - if self.rquiet is None: - self.rquiet = max(inch * 0.25, self.barWidth * 10.0) - else: - self.lquiet = self.rquiet = 0.0 - - MultiWidthBarcode.__init__(self, value) - - def validate(self): - vval = "" - self.valid = 1 - for c in self.value: - if ord(c) > 127 and c not in '\xf1\xf2\xf3\xf4': - self.valid = 0 - continue - vval = vval + c - self.validated = vval - return vval - - def _trailingDigitsToC(self, l): - # Optimization: trailing digits -> set C double-digits - c = 1 - savings = -1 # the TO_C costs one character - rl = ['STOP'] - while c < len(l): - i = (-c - 1) - if l[i] == '\xf1': - c += 1 - rl.insert(0, '\xf1') - continue - elif len(l[i]) == 1 and l[i] in digits \ - and len(l[i-1]) == 1 and l[i-1] in digits: - c += 2 - savings += 1 - rl.insert(0, l[i-1] + l[i]) - continue - else: - break - if savings > 0: - return l[:-c] + ['TO_C'] + rl - else: - return l - - def encode(self): - # First, encode using only B - s = self.validated - l = ['START_B'] - for c in s: - if c not in setb: - l = l + ['TO_A', c, 'TO_B'] - else: - l.append(c) - l.append('STOP') - - l = self._trailingDigitsToC(l) - - # Finally, replace START_X,TO_Y with START_Y - if l[1] in tos: - l[:2] = ['START_' + l[1][-1]] - -# print repr(l) - - # encode into numbers - start, set, shset = setmap[l[0]] - e = [start] - - l = l[1:-1] - while l: - c = l[0] - if c == 'SHIFT': - e = e + [set[c], shset[l[1]]] - l = l[2:] - elif c in tos: - e.append(set[c]) - set, shset = setmap[c] - l = l[1:] - else: - e.append(set[c]) - l = l[1:] - - c = e[0] - for i in range(1, len(e)): - c = c + i * e[i] - self.encoded = e + [c % 103, stop] - return self.encoded - - def decompose(self): - self.decomposed = ''.join([_patterns[c] for c in self.encoded]) - return self.decomposed - - def _humanText(self): - return self.value diff --git a/reportlab/graphics/barcode/code39.py b/reportlab/graphics/barcode/code39.py deleted file mode 100644 index 386c16f7..00000000 --- a/reportlab/graphics/barcode/code39.py +++ /dev/null @@ -1,245 +0,0 @@ -# -# Copyright (c) 1996-2000 Tyler C. Sarna -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. All advertising materials mentioning features or use of this software -# must display the following acknowledgement: -# This product includes software developed by Tyler C. Sarna. -# 4. Neither the name of the author nor the names of contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS -# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -from reportlab.lib.units import inch -from reportlab.lib.utils import asNative -from reportlab.graphics.barcode.common import Barcode -from string import digits as string_digits - -_patterns = { - '0': ("bsbSBsBsb", 0), '1': ("BsbSbsbsB", 1), - '2': ("bsBSbsbsB", 2), '3': ("BsBSbsbsb", 3), - '4': ("bsbSBsbsB", 4), '5': ("BsbSBsbsb", 5), - '6': ("bsBSBsbsb", 6), '7': ("bsbSbsBsB", 7), - '8': ("BsbSbsBsb", 8), '9': ("bsBSbsBsb", 9), - 'A': ("BsbsbSbsB", 10), 'B': ("bsBsbSbsB", 11), - 'C': ("BsBsbSbsb", 12), 'D': ("bsbsBSbsB", 13), - 'E': ("BsbsBSbsb", 14), 'F': ("bsBsBSbsb", 15), - 'G': ("bsbsbSBsB", 16), 'H': ("BsbsbSBsb", 17), - 'I': ("bsBsbSBsb", 18), 'J': ("bsbsBSBsb", 19), - 'K': ("BsbsbsbSB", 20), 'L': ("bsBsbsbSB", 21), - 'M': ("BsBsbsbSb", 22), 'N': ("bsbsBsbSB", 23), - 'O': ("BsbsBsbSb", 24), 'P': ("bsBsBsbSb", 25), - 'Q': ("bsbsbsBSB", 26), 'R': ("BsbsbsBSb", 27), - 'S': ("bsBsbsBSb", 28), 'T': ("bsbsBsBSb", 29), - 'U': ("BSbsbsbsB", 30), 'V': ("bSBsbsbsB", 31), - 'W': ("BSBsbsbsb", 32), 'X': ("bSbsBsbsB", 33), - 'Y': ("BSbsBsbsb", 34), 'Z': ("bSBsBsbsb", 35), - '-': ("bSbsbsBsB", 36), '.': ("BSbsbsBsb", 37), - ' ': ("bSBsbsBsb", 38), '*': ("bSbsBsBsb", None), - '$': ("bSbSbSbsb", 39), '/': ("bSbSbsbSb", 40), - '+': ("bSbsbSbSb", 41), '%': ("bsbSbSbSb", 42) - } - -from reportlab.lib.utils import ascii_uppercase, ascii_lowercase -_stdchrs = string_digits + ascii_uppercase + "-. $/+%" - -_extended = { - '\0': "%U", '\01': "$A", '\02': "$B", '\03': "$C", - '\04': "$D", '\05': "$E", '\06': "$F", '\07': "$G", - '\010': "$H", '\011': "$I", '\012': "$J", '\013': "$K", - '\014': "$L", '\015': "$M", '\016': "$N", '\017': "$O", - '\020': "$P", '\021': "$Q", '\022': "$R", '\023': "$S", - '\024': "$T", '\025': "$U", '\026': "$V", '\027': "$W", - '\030': "$X", '\031': "$Y", '\032': "$Z", '\033': "%A", - '\034': "%B", '\035': "%C", '\036': "%D", '\037': "%E", - '!': "/A", '"': "/B", '#': "/C", '$': "/D", - '%': "/E", '&': "/F", '\'': "/G", '(': "/H", - ')': "/I", '*': "/J", '+': "/K", ',': "/L", - '/': "/O", ':': "/Z", ';': "%F", '<': "%G", - '=': "%H", '>': "%I", '?': "%J", '@': "%V", - '[': "%K", '\\': "%L", ']': "%M", '^': "%N", - '_': "%O", '`': "%W", 'a': "+A", 'b': "+B", - 'c': "+C", 'd': "+D", 'e': "+E", 'f': "+F", - 'g': "+G", 'h': "+H", 'i': "+I", 'j': "+J", - 'k': "+K", 'l': "+L", 'm': "+M", 'n': "+N", - 'o': "+O", 'p': "+P", 'q': "+Q", 'r': "+R", - 's': "+S", 't': "+T", 'u': "+U", 'v': "+V", - 'w': "+W", 'x': "+X", 'y': "+Y", 'z': "+Z", - '{': "%P", '|': "%Q", '}': "%R", '~': "%S", - '\177': "%T" - } - - -_extchrs = _stdchrs + ascii_lowercase + \ - "\000\001\002\003\004\005\006\007\010\011\012\013\014\015\016\017" + \ - "\020\021\022\023\024\025\026\027\030\031\032\033\034\035\036\037" + \ - "*!'#&\"(),:;<=>?@[\\]^_`{|}~\177" - -def _encode39(value, cksum, stop): - v = sum([_patterns[c][1] for c in value]) % 43 - if cksum: - value += _stdchrs[v] - if stop: value = '*'+value+'*' - return value - -class _Code39Base(Barcode): - barWidth = inch * 0.0075 - lquiet = None - rquiet = None - quiet = 1 - gap = None - barHeight = None - ratio = 2.2 - checksum = 1 - bearers = 0.0 - stop = 1 - def __init__(self, value = "", **args): - value = asNative(value) - for k, v in args.items(): - setattr(self, k, v) - - if self.quiet: - if self.lquiet is None: - self.lquiet = max(inch * 0.25, self.barWidth * 10.0) - self.rquiet = max(inch * 0.25, self.barWidth * 10.0) - else: - self.lquiet = self.rquiet = 0.0 - - Barcode.__init__(self, value) - - def decompose(self): - dval = "" - for c in self.encoded: - dval = dval + _patterns[c][0] + 'i' - self.decomposed = dval[:-1] - return self.decomposed - - def _humanText(self): - return self.stop and self.encoded[1:-1] or self.encoded - -class Standard39(_Code39Base): - """ - Options that may be passed to constructor: - - value (int, or numeric string required.): - The value to encode. - - barWidth (float, default .0075): - X-Dimension, or width of the smallest element - Minumum is .0075 inch (7.5 mils). - - ratio (float, default 2.2): - The ratio of wide elements to narrow elements. - Must be between 2.0 and 3.0 (or 2.2 and 3.0 if the - barWidth is greater than 20 mils (.02 inch)) - - gap (float or None, default None): - width of intercharacter gap. None means "use barWidth". - - barHeight (float, see default below): - Height of the symbol. Default is the height of the two - bearer bars (if they exist) plus the greater of .25 inch - or .15 times the symbol's length. - - checksum (bool, default 1): - Wether to compute and include the check digit - - bearers (float, in units of barWidth. default 0): - Height of bearer bars (horizontal bars along the top and - bottom of the barcode). Default is 0 (no bearers). - - quiet (bool, default 1): - Wether to include quiet zones in the symbol. - - lquiet (float, see default below): - Quiet zone size to left of code, if quiet is true. - Default is the greater of .25 inch, or .15 times the symbol's - length. - - rquiet (float, defaults as above): - Quiet zone size to right left of code, if quiet is true. - - stop (bool, default 1): - Whether to include start/stop symbols. - - Sources of Information on Code 39: - - http://www.semiconductor.agilent.com/barcode/sg/Misc/code_39.html - http://www.adams1.com/pub/russadam/39code.html - http://www.barcodeman.com/c39_1.html - - Official Spec, "ANSI/AIM BC1-1995, USS" is available for US$45 from - http://www.aimglobal.org/aimstore/ - """ - def validate(self): - vval = [].append - self.valid = 1 - for c in self.value: - if c in ascii_lowercase: - c = c.upper() - if c not in _stdchrs: - self.valid = 0 - continue - vval(c) - self.validated = ''.join(vval.__self__) - return self.validated - - def encode(self): - self.encoded = _encode39(self.validated, self.checksum, self.stop) - return self.encoded - -class Extended39(_Code39Base): - """ - Extended Code 39 is a convention for encoding additional characters - not present in stanmdard Code 39 by using pairs of characters to - represent the characters missing in Standard Code 39. - - See Standard39 for arguments. - - Sources of Information on Extended Code 39: - - http://www.semiconductor.agilent.com/barcode/sg/Misc/xcode_39.html - http://www.barcodeman.com/c39_ext.html - """ - def validate(self): - vval = "" - self.valid = 1 - for c in self.value: - if c not in _extchrs: - self.valid = 0 - continue - vval = vval + c - self.validated = vval - return vval - - def encode(self): - self.encoded = "" - for c in self.validated: - if c in _extended: - self.encoded = self.encoded + _extended[c] - elif c in _stdchrs: - self.encoded = self.encoded + c - else: - raise ValueError - self.encoded = _encode39(self.encoded, self.checksum,self.stop) - return self.encoded diff --git a/reportlab/graphics/barcode/code93.py b/reportlab/graphics/barcode/code93.py deleted file mode 100644 index e1c95a17..00000000 --- a/reportlab/graphics/barcode/code93.py +++ /dev/null @@ -1,234 +0,0 @@ -# -# Copyright (c) 2000 Tyler C. Sarna -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. All advertising materials mentioning features or use of this software -# must display the following acknowledgement: -# This product includes software developed by Tyler C. Sarna. -# 4. Neither the name of the author nor the names of contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS -# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -from reportlab.lib.units import inch -from reportlab.lib.utils import asNative -from reportlab.graphics.barcode.common import MultiWidthBarcode - -_patterns = { - '0' : ('AcAaAb', 0), '1' : ('AaAbAc', 1), '2' : ('AaAcAb', 2), - '3' : ('AaAdAa', 3), '4' : ('AbAaAc', 4), '5' : ('AbAbAb', 5), - '6' : ('AbAcAa', 6), '7' : ('AaAaAd', 7), '8' : ('AcAbAa', 8), - '9' : ('AdAaAa', 9), 'A' : ('BaAaAc', 10), 'B' : ('BaAbAb', 11), - 'C' : ('BaAcAa', 12), 'D' : ('BbAaAb', 13), 'E' : ('BbAbAa', 14), - 'F' : ('BcAaAa', 15), 'G' : ('AaBaAc', 16), 'H' : ('AaBbAb', 17), - 'I' : ('AaBcAa', 18), 'J' : ('AbBaAb', 19), 'K' : ('AcBaAa', 20), - 'L' : ('AaAaBc', 21), 'M' : ('AaAbBb', 22), 'N' : ('AaAcBa', 23), - 'O' : ('AbAaBb', 24), 'P' : ('AcAaBa', 25), 'Q' : ('BaBaAb', 26), - 'R' : ('BaBbAa', 27), 'S' : ('BaAaBb', 28), 'T' : ('BaAbBa', 29), - 'U' : ('BbAaBa', 30), 'V' : ('BbBaAa', 31), 'W' : ('AaBaBb', 32), - 'X' : ('AaBbBa', 33), 'Y' : ('AbBaBa', 34), 'Z' : ('AbCaAa', 35), - '-' : ('AbAaCa', 36), '.' : ('CaAaAb', 37), ' ' : ('CaAbAa', 38), - '$' : ('CbAaAa', 39), '/' : ('AaBaCa', 40), '+' : ('AaCaBa', 41), - '%' : ('BaAaCa', 42), '#' : ('AbAbBa', 43), '!' : ('CaBaAa', 44), - '=' : ('CaAaBa', 45), '&' : ('AbBbAa', 46), - 'start' : ('AaAaDa', -1), 'stop' : ('AaAaDaA', -2) -} - -_charsbyval = {} -for k, v in _patterns.items(): - _charsbyval[v[1]] = k - -_extended = { - '\x00' : '!U', '\x01' : '#A', '\x02' : '#B', '\x03' : '#C', - '\x04' : '#D', '\x05' : '#E', '\x06' : '#F', '\x07' : '#G', - '\x08' : '#H', '\x09' : '#I', '\x0a' : '#J', '\x0b' : '#K', - '\x0c' : '#L', '\x0d' : '#M', '\x0e' : '#N', '\x0f' : '#O', - '\x10' : '#P', '\x11' : '#Q', '\x12' : '#R', '\x13' : '#S', - '\x14' : '#T', '\x15' : '#U', '\x16' : '#V', '\x17' : '#W', - '\x18' : '#X', '\x19' : '#Y', '\x1a' : '#Z', '\x1b' : '!A', - '\x1c' : '!B', '\x1d' : '!C', '\x1e' : '!D', '\x1f' : '!E', - '!' : '=A', '"' : '=B', '#' : '=C', '$' : '=D', - '%' : '=E', '&' : '=F', '\'' : '=G', '(' : '=H', - ')' : '=I', '*' : '=J', '+' : '=K', ',' : '=L', - '/' : '=O', ':' : '=Z', ';' : '!F', '<' : '!G', - '=' : '!H', '>' : '!I', '?' : '!J', '@' : '!V', - '[' : '!K', '\\' : '!L', ']' : '!M', '^' : '!N', - '_' : '!O', '`' : '!W', 'a' : '&A', 'b' : '&B', - 'c' : '&C', 'd' : '&D', 'e' : '&E', 'f' : '&F', - 'g' : '&G', 'h' : '&H', 'i' : '&I', 'j' : '&J', - 'k' : '&K', 'l' : '&L', 'm' : '&M', 'n' : '&N', - 'o' : '&O', 'p' : '&P', 'q' : '&Q', 'r' : '&R', - 's' : '&S', 't' : '&T', 'u' : '&U', 'v' : '&V', - 'w' : '&W', 'x' : '&X', 'y' : '&Y', 'z' : '&Z', - '{' : '!P', '|' : '!Q', '}' : '!R', '~' : '!S', - '\x7f' : '!T' -} - -def _encode93(str): - s = list(str) - s.reverse() - - # compute 'C' checksum - i = 0; v = 1; c = 0 - while i < len(s): - c = c + v * _patterns[s[i]][1] - i = i + 1; v = v + 1 - if v > 20: - v = 1 - s.insert(0, _charsbyval[c % 47]) - - # compute 'K' checksum - i = 0; v = 1; c = 0 - while i < len(s): - c = c + v * _patterns[s[i]][1] - i = i + 1; v = v + 1 - if v > 15: - v = 1 - s.insert(0, _charsbyval[c % 47]) - - s.reverse() - - return ''.join(s) - -class _Code93Base(MultiWidthBarcode): - barWidth = inch * 0.0075 - lquiet = None - rquiet = None - quiet = 1 - barHeight = None - stop = 1 - def __init__(self, value='', **args): - - if type(value) is type(1): - value = asNative(value) - - for (k, v) in args.items(): - setattr(self, k, v) - - if self.quiet: - if self.lquiet is None: - self.lquiet = max(inch * 0.25, self.barWidth * 10.0) - self.rquiet = max(inch * 0.25, self.barWidth * 10.0) - else: - self.lquiet = self.rquiet = 0.0 - - MultiWidthBarcode.__init__(self, value) - - def decompose(self): - dval = self.stop and [_patterns['start'][0]] or [] - dval += [_patterns[c][0] for c in self.encoded] - if self.stop: dval.append(_patterns['stop'][0]) - self.decomposed = ''.join(dval) - return self.decomposed - -class Standard93(_Code93Base): - """ - Code 93 is a Uppercase alphanumeric symbology with some punctuation. - See Extended Code 93 for a variant that can represent the entire - 128 characrter ASCII set. - - Options that may be passed to constructor: - - value (int, or numeric string. required.): - The value to encode. - - barWidth (float, default .0075): - X-Dimension, or width of the smallest element - Minumum is .0075 inch (7.5 mils). - - barHeight (float, see default below): - Height of the symbol. Default is the height of the two - bearer bars (if they exist) plus the greater of .25 inch - or .15 times the symbol's length. - - quiet (bool, default 1): - Wether to include quiet zones in the symbol. - - lquiet (float, see default below): - Quiet zone size to left of code, if quiet is true. - Default is the greater of .25 inch, or 10 barWidth - - rquiet (float, defaults as above): - Quiet zone size to right left of code, if quiet is true. - - stop (bool, default 1): - Whether to include start/stop symbols. - - Sources of Information on Code 93: - - http://www.semiconductor.agilent.com/barcode/sg/Misc/code_93.html - - Official Spec, "NSI/AIM BC5-1995, USS" is available for US$45 from - http://www.aimglobal.org/aimstore/ - """ - def validate(self): - vval = "" - self.valid = 1 - for c in self.value.upper(): - if c not in _patterns: - self.valid = 0 - continue - vval = vval + c - self.validated = vval - return vval - - def encode(self): - self.encoded = _encode93(self.validated) - return self.encoded - - -class Extended93(_Code93Base): - """ - Extended Code 93 is a convention for encoding the entire 128 character - set using pairs of characters to represent the characters missing in - Standard Code 93. It is very much like Extended Code 39 in that way. - - See Standard93 for arguments. - """ - - def validate(self): - vval = [] - self.valid = 1 - a = vval.append - for c in self.value: - if c not in _patterns and c not in _extended: - self.valid = 0 - continue - a(c) - self.validated = ''.join(vval) - return self.validated - - def encode(self): - self.encoded = "" - for c in self.validated: - if c in _patterns: - self.encoded = self.encoded + c - elif c in _extended: - self.encoded = self.encoded + _extended[c] - else: - raise ValueError - self.encoded = _encode93(self.encoded) - return self.encoded - - def _humanText(self): - return self.validated+self.encoded[-2:] diff --git a/reportlab/graphics/barcode/common.py b/reportlab/graphics/barcode/common.py deleted file mode 100644 index 2fdd9891..00000000 --- a/reportlab/graphics/barcode/common.py +++ /dev/null @@ -1,749 +0,0 @@ -# -# Copyright (c) 1996-2000 Tyler C. Sarna -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. All advertising materials mentioning features or use of this software -# must display the following acknowledgement: -# This product includes software developed by Tyler C. Sarna. -# 4. Neither the name of the author nor the names of contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS -# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -from reportlab.platypus.flowables import Flowable -from reportlab.lib.units import inch -from reportlab.lib.utils import ascii_uppercase, ascii_lowercase -from string import digits as string_digits - -class Barcode(Flowable): - """Abstract Base for barcodes. Includes implementations of - some methods suitable for the more primitive barcode types""" - - fontName = 'Courier' - fontSize = 12 - humanReadable = 0 - - def _humanText(self): - return self.encoded - - def __init__(self, value='',**kwd): - self.value = str(value) - - self._setKeywords(**kwd) - if not hasattr(self, 'gap'): - self.gap = None - - - def _calculate(self): - self.validate() - self.encode() - self.decompose() - self.computeSize() - - def _setKeywords(self,**kwd): - for (k, v) in kwd.items(): - setattr(self, k, v) - - def validate(self): - self.valid = 1 - self.validated = self.value - - def encode(self): - self.encoded = self.validated - - def decompose(self): - self.decomposed = self.encoded - - def computeSize(self, *args): - barWidth = self.barWidth - wx = barWidth * self.ratio - - if self.gap == None: - self.gap = barWidth - - w = 0.0 - - for c in self.decomposed: - if c in 'sb': - w = w + barWidth - elif c in 'SB': - w = w + wx - else: # 'i' - w = w + self.gap - - if self.barHeight is None: - self.barHeight = w * 0.15 - self.barHeight = max(0.25 * inch, self.barHeight) - if self.bearers: - self.barHeight = self.barHeight + self.bearers * 2.0 * barWidth - - if self.quiet: - w += self.lquiet + self.rquiet - - - self._height = self.barHeight - self._width = w - - def width(self): - self._calculate() - return self._width - width = property(width) - - def height(self): - self._calculate() - return self._height - height = property(height) - - def draw(self): - self._calculate() - barWidth = self.barWidth - wx = barWidth * self.ratio - - left = self.quiet and self.lquiet or 0 - b = self.bearers * barWidth - bb = b * 0.5 - tb = self.barHeight - (b * 1.5) - - for c in self.decomposed: - if c == 'i': - left = left + self.gap - elif c == 's': - left = left + barWidth - elif c == 'S': - left = left + wx - elif c == 'b': - self.rect(left, bb, barWidth, tb) - left = left + barWidth - elif c == 'B': - self.rect(left, bb, wx, tb) - left = left + wx - - if self.bearers: - self.rect(self.lquiet, 0, \ - self._width - (self.lquiet + self.rquiet), b) - self.rect(self.lquiet, self.barHeight - b, \ - self._width - (self.lquiet + self.rquiet), b) - - self.drawHumanReadable() - - def drawHumanReadable(self): - if self.humanReadable: - #we have text - from reportlab.pdfbase.pdfmetrics import getAscent, stringWidth - s = str(self._humanText()) - fontSize = self.fontSize - fontName = self.fontName - w = stringWidth(s,fontName,fontSize) - width = self._width - if self.quiet: - width -= self.lquiet+self.rquiet - x = self.lquiet - else: - x = 0 - if w>width: fontSize *= width/float(w) - y = 1.07*getAscent(fontName)*fontSize/1000. - self.annotate(x+width/2.,-y,s,fontName,fontSize) - - def rect(self, x, y, w, h): - self.canv.rect(x, y, w, h, stroke=0, fill=1) - - def annotate(self,x,y,text,fontName,fontSize,anchor='middle'): - canv = self.canv - canv.saveState() - canv.setFont(self.fontName,fontSize) - if anchor=='middle': func = 'drawCentredString' - elif anchor=='end': func = 'drawRightString' - else: func = 'drawString' - getattr(canv,func)(x,y,text) - canv.restoreState() - -class MultiWidthBarcode(Barcode): - """Base for variable-bar-width codes like Code93 and Code128""" - - def computeSize(self, *args): - barWidth = self.barWidth - oa, oA = ord('a') - 1, ord('A') - 1 - - w = 0.0 - - for c in self.decomposed: - oc = ord(c) - if c in ascii_lowercase: - w = w + barWidth * (oc - oa) - elif c in ascii_uppercase: - w = w + barWidth * (oc - oA) - - if self.barHeight is None: - self.barHeight = w * 0.15 - self.barHeight = max(0.25 * inch, self.barHeight) - - if self.quiet: - w += self.lquiet + self.rquiet - - self._height = self.barHeight - self._width = w - - def draw(self): - self._calculate() - oa, oA = ord('a') - 1, ord('A') - 1 - barWidth = self.barWidth - left = self.quiet and self.lquiet or 0 - - for c in self.decomposed: - oc = ord(c) - if c in ascii_lowercase: - left = left + (oc - oa) * barWidth - elif c in ascii_uppercase: - w = (oc - oA) * barWidth - self.rect(left, 0, w, self.barHeight) - left += w - self.drawHumanReadable() - -class I2of5(Barcode): - """ - Interleaved 2 of 5 is a numeric-only barcode. It encodes an even - number of digits; if an odd number is given, a 0 is prepended. - - Options that may be passed to constructor: - - value (int, or numeric string required.): - The value to encode. - - barWidth (float, default .0075): - X-Dimension, or width of the smallest element - Minumum is .0075 inch (7.5 mils). - - ratio (float, default 2.2): - The ratio of wide elements to narrow elements. - Must be between 2.0 and 3.0 (or 2.2 and 3.0 if the - barWidth is greater than 20 mils (.02 inch)) - - gap (float or None, default None): - width of intercharacter gap. None means "use barWidth". - - barHeight (float, see default below): - Height of the symbol. Default is the height of the two - bearer bars (if they exist) plus the greater of .25 inch - or .15 times the symbol's length. - - checksum (bool, default 1): - Whether to compute and include the check digit - - bearers (float, in units of barWidth. default 3.0): - Height of bearer bars (horizontal bars along the top and - bottom of the barcode). Default is 3 x-dimensions. - Set to zero for no bearer bars. (Bearer bars help detect - misscans, so it is suggested to leave them on). - - quiet (bool, default 1): - Whether to include quiet zones in the symbol. - - lquiet (float, see default below): - Quiet zone size to left of code, if quiet is true. - Default is the greater of .25 inch, or .15 times the symbol's - length. - - rquiet (float, defaults as above): - Quiet zone size to right left of code, if quiet is true. - - stop (bool, default 1): - Whether to include start/stop symbols. - - Sources of Information on Interleaved 2 of 5: - - http://www.semiconductor.agilent.com/barcode/sg/Misc/i_25.html - http://www.adams1.com/pub/russadam/i25code.html - - Official Spec, "ANSI/AIM BC2-1995, USS" is available for US$45 from - http://www.aimglobal.org/aimstore/ - """ - - patterns = { - 'start' : 'bsbs', - 'stop' : 'Bsb', - - 'B0' : 'bbBBb', 'S0' : 'ssSSs', - 'B1' : 'BbbbB', 'S1' : 'SsssS', - 'B2' : 'bBbbB', 'S2' : 'sSssS', - 'B3' : 'BBbbb', 'S3' : 'SSsss', - 'B4' : 'bbBbB', 'S4' : 'ssSsS', - 'B5' : 'BbBbb', 'S5' : 'SsSss', - 'B6' : 'bBBbb', 'S6' : 'sSSss', - 'B7' : 'bbbBB', 'S7' : 'sssSS', - 'B8' : 'BbbBb', 'S8' : 'SssSs', - 'B9' : 'bBbBb', 'S9' : 'sSsSs' - } - - barHeight = None - barWidth = inch * 0.0075 - ratio = 2.2 - checksum = 1 - bearers = 3.0 - quiet = 1 - lquiet = None - rquiet = None - stop = 1 - - def __init__(self, value='', **args): - - if type(value) == type(1): - value = str(value) - - for k, v in args.items(): - setattr(self, k, v) - - if self.quiet: - if self.lquiet is None: - self.lquiet = min(inch * 0.25, self.barWidth * 10.0) - self.rquiet = min(inch * 0.25, self.barWidth * 10.0) - else: - self.lquiet = self.rquiet = 0.0 - - Barcode.__init__(self, value) - - def validate(self): - vval = "" - self.valid = 1 - for c in self.value.strip(): - if c not in string_digits: - self.valid = 0 - continue - vval = vval + c - self.validated = vval - return vval - - def encode(self): - s = self.validated - cs = self.checksum - c = len(s) - - #ensure len(result)%2 == 0, checksum included - if ((c % 2 == 0) and cs) or ((c % 2 == 1) and not cs): - s = '0' + s - c += 1 - - if cs: - c = 3*sum([int(s[i]) for i in range(0,c,2)])+sum([int(s[i]) for i in range(1,c,2)]) - s += str((10 - c) % 10) - - self.encoded = s - - def decompose(self): - dval = self.stop and [self.patterns['start']] or [] - a = dval.append - - for i in range(0, len(self.encoded), 2): - b = self.patterns['B' + self.encoded[i]] - s = self.patterns['S' + self.encoded[i+1]] - - for i in range(0, len(b)): - a(b[i] + s[i]) - - if self.stop: a(self.patterns['stop']) - self.decomposed = ''.join(dval) - return self.decomposed - -class MSI(Barcode): - """ - MSI is a numeric-only barcode. - - Options that may be passed to constructor: - - value (int, or numeric string required.): - The value to encode. - - barWidth (float, default .0075): - X-Dimension, or width of the smallest element - - ratio (float, default 2.2): - The ratio of wide elements to narrow elements. - - gap (float or None, default None): - width of intercharacter gap. None means "use barWidth". - - barHeight (float, see default below): - Height of the symbol. Default is the height of the two - bearer bars (if they exist) plus the greater of .25 inch - or .15 times the symbol's length. - - checksum (bool, default 1): - Wether to compute and include the check digit - - bearers (float, in units of barWidth. default 0): - Height of bearer bars (horizontal bars along the top and - bottom of the barcode). Default is 0 (no bearers). - - lquiet (float, see default below): - Quiet zone size to left of code, if quiet is true. - Default is the greater of .25 inch, or 10 barWidths. - - rquiet (float, defaults as above): - Quiet zone size to right left of code, if quiet is true. - - stop (bool, default 1): - Whether to include start/stop symbols. - - Sources of Information on MSI Bar Code: - - http://www.semiconductor.agilent.com/barcode/sg/Misc/msi_code.html - http://www.adams1.com/pub/russadam/plessy.html - """ - - patterns = { - 'start' : 'Bs', 'stop' : 'bSb', - - '0' : 'bSbSbSbS', '1' : 'bSbSbSBs', - '2' : 'bSbSBsbS', '3' : 'bSbSBsBs', - '4' : 'bSBsbSbS', '5' : 'bSBsbSBs', - '6' : 'bSBsBsbS', '7' : 'bSBsBsBs', - '8' : 'BsbSbSbS', '9' : 'BsbSbSBs' - } - - stop = 1 - barHeight = None - barWidth = inch * 0.0075 - ratio = 2.2 - checksum = 1 - bearers = 0.0 - quiet = 1 - lquiet = None - rquiet = None - - def __init__(self, value="", **args): - - if type(value) == type(1): - value = str(value) - - for k, v in args.items(): - setattr(self, k, v) - - if self.quiet: - if self.lquiet is None: - self.lquiet = max(inch * 0.25, self.barWidth * 10.0) - self.rquiet = max(inch * 0.25, self.barWidth * 10.0) - else: - self.lquiet = self.rquiet = 0.0 - - Barcode.__init__(self, value) - - def validate(self): - vval = "" - self.valid = 1 - for c in self.value.strip(): - if c not in string_digits: - self.valid = 0 - continue - vval = vval + c - self.validated = vval - return vval - - def encode(self): - s = self.validated - - if self.checksum: - c = '' - for i in range(1, len(s), 2): - c = c + s[i] - d = str(int(c) * 2) - t = 0 - for c in d: - t = t + int(c) - for i in range(0, len(s), 2): - t = t + int(s[i]) - c = 10 - (t % 10) - - s = s + str(c) - - self.encoded = s - - def decompose(self): - dval = self.stop and [self.patterns['start']] or [] - dval += [self.patterns[c] for c in self.encoded] - if self.stop: dval.append(self.patterns['stop']) - self.decomposed = ''.join(dval) - return self.decomposed - -class Codabar(Barcode): - """ - Codabar is a numeric plus some puntuation ("-$:/.+") barcode - with four start/stop characters (A, B, C, and D). - - Options that may be passed to constructor: - - value (string required.): - The value to encode. - - barWidth (float, default .0065): - X-Dimension, or width of the smallest element - minimum is 6.5 mils (.0065 inch) - - ratio (float, default 2.0): - The ratio of wide elements to narrow elements. - - gap (float or None, default None): - width of intercharacter gap. None means "use barWidth". - - barHeight (float, see default below): - Height of the symbol. Default is the height of the two - bearer bars (if they exist) plus the greater of .25 inch - or .15 times the symbol's length. - - checksum (bool, default 0): - Whether to compute and include the check digit - - bearers (float, in units of barWidth. default 0): - Height of bearer bars (horizontal bars along the top and - bottom of the barcode). Default is 0 (no bearers). - - quiet (bool, default 1): - Whether to include quiet zones in the symbol. - - stop (bool, default 1): - Whether to include start/stop symbols. - - lquiet (float, see default below): - Quiet zone size to left of code, if quiet is true. - Default is the greater of .25 inch, or 10 barWidth - - rquiet (float, defaults as above): - Quiet zone size to right left of code, if quiet is true. - - Sources of Information on Codabar - - http://www.semiconductor.agilent.com/barcode/sg/Misc/codabar.html - http://www.barcodeman.com/codabar.html - - Official Spec, "ANSI/AIM BC3-1995, USS" is available for US$45 from - http://www.aimglobal.org/aimstore/ - """ - - patterns = { - '0': 'bsbsbSB', '1': 'bsbsBSb', '2': 'bsbSbsB', - '3': 'BSbsbsb', '4': 'bsBsbSb', '5': 'BsbsbSb', - '6': 'bSbsbsB', '7': 'bSbsBsb', '8': 'bSBsbsb', - '9': 'BsbSbsb', '-': 'bsbSBsb', '$': 'bsBSbsb', - ':': 'BsbsBsB', '/': 'BsBsbsB', '.': 'BsBsBsb', - '+': 'bsBsBsB', 'A': 'bsBSbSb', 'B': 'bSbSbsB', - 'C': 'bsbSbSB', 'D': 'bsbSBSb' - } - - values = { - '0' : 0, '1' : 1, '2' : 2, '3' : 3, '4' : 4, - '5' : 5, '6' : 6, '7' : 7, '8' : 8, '9' : 9, - '-' : 10, '$' : 11, ':' : 12, '/' : 13, '.' : 14, - '+' : 15, 'A' : 16, 'B' : 17, 'C' : 18, 'D' : 19 - } - - chars = string_digits + "-$:/.+" - - stop = 1 - barHeight = None - barWidth = inch * 0.0065 - ratio = 2.0 # XXX ? - checksum = 0 - bearers = 0.0 - quiet = 1 - lquiet = None - rquiet = None - - def __init__(self, value='', **args): - if type(value) == type(1): - value = str(value) - - for k, v in args.items(): - setattr(self, k, v) - - if self.quiet: - if self.lquiet is None: - self.lquiet = min(inch * 0.25, self.barWidth * 10.0) - self.rquiet = min(inch * 0.25, self.barWidth * 10.0) - else: - self.lquiet = self.rquiet = 0.0 - - Barcode.__init__(self, value) - - def validate(self): - vval = "" - self.valid = 1 - s = self.value.strip() - for i in range(0, len(s)): - c = s[i] - if c not in self.chars: - if ((i != 0) and (i != len(s) - 1)) or (c not in 'ABCD'): - self.Valid = 0 - continue - vval = vval + c - - if self.stop: - if vval[0] not in 'ABCD': - vval = 'A' + vval - if vval[-1] not in 'ABCD': - vval = vval + vval[0] - - self.validated = vval - return vval - - def encode(self): - s = self.validated - - if self.checksum: - v = sum([self.values[c] for c in s]) - s += self.chars[v % 16] - - self.encoded = s - - def decompose(self): - dval = ''.join([self.patterns[c]+'i' for c in self.encoded]) - self.decomposed = dval[:-1] - return self.decomposed - -class Code11(Barcode): - """ - Code 11 is an almost-numeric barcode. It encodes the digits 0-9 plus - dash ("-"). 11 characters total, hence the name. - - value (int or string required.): - The value to encode. - - barWidth (float, default .0075): - X-Dimension, or width of the smallest element - - ratio (float, default 2.2): - The ratio of wide elements to narrow elements. - - gap (float or None, default None): - width of intercharacter gap. None means "use barWidth". - - barHeight (float, see default below): - Height of the symbol. Default is the height of the two - bearer bars (if they exist) plus the greater of .25 inch - or .15 times the symbol's length. - - checksum (0 none, 1 1-digit, 2 2-digit, -1 auto, default -1): - How many checksum digits to include. -1 ("auto") means - 1 if the number of digits is 10 or less, else 2. - - bearers (float, in units of barWidth. default 0): - Height of bearer bars (horizontal bars along the top and - bottom of the barcode). Default is 0 (no bearers). - - quiet (bool, default 1): - Wether to include quiet zones in the symbol. - - lquiet (float, see default below): - Quiet zone size to left of code, if quiet is true. - Default is the greater of .25 inch, or 10 barWidth - - rquiet (float, defaults as above): - Quiet zone size to right left of code, if quiet is true. - - Sources of Information on Code 11: - - http://www.cwi.nl/people/dik/english/codes/barcodes.html - """ - - chars = '0123456789-' - - patterns = { - '0' : 'bsbsB', '1' : 'BsbsB', '2' : 'bSbsB', - '3' : 'BSbsb', '4' : 'bsBsB', '5' : 'BsBsb', - '6' : 'bSBsb', '7' : 'bsbSB', '8' : 'BsbSb', - '9' : 'Bsbsb', '-' : 'bsBsb', 'S' : 'bsBSb' # Start/Stop - } - - values = { - '0' : 0, '1' : 1, '2' : 2, '3' : 3, '4' : 4, - '5' : 5, '6' : 6, '7' : 7, '8' : 8, '9' : 9, - '-' : 10, - } - - stop = 1 - barHeight = None - barWidth = inch * 0.0075 - ratio = 2.2 # XXX ? - checksum = -1 # Auto - bearers = 0.0 - quiet = 1 - lquiet = None - rquiet = None - def __init__(self, value='', **args): - if type(value) == type(1): - value = str(value) - - for k, v in args.items(): - setattr(self, k, v) - - if self.quiet: - if self.lquiet is None: - self.lquiet = min(inch * 0.25, self.barWidth * 10.0) - self.rquiet = min(inch * 0.25, self.barWidth * 10.0) - else: - self.lquiet = self.rquiet = 0.0 - - Barcode.__init__(self, value) - - def validate(self): - vval = "" - self.valid = 1 - s = self.value.strip() - for i in range(0, len(s)): - c = s[i] - if c not in self.chars: - self.Valid = 0 - continue - vval = vval + c - - self.validated = vval - return vval - - def _addCSD(self,s,m): - # compute first checksum - i = c = 0 - v = 1 - V = self.values - while i < len(s): - c += v * V[s[-(i+1)]] - i += 1 - v += 1 - if v==m: - v = 1 - return s+self.chars[c % 11] - - def encode(self): - s = self.validated - - tcs = self.checksum - if tcs<0: - self.checksum = tcs = 1+int(len(s)>10) - - if tcs > 0: s = self._addCSD(s,11) - if tcs > 1: s = self._addCSD(s,10) - - self.encoded = self.stop and ('S' + s + 'S') or s - - def decompose(self): - self.decomposed = ''.join([(self.patterns[c]+'i') for c in self.encoded])[:-1] - return self.decomposed - - def _humanText(self): - return self.stop and self.encoded[1:-1] or self.encoded diff --git a/reportlab/graphics/barcode/eanbc.py b/reportlab/graphics/barcode/eanbc.py deleted file mode 100644 index 5285b599..00000000 --- a/reportlab/graphics/barcode/eanbc.py +++ /dev/null @@ -1,350 +0,0 @@ -__all__=( - 'Ean13BarcodeWidget','isEanString', - ) -from reportlab.graphics.shapes import Group, String, Rect -from reportlab.lib import colors -from reportlab.pdfbase.pdfmetrics import stringWidth -from reportlab.lib.validators import isNumber, isColor, isString, Validator, isBoolean -from reportlab.lib.attrmap import * -from reportlab.graphics.charts.areas import PlotArea -from reportlab.lib.units import mm -from reportlab.lib.utils import asNative - -#work out a list of manufacturer codes.... -_eanNumberSystems = [ - ('00-13', 'USA & Canada'), - ('20-29', 'In-Store Functions'), - ('30-37', 'France'), - ('40-44', 'Germany'), - ('45', 'Japan (also 49)'), - ('46', 'Russian Federation'), - ('471', 'Taiwan'), - ('474', 'Estonia'), - ('475', 'Latvia'), - ('477', 'Lithuania'), - ('479', 'Sri Lanka'), - ('480', 'Philippines'), - ('482', 'Ukraine'), - ('484', 'Moldova'), - ('485', 'Armenia'), - ('486', 'Georgia'), - ('487', 'Kazakhstan'), - ('489', 'Hong Kong'), - ('49', 'Japan (JAN-13)'), - ('50', 'United Kingdom'), - ('520', 'Greece'), - ('528', 'Lebanon'), - ('529', 'Cyprus'), - ('531', 'Macedonia'), - ('535', 'Malta'), - ('539', 'Ireland'), - ('54', 'Belgium & Luxembourg'), - ('560', 'Portugal'), - ('569', 'Iceland'), - ('57', 'Denmark'), - ('590', 'Poland'), - ('594', 'Romania'), - ('599', 'Hungary'), - ('600-601', 'South Africa'), - ('609', 'Mauritius'), - ('611', 'Morocco'), - ('613', 'Algeria'), - ('619', 'Tunisia'), - ('622', 'Egypt'), - ('625', 'Jordan'), - ('626', 'Iran'), - ('64', 'Finland'), - ('690-692', 'China'), - ('70', 'Norway'), - ('729', 'Israel'), - ('73', 'Sweden'), - ('740', 'Guatemala'), - ('741', 'El Salvador'), - ('742', 'Honduras'), - ('743', 'Nicaragua'), - ('744', 'Costa Rica'), - ('746', 'Dominican Republic'), - ('750', 'Mexico'), - ('759', 'Venezuela'), - ('76', 'Switzerland'), - ('770', 'Colombia'), - ('773', 'Uruguay'), - ('775', 'Peru'), - ('777', 'Bolivia'), - ('779', 'Argentina'), - ('780', 'Chile'), - ('784', 'Paraguay'), - ('785', 'Peru'), - ('786', 'Ecuador'), - ('789', 'Brazil'), - ('80-83', 'Italy'), - ('84', 'Spain'), - ('850', 'Cuba'), - ('858', 'Slovakia'), - ('859', 'Czech Republic'), - ('860', 'Yugloslavia'), - ('869', 'Turkey'), - ('87', 'Netherlands'), - ('880', 'South Korea'), - ('885', 'Thailand'), - ('888', 'Singapore'), - ('890', 'India'), - ('893', 'Vietnam'), - ('899', 'Indonesia'), - ('90-91', 'Austria'), - ('93', 'Australia'), - ('94', 'New Zealand'), - ('955', 'Malaysia'), - ('977', 'International Standard Serial Number for Periodicals (ISSN)'), - ('978', 'International Standard Book Numbering (ISBN)'), - ('979', 'International Standard Music Number (ISMN)'), - ('980', 'Refund receipts'), - ('981-982', 'Common Currency Coupons'), - ('99', 'Coupons') - ] - -manufacturerCodes = {} -for (k, v) in _eanNumberSystems: - words = k.split('-') - if len(words)==2: - fromCode = int(words[0]) - toCode = int(words[1]) - for code in range(fromCode, toCode+1): - manufacturerCodes[code] = v - else: - manufacturerCodes[int(k)] = v - -def nDigits(n): - class _ndigits(Validator): - def test(self,x): - return type(x) is str and len(x)<=n and len([c for c in x if c in "0123456789"])==n - return _ndigits() - -class Ean13BarcodeWidget(PlotArea): - codeName = "EAN13" - _attrMap = AttrMap(BASE=PlotArea, - value = AttrMapValue(nDigits(12), desc='the number'), - fontName = AttrMapValue(isString, desc='fontName'), - fontSize = AttrMapValue(isNumber, desc='font size'), - x = AttrMapValue(isNumber, desc='x-coord'), - y = AttrMapValue(isNumber, desc='y-coord'), - barFillColor = AttrMapValue(isColor, desc='bar color'), - barHeight = AttrMapValue(isNumber, desc='Height of bars.'), - barWidth = AttrMapValue(isNumber, desc='Width of bars.'), - barStrokeWidth = AttrMapValue(isNumber, desc='Width of bar borders.'), - barStrokeColor = AttrMapValue(isColor, desc='Color of bar borders.'), - textColor = AttrMapValue(isColor, desc='human readable text color'), - humanReadable = AttrMapValue(isBoolean, desc='if human readable'), - quiet = AttrMapValue(isBoolean, desc='if quiet zone to be used'), - lquiet = AttrMapValue(isBoolean, desc='left quiet zone length'), - rquiet = AttrMapValue(isBoolean, desc='right quiet zone length'), - ) - _digits=12 - _start_right = 7 #for ean-13 left = [0:7] right=[7:13] - _nbars = 113 - barHeight = 25.93*mm #millimeters - barWidth = (37.29/_nbars)*mm - humanReadable = 1 - _0csw = 1 - _1csw = 3 - - #Left Hand Digits. - _left = ( ("0001101", "0011001", "0010011", "0111101", - "0100011", "0110001", "0101111", "0111011", - "0110111", "0001011", - ), #odd left hand digits - ("0100111", "0110011", "0011011", "0100001", - "0011101", "0111001", "0000101", "0010001", - "0001001", "0010111"), #even left hand digits - ) - - _right = ("1110010", "1100110", "1101100", "1000010", - "1011100", "1001110", "1010000", "1000100", - "1001000", "1110100") - - quiet = 1 - rquiet = lquiet = None - _tail = "101" - _sep = "01010" - - _lhconvert={ - "0": (0,0,0,0,0,0), - "1": (0,0,1,0,1,1), - "2": (0,0,1,1,0,1), - "3": (0,0,1,1,1,0), - "4": (0,1,0,0,1,1), - "5": (0,1,1,0,0,1), - "6": (0,1,1,1,0,0), - "7": (0,1,0,1,0,1), - "8": (0,1,0,1,1,0), - "9": (0,1,1,0,1,0) - } - fontSize = 8 #millimeters - fontName = 'Helvetica' - textColor = barFillColor = colors.black - barStrokeColor = None - barStrokeWidth = 0 - x = 0 - y = 0 - def __init__(self,value='123456789012',**kw): - value = str(value) if isinstance(value,int) else asNative(value) - self.value=max(self._digits-len(value),0)*'0'+value[:self._digits] - for k, v in kw.items(): - setattr(self, k, v) - - width = property(lambda self: self.barWidth*(self._nbars-18+self._calc_quiet(self.lquiet)+self._calc_quiet(self.rquiet))) - - def wrap(self,aW,aH): - return self.width,self.barHeight - - def _encode_left(self,s,a): - cp = self._lhconvert[s[0]] #convert the left hand numbers - _left = self._left - z = ord('0') - for i,c in enumerate(s[1:self._start_right]): - a(_left[cp[i]][ord(c)-z]) - - def _short_bar(self,i): - i += 9 - self._lquiet - return self.humanReadable and ((120: v += 1 - else: - v = 0 - return v - - def draw(self): - g = Group() - gAdd = g.add - barWidth = self.barWidth - width = self.width - barHeight = self.barHeight - x = self.x - y = self.y - gAdd(Rect(x,y,width,barHeight,fillColor=None,strokeColor=None,strokeWidth=0)) - s = self.value+self._checkdigit(self.value) - self._lquiet = lquiet = self._calc_quiet(self.lquiet) - rquiet = self._calc_quiet(self.rquiet) - b = [lquiet*'0',self._tail] #the signal string - a = b.append - self._encode_left(s,a) - a(self._sep) - - z = ord('0') - _right = self._right - for c in s[self._start_right:]: - a(_right[ord(c)-z]) - a(self._tail) - a(rquiet*'0') - - fontSize = self.fontSize - barFillColor = self.barFillColor - barStrokeWidth = self.barStrokeWidth - barStrokeColor = self.barStrokeColor - - fth = fontSize*1.2 - b = ''.join(b) - - lrect = None - for i,c in enumerate(b): - if c=="1": - dh = self._short_bar(i) and fth or 0 - yh = y+dh - if lrect and lrect.y==yh: - lrect.width += barWidth - else: - lrect = Rect(x,yh,barWidth,barHeight-dh,fillColor=barFillColor,strokeWidth=barStrokeWidth,strokeColor=barStrokeColor) - gAdd(lrect) - else: - lrect = None - x += barWidth - - if self.humanReadable: self._add_human_readable(s,gAdd) - return g - - def _add_human_readable(self,s,gAdd): - barWidth = self.barWidth - fontSize = self.fontSize - textColor = self.textColor - fontName = self.fontName - fth = fontSize*1.2 - # draw the num below the line. - c = s[0] - w = stringWidth(c,fontName,fontSize) - x = self.x+barWidth*(self._lquiet-8) - y = self.y + 0.2*fth - - gAdd(String(x,y,c,fontName=fontName,fontSize=fontSize,fillColor=textColor)) - x = self.x + (33-9+self._lquiet)*barWidth - - c = s[1:7] - gAdd(String(x,y,c,fontName=fontName,fontSize=fontSize,fillColor=textColor,textAnchor='middle')) - - x += 47*barWidth - c = s[7:] - gAdd(String(x,y,c,fontName=fontName,fontSize=fontSize,fillColor=textColor,textAnchor='middle')) - - def _checkdigit(cls,num): - z = ord('0') - iSum = cls._0csw*sum([(ord(x)-z) for x in num[::2]]) \ - + cls._1csw*sum([(ord(x)-z) for x in num[1::2]]) - return chr(z+((10-(iSum%10))%10)) - _checkdigit=classmethod(_checkdigit) - -class Ean8BarcodeWidget(Ean13BarcodeWidget): - codeName = "EAN8" - _attrMap = AttrMap(BASE=Ean13BarcodeWidget, - value = AttrMapValue(nDigits(7), desc='the number'), - ) - _start_right = 4 #for ean-13 left = [0:7] right=[7:13] - _nbars = 85 - _digits=7 - _0csw = 3 - _1csw = 1 - - def _encode_left(self,s,a): - cp = self._lhconvert[s[0]] #convert the left hand numbers - _left = self._left[0] - z = ord('0') - for i,c in enumerate(s[0:self._start_right]): - a(_left[ord(c)-z]) - - def _short_bar(self,i): - i += 9 - self._lquiet - return self.humanReadable and ((12 -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. All advertising materials mentioning features or use of this software -# must display the following acknowledgement: -# This product includes software developed by Tyler C. Sarna. -# 4. Neither the name of the author nor the names of contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS -# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -from reportlab.lib.units import inch -from reportlab.graphics.barcode.common import Barcode -import string - -# . 3 T Tracker -# , 2 D Descender -# ' 1 A Ascender -# | 0 H Ascender/Descender - -_rm_patterns = { - "0" : "--||", "1" : "-',|", "2" : "-'|,", "3" : "'-,|", - "4" : "'-|,", "5" : "'',,", "6" : "-,'|", "7" : "-|-|", - "8" : "-|',", "9" : "',-|", "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" : "||--", - - # start, stop - "(" : "'-,'", ")" : "'|,|" -} - -_ozN_patterns = { - "0" : "||", "1" : "|'", "2" : "|,", "3" : "'|", "4" : "''", - "5" : "',", "6" : ",|", "7" : ",'", "8" : ",,", "9" : ".|" -} - -_ozC_patterns = { - "A" : "|||", "B" : "||'", "C" : "||,", "D" : "|'|", - "E" : "|''", "F" : "|',", "G" : "|,|", "H" : "|,'", - "I" : "|,,", "J" : "'||", "K" : "'|'", "L" : "'|,", - "M" : "''|", "N" : "'''", "O" : "'',", "P" : "',|", - "Q" : "','", "R" : "',,", "S" : ",||", "T" : ",|'", - "U" : ",|,", "V" : ",'|", "W" : ",''", "X" : ",',", - "Y" : ",,|", "Z" : ",,'", "a" : "|,.", "b" : "|.|", - "c" : "|.'", "d" : "|.,", "e" : "|..", "f" : "'|.", - "g" : "''.", "h" : "',.", "i" : "'.|", "j" : "'.'", - "k" : "'.,", "l" : "'..", "m" : ",|.", "n" : ",'.", - "o" : ",,.", "p" : ",.|", "q" : ",.'", "r" : ",.,", - "s" : ",..", "t" : ".|.", "u" : ".'.", "v" : ".,.", - "w" : "..|", "x" : "..'", "y" : "..,", "z" : "...", - "0" : ",,,", "1" : ".||", "2" : ".|'", "3" : ".|,", - "4" : ".'|", "5" : ".''", "6" : ".',", "7" : ".,|", - "8" : ".,'", "9" : ".,,", " " : "||.", "#" : "|'.", -} - -#http://www.auspost.com.au/futurepost/ diff --git a/reportlab/graphics/barcode/lto.py b/reportlab/graphics/barcode/lto.py deleted file mode 100644 index 4de040f1..00000000 --- a/reportlab/graphics/barcode/lto.py +++ /dev/null @@ -1,196 +0,0 @@ -# (c) 2008 Jerome Alet - -# Licensing terms : ReportLab's license. - -from reportlab.graphics.barcode.code39 import Standard39 -from reportlab.lib import colors -from reportlab.lib.units import cm -from string import digits as string_digits -from reportlab.lib.utils import ascii_uppercase - -class BaseLTOLabel(Standard39) : - """ - Base class for LTO labels. - - Specification taken from "IBM LTO Ultrium Cartridge Label Specification, Revision 3" - available on May 14th 2008 from : - http://www-1.ibm.com/support/docview.wss?rs=543&context=STCVQ6R&q1=ssg1*&uid=ssg1S7000429&loc=en_US&cs=utf-8&lang=en+en - """ - LABELWIDTH = 7.9 * cm - LABELHEIGHT = 1.7 * cm - LABELROUND = 0.15 * cm - CODERATIO = 2.75 - CODENOMINALWIDTH = 7.4088 * cm - CODEBARHEIGHT = 1.11 * cm - CODEBARWIDTH = 0.0432 * cm - CODEGAP = CODEBARWIDTH - CODELQUIET = 10 * CODEBARWIDTH - CODERQUIET = 10 * CODEBARWIDTH - def __init__(self, prefix="", - number=None, - subtype="1", - border=None, - checksum=False, - availheight=None) : - """ - Initializes an LTO label. - - prefix : Up to six characters from [A-Z][0-9]. Defaults to "". - number : Label's number or None. Defaults to None. - subtype : LTO subtype string , e.g. "1" for LTO1. Defaults to "1". - border : None, or the width of the label's border. Defaults to None. - checksum : Boolean indicates if checksum char has to be printed. Defaults to False. - availheight : Available height on the label, or None for automatic. Defaults to None. - """ - self.height = max(availheight, self.CODEBARHEIGHT) - self.border = border - if (len(subtype) != 1) \ - or (subtype not in ascii_uppercase + string_digits) : - raise ValueError("Invalid subtype '%s'" % subtype) - if ((not number) and (len(prefix) > 6)) \ - or not prefix.isalnum() : - raise ValueError("Invalid prefix '%s'" % prefix) - label = "%sL%s" % ((prefix + str(number or 0).zfill(6 - len(prefix)))[:6], - subtype) - if len(label) != 8 : - raise ValueError("Invalid set of parameters (%s, %s, %s)" \ - % (prefix, number, subtype)) - self.label = label - Standard39.__init__(self, - label, - ratio=self.CODERATIO, - barHeight=self.height, - barWidth=self.CODEBARWIDTH, - gap=self.CODEGAP, - lquiet=self.CODELQUIET, - rquiet=self.CODERQUIET, - quiet=True, - checksum=checksum) - - def drawOn(self, canvas, x, y) : - """Draws the LTO label onto the canvas.""" - canvas.saveState() - canvas.translate(x, y) - if self.border : - canvas.setLineWidth(self.border) - canvas.roundRect(0, 0, - self.LABELWIDTH, - self.LABELHEIGHT, - self.LABELROUND) - Standard39.drawOn(self, - canvas, - (self.LABELWIDTH-self.CODENOMINALWIDTH)/2.0, - self.LABELHEIGHT-self.height) - canvas.restoreState() - -class VerticalLTOLabel(BaseLTOLabel) : - """ - A class for LTO labels with rectangular blocks around the tape identifier. - """ - LABELFONT = ("Helvetica-Bold", 14) - BLOCKWIDTH = 1*cm - BLOCKHEIGHT = 0.45*cm - LINEWIDTH = 0.0125 - NBBLOCKS = 7 - COLORSCHEME = ("red", - "yellow", - "lightgreen", - "lightblue", - "grey", - "orangered", - "pink", - "darkgreen", - "orange", - "purple") - - def __init__(self, *args, **kwargs) : - """ - Initializes the label. - - colored : boolean to determine if blocks have to be colorized. - """ - if "colored" in kwargs: - self.colored = kwargs["colored"] - del kwargs["colored"] - else : - self.colored = False - kwargs["availheight"] = self.LABELHEIGHT-self.BLOCKHEIGHT - BaseLTOLabel.__init__(self, *args, **kwargs) - - def drawOn(self, canvas, x, y) : - """Draws some blocks around the identifier's characters.""" - BaseLTOLabel.drawOn(self, - canvas, - x, - y) - canvas.saveState() - canvas.setLineWidth(self.LINEWIDTH) - canvas.setStrokeColorRGB(0, 0, 0) - canvas.translate(x, y) - xblocks = (self.LABELWIDTH-(self.NBBLOCKS*self.BLOCKWIDTH))/2.0 - for i in range(self.NBBLOCKS) : - (font, size) = self.LABELFONT - newfont = self.LABELFONT - if i == (self.NBBLOCKS - 1) : - part = self.label[i:] - (font, size) = newfont - size /= 2.0 - newfont = (font, size) - else : - part = self.label[i] - canvas.saveState() - canvas.translate(xblocks+(i*self.BLOCKWIDTH), 0) - if self.colored and part.isdigit() : - canvas.setFillColorRGB(*getattr(colors, - self.COLORSCHEME[int(part)], - colors.Color(1, 1, 1)).rgb()) - else: - canvas.setFillColorRGB(1, 1, 1) - canvas.rect(0, 0, self.BLOCKWIDTH, self.BLOCKHEIGHT, fill=True) - canvas.translate((self.BLOCKWIDTH+canvas.stringWidth(part, *newfont))/2.0, - (self.BLOCKHEIGHT/2.0)) - canvas.rotate(90.0) - canvas.setFont(*newfont) - canvas.setFillColorRGB(0, 0, 0) - canvas.drawCentredString(0, 0, part) - canvas.restoreState() - canvas.restoreState() - -def test() : - """Test this.""" - from reportlab.pdfgen.canvas import Canvas - from reportlab.lib import pagesizes - - canvas = Canvas("labels.pdf", pagesize=pagesizes.A4) - canvas.setFont("Helvetica", 30) - (width, height) = pagesizes.A4 - canvas.drawCentredString(width/2.0, height-4*cm, "Sample LTO labels") - xpos = xorig = 2 * cm - ypos = yorig = 2 * cm - colwidth = 10 * cm - lineheight = 3.9 * cm - count = 1234 - BaseLTOLabel("RL", count, "3").drawOn(canvas, xpos, ypos) - ypos += lineheight - count += 1 - BaseLTOLabel("RL", count, "3", - border=0.0125).drawOn(canvas, xpos, ypos) - ypos += lineheight - count += 1 - VerticalLTOLabel("RL", count, "3").drawOn(canvas, xpos, ypos) - ypos += lineheight - count += 1 - VerticalLTOLabel("RL", count, "3", - border=0.0125).drawOn(canvas, xpos, ypos) - ypos += lineheight - count += 1 - VerticalLTOLabel("RL", count, "3", - colored=True).drawOn(canvas, xpos, ypos) - ypos += lineheight - count += 1 - VerticalLTOLabel("RL", count, "3", - border=0.0125, colored=True).drawOn(canvas, xpos, ypos) - canvas.showPage() - canvas.save() - -if __name__ == "__main__" : - test() diff --git a/reportlab/graphics/barcode/qr.py b/reportlab/graphics/barcode/qr.py deleted file mode 100644 index c326606a..00000000 --- a/reportlab/graphics/barcode/qr.py +++ /dev/null @@ -1,209 +0,0 @@ -# -# ReportLab QRCode widget -# -# Ported from the Javascript library QRCode for Javascript by Sam Curren -# -# URL: http://www.d-project.com/ -# http://d-project.googlecode.com/svn/trunk/misc/qrcode/js/qrcode.js -# qrcode.js is copyright (c) 2009 Kazuhiko Arase -# -# Original ReportLab module by German M. Bravo -# -# modified and improved by Anders Hammarquist -# and used with permission under the ReportLab License -# -# The word "QR Code" is registered trademark of -# DENSO WAVE INCORPORATED -# http://www.denso-wave.com/qrcode/faqpatent-e.html - -__all__ = ('QrCodeWidget') - -import itertools - -from reportlab.platypus.flowables import Flowable -from reportlab.graphics.shapes import Group, Rect -from reportlab.lib import colors -from reportlab.lib.validators import isNumber, isNumberOrNone, isColor, isString, Validator -from reportlab.lib.attrmap import AttrMap, AttrMapValue -from reportlab.graphics.widgetbase import Widget -from reportlab.lib.units import mm -try: - from reportlab.lib.utils import asUnicodeEx, isUnicode -except ImportError: - # ReportLab 2.x compatibility - def asUnicodeEx(v, enc='utf8'): - if isinstance(v, unicode): - return v - if isinstance(v, str): - return v.decode(enc) - return str(v).decode(enc) - - def isUnicode(v): - return isinstance(v, unicode) - -from reportlab.graphics.barcode import qrencoder - -class isLevel(Validator): - def test(self, x): - return x in ['L', 'M', 'Q', 'H'] -isLevel = isLevel() - -class isUnicodeOrQRList(Validator): - def _test(self, x): - if isUnicode(x): - return True - if all(isinstance(v, qrencoder.QR) for v in x): - return True - return False - - def test(self, x): - return self._test(x) or self.normalizeTest(x) - - def normalize(self, x): - if self._test(x): - return x - try: - return asUnicodeEx(x) - except UnicodeError: - raise ValueError("Can't convert to unicode: %r" % x) -isUnicodeOrQRList = isUnicodeOrQRList() - -class SRect(Rect): - def __init__(self, x, y, width, height, fillColor=colors.black): - Rect.__init__(self, x, y, width, height, fillColor=fillColor, - strokeColor=None, strokeWidth=0) - -class QrCodeWidget(Widget): - codeName = "QR" - _attrMap = AttrMap( - BASE = Widget, - value = AttrMapValue(isUnicodeOrQRList, desc='QRCode data'), - x = AttrMapValue(isNumber, desc='x-coord'), - y = AttrMapValue(isNumber, desc='y-coord'), - barFillColor = AttrMapValue(isColor, desc='bar color'), - barWidth = AttrMapValue(isNumber, desc='Width of bars.'), # maybe should be named just width? - barHeight = AttrMapValue(isNumber, desc='Height of bars.'), # maybe should be named just height? - barBorder = AttrMapValue(isNumber, desc='Width of QR border.'), # maybe should be named qrBorder? - barLevel = AttrMapValue(isLevel, desc='QR Code level.'), # maybe should be named qrLevel - qrVersion = AttrMapValue(isNumberOrNone, desc='QR Code version. None for auto'), - # Below are ignored, they make no sense - barStrokeWidth = AttrMapValue(isNumber, desc='Width of bar borders.'), - barStrokeColor = AttrMapValue(isColor, desc='Color of bar borders.'), - ) - x = 0 - y = 0 - barFillColor = colors.black - barStrokeColor = None - barStrokeWidth = 0 - barHeight = 32*mm - barWidth = 32*mm - barBorder = 4 - barLevel = 'L' - qrVersion = None - value = None - - def __init__(self, value='Hello World', **kw): - self.value = isUnicodeOrQRList.normalize(value) - for k, v in kw.items(): - setattr(self, k, v) - - ec_level = getattr(qrencoder.QRErrorCorrectLevel, self.barLevel) - - self.__dict__['qr'] = qrencoder.QRCode(self.qrVersion, ec_level) - - if isUnicode(self.value): - self.addData(self.value) - elif self.value: - for v in self.value: - self.addData(v) - - def addData(self, value): - self.qr.addData(value) - - def draw(self): - self.qr.make() - - g = Group() - - color = self.barFillColor - border = self.barBorder - width = self.barWidth - height = self.barHeight - x = self.x - y = self.y - - g.add(SRect(x, y, width, height, fillColor=None)) - - moduleCount = self.qr.getModuleCount() - minwh = float(min(width, height)) - boxsize = minwh / (moduleCount + border * 2.0) - offsetX = (width - minwh) / 2.0 - offsetY = (minwh - height) / 2.0 - - for r, row in enumerate(self.qr.modules): - row = map(bool, row) - c = 0 - for t, tt in itertools.groupby(row): - isDark = t - count = len(list(tt)) - if isDark: - x = (c + border) * boxsize - y = (r + border + 1) * boxsize - s = SRect(offsetX + x, offsetY + height - y, count * boxsize, boxsize) - g.add(s) - c += count - - return g - - -# Flowable version - -class QrCode(Flowable): - height = 32*mm - width = 32*mm - qrBorder = 4 - qrLevel = 'L' - qrVersion = None - value = None - - def __init__(self, value=None, **kw): - self.value = isUnicodeOrQRList.normalize(value) - - for k, v in kw.items(): - setattr(self, k, v) - - ec_level = getattr(qrencoder.QRErrorCorrectLevel, self.qrLevel) - - self.qr = qrencoder.QRCode(self.qrVersion, ec_level) - - if isUnicode(self.value): - self.addData(self.value) - elif self.value: - for v in self.value: - self.addData(v) - - def addData(self, value): - self.qr.addData(value) - - def draw(self): - self.qr.make() - - moduleCount = self.qr.getModuleCount() - border = self.qrBorder - xsize = self.width / (moduleCount + border * 2.0) - ysize = self.height / (moduleCount + border * 2.0) - - for r, row in enumerate(self.qr.modules): - row = map(bool, row) - c = 0 - for t, tt in itertools.groupby(row): - isDark = t - count = len(list(tt)) - if isDark: - x = (c + border) * xsize - y = self.height - (r + border + 1) * ysize - self.rect(x, y, count * xsize, ysize * 1.05) - c += count - - def rect(self, x, y, w, h): - self.canv.rect(x, y, w, h, stroke=0, fill=1) diff --git a/reportlab/graphics/barcode/qrencoder.py b/reportlab/graphics/barcode/qrencoder.py deleted file mode 100644 index ddc90109..00000000 --- a/reportlab/graphics/barcode/qrencoder.py +++ /dev/null @@ -1,1130 +0,0 @@ -# QRCode for Python -# -# Support for Kanji, Hanzi, ECI, FNC1 and Structurded append, -# and optimizations by Anders Hammarquist -# -# Copyright (c) 2014 Open End AB http://www.openend.se/ -# -# Ported from the Javascript library by Sam Curren -# -# QRCode for Javascript -# http://d-project.googlecode.com/svn/trunk/misc/qrcode/js/qrcode.js -# -# Copyright (c) 2009 Kazuhiko Arase -# -# URL: http://www.d-project.com/ -# -# Licensed under the MIT license: -# http://www.opensource.org/licenses/mit-license.php -# -# The word "QR Code" is registered trademark of -# DENSO WAVE INCORPORATED -# http://www.denso-wave.com/qrcode/faqpatent-e.html - -import re -import itertools -try: - from itertools import zip_longest -except: - from itertools import izip_longest as zip_longest - -try: - unicode -except NameError: - # No unicode in Python 3 - unicode = str - -class QR: - valid = None - bits = None - group = 0 - - def __init__(self, data): - if self.valid and not self.valid(data): - raise ValueError - self.data = data - - def __len__(self): - return len(self.data) - - @property - def bitlength(self): - if self.bits is None: - return 0 - q, r = divmod(len(self), len(self.bits)) - return q * sum(self.bits) + sum(self.bits[:r]) - - def getLengthBits(self, ver): - if 0 < ver < 10: - return self.lengthbits[0] - elif ver < 27: - return self.lengthbits[1] - elif ver < 41: - return self.lengthbits[2] - raise ValueError("Unknown version: " + ver) - - def getLength(self): - return len(self.data) - - def __repr__(self): - return repr(self.data) - - def write_header(self, buffer, version): - buffer.put(self.mode, 4) - lenbits = self.getLengthBits(version) - if lenbits: - buffer.put(len(self.data), lenbits ) - - def write(self, buffer, version): - self.write_header(buffer, version) - for g in zip_longest(*[iter(self.data)] * self.group): - bits = 0 - n = 0 - for i in range(self.group): - if g[i] is not None: - n *= len(self.chars) - n += self.chars.index(g[i]) - bits += self.bits[i] - buffer.put(n, bits) - -class QRNumber(QR): - valid = re.compile(u'[0-9]*$').match - chars = u'0123456789' - bits = (4,3,3) - group = 3 - mode = 0x1 - lengthbits = (10, 12, 14) - -class QRAlphaNum(QR): - valid = re.compile(u'[-0-9A-Z $%*+-./:]*$').match - chars = u'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:' - bits = (6,5) - group = 2 - mode = 0x2 - lengthbits = (9, 11, 13) - -class QR8bitByte(QR): - bits = (8,) - group = 1 - mode = 0x4 - lengthbits = (8, 16, 16) - - def __init__(self, data): - if isinstance(data, unicode): - self.data = data.encode('utf-8') # XXX This really needs an ECI too - else: - self.data = data # It'd better be byte data - - def write(self, buffer, version): - self.write_header(buffer, version) - for c in self.data: - if isinstance(c, str): - c = ord(c) - buffer.put(c, 8) - -class QRKanji(QR): - bits = (13,) - group = 1 - mode = 0x8 - lengthbits = (8, 10, 12) - - def __init__(self, data): - try: - self.data = self.unicode_to_qrkanji(data) - except UnicodeEncodeError: - raise ValueError('Not valid kanji') - - def unicode_to_qrkanji(self, data): - codes = [] - for i,c in enumerate(data): - try: - c = c.encode('shift-jis') - try: - c,d = map(ord, c) - except TypeError: - # Python 3 - c,d = c - except UnicodeEncodeError as e: - raise UnicodeEncodeError('qrkanji', data, i, i+1, e.args[4]) - except ValueError: - raise UnicodeEncodeError('qrkanji', data, i, i+1, - 'illegal multibyte sequence') - c = c << 8 | d - if 0x8140 <= c <=0x9ffc: - c -= 0x8140 - c = (((c & 0xff00) >> 8) * 0xc0) + (c & 0xff) - elif 0xe040 <= c <= 0xebbf: - c -= 0xc140 - c = (((c & 0xff00) >> 8) * 0xc0) + (c & 0xff) - else: - raise UnicodeEncodeError('qrkanji', data, i, i+1, - 'illegal multibyte sequence') - codes.append(c) - return codes - - def write(self, buffer, version): - self.write_header(buffer, version) - for d in self.data: - buffer.put(d, 13) - -class QRHanzi(QR): - bits = (13,) - group = 1 - mode = 0xD - lengthbits = (8, 10, 12) - - def __init__(self, data): - try: - self.data = self.unicode_to_qrhanzi(data) - except UnicodeEncodeError: - raise ValueError('Not valid hanzi') - - def unicode_to_qrhanzi(self, data): - codes = [] - for i,c in enumerate(data): - try: - c = c.encode('gb2312') - try: - c,d = map(ord, c) - except TypeError: - # Python 3 - c,d = c - except UnicodeEncodeError as e: - raise UnicodeEncodeError('qrhanzi', data, i, i+1, e.args[4]) - except ValueError: - raise UnicodeEncodeError('qrhanzi', data, i, i+1, - 'illegal multibyte sequence') - c = c << 8 | d - if 0xa1a1 <= c <=0xaafe: - c -= 0xa1a1 - c = (((c & 0xff00) >> 8) * 0x60) + (c & 0xff) - elif 0xb0a1 <= c <= 0xfafe: - c -= 0xa6a1 - c = (((c & 0xff00) >> 8) * 0x60) + (c & 0xff) - else: - raise UnicodeEncodeError('qrhanzi', data, i, i+1, - 'illegal multibyte sequence') - codes.append(c) - return codes - - def write_header(self, buffer, version): - buffer.put(self.mode, 4) - buffer.put(1, 4) # Subset 1: GB2312 encoding - lenbits = self.getLengthBits(version) - if lenbits: - buffer.put(len(self.data), lenbits ) - - def write(self, buffer, version): - self.write_header(buffer, version) - for d in self.data: - buffer.put(d, 13) - - -# Special modes -class QRECI(QR): - mode = 0x7 - lengthbits = (0, 0, 0) - - def __init__(self, data): - if not 0 < data < 999999: - # Spec says 999999, format supports up to 0x1fffff = 2097151 - raise ValueError("ECI out of range") - self.data = data - - def write(self, buffer, version): - self.write_header(buffer, version) - if self.data <= 0x7f: - buffer.put(self.data, 8) - elif self.data <= 0x3fff: - buffer.put(self.data | 0x8000, 16) - elif self.data <= 0x1fffff: - buffer.put(self.data | 0xC00000, 24) - -class QRStructAppend(QR): - mode = 0x3 - lengthbits = (0, 0, 0) - - def __init__(self, part, total, parity): - if not 0 < part <= 16: - raise ValueError("part out of range [1,16]") - if not 0 < total <= 16: - raise ValueError("total out of range [1,16]") - self.part = part - self.total = total - self.parity = parity - - def write(self, buffer, version): - self.write_header(buffer, version) - buffer.put(self.part, 4) - buffer.put(self.total, 4) - buffer.put(self.parity, 8) - -class QRFNC1First(QR): - mode = 0x5 - lengthbits = (0, 0, 0) - - def __init__(self): - pass - - def write(self, buffer, version): - self.write_header(buffer, version) - - -class QRFNC1Second(QR): - valid = re.compile('^([A-Za-z]|[0-9][0-9])$').match - mode = 0x9 - lengthbits = (0, 0, 0) - - def write(self, buffer, version): - self.write_header(buffer, version) - d = self.data - if len(d) == 1: - d = ord(d) + 100 - else: - d = int(d) - buffer.put(d, 8) - -class QRCode: - def __init__(self, version, errorCorrectLevel): - self.version = version - self.errorCorrectLevel = errorCorrectLevel - self.modules = None - self.moduleCount = 0 - self.dataCache = None - self.dataList = [] - - def addData(self, data): - if isinstance(data, QR): - newData = data - else: - for conv in (QRNumber, QRAlphaNum, QRKanji, QR8bitByte): - try: - newData = conv(data) - break - except ValueError: - pass - else: - raise ValueError - - self.dataList.append(newData) - self.dataCache = None - - def isDark(self, row, col): - return self.modules[row][col] - - def getModuleCount(self): - return self.moduleCount - - def calculate_version(self): - # Calculate version for data to fit the QR Code capacity - for version in range(1, 40): - rsBlocks = QRRSBlock.getRSBlocks(version, self.errorCorrectLevel) - totalDataCount = sum(block.dataCount for block in rsBlocks) - length = 0 - for data in self.dataList: - length += 4 - length += data.getLengthBits(version) - length += data.bitlength - if length <= totalDataCount * 8: - break - return version - - def make(self): - if self.version is None: - self.version = self.calculate_version() - self.makeImpl(False, self.getBestMaskPattern()) - - def makeImpl(self, test, maskPattern): - self.moduleCount = self.version * 4 + 17 - self.modules = [ [False] * self.moduleCount - for x in range(self.moduleCount) ] - self.setupPositionProbePattern(0, 0) - self.setupPositionProbePattern(self.moduleCount - 7, 0) - self.setupPositionProbePattern(0, self.moduleCount - 7) - self.setupPositionAdjustPattern() - self.setupTimingPattern() - self.setupTypeInfo(test, maskPattern) - if (self.version >= 7): - self.setupTypeNumber(test) - if (self.dataCache == None): - self.dataCache = QRCode.createData(self.version, - self.errorCorrectLevel, - self.dataList) - self.mapData(self.dataCache, maskPattern) - - _positionProbePattern = [ - [True, True, True, True, True, True, True], - [True, False, False, False, False, False, True], - [True, False, True, True, True, False, True], - [True, False, True, True, True, False, True], - [True, False, True, True, True, False, True], - [True, False, False, False, False, False, True], - [True, True, True, True, True, True, True], - ] - - def setupPositionProbePattern(self, row, col): - if row == 0: - self.modules[row+7][col:col+7] = [False] * 7 - if col == 0: - self.modules[row+7][col+7] = False - else: - self.modules[row+7][col-1] = False - else: - # col == 0 - self.modules[row-1][col:col+8] = [False] * 8 - - for r, data in enumerate(self._positionProbePattern): - self.modules[row+r][col:col+7] = data - if col == 0: - self.modules[row+r][col+7] = False - else: - self.modules[row+r][col-1] = False - - def getBestMaskPattern(self): - minLostPoint = 0 - pattern = 0 - for i in range(8): - self.makeImpl(True, i); - lostPoint = QRUtil.getLostPoint(self); - if (i == 0 or minLostPoint > lostPoint): - minLostPoint = lostPoint - pattern = i - return pattern - - def setupTimingPattern(self): - for r in range(8, self.moduleCount - 8): - self.modules[r][6] = (r % 2 == 0) - self.modules[6][8:self.moduleCount - 8] = itertools.islice( - itertools.cycle([True, False]), self.moduleCount - 16) - - _positionAdjustPattern = [ - [True, True, True, True, True], - [True, False, False, False, True], - [True, False, True, False, True], - [True, False, False, False, True], - [True, True, True, True, True], - ] - - def setupPositionAdjustPattern(self): - pos = QRUtil.getPatternPosition(self.version) - maxpos = self.moduleCount - 8 - for row, col in itertools.product(pos, pos): - if col <= 8 and (row <= 8 or row >= maxpos): - continue - elif col >= maxpos and row <= 8: - continue - for r, data in enumerate(self._positionAdjustPattern): - self.modules[row + r - 2][col-2:col+3] = data - - def setupTypeNumber(self, test): - bits = QRUtil.getBCHTypeNumber(self.version) - for i in range(18): - mod = (not test and ( (bits >> i) & 1) == 1) - self.modules[i // 3][i % 3 + self.moduleCount - 8 - 3] = mod; - for i in range(18): - mod = (not test and ( (bits >> i) & 1) == 1) - self.modules[i % 3 + self.moduleCount - 8 - 3][i // 3] = mod; - - def setupTypeInfo(self, test, maskPattern): - data = (self.errorCorrectLevel << 3) | maskPattern - bits = QRUtil.getBCHTypeInfo(data) - # vertical - for i in range(15): - mod = (not test and ( (bits >> i) & 1) == 1) - if (i < 6): - self.modules[i][8] = mod - elif (i < 8): - self.modules[i + 1][8] = mod - else: - self.modules[self.moduleCount - 15 + i][8] = mod - # horizontal - for i in range(15): - mod = (not test and ( (bits >> i) & 1) == 1); - if (i < 8): - self.modules[8][self.moduleCount - i - 1] = mod - elif (i < 9): - self.modules[8][15 - i - 1 + 1] = mod - else: - self.modules[8][15 - i - 1] = mod - # fixed module - self.modules[self.moduleCount - 8][8] = (not test) - - def _dataPosIterator(self): - cols = itertools.chain(range(self.moduleCount - 1, 6, -2), - range(5, 0, -2)) - rows = (list(range(9, self.moduleCount - 8)), - list(itertools.chain(range(6), range(7, self.moduleCount))), - list(range(9, self.moduleCount))) - rrows = tuple( list(reversed(r)) for r in rows) - - ppos = QRUtil.getPatternPosition(self.version) - ppos = set(itertools.chain.from_iterable( - (p-2, p-1, p, p+1, p+2) for p in ppos)) - maxpos = self.moduleCount - 11 - - for col in cols: - rows, rrows = rrows, rows - if col <= 8: rowidx = 0 - elif col >= self.moduleCount - 8: rowidx = 2 - else: rowidx = 1 - for row in rows[rowidx]: - for c in range(2): - c = col - c - if self.version >= 7: - if row < 6 and c >= self.moduleCount - 11: - continue - elif col < 6 and row >= self.moduleCount - 11: - continue - if row in ppos and c in ppos: - if not (row < 11 and (c < 11 or c > maxpos) or - c < 11 and (row < 11 or row > maxpos)): - continue - - yield (c, row) - - _dataPosList = None - - def dataPosIterator(self): - if not self._dataPosList: - self._dataPosList = list(self._dataPosIterator()) - return self._dataPosList - - def _dataBitIterator(self, data): - for byte in data: - for bit in [0x80, 0x40, 0x20, 0x10, - 0x08, 0x04, 0x02, 0x01]: - yield bool(byte & bit) - - _dataBitList = None - def dataBitIterator(self, data): - if not self._dataBitList: - self._dataBitList = list(self._dataBitIterator(data)) - return iter(self._dataBitList) - - def mapData(self, data, maskPattern): - bits = self.dataBitIterator(data) - mask = QRUtil.getMask(maskPattern) - - for (col, row), dark in zip_longest(self.dataPosIterator(), bits, - fillvalue=False): - self.modules[row][col] = dark ^ mask(row, col) - - PAD0 = 0xEC - PAD1 = 0x11 - - @staticmethod - def createData(version, errorCorrectLevel, dataList): - rsBlocks = QRRSBlock.getRSBlocks(version, errorCorrectLevel) - buffer = QRBitBuffer(); - for data in dataList: - data.write(buffer, version) - # calc num max data. - totalDataCount = 0; - for block in rsBlocks: - totalDataCount += block.dataCount - if (buffer.getLengthInBits() > totalDataCount * 8): - raise Exception("code length overflow. (%d > %d)" % - (buffer.getLengthInBits(), totalDataCount * 8)) - # end code - if (buffer.getLengthInBits() + 4 <= totalDataCount * 8): - buffer.put(0, 4) - # padding - while (buffer.getLengthInBits() % 8 != 0): - buffer.putBit(False) - # padding - while (True): - if (buffer.getLengthInBits() >= totalDataCount * 8): - break - buffer.put(QRCode.PAD0, 8) - if (buffer.getLengthInBits() >= totalDataCount * 8): - break - buffer.put(QRCode.PAD1, 8) - return QRCode.createBytes(buffer, rsBlocks) - - @staticmethod - def createBytes(buffer, rsBlocks): - offset = 0 - maxDcCount = 0 - maxEcCount = 0 - totalCodeCount = 0 - dcdata = [] - ecdata = [] - for block in rsBlocks: - totalCodeCount += block.totalCount - dcCount = block.dataCount - ecCount = block.totalCount - dcCount - maxDcCount = max(maxDcCount, dcCount) - maxEcCount = max(maxEcCount, ecCount) - dcdata.append(buffer.buffer[offset:offset+dcCount]) - offset += dcCount - rsPoly = QRUtil.getErrorCorrectPolynomial(ecCount) - rawPoly = QRPolynomial(dcdata[-1], rsPoly.getLength() - 1) - modPoly = rawPoly.mod(rsPoly) - rLen = rsPoly.getLength() - 1 - mLen = modPoly.getLength() - ecdata.append([ (modPoly.get(i) if i >= 0 else 0) - for i in range(mLen - rLen, mLen) ]) - - data = [ d for dd in itertools.chain( - zip_longest(*dcdata), zip_longest(*ecdata)) - for d in dd if d is not None] - return data - - -class QRErrorCorrectLevel: - L = 1 - M = 0 - Q = 3 - H = 2 - -class QRMaskPattern: - PATTERN000 = 0 - PATTERN001 = 1 - PATTERN010 = 2 - PATTERN011 = 3 - PATTERN100 = 4 - PATTERN101 = 5 - PATTERN110 = 6 - PATTERN111 = 7 - -class QRUtil(object): - PATTERN_POSITION_TABLE = [ - [], - [6, 18], - [6, 22], - [6, 26], - [6, 30], - [6, 34], - [6, 22, 38], - [6, 24, 42], - [6, 26, 46], - [6, 28, 50], - [6, 30, 54], - [6, 32, 58], - [6, 34, 62], - [6, 26, 46, 66], - [6, 26, 48, 70], - [6, 26, 50, 74], - [6, 30, 54, 78], - [6, 30, 56, 82], - [6, 30, 58, 86], - [6, 34, 62, 90], - [6, 28, 50, 72, 94], - [6, 26, 50, 74, 98], - [6, 30, 54, 78, 102], - [6, 28, 54, 80, 106], - [6, 32, 58, 84, 110], - [6, 30, 58, 86, 114], - [6, 34, 62, 90, 118], - [6, 26, 50, 74, 98, 122], - [6, 30, 54, 78, 102, 126], - [6, 26, 52, 78, 104, 130], - [6, 30, 56, 82, 108, 134], - [6, 34, 60, 86, 112, 138], - [6, 30, 58, 86, 114, 142], - [6, 34, 62, 90, 118, 146], - [6, 30, 54, 78, 102, 126, 150], - [6, 24, 50, 76, 102, 128, 154], - [6, 28, 54, 80, 106, 132, 158], - [6, 32, 58, 84, 110, 136, 162], - [6, 26, 54, 82, 110, 138, 166], - [6, 30, 58, 86, 114, 142, 170] - ] - - G15 = ((1 << 10) | (1 << 8) | (1 << 5) | (1 << 4) | (1 << 2) | (1 << 1) | - (1 << 0)) - G18 = ((1 << 12) | (1 << 11) | (1 << 10) | (1 << 9) | (1 << 8) | - (1 << 5) | (1 << 2) | (1 << 0)) - G15_MASK = (1 << 14) | (1 << 12) | (1 << 10) | (1 << 4) | (1 << 1) - - @staticmethod - def getBCHTypeInfo(data): - d = data << 10; - while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G15) >= 0): - d ^= (QRUtil.G15 << (QRUtil.getBCHDigit(d) - - QRUtil.getBCHDigit(QRUtil.G15) ) ) - return ( (data << 10) | d) ^ QRUtil.G15_MASK - - @staticmethod - def getBCHTypeNumber(data): - d = data << 12; - while (QRUtil.getBCHDigit(d) - QRUtil.getBCHDigit(QRUtil.G18) >= 0): - d ^= (QRUtil.G18 << (QRUtil.getBCHDigit(d) - - QRUtil.getBCHDigit(QRUtil.G18) ) ) - return (data << 12) | d - - @staticmethod - def getBCHDigit(data): - digit = 0; - while (data != 0): - digit += 1 - data >>= 1 - return digit - - @staticmethod - def getPatternPosition(version): - return QRUtil.PATTERN_POSITION_TABLE[version - 1] - - maskPattern = { - 0: lambda i,j: (i + j) % 2 == 0, - 1: lambda i,j: i % 2 == 0, - 2: lambda i,j: j % 3 == 0, - 3: lambda i,j: (i + j) % 3 == 0, - 4: lambda i,j: (i // 2 + j // 3) % 2 == 0, - 5: lambda i,j: (i*j)%2 + (i*j)%3 == 0, - 6: lambda i,j: ( (i * j) % 2 + (i * j) % 3) % 2 == 0, - 7: lambda i,j: ( (i * j) % 3 + (i + j) % 2) % 2 == 0 - } - - @classmethod - def getMask(cls, maskPattern): - return cls.maskPattern[maskPattern] - - @staticmethod - def getErrorCorrectPolynomial(errorCorrectLength): - a = QRPolynomial([1], 0); - for i in range(errorCorrectLength): - a = a.multiply(QRPolynomial([1, QRMath.gexp(i)], 0) ) - return a - - @classmethod - def maskScoreRule1vert(cls, modules): - score = 0 - lastCount = [0] - lastRow = None - for row in modules: - # Vertical patterns - if lastRow: - changed = [a ^ b for a,b in zip(row, lastRow)] - scores = [a and (b-4+3) for a,b in - zip_longest(changed, lastCount, fillvalue=0) - if b >= 4] - score += sum(scores) - lastCount = [0 if a else b + 1 - for a,b in zip_longest(changed, lastCount, - fillvalue=0)] - lastRow = row - - score += sum([b-4+3 for b in lastCount if b >= 4]) # final counts - return score - - @classmethod - def maskScoreRule2(cls, modules): - score = 0 - lastRow = modules[0] - for row in modules[1:]: - lastCol0, lastCol1 = row[0], lastRow[0] - for col0, col1 in zip(row[1:], lastRow[1:]): - if col0 == col1 == lastCol0 == lastCol1: - score += 3 - lastCol0, lastCol1 = col0, col1 - lastRow = row - - return score - - @classmethod - def maskScoreRule3hor( - cls, modules, - pattern = [True, False, True, True, True, False, True, - False, False, False, False]): - patternlen = len(pattern) - score = 0 - for row in modules: - j = 0 - maxj = len(row) - patternlen - while j < maxj: - if row[j:j+patternlen] == pattern: - score += 40 - j += patternlen - else: - j += 1 - - return score - - @classmethod - def maskScoreRule4(cls, modules): - cellCount = len(modules)**2 - count = sum(sum(row) for row in modules) - return 10 * (abs(100 * count // cellCount - 50) // 5) - - @classmethod - def getLostPoint(cls, qrCode): - lostPoint = 0; - # LEVEL1 - lostPoint += cls.maskScoreRule1vert(qrCode.modules) - lostPoint += cls.maskScoreRule1vert(zip(*qrCode.modules)) - # LEVEL2 - lostPoint += cls.maskScoreRule2(qrCode.modules) - # LEVEL3 - lostPoint += cls.maskScoreRule3hor(qrCode.modules) - lostPoint += cls.maskScoreRule3hor(zip(*qrCode.modules)) - # LEVEL4 - lostPoint += cls.maskScoreRule4(qrCode.modules) - return lostPoint - -class QRMath: - @staticmethod - def glog(n): - if (n < 1): - raise Exception("glog(" + n + ")") - return LOG_TABLE[n]; - - @staticmethod - def gexp(n): - while n < 0: - n += 255 - while n >= 256: - n -= 255 - return EXP_TABLE[n]; - -EXP_TABLE = [x for x in range(256)] -LOG_TABLE = [x for x in range(256)] -for i in range(8): - EXP_TABLE[i] = 1 << i; -for i in range(8, 256): - EXP_TABLE[i] = (EXP_TABLE[i - 4] ^ EXP_TABLE[i - 5] ^ - EXP_TABLE[i - 6] ^ EXP_TABLE[i - 8]) -for i in range(255): - LOG_TABLE[EXP_TABLE[i] ] = i - -class QRPolynomial: - def __init__(self, num, shift): - if (len(num) == 0): - raise Exception(len(num) + "/" + shift) - offset = 0 - while offset < len(num) and num[offset] == 0: - offset += 1 - self.num = num[offset:] + [0]*shift - - def get(self, index): - return self.num[index] - - def getLength(self): - return len(self.num) - - def multiply(self, e): - num = [0] * (self.getLength() + e.getLength() - 1); - for i in range(self.getLength()): - for j in range(e.getLength()): - num[i + j] ^= QRMath.gexp(QRMath.glog(self.get(i) ) + - QRMath.glog(e.get(j) ) ) - return QRPolynomial(num, 0); - - def mod(self, e): - if (self.getLength() < e.getLength()): - return self; - ratio = QRMath.glog(self.num[0] ) - QRMath.glog(e.num[0] ) - num = [nn ^ QRMath.gexp(QRMath.glog(en) + ratio) - for nn,en in zip(self.num, e.num)] - num += self.num[e.getLength():] - # recursive call - return QRPolynomial(num, 0).mod(e); - -class QRRSBlock: - RS_BLOCK_TABLE = [ - # L - # M - # Q - # H - - # 1 - [1, 26, 19], - [1, 26, 16], - [1, 26, 13], - [1, 26, 9], - - # 2 - [1, 44, 34], - [1, 44, 28], - [1, 44, 22], - [1, 44, 16], - - # 3 - [1, 70, 55], - [1, 70, 44], - [2, 35, 17], - [2, 35, 13], - - # 4 - [1, 100, 80], - [2, 50, 32], - [2, 50, 24], - [4, 25, 9], - - # 5 - [1, 134, 108], - [2, 67, 43], - [2, 33, 15, 2, 34, 16], - [2, 33, 11, 2, 34, 12], - - # 6 - [2, 86, 68], - [4, 43, 27], - [4, 43, 19], - [4, 43, 15], - - # 7 - [2, 98, 78], - [4, 49, 31], - [2, 32, 14, 4, 33, 15], - [4, 39, 13, 1, 40, 14], - - # 8 - [2, 121, 97], - [2, 60, 38, 2, 61, 39], - [4, 40, 18, 2, 41, 19], - [4, 40, 14, 2, 41, 15], - - # 9 - [2, 146, 116], - [3, 58, 36, 2, 59, 37], - [4, 36, 16, 4, 37, 17], - [4, 36, 12, 4, 37, 13], - - # 10 - [2, 86, 68, 2, 87, 69], - [4, 69, 43, 1, 70, 44], - [6, 43, 19, 2, 44, 20], - [6, 43, 15, 2, 44, 16], - - # 11 - [4, 101, 81], - [1, 80, 50, 4, 81, 51], - [4, 50, 22, 4, 51, 23], - [3, 36, 12, 8, 37, 13], - - # 12 - [2, 116, 92, 2, 117, 93], - [6, 58, 36, 2, 59, 37], - [4, 46, 20, 6, 47, 21], - [7, 42, 14, 4, 43, 15], - - # 13 - [4, 133, 107], - [8, 59, 37, 1, 60, 38], - [8, 44, 20, 4, 45, 21], - [12, 33, 11, 4, 34, 12], - - # 14 - [3, 145, 115, 1, 146, 116], - [4, 64, 40, 5, 65, 41], - [11, 36, 16, 5, 37, 17], - [11, 36, 12, 5, 37, 13], - - # 15 - [5, 109, 87, 1, 110, 88], - [5, 65, 41, 5, 66, 42], - [5, 54, 24, 7, 55, 25], - [11, 36, 12], - - # 16 - [5, 122, 98, 1, 123, 99], - [7, 73, 45, 3, 74, 46], - [15, 43, 19, 2, 44, 20], - [3, 45, 15, 13, 46, 16], - - # 17 - [1, 135, 107, 5, 136, 108], - [10, 74, 46, 1, 75, 47], - [1, 50, 22, 15, 51, 23], - [2, 42, 14, 17, 43, 15], - - # 18 - [5, 150, 120, 1, 151, 121], - [9, 69, 43, 4, 70, 44], - [17, 50, 22, 1, 51, 23], - [2, 42, 14, 19, 43, 15], - - # 19 - [3, 141, 113, 4, 142, 114], - [3, 70, 44, 11, 71, 45], - [17, 47, 21, 4, 48, 22], - [9, 39, 13, 16, 40, 14], - - # 20 - [3, 135, 107, 5, 136, 108], - [3, 67, 41, 13, 68, 42], - [15, 54, 24, 5, 55, 25], - [15, 43, 15, 10, 44, 16], - - # 21 - [4, 144, 116, 4, 145, 117], - [17, 68, 42], - [17, 50, 22, 6, 51, 23], - [19, 46, 16, 6, 47, 17], - - # 22 - [2, 139, 111, 7, 140, 112], - [17, 74, 46], - [7, 54, 24, 16, 55, 25], - [34, 37, 13], - - # 23 - [4, 151, 121, 5, 152, 122], - [4, 75, 47, 14, 76, 48], - [11, 54, 24, 14, 55, 25], - [16, 45, 15, 14, 46, 16], - - # 24 - [6, 147, 117, 4, 148, 118], - [6, 73, 45, 14, 74, 46], - [11, 54, 24, 16, 55, 25], - [30, 46, 16, 2, 47, 17], - - # 25 - [8, 132, 106, 4, 133, 107], - [8, 75, 47, 13, 76, 48], - [7, 54, 24, 22, 55, 25], - [22, 45, 15, 13, 46, 16], - - # 26 - [10, 142, 114, 2, 143, 115], - [19, 74, 46, 4, 75, 47], - [28, 50, 22, 6, 51, 23], - [33, 46, 16, 4, 47, 17], - - # 27 - [8, 152, 122, 4, 153, 123], - [22, 73, 45, 3, 74, 46], - [8, 53, 23, 26, 54, 24], - [12, 45, 15, 28, 46, 16], - - # 28 - [3, 147, 117, 10, 148, 118], - [3, 73, 45, 23, 74, 46], - [4, 54, 24, 31, 55, 25], - [11, 45, 15, 31, 46, 16], - - # 29 - [7, 146, 116, 7, 147, 117], - [21, 73, 45, 7, 74, 46], - [1, 53, 23, 37, 54, 24], - [19, 45, 15, 26, 46, 16], - - # 30 - [5, 145, 115, 10, 146, 116], - [19, 75, 47, 10, 76, 48], - [15, 54, 24, 25, 55, 25], - [23, 45, 15, 25, 46, 16], - - # 31 - [13, 145, 115, 3, 146, 116], - [2, 74, 46, 29, 75, 47], - [42, 54, 24, 1, 55, 25], - [23, 45, 15, 28, 46, 16], - - # 32 - [17, 145, 115], - [10, 74, 46, 23, 75, 47], - [10, 54, 24, 35, 55, 25], - [19, 45, 15, 35, 46, 16], - - # 33 - [17, 145, 115, 1, 146, 116], - [14, 74, 46, 21, 75, 47], - [29, 54, 24, 19, 55, 25], - [11, 45, 15, 46, 46, 16], - - # 34 - [13, 145, 115, 6, 146, 116], - [14, 74, 46, 23, 75, 47], - [44, 54, 24, 7, 55, 25], - [59, 46, 16, 1, 47, 17], - - # 35 - [12, 151, 121, 7, 152, 122], - [12, 75, 47, 26, 76, 48], - [39, 54, 24, 14, 55, 25], - [22, 45, 15, 41, 46, 16], - - # 36 - [6, 151, 121, 14, 152, 122], - [6, 75, 47, 34, 76, 48], - [46, 54, 24, 10, 55, 25], - [2, 45, 15, 64, 46, 16], - - # 37 - [17, 152, 122, 4, 153, 123], - [29, 74, 46, 14, 75, 47], - [49, 54, 24, 10, 55, 25], - [24, 45, 15, 46, 46, 16], - - # 38 - [4, 152, 122, 18, 153, 123], - [13, 74, 46, 32, 75, 47], - [48, 54, 24, 14, 55, 25], - [42, 45, 15, 32, 46, 16], - - # 39 - [20, 147, 117, 4, 148, 118], - [40, 75, 47, 7, 76, 48], - [43, 54, 24, 22, 55, 25], - [10, 45, 15, 67, 46, 16], - - # 40 - [19, 148, 118, 6, 149, 119], - [18, 75, 47, 31, 76, 48], - [34, 54, 24, 34, 55, 25], - [20, 45, 15, 61, 46, 16] - - ] - - def __init__(self, totalCount, dataCount): - self.totalCount = totalCount - self.dataCount = dataCount - - @staticmethod - def getRSBlocks(version, errorCorrectLevel): - rsBlock = QRRSBlock.getRsBlockTable(version, errorCorrectLevel); - if rsBlock == None: - raise Exception("bad rs block @ version:" + version + - "/errorCorrectLevel:" + errorCorrectLevel) - length = len(rsBlock) // 3 - list = [] - for i in range(length): - count = rsBlock[i * 3 + 0] - totalCount = rsBlock[i * 3 + 1] - dataCount = rsBlock[i * 3 + 2] - for j in range(count): - list.append(QRRSBlock(totalCount, dataCount)) - return list; - - @staticmethod - def getRsBlockTable(version, errorCorrectLevel): - if errorCorrectLevel == QRErrorCorrectLevel.L: - return QRRSBlock.RS_BLOCK_TABLE[(version - 1) * 4 + 0]; - elif errorCorrectLevel == QRErrorCorrectLevel.M: - return QRRSBlock.RS_BLOCK_TABLE[(version - 1) * 4 + 1]; - elif errorCorrectLevel == QRErrorCorrectLevel.Q: - return QRRSBlock.RS_BLOCK_TABLE[(version - 1) * 4 + 2]; - elif errorCorrectLevel == QRErrorCorrectLevel.H: - return QRRSBlock.RS_BLOCK_TABLE[(version - 1) * 4 + 3]; - else: - return None; - -class QRBitBuffer: - def __init__(self): - self.buffer = [] - self.length = 0 - - def __repr__(self): - return ".".join([str(n) for n in self.buffer]) - - def get(self, index): - bufIndex = index // 8 - return ( (self.buffer[bufIndex] >> (7 - index % 8) ) & 1) == 1 - - def put(self, num, length): - for i in range(length): - self.putBit( ( (num >> (length - i - 1) ) & 1) == 1) - - def getLengthInBits(self): - return self.length - - def putBit(self, bit): - bufIndex = self.length // 8 - if len(self.buffer) <= bufIndex: - self.buffer.append(0) - if bit: - self.buffer[bufIndex] |= (0x80 >> (self.length % 8) ) - self.length += 1 diff --git a/reportlab/graphics/barcode/test.py b/reportlab/graphics/barcode/test.py deleted file mode 100644 index 72146fb5..00000000 --- a/reportlab/graphics/barcode/test.py +++ /dev/null @@ -1,200 +0,0 @@ -#!/usr/pkg/bin/python - -import os, sys, time - -from reportlab.graphics.barcode.common import * -from reportlab.graphics.barcode.code39 import * -from reportlab.graphics.barcode.code93 import * -from reportlab.graphics.barcode.code128 import * -from reportlab.graphics.barcode.usps import * -from reportlab.graphics.barcode.usps4s import USPS_4State - - -from reportlab.platypus import Spacer, SimpleDocTemplate, Table, TableStyle, Preformatted, PageBreak -from reportlab.lib.units import inch, cm -from reportlab.lib import colors - -from reportlab.pdfgen.canvas import Canvas -from reportlab.lib.styles import getSampleStyleSheet -from reportlab.platypus.paragraph import Paragraph -from reportlab.platypus.frames import Frame -from reportlab.platypus.flowables import XBox, KeepTogether -from reportlab.graphics.shapes import Drawing - -from reportlab.graphics.barcode import getCodes, getCodeNames, createBarcodeDrawing, createBarcodeImageInMemory -def run(): - styles = getSampleStyleSheet() - styleN = styles['Normal'] - styleH = styles['Heading1'] - story = [] - - #for codeNames in code - story.append(Paragraph('I2of5', styleN)) - story.append(I2of5(1234, barWidth = inch*0.02, checksum=0)) - story.append(Paragraph('MSI', styleN)) - story.append(MSI(1234)) - story.append(Paragraph('Codabar', styleN)) - story.append(Codabar("A012345B", barWidth = inch*0.02)) - story.append(Paragraph('Code 11', styleN)) - story.append(Code11("01234545634563")) - story.append(Paragraph('Code 39', styleN)) - story.append(Standard39("A012345B%R")) - story.append(Paragraph('Extended Code 39', styleN)) - story.append(Extended39("A012345B}")) - story.append(Paragraph('Code93', styleN)) - story.append(Standard93("CODE 93")) - story.append(Paragraph('Extended Code93', styleN)) - story.append(Extended93("L@@K! Code 93 :-)")) #, barWidth=0.005 * inch)) - story.append(Paragraph('Code 128', styleN)) - c=Code128("AB-12345678") #, barWidth=0.005 * inch) - #print 'WIDTH =', (c.width / inch), 'barWidth =', (c.barWidth / inch) - #print 'LQ =', (c.lquiet / inch), 'RQ =', (c.rquiet / inch) - story.append(c) - story.append(Paragraph('USPS FIM', styleN)) - story.append(FIM("A")) - story.append(Paragraph('USPS POSTNET', styleN)) - story.append(POSTNET('78247-1043')) - story.append(Paragraph('USPS 4 State', styleN)) - story.append(USPS_4State('01234567094987654321','01234567891')) - - from reportlab.graphics.barcode import createBarcodeDrawing - story.append(Paragraph('EAN13', styleN)) - bcd = createBarcodeDrawing('EAN13', value='123456789012') - story.append(bcd) - story.append(Paragraph('EAN8', styleN)) - bcd = createBarcodeDrawing('EAN8', value='1234567') - story.append(bcd) - story.append(Paragraph('UPCA', styleN)) - bcd = createBarcodeDrawing('UPCA', value='03600029145') - story.append(bcd) - story.append(Paragraph('USPS_4State', styleN)) - bcd = createBarcodeDrawing('USPS_4State', value='01234567094987654321',routing='01234567891') - story.append(bcd) - - story.append(Paragraph('Label Size', styleN)) - story.append(XBox((2.0 + 5.0/8.0)*inch, 1 * inch, '1x2-5/8"')) - story.append(Paragraph('Label Size', styleN)) - story.append(XBox((1.75)*inch, .5 * inch, '1/2x1-3/4"')) - c = Canvas('out.pdf') - f = Frame(inch, inch, 6*inch, 9*inch, showBoundary=1) - f.addFromList(story, c) - c.save() - print('saved out.pdf') - -def fullTest(fileName="test_full.pdf"): - """Creates large-ish test document with a variety of parameters""" - - story = [] - - styles = getSampleStyleSheet() - styleN = styles['Normal'] - styleH = styles['Heading1'] - styleH2 = styles['Heading2'] - story = [] - - story.append(Paragraph('ReportLab Barcode Test Suite - full output', styleH)) - story.append(Paragraph('Generated on %s' % time.ctime(time.time()), styleN)) - - story.append(Paragraph('', styleN)) - story.append(Paragraph('Repository information for this build:', styleN)) - #see if we can figure out where it was built, if we're running in source - if os.path.split(os.getcwd())[-1] == 'barcode' and os.path.isdir('.svn'): - #runnning in a filesystem svn copy - infoLines = os.popen('svn info').read() - story.append(Preformatted(infoLines, styles["Code"])) - - story.append(Paragraph('About this document', styleH2)) - story.append(Paragraph('History and Status', styleH2)) - - story.append(Paragraph(""" - This is the test suite and docoumentation for the ReportLab open source barcode API, - being re-released as part of the forthcoming ReportLab 2.0 release. - """, styleN)) - - story.append(Paragraph(""" - Several years ago Ty Sarna contributed a barcode module to the ReportLab community. - Several of the codes were used by him in hiw work and to the best of our knowledge - this was correct. These were written as flowable objects and were available in PDFs, - but not in our graphics framework. However, we had no knowledge of barcodes ourselves - and did not advertise or extend the package. - """, styleN)) - - story.append(Paragraph(""" - We "wrapped" the barcodes to be usable within our graphics framework; they are now available - as Drawing objects which can be rendered to EPS files or bitmaps. For the last 2 years this - has been available in our Diagra and Report Markup Language products. However, we did not - charge separately and use was on an "as is" basis. - """, styleN)) - - story.append(Paragraph(""" - A major licensee of our technology has kindly agreed to part-fund proper productisation - of this code on an open source basis in Q1 2006. This has involved addition of EAN codes - as well as a proper testing program. Henceforth we intend to publicise the code more widely, - gather feedback, accept contributions of code and treat it as "supported". - """, styleN)) - - story.append(Paragraph(""" - This involved making available both downloads and testing resources. This PDF document - is the output of the current test suite. It contains codes you can scan (if you use a nice sharp - laser printer!), and will be extended over coming weeks to include usage examples and notes on - each barcode and how widely tested they are. This is being done through documentation strings in - the barcode objects themselves so should always be up to date. - """, styleN)) - - story.append(Paragraph('Usage examples', styleH2)) - story.append(Paragraph(""" - To be completed - """, styleN)) - - story.append(Paragraph('The codes', styleH2)) - story.append(Paragraph(""" - Below we show a scannable code from each barcode, with and without human-readable text. - These are magnified about 2x from the natural size done by the original author to aid - inspection. This will be expanded to include several test cases per code, and to add - explanations of checksums. Be aware that (a) if you enter numeric codes which are too - short they may be prefixed for you (e.g. "123" for an 8-digit code becomes "00000123"), - and that the scanned results and readable text will generally include extra checksums - at the end. - """, styleN)) - - codeNames = getCodeNames() - from reportlab.lib.utils import flatten - width = [float(x[8:]) for x in sys.argv if x.startswith('--width=')] - height = [float(x[9:]) for x in sys.argv if x.startswith('--height=')] - isoScale = [int(x[11:]) for x in sys.argv if x.startswith('--isoscale=')] - options = {} - if width: options['width'] = width[0] - if height: options['height'] = height[0] - if isoScale: options['isoScale'] = isoScale[0] - scales = [x[8:].split(',') for x in sys.argv if x.startswith('--scale=')] - scales = list(map(float,scales and flatten(scales) or [1])) - scales = list(map(float,scales and flatten(scales) or [1])) - for scale in scales: - story.append(PageBreak()) - story.append(Paragraph('Scale = %.1f'%scale, styleH2)) - story.append(Spacer(36, 12)) - for codeName in codeNames: - s = [Paragraph('Code: ' + codeName, styleH2)] - for hr in (0,1): - s.append(Spacer(36, 12)) - dr = createBarcodeDrawing(codeName, humanReadable=hr,**options) - dr.renderScale = scale - s.append(dr) - s.append(Spacer(36, 12)) - s.append(Paragraph('Barcode should say: ' + dr._bc.value, styleN)) - story.append(KeepTogether(s)) - - SimpleDocTemplate(fileName).build(story) - print('created', fileName) - -if __name__=='__main__': - run() - fullTest() - def createSample(name,memory): - f = open(name,'wb') - f.write(memory) - f.close() - createSample('test_cbcim.png',createBarcodeImageInMemory('EAN13', value='123456789012')) - createSample('test_cbcim.gif',createBarcodeImageInMemory('EAN8', value='1234567', format='gif')) - createSample('test_cbcim.pdf',createBarcodeImageInMemory('UPCA', value='03600029145',format='pdf')) - createSample('test_cbcim.tiff',createBarcodeImageInMemory('USPS_4State', value='01234567094987654321',routing='01234567891',format='tiff')) diff --git a/reportlab/graphics/barcode/usps.py b/reportlab/graphics/barcode/usps.py deleted file mode 100644 index a40169b8..00000000 --- a/reportlab/graphics/barcode/usps.py +++ /dev/null @@ -1,232 +0,0 @@ -# -# Copyright (c) 1996-2000 Tyler C. Sarna -# All rights reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# 1. Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# 2. Redistributions in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# 3. All advertising materials mentioning features or use of this software -# must display the following acknowledgement: -# This product includes software developed by Tyler C. Sarna. -# 4. Neither the name of the author nor the names of contributors -# may be used to endorse or promote products derived from this software -# without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND -# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS -# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -# POSSIBILITY OF SUCH DAMAGE. -# - -from reportlab.lib.units import inch -from reportlab.graphics.barcode.common import Barcode -from string import digits as string_digits, whitespace as string_whitespace -from reportlab.lib.utils import asNative - -_fim_patterns = { - 'A' : "|| | ||", - 'B' : "| || || |", - 'C' : "|| | | ||", - 'D' : "||| | |||", - # XXX There is an E. - # The below has been seen, but dunno if it is E or not: - # 'E' : '|||| ||||' -} - -_postnet_patterns = { - '1' : "...||", '2' : "..|.|", '3' : "..||.", '4' : ".|..|", - '5' : ".|.|.", '6' : ".||..", '7' : "|...|", '8' : "|..|.", - '9' : "|.|..", '0' : "||...", 'S' : "|", -} - -class FIM(Barcode): - """ - FIM (Facing ID Marks) encode only one letter. - There are currently four defined: - - A Courtesy reply mail with pre-printed POSTNET - B Business reply mail without pre-printed POSTNET - C Business reply mail with pre-printed POSTNET - D OCR Readable mail without pre-printed POSTNET - - Options that may be passed to constructor: - - value (single character string from the set A - D. required.): - The value to encode. - - quiet (bool, default 0): - Whether to include quiet zones in the symbol. - - The following may also be passed, but doing so will generate nonstandard - symbols which should not be used. This is mainly documented here to - show the defaults: - - barHeight (float, default 5/8 inch): - Height of the code. This might legitimately be overriden to make - a taller symbol that will 'bleed' off the edge of the paper, - leaving 5/8 inch remaining. - - lquiet (float, default 1/4 inch): - Quiet zone size to left of code, if quiet is true. - Default is the greater of .25 inch, or .15 times the symbol's - length. - - rquiet (float, default 15/32 inch): - Quiet zone size to right left of code, if quiet is true. - - Sources of information on FIM: - - USPS Publication 25, A Guide to Business Mail Preparation - http://new.usps.com/cpim/ftp/pubs/pub25.pdf - """ - barWidth = inch * (1.0/32.0) - spaceWidth = inch * (1.0/16.0) - barHeight = inch * (5.0/8.0) - rquiet = inch * (0.25) - lquiet = inch * (15.0/32.0) - quiet = 0 - def __init__(self, value='', **args): - value = str(value) if isinstance(value,int) else asNative(value) - for k, v in args.items(): - setattr(self, k, v) - - Barcode.__init__(self, value) - - def validate(self): - self.valid = 1 - self.validated = '' - for c in self.value: - if c in string_whitespace: - continue - elif c in "abcdABCD": - self.validated = self.validated + c.upper() - else: - self.valid = 0 - - if len(self.validated) != 1: - raise ValueError("Input must be exactly one character") - - return self.validated - - def decompose(self): - self.decomposed = '' - for c in self.encoded: - self.decomposed = self.decomposed + _fim_patterns[c] - - return self.decomposed - - def computeSize(self): - self._width = (len(self.decomposed) - 1) * self.spaceWidth + self.barWidth - if self.quiet: - self._width += self.lquiet + self.rquiet - self._height = self.barHeight - - def draw(self): - self._calculate() - left = self.quiet and self.lquiet or 0 - for c in self.decomposed: - if c == '|': - self.rect(left, 0.0, self.barWidth, self.barHeight) - left += self.spaceWidth - self.drawHumanReadable() - - def _humanText(self): - return self.value - -class POSTNET(Barcode): - """ - POSTNET is used in the US to encode "zip codes" (postal codes) on - mail. It can encode 5, 9, or 11 digit codes. I've read that it's - pointless to do 5 digits, since USPS will just have to re-print - them with 9 or 11 digits. - - Sources of information on POSTNET: - - USPS Publication 25, A Guide to Business Mail Preparation - http://new.usps.com/cpim/ftp/pubs/pub25.pdf - """ - quiet = 0 - shortHeight = inch * 0.050 - barHeight = inch * 0.125 - barWidth = inch * 0.018 - spaceWidth = inch * 0.0275 - def __init__(self, value='', **args): - value = str(value) if isinstance(value,int) else asNative(value) - for k, v in args.items(): - setattr(self, k, v) - - Barcode.__init__(self, value) - - def validate(self): - self.validated = '' - self.valid = 1 - count = 0 - for c in self.value: - if c in (string_whitespace + '-'): - pass - elif c in string_digits: - count = count + 1 - if count == 6: - self.validated = self.validated + '-' - self.validated = self.validated + c - else: - self.valid = 0 - - if len(self.validated) not in [5, 10, 12]: - self.valid = 0 - - return self.validated - - def encode(self): - self.encoded = "S" - check = 0 - for c in self.validated: - if c in string_digits: - self.encoded = self.encoded + c - check = check + int(c) - elif c == '-': - pass - else: - raise ValueError("Invalid character in input") - check = (10 - check) % 10 - self.encoded = self.encoded + repr(check) + 'S' - return self.encoded - - def decompose(self): - self.decomposed = '' - for c in self.encoded: - self.decomposed = self.decomposed + _postnet_patterns[c] - return self.decomposed - - def computeSize(self): - self._width = len(self.decomposed) * self.barWidth + (len(self.decomposed) - 1) * self.spaceWidth - self._height = self.barHeight - - def draw(self): - self._calculate() - sdown = self.barHeight - self.shortHeight - left = 0 - - for c in self.decomposed: - if c == '.': - h = self.shortHeight - else: - h = self.barHeight - self.rect(left, 0.0, self.barWidth, h) - left = left + self.barWidth + self.spaceWidth - self.drawHumanReadable() - - def _humanText(self): - return self.encoded[1:-1] diff --git a/reportlab/graphics/barcode/usps4s.py b/reportlab/graphics/barcode/usps4s.py deleted file mode 100644 index ed8980eb..00000000 --- a/reportlab/graphics/barcode/usps4s.py +++ /dev/null @@ -1,386 +0,0 @@ -#copyright ReportLab Inc. 2000-2012 -#see license.txt for license details -__version__=''' $Id$ ''' -__all__ = ('USPS_4State',) - -from reportlab.lib.colors import black -from reportlab.graphics.barcode.common import Barcode -from reportlab.lib.utils import asNative - -class USPS_4State(Barcode): - ''' USPS 4-State OneView (TM) barcode. All info from USPS-B-3200A - ''' - _widthSize = 1 - _heightSize = 1 - _fontSize = 11 - _humanReadable = 0 - tops = dict( - F = (0.067,0.115), - T = (0.021,0.040), - A = (0.067,0.115), - D = (0.021,0.040), - ) - bottoms = dict( - F = (-0.067,-0.115), - D = (-0.067,-0.115), - T = (-0.021,-0.040), - A = (-0.021,-0.040), - ) - dimensions = dict( - width = (0.015, 0.025), - pitch = (0.0416,0.050), - hcz = (0.125,0.125), - vcz = (0.040,0.040), - ) - - def __init__(self,value='01234567094987654321',routing='',**kwd): - self._init() - value = str(value) if isinstance(value,int) else asNative(value) - self._tracking = value - self._routing = routing - self._setKeywords(**kwd) - - def _init(self): - self._bvalue = None - self._codewords = None - self._characters = None - self._barcodes = None - - def scale(kind,D,s): - V = D[kind] - return 72*(V[0]*(1-s)+s*V[1]) - scale = staticmethod(scale) - - def tracking(self,tracking): - self._init() - self._tracking = tracking - tracking = property(lambda self: self._tracking,tracking) - - def routing(self,routing): - self._init() - self._routing = routing - routing = property(lambda self: self._routing,routing) - - def widthSize(self,value): - self._sized = None - self._widthSize = value - widthSize = property(lambda self: self._widthSize,widthSize) - - def heightSize(self,value): - self._sized = None - self._heightSize = value - heightSize = property(lambda self: self._heightSize,heightSize) - - def fontSize(self,value): - self._sized = None - self._fontSize = value - fontSize = property(lambda self: self._fontSize,fontSize) - - def humanReadable(self,value): - self._sized = None - self._humanReadable = value - humanReadable = property(lambda self: self._humanReadable,humanReadable) - - def binary(self): - '''convert the 4 state string values to binary - >>> print hex(USPS_4State('01234567094987654321','').binary) - 0x1122103B5C2004B1L - >>> print hex(USPS_4State('01234567094987654321','01234').binary) - 0xD138A87BAB5CF3804B1L - >>> print hex(USPS_4State('01234567094987654321','012345678').binary) - 0x202BDC097711204D21804B1L - >>> print hex(USPS_4State('01234567094987654321','01234567891').binary) - 0x16907B2A24ABC16A2E5C004B1L - ''' - value = self._bvalue - if not value: - routing = self.routing - n = len(routing) - try: - if n==0: - value = 0 - elif n==5: - value = int(routing)+1 - elif n==9: - value = int(routing)+100001 - elif n==11: - value = int(routing)+1000100001 - else: - raise ValueError - except: - raise ValueError('Problem converting %s, routing code must be 0, 5, 9 or 11 digits' % routing) - - tracking = self.tracking - svalue = tracking[0:2] - try: - value *= 10 - value += int(svalue[0]) - value *= 5 - value += int(svalue[1]) - except: - raise ValueError('Problem converting %s, barcode identifier must be 2 digits' % svalue) - - i = 2 - for name,nd in (('special services',3), ('customer identifier',6), ('sequence number',9)): - j = i - i += nd - svalue = tracking[j:i] - try: - if len(svalue)!=nd: raise ValueError - for j in range(nd): - value *= 10 - value += int(svalue[j]) - except: - raise ValueError('Problem converting %s, %s must be %d digits' % (svalue,name,nd)) - self._bvalue = value - return value - binary = property(binary) - - def codewords(self): - '''convert binary value into codewords - >>> print USPS_4State('01234567094987654321','01234567891').codewords) - (673, 787, 607, 1022, 861, 19, 816, 1294, 35, 602) - ''' - if not self._codewords: - value = self.binary - A, J = divmod(value,636) - A, I = divmod(A,1365) - A, H = divmod(A,1365) - A, G = divmod(A,1365) - A, F = divmod(A,1365) - A, E = divmod(A,1365) - A, D = divmod(A,1365) - A, C = divmod(A,1365) - A, B = divmod(A,1365) - assert 0<=A<=658, 'improper value %s passed to _2codewords A-->%s' % (hex(int(value)),A) - self._fcs = _crc11(value) - if self._fcs&1024: A += 659 - J *= 2 - self._codewords = tuple(map(int,(A,B,C,D,E,F,G,H,I,J))) - return self._codewords - codewords = property(codewords) - - - def table1(self): - self.__class__.table1 = _initNof13Table(5,1287) - return self.__class__.table1 - table1 = property(table1) - - def table2(self): - self.__class__.table2 = _initNof13Table(2,78) - return self.__class__.table2 - table2 = property(table2) - - def characters(self): - ''' convert own codewords to characters - >>> print ' '.join(hex(c)[2:] for c in USPS_4State('01234567094987654321','01234567891').characters) - dcb 85c 8e4 b06 6dd 1740 17c6 1200 123f 1b2b - ''' - if not self._characters: - codewords = self.codewords - fcs = self._fcs - C = [] - aC = C.append - table1 = self.table1 - table2 = self.table2 - for i in range(10): - cw = codewords[i] - if cw<=1286: - c = table1[cw] - else: - c = table2[cw-1287] - if (fcs>>i)&1: - c = ~c & 0x1fff - aC(c) - self._characters = tuple(C) - return self._characters - characters = property(characters) - - def barcodes(self): - '''Get 4 state bar codes for current routing and tracking - >>> print USPS_4State('01234567094987654321','01234567891').barcodes - AADTFFDFTDADTAADAATFDTDDAAADDTDTTDAFADADDDTFFFDDTTTADFAAADFTDAADA - ''' - if not self._barcodes: - C = self.characters - B = [] - aB = B.append - bits2bars = self._bits2bars - for dc,db,ac,ab in self.table4: - aB(bits2bars[((C[dc]>>db)&1)+2*((C[ac]>>ab)&1)]) - self._barcodes = ''.join(B) - return self._barcodes - barcodes = property(barcodes) - - table4 = ((7, 2, 4, 3), (1, 10, 0, 0), (9, 12, 2, 8), (5, 5, 6, 11), - (8, 9, 3, 1), (0, 1, 5, 12), (2, 5, 1, 8), (4, 4, 9, 11), - (6, 3, 8, 10), (3, 9, 7, 6), (5, 11, 1, 4), (8, 5, 2, 12), - (9, 10, 0, 2), (7, 1, 6, 7), (3, 6, 4, 9), (0, 3, 8, 6), - (6, 4, 2, 7), (1, 1, 9, 9), (7, 10, 5, 2), (4, 0, 3, 8), - (6, 2, 0, 4), (8, 11, 1, 0), (9, 8, 3, 12), (2, 6, 7, 7), - (5, 1, 4, 10), (1, 12, 6, 9), (7, 3, 8, 0), (5, 8, 9, 7), - (4, 6, 2, 10), (3, 4, 0, 5), (8, 4, 5, 7), (7, 11, 1, 9), - (6, 0, 9, 6), (0, 6, 4, 8), (2, 1, 3, 2), (5, 9, 8, 12), - (4, 11, 6, 1), (9, 5, 7, 4), (3, 3, 1, 2), (0, 7, 2, 0), - (1, 3, 4, 1), (6, 10, 3, 5), (8, 7, 9, 4), (2, 11, 5, 6), - (0, 8, 7, 12), (4, 2, 8, 1), (5, 10, 3, 0), (9, 3, 0, 9), - (6, 5, 2, 4), (7, 8, 1, 7), (5, 0, 4, 5), (2, 3, 0, 10), - (6, 12, 9, 2), (3, 11, 1, 6), (8, 8, 7, 9), (5, 4, 0, 11), - (1, 5, 2, 2), (9, 1, 4, 12), (8, 3, 6, 6), (7, 0, 3, 7), - (4, 7, 7, 5), (0, 12, 1, 11), (2, 9, 9, 0), (6, 8, 5, 3), - (3, 10, 8, 2)) - - _bits2bars = 'T','D','A','F' - horizontalClearZone = property(lambda self: self.scale('hcz',self.dimensions,self.widthScale)) - verticalClearZone = property(lambda self: self.scale('vcz',self.dimensions,self.heightScale)) - pitch = property(lambda self: self.scale('pitch',self.dimensions,self.widthScale)) - barWidth = property(lambda self: self.scale('width',self.dimensions,self.widthScale)) - barHeight = property(lambda self: self.scale('F',self.tops,self.heightScale) - self.scale('F',self.bottoms,self.heightScale)) - widthScale = property(lambda self: min(1,max(0,self.widthSize))) - heightScale = property(lambda self: min(1,max(0,self.heightSize))) - - def width(self): - self.computeSize() - return self._width - width = property(width) - - def height(self): - self.computeSize() - return self._height - height = property(height) - - def computeSize(self): - if not getattr(self,'_sized',None): - ws = self.widthScale - hs = self.heightScale - barHeight = self.barHeight - barWidth = self.barWidth - pitch = self.pitch - hcz = self.horizontalClearZone - vcz = self.verticalClearZone - self._width = 2*hcz + barWidth + 64*pitch - self._height = 2*vcz+barHeight - if self.humanReadable: - self._height += self.fontSize*1.2+vcz - self._sized = True - - def wrap(self,aW,aH): - self.computeSize() - return self.width, self.height - - def _getBarVInfo(self,y0=0): - vInfo = {} - hs = self.heightScale - for b in ('T','D','A','F'): - y = self.scale(b,self.bottoms,hs)+y0 - vInfo[b] = y,self.scale(b,self.tops,hs)+y0 - y - return vInfo - - def draw(self): - self.computeSize() - hcz = self.horizontalClearZone - vcz = self.verticalClearZone - bw = self.barWidth - x = hcz - y0 = vcz+self.barHeight*0.5 - dw = self.pitch - vInfo = self._getBarVInfo(y0) - for b in self.barcodes: - yb, hb = vInfo[b] - self.rect(x,yb,bw,hb) - x += dw - self.drawHumanReadable() - - def value(self): - tracking = self.tracking - routing = self.routing - routing = routing and (routing,) or () - return ' '.join((tracking[0:2],tracking[2:5],tracking[5:11],tracking[11:])+routing) - value = property(value,lambda self,value: self.__dict__.__setitem__('tracking',value)) - - def drawHumanReadable(self): - if self.humanReadable: - hcz = self.horizontalClearZone - vcz = self.verticalClearZone - fontName = self.fontName - fontSize = self.fontSize - y = self.barHeight+2*vcz+0.2*fontSize - self.annotate(hcz,y,self.value,fontName,fontSize) - - def annotate(self,x,y,text,fontName,fontSize,anchor='middle'): - Barcode.annotate(self,x,y,text,fontName,fontSize,anchor='start') - -def _crc11(value): - ''' - >>> print ' '.join(hex(_crc11(USPS_4State('01234567094987654321',x).binary)) for x in ('','01234','012345678','01234567891')) - 0x51 0x65 0x606 0x751 - ''' - bytes = hex(int(value))[2:-1] - bytes = '0'*(26-len(bytes))+bytes - gp = 0x0F35 - fcs = 0x07FF - data = int(bytes[:2],16)<<5 - for b in range(2,8): - if (fcs ^ data)&0x400: - fcs = (fcs<<1)^gp - else: - fcs = fcs<<1 - fcs &= 0x7ff - data <<= 1 - - for x in range(2,2*13,2): - data = int(bytes[x:x+2],16)<<3 - for b in range(8): - if (fcs ^ data)&0x400: - fcs = (fcs<<1)^gp - else: - fcs = fcs<<1 - fcs &= 0x7ff - data <<= 1 - return fcs - -def _ru13(i): - '''reverse unsigned 13 bit number - >>> print _ru13(7936), _ru13(31), _ru13(47), _ru13(7808) - 31 7936 7808 47 - ''' - r = 0 - for x in range(13): - r <<= 1 - r |= i & 1 - i >>= 1 - return r - -def _initNof13Table(N,lenT): - '''create and return table of 13 bit values with N bits on - >>> T = _initNof13Table(5,1287) - >>> print ' '.join('T[%d]=%d' % (i, T[i]) for i in (0,1,2,3,4,1271,1272,1284,1285,1286)) - T[0]=31 T[1]=7936 T[2]=47 T[3]=7808 T[4]=55 T[1271]=6275 T[1272]=6211 T[1284]=856 T[1285]=744 T[1286]=496 - ''' - T = lenT*[None] - l = 0 - u = lenT-1 - for c in range(8192): - bc = 0 - for b in range(13): - bc += (c&(1< scale the value - otherwise use the absolute value - lo lowest coordinate to draw default 0 - hi highest coordinate to draw at default = length - drawAtLimit True draw line at appropriate limit if its coordinate exceeds the lo, hi range - False ignore if it's outside the range - all Line keywords are acceptable - ''' - def __init__(self,v,**kwds): - self._v = v - self._kwds = kwds - - def __call__(self,axis): - kwds = self._kwds.copy() - scaleValue = kwds.pop('scaleValue',True) - endOffset = kwds.pop('endOffset',False) - startOffset = kwds.pop('endOffset',False) - if axis.isYAxis: - offs = axis._x - d0 = axis._y - else: - offs = axis._y - d0 = axis._x - s = kwds.pop('start',None) - e = kwds.pop('end',None) - if s is None or e is None: - dim = getattr(getattr(axis,'joinAxis',None),'getGridDims',None) - if dim and hasattr(dim,'__call__'): - dim = dim() - if dim: - if s is None: s = dim[0] - if e is None: e = dim[1] - else: - if s is None: s = 0 - if e is None: e = 0 - hi = kwds.pop('hi',axis._length)+d0 - lo = kwds.pop('lo',0)+d0 - lo,hi=min(lo,hi),max(lo,hi) - drawAtLimit = kwds.pop('drawAtLimit',False) - oaglp = axis._get_line_pos - if not scaleValue: - axis._get_line_pos = lambda x: x - try: - v = self._v - if endOffset: - v = v + hi - elif startOffset: - v = v + lo - func = axis._getLineFunc(s-offs,e-offs,kwds.pop('parent',None)) - if not hasattr(axis,'_tickValues'): - axis._pseudo_configure() - d = axis._get_line_pos(v) - if dhi: - if not drawAtLimit: return None - if d0): return - c = self.subGridStrokeColor - w = self.subGridStrokeWidth or 0 - if not(w and c): return - s = self.subGridStart - e = self.subGridEnd - if s is None or e is None: - if dim and hasattr(dim,'__call__'): - dim = dim() - if dim: - if s is None: s = dim[0] - if e is None: e = dim[1] - else: - if s is None: s = 0 - if e is None: e = 0 - if s or e: - if self.isYAxis: offs = self._x - else: offs = self._y - otv = self._calcSubTicks() - try: - self._makeLines(g,s-offs,e-offs,c,w,self.subGridStrokeDashArray,self.subGridStrokeLineJoin,self.subGridStrokeLineCap,self.subGridStrokeMiterLimit,parent=parent,exclude=exclude) - finally: - self._tickValues = otv - - def getGridDims(self,start=None,end=None): - if start is None: start = (self._x,self._y)[self.isYAxis] - if end is None: end = start+self._length - return start,end - - def isYAxis(self): - if getattr(self,'_dataIndex',None)==1: return True - acn = self.__class__.__name__ - return acn[0]=='Y' or acn[:4]=='AdjY' - isYAxis = property(isYAxis) - - def isXAxis(self): - if getattr(self,'_dataIndex',None)==0: return True - acn = self.__class__.__name__ - return acn[0]=='X' or acn[:11]=='NormalDateX' - isXAxis = property(isXAxis) - - def addAnnotations(self,g,A=None): - if A is None: getattr(self,'annotations',[]) - for x in A: - g.add(x(self)) - - def _splitAnnotations(self): - A = getattr(self,'annotations',[])[:] - D = {} - for v in ('early','beforeAxis','afterAxis','beforeTicks', - 'afterTicks','beforeTickLabels', - 'afterTickLabels','late'): - R = [].append - P = [].append - for a in A: - if getattr(a,v,0): - R(a) - else: - P(a) - D[v] = R.__self__ - A[:] = P.__self__ - D['late'] += A - return D - - def draw(self): - g = Group() - A = self._splitAnnotations() - self.addAnnotations(g,A['early']) - - if self.visible: - self.addAnnotations(g,A['beforeAxis']) - g.add(self.makeAxis()) - self.addAnnotations(g,A['afterAxis']) - self.addAnnotations(g,A['beforeTicks']) - g.add(self.makeTicks()) - self.addAnnotations(g,A['afterTicks']) - self.addAnnotations(g,A['beforeTickLabels']) - g.add(self.makeTickLabels()) - self.addAnnotations(g,A['afterTickLabels']) - - self.addAnnotations(g,A['late']) - return g - -class CALabel(PMVLabel): - _attrMap = AttrMap(BASE=PMVLabel, - labelPosFrac = AttrMapValue(isNumber, desc='where in the category range [0,1] the labels should be anchored'), - ) - def __init__(self,**kw): - PMVLabel.__init__(self,**kw) - self._setKeywords( - labelPosFrac = 0.5, - ) - -# Category axes. -class CategoryAxis(_AxisG): - "Abstract category axis, unusable in itself." - _nodoc = 1 - _attrMap = AttrMap( - visible = AttrMapValue(isBoolean, desc='Display entire object, if true.'), - visibleAxis = AttrMapValue(isBoolean, desc='Display axis line, if true.'), - visibleTicks = AttrMapValue(isBoolean, desc='Display axis ticks, if true.'), - visibleLabels = AttrMapValue(isBoolean, desc='Display axis labels, if true.'), - visibleGrid = AttrMapValue(isBoolean, desc='Display axis grid, if true.'), - strokeWidth = AttrMapValue(isNumber, desc='Width of axis line and ticks.'), - strokeColor = AttrMapValue(isColorOrNone, desc='Color of axis line and ticks.'), - strokeDashArray = AttrMapValue(isListOfNumbersOrNone, desc='Dash array used for axis line.'), - strokeLineCap = AttrMapValue(OneOf(0,1,2),desc="Line cap 0=butt, 1=round & 2=square"), - strokeLineJoin = AttrMapValue(OneOf(0,1,2),desc="Line join 0=miter, 1=round & 2=bevel"), - strokeMiterLimit = AttrMapValue(isNumber,desc="miter limit control miter line joins"), - gridStrokeWidth = AttrMapValue(isNumber, desc='Width of grid lines.'), - gridStrokeColor = AttrMapValue(isColorOrNone, desc='Color of grid lines.'), - gridStrokeDashArray = AttrMapValue(isListOfNumbersOrNone, desc='Dash array used for grid lines.'), - gridStrokeLineCap = AttrMapValue(OneOf(0,1,2),desc="Grid Line cap 0=butt, 1=round & 2=square"), - gridStrokeLineJoin = AttrMapValue(OneOf(0,1,2),desc="Grid Line join 0=miter, 1=round & 2=bevel"), - gridStrokeMiterLimit = AttrMapValue(isNumber,desc="Grid miter limit control miter line joins"), - gridStart = AttrMapValue(isNumberOrNone, desc='Start of grid lines wrt axis origin'), - gridEnd = AttrMapValue(isNumberOrNone, desc='End of grid lines wrt axis origin'), - drawGridLast = AttrMapValue(isBoolean, desc='if true draw gridlines after everything else.'), - labels = AttrMapValue(None, desc='Handle of the axis labels.'), - categoryNames = AttrMapValue(isListOfStringsOrNone, desc='List of category names.'), - joinAxis = AttrMapValue(None, desc='Join both axes if true.'), - joinAxisPos = AttrMapValue(isNumberOrNone, desc='Position at which to join with other axis.'), - reverseDirection = AttrMapValue(isBoolean, desc='If true reverse category direction.'), - style = AttrMapValue(OneOf('parallel','stacked','parallel_3d'),"How common category bars are plotted"), - labelAxisMode = AttrMapValue(OneOf('high','low','axis', 'axispmv'), desc="Like joinAxisMode, but for the axis labels"), - tickShift = AttrMapValue(isBoolean, desc='Tick shift typically'), - loPad = AttrMapValue(isNumber, desc='extra inner space before start of the axis'), - hiPad = AttrMapValue(isNumber, desc='extra inner space after end of the axis'), - annotations = AttrMapValue(None,desc='list of annotations'), - loLLen = AttrMapValue(isNumber, desc='extra line length before start of the axis'), - hiLLen = AttrMapValue(isNumber, desc='extra line length after end of the axis'), - skipGrid = AttrMapValue(OneOf('none','top','both','bottom'),"grid lines to skip top bottom both none"), - ) - - def __init__(self): - assert self.__class__.__name__!='CategoryAxis', "Abstract Class CategoryAxis Instantiated" - # private properties set by methods. The initial values - # here are to make demos easy; they would always be - # overridden in real life. - self._x = 50 - self._y = 50 - self._length = 100 - self._catCount = 0 - - # public properties - self.visible = 1 - self.visibleAxis = 1 - self.visibleTicks = 1 - self.visibleLabels = 1 - self.visibleGrid = 0 - self.drawGridLast = False - - self.strokeWidth = 1 - self.strokeColor = STATE_DEFAULTS['strokeColor'] - self.strokeDashArray = STATE_DEFAULTS['strokeDashArray'] - - self.gridStrokeLineJoin = self.strokeLineJoin = STATE_DEFAULTS['strokeLineJoin'] - self.gridStrokeLineCap = self.strokeLineCap = STATE_DEFAULTS['strokeLineCap'] - self.gridStrokeMiterLimit = self.strokeMiterLimit = STATE_DEFAULTS['strokeMiterLimit'] - self.gridStrokeWidth = 0.25 - self.gridStrokeColor = STATE_DEFAULTS['strokeColor'] - self.gridStrokeDashArray = STATE_DEFAULTS['strokeDashArray'] - self.gridStart = self.gridEnd = None - - self.strokeLineJoin = STATE_DEFAULTS['strokeLineJoin'] - self.strokeLineCap = STATE_DEFAULTS['strokeLineCap'] - self.strokeMiterLimit = STATE_DEFAULTS['strokeMiterLimit'] - - self.labels = TypedPropertyCollection(CALabel) - # if None, they don't get labels. If provided, - # you need one name per data point and they are - # used for label text. - self.categoryNames = None - self.joinAxis = None - self.joinAxisPos = None - self.joinAxisMode = None - self.labelAxisMode = 'axis' - self.reverseDirection = 0 - self.style = 'parallel' - - #various private things which need to be initialized - self._labelTextFormat = None - self.tickShift = 0 - self.loPad = 0 - self.hiPad = 0 - self.loLLen = 0 - self.hiLLen = 0 - - def setPosition(self, x, y, length): - # ensure floating point - self._x = float(x) - self._y = float(y) - self._length = float(length) - - def configure(self, multiSeries,barWidth=None): - self._catCount = max(list(map(len,multiSeries))) - self._barWidth = barWidth or ((self._length-self.loPad-self.hiPad)/float(self._catCount or 1)) - self._calcTickmarkPositions() - if self.labelAxisMode == 'axispmv': - self._pmv = [sum([series[i] for series in multiSeries]) for i in xrange(self._catCount)] - - def _calcTickmarkPositions(self): - n = self._catCount - if self.tickShift: - self._tickValues = [t+0.5 for t in range(n)] - else: - if self.reverseDirection: - self._tickValues = list(range(-1,n)) - else: - self._tickValues = list(range(n+1)) - - def _scale(self,idx): - if self.reverseDirection: idx = self._catCount-idx-1 - return idx - -def _assertYAxis(axis): - assert axis.isYAxis, "Cannot connect to other axes (%s), but Y- ones." % axis.__class__.__name__ -def _assertXAxis(axis): - assert axis.isXAxis, "Cannot connect to other axes (%s), but X- ones." % axis.__class__.__name__ - -class _XTicks: - _tickTweaks = 0 #try 0.25-0.5 - - def _drawTicksInner(self,tU,tD,g): - if tU or tD: - sW = self.strokeWidth - tW = self._tickTweaks - if tW: - if tU and not tD: - tD = tW*sW - elif tD and not tU: - tU = tW*sW - self._makeLines(g,tU,-tD,self.strokeColor,sW,self.strokeDashArray,self.strokeLineJoin,self.strokeLineCap,self.strokeMiterLimit) - - def _drawTicks(self,tU,tD,g=None): - g = g or Group() - if self.visibleTicks: - self._drawTicksInner(tU,tD,g) - return g - - def _calcSubTicks(self): - if not hasattr(self,'_tickValues'): - self._pseudo_configure() - otv = self._tickValues - if not hasattr(self,'_subTickValues'): - acn = self.__class__.__name__ - if acn[:11]=='NormalDateX': - iFuzz = 0 - dCnv = int - else: - iFuzz = 1e-8 - dCnv = lambda x:x - - OTV = [tv for tv in otv if getattr(tv,'_doSubTicks',1)] - T = [].append - nst = int(self.subTickNum) - i = len(OTV) - if i<2: - self._subTickValues = [] - else: - if i==2: - dst = OTV[1]-OTV[0] - elif i==3: - dst = max(OTV[1]-OTV[0],OTV[2]-OTV[1]) - else: - i >>= 1 - dst = OTV[i+1] - OTV[i] - fuzz = dst*iFuzz - vn = self._valueMin+fuzz - vx = self._valueMax-fuzz - if OTV[0]>vn: OTV.insert(0,OTV[0]-dst) - if OTV[-1]=vx: continue - T(t) - self._subTickValues = T.__self__ - self._tickValues = self._subTickValues - return otv - - def _drawSubTicks(self,tU,tD,g): - if getattr(self,'visibleSubTicks',0) and self.subTickNum>0: - otv = self._calcSubTicks() - try: - self._drawTicksInner(tU,tD,g) - finally: - self._tickValues = otv - - def makeTicks(self): - yold=self._y - try: - self._y = self._labelAxisPos(getattr(self,'tickAxisMode','axis')) - g = self._drawTicks(self.tickUp,self.tickDown) - self._drawSubTicks(getattr(self,'subTickHi',0),getattr(self,'subTickLo',0),g) - return g - finally: - self._y = yold - - def _labelAxisPos(self,mode=None): - axis = self.joinAxis - if axis: - mode = mode or self.labelAxisMode - if mode == 'low': - return axis._y - elif mode == 'high': - return axis._y + axis._length - return self._y - -class _YTicks(_XTicks): - - def _labelAxisPos(self,mode=None): - axis = self.joinAxis - if axis: - mode = mode or self.labelAxisMode - if mode == 'low': - return axis._x - elif mode == 'high': - return axis._x + axis._length - return self._x - - def makeTicks(self): - xold=self._x - try: - self._x = self._labelAxisPos(getattr(self,'tickAxisMode','axis')) - g = self._drawTicks(self.tickRight,self.tickLeft) - self._drawSubTicks(getattr(self,'subTickHi',0),getattr(self,'subTickLo',0),g) - return g - finally: - self._x = xold - -class XCategoryAxis(_XTicks,CategoryAxis): - "X/category axis" - - _attrMap = AttrMap(BASE=CategoryAxis, - tickUp = AttrMapValue(isNumber, - desc='Tick length up the axis.'), - tickDown = AttrMapValue(isNumber, - desc='Tick length down the axis.'), - joinAxisMode = AttrMapValue(OneOf('bottom', 'top', 'value', 'points', None), - desc="Mode used for connecting axis ('bottom', 'top', 'value', 'points', None)."), - ) - - _dataIndex = 0 - - def __init__(self): - CategoryAxis.__init__(self) - self.labels.boxAnchor = 'n' #north - top edge - self.labels.dy = -5 - # ultra-simple tick marks for now go between categories - # and have same line style as axis - need more - self.tickUp = 0 # how far into chart does tick go? - self.tickDown = 5 # how far below axis does tick go? - - def demo(self): - self.setPosition(30, 70, 140) - self.configure([(10,20,30,40,50)]) - - self.categoryNames = ['One','Two','Three','Four','Five'] - # all labels top-centre aligned apart from the last - self.labels.boxAnchor = 'n' - self.labels[4].boxAnchor = 'e' - self.labels[4].angle = 90 - - d = Drawing(200, 100) - d.add(self) - return d - - def joinToAxis(self, yAxis, mode='bottom', pos=None): - "Join with y-axis using some mode." - _assertYAxis(yAxis) - if mode == 'bottom': - self._y = yAxis._y - elif mode == 'top': - self._y = yAxis._y + yAxis._length - elif mode == 'value': - self._y = yAxis.scale(pos) - elif mode == 'points': - self._y = pos - - def _joinToAxis(self): - ja = self.joinAxis - if ja: - jam = self.joinAxisMode - if jam in ('bottom', 'top'): - self.joinToAxis(ja, mode=jam) - elif jam in ('value', 'points'): - self.joinToAxis(ja, mode=jam, pos=self.joinAxisPos) - - def scale(self, idx): - """returns the x position and width in drawing units of the slice""" - return (self._x + self.loPad + self._scale(idx)*self._barWidth, self._barWidth) - - def makeAxis(self): - g = Group() - self._joinToAxis() - if not self.visibleAxis: return g - - axis = Line(self._x-self.loLLen, self._y, self._x + self._length+self.hiLLen, self._y) - axis.strokeColor = self.strokeColor - axis.strokeWidth = self.strokeWidth - axis.strokeDashArray = self.strokeDashArray - g.add(axis) - - return g - - def makeTickLabels(self): - g = Group() - - if not self.visibleLabels: return g - - categoryNames = self.categoryNames - if categoryNames is not None: - catCount = self._catCount - n = len(categoryNames) - reverseDirection = self.reverseDirection - barWidth = self._barWidth - _y = self._labelAxisPos() - _x = self._x - pmv = self._pmv if self.labelAxisMode=='axispmv' else None - - for i in range(catCount): - if reverseDirection: ic = catCount-i-1 - else: ic = i - if ic>=n: continue - label=i-catCount - if label in self.labels: - label = self.labels[label] - else: - label = self.labels[i] - if pmv: - _dy = label.dy - v = label._pmv = pmv[ic] - if v<0: _dy *= -2 - else: - _dy = 0 - lpf = label.labelPosFrac - x = _x + (i+lpf) * barWidth - label.setOrigin(x,_y+_dy) - label.setText(categoryNames[ic] or '') - g.add(label) - - return g - -class YCategoryAxis(_YTicks,CategoryAxis): - "Y/category axis" - - _attrMap = AttrMap(BASE=CategoryAxis, - tickLeft = AttrMapValue(isNumber, - desc='Tick length left of the axis.'), - tickRight = AttrMapValue(isNumber, - desc='Tick length right of the axis.'), - joinAxisMode = AttrMapValue(OneOf(('left', 'right', 'value', 'points', None)), - desc="Mode used for connecting axis ('left', 'right', 'value', 'points', None)."), - ) - - _dataIndex = 1 - - def __init__(self): - CategoryAxis.__init__(self) - self.labels.boxAnchor = 'e' #east - right edge - self.labels.dx = -5 - # ultra-simple tick marks for now go between categories - # and have same line style as axis - need more - self.tickLeft = 5 # how far left of axis does tick go? - self.tickRight = 0 # how far right of axis does tick go? - - def demo(self): - self.setPosition(50, 10, 80) - self.configure([(10,20,30)]) - self.categoryNames = ['One','Two','Three'] - # all labels top-centre aligned apart from the last - self.labels.boxAnchor = 'e' - self.labels[2].boxAnchor = 's' - self.labels[2].angle = 90 - - d = Drawing(200, 100) - d.add(self) - return d - - def joinToAxis(self, xAxis, mode='left', pos=None): - "Join with x-axis using some mode." - - _assertXAxis(xAxis) - if mode == 'left': - self._x = xAxis._x * 1.0 - elif mode == 'right': - self._x = (xAxis._x + xAxis._length) * 1.0 - elif mode == 'value': - self._x = xAxis.scale(pos) * 1.0 - elif mode == 'points': - self._x = pos * 1.0 - - def _joinToAxis(self): - ja = self.joinAxis - if ja: - jam = self.joinAxisMode - if jam in ('left', 'right'): - self.joinToAxis(ja, mode=jam) - elif jam in ('value', 'points'): - self.joinToAxis(ja, mode=jam, pos=self.joinAxisPos) - - def scale(self, idx): - "Returns the y position and width in drawing units of the slice." - return (self._y + self._scale(idx)*self._barWidth, self._barWidth) - - def makeAxis(self): - g = Group() - self._joinToAxis() - if not self.visibleAxis: return g - - axis = Line(self._x, self._y-self.loLLen, self._x, self._y + self._length+self.hiLLen) - axis.strokeColor = self.strokeColor - axis.strokeWidth = self.strokeWidth - axis.strokeDashArray = self.strokeDashArray - g.add(axis) - - return g - - def makeTickLabels(self): - g = Group() - - if not self.visibleLabels: return g - - categoryNames = self.categoryNames - if categoryNames is not None: - catCount = self._catCount - n = len(categoryNames) - reverseDirection = self.reverseDirection - barWidth = self._barWidth - labels = self.labels - _x = self._labelAxisPos() - _y = self._y - pmv = self._pmv if self.labelAxisMode=='axispmv' else None - - for i in range(catCount): - if reverseDirection: ic = catCount-i-1 - else: ic = i - if ic>=n: continue - label=i-catCount - if label in self.labels: - label = self.labels[label] - else: - label = self.labels[i] - lpf = label.labelPosFrac - y = _y + (i+lpf) * barWidth - if pmv: - _dx = label.dx - v = label._pmv = pmv[ic] - if v<0: _dx *= -2 - else: - _dx = 0 - label.setOrigin(_x+_dx, y) - label.setText(categoryNames[ic] or '') - g.add(label) - return g - -class TickLabeller: - '''Abstract base class which may be used to indicate a change - in the call signature for callable label formats - ''' - def __call__(self,axis,value): - return 'Abstract class instance called' - -# Value axes. -class ValueAxis(_AxisG): - "Abstract value axis, unusable in itself." - - _attrMap = AttrMap( - forceZero = AttrMapValue(EitherOr((isBoolean,OneOf('near'))), desc='Ensure zero in range if true.'), - visible = AttrMapValue(isBoolean, desc='Display entire object, if true.'), - visibleAxis = AttrMapValue(isBoolean, desc='Display axis line, if true.'), - visibleLabels = AttrMapValue(isBoolean, desc='Display axis labels, if true.'), - visibleTicks = AttrMapValue(isBoolean, desc='Display axis ticks, if true.'), - visibleGrid = AttrMapValue(isBoolean, desc='Display axis grid, if true.'), - strokeWidth = AttrMapValue(isNumber, desc='Width of axis line and ticks.'), - strokeColor = AttrMapValue(isColorOrNone, desc='Color of axis line and ticks.'), - strokeDashArray = AttrMapValue(isListOfNumbersOrNone, desc='Dash array used for axis line.'), - strokeLineCap = AttrMapValue(OneOf(0,1,2),desc="Line cap 0=butt, 1=round & 2=square"), - strokeLineJoin = AttrMapValue(OneOf(0,1,2),desc="Line join 0=miter, 1=round & 2=bevel"), - strokeMiterLimit = AttrMapValue(isNumber,desc="miter limit control miter line joins"), - gridStrokeWidth = AttrMapValue(isNumber, desc='Width of grid lines.'), - gridStrokeColor = AttrMapValue(isColorOrNone, desc='Color of grid lines.'), - gridStrokeDashArray = AttrMapValue(isListOfNumbersOrNone, desc='Dash array used for grid lines.'), - gridStrokeLineCap = AttrMapValue(OneOf(0,1,2),desc="Grid Line cap 0=butt, 1=round & 2=square"), - gridStrokeLineJoin = AttrMapValue(OneOf(0,1,2),desc="Grid Line join 0=miter, 1=round & 2=bevel"), - gridStrokeMiterLimit = AttrMapValue(isNumber,desc="Grid miter limit control miter line joins"), - gridStart = AttrMapValue(isNumberOrNone, desc='Start of grid lines wrt axis origin'), - gridEnd = AttrMapValue(isNumberOrNone, desc='End of grid lines wrt axis origin'), - drawGridLast = AttrMapValue(isBoolean, desc='if true draw gridlines after everything else.'), - minimumTickSpacing = AttrMapValue(isNumber, desc='Minimum value for distance between ticks.'), - maximumTicks = AttrMapValue(isNumber, desc='Maximum number of ticks.'), - labels = AttrMapValue(None, desc='Handle of the axis labels.'), - labelAxisMode = AttrMapValue(OneOf('high','low','axis'), desc="Like joinAxisMode, but for the axis labels"), - labelTextFormat = AttrMapValue(None, desc='Formatting string or function used for axis labels.'), - labelTextPostFormat = AttrMapValue(None, desc='Extra Formatting string.'), - labelTextScale = AttrMapValue(isNumberOrNone, desc='Scaling for label tick values.'), - valueMin = AttrMapValue(isNumberOrNone, desc='Minimum value on axis.'), - valueMax = AttrMapValue(isNumberOrNone, desc='Maximum value on axis.'), - valueStep = AttrMapValue(isNumberOrNone, desc='Step size used between ticks.'), - valueSteps = AttrMapValue(isListOfNumbersOrNone, desc='List of step sizes used between ticks.'), - avoidBoundFrac = AttrMapValue(EitherOr((isNumberOrNone,SequenceOf(isNumber,emptyOK=0,lo=2,hi=2))), desc='Fraction of interval to allow above and below.'), - avoidBoundSpace = AttrMapValue(EitherOr((isNumberOrNone,SequenceOf(isNumber,emptyOK=0,lo=2,hi=2))), desc='Space to allow above and below.'), - abf_ignore_zero = AttrMapValue(EitherOr((NoneOr(isBoolean),SequenceOf(isBoolean,emptyOK=0,lo=2,hi=2))), desc='Set to True to make the avoidBoundFrac calculations treat zero as non-special'), - rangeRound=AttrMapValue(OneOf('none','both','ceiling','floor'),'How to round the axis limits'), - zrangePref = AttrMapValue(isNumberOrNone, desc='Zero range axis limit preference.'), - style = AttrMapValue(OneOf('normal','stacked','parallel_3d'),"How values are plotted!"), - skipEndL = AttrMapValue(OneOf('none','start','end','both'), desc='Skip high/low tick labels'), - origShiftIPC = AttrMapValue(isNumberOrNone, desc='Lowest label shift interval ratio.'), - origShiftMin = AttrMapValue(isNumberOrNone, desc='Minimum amount to shift.'), - origShiftSpecialValue = AttrMapValue(isNumberOrNone, desc='special value for shift'), - tickAxisMode = AttrMapValue(OneOf('high','low','axis'), desc="Like joinAxisMode, but for the ticks"), - reverseDirection = AttrMapValue(isBoolean, desc='If true reverse category direction.'), - annotations = AttrMapValue(None,desc='list of annotations'), - loLLen = AttrMapValue(isNumber, desc='extra line length before start of the axis'), - hiLLen = AttrMapValue(isNumber, desc='extra line length after end of the axis'), - subTickNum = AttrMapValue(isNumber, desc='Number of axis sub ticks, if >0'), - subTickLo = AttrMapValue(isNumber, desc='sub tick down or left'), - subTickHi = AttrMapValue(isNumber, desc='sub tick up or right'), - visibleSubTicks = AttrMapValue(isBoolean, desc='Display axis sub ticks, if true.'), - visibleSubGrid = AttrMapValue(isBoolean, desc='Display axis sub grid, if true.'), - subGridStrokeWidth = AttrMapValue(isNumber, desc='Width of grid lines.'), - subGridStrokeColor = AttrMapValue(isColorOrNone, desc='Color of grid lines.'), - subGridStrokeDashArray = AttrMapValue(isListOfNumbersOrNone, desc='Dash array used for grid lines.'), - subGridStrokeLineCap = AttrMapValue(OneOf(0,1,2),desc="Grid Line cap 0=butt, 1=round & 2=square"), - subGridStrokeLineJoin = AttrMapValue(OneOf(0,1,2),desc="Grid Line join 0=miter, 1=round & 2=bevel"), - subGridStrokeMiterLimit = AttrMapValue(isNumber,desc="Grid miter limit control miter line joins"), - subGridStart = AttrMapValue(isNumberOrNone, desc='Start of grid lines wrt axis origin'), - subGridEnd = AttrMapValue(isNumberOrNone, desc='End of grid lines wrt axis origin'), - keepTickLabelsInside = AttrMapValue(isBoolean, desc='Ensure tick labels do not project beyond bounds of axis if true'), - skipGrid = AttrMapValue(OneOf('none','top','both','bottom'),"grid lines to skip top bottom both none"), - requiredRange = AttrMapValue(isNumberOrNone, desc='Minimum required value range.'), - ) - - def __init__(self,**kw): - assert self.__class__.__name__!='ValueAxis', 'Abstract Class ValueAxis Instantiated' - self._setKeywords(**kw) - self._setKeywords( - _configured = 0, - # private properties set by methods. The initial values - # here are to make demos easy; they would always be - # overridden in real life. - _x = 50, - _y = 50, - _length = 100, - - # public properties - visible = 1, - visibleAxis = 1, - visibleLabels = 1, - visibleTicks = 1, - visibleGrid = 0, - forceZero = 0, - - strokeWidth = 1, - strokeColor = STATE_DEFAULTS['strokeColor'], - strokeDashArray = STATE_DEFAULTS['strokeDashArray'], - strokeLineJoin = STATE_DEFAULTS['strokeLineJoin'], - strokeLineCap = STATE_DEFAULTS['strokeLineCap'], - strokeMiterLimit = STATE_DEFAULTS['strokeMiterLimit'], - gridStrokeWidth = 0.25, - gridStrokeColor = STATE_DEFAULTS['strokeColor'], - gridStrokeDashArray = STATE_DEFAULTS['strokeDashArray'], - gridStrokeLineJoin = STATE_DEFAULTS['strokeLineJoin'], - gridStrokeLineCap = STATE_DEFAULTS['strokeLineCap'], - gridStrokeMiterLimit = STATE_DEFAULTS['strokeMiterLimit'], - gridStart = None, - gridEnd = None, - drawGridLast = False, - visibleSubGrid = 0, - visibleSubTicks = 0, - subTickNum = 0, - subTickLo = 0, - subTickHi = 0, - subGridStrokeLineJoin = STATE_DEFAULTS['strokeLineJoin'], - subGridStrokeLineCap = STATE_DEFAULTS['strokeLineCap'], - subGridStrokeMiterLimit = STATE_DEFAULTS['strokeMiterLimit'], - subGridStrokeWidth = 0.25, - subGridStrokeColor = STATE_DEFAULTS['strokeColor'], - subGridStrokeDashArray = STATE_DEFAULTS['strokeDashArray'], - subGridStart = None, - subGridEnd = None, - labels = TypedPropertyCollection(Label), - keepTickLabelsInside = 0, - - # how close can the ticks be? - minimumTickSpacing = 10, - maximumTicks = 7, - - # a format string like '%0.2f' - # or a function which takes the value as an argument and returns a string - _labelTextFormat = None, - labelAxisMode = 'axis', - labelTextFormat = None, - labelTextPostFormat = None, - labelTextScale = None, - - # if set to None, these will be worked out for you. - # if you override any or all of them, your values - # will be used. - valueMin = None, - valueMax = None, - valueStep = None, - avoidBoundFrac = None, - avoidBoundSpace = None, - abf_ignore_zero = False, - rangeRound = 'none', - zrangePref = 0, - style = 'normal', - skipEndL='none', - origShiftIPC = None, - origShiftMin = None, - origShiftSpecialValue = None, - tickAxisMode = 'axis', - reverseDirection=0, - loLLen=0, - hiLLen=0, - requiredRange=0, - ) - self.labels.angle = 0 - - def setPosition(self, x, y, length): - # ensure floating point - self._x = float(x) - self._y = float(y) - self._length = float(length) - - def configure(self, dataSeries): - """Let the axis configure its scale and range based on the data. - - Called after setPosition. Let it look at a list of lists of - numbers determine the tick mark intervals. If valueMin, - valueMax and valueStep are configured then it - will use them; if any of them are set to None it - will look at the data and make some sensible decision. - You may override this to build custom axes with - irregular intervals. It creates an internal - variable self._values, which is a list of numbers - to use in plotting. - """ - self._setRange(dataSeries) - self._configure_end() - - def _configure_end(self): - self._calcTickmarkPositions() - self._calcScaleFactor() - self._configured = 1 - - def _getValueStepAndTicks(self, valueMin, valueMax,cache={}): - try: - K = (valueMin,valueMax) - r = cache[K] - except: - self._valueMin = valueMin - self._valueMax = valueMax - valueStep,T = self._calcStepAndTickPositions() - r = cache[K] = valueStep, T, valueStep*1e-8 - return r - - def _preRangeAdjust(self,valueMin,valueMax): - rr = self.requiredRange - if rr>0: - r = valueMax - valueMin - if r=100 and y1<100: - y2 = y2 + 100 - y1 - y1 = 100 - elif valueMin>=0 and y1<0: - y2 = y2 - y1 - y1 = 0 - valueMin = self._cValueMin = y1 - valueMax = self._cValueMax = y2 - return valueMin,valueMax - - - def _setRange(self, dataSeries): - """Set minimum and maximum axis values. - - The dataSeries argument is assumed to be a list of data - vectors. Each vector is itself a list or tuple of numbers. - - Returns a min, max tuple. - """ - - oMin = valueMin = self.valueMin - oMax = valueMax = self.valueMax - if valueMin is None: valueMin = self._cValueMin = _findMin(dataSeries,self._dataIndex,0) - if valueMax is None: valueMax = self._cValueMax = _findMax(dataSeries,self._dataIndex,0) - if valueMin == valueMax: - if valueMax==0: - if oMin is None and oMax is None: - zrp = getattr(self,'zrangePref',0) - if zrp>0: - valueMax = zrp - valueMin = 0 - elif zrp<0: - valueMax = 0 - valueMin = zrp - else: - valueMax = 0.01 - valueMin = -0.01 - elif self.valueMin is None: - valueMin = -0.01 - else: - valueMax = 0.01 - else: - if valueMax>0: - valueMax = 1.2*valueMax - valueMin = 0.0 - else: - valueMax = 0.0 - valueMin = 1.2*valueMin - - if getattr(self,'_bubblePlot',None): - bubbleMax = float(_findMax(dataSeries,2,0)) - frac=.25 - bubbleV=frac*(valueMax-valueMin) - self._bubbleV = bubbleV - self._bubbleMax = bubbleMax - self._bubbleRadius = frac*self._length - def special(T,x,func,bubbleV=bubbleV,bubbleMax=bubbleMax): - try: - v = T[2] - except IndexError: - v = bubbleMAx*0.1 - bubbleV *= (v/bubbleMax)**0.5 - return func(T[x]+bubbleV,T[x]-bubbleV) - if oMin is None: valueMin = self._cValueMin = _findMin(dataSeries,self._dataIndex,0,special=special) - if oMax is None: valueMax = self._cValueMax = _findMax(dataSeries,self._dataIndex,0,special=special) - - valueMin, valueMax = self._preRangeAdjust(valueMin,valueMax) - - rangeRound = self.rangeRound - - cMin = valueMin - cMax = valueMax - forceZero = self.forceZero - if forceZero: - if forceZero=='near': - forceZero = min(abs(valueMin),abs(valueMax)) <= 5*(valueMax-valueMin) - if forceZero: - if valueMax<0: valueMax=0 - elif valueMin>0: valueMin = 0 - - abf = self.avoidBoundFrac - do_rr = not getattr(self,'valueSteps',None) - do_abf = abf and do_rr - if not isSeq(abf): - abf = abf, abf - abfiz = getattr(self,'abf_ignore_zero', False) - if not isSeq(abfiz): - abfiz = abfiz, abfiz - do_rr = rangeRound is not 'none' and do_rr - if do_rr: - rrn = rangeRound in ['both','floor'] - rrx = rangeRound in ['both','ceiling'] - else: - rrn = rrx = 0 - - abS = self.avoidBoundSpace - do_abs = abS - if do_abs: - if not isSeq(abS): - abS = abS, abS - aL = float(self._length) - - go = do_rr or do_abf or do_abs - cache = {} - iter = 0 - while go and iter<=10: - iter += 1 - go = 0 - if do_abf or do_abs: - valueStep, T, fuzz = self._getValueStepAndTicks(valueMin, valueMax, cache) - if do_abf: - i0 = valueStep*abf[0] - i1 = valueStep*abf[1] - else: - i0 = i1 = 0 - if do_abs: - sf = (valueMax-valueMin)/aL - i0 = max(i0,abS[0]*sf) - i1 = max(i1,abS[1]*sf) - if rrn: v = T[0] - else: v = valueMin - u = cMin-i0 - if (abfiz[0] or abs(v)>fuzz) and v>=u+fuzz: - valueMin = u - go = 1 - if rrx: v = T[-1] - else: v = valueMax - u = cMax+i1 - if (abfiz[1] or abs(v)>fuzz) and v<=u-fuzz: - valueMax = u - go = 1 - - if do_rr: - valueStep, T, fuzz = self._getValueStepAndTicks(valueMin, valueMax, cache) - if rrn: - if valueMin=T[0]+fuzz - valueMin = T[0] - if rrx: - if valueMax>T[-1]+fuzz: - valueMax = T[-1]+valueStep - go = 1 - else: - go = valueMax<=T[-1]-fuzz - valueMax = T[-1] - if iter and not go: - self._computedValueStep = valueStep - else: - self._computedValueStep = None - - self._valueMin = valueMin - self._valueMax = valueMax - - origShiftIPC = self.origShiftIPC - origShiftMin = self.origShiftMin - if origShiftMin is not None or origShiftIPC is not None: - origShiftSpecialValue = self.origShiftSpecialValue - self._calcValueStep() - valueMax, valueMin = self._valueMax, self._valueMin - if origShiftSpecialValue is None or abs(origShiftSpecialValue-valueMin)<1e-6: - if origShiftIPC: - m = origShiftIPC*self._valueStep - else: - m = 0 - if origShiftMin: - m = max(m,(valueMax-valueMin)*origShiftMin/self._length) - self._valueMin -= m - - self._rangeAdjust() - - def _pseudo_configure(self): - self._valueMin = self.valueMin - self._valueMax = self.valueMax - self._configure_end() - - def _rangeAdjust(self): - """Override this if you want to alter the calculated range. - - E.g. if want a minumamum range of 30% or don't want 100% - as the first point. - """ - pass - - def _adjustAxisTicks(self): - '''Override if you want to put slack at the ends of the axis - eg if you don't want the last tick to be at the bottom etc - ''' - pass - - def _calcScaleFactor(self): - """Calculate the axis' scale factor. - This should be called only *after* the axis' range is set. - Returns a number. - """ - self._scaleFactor = self._length / float(self._valueMax - self._valueMin) - return self._scaleFactor - - def _calcStepAndTickPositions(self): - valueStep = getattr(self,'_computedValueStep',None) - if valueStep: - del self._computedValueStep - self._valueStep = valueStep - else: - self._calcValueStep() - valueStep = self._valueStep - valueMin = self._valueMin - valueMax = self._valueMax - fuzz = 1e-8*valueStep - rangeRound = self.rangeRound - i0 = int(float(valueMin)/valueStep) - v = i0*valueStep - if rangeRound in ('both','floor'): - if v>valueMin+fuzz: i0 -= 1 - elif vvalueMax+fuzz: i1 -= 1 - return valueStep,[i*valueStep for i in range(i0,i1+1)] - - def _calcTickPositions(self): - return self._calcStepAndTickPositions()[1] - - def _calcTickmarkPositions(self): - """Calculate a list of tick positions on the axis. Returns a list of numbers.""" - self._tickValues = getattr(self,'valueSteps',None) - if self._tickValues: return self._tickValues - self._tickValues = self._calcTickPositions() - self._adjustAxisTicks() - return self._tickValues - - def _calcValueStep(self): - '''Calculate _valueStep for the axis or get from valueStep.''' - if self.valueStep is None: - rawRange = self._valueMax - self._valueMin - rawInterval = rawRange / min(float(self.maximumTicks-1),(float(self._length)/self.minimumTickSpacing)) - self._valueStep = nextRoundNumber(rawInterval) - else: - self._valueStep = self.valueStep - - def _allIntTicks(self): - return _allInt(self._tickValues) - - def makeTickLabels(self): - g = Group() - if not self.visibleLabels: return g - - f = self._labelTextFormat # perhaps someone already set it - if f is None: - f = self.labelTextFormat or (self._allIntTicks() and '%.0f' or str) - elif f is str and self._allIntTicks(): f = '%.0f' - elif hasattr(f,'calcPlaces'): - f.calcPlaces(self._tickValues) - post = self.labelTextPostFormat - scl = self.labelTextScale - pos = [self._x, self._y] - d = self._dataIndex - pos[1-d] = self._labelAxisPos() - labels = self.labels - if self.skipEndL!='none': - if self.isXAxis: - sk = self._x - else: - sk = self._y - if self.skipEndL=='start': - sk = [sk] - else: - sk = [sk,sk+self._length] - if self.skipEndL=='end': - del sk[0] - else: - sk = [] - - nticks = len(self._tickValues) - nticks1 = nticks - 1 - for i,tick in enumerate(self._tickValues): - label = i-nticks - if label in labels: - label = labels[label] - else: - label = labels[i] - if f and label.visible: - v = self.scale(tick) - if sk: - for skv in sk: - if abs(skv-v)<1e-6: - v = None - break - if v is not None: - if scl is not None: - t = tick*scl - else: - t = tick - if isinstance(f, str): txt = f % t - elif isSeq(f): - #it's a list, use as many items as we get - if i < len(f): - txt = f[i] - else: - txt = '' - elif hasattr(f,'__call__'): - if isinstance(f,TickLabeller): - txt = f(self,t) - else: - txt = f(t) - else: - raise ValueError('Invalid labelTextFormat %s' % f) - if post: txt = post % txt - pos[d] = v - label.setOrigin(*pos) - label.setText(txt) - - #special property to ensure a label doesn't project beyond the bounds of an x-axis - if self.keepTickLabelsInside: - if isinstance(self, XValueAxis): #not done yet for y axes - a_x = self._x - if not i: #first one - x0, y0, x1, y1 = label.getBounds() - if x0 < a_x: - label = label.clone(dx=label.dx + a_x - x0) - if i==nticks1: #final one - a_x1 = a_x +self._length - x0, y0, x1, y1 = label.getBounds() - if x1 > a_x1: - label=label.clone(dx=label.dx-x1+a_x1) - g.add(label) - - return g - - def scale(self, value): - """Converts a numeric value to a plotarea position. - The chart first configures the axis, then asks it to - """ - assert self._configured, "Axis cannot scale numbers before it is configured" - if value is None: value = 0 - - #this could be made more efficient by moving the definition of org and sf into the configuration - org = (self._x, self._y)[self._dataIndex] - sf = self._scaleFactor - if self.reverseDirection: - sf = -sf - org += self._length - return org + sf*(value - self._valueMin) - -class XValueAxis(_XTicks,ValueAxis): - "X/value axis" - - _attrMap = AttrMap(BASE=ValueAxis, - tickUp = AttrMapValue(isNumber, - desc='Tick length up the axis.'), - tickDown = AttrMapValue(isNumber, - desc='Tick length down the axis.'), - joinAxis = AttrMapValue(None, - desc='Join both axes if true.'), - joinAxisMode = AttrMapValue(OneOf('bottom', 'top', 'value', 'points', None), - desc="Mode used for connecting axis ('bottom', 'top', 'value', 'points', None)."), - joinAxisPos = AttrMapValue(isNumberOrNone, - desc='Position at which to join with other axis.'), - ) - - # Indicate the dimension of the data we're interested in. - _dataIndex = 0 - - def __init__(self,**kw): - ValueAxis.__init__(self,**kw) - - self.labels.boxAnchor = 'n' - self.labels.dx = 0 - self.labels.dy = -5 - - self.tickUp = 0 - self.tickDown = 5 - - self.joinAxis = None - self.joinAxisMode = None - self.joinAxisPos = None - - def demo(self): - self.setPosition(20, 50, 150) - self.configure([(10,20,30,40,50)]) - - d = Drawing(200, 100) - d.add(self) - return d - - def joinToAxis(self, yAxis, mode='bottom', pos=None): - "Join with y-axis using some mode." - _assertYAxis(yAxis) - if mode == 'bottom': - self._y = yAxis._y * 1.0 - elif mode == 'top': - self._y = (yAxis._y + yAxis._length) * 1.0 - elif mode == 'value': - self._y = yAxis.scale(pos) * 1.0 - elif mode == 'points': - self._y = pos * 1.0 - - def _joinToAxis(self): - ja = self.joinAxis - if ja: - jam = self.joinAxisMode or 'bottom' - if jam in ('bottom', 'top'): - self.joinToAxis(ja, mode=jam) - elif jam in ('value', 'points'): - self.joinToAxis(ja, mode=jam, pos=self.joinAxisPos) - - def makeAxis(self): - g = Group() - self._joinToAxis() - if not self.visibleAxis: return g - - axis = Line(self._x-self.loLLen, self._y, self._x + self._length+self.hiLLen, self._y) - axis.strokeColor = self.strokeColor - axis.strokeWidth = self.strokeWidth - axis.strokeDashArray = self.strokeDashArray - g.add(axis) - - return g - -#additional utilities to help specify calendar dates on which tick marks -#are to be plotted. After some thought, when the magic algorithm fails, -#we can let them specify a number of days-of-the-year to tick in any given -#year. - -################################################################################# -# -# Preliminary support objects/functions for the axis used in time series charts -# -################################################################################# -_months = ['jan','feb','mar','apr','may','jun','jul','aug','sep','oct','nov','dec'] -_maxDays = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] -def parseDayAndMonth(dmstr): - """This accepts and validates strings like "31-Dec" i.e. dates - of no particular year. 29 Feb is allowed. These can be used - for recurring dates. It returns a (dd, mm) pair where mm is the - month integer. If the text is not valid it raises an error. - """ - - dstr, mstr = dmstr.split('-') - dd = int(dstr) - mstr = mstr.lower() - mm = _months.index(mstr) + 1 - assert dd <= _maxDays[mm-1] - return (dd, mm) - -class _isListOfDaysAndMonths(Validator): - """This accepts and validates lists of strings like "31-Dec" i.e. dates - of no particular year. 29 Feb is allowed. These can be used - for recurring dates. - """ - def test(self,x): - if isSeq(x): - answer = True - for element in x: - try: - dd, mm = parseDayAndMonth(element) - except: - answer = False - return answer - else: - return False - - def normalize(self,x): - #we store them as presented, it's the most presentable way - return x - -isListOfDaysAndMonths = _isListOfDaysAndMonths() - -_NDINTM = 1,2,3,6,12,24,60,120,180,240,300,360,420,480,540,600,720,840,960,1080,1200,2400 -class NormalDateXValueAxis(XValueAxis): - """An X axis applying additional rules. - - Depending on the data and some built-in rules, the axis - displays normalDate values as nicely formatted dates. - - The client chart should have NormalDate X values. - """ - - _attrMap = AttrMap(BASE = XValueAxis, - bottomAxisLabelSlack = AttrMapValue(isNumber, desc="Fractional amount used to adjust label spacing"), - niceMonth = AttrMapValue(isBoolean, desc="Flag for displaying months 'nicely'."), - forceEndDate = AttrMapValue(isBoolean, desc='Flag for enforced displaying of last date value.'), - forceFirstDate = AttrMapValue(isBoolean, desc='Flag for enforced displaying of first date value.'), - forceDatesEachYear = AttrMapValue(isListOfDaysAndMonths, desc='List of dates in format "31-Dec",' + - '"1-Jan". If present they will always be used for tick marks in the current year, rather ' + - 'than the dates chosen by the automatic algorithm. Hyphen compulsory, case of month optional.'), - xLabelFormat = AttrMapValue(None, desc="Label format string (e.g. '{mm}/{yy}') or function."), - dayOfWeekName = AttrMapValue(SequenceOf(isString,emptyOK=0,lo=7,hi=7), desc='Weekday names.'), - monthName = AttrMapValue(SequenceOf(isString,emptyOK=0,lo=12,hi=12), desc='Month names.'), - dailyFreq = AttrMapValue(isBoolean, desc='True if we are to assume daily data to be ticked at end of month.'), - specifiedTickDates = AttrMapValue(NoneOr(SequenceOf(isNormalDate)), desc='Actual tick values to use; no calculations done'), - specialTickClear = AttrMapValue(isBoolean, desc='clear rather than delete close ticks when forced first/end dates'), - skipGrid = AttrMapValue(OneOf('none','top','both','bottom'),"grid lines to skip top bottom both none"), - ) - - _valueClass = normalDate.ND - - def __init__(self,**kw): - XValueAxis.__init__(self,**kw) - - # some global variables still used... - self.bottomAxisLabelSlack = 0.1 - self.niceMonth = 1 - self.forceEndDate = 0 - self.forceFirstDate = 0 - self.forceDatesEachYear = [] - self.dailyFreq = 0 - self.xLabelFormat = "{mm}/{yy}" - self.dayOfWeekName = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] - self.monthName = ['January', 'February', 'March', 'April', 'May', 'June', 'July', - 'August', 'September', 'October', 'November', 'December'] - self.specialTickClear = 0 - self.valueSteps = self.specifiedTickDates = None - - def _scalar2ND(self, x): - "Convert a scalar to a NormalDate value." - d = self._valueClass() - d.normalize(x) - return d - - def _dateFormatter(self, v): - "Create a formatted label for some value." - if not isinstance(v,normalDate.NormalDate): - v = self._scalar2ND(v) - d, m = normalDate._dayOfWeekName, normalDate._monthName - try: - normalDate._dayOfWeekName, normalDate._monthName = self.dayOfWeekName, self.monthName - return v.formatMS(self.xLabelFormat) - finally: - normalDate._dayOfWeekName, normalDate._monthName = d, m - - def _xAxisTicker(self, xVals): - """Complex stuff... - - Needs explanation... - - Yes please says Andy :-(. Modified on 19 June 2006 to attempt to allow - a mode where one can specify recurring days and months. - """ - axisLength = self._length - formatter = self._dateFormatter - if isinstance(formatter,TickLabeller): - def formatter(tick): - return self._dateFormatter(self,tick) - firstDate = xVals[0] - endDate = xVals[-1] - labels = self.labels - fontName, fontSize, leading = labels.fontName, labels.fontSize, labels.leading - textAnchor, boxAnchor, angle = labels.textAnchor, labels.boxAnchor, labels.angle - RBL = _textBoxLimits(formatter(firstDate).split('\n'),fontName, - fontSize,leading or 1.2*fontSize,textAnchor,boxAnchor) - RBL = _rotatedBoxLimits(RBL[0],RBL[1],RBL[2],RBL[3], angle) - xLabelW = RBL[1]-RBL[0] - xLabelH = RBL[3]-RBL[2] - w = max(xLabelW,labels.width,self.minimumTickSpacing) - - W = w+w*self.bottomAxisLabelSlack - n = len(xVals) - ticks = [] - labels = [] - maximumTicks = self.maximumTicks - - if self.specifiedTickDates: - VC = self._valueClass - ticks = [VC(x) for x in self.specifiedTickDates] - labels = [formatter(d) for d in ticks] - if self.forceFirstDate and firstDate==ticks[0] and (axisLength/float(ticks[-1]-ticks[0]))*(ticks[1]-ticks[0])<=W: - if self.specialTickClear: - labels[1] = '' - else: - del ticks[1], labels[1] - if self.forceEndDate and endDate==ticks[-1] and (axisLength/float(ticks[-1]-ticks[0]))*(ticks[-1]-ticks[-2])<=W: - if self.specialTickClear: - labels[-2] = '' - else: - del ticks[-2], labels[-2] - return ticks, labels - - def addTick(i, xVals=xVals, formatter=formatter, ticks=ticks, labels=labels): - ticks.insert(0,xVals[i]) - labels.insert(0,formatter(xVals[i])) - - #AR 20060619 - first we try the approach where the user has explicitly - #specified the days of year to be ticked. Other explicit routes may - #be added. - if self.forceDatesEachYear: - forcedPartialDates = list(map(parseDayAndMonth, self.forceDatesEachYear)) - #generate the list of dates in the range. - #print 'dates range from %s to %s' % (firstDate, endDate) - firstYear = firstDate.year() - lastYear = endDate.year() - ticks = [] - labels = [] - yyyy = firstYear - #generate all forced dates between the year it starts and the year it - #ends, adding them if within range. - while yyyy <= lastYear: - for (dd, mm) in forcedPartialDates: - theDate = normalDate.ND((yyyy, mm, dd)) - if theDate >= firstDate and theDate <= endDate: - ticks.append(theDate) - labels.append(formatter(theDate)) - yyyy += 1 - - #first and last may still be forced in. - if self.forceFirstDate and firstDate!=ticks[0]: - ticks.insert(0, firstDate) - labels.insert(0,formatter(firstDate)) - if (axisLength/float(ticks[-1]-ticks[0]))*(ticks[1]-ticks[0])<=W: - if self.specialTickClear: - labels[1] = '' - else: - del ticks[1], labels[1] - if self.forceEndDate and endDate!=ticks[-1]: - ticks.append(endDate) - labels.append(formatter(endDate)) - if (axisLength/float(ticks[-1]-ticks[0]))*(ticks[-1]-ticks[-2])<=W: - if self.specialTickClear: - labels[-2] = '' - else: - del ticks[-2], labels[-2] - - #print 'xVals found on forced dates =', ticks - return ticks, labels - - #otherwise, we apply the 'magic algorithm...' which looks for nice spacing - #based on the size and separation of the labels. - for d in _NDINTM: - k = n/d - if k<=maximumTicks and k*W <= axisLength: - i = n-1 - if self.niceMonth: - j = endDate.month() % (d<=12 and d or 12) - if j: - if self.forceEndDate: - addTick(i) - ticks[0]._doSubTicks=0 - i -= j - - #weird first date ie not at end of month - try: - wfd = firstDate.month() == xVals[1].month() - except: - wfd = 0 - - while i>=wfd: - addTick(i) - i -= d - - if self.forceFirstDate and ticks[0]!=firstDate: - addTick(0) - ticks[0]._doSubTicks=0 - if (axisLength/float(ticks[-1]-ticks[0]))*(ticks[1]-ticks[0])<=W: - if self.specialTickClear: - labels[1] = '' - else: - del ticks[1], labels[1] - if self.forceEndDate and self.niceMonth and j: - if (axisLength/float(ticks[-1]-ticks[0]))*(ticks[-1]-ticks[-2])<=W: - if self.specialTickClear: - labels[-2] = '' - else: - del ticks[-2], labels[-2] - try: - if labels[0] and labels[0]==labels[1]: - del ticks[1], labels[1] - except IndexError: - pass - - return ticks, labels - raise ValueError('Problem selecting NormalDate value axis tick positions') - - def _convertXV(self,data): - '''Convert all XValues to a standard normalDate type''' - - VC = self._valueClass - for D in data: - for i in range(len(D)): - x, y = D[i] - if not isinstance(x,VC): - D[i] = (VC(x),y) - - def _getStepsAndLabels(self,xVals): - if self.dailyFreq: - xEOM = [] - pm = 0 - px = xVals[0] - for x in xVals: - m = x.month() - if pm!=m: - if pm: xEOM.append(px) - pm = m - px = x - px = xVals[-1] - if xEOM[-1]!=x: xEOM.append(px) - steps, labels = self._xAxisTicker(xEOM) - else: - steps, labels = self._xAxisTicker(xVals) - return steps, labels - - def configure(self, data): - self._convertXV(data) - xVals = set() - for x in data: - for dv in x: - xVals.add(dv[0]) - xVals = list(xVals) - xVals.sort() - steps,labels = self._getStepsAndLabels(xVals) - valueMin, valueMax = self.valueMin, self.valueMax - if valueMin is None: valueMin = xVals[0] - if valueMax is None: valueMax = xVals[-1] - self._valueMin, self._valueMax = valueMin, valueMax - self._tickValues = steps - self._labelTextFormat = labels - - self._scaleFactor = self._length / float(valueMax - valueMin) - self._tickValues = steps - self._configured = 1 - -class YValueAxis(_YTicks,ValueAxis): - "Y/value axis" - - _attrMap = AttrMap(BASE=ValueAxis, - tickLeft = AttrMapValue(isNumber, - desc='Tick length left of the axis.'), - tickRight = AttrMapValue(isNumber, - desc='Tick length right of the axis.'), - joinAxis = AttrMapValue(None, - desc='Join both axes if true.'), - joinAxisMode = AttrMapValue(OneOf(('left', 'right', 'value', 'points', None)), - desc="Mode used for connecting axis ('left', 'right', 'value', 'points', None)."), - joinAxisPos = AttrMapValue(isNumberOrNone, - desc='Position at which to join with other axis.'), - ) - - # Indicate the dimension of the data we're interested in. - _dataIndex = 1 - - def __init__(self): - ValueAxis.__init__(self) - - self.labels.boxAnchor = 'e' - self.labels.dx = -5 - self.labels.dy = 0 - - self.tickRight = 0 - self.tickLeft = 5 - - self.joinAxis = None - self.joinAxisMode = None - self.joinAxisPos = None - - def demo(self): - data = [(10, 20, 30, 42)] - self.setPosition(100, 10, 80) - self.configure(data) - - drawing = Drawing(200, 100) - drawing.add(self) - return drawing - - def joinToAxis(self, xAxis, mode='left', pos=None): - "Join with x-axis using some mode." - _assertXAxis(xAxis) - if mode == 'left': - self._x = xAxis._x * 1.0 - elif mode == 'right': - self._x = (xAxis._x + xAxis._length) * 1.0 - elif mode == 'value': - self._x = xAxis.scale(pos) * 1.0 - elif mode == 'points': - self._x = pos * 1.0 - - def _joinToAxis(self): - ja = self.joinAxis - if ja: - jam = self.joinAxisMode - if jam in ('left', 'right'): - self.joinToAxis(ja, mode=jam) - elif jam in ('value', 'points'): - self.joinToAxis(ja, mode=jam, pos=self.joinAxisPos) - - def makeAxis(self): - g = Group() - self._joinToAxis() - if not self.visibleAxis: return g - - axis = Line(self._x, self._y-self.loLLen, self._x, self._y + self._length+self.hiLLen) - axis.strokeColor = self.strokeColor - axis.strokeWidth = self.strokeWidth - axis.strokeDashArray = self.strokeDashArray - g.add(axis) - return g - -class AdjYValueAxis(YValueAxis): - """A Y-axis applying additional rules. - - Depending on the data and some built-in rules, the axis - may choose to adjust its range and origin. - """ - _attrMap = AttrMap(BASE = YValueAxis, - leftAxisPercent = AttrMapValue(isBoolean, desc='When true add percent sign to label values.'), - leftAxisOrigShiftIPC = AttrMapValue(isNumber, desc='Lowest label shift interval ratio.'), - leftAxisOrigShiftMin = AttrMapValue(isNumber, desc='Minimum amount to shift.'), - leftAxisSkipLL0 = AttrMapValue(EitherOr((isBoolean,isListOfNumbers)), desc='Skip/Keep lowest tick label when true/false.\nOr skiplist'), - labelVOffset = AttrMapValue(isNumber, desc='add this to the labels'), - ) - - def __init__(self,**kw): - YValueAxis.__init__(self,**kw) - self.requiredRange = 30 - self.leftAxisPercent = 1 - self.leftAxisOrigShiftIPC = 0.15 - self.leftAxisOrigShiftMin = 12 - self.leftAxisSkipLL0 = self.labelVOffset = 0 - self.valueSteps = None - - def _rangeAdjust(self): - "Adjusts the value range of the axis." - - from reportlab.graphics.charts.utils import find_good_grid, ticks - y_min, y_max = self._valueMin, self._valueMax - m = self.maximumTicks - n = list(filter(lambda x,m=m: x<=m,[4,5,6,7,8,9])) - if not n: n = [m] - - valueStep, requiredRange = self.valueStep, self.requiredRange - if requiredRange and y_max - y_min < requiredRange: - y1, y2 = find_good_grid(y_min, y_max,n=n,grid=valueStep)[:2] - if y2 - y1 < requiredRange: - ym = (y1+y2)*0.5 - y1 = min(ym-requiredRange*0.5,y_min) - y2 = max(ym+requiredRange*0.5,y_max) - if y_min>=100 and y1<100: - y2 = y2 + 100 - y1 - y1 = 100 - elif y_min>=0 and y1<0: - y2 = y2 - y1 - y1 = 0 - self._valueMin, self._valueMax = y1, y2 - - T, L = ticks(self._valueMin, self._valueMax, split=1, n=n, percent=self.leftAxisPercent,grid=valueStep, labelVOffset=self.labelVOffset) - abf = self.avoidBoundFrac - if abf: - i1 = (T[1]-T[0]) - if not isSeq(abf): - i0 = i1 = i1*abf - else: - i0 = i1*abf[0] - i1 = i1*abf[1] - _n = getattr(self,'_cValueMin',T[0]) - _x = getattr(self,'_cValueMax',T[-1]) - if _n - T[0] < i0: self._valueMin = self._valueMin - i0 - if T[-1]-_x < i1: self._valueMax = self._valueMax + i1 - T, L = ticks(self._valueMin, self._valueMax, split=1, n=n, percent=self.leftAxisPercent,grid=valueStep, labelVOffset=self.labelVOffset) - - self._valueMin = T[0] - self._valueMax = T[-1] - self._tickValues = T - if self.labelTextFormat is None: - self._labelTextFormat = L - else: - self._labelTextFormat = self.labelTextFormat - - if abs(self._valueMin-100)<1e-6: - self._calcValueStep() - vMax, vMin = self._valueMax, self._valueMin - m = max(self.leftAxisOrigShiftIPC*self._valueStep, - (vMax-vMin)*self.leftAxisOrigShiftMin/self._length) - self._valueMin = self._valueMin - m - - if self.leftAxisSkipLL0: - if isSeq(self.leftAxisSkipLL0): - for x in self.leftAxisSkipLL0: - try: - L[x] = '' - except IndexError: - pass - L[0] = '' - -# Sample functions. -def sample0a(): - "Sample drawing with one xcat axis and two buckets." - - drawing = Drawing(400, 200) - - data = [(10, 20)] - - xAxis = XCategoryAxis() - xAxis.setPosition(75, 75, 300) - xAxis.configure(data) - xAxis.categoryNames = ['Ying', 'Yang'] - xAxis.labels.boxAnchor = 'n' - drawing.add(xAxis) - return drawing - -def sample0b(): - "Sample drawing with one xcat axis and one bucket only." - - drawing = Drawing(400, 200) - - data = [(10,)] - - xAxis = XCategoryAxis() - xAxis.setPosition(75, 75, 300) - xAxis.configure(data) - xAxis.categoryNames = ['Ying'] - xAxis.labels.boxAnchor = 'n' - drawing.add(xAxis) - return drawing - -def sample1(): - "Sample drawing containing two unconnected axes." - from reportlab.graphics.shapes import _baseGFontNameB - drawing = Drawing(400, 200) - data = [(10, 20, 30, 42)] - xAxis = XCategoryAxis() - xAxis.setPosition(75, 75, 300) - xAxis.configure(data) - xAxis.categoryNames = ['Beer','Wine','Meat','Cannelloni'] - xAxis.labels.boxAnchor = 'n' - xAxis.labels[3].dy = -15 - xAxis.labels[3].angle = 30 - xAxis.labels[3].fontName = _baseGFontNameB - yAxis = YValueAxis() - yAxis.setPosition(50, 50, 125) - yAxis.configure(data) - drawing.add(xAxis) - drawing.add(yAxis) - return drawing - -def sample4a(): - "Sample drawing, xvalue/yvalue axes, y connected at 100 pts to x." - drawing = Drawing(400, 200) - data = [(10, 20, 30, 42)] - yAxis = YValueAxis() - yAxis.setPosition(50, 50, 125) - yAxis.configure(data) - xAxis = XValueAxis() - xAxis._length = 300 - xAxis.joinAxis = yAxis - xAxis.joinAxisMode = 'points' - xAxis.joinAxisPos = 100 - xAxis.configure(data) - drawing.add(xAxis) - drawing.add(yAxis) - return drawing - -def sample4b(): - "Sample drawing, xvalue/yvalue axes, y connected at value 35 of x." - drawing = Drawing(400, 200) - data = [(10, 20, 30, 42)] - yAxis = YValueAxis() - yAxis.setPosition(50, 50, 125) - yAxis.configure(data) - xAxis = XValueAxis() - xAxis._length = 300 - xAxis.joinAxis = yAxis - xAxis.joinAxisMode = 'value' - xAxis.joinAxisPos = 35 - xAxis.configure(data) - drawing.add(xAxis) - drawing.add(yAxis) - return drawing - -def sample4c(): - "Sample drawing, xvalue/yvalue axes, y connected to bottom of x." - drawing = Drawing(400, 200) - data = [(10, 20, 30, 42)] - yAxis = YValueAxis() - yAxis.setPosition(50, 50, 125) - yAxis.configure(data) - xAxis = XValueAxis() - xAxis._length = 300 - xAxis.joinAxis = yAxis - xAxis.joinAxisMode = 'bottom' - xAxis.configure(data) - drawing.add(xAxis) - drawing.add(yAxis) - return drawing - -def sample4c1(): - "xvalue/yvalue axes, without drawing axis lines/ticks." - drawing = Drawing(400, 200) - data = [(10, 20, 30, 42)] - yAxis = YValueAxis() - yAxis.setPosition(50, 50, 125) - yAxis.configure(data) - yAxis.visibleAxis = 0 - yAxis.visibleTicks = 0 - xAxis = XValueAxis() - xAxis._length = 300 - xAxis.joinAxis = yAxis - xAxis.joinAxisMode = 'bottom' - xAxis.configure(data) - xAxis.visibleAxis = 0 - xAxis.visibleTicks = 0 - drawing.add(xAxis) - drawing.add(yAxis) - return drawing - -def sample4d(): - "Sample drawing, xvalue/yvalue axes, y connected to top of x." - drawing = Drawing(400, 200) - data = [(10, 20, 30, 42)] - yAxis = YValueAxis() - yAxis.setPosition(50, 50, 125) - yAxis.configure(data) - xAxis = XValueAxis() - xAxis._length = 300 - xAxis.joinAxis = yAxis - xAxis.joinAxisMode = 'top' - xAxis.configure(data) - drawing.add(xAxis) - drawing.add(yAxis) - return drawing - -def sample5a(): - "Sample drawing, xvalue/yvalue axes, y connected at 100 pts to x." - drawing = Drawing(400, 200) - data = [(10, 20, 30, 42)] - xAxis = XValueAxis() - xAxis.setPosition(50, 50, 300) - xAxis.configure(data) - yAxis = YValueAxis() - yAxis.setPosition(50, 50, 125) - yAxis.joinAxis = xAxis - yAxis.joinAxisMode = 'points' - yAxis.joinAxisPos = 100 - yAxis.configure(data) - drawing.add(xAxis) - drawing.add(yAxis) - return drawing - -def sample5b(): - "Sample drawing, xvalue/yvalue axes, y connected at value 35 of x." - drawing = Drawing(400, 200) - data = [(10, 20, 30, 42)] - xAxis = XValueAxis() - xAxis.setPosition(50, 50, 300) - xAxis.configure(data) - yAxis = YValueAxis() - yAxis.setPosition(50, 50, 125) - yAxis.joinAxis = xAxis - yAxis.joinAxisMode = 'value' - yAxis.joinAxisPos = 35 - yAxis.configure(data) - drawing.add(xAxis) - drawing.add(yAxis) - return drawing - -def sample5c(): - "Sample drawing, xvalue/yvalue axes, y connected at right of x." - drawing = Drawing(400, 200) - data = [(10, 20, 30, 42)] - xAxis = XValueAxis() - xAxis.setPosition(50, 50, 300) - xAxis.configure(data) - yAxis = YValueAxis() - yAxis.setPosition(50, 50, 125) - yAxis.joinAxis = xAxis - yAxis.joinAxisMode = 'right' - yAxis.configure(data) - drawing.add(xAxis) - drawing.add(yAxis) - return drawing - -def sample5d(): - "Sample drawing, xvalue/yvalue axes, y connected at left of x." - drawing = Drawing(400, 200) - data = [(10, 20, 30, 42)] - xAxis = XValueAxis() - xAxis.setPosition(50, 50, 300) - xAxis.configure(data) - yAxis = YValueAxis() - yAxis.setPosition(50, 50, 125) - yAxis.joinAxis = xAxis - yAxis.joinAxisMode = 'left' - yAxis.configure(data) - drawing.add(xAxis) - drawing.add(yAxis) - return drawing - -def sample6a(): - "Sample drawing, xcat/yvalue axes, x connected at top of y." - drawing = Drawing(400, 200) - data = [(10, 20, 30, 42)] - yAxis = YValueAxis() - yAxis.setPosition(50, 50, 125) - yAxis.configure(data) - xAxis = XCategoryAxis() - xAxis._length = 300 - xAxis.configure(data) - xAxis.joinAxis = yAxis - xAxis.joinAxisMode = 'top' - xAxis.categoryNames = ['Beer', 'Wine', 'Meat', 'Cannelloni'] - xAxis.labels.boxAnchor = 'n' - drawing.add(xAxis) - drawing.add(yAxis) - return drawing - -def sample6b(): - "Sample drawing, xcat/yvalue axes, x connected at bottom of y." - drawing = Drawing(400, 200) - data = [(10, 20, 30, 42)] - yAxis = YValueAxis() - yAxis.setPosition(50, 50, 125) - yAxis.configure(data) - xAxis = XCategoryAxis() - xAxis._length = 300 - xAxis.configure(data) - xAxis.joinAxis = yAxis - xAxis.joinAxisMode = 'bottom' - xAxis.categoryNames = ['Beer', 'Wine', 'Meat', 'Cannelloni'] - xAxis.labels.boxAnchor = 'n' - drawing.add(xAxis) - drawing.add(yAxis) - return drawing - -def sample6c(): - "Sample drawing, xcat/yvalue axes, x connected at 100 pts to y." - drawing = Drawing(400, 200) - data = [(10, 20, 30, 42)] - yAxis = YValueAxis() - yAxis.setPosition(50, 50, 125) - yAxis.configure(data) - xAxis = XCategoryAxis() - xAxis._length = 300 - xAxis.configure(data) - xAxis.joinAxis = yAxis - xAxis.joinAxisMode = 'points' - xAxis.joinAxisPos = 100 - xAxis.categoryNames = ['Beer', 'Wine', 'Meat', 'Cannelloni'] - xAxis.labels.boxAnchor = 'n' - drawing.add(xAxis) - drawing.add(yAxis) - return drawing - -def sample6d(): - "Sample drawing, xcat/yvalue axes, x connected at value 20 of y." - drawing = Drawing(400, 200) - data = [(10, 20, 30, 42)] - yAxis = YValueAxis() - yAxis.setPosition(50, 50, 125) - yAxis.configure(data) - xAxis = XCategoryAxis() - xAxis._length = 300 - xAxis.configure(data) - xAxis.joinAxis = yAxis - xAxis.joinAxisMode = 'value' - xAxis.joinAxisPos = 20 - xAxis.categoryNames = ['Beer', 'Wine', 'Meat', 'Cannelloni'] - xAxis.labels.boxAnchor = 'n' - drawing.add(xAxis) - drawing.add(yAxis) - return drawing - -def sample7a(): - "Sample drawing, xvalue/ycat axes, y connected at right of x." - drawing = Drawing(400, 200) - data = [(10, 20, 30, 42)] - xAxis = XValueAxis() - xAxis._length = 300 - xAxis.configure(data) - yAxis = YCategoryAxis() - yAxis.setPosition(50, 50, 125) - yAxis.joinAxis = xAxis - yAxis.joinAxisMode = 'right' - yAxis.categoryNames = ['Beer', 'Wine', 'Meat', 'Cannelloni'] - yAxis.labels.boxAnchor = 'e' - yAxis.configure(data) - drawing.add(xAxis) - drawing.add(yAxis) - return drawing - -def sample7b(): - "Sample drawing, xvalue/ycat axes, y connected at left of x." - drawing = Drawing(400, 200) - data = [(10, 20, 30, 42)] - xAxis = XValueAxis() - xAxis._length = 300 - xAxis.configure(data) - yAxis = YCategoryAxis() - yAxis.setPosition(50, 50, 125) - yAxis.joinAxis = xAxis - yAxis.joinAxisMode = 'left' - yAxis.categoryNames = ['Beer', 'Wine', 'Meat', 'Cannelloni'] - yAxis.labels.boxAnchor = 'e' - yAxis.configure(data) - drawing.add(xAxis) - drawing.add(yAxis) - return drawing - -def sample7c(): - "Sample drawing, xvalue/ycat axes, y connected at value 30 of x." - drawing = Drawing(400, 200) - data = [(10, 20, 30, 42)] - xAxis = XValueAxis() - xAxis._length = 300 - xAxis.configure(data) - yAxis = YCategoryAxis() - yAxis.setPosition(50, 50, 125) - yAxis.joinAxis = xAxis - yAxis.joinAxisMode = 'value' - yAxis.joinAxisPos = 30 - yAxis.categoryNames = ['Beer', 'Wine', 'Meat', 'Cannelloni'] - yAxis.labels.boxAnchor = 'e' - yAxis.configure(data) - drawing.add(xAxis) - drawing.add(yAxis) - return drawing - -def sample7d(): - "Sample drawing, xvalue/ycat axes, y connected at 200 pts to x." - drawing = Drawing(400, 200) - data = [(10, 20, 30, 42)] - xAxis = XValueAxis() - xAxis._length = 300 - xAxis.configure(data) - yAxis = YCategoryAxis() - yAxis.setPosition(50, 50, 125) - yAxis.joinAxis = xAxis - yAxis.joinAxisMode = 'points' - yAxis.joinAxisPos = 200 - yAxis.categoryNames = ['Beer', 'Wine', 'Meat', 'Cannelloni'] - yAxis.labels.boxAnchor = 'e' - yAxis.configure(data) - drawing.add(xAxis) - drawing.add(yAxis) - return drawing diff --git a/reportlab/graphics/charts/barcharts.py b/reportlab/graphics/charts/barcharts.py deleted file mode 100644 index 86a52eaa..00000000 --- a/reportlab/graphics/charts/barcharts.py +++ /dev/null @@ -1,2298 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/barcharts.py -__version__=''' $Id$ ''' -__doc__="""This module defines a variety of Bar Chart components. - -The basic flavors are stacked and side-by-side, available in horizontal and -vertical versions. - -""" - -import copy, functools - -from reportlab.lib import colors -from reportlab.lib.validators import isNumber, isNumberOrNone, isColor, isColorOrNone, isString,\ - isListOfStrings, SequenceOf, isBoolean, isNoneOrShape, isStringOrNone,\ - NoneOr, isListOfNumbersOrNone, EitherOr, OneOf -from reportlab.graphics.widgets.markers import uSymbol2Symbol, isSymbol -from reportlab.lib.formatters import Formatter -from reportlab.lib.attrmap import AttrMap, AttrMapValue -from reportlab.pdfbase.pdfmetrics import stringWidth -from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection, PropHolder -from reportlab.graphics.shapes import Line, Rect, Group, Drawing, NotImplementedError -from reportlab.graphics.charts.axes import XCategoryAxis, YValueAxis, YCategoryAxis, XValueAxis -from reportlab.graphics.charts.textlabels import BarChartLabel, NA_Label, NoneOrInstanceOfNA_Label -from reportlab.graphics.charts.areas import PlotArea -from reportlab.graphics.charts.legends import _objStr - -class BarChartProperties(PropHolder): - _attrMap = AttrMap( - strokeColor = AttrMapValue(isColorOrNone, desc='Color of the bar border.'), - fillColor = AttrMapValue(isColorOrNone, desc='Color of the bar interior area.'), - strokeWidth = AttrMapValue(isNumber, desc='Width of the bar border.'), - strokeDashArray = AttrMapValue(isListOfNumbersOrNone, desc='Dash array of a line.'), - symbol = AttrMapValue(None, desc='A widget to be used instead of a normal bar.',advancedUsage=1), - name = AttrMapValue(isString, desc='Text to be associated with a bar (eg seriesname)'), - swatchMarker = AttrMapValue(NoneOr(isSymbol), desc="None or makeMarker('Diamond') ...",advancedUsage=1), - minDimen = AttrMapValue(isNumberOrNone, desc='minimum width/height that will be drawn.'), - ) - - def __init__(self): - self.strokeColor = None - self.fillColor = colors.blue - self.strokeWidth = 0.5 - self.symbol = None - self.strokeDashArray = None - -# Bar chart classes. -class BarChart(PlotArea): - "Abstract base class, unusable by itself." - - _attrMap = AttrMap(BASE=PlotArea, - useAbsolute = AttrMapValue(EitherOr((isBoolean,EitherOr((isString,isNumber)))), desc='Flag to use absolute spacing values; use string of gsb for finer control\n(g=groupSpacing,s=barSpacing,b=barWidth).',advancedUsage=1), - barWidth = AttrMapValue(isNumber, desc='The width of an individual bar.'), - groupSpacing = AttrMapValue(isNumber, desc='Width between groups of bars.'), - barSpacing = AttrMapValue(isNumber, desc='Width between individual bars.'), - bars = AttrMapValue(None, desc='Handle of the individual bars.'), - valueAxis = AttrMapValue(None, desc='Handle of the value axis.'), - categoryAxis = AttrMapValue(None, desc='Handle of the category axis.'), - data = AttrMapValue(None, desc='Data to be plotted, list of (lists of) numbers.'), - barLabels = AttrMapValue(None, desc='Handle to the list of bar labels.'), - barLabelFormat = AttrMapValue(None, desc='Formatting string or function used for bar labels.'), - barLabelCallOut = AttrMapValue(None, desc='Callout function(label)\nlabel._callOutInfo = (self,g,rowNo,colNo,x,y,width,height,x00,y00,x0,y0)',advancedUsage=1), - barLabelArray = AttrMapValue(None, desc='explicit array of bar label values, must match size of data if present.'), - reversePlotOrder = AttrMapValue(isBoolean, desc='If true, reverse common category plot order.',advancedUsage=1), - naLabel = AttrMapValue(NoneOrInstanceOfNA_Label, desc='Label to use for N/A values.',advancedUsage=1), - annotations = AttrMapValue(None, desc='list of callables, will be called with self, xscale, yscale.'), - categoryLabelBarSize = AttrMapValue(isNumber, desc='width to leave for a category label to go between categories.'), - categoryLabelBarOrder = AttrMapValue(OneOf('first','last','auto'), desc='where any label bar should appear first/last'), - barRecord = AttrMapValue(None, desc='callable(bar,label=labelText,value=value,**kwds) to record bar information', advancedUsage=1), - zIndexOverrides = AttrMapValue(isStringOrNone, desc='''None (the default ie use old z ordering scheme) or a ',' separated list of key=value (int/float) for new zIndex ordering. If used defaults are - background=0, - categoryAxis=1, - valueAxis=2, - bars=3, - barLabels=4, - categoryAxisGrid=5, - valueAxisGrid=6, - annotations=7'''), - categoryNALabel = AttrMapValue(NoneOrInstanceOfNA_Label, desc='Label to use for a group of N/A values.',advancedUsage=1), - ) - - def makeSwatchSample(self, rowNo, x, y, width, height): - baseStyle = self.bars - styleIdx = rowNo % len(baseStyle) - style = baseStyle[styleIdx] - strokeColor = getattr(style, 'strokeColor', getattr(baseStyle,'strokeColor',None)) - fillColor = getattr(style, 'fillColor', getattr(baseStyle,'fillColor',None)) - strokeDashArray = getattr(style, 'strokeDashArray', getattr(baseStyle,'strokeDashArray',None)) - strokeWidth = getattr(style, 'strokeWidth', getattr(style, 'strokeWidth',None)) - swatchMarker = getattr(style, 'swatchMarker', getattr(baseStyle, 'swatchMarker',None)) - if swatchMarker: - return uSymbol2Symbol(swatchMarker,x+width/2.,y+height/2.,fillColor) - return Rect(x,y,width,height,strokeWidth=strokeWidth,strokeColor=strokeColor, - strokeDashArray=strokeDashArray,fillColor=fillColor) - - def getSeriesName(self,i,default=None): - '''return series name i or default''' - return _objStr(getattr(self.bars[i],'name',default)) - - def __init__(self): - assert self.__class__.__name__ not in ('BarChart','BarChart3D'), 'Abstract Class %s Instantiated' % self.__class__.__name__ - - if self._flipXY: - self.categoryAxis = YCategoryAxis() - self.valueAxis = XValueAxis() - else: - self.categoryAxis = XCategoryAxis() - self.valueAxis = YValueAxis() - - PlotArea.__init__(self) - self.barSpacing = 0 - self.reversePlotOrder = 0 - - - # this defines two series of 3 points. Just an example. - self.data = [(100,110,120,130), - (70, 80, 85, 90)] - - # control bar spacing. is useAbsolute = 1 then - # the next parameters are in points; otherwise - # they are 'proportions' and are normalized to - # fit the available space. Half a barSpacing - # is allocated at the beginning and end of the - # chart. - self.useAbsolute = 0 #- not done yet - self.barWidth = 10 - self.groupSpacing = 5 - self.barSpacing = 0 - - self.barLabels = TypedPropertyCollection(BarChartLabel) - self.barLabels.boxAnchor = 'c' - self.barLabels.textAnchor = 'middle' - self.barLabelFormat = None - self.barLabelArray = None - # this says whether the origin is inside or outside - # the bar - +10 means put the origin ten points - # above the tip of the bar if value > 0, or ten - # points inside if bar value < 0. This is different - # to label dx/dy which are not dependent on the - # sign of the data. - self.barLabels.nudge = 0 - - # if you have multiple series, by default they butt - # together. - - # we really need some well-designed default lists of - # colors e.g. from Tufte. These will be used in a - # cycle to set the fill color of each series. - self.bars = TypedPropertyCollection(BarChartProperties) - self.bars.strokeWidth = 1 - self.bars.strokeColor = colors.black - self.bars.strokeDashArray = None - - self.bars[0].fillColor = colors.red - self.bars[1].fillColor = colors.green - self.bars[2].fillColor = colors.blue - self.naLabel = self.categoryNALabel = None - self.zIndexOverrides = None - - def demo(self): - """Shows basic use of a bar chart""" - if self.__class__.__name__=='BarChart': - raise NotImplementedError('Abstract Class BarChart has no demo') - drawing = Drawing(200, 100) - bc = self.__class__() - drawing.add(bc) - return drawing - - def _getConfigureData(self): - cA = self.categoryAxis - data = self.data - if cA.style not in ('parallel','parallel_3d'): - _data = data - data = max(list(map(len,_data)))*[0] - ndata = data[:] - for d in _data: - for i in xrange(len(d)): - v = d[i] or 0 - if v<=-1e-6: - ndata[i] += v - else: - data[i] += v - data = list(_data) + [data] + [ndata] - self._configureData = data - - def _getMinMax(self): - '''Attempt to return the data range''' - self._getConfigureData() - self.valueAxis._setRange(self._configureData) - return self.valueAxis._valueMin, self.valueAxis._valueMax - - def _drawBegin(self,org,length): - '''Position and configure value axis, return crossing value''' - vA = self.valueAxis - vA.setPosition(self.x, self.y, length) - self._getConfigureData() - vA.configure(self._configureData) - - # if zero is in chart, put the other axis there, otherwise use low - crossesAt = vA.scale(0) - if crossesAt > org+length or crossesAtbaseLine: y = baseLine - accumNeg[colNo] = accumNeg[colNo] + datum - datum = accumNeg[colNo] - else: - y = vScale(accumPos[colNo]) - if y=0 and 1 or -1)*nudge - if bt=='mid': - b = y+height*0.5 - elif bt=='hi': - if value>=0: - b = y + value + nudge - else: - b = y - nudge - pm = -pm - elif bt=='lo': - if value<=0: - b = y + value + nudge - else: - b = y - nudge - pm = -pm - else: - b = y + value + nudge - label._pmv = pm #the plus minus val - return a,b,pm - - def _addBarLabel(self, g, rowNo, colNo, x, y, width, height): - text = self._getLabelText(rowNo,colNo) - if text: - self._addLabel(text, self.barLabels[(rowNo, colNo)], g, rowNo, colNo, x, y, width, height) - - def _addNABarLabel(self, g, rowNo, colNo, x, y, width, height, calcOnly=False, na=None): - if na is None: na = self.naLabel - if na and na.text: - na = copy.copy(na) - v = self.valueAxis._valueMax<=0 and -1e-8 or 1e-8 - if width is None: width = v - if height is None: height = v - return self._addLabel(na.text, na, g, rowNo, colNo, x, y, width, height, calcOnly=calcOnly) - - def _addLabel(self, text, label, g, rowNo, colNo, x, y, width, height, calcOnly=False): - if label.visible: - labelWidth = stringWidth(text, label.fontName, label.fontSize) - flipXY = self._flipXY - if flipXY: - y0, x0, pm = self._labelXY(label,y,x,height,width) - else: - x0, y0, pm = self._labelXY(label,x,y,width,height) - fixedEnd = getattr(label,'fixedEnd', None) - if fixedEnd is not None: - v = fixedEnd._getValue(self,pm) - x00, y00 = x0, y0 - if flipXY: - x0 = v - else: - y0 = v - else: - if flipXY: - x00 = x0 - y00 = y+height/2.0 - else: - x00 = x+width/2.0 - y00 = y0 - fixedStart = getattr(label,'fixedStart', None) - if fixedStart is not None: - v = fixedStart._getValue(self,pm) - if flipXY: - x00 = v - else: - y00 = v - - if pm<0: - if flipXY: - dx = -2*label.dx - dy = 0 - else: - dy = -2*label.dy - dx = 0 - else: - dy = dx = 0 - if calcOnly: return x0+dx, y0+dy - label.setOrigin(x0+dx, y0+dy) - label.setText(text) - sC, sW = label.lineStrokeColor, label.lineStrokeWidth - if sC and sW: g.insert(0,Line(x00,y00,x0,y0, strokeColor=sC, strokeWidth=sW)) - g.add(label) - alx = getattr(self,'barLabelCallOut',None) - if alx: - label._callOutInfo = (self,g,rowNo,colNo,x,y,width,height,x00,y00,x0,y0) - alx(label) - del label._callOutInfo - - def _makeBar(self,g,x,y,width,height,rowNo,style): - r = Rect(x, y, width, height) - r.strokeWidth = style.strokeWidth - r.fillColor = style.fillColor - r.strokeColor = style.strokeColor - if style.strokeDashArray: - r.strokeDashArray = style.strokeDashArray - g.add(r) - - def _makeBars(self,g,lg): - lenData = len(self.data) - bars = self.bars - br = getattr(self,'barRecord',None) - BP = self._barPositions - flipXY = self._flipXY - - catNAL = self.categoryNALabel - catNNA = {} - if catNAL: - CBL = [] - rowNoL = lenData - 1 - #find all the categories that have at least one value - for rowNo in xrange(lenData): - row = BP[rowNo] - for colNo in xrange(len(row)): - x, y, width, height = row[colNo] - if None not in (width,height): - catNNA[colNo] = 1 - - for rowNo in xrange(lenData): - row = BP[rowNo] - styleCount = len(bars) - styleIdx = rowNo % styleCount - rowStyle = bars[styleIdx] - for colNo in xrange(len(row)): - style = (styleIdx,colNo) in bars and bars[(styleIdx,colNo)] or rowStyle - x, y, width, height = row[colNo] - if None in (width,height): - if not catNAL or colNo in catNNA: - self._addNABarLabel(lg,rowNo,colNo,x,y,width,height) - elif catNAL and colNo not in CBL: - r0 = self._addNABarLabel(lg,rowNo,colNo,x,y,width,height,True,catNAL) - if r0: - x, y, width, height = BP[rowNoL][colNo] - r1 = self._addNABarLabel(lg,rowNoL,colNo,x,y,width,height,True,catNAL) - x = (r0[0]+r1[0])/2.0 - y = (r0[1]+r1[1])/2.0 - self._addNABarLabel(lg,rowNoL,colNo,x,y,0.0001,0.0001,na=catNAL) - CBL.append(colNo) - continue - - # Draw a rectangular symbol for each data item, - # or a normal colored rectangle. - symbol = None - if hasattr(style, 'symbol'): - symbol = copy.deepcopy(style.symbol) - elif hasattr(self.bars, 'symbol'): - symbol = self.bars.symbol - - minDimen=getattr(style,'minDimen',None) - if minDimen: - if flipXY: - if width<0: - width = min(-style.minDimen,width) - else: - width = max(style.minDimen,width) - else: - if height<0: - height = min(-style.minDimen,height) - else: - height = max(style.minDimen,height) - if symbol: - symbol.x = x - symbol.y = y - symbol.width = width - symbol.height = height - g.add(symbol) - elif abs(width)>1e-7 and abs(height)>=1e-7 and (style.fillColor is not None or style.strokeColor is not None): - self._makeBar(g,x,y,width,height,rowNo,style) - if br: br(g.contents[-1],label=self._getLabelText(rowNo,colNo),value=self.data[rowNo][colNo],rowNo=rowNo,colNo=colNo) - - self._addBarLabel(lg,rowNo,colNo,x,y,width,height) - - def _computeLabelPosition(self, text, label, rowNo, colNo, x, y, width, height): - if label.visible: - labelWidth = stringWidth(text, label.fontName, label.fontSize) - flipXY = self._flipXY - if flipXY: - y0, x0, pm = self._labelXY(label,y,x,height,width) - else: - x0, y0, pm = self._labelXY(label,x,y,width,height) - fixedEnd = getattr(label,'fixedEnd', None) - if fixedEnd is not None: - v = fixedEnd._getValue(self,pm) - x00, y00 = x0, y0 - if flipXY: - x0 = v - else: - y0 = v - else: - if flipXY: - x00 = x0 - y00 = y+height/2.0 - else: - x00 = x+width/2.0 - y00 = y0 - fixedStart = getattr(label,'fixedStart', None) - if fixedStart is not None: - v = fixedStart._getValue(self,pm) - if flipXY: - x00 = v - else: - y00 = v - - if pm<0: - if flipXY: - dx = -2*label.dx - dy = 0 - else: - dy = -2*label.dy - dx = 0 - else: - dy = dx = 0 - label.setOrigin(x0+dx, y0+dy) - label.setText(text) - return pm,label.getBounds() - - def _computeBarPositions(self): - """Information function, can be called by charts which want to with space around bars""" - cA, vA = self.categoryAxis, self.valueAxis - if vA: vA.joinAxis = cA - if cA: cA.joinAxis = vA - if self._flipXY: - cA.setPosition(self._drawBegin(self.x,self.width), self.y, self.height) - else: - cA.setPosition(self.x, self._drawBegin(self.y,self.height), self.width) - cA.configure(self._configureData) - self.calcBarPositions() - - def _computeMaxSpace(self,size,required): - '''helper for madmen who want to put stuff inside their barcharts - basically after _computebarPositions we slide a line of length size - down the bar profile on either side of the bars to find the - maximum space. If the space at any point is >= required then we're - done. Otherwise we return the largest space location and amount. - ''' - flipXY = self._flipXY - self._computeBarPositions() - lenData = len(self.data) - BP = self._barPositions - C = [] - aC = C.append - if flipXY: - lo = self.x - hi = lo + self.width - end = self.y+self.height - for i in xrange(lenData): - for x, y, w, h in BP[i]: - v = x+w - z = y+h - aC((min(y,z),max(y,z), min(x,v) - lo, hi - max(x,v))) - else: - lo = self.y - hi = lo + self.height - end = self.x+self.width - for i in xrange(lenData): - for x, y, w, h in BP[i]: - v = y+h - z = x+w - aC((min(x,z), max(x,z), min(y,v) - lo, hi - max(y,v))) - C.sort() - R = [C[0]] - for c in C: - r = R[-1] - if r[0]end: break - j = i - alo = ahi = 0x7fffffff - while jahi: - if alo>maxS: - maxS = alo - maxP = flipXY and (lo,v0,lo+alo,v0+size,0) or (v0,lo,v0+size,lo+alo,0) - if maxS >= required: break - elif ahi>maxS: - maxS = ahi - maxP = flipXY and (hi-ahi,v0,hi,v0+size,1) or (v0,hi-ahi,v0+size,hi,1) - if maxS >= required: break - return maxS, maxP - - def _computeSimpleBarLabelPositions(self): - """Information function, can be called by charts which want to mess with labels""" - cA, vA = self.categoryAxis, self.valueAxis - if vA: vA.joinAxis = cA - if cA: cA.joinAxis = vA - if self._flipXY: - cA.setPosition(self._drawBegin(self.x,self.width), self.y, self.height) - else: - cA.setPosition(self.x, self._drawBegin(self.y,self.height), self.width) - cA.configure(self._configureData) - self.calcBarPositions() - - lenData = len(self.data) - bars = self.bars - R = [].append - BP = self._barPositions - for rowNo in xrange(lenData): - row = BP[rowNo] - C = [].append - for colNo in xrange(len(row)): - x, y, width, height = row[colNo] - if None in (width,height): - na = self.naLabel - if na and na.text: - na = copy.copy(na) - v = self.valueAxis._valueMax<=0 and -1e-8 or 1e-8 - if width is None: width = v - if height is None: height = v - C(self._computeLabelPosition(na.text, na, rowNo, colNo, x, y, width, height)) - else: - C(None) - else: - text = self._getLabelText(rowNo,colNo) - if text: - C(self._computeLabelPosition(text, self.barLabels[(rowNo, colNo)], rowNo, colNo, x, y, width, height)) - else: - C(None) - R(C.__self__) - return R.__self__ - - def makeBars(self): - g = Group() - lg = Group() - self._makeBars(g,lg) - g.add(lg) - return g - - def _desiredCategoryAxisLength(self): - '''for dynamically computing the desired category axis length''' - style = self.categoryAxis.style - data = self.data - n = len(data) - m = max(list(map(len,data))) - if style=='parallel': - groupWidth = (n-1)*self.barSpacing+n*self.barWidth - else: - groupWidth = self.barWidth - return m*(self.groupSpacing+groupWidth) - - def draw(self): - cA, vA = self.categoryAxis, self.valueAxis - if vA: vA.joinAxis = cA - if cA: cA.joinAxis = vA - if self._flipXY: - cA.setPosition(self._drawBegin(self.x,self.width), self.y, self.height) - else: - cA.setPosition(self.x, self._drawBegin(self.y,self.height), self.width) - return self._drawFinish() - -class VerticalBarChart(BarChart): - "Vertical bar chart with multiple side-by-side bars." - _flipXY = 0 - -class HorizontalBarChart(BarChart): - "Horizontal bar chart with multiple side-by-side bars." - _flipXY = 1 - -class _FakeGroup: - def __init__(self, cmp=None): - self._data = [] - self._key = functools.cmp_to_key(cmp) - - def add(self,what): - self._data.append(what) - - def value(self): - return self._data - - def sort(self): - self._data.sort(key=self._key) - -class BarChart3D(BarChart): - _attrMap = AttrMap(BASE=BarChart, - theta_x = AttrMapValue(isNumber, desc='dx/dz'), - theta_y = AttrMapValue(isNumber, desc='dy/dz'), - zDepth = AttrMapValue(isNumber, desc='depth of an individual series'), - zSpace = AttrMapValue(isNumber, desc='z gap around series'), - ) - theta_x = .5 - theta_y = .5 - zDepth = None - zSpace = None - - def calcBarPositions(self): - BarChart.calcBarPositions(self) - seriesCount = self._seriesCount - zDepth = self.zDepth - if zDepth is None: zDepth = self.barWidth - zSpace = self.zSpace - if zSpace is None: zSpace = self.barSpacing - if self.categoryAxis.style=='parallel_3d': - _3d_depth = seriesCount*zDepth+(seriesCount+1)*zSpace - else: - _3d_depth = zDepth + 2*zSpace - _3d_depth *= self._normFactor - self._3d_dx = self.theta_x*_3d_depth - self._3d_dy = self.theta_y*_3d_depth - - def _calc_z0(self,rowNo): - zDepth = self.zDepth - if zDepth is None: zDepth = self.barWidth - zSpace = self.zSpace - if zSpace is None: zSpace = self.barSpacing - if self.categoryAxis.style=='parallel_3d': - z0 = self._normFactor*(rowNo*(zDepth+zSpace)+zSpace) - else: - z0 = self._normFactor*zSpace - return z0 - - def _makeBar(self,g,x,y,width,height,rowNo,style): - zDepth = self.zDepth - if zDepth is None: zDepth = self.barWidth - zSpace = self.zSpace - if zSpace is None: zSpace = self.barSpacing - z0 = self._calc_z0(rowNo) - z1 = z0 + zDepth*self._normFactor - if width<0: - x += width - width = -width - x += z0*self.theta_x - y += z0*self.theta_y - if self._flipXY: - y += zSpace - else: - x += zSpace - g.add((0,z0,z1,x,y,width,height,rowNo,style)) - - def _addBarLabel(self, g, rowNo, colNo, x, y, width, height): - z0 = self._calc_z0(rowNo) - zSpace = self.zSpace - if zSpace is None: zSpace = self.barSpacing - z1 = z0 - x += z0*self.theta_x - y += z0*self.theta_y - if self._flipXY: - y += zSpace - else: - x += zSpace - g.add((1,z0,z1,x,y,width,height,rowNo,colNo)) - - def makeBars(self): - from reportlab.graphics.charts.utils3d import _draw_3d_bar - fg = _FakeGroup(cmp=self._cmpZ) - self._makeBars(fg,fg) - fg.sort() - g = Group() - theta_x = self.theta_x - theta_y = self.theta_y - if self.categoryAxis.style == 'stacked': - fg_value=fg.value().reverse() - for t in fg.value(): - if t[0]==0: - z0,z1,x,y,width,height,rowNo,style = t[1:] - dz = z1 - z0 - _draw_3d_bar(g, x, x+width, y, y+height, dz*theta_x, dz*theta_y, - fillColor=style.fillColor, fillColorShaded=None, - strokeColor=style.strokeColor, strokeWidth=style.strokeWidth, - shading=0.45) - for t in fg.value(): - if t[0]==1: - z0,z1,x,y,width,height,rowNo,colNo = t[1:] - BarChart._addBarLabel(self,g,rowNo,colNo,x,y,width,height) - return g - -class VerticalBarChart3D(BarChart3D,VerticalBarChart): - _cmpZ=lambda self,a,b:cmp((-a[1],a[3],a[0],-a[4]),(-b[1],b[3],b[0],-b[4])) - -class HorizontalBarChart3D(BarChart3D,HorizontalBarChart): - _cmpZ = lambda self,a,b: cmp((-a[1],a[4],a[0],-a[3]),(-b[1],b[4],b[0],-b[3])) #t, z0, z1, x, y = a[:5] - -# Vertical samples. -def sampleV0a(): - "A slightly pathologic bar chart with only TWO data items." - - drawing = Drawing(400, 200) - - data = [(13, 20)] - - bc = VerticalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - - bc.strokeColor = colors.black - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'ne' - bc.categoryAxis.labels.dx = 8 - bc.categoryAxis.labels.dy = -2 - bc.categoryAxis.labels.angle = 30 - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -def sampleV0b(): - "A pathologic bar chart with only ONE data item." - - drawing = Drawing(400, 200) - - data = [(42,)] - - bc = VerticalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - bc.strokeColor = colors.black - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 50 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'ne' - bc.categoryAxis.labels.dx = 8 - bc.categoryAxis.labels.dy = -2 - bc.categoryAxis.labels.angle = 30 - bc.categoryAxis.categoryNames = ['Jan-99'] - - drawing.add(bc) - - return drawing - - -def sampleV0c(): - "A really pathologic bar chart with NO data items at all!" - - drawing = Drawing(400, 200) - - data = [()] - - bc = VerticalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - bc.strokeColor = colors.black - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'ne' - bc.categoryAxis.labels.dx = 8 - bc.categoryAxis.labels.dy = -2 - bc.categoryAxis.categoryNames = [] - - drawing.add(bc) - - return drawing - - -def sampleV1(): - "Sample of multi-series bar chart." - - drawing = Drawing(400, 200) - - data = [ - (13, 5, 20, 22, 37, 45, 19, 4), - (14, 6, 21, 23, 38, 46, 20, 5) - ] - - bc = VerticalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - bc.strokeColor = colors.black - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'ne' - bc.categoryAxis.labels.dx = 8 - bc.categoryAxis.labels.dy = -2 - bc.categoryAxis.labels.angle = 30 - - catNames = 'Jan Feb Mar Apr May Jun Jul Aug'.split(' ') - catNames = [n+'-99' for n in catNames] - bc.categoryAxis.categoryNames = catNames - drawing.add(bc) - - return drawing - - -def sampleV2a(): - "Sample of multi-series bar chart." - - data = [(2.4, -5.7, 2, 5, 9.2), - (0.6, -4.9, -3, 4, 6.8) - ] - - labels = ("Q3 2000", "Year to Date", "12 months", - "Annualised\n3 years", "Since 07.10.99") - - drawing = Drawing(400, 200) - - bc = VerticalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 120 - bc.width = 300 - bc.data = data - - bc.barSpacing = 0 - bc.groupSpacing = 10 - bc.barWidth = 10 - - bc.valueAxis.valueMin = -15 - bc.valueAxis.valueMax = +15 - bc.valueAxis.valueStep = 5 - bc.valueAxis.labels.fontName = 'Helvetica' - bc.valueAxis.labels.fontSize = 8 - bc.valueAxis.labels.boxAnchor = 'n' # irrelevant (becomes 'c') - bc.valueAxis.labels.textAnchor = 'middle' - - bc.categoryAxis.categoryNames = labels - bc.categoryAxis.labels.fontName = 'Helvetica' - bc.categoryAxis.labels.fontSize = 8 - bc.categoryAxis.labels.dy = -60 - - drawing.add(bc) - - return drawing - - -def sampleV2b(): - "Sample of multi-series bar chart." - - data = [(2.4, -5.7, 2, 5, 9.2), - (0.6, -4.9, -3, 4, 6.8) - ] - - labels = ("Q3 2000", "Year to Date", "12 months", - "Annualised\n3 years", "Since 07.10.99") - - drawing = Drawing(400, 200) - - bc = VerticalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 120 - bc.width = 300 - bc.data = data - - bc.barSpacing = 5 - bc.groupSpacing = 10 - bc.barWidth = 10 - - bc.valueAxis.valueMin = -15 - bc.valueAxis.valueMax = +15 - bc.valueAxis.valueStep = 5 - bc.valueAxis.labels.fontName = 'Helvetica' - bc.valueAxis.labels.fontSize = 8 - bc.valueAxis.labels.boxAnchor = 'n' # irrelevant (becomes 'c') - bc.valueAxis.labels.textAnchor = 'middle' - - bc.categoryAxis.categoryNames = labels - bc.categoryAxis.labels.fontName = 'Helvetica' - bc.categoryAxis.labels.fontSize = 8 - bc.categoryAxis.labels.dy = -60 - - drawing.add(bc) - - return drawing - - -def sampleV2c(): - "Sample of multi-series bar chart." - - data = [(2.4, -5.7, 2, 5, 9.99), - (0.6, -4.9, -3, 4, 9.99) - ] - - labels = ("Q3 2000", "Year to Date", "12 months", - "Annualised\n3 years", "Since 07.10.99") - - drawing = Drawing(400, 200) - - bc = VerticalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 120 - bc.width = 300 - bc.data = data - - bc.barSpacing = 2 - bc.groupSpacing = 10 - bc.barWidth = 10 - - bc.valueAxis.valueMin = -15 - bc.valueAxis.valueMax = +15 - bc.valueAxis.valueStep = 5 - bc.valueAxis.labels.fontName = 'Helvetica' - bc.valueAxis.labels.fontSize = 8 - - bc.categoryAxis.categoryNames = labels - bc.categoryAxis.labels.fontName = 'Helvetica' - bc.categoryAxis.labels.fontSize = 8 - bc.valueAxis.labels.boxAnchor = 'n' - bc.valueAxis.labels.textAnchor = 'middle' - bc.categoryAxis.labels.dy = -60 - - bc.barLabels.nudge = 10 - - bc.barLabelFormat = '%0.2f' - bc.barLabels.dx = 0 - bc.barLabels.dy = 0 - bc.barLabels.boxAnchor = 'n' # irrelevant (becomes 'c') - bc.barLabels.fontName = 'Helvetica' - bc.barLabels.fontSize = 6 - - drawing.add(bc) - - return drawing - - -def sampleV3(): - "Faked horizontal bar chart using a vertical real one (deprecated)." - - names = ("UK Equities", "US Equities", "European Equities", "Japanese Equities", - "Pacific (ex Japan) Equities", "Emerging Markets Equities", - "UK Bonds", "Overseas Bonds", "UK Index-Linked", "Cash") - - series1 = (-1.5, 0.3, 0.5, 1.0, 0.8, 0.7, 0.4, 0.1, 1.0, 0.3) - series2 = (0.0, 0.33, 0.55, 1.1, 0.88, 0.77, 0.44, 0.11, 1.10, 0.33) - - assert len(names) == len(series1), "bad data" - assert len(names) == len(series2), "bad data" - - drawing = Drawing(400, 200) - - bc = VerticalBarChart() - bc.x = 0 - bc.y = 0 - bc.height = 100 - bc.width = 150 - bc.data = (series1,) - bc.bars.fillColor = colors.green - - bc.barLabelFormat = '%0.2f' - bc.barLabels.dx = 0 - bc.barLabels.dy = 0 - bc.barLabels.boxAnchor = 'w' # irrelevant (becomes 'c') - bc.barLabels.angle = 90 - bc.barLabels.fontName = 'Helvetica' - bc.barLabels.fontSize = 6 - bc.barLabels.nudge = 10 - - bc.valueAxis.visible = 0 - bc.valueAxis.valueMin = -2 - bc.valueAxis.valueMax = +2 - bc.valueAxis.valueStep = 1 - - bc.categoryAxis.tickUp = 0 - bc.categoryAxis.tickDown = 0 - bc.categoryAxis.categoryNames = names - bc.categoryAxis.labels.angle = 90 - bc.categoryAxis.labels.boxAnchor = 'w' - bc.categoryAxis.labels.dx = 0 - bc.categoryAxis.labels.dy = -125 - bc.categoryAxis.labels.fontName = 'Helvetica' - bc.categoryAxis.labels.fontSize = 6 - - g = Group(bc) - g.translate(100, 175) - g.rotate(-90) - - drawing.add(g) - - return drawing - - -def sampleV4a(): - "A bar chart showing value axis region starting at *exactly* zero." - - drawing = Drawing(400, 200) - - data = [(13, 20)] - - bc = VerticalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - - bc.strokeColor = colors.black - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'n' - bc.categoryAxis.labels.dy = -5 - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -def sampleV4b(): - "A bar chart showing value axis region starting *below* zero." - - drawing = Drawing(400, 200) - - data = [(13, 20)] - - bc = VerticalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - - bc.strokeColor = colors.black - - bc.valueAxis.valueMin = -10 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'n' - bc.categoryAxis.labels.dy = -5 - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -def sampleV4c(): - "A bar chart showing value axis region staring *above* zero." - - drawing = Drawing(400, 200) - - data = [(13, 20)] - - bc = VerticalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - - bc.strokeColor = colors.black - - bc.valueAxis.valueMin = 10 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'n' - bc.categoryAxis.labels.dy = -5 - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -def sampleV4d(): - "A bar chart showing value axis region entirely *below* zero." - - drawing = Drawing(400, 200) - - data = [(-13, -20)] - - bc = VerticalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - - bc.strokeColor = colors.black - - bc.valueAxis.valueMin = -30 - bc.valueAxis.valueMax = -10 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'n' - bc.categoryAxis.labels.dy = -5 - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -### - -##dataSample5 = [(10, 20), (20, 30), (30, 40), (40, 50), (50, 60)] -##dataSample5 = [(10, 60), (20, 50), (30, 40), (40, 30), (50, 20)] -dataSample5 = [(10, 60), (20, 50), (30, 40), (40, 30)] - -def sampleV5a(): - "A simple bar chart with no expressed spacing attributes." - - drawing = Drawing(400, 200) - - data = dataSample5 - - bc = VerticalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - bc.strokeColor = colors.black - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'n' - bc.categoryAxis.labels.dy = -5 - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -def sampleV5b(): - "A simple bar chart with proportional spacing." - - drawing = Drawing(400, 200) - - data = dataSample5 - - bc = VerticalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - bc.strokeColor = colors.black - - bc.useAbsolute = 0 - bc.barWidth = 40 - bc.groupSpacing = 20 - bc.barSpacing = 10 - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'n' - bc.categoryAxis.labels.dy = -5 - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -def sampleV5c1(): - "Make sampe simple bar chart but with absolute spacing." - - drawing = Drawing(400, 200) - - data = dataSample5 - - bc = VerticalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - bc.strokeColor = colors.black - - bc.useAbsolute = 1 - bc.barWidth = 40 - bc.groupSpacing = 0 - bc.barSpacing = 0 - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'n' - bc.categoryAxis.labels.dy = -5 - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -def sampleV5c2(): - "Make sampe simple bar chart but with absolute spacing." - - drawing = Drawing(400, 200) - - data = dataSample5 - - bc = VerticalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - bc.strokeColor = colors.black - - bc.useAbsolute = 1 - bc.barWidth = 40 - bc.groupSpacing = 20 - bc.barSpacing = 0 - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'n' - bc.categoryAxis.labels.dy = -5 - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -def sampleV5c3(): - "Make sampe simple bar chart but with absolute spacing." - - drawing = Drawing(400, 200) - - data = dataSample5 - - bc = VerticalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - bc.strokeColor = colors.black - - bc.useAbsolute = 1 - bc.barWidth = 40 - bc.groupSpacing = 0 - bc.barSpacing = 10 - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'n' - bc.categoryAxis.labels.dy = -5 - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -def sampleV5c4(): - "Make sampe simple bar chart but with absolute spacing." - - drawing = Drawing(400, 200) - - data = dataSample5 - - bc = VerticalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - bc.strokeColor = colors.black - - bc.useAbsolute = 1 - bc.barWidth = 40 - bc.groupSpacing = 20 - bc.barSpacing = 10 - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'n' - bc.categoryAxis.labels.dy = -5 - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -# Horizontal samples - -def sampleH0a(): - "Make a slightly pathologic bar chart with only TWO data items." - - drawing = Drawing(400, 200) - - data = [(13, 20)] - - bc = HorizontalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - - bc.strokeColor = colors.black - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'se' - bc.categoryAxis.labels.angle = 30 - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -def sampleH0b(): - "Make a pathologic bar chart with only ONE data item." - - drawing = Drawing(400, 200) - - data = [(42,)] - - bc = HorizontalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - bc.strokeColor = colors.black - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 50 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'se' - bc.categoryAxis.labels.angle = 30 - bc.categoryAxis.categoryNames = ['Jan-99'] - - drawing.add(bc) - - return drawing - - -def sampleH0c(): - "Make a really pathologic bar chart with NO data items at all!" - - drawing = Drawing(400, 200) - - data = [()] - - bc = HorizontalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - bc.strokeColor = colors.black - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'se' - bc.categoryAxis.labels.angle = 30 - bc.categoryAxis.categoryNames = [] - - drawing.add(bc) - - return drawing - - -def sampleH1(): - "Sample of multi-series bar chart." - - drawing = Drawing(400, 200) - - data = [ - (13, 5, 20, 22, 37, 45, 19, 4), - (14, 6, 21, 23, 38, 46, 20, 5) - ] - - bc = HorizontalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - bc.strokeColor = colors.black - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'e' - catNames = 'Jan Feb Mar Apr May Jun Jul Aug'.split(' ') - catNames = [n+'-99' for n in catNames] - bc.categoryAxis.categoryNames = catNames - drawing.add(bc, 'barchart') - - return drawing - - -def sampleH2a(): - "Sample of multi-series bar chart." - - data = [(2.4, -5.7, 2, 5, 9.2), - (0.6, -4.9, -3, 4, 6.8) - ] - - labels = ("Q3 2000", "Year to Date", "12 months", - "Annualised\n3 years", "Since 07.10.99") - - drawing = Drawing(400, 200) - - bc = HorizontalBarChart() - bc.x = 80 - bc.y = 50 - bc.height = 120 - bc.width = 300 - bc.data = data - - bc.barSpacing = 0 - bc.groupSpacing = 10 - bc.barWidth = 10 - - bc.valueAxis.valueMin = -15 - bc.valueAxis.valueMax = +15 - bc.valueAxis.valueStep = 5 - bc.valueAxis.labels.fontName = 'Helvetica' - bc.valueAxis.labels.fontSize = 8 - bc.valueAxis.labels.boxAnchor = 'n' # irrelevant (becomes 'c') - bc.valueAxis.labels.textAnchor = 'middle' - bc.valueAxis.configure(bc.data) - - bc.categoryAxis.categoryNames = labels - bc.categoryAxis.labels.fontName = 'Helvetica' - bc.categoryAxis.labels.fontSize = 8 - bc.categoryAxis.labels.dx = -150 - - drawing.add(bc) - - return drawing - - -def sampleH2b(): - "Sample of multi-series bar chart." - - data = [(2.4, -5.7, 2, 5, 9.2), - (0.6, -4.9, -3, 4, 6.8) - ] - - labels = ("Q3 2000", "Year to Date", "12 months", - "Annualised\n3 years", "Since 07.10.99") - - drawing = Drawing(400, 200) - - bc = HorizontalBarChart() - bc.x = 80 - bc.y = 50 - bc.height = 120 - bc.width = 300 - bc.data = data - - bc.barSpacing = 5 - bc.groupSpacing = 10 - bc.barWidth = 10 - - bc.valueAxis.valueMin = -15 - bc.valueAxis.valueMax = +15 - bc.valueAxis.valueStep = 5 - bc.valueAxis.labels.fontName = 'Helvetica' - bc.valueAxis.labels.fontSize = 8 - bc.valueAxis.labels.boxAnchor = 'n' # irrelevant (becomes 'c') - bc.valueAxis.labels.textAnchor = 'middle' - - bc.categoryAxis.categoryNames = labels - bc.categoryAxis.labels.fontName = 'Helvetica' - bc.categoryAxis.labels.fontSize = 8 - bc.categoryAxis.labels.dx = -150 - - drawing.add(bc) - - return drawing - - -def sampleH2c(): - "Sample of multi-series bar chart." - - data = [(2.4, -5.7, 2, 5, 9.99), - (0.6, -4.9, -3, 4, 9.99) - ] - - labels = ("Q3 2000", "Year to Date", "12 months", - "Annualised\n3 years", "Since 07.10.99") - - drawing = Drawing(400, 200) - - bc = HorizontalBarChart() - bc.x = 80 - bc.y = 50 - bc.height = 120 - bc.width = 300 - bc.data = data - - bc.barSpacing = 2 - bc.groupSpacing = 10 - bc.barWidth = 10 - - bc.valueAxis.valueMin = -15 - bc.valueAxis.valueMax = +15 - bc.valueAxis.valueStep = 5 - bc.valueAxis.labels.fontName = 'Helvetica' - bc.valueAxis.labels.fontSize = 8 - bc.valueAxis.labels.boxAnchor = 'n' - bc.valueAxis.labels.textAnchor = 'middle' - - bc.categoryAxis.categoryNames = labels - bc.categoryAxis.labels.fontName = 'Helvetica' - bc.categoryAxis.labels.fontSize = 8 - bc.categoryAxis.labels.dx = -150 - - bc.barLabels.nudge = 10 - - bc.barLabelFormat = '%0.2f' - bc.barLabels.dx = 0 - bc.barLabels.dy = 0 - bc.barLabels.boxAnchor = 'n' # irrelevant (becomes 'c') - bc.barLabels.fontName = 'Helvetica' - bc.barLabels.fontSize = 6 - - drawing.add(bc) - - return drawing - - -def sampleH3(): - "A really horizontal bar chart (compared to the equivalent faked one)." - - names = ("UK Equities", "US Equities", "European Equities", "Japanese Equities", - "Pacific (ex Japan) Equities", "Emerging Markets Equities", - "UK Bonds", "Overseas Bonds", "UK Index-Linked", "Cash") - - series1 = (-1.5, 0.3, 0.5, 1.0, 0.8, 0.7, 0.4, 0.1, 1.0, 0.3) - series2 = (0.0, 0.33, 0.55, 1.1, 0.88, 0.77, 0.44, 0.11, 1.10, 0.33) - - assert len(names) == len(series1), "bad data" - assert len(names) == len(series2), "bad data" - - drawing = Drawing(400, 200) - - bc = HorizontalBarChart() - bc.x = 100 - bc.y = 20 - bc.height = 150 - bc.width = 250 - bc.data = (series1,) - bc.bars.fillColor = colors.green - - bc.barLabelFormat = '%0.2f' - bc.barLabels.dx = 0 - bc.barLabels.dy = 0 - bc.barLabels.boxAnchor = 'w' # irrelevant (becomes 'c') - bc.barLabels.fontName = 'Helvetica' - bc.barLabels.fontSize = 6 - bc.barLabels.nudge = 10 - - bc.valueAxis.visible = 0 - bc.valueAxis.valueMin = -2 - bc.valueAxis.valueMax = +2 - bc.valueAxis.valueStep = 1 - - bc.categoryAxis.tickLeft = 0 - bc.categoryAxis.tickRight = 0 - bc.categoryAxis.categoryNames = names - bc.categoryAxis.labels.boxAnchor = 'w' - bc.categoryAxis.labels.dx = -170 - bc.categoryAxis.labels.fontName = 'Helvetica' - bc.categoryAxis.labels.fontSize = 6 - - g = Group(bc) - drawing.add(g) - - return drawing - - -def sampleH4a(): - "A bar chart showing value axis region starting at *exactly* zero." - - drawing = Drawing(400, 200) - - data = [(13, 20)] - - bc = HorizontalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - - bc.strokeColor = colors.black - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'e' - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -def sampleH4b(): - "A bar chart showing value axis region starting *below* zero." - - drawing = Drawing(400, 200) - - data = [(13, 20)] - - bc = HorizontalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - - bc.strokeColor = colors.black - - bc.valueAxis.valueMin = -10 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'e' - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -def sampleH4c(): - "A bar chart showing value axis region starting *above* zero." - - drawing = Drawing(400, 200) - - data = [(13, 20)] - - bc = HorizontalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - - bc.strokeColor = colors.black - - bc.valueAxis.valueMin = 10 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'e' - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -def sampleH4d(): - "A bar chart showing value axis region entirely *below* zero." - - drawing = Drawing(400, 200) - - data = [(-13, -20)] - - bc = HorizontalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - - bc.strokeColor = colors.black - - bc.valueAxis.valueMin = -30 - bc.valueAxis.valueMax = -10 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'e' - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -dataSample5 = [(10, 60), (20, 50), (30, 40), (40, 30)] - -def sampleH5a(): - "A simple bar chart with no expressed spacing attributes." - - drawing = Drawing(400, 200) - - data = dataSample5 - - bc = HorizontalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - bc.strokeColor = colors.black - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'e' - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -def sampleH5b(): - "A simple bar chart with proportional spacing." - - drawing = Drawing(400, 200) - - data = dataSample5 - - bc = HorizontalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - bc.strokeColor = colors.black - - bc.useAbsolute = 0 - bc.barWidth = 40 - bc.groupSpacing = 20 - bc.barSpacing = 10 - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'e' - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -def sampleH5c1(): - "A simple bar chart with absolute spacing." - - drawing = Drawing(400, 200) - - data = dataSample5 - - bc = HorizontalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - bc.strokeColor = colors.black - - bc.useAbsolute = 1 - bc.barWidth = 10 - bc.groupSpacing = 0 - bc.barSpacing = 0 - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'e' - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -def sampleH5c2(): - "Simple bar chart with absolute spacing." - - drawing = Drawing(400, 200) - - data = dataSample5 - - bc = HorizontalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - bc.strokeColor = colors.black - - bc.useAbsolute = 1 - bc.barWidth = 10 - bc.groupSpacing = 20 - bc.barSpacing = 0 - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'e' - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -def sampleH5c3(): - "Simple bar chart with absolute spacing." - - drawing = Drawing(400, 200) - - data = dataSample5 - - bc = HorizontalBarChart() - bc.x = 50 - bc.y = 20 - bc.height = 155 - bc.width = 300 - bc.data = data - bc.strokeColor = colors.black - - bc.useAbsolute = 1 - bc.barWidth = 10 - bc.groupSpacing = 0 - bc.barSpacing = 2 - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'e' - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - - -def sampleH5c4(): - "Simple bar chart with absolute spacing." - - drawing = Drawing(400, 200) - - data = dataSample5 - - bc = HorizontalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - bc.strokeColor = colors.black - - bc.useAbsolute = 1 - bc.barWidth = 10 - bc.groupSpacing = 20 - bc.barSpacing = 10 - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'e' - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - drawing.add(bc) - - return drawing - -def sampleSymbol1(): - "Simple bar chart using symbol attribute." - - drawing = Drawing(400, 200) - - data = dataSample5 - - bc = VerticalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - bc.strokeColor = colors.black - - bc.barWidth = 10 - bc.groupSpacing = 15 - bc.barSpacing = 3 - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'e' - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - from reportlab.graphics.widgets.grids import ShadedRect - sym1 = ShadedRect() - sym1.fillColorStart = colors.black - sym1.fillColorEnd = colors.blue - sym1.orientation = 'horizontal' - sym1.strokeWidth = 0 - - sym2 = ShadedRect() - sym2.fillColorStart = colors.black - sym2.fillColorEnd = colors.pink - sym2.orientation = 'horizontal' - sym2.strokeWidth = 0 - - sym3 = ShadedRect() - sym3.fillColorStart = colors.blue - sym3.fillColorEnd = colors.white - sym3.orientation = 'vertical' - sym3.cylinderMode = 1 - sym3.strokeWidth = 0 - - bc.bars.symbol = sym1 - bc.bars[2].symbol = sym2 - bc.bars[3].symbol = sym3 - - drawing.add(bc) - - return drawing - -def sampleStacked1(): - "Simple bar chart using symbol attribute." - - drawing = Drawing(400, 200) - - data = dataSample5 - - bc = VerticalBarChart() - bc.categoryAxis.style = 'stacked' - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = data - bc.strokeColor = colors.black - - bc.barWidth = 10 - bc.groupSpacing = 15 - bc.valueAxis.valueMin = 0 - - bc.categoryAxis.labels.boxAnchor = 'e' - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - from reportlab.graphics.widgets.grids import ShadedRect - bc.bars.symbol = ShadedRect() - bc.bars.symbol.fillColorStart = colors.red - bc.bars.symbol.fillColorEnd = colors.white - bc.bars.symbol.orientation = 'vertical' - bc.bars.symbol.cylinderMode = 1 - bc.bars.symbol.strokeWidth = 0 - - bc.bars[1].symbol = ShadedRect() - bc.bars[1].symbol.fillColorStart = colors.magenta - bc.bars[1].symbol.fillColorEnd = colors.white - bc.bars[1].symbol.orientation = 'vertical' - bc.bars[1].symbol.cylinderMode = 1 - bc.bars[1].symbol.strokeWidth = 0 - - bc.bars[2].symbol = ShadedRect() - bc.bars[2].symbol.fillColorStart = colors.green - bc.bars[2].symbol.fillColorEnd = colors.white - bc.bars[2].symbol.orientation = 'vertical' - bc.bars[2].symbol.cylinderMode = 1 - bc.bars[2].symbol.strokeWidth = 0 - - bc.bars[3].symbol = ShadedRect() - bc.bars[3].symbol.fillColorStart = colors.blue - bc.bars[3].symbol.fillColorEnd = colors.white - bc.bars[3].symbol.orientation = 'vertical' - bc.bars[3].symbol.cylinderMode = 1 - bc.bars[3].symbol.strokeWidth = 0 - - drawing.add(bc) - - return drawing - -#class version of function sampleH5c4 above -class SampleH5c4(Drawing): - "Simple bar chart with absolute spacing." - - def __init__(self,width=400,height=200,*args,**kw): - Drawing.__init__(self,width,height,*args,**kw) - bc = HorizontalBarChart() - bc.x = 50 - bc.y = 50 - bc.height = 125 - bc.width = 300 - bc.data = dataSample5 - bc.strokeColor = colors.black - - bc.useAbsolute = 1 - bc.barWidth = 10 - bc.groupSpacing = 20 - bc.barSpacing = 10 - - bc.valueAxis.valueMin = 0 - bc.valueAxis.valueMax = 60 - bc.valueAxis.valueStep = 15 - - bc.categoryAxis.labels.boxAnchor = 'e' - bc.categoryAxis.categoryNames = ['Ying', 'Yang'] - - self.add(bc,name='HBC') diff --git a/reportlab/graphics/charts/dotbox.py b/reportlab/graphics/charts/dotbox.py deleted file mode 100644 index 6962d278..00000000 --- a/reportlab/graphics/charts/dotbox.py +++ /dev/null @@ -1,165 +0,0 @@ -from reportlab.lib.colors import blue, _PCMYK_black -from reportlab.graphics.charts.textlabels import Label -from reportlab.graphics.shapes import Circle, Drawing, Group, Line, Rect, String -from reportlab.graphics.widgetbase import Widget -from reportlab.lib.attrmap import * -from reportlab.lib.validators import * -from reportlab.lib.units import cm -from reportlab.pdfbase.pdfmetrics import getFont -from reportlab.graphics.charts.lineplots import _maxWidth - -class DotBox(Widget): - """Returns a dotbox widget.""" - - #Doesn't use TypedPropertyCollection for labels - this can be a later improvement - _attrMap = AttrMap( - xlabels = AttrMapValue(isNoneOrListOfNoneOrStrings, - desc="List of text labels for boxes on left hand side"), - ylabels = AttrMapValue(isNoneOrListOfNoneOrStrings, - desc="Text label for second box on left hand side"), - labelFontName = AttrMapValue(isString, - desc="Name of font used for the labels"), - labelFontSize = AttrMapValue(isNumber, - desc="Size of font used for the labels"), - labelOffset = AttrMapValue(isNumber, - desc="Space between label text and grid edge"), - strokeWidth = AttrMapValue(isNumber, - desc='Width of the grid and dot outline'), - gridDivWidth = AttrMapValue(isNumber, - desc="Width of each 'box'"), - gridColor = AttrMapValue(isColor, - desc='Colour for the box and gridding'), - dotDiameter = AttrMapValue(isNumber, - desc="Diameter of the circle used for the 'dot'"), - dotColor = AttrMapValue(isColor, - desc='Colour of the circle on the box'), - dotXPosition = AttrMapValue(isNumber, - desc='X Position of the circle'), - dotYPosition = AttrMapValue(isNumber, - desc='X Position of the circle'), - x = AttrMapValue(isNumber, - desc='X Position of dotbox'), - y = AttrMapValue(isNumber, - desc='Y Position of dotbox'), - ) - - def __init__(self): - self.xlabels=["Value", "Blend", "Growth"] - self.ylabels=["Small", "Medium", "Large"] - self.labelFontName = "Helvetica" - self.labelFontSize = 6 - self.labelOffset = 5 - self.strokeWidth = 0.5 - self.gridDivWidth=0.5*cm - self.gridColor=colors.Color(25/255.0,77/255.0,135/255.0) - self.dotDiameter=0.4*cm - self.dotColor=colors.Color(232/255.0,224/255.0,119/255.0) - self.dotXPosition = 1 - self.dotYPosition = 1 - self.x = 30 - self.y = 5 - - - def _getDrawingDimensions(self): - leftPadding=rightPadding=topPadding=bottomPadding=5 - #find width of grid - tx=len(self.xlabels)*self.gridDivWidth - #add padding (and offset) - tx=tx+leftPadding+rightPadding+self.labelOffset - #add in maximum width of text - tx=tx+_maxWidth(self.xlabels, self.labelFontName, self.labelFontSize) - #find height of grid - ty=len(self.ylabels)*self.gridDivWidth - #add padding (and offset) - ty=ty+topPadding+bottomPadding+self.labelOffset - #add in maximum width of text - ty=ty+_maxWidth(self.ylabels, self.labelFontName, self.labelFontSize) - #print (tx, ty) - return (tx,ty) - - def demo(self,drawing=None): - if not drawing: - tx,ty=self._getDrawingDimensions() - drawing = Drawing(tx,ty) - drawing.add(self.draw()) - return drawing - - def draw(self): - g = Group() - - #box - g.add(Rect(self.x,self.y,len(self.xlabels)*self.gridDivWidth,len(self.ylabels)*self.gridDivWidth, - strokeColor=self.gridColor, - strokeWidth=self.strokeWidth, - fillColor=None)) - - #internal gridding - for f in range (1,len(self.ylabels)): - #horizontal - g.add(Line(strokeColor=self.gridColor, - strokeWidth=self.strokeWidth, - x1 = self.x, - y1 = self.y+f*self.gridDivWidth, - x2 = self.x+len(self.xlabels)*self.gridDivWidth, - y2 = self.y+f*self.gridDivWidth)) - for f in range (1,len(self.xlabels)): - #vertical - g.add(Line(strokeColor=self.gridColor, - strokeWidth=self.strokeWidth, - x1 = self.x+f*self.gridDivWidth, - y1 = self.y, - x2 = self.x+f*self.gridDivWidth, - y2 = self.y+len(self.ylabels)*self.gridDivWidth)) - - # draw the 'dot' - g.add(Circle(strokeColor=self.gridColor, - strokeWidth=self.strokeWidth, - fillColor=self.dotColor, - cx = self.x+(self.dotXPosition*self.gridDivWidth), - cy = self.y+(self.dotYPosition*self.gridDivWidth), - r = self.dotDiameter/2.0)) - - #used for centering y-labels (below) - ascent=getFont(self.labelFontName).face.ascent - if ascent==0: - ascent=0.718 # default (from helvetica) - ascent=ascent*self.labelFontSize # normalize - - #do y-labels - if self.ylabels != None: - for f in range (len(self.ylabels)-1,-1,-1): - if self.ylabels[f]!= None: - g.add(String(strokeColor=self.gridColor, - text = self.ylabels[f], - fontName = self.labelFontName, - fontSize = self.labelFontSize, - fillColor=_PCMYK_black, - x = self.x-self.labelOffset, - y = self.y+(f*self.gridDivWidth+(self.gridDivWidth-ascent)/2.0), - textAnchor = 'end')) - - #do x-labels - if self.xlabels != None: - for f in range (0,len(self.xlabels)): - if self.xlabels[f]!= None: - l=Label() - l.x=self.x+(f*self.gridDivWidth)+(self.gridDivWidth+ascent)/2.0 - l.y=self.y+(len(self.ylabels)*self.gridDivWidth)+self.labelOffset - l.angle=90 - l.textAnchor='start' - l.fontName = self.labelFontName - l.fontSize = self.labelFontSize - l.fillColor = _PCMYK_black - l.setText(self.xlabels[f]) - l.boxAnchor = 'sw' - l.draw() - g.add(l) - - return g - - - - -if __name__ == "__main__": - d = DotBox() - d.demo().save(fnRoot="dotbox") \ No newline at end of file diff --git a/reportlab/graphics/charts/doughnut.py b/reportlab/graphics/charts/doughnut.py deleted file mode 100644 index 7acd126c..00000000 --- a/reportlab/graphics/charts/doughnut.py +++ /dev/null @@ -1,400 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/doughnut.py -# doughnut chart - -__version__=''' $Id$ ''' -__doc__="""Doughnut chart - -Produces a circular chart like the doughnut charts produced by Excel. -Can handle multiple series (which produce concentric 'rings' in the chart). - -""" - -import copy -from math import sin, cos, pi -from reportlab.lib import colors -from reportlab.lib.validators import isColor, isNumber, isListOfNumbersOrNone,\ - isListOfNumbers, isColorOrNone, isString,\ - isListOfStringsOrNone, OneOf, SequenceOf,\ - isBoolean, isListOfColors,\ - isNoneOrListOfNoneOrStrings,\ - isNoneOrListOfNoneOrNumbers,\ - isNumberOrNone -from reportlab.lib.attrmap import * -from reportlab.pdfgen.canvas import Canvas -from reportlab.graphics.shapes import Group, Drawing, Line, Rect, Polygon, Ellipse, \ - Wedge, String, SolidShape, UserNode, STATE_DEFAULTS -from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection, PropHolder -from reportlab.graphics.charts.piecharts import AbstractPieChart, WedgeProperties, _addWedgeLabel, fixLabelOverlaps -from reportlab.graphics.charts.textlabels import Label -from reportlab.graphics.widgets.markers import Marker -from functools import reduce - -class SectorProperties(WedgeProperties): - """This holds descriptive information about the sectors in a doughnut chart. - - It is not to be confused with the 'sector itself'; this just holds - a recipe for how to format one, and does not allow you to hack the - angles. It can format a genuine Sector object for you with its - format method. - """ - _attrMap = AttrMap(BASE=WedgeProperties, - ) - -class Doughnut(AbstractPieChart): - _attrMap = AttrMap( - x = AttrMapValue(isNumber, desc='X position of the chart within its container.'), - y = AttrMapValue(isNumber, desc='Y position of the chart within its container.'), - width = AttrMapValue(isNumber, desc='width of doughnut bounding box. Need not be same as width.'), - height = AttrMapValue(isNumber, desc='height of doughnut bounding box. Need not be same as height.'), - data = AttrMapValue(None, desc='list of numbers defining sector sizes; need not sum to 1'), - labels = AttrMapValue(isListOfStringsOrNone, desc="optional list of labels to use for each data point"), - startAngle = AttrMapValue(isNumber, desc="angle of first slice; like the compass, 0 is due North"), - direction = AttrMapValue(OneOf('clockwise', 'anticlockwise'), desc="'clockwise' or 'anticlockwise'"), - slices = AttrMapValue(None, desc="collection of sector descriptor objects"), - simpleLabels = AttrMapValue(isBoolean, desc="If true(default) use String not super duper WedgeLabel"), - # advanced usage - checkLabelOverlap = AttrMapValue(isBoolean, desc="If true check and attempt to fix\n standard label overlaps(default off)",advancedUsage=1), - sideLabels = AttrMapValue(isBoolean, desc="If true attempt to make chart with labels along side and pointers", advancedUsage=1) - ) - - def __init__(self): - self.x = 0 - self.y = 0 - self.width = 100 - self.height = 100 - self.data = [1,1] - self.labels = None # or list of strings - self.startAngle = 90 - self.direction = "clockwise" - self.simpleLabels = 1 - self.checkLabelOverlap = 0 - self.sideLabels = 0 - - self.slices = TypedPropertyCollection(SectorProperties) - self.slices[0].fillColor = colors.darkcyan - self.slices[1].fillColor = colors.blueviolet - self.slices[2].fillColor = colors.blue - self.slices[3].fillColor = colors.cyan - self.slices[4].fillColor = colors.pink - self.slices[5].fillColor = colors.magenta - self.slices[6].fillColor = colors.yellow - - - def demo(self): - d = Drawing(200, 100) - - dn = Doughnut() - dn.x = 50 - dn.y = 10 - dn.width = 100 - dn.height = 80 - dn.data = [10,20,30,40,50,60] - dn.labels = ['a','b','c','d','e','f'] - - dn.slices.strokeWidth=0.5 - dn.slices[3].popout = 10 - dn.slices[3].strokeWidth = 2 - dn.slices[3].strokeDashArray = [2,2] - dn.slices[3].labelRadius = 1.75 - dn.slices[3].fontColor = colors.red - dn.slices[0].fillColor = colors.darkcyan - dn.slices[1].fillColor = colors.blueviolet - dn.slices[2].fillColor = colors.blue - dn.slices[3].fillColor = colors.cyan - dn.slices[4].fillColor = colors.aquamarine - dn.slices[5].fillColor = colors.cadetblue - dn.slices[6].fillColor = colors.lightcoral - - d.add(dn) - return d - - def normalizeData(self, data=None): - from operator import add - sum = float(reduce(add,data,0)) - return abs(sum)>=1e-8 and list(map(lambda x,f=360./sum: f*x, data)) or len(data)*[0] - - def makeSectors(self): - # normalize slice data - if isinstance(self.data,(list,tuple)) and isinstance(self.data[0],(list,tuple)): - #it's a nested list, more than one sequence - normData = [] - n = [] - for l in self.data: - t = self.normalizeData(l) - normData.append(t) - n.append(len(t)) - self._seriesCount = max(n) - else: - normData = self.normalizeData(self.data) - n = len(normData) - self._seriesCount = n - - #labels - checkLabelOverlap = self.checkLabelOverlap - L = [] - L_add = L.append - - if self.labels is None: - labels = [] - if not isinstance(n,(list,tuple)): - labels = [''] * n - else: - for m in n: - labels = list(labels) + [''] * m - else: - labels = self.labels - #there's no point in raising errors for less than enough labels if - #we silently create all for the extreme case of no labels. - if not isinstance(n,(list,tuple)): - i = n-len(labels) - if i>0: - labels = list(labels) + [''] * i - else: - tlab = 0 - for m in n: - tlab += m - i = tlab-len(labels) - if i>0: - labels = list(labels) + [''] * i - - xradius = self.width/2.0 - yradius = self.height/2.0 - centerx = self.x + xradius - centery = self.y + yradius - - if self.direction == "anticlockwise": - whichWay = 1 - else: - whichWay = -1 - - g = Group() - - startAngle = self.startAngle #% 360 - styleCount = len(self.slices) - if isinstance(self.data[0],(list,tuple)): - #multi-series doughnut - ndata = len(self.data) - yir = (yradius/2.5)/ndata - xir = (xradius/2.5)/ndata - ydr = (yradius-yir)/ndata - xdr = (xradius-xir)/ndata - for sn,series in enumerate(normData): - for i,angle in enumerate(series): - endAngle = (startAngle + (angle * whichWay)) #% 360 - if abs(startAngle-endAngle)<1e-5: - startAngle = endAngle - continue - if startAngle < endAngle: - a1 = startAngle - a2 = endAngle - else: - a1 = endAngle - a2 = startAngle - startAngle = endAngle - - #if we didn't use %stylecount here we'd end up with the later sectors - #all having the default style - sectorStyle = self.slices[i%styleCount] - - # is it a popout? - cx, cy = centerx, centery - if sectorStyle.popout != 0: - # pop out the sector - averageAngle = (a1+a2)/2.0 - aveAngleRadians = averageAngle * pi/180.0 - popdistance = sectorStyle.popout - cx = centerx + popdistance * cos(aveAngleRadians) - cy = centery + popdistance * sin(aveAngleRadians) - - yr1 = yir+sn*ydr - yr = yr1 + ydr - xr1 = xir+sn*xdr - xr = xr1 + xdr - if isinstance(n,(list,tuple)): - theSector = Wedge(cx, cy, xr, a1, a2, yradius=yr, radius1=xr1, yradius1=yr1) - else: - theSector = Wedge(cx, cy, xr, a1, a2, yradius=yr, radius1=xr1, yradius1=yr1, annular=True) - - theSector.fillColor = sectorStyle.fillColor - theSector.strokeColor = sectorStyle.strokeColor - theSector.strokeWidth = sectorStyle.strokeWidth - theSector.strokeDashArray = sectorStyle.strokeDashArray - - g.add(theSector) - - if sn == 0: - text = self.getSeriesName(i,'') - if text: - averageAngle = (a1+a2)/2.0 - aveAngleRadians = averageAngle*pi/180.0 - labelRadius = sectorStyle.labelRadius - rx = xradius*labelRadius - ry = yradius*labelRadius - labelX = centerx + (0.5 * self.width * cos(aveAngleRadians) * labelRadius) - labelY = centery + (0.5 * self.height * sin(aveAngleRadians) * labelRadius) - l = _addWedgeLabel(self,text,averageAngle,labelX,labelY,sectorStyle) - if checkLabelOverlap: - l._origdata = { 'x': labelX, 'y':labelY, 'angle': averageAngle, - 'rx': rx, 'ry':ry, 'cx':cx, 'cy':cy, - 'bounds': l.getBounds(), - } - L_add(l) - - else: - #single series doughnut - yir = yradius/2.5 - xir = xradius/2.5 - for i,angle in enumerate(normData): - endAngle = (startAngle + (angle * whichWay)) #% 360 - if abs(startAngle-endAngle)<1e-5: - startAngle = endAngle - continue - if startAngle < endAngle: - a1 = startAngle - a2 = endAngle - else: - a1 = endAngle - a2 = startAngle - startAngle = endAngle - - #if we didn't use %stylecount here we'd end up with the later sectors - #all having the default style - sectorStyle = self.slices[i%styleCount] - - # is it a popout? - cx, cy = centerx, centery - if sectorStyle.popout != 0: - # pop out the sector - averageAngle = (a1+a2)/2.0 - aveAngleRadians = averageAngle * pi/180.0 - popdistance = sectorStyle.popout - cx = centerx + popdistance * cos(aveAngleRadians) - cy = centery + popdistance * sin(aveAngleRadians) - - if n > 1: - theSector = Wedge(cx, cy, xradius, a1, a2, yradius=yradius, radius1=xir, yradius1=yir) - elif n==1: - theSector = Wedge(cx, cy, xradius, a1, a2, yradius=yradius, radius1=xir, yradius1=yir, annular=True) - - theSector.fillColor = sectorStyle.fillColor - theSector.strokeColor = sectorStyle.strokeColor - theSector.strokeWidth = sectorStyle.strokeWidth - theSector.strokeDashArray = sectorStyle.strokeDashArray - - g.add(theSector) - - # now draw a label - if labels[i] != "": - averageAngle = (a1+a2)/2.0 - aveAngleRadians = averageAngle*pi/180.0 - labelRadius = sectorStyle.labelRadius - labelX = centerx + (0.5 * self.width * cos(aveAngleRadians) * labelRadius) - labelY = centery + (0.5 * self.height * sin(aveAngleRadians) * labelRadius) - rx = xradius*labelRadius - ry = yradius*labelRadius - l = _addWedgeLabel(self,labels[i],averageAngle,labelX,labelY,sectorStyle) - if checkLabelOverlap: - l._origdata = { 'x': labelX, 'y':labelY, 'angle': averageAngle, - 'rx': rx, 'ry':ry, 'cx':cx, 'cy':cy, - 'bounds': l.getBounds(), - } - L_add(l) - - if checkLabelOverlap and L: - fixLabelOverlaps(L) - - for l in L: g.add(l) - - return g - - def draw(self): - g = Group() - g.add(self.makeSectors()) - return g - - -def sample1(): - "Make up something from the individual Sectors" - - d = Drawing(400, 400) - g = Group() - - s1 = Wedge(centerx=200, centery=200, radius=150, startangledegrees=0, endangledegrees=120, radius1=100) - s1.fillColor=colors.red - s1.strokeColor=None - d.add(s1) - s2 = Wedge(centerx=200, centery=200, radius=150, startangledegrees=120, endangledegrees=240, radius1=100) - s2.fillColor=colors.green - s2.strokeColor=None - d.add(s2) - s3 = Wedge(centerx=200, centery=200, radius=150, startangledegrees=240, endangledegrees=260, radius1=100) - s3.fillColor=colors.blue - s3.strokeColor=None - d.add(s3) - s4 = Wedge(centerx=200, centery=200, radius=150, startangledegrees=260, endangledegrees=360, radius1=100) - s4.fillColor=colors.gray - s4.strokeColor=None - d.add(s4) - - return d - -def sample2(): - "Make a simple demo" - - d = Drawing(400, 400) - - dn = Doughnut() - dn.x = 50 - dn.y = 50 - dn.width = 300 - dn.height = 300 - dn.data = [10,20,30,40,50,60] - - d.add(dn) - - return d - -def sample3(): - "Make a more complex demo" - - d = Drawing(400, 400) - dn = Doughnut() - dn.x = 50 - dn.y = 50 - dn.width = 300 - dn.height = 300 - dn.data = [[10,20,30,40,50,60], [10,20,30,40]] - dn.labels = ['a','b','c','d','e','f'] - - d.add(dn) - - return d - -def sample4(): - "Make a more complex demo with Label Overlap fixing" - - d = Drawing(400, 400) - dn = Doughnut() - dn.x = 50 - dn.y = 50 - dn.width = 300 - dn.height = 300 - dn.data = [[10,20,30,40,50,60], [10,20,30,40]] - dn.labels = ['a','b','c','d','e','f'] - dn.checkLabelOverlap = True - - d.add(dn) - - return d - -if __name__=='__main__': - - from reportlab.graphics.renderPDF import drawToFile - d = sample1() - drawToFile(d, 'doughnut1.pdf') - d = sample2() - drawToFile(d, 'doughnut2.pdf') - d = sample3() - drawToFile(d, 'doughnut3.pdf') diff --git a/reportlab/graphics/charts/legends.py b/reportlab/graphics/charts/legends.py deleted file mode 100644 index ea532ca4..00000000 --- a/reportlab/graphics/charts/legends.py +++ /dev/null @@ -1,716 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/legends.py - -__version__=''' $Id$ ''' -__doc__="""This will be a collection of legends to be used with charts.""" - -import copy, operator - -from reportlab.lib import colors -from reportlab.lib.validators import isNumber, OneOf, isString, isColorOrNone,\ - isNumberOrNone, isListOfNumbersOrNone, isStringOrNone, isBoolean,\ - EitherOr, NoneOr, AutoOr, isAuto, Auto, isBoxAnchor, SequenceOf, isInstanceOf -from reportlab.lib.attrmap import * -from reportlab.pdfbase.pdfmetrics import stringWidth, getFont -from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection, PropHolder -from reportlab.graphics.shapes import Drawing, Group, String, Rect, Line, STATE_DEFAULTS -from reportlab.graphics.charts.areas import PlotArea -from reportlab.graphics.widgets.markers import uSymbol2Symbol, isSymbol -from reportlab.lib.utils import isSeq, find_locals -from reportlab.graphics.shapes import _baseGFontName -from functools import reduce - -def _transMax(n,A): - X = n*[0] - m = 0 - for a in A: - m = max(m,len(a)) - for i,x in enumerate(a): - X[i] = max(X[i],x) - X = [0] + X[:m] - for i in range(m): - X[i+1] += X[i] - return X - -def _objStr(s): - if isinstance(s,str): - return s - else: - return str(s) - -def _getStr(s): - if isSeq(s): - return list(map(_getStr,s)) - else: - return _objStr(s) - -def _getLines(s): - if isSeq(s): - return tuple([(x or '').split('\n') for x in s]) - else: - return (s or '').split('\n') - -def _getLineCount(s): - T = _getLines(s) - if isSeq(s): - return max([len(x) for x in T]) - else: - return len(T) - -def _getWidths(i,s, fontName, fontSize, subCols): - S = [] - aS = S.append - if isSeq(s): - for j,t in enumerate(s): - sc = subCols[j,i] - fN = getattr(sc,'fontName',fontName) - fS = getattr(sc,'fontSize',fontSize) - m = [stringWidth(x, fN, fS) for x in t.split('\n')] - m = max(sc.minWidth,m and max(m) or 0) - aS(m) - aS(sc.rpad) - del S[-1] - else: - sc = subCols[0,i] - fN = getattr(sc,'fontName',fontName) - fS = getattr(sc,'fontSize',fontSize) - m = [stringWidth(x, fN, fS) for x in s.split('\n')] - aS(max(sc.minWidth,m and max(m) or 0)) - return S - -class SubColProperty(PropHolder): - dividerLines = 0 - _attrMap = AttrMap( - minWidth = AttrMapValue(isNumber,desc="minimum width for this subcol"), - rpad = AttrMapValue(isNumber,desc="right padding for this subcol"), - align = AttrMapValue(OneOf('left','right','center','centre','numeric'),desc='alignment in subCol'), - fontName = AttrMapValue(isString, desc="Font name of the strings"), - fontSize = AttrMapValue(isNumber, desc="Font size of the strings"), - leading = AttrMapValue(isNumber, desc="leading for the strings"), - fillColor = AttrMapValue(isColorOrNone, desc="fontColor"), - underlines = AttrMapValue(EitherOr((NoneOr(isInstanceOf(Line)),SequenceOf(isInstanceOf(Line),emptyOK=0,lo=0,hi=0x7fffffff))), desc="underline definitions"), - overlines = AttrMapValue(EitherOr((NoneOr(isInstanceOf(Line)),SequenceOf(isInstanceOf(Line),emptyOK=0,lo=0,hi=0x7fffffff))), desc="overline definitions"), - dx = AttrMapValue(isNumber, desc="x offset from default position"), - dy = AttrMapValue(isNumber, desc="y offset from default position"), - ) - -class LegendCallout: - def _legendValues(legend,*args): - '''return a tuple of values from the first function up the stack with isinstance(self,legend)''' - L = find_locals(lambda L: L.get('self',None) is legend and L or None) - return tuple([L[a] for a in args]) - _legendValues = staticmethod(_legendValues) - - def _selfOrLegendValues(self,legend,*args): - L = find_locals(lambda L: L.get('self',None) is legend and L or None) - return tuple([getattr(self,a,L[a]) for a in args]) - - def __call__(self,legend,g,thisx,y,colName): - col, name = colName - -class LegendSwatchCallout(LegendCallout): - def __call__(self,legend,g,thisx,y,i,colName,swatch): - col, name = colName - -class LegendColEndCallout(LegendCallout): - def __call__(self,legend, g, x, xt, y, width, lWidth): - pass - -class Legend(Widget): - """A simple legend containing rectangular swatches and strings. - - The swatches are filled rectangles whenever the respective - color object in 'colorNamePairs' is a subclass of Color in - reportlab.lib.colors. Otherwise the object passed instead is - assumed to have 'x', 'y', 'width' and 'height' attributes. - A legend then tries to set them or catches any error. This - lets you plug-in any widget you like as a replacement for - the default rectangular swatches. - - Strings can be nicely aligned left or right to the swatches. - """ - - _attrMap = AttrMap( - x = AttrMapValue(isNumber, desc="x-coordinate of upper-left reference point"), - y = AttrMapValue(isNumber, desc="y-coordinate of upper-left reference point"), - deltax = AttrMapValue(isNumberOrNone, desc="x-distance between neighbouring swatches"), - deltay = AttrMapValue(isNumberOrNone, desc="y-distance between neighbouring swatches"), - dxTextSpace = AttrMapValue(isNumber, desc="Distance between swatch rectangle and text"), - autoXPadding = AttrMapValue(isNumber, desc="x Padding between columns if deltax=None",advancedUsage=1), - autoYPadding = AttrMapValue(isNumber, desc="y Padding between rows if deltay=None",advancedUsage=1), - yGap = AttrMapValue(isNumber, desc="Additional gap between rows",advancedUsage=1), - dx = AttrMapValue(isNumber, desc="Width of swatch rectangle"), - dy = AttrMapValue(isNumber, desc="Height of swatch rectangle"), - columnMaximum = AttrMapValue(isNumber, desc="Max. number of items per column"), - alignment = AttrMapValue(OneOf("left", "right"), desc="Alignment of text with respect to swatches"), - colorNamePairs = AttrMapValue(None, desc="List of color/name tuples (color can also be widget)"), - fontName = AttrMapValue(isString, desc="Font name of the strings"), - fontSize = AttrMapValue(isNumber, desc="Font size of the strings"), - fillColor = AttrMapValue(isColorOrNone, desc="swatches filling color"), - strokeColor = AttrMapValue(isColorOrNone, desc="Border color of the swatches"), - strokeWidth = AttrMapValue(isNumber, desc="Width of the border color of the swatches"), - swatchMarker = AttrMapValue(NoneOr(AutoOr(isSymbol)), desc="None, Auto() or makeMarker('Diamond') ...",advancedUsage=1), - callout = AttrMapValue(None, desc="a user callout(self,g,x,y,(color,text))",advancedUsage=1), - boxAnchor = AttrMapValue(isBoxAnchor,'Anchor point for the legend area'), - variColumn = AttrMapValue(isBoolean,'If true column widths may vary (default is false)',advancedUsage=1), - dividerLines = AttrMapValue(OneOf(0,1,2,3,4,5,6,7),'If 1 we have dividers between the rows | 2 for extra top | 4 for bottom',advancedUsage=1), - dividerWidth = AttrMapValue(isNumber, desc="dividerLines width",advancedUsage=1), - dividerColor = AttrMapValue(isColorOrNone, desc="dividerLines color",advancedUsage=1), - dividerDashArray = AttrMapValue(isListOfNumbersOrNone, desc='Dash array for dividerLines.',advancedUsage=1), - dividerOffsX = AttrMapValue(SequenceOf(isNumber,emptyOK=0,lo=2,hi=2), desc='divider lines X offsets',advancedUsage=1), - dividerOffsY = AttrMapValue(isNumber, desc="dividerLines Y offset",advancedUsage=1), - colEndCallout = AttrMapValue(None, desc="a user callout(self,g, x, xt, y,width, lWidth)",advancedUsage=1), - subCols = AttrMapValue(None,desc="subColumn properties"), - swatchCallout = AttrMapValue(None, desc="a user swatch callout(self,g,x,y,i,(col,name),swatch)",advancedUsage=1), - swdx = AttrMapValue(isNumber, desc="x position adjustment for the swatch"), - swdy = AttrMapValue(isNumber, desc="y position adjustment for the swatch"), - ) - - def __init__(self): - # Upper-left reference point. - self.x = 0 - self.y = 0 - - # Alginment of text with respect to swatches. - self.alignment = "left" - - # x- and y-distances between neighbouring swatches. - self.deltax = 75 - self.deltay = 20 - self.autoXPadding = 5 - self.autoYPadding = 2 - - # Size of swatch rectangle. - self.dx = 10 - self.dy = 10 - - self.swdx = 0 - self.swdy = 0 - - # Distance between swatch rectangle and text. - self.dxTextSpace = 10 - - # Max. number of items per column. - self.columnMaximum = 3 - - # Color/name pairs. - self.colorNamePairs = [ (colors.red, "red"), - (colors.blue, "blue"), - (colors.green, "green"), - (colors.pink, "pink"), - (colors.yellow, "yellow") ] - - # Font name and size of the labels. - self.fontName = STATE_DEFAULTS['fontName'] - self.fontSize = STATE_DEFAULTS['fontSize'] - self.fillColor = STATE_DEFAULTS['fillColor'] - self.strokeColor = STATE_DEFAULTS['strokeColor'] - self.strokeWidth = STATE_DEFAULTS['strokeWidth'] - self.swatchMarker = None - self.boxAnchor = 'nw' - self.yGap = 0 - self.variColumn = 0 - self.dividerLines = 0 - self.dividerWidth = 0.5 - self.dividerDashArray = None - self.dividerColor = colors.black - self.dividerOffsX = (0,0) - self.dividerOffsY = 0 - self.colEndCallout = None - self._init_subCols() - - def _init_subCols(self): - sc = self.subCols = TypedPropertyCollection(SubColProperty) - sc.rpad = 1 - sc.dx = sc.dy = sc.minWidth = 0 - sc.align = 'right' - sc[0].align = 'left' - - def _getChartStyleName(self,chart): - for a in 'lines', 'bars', 'slices', 'strands': - if hasattr(chart,a): return a - return None - - def _getChartStyle(self,chart): - return getattr(chart,self._getChartStyleName(chart),None) - - def _getTexts(self,colorNamePairs): - if not isAuto(colorNamePairs): - texts = [_getStr(p[1]) for p in colorNamePairs] - else: - chart = getattr(colorNamePairs,'chart',getattr(colorNamePairs,'obj',None)) - texts = [chart.getSeriesName(i,'series %d' % i) for i in range(chart._seriesCount)] - return texts - - def _calculateMaxBoundaries(self, colorNamePairs): - "Calculate the maximum width of some given strings." - fontName = self.fontName - fontSize = self.fontSize - subCols = self.subCols - - M = [_getWidths(i, m, fontName, fontSize, subCols) for i,m in enumerate(self._getTexts(colorNamePairs))] - if not M: - return [0,0] - n = max([len(m) for m in M]) - if self.variColumn: - columnMaximum = self.columnMaximum - return [_transMax(n,M[r:r+columnMaximum]) for r in range(0,len(M),self.columnMaximum)] - else: - return _transMax(n,M) - - def _calcHeight(self): - dy = self.dy - yGap = self.yGap - thisy = upperlefty = self.y - dy - fontSize = self.fontSize - ascent=getFont(self.fontName).face.ascent/1000. - if ascent==0: ascent=0.718 # default (from helvetica) - ascent *= fontSize - leading = fontSize*1.2 - deltay = self.deltay - if not deltay: deltay = max(dy,leading)+self.autoYPadding - columnCount = 0 - count = 0 - lowy = upperlefty - lim = self.columnMaximum - 1 - for name in self._getTexts(self.colorNamePairs): - y0 = thisy+(dy-ascent)*0.5 - y = y0 - _getLineCount(name)*leading - leadingMove = 2*y0-y-thisy - newy = thisy-max(deltay,leadingMove)-yGap - lowy = min(y,newy,lowy) - if count==lim: - count = 0 - thisy = upperlefty - columnCount = columnCount + 1 - else: - thisy = newy - count = count+1 - return upperlefty - lowy - - def _defaultSwatch(self,x,thisy,dx,dy,fillColor,strokeWidth,strokeColor): - return Rect(x, thisy, dx, dy, - fillColor = fillColor, - strokeColor = strokeColor, - strokeWidth = strokeWidth, - ) - - def draw(self): - colorNamePairs = self.colorNamePairs - autoCP = isAuto(colorNamePairs) - if autoCP: - chart = getattr(colorNamePairs,'chart',getattr(colorNamePairs,'obj',None)) - swatchMarker = None - autoCP = Auto(obj=chart) - n = chart._seriesCount - chartTexts = self._getTexts(colorNamePairs) - else: - swatchMarker = getattr(self,'swatchMarker',None) - if isAuto(swatchMarker): - chart = getattr(swatchMarker,'chart',getattr(swatchMarker,'obj',None)) - swatchMarker = Auto(obj=chart) - n = len(colorNamePairs) - dx = self.dx - dy = self.dy - alignment = self.alignment - columnMaximum = self.columnMaximum - deltax = self.deltax - deltay = self.deltay - dxTextSpace = self.dxTextSpace - fontName = self.fontName - fontSize = self.fontSize - fillColor = self.fillColor - strokeWidth = self.strokeWidth - strokeColor = self.strokeColor - subCols = self.subCols - leading = fontSize*1.2 - yGap = self.yGap - if not deltay: - deltay = max(dy,leading)+self.autoYPadding - ba = self.boxAnchor - maxWidth = self._calculateMaxBoundaries(colorNamePairs) - nCols = int((n+columnMaximum-1)/(columnMaximum*1.0)) - xW = dx+dxTextSpace+self.autoXPadding - variColumn = self.variColumn - if variColumn: - width = reduce(operator.add,[m[-1] for m in maxWidth],0)+xW*nCols - else: - deltax = max(maxWidth[-1]+xW,deltax) - width = maxWidth[-1]+nCols*deltax - maxWidth = nCols*[maxWidth] - - thisx = self.x - thisy = self.y - self.dy - if ba not in ('ne','n','nw','autoy'): - height = self._calcHeight() - if ba in ('e','c','w'): - thisy += height/2. - else: - thisy += height - if ba not in ('nw','w','sw','autox'): - if ba in ('n','c','s'): - thisx -= width/2 - else: - thisx -= width - upperlefty = thisy - - g = Group() - - ascent=getFont(fontName).face.ascent/1000. - if ascent==0: ascent=0.718 # default (from helvetica) - ascent *= fontSize # normalize - - lim = columnMaximum - 1 - callout = getattr(self,'callout',None) - scallout = getattr(self,'swatchCallout',None) - dividerLines = self.dividerLines - if dividerLines: - dividerWidth = self.dividerWidth - dividerColor = self.dividerColor - dividerDashArray = self.dividerDashArray - dividerOffsX = self.dividerOffsX - dividerOffsY = self.dividerOffsY - - for i in range(n): - if autoCP: - col = autoCP - col.index = i - name = chartTexts[i] - else: - col, name = colorNamePairs[i] - if isAuto(swatchMarker): - col = swatchMarker - col.index = i - if isAuto(name): - name = getattr(swatchMarker,'chart',getattr(swatchMarker,'obj',None)).getSeriesName(i,'series %d' % i) - T = _getLines(name) - S = [] - aS = S.append - j = int(i/(columnMaximum*1.0)) - jOffs = maxWidth[j] - - # thisy+dy/2 = y+leading/2 - y = y0 = thisy+(dy-ascent)*0.5 - - if callout: callout(self,g,thisx,y,(col,name)) - if alignment == "left": - x = thisx - xn = thisx+jOffs[-1]+dxTextSpace - elif alignment == "right": - x = thisx+dx+dxTextSpace - xn = thisx - else: - raise ValueError("bad alignment") - if not isSeq(name): - T = [T] - yd = y - for k,lines in enumerate(T): - y = y0 - kk = k*2 - x1 = x+jOffs[kk] - x2 = x+jOffs[kk+1] - sc = subCols[k,i] - anchor = sc.align - scdx = sc.dx - scdy = sc.dy - fN = getattr(sc,'fontName',fontName) - fS = getattr(sc,'fontSize',fontSize) - fC = getattr(sc,'fillColor',fillColor) - fL = getattr(sc,'leading',1.2*fontSize) - if fN==fontName: - fA = (ascent*fS)/fontSize - else: - fA = getFont(fontName).face.ascent/1000. - if fA==0: fA=0.718 - fA *= fS - if anchor=='left': - anchor = 'start' - xoffs = x1 - elif anchor=='right': - anchor = 'end' - xoffs = x2 - elif anchor=='numeric': - xoffs = x2 - else: - anchor = 'middle' - xoffs = 0.5*(x1+x2) - for t in lines: - aS(String(xoffs+scdx,y+scdy,t,fontName=fN,fontSize=fS,fillColor=fC, textAnchor = anchor)) - y -= fL - yd = min(yd,y) - y += fL - for iy, a in ((y-max(fL-fA,0),'underlines'),(y+fA,'overlines')): - il = getattr(sc,a,None) - if il: - if not isinstance(il,(tuple,list)): il = (il,) - for l in il: - l = copy.copy(l) - l.y1 += iy - l.y2 += iy - l.x1 += x1 - l.x2 += x2 - aS(l) - x = xn - y = yd - leadingMove = 2*y0-y-thisy - - if dividerLines: - xd = thisx+dx+dxTextSpace+jOffs[-1]+dividerOffsX[1] - yd = thisy+dy*0.5+dividerOffsY - if ((dividerLines&1) and i%columnMaximum) or ((dividerLines&2) and not i%columnMaximum): - g.add(Line(thisx+dividerOffsX[0],yd,xd,yd, - strokeColor=dividerColor, strokeWidth=dividerWidth, strokeDashArray=dividerDashArray)) - - if (dividerLines&4) and (i%columnMaximum==lim or i==(n-1)): - yd -= max(deltay,leadingMove)+yGap - g.add(Line(thisx+dividerOffsX[0],yd,xd,yd, - strokeColor=dividerColor, strokeWidth=dividerWidth, strokeDashArray=dividerDashArray)) - - # Make a 'normal' color swatch... - swatchX = x + getattr(self,'swdx',0) - swatchY = thisy + getattr(self,'swdy',0) - - if isAuto(col): - chart = getattr(col,'chart',getattr(col,'obj',None)) - c = chart.makeSwatchSample(getattr(col,'index',i),swatchX,swatchY,dx,dy) - elif isinstance(col, colors.Color): - if isSymbol(swatchMarker): - c = uSymbol2Symbol(swatchMarker,swatchX+dx/2.,swatchY+dy/2.,col) - else: - c = self._defaultSwatch(swatchX,swatchY,dx,dy,fillColor=col,strokeWidth=strokeWidth,strokeColor=strokeColor) - elif col is not None: - try: - c = copy.deepcopy(col) - c.x = swatchX - c.y = swatchY - c.width = dx - c.height = dy - except: - c = None - else: - c = None - - if c: - g.add(c) - if scallout: scallout(self,g,thisx,y0,i,(col,name),c) - - for s in S: g.add(s) - if self.colEndCallout and (i%columnMaximum==lim or i==(n-1)): - if alignment == "left": - xt = thisx - else: - xt = thisx+dx+dxTextSpace - yd = thisy+dy*0.5+dividerOffsY - (max(deltay,leadingMove)+yGap) - self.colEndCallout(self, g, thisx, xt, yd, jOffs[-1], jOffs[-1]+dx+dxTextSpace) - - if i%columnMaximum==lim: - if variColumn: - thisx += jOffs[-1]+xW - else: - thisx = thisx+deltax - thisy = upperlefty - else: - thisy = thisy-max(deltay,leadingMove)-yGap - - return g - - def demo(self): - "Make sample legend." - - d = Drawing(200, 100) - - legend = Legend() - legend.alignment = 'left' - legend.x = 0 - legend.y = 100 - legend.dxTextSpace = 5 - items = 'red green blue yellow pink black white'.split() - items = [(getattr(colors, i), i) for i in items] - legend.colorNamePairs = items - - d.add(legend, 'legend') - - return d - -class TotalAnnotator(LegendColEndCallout): - def __init__(self, lText='Total', rText='0.0', fontName=_baseGFontName, fontSize=10, - fillColor=colors.black, strokeWidth=0.5, strokeColor=colors.black, strokeDashArray=None, - dx=0, dy=0, dly=0, dlx=(0,0)): - self.lText = lText - self.rText = rText - self.fontName = fontName - self.fontSize = fontSize - self.fillColor = fillColor - self.dy = dy - self.dx = dx - self.dly = dly - self.dlx = dlx - self.strokeWidth = strokeWidth - self.strokeColor = strokeColor - self.strokeDashArray = strokeDashArray - - def __call__(self,legend, g, x, xt, y, width, lWidth): - from reportlab.graphics.shapes import String, Line - fontSize = self.fontSize - fontName = self.fontName - fillColor = self.fillColor - strokeColor = self.strokeColor - strokeWidth = self.strokeWidth - ascent=getFont(fontName).face.ascent/1000. - if ascent==0: ascent=0.718 # default (from helvetica) - ascent *= fontSize - leading = fontSize*1.2 - yt = y+self.dy-ascent*1.3 - if self.lText and fillColor: - g.add(String(xt,yt,self.lText, - fontName=fontName, - fontSize=fontSize, - fillColor=fillColor, - textAnchor = "start")) - if self.rText: - g.add(String(xt+width,yt,self.rText, - fontName=fontName, - fontSize=fontSize, - fillColor=fillColor, - textAnchor = "end")) - if strokeWidth and strokeColor: - yL = y+self.dly-leading - g.add(Line(x+self.dlx[0],yL,x+self.dlx[1]+lWidth,yL, - strokeColor=strokeColor, strokeWidth=strokeWidth, - strokeDashArray=self.strokeDashArray)) - -class LineSwatch(Widget): - """basically a Line with properties added so it can be used in a LineLegend""" - _attrMap = AttrMap( - x = AttrMapValue(isNumber, desc="x-coordinate for swatch line start point"), - y = AttrMapValue(isNumber, desc="y-coordinate for swatch line start point"), - width = AttrMapValue(isNumber, desc="length of swatch line"), - height = AttrMapValue(isNumber, desc="used for line strokeWidth"), - strokeColor = AttrMapValue(isColorOrNone, desc="color of swatch line"), - strokeDashArray = AttrMapValue(isListOfNumbersOrNone, desc="dash array for swatch line"), - ) - - def __init__(self): - from reportlab.lib.colors import red - from reportlab.graphics.shapes import Line - self.x = 0 - self.y = 0 - self.width = 20 - self.height = 1 - self.strokeColor = red - self.strokeDashArray = None - - def draw(self): - l = Line(self.x,self.y,self.x+self.width,self.y) - l.strokeColor = self.strokeColor - l.strokeDashArray = self.strokeDashArray - l.strokeWidth = self.height - return l - -class LineLegend(Legend): - """A subclass of Legend for drawing legends with lines as the - swatches rather than rectangles. Useful for lineCharts and - linePlots. Should be similar in all other ways the the standard - Legend class. - """ - - def __init__(self): - Legend.__init__(self) - - # Size of swatch rectangle. - self.dx = 10 - self.dy = 2 - - def _defaultSwatch(self,x,thisy,dx,dy,fillColor,strokeWidth,strokeColor): - l = LineSwatch() - l.x = x - l.y = thisy - l.width = dx - l.height = dy - l.strokeColor = fillColor - return l - -def sample1c(): - "Make sample legend." - - d = Drawing(200, 100) - - legend = Legend() - legend.alignment = 'right' - legend.x = 0 - legend.y = 100 - legend.dxTextSpace = 5 - items = 'red green blue yellow pink black white'.split() - items = [(getattr(colors, i), i) for i in items] - legend.colorNamePairs = items - - d.add(legend, 'legend') - - return d - - -def sample2c(): - "Make sample legend." - - d = Drawing(200, 100) - - legend = Legend() - legend.alignment = 'right' - legend.x = 20 - legend.y = 90 - legend.deltax = 60 - legend.dxTextSpace = 10 - legend.columnMaximum = 4 - items = 'red green blue yellow pink black white'.split() - items = [(getattr(colors, i), i) for i in items] - legend.colorNamePairs = items - - d.add(legend, 'legend') - - return d - -def sample3(): - "Make sample legend with line swatches." - - d = Drawing(200, 100) - - legend = LineLegend() - legend.alignment = 'right' - legend.x = 20 - legend.y = 90 - legend.deltax = 60 - legend.dxTextSpace = 10 - legend.columnMaximum = 4 - items = 'red green blue yellow pink black white'.split() - items = [(getattr(colors, i), i) for i in items] - legend.colorNamePairs = items - d.add(legend, 'legend') - - return d - - -def sample3a(): - "Make sample legend with line swatches and dasharrays on the lines." - - d = Drawing(200, 100) - - legend = LineLegend() - legend.alignment = 'right' - legend.x = 20 - legend.y = 90 - legend.deltax = 60 - legend.dxTextSpace = 10 - legend.columnMaximum = 4 - items = 'red green blue yellow pink black white'.split() - darrays = ([2,1], [2,5], [2,2,5,5], [1,2,3,4], [4,2,3,4], [1,2,3,4,5,6], [1]) - cnp = [] - for i in range(0, len(items)): - l = LineSwatch() - l.strokeColor = getattr(colors, items[i]) - l.strokeDashArray = darrays[i] - cnp.append((l, items[i])) - legend.colorNamePairs = cnp - d.add(legend, 'legend') - - return d diff --git a/reportlab/graphics/charts/linecharts.py b/reportlab/graphics/charts/linecharts.py deleted file mode 100644 index 400f8500..00000000 --- a/reportlab/graphics/charts/linecharts.py +++ /dev/null @@ -1,715 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2004 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/linecharts.py - -__version__=''' $Id$ ''' -__doc__="""This modules defines a very preliminary Line Chart example.""" - -from reportlab.lib import colors -from reportlab.lib.validators import isNumber, isNumberOrNone, isColor, isColorOrNone, isListOfStrings, \ - isListOfStringsOrNone, SequenceOf, isBoolean, NoneOr, \ - isListOfNumbersOrNone, isStringOrNone, OneOf, Percentage -from reportlab.lib.attrmap import * -from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection, PropHolder -from reportlab.graphics.shapes import Line, Rect, Group, Drawing, Polygon, PolyLine -from reportlab.graphics.widgets.signsandsymbols import NoEntry -from reportlab.graphics.charts.axes import XCategoryAxis, YValueAxis -from reportlab.graphics.charts.textlabels import Label -from reportlab.graphics.widgets.markers import uSymbol2Symbol, isSymbol, makeMarker -from reportlab.graphics.charts.areas import PlotArea -from reportlab.graphics.charts.legends import _objStr - -class LineChartProperties(PropHolder): - _attrMap = AttrMap( - strokeWidth = AttrMapValue(isNumber, desc='Width of a line.'), - strokeColor = AttrMapValue(isColorOrNone, desc='Color of a line or border.'), - fillColor = AttrMapValue(isColorOrNone, desc='fill color of a bar.'), - strokeDashArray = AttrMapValue(isListOfNumbersOrNone, desc='Dash array of a line.'), - symbol = AttrMapValue(NoneOr(isSymbol), desc='Widget placed at data points.',advancedUsage=1), - shader = AttrMapValue(None, desc='Shader Class.',advancedUsage=1), - filler = AttrMapValue(None, desc='Filler Class.',advancedUsage=1), - name = AttrMapValue(isStringOrNone, desc='Name of the line.'), - lineStyle = AttrMapValue(NoneOr(OneOf('line','joinedLine','bar')), desc="What kind of plot this line is",advancedUsage=1), - barWidth = AttrMapValue(isNumberOrNone,desc="Percentage of available width to be used for a bar",advancedUsage=1), - ) - -class AbstractLineChart(PlotArea): - - def makeSwatchSample(self,rowNo, x, y, width, height): - baseStyle = self.lines - styleIdx = rowNo % len(baseStyle) - style = baseStyle[styleIdx] - color = style.strokeColor - yh2 = y+height/2. - lineStyle = getattr(style,'lineStyle',None) - if lineStyle=='bar': - dash = getattr(style, 'strokeDashArray', getattr(baseStyle,'strokeDashArray',None)) - strokeWidth= getattr(style, 'strokeWidth', getattr(style, 'strokeWidth',None)) - L = Rect(x,y,width,height,strokeWidth=strokeWidth,strokeColor=color,strokeLineCap=0,strokeDashArray=dash,fillColor=getattr(style,'fillColor',color)) - elif self.joinedLines or lineStyle=='joinedLine': - dash = getattr(style, 'strokeDashArray', getattr(baseStyle,'strokeDashArray',None)) - strokeWidth= getattr(style, 'strokeWidth', getattr(style, 'strokeWidth',None)) - L = Line(x,yh2,x+width,yh2,strokeColor=color,strokeLineCap=0) - if strokeWidth: L.strokeWidth = strokeWidth - if dash: L.strokeDashArray = dash - else: - L = None - - if hasattr(style, 'symbol'): - S = style.symbol - elif hasattr(baseStyle, 'symbol'): - S = baseStyle.symbol - else: - S = None - - if S: S = uSymbol2Symbol(S,x+width/2.,yh2,color) - if S and L: - g = Group() - g.add(L) - g.add(S) - return g - return S or L - - def getSeriesName(self,i,default=None): - '''return series name i or default''' - return _objStr(getattr(self.lines[i],'name',default)) - -class LineChart(AbstractLineChart): - pass - -# This is conceptually similar to the VerticalBarChart. -# Still it is better named HorizontalLineChart... :-/ - -class HorizontalLineChart(LineChart): - """Line chart with multiple lines. - - A line chart is assumed to have one category and one value axis. - Despite its generic name this particular line chart class has - a vertical value axis and a horizontal category one. It may - evolve into individual horizontal and vertical variants (like - with the existing bar charts). - - Available attributes are: - - x: x-position of lower-left chart origin - y: y-position of lower-left chart origin - width: chart width - height: chart height - - useAbsolute: disables auto-scaling of chart elements (?) - lineLabelNudge: distance of data labels to data points - lineLabels: labels associated with data values - lineLabelFormat: format string or callback function - groupSpacing: space between categories - - joinedLines: enables drawing of lines - - strokeColor: color of chart lines (?) - fillColor: color for chart background (?) - lines: style list, used cyclically for data series - - valueAxis: value axis object - categoryAxis: category axis object - categoryNames: category names - - data: chart data, a list of data series of equal length - """ - - _attrMap = AttrMap(BASE=LineChart, - useAbsolute = AttrMapValue(isNumber, desc='Flag to use absolute spacing values.',advancedUsage=1), - lineLabelNudge = AttrMapValue(isNumber, desc='Distance between a data point and its label.',advancedUsage=1), - lineLabels = AttrMapValue(None, desc='Handle to the list of data point labels.'), - lineLabelFormat = AttrMapValue(None, desc='Formatting string or function used for data point labels.'), - lineLabelArray = AttrMapValue(None, desc='explicit array of line label values, must match size of data if present.'), - groupSpacing = AttrMapValue(isNumber, desc='? - Likely to disappear.'), - joinedLines = AttrMapValue(isNumber, desc='Display data points joined with lines if true.'), - lines = AttrMapValue(None, desc='Handle of the lines.'), - valueAxis = AttrMapValue(None, desc='Handle of the value axis.'), - categoryAxis = AttrMapValue(None, desc='Handle of the category axis.'), - categoryNames = AttrMapValue(isListOfStringsOrNone, desc='List of category names.'), - data = AttrMapValue(None, desc='Data to be plotted, list of (lists of) numbers.'), - inFill = AttrMapValue(isBoolean, desc='Whether infilling should be done.',advancedUsage=1), - reversePlotOrder = AttrMapValue(isBoolean, desc='If true reverse plot order.',advancedUsage=1), - annotations = AttrMapValue(None, desc='list of callables, will be called with self, xscale, yscale.',advancedUsage=1), - ) - - def __init__(self): - LineChart.__init__(self) - - # Allow for a bounding rectangle. - self.strokeColor = None - self.fillColor = None - - # Named so we have less recoding for the horizontal one :-) - self.categoryAxis = XCategoryAxis() - self.valueAxis = YValueAxis() - - # This defines two series of 3 points. Just an example. - self.data = [(100,110,120,130), - (70, 80, 80, 90)] - self.categoryNames = ('North','South','East','West') - - self.lines = TypedPropertyCollection(LineChartProperties) - self.lines.strokeWidth = 1 - self.lines[0].strokeColor = colors.red - self.lines[1].strokeColor = colors.green - self.lines[2].strokeColor = colors.blue - - # control spacing. if useAbsolute = 1 then - # the next parameters are in points; otherwise - # they are 'proportions' and are normalized to - # fit the available space. - self.useAbsolute = 0 #- not done yet - self.groupSpacing = 1 #5 - - self.lineLabels = TypedPropertyCollection(Label) - self.lineLabelFormat = None - self.lineLabelArray = None - - # This says whether the origin is above or below - # the data point. +10 means put the origin ten points - # above the data point if value > 0, or ten - # points below if data value < 0. This is different - # to label dx/dy which are not dependent on the - # sign of the data. - self.lineLabelNudge = 10 - # If you have multiple series, by default they butt - # together. - - # New line chart attributes. - self.joinedLines = 1 # Connect items with straight lines. - self.inFill = 0 - self.reversePlotOrder = 0 - - - def demo(self): - """Shows basic use of a line chart.""" - - drawing = Drawing(200, 100) - - data = [ - (13, 5, 20, 22, 37, 45, 19, 4), - (14, 10, 21, 28, 38, 46, 25, 5) - ] - - lc = HorizontalLineChart() - - lc.x = 20 - lc.y = 10 - lc.height = 85 - lc.width = 170 - lc.data = data - lc.lines.symbol = makeMarker('Circle') - - drawing.add(lc) - - return drawing - - - def calcPositions(self): - """Works out where they go. - - Sets an attribute _positions which is a list of - lists of (x, y) matching the data. - """ - - self._seriesCount = len(self.data) - self._rowLength = max(list(map(len,self.data))) - - if self.useAbsolute: - # Dimensions are absolute. - normFactor = 1.0 - else: - # Dimensions are normalized to fit. - normWidth = self.groupSpacing - availWidth = self.categoryAxis.scale(0)[1] - normFactor = availWidth / normWidth - self._normFactor = normFactor - self._yzero = yzero = self.valueAxis.scale(0) - self._hngs = hngs = 0.5 * self.groupSpacing * normFactor - - self._positions = [] - for rowNo in range(len(self.data)): - lineRow = [] - for colNo in range(len(self.data[rowNo])): - datum = self.data[rowNo][colNo] - if datum is not None: - (groupX, groupWidth) = self.categoryAxis.scale(colNo) - x = groupX + hngs - y = yzero - height = self.valueAxis.scale(datum) - y - lineRow.append((x, y+height)) - self._positions.append(lineRow) - - - def _innerDrawLabel(self, rowNo, colNo, x, y): - "Draw a label for a given item in the list." - - labelFmt = self.lineLabelFormat - labelValue = self.data[rowNo][colNo] - - if labelFmt is None: - labelText = None - elif type(labelFmt) is str: - if labelFmt == 'values': - try: - labelText = self.lineLabelArray[rowNo][colNo] - except: - labelText = None - else: - labelText = labelFmt % labelValue - elif hasattr(labelFmt,'__call__'): - labelText = labelFmt(labelValue) - else: - raise ValueError("Unknown formatter type %s, expected string or function"%labelFmt) - - if labelText: - label = self.lineLabels[(rowNo, colNo)] - if not label.visible: return - # Make sure labels are some distance off the data point. - if y > 0: - label.setOrigin(x, y + self.lineLabelNudge) - else: - label.setOrigin(x, y - self.lineLabelNudge) - label.setText(labelText) - else: - label = None - return label - - def drawLabel(self, G, rowNo, colNo, x, y): - '''Draw a label for a given item in the list. - G must have an add method''' - G.add(self._innerDrawLabel(rowNo,colNo,x,y)) - - def makeLines(self): - g = Group() - - labelFmt = self.lineLabelFormat - P = list(range(len(self._positions))) - if self.reversePlotOrder: P.reverse() - inFill = self.inFill - if inFill: - inFillY = self.categoryAxis._y - inFillX0 = self.valueAxis._x - inFillX1 = inFillX0 + self.categoryAxis._length - inFillG = getattr(self,'_inFillG',g) - yzero = self._yzero - - # Iterate over data rows. - for rowNo in P: - row = self._positions[rowNo] - styleCount = len(self.lines) - styleIdx = rowNo % styleCount - rowStyle = self.lines[styleIdx] - rowColor = rowStyle.strokeColor - dash = getattr(rowStyle, 'strokeDashArray', None) - lineStyle = getattr(rowStyle,'lineStyle',None) - - if hasattr(rowStyle, 'strokeWidth'): - strokeWidth = rowStyle.strokeWidth - elif hasattr(self.lines, 'strokeWidth'): - strokeWidth = self.lines.strokeWidth - else: - strokeWidth = None - - # Iterate over data columns. - if lineStyle=='bar': - barWidth = getattr(rowStyle,'barWidth',Percentage(50)) - fillColor = getattr(rowStyle,'fillColor',rowColor) - if isinstance(barWidth,Percentage): - hbw = self._hngs*barWidth*0.01 - else: - hbw = barWidth*0.5 - for colNo in range(len(row)): - x,y = row[colNo] - g.add(Rect(x-hbw,min(y,yzero),2*hbw,abs(y-yzero),strokeWidth=strokeWidth,strokeColor=rowColor,fillColor=fillColor)) - elif self.joinedLines or lineStyle=='joinedLine': - points = [] - for colNo in range(len(row)): - points += row[colNo] - if inFill: - points = points + [inFillX1,inFillY,inFillX0,inFillY] - inFillG.add(Polygon(points,fillColor=rowColor,strokeColor=rowColor,strokeWidth=0.1)) - else: - line = PolyLine(points,strokeColor=rowColor,strokeLineCap=0,strokeLineJoin=1) - if strokeWidth: - line.strokeWidth = strokeWidth - if dash: - line.strokeDashArray = dash - g.add(line) - - if hasattr(rowStyle, 'symbol'): - uSymbol = rowStyle.symbol - elif hasattr(self.lines, 'symbol'): - uSymbol = self.lines.symbol - else: - uSymbol = None - - if uSymbol: - for colNo in range(len(row)): - x1, y1 = row[colNo] - symbol = uSymbol2Symbol(uSymbol,x1,y1,rowStyle.strokeColor) - if symbol: g.add(symbol) - - # Draw item labels. - for colNo in range(len(row)): - x1, y1 = row[colNo] - self.drawLabel(g, rowNo, colNo, x1, y1) - - return g - - def draw(self): - "Draws itself." - - vA, cA = self.valueAxis, self.categoryAxis - vA.setPosition(self.x, self.y, self.height) - if vA: vA.joinAxis = cA - if cA: cA.joinAxis = vA - vA.configure(self.data) - - # If zero is in chart, put x axis there, otherwise - # use bottom. - xAxisCrossesAt = vA.scale(0) - if ((xAxisCrossesAt > self.y + self.height) or (xAxisCrossesAt < self.y)): - y = self.y - else: - y = xAxisCrossesAt - - cA.setPosition(self.x, y, self.width) - cA.configure(self.data) - - self.calcPositions() - - g = Group() - g.add(self.makeBackground()) - if self.inFill: - self._inFillG = Group() - g.add(self._inFillG) - - g.add(cA) - g.add(vA) - cAdgl = getattr(cA,'drawGridLast',False) - vAdgl = getattr(vA,'drawGridLast',False) - if not cAdgl: cA.makeGrid(g,parent=self,dim=vA.getGridDims) - if not vAdgl: vA.makeGrid(g,parent=self,dim=cA.getGridDims) - g.add(self.makeLines()) - if cAdgl: cA.makeGrid(g,parent=self,dim=vA.getGridDims) - if vAdgl: vA.makeGrid(g,parent=self,dim=cA.getGridDims) - for a in getattr(self,'annotations',()): g.add(a(self,cA.scale,vA.scale)) - return g - -def _fakeItemKey(a): - '''t, z0, z1, x, y = a[:5]''' - return (-a[1],a[3],a[0],-a[4]) - -class _FakeGroup: - def __init__(self): - self._data = [] - - def add(self,what): - if what: self._data.append(what) - - def value(self): - return self._data - - def sort(self): - self._data.sort(key=_fakeItemKey) - #for t in self._data: print t - -class HorizontalLineChart3D(HorizontalLineChart): - _attrMap = AttrMap(BASE=HorizontalLineChart, - theta_x = AttrMapValue(isNumber, desc='dx/dz'), - theta_y = AttrMapValue(isNumber, desc='dy/dz'), - zDepth = AttrMapValue(isNumber, desc='depth of an individual series'), - zSpace = AttrMapValue(isNumber, desc='z gap around series'), - ) - theta_x = .5 - theta_y = .5 - zDepth = 10 - zSpace = 3 - - def calcPositions(self): - HorizontalLineChart.calcPositions(self) - nSeries = self._seriesCount - zSpace = self.zSpace - zDepth = self.zDepth - if self.categoryAxis.style=='parallel_3d': - _3d_depth = nSeries*zDepth+(nSeries+1)*zSpace - else: - _3d_depth = zDepth + 2*zSpace - self._3d_dx = self.theta_x*_3d_depth - self._3d_dy = self.theta_y*_3d_depth - - def _calc_z0(self,rowNo): - zSpace = self.zSpace - if self.categoryAxis.style=='parallel_3d': - z0 = rowNo*(self.zDepth+zSpace)+zSpace - else: - z0 = zSpace - return z0 - - def _zadjust(self,x,y,z): - return x+z*self.theta_x, y+z*self.theta_y - - def makeLines(self): - labelFmt = self.lineLabelFormat - P = list(range(len(self._positions))) - if self.reversePlotOrder: P.reverse() - inFill = self.inFill - assert not inFill, "inFill not supported for 3d yet" - #if inFill: - #inFillY = self.categoryAxis._y - #inFillX0 = self.valueAxis._x - #inFillX1 = inFillX0 + self.categoryAxis._length - #inFillG = getattr(self,'_inFillG',g) - zDepth = self.zDepth - _zadjust = self._zadjust - theta_x = self.theta_x - theta_y = self.theta_y - F = _FakeGroup() - from reportlab.graphics.charts.utils3d import _make_3d_line_info - tileWidth = getattr(self,'_3d_tilewidth',None) - if not tileWidth and self.categoryAxis.style!='parallel_3d': tileWidth = 1 - - # Iterate over data rows. - for rowNo in P: - row = self._positions[rowNo] - n = len(row) - styleCount = len(self.lines) - styleIdx = rowNo % styleCount - rowStyle = self.lines[styleIdx] - rowColor = rowStyle.strokeColor - dash = getattr(rowStyle, 'strokeDashArray', None) - z0 = self._calc_z0(rowNo) - z1 = z0 + zDepth - - if hasattr(self.lines[styleIdx], 'strokeWidth'): - strokeWidth = self.lines[styleIdx].strokeWidth - elif hasattr(self.lines, 'strokeWidth'): - strokeWidth = self.lines.strokeWidth - else: - strokeWidth = None - - # Iterate over data columns. - if self.joinedLines: - if n: - x0, y0 = row[0] - for colNo in range(1,n): - x1, y1 = row[colNo] - _make_3d_line_info( F, x0, x1, y0, y1, z0, z1, - theta_x, theta_y, - rowColor, fillColorShaded=None, tileWidth=tileWidth, - strokeColor=None, strokeWidth=None, strokeDashArray=None, - shading=0.1) - x0, y0 = x1, y1 - - if hasattr(self.lines[styleIdx], 'symbol'): - uSymbol = self.lines[styleIdx].symbol - elif hasattr(self.lines, 'symbol'): - uSymbol = self.lines.symbol - else: - uSymbol = None - - if uSymbol: - for colNo in range(n): - x1, y1 = row[colNo] - x1, y1 = _zadjust(x1,y1,z0) - symbol = uSymbol2Symbol(uSymbol,x1,y1,rowColor) - if symbol: F.add((2,z0,z0,x1,y1,symbol)) - - # Draw item labels. - for colNo in range(n): - x1, y1 = row[colNo] - x1, y1 = _zadjust(x1,y1,z0) - L = self._innerDrawLabel(rowNo, colNo, x1, y1) - if L: F.add((2,z0,z0,x1,y1,L)) - - F.sort() - g = Group() - for v in F.value(): g.add(v[-1]) - return g - -class VerticalLineChart(LineChart): - pass - - -def sample1(): - drawing = Drawing(400, 200) - - data = [ - (13, 5, 20, 22, 37, 45, 19, 4), - (5, 20, 46, 38, 23, 21, 6, 14) - ] - - lc = HorizontalLineChart() - - lc.x = 50 - lc.y = 50 - lc.height = 125 - lc.width = 300 - lc.data = data - lc.joinedLines = 1 - lc.lines.symbol = makeMarker('FilledDiamond') - lc.lineLabelFormat = '%2.0f' - - catNames = 'Jan Feb Mar Apr May Jun Jul Aug'.split(' ') - lc.categoryAxis.categoryNames = catNames - lc.categoryAxis.labels.boxAnchor = 'n' - - lc.valueAxis.valueMin = 0 - lc.valueAxis.valueMax = 60 - lc.valueAxis.valueStep = 15 - - drawing.add(lc) - - return drawing - - -class SampleHorizontalLineChart(HorizontalLineChart): - "Sample class overwriting one method to draw additional horizontal lines." - - def demo(self): - """Shows basic use of a line chart.""" - - drawing = Drawing(200, 100) - - data = [ - (13, 5, 20, 22, 37, 45, 19, 4), - (14, 10, 21, 28, 38, 46, 25, 5) - ] - - lc = SampleHorizontalLineChart() - - lc.x = 20 - lc.y = 10 - lc.height = 85 - lc.width = 170 - lc.data = data - lc.strokeColor = colors.white - lc.fillColor = colors.HexColor(0xCCCCCC) - - drawing.add(lc) - - return drawing - - - def makeBackground(self): - g = Group() - - g.add(HorizontalLineChart.makeBackground(self)) - - valAxis = self.valueAxis - valTickPositions = valAxis._tickValues - - for y in valTickPositions: - y = valAxis.scale(y) - g.add(Line(self.x, y, self.x+self.width, y, - strokeColor = self.strokeColor)) - - return g - - - -def sample1a(): - drawing = Drawing(400, 200) - - data = [ - (13, 5, 20, 22, 37, 45, 19, 4), - (5, 20, 46, 38, 23, 21, 6, 14) - ] - - lc = SampleHorizontalLineChart() - - lc.x = 50 - lc.y = 50 - lc.height = 125 - lc.width = 300 - lc.data = data - lc.joinedLines = 1 - lc.strokeColor = colors.white - lc.fillColor = colors.HexColor(0xCCCCCC) - lc.lines.symbol = makeMarker('FilledDiamond') - lc.lineLabelFormat = '%2.0f' - - catNames = 'Jan Feb Mar Apr May Jun Jul Aug'.split(' ') - lc.categoryAxis.categoryNames = catNames - lc.categoryAxis.labels.boxAnchor = 'n' - - lc.valueAxis.valueMin = 0 - lc.valueAxis.valueMax = 60 - lc.valueAxis.valueStep = 15 - - drawing.add(lc) - - return drawing - - -def sample2(): - drawing = Drawing(400, 200) - - data = [ - (13, 5, 20, 22, 37, 45, 19, 4), - (5, 20, 46, 38, 23, 21, 6, 14) - ] - - lc = HorizontalLineChart() - - lc.x = 50 - lc.y = 50 - lc.height = 125 - lc.width = 300 - lc.data = data - lc.joinedLines = 1 - lc.lines.symbol = makeMarker('Smiley') - lc.lineLabelFormat = '%2.0f' - lc.strokeColor = colors.black - lc.fillColor = colors.lightblue - - catNames = 'Jan Feb Mar Apr May Jun Jul Aug'.split(' ') - lc.categoryAxis.categoryNames = catNames - lc.categoryAxis.labels.boxAnchor = 'n' - - lc.valueAxis.valueMin = 0 - lc.valueAxis.valueMax = 60 - lc.valueAxis.valueStep = 15 - - drawing.add(lc) - - return drawing - - -def sample3(): - drawing = Drawing(400, 200) - - data = [ - (13, 5, 20, 22, 37, 45, 19, 4), - (5, 20, 46, 38, 23, 21, 6, 14) - ] - - lc = HorizontalLineChart() - - lc.x = 50 - lc.y = 50 - lc.height = 125 - lc.width = 300 - lc.data = data - lc.joinedLines = 1 - lc.lineLabelFormat = '%2.0f' - lc.strokeColor = colors.black - - lc.lines[0].symbol = makeMarker('Smiley') - lc.lines[1].symbol = NoEntry - lc.lines[0].strokeWidth = 2 - lc.lines[1].strokeWidth = 4 - - catNames = 'Jan Feb Mar Apr May Jun Jul Aug'.split(' ') - lc.categoryAxis.categoryNames = catNames - lc.categoryAxis.labels.boxAnchor = 'n' - - lc.valueAxis.valueMin = 0 - lc.valueAxis.valueMax = 60 - lc.valueAxis.valueStep = 15 - - drawing.add(lc) - - return drawing diff --git a/reportlab/graphics/charts/lineplots.py b/reportlab/graphics/charts/lineplots.py deleted file mode 100644 index 6c0bdfd1..00000000 --- a/reportlab/graphics/charts/lineplots.py +++ /dev/null @@ -1,1150 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/lineplots.py - -__version__=''' $Id$ ''' -__doc__="""This module defines a very preliminary Line Plot example.""" - -import string, time - -from reportlab.lib import colors -from reportlab.lib.validators import * -from reportlab.lib.attrmap import * -from reportlab.graphics.shapes import Drawing, Group, Rect, Line, PolyLine, Polygon, _SetKeyWordArgs -from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection, PropHolder -from reportlab.graphics.charts.textlabels import Label -from reportlab.graphics.charts.axes import XValueAxis, YValueAxis, AdjYValueAxis, NormalDateXValueAxis -from reportlab.graphics.charts.utils import * -from reportlab.graphics.widgets.markers import uSymbol2Symbol, isSymbol, makeMarker -from reportlab.graphics.widgets.grids import Grid, DoubleGrid, ShadedRect, ShadedPolygon -from reportlab.pdfbase.pdfmetrics import stringWidth, getFont -from reportlab.graphics.charts.areas import PlotArea - -# This might be moved again from here... -class LinePlotProperties(PropHolder): - _attrMap = AttrMap( - strokeWidth = AttrMapValue(isNumber, desc='Width of a line.'), - strokeColor = AttrMapValue(isColorOrNone, desc='Color of a line.'), - strokeDashArray = AttrMapValue(isListOfNumbersOrNone, desc='Dash array of a line.'), - symbol = AttrMapValue(None, desc='Widget placed at data points.',advancedUsage=1), - shader = AttrMapValue(None, desc='Shader Class.',advancedUsage=1), - filler = AttrMapValue(None, desc='Filler Class.',advancedUsage=1), - name = AttrMapValue(isStringOrNone, desc='Name of the line.'), - inFill = AttrMapValue(isBoolean, desc='If true flood fill to x axis',advancedUsage=1), - ) - -class Shader(_SetKeyWordArgs): - _attrMap = AttrMap(BASE=PlotArea, - vertical = AttrMapValue(isBoolean, desc='If true shade to x axis'), - colors = AttrMapValue(SequenceOf(isColorOrNone,lo=2,hi=2), desc='(AxisColor, LineColor)'), - ) - - def shade(self, lp, g, rowNo, rowColor, row): - c = [None,None] - c = getattr(self,'colors',c) or c - if not c[0]: c[0] = getattr(lp,'fillColor',colors.white) - if not c[1]: c[1] = rowColor - -class NoFiller: - def fill(self, lp, g, rowNo, rowColor, points): - pass - -class Filler: - '''mixin providing simple polygon fill''' - _attrMap = AttrMap( - fillColor = AttrMapValue(isColorOrNone, desc='filler interior color'), - strokeColor = AttrMapValue(isColorOrNone, desc='filler edge color'), - strokeWidth = AttrMapValue(isNumberOrNone, desc='filler edge width'), - ) - def __init__(self,**kw): - self.__dict__ = kw - - def fill(self, lp, g, rowNo, rowColor, points): - g.add(Polygon(points, - fillColor=getattr(self,'fillColor',rowColor), - strokeColor=getattr(self,'strokeColor',rowColor), - strokeWidth=getattr(self,'strokeWidth',0.1))) - -class ShadedPolyFiller(Filler,ShadedPolygon): - pass - -class PolyFiller(Filler,Polygon): - pass - -from reportlab.graphics.charts.linecharts import AbstractLineChart -class LinePlot(AbstractLineChart): - """Line plot with multiple lines. - - Both x- and y-axis are value axis (so there are no seperate - X and Y versions of this class). - """ - _attrMap = AttrMap(BASE=PlotArea, - reversePlotOrder = AttrMapValue(isBoolean, desc='If true reverse plot order.',advancedUsage=1), - lineLabelNudge = AttrMapValue(isNumber, desc='Distance between a data point and its label.',advancedUsage=1), - lineLabels = AttrMapValue(None, desc='Handle to the list of data point labels.'), - lineLabelFormat = AttrMapValue(None, desc='Formatting string or function used for data point labels.'), - lineLabelArray = AttrMapValue(None, desc='explicit array of line label values, must match size of data if present.'), - joinedLines = AttrMapValue(isNumber, desc='Display data points joined with lines if true.'), - strokeColor = AttrMapValue(isColorOrNone, desc='Color used for background border of plot area.'), - fillColor = AttrMapValue(isColorOrNone, desc='Color used for background interior of plot area.'), - lines = AttrMapValue(None, desc='Handle of the lines.'), - xValueAxis = AttrMapValue(None, desc='Handle of the x axis.'), - yValueAxis = AttrMapValue(None, desc='Handle of the y axis.'), - data = AttrMapValue(None, desc='Data to be plotted, list of (lists of) x/y tuples.'), - annotations = AttrMapValue(None, desc='list of callables, will be called with self, xscale, yscale.',advancedUsage=1), - behindAxes = AttrMapValue(isBoolean, desc='If true use separate line group.',advancedUsage=1), - gridFirst = AttrMapValue(isBoolean, desc='If true use draw grids before axes.',advancedUsage=1), - ) - - def __init__(self): - PlotArea.__init__(self) - self.reversePlotOrder = 0 - - self.xValueAxis = XValueAxis() - self.yValueAxis = YValueAxis() - - # this defines two series of 3 points. Just an example. - self.data = [ - ((1,1), (2,2), (2.5,1), (3,3), (4,5)), - ((1,2), (2,3), (2.5,2), (3,4), (4,6)) - ] - - self.lines = TypedPropertyCollection(LinePlotProperties) - self.lines.strokeWidth = 1 - self.lines[0].strokeColor = colors.red - self.lines[1].strokeColor = colors.blue - - self.lineLabels = TypedPropertyCollection(Label) - self.lineLabelFormat = None - self.lineLabelArray = None - - # this says whether the origin is inside or outside - # the bar - +10 means put the origin ten points - # above the tip of the bar if value > 0, or ten - # points inside if bar value < 0. This is different - # to label dx/dy which are not dependent on the - # sign of the data. - self.lineLabelNudge = 10 - # if you have multiple series, by default they butt - # together. - - # New line chart attributes. - self.joinedLines = 1 # Connect items with straight lines. - - #private attributes - self._inFill = None - self.annotations = [] - self.behindAxes = 0 - self.gridFirst = 0 - - def demo(self): - """Shows basic use of a line chart.""" - - drawing = Drawing(400, 200) - - data = [ - ((1,1), (2,2), (2.5,1), (3,3), (4,5)), - ((1,2), (2,3), (2.5,2), (3.5,5), (4,6)) - ] - - lp = LinePlot() - - lp.x = 50 - lp.y = 50 - lp.height = 125 - lp.width = 300 - lp.data = data - lp.joinedLines = 1 - lp.lineLabelFormat = '%2.0f' - lp.strokeColor = colors.black - - lp.lines[0].strokeColor = colors.red - lp.lines[0].symbol = makeMarker('FilledCircle') - lp.lines[1].strokeColor = colors.blue - lp.lines[1].symbol = makeMarker('FilledDiamond') - - lp.xValueAxis.valueMin = 0 - lp.xValueAxis.valueMax = 5 - lp.xValueAxis.valueStep = 1 - - lp.yValueAxis.valueMin = 0 - lp.yValueAxis.valueMax = 7 - lp.yValueAxis.valueStep = 1 - - drawing.add(lp) - - return drawing - - - def calcPositions(self): - """Works out where they go. - - Sets an attribute _positions which is a list of - lists of (x, y) matching the data. - """ - - self._seriesCount = len(self.data) - self._rowLength = max(list(map(len,self.data))) - - self._positions = [] - for rowNo in range(len(self.data)): - line = [] - for colNo in range(len(self.data[rowNo])): - datum = self.data[rowNo][colNo] # x,y value - if isinstance(datum[0],str): - x = self.xValueAxis.scale(mktime(mkTimeTuple(datum[0]))) - else: - x = self.xValueAxis.scale(datum[0]) - y = self.yValueAxis.scale(datum[1]) - line.append((x, y)) - self._positions.append(line) - - def _innerDrawLabel(self, rowNo, colNo, x, y): - "Draw a label for a given item in the list." - - labelFmt = self.lineLabelFormat - labelValue = self.data[rowNo][colNo][1] ### - - if labelFmt is None: - labelText = None - elif isinstance(labelFmt,str): - if labelFmt == 'values': - labelText = self.lineLabelArray[rowNo][colNo] - else: - labelText = labelFmt % labelValue - elif hasattr(labelFmt,'__call__'): - if not hasattr(labelFmt,'__labelFmtEX__'): - labelText = labelFmt(labelValue) - else: - labelText = labelFmt(self,rowNo,colNo,x,y) - else: - raise ValueError("Unknown formatter type %s, expected string or function"% labelFmt) - - if labelText: - label = self.lineLabels[(rowNo, colNo)] - if not label.visible: return - #hack to make sure labels are outside the bar - if y > 0: - label.setOrigin(x, y + self.lineLabelNudge) - else: - label.setOrigin(x, y - self.lineLabelNudge) - label.setText(labelText) - else: - label = None - return label - - def drawLabel(self, G, rowNo, colNo, x, y): - '''Draw a label for a given item in the list. - G must have an add method''' - G.add(self._innerDrawLabel(rowNo,colNo,x,y)) - - def makeLines(self): - g = Group() - bubblePlot = getattr(self,'_bubblePlot',None) - if bubblePlot: - yA = self.yValueAxis - xA = self.xValueAxis - bubbleR = min(yA._bubbleRadius,xA._bubbleRadius) - bubbleMax = xA._bubbleMax - - labelFmt = self.lineLabelFormat - - P = list(range(len(self._positions))) - if self.reversePlotOrder: P.reverse() - inFill = getattr(self,'_inFill',None) - styleCount = len(self.lines) - if inFill or [rowNo for rowNo in P if getattr(self.lines[rowNo%styleCount],'inFill',False)]: - inFillY = self.xValueAxis._y - inFillX0 = self.yValueAxis._x - inFillX1 = inFillX0 + self.xValueAxis._length - inFillG = getattr(self,'_inFillG',g) - lG = getattr(self,'_lineG',g) - # Iterate over data rows. - for rowNo in P: - row = self._positions[rowNo] - rowStyle = self.lines[rowNo % styleCount] - rowColor = getattr(rowStyle,'strokeColor',None) - dash = getattr(rowStyle, 'strokeDashArray', None) - - if hasattr(rowStyle, 'strokeWidth'): - width = rowStyle.strokeWidth - elif hasattr(self.lines, 'strokeWidth'): - width = self.lines.strokeWidth - else: - width = None - - # Iterate over data columns. - if self.joinedLines: - points = [] - for xy in row: - points += [xy[0], xy[1]] - if inFill or getattr(rowStyle,'inFill',False): - fpoints = [inFillX0,inFillY] + points + [inFillX1,inFillY] - filler = getattr(rowStyle, 'filler', None) - if filler: - filler.fill(self,inFillG,rowNo,rowColor,fpoints) - else: - inFillG.add(Polygon(fpoints,fillColor=rowColor,strokeColor=rowColor,strokeWidth=width or 0.1)) - if inFill in (None,0,2): - line = PolyLine(points,strokeColor=rowColor,strokeLineCap=0,strokeLineJoin=1) - if width: - line.strokeWidth = width - if dash: - line.strokeDashArray = dash - lG.add(line) - - if hasattr(rowStyle, 'symbol'): - uSymbol = rowStyle.symbol - elif hasattr(self.lines, 'symbol'): - uSymbol = self.lines.symbol - else: - uSymbol = None - - if uSymbol: - if bubblePlot: drow = self.data[rowNo] - for j,xy in enumerate(row): - symbol = uSymbol2Symbol(uSymbol,xy[0],xy[1],rowColor) - if symbol: - if bubblePlot: - symbol.size = bubbleR*(drow[j][2]/bubbleMax)**0.5 - g.add(symbol) - else: - if bubblePlot: drow = self.data[rowNo] - for j,xy in enumerate(row): - usymbol = getattr(self.lines[rowNo,j],'symbol',None) - if not usymbol: continue - symbol = uSymbol2Symbol(uSymbol,xy[0],xy[1],rowColor) - if symbol: - if bubblePlot: - symbol.size = bubbleR*(drow[j][2]/bubbleMax)**0.5 - g.add(symbol) - - # Draw data labels. - for colNo in range(len(row)): - x1, y1 = row[colNo] - self.drawLabel(g, rowNo, colNo, x1, y1) - - shader = getattr(rowStyle, 'shader', None) - if shader: shader.shade(self,g,rowNo,rowColor,row) - - return g - - def draw(self): - yA = self.yValueAxis - xA = self.xValueAxis - if getattr(self,'_bubblePlot',None): - yA._bubblePlot = xA._bubblePlot = 1 - yA.setPosition(self.x, self.y, self.height) - if yA: yA.joinAxis = xA - if xA: xA.joinAxis = yA - yA.configure(self.data) - - # if zero is in chart, put x axis there, otherwise use bottom. - xAxisCrossesAt = yA.scale(0) - if ((xAxisCrossesAt > self.y + self.height) or (xAxisCrossesAt < self.y)): - y = self.y - else: - y = xAxisCrossesAt - - xA.setPosition(self.x, y, self.width) - xA.configure(self.data) - self.calcPositions() - g = Group() - g.add(self.makeBackground()) - if self._inFill or self.behindAxes: - xA._joinToAxis() - if self._inFill: - self._inFillG = Group() - g.add(self._inFillG) - if self.behindAxes: - self._lineG = Group() - g.add(self._lineG) - xA._joinToAxis() - yA._joinToAxis() - xAex = xA.visibleAxis and [xA._y] or [] - yAex = yA.visibleAxis and [yA._x] or [] - skipGrid = getattr(xA,'skipGrid','none') - if skipGrid!=None: - if skipGrid in ('both','top'): - yAex.append(xA._x+xA._length) - if skipGrid in ('both','bottom'): - yAex.append(xA._x) - skipGrid = getattr(yA,'skipGrid','none') - if skipGrid!=None: - if skipGrid in ('both','top'): - xAex.append(yA._y+yA._length) - if skipGrid in ('both','bottom'): - xAex.append(yA._y) - if self.gridFirst: - xA.makeGrid(g,parent=self,dim=yA.getGridDims,exclude=yAex) - yA.makeGrid(g,parent=self,dim=xA.getGridDims,exclude=xAex) - g.add(xA.draw()) - g.add(yA.draw()) - if not self.gridFirst: - xAdgl = getattr(xA,'drawGridLast',False) - yAdgl = getattr(yA,'drawGridLast',False) - if not xAdgl: xA.makeGrid(g,parent=self,dim=yA.getGridDims,exclude=yAex) - if not yAdgl: yA.makeGrid(g,parent=self,dim=xA.getGridDims,exclude=xAex) - annotations = getattr(self,'annotations',[]) - for a in annotations: - if getattr(a,'beforeLines',None): - g.add(a(self,xA.scale,yA.scale)) - g.add(self.makeLines()) - if not self.gridFirst: - if xAdgl: xA.makeGrid(g,parent=self,dim=yA.getGridDims,exclude=yAex) - if yAdgl: yA.makeGrid(g,parent=self,dim=xA.getGridDims,exclude=xAex) - for a in annotations: - if not getattr(a,'beforeLines',None): - g.add(a(self,xA.scale,yA.scale)) - return g - - def addCrossHair(self,name,xv,yv,strokeColor=colors.black,strokeWidth=1,beforeLines=True): - from reportlab.graphics.shapes import Group, Line - annotations = [a for a in getattr(self,'annotations',[]) if getattr(a,'name',None)!=name] - def annotation(self,xScale,yScale): - x = xScale(xv) - y = yScale(yv) - g = Group() - xA = xScale.__self__ #the x axis - g.add(Line(xA._x,y,xA._x+xA._length,y,strokeColor=strokeColor,strokeWidth=strokeWidth)) - yA = yScale.__self__ #the y axis - g.add(Line(x,yA._y,x,yA._y+yA._length,strokeColor=strokeColor,strokeWidth=strokeWidth)) - return g - annotation.beforeLines = beforeLines - annotations.append(annotation) - self.annotations = annotations - -class LinePlot3D(LinePlot): - _attrMap = AttrMap(BASE=LinePlot, - theta_x = AttrMapValue(isNumber, desc='dx/dz'), - theta_y = AttrMapValue(isNumber, desc='dy/dz'), - zDepth = AttrMapValue(isNumber, desc='depth of an individual series'), - zSpace = AttrMapValue(isNumber, desc='z gap around series'), - ) - theta_x = .5 - theta_y = .5 - zDepth = 10 - zSpace = 3 - - def calcPositions(self): - LinePlot.calcPositions(self) - nSeries = self._seriesCount - zSpace = self.zSpace - zDepth = self.zDepth - if self.xValueAxis.style=='parallel_3d': - _3d_depth = nSeries*zDepth+(nSeries+1)*zSpace - else: - _3d_depth = zDepth + 2*zSpace - self._3d_dx = self.theta_x*_3d_depth - self._3d_dy = self.theta_y*_3d_depth - - def _calc_z0(self,rowNo): - zSpace = self.zSpace - if self.xValueAxis.style=='parallel_3d': - z0 = rowNo*(self.zDepth+zSpace)+zSpace - else: - z0 = zSpace - return z0 - - def _zadjust(self,x,y,z): - return x+z*self.theta_x, y+z*self.theta_y - - def makeLines(self): - bubblePlot = getattr(self,'_bubblePlot',None) - assert not bubblePlot, "_bubblePlot not supported for 3d yet" - #if bubblePlot: - # yA = self.yValueAxis - # xA = self.xValueAxis - # bubbleR = min(yA._bubbleRadius,xA._bubbleRadius) - # bubbleMax = xA._bubbleMax - - labelFmt = self.lineLabelFormat - positions = self._positions - - P = list(range(len(positions))) - if self.reversePlotOrder: P.reverse() - inFill = getattr(self,'_inFill',None) - assert not inFill, "inFill not supported for 3d yet" - #if inFill: - # inFillY = self.xValueAxis._y - # inFillX0 = self.yValueAxis._x - # inFillX1 = inFillX0 + self.xValueAxis._length - # inFillG = getattr(self,'_inFillG',g) - zDepth = self.zDepth - _zadjust = self._zadjust - theta_x = self.theta_x - theta_y = self.theta_y - from reportlab.graphics.charts.linecharts import _FakeGroup - F = _FakeGroup() - - from reportlab.graphics.charts.utils3d import _make_3d_line_info, find_intersections - if self.xValueAxis.style!='parallel_3d': - tileWidth = getattr(self,'_3d_tilewidth',1) - if getattr(self,'_find_intersections',None): - from copy import copy - fpositions = list(map(copy,positions)) - I = find_intersections(fpositions,small=tileWidth) - ic = None - for i,j,x,y in I: - if ic!=i: - ic = i - jc = 0 - else: - jc+=1 - fpositions[i].insert(j+jc,(x,y)) - tileWidth = None - else: - fpositions = positions - else: - tileWidth = None - fpositions = positions - - # Iterate over data rows. - styleCount = len(self.lines) - for rowNo in P: - row = positions[rowNo] - n = len(row) - rowStyle = self.lines[rowNo % styleCount] - rowColor = rowStyle.strokeColor - dash = getattr(rowStyle, 'strokeDashArray', None) - z0 = self._calc_z0(rowNo) - z1 = z0 + zDepth - - if hasattr(rowStyle, 'strokeWidth'): - width = rowStyle.strokeWidth - elif hasattr(self.lines, 'strokeWidth'): - width = self.lines.strokeWidth - else: - width = None - - # Iterate over data columns. - if self.joinedLines: - if n: - frow = fpositions[rowNo] - x0, y0 = frow[0] - for colNo in range(1,len(frow)): - x1, y1 = frow[colNo] - _make_3d_line_info( F, x0, x1, y0, y1, z0, z1, - theta_x, theta_y, - rowColor, fillColorShaded=None, tileWidth=tileWidth, - strokeColor=None, strokeWidth=None, strokeDashArray=None, - shading=0.1) - x0, y0 = x1, y1 - - if hasattr(rowStyle, 'symbol'): - uSymbol = rowStyle.symbol - elif hasattr(self.lines, 'symbol'): - uSymbol = self.lines.symbol - else: - uSymbol = None - - if uSymbol: - for xy in row: - x1, y1 = row[colNo] - x1, y1 = _zadjust(x1,y1,z0) - symbol = uSymbol2Symbol(uSymbol,xy[0],xy[1],rowColor) - if symbol: F.add((1,z0,z0,x1,y1,symbol)) - - # Draw data labels. - for colNo in range(n): - x1, y1 = row[colNo] - x1, y1 = _zadjust(x1,y1,z0) - L = self._innerDrawLabel(rowNo, colNo, x1, y1) - if L: F.add((2,z0,z0,x1,y1,L)) - - F.sort() - g = Group() - for v in F.value(): g.add(v[-1]) - return g - -_monthlyIndexData = [[(19971202, 100.0), - (19971231, 100.1704367), - (19980131, 101.5639577), - (19980228, 102.1879927), - (19980331, 101.6337257), - (19980430, 102.7640446), - (19980531, 102.9198038), - (19980630, 103.25938789999999), - (19980731, 103.2516421), - (19980831, 105.4744329), - (19980930, 109.3242705), - (19981031, 111.9859291), - (19981130, 110.9184642), - (19981231, 110.9184642), - (19990131, 111.9882532), - (19990228, 109.7912614), - (19990331, 110.24189629999999), - (19990430, 110.4279321), - (19990531, 109.33955469999999), - (19990630, 108.2341748), - (19990731, 110.21294469999999), - (19990831, 110.9683062), - (19990930, 112.4425371), - (19991031, 112.7314032), - (19991130, 112.3509645), - (19991231, 112.3660659), - (20000131, 110.9255248), - (20000229, 110.5266306), - (20000331, 113.3116101), - (20000430, 111.0449133), - (20000531, 111.702717), - (20000630, 113.5832178)], - [(19971202, 100.0), - (19971231, 100.0), - (19980131, 100.8), - (19980228, 102.0), - (19980331, 101.9), - (19980430, 103.0), - (19980531, 103.0), - (19980630, 103.1), - (19980731, 103.1), - (19980831, 102.8), - (19980930, 105.6), - (19981031, 108.3), - (19981130, 108.1), - (19981231, 111.9), - (19990131, 113.1), - (19990228, 110.2), - (19990331, 111.8), - (19990430, 112.3), - (19990531, 110.1), - (19990630, 109.3), - (19990731, 111.2), - (19990831, 111.7), - (19990930, 112.6), - (19991031, 113.2), - (19991130, 113.9), - (19991231, 115.4), - (20000131, 112.7), - (20000229, 113.9), - (20000331, 115.8), - (20000430, 112.2), - (20000531, 112.6), - (20000630, 114.6)]] - -class SimpleTimeSeriesPlot(LinePlot): - """A customized version of LinePlot. - It uses NormalDateXValueAxis() and AdjYValueAxis() for the X and Y axes. - """ - def __init__(self): - LinePlot.__init__(self) - self.xValueAxis = NormalDateXValueAxis() - self.yValueAxis = YValueAxis() - self.data = _monthlyIndexData - -class GridLinePlot(SimpleTimeSeriesPlot): - """A customized version of SimpleTimeSeriesSPlot. - It uses NormalDateXValueAxis() and AdjYValueAxis() for the X and Y axes. - The chart has a default grid background with thin horizontal lines - aligned with the tickmarks (and labels). You can change the back- - ground to be any Grid or ShadedRect, or scale the whole chart. - If you do provide a background, you can specify the colours of the - stripes with 'background.stripeColors'. - """ - - _attrMap = AttrMap(BASE=LinePlot, - background = AttrMapValue(None, desc='Background for chart area (now Grid or ShadedRect).'), - scaleFactor = AttrMapValue(isNumberOrNone, desc='Scalefactor to apply to whole drawing.'), - ) - - def __init__(self): - from reportlab.lib import colors - SimpleTimeSeriesPlot.__init__(self) - self.scaleFactor = None - self.background = Grid() - self.background.orientation = 'horizontal' - self.background.useRects = 0 - self.background.useLines = 1 - self.background.strokeWidth = 0.5 - self.background.strokeColor = colors.black - - def demo(self,drawing=None): - from reportlab.lib import colors - if not drawing: - drawing = Drawing(400, 200) - lp = GridLinePlot() - lp.x = 50 - lp.y = 50 - lp.height = 125 - lp.width = 300 - lp.data = _monthlyIndexData - lp.joinedLines = 1 - lp.strokeColor = colors.black - c0 = colors.PCMYKColor(100,65,0,30, spotName='PANTONE 288 CV', density=100) - lp.lines[0].strokeColor = c0 - lp.lines[0].strokeWidth = 2 - lp.lines[0].strokeDashArray = None - c1 = colors.PCMYKColor(0,79,91,0, spotName='PANTONE Wm Red CV', density=100) - lp.lines[1].strokeColor = c1 - lp.lines[1].strokeWidth = 1 - lp.lines[1].strokeDashArray = [3,1] - lp.xValueAxis.labels.fontSize = 10 - lp.xValueAxis.labels.textAnchor = 'start' - lp.xValueAxis.labels.boxAnchor = 'w' - lp.xValueAxis.labels.angle = -45 - lp.xValueAxis.labels.dx = 0 - lp.xValueAxis.labels.dy = -8 - lp.xValueAxis.xLabelFormat = '{mm}/{yy}' - lp.yValueAxis.labelTextFormat = '%5d%% ' - lp.yValueAxis.tickLeft = 5 - lp.yValueAxis.labels.fontSize = 10 - lp.background = Grid() - lp.background.stripeColors = [colors.pink, colors.lightblue] - lp.background.orientation = 'vertical' - drawing.add(lp,'plot') - return drawing - - def draw(self): - xva, yva = self.xValueAxis, self.yValueAxis - if xva: xva.joinAxis = yva - if yva: yva.joinAxis = xva - - yva.setPosition(self.x, self.y, self.height) - yva.configure(self.data) - - # if zero is in chart, put x axis there, otherwise - # use bottom. - xAxisCrossesAt = yva.scale(0) - if ((xAxisCrossesAt > self.y + self.height) or (xAxisCrossesAt < self.y)): - y = self.y - else: - y = xAxisCrossesAt - - xva.setPosition(self.x, y, self.width) - xva.configure(self.data) - - back = self.background - if isinstance(back, Grid): - if back.orientation == 'vertical' and xva._tickValues: - xpos = list(map(xva.scale, [xva._valueMin] + xva._tickValues)) - steps = [] - for i in range(len(xpos)-1): - steps.append(xpos[i+1] - xpos[i]) - back.deltaSteps = steps - elif back.orientation == 'horizontal' and yva._tickValues: - ypos = list(map(yva.scale, [yva._valueMin] + yva._tickValues)) - steps = [] - for i in range(len(ypos)-1): - steps.append(ypos[i+1] - ypos[i]) - back.deltaSteps = steps - elif isinstance(back, DoubleGrid): - # Ideally, these lines would not be needed... - back.grid0.x = self.x - back.grid0.y = self.y - back.grid0.width = self.width - back.grid0.height = self.height - back.grid1.x = self.x - back.grid1.y = self.y - back.grid1.width = self.width - back.grid1.height = self.height - - # some room left for optimization... - if back.grid0.orientation == 'vertical' and xva._tickValues: - xpos = list(map(xva.scale, [xva._valueMin] + xva._tickValues)) - steps = [] - for i in range(len(xpos)-1): - steps.append(xpos[i+1] - xpos[i]) - back.grid0.deltaSteps = steps - elif back.grid0.orientation == 'horizontal' and yva._tickValues: - ypos = list(map(yva.scale, [yva._valueMin] + yva._tickValues)) - steps = [] - for i in range(len(ypos)-1): - steps.append(ypos[i+1] - ypos[i]) - back.grid0.deltaSteps = steps - if back.grid1.orientation == 'vertical' and xva._tickValues: - xpos = list(map(xva.scale, [xva._valueMin] + xva._tickValues)) - steps = [] - for i in range(len(xpos)-1): - steps.append(xpos[i+1] - xpos[i]) - back.grid1.deltaSteps = steps - elif back.grid1.orientation == 'horizontal' and yva._tickValues: - ypos = list(map(yva.scale, [yva._valueMin] + yva._tickValues)) - steps = [] - for i in range(len(ypos)-1): - steps.append(ypos[i+1] - ypos[i]) - back.grid1.deltaSteps = steps - - self.calcPositions() - - width, height, scaleFactor = self.width, self.height, self.scaleFactor - if scaleFactor and scaleFactor!=1: - #g = Drawing(scaleFactor*width, scaleFactor*height) - g.transform = (scaleFactor, 0, 0, scaleFactor,0,0) - else: - g = Group() - - g.add(self.makeBackground()) - g.add(self.xValueAxis) - g.add(self.yValueAxis) - g.add(self.makeLines()) - - return g - -class AreaLinePlot(LinePlot): - '''we're given data in the form [(X1,Y11,..Y1M)....(Xn,Yn1,...YnM)]'''#' - def __init__(self): - LinePlot.__init__(self) - self._inFill = 1 - self.reversePlotOrder = 1 - self.data = [(1,20,100,30),(2,11,50,15),(3,15,70,40)] - - def draw(self): - try: - odata = self.data - n = len(odata) - m = len(odata[0]) - S = n*[0] - self.data = [] - for i in range(1,m): - D = [] - for j in range(n): - S[j] = S[j] + odata[j][i] - D.append((odata[j][0],S[j])) - self.data.append(D) - return LinePlot.draw(self) - finally: - self.data = odata - -class SplitLinePlot(AreaLinePlot): - def __init__(self): - AreaLinePlot.__init__(self) - self.xValueAxis = NormalDateXValueAxis() - self.yValueAxis = AdjYValueAxis() - self.data=[(20030601,0.95,0.05,0.0),(20030701,0.95,0.05,0.0),(20030801,0.95,0.05,0.0),(20030901,0.95,0.05,0.0),(20031001,0.95,0.05,0.0),(20031101,0.95,0.05,0.0),(20031201,0.95,0.05,0.0),(20040101,0.95,0.05,0.0),(20040201,0.95,0.05,0.0),(20040301,0.95,0.05,0.0),(20040401,0.95,0.05,0.0),(20040501,0.95,0.05,0.0),(20040601,0.95,0.05,0.0),(20040701,0.95,0.05,0.0),(20040801,0.95,0.05,0.0),(20040901,0.95,0.05,0.0),(20041001,0.95,0.05,0.0),(20041101,0.95,0.05,0.0),(20041201,0.95,0.05,0.0),(20050101,0.95,0.05,0.0),(20050201,0.95,0.05,0.0),(20050301,0.95,0.05,0.0),(20050401,0.95,0.05,0.0),(20050501,0.95,0.05,0.0),(20050601,0.95,0.05,0.0),(20050701,0.95,0.05,0.0),(20050801,0.95,0.05,0.0),(20050901,0.95,0.05,0.0),(20051001,0.95,0.05,0.0),(20051101,0.95,0.05,0.0),(20051201,0.95,0.05,0.0),(20060101,0.95,0.05,0.0),(20060201,0.95,0.05,0.0),(20060301,0.95,0.05,0.0),(20060401,0.95,0.05,0.0),(20060501,0.95,0.05,0.0),(20060601,0.95,0.05,0.0),(20060701,0.95,0.05,0.0),(20060801,0.95,0.05,0.0),(20060901,0.95,0.05,0.0),(20061001,0.95,0.05,0.0),(20061101,0.95,0.05,0.0),(20061201,0.95,0.05,0.0),(20070101,0.95,0.05,0.0),(20070201,0.95,0.05,0.0),(20070301,0.95,0.05,0.0),(20070401,0.95,0.05,0.0),(20070501,0.95,0.05,0.0),(20070601,0.95,0.05,0.0),(20070701,0.95,0.05,0.0),(20070801,0.95,0.05,0.0),(20070901,0.95,0.05,0.0),(20071001,0.95,0.05,0.0),(20071101,0.95,0.05,0.0),(20071201,0.95,0.05,0.0),(20080101,0.95,0.05,0.0),(20080201,0.95,0.05,0.0),(20080301,0.95,0.05,0.0),(20080401,0.95,0.05,0.0),(20080501,0.95,0.05,0.0),(20080601,0.95,0.05,0.0),(20080701,0.95,0.05,0.0),(20080801,0.95,0.05,0.0),(20080901,0.95,0.05,0.0),(20081001,0.95,0.05,0.0),(20081101,0.95,0.05,0.0),(20081201,0.95,0.05,0.0),(20090101,0.95,0.05,0.0),(20090201,0.91,0.09,0.0),(20090301,0.91,0.09,0.0),(20090401,0.91,0.09,0.0),(20090501,0.91,0.09,0.0),(20090601,0.91,0.09,0.0),(20090701,0.91,0.09,0.0),(20090801,0.91,0.09,0.0),(20090901,0.91,0.09,0.0),(20091001,0.91,0.09,0.0),(20091101,0.91,0.09,0.0),(20091201,0.91,0.09,0.0),(20100101,0.91,0.09,0.0),(20100201,0.81,0.19,0.0),(20100301,0.81,0.19,0.0),(20100401,0.81,0.19,0.0),(20100501,0.81,0.19,0.0),(20100601,0.81,0.19,0.0),(20100701,0.81,0.19,0.0),(20100801,0.81,0.19,0.0),(20100901,0.81,0.19,0.0),(20101001,0.81,0.19,0.0),(20101101,0.81,0.19,0.0),(20101201,0.81,0.19,0.0),(20110101,0.81,0.19,0.0),(20110201,0.72,0.28,0.0),(20110301,0.72,0.28,0.0),(20110401,0.72,0.28,0.0),(20110501,0.72,0.28,0.0),(20110601,0.72,0.28,0.0),(20110701,0.72,0.28,0.0),(20110801,0.72,0.28,0.0),(20110901,0.72,0.28,0.0),(20111001,0.72,0.28,0.0),(20111101,0.72,0.28,0.0),(20111201,0.72,0.28,0.0),(20120101,0.72,0.28,0.0),(20120201,0.53,0.47,0.0),(20120301,0.53,0.47,0.0),(20120401,0.53,0.47,0.0),(20120501,0.53,0.47,0.0),(20120601,0.53,0.47,0.0),(20120701,0.53,0.47,0.0),(20120801,0.53,0.47,0.0),(20120901,0.53,0.47,0.0),(20121001,0.53,0.47,0.0),(20121101,0.53,0.47,0.0),(20121201,0.53,0.47,0.0),(20130101,0.53,0.47,0.0),(20130201,0.44,0.56,0.0),(20130301,0.44,0.56,0.0),(20130401,0.44,0.56,0.0),(20130501,0.44,0.56,0.0),(20130601,0.44,0.56,0.0),(20130701,0.44,0.56,0.0),(20130801,0.44,0.56,0.0),(20130901,0.44,0.56,0.0),(20131001,0.44,0.56,0.0),(20131101,0.44,0.56,0.0),(20131201,0.44,0.56,0.0),(20140101,0.44,0.56,0.0),(20140201,0.36,0.5,0.14),(20140301,0.36,0.5,0.14),(20140401,0.36,0.5,0.14),(20140501,0.36,0.5,0.14),(20140601,0.36,0.5,0.14),(20140701,0.36,0.5,0.14),(20140801,0.36,0.5,0.14),(20140901,0.36,0.5,0.14),(20141001,0.36,0.5,0.14),(20141101,0.36,0.5,0.14),(20141201,0.36,0.5,0.14),(20150101,0.36,0.5,0.14),(20150201,0.3,0.41,0.29),(20150301,0.3,0.41,0.29),(20150401,0.3,0.41,0.29),(20150501,0.3,0.41,0.29),(20150601,0.3,0.41,0.29),(20150701,0.3,0.41,0.29),(20150801,0.3,0.41,0.29),(20150901,0.3,0.41,0.29),(20151001,0.3,0.41,0.29),(20151101,0.3,0.41,0.29),(20151201,0.3,0.41,0.29),(20160101,0.3,0.41,0.29),(20160201,0.26,0.36,0.38),(20160301,0.26,0.36,0.38),(20160401,0.26,0.36,0.38),(20160501,0.26,0.36,0.38),(20160601,0.26,0.36,0.38),(20160701,0.26,0.36,0.38),(20160801,0.26,0.36,0.38),(20160901,0.26,0.36,0.38),(20161001,0.26,0.36,0.38),(20161101,0.26,0.36,0.38),(20161201,0.26,0.36,0.38),(20170101,0.26,0.36,0.38),(20170201,0.2,0.3,0.5),(20170301,0.2,0.3,0.5),(20170401,0.2,0.3,0.5),(20170501,0.2,0.3,0.5),(20170601,0.2,0.3,0.5),(20170701,0.2,0.3,0.5),(20170801,0.2,0.3,0.5),(20170901,0.2,0.3,0.5),(20171001,0.2,0.3,0.5),(20171101,0.2,0.3,0.5),(20171201,0.2,0.3,0.5),(20180101,0.2,0.3,0.5),(20180201,0.13,0.37,0.5),(20180301,0.13,0.37,0.5),(20180401,0.13,0.37,0.5),(20180501,0.13,0.37,0.5),(20180601,0.13,0.37,0.5),(20180701,0.13,0.37,0.5),(20180801,0.13,0.37,0.5),(20180901,0.13,0.37,0.5),(20181001,0.13,0.37,0.5),(20181101,0.13,0.37,0.5),(20181201,0.13,0.37,0.5),(20190101,0.13,0.37,0.5),(20190201,0.1,0.4,0.5),(20190301,0.1,0.4,0.5),(20190401,0.1,0.4,0.5),(20190501,0.1,0.4,0.5),(20190601,0.1,0.4,0.5),(20190701,0.1,0.4,0.5),(20190801,0.1,0.4,0.5),(20190901,0.1,0.4,0.5),(20191001,0.1,0.4,0.5),(20191101,0.1,0.4,0.5),(20191201,0.1,0.4,0.5),(20200101,0.1,0.4,0.5)] - self.yValueAxis.requiredRange = None - self.yValueAxis.leftAxisPercent = 0 - self.yValueAxis.leftAxisOrigShiftMin = 0 - self.yValueAxis.leftAxisOrigShiftIPC = 0 - self.lines[0].strokeColor = colors.toColor(0x0033cc) - self.lines[1].strokeColor = colors.toColor(0x99c3ff) - self.lines[2].strokeColor = colors.toColor(0xCC0033) - -def _maxWidth(T, fontName, fontSize): - '''return max stringWidth for the list of strings T''' - if not isinstance(T,(tuple,list)): T = (T,) - T = [_f for _f in T if _f] - return T and max(list(map(lambda t,sW=stringWidth,fN=fontName, fS=fontSize: sW(t,fN,fS),T))) or 0 - -class ScatterPlot(LinePlot): - """A scatter plot widget""" - - _attrMap = AttrMap(BASE=LinePlot, - width = AttrMapValue(isNumber, desc="Width of the area inside the axes"), - height = AttrMapValue(isNumber, desc="Height of the area inside the axes"), - outerBorderOn = AttrMapValue(isBoolean, desc="Is there an outer border (continuation of axes)"), - outerBorderColor = AttrMapValue(isColorOrNone, desc="Color of outer border (if any)"), - labelOffset = AttrMapValue(isNumber, desc="Space between label and Axis (or other labels)",advancedUsage=1), - axisTickLengths = AttrMapValue(isNumber, desc="Lenth of the ticks on both axes"), - axisStrokeWidth = AttrMapValue(isNumber, desc="Stroke width for both axes"), - xLabel = AttrMapValue(isString, desc="Label for the whole X-Axis"), - yLabel = AttrMapValue(isString, desc="Label for the whole Y-Axis"), - data = AttrMapValue(isAnything, desc='Data points - a list of x/y tuples.'), - strokeColor = AttrMapValue(isColorOrNone, desc='Color used for border of plot area.'), - fillColor = AttrMapValue(isColorOrNone, desc='Color used for background interior of plot area.'), - leftPadding = AttrMapValue(isNumber, desc='Padding on left of drawing'), - rightPadding = AttrMapValue(isNumber, desc='Padding on right of drawing'), - topPadding = AttrMapValue(isNumber, desc='Padding at top of drawing'), - bottomPadding = AttrMapValue(isNumber, desc='Padding at bottom of drawing'), - ) - - def __init__(self): - LinePlot.__init__(self) - self.width = 142 - self.height = 77 - self.outerBorderOn = 1 - self.outerBorderColor = colors.black - self.background = None - - _labelOffset = 3 - _axisTickLengths = 2 - _axisStrokeWidth = 0.5 - - self.yValueAxis.valueMin = None - self.yValueAxis.valueMax = None - self.yValueAxis.valueStep = None - self.yValueAxis.labelTextFormat = '%s' - - self.xLabel="X Lable" - self.xValueAxis.labels.fontSize = 6 - - self.yLabel="Y Lable" - self.yValueAxis.labels.fontSize = 6 - - self.data =[((0.030, 62.73), - (0.074, 54.363), - (1.216, 17.964)), - - ((1.360, 11.621), - (1.387, 50.011), - (1.428, 68.953)), - - ((1.444, 86.888), - (1.754, 35.58), - (1.766, 36.05))] - - #values for lineplot - self.joinedLines = 0 - - self.leftPadding=5 - self.rightPadding=10 - self.topPadding=5 - self.bottomPadding=5 - - self.x = self.leftPadding+_axisTickLengths+(_labelOffset*2) - self.x=self.x+_maxWidth(str(self.yValueAxis.valueMax), self.yValueAxis.labels.fontName, self.yValueAxis.labels.fontSize) - self.y = self.bottomPadding+_axisTickLengths+_labelOffset+self.xValueAxis.labels.fontSize - - self.xValueAxis.labels.dy = -_labelOffset - self.xValueAxis.tickDown = _axisTickLengths - self.xValueAxis.strokeWidth = _axisStrokeWidth - self.xValueAxis.rangeRound='both' - self.yValueAxis.labels.dx = -_labelOffset - self.yValueAxis.tickLeft = _axisTickLengths - self.yValueAxis.strokeWidth = _axisStrokeWidth - self.yValueAxis.rangeRound='both' - - self.lineLabelFormat="%.2f" - self.lineLabels.fontSize = 5 - self.lineLabels.boxAnchor = 'e' - self.lineLabels.dx = -2 - self.lineLabelNudge = 0 - self.lines.symbol=makeMarker('FilledCircle',size=3) - self.lines[1].symbol=makeMarker('FilledDiamond',size=3) - self.lines[2].symbol=makeMarker('FilledSquare',size=3) - self.lines[2].strokeColor = colors.green - - def _getDrawingDimensions(self): - tx = self.leftPadding+self.yValueAxis.tickLeft+(self.yValueAxis.labels.dx*2)+self.xValueAxis.labels.fontSize - tx=tx+(5*_maxWidth(str(self.yValueAxis.valueMax), self.yValueAxis.labels.fontName, self.yValueAxis.labels.fontSize)) - tx=tx+self.width+self.rightPadding - t=('%.2f%%'%self.xValueAxis.valueMax) - tx=tx+(_maxWidth(t, self.yValueAxis.labels.fontName, self.yValueAxis.labels.fontSize)) - ty = self.bottomPadding+self.xValueAxis.tickDown+(self.xValueAxis.labels.dy*2)+(self.xValueAxis.labels.fontSize*2) - ty=ty+self.yValueAxis.labels.fontSize+self.height+self.topPadding - #print (tx, ty) - return (tx,ty) - - def demo(self,drawing=None): - if not drawing: - tx,ty=self._getDrawingDimensions() - drawing = Drawing(tx,ty) - drawing.add(self.draw()) - return drawing - - def draw(self): - ascent=getFont(self.xValueAxis.labels.fontName).face.ascent - if ascent==0: - ascent=0.718 # default (from helvetica) - ascent=ascent*self.xValueAxis.labels.fontSize # normalize - - #basic LinePlot - does the Axes, Ticks etc - lp = LinePlot.draw(self) - - xLabel = self.xLabel - if xLabel: #Overall label for the X-axis - xl=Label() - xl.x = (self.x+self.width)/2.0 - xl.y = 0 - xl.fontName = self.xValueAxis.labels.fontName - xl.fontSize = self.xValueAxis.labels.fontSize - xl.setText(xLabel) - lp.add(xl) - - yLabel = self.yLabel - if yLabel: #Overall label for the Y-axis - yl=Label() - yl.angle = 90 - yl.x = 0 - yl.y = (self.y+self.height/2.0) - yl.fontName = self.yValueAxis.labels.fontName - yl.fontSize = self.yValueAxis.labels.fontSize - yl.setText(yLabel) - lp.add(yl) - - # do a bounding box - in the same style as the axes - if self.outerBorderOn: - lp.add(Rect(self.x, self.y, self.width, self.height, - strokeColor = self.outerBorderColor, - strokeWidth = self.yValueAxis.strokeWidth, - fillColor = None)) - - lp.shift(self.leftPadding, self.bottomPadding) - - return lp - -def sample1a(): - "A line plot with non-equidistant points in x-axis." - - drawing = Drawing(400, 200) - - data = [ - ((1,1), (2,2), (2.5,1), (3,3), (4,5)), - ((1,2), (2,3), (2.5,2), (3.5,5), (4,6)) - ] - - lp = LinePlot() - - lp.x = 50 - lp.y = 50 - lp.height = 125 - lp.width = 300 - lp.data = data - lp.joinedLines = 1 - lp.strokeColor = colors.black - - lp.lines.symbol = makeMarker('UK_Flag') - - lp.lines[0].strokeWidth = 2 - lp.lines[1].strokeWidth = 4 - - lp.xValueAxis.valueMin = 0 - lp.xValueAxis.valueMax = 5 - lp.xValueAxis.valueStep = 1 - - lp.yValueAxis.valueMin = 0 - lp.yValueAxis.valueMax = 7 - lp.yValueAxis.valueStep = 1 - - drawing.add(lp) - - return drawing - - -def sample1b(): - "A line plot with non-equidistant points in x-axis." - - drawing = Drawing(400, 200) - - data = [ - ((1,1), (2,2), (2.5,1), (3,3), (4,5)), - ((1,2), (2,3), (2.5,2), (3.5,5), (4,6)) - ] - - lp = LinePlot() - - lp.x = 50 - lp.y = 50 - lp.height = 125 - lp.width = 300 - lp.data = data - lp.joinedLines = 1 - lp.lines.symbol = makeMarker('Circle') - lp.lineLabelFormat = '%2.0f' - lp.strokeColor = colors.black - - lp.xValueAxis.valueMin = 0 - lp.xValueAxis.valueMax = 5 - lp.xValueAxis.valueSteps = [1, 2, 2.5, 3, 4, 5] - lp.xValueAxis.labelTextFormat = '%2.1f' - - lp.yValueAxis.valueMin = 0 - lp.yValueAxis.valueMax = 7 - lp.yValueAxis.valueStep = 1 - - drawing.add(lp) - - return drawing - - -def sample1c(): - "A line plot with non-equidistant points in x-axis." - - drawing = Drawing(400, 200) - - data = [ - ((1,1), (2,2), (2.5,1), (3,3), (4,5)), - ((1,2), (2,3), (2.5,2), (3.5,5), (4,6)) - ] - - lp = LinePlot() - - lp.x = 50 - lp.y = 50 - lp.height = 125 - lp.width = 300 - lp.data = data - lp.joinedLines = 1 - lp.lines[0].symbol = makeMarker('FilledCircle') - lp.lines[1].symbol = makeMarker('Circle') - lp.lineLabelFormat = '%2.0f' - lp.strokeColor = colors.black - - lp.xValueAxis.valueMin = 0 - lp.xValueAxis.valueMax = 5 - lp.xValueAxis.valueSteps = [1, 2, 2.5, 3, 4, 5] - lp.xValueAxis.labelTextFormat = '%2.1f' - - lp.yValueAxis.valueMin = 0 - lp.yValueAxis.valueMax = 7 - lp.yValueAxis.valueSteps = [1, 2, 3, 5, 6] - - drawing.add(lp) - - return drawing - - -def preprocessData(series): - "Convert date strings into seconds and multiply values by 100." - - return [(str2seconds(x[0]), x[1]*100) for x in series] - - -def sample2(): - "A line plot with non-equidistant points in x-axis." - - drawing = Drawing(400, 200) - - data = [ - (('25/11/1991',1), - ('30/11/1991',1.000933333), - ('31/12/1991',1.0062), - ('31/01/1992',1.0112), - ('29/02/1992',1.0158), - ('31/03/1992',1.020733333), - ('30/04/1992',1.026133333), - ('31/05/1992',1.030266667), - ('30/06/1992',1.034466667), - ('31/07/1992',1.038733333), - ('31/08/1992',1.0422), - ('30/09/1992',1.045533333), - ('31/10/1992',1.049866667), - ('30/11/1992',1.054733333), - ('31/12/1992',1.061), - ), - ] - - data[0] = preprocessData(data[0]) - - lp = LinePlot() - - lp.x = 50 - lp.y = 50 - lp.height = 125 - lp.width = 300 - lp.data = data - lp.joinedLines = 1 - lp.lines.symbol = makeMarker('FilledDiamond') - lp.strokeColor = colors.black - - start = mktime(mkTimeTuple('25/11/1991')) - t0 = mktime(mkTimeTuple('30/11/1991')) - t1 = mktime(mkTimeTuple('31/12/1991')) - t2 = mktime(mkTimeTuple('31/03/1992')) - t3 = mktime(mkTimeTuple('30/06/1992')) - t4 = mktime(mkTimeTuple('30/09/1992')) - end = mktime(mkTimeTuple('31/12/1992')) - lp.xValueAxis.valueMin = start - lp.xValueAxis.valueMax = end - lp.xValueAxis.valueSteps = [start, t0, t1, t2, t3, t4, end] - lp.xValueAxis.labelTextFormat = seconds2str - lp.xValueAxis.labels[1].dy = -20 - lp.xValueAxis.labels[2].dy = -35 - - lp.yValueAxis.labelTextFormat = '%4.2f' - lp.yValueAxis.valueMin = 100 - lp.yValueAxis.valueMax = 110 - lp.yValueAxis.valueStep = 2 - - drawing.add(lp) - - return drawing diff --git a/reportlab/graphics/charts/markers.py b/reportlab/graphics/charts/markers.py deleted file mode 100644 index 9011bfa6..00000000 --- a/reportlab/graphics/charts/markers.py +++ /dev/null @@ -1,82 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/markers.py - -__version__=''' $Id$ ''' -__doc__="""This modules defines a collection of markers used in charts. - -The make* functions return a simple shape or a widget as for -the smiley. -""" - -from reportlab.lib import colors -from reportlab.graphics.shapes import Rect, Line, Circle, Polygon -from reportlab.graphics.widgets.signsandsymbols import SmileyFace - - -def makeEmptySquare(x, y, size, color): - "Make an empty square marker." - - d = size/2.0 - rect = Rect(x-d, y-d, 2*d, 2*d) - rect.strokeColor = color - rect.fillColor = None - - return rect - - -def makeFilledSquare(x, y, size, color): - "Make a filled square marker." - - d = size/2.0 - rect = Rect(x-d, y-d, 2*d, 2*d) - rect.strokeColor = color - rect.fillColor = color - - return rect - - -def makeFilledDiamond(x, y, size, color): - "Make a filled diamond marker." - - d = size/2.0 - poly = Polygon((x-d,y, x,y+d, x+d,y, x,y-d)) - poly.strokeColor = color - poly.fillColor = color - - return poly - - -def makeEmptyCircle(x, y, size, color): - "Make a hollow circle marker." - - d = size/2.0 - circle = Circle(x, y, d) - circle.strokeColor = color - circle.fillColor = colors.white - - return circle - - -def makeFilledCircle(x, y, size, color): - "Make a hollow circle marker." - - d = size/2.0 - circle = Circle(x, y, d) - circle.strokeColor = color - circle.fillColor = color - - return circle - - -def makeSmiley(x, y, size, color): - "Make a smiley marker." - - d = size - s = SmileyFace() - s.fillColor = color - s.x = x-d - s.y = y-d - s.size = d*2 - - return s diff --git a/reportlab/graphics/charts/piecharts.py b/reportlab/graphics/charts/piecharts.py deleted file mode 100644 index 4469a955..00000000 --- a/reportlab/graphics/charts/piecharts.py +++ /dev/null @@ -1,1660 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/piecharts.py -# experimental pie chart script. Two types of pie - one is a monolithic -#widget with all top-level properties, the other delegates most stuff to -#a wedges collection whic lets you customize the group or every individual -#wedge. - -__version__=''' $Id$ ''' -__doc__="""Basic Pie Chart class. - -This permits you to customize and pop out individual wedges; -supports elliptical and circular pies. -""" - -import copy, functools -from math import sin, cos, pi - -from reportlab.lib import colors -from reportlab.lib.validators import isColor, isNumber, isListOfNumbersOrNone,\ - isListOfNumbers, isColorOrNone, isString,\ - isListOfStringsOrNone, OneOf, SequenceOf,\ - isBoolean, isListOfColors, isNumberOrNone,\ - isNoneOrListOfNoneOrStrings, isTextAnchor,\ - isNoneOrListOfNoneOrNumbers, isBoxAnchor,\ - isStringOrNone, NoneOr -from reportlab.graphics.widgets.markers import uSymbol2Symbol, isSymbol -from reportlab.lib.attrmap import * -from reportlab.pdfgen.canvas import Canvas -from reportlab.graphics.shapes import Group, Drawing, Ellipse, Wedge, String, STATE_DEFAULTS, ArcPath, Polygon, Rect, PolyLine, Line -from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection, PropHolder -from reportlab.graphics.charts.areas import PlotArea -from reportlab.graphics.charts.legends import _objStr -from reportlab.graphics.charts.textlabels import Label - -_ANGLE2BOXANCHOR={0:'w', 45:'sw', 90:'s', 135:'se', 180:'e', 225:'ne', 270:'n', 315: 'nw', -45: 'nw'} -_ANGLE2RBOXANCHOR={0:'e', 45:'ne', 90:'n', 135:'nw', 180:'w', 225:'sw', 270:'s', 315: 'se', -45: 'se'} - -_ANGLELO = 1e-7 -_ANGLEHI = 360.0 - _ANGLELO - -class WedgeLabel(Label): - def _checkDXY(self,ba): - pass - def _getBoxAnchor(self): - ba = self.boxAnchor - if ba in ('autox','autoy'): - na = (int((self._pmv%360)/45.)*45)%360 - if not (na % 90): # we have a right angle case - da = (self._pmv - na) % 360 - if abs(da)>5: - na += (da>0 and 45 or -45) - ba = (getattr(self,'_anti',None) and _ANGLE2RBOXANCHOR or _ANGLE2BOXANCHOR)[na] - self._checkDXY(ba) - return ba - -class WedgeProperties(PropHolder): - """This holds descriptive information about the wedges in a pie chart. - - It is not to be confused with the 'wedge itself'; this just holds - a recipe for how to format one, and does not allow you to hack the - angles. It can format a genuine Wedge object for you with its - format method. - """ - _attrMap = AttrMap( - strokeWidth = AttrMapValue(isNumber,desc='Width of the wedge border'), - fillColor = AttrMapValue(isColorOrNone,desc='Filling color of the wedge'), - strokeColor = AttrMapValue(isColorOrNone,desc='Color of the wedge border'), - strokeDashArray = AttrMapValue(isListOfNumbersOrNone,desc='Style of the wedge border, expressed as a list of lengths of alternating dashes and blanks'), - strokeLineCap = AttrMapValue(OneOf(0,1,2),desc="Line cap 0=butt, 1=round & 2=square"), - strokeLineJoin = AttrMapValue(OneOf(0,1,2),desc="Line join 0=miter, 1=round & 2=bevel"), - strokeMiterLimit = AttrMapValue(isNumber,desc='Miter limit control miter line joins'), - popout = AttrMapValue(isNumber,desc="How far of centre a wedge to pop"), - fontName = AttrMapValue(isString,desc='Name of the font of the label text'), - fontSize = AttrMapValue(isNumber,desc='Size of the font of the label text in points'), - fontColor = AttrMapValue(isColorOrNone,desc='Color of the font of the label text'), - labelRadius = AttrMapValue(isNumber,desc='Distance between the center of the label box and the center of the pie, expressed in times the radius of the pie'), - label_dx = AttrMapValue(isNumber,desc='X Offset of the label'), - label_dy = AttrMapValue(isNumber,desc='Y Offset of the label'), - label_angle = AttrMapValue(isNumber,desc='Angle of the label, default (0) is horizontal, 90 is vertical, 180 is upside down'), - label_boxAnchor = AttrMapValue(isBoxAnchor,desc='Anchoring point of the label'), - label_boxStrokeColor = AttrMapValue(isColorOrNone,desc='Border color for the label box'), - label_boxStrokeWidth = AttrMapValue(isNumber,desc='Border width for the label box'), - label_boxFillColor = AttrMapValue(isColorOrNone,desc='Filling color of the label box'), - label_strokeColor = AttrMapValue(isColorOrNone,desc='Border color for the label text'), - label_strokeWidth = AttrMapValue(isNumber,desc='Border width for the label text'), - label_text = AttrMapValue(isStringOrNone,desc='Text of the label'), - label_leading = AttrMapValue(isNumberOrNone,desc=''), - label_width = AttrMapValue(isNumberOrNone,desc='Width of the label'), - label_maxWidth = AttrMapValue(isNumberOrNone,desc='Maximum width the label can grow to'), - label_height = AttrMapValue(isNumberOrNone,desc='Height of the label'), - label_textAnchor = AttrMapValue(isTextAnchor,desc='Maximum height the label can grow to'), - label_visible = AttrMapValue(isBoolean,desc="True if the label is to be drawn"), - label_topPadding = AttrMapValue(isNumber,'Padding at top of box'), - label_leftPadding = AttrMapValue(isNumber,'Padding at left of box'), - label_rightPadding = AttrMapValue(isNumber,'Padding at right of box'), - label_bottomPadding = AttrMapValue(isNumber,'Padding at bottom of box'), - label_simple_pointer = AttrMapValue(isBoolean,'Set to True for simple pointers'), - label_pointer_strokeColor = AttrMapValue(isColorOrNone,desc='Color of indicator line'), - label_pointer_strokeWidth = AttrMapValue(isNumber,desc='StrokeWidth of indicator line'), - label_pointer_elbowLength = AttrMapValue(isNumber,desc='Length of final indicator line segment'), - label_pointer_edgePad = AttrMapValue(isNumber,desc='pad between pointer label and box'), - label_pointer_piePad = AttrMapValue(isNumber,desc='pad between pointer label and pie'), - swatchMarker = AttrMapValue(NoneOr(isSymbol), desc="None or makeMarker('Diamond') ...",advancedUsage=1), - visible = AttrMapValue(isBoolean,'Set to false to skip displaying'), - ) - - def __init__(self): - self.strokeWidth = 0 - self.fillColor = None - self.strokeColor = STATE_DEFAULTS["strokeColor"] - self.strokeDashArray = STATE_DEFAULTS["strokeDashArray"] - self.strokeLineJoin = 1 - self.strokeLineCap = 0 - self.strokeMiterLimit = 0 - self.popout = 0 - self.fontName = STATE_DEFAULTS["fontName"] - self.fontSize = STATE_DEFAULTS["fontSize"] - self.fontColor = STATE_DEFAULTS["fillColor"] - self.labelRadius = 1.2 - self.label_dx = self.label_dy = self.label_angle = 0 - self.label_text = None - self.label_topPadding = self.label_leftPadding = self.label_rightPadding = self.label_bottomPadding = 0 - self.label_boxAnchor = 'autox' - self.label_boxStrokeColor = None #boxStroke - self.label_boxStrokeWidth = 0.5 #boxStrokeWidth - self.label_boxFillColor = None - self.label_strokeColor = None - self.label_strokeWidth = 0.1 - self.label_leading = self.label_width = self.label_maxWidth = self.label_height = None - self.label_textAnchor = 'start' - self.label_simple_pointer = 0 - self.label_visible = 1 - self.label_pointer_strokeColor = colors.black - self.label_pointer_strokeWidth = 0.5 - self.label_pointer_elbowLength = 3 - self.label_pointer_edgePad = 2 - self.label_pointer_piePad = 3 - self.visible = 1 - -def _addWedgeLabel(self,text,angle,labelX,labelY,wedgeStyle,labelClass=WedgeLabel): - # now draw a label - if self.simpleLabels: - theLabel = String(labelX, labelY, text) - if not self.sideLabels: - theLabel.textAnchor = "middle" - else: - if (abs(angle) < 90 ) or (angle >270 and angle<450) or (-450< angle <-270): - theLabel.textAnchor = "start" - else: - theLabel.textAnchor = "end" - theLabel._pmv = angle - theLabel._simple_pointer = 0 - else: - theLabel = labelClass() - theLabel._pmv = angle - theLabel.x = labelX - theLabel.y = labelY - theLabel.dx = wedgeStyle.label_dx - if not self.sideLabels: - theLabel.dy = wedgeStyle.label_dy - theLabel.boxAnchor = wedgeStyle.label_boxAnchor - else: - if wedgeStyle.fontSize is None: - sideLabels_dy = self.fontSize / 2.5 - else: - sideLabels_dy = wedgeStyle.fontSize / 2.5 - if wedgeStyle.label_dy is None: - theLabel.dy = sideLabels_dy - else: - theLabel.dy = wedgeStyle.label_dy + sideLabels_dy - if (abs(angle) < 90 ) or (angle >270 and angle<450) or (-450< angle <-270): - theLabel.boxAnchor = 'w' - else: - theLabel.boxAnchor = 'e' - theLabel.angle = wedgeStyle.label_angle - theLabel.boxStrokeColor = wedgeStyle.label_boxStrokeColor - theLabel.boxStrokeWidth = wedgeStyle.label_boxStrokeWidth - theLabel.boxFillColor = wedgeStyle.label_boxFillColor - theLabel.strokeColor = wedgeStyle.label_strokeColor - theLabel.strokeWidth = wedgeStyle.label_strokeWidth - _text = wedgeStyle.label_text - if _text is None: _text = text - theLabel._text = _text - theLabel.leading = wedgeStyle.label_leading - theLabel.width = wedgeStyle.label_width - theLabel.maxWidth = wedgeStyle.label_maxWidth - theLabel.height = wedgeStyle.label_height - theLabel.textAnchor = wedgeStyle.label_textAnchor - theLabel.visible = wedgeStyle.label_visible - theLabel.topPadding = wedgeStyle.label_topPadding - theLabel.leftPadding = wedgeStyle.label_leftPadding - theLabel.rightPadding = wedgeStyle.label_rightPadding - theLabel.bottomPadding = wedgeStyle.label_bottomPadding - theLabel._simple_pointer = wedgeStyle.label_simple_pointer - theLabel.fontSize = wedgeStyle.fontSize - theLabel.fontName = wedgeStyle.fontName - theLabel.fillColor = wedgeStyle.fontColor - return theLabel - -def _fixLabels(labels,n): - if labels is None: - labels = [''] * n - else: - i = n-len(labels) - if i>0: labels = list(labels)+['']*i - return labels - -class AbstractPieChart(PlotArea): - - def makeSwatchSample(self, rowNo, x, y, width, height): - baseStyle = self.slices - styleIdx = rowNo % len(baseStyle) - style = baseStyle[styleIdx] - strokeColor = getattr(style, 'strokeColor', getattr(baseStyle,'strokeColor',None)) - fillColor = getattr(style, 'fillColor', getattr(baseStyle,'fillColor',None)) - strokeDashArray = getattr(style, 'strokeDashArray', getattr(baseStyle,'strokeDashArray',None)) - strokeWidth = getattr(style, 'strokeWidth', getattr(baseStyle, 'strokeWidth',None)) - swatchMarker = getattr(style, 'swatchMarker', getattr(baseStyle, 'swatchMarker',None)) - if swatchMarker: - return uSymbol2Symbol(swatchMarker,x+width/2.,y+height/2.,fillColor) - return Rect(x,y,width,height,strokeWidth=strokeWidth,strokeColor=strokeColor, - strokeDashArray=strokeDashArray,fillColor=fillColor) - - def getSeriesName(self,i,default=None): - '''return series name i or default''' - try: - text = _objStr(self.labels[i]) - except: - text = default - if not self.simpleLabels: - _text = getattr(self.slices[i],'label_text','') - if _text is not None: text = _text - return text - -def boundsOverlap(P,Q): - return not(P[0]>Q[2]-1e-2 or Q[0]>P[2]-1e-2 or P[1]>(0.5*(Q[1]+Q[3]))-1e-2 or Q[1]>(0.5*(P[1]+P[3]))-1e-2) - -def _findOverlapRun(B,i,wrap): - '''find overlap run containing B[i]''' - n = len(B) - R = [i] - while 1: - i = R[-1] - j = (i+1)%n - if j in R or not boundsOverlap(B[i],B[j]): break - R.append(j) - while 1: - i = R[0] - j = (i-1)%n - if j in R or not boundsOverlap(B[i],B[j]): break - R.insert(0,j) - return R - -def findOverlapRun(B,wrap=1): - '''determine a set of overlaps in bounding boxes B or return None''' - n = len(B) - if n>1: - for i in range(n-1): - R = _findOverlapRun(B,i,wrap) - if len(R)>1: return R - return None - -def fixLabelOverlaps(L, sideLabels=False): - nL = len(L) - if nL<2: return - B = [l._origdata['bounds'] for l in L] - OK = 1 - RP = [] - iter = 0 - mult = 1. - - if not sideLabels: - while iter<30: - R = findOverlapRun(B) - if not R: break - nR = len(R) - if nR==nL: break - if not [r for r in RP if r in R]: - mult = 1.0 - da = 0 - r0 = R[0] - rL = R[-1] - bi = B[r0] - taa = aa = _360(L[r0]._pmv) - for r in R[1:]: - b = B[r] - da = max(da,min(b[3]-bi[1],bi[3]-b[1])) - bi = b - aa += L[r]._pmv - aa = aa/float(nR) - utaa = abs(L[rL]._pmv-taa) - ntaa = _360(utaa) - da *= mult*(nR-1)/ntaa - - for r in R: - l = L[r] - orig = l._origdata - angle = l._pmv = _360(l._pmv+da*(_360(l._pmv)-aa)) - rad = angle/_180_pi - l.x = orig['cx'] + orig['rx']*cos(rad) - l.y = orig['cy'] + orig['ry']*sin(rad) - B[r] = l.getBounds() - RP = R - mult *= 1.05 - iter += 1 - - else: - while iter<30: - R = findOverlapRun(B) - if not R: break - nR = len(R) - if nR == nL: break - l1 = L[-1] - orig1 = l1._origdata - bounds1 = orig1['bounds'] - for i,r in enumerate(R): - l = L[r] - orig = l._origdata - bounds = orig['bounds'] - diff1 = 0 - diff2 = 0 - if not i == nR-1: - if not bounds == bounds1: - if bounds[3]>bounds1[1] and bounds1[1]bounds[1] and bounds[1] diff2: - l.y +=0.5*(bounds1[3]-bounds1[1]) - elif diff2 >= diff1: - l.y -= 0.5*(bounds1[3]-bounds1[1]) - B[r] = l.getBounds() - iter += 1 - -def intervalIntersection(A,B): - x,y = max(min(A),min(B)),min(max(A),max(B)) - if x>=y: return None - return x,y - -def _makeSideArcDefs(sa,direction): - sa %= 360 - if 90<=sa<270: - if direction=='clockwise': - a = (0,90,sa),(1,-90,90),(0,-360+sa,-90) - else: - a = (0,sa,270),(1,270,450),(0,450,360+sa) - else: - offs = sa>=270 and 360 or 0 - if direction=='clockwise': - a = (1,offs-90,sa),(0,offs-270,offs-90),(1,-360+sa,offs-270) - else: - a = (1,sa,offs+90),(0,offs+90,offs+270),(1,offs+270,360+sa) - return tuple([a for a in a if a[1]1: a.sort(key=_keyFLA) - return a[0] - -def _fPLSide(l,width,side=None): - data = l._origdata - if side is None: - li = data['li'] - ri = data['ri'] - if li is None: - side = 1 - i = ri - elif ri is None: - side = 0 - i = li - elif li[1]-li[0]>ri[1]-ri[0]: - side = 0 - i = li - else: - side = 1 - i = ri - w = data['width'] - edgePad = data['edgePad'] - if not side: #on left - l._pmv = 180 - l.x = edgePad+w - i = data['li'] - else: - l._pmv = 0 - l.x = width - w - edgePad - i = data['ri'] - mid = data['mid'] = (i[0]+i[1])*0.5 - data['smid'] = sin(mid/_180_pi) - data['cmid'] = cos(mid/_180_pi) - data['side'] = side - return side,w - -#key functions -def _fPLCF(a,b): - return cmp(b._origdata['smid'],a._origdata['smid']) -_fPLCF = functools.cmp_to_key(_fPLCF) - -def _arcCF(a): - return a[1] - -def _fixPointerLabels(n,L,x,y,width,height,side=None): - LR = [],[] - mlr = [0,0] - for l in L: - i,w = _fPLSide(l,width,side) - LR[i].append(l) - mlr[i] = max(w,mlr[i]) - mul = 1 - G = n*[None] - mel = 0 - hh = height*0.5 - yhh = y+hh - m = max(mlr) - for i in (0,1): - T = LR[i] - if T: - B = [] - aB = B.append - S = [] - aS = S.append - T.sort(key=_fPLCF) - p = 0 - yh = y+height - for l in T: - data = l._origdata - inc = x+mul*(m-data['width']) - l.x += inc - G[data['index']] = l - ly = yhh+data['smid']*hh - b = data['bounds'] - b2 = (b[3]-b[1])*0.5 - if ly+b2>yh: ly = yh-b2 - if ly-b2sFree: break - yh = B[j0][3]+sAbove*sNeed/sFree - for r in R: - l = T[r] - data = l._origdata - b = data['bounds'] - b2 = (b[3]-b[1])*0.5 - yh -= 0.5 - ly = l.y = yh-b2 - B[r] = data['bounds'] = (b[0],ly-b2,b[2],yh) - yh = ly - b2 - 0.5 - mlr[i] = m+p - mul = -1 - return G, mlr[0], mlr[1], mel - -def theta0(data, direction): - fac = (2*pi)/sum(data) - rads = [d*fac for d in data] - - r0 = 0 - hrads = [] - for r in rads: - hrads.append(r0+r*0.5) - r0 += r - - vstar = len(data)*1e6 - rstar = 0 - delta = pi/36.0 - for i in range(36): - r = i*delta - v = sum([abs(sin(r+a)) for a in hrads]) - if v < vstar: - if direction == 'clockwise': - rstar=-r - else: - rstar=r - vstar = v - return rstar*180/pi - - -class AngleData(float): - '''use this to carry the data along with the angle''' - def __new__(cls,angle,data): - self = float.__new__(cls,angle) - self._data = data - return self - -class Pie(AbstractPieChart): - _attrMap = AttrMap(BASE=AbstractPieChart, - data = AttrMapValue(isListOfNumbers, desc='List of numbers defining wedge sizes; need not sum to 1'), - labels = AttrMapValue(isListOfStringsOrNone, desc="Optional list of labels to use for each data point"), - startAngle = AttrMapValue(isNumber, desc="Angle of first slice; 0 is due East"), - direction = AttrMapValue(OneOf('clockwise', 'anticlockwise'), desc="'clockwise' or 'anticlockwise'"), - slices = AttrMapValue(None, desc="Collection of wedge descriptor objects"), - simpleLabels = AttrMapValue(isBoolean, desc="If true(default) use a simple String not an advanced WedgeLabel. A WedgeLabel is customisable using the properties prefixed label_ in the collection slices."), - other_threshold = AttrMapValue(isNumber, desc='A value for doing threshholding, not used yet.',advancedUsage=1), - checkLabelOverlap = AttrMapValue(isBoolean, desc="If true check and attempt to fix\n standard label overlaps(default off)",advancedUsage=1), - pointerLabelMode = AttrMapValue(OneOf(None,'LeftRight','LeftAndRight'), desc='',advancedUsage=1), - sameRadii = AttrMapValue(isBoolean, desc="If true make x/y radii the same(default off)",advancedUsage=1), - orderMode = AttrMapValue(OneOf('fixed','alternate'),advancedUsage=1), - xradius = AttrMapValue(isNumberOrNone, desc="X direction Radius"), - yradius = AttrMapValue(isNumberOrNone, desc="Y direction Radius"), - innerRadiusFraction = AttrMapValue(isNumberOrNone, desc="fraction of radii to start wedges at"), - wedgeRecord = AttrMapValue(None, desc="callable(wedge,*args,**kwds)",advancedUsage=1), - sideLabels = AttrMapValue(isBoolean, desc="If true attempt to make piechart with labels along side and pointers"), - sideLabelsOffset = AttrMapValue(isNumber, desc="The fraction of the pie width that the labels are situated at from the edges of the pie"), - ) - other_threshold=None - - def __init__(self,**kwd): - PlotArea.__init__(self) - self.x = 0 - self.y = 0 - self.width = 100 - self.height = 100 - self.data = [1,2.3,1.7,4.2] - self.labels = None # or list of strings - self.startAngle = 90 - self.direction = "clockwise" - self.simpleLabels = 1 - self.checkLabelOverlap = 0 - self.pointerLabelMode = None - self.sameRadii = False - self.orderMode = 'fixed' - self.xradius = self.yradius = self.innerRadiusFraction = None - self.sideLabels = 0 - self.sideLabelsOffset = 0.1 - - self.slices = TypedPropertyCollection(WedgeProperties) - self.slices[0].fillColor = colors.darkcyan - self.slices[1].fillColor = colors.blueviolet - self.slices[2].fillColor = colors.blue - self.slices[3].fillColor = colors.cyan - self.slices[4].fillColor = colors.pink - self.slices[5].fillColor = colors.magenta - self.slices[6].fillColor = colors.yellow - - def demo(self): - d = Drawing(200, 100) - - pc = Pie() - pc.x = 50 - pc.y = 10 - pc.width = 100 - pc.height = 80 - pc.data = [10,20,30,40,50,60] - pc.labels = ['a','b','c','d','e','f'] - - pc.slices.strokeWidth=0.5 - pc.slices[3].popout = 10 - pc.slices[3].strokeWidth = 2 - pc.slices[3].strokeDashArray = [2,2] - pc.slices[3].labelRadius = 1.75 - pc.slices[3].fontColor = colors.red - pc.slices[0].fillColor = colors.darkcyan - pc.slices[1].fillColor = colors.blueviolet - pc.slices[2].fillColor = colors.blue - pc.slices[3].fillColor = colors.cyan - pc.slices[4].fillColor = colors.aquamarine - pc.slices[5].fillColor = colors.cadetblue - pc.slices[6].fillColor = colors.lightcoral - - d.add(pc) - return d - - def makePointerLabels(self,angles,plMode): - class PL: - def __init__(self,centerx,centery,xradius,yradius,data,lu=0,ru=0): - self.centerx = centerx - self.centery = centery - self.xradius = xradius - self.yradius = yradius - self.data = data - self.lu = lu - self.ru = ru - - labelX = self.width-2 - labelY = self.height - n = nr = nl = maxW = sumH = 0 - styleCount = len(self.slices) - L=[] - L_add = L.append - refArcs = _makeSideArcDefs(self.startAngle,self.direction) - for i, A in angles: - if A[1] is None: continue - sn = self.getSeriesName(i,'') - if not sn: continue - style = self.slices[i%styleCount] - if not style.label_visible or not style.visible: continue - n += 1 - l=_addWedgeLabel(self,sn,180,labelX,labelY,style,labelClass=WedgeLabel) - L_add(l) - b = l.getBounds() - w = b[2]-b[0] - h = b[3]-b[1] - ri = [(a[0],intervalIntersection(A,(a[1],a[2]))) for a in refArcs] - li = _findLargestArc(ri,0) - ri = _findLargestArc(ri,1) - if li and ri: - if plMode=='LeftAndRight': - if li[1]-li[0]ri[1]-ri[0]: - ri = None - if ri: nr += 1 - if li: nl += 1 - l._origdata = dict(bounds=b,width=w,height=h,li=li,ri=ri,index=i,edgePad=style.label_pointer_edgePad,piePad=style.label_pointer_piePad,elbowLength=style.label_pointer_elbowLength) - maxW = max(w,maxW) - sumH += h+2 - - if not n: #we have no labels - xradius = self.width*0.5 - yradius = self.height*0.5 - centerx = self.x+xradius - centery = self.y+yradius - if self.xradius: xradius = self.xradius - if self.yradius: yradius = self.yradius - if self.sameRadii: xradius=yradius=min(xradius,yradius) - return PL(centerx,centery,xradius,yradius,[]) - - aonR = nr==n - if sumH=1e-5] - W.sort(key=_arcCF) - T = [[],[]] - i = 0 - while W: - if i<2: - a = W.pop(0) - else: - a = W.pop(-1) - T[i%2].append(a) - i += 1 - i %= 4 - T[1].reverse() - D = T[0]+T[1] + [a for a in D if abs(a[1])<1e-5] - A = [] - a = A.append - for i, angle in D: - endAngle = (startAngle + (angle * whichWay)) - if abs(angle)>=_ANGLELO: - if startAngle >= endAngle: - aa = endAngle,startAngle - else: - aa = startAngle,endAngle - else: - aa = startAngle, None - if wr: - aa = (AngleData(aa[0],angle._data),aa[1]) - startAngle = endAngle - a((i,aa)) - return A - - def makeWedges(self): - angles = self.makeAngles() - #Checking to see whether there are too many wedges packed in too small a space - halfAngles = [] - for i,(a1,a2) in angles: - if a2 is None: - halfAngle = a1 - else: - halfAngle = 0.5*(a2+a1) - halfAngles.append(halfAngle) - sideLabels = self.sideLabels - n = len(angles) - labels = _fixLabels(self.labels,n) - wr = getattr(self,'wedgeRecord',None) - - self._seriesCount = n - styleCount = len(self.slices) - - plMode = self.pointerLabelMode - if sideLabels: - plMode = None - if plMode: - checkLabelOverlap = False - PL=self.makePointerLabels(angles,plMode) - xradius = PL.xradius - yradius = PL.yradius - centerx = PL.centerx - centery = PL.centery - PL_data = PL.data - gSN = lambda i: '' - else: - xradius = self.width*0.5 - yradius = self.height*0.5 - centerx = self.x + xradius - centery = self.y + yradius - if self.xradius: xradius = self.xradius - if self.yradius: yradius = self.yradius - if self.sameRadii: xradius=yradius=min(xradius,yradius) - checkLabelOverlap = self.checkLabelOverlap - gSN = lambda i: self.getSeriesName(i,'') - - g = Group() - g_add = g.add - L = [] - L_add = L.append - - innerRadiusFraction = self.innerRadiusFraction - - for i,(a1,a2) in angles: - if a2 is None: continue - #if we didn't use %stylecount here we'd end up with the later wedges - #all having the default style - wedgeStyle = self.slices[i%styleCount] - if not wedgeStyle.visible: continue - aa = abs(a2-a1) - - # is it a popout? - cx, cy = centerx, centery - text = gSN(i) - popout = wedgeStyle.popout - if text or popout: - averageAngle = (a1+a2)/2.0 - aveAngleRadians = averageAngle/_180_pi - cosAA = cos(aveAngleRadians) - sinAA = sin(aveAngleRadians) - if popout and aa<_ANGLEHI: - # pop out the wedge - cx = centerx + popout*cosAA - cy = centery + popout*sinAA - - if innerRadiusFraction: - theWedge = Wedge(cx, cy, xradius, a1, a2, yradius=yradius, - radius1=xradius*innerRadiusFraction,yradius1=yradius*innerRadiusFraction) - else: - if aa>=_ANGLEHI: - theWedge = Ellipse(cx, cy, xradius, yradius) - else: - theWedge = Wedge(cx, cy, xradius, a1, a2, yradius=yradius) - - - theWedge.fillColor = wedgeStyle.fillColor - theWedge.strokeColor = wedgeStyle.strokeColor - theWedge.strokeWidth = wedgeStyle.strokeWidth - theWedge.strokeLineJoin = wedgeStyle.strokeLineJoin - theWedge.strokeLineCap = wedgeStyle.strokeLineCap - theWedge.strokeMiterLimit = wedgeStyle.strokeMiterLimit - theWedge.strokeWidth = wedgeStyle.strokeWidth - theWedge.strokeDashArray = wedgeStyle.strokeDashArray - - g_add(theWedge) - if wr: - wr(theWedge,value=a1._data,label=text) - if wedgeStyle.label_visible: - if not sideLabels: - if text: - labelRadius = wedgeStyle.labelRadius - rx = xradius*labelRadius - ry = yradius*labelRadius - labelX = cx + rx*cosAA - labelY = cy + ry*sinAA - l = _addWedgeLabel(self,text,averageAngle,labelX,labelY,wedgeStyle) - L_add(l) - if not plMode and l._simple_pointer: - l._aax = cx+xradius*cosAA - l._aay = cy+yradius*sinAA - if checkLabelOverlap: - l._origdata = { 'x': labelX, 'y':labelY, 'angle': averageAngle, - 'rx': rx, 'ry':ry, 'cx':cx, 'cy':cy, - 'bounds': l.getBounds(), - } - elif plMode and PL_data: - l = PL_data[i] - if l: - data = l._origdata - sinM = data['smid'] - cosM = data['cmid'] - lX = cx + xradius*cosM - lY = cy + yradius*sinM - lpel = wedgeStyle.label_pointer_elbowLength - lXi = lX + lpel*cosM - lYi = lY + lpel*sinM - L_add(PolyLine((lX,lY,lXi,lYi,l.x,l.y), - strokeWidth=wedgeStyle.label_pointer_strokeWidth, - strokeColor=wedgeStyle.label_pointer_strokeColor)) - L_add(l) - else: - if text: - slices_popout = self.slices.popout - m=0 - for n, angle in angles: - if self.slices[n].fillColor: - m += 1 - else: - r = n%m - self.slices[n].fillColor = self.slices[r].fillColor - self.slices[n].popout = self.slices[r].popout - for j in range(0,m-1): - if self.slices[j].popout > slices_popout: - slices_popout = self.slices[j].popout - labelRadius = wedgeStyle.labelRadius - ry = yradius*labelRadius - if (abs(averageAngle) < 90 ) or (averageAngle >270 and averageAngle <450) or (-450< - averageAngle <-270): - labelX = (1+self.sideLabelsOffset)*self.width + self.x + slices_popout - rx = 0 - else: - labelX = self.x - (self.sideLabelsOffset)*self.width - slices_popout - rx = 0 - labelY = cy + ry*sinAA - l = _addWedgeLabel(self,text,averageAngle,labelX,labelY,wedgeStyle) - L_add(l) - if not plMode: - l._aax = cx+xradius*cosAA - l._aay = cy+yradius*sinAA - if checkLabelOverlap: - l._origdata = { 'x': labelX, 'y':labelY, 'angle': averageAngle, - 'rx': rx, 'ry':ry, 'cx':cx, 'cy':cy, - 'bounds': l.getBounds(), - } - x1,y1,x2,y2 = l.getBounds() - - if checkLabelOverlap and L: - fixLabelOverlaps(L, sideLabels) - for l in L: g_add(l) - - if not plMode: - for l in L: - if l._simple_pointer and not sideLabels: - g_add(Line(l.x,l.y,l._aax,l._aay, - strokeWidth=wedgeStyle.label_pointer_strokeWidth, - strokeColor=wedgeStyle.label_pointer_strokeColor)) - elif sideLabels: - x1,y1,x2,y2 = l.getBounds() - #add pointers - if l.x == (1+self.sideLabelsOffset)*self.width + self.x: - g_add(Line(l._aax,l._aay,0.5*(l._aax+l.x),l.y+(0.25*(y2-y1)), - strokeWidth=wedgeStyle.label_pointer_strokeWidth, - strokeColor=wedgeStyle.label_pointer_strokeColor)) - g_add(Line(0.5*(l._aax+l.x),l.y+(0.25*(y2-y1)),l.x,l.y+(0.25*(y2-y1)), - strokeWidth=wedgeStyle.label_pointer_strokeWidth, - strokeColor=wedgeStyle.label_pointer_strokeColor)) - else: - g_add(Line(l._aax,l._aay,0.5*(l._aax+l.x),l.y+(0.25*(y2-y1)), - strokeWidth=wedgeStyle.label_pointer_strokeWidth, - strokeColor=wedgeStyle.label_pointer_strokeColor)) - g_add(Line(0.5*(l._aax+l.x),l.y+(0.25*(y2-y1)),l.x,l.y+(0.25*(y2-y1)), - strokeWidth=wedgeStyle.label_pointer_strokeWidth, - strokeColor=wedgeStyle.label_pointer_strokeColor)) - - return g - - def draw(self): - G = self.makeBackground() - w = self.makeWedges() - if G: return Group(G,w) - return w - -class LegendedPie(Pie): - """Pie with a two part legend (one editable with swatches, one hidden without swatches).""" - - _attrMap = AttrMap(BASE=Pie, - drawLegend = AttrMapValue(isBoolean, desc="If true then create and draw legend"), - legend1 = AttrMapValue(None, desc="Handle to legend for pie"), - legendNumberFormat = AttrMapValue(None, desc="Formatting routine for number on right hand side of legend."), - legendNumberOffset = AttrMapValue(isNumber, desc="Horizontal space between legend and numbers on r/hand side"), - pieAndLegend_colors = AttrMapValue(isListOfColors, desc="Colours used for both swatches and pie"), - legend_names = AttrMapValue(isNoneOrListOfNoneOrStrings, desc="Names used in legend (or None)"), - legend_data = AttrMapValue(isNoneOrListOfNoneOrNumbers, desc="Numbers used on r/hand side of legend (or None)"), - leftPadding = AttrMapValue(isNumber, desc='Padding on left of drawing'), - rightPadding = AttrMapValue(isNumber, desc='Padding on right of drawing'), - topPadding = AttrMapValue(isNumber, desc='Padding at top of drawing'), - bottomPadding = AttrMapValue(isNumber, desc='Padding at bottom of drawing'), - ) - - def __init__(self): - Pie.__init__(self) - self.x = 0 - self.y = 0 - self.height = 100 - self.width = 100 - self.data = [38.4, 20.7, 18.9, 15.4, 6.6] - self.labels = None - self.direction = 'clockwise' - PCMYKColor, black = colors.PCMYKColor, colors.black - self.pieAndLegend_colors = [PCMYKColor(11,11,72,0,spotName='PANTONE 458 CV'), - PCMYKColor(100,65,0,30,spotName='PANTONE 288 CV'), - PCMYKColor(11,11,72,0,spotName='PANTONE 458 CV',density=75), - PCMYKColor(100,65,0,30,spotName='PANTONE 288 CV',density=75), - PCMYKColor(11,11,72,0,spotName='PANTONE 458 CV',density=50), - PCMYKColor(100,65,0,30,spotName='PANTONE 288 CV',density=50)] - - #Allows us up to six 'wedges' to be coloured - self.slices[0].fillColor=self.pieAndLegend_colors[0] - self.slices[1].fillColor=self.pieAndLegend_colors[1] - self.slices[2].fillColor=self.pieAndLegend_colors[2] - self.slices[3].fillColor=self.pieAndLegend_colors[3] - self.slices[4].fillColor=self.pieAndLegend_colors[4] - self.slices[5].fillColor=self.pieAndLegend_colors[5] - - self.slices.strokeWidth = 0.75 - self.slices.strokeColor = black - - legendOffset = 17 - self.legendNumberOffset = 51 - self.legendNumberFormat = '%.1f%%' - self.legend_data = self.data - - #set up the legends - from reportlab.graphics.charts.legends import Legend - self.legend1 = Legend() - self.legend1.x = self.width+legendOffset - self.legend1.y = self.height - self.legend1.deltax = 5.67 - self.legend1.deltay = 14.17 - self.legend1.dxTextSpace = 11.39 - self.legend1.dx = 5.67 - self.legend1.dy = 5.67 - self.legend1.columnMaximum = 7 - self.legend1.alignment = 'right' - self.legend_names = ['AAA:','AA:','A:','BBB:','NR:'] - for f in range(len(self.data)): - self.legend1.colorNamePairs.append((self.pieAndLegend_colors[f], self.legend_names[f])) - self.legend1.fontName = "Helvetica-Bold" - self.legend1.fontSize = 6 - self.legend1.strokeColor = black - self.legend1.strokeWidth = 0.5 - - self._legend2 = Legend() - self._legend2.dxTextSpace = 0 - self._legend2.dx = 0 - self._legend2.alignment = 'right' - self._legend2.fontName = "Helvetica-Oblique" - self._legend2.fontSize = 6 - self._legend2.strokeColor = self.legend1.strokeColor - - self.leftPadding = 5 - self.rightPadding = 5 - self.topPadding = 5 - self.bottomPadding = 5 - self.drawLegend = 1 - - def draw(self): - if self.drawLegend: - self.legend1.colorNamePairs = [] - self._legend2.colorNamePairs = [] - for f in range(len(self.data)): - if self.legend_names == None: - self.slices[f].fillColor = self.pieAndLegend_colors[f] - self.legend1.colorNamePairs.append((self.pieAndLegend_colors[f], None)) - else: - try: - self.slices[f].fillColor = self.pieAndLegend_colors[f] - self.legend1.colorNamePairs.append((self.pieAndLegend_colors[f], self.legend_names[f])) - except IndexError: - self.slices[f].fillColor = self.pieAndLegend_colors[f%len(self.pieAndLegend_colors)] - self.legend1.colorNamePairs.append((self.pieAndLegend_colors[f%len(self.pieAndLegend_colors)], self.legend_names[f])) - if self.legend_data != None: - ldf = self.legend_data[f] - lNF = self.legendNumberFormat - if ldf is None or lNF is None: - pass - elif isinstance(lNF,str): - ldf = lNF % ldf - elif hasattr(lNF,'__call__'): - ldf = lNF(ldf) - else: - raise ValueError("Unknown formatter type %s, expected string or function" % ascii(self.legendNumberFormat)) - self._legend2.colorNamePairs.append((None,ldf)) - p = Pie.draw(self) - if self.drawLegend: - p.add(self.legend1) - #hide from user - keeps both sides lined up! - self._legend2.x = self.legend1.x+self.legendNumberOffset - self._legend2.y = self.legend1.y - self._legend2.deltax = self.legend1.deltax - self._legend2.deltay = self.legend1.deltay - self._legend2.dy = self.legend1.dy - self._legend2.columnMaximum = self.legend1.columnMaximum - p.add(self._legend2) - p.shift(self.leftPadding, self.bottomPadding) - return p - - def _getDrawingDimensions(self): - tx = self.rightPadding - if self.drawLegend: - tx += self.legend1.x+self.legendNumberOffset #self._legend2.x - tx += self._legend2._calculateMaxWidth(self._legend2.colorNamePairs) - ty = self.bottomPadding+self.height+self.topPadding - return (tx,ty) - - def demo(self, drawing=None): - if not drawing: - tx,ty = self._getDrawingDimensions() - drawing = Drawing(tx, ty) - drawing.add(self.draw()) - return drawing - -from reportlab.graphics.charts.utils3d import _getShaded, _2rad, _360, _pi_2, _2pi, _180_pi -class Wedge3dProperties(PropHolder): - """This holds descriptive information about the wedges in a pie chart. - - It is not to be confused with the 'wedge itself'; this just holds - a recipe for how to format one, and does not allow you to hack the - angles. It can format a genuine Wedge object for you with its - format method. - """ - _attrMap = AttrMap( - fillColor = AttrMapValue(isColorOrNone,desc=''), - fillColorShaded = AttrMapValue(isColorOrNone,desc=''), - fontColor = AttrMapValue(isColorOrNone,desc=''), - fontName = AttrMapValue(isString,desc=''), - fontSize = AttrMapValue(isNumber,desc=''), - label_angle = AttrMapValue(isNumber,desc=''), - label_bottomPadding = AttrMapValue(isNumber,'padding at bottom of box'), - label_boxAnchor = AttrMapValue(isBoxAnchor,desc=''), - label_boxFillColor = AttrMapValue(isColorOrNone,desc=''), - label_boxStrokeColor = AttrMapValue(isColorOrNone,desc=''), - label_boxStrokeWidth = AttrMapValue(isNumber,desc=''), - label_dx = AttrMapValue(isNumber,desc=''), - label_dy = AttrMapValue(isNumber,desc=''), - label_height = AttrMapValue(isNumberOrNone,desc=''), - label_leading = AttrMapValue(isNumberOrNone,desc=''), - label_leftPadding = AttrMapValue(isNumber,'padding at left of box'), - label_maxWidth = AttrMapValue(isNumberOrNone,desc=''), - label_rightPadding = AttrMapValue(isNumber,'padding at right of box'), - label_simple_pointer = AttrMapValue(isBoolean,'set to True for simple pointers'), - label_strokeColor = AttrMapValue(isColorOrNone,desc=''), - label_strokeWidth = AttrMapValue(isNumber,desc=''), - label_text = AttrMapValue(isStringOrNone,desc=''), - label_textAnchor = AttrMapValue(isTextAnchor,desc=''), - label_topPadding = AttrMapValue(isNumber,'padding at top of box'), - label_visible = AttrMapValue(isBoolean,desc="True if the label is to be drawn"), - label_width = AttrMapValue(isNumberOrNone,desc=''), - labelRadius = AttrMapValue(isNumber,desc=''), - popout = AttrMapValue(isNumber,desc=''), - shading = AttrMapValue(isNumber,desc=''), - strokeColor = AttrMapValue(isColorOrNone,desc=''), - strokeColorShaded = AttrMapValue(isColorOrNone,desc=''), - strokeDashArray = AttrMapValue(isListOfNumbersOrNone,desc=''), - strokeWidth = AttrMapValue(isNumber,desc=''), - visible = AttrMapValue(isBoolean,'set to false to skip displaying'), - ) - - def __init__(self): - self.strokeWidth = 0 - self.shading = 0.3 - self.visible = 1 - self.strokeColorShaded = self.fillColorShaded = self.fillColor = None - self.strokeColor = STATE_DEFAULTS["strokeColor"] - self.strokeDashArray = STATE_DEFAULTS["strokeDashArray"] - self.popout = 0 - self.fontName = STATE_DEFAULTS["fontName"] - self.fontSize = STATE_DEFAULTS["fontSize"] - self.fontColor = STATE_DEFAULTS["fillColor"] - self.labelRadius = 1.2 - self.label_dx = self.label_dy = self.label_angle = 0 - self.label_text = None - self.label_topPadding = self.label_leftPadding = self.label_rightPadding = self.label_bottomPadding = 0 - self.label_boxAnchor = 'autox' - self.label_boxStrokeColor = None #boxStroke - self.label_boxStrokeWidth = 0.5 #boxStrokeWidth - self.label_boxFillColor = None - self.label_strokeColor = None - self.label_strokeWidth = 0.1 - self.label_leading = self.label_width = self.label_maxWidth = self.label_height = None - self.label_textAnchor = 'start' - self.label_visible = 1 - self.label_simple_pointer = 0 - -class _SL3D: - def __init__(self,lo,hi): - if lo<0: - lo += 360 - hi += 360 - self.lo = lo - self.hi = hi - self.mid = (lo+hi)*0.5 - self.not360 = abs(hi-lo) < _ANGLEHI - - def __str__(self): - return '_SL3D(%.2f,%.2f)' % (self.lo,self.hi) - -def _keyS3D(a,b): - return -cmp(a[0],b[0]) -_keyS3D = functools.cmp_to_key(_keyS3D) - -_270r = _2rad(270) -class Pie3d(Pie): - _attrMap = AttrMap(BASE=Pie, - perspective = AttrMapValue(isNumber, desc='A flattening parameter.'), - depth_3d = AttrMapValue(isNumber, desc='depth of the pie.'), - angle_3d = AttrMapValue(isNumber, desc='The view angle.'), - ) - perspective = 70 - depth_3d = 25 - angle_3d = 180 - - def _popout(self,i): - return self._sl3d[i].not360 and self.slices[i].popout or 0 - - def CX(self, i,d ): - return self._cx+(d and self._xdepth_3d or 0)+self._popout(i)*cos(_2rad(self._sl3d[i].mid)) - def CY(self,i,d): - return self._cy+(d and self._ydepth_3d or 0)+self._popout(i)*sin(_2rad(self._sl3d[i].mid)) - def OX(self,i,o,d): - return self.CX(i,d)+self._radiusx*cos(_2rad(o)) - def OY(self,i,o,d): - return self.CY(i,d)+self._radiusy*sin(_2rad(o)) - - def rad_dist(self,a): - _3dva = self._3dva - return min(abs(a-_3dva),abs(a-_3dva+360)) - - def __init__(self): - Pie.__init__(self) - self.slices[4].fillColor = colors.azure - self.slices[5].fillColor = colors.crimson - self.slices[6].fillColor = colors.darkviolet - self.slices = TypedPropertyCollection(Wedge3dProperties) - self.xradius = self.yradius = None - self.width = 300 - self.height = 200 - self.data = [12.50,20.10,2.00,22.00,5.00,18.00,13.00] - - def _fillSide(self,L,i,angle,strokeColor,strokeWidth,fillColor): - rd = self.rad_dist(angle) - if rd0: angle0, angle1 = angle1, angle0 - _sl3d.append(_SL3D(angle0,angle1)) - - labels = _fixLabels(self.labels,n) - a0 = _3d_angle - a1 = _3d_angle+180 - T = [] - S = [] - L = [] - - class WedgeLabel3d(WedgeLabel): - _ydepth_3d = self._ydepth_3d - def _checkDXY(self,ba): - if ba[0]=='n': - if not hasattr(self,'_ody'): - self._ody = self.dy - self.dy = -self._ody + self._ydepth_3d - - checkLabelOverlap = self.checkLabelOverlap - - for i in range(n): - style = slices[i] - if not style.visible: continue - sl = _sl3d[i] - lo = angle0 = sl.lo - hi = angle1 = sl.hi - aa = abs(hi-lo) - if aa<_ANGLELO: continue - fillColor = _getShaded(style.fillColor,style.fillColorShaded,style.shading) - strokeColor = _getShaded(style.strokeColor,style.strokeColorShaded,style.shading) or fillColor - strokeWidth = style.strokeWidth - cx0 = CX(i,0) - cy0 = CY(i,0) - cx1 = CX(i,1) - cy1 = CY(i,1) - if depth_3d: - #background shaded pie bottom - g.add(Wedge(cx1,cy1,radiusx, lo, hi,yradius=radiusy, - strokeColor=strokeColor,strokeWidth=strokeWidth,fillColor=fillColor, - strokeLineJoin=1)) - #connect to top - if lo < a0 < hi: angle0 = a0 - if lo < a1 < hi: angle1 = a1 - p = ArcPath(strokeColor=strokeColor, fillColor=fillColor,strokeWidth=strokeWidth,strokeLineJoin=1) - p.addArc(cx1,cy1,radiusx,angle0,angle1,yradius=radiusy,moveTo=1) - p.lineTo(OX(i,angle1,0),OY(i,angle1,0)) - p.addArc(cx0,cy0,radiusx,angle0,angle1,yradius=radiusy,reverse=1) - p.closePath() - if angle0<=_3dva and angle1>=_3dva: - rd = 0 - else: - rd = min(rad_dist(angle0),rad_dist(angle1)) - S.append((rd,p)) - _fillSide(S,i,lo,strokeColor,strokeWidth,fillColor) - _fillSide(S,i,hi,strokeColor,strokeWidth,fillColor) - - #bright shaded top - fillColor = style.fillColor - strokeColor = style.strokeColor or fillColor - T.append(Wedge(cx0,cy0,radiusx,lo,hi,yradius=radiusy, - strokeColor=strokeColor,strokeWidth=strokeWidth,fillColor=fillColor,strokeLineJoin=1)) - if aa>=_ANGLEHI: - theWedge = Ellipse(cx0, cy0, radiusx, radiusy, - strokeColor=strokeColor,strokeWidth=strokeWidth,fillColor=fillColor,strokeLineJoin=1) - else: - theWedge = Wedge(cx0,cy0,radiusx,lo,hi,yradius=radiusy, - strokeColor=strokeColor,strokeWidth=strokeWidth,fillColor=fillColor,strokeLineJoin=1) - T.append(theWedge) - - text = labels[i] - if style.label_visible and text: - rat = style.labelRadius - self._radiusx *= rat - self._radiusy *= rat - mid = sl.mid - labelX = OX(i,mid,0) - labelY = OY(i,mid,0) - l=_addWedgeLabel(self,text,mid,labelX,labelY,style,labelClass=WedgeLabel3d) - L.append(l) - if checkLabelOverlap: - l._origdata = { 'x': labelX, 'y':labelY, 'angle': mid, - 'rx': self._radiusx, 'ry':self._radiusy, 'cx':CX(i,0), 'cy':CY(i,0), - 'bounds': l.getBounds(), - } - self._radiusx = radiusx - self._radiusy = radiusy - - S.sort(key=_keyS3D) - if checkLabelOverlap and L: - fixLabelOverlaps(L,sideLabels) - for x in ([s[1] for s in S]+T+L): - g.add(x) - return g - - def demo(self): - d = Drawing(200, 100) - - pc = Pie() - pc.x = 50 - pc.y = 10 - pc.width = 100 - pc.height = 80 - pc.data = [10,20,30,40,50,60] - pc.labels = ['a','b','c','d','e','f'] - - pc.slices.strokeWidth=0.5 - pc.slices[3].popout = 10 - pc.slices[3].strokeWidth = 2 - pc.slices[3].strokeDashArray = [2,2] - pc.slices[3].labelRadius = 1.75 - pc.slices[3].fontColor = colors.red - pc.slices[0].fillColor = colors.darkcyan - pc.slices[1].fillColor = colors.blueviolet - pc.slices[2].fillColor = colors.blue - pc.slices[3].fillColor = colors.cyan - pc.slices[4].fillColor = colors.aquamarine - pc.slices[5].fillColor = colors.cadetblue - pc.slices[6].fillColor = colors.lightcoral - self.slices[1].visible = 0 - self.slices[3].visible = 1 - self.slices[4].visible = 1 - self.slices[5].visible = 1 - self.slices[6].visible = 0 - - d.add(pc) - return d - - -def sample0a(): - "Make a degenerated pie chart with only one slice." - - d = Drawing(400, 200) - - pc = Pie() - pc.x = 150 - pc.y = 50 - pc.data = [10] - pc.labels = ['a'] - pc.slices.strokeWidth=1#0.5 - - d.add(pc) - - return d - - -def sample0b(): - "Make a degenerated pie chart with only one slice." - - d = Drawing(400, 200) - - pc = Pie() - pc.x = 150 - pc.y = 50 - pc.width = 120 - pc.height = 100 - pc.data = [10] - pc.labels = ['a'] - pc.slices.strokeWidth=1#0.5 - - d.add(pc) - - return d - - -def sample1(): - "Make a typical pie chart with with one slice treated in a special way." - - d = Drawing(400, 200) - - pc = Pie() - pc.x = 150 - pc.y = 50 - pc.data = [10, 20, 30, 40, 50, 60] - pc.labels = ['a', 'b', 'c', 'd', 'e', 'f'] - - pc.slices.strokeWidth=1#0.5 - pc.slices[3].popout = 20 - pc.slices[3].strokeWidth = 2 - pc.slices[3].strokeDashArray = [2,2] - pc.slices[3].labelRadius = 1.75 - pc.slices[3].fontColor = colors.red - - d.add(pc) - - return d - - -def sample2(): - "Make a pie chart with nine slices." - - d = Drawing(400, 200) - - pc = Pie() - pc.x = 125 - pc.y = 25 - pc.data = [0.31, 0.148, 0.108, - 0.076, 0.033, 0.03, - 0.019, 0.126, 0.15] - pc.labels = ['1', '2', '3', '4', '5', '6', '7', '8', 'X'] - - pc.width = 150 - pc.height = 150 - pc.slices.strokeWidth=1#0.5 - - pc.slices[0].fillColor = colors.steelblue - pc.slices[1].fillColor = colors.thistle - pc.slices[2].fillColor = colors.cornflower - pc.slices[3].fillColor = colors.lightsteelblue - pc.slices[4].fillColor = colors.aquamarine - pc.slices[5].fillColor = colors.cadetblue - pc.slices[6].fillColor = colors.lightcoral - pc.slices[7].fillColor = colors.tan - pc.slices[8].fillColor = colors.darkseagreen - - d.add(pc) - - return d - - -def sample3(): - "Make a pie chart with a very slim slice." - - d = Drawing(400, 200) - - pc = Pie() - pc.x = 125 - pc.y = 25 - - pc.data = [74, 1, 25] - - pc.width = 150 - pc.height = 150 - pc.slices.strokeWidth=1#0.5 - pc.slices[0].fillColor = colors.steelblue - pc.slices[1].fillColor = colors.thistle - pc.slices[2].fillColor = colors.cornflower - - d.add(pc) - - return d - - -def sample4(): - "Make a pie chart with several very slim slices." - - d = Drawing(400, 200) - - pc = Pie() - pc.x = 125 - pc.y = 25 - - pc.data = [74, 1, 1, 1, 1, 22] - - pc.width = 150 - pc.height = 150 - pc.slices.strokeWidth=1#0.5 - pc.slices[0].fillColor = colors.steelblue - pc.slices[1].fillColor = colors.thistle - pc.slices[2].fillColor = colors.cornflower - pc.slices[3].fillColor = colors.lightsteelblue - pc.slices[4].fillColor = colors.aquamarine - pc.slices[5].fillColor = colors.cadetblue - - d.add(pc) - - return d - -def sample5(): - "Make a pie with side labels." - - d = Drawing(400, 200) - - pc = Pie() - pc.x = 125 - pc.y = 25 - - pc.data = [7, 1, 1, 1, 1, 2] - pc.labels = ['example1', 'example2', 'example3', 'example4', 'example5', 'example6'] - pc.sideLabels = 1 - - pc.width = 150 - pc.height = 150 - pc.slices.strokeWidth=1#0.5 - pc.slices[0].fillColor = colors.steelblue - pc.slices[1].fillColor = colors.thistle - pc.slices[2].fillColor = colors.cornflower - pc.slices[3].fillColor = colors.lightsteelblue - pc.slices[4].fillColor = colors.aquamarine - pc.slices[5].fillColor = colors.cadetblue - - d.add(pc) - - return d - -def sample6(): - - "Illustrates the pie moving to leave space for the left labels" - - d = Drawing(400, 200) - - pc = Pie() - "The x value of the pie chart is 0" - pc.x = 0 - pc.y = 25 - - pc.data = [74, 1, 1, 1, 1, 22] - pc.labels = ['example1', 'example2', 'example3', 'example4', 'example5', 'example6'] - pc.sideLabels = 1 - - pc.width = 150 - pc.height = 150 - pc.slices.strokeWidth=1#0.5 - pc.slices[0].fillColor = colors.steelblue - pc.slices[1].fillColor = colors.thistle - pc.slices[2].fillColor = colors.cornflower - pc.slices[3].fillColor = colors.lightsteelblue - pc.slices[4].fillColor = colors.aquamarine - pc.slices[5].fillColor = colors.cadetblue - - l = Line(0,0,0,200) - - d.add(pc) - d.add(l) - - return d - -def sample7(): - - "Case with overlapping pointers" - - d = Drawing(400, 200) - - pc = Pie() - pc.y = 50 - pc.x = 150 - pc.width = 100 - pc.height = 100 - - pc.data = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] - pc.labels = ['example1', 'example2', 'example3', 'example4', 'example5', 'example6', 'example7', - 'example8', 'example9', 'example10', 'example11', 'example12', 'example13', 'example14', - 'example15', 'example16', 'example17', 'example18', 'example19', 'example20', 'example21', - 'example22', 'example23', 'example24', 'example25', 'example26', 'example27', 'example28'] - pc.sideLabels = 1 - pc.checkLabelOverlap = 1 - pc.simpleLabels = 0 - - - pc.slices.strokeWidth=1#0.5 - pc.slices[0].fillColor = colors.steelblue - pc.slices[1].fillColor = colors.thistle - pc.slices[2].fillColor = colors.cornflower - pc.slices[3].fillColor = colors.lightsteelblue - pc.slices[4].fillColor = colors.aquamarine - pc.slices[5].fillColor = colors.cadetblue - - d.add(pc) - - return d - -def sample8(): - - "Case with overlapping labels" - "Labels overlap if they do not belong to adjacent pie slices due to nature of checkLabelOverlap" - - d = Drawing(400, 200) - - pc = Pie() - pc.y = 50 - pc.x = 150 - pc.width = 100 - pc.height = 100 - - pc.data = [1, 1, 1, 1, 1, 30, 50, 1, 1, 1, 1, 1, 1, 40,20,10] - pc.labels = ['example1', 'example2', 'example3', 'example4', 'example5', 'example6', 'example7', - 'example8', 'example9', 'example10', 'example11', 'example12', 'example13', 'example14', - 'example15', 'example16'] - pc.sideLabels = 1 - pc.checkLabelOverlap = 1 - - pc.slices.strokeWidth=1#0.5 - pc.slices[0].fillColor = colors.steelblue - pc.slices[1].fillColor = colors.thistle - pc.slices[2].fillColor = colors.cornflower - pc.slices[3].fillColor = colors.lightsteelblue - pc.slices[4].fillColor = colors.aquamarine - pc.slices[5].fillColor = colors.cadetblue - - d.add(pc) - - return d - -def sample9(): - - "Case with overlapping labels" - "Labels overlap if they do not belong to adjacent pies due to nature of checkLabelOverlap" - - d = Drawing(400, 200) - - pc = Pie() - pc.x = 125 - pc.y = 50 - - pc.data = [41, 20, 40, 15, 20, 30, 50, 15, 25, 35, 25, 20, 30, 40, 20, 30] - pc.labels = ['example1', 'example2', 'example3', 'example4', 'example5', 'example6', 'example7', - 'example8', 'example9', 'example10', 'example11', 'example12', 'example13', 'example14', - 'example15', 'example16'] - pc.sideLabels = 1 - pc.checkLabelOverlap = 1 - - pc.width = 100 - pc.height = 100 - pc.slices.strokeWidth=1#0.5 - pc.slices[0].fillColor = colors.steelblue - pc.slices[1].fillColor = colors.thistle - pc.slices[2].fillColor = colors.cornflower - pc.slices[3].fillColor = colors.lightsteelblue - pc.slices[4].fillColor = colors.aquamarine - pc.slices[5].fillColor = colors.cadetblue - - d.add(pc) - - return d - - - -if __name__=='__main__': - """Normally nobody will execute this - - It's helpful for reportlab developers to put a 'main' block in to execute - the most recently edited feature. - """ - drawing = sample7() - from reportlab.graphics import renderPDF - renderPDF.drawToFile(drawing, 'side_labelled_pie.pdf', 'Side Labelled Pie') - - - diff --git a/reportlab/graphics/charts/slidebox.py b/reportlab/graphics/charts/slidebox.py deleted file mode 100644 index 309fb07b..00000000 --- a/reportlab/graphics/charts/slidebox.py +++ /dev/null @@ -1,186 +0,0 @@ -from reportlab.lib.colors import Color, white, black -from reportlab.graphics.charts.textlabels import Label -from reportlab.graphics.shapes import Polygon, Line, Circle, String, Drawing, PolyLine, Group, Rect -from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection -from reportlab.lib.attrmap import * -from reportlab.lib.validators import * -from reportlab.lib.units import cm -from reportlab.pdfbase.pdfmetrics import stringWidth, getFont -from reportlab.graphics.widgets.grids import ShadedRect, Grid - -class SlideBox(Widget): - """Returns a slidebox widget""" - _attrMap = AttrMap( - labelFontName = AttrMapValue(isString, desc="Name of font used for the labels"), - labelFontSize = AttrMapValue(isNumber, desc="Size of font used for the labels"), - labelStrokeColor = AttrMapValue(isColorOrNone, desc="Colour for for number outlines"), - labelFillColor = AttrMapValue(isColorOrNone, desc="Colour for number insides"), - startColor = AttrMapValue(isColor, desc='Color of first box'), - endColor = AttrMapValue(isColor, desc='Color of last box'), - numberOfBoxes = AttrMapValue(isInt, desc='How many boxes there are'), - trianglePosition = AttrMapValue(isInt, desc='Which box is highlighted by the triangles'), - triangleHeight = AttrMapValue(isNumber, desc="Height of indicator triangles"), - triangleWidth = AttrMapValue(isNumber, desc="Width of indicator triangles"), - triangleFillColor = AttrMapValue(isColor, desc="Colour of indicator triangles"), - triangleStrokeColor = AttrMapValue(isColorOrNone, desc="Colour of indicator triangle outline"), - triangleStrokeWidth = AttrMapValue(isNumber, desc="Colour of indicator triangle outline"), - boxHeight = AttrMapValue(isNumber, desc="Height of the boxes"), - boxWidth = AttrMapValue(isNumber, desc="Width of the boxes"), - boxSpacing = AttrMapValue(isNumber, desc="Space between the boxes"), - boxOutlineColor = AttrMapValue(isColorOrNone, desc="Colour used to outline the boxes (if any)"), - boxOutlineWidth = AttrMapValue(isNumberOrNone, desc="Width of the box outline (if any)"), - leftPadding = AttrMapValue(isNumber, desc='Padding on left of drawing'), - rightPadding = AttrMapValue(isNumber, desc='Padding on right of drawing'), - topPadding = AttrMapValue(isNumber, desc='Padding at top of drawing'), - bottomPadding = AttrMapValue(isNumber, desc='Padding at bottom of drawing'), - background = AttrMapValue(isColorOrNone, desc='Colour of the background to the drawing (if any)'), - sourceLabelText = AttrMapValue(isNoneOrString, desc="Text used for the 'source' label (can be empty)"), - sourceLabelOffset = AttrMapValue(isNumber, desc='Padding at bottom of drawing'), - sourceLabelFontName = AttrMapValue(isString, desc="Name of font used for the 'source' label"), - sourceLabelFontSize = AttrMapValue(isNumber, desc="Font size for the 'source' label"), - sourceLabelFillColor = AttrMapValue(isColorOrNone, desc="Colour ink for the 'source' label (bottom right)"), - ) - - def __init__(self): - self.labelFontName = "Helvetica-Bold" - self.labelFontSize = 10 - self.labelStrokeColor = black - self.labelFillColor = white - self.startColor = colors.Color(232/255.0,224/255.0,119/255.0) - self.endColor = colors.Color(25/255.0,77/255.0,135/255.0) - self.numberOfBoxes = 7 - self.trianglePosition = 7 - self.triangleHeight = 0.12*cm - self.triangleWidth = 0.38*cm - self.triangleFillColor = white - self.triangleStrokeColor = black - self.triangleStrokeWidth = 0.58 - self.boxHeight = 0.55*cm - self.boxWidth = 0.73*cm - self.boxSpacing = 0.075*cm - self.boxOutlineColor = black - self.boxOutlineWidth = 0.58 - self.leftPadding=5 - self.rightPadding=5 - self.topPadding=5 - self.bottomPadding=5 - self.background=None - self.sourceLabelText = "Source: ReportLab" - self.sourceLabelOffset = 0.2*cm - self.sourceLabelFontName = "Helvetica-Oblique" - self.sourceLabelFontSize = 6 - self.sourceLabelFillColor = black - - def _getDrawingDimensions(self): - tx=(self.numberOfBoxes*self.boxWidth) - if self.numberOfBoxes>1: tx=tx+((self.numberOfBoxes-1)*self.boxSpacing) - tx=tx+self.leftPadding+self.rightPadding - ty=self.boxHeight+self.triangleHeight - ty=ty+self.topPadding+self.bottomPadding+self.sourceLabelOffset+self.sourceLabelFontSize - return (tx,ty) - - def _getColors(self): - # for calculating intermediate colors... - numShades = self.numberOfBoxes+1 - fillColorStart = self.startColor - fillColorEnd = self.endColor - colorsList =[] - - for i in range(0,numShades): - colorsList.append(colors.linearlyInterpolatedColor(fillColorStart, fillColorEnd, 0, numShades-1, i)) - return colorsList - - def demo(self,drawing=None): - from reportlab.lib import colors - if not drawing: - tx,ty=self._getDrawingDimensions() - drawing = Drawing(tx,ty) - drawing.add(self.draw()) - return drawing - - def draw(self): - g = Group() - ys = self.bottomPadding+(self.triangleHeight/2)+self.sourceLabelOffset+self.sourceLabelFontSize - if self.background: - x,y = self._getDrawingDimensions() - g.add(Rect(-self.leftPadding,-ys,x,y, - strokeColor=None, - strokeWidth=0, - fillColor=self.background)) - - ascent=getFont(self.labelFontName).face.ascent/1000. - if ascent==0: ascent=0.718 # default (from helvetica) - ascent=ascent*self.labelFontSize # normalize - - colorsList = self._getColors() - - # Draw the boxes - now uses ShadedRect from grids - x=0 - for f in range (0,self.numberOfBoxes): - sr=ShadedRect() - sr.x=x - sr.y=0 - sr.width=self.boxWidth - sr.height=self.boxHeight - sr.orientation = 'vertical' - sr.numShades = 30 - sr.fillColorStart = colorsList[f] - sr.fillColorEnd = colorsList[f+1] - sr.strokeColor = None - sr.strokeWidth = 0 - - g.add(sr) - - g.add(Rect(x,0,self.boxWidth,self.boxHeight, - strokeColor=self.boxOutlineColor, - strokeWidth=self.boxOutlineWidth, - fillColor=None)) - - g.add(String(x+self.boxWidth/2.,(self.boxHeight-ascent)/2., - text = str(f+1), - fillColor = self.labelFillColor, - strokeColor=self.labelStrokeColor, - textAnchor = 'middle', - fontName = self.labelFontName, - fontSize = self.labelFontSize)) - x=x+self.boxWidth+self.boxSpacing - - #do triangles - xt = (self.trianglePosition*self.boxWidth) - if self.trianglePosition>1: - xt = xt+(self.trianglePosition-1)*self.boxSpacing - xt = xt-(self.boxWidth/2) - g.add(Polygon( - strokeColor = self.triangleStrokeColor, - strokeWidth = self.triangleStrokeWidth, - fillColor = self.triangleFillColor, - points=[xt,self.boxHeight-(self.triangleHeight/2), - xt-(self.triangleWidth/2),self.boxHeight+(self.triangleHeight/2), - xt+(self.triangleWidth/2),self.boxHeight+(self.triangleHeight/2), - xt,self.boxHeight-(self.triangleHeight/2)])) - g.add(Polygon( - strokeColor = self.triangleStrokeColor, - strokeWidth = self.triangleStrokeWidth, - fillColor = self.triangleFillColor, - points=[xt,0+(self.triangleHeight/2), - xt-(self.triangleWidth/2),0-(self.triangleHeight/2), - xt+(self.triangleWidth/2),0-(self.triangleHeight/2), - xt,0+(self.triangleHeight/2)])) - - #source label - if self.sourceLabelText != None: - g.add(String(x-self.boxSpacing,0-(self.triangleHeight/2)-self.sourceLabelOffset-(self.sourceLabelFontSize), - text = self.sourceLabelText, - fillColor = self.sourceLabelFillColor, - textAnchor = 'end', - fontName = self.sourceLabelFontName, - fontSize = self.sourceLabelFontSize)) - - g.shift(self.leftPadding, ys) - - return g - - -if __name__ == "__main__": - d = SlideBox() - d.demo().save(fnRoot="slidebox") diff --git a/reportlab/graphics/charts/spider.py b/reportlab/graphics/charts/spider.py deleted file mode 100644 index 1da25f18..00000000 --- a/reportlab/graphics/charts/spider.py +++ /dev/null @@ -1,408 +0,0 @@ - #Copyright ReportLab Europe Ltd. 2000-2004 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/spider.py -# spider chart, also known as radar chart - -__version__=''' $Id$ ''' -__doc__="""Spider Chart - -Normal use shows variation of 5-10 parameters against some 'norm' or target. -When there is more than one series, place the series with the largest -numbers first, as it will be overdrawn by each successive one. -""" - -import copy -from math import sin, cos, pi - -from reportlab.lib import colors -from reportlab.lib.validators import isColor, isNumber, isListOfNumbersOrNone,\ - isListOfNumbers, isColorOrNone, isString,\ - isListOfStringsOrNone, OneOf, SequenceOf,\ - isBoolean, isListOfColors, isNumberOrNone,\ - isNoneOrListOfNoneOrStrings, isTextAnchor,\ - isNoneOrListOfNoneOrNumbers, isBoxAnchor,\ - isStringOrNone, isStringOrNone, EitherOr,\ - isCallable -from reportlab.lib.attrmap import * -from reportlab.pdfgen.canvas import Canvas -from reportlab.graphics.shapes import Group, Drawing, Line, Rect, Polygon, PolyLine, Ellipse, \ - Wedge, String, STATE_DEFAULTS -from reportlab.graphics.widgetbase import Widget, TypedPropertyCollection, PropHolder -from reportlab.graphics.charts.areas import PlotArea -from reportlab.graphics.charts.legends import _objStr -from reportlab.graphics.charts.piecharts import WedgeLabel -from reportlab.graphics.widgets.markers import makeMarker, uSymbol2Symbol, isSymbol - -class StrandProperty(PropHolder): - - _attrMap = AttrMap( - strokeWidth = AttrMapValue(isNumber,desc='width'), - fillColor = AttrMapValue(isColorOrNone,desc='filling color'), - strokeColor = AttrMapValue(isColorOrNone,desc='stroke color'), - strokeDashArray = AttrMapValue(isListOfNumbersOrNone,desc='dashing pattern, e.g. (3,2)'), - symbol = AttrMapValue(EitherOr((isStringOrNone,isSymbol)), desc='Widget placed at data points.',advancedUsage=1), - symbolSize= AttrMapValue(isNumber, desc='Symbol size.',advancedUsage=1), - name = AttrMapValue(isStringOrNone, desc='Name of the strand.'), - ) - - def __init__(self): - self.strokeWidth = 1 - self.fillColor = None - self.strokeColor = STATE_DEFAULTS["strokeColor"] - self.strokeDashArray = STATE_DEFAULTS["strokeDashArray"] - self.symbol = None - self.symbolSize = 5 - self.name = None - -class SpokeProperty(PropHolder): - _attrMap = AttrMap( - strokeWidth = AttrMapValue(isNumber,desc='width'), - fillColor = AttrMapValue(isColorOrNone,desc='filling color'), - strokeColor = AttrMapValue(isColorOrNone,desc='stroke color'), - strokeDashArray = AttrMapValue(isListOfNumbersOrNone,desc='dashing pattern, e.g. (2,1)'), - labelRadius = AttrMapValue(isNumber,desc='label radius',advancedUsage=1), - visible = AttrMapValue(isBoolean,desc="True if the spoke line is to be drawn"), - ) - - def __init__(self,**kw): - self.strokeWidth = 0.5 - self.fillColor = None - self.strokeColor = STATE_DEFAULTS["strokeColor"] - self.strokeDashArray = STATE_DEFAULTS["strokeDashArray"] - self.visible = 1 - self.labelRadius = 1.05 - -class SpokeLabel(WedgeLabel): - def __init__(self,**kw): - WedgeLabel.__init__(self,**kw) - if '_text' not in list(kw.keys()): self._text = '' - -class StrandLabel(SpokeLabel): - _attrMap = AttrMap(BASE=SpokeLabel, - format = AttrMapValue(EitherOr((isStringOrNone,isCallable)),desc="Format for the label"), - dR = AttrMapValue(isNumberOrNone,desc="radial shift for label"), - ) - def __init__(self,**kw): - self.format = '' - self.dR = 0 - SpokeLabel.__init__(self,**kw) - -def _setupLabel(labelClass, text, radius, cx, cy, angle, car, sar, sty): - L = labelClass() - L._text = text - L.x = cx + radius*car - L.y = cy + radius*sar - L._pmv = angle*180/pi - L.boxAnchor = sty.boxAnchor - L.dx = sty.dx - L.dy = sty.dy - L.angle = sty.angle - L.boxAnchor = sty.boxAnchor - L.boxStrokeColor = sty.boxStrokeColor - L.boxStrokeWidth = sty.boxStrokeWidth - L.boxFillColor = sty.boxFillColor - L.strokeColor = sty.strokeColor - L.strokeWidth = sty.strokeWidth - L.leading = sty.leading - L.width = sty.width - L.maxWidth = sty.maxWidth - L.height = sty.height - L.textAnchor = sty.textAnchor - L.visible = sty.visible - L.topPadding = sty.topPadding - L.leftPadding = sty.leftPadding - L.rightPadding = sty.rightPadding - L.bottomPadding = sty.bottomPadding - L.fontName = sty.fontName - L.fontSize = sty.fontSize - L.fillColor = sty.fillColor - return L - -class SpiderChart(PlotArea): - _attrMap = AttrMap(BASE=PlotArea, - data = AttrMapValue(None, desc='Data to be plotted, list of (lists of) numbers.'), - labels = AttrMapValue(isListOfStringsOrNone, desc="optional list of labels to use for each data point"), - startAngle = AttrMapValue(isNumber, desc="angle of first slice; like the compass, 0 is due North"), - direction = AttrMapValue( OneOf('clockwise', 'anticlockwise'), desc="'clockwise' or 'anticlockwise'"), - strands = AttrMapValue(None, desc="collection of strand descriptor objects"), - spokes = AttrMapValue(None, desc="collection of spoke descriptor objects"), - strandLabels = AttrMapValue(None, desc="collection of strand label descriptor objects"), - spokeLabels = AttrMapValue(None, desc="collection of spoke label descriptor objects"), - ) - - def makeSwatchSample(self, rowNo, x, y, width, height): - baseStyle = self.strands - styleIdx = rowNo % len(baseStyle) - style = baseStyle[styleIdx] - strokeColor = getattr(style, 'strokeColor', getattr(baseStyle,'strokeColor',None)) - fillColor = getattr(style, 'fillColor', getattr(baseStyle,'fillColor',None)) - strokeDashArray = getattr(style, 'strokeDashArray', getattr(baseStyle,'strokeDashArray',None)) - strokeWidth = getattr(style, 'strokeWidth', getattr(baseStyle, 'strokeWidth',0)) - symbol = getattr(style, 'symbol', getattr(baseStyle, 'symbol',None)) - ym = y+height/2.0 - if fillColor is None and strokeColor is not None and strokeWidth>0: - bg = Line(x,ym,x+width,ym,strokeWidth=strokeWidth,strokeColor=strokeColor, - strokeDashArray=strokeDashArray) - elif fillColor is not None: - bg = Rect(x,y,width,height,strokeWidth=strokeWidth,strokeColor=strokeColor, - strokeDashArray=strokeDashArray,fillColor=fillColor) - else: - bg = None - if symbol: - symbol = uSymbol2Symbol(symbol,x+width/2.,ym,color) - if bg: - g = Group() - g.add(bg) - g.add(symbol) - return g - return symbol or bg - - def getSeriesName(self,i,default=None): - '''return series name i or default''' - return _objStr(getattr(self.strands[i],'name',default)) - - def __init__(self): - PlotArea.__init__(self) - - self.data = [[10,12,14,16,14,12], [6,8,10,12,9,11]] - self.labels = None # or list of strings - self.labels = ['a','b','c','d','e','f'] - self.startAngle = 90 - self.direction = "clockwise" - - self.strands = TypedPropertyCollection(StrandProperty) - self.spokes = TypedPropertyCollection(SpokeProperty) - self.spokeLabels = TypedPropertyCollection(SpokeLabel) - self.spokeLabels._text = None - self.strandLabels = TypedPropertyCollection(StrandLabel) - self.x = 10 - self.y = 10 - self.width = 180 - self.height = 180 - - def demo(self): - d = Drawing(200, 200) - d.add(SpiderChart()) - return d - - def normalizeData(self, outer = 0.0): - """Turns data into normalized ones where each datum is < 1.0, - and 1.0 = maximum radius. Adds 10% at outside edge by default""" - data = self.data - assert min(list(map(min,data))) >=0, "Cannot do spider plots of negative numbers!" - norm = max(list(map(max,data))) - norm *= (1.0+outer) - if norm<1e-9: norm = 1.0 - self._norm = norm - return [[e/norm for e in row] for row in data] - - def _innerDrawLabel(self, sty, radius, cx, cy, angle, car, sar, labelClass=StrandLabel): - "Draw a label for a given item in the list." - fmt = sty.format - value = radius*self._norm - if not fmt: - text = None - elif isinstance(fmt,str): - if fmt == 'values': - text = sty._text - else: - text = fmt % value - elif hasattr(fmt,'__call__'): - text = fmt(value) - else: - raise ValueError("Unknown formatter type %s, expected string or function" % fmt) - - if text: - dR = sty.dR - if dR: - radius += dR/self._radius - L = _setupLabel(labelClass, text, radius, cx, cy, angle, car, sar, sty) - if dR<0: L._anti = 1 - else: - L = None - return L - - def draw(self): - # normalize slice data - g = self.makeBackground() or Group() - - xradius = self.width/2.0 - yradius = self.height/2.0 - self._radius = radius = min(xradius, yradius) - cx = self.x + xradius - cy = self.y + yradius - - data = self.normalizeData() - - self._seriesCount = len(data) - n = len(data[0]) - - #labels - if self.labels is None: - labels = [''] * n - else: - labels = self.labels - #there's no point in raising errors for less than enough errors if - #we silently create all for the extreme case of no labels. - i = n-len(labels) - if i>0: - labels = labels + ['']*i - - S = [] - STRANDS = [] - STRANDAREAS = [] - syms = [] - labs = [] - csa = [] - angle = self.startAngle*pi/180 - direction = self.direction == "clockwise" and -1 or 1 - angleBetween = direction*(2 * pi)/float(n) - spokes = self.spokes - spokeLabels = self.spokeLabels - for i in range(n): - car = cos(angle)*radius - sar = sin(angle)*radius - csa.append((car,sar,angle)) - si = self.spokes[i] - if si.visible: - spoke = Line(cx, cy, cx + car, cy + sar, strokeWidth = si.strokeWidth, strokeColor=si.strokeColor, strokeDashArray=si.strokeDashArray) - S.append(spoke) - sli = spokeLabels[i] - text = sli._text - if not text: text = labels[i] - if text: - S.append(_setupLabel(WedgeLabel, text, si.labelRadius, cx, cy, angle, car, sar, sli)) - angle += angleBetween - - # now plot the polygons - rowIdx = 0 - strands = self.strands - strandLabels = self.strandLabels - for row in data: - # series plot - rsty = strands[rowIdx] - points = [] - car, sar = csa[-1][:2] - r = row[-1] - points.append(cx+car*r) - points.append(cy+sar*r) - for i in range(n): - car, sar, angle = csa[i] - r = row[i] - points.append(cx+car*r) - points.append(cy+sar*r) - L = self._innerDrawLabel(strandLabels[(rowIdx,i)], r, cx, cy, angle, car, sar, labelClass=StrandLabel) - if L: labs.append(L) - sty = strands[(rowIdx,i)] - uSymbol = sty.symbol - - # put in a marker, if it needs one - if uSymbol: - s_x = cx+car*r - s_y = cy+sar*r - s_fillColor = sty.fillColor - s_strokeColor = sty.strokeColor - s_strokeWidth = sty.strokeWidth - s_angle = 0 - s_size = sty.symbolSize - if type(uSymbol) is type(''): - symbol = makeMarker(uSymbol, - size = s_size, - x = s_x, - y = s_y, - fillColor = s_fillColor, - strokeColor = s_strokeColor, - strokeWidth = s_strokeWidth, - angle = s_angle, - ) - else: - symbol = uSymbol2Symbol(uSymbol,s_x,s_y,s_fillColor) - for k,v in (('size', s_size), ('fillColor', s_fillColor), - ('x', s_x), ('y', s_y), - ('strokeColor',s_strokeColor), ('strokeWidth',s_strokeWidth), - ('angle',s_angle),): - if getattr(symbol,k,None) is None: - try: - setattr(symbol,k,v) - except: - pass - syms.append(symbol) - - # make up the 'strand' - if rsty.fillColor: - strand = Polygon(points) - strand.fillColor = rsty.fillColor - strand.strokeColor = None - strand.strokeWidth = 0 - STRANDAREAS.append(strand) - if rsty.strokeColor and rsty.strokeWidth: - strand = PolyLine(points) - strand.strokeColor = rsty.strokeColor - strand.strokeWidth = rsty.strokeWidth - strand.strokeDashArray = rsty.strokeDashArray - STRANDS.append(strand) - rowIdx += 1 - - for s in (STRANDAREAS+STRANDS+syms+S+labs): g.add(s) - return g - -def sample1(): - "Make a simple spider chart" - d = Drawing(400, 400) - sp = SpiderChart() - sp.x = 50 - sp.y = 50 - sp.width = 300 - sp.height = 300 - sp.data = [[10,12,14,16,14,12], [6,8,10,12,9,15],[7,8,17,4,12,8]] - sp.labels = ['a','b','c','d','e','f'] - sp.strands[0].strokeColor = colors.cornsilk - sp.strands[1].strokeColor = colors.cyan - sp.strands[2].strokeColor = colors.palegreen - sp.strands[0].fillColor = colors.cornsilk - sp.strands[1].fillColor = colors.cyan - sp.strands[2].fillColor = colors.palegreen - sp.spokes.strokeDashArray = (2,2) - d.add(sp) - return d - - -def sample2(): - "Make a spider chart with markers, but no fill" - d = Drawing(400, 400) - sp = SpiderChart() - sp.x = 50 - sp.y = 50 - sp.width = 300 - sp.height = 300 - sp.data = [[10,12,14,16,14,12], [6,8,10,12,9,15],[7,8,17,4,12,8]] - sp.labels = ['U','V','W','X','Y','Z'] - sp.strands.strokeWidth = 1 - sp.strands[0].fillColor = colors.pink - sp.strands[1].fillColor = colors.lightblue - sp.strands[2].fillColor = colors.palegreen - sp.strands[0].strokeColor = colors.red - sp.strands[1].strokeColor = colors.blue - sp.strands[2].strokeColor = colors.green - sp.strands.symbol = "FilledDiamond" - sp.strands[1].symbol = makeMarker("Circle") - sp.strands[1].symbol.strokeWidth = 0.5 - sp.strands[1].symbol.fillColor = colors.yellow - sp.strands.symbolSize = 6 - sp.strandLabels[0,3]._text = 'special' - sp.strandLabels[0,1]._text = 'one' - sp.strandLabels[0,0]._text = 'zero' - sp.strandLabels[1,0]._text = 'Earth' - sp.strandLabels[2,2]._text = 'Mars' - sp.strandLabels.format = 'values' - sp.strandLabels.dR = -5 - d.add(sp) - return d - - -if __name__=='__main__': - d = sample1() - from reportlab.graphics.renderPDF import drawToFile - drawToFile(d, 'spider.pdf') - d = sample2() - drawToFile(d, 'spider2.pdf') diff --git a/reportlab/graphics/charts/textlabels.py b/reportlab/graphics/charts/textlabels.py deleted file mode 100644 index ead3aec4..00000000 --- a/reportlab/graphics/charts/textlabels.py +++ /dev/null @@ -1,466 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/textlabels.py -__version__=''' $Id$ ''' -import string - -from reportlab.lib import colors -from reportlab.lib.utils import simpleSplit, _simpleSplit -from reportlab.lib.validators import isNumber, isNumberOrNone, OneOf, isColorOrNone, isString, \ - isTextAnchor, isBoxAnchor, isBoolean, NoneOr, isInstanceOf, isNoneOrString, isNoneOrCallable -from reportlab.lib.attrmap import * -from reportlab.pdfbase.pdfmetrics import stringWidth, getAscentDescent -from reportlab.graphics.shapes import Drawing, Group, Circle, Rect, String, STATE_DEFAULTS -from reportlab.graphics.shapes import _PATH_OP_ARG_COUNT, _PATH_OP_NAMES, definePath -from reportlab.graphics.widgetbase import Widget, PropHolder -from reportlab.graphics.shapes import _baseGFontName - -_gs = None -_A2BA= { - 'x': {0:'n', 45:'ne', 90:'e', 135:'se', 180:'s', 225:'sw', 270:'w', 315: 'nw', -45: 'nw'}, - 'y': {0:'e', 45:'se', 90:'s', 135:'sw', 180:'w', 225:'nw', 270:'n', 315: 'ne', -45: 'ne'}, - } - -def _pathNumTrunc(n): - if int(n)==n: return int(n) - return round(n,5) - -def _processGlyph(G, truncate=1, pathReverse=0): - O = [] - P = [] - R = [] - if G and len(G)==1 and G[0][0]=='lineTo': - G = (('moveToClosed',)+G[0][1:],)+G #hack fix for some errors - for g in G+(('end',),): - op = g[0] - if O and op in ['moveTo', 'moveToClosed','end']: - if O[0]=='moveToClosed': - O = O[1:] - if pathReverse: - for i in range(0,len(P),2): - P[i+1], P[i] = P[i:i+2] - P.reverse() - O.reverse() - O.insert(0,'moveTo') - O.append('closePath') - i = 0 - if truncate: P = list(map(_pathNumTrunc,P)) - for o in O: - j = i + _PATH_OP_ARG_COUNT[_PATH_OP_NAMES.index(o)] - if o=='closePath': - R.append(o) - else: - R.append((o,)+ tuple(P[i:j])) - i = j - O = [] - P = [] - O.append(op) - P.extend(g[1:]) - return R - -def _text2PathDescription(text, x=0, y=0, fontName=_baseGFontName, fontSize=1000, - anchor='start', truncate=1, pathReverse=0): - from reportlab.graphics import renderPM, _renderPM - _gs = _renderPM.gstate(1,1) - renderPM._setFont(_gs,fontName,fontSize) - P = [] - if not anchor=='start': - textLen = stringWidth(text, fontName,fontSize) - if anchor=='end': - x = x-textLen - elif anchor=='middle': - x = x - textLen/2. - for g in _gs._stringPath(text,x,y): - P.extend(_processGlyph(g,truncate=truncate,pathReverse=pathReverse)) - return P - -def _text2Path(text, x=0, y=0, fontName=_baseGFontName, fontSize=1000, - anchor='start', truncate=1, pathReverse=0,**kwds): - return definePath(_text2PathDescription(text,x=x,y=y,fontName=fontName, - fontSize=fontSize,anchor=anchor,truncate=truncate,pathReverse=pathReverse),**kwds) - -_BA2TA={'w':'start','nw':'start','sw':'start','e':'end', 'ne': 'end', 'se':'end', 'n':'middle','s':'middle','c':'middle'} -class Label(Widget): - """A text label to attach to something else, such as a chart axis. - - This allows you to specify an offset, angle and many anchor - properties relative to the label's origin. It allows, for example, - angled multiline axis labels. - """ - # fairly straight port of Robin Becker's textbox.py to new widgets - # framework. - - _attrMap = AttrMap( - x = AttrMapValue(isNumber,desc=''), - y = AttrMapValue(isNumber,desc=''), - dx = AttrMapValue(isNumber,desc='delta x - offset'), - dy = AttrMapValue(isNumber,desc='delta y - offset'), - angle = AttrMapValue(isNumber,desc='angle of label: default (0), 90 is vertical, 180 is upside down, etc'), - boxAnchor = AttrMapValue(isBoxAnchor,desc='anchoring point of the label'), - boxStrokeColor = AttrMapValue(isColorOrNone,desc='border color of the box'), - boxStrokeWidth = AttrMapValue(isNumber,desc='border width'), - boxFillColor = AttrMapValue(isColorOrNone,desc='the filling color of the box'), - boxTarget = AttrMapValue(OneOf('normal','anti','lo','hi'),desc="one of ('normal','anti','lo','hi')"), - fillColor = AttrMapValue(isColorOrNone,desc='label text color'), - strokeColor = AttrMapValue(isColorOrNone,desc='label text border color'), - strokeWidth = AttrMapValue(isNumber,desc='label text border width'), - text = AttrMapValue(isString,desc='the actual text to display'), - fontName = AttrMapValue(isString,desc='the name of the font used'), - fontSize = AttrMapValue(isNumber,desc='the size of the font'), - leading = AttrMapValue(isNumberOrNone,desc=''), - width = AttrMapValue(isNumberOrNone,desc='the width of the label'), - maxWidth = AttrMapValue(isNumberOrNone,desc='maximum width the label can grow to'), - height = AttrMapValue(isNumberOrNone,desc='the height of the text'), - textAnchor = AttrMapValue(isTextAnchor,desc='the anchoring point of the text inside the label'), - visible = AttrMapValue(isBoolean,desc="True if the label is to be drawn"), - topPadding = AttrMapValue(isNumber,desc='padding at top of box'), - leftPadding = AttrMapValue(isNumber,desc='padding at left of box'), - rightPadding = AttrMapValue(isNumber,desc='padding at right of box'), - bottomPadding = AttrMapValue(isNumber,desc='padding at bottom of box'), - useAscentDescent = AttrMapValue(isBoolean,desc="If True then the font's Ascent & Descent will be used to compute default heights and baseline."), - customDrawChanger = AttrMapValue(isNoneOrCallable,desc="An instance of CustomDrawChanger to modify the behavior at draw time", _advancedUsage=1), - ) - - def __init__(self,**kw): - self._setKeywords(**kw) - self._setKeywords( - _text = 'Multi-Line\nString', - boxAnchor = 'c', - angle = 0, - x = 0, - y = 0, - dx = 0, - dy = 0, - topPadding = 0, - leftPadding = 0, - rightPadding = 0, - bottomPadding = 0, - boxStrokeWidth = 0.5, - boxStrokeColor = None, - boxTarget = 'normal', - strokeColor = None, - boxFillColor = None, - leading = None, - width = None, - maxWidth = None, - height = None, - fillColor = STATE_DEFAULTS['fillColor'], - fontName = STATE_DEFAULTS['fontName'], - fontSize = STATE_DEFAULTS['fontSize'], - strokeWidth = 0.1, - textAnchor = 'start', - visible = 1, - useAscentDescent = False, - ) - - def setText(self, text): - """Set the text property. May contain embedded newline characters. - Called by the containing chart or axis.""" - self._text = text - - - def setOrigin(self, x, y): - """Set the origin. This would be the tick mark or bar top relative to - which it is defined. Called by the containing chart or axis.""" - self.x = x - self.y = y - - - def demo(self): - """This shows a label positioned with its top right corner - at the top centre of the drawing, and rotated 45 degrees.""" - - d = Drawing(200, 100) - - # mark the origin of the label - d.add(Circle(100,90, 5, fillColor=colors.green)) - - lab = Label() - lab.setOrigin(100,90) - lab.boxAnchor = 'ne' - lab.angle = 45 - lab.dx = 0 - lab.dy = -20 - lab.boxStrokeColor = colors.green - lab.setText('Another\nMulti-Line\nString') - d.add(lab) - - return d - - def _getBoxAnchor(self): - '''hook for allowing special box anchor effects''' - ba = self.boxAnchor - if ba in ('autox', 'autoy'): - angle = self.angle - na = (int((angle%360)/45.)*45)%360 - if not (na % 90): # we have a right angle case - da = (angle - na) % 360 - if abs(da)>5: - na = na + (da>0 and 45 or -45) - ba = _A2BA[ba[-1]][na] - return ba - - def computeSize(self): - # the thing will draw in its own coordinate system - self._lineWidths = [] - topPadding = self.topPadding - leftPadding = self.leftPadding - rightPadding = self.rightPadding - bottomPadding = self.bottomPadding - self._lines = simpleSplit(self._text,self.fontName,self.fontSize,self.maxWidth) - if not self.width: - self._width = leftPadding+rightPadding - if self._lines: - self._lineWidths = [stringWidth(line,self.fontName,self.fontSize) for line in self._lines] - self._width += max(self._lineWidths) - else: - self._width = self.width - if self.useAscentDescent: - self._ascent, self._descent = getAscentDescent(self.fontName,self.fontSize) - self._baselineRatio = self._ascent/(self._ascent-self._descent) - else: - self._baselineRatio = 1/1.2 - if self.leading: - self._leading = self.leading - elif self.useAscentDescent: - self._leading = self._ascent - self._descent - else: - self._leading = self.fontSize*1.2 - self._height = self.height or (self._leading*len(self._lines) + topPadding + bottomPadding) - self._ewidth = (self._width-leftPadding-rightPadding) - self._eheight = (self._height-topPadding-bottomPadding) - boxAnchor = self._getBoxAnchor() - if boxAnchor in ['n','ne','nw']: - self._top = -topPadding - elif boxAnchor in ['s','sw','se']: - self._top = self._height-topPadding - else: - self._top = 0.5*self._eheight - self._bottom = self._top - self._eheight - - if boxAnchor in ['ne','e','se']: - self._left = leftPadding - self._width - elif boxAnchor in ['nw','w','sw']: - self._left = leftPadding - else: - self._left = -self._ewidth*0.5 - self._right = self._left+self._ewidth - - def _getTextAnchor(self): - '''This can be overridden to allow special effects''' - ta = self.textAnchor - if ta=='boxauto': ta = _BA2TA[self._getBoxAnchor()] - return ta - - def _rawDraw(self): - _text = self._text - self._text = _text or '' - self.computeSize() - self._text = _text - g = Group() - g.translate(self.x + self.dx, self.y + self.dy) - g.rotate(self.angle) - - y = self._top - self._leading*self._baselineRatio - textAnchor = self._getTextAnchor() - if textAnchor == 'start': - x = self._left - elif textAnchor == 'middle': - x = self._left + self._ewidth*0.5 - else: - x = self._right - - # paint box behind text just in case they - # fill it - if self.boxFillColor or (self.boxStrokeColor and self.boxStrokeWidth): - g.add(Rect( self._left-self.leftPadding, - self._bottom-self.bottomPadding, - self._width, - self._height, - strokeColor=self.boxStrokeColor, - strokeWidth=self.boxStrokeWidth, - fillColor=self.boxFillColor) - ) - - fillColor, fontName, fontSize = self.fillColor, self.fontName, self.fontSize - strokeColor, strokeWidth, leading = self.strokeColor, self.strokeWidth, self._leading - svgAttrs=getattr(self,'_svgAttrs',{}) - if strokeColor: - for line in self._lines: - s = _text2Path(line, x, y, fontName, fontSize, textAnchor) - s.fillColor = fillColor - s.strokeColor = strokeColor - s.strokeWidth = strokeWidth - g.add(s) - y -= leading - else: - for line in self._lines: - s = String(x, y, line, _svgAttrs=svgAttrs) - s.textAnchor = textAnchor - s.fontName = fontName - s.fontSize = fontSize - s.fillColor = fillColor - g.add(s) - y -= leading - - return g - - def draw(self): - customDrawChanger = getattr(self,'customDrawChanger',None) - if customDrawChanger: - customDrawChanger(True,self) - try: - return self._rawDraw() - finally: - customDrawChanger(False,self) - else: - return self._rawDraw() - -class LabelDecorator: - _attrMap = AttrMap( - x = AttrMapValue(isNumberOrNone,desc=''), - y = AttrMapValue(isNumberOrNone,desc=''), - dx = AttrMapValue(isNumberOrNone,desc=''), - dy = AttrMapValue(isNumberOrNone,desc=''), - angle = AttrMapValue(isNumberOrNone,desc=''), - boxAnchor = AttrMapValue(isBoxAnchor,desc=''), - boxStrokeColor = AttrMapValue(isColorOrNone,desc=''), - boxStrokeWidth = AttrMapValue(isNumberOrNone,desc=''), - boxFillColor = AttrMapValue(isColorOrNone,desc=''), - fillColor = AttrMapValue(isColorOrNone,desc=''), - strokeColor = AttrMapValue(isColorOrNone,desc=''), - strokeWidth = AttrMapValue(isNumberOrNone),desc='', - fontName = AttrMapValue(isNoneOrString,desc=''), - fontSize = AttrMapValue(isNumberOrNone,desc=''), - leading = AttrMapValue(isNumberOrNone,desc=''), - width = AttrMapValue(isNumberOrNone,desc=''), - maxWidth = AttrMapValue(isNumberOrNone,desc=''), - height = AttrMapValue(isNumberOrNone,desc=''), - textAnchor = AttrMapValue(isTextAnchor,desc=''), - visible = AttrMapValue(isBoolean,desc="True if the label is to be drawn"), - ) - - def __init__(self): - self.textAnchor = 'start' - self.boxAnchor = 'w' - for a in self._attrMap.keys(): - if not hasattr(self,a): setattr(self,a,None) - - def decorate(self,l,L): - chart,g,rowNo,colNo,x,y,width,height,x00,y00,x0,y0 = l._callOutInfo - L.setText(chart.categoryAxis.categoryNames[colNo]) - g.add(L) - - def __call__(self,l): - from copy import deepcopy - L = Label() - for a,v in self.__dict__.items(): - if v is None: v = getattr(l,a,None) - setattr(L,a,v) - self.decorate(l,L) - -isOffsetMode=OneOf('high','low','bar','axis') -class LabelOffset(PropHolder): - _attrMap = AttrMap( - posMode = AttrMapValue(isOffsetMode,desc="Where to base +ve offset"), - pos = AttrMapValue(isNumber,desc='Value for positive elements'), - negMode = AttrMapValue(isOffsetMode,desc="Where to base -ve offset"), - neg = AttrMapValue(isNumber,desc='Value for negative elements'), - ) - def __init__(self): - self.posMode=self.negMode='axis' - self.pos = self.neg = 0 - - def _getValue(self, chart, val): - flipXY = chart._flipXY - A = chart.categoryAxis - jA = A.joinAxis - if val>=0: - mode = self.posMode - delta = self.pos - else: - mode = self.negMode - delta = self.neg - if flipXY: - v = A._x - else: - v = A._y - if jA: - if flipXY: - _v = jA._x - else: - _v = jA._y - if mode=='high': - v = _v + jA._length - elif mode=='low': - v = _v - elif mode=='bar': - v = _v+val - return v+delta - -NoneOrInstanceOfLabelOffset=NoneOr(isInstanceOf(LabelOffset)) - -class PMVLabel(Label): - _attrMap = AttrMap( - BASE=Label, - ) - - def __init__(self): - Label.__init__(self) - self._pmv = 0 - - def _getBoxAnchor(self): - a = Label._getBoxAnchor(self) - if self._pmv<0: a = {'nw':'se','n':'s','ne':'sw','w':'e','c':'c','e':'w','sw':'ne','s':'n','se':'nw'}[a] - return a - - def _getTextAnchor(self): - a = Label._getTextAnchor(self) - if self._pmv<0: a = {'start':'end', 'middle':'middle', 'end':'start'}[a] - return a - -class BarChartLabel(PMVLabel): - """ - An extended Label allowing for nudging, lines visibility etc - """ - _attrMap = AttrMap( - BASE=PMVLabel, - lineStrokeWidth = AttrMapValue(isNumberOrNone, desc="Non-zero for a drawn line"), - lineStrokeColor = AttrMapValue(isColorOrNone, desc="Color for a drawn line"), - fixedEnd = AttrMapValue(NoneOrInstanceOfLabelOffset, desc="None or fixed draw ends +/-"), - fixedStart = AttrMapValue(NoneOrInstanceOfLabelOffset, desc="None or fixed draw starts +/-"), - nudge = AttrMapValue(isNumber, desc="Non-zero sign dependent nudge"), - boxTarget = AttrMapValue(OneOf('normal','anti','lo','hi','mid'),desc="one of ('normal','anti','lo','hi','mid')"), - ) - - def __init__(self): - PMVLabel.__init__(self) - self.lineStrokeWidth = 0 - self.lineStrokeColor = None - self.fixedStart = self.fixedEnd = None - self.nudge = 0 - -class NA_Label(BarChartLabel): - """ - An extended Label allowing for nudging, lines visibility etc - """ - _attrMap = AttrMap( - BASE=BarChartLabel, - text = AttrMapValue(isNoneOrString, desc="Text to be used for N/A values"), - ) - def __init__(self): - BarChartLabel.__init__(self) - self.text = 'n/a' -NoneOrInstanceOfNA_Label=NoneOr(isInstanceOf(NA_Label)) - -from reportlab.graphics.charts.utils import CustomDrawChanger -class RedNegativeChanger(CustomDrawChanger): - def __init__(self,fillColor=colors.red): - CustomDrawChanger.__init__(self) - self.fillColor = fillColor - def _changer(self,obj): - R = {} - if obj._text.startswith('-'): - R['fillColor'] = obj.fillColor - obj.fillColor = self.fillColor - return R diff --git a/reportlab/graphics/charts/utils.py b/reportlab/graphics/charts/utils.py deleted file mode 100644 index 4abcffa8..00000000 --- a/reportlab/graphics/charts/utils.py +++ /dev/null @@ -1,390 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/charts/utils.py - -__version__=''' $Id$ ''' -__doc__="Utilities used here and there." -from time import mktime, gmtime, strftime -from math import log10, pi, floor, sin, cos, sqrt, hypot -import weakref -from reportlab.graphics.shapes import transformPoint, transformPoints, inverse, Ellipse, Group, String, Path, numericXShift -from reportlab.lib.utils import flatten -from reportlab.pdfbase.pdfmetrics import stringWidth - -### Dinu's stuff used in some line plots (likely to vansih). -def mkTimeTuple(timeString): - "Convert a 'dd/mm/yyyy' formatted string to a tuple for use in the time module." - - list = [0] * 9 - dd, mm, yyyy = list(map(int, timeString.split('/'))) - list[:3] = [yyyy, mm, dd] - - return tuple(list) - -def str2seconds(timeString): - "Convert a number of seconds since the epoch into a date string." - - return mktime(mkTimeTuple(timeString)) - -def seconds2str(seconds): - "Convert a date string into the number of seconds since the epoch." - - return strftime('%Y-%m-%d', gmtime(seconds)) - -### Aaron's rounding function for making nice values on axes. -def nextRoundNumber(x): - """Return the first 'nice round number' greater than or equal to x - - Used in selecting apropriate tick mark intervals; we say we want - an interval which places ticks at least 10 points apart, work out - what that is in chart space, and ask for the nextRoundNumber(). - Tries the series 1,2,5,10,20,50,100.., going up or down as needed. - """ - - #guess to nearest order of magnitude - if x in (0, 1): - return x - - if x < 0: - return -1.0 * nextRoundNumber(-x) - else: - lg = int(log10(x)) - - if lg == 0: - if x < 1: - base = 0.1 - else: - base = 1.0 - elif lg < 0: - base = 10.0 ** (lg - 1) - else: - base = 10.0 ** lg # e.g. base(153) = 100 - # base will always be lower than x - - if base >= x: - return base * 1.0 - elif (base * 2) >= x: - return base * 2.0 - elif (base * 5) >= x: - return base * 5.0 - else: - return base * 10.0 - -_intervals=(.1, .2, .25, .5) -_j_max=len(_intervals)-1 -def find_interval(lo,hi,I=5): - 'determine tick parameters for range [lo, hi] using I intervals' - - if lo >= hi: - if lo==hi: - if lo==0: - lo = -.1 - hi = .1 - else: - lo = 0.9*lo - hi = 1.1*hi - else: - raise ValueError("lo>hi") - x=(hi - lo)/float(I) - b= (x>0 and (x<1 or x>10)) and 10**floor(log10(x)) or 1 - b = b - while 1: - a = x/b - if a<=_intervals[-1]: break - b = b*10 - - j = 0 - while a>_intervals[j]: j = j + 1 - - while 1: - ss = _intervals[j]*b - n = lo/ss - l = int(n)-(n<0) - n = ss*l - x = ss*(l+I) - a = I*ss - if n>0: - if a>=hi: - n = 0.0 - x = a - elif hi<0: - a = -a - if lo>a: - n = a - x = 0 - if hi<=x and n<=lo: break - j = j + 1 - if j>_j_max: - j = 0 - b = b*10 - return n, x, ss, lo - n + x - hi - -def find_good_grid(lower,upper,n=(4,5,6,7,8,9), grid=None): - if grid: - t = divmod(lower,grid)[0] * grid - hi, z = divmod(upper,grid) - if z>1e-8: hi = hi+1 - hi = hi*grid - else: - try: - n[0] - except TypeError: - n = range(max(1,n-2),max(n+3,2)) - - w = 1e308 - for i in n: - z=find_interval(lower,upper,i) - if z[3] 3 or power < -3: - format = '%+'+repr(w+7)+'.0e' - else: - if power >= 0: - digits = int(power)+w - format = '%' + repr(digits)+'.0f' - else: - digits = w-int(power) - format = '%'+repr(digits+2)+'.'+repr(digits)+'f' - - if percent: format=format+'%%' - T = [] - n = int(float(hi-t)/grid+0.1)+1 - if split: - labels = [] - for i in range(n): - v = t+grid*i - T.append(v) - labels.append(format % (v+labelVOffset)) - return T, labels - else: - for i in range(n): - v = t+grid*i - T.append((v, format % (v+labelVOffset))) - return T - -def findNones(data): - m = len(data) - if None in data: - b = 0 - while bdepth_slope and _getShaded(fillColor,fillColorShaded,shading) or fillColor - zy0 = z0*theta_y - zx0 = z0*theta_x - - tileStrokeWidth = 0.6 - if tileWidth is None: - D = [(x1,y1)] - else: - T = ((y1-y0)**2+(x1-x0)**2)**0.5 - tileStrokeWidth *= tileWidth - if Tself.x1: return 1 - if o.s==self.s and o.i in (self.i-1,self.i+1): return - a = self.a - b = self.b - oa = o.a - ob = o.b - det = ob*a - oa*b - if -1e-81 or ou<0 or ou>1: return - x = x0 + u*a - y = self.y0 + u*b - if _ZERO=small: a(seg) - S.sort(key=_segKey) - I = [] - n = len(S) - for i in range(0,n-1): - s = S[i] - for j in range(i+1,n): - if s.intersect(S[j],I)==1: break - I.sort() - return I - -if __name__=='__main__': - from reportlab.graphics.shapes import Drawing - from reportlab.lib.colors import lightgrey, pink - D = Drawing(300,200) - _draw_3d_bar(D, 10, 20, 10, 50, 5, 5, fillColor=lightgrey, strokeColor=pink) - _draw_3d_bar(D, 30, 40, 10, 45, 5, 5, fillColor=lightgrey, strokeColor=pink) - - D.save(formats=['pdf'],outDir='.',fnRoot='_draw_3d_bar') - - print(find_intersections([[(0,0.5),(1,0.5),(0.5,0),(0.5,1)],[(.2666666667,0.4),(0.1,0.4),(0.1,0.2),(0,0),(1,1)],[(0,1),(0.4,0.1),(1,0.1)]])) - print(find_intersections([[(0.1, 0.2), (0.1, 0.4)], [(0, 1), (0.4, 0.1)]])) - print(find_intersections([[(0.2, 0.4), (0.1, 0.4)], [(0.1, 0.8), (0.4, 0.1)]])) - print(find_intersections([[(0,0),(1,1)],[(0.4,0.1),(1,0.1)]])) - print(find_intersections([[(0,0.5),(1,0.5),(0.5,0),(0.5,1)],[(0,0),(1,1)],[(0.1,0.8),(0.4,0.1),(1,0.1)]])) diff --git a/reportlab/graphics/renderPDF.py b/reportlab/graphics/renderPDF.py deleted file mode 100644 index 9701ca94..00000000 --- a/reportlab/graphics/renderPDF.py +++ /dev/null @@ -1,404 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/renderPDF.py -# renderPDF - draws Drawings onto a canvas - -__version__=''' $Id$ ''' -__doc__="""Render Drawing objects within others PDFs or standalone - -Usage:: - - import renderpdf - renderpdf.draw(drawing, canvas, x, y) - -Execute the script to see some test drawings. -changed -""" - -from reportlab.graphics.shapes import * -from reportlab.pdfgen.canvas import Canvas -from reportlab.pdfbase.pdfmetrics import stringWidth -from reportlab.lib.utils import getBytesIO -from reportlab import rl_config -from reportlab.graphics.renderbase import Renderer, StateTracker, getStateDelta, renderScaledDrawing - -# the main entry point for users... -def draw(drawing, canvas, x, y, showBoundary=rl_config._unset_): - """As it says""" - R = _PDFRenderer() - R.draw(renderScaledDrawing(drawing), canvas, x, y, showBoundary=showBoundary) - -class _PDFRenderer(Renderer): - """This draws onto a PDF document. It needs to be a class - rather than a function, as some PDF-specific state tracking is - needed outside of the state info in the SVG model.""" - - def __init__(self): - self._stroke = 0 - self._fill = 0 - self._tracker = StateTracker() - - def drawNode(self, node): - """This is the recursive method called for each node - in the tree""" - #print "pdf:drawNode", self - #if node.__class__ is Wedge: stop - if not (isinstance(node, Path) and node.isClipPath): - self._canvas.saveState() - - #apply state changes - deltas = getStateDelta(node) - self._tracker.push(deltas) - self.applyStateChanges(deltas, {}) - - #draw the object, or recurse - self.drawNodeDispatcher(node) - - self._tracker.pop() - if not (isinstance(node, Path) and node.isClipPath): - self._canvas.restoreState() - - def drawRect(self, rect): - if rect.rx == rect.ry == 0: - #plain old rectangle - self._canvas.rect( - rect.x, rect.y, - rect.width, rect.height, - stroke=self._stroke, - fill=self._fill - ) - else: - #cheat and assume ry = rx; better to generalize - #pdfgen roundRect function. TODO - self._canvas.roundRect( - rect.x, rect.y, - rect.width, rect.height, rect.rx, - fill=self._fill, - stroke=self._stroke - ) - - def drawImage(self, image): - path = image.path - # currently not implemented in other renderers - if path and (hasattr(path,'mode') or os.path.exists(image.path)): - self._canvas.drawInlineImage( - path, - image.x, image.y, - image.width, image.height - ) - - def drawLine(self, line): - if self._stroke: - self._canvas.line(line.x1, line.y1, line.x2, line.y2) - - def drawCircle(self, circle): - self._canvas.circle( - circle.cx, circle.cy, circle.r, - fill=self._fill, - stroke=self._stroke - ) - - def drawPolyLine(self, polyline): - if self._stroke: - assert len(polyline.points) >= 2, 'Polyline must have 2 or more points' - head, tail = polyline.points[0:2], polyline.points[2:], - path = self._canvas.beginPath() - path.moveTo(head[0], head[1]) - for i in range(0, len(tail), 2): - path.lineTo(tail[i], tail[i+1]) - self._canvas.drawPath(path) - - def drawWedge(self, wedge): - if wedge.annular: - self.drawPath(wedge.asPolygon()) - else: - centerx, centery, radius, startangledegrees, endangledegrees = \ - wedge.centerx, wedge.centery, wedge.radius, wedge.startangledegrees, wedge.endangledegrees - yradius, radius1, yradius1 = wedge._xtraRadii() - if yradius is None: yradius = radius - angle = endangledegrees-startangledegrees - path = self._canvas.beginPath() - if (radius1==0 or radius1 is None) and (yradius1==0 or yradius1 is None): - path.moveTo(centerx, centery) - path.arcTo(centerx-radius, centery-yradius, centerx+radius, centery+yradius, - startangledegrees, angle) - else: - path.arc(centerx-radius, centery-yradius, centerx+radius, centery+yradius, - startangledegrees, angle) - path.arcTo(centerx-radius1, centery-yradius1, centerx+radius1, centery+yradius1, - endangledegrees, -angle) - path.close() - self._canvas.drawPath(path, - fill=self._fill, - stroke=self._stroke) - - def drawEllipse(self, ellipse): - #need to convert to pdfgen's bounding box representation - x1 = ellipse.cx - ellipse.rx - x2 = ellipse.cx + ellipse.rx - y1 = ellipse.cy - ellipse.ry - y2 = ellipse.cy + ellipse.ry - self._canvas.ellipse(x1,y1,x2,y2,fill=self._fill,stroke=self._stroke) - - def drawPolygon(self, polygon): - assert len(polygon.points) >= 2, 'Polyline must have 2 or more points' - head, tail = polygon.points[0:2], polygon.points[2:], - path = self._canvas.beginPath() - path.moveTo(head[0], head[1]) - for i in range(0, len(tail), 2): - path.lineTo(tail[i], tail[i+1]) - path.close() - self._canvas.drawPath( - path, - stroke=self._stroke, - fill=self._fill - ) - - def drawString(self, stringObj): - if self._fill: - S = self._tracker.getState() - text_anchor, x, y, text, enc = S['textAnchor'], stringObj.x,stringObj.y,stringObj.text, stringObj.encoding - if not text_anchor in ['start','inherited']: - font, font_size = S['fontName'], S['fontSize'] - textLen = stringWidth(text, font, font_size, enc) - if text_anchor=='end': - x -= textLen - elif text_anchor=='middle': - x -= textLen*0.5 - elif text_anchor=='numeric': - x -= numericXShift(text_anchor,text,textLen,font,font_size,enc) - else: - raise ValueError('bad value for textAnchor '+str(text_anchor)) - t = self._canvas.beginText(x,y) - t.textLine(text) - self._canvas.drawText(t) - - def drawPath(self, path): - from reportlab.graphics.shapes import _renderPath - pdfPath = self._canvas.beginPath() - drawFuncs = (pdfPath.moveTo, pdfPath.lineTo, pdfPath.curveTo, pdfPath.close) - isClosed = _renderPath(path, drawFuncs) - if isClosed: - fill = self._fill - else: - fill = 0 - if path.isClipPath: - self._canvas.clipPath(pdfPath, fill=fill, stroke=self._stroke) - else: - self._canvas.drawPath(pdfPath, - fill=fill, - stroke=self._stroke) - - def setStrokeColor(self,c): - self._canvas.setStrokeColor(c) - - def setFillColor(self,c): - self._canvas.setFillColor(c) - - def applyStateChanges(self, delta, newState): - """This takes a set of states, and outputs the PDF operators - needed to set those properties""" - for key, value in delta.items(): - if key == 'transform': - self._canvas.transform(value[0], value[1], value[2], - value[3], value[4], value[5]) - elif key == 'strokeColor': - #this has different semantics in PDF to SVG; - #we always have a color, and either do or do - #not apply it; in SVG one can have a 'None' color - if value is None: - self._stroke = 0 - else: - self._stroke = 1 - self.setStrokeColor(value) - elif key == 'strokeWidth': - self._canvas.setLineWidth(value) - elif key == 'strokeLineCap': #0,1,2 - self._canvas.setLineCap(value) - elif key == 'strokeLineJoin': - self._canvas.setLineJoin(value) -# elif key == 'stroke_dasharray': -# self._canvas.setDash(array=value) - elif key == 'strokeDashArray': - if value: - if isinstance(value,(list,tuple)) and len(value)==2 and isinstance(value[1],(tuple,list)): - phase = value[0] - value = value[1] - else: - phase = 0 - self._canvas.setDash(value,phase) - else: - self._canvas.setDash() - elif key == 'fillColor': - #this has different semantics in PDF to SVG; - #we always have a color, and either do or do - #not apply it; in SVG one can have a 'None' color - if value is None: - self._fill = 0 - else: - self._fill = 1 - self.setFillColor(value) - elif key in ['fontSize', 'fontName']: - # both need setting together in PDF - # one or both might be in the deltas, - # so need to get whichever is missing - fontname = delta.get('fontName', self._canvas._fontname) - fontsize = delta.get('fontSize', self._canvas._fontsize) - self._canvas.setFont(fontname, fontsize) - elif key=='fillOpacity': - if value is not None: - self._canvas.setFillAlpha(value) - elif key=='strokeOpacity': - if value is not None: - self._canvas.setStrokeAlpha(value) - elif key=='fillOverprint': - self._canvas.setFillOverprint(value) - elif key=='strokeOverprint': - self._canvas.setStrokeOverprint(value) - elif key=='overprintMask': - self._canvas.setOverprintMask(value) - -from reportlab.platypus import Flowable -class GraphicsFlowable(Flowable): - """Flowable wrapper around a Pingo drawing""" - def __init__(self, drawing): - self.drawing = drawing - self.width = self.drawing.width - self.height = self.drawing.height - - def draw(self): - draw(self.drawing, self.canv, 0, 0) - -def drawToFile(d, fn, msg="", showBoundary=rl_config._unset_, autoSize=1): - """Makes a one-page PDF with just the drawing. - - If autoSize=1, the PDF will be the same size as - the drawing; if 0, it will place the drawing on - an A4 page with a title above it - possibly overflowing - if too big.""" - d = renderScaledDrawing(d) - c = Canvas(fn) - if msg: - c.setFont(rl_config.defaultGraphicsFontName, 36) - c.drawString(80, 750, msg) - c.setTitle(msg) - - if autoSize: - c.setPageSize((d.width, d.height)) - draw(d, c, 0, 0, showBoundary=showBoundary) - else: - #show with a title - c.setFont(rl_config.defaultGraphicsFontName, 12) - y = 740 - i = 1 - y = y - d.height - draw(d, c, 80, y, showBoundary=showBoundary) - - c.showPage() - c.save() - if sys.platform=='mac' and not hasattr(fn, "write"): - try: - import macfs, macostools - macfs.FSSpec(fn).SetCreatorType("CARO", "PDF ") - macostools.touched(fn) - except: - pass - -def drawToString(d, msg="", showBoundary=rl_config._unset_,autoSize=1): - "Returns a PDF as a string in memory, without touching the disk" - s = getBytesIO() - drawToFile(d, s, msg=msg, showBoundary=showBoundary,autoSize=autoSize) - return s.getvalue() - -######################################################### -# -# test code. First, define a bunch of drawings. -# Routine to draw them comes at the end. -# -######################################################### -def test(outDir='pdfout',shout=False): - from reportlab.graphics.shapes import _baseGFontName, _baseGFontNameBI - from reportlab.rl_config import verbose - import os - if not os.path.isdir(outDir): - os.mkdir(outDir) - fn = os.path.join(outDir,'renderPDF.pdf') - c = Canvas(fn) - c.setFont(_baseGFontName, 36) - c.drawString(80, 750, 'Graphics Test') - - # print all drawings and their doc strings from the test - # file - - #grab all drawings from the test module - from reportlab.graphics import testshapes - drawings = [] - for funcname in dir(testshapes): - if funcname[0:10] == 'getDrawing': - drawing = eval('testshapes.' + funcname + '()') #execute it - docstring = eval('testshapes.' + funcname + '.__doc__') - drawings.append((drawing, docstring)) - - #print in a loop, with their doc strings - c.setFont(_baseGFontName, 12) - y = 740 - i = 1 - for (drawing, docstring) in drawings: - assert (docstring is not None), "Drawing %d has no docstring!" % i - if y < 300: #allows 5-6 lines of text - c.showPage() - y = 740 - # draw a title - y = y - 30 - c.setFont(_baseGFontNameBI,12) - c.drawString(80, y, 'Drawing %d' % i) - c.setFont(_baseGFontName,12) - y = y - 14 - textObj = c.beginText(80, y) - textObj.textLines(docstring) - c.drawText(textObj) - y = textObj.getY() - y = y - drawing.height - draw(drawing, c, 80, y) - i = i + 1 - if y!=740: c.showPage() - - c.save() - if shout or verbose>2: - print('saved %s' % ascii(fn)) - -##def testFlowable(): -## """Makes a platypus document""" -## from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer -## from reportlab.lib.styles import getSampleStyleSheet -## styles = getSampleStyleSheet() -## styNormal = styles['Normal'] -## -## doc = SimpleDocTemplate('test_flowable.pdf') -## story = [] -## story.append(Paragraph("This sees is a drawing can work as a flowable", styNormal)) -## -## import testdrawings -## drawings = [] -## -## for funcname in dir(testdrawings): -## if funcname[0:10] == 'getDrawing': -## drawing = eval('testdrawings.' + funcname + '()') #execute it -## docstring = eval('testdrawings.' + funcname + '.__doc__') -## story.append(Paragraph(docstring, styNormal)) -## story.append(Spacer(18,18)) -## story.append(drawing) -## story.append(Spacer(36,36)) -## -## doc.build(story) -## print 'saves test_flowable.pdf' - -if __name__=='__main__': - test(shout=True) - import sys - if len(sys.argv)>1: - outdir = sys.argv[1] - else: - outdir = 'pdfout' - test(outdir,shout=True) - #testFlowable() diff --git a/reportlab/graphics/renderPM.py b/reportlab/graphics/renderPM.py deleted file mode 100644 index 7de47ab5..00000000 --- a/reportlab/graphics/renderPM.py +++ /dev/null @@ -1,761 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history www.reportlab.co.uk/rl-cgi/viewcvs.cgi/rlextra/graphics/Csrc/renderPM/renderP.py -__version__=''' $Id$ ''' -__doc__="""Render drawing objects in common bitmap formats - -Usage:: - - from reportlab.graphics import renderPM - renderPM.drawToFile(drawing,filename,fmt='GIF',configPIL={....}) - -Other functions let you create a PM drawing as string or into a PM buffer. -Execute the script to see some test drawings.""" - -from reportlab.graphics.shapes import * -from reportlab.graphics.renderbase import StateTracker, getStateDelta, renderScaledDrawing -from reportlab.pdfbase.pdfmetrics import getFont, unicode2T1 -from math import sin, cos, pi, ceil -from reportlab.lib.utils import getStringIO, getBytesIO, open_and_read, isUnicode -from reportlab import rl_config - -class RenderPMError(Exception): - pass - -import os, sys - -try: - from reportlab.graphics import _renderPM -except ImportError as errMsg: - raise ImportError("No module named _renderPM\n" + \ - (str(errMsg)!='No module named _renderPM' and "it may be the wrong version or badly installed!" or - "see https://www.reportlab.com/software/opensource/rl-addons/")) - -def _getImage(): - try: - from PIL import Image - except ImportError: - import Image - return Image - -def Color2Hex(c): - #assert isinstance(colorobj, colors.Color) #these checks don't work well RGB - if c: return ((0xFF&int(255*c.red)) << 16) | ((0xFF&int(255*c.green)) << 8) | (0xFF&int(255*c.blue)) - return c - -# the main entry point for users... -def draw(drawing, canvas, x, y, showBoundary=rl_config._unset_): - """As it says""" - R = _PMRenderer() - R.draw(renderScaledDrawing(drawing), canvas, x, y, showBoundary=showBoundary) - -from reportlab.graphics.renderbase import Renderer -class _PMRenderer(Renderer): - """This draws onto a pix map image. It needs to be a class - rather than a function, as some image-specific state tracking is - needed outside of the state info in the SVG model.""" - - def __init__(self): - self._tracker = StateTracker() - - def pop(self): - self._tracker.pop() - self.applyState() - - def push(self,node): - deltas = getStateDelta(node) - self._tracker.push(deltas) - self.applyState() - - def applyState(self): - s = self._tracker.getState() - self._canvas.ctm = s['ctm'] - self._canvas.strokeWidth = s['strokeWidth'] - alpha = s['strokeOpacity'] - if alpha is not None: - self._canvas.strokeOpacity = alpha - self._canvas.setStrokeColor(s['strokeColor']) - self._canvas.lineCap = s['strokeLineCap'] - self._canvas.lineJoin = s['strokeLineJoin'] - da = s['strokeDashArray'] - if not da: - da = None - else: - if not isinstance(da,(list,tuple)): - da = da, - if len(da)!=2 or not isinstance(da[1],(list,tuple)): - da = 0, da #assume phase of 0 - self._canvas.dashArray = da - alpha = s['fillOpacity'] - if alpha is not None: - self._canvas.fillOpacity = alpha - self._canvas.setFillColor(s['fillColor']) - self._canvas.setFont(s['fontName'], s['fontSize']) - - def initState(self,x,y): - deltas = STATE_DEFAULTS.copy() - deltas['transform'] = self._canvas._baseCTM[0:4]+(x,y) - self._tracker.push(deltas) - self.applyState() - - def drawNode(self, node): - """This is the recursive method called for each node - in the tree""" - - #apply state changes - self.push(node) - - #draw the object, or recurse - self.drawNodeDispatcher(node) - - # restore the state - self.pop() - - def drawRect(self, rect): - c = self._canvas - if rect.rx == rect.ry == 0: - #plain old rectangle, draw clockwise (x-axis to y-axis) direction - c.rect(rect.x,rect.y, rect.width, rect.height) - else: - c.roundRect(rect.x,rect.y, rect.width, rect.height, rect.rx, rect.ry) - - def drawLine(self, line): - self._canvas.line(line.x1,line.y1,line.x2,line.y2) - - def drawImage(self, image): - path = image.path - if isinstance(path,str): - if not (path and os.path.isfile(path)): return - im = _getImage().open(path).convert('RGB') - elif hasattr(path,'convert'): - im = path.convert('RGB') - else: - return - srcW, srcH = im.size - dstW, dstH = image.width, image.height - if dstW is None: dstW = srcW - if dstH is None: dstH = srcH - self._canvas._aapixbuf( - image.x, image.y, dstW, dstH, - (im.tobytes if hasattr(im,'tobytes') else im.tostring)(), srcW, srcH, 3, - ) - - def drawCircle(self, circle): - c = self._canvas - c.circle(circle.cx,circle.cy, circle.r) - c.fillstrokepath() - - def drawPolyLine(self, polyline, _doClose=0): - P = polyline.points - assert len(P) >= 2, 'Polyline must have 1 or more points' - c = self._canvas - c.pathBegin() - c.moveTo(P[0], P[1]) - for i in range(2, len(P), 2): - c.lineTo(P[i], P[i+1]) - if _doClose: - c.pathClose() - c.pathFill() - c.pathStroke() - - def drawEllipse(self, ellipse): - c=self._canvas - c.ellipse(ellipse.cx, ellipse.cy, ellipse.rx,ellipse.ry) - c.fillstrokepath() - - def drawPolygon(self, polygon): - self.drawPolyLine(polygon,_doClose=1) - - def drawString(self, stringObj): - canv = self._canvas - fill = canv.fillColor - if fill is not None: - S = self._tracker.getState() - text_anchor = S['textAnchor'] - fontName = S['fontName'] - fontSize = S['fontSize'] - text = stringObj.text - x = stringObj.x - y = stringObj.y - if not text_anchor in ['start','inherited']: - textLen = stringWidth(text, fontName,fontSize) - if text_anchor=='end': - x -= textLen - elif text_anchor=='middle': - x -= textLen/2 - elif text_anchor=='numeric': - x -= numericXShift(text_anchor,text,textLen,fontName,fontSize,stringObj.encoding) - else: - raise ValueError('bad value for textAnchor '+str(text_anchor)) - canv.drawString(x,y,text,_fontInfo=(fontName,fontSize)) - - def drawPath(self, path): - c = self._canvas - if path is EmptyClipPath: - del c._clipPaths[-1] - if c._clipPaths: - P = c._clipPaths[-1] - icp = P.isClipPath - P.isClipPath = 1 - self.drawPath(P) - P.isClipPath = icp - else: - c.clipPathClear() - return - c.pathBegin() - drawFuncs = (c.moveTo, c.lineTo, c.curveTo, c.pathClose) - from reportlab.graphics.shapes import _renderPath - isClosed = _renderPath(path, drawFuncs) - if path.isClipPath: - c.clipPathSet() - c._clipPaths.append(path) - else: - if isClosed: c.pathFill() - c.pathStroke() - -def _setFont(gs,fontName,fontSize): - try: - gs.setFont(fontName,fontSize) - except ValueError as e: - if not e.args[0].endswith("Can't find font!"): raise - #here's where we try to add a font to the canvas - try: - f = getFont(fontName) - _renderPM.makeT1Font(fontName,f.face.findT1File(),f.encoding.vector,open_and_read) - except: - s1, s2 = list(map(str,sys.exc_info()[:2])) - raise RenderPMError("Can't setFont(%s) missing the T1 files?\nOriginally %s: %s" % (fontName,s1,s2)) - gs.setFont(fontName,fontSize) - -def _convert2pilp(im): - Image = _getImage() - return im.convert("P", dither=Image.NONE, palette=Image.ADAPTIVE) - -def _convert2pilL(im): - return im.convert("L") - -def _convert2pil1(im): - return im.convert("1") - -def _saveAsPICT(im,fn,fmt,transparent=None): - im = _convert2pilp(im) - cols, rows = im.size - #s = _renderPM.pil2pict(cols,rows,im.tostring(),im.im.getpalette(),transparent is not None and Color2Hex(transparent) or -1) - s = _renderPM.pil2pict(cols,rows,(im.tobytes if hasattr(im,'tobytes') else im.tostring)(),im.im.getpalette()) - if not hasattr(fn,'write'): - open(os.path.splitext(fn)[0]+'.'+fmt.lower(),'wb').write(s) - if os.name=='mac': - from reportlab.lib.utils import markfilename - markfilename(fn,ext='PICT') - else: - fn.write(s) - -BEZIER_ARC_MAGIC = 0.5522847498 #constant for drawing circular arcs w/ Beziers -class PMCanvas: - def __init__(self,w,h,dpi=72,bg=0xffffff,configPIL=None): - '''configPIL dict is passed to image save method''' - scale = dpi/72.0 - w = int(w*scale+0.5) - h = int(h*scale+0.5) - self.__dict__['_gs'] = _renderPM.gstate(w,h,bg=bg) - self.__dict__['_bg'] = bg - self.__dict__['_baseCTM'] = (scale,0,0,scale,0,0) - self.__dict__['_clipPaths'] = [] - self.__dict__['configPIL'] = configPIL - self.__dict__['_dpi'] = dpi - self.ctm = self._baseCTM - - def _drawTimeResize(self,w,h,bg=None): - if bg is None: bg = self._bg - self._drawing.width, self._drawing.height = w, h - A = {'ctm':None, 'strokeWidth':None, 'strokeColor':None, 'lineCap':None, 'lineJoin':None, 'dashArray':None, 'fillColor':None} - gs = self._gs - fN,fS = gs.fontName, gs.fontSize - for k in A.keys(): - A[k] = getattr(gs,k) - del gs, self._gs - gs = self.__dict__['_gs'] = _renderPM.gstate(w,h,bg=bg) - for k in A.keys(): - setattr(self,k,A[k]) - gs.setFont(fN,fS) - - def toPIL(self): - im = _getImage().new('RGB', size=(self._gs.width, self._gs.height)) - getattr(im,'frombytes',getattr(im,'fromstring'))(self._gs.pixBuf) - return im - - def saveToFile(self,fn,fmt=None): - im = self.toPIL() - if fmt is None: - if not isinstance(fn,str): - raise ValueError("Invalid value '%s' for fn when fmt is None" % ascii(fn)) - fmt = os.path.splitext(fn)[1] - if fmt.startswith('.'): fmt = fmt[1:] - configPIL = self.configPIL or {} - configPIL.setdefault('preConvertCB',None) - preConvertCB=configPIL.pop('preConvertCB') - if preConvertCB: - im = preConvertCB(im) - fmt = fmt.upper() - if fmt in ('GIF',): - im = _convert2pilp(im) - elif fmt in ('TIFF','TIFFP','TIFFL','TIF','TIFF1'): - if fmt.endswith('P'): - im = _convert2pilp(im) - elif fmt.endswith('L'): - im = _convert2pilL(im) - elif fmt.endswith('1'): - im = _convert2pil1(im) - fmt='TIFF' - elif fmt in ('PCT','PICT'): - return _saveAsPICT(im,fn,fmt,transparent=configPIL.get('transparent',None)) - elif fmt in ('PNG','BMP', 'PPM'): - if fmt=='PNG': - try: - from PIL import PngImagePlugin - except ImportError: - import PngImagePlugin - elif fmt=='BMP': - try: - from PIL import BmpImagePlugin - except ImportError: - import BmpImagePlugin - elif fmt in ('JPG','JPEG'): - fmt = 'JPEG' - elif fmt in ('GIF',): - pass - else: - raise RenderPMError("Unknown image kind %s" % fmt) - if fmt=='TIFF': - tc = configPIL.get('transparent',None) - if tc: - from PIL import ImageChops, Image - T = 768*[0] - for o, c in zip((0,256,512), tc.bitmap_rgb()): - T[o+c] = 255 - #if isinstance(fn,str): ImageChops.invert(im.point(T).convert('L').point(255*[0]+[255])).save(fn+'_mask.gif','GIF') - im = Image.merge('RGBA', im.split()+(ImageChops.invert(im.point(T).convert('L').point(255*[0]+[255])),)) - #if isinstance(fn,str): im.save(fn+'_masked.gif','GIF') - for a,d in ('resolution',self._dpi),('resolution unit','inch'): - configPIL[a] = configPIL.get(a,d) - configPIL.setdefault('chops_invert',0) - if configPIL.pop('chops_invert'): - from PIL import ImageChops - im = ImageChops.invert(im) - configPIL.setdefault('preSaveCB',None) - preSaveCB=configPIL.pop('preSaveCB') - if preSaveCB: - im = preSaveCB(im) - im.save(fn,fmt,**configPIL) - if not hasattr(fn,'write') and os.name=='mac': - from reportlab.lib.utils import markfilename - markfilename(fn,ext=fmt) - - def saveToString(self,fmt='GIF'): - s = getBytesIO() - self.saveToFile(s,fmt=fmt) - return s.getvalue() - - def _saveToBMP(self,f): - ''' - Niki Spahiev, , asserts that this is a respectable way to get BMP without PIL - f is a file like object to which the BMP is written - ''' - import struct - gs = self._gs - pix, width, height = gs.pixBuf, gs.width, gs.height - f.write(struct.pack('=2sLLLLLLhh24x','BM',len(pix)+54,0,54,40,width,height,1,24)) - rowb = width * 3 - for o in range(len(pix),0,-rowb): - f.write(pix[o-rowb:o]) - f.write( '\0' * 14 ) - - def setFont(self,fontName,fontSize,leading=None): - _setFont(self._gs,fontName,fontSize) - - def __setattr__(self,name,value): - setattr(self._gs,name,value) - - def __getattr__(self,name): - return getattr(self._gs,name) - - def fillstrokepath(self,stroke=1,fill=1): - if fill: self.pathFill() - if stroke: self.pathStroke() - - def _bezierArcSegmentCCW(self, cx,cy, rx,ry, theta0, theta1): - """compute the control points for a bezier arc with theta1-theta0 <= 90. - Points are computed for an arc with angle theta increasing in the - counter-clockwise (CCW) direction. returns a tuple with starting point - and 3 control points of a cubic bezier curve for the curvto opertator""" - - # Requires theta1 - theta0 <= 90 for a good approximation - assert abs(theta1 - theta0) <= 90 - cos0 = cos(pi*theta0/180.0) - sin0 = sin(pi*theta0/180.0) - x0 = cx + rx*cos0 - y0 = cy + ry*sin0 - - cos1 = cos(pi*theta1/180.0) - sin1 = sin(pi*theta1/180.0) - - x3 = cx + rx*cos1 - y3 = cy + ry*sin1 - - dx1 = -rx * sin0 - dy1 = ry * cos0 - - #from pdfgeom - halfAng = pi*(theta1-theta0)/(2.0 * 180.0) - k = abs(4.0 / 3.0 * (1.0 - cos(halfAng) ) /(sin(halfAng)) ) - x1 = x0 + dx1 * k - y1 = y0 + dy1 * k - - dx2 = -rx * sin1 - dy2 = ry * cos1 - - x2 = x3 - dx2 * k - y2 = y3 - dy2 * k - return ((x0,y0), ((x1,y1), (x2,y2), (x3,y3)) ) - - def bezierArcCCW(self, cx,cy, rx,ry, theta0, theta1): - """return a set of control points for Bezier approximation to an arc - with angle increasing counter clockwise. No requirement on (theta1-theta0) <= 90 - However, it must be true that theta1-theta0 > 0.""" - - # I believe this is also clockwise - # pretty much just like Robert Kern's pdfgeom.BezierArc - angularExtent = theta1 - theta0 - # break down the arc into fragments of <=90 degrees - if abs(angularExtent) <= 90.0: # we just need one fragment - angleList = [(theta0,theta1)] - else: - Nfrag = int( ceil( abs(angularExtent)/90.) ) - fragAngle = float(angularExtent)/ Nfrag # this could be negative - angleList = [] - for ii in range(Nfrag): - a = theta0 + ii * fragAngle - b = a + fragAngle # hmm.. is I wonder if this is precise enought - angleList.append((a,b)) - - ctrlpts = [] - for (a,b) in angleList: - if not ctrlpts: # first time - [(x0,y0), pts] = self._bezierArcSegmentCCW(cx,cy, rx,ry, a,b) - ctrlpts.append(pts) - else: - [(tmpx,tmpy), pts] = self._bezierArcSegmentCCW(cx,cy, rx,ry, a,b) - ctrlpts.append(pts) - return ((x0,y0), ctrlpts) - - def addEllipsoidalArc(self, cx,cy, rx, ry, ang1, ang2): - """adds an ellisesoidal arc segment to a path, with an ellipse centered - on cx,cy and with radii (major & minor axes) rx and ry. The arc is - drawn in the CCW direction. Requires: (ang2-ang1) > 0""" - - ((x0,y0), ctrlpts) = self.bezierArcCCW(cx,cy, rx,ry,ang1,ang2) - - self.lineTo(x0,y0) - for ((x1,y1), (x2,y2),(x3,y3)) in ctrlpts: - self.curveTo(x1,y1,x2,y2,x3,y3) - - def drawCentredString(self, x, y, text, text_anchor='middle'): - if self.fillColor is not None: - textLen = stringWidth(text, self.fontName,self.fontSize) - if text_anchor=='end': - x -= textLen - elif text_anchor=='middle': - x -= textLen/2. - elif text_anchor=='numeric': - x -= numericXShift(text_anchor,text,textLen,self.fontName,self.fontSize) - self.drawString(x,y,text) - - def drawRightString(self, text, x, y): - self.drawCentredString(text,x,y,text_anchor='end') - - def drawString(self, x, y, text, _fontInfo=None): - gs = self._gs - if _fontInfo: - fontName, fontSize = _fontInfo - else: - fontSize = gs.fontSize - fontName = gs.fontName - try: - gfont=getFont(gs.fontName) - except: - gfont = None - font = getFont(fontName) - if font._dynamicFont: - gs.drawString(x,y,text) - else: - fc = font - if not isUnicode(text): - try: - text = text.decode('utf8') - except UnicodeDecodeError as e: - i,j = e.args[2:4] - raise UnicodeDecodeError(*(e.args[:4]+('%s\n%s-->%s<--%s' % (e.args[4],text[i-10:i],text[i:j],text[j:j+10]),))) - - FT = unicode2T1(text,[font]+font.substitutionFonts) - n = len(FT) - nm1 = n-1 - for i in range(n): - f, t = FT[i] - if f!=fc: - _setFont(gs,f.fontName,fontSize) - fc = f - gs.drawString(x,y,t) - if i!=nm1: - x += f.stringWidth(t.decode(f.encName),fontSize) - if font!=fc: - _setFont(gs,fontName,fontSize) - - def line(self,x1,y1,x2,y2): - if self.strokeColor is not None: - self.pathBegin() - self.moveTo(x1,y1) - self.lineTo(x2,y2) - self.pathStroke() - - def rect(self,x,y,width,height,stroke=1,fill=1): - self.pathBegin() - self.moveTo(x, y) - self.lineTo(x+width, y) - self.lineTo(x+width, y + height) - self.lineTo(x, y + height) - self.pathClose() - self.fillstrokepath(stroke=stroke,fill=fill) - - def roundRect(self, x, y, width, height, rx,ry): - """rect(self, x, y, width, height, rx,ry): - Draw a rectangle if rx or rx and ry are specified the corners are - rounded with ellipsoidal arcs determined by rx and ry - (drawn in the counter-clockwise direction)""" - if rx==0: rx = ry - if ry==0: ry = rx - x2 = x + width - y2 = y + height - self.pathBegin() - self.moveTo(x+rx,y) - self.addEllipsoidalArc(x2-rx, y+ry, rx, ry, 270, 360 ) - self.addEllipsoidalArc(x2-rx, y2-ry, rx, ry, 0, 90) - self.addEllipsoidalArc(x+rx, y2-ry, rx, ry, 90, 180) - self.addEllipsoidalArc(x+rx, y+ry, rx, ry, 180, 270) - self.pathClose() - self.fillstrokepath() - - def circle(self, cx, cy, r): - "add closed path circle with center cx,cy and axes r: counter-clockwise orientation" - self.ellipse(cx,cy,r,r) - - def ellipse(self, cx,cy,rx,ry): - """add closed path ellipse with center cx,cy and axes rx,ry: counter-clockwise orientation - (remember y-axis increases downward) """ - self.pathBegin() - # first segment - x0 = cx + rx # (x0,y0) start pt - y0 = cy - - x3 = cx # (x3,y3) end pt of arc - y3 = cy-ry - - x1 = cx+rx - y1 = cy-ry*BEZIER_ARC_MAGIC - - x2 = x3 + rx*BEZIER_ARC_MAGIC - y2 = y3 - self.moveTo(x0, y0) - self.curveTo(x1,y1,x2,y2,x3,y3) - # next segment - x0 = x3 - y0 = y3 - - x3 = cx-rx - y3 = cy - - x1 = cx-rx*BEZIER_ARC_MAGIC - y1 = cy-ry - - x2 = x3 - y2 = cy- ry*BEZIER_ARC_MAGIC - self.curveTo(x1,y1,x2,y2,x3,y3) - # next segment - x0 = x3 - y0 = y3 - - x3 = cx - y3 = cy+ry - - x1 = cx-rx - y1 = cy+ry*BEZIER_ARC_MAGIC - - x2 = cx -rx*BEZIER_ARC_MAGIC - y2 = cy+ry - self.curveTo(x1,y1,x2,y2,x3,y3) - #last segment - x0 = x3 - y0 = y3 - - x3 = cx+rx - y3 = cy - - x1 = cx+rx*BEZIER_ARC_MAGIC - y1 = cy+ry - - x2 = cx+rx - y2 = cy+ry*BEZIER_ARC_MAGIC - self.curveTo(x1,y1,x2,y2,x3,y3) - self.pathClose() - - def saveState(self): - '''do nothing for compatibility''' - pass - - def setFillColor(self,aColor): - self.fillColor = Color2Hex(aColor) - alpha = getattr(aColor,'alpha',None) - if alpha is not None: - self.fillOpacity = alpha - - def setStrokeColor(self,aColor): - self.strokeColor = Color2Hex(aColor) - alpha = getattr(aColor,'alpha',None) - if alpha is not None: - self.strokeOpacity = alpha - - restoreState = saveState - - # compatibility routines - def setLineCap(self,cap): - self.lineCap = cap - - def setLineJoin(self,join): - self.lineJoin = join - - def setLineWidth(self,width): - self.strokeWidth = width - -def drawToPMCanvas(d, dpi=72, bg=0xffffff, configPIL=None, showBoundary=rl_config._unset_): - d = renderScaledDrawing(d) - c = PMCanvas(d.width, d.height, dpi=dpi, bg=bg, configPIL=configPIL) - draw(d, c, 0, 0, showBoundary=showBoundary) - return c - -def drawToPIL(d, dpi=72, bg=0xffffff, configPIL=None, showBoundary=rl_config._unset_): - return drawToPMCanvas(d, dpi=dpi, bg=bg, configPIL=configPIL, showBoundary=showBoundary).toPIL() - -def drawToPILP(d, dpi=72, bg=0xffffff, configPIL=None, showBoundary=rl_config._unset_): - Image = _getImage() - im = drawToPIL(d, dpi=dpi, bg=bg, configPIL=configPIL, showBoundary=showBoundary) - return im.convert("P", dither=Image.NONE, palette=Image.ADAPTIVE) - -def drawToFile(d,fn,fmt='GIF', dpi=72, bg=0xffffff, configPIL=None, showBoundary=rl_config._unset_): - '''create a pixmap and draw drawing, d to it then save as a file - configPIL dict is passed to image save method''' - c = drawToPMCanvas(d, dpi=dpi, bg=bg, configPIL=configPIL, showBoundary=showBoundary) - c.saveToFile(fn,fmt) - -def drawToString(d,fmt='GIF', dpi=72, bg=0xffffff, configPIL=None, showBoundary=rl_config._unset_): - s = getBytesIO() - drawToFile(d,s,fmt=fmt, dpi=dpi, bg=bg, configPIL=configPIL) - return s.getvalue() - -save = drawToFile - -def test(outDir='pmout', shout=False): - def ext(x): - if x=='tiff': x='tif' - return x - #grab all drawings from the test module and write out. - #make a page of links in HTML to assist viewing. - import os - from reportlab.graphics import testshapes - from reportlab.rl_config import verbose - getAllTestDrawings = testshapes.getAllTestDrawings - drawings = [] - if not os.path.isdir(outDir): - os.mkdir(outDir) - htmlTop = """renderPM output results - -

renderPM results of output

- """ - htmlBottom = """ - - """ - html = [htmlTop] - names = {} - argv = sys.argv[1:] - E = [a for a in argv if a.startswith('--ext=')] - if not E: - E = ['gif','tiff', 'png', 'jpg', 'pct', 'py', 'svg'] - else: - for a in E: - argv.remove(a) - E = (','.join([a[6:] for a in E])).split(',') - - errs = [] - import traceback - from xml.sax.saxutils import escape - def handleError(name,fmt): - msg = 'Problem drawing %s fmt=%s file'%(name,fmt) - if shout or verbose>2: print(msg) - errs.append('

%s

' % msg) - buf = getStringIO() - traceback.print_exc(file=buf) - errs.append('
%s
' % escape(buf.getvalue())) - - #print in a loop, with their doc strings - for (drawing, docstring, name) in getAllTestDrawings(doTTF=hasattr(_renderPM,'ft_get_face')): - i = names[name] = names.setdefault(name,0)+1 - if i>1: name += '.%02d' % (i-1) - if argv and name not in argv: continue - fnRoot = name - w = int(drawing.width) - h = int(drawing.height) - html.append('

Drawing %s

\n
%s
' % (name, docstring)) - - for k in E: - if k in ['gif','png','jpg','pct']: - html.append('

%s format

\n' % k.upper()) - try: - filename = '%s.%s' % (fnRoot, ext(k)) - fullpath = os.path.join(outDir, filename) - if os.path.isfile(fullpath): - os.remove(fullpath) - if k=='pct': - from reportlab.lib.colors import white - drawToFile(drawing,fullpath,fmt=k,configPIL={'transparent':white}) - elif k in ['py','svg']: - drawing.save(formats=['py','svg'],outDir=outDir,fnRoot=fnRoot) - else: - drawToFile(drawing,fullpath,fmt=k) - if k in ['gif','png','jpg']: - html.append('
\n' % filename) - elif k=='py': - html.append('python source
\n' % filename) - elif k=='svg': - html.append('SVG
\n' % filename) - if shout or verbose>2: print('wrote %s'%ascii(fullpath)) - except AttributeError: - handleError(name,k) - if os.environ.get('RL_NOEPSPREVIEW','0')=='1': drawing.__dict__['preview'] = 0 - for k in ('eps', 'pdf'): - try: - drawing.save(formats=[k],outDir=outDir,fnRoot=fnRoot) - except: - handleError(name,k) - - if errs: - html[0] = html[0].replace('',' (errors)') - html.append('') - html.extend(errs) - html.append(htmlBottom) - htmlFileName = os.path.join(outDir, 'pm-index.html') - open(htmlFileName, 'w').writelines(html) - if sys.platform=='mac': - from reportlab.lib.utils import markfilename - markfilename(htmlFileName,ext='HTML') - if shout or verbose>2: print('wrote %s' % htmlFileName) - -if __name__=='__main__': - test(shout=True) diff --git a/reportlab/graphics/renderPS.py b/reportlab/graphics/renderPS.py deleted file mode 100644 index 72d5b260..00000000 --- a/reportlab/graphics/renderPS.py +++ /dev/null @@ -1,930 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/renderPS.py -__version__=''' $Id$ ''' -__doc__="""Render drawing objects in Postscript""" - -from reportlab.pdfbase.pdfmetrics import getFont, stringWidth, unicode2T1 # for font info -from reportlab.lib.utils import getBytesIO, getStringIO, asBytes, char2int, rawBytes, asNative, isUnicode -from reportlab.lib.rl_accel import fp_str -from reportlab.lib.colors import black -from reportlab.graphics.renderbase import Renderer, StateTracker, getStateDelta, renderScaledDrawing -from reportlab.graphics.shapes import STATE_DEFAULTS -import math -from operator import getitem -from reportlab import rl_config -_ESCAPEDICT={} -for c in xrange(256): - if c<32 or c>=127: - _ESCAPEDICT[c]= '\\%03o' % c - elif c in (ord('\\'),ord('('),ord(')')): - _ESCAPEDICT[c] = '\\'+chr(c) - else: - _ESCAPEDICT[c] = chr(c) -del c - -def _escape_and_limit(s): - s = asBytes(s) - R = [] - aR = R.append - n = 0 - for c in s: - c = _ESCAPEDICT[char2int(c)] - aR(c) - n += len(c) - if n>=200: - n = 0 - aR('\\\n') - return ''.join(R) - -# we need to create encoding vectors for each font we use, or they will - # come out in Adobe's old StandardEncoding, which NOBODY uses. -PS_WinAnsiEncoding=""" -/RE { %def - findfont begin - currentdict dup length dict begin - { %forall - 1 index /FID ne { def } { pop pop } ifelse - } forall - /FontName exch def dup length 0 ne { %if - /Encoding Encoding 256 array copy def - 0 exch { %forall - dup type /nametype eq { %ifelse - Encoding 2 index 2 index put - pop 1 add - }{ %else - exch pop - } ifelse - } forall - } if pop - currentdict dup end end - /FontName get exch definefont pop -} bind def - -/WinAnsiEncoding [ - 39/quotesingle 96/grave 128/euro 130/quotesinglbase/florin/quotedblbase - /ellipsis/dagger/daggerdbl/circumflex/perthousand - /Scaron/guilsinglleft/OE 145/quoteleft/quoteright - /quotedblleft/quotedblright/bullet/endash/emdash - /tilde/trademark/scaron/guilsinglright/oe/dotlessi - 159/Ydieresis 164/currency 166/brokenbar 168/dieresis/copyright - /ordfeminine 172/logicalnot 174/registered/macron/ring - 177/plusminus/twosuperior/threesuperior/acute/mu - 183/periodcentered/cedilla/onesuperior/ordmasculine - 188/onequarter/onehalf/threequarters 192/Agrave/Aacute - /Acircumflex/Atilde/Adieresis/Aring/AE/Ccedilla - /Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute - /Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute - /Ocircumflex/Otilde/Odieresis/multiply/Oslash - /Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn - /germandbls/agrave/aacute/acircumflex/atilde/adieresis - /aring/ae/ccedilla/egrave/eacute/ecircumflex - /edieresis/igrave/iacute/icircumflex/idieresis - /eth/ntilde/ograve/oacute/ocircumflex/otilde - /odieresis/divide/oslash/ugrave/uacute/ucircumflex - /udieresis/yacute/thorn/ydieresis -] def -""" - -class PSCanvas: - def __init__(self,size=(300,300), PostScriptLevel=2): - self.width, self.height = size - xtraState = [] - self._xtraState_push = xtraState.append - self._xtraState_pop = xtraState.pop - self.comments = 0 - self.code = [] - self.code_append = self.code.append - self._sep = '\n' - self._strokeColor = self._fillColor = self._lineWidth = \ - self._font = self._fontSize = self._lineCap = \ - self._lineJoin = self._color = None - - self._fontsUsed = [] # track them as we go - self.setFont(STATE_DEFAULTS['fontName'],STATE_DEFAULTS['fontSize']) - self.setStrokeColor(STATE_DEFAULTS['strokeColor']) - self.setLineCap(2) - self.setLineJoin(0) - self.setLineWidth(1) - self.PostScriptLevel=PostScriptLevel - - def comment(self,msg): - if self.comments: self.code_append('%'+msg) - - def drawImage(self, image, x1,y1, x2=None,y2=None): # Postscript Level2 version - # select between postscript level 1 or level 2 - if self.PostScriptLevel==1: - self._drawImageLevel1(image, x1,y1, x2=None,y2=None) - elif self.PostScriptLevel==2: - self._drawImageLevel2(image, x1,y1, x2=None,y2=None) - else : - raise ValueError('Unsupported Postscript Level %s' % self.PostScriptLevel) - - def clear(self): - self.code_append('showpage') # ugh, this makes no sense oh well. - - def _t1_re_encode(self): - if not self._fontsUsed: return - # for each font used, reencode the vectors - C = [] - for fontName in self._fontsUsed: - fontObj = getFont(fontName) - if not fontObj._dynamicFont and fontObj.encName=='WinAnsiEncoding': - C.append('WinAnsiEncoding /%s /%s RE' % (fontName, fontName)) - if C: - C.insert(0,PS_WinAnsiEncoding) - self.code.insert(1, self._sep.join(C)) - - def save(self,f=None): - if not hasattr(f,'write'): - _f = open(f,'wb') - else: - _f = f - if self.code[-1]!='showpage': self.clear() - self.code.insert(0,'''\ -%%!PS-Adobe-3.0 EPSF-3.0 -%%%%BoundingBox: 0 0 %d %d -%%%% Initialization: -/m {moveto} bind def -/l {lineto} bind def -/c {curveto} bind def -''' % (self.width,self.height)) - - self._t1_re_encode() - _f.write(rawBytes(self._sep.join(self.code))) - if _f is not f: - _f.close() - from reportlab.lib.utils import markfilename - markfilename(f,creatorcode='XPR3',filetype='EPSF') - - def saveState(self): - self._xtraState_push((self._fontCodeLoc,)) - self.code_append('gsave') - - def restoreState(self): - self.code_append('grestore') - self._fontCodeLoc, = self._xtraState_pop() - - def stringWidth(self, s, font=None, fontSize=None): - """Return the logical width of the string if it were drawn - in the current font (defaults to self.font).""" - font = font or self._font - fontSize = fontSize or self._fontSize - return stringWidth(s, font, fontSize) - - def setLineCap(self,v): - if self._lineCap!=v: - self._lineCap = v - self.code_append('%d setlinecap'%v) - - def setLineJoin(self,v): - if self._lineJoin!=v: - self._lineJoin = v - self.code_append('%d setlinejoin'%v) - - def setDash(self, array=[], phase=0): - """Two notations. pass two numbers, or an array and phase""" - # copied and modified from reportlab.canvas - psoperation = "setdash" - if isinstance(array,(float,int)): - self.code_append('[%s %s] 0 %s' % (array, phase, psoperation)) - elif isinstance(array,(tuple,list)): - assert phase >= 0, "phase is a length in user space" - textarray = ' '.join(map(str, array)) - self.code_append('[%s] %s %s' % (textarray, phase, psoperation)) - - def setStrokeColor(self, color): - self._strokeColor = color - self.setColor(color) - - def setColor(self, color): - if self._color!=color: - self._color = color - if color: - if hasattr(color, "cyan"): - self.code_append('%s setcmykcolor' % fp_str(color.cyan, color.magenta, color.yellow, color.black)) - else: - self.code_append('%s setrgbcolor' % fp_str(color.red, color.green, color.blue)) - - def setFillColor(self, color): - self._fillColor = color - self.setColor(color) - - def setLineWidth(self, width): - if width != self._lineWidth: - self._lineWidth = width - self.code_append('%s setlinewidth' % width) - - def setFont(self,font,fontSize,leading=None): - if self._font!=font or self._fontSize!=fontSize: - self._fontCodeLoc = len(self.code) - self._font = font - self._fontSize = fontSize - self.code_append('') - - def line(self, x1, y1, x2, y2): - if self._strokeColor != None: - self.setColor(self._strokeColor) - self.code_append('%s m %s l stroke' % (fp_str(x1, y1), fp_str(x2, y2))) - - def _escape(self, s): - ''' - return a copy of string s with special characters in postscript strings - escaped with backslashes. - ''' - try: - return _escape_and_limit(s) - except: - raise ValueError("cannot escape %s" % ascii(s)) - - def _issueT1String(self,fontObj,x,y,s): - fc = fontObj - code_append = self.code_append - fontSize = self._fontSize - fontsUsed = self._fontsUsed - escape = self._escape - if not isUnicode(s): - try: - s = s.decode('utf8') - except UnicodeDecodeError as e: - i,j = e.args[2:4] - raise UnicodeDecodeError(*(e.args[:4]+('%s\n%s-->%s<--%s' % (e.args[4],s[i-10:i],s[i:j],s[j:j+10]),))) - - for f, t in unicode2T1(s,[fontObj]+fontObj.substitutionFonts): - if f!=fc: - psName = asNative(f.face.name) - code_append('(%s) findfont %s scalefont setfont' % (psName,fp_str(fontSize))) - if psName not in fontsUsed: - fontsUsed.append(psName) - fc = f - code_append('%s m (%s) show ' % (fp_str(x,y),escape(t))) - x += f.stringWidth(t.decode(f.encName),fontSize) - if fontObj!=fc: - self._font = None - self.setFont(fontObj.face.name,fontSize) - - def drawString(self, x, y, s, angle=0): - if self._fillColor != None: - fontObj = getFont(self._font) - if not self.code[self._fontCodeLoc]: - psName = asNative(fontObj.face.name) - self.code[self._fontCodeLoc]='(%s) findfont %s scalefont setfont' % (psName,fp_str(self._fontSize)) - if psName not in self._fontsUsed: - self._fontsUsed.append(psName) - self.setColor(self._fillColor) - if angle!=0: - self.code_append('gsave %s translate %s rotate' % (fp_str(x,y),fp_str(angle))) - x = y = 0 - if fontObj._dynamicFont: - s = self._escape(s) - self.code_append('%s m (%s) show ' % (fp_str(x,y),s)) - else: - self._issueT1String(fontObj,x,y,s) - if angle!=0: - self.code_append('grestore') - - def drawCentredString(self, x, y, text, text_anchor='middle'): - if self._fillColor is not None: - textLen = stringWidth(text, self._font,self._fontSize) - if text_anchor=='end': - x -= textLen - elif text_anchor=='middle': - x -= textLen/2. - elif text_anchor=='numeric': - x -= numericXShift(text_anchor,text,textLen,self._font,self._fontSize) - self.drawString(x,y,text) - - def drawRightString(self, text, x, y): - self.drawCentredString(text,x,y,text_anchor='end') - - def drawCurve(self, x1, y1, x2, y2, x3, y3, x4, y4, closed=0): - codeline = '%s m %s curveto' - data = (fp_str(x1, y1), fp_str(x2, y2, x3, y3, x4, y4)) - if self._fillColor != None: - self.setColor(self._fillColor) - self.code_append((codeline % data) + ' eofill') - if self._strokeColor != None: - self.setColor(self._strokeColor) - self.code_append((codeline % data) - + ((closed and ' closepath') or '') - + ' stroke') - - ######################################################################################## - - def rect(self, x1,y1, x2,y2, stroke=1, fill=1): - "Draw a rectangle between x1,y1, and x2,y2" - # Path is drawn in counter-clockwise direction" - - x1, x2 = min(x1,x2), max(x1, x2) # from piddle.py - y1, y2 = min(y1,y2), max(y1, y2) - self.polygon(((x1,y1),(x2,y1),(x2,y2),(x1,y2)), closed=1, stroke=stroke, fill = fill) - - def roundRect(self, x1,y1, x2,y2, rx=8, ry=8): - """Draw a rounded rectangle between x1,y1, and x2,y2, - with corners inset as ellipses with x radius rx and y radius ry. - These should have x10, and ry>0.""" - # Path is drawn in counter-clockwise direction - - x1, x2 = min(x1,x2), max(x1, x2) # from piddle.py - y1, y2 = min(y1,y2), max(y1, y2) - - # Note: arcto command draws a line from current point to beginning of arc - # save current matrix, translate to center of ellipse, scale by rx ry, and draw - # a circle of unit radius in counterclockwise dir, return to original matrix - # arguments are (cx, cy, rx, ry, startAngle, endAngle) - ellipsePath = 'matrix currentmatrix %s %s translate %s %s scale 0 0 1 %s %s arc setmatrix' - - # choice between newpath and moveTo beginning of arc - # go with newpath for precision, does this violate any assumptions in code??? - rr = ['newpath'] # Round Rect code path - a = rr.append - # upper left corner ellipse is first - a(ellipsePath % (x1+rx, y1+ry, rx, -ry, 90, 180)) - a(ellipsePath % (x1+rx, y2-ry, rx, -ry, 180, 270)) - a(ellipsePath % (x2-rx, y2-ry, rx, -ry, 270, 360)) - a(ellipsePath % (x2-rx, y1+ry, rx, -ry, 0, 90) ) - a('closepath') - - self._fillAndStroke(rr) - - def ellipse(self, x1,y1, x2,y2): - """Draw an orthogonal ellipse inscribed within the rectangle x1,y1,x2,y2. - These should have x1= 0: - arc='arc' - else: - arc='arcn' - data = (x,y, xScale, yScale, startAng, startAng+extent, arc) - - return codeline % data - - def polygon(self, p, closed=0, stroke=1, fill=1): - assert len(p) >= 2, 'Polygon must have 2 or more points' - - start = p[0] - p = p[1:] - - poly = [] - a = poly.append - a("%s m" % fp_str(start)) - for point in p: - a("%s l" % fp_str(point)) - if closed: - a("closepath") - - self._fillAndStroke(poly,stroke=stroke,fill=fill) - - def lines(self, lineList, color=None, width=None): - if self._strokeColor != None: - self._setColor(self._strokeColor) - codeline = '%s m %s l stroke' - for line in lineList: - self.code_append(codeline % (fp_str(line[0]),fp_str(line[1]))) - - def moveTo(self,x,y): - self.code_append('%s m' % fp_str(x, y)) - - def lineTo(self,x,y): - self.code_append('%s l' % fp_str(x, y)) - - def curveTo(self,x1,y1,x2,y2,x3,y3): - self.code_append('%s c' % fp_str(x1,y1,x2,y2,x3,y3)) - - def closePath(self): - self.code_append('closepath') - - def polyLine(self, p): - assert len(p) >= 1, 'Polyline must have 1 or more points' - if self._strokeColor != None: - self.setColor(self._strokeColor) - self.moveTo(p[0][0], p[0][1]) - for t in p[1:]: - self.lineTo(t[0], t[1]) - self.code_append('stroke') - - def drawFigure(self, partList, closed=0): - figureCode = [] - a = figureCode.append - first = 1 - - for part in partList: - op = part[0] - args = list(part[1:]) - - if op == figureLine: - if first: - first = 0 - a("%s m" % fp_str(args[:2])) - else: - a("%s l" % fp_str(args[:2])) - a("%s l" % fp_str(args[2:])) - - elif op == figureArc: - first = 0 - x1,y1,x2,y2,startAngle,extent = args[:6] - a(self._genArcCode(x1,y1,x2,y2,startAngle,extent)) - - elif op == figureCurve: - if first: - first = 0 - a("%s m" % fp_str(args[:2])) - else: - a("%s l" % fp_str(args[:2])) - a("%s curveto" % fp_str(args[2:])) - else: - raise TypeError("unknown figure operator: "+op) - - if closed: - a("closepath") - self._fillAndStroke(figureCode) - - def _fillAndStroke(self,code,clip=0,fill=1,stroke=1): - fill = self._fillColor and fill - stroke = self._strokeColor and stroke - if fill or stroke or clip: - self.code.extend(code) - if fill: - if stroke or clip: self.code_append("gsave") - self.setColor(self._fillColor) - self.code_append("eofill") - if stroke or clip: self.code_append("grestore") - if stroke: - if clip: self.code_append("gsave") - self.setColor(self._strokeColor) - self.code_append("stroke") - if clip: self.code_append("grestore") - if clip: - self.code_append("clip") - self.code_append("newpath") - - def translate(self,x,y): - self.code_append('%s translate' % fp_str(x,y)) - - def scale(self,x,y): - self.code_append('%s scale' % fp_str(x,y)) - - def transform(self,a,b,c,d,e,f): - self.code_append('[%s] concat' % fp_str(a,b,c,d,e,f)) - - def _drawTimeResize(self,w,h): - '''if this is used we're probably in the wrong world''' - self.width, self.height = w, h - - ############################################################################################ - # drawImage(self. image, x1, y1, x2=None, y2=None) is now defined by either _drawImageLevel1 - # ._drawImageLevel2, the choice is made in .__init__ depending on option - def _drawImageLevel1(self, image, x1, y1, x2=None,y2=None): - # Postscript Level1 version available for fallback mode when Level2 doesn't work - """drawImage(self,image,x1,y1,x2=None,y2=None) : If x2 and y2 are ommitted, they are - calculated from image size. (x1,y1) is upper left of image, (x2,y2) is lower right of - image in piddle coordinates.""" - # For now let's start with 24 bit RGB images (following piddlePDF again) - component_depth = 8 - myimage = image.convert('RGB') - imgwidth, imgheight = myimage.size - if not x2: - x2 = imgwidth + x1 - if not y2: - y2 = y1 + imgheight - drawwidth = x2 - x1 - drawheight = y2 - y1 - #print 'Image size (%d, %d); Draw size (%d, %d)' % (imgwidth, imgheight, drawwidth, drawheight) - # now I need to tell postscript how big image is - - # "image operators assume that they receive sample data from - # their data source in x-axis major index order. The coordinate - # of the lower-left corner of the first sample is (0,0), of the - # second (1,0) and so on" -PS2 ref manual p. 215 - # - # The ImageMatrix maps unit squre of user space to boundary of the source image - # - - # The CurrentTransformationMatrix (CTM) maps the unit square of - # user space to the rect...on the page that is to receive the - # image. A common ImageMatrix is [width 0 0 -height 0 height] - # (for a left to right, top to bottom image ) - - # first let's map the user coordinates start at offset x1,y1 on page - - self.code.extend([ - 'gsave', - '%s %s translate' % (x1,-y1 - drawheight), # need to start are lower left of image - '%s %s scale' % (drawwidth,drawheight), - '/scanline %d 3 mul string def' % imgwidth # scanline by multiples of image width - ]) - - # now push the dimensions and depth info onto the stack - # and push the ImageMatrix to map the source to the target rectangle (see above) - # finally specify source (PS2 pp. 225 ) and by exmample - self.code.extend([ - '%s %s %s' % (imgwidth, imgheight, component_depth), - '[%s %s %s %s %s %s]' % (imgwidth, 0, 0, -imgheight, 0, imgheight), - '{ currentfile scanline readhexstring pop } false 3', - 'colorimage ' - ]) - - # data source output--now we just need to deliver a hex encode - # series of lines of the right overall size can follow - # piddlePDF again - rawimage = (myimage.tobytes if hasattr(myimage,'tobytes') else myimage.tostring)() - hex_encoded = self._AsciiHexEncode(rawimage) - - # write in blocks of 78 chars per line - outstream = getStringIO(hex_encoded) - - dataline = outstream.read(78) - while dataline != "": - self.code_append(dataline) - dataline= outstream.read(78) - self.code_append('% end of image data') # for clarity - self.code_append('grestore') # return coordinates to normal - - # end of drawImage - def _AsciiHexEncode(self, input): # also based on piddlePDF - "Helper function used by images" - output = getStringIO() - for char in asBytes(input): - output.write('%02x' % char2int(char)) - return output.getvalue() - - def _drawImageLevel2(self, image, x1,y1, x2=None,y2=None): # Postscript Level2 version - '''At present we're handling only PIL''' - ### what sort of image are we to draw - if image.mode=='L' : - imBitsPerComponent = 8 - imNumComponents = 1 - myimage = image - elif image.mode == '1': - myimage = image.convert('L') - imNumComponents = 1 - myimage = image - else : - myimage = image.convert('RGB') - imNumComponents = 3 - imBitsPerComponent = 8 - - imwidth, imheight = myimage.size - if not x2: - x2 = imwidth + x1 - if not y2: - y2 = y1 + imheight - drawwidth = x2 - x1 - drawheight = y2 - y1 - self.code.extend([ - 'gsave', - '%s %s translate' % (x1,-y1 - drawheight), # need to start are lower left of image - '%s %s scale' % (drawwidth,drawheight)]) - - if imNumComponents == 3 : - self.code_append('/DeviceRGB setcolorspace') - elif imNumComponents == 1 : - self.code_append('/DeviceGray setcolorspace') - # create the image dictionary - self.code_append(""" -<< -/ImageType 1 -/Width %d /Height %d %% dimensions of source image -/BitsPerComponent %d""" % (imwidth, imheight, imBitsPerComponent) ) - - if imNumComponents == 1: - self.code_append('/Decode [0 1]') - if imNumComponents == 3: - self.code_append('/Decode [0 1 0 1 0 1] %% decode color values normally') - - self.code.extend([ '/ImageMatrix [%s 0 0 %s 0 %s]' % (imwidth, -imheight, imheight), - '/DataSource currentfile /ASCIIHexDecode filter', - '>> % End image dictionary', - 'image']) - # after image operator just need to dump image dat to file as hexstring - rawimage = (myimage.tobytes if hasattr(myimage,'tobytes') else myimage.tostring)() - hex_encoded = self._AsciiHexEncode(rawimage) - - # write in blocks of 78 chars per line - outstream = getStringIO(hex_encoded) - - dataline = outstream.read(78) - while dataline != "": - self.code_append(dataline) - dataline= outstream.read(78) - self.code_append('> % end of image data') # > is EOD for hex encoded filterfor clarity - self.code_append('grestore') # return coordinates to normal - -# renderpdf - draws them onto a canvas -"""Usage: - from reportlab.graphics import renderPS - renderPS.draw(drawing, canvas, x, y) -Execute the script to see some test drawings.""" -from reportlab.graphics.shapes import * - -# hack so we only get warnings once each -#warnOnce = WarnOnce() - -# the main entry point for users... -def draw(drawing, canvas, x=0, y=0, showBoundary=rl_config.showBoundary): - """As it says""" - R = _PSRenderer() - R.draw(renderScaledDrawing(drawing), canvas, x, y, showBoundary=showBoundary) - -def _pointsFromList(L): - ''' - given a list of coordinates [x0, y0, x1, y1....] - produce a list of points [(x0,y0), (y1,y0),....] - ''' - P=[] - a = P.append - for i in range(0,len(L),2): - a((L[i],L[i+1])) - return P - -class _PSRenderer(Renderer): - """This draws onto a EPS document. It needs to be a class - rather than a function, as some EPS-specific state tracking is - needed outside of the state info in the SVG model.""" - - def __init__(self): - self._tracker = StateTracker() - - def drawNode(self, node): - """This is the recursive method called for each node - in the tree""" - self._canvas.comment('begin node %r'%node) - color = self._canvas._color - if not (isinstance(node, Path) and node.isClipPath): - self._canvas.saveState() - - #apply state changes - deltas = getStateDelta(node) - self._tracker.push(deltas) - self.applyStateChanges(deltas, {}) - - #draw the object, or recurse - self.drawNodeDispatcher(node) - - rDeltas = self._tracker.pop() - if not (isinstance(node, Path) and node.isClipPath): - self._canvas.restoreState() - self._canvas.comment('end node %r'%node) - self._canvas._color = color - - #restore things we might have lost (without actually doing anything). - for k, v in rDeltas.items(): - if k in self._restores: - setattr(self._canvas,self._restores[k],v) - -## _restores = {'stroke':'_stroke','stroke_width': '_lineWidth','stroke_linecap':'_lineCap', -## 'stroke_linejoin':'_lineJoin','fill':'_fill','font_family':'_font', -## 'font_size':'_fontSize'} - _restores = {'strokeColor':'_strokeColor','strokeWidth': '_lineWidth','strokeLineCap':'_lineCap', - 'strokeLineJoin':'_lineJoin','fillColor':'_fillColor','fontName':'_font', - 'fontSize':'_fontSize'} - - def drawRect(self, rect): - if rect.rx == rect.ry == 0: - #plain old rectangle - self._canvas.rect( - rect.x, rect.y, - rect.x+rect.width, rect.y+rect.height) - else: - #cheat and assume ry = rx; better to generalize - #pdfgen roundRect function. TODO - self._canvas.roundRect( - rect.x, rect.y, - rect.x+rect.width, rect.y+rect.height, rect.rx, rect.ry - ) - - def drawLine(self, line): - if self._canvas._strokeColor: - self._canvas.line(line.x1, line.y1, line.x2, line.y2) - - def drawCircle(self, circle): - self._canvas.circle( circle.cx, circle.cy, circle.r) - - def drawWedge(self, wedge): - yradius, radius1, yradius1 = wedge._xtraRadii() - if (radius1==0 or radius1 is None) and (yradius1==0 or yradius1 is None) and not wedge.annular: - startangledegrees = wedge.startangledegrees - endangledegrees = wedge.endangledegrees - centerx= wedge.centerx - centery = wedge.centery - radius = wedge.radius - extent = endangledegrees - startangledegrees - self._canvas.drawArc(centerx-radius, centery-yradius, centerx+radius, centery+yradius, - startangledegrees, extent, fromcenter=1) - else: - P = wedge.asPolygon() - if isinstance(P,Path): - self.drawPath(P) - else: - self.drawPolygon(P) - - def drawPolyLine(self, p): - if self._canvas._strokeColor: - self._canvas.polyLine(_pointsFromList(p.points)) - - def drawEllipse(self, ellipse): - #need to convert to pdfgen's bounding box representation - x1 = ellipse.cx - ellipse.rx - x2 = ellipse.cx + ellipse.rx - y1 = ellipse.cy - ellipse.ry - y2 = ellipse.cy + ellipse.ry - self._canvas.ellipse(x1,y1,x2,y2) - - def drawPolygon(self, p): - self._canvas.polygon(_pointsFromList(p.points), closed=1) - - def drawString(self, stringObj): - if self._canvas._fillColor: - S = self._tracker.getState() - text_anchor, x, y, text = S['textAnchor'], stringObj.x,stringObj.y,stringObj.text - if not text_anchor in ['start','inherited']: - font, fontSize = S['fontName'], S['fontSize'] - textLen = stringWidth(text, font,fontSize) - if text_anchor=='end': - x -= textLen - elif text_anchor=='middle': - x -= textLen/2 - elif text_anchor=='numeric': - x -= numericXShift(text_anchor,text,textLen,font,fontSize,encoding='winansi') - else: - raise ValueError('bad value for text_anchor '+str(text_anchor)) - self._canvas.drawString(x,y,text) - - def drawPath(self, path): - from reportlab.graphics.shapes import _renderPath - c = self._canvas - drawFuncs = (c.moveTo, c.lineTo, c.curveTo, c.closePath) - isClosed = _renderPath(path, drawFuncs) - if not isClosed: - c._fillColor = None - c._fillAndStroke([], clip=path.isClipPath) - - def applyStateChanges(self, delta, newState): - """This takes a set of states, and outputs the operators - needed to set those properties""" - for key, value in delta.items(): - if key == 'transform': - self._canvas.transform(value[0], value[1], value[2], - value[3], value[4], value[5]) - elif key == 'strokeColor': - #this has different semantics in PDF to SVG; - #we always have a color, and either do or do - #not apply it; in SVG one can have a 'None' color - self._canvas.setStrokeColor(value) - elif key == 'strokeWidth': - self._canvas.setLineWidth(value) - elif key == 'strokeLineCap': #0,1,2 - self._canvas.setLineCap(value) - elif key == 'strokeLineJoin': - self._canvas.setLineJoin(value) - elif key == 'strokeDashArray': - if value: - if isinstance(value,(list,tuple)) and len(value)==2 and isinstance(value[1],(tuple,list)): - phase = value[0] - value = value[1] - else: - phase = 0 - self._canvas.setDash(value,phase) - else: - self._canvas.setDash() -## elif key == 'stroke_opacity': -## warnOnce('Stroke Opacity not supported yet') - elif key == 'fillColor': - #this has different semantics in PDF to SVG; - #we always have a color, and either do or do - #not apply it; in SVG one can have a 'None' color - self._canvas.setFillColor(value) -## elif key == 'fill_rule': -## warnOnce('Fill rules not done yet') -## elif key == 'fill_opacity': -## warnOnce('Fill opacity not done yet') - elif key in ['fontSize', 'fontName']: - # both need setting together in PDF - # one or both might be in the deltas, - # so need to get whichever is missing - fontname = delta.get('fontName', self._canvas._font) - fontsize = delta.get('fontSize', self._canvas._fontSize) - self._canvas.setFont(fontname, fontsize) - - def drawImage(self, image): - from reportlab.lib.utils import ImageReader - im = ImageReader(image.path) - x0 = image.x - y0 = image.y - x1 = image.width - if x1 is not None: x1 += x0 - y1 = image.height - if y1 is not None: y1 += y0 - self._canvas.drawImage(im._image,x0,y0,x1,y1) - -def drawToFile(d,fn, showBoundary=rl_config.showBoundary,**kwd): - d = renderScaledDrawing(d) - c = PSCanvas((d.width,d.height)) - draw(d, c, 0, 0, showBoundary=showBoundary) - c.save(fn) - -def drawToString(d, showBoundary=rl_config.showBoundary): - "Returns a PS as a string in memory, without touching the disk" - s = getBytesIO() - drawToFile(d, s, showBoundary=showBoundary) - return s.getvalue() - -######################################################### -# -# test code. First, defin a bunch of drawings. -# Routine to draw them comes at the end. -# -######################################################### -def test(outDir='epsout',shout=False): - from reportlab.graphics import testshapes - from reportlab.rl_config import verbose - OLDFONTS = testshapes._FONTS[:] - testshapes._FONTS[:] = ['Times-Roman','Times-Bold','Times-Italic', 'Times-BoldItalic','Courier'] - try: - import os - # save all drawings and their doc strings from the test file - if not os.path.isdir(outDir): - os.mkdir(outDir) - #grab all drawings from the test module - drawings = [] - - for funcname in dir(testshapes): - if funcname[0:10] == 'getDrawing': - drawing = eval('testshapes.' + funcname + '()') #execute it - docstring = eval('testshapes.' + funcname + '.__doc__') - drawings.append((drawing, docstring)) - - i = 0 - for (d, docstring) in drawings: - filename = outDir + os.sep + 'renderPS_%d.eps'%i - drawToFile(d,filename) - if shout or verbose>2: print('renderPS test saved %s' % ascii(filename)) - i += 1 - finally: - testshapes._FONTS[:] = OLDFONTS - -if __name__=='__main__': - import sys - if len(sys.argv)>1: - outdir = sys.argv[1] - else: - outdir = 'epsout' - test(outdir,shout=True) diff --git a/reportlab/graphics/renderSVG.py b/reportlab/graphics/renderSVG.py deleted file mode 100644 index 97ce3725..00000000 --- a/reportlab/graphics/renderSVG.py +++ /dev/null @@ -1,929 +0,0 @@ -__doc__="""An experimental SVG renderer for the ReportLab graphics framework. - -This will create SVG code from the ReportLab Graphics API (RLG). -To read existing SVG code and convert it into ReportLab graphics -objects download the svglib module here: - - http://python.net/~gherman/#svglib -""" - -import math, types, sys, os, codecs -from operator import getitem - -from reportlab.pdfbase.pdfmetrics import stringWidth # for font info -from reportlab.lib.rl_accel import fp_str -from reportlab.lib.colors import black -from reportlab.lib.utils import asNative -from reportlab.graphics.renderbase import StateTracker, getStateDelta, Renderer, renderScaledDrawing -from reportlab.graphics.shapes import STATE_DEFAULTS, Path, UserNode -from reportlab.graphics.shapes import * # (only for test0) -from reportlab import rl_config -from reportlab.lib.utils import getBytesIO, RLString, isPy3, isUnicode, isBytes - -from xml.dom import getDOMImplementation - -### some constants ### - -sin = math.sin -cos = math.cos -pi = math.pi - -AREA_STYLES = 'stroke-width stroke-linecap stroke stroke-opacity fill fill-opacity stroke-dasharray id'.split() -LINE_STYLES = 'stroke-width stroke-linecap stroke stroke-opacity stroke-dasharray id'.split() -TEXT_STYLES = 'font-family font-weight font-style font-variant font-size id'.split() - -### top-level user function ### -def drawToString(d, showBoundary=rl_config.showBoundary,**kwds): - "Returns a SVG as a string in memory, without touching the disk" - s = getBytesIO() - drawToFile(d, s, showBoundary=showBoundary,**kwds) - return s.getvalue() - -def drawToFile(d, fn, showBoundary=rl_config.showBoundary,**kwds): - d = renderScaledDrawing(d) - c = SVGCanvas((d.width, d.height),**kwds) - draw(d, c, 0, 0, showBoundary=showBoundary) - c.save(fn) - -def draw(drawing, canvas, x=0, y=0, showBoundary=rl_config.showBoundary): - """As it says.""" - r = _SVGRenderer() - r.draw(renderScaledDrawing(drawing), canvas, x, y, showBoundary=showBoundary) - -### helper functions ### -def _pointsFromList(L): - """ - given a list of coordinates [x0, y0, x1, y1....] - produce a list of points [(x0,y0), (y1,y0),....] - """ - - P=[] - for i in range(0,len(L), 2): - P.append((L[i], L[i+1])) - - return P - -def transformNode(doc, newTag, node=None, **attrDict): - """Transform a DOM node into new node and copy selected attributes. - - Creates a new DOM node with tag name 'newTag' for document 'doc' - and copies selected attributes from an existing 'node' as provided - in 'attrDict'. The source 'node' can be None. Attribute values will - be converted to strings. - - E.g. - - n = transformNode(doc, "node1", x="0", y="1") - -> DOM node for - - n = transformNode(doc, "node1", x=0, y=1+1) - -> DOM node for - - n = transformNode(doc, "node1", node0, x="x0", y="x0", zoo=bar()) - -> DOM node for - """ - - newNode = doc.createElement(newTag) - for newAttr, attr in attrDict.items(): - sattr = str(attr) - if not node: - newNode.setAttribute(newAttr, sattr) - else: - attrVal = node.getAttribute(sattr) - newNode.setAttribute(newAttr, attrVal or sattr) - - return newNode - -class EncodedWriter(list): - ''' - EncodedWriter(encoding) assumes .write will be called with - either unicode or utf8 encoded bytes. it will accumulate - unicode - ''' - BOMS = { - 'utf-32':codecs.BOM_UTF32, - 'utf-32-be':codecs.BOM_UTF32_BE, - 'utf-32-le':codecs.BOM_UTF32_LE, - 'utf-16':codecs.BOM_UTF16, - 'utf-16-be':codecs.BOM_UTF16_BE, - 'utf-16-le':codecs.BOM_UTF16_LE, - } - def __init__(self,encoding,bom=False): - list.__init__(self) - self.encoding = encoding = codecs.lookup(encoding).name - if bom and '16' in encoding or '32' in encoding: - self.write(self.BOMS[encoding]) - - def write(self,u): - if isBytes(u): - try: - u = u.decode('utf-8') - except: - et, ev, tb = sys.exc_info() - ev = str(ev) - del et, tb - raise ValueError("String %r not encoded as 'utf-8'\nerror=%s" % (u,ev)) - elif not isUnicode(u): - raise ValueError("EncodedWriter.write(%s) argument should be 'utf-8' bytes or str" % ascii(u)) - self.append(u) - - def getvalue(self): - r = ''.join(self) - del self[:] - return r - -### classes ### -class SVGCanvas: - def __init__(self, size=(300,300), encoding='utf-8', verbose=0, bom=False, **kwds): - ''' - verbose = 0 >0 means do verbose stuff - useClip = False True means don't use a clipPath definition put the global clip into the clip property - to get around an issue with safari - extraXmlDecl = '' use to add extra xml declarations - scaleGroupId = '' id of an extra group to add around the drawing to allow easy scaling - svgAttrs = {} dictionary of attributes to be applied to the svg tag itself - ''' - self.verbose = verbose - self.encoding = codecs.lookup(encoding).name - self.bom = bom - useClip = kwds.pop('useClip',False) - self.fontHacks = kwds.pop('fontHacks',{}) - self.extraXmlDecl = kwds.pop('extraXmlDecl','') - scaleGroupId = kwds.pop('scaleGroupId','') - - self.width, self.height = self.size = size - # self.height = size[1] - self.code = [] - self.style = {} - self.path = '' - self._strokeColor = self._fillColor = self._lineWidth = \ - self._font = self._fontSize = self._lineCap = \ - self._lineJoin = self._color = None - - implementation = getDOMImplementation('minidom') - #Based on official example here http://www.w3.org/TR/SVG10/linking.html want: - # - #Thus, - #doctype = implementation.createDocumentType("svg", - # "-//W3C//DTD SVG 20010904//EN", - # "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd") - # - #However, putting that example through http://validator.w3.org/ recommends: - # - #So we'll use that for our SVG 1.0 output. - doctype = implementation.createDocumentType("svg", - "-//W3C//DTD SVG 1.0//EN", - "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd") - self.doc = implementation.createDocument(None,"svg",doctype) - self.svg = self.doc.documentElement - svgAttrs = dict( - width = str(size[0]), - height=str(self.height), - preserveAspectRatio="xMinYMin meet", - viewBox="0 0 %d %d" % (self.width, self.height), - #baseProfile = "full", #disliked in V 1.0 - - #these suggested by Tim Roberts, as updated by peter@maubp.freeserve.co.uk - xmlns="http://www.w3.org/2000/svg", - version="1.0", - ) - svgAttrs["xmlns:xlink"] = "http://www.w3.org/1999/xlink" - svgAttrs.update(kwds.pop('svgAttrs',{})) - for k,v in svgAttrs.items(): - self.svg.setAttribute(k,v) - - title = self.doc.createElement('title') - text = self.doc.createTextNode('...') - title.appendChild(text) - self.svg.appendChild(title) - - desc = self.doc.createElement('desc') - text = self.doc.createTextNode('...') - desc.appendChild(text) - self.svg.appendChild(desc) - - self.setFont(STATE_DEFAULTS['fontName'], STATE_DEFAULTS['fontSize']) - self.setStrokeColor(STATE_DEFAULTS['strokeColor']) - self.setLineCap(2) - self.setLineJoin(0) - self.setLineWidth(1) - - if not useClip: - # Add a rectangular clipping path identical to view area. - clipPath = transformNode(self.doc, "clipPath", id="clip") - clipRect = transformNode(self.doc, "rect", x=0, y=0, - width=self.width, height=self.height) - clipPath.appendChild(clipRect) - self.svg.appendChild(clipPath) - gtkw = dict(style="clip-path: url(#clip)") - else: - gtkw = dict(clip="0 0 %d %d" % (self.width,self.height)) - - self.groupTree = transformNode(self.doc, "g", - id="group", - transform="scale(1,-1) translate(0,-%d)" % self.height, - **gtkw - ) - - if scaleGroupId: - self.scaleTree = transformNode(self.doc, "g", id=scaleGroupId, transform="scale(1,1)") - self.scaleTree.appendChild(self.groupTree) - self.svg.appendChild(self.scaleTree) - else: - self.svg.appendChild(self.groupTree) - self.currGroup = self.groupTree - - def save(self, fn=None): - writer = EncodedWriter(self.encoding,bom=self.bom) - self.doc.writexml(writer,addindent="\t",newl="\n",encoding=self.encoding) - - if hasattr(fn,'write'): - f = fn - else: - if isPy3: - f = open(fn, 'w',encoding=self.encoding) - else: - f = open(fn, 'w') - - svg = writer.getvalue() - exd = self.extraXmlDecl - if exd: - svg = svg.replace('?>','?>'+exd) - f.write(svg if isPy3 else svg.encode(self.encoding)) - if f is not fn: - f.close() - - ### helpers ### - def NOTUSED_stringWidth(self, s, font=None, fontSize=None): - """Return the logical width of the string if it were drawn - in the current font (defaults to self.font). - """ - - font = font or self._font - fontSize = fontSize or self._fontSize - - return stringWidth(s, font, fontSize) - - def _formatStyle(self, include=[], exclude='',**kwds): - style = self.style.copy() - style.update(kwds) - keys = list(style.keys()) - if include: - keys = [k for k in keys if k in include] - if exclude: - exclude = exclude.split() - items = [k+': '+str(style[k]) for k in keys if k not in exclude] - else: - items = [k+': '+str(style[k]) for k in keys] - return '; '.join(items) + ';' - - def _escape(self, s): - """ - return a copy of string s with special characters in postscript strings - escaped with backslashes. - Have not handled characters that are converted normally in python strings - i.e. \\n -> newline - """ - return s.replace(chr(0x5C), r'\\' ).replace('(', '\(' ).replace(')', '\)') - - def _genArcCode(self, x1, y1, x2, y2, startAng, extent): - """Calculate the path for an arc inscribed in rectangle defined - by (x1,y1),(x2,y2).""" - - return - - #calculate semi-minor and semi-major axes of ellipse - xScale = abs((x2-x1)/2.0) - yScale = abs((y2-y1)/2.0) - #calculate centre of ellipse - x, y = (x1+x2)/2.0, (y1+y2)/2.0 - - codeline = 'matrix currentmatrix %s %s translate %s %s scale 0 0 1 %s %s %s setmatrix' - - if extent >= 0: - arc='arc' - else: - arc='arcn' - data = (x,y, xScale, yScale, startAng, startAng+extent, arc) - - return codeline % data - - def _fillAndStroke(self, code, clip=0, link_info=None,styles=AREA_STYLES): - path = transformNode(self.doc, "path", - d=self.path, style=self._formatStyle(styles)) - if link_info : - path = self._add_link(path, link_info) - self.currGroup.appendChild(path) - self.path = '' - - - ### styles ### - def setLineCap(self, v): - vals = {0:'butt', 1:'round', 2:'square'} - if self._lineCap != v: - self._lineCap = v - self.style['stroke-linecap'] = vals[v] - - def setLineJoin(self, v): - vals = {0:'miter', 1:'round', 2:'bevel'} - if self._lineJoin != v: - self._lineJoin = v - self.style['stroke-linecap'] = vals[v] - - def setDash(self, array=[], phase=0): - """Two notations. Pass two numbers, or an array and phase.""" - - if isinstance(array,(float,int)): - self.style['stroke-dasharray'] = ', '.join(map(str, ([array, phase]))) - elif isinstance(array,(tuple,list)) and len(array) > 0: - assert phase >= 0, "phase is a length in user space" - self.style['stroke-dasharray'] = ', '.join(map(str, (array+[phase]))) - - def setStrokeColor(self, color): - self._strokeColor = color - self.setColor(color) - if color == None: - self.style['stroke'] = 'none' - else: - r, g, b = color.red, color.green, color.blue - self.style['stroke'] = 'rgb(%d%%,%d%%,%d%%)' % (r*100, g*100, b*100) - alpha = color.normalizedAlpha - if alpha!=1: - self.style['stroke-opacity'] = '%s' % alpha - elif 'stroke-opacity' in self.style: - del self.style['stroke-opacity'] - - def setColor(self, color): - if self._color != color: - self._color = color - - def setFillColor(self, color): - self._fillColor = color - self.setColor(color) - if color == None: - self.style['fill'] = 'none' - else: - r, g, b = color.red, color.green, color.blue - self.style['fill'] = 'rgb(%d%%,%d%%,%d%%)' % (r*100, g*100, b*100) - alpha = color.normalizedAlpha - if alpha!=1: - self.style['fill-opacity'] = '%s' % alpha - elif 'fill-opacity' in self.style: - del self.style['fill-opacity'] - - def setLineWidth(self, width): - if width != self._lineWidth: - self._lineWidth = width - self.style['stroke-width'] = width - - def setFont(self, font, fontSize): - if self._font != font or self._fontSize != fontSize: - self._font = font - self._fontSize = fontSize - style = self.style - for k in TEXT_STYLES: - if k in style: - del style[k] - svgAttrs = self.fontHacks[font] if font in self.fontHacks else {} - if isinstance(font,RLString): - svgAttrs.update(iter(font.svgAttrs.items())) - if svgAttrs: - for k,v in svgAttrs.items(): - a = 'font-'+k - if a in TEXT_STYLES: - style[a] = v - if 'font-family' not in style: - style['font-family'] = font - style['font-size'] = '%spx' % fontSize - - def _add_link(self, dom_object, link_info) : - assert isinstance(link_info, dict) - link = transformNode(self.doc, "a", **link_info) - link.appendChild(dom_object) - return link - - ### shapes ### - def rect(self, x1,y1, x2,y2, rx=8, ry=8, link_info=None, **_svgAttrs): - "Draw a rectangle between x1,y1 and x2,y2." - - if self.verbose: print("+++ SVGCanvas.rect") - - x = min(x1,x2) - y = min(y1,y2) - kwds = {} - rect = transformNode(self.doc, "rect", - x=x, y=y, width=max(x1,x2)-x, height=max(y1,y2)-y, - style=self._formatStyle(AREA_STYLES),**_svgAttrs) - - if link_info : - rect = self._add_link(rect, link_info) - - self.currGroup.appendChild(rect) - - def roundRect(self, x1,y1, x2,y2, rx=8, ry=8, link_info=None, **_svgAttrs): - """Draw a rounded rectangle between x1,y1 and x2,y2. - - Corners inset as ellipses with x-radius rx and y-radius ry. - These should have x10, and ry>0. - """ - - kwds = {} - rect = transformNode(self.doc, "rect", - x=x1, y=y1, width=x2-x1, height=y2-y1, rx=rx, ry=ry, - style=self._formatStyle(AREA_STYLES), **_svgAttrs) - - if link_info: - rect = self._add_link(rect, link_info) - - self.currGroup.appendChild(rect) - - def drawString(self, s, x, y, angle=0, link_info=None,**_svgAttrs): - s = asNative(s) - if self.verbose: print("+++ SVGCanvas.drawString") - - if self._fillColor != None: - self.setColor(self._fillColor) - s = self._escape(s) - st = self._formatStyle(TEXT_STYLES) - if angle != 0: - st = st + " rotate(%f %f %f);" % (angle, x, y) - st = st + " fill: %s;" % self.style['fill'] - text = transformNode(self.doc, "text", - x=x, y=y, style=st, - transform="translate(0,%d) scale(1,-1)" % (2*y), - **_svgAttrs - ) - content = self.doc.createTextNode(s) - text.appendChild(content) - - if link_info: - text = self._add_link(text, link_info) - - self.currGroup.appendChild(text) - - def drawCentredString(self, s, x, y, angle=0, text_anchor='middle', link_info=None): - if self.verbose: print("+++ SVGCanvas.drawCentredString") - - if self._fillColor != None: - if not text_anchor in ['start', 'inherited']: - textLen = stringWidth(s,self._font,self._fontSize) - if text_anchor=='end': - x -= textLen - elif text_anchor=='middle': - x -= textLen/2. - elif text_anchor=='numeric': - x -= numericXShift(text_anchor,s,textLen,self._font,self._fontSize) - else: - raise ValueError('bad value for text_anchor ' + str(text_anchor)) - self.drawString(x,y,text,angle=angle, link_info=link_info) - - def drawRightString(self, text, x, y, angle=0, link_info=None): - self.drawCentredString(text,x,y,angle=angle,text_anchor='end', link_info=link_info) - - def comment(self, data): - "Add a comment." - - comment = self.doc.createComment(data) - # self.currGroup.appendChild(comment) - - def drawImage(self, image, x1, y1, x2=None, y2=None): - pass - - def line(self, x1, y1, x2, y2): - if self._strokeColor != None: - if 0: # something is wrong with line in my SVG viewer... - line = transformNode(self.doc, "line", - x=x1, y=y1, x2=x2, y2=y2, - style=self._formatStyle(LINE_STYLES)) - self.currGroup.appendChild(line) - path = transformNode(self.doc, "path", - d="M %f,%f L %f,%f Z" % (x1,y1,x2,y2), - style=self._formatStyle(LINE_STYLES)) - self.currGroup.appendChild(path) - - def ellipse(self, x1, y1, x2, y2, link_info=None): - """Draw an orthogonal ellipse inscribed within the rectangle x1,y1,x2,y2. - - These should have x1=180, 0, mx, my) - else: - str = str + "M %f, %f A %f, %f %d %d %d %f, %f Z " % \ - (mx, my, rx, ry, 0, extent>=180, 0, mx, my) - - if fromcenter: - str = str + "L %f, %f Z " % (cx, cy) - - path = transformNode(self.doc, "path", - d=str, style=self._formatStyle()) - self.currGroup.appendChild(path) - - def polygon(self, points, closed=0, link_info=None): - assert len(points) >= 2, 'Polygon must have 2 or more points' - - if self._strokeColor != None: - self.setColor(self._strokeColor) - pairs = [] - for i in range(len(points)): - pairs.append("%f %f" % (points[i])) - pts = ', '.join(pairs) - polyline = transformNode(self.doc, "polygon", - points=pts, style=self._formatStyle(AREA_STYLES)) - - if link_info: - polyline = self._add_link(polyline, link_info) - - self.currGroup.appendChild(polyline) - - # self._fillAndStroke(polyCode) - - def lines(self, lineList, color=None, width=None): - # print "### lineList", lineList - return - - if self._strokeColor != None: - self._setColor(self._strokeColor) - codeline = '%s m %s l stroke' - for line in lineList: - self.code.append(codeline % (fp_str(line[0]), fp_str(line[1]))) - - def polyLine(self, points): - assert len(points) >= 1, 'Polyline must have 1 or more points' - - if self._strokeColor != None: - self.setColor(self._strokeColor) - pairs = [] - for i in range(len(points)): - pairs.append("%f %f" % (points[i])) - pts = ', '.join(pairs) - polyline = transformNode(self.doc, "polyline", - points=pts, style=self._formatStyle(AREA_STYLES,fill=None)) - self.currGroup.appendChild(polyline) - - ### groups ### - def startGroup(self): - if self.verbose: print("+++ begin SVGCanvas.startGroup") - currGroup, group = self.currGroup, transformNode(self.doc, "g", transform="") - currGroup.appendChild(group) - self.currGroup = group - if self.verbose: print("+++ end SVGCanvas.startGroup") - return currGroup - - def endGroup(self,currGroup): - if self.verbose: print("+++ begin SVGCanvas.endGroup") - self.currGroup = currGroup - if self.verbose: print("+++ end SVGCanvas.endGroup") - - def transform(self, a, b, c, d, e, f): - if self.verbose: print("!!! begin SVGCanvas.transform", a, b, c, d, e, f) - tr = self.currGroup.getAttribute("transform") - t = 'matrix(%f, %f, %f, %f, %f, %f)' % (a,b,c,d,e,f) - if (a, b, c, d, e, f) != (1, 0, 0, 1, 0, 0): - self.currGroup.setAttribute("transform", "%s %s" % (tr, t)) - - def translate(self, x, y): - # probably never used - print("!!! begin SVGCanvas.translate") - return - - tr = self.currGroup.getAttribute("transform") - t = 'translate(%f, %f)' % (x, y) - self.currGroup.setAttribute("transform", "%s %s" % (tr, t)) - - def scale(self, x, y): - # probably never used - print("!!! begin SVGCanvas.scale") - return - - tr = self.groups[-1].getAttribute("transform") - t = 'scale(%f, %f)' % (x, y) - self.currGroup.setAttribute("transform", "%s %s" % (tr, t)) - - ### paths ### - def moveTo(self, x, y): - self.path = self.path + 'M %f %f ' % (x, y) - - def lineTo(self, x, y): - self.path = self.path + 'L %f %f ' % (x, y) - - def curveTo(self, x1, y1, x2, y2, x3, y3): - self.path = self.path + 'C %f %f %f %f %f %f ' % (x1, y1, x2, y2, x3, y3) - - def closePath(self): - self.path = self.path + 'Z ' - - def saveState(self): - pass - - def restoreState(self): - pass - -class _SVGRenderer(Renderer): - """This draws onto an SVG document. - """ - - def __init__(self): - self._tracker = StateTracker() - self.verbose = 0 - - def drawNode(self, node): - """This is the recursive method called for each node in the tree. - """ - - if self.verbose: print("### begin _SVGRenderer.drawNode(%r)" % node) - - self._canvas.comment('begin node %r'%node) - color = self._canvas._color - style = self._canvas.style.copy() - if not (isinstance(node, Path) and node.isClipPath): - pass # self._canvas.saveState() - - #apply state changes - deltas = getStateDelta(node) - self._tracker.push(deltas) - self.applyStateChanges(deltas, {}) - - #draw the object, or recurse - self.drawNodeDispatcher(node) - - rDeltas = self._tracker.pop() - if not (isinstance(node, Path) and node.isClipPath): - pass #self._canvas.restoreState() - self._canvas.comment('end node %r'%node) - self._canvas._color = color - - #restore things we might have lost (without actually doing anything). - for k, v in rDeltas.items(): - if k in self._restores: - setattr(self._canvas,self._restores[k],v) - self._canvas.style = style - - if self.verbose: print("### end _SVGRenderer.drawNode(%r)" % node) - - _restores = {'strokeColor':'_strokeColor','strokeWidth': '_lineWidth','strokeLineCap':'_lineCap', - 'strokeLineJoin':'_lineJoin','fillColor':'_fillColor','fontName':'_font', - 'fontSize':'_fontSize'} - - def _get_link_info_dict(self, obj): - #We do not want None or False as the link, even if it is the - #attribute's value - use the empty string instead. - url = getattr(obj, "hrefURL", "") or "" - title = getattr(obj, "hrefTitle", "") or "" - if url : - #Is it valid to have a link with no href? The XML requires - #the xlink:href to be present, but you might just want a - #tool tip shown (via the xlink:title attribute). Note that - #giving an href of "" is equivalent to "the current page" - #(a relative link saying go nowhere). - return {"xlink:href":url, "xlink:title":title, "target":"_top"} - #Currently of all the mainstream browsers I have tested, only Safari/webkit - #will show SVG images embedded in HTML using a simple tag. - #However, the links don't work (Safari 3.2.1 on the Mac). - # - #Therefore I use the following, which also works for Firefox, Opera, and - #IE 6.0 with Adobe SVG Viewer 6 beta: - # - # - #Once displayed, Firefox and Safari treat the SVG like a frame, and - #by default clicking on links acts "in frame" and replaces the image. - #Opera does what I expect, and replaces the whole page with the link. - # - #Therefore I use target="_top" to force the links to replace the whole page. - #This now works as expected on Safari 3.2.1, Firefox 3.0.6, Opera 9.20. - #Perhaps the target attribute should be an option, perhaps defaulting to - #"_top" as used here? - else : - return None - - def drawGroup(self, group): - if self.verbose: print("### begin _SVGRenderer.drawGroup") - - currGroup = self._canvas.startGroup() - a, b, c, d, e, f = self._tracker.getState()['transform'] - for childNode in group.getContents(): - if isinstance(childNode, UserNode): - node2 = childNode.provideNode() - else: - node2 = childNode - self.drawNode(node2) - self._canvas.transform(a, b, c, d, e, f) - self._canvas.endGroup(currGroup) - - if self.verbose: print("### end _SVGRenderer.drawGroup") - - def drawRect(self, rect): - link_info = self._get_link_info_dict(rect) - svgAttrs = getattr(rect,'_svgAttrs',{}) - if rect.rx == rect.ry == 0: - #plain old rectangle - self._canvas.rect( - rect.x, rect.y, - rect.x+rect.width, rect.y+rect.height, link_info=link_info, **svgAttrs) - else: - #cheat and assume ry = rx; better to generalize - #pdfgen roundRect function. TODO - self._canvas.roundRect( - rect.x, rect.y, - rect.x+rect.width, rect.y+rect.height, - rect.rx, rect.ry, - link_info=link_info, **svgAttrs) - - def drawString(self, stringObj): - if self._canvas._fillColor: - S = self._tracker.getState() - text_anchor, x, y, text = S['textAnchor'], stringObj.x, stringObj.y, stringObj.text - if not text_anchor in ('start', 'inherited'): - font, fontSize = S['fontName'], S['fontSize'] - textLen = stringWidth(text, font,fontSize) - if text_anchor=='end': - x -= textLen - elif text_anchor=='middle': - x -= textLen/2 - elif text_anchor=='numeric': - x -= numericXShift(text_anchor,text,textLen,font,fontSize) - else: - raise ValueError('bad value for text_anchor ' + str(text_anchor)) - self._canvas.drawString(text,x,y,link_info=self._get_link_info_dict(stringObj),**getattr(stringObj,'_svgAttrs',{})) - - def drawLine(self, line): - if self._canvas._strokeColor: - self._canvas.line(line.x1, line.y1, line.x2, line.y2) - - def drawCircle(self, circle): - self._canvas.circle( circle.cx, circle.cy, circle.r, link_info=self._get_link_info_dict(circle)) - - def drawWedge(self, wedge): - yradius, radius1, yradius1 = wedge._xtraRadii() - if (radius1==0 or radius1 is None) and (yradius1==0 or yradius1 is None) and not wedge.annular: - centerx, centery, radius, startangledegrees, endangledegrees = \ - wedge.centerx, wedge.centery, wedge.radius, wedge.startangledegrees, wedge.endangledegrees - yradius = wedge.yradius or wedge.radius - (x1, y1) = (centerx-radius, centery-yradius) - (x2, y2) = (centerx+radius, centery+yradius) - extent = endangledegrees - startangledegrees - self._canvas.drawArc(x1, y1, x2, y2, startangledegrees, extent, fromcenter=1) - else: - P = wedge.asPolygon() - if isinstance(P,Path): - self.drawPath(P) - else: - self.drawPolygon(P) - - def drawPolyLine(self, p): - if self._canvas._strokeColor: - self._canvas.polyLine(_pointsFromList(p.points)) - - def drawEllipse(self, ellipse): - #need to convert to pdfgen's bounding box representation - x1 = ellipse.cx - ellipse.rx - x2 = ellipse.cx + ellipse.rx - y1 = ellipse.cy - ellipse.ry - y2 = ellipse.cy + ellipse.ry - self._canvas.ellipse(x1,y1,x2,y2, link_info=self._get_link_info_dict(ellipse)) - - def drawPolygon(self, p): - self._canvas.polygon(_pointsFromList(p.points), closed=1, link_info=self._get_link_info_dict(p)) - - def drawPath(self, path): - # print "### drawPath", path.points - from reportlab.graphics.shapes import _renderPath - c = self._canvas - drawFuncs = (c.moveTo, c.lineTo, c.curveTo, c.closePath) - isClosed = _renderPath(path, drawFuncs) - if isClosed: - #Only try and add links to closed paths... - link_info = self._get_link_info_dict(path) - else : - c._fillColor = None - link_info = None - c._fillAndStroke([], clip=path.isClipPath, link_info=link_info) - - def applyStateChanges(self, delta, newState): - """This takes a set of states, and outputs the operators - needed to set those properties""" - - for key, value in delta.items(): - if key == 'transform': - pass - #self._canvas.transform(value[0], value[1], value[2], value[3], value[4], value[5]) - elif key == 'strokeColor': - self._canvas.setStrokeColor(value) - elif key == 'strokeWidth': - self._canvas.setLineWidth(value) - elif key == 'strokeLineCap': #0,1,2 - self._canvas.setLineCap(value) - elif key == 'strokeLineJoin': - self._canvas.setLineJoin(value) - elif key == 'strokeDashArray': - if value: - if isinstance(value,(list,tuple)) and len(value)==2 and isinstance(value[1],(tuple,list)): - phase = value[0] - value = value[1] - else: - phase = 0 - self._canvas.setDash(value,phase) - else: - self._canvas.setDash() - elif key == 'fillColor': - self._canvas.setFillColor(value) - elif key in ['fontSize', 'fontName']: - fontname = delta.get('fontName', self._canvas._font) - fontsize = delta.get('fontSize', self._canvas._fontSize) - self._canvas.setFont(fontname, fontsize) - -def test(outDir='out-svg'): - # print all drawings and their doc strings from the test - # file - if not os.path.isdir(outDir): - os.mkdir(outDir) - #grab all drawings from the test module - from reportlab.graphics import testshapes - drawings = [] - - for funcname in dir(testshapes): - #if funcname[0:11] == 'getDrawing2': - # print 'hacked to only show drawing 2' - if funcname[0:10] == 'getDrawing': - drawing = eval('testshapes.' + funcname + '()') - docstring = eval('testshapes.' + funcname + '.__doc__') - drawings.append((drawing, docstring)) - - - i = 0 - for (d, docstring) in drawings: - filename = os.path.join(outDir,'renderSVG_%d.svg' % i) - drawToFile(d, filename) - i += 1 - - from reportlab.graphics.testshapes import getDrawing01 - d = getDrawing01() - drawToFile(d, os.path.join(outDir,"test.svg")) - - from reportlab.lib.corp import RL_CorpLogo - from reportlab.graphics.shapes import Drawing - - rl = RL_CorpLogo() - d = Drawing(rl.width,rl.height) - d.add(rl) - drawToFile(d, os.path.join(outDir,"corplogo.svg")) - -if __name__=='__main__': - test() diff --git a/reportlab/graphics/renderbase.py b/reportlab/graphics/renderbase.py deleted file mode 100644 index 64a64cc8..00000000 --- a/reportlab/graphics/renderbase.py +++ /dev/null @@ -1,357 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/renderbase.py - -__version__=''' $Id $ ''' -__doc__='''Superclass for renderers to factor out common functionality and default implementations.''' - -from reportlab.graphics.shapes import * -from reportlab.lib.validators import DerivedValue -from reportlab import rl_config - -def inverse(A): - "For A affine 2D represented as 6vec return 6vec version of A**(-1)" - # I checked this RGB - det = float(A[0]*A[3] - A[2]*A[1]) - R = [A[3]/det, -A[1]/det, -A[2]/det, A[0]/det] - return tuple(R+[-R[0]*A[4]-R[2]*A[5],-R[1]*A[4]-R[3]*A[5]]) - -def mmult(A, B): - "A postmultiplied by B" - # I checked this RGB - # [a0 a2 a4] [b0 b2 b4] - # [a1 a3 a5] * [b1 b3 b5] - # [ 1 ] [ 1 ] - # - return (A[0]*B[0] + A[2]*B[1], - A[1]*B[0] + A[3]*B[1], - A[0]*B[2] + A[2]*B[3], - A[1]*B[2] + A[3]*B[3], - A[0]*B[4] + A[2]*B[5] + A[4], - A[1]*B[4] + A[3]*B[5] + A[5]) - - -def getStateDelta(shape): - """Used to compute when we need to change the graphics state. - For example, if we have two adjacent red shapes we don't need - to set the pen color to red in between. Returns the effect - the given shape would have on the graphics state""" - delta = {} - for prop, value in shape.getProperties().items(): - if prop in STATE_DEFAULTS: - delta[prop] = value - return delta - - -class StateTracker: - """Keeps a stack of transforms and state - properties. It can contain any properties you - want, but the keys 'transform' and 'ctm' have - special meanings. The getCTM() - method returns the current transformation - matrix at any point, without needing to - invert matrixes when you pop.""" - def __init__(self, defaults=None): - # one stack to keep track of what changes... - self._deltas = [] - - # and another to keep track of cumulative effects. Last one in - # list is the current graphics state. We put one in to simplify - # loops below. - self._combined = [] - if defaults is None: - defaults = STATE_DEFAULTS.copy() - #ensure that if we have a transform, we have a CTM - if 'transform' in defaults: - defaults['ctm'] = defaults['transform'] - self._combined.append(defaults) - - def push(self,delta): - """Take a new state dictionary of changes and push it onto - the stack. After doing this, the combined state is accessible - through getState()""" - - newstate = self._combined[-1].copy() - for key, value in delta.items(): - if key == 'transform': #do cumulative matrix - newstate['transform'] = delta['transform'] - newstate['ctm'] = mmult(self._combined[-1]['ctm'], delta['transform']) - #print 'statetracker transform = (%0.2f, %0.2f, %0.2f, %0.2f, %0.2f, %0.2f)' % tuple(newstate['transform']) - #print 'statetracker ctm = (%0.2f, %0.2f, %0.2f, %0.2f, %0.2f, %0.2f)' % tuple(newstate['ctm']) - - else: #just overwrite it - newstate[key] = value - - self._combined.append(newstate) - self._deltas.append(delta) - - def pop(self): - """steps back one, and returns a state dictionary with the - deltas to reverse out of wherever you are. Depending - on your back end, you may not need the return value, - since you can get the complete state afterwards with getState()""" - del self._combined[-1] - newState = self._combined[-1] - lastDelta = self._deltas[-1] - del self._deltas[-1] - #need to diff this against the last one in the state - reverseDelta = {} - #print 'pop()...' - for key, curValue in lastDelta.items(): - #print ' key=%s, value=%s' % (key, curValue) - prevValue = newState[key] - if prevValue != curValue: - #print ' state popping "%s"="%s"' % (key, curValue) - if key == 'transform': - reverseDelta[key] = inverse(lastDelta['transform']) - else: #just return to previous state - reverseDelta[key] = prevValue - return reverseDelta - - def getState(self): - "returns the complete graphics state at this point" - return self._combined[-1] - - def getCTM(self): - "returns the current transformation matrix at this point""" - return self._combined[-1]['ctm'] - - def __getitem__(self,key): - "returns the complete graphics state value of key at this point" - return self._combined[-1][key] - - def __setitem__(self,key,value): - "sets the complete graphics state value of key to value" - self._combined[-1][key] = value - -def testStateTracker(): - print('Testing state tracker') - defaults = {'fillColor':None, 'strokeColor':None,'fontName':None, 'transform':[1,0,0,1,0,0]} - from reportlab.graphics.shapes import _baseGFontName - deltas = [ - {'fillColor':'red'}, - {'fillColor':'green', 'strokeColor':'blue','fontName':_baseGFontName}, - {'transform':[0.5,0,0,0.5,0,0]}, - {'transform':[0.5,0,0,0.5,2,3]}, - {'strokeColor':'red'} - ] - - st = StateTracker(defaults) - print('initial:', st.getState()) - print() - for delta in deltas: - print('pushing:', delta) - st.push(delta) - print('state: ',st.getState(),'\n') - - for delta in deltas: - print('popping:',st.pop()) - print('state: ',st.getState(),'\n') - - -def _expandUserNode(node,canvas): - if isinstance(node, UserNode): - try: - if hasattr(node,'_canvas'): - ocanvas = 1 - else: - node._canvas = canvas - ocanvas = None - onode = node - node = node.provideNode() - finally: - if not ocanvas: del onode._canvas - return node - -def renderScaledDrawing(d): - renderScale = d.renderScale - if renderScale!=1.0: - o = d - d = d.__class__(o.width*renderScale,o.height*renderScale) - d.__dict__ = o.__dict__.copy() - d.scale(renderScale,renderScale) - d.renderScale = 1.0 - return d - -class Renderer: - """Virtual superclass for graphics renderers.""" - - def __init__(self): - self._tracker = StateTracker() - self._nodeStack = [] #track nodes visited - - def undefined(self, operation): - raise ValueError("%s operation not defined at superclass class=%s" %(operation, self.__class__)) - - def draw(self, drawing, canvas, x=0, y=0, showBoundary=rl_config._unset_): - """This is the top level function, which draws the drawing at the given - location. The recursive part is handled by drawNode.""" - #stash references for ease of communication - if showBoundary is rl_config._unset_: showBoundary=rl_config.showBoundary - self._canvas = canvas - canvas.__dict__['_drawing'] = self._drawing = drawing - drawing._parent = None - try: - #bounding box - if showBoundary: canvas.rect(x, y, drawing.width, drawing.height) - canvas.saveState() - self.initState(x,y) #this is the push() - self.drawNode(drawing) - self.pop() - canvas.restoreState() - finally: - #remove any circular references - del self._canvas, self._drawing, canvas._drawing, drawing._parent - - def initState(self,x,y): - deltas = STATE_DEFAULTS.copy() - deltas['transform'] = [1,0,0,1,x,y] - self._tracker.push(deltas) - self.applyStateChanges(deltas, {}) - - def pop(self): - self._tracker.pop() - - def drawNode(self, node): - """This is the recursive method called for each node - in the tree""" - # Undefined here, but with closer analysis probably can be handled in superclass - self.undefined("drawNode") - - def getStateValue(self, key): - """Return current state parameter for given key""" - currentState = self._tracker._combined[-1] - return currentState[key] - - def fillDerivedValues(self, node): - """Examine a node for any values which are Derived, - and replace them with their calculated values. - Generally things may look at the drawing or their - parent. - - """ - for key, value in node.__dict__.items(): - if isinstance(value, DerivedValue): - #just replace with default for key? - #print ' fillDerivedValues(%s)' % key - newValue = value.getValue(self, key) - #print ' got value of %s' % newValue - node.__dict__[key] = newValue - - def drawNodeDispatcher(self, node): - """dispatch on the node's (super) class: shared code""" - - canvas = getattr(self,'_canvas',None) - # replace UserNode with its contents - - try: - node = _expandUserNode(node,canvas) - if not node: return - if hasattr(node,'_canvas'): - ocanvas = 1 - else: - node._canvas = canvas - ocanvas = None - - self.fillDerivedValues(node) - dtcb = getattr(node,'_drawTimeCallback',None) - if dtcb: - dtcb(node,canvas=canvas,renderer=self) - #draw the object, or recurse - if isinstance(node, Line): - self.drawLine(node) - elif isinstance(node, Image): - self.drawImage(node) - elif isinstance(node, Rect): - self.drawRect(node) - elif isinstance(node, Circle): - self.drawCircle(node) - elif isinstance(node, Ellipse): - self.drawEllipse(node) - elif isinstance(node, PolyLine): - self.drawPolyLine(node) - elif isinstance(node, Polygon): - self.drawPolygon(node) - elif isinstance(node, Path): - self.drawPath(node) - elif isinstance(node, String): - self.drawString(node) - elif isinstance(node, Group): - self.drawGroup(node) - elif isinstance(node, Wedge): - self.drawWedge(node) - else: - print('DrawingError','Unexpected element %s in drawing!' % str(node)) - finally: - if not ocanvas: del node._canvas - - _restores = {'stroke':'_stroke','stroke_width': '_lineWidth','stroke_linecap':'_lineCap', - 'stroke_linejoin':'_lineJoin','fill':'_fill','font_family':'_font', - 'font_size':'_fontSize'} - - def drawGroup(self, group): - # just do the contents. Some renderers might need to override this - # if they need a flipped transform - canvas = getattr(self,'_canvas',None) - for node in group.getContents(): - node = _expandUserNode(node,canvas) - if not node: continue - - #here is where we do derived values - this seems to get everything. Touch wood. - self.fillDerivedValues(node) - try: - if hasattr(node,'_canvas'): - ocanvas = 1 - else: - node._canvas = canvas - ocanvas = None - node._parent = group - self.drawNode(node) - finally: - del node._parent - if not ocanvas: del node._canvas - - def drawWedge(self, wedge): - # by default ask the wedge to make a polygon of itself and draw that! - #print "drawWedge" - P = wedge.asPolygon() - if isinstance(P,Path): - self.drawPath(P) - else: - self.drawPolygon(P) - - def drawPath(self, path): - polygons = path.asPolygons() - for polygon in polygons: - self.drawPolygon(polygon) - - def drawRect(self, rect): - # could be implemented in terms of polygon - self.undefined("drawRect") - - def drawLine(self, line): - self.undefined("drawLine") - - def drawCircle(self, circle): - self.undefined("drawCircle") - - def drawPolyLine(self, p): - self.undefined("drawPolyLine") - - def drawEllipse(self, ellipse): - self.undefined("drawEllipse") - - def drawPolygon(self, p): - self.undefined("drawPolygon") - - def drawString(self, stringObj): - self.undefined("drawString") - - def applyStateChanges(self, delta, newState): - """This takes a set of states, and outputs the operators - needed to set those properties""" - self.undefined("applyStateChanges") - -if __name__=='__main__': - print("this file has no script interpretation") - print(__doc__) diff --git a/reportlab/graphics/samples/__init__.py b/reportlab/graphics/samples/__init__.py deleted file mode 100644 index c16b3b27..00000000 --- a/reportlab/graphics/samples/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__doc__="""Example drawings to review, used in autogenerated docs""" diff --git a/reportlab/graphics/samples/bubble.py b/reportlab/graphics/samples/bubble.py deleted file mode 100644 index b6bd6ac1..00000000 --- a/reportlab/graphics/samples/bubble.py +++ /dev/null @@ -1,73 +0,0 @@ -#Autogenerated by ReportLab guiedit do not edit -from reportlab.graphics.charts.legends import Legend -from reportlab.graphics.charts.lineplots import ScatterPlot -from reportlab.graphics.shapes import Drawing, _DrawingEditorMixin, String -from reportlab.graphics.charts.textlabels import Label -from reportlab.graphics.samples.excelcolors import * - -class Bubble(_DrawingEditorMixin,Drawing): - def __init__(self,width=200,height=150,*args,**kw): - Drawing.__init__(self,width,height,*args,**kw) - self._add(self,ScatterPlot(),name='chart',validate=None,desc="The main chart") - self.chart.width = 115 - self.chart.height = 80 - self.chart.x = 30 - self.chart.y = 40 - self.chart.lines[0].strokeColor = color01 - self.chart.lines[1].strokeColor = color02 - self.chart.lines[2].strokeColor = color03 - self.chart.lines[3].strokeColor = color04 - self.chart.lines[4].strokeColor = color05 - self.chart.lines[5].strokeColor = color06 - self.chart.lines[6].strokeColor = color07 - self.chart.lines[7].strokeColor = color08 - self.chart.lines[8].strokeColor = color09 - self.chart.lines[9].strokeColor = color10 - self.chart.lines.symbol.kind ='Circle' - self.chart.lines.symbol.size = 15 - self.chart.fillColor = backgroundGrey - self.chart.lineLabels.fontName = 'Helvetica' - self.chart.xValueAxis.labels.fontName = 'Helvetica' - self.chart.xValueAxis.labels.fontSize = 7 - self.chart.xValueAxis.forceZero = 0 - self.chart.data = [((100,100), (200,200), (250,210), (300,300), (350,450))] - self.chart.xValueAxis.avoidBoundFrac = 1 - self.chart.xValueAxis.gridEnd = 115 - self.chart.xValueAxis.tickDown = 3 - self.chart.xValueAxis.visibleGrid = 1 - self.chart.yValueAxis.tickLeft = 3 - self.chart.yValueAxis.labels.fontName = 'Helvetica' - self.chart.yValueAxis.labels.fontSize = 7 - self._add(self,Label(),name='Title',validate=None,desc="The title at the top of the chart") - self.Title.fontName = 'Helvetica-Bold' - self.Title.fontSize = 7 - self.Title.x = 100 - self.Title.y = 135 - self.Title._text = 'Chart Title' - self.Title.maxWidth = 180 - self.Title.height = 20 - self.Title.textAnchor ='middle' - self._add(self,Legend(),name='Legend',validate=None,desc="The legend or key for the chart") - self.Legend.colorNamePairs = [(color01, 'Widgets')] - self.Legend.fontName = 'Helvetica' - self.Legend.fontSize = 7 - self.Legend.x = 153 - self.Legend.y = 85 - self.Legend.dxTextSpace = 5 - self.Legend.dy = 5 - self.Legend.dx = 5 - self.Legend.deltay = 5 - self.Legend.alignment ='right' - self.chart.lineLabelFormat = None - self.chart.xLabel = 'X Axis' - self.chart.y = 30 - self.chart.yLabel = 'Y Axis' - self.chart.yValueAxis.labelTextFormat = '%d' - self.chart.yValueAxis.forceZero = 1 - self.chart.xValueAxis.forceZero = 1 - - - self._add(self,0,name='preview',validate=None,desc=None) - -if __name__=="__main__": #NORUNTESTS - Bubble().save(formats=['pdf'],outDir=None,fnRoot='bubble') diff --git a/reportlab/graphics/samples/clustered_bar.py b/reportlab/graphics/samples/clustered_bar.py deleted file mode 100644 index 11c7caac..00000000 --- a/reportlab/graphics/samples/clustered_bar.py +++ /dev/null @@ -1,84 +0,0 @@ -#Autogenerated by ReportLab guiedit do not edit -from reportlab.graphics.charts.legends import Legend -from reportlab.graphics.samples.excelcolors import * -from reportlab.graphics.charts.barcharts import HorizontalBarChart -from reportlab.graphics.shapes import Drawing, _DrawingEditorMixin, String -from reportlab.graphics.charts.textlabels import Label - -class ClusteredBar(_DrawingEditorMixin,Drawing): - def __init__(self,width=200,height=150,*args,**kw): - Drawing.__init__(self,width,height,*args,**kw) - self._add(self,HorizontalBarChart(),name='chart',validate=None,desc="The main chart") - self.chart.width = 115 - self.chart.height = 80 - self.chart.x = 30 - self.chart.y = 40 - self.chart.bars[0].fillColor = color01 - self.chart.bars[1].fillColor = color02 - self.chart.bars[2].fillColor = color03 - self.chart.bars[3].fillColor = color04 - self.chart.bars[4].fillColor = color05 - self.chart.bars[5].fillColor = color06 - self.chart.bars[6].fillColor = color07 - self.chart.bars[7].fillColor = color08 - self.chart.bars[8].fillColor = color09 - self.chart.bars[9].fillColor = color10 - self.chart.fillColor = backgroundGrey - self.chart.barLabels.fontName = 'Helvetica' - self.chart.valueAxis.labels.fontName = 'Helvetica' - self.chart.valueAxis.labels.fontSize = 6 - self.chart.valueAxis.forceZero = 1 - self.chart.data = [(100, 150, 180), (125, 180, 200)] - self.chart.groupSpacing = 15 - self.chart.valueAxis.avoidBoundFrac = 1 - self.chart.valueAxis.gridEnd = 80 - self.chart.valueAxis.tickDown = 3 - self.chart.valueAxis.visibleGrid = 1 - self.chart.categoryAxis.categoryNames = ['North', 'South', 'Central'] - self.chart.categoryAxis.tickLeft = 3 - self.chart.categoryAxis.labels.fontName = 'Helvetica' - self.chart.categoryAxis.labels.fontSize = 6 - self.chart.categoryAxis.labels.dx = -3 - self._add(self,Label(),name='Title',validate=None,desc="The title at the top of the chart") - self.Title.fontName = 'Helvetica-Bold' - self.Title.fontSize = 7 - self.Title.x = 100 - self.Title.y = 135 - self.Title._text = 'Chart Title' - self.Title.maxWidth = 180 - self.Title.height = 20 - self.Title.textAnchor ='middle' - self._add(self,Legend(),name='Legend',validate=None,desc="The legend or key for the chart") - self.Legend.colorNamePairs = [(color01, 'Widgets'), (color02, 'Sprockets')] - self.Legend.fontName = 'Helvetica' - self.Legend.fontSize = 7 - self.Legend.x = 153 - self.Legend.y = 85 - self.Legend.dxTextSpace = 5 - self.Legend.dy = 5 - self.Legend.dx = 5 - self.Legend.deltay = 5 - self.Legend.alignment ='right' - self._add(self,Label(),name='XLabel',validate=None,desc="The label on the horizontal axis") - self.XLabel.fontName = 'Helvetica' - self.XLabel.fontSize = 7 - self.XLabel.x = 85 - self.XLabel.y = 10 - self.XLabel.textAnchor ='middle' - self.XLabel.maxWidth = 100 - self.XLabel.height = 20 - self.XLabel._text = "X Axis" - self._add(self,Label(),name='YLabel',validate=None,desc="The label on the vertical axis") - self.YLabel.fontName = 'Helvetica' - self.YLabel.fontSize = 7 - self.YLabel.x = 12 - self.YLabel.y = 80 - self.YLabel.angle = 90 - self.YLabel.textAnchor ='middle' - self.YLabel.maxWidth = 100 - self.YLabel.height = 20 - self.YLabel._text = "Y Axis" - self._add(self,0,name='preview',validate=None,desc=None) - -if __name__=="__main__": #NORUNTESTS - ClusteredBar().save(formats=['pdf'],outDir=None,fnRoot='clustered_bar') diff --git a/reportlab/graphics/samples/clustered_column.py b/reportlab/graphics/samples/clustered_column.py deleted file mode 100644 index 3aa95a42..00000000 --- a/reportlab/graphics/samples/clustered_column.py +++ /dev/null @@ -1,83 +0,0 @@ -#Autogenerated by ReportLab guiedit do not edit -from reportlab.graphics.charts.legends import Legend -from reportlab.graphics.samples.excelcolors import * -from reportlab.graphics.charts.barcharts import VerticalBarChart -from reportlab.graphics.shapes import Drawing, _DrawingEditorMixin, String -from reportlab.graphics.charts.textlabels import Label - -class ClusteredColumn(_DrawingEditorMixin,Drawing): - def __init__(self,width=200,height=150,*args,**kw): - Drawing.__init__(self,width,height,*args,**kw) - self._add(self,VerticalBarChart(),name='chart',validate=None,desc="The main chart") - self.chart.width = 115 - self.chart.height = 80 - self.chart.x = 30 - self.chart.y = 40 - self.chart.bars[0].fillColor = color01 - self.chart.bars[1].fillColor = color02 - self.chart.bars[2].fillColor = color03 - self.chart.bars[3].fillColor = color04 - self.chart.bars[4].fillColor = color05 - self.chart.bars[5].fillColor = color06 - self.chart.bars[6].fillColor = color07 - self.chart.bars[7].fillColor = color08 - self.chart.bars[8].fillColor = color09 - self.chart.bars[9].fillColor = color10 - self.chart.fillColor = backgroundGrey - self.chart.barLabels.fontName = 'Helvetica' - self.chart.valueAxis.labels.fontName = 'Helvetica' - self.chart.valueAxis.labels.fontSize = 7 - self.chart.valueAxis.forceZero = 1 - self.chart.data = [(100, 150, 180), (125, 180, 200)] - self.chart.groupSpacing = 15 - self.chart.valueAxis.avoidBoundFrac = 1 - self.chart.valueAxis.gridEnd = 115 - self.chart.valueAxis.tickLeft = 3 - self.chart.valueAxis.visibleGrid = 1 - self.chart.categoryAxis.categoryNames = ['North', 'South', 'Central'] - self.chart.categoryAxis.tickDown = 3 - self.chart.categoryAxis.labels.fontName = 'Helvetica' - self.chart.categoryAxis.labels.fontSize = 7 - self._add(self,Label(),name='Title',validate=None,desc="The title at the top of the chart") - self.Title.fontName = 'Helvetica-Bold' - self.Title.fontSize = 7 - self.Title.x = 100 - self.Title.y = 135 - self.Title._text = 'Chart Title' - self.Title.maxWidth = 180 - self.Title.height = 20 - self.Title.textAnchor ='middle' - self._add(self,Legend(),name='Legend',validate=None,desc="The legend or key for the chart") - self.Legend.colorNamePairs = [(color01, 'Widgets'), (color02, 'Sprockets')] - self.Legend.fontName = 'Helvetica' - self.Legend.fontSize = 7 - self.Legend.x = 153 - self.Legend.y = 85 - self.Legend.dxTextSpace = 5 - self.Legend.dy = 5 - self.Legend.dx = 5 - self.Legend.deltay = 5 - self.Legend.alignment ='right' - self._add(self,Label(),name='XLabel',validate=None,desc="The label on the horizontal axis") - self.XLabel.fontName = 'Helvetica' - self.XLabel.fontSize = 7 - self.XLabel.x = 85 - self.XLabel.y = 10 - self.XLabel.textAnchor ='middle' - self.XLabel.maxWidth = 100 - self.XLabel.height = 20 - self.XLabel._text = "X Axis" - self._add(self,Label(),name='YLabel',validate=None,desc="The label on the vertical axis") - self.YLabel.fontName = 'Helvetica' - self.YLabel.fontSize = 7 - self.YLabel.x = 12 - self.YLabel.y = 80 - self.YLabel.angle = 90 - self.YLabel.textAnchor ='middle' - self.YLabel.maxWidth = 100 - self.YLabel.height = 20 - self.YLabel._text = "Y Axis" - self._add(self,0,name='preview',validate=None,desc=None) - -if __name__=="__main__": #NORUNTESTS - ClusteredColumn().save(formats=['pdf'],outDir=None,fnRoot='clustered_column') diff --git a/reportlab/graphics/samples/excelcolors.py b/reportlab/graphics/samples/excelcolors.py deleted file mode 100644 index f3f4f5b6..00000000 --- a/reportlab/graphics/samples/excelcolors.py +++ /dev/null @@ -1,45 +0,0 @@ -# define standard colors to mimic those used by Microsoft Excel -from reportlab.lib.colors import CMYKColor, PCMYKColor - -#colour names as comments at the end of each line are as a memory jogger ONLY -#NOT HTML named colours! - -#Main colours as used for bars etc -color01 = PCMYKColor(40,40,0,0) # Lavender -color02 = PCMYKColor(0,66,33,39) # Maroon -color03 = PCMYKColor(0,0,20,0) # Yellow -color04 = PCMYKColor(20,0,0,0) # Cyan -color05 = PCMYKColor(0,100,0,59) # Purple -color06 = PCMYKColor(0,49,49,0) # Salmon -color07 = PCMYKColor(100,49,0,19) # Blue -color08 = PCMYKColor(20,20,0,0) # PaleLavender -color09 = PCMYKColor(100,100,0,49) # NavyBlue -color10 = PCMYKColor(0,100,0,0) # Purple - -#Highlight colors - eg for the tops of bars -color01Light = PCMYKColor(39,39,0,25) # Light Lavender -color02Light = PCMYKColor(0,66,33,54) # Light Maroon -color03Light = PCMYKColor(0,0,19,25) # Light Yellow -color04Light = PCMYKColor(19,0,0,25) # Light Cyan -color05Light = PCMYKColor(0,100,0,69) # Light Purple -color06Light = PCMYKColor(0,49,49,25) # Light Salmon -color07Light = PCMYKColor(100,49,0,39) # Light Blue -color08Light = PCMYKColor(19,19,0,25) # Light PaleLavender -color09Light = PCMYKColor(100,100,0,62) # Light NavyBlue -color10Light = PCMYKColor(0,100,0,25) # Light Purple - -#Lowlight colors - eg for the sides of bars -color01Dark = PCMYKColor(39,39,0,49) # Dark Lavender -color02Dark = PCMYKColor(0,66,33,69) # Dark Maroon -color03Dark = PCMYKColor(0,0,20,49) # Dark Yellow -color04Dark = PCMYKColor(20,0,0,49) # Dark Cyan -color05Dark = PCMYKColor(0,100,0,80) # Dark Purple -color06Dark = PCMYKColor(0,50,50,49) # Dark Salmon -color07Dark = PCMYKColor(100,50,0,59) # Dark Blue -color08Dark = PCMYKColor(20,20,0,49) # Dark PaleLavender -color09Dark = PCMYKColor(100,100,0,79) # Dark NavyBlue -color10Dark = PCMYKColor(0,100,0,49) # Dark Purple - -#for standard grey backgrounds -backgroundGrey = PCMYKColor(0,0,0,24) - diff --git a/reportlab/graphics/samples/exploded_pie.py b/reportlab/graphics/samples/exploded_pie.py deleted file mode 100644 index f4dc30a3..00000000 --- a/reportlab/graphics/samples/exploded_pie.py +++ /dev/null @@ -1,65 +0,0 @@ -#Autogenerated by ReportLab guiedit do not edit -from reportlab.graphics.charts.piecharts import Pie -from reportlab.graphics.samples.excelcolors import * -from reportlab.graphics.widgets.grids import ShadedRect -from reportlab.graphics.charts.legends import Legend -from reportlab.graphics.shapes import Drawing, _DrawingEditorMixin, String -from reportlab.graphics.charts.textlabels import Label - -class ExplodedPie(_DrawingEditorMixin,Drawing): - def __init__(self,width=200,height=150,*args,**kw): - Drawing.__init__(self,width,height,*args,**kw) - self._add(self,Pie(),name='chart',validate=None,desc="The main chart") - self.chart.width = 100 - self.chart.height = 100 - self.chart.x = 25 - self.chart.y = 25 - self.chart.slices[0].fillColor = color01 - self.chart.slices[1].fillColor = color02 - self.chart.slices[2].fillColor = color03 - self.chart.slices[3].fillColor = color04 - self.chart.slices[4].fillColor = color05 - self.chart.slices[5].fillColor = color06 - self.chart.slices[6].fillColor = color07 - self.chart.slices[7].fillColor = color08 - self.chart.slices[8].fillColor = color09 - self.chart.slices[9].fillColor = color10 - self.chart.data = (100, 150, 180) - self.chart.startAngle = -90 - self._add(self,Label(),name='Title',validate=None,desc="The title at the top of the chart") - self.Title.fontName = 'Helvetica-Bold' - self.Title.fontSize = 7 - self.Title.x = 100 - self.Title.y = 135 - self.Title._text = 'Chart Title' - self.Title.maxWidth = 180 - self.Title.height = 20 - self.Title.textAnchor ='middle' - self._add(self,Legend(),name='Legend',validate=None,desc="The legend or key for the chart") - self.Legend.colorNamePairs = [(color01, 'North'), (color02, 'South'), (color03, 'Central')] - self.Legend.fontName = 'Helvetica' - self.Legend.fontSize = 7 - self.Legend.x = 160 - self.Legend.y = 85 - self.Legend.dxTextSpace = 5 - self.Legend.dy = 5 - self.Legend.dx = 5 - self.Legend.deltay = 5 - self.Legend.alignment ='right' - self.Legend.columnMaximum = 10 - self.chart.slices.strokeWidth = 1 - self.chart.slices.fontName = 'Helvetica' - self.background = ShadedRect() - self.background.fillColorStart = backgroundGrey - self.background.fillColorEnd = backgroundGrey - self.background.numShades = 1 - self.background.strokeWidth = 0.5 - self.background.x = 20 - self.background.y = 20 - self.chart.slices.popout = 5 - self.background.height = 110 - self.background.width = 110 - self._add(self,0,name='preview',validate=None,desc=None) - -if __name__=="__main__": #NORUNTESTS - ExplodedPie().save(formats=['pdf'],outDir=None,fnRoot='exploded_pie') diff --git a/reportlab/graphics/samples/filled_radar.py b/reportlab/graphics/samples/filled_radar.py deleted file mode 100644 index 78d0d427..00000000 --- a/reportlab/graphics/samples/filled_radar.py +++ /dev/null @@ -1,54 +0,0 @@ -#Autogenerated by ReportLab guiedit do not edit -from reportlab.graphics.charts.legends import Legend -from reportlab.graphics.charts.spider import SpiderChart -from reportlab.graphics.shapes import Drawing, _DrawingEditorMixin, String -from reportlab.graphics.charts.textlabels import Label -from reportlab.graphics.samples.excelcolors import * - -class FilledRadarChart(_DrawingEditorMixin,Drawing): - def __init__(self,width=200,height=150,*args,**kw): - Drawing.__init__(self,width,height,*args,**kw) - self._add(self,SpiderChart(),name='chart',validate=None,desc="The main chart") - self.chart.width = 90 - self.chart.height = 90 - self.chart.x = 45 - self.chart.y = 25 - self.chart.strands[0].fillColor = color01 - self.chart.strands[1].fillColor = color02 - self.chart.strands[2].fillColor = color03 - self.chart.strands[3].fillColor = color04 - self.chart.strands[4].fillColor = color05 - self.chart.strands[5].fillColor = color06 - self.chart.strands[6].fillColor = color07 - self.chart.strands[7].fillColor = color08 - self.chart.strands[8].fillColor = color09 - self.chart.strands[9].fillColor = color10 - self.chart.strandLabels.fontName = 'Helvetica' - self.chart.strandLabels.fontSize = 6 - self.chart.fillColor = backgroundGrey - self.chart.data = [(125, 180, 200), (100, 150, 180)] - self.chart.labels = ['North', 'South', 'Central'] - self._add(self,Label(),name='Title',validate=None,desc="The title at the top of the chart") - self.Title.fontName = 'Helvetica-Bold' - self.Title.fontSize = 7 - self.Title.x = 100 - self.Title.y = 135 - self.Title._text = 'Chart Title' - self.Title.maxWidth = 180 - self.Title.height = 20 - self.Title.textAnchor ='middle' - self._add(self,Legend(),name='Legend',validate=None,desc="The legend or key for the chart") - self.Legend.colorNamePairs = [(color01, 'Widgets'), (color02, 'Sprockets')] - self.Legend.fontName = 'Helvetica' - self.Legend.fontSize = 7 - self.Legend.x = 153 - self.Legend.y = 85 - self.Legend.dxTextSpace = 5 - self.Legend.dy = 5 - self.Legend.dx = 5 - self.Legend.deltay = 5 - self.Legend.alignment ='right' - self._add(self,0,name='preview',validate=None,desc=None) - -if __name__=="__main__": #NORUNTESTS - FilledRadarChart().save(formats=['pdf'],outDir=None,fnRoot='filled_radar') diff --git a/reportlab/graphics/samples/line_chart.py b/reportlab/graphics/samples/line_chart.py deleted file mode 100644 index 6122bc81..00000000 --- a/reportlab/graphics/samples/line_chart.py +++ /dev/null @@ -1,83 +0,0 @@ -#Autogenerated by ReportLab guiedit do not edit -from reportlab.graphics.charts.legends import Legend -from reportlab.graphics.charts.lineplots import LinePlot -from reportlab.graphics.shapes import Drawing, _DrawingEditorMixin, String -from reportlab.graphics.charts.textlabels import Label -from reportlab.graphics.samples.excelcolors import * - -class LineChart(_DrawingEditorMixin,Drawing): - def __init__(self,width=200,height=150,*args,**kw): - Drawing.__init__(self,width,height,*args,**kw) - self._add(self,LinePlot(),name='chart',validate=None,desc="The main chart") - self.chart.width = 115 - self.chart.height = 80 - self.chart.x = 30 - self.chart.y = 40 - self.chart.lines[0].strokeColor = color01 - self.chart.lines[1].strokeColor = color02 - self.chart.lines[2].strokeColor = color03 - self.chart.lines[3].strokeColor = color04 - self.chart.lines[4].strokeColor = color05 - self.chart.lines[5].strokeColor = color06 - self.chart.lines[6].strokeColor = color07 - self.chart.lines[7].strokeColor = color08 - self.chart.lines[8].strokeColor = color09 - self.chart.lines[9].strokeColor = color10 - self.chart.fillColor = backgroundGrey - self.chart.lineLabels.fontName = 'Helvetica' - self.chart.xValueAxis.labels.fontName = 'Helvetica' - self.chart.xValueAxis.labels.fontSize = 7 - self.chart.xValueAxis.forceZero = 0 - self.chart.data = [((0, 50), (100,100), (200,200), (250,210), (300,300), (400,500)), ((0, 150), (100,200), (200,300), (250,200), (300,400), (400, 600))] - self.chart.xValueAxis.avoidBoundFrac = 1 - self.chart.xValueAxis.gridEnd = 115 - self.chart.xValueAxis.tickDown = 3 - self.chart.xValueAxis.visibleGrid = 1 - self.chart.yValueAxis.tickLeft = 3 - self.chart.yValueAxis.labels.fontName = 'Helvetica' - self.chart.yValueAxis.labels.fontSize = 7 - self._add(self,Label(),name='Title',validate=None,desc="The title at the top of the chart") - self.Title.fontName = 'Helvetica-Bold' - self.Title.fontSize = 7 - self.Title.x = 100 - self.Title.y = 135 - self.Title._text = 'Chart Title' - self.Title.maxWidth = 180 - self.Title.height = 20 - self.Title.textAnchor ='middle' - self._add(self,Legend(),name='Legend',validate=None,desc="The legend or key for the chart") - self.Legend.colorNamePairs = [(color01, 'Widgets'), (color02, 'Sprockets')] - self.Legend.fontName = 'Helvetica' - self.Legend.fontSize = 7 - self.Legend.x = 153 - self.Legend.y = 85 - self.Legend.dxTextSpace = 5 - self.Legend.dy = 5 - self.Legend.dx = 5 - self.Legend.deltay = 5 - self.Legend.alignment ='right' - self._add(self,Label(),name='XLabel',validate=None,desc="The label on the horizontal axis") - self.XLabel.fontName = 'Helvetica' - self.XLabel.fontSize = 7 - self.XLabel.x = 85 - self.XLabel.y = 10 - self.XLabel.textAnchor ='middle' - self.XLabel.maxWidth = 100 - self.XLabel.height = 20 - self.XLabel._text = "X Axis" - self._add(self,Label(),name='YLabel',validate=None,desc="The label on the vertical axis") - self.YLabel.fontName = 'Helvetica' - self.YLabel.fontSize = 7 - self.YLabel.x = 12 - self.YLabel.y = 80 - self.YLabel.angle = 90 - self.YLabel.textAnchor ='middle' - self.YLabel.maxWidth = 100 - self.YLabel.height = 20 - self.YLabel._text = "Y Axis" - self.chart.yValueAxis.forceZero = 1 - self.chart.xValueAxis.forceZero = 1 - self._add(self,0,name='preview',validate=None,desc=None) - -if __name__=="__main__": #NORUNTESTS - LineChart().save(formats=['pdf'],outDir=None,fnRoot='line_chart') diff --git a/reportlab/graphics/samples/linechart_with_markers.py b/reportlab/graphics/samples/linechart_with_markers.py deleted file mode 100644 index 56871b65..00000000 --- a/reportlab/graphics/samples/linechart_with_markers.py +++ /dev/null @@ -1,94 +0,0 @@ -#Autogenerated by ReportLab guiedit do not edit -from reportlab.graphics.charts.legends import Legend -from reportlab.graphics.charts.lineplots import LinePlot -from reportlab.graphics.shapes import Drawing, _DrawingEditorMixin, String -from reportlab.graphics.widgets.markers import makeMarker -from reportlab.graphics.charts.textlabels import Label -from reportlab.graphics.samples.excelcolors import * - -class LineChartWithMarkers(_DrawingEditorMixin,Drawing): - def __init__(self,width=200,height=150,*args,**kw): - Drawing.__init__(self,width,height,*args,**kw) - self._add(self,LinePlot(),name='chart',validate=None,desc="The main chart") - self.chart.width = 115 - self.chart.height = 80 - self.chart.x = 30 - self.chart.y = 40 - self.chart.lines[0].strokeColor = color01 - self.chart.lines[1].strokeColor = color02 - self.chart.lines[2].strokeColor = color03 - self.chart.lines[3].strokeColor = color04 - self.chart.lines[4].strokeColor = color05 - self.chart.lines[5].strokeColor = color06 - self.chart.lines[6].strokeColor = color07 - self.chart.lines[7].strokeColor = color08 - self.chart.lines[8].strokeColor = color09 - self.chart.lines[9].strokeColor = color10 - self.chart.lines[0].symbol = makeMarker('FilledSquare') - self.chart.lines[1].symbol = makeMarker('FilledDiamond') - self.chart.lines[2].symbol = makeMarker('FilledStarFive') - self.chart.lines[3].symbol = makeMarker('FilledTriangle') - self.chart.lines[4].symbol = makeMarker('FilledCircle') - self.chart.lines[5].symbol = makeMarker('FilledPentagon') - self.chart.lines[6].symbol = makeMarker('FilledStarSix') - self.chart.lines[7].symbol = makeMarker('FilledHeptagon') - self.chart.lines[8].symbol = makeMarker('FilledOctagon') - self.chart.lines[9].symbol = makeMarker('FilledCross') - self.chart.fillColor = backgroundGrey - self.chart.lineLabels.fontName = 'Helvetica' - self.chart.xValueAxis.labels.fontName = 'Helvetica' - self.chart.xValueAxis.labels.fontSize = 7 - self.chart.xValueAxis.forceZero = 0 - self.chart.data = [((0, 50), (100,100), (200,200), (250,210), (300,300), (400,500)), ((0, 150), (100,200), (200,300), (250,200), (300,400), (400, 600))] - self.chart.xValueAxis.avoidBoundFrac = 1 - self.chart.xValueAxis.gridEnd = 115 - self.chart.xValueAxis.tickDown = 3 - self.chart.xValueAxis.visibleGrid = 1 - self.chart.yValueAxis.tickLeft = 3 - self.chart.yValueAxis.labels.fontName = 'Helvetica' - self.chart.yValueAxis.labels.fontSize = 7 - self._add(self,Label(),name='Title',validate=None,desc="The title at the top of the chart") - self.Title.fontName = 'Helvetica-Bold' - self.Title.fontSize = 7 - self.Title.x = 100 - self.Title.y = 135 - self.Title._text = 'Chart Title' - self.Title.maxWidth = 180 - self.Title.height = 20 - self.Title.textAnchor ='middle' - self._add(self,Legend(),name='Legend',validate=None,desc="The legend or key for the chart") - self.Legend.colorNamePairs = [(color01, 'Widgets'), (color02, 'Sprockets')] - self.Legend.fontName = 'Helvetica' - self.Legend.fontSize = 7 - self.Legend.x = 153 - self.Legend.y = 85 - self.Legend.dxTextSpace = 5 - self.Legend.dy = 5 - self.Legend.dx = 5 - self.Legend.deltay = 5 - self.Legend.alignment ='right' - self._add(self,Label(),name='XLabel',validate=None,desc="The label on the horizontal axis") - self.XLabel.fontName = 'Helvetica' - self.XLabel.fontSize = 7 - self.XLabel.x = 85 - self.XLabel.y = 10 - self.XLabel.textAnchor ='middle' - self.XLabel.maxWidth = 100 - self.XLabel.height = 20 - self.XLabel._text = "X Axis" - self._add(self,Label(),name='YLabel',validate=None,desc="The label on the vertical axis") - self.YLabel.fontName = 'Helvetica' - self.YLabel.fontSize = 7 - self.YLabel.x = 12 - self.YLabel.y = 80 - self.YLabel.angle = 90 - self.YLabel.textAnchor ='middle' - self.YLabel.maxWidth = 100 - self.YLabel.height = 20 - self.YLabel._text = "Y Axis" - self.chart.yValueAxis.forceZero = 1 - self.chart.xValueAxis.forceZero = 1 - self._add(self,0,name='preview',validate=None,desc=None) - -if __name__=="__main__": #NORUNTESTS - LineChartWithMarkers().save(formats=['pdf'],outDir=None,fnRoot='linechart_with_markers') diff --git a/reportlab/graphics/samples/radar.py b/reportlab/graphics/samples/radar.py deleted file mode 100644 index adbf8f9f..00000000 --- a/reportlab/graphics/samples/radar.py +++ /dev/null @@ -1,66 +0,0 @@ -#Autogenerated by ReportLab guiedit do not edit -from reportlab.graphics.charts.legends import Legend -from reportlab.graphics.samples.excelcolors import * -from reportlab.graphics.charts.spider import SpiderChart -from reportlab.graphics.shapes import Drawing, _DrawingEditorMixin, String -from reportlab.graphics.charts.textlabels import Label - -class RadarChart(_DrawingEditorMixin,Drawing): - def __init__(self,width=200,height=150,*args,**kw): - Drawing.__init__(self,width,height,*args,**kw) - self._add(self,SpiderChart(),name='chart',validate=None,desc="The main chart") - self.chart.width = 90 - self.chart.height = 90 - self.chart.x = 45 - self.chart.y = 25 - self.chart.strands[0].strokeColor= color01 - self.chart.strands[1].strokeColor= color02 - self.chart.strands[2].strokeColor= color03 - self.chart.strands[3].strokeColor= color04 - self.chart.strands[4].strokeColor= color05 - self.chart.strands[5].strokeColor= color06 - self.chart.strands[6].strokeColor= color07 - self.chart.strands[7].strokeColor= color08 - self.chart.strands[8].strokeColor= color09 - self.chart.strands[9].strokeColor= color10 - self.chart.strands[0].fillColor = None - self.chart.strands[1].fillColor = None - self.chart.strands[2].fillColor = None - self.chart.strands[3].fillColor = None - self.chart.strands[4].fillColor = None - self.chart.strands[5].fillColor = None - self.chart.strands[6].fillColor = None - self.chart.strands[7].fillColor = None - self.chart.strands[8].fillColor = None - self.chart.strands[9].fillColor = None - self.chart.strands.strokeWidth = 1 - self.chart.strandLabels.fontName = 'Helvetica' - self.chart.strandLabels.fontSize = 6 - self.chart.fillColor = backgroundGrey - self.chart.data = [(125, 180, 200), (100, 150, 180)] - self.chart.labels = ['North', 'South', 'Central'] - self._add(self,Label(),name='Title',validate=None,desc="The title at the top of the chart") - self.Title.fontName = 'Helvetica-Bold' - self.Title.fontSize = 7 - self.Title.x = 100 - self.Title.y = 135 - self.Title._text = 'Chart Title' - self.Title.maxWidth = 180 - self.Title.height = 20 - self.Title.textAnchor ='middle' - self._add(self,Legend(),name='Legend',validate=None,desc="The legend or key for the chart") - self.Legend.colorNamePairs = [(color01, 'Widgets'), (color02, 'Sprockets')] - self.Legend.fontName = 'Helvetica' - self.Legend.fontSize = 7 - self.Legend.x = 153 - self.Legend.y = 85 - self.Legend.dxTextSpace = 5 - self.Legend.dy = 5 - self.Legend.dx = 5 - self.Legend.deltay = 5 - self.Legend.alignment ='right' - self.chart.strands.strokeWidth = 1 - self._add(self,0,name='preview',validate=None,desc=None) - -if __name__=="__main__": #NORUNTESTS - RadarChart().save(formats=['pdf'],outDir=None,fnRoot='radar') diff --git a/reportlab/graphics/samples/runall.py b/reportlab/graphics/samples/runall.py deleted file mode 100644 index e305a37f..00000000 --- a/reportlab/graphics/samples/runall.py +++ /dev/null @@ -1,58 +0,0 @@ -# runs all the GUIedit charts in this directory - -# makes a PDF sample for eaxh existing chart type -import sys -import glob -import inspect -import types - -def moduleClasses(mod): - def P(obj, m=mod.__name__, CT=type): - return (type(obj)==CT and obj.__module__==m) - try: - return inspect.getmembers(mod, P)[0][1] - except: - return None - -def getclass(f): - return moduleClasses(__import__(f)) - -def run(format, VERBOSE=0): - formats = format.split( ',') - for i in range(0, len(formats)): - formats[i] == formats[i].strip().lower() - allfiles = glob.glob('*.py') - allfiles.sort() - for fn in allfiles: - f = fn.split('.')[0] - c = getclass(f) - if c != None: - print(c.__name__) - try: - for fmt in formats: - if fmt: - c().save(formats=[fmt],outDir='.',fnRoot=c.__name__) - if VERBOSE: - print(" %s.%s" % (c.__name__, fmt)) - except: - print(" COULDN'T CREATE '%s.%s'!" % (c.__name__, format)) - -if __name__ == "__main__": - if len(sys.argv) == 1: - run('pdf,pict,png') - else: - try: - if sys.argv[1] == "-h": - print('usage: runall.py [FORMAT] [-h]') - print(' if format is supplied is should be one or more of pdf,gif,eps,png etc') - print(' if format is missing the following formats are assumed: pdf,pict,png') - print(' -h prints this message') - else: - t = sys.argv[1:] - for f in t: - run(f) - except: - print('usage: runall.py [FORMAT][-h]') - print(' if format is supplied is should be one or more of pdf,gif,eps,png etc') - print(' if format is missing the following formats are assumed: pdf,pict,png') - print(' -h prints this message') - raise diff --git a/reportlab/graphics/samples/scatter.py b/reportlab/graphics/samples/scatter.py deleted file mode 100644 index 1e227c1b..00000000 --- a/reportlab/graphics/samples/scatter.py +++ /dev/null @@ -1,71 +0,0 @@ -#Autogenerated by ReportLab guiedit do not edit -from reportlab.graphics.charts.legends import Legend -from reportlab.graphics.charts.lineplots import ScatterPlot -from reportlab.graphics.shapes import Drawing, _DrawingEditorMixin, String -from reportlab.graphics.charts.textlabels import Label -from reportlab.graphics.samples.excelcolors import * - -class Scatter(_DrawingEditorMixin,Drawing): - def __init__(self,width=200,height=150,*args,**kw): - Drawing.__init__(self,width,height,*args,**kw) - self._add(self,ScatterPlot(),name='chart',validate=None,desc="The main chart") - self.chart.width = 115 - self.chart.height = 80 - self.chart.x = 30 - self.chart.y = 40 - self.chart.lines[0].strokeColor = color01 - self.chart.lines[1].strokeColor = color02 - self.chart.lines[2].strokeColor = color03 - self.chart.lines[3].strokeColor = color04 - self.chart.lines[4].strokeColor = color05 - self.chart.lines[5].strokeColor = color06 - self.chart.lines[6].strokeColor = color07 - self.chart.lines[7].strokeColor = color08 - self.chart.lines[8].strokeColor = color09 - self.chart.lines[9].strokeColor = color10 - self.chart.fillColor = backgroundGrey - self.chart.lineLabels.fontName = 'Helvetica' - self.chart.xValueAxis.labels.fontName = 'Helvetica' - self.chart.xValueAxis.labels.fontSize = 7 - self.chart.xValueAxis.forceZero = 0 - self.chart.data = [((100,100), (200,200), (250,210), (300,300), (400,500)), ((100,200), (200,300), (250,200), (300,400), (400, 600))] - self.chart.xValueAxis.avoidBoundFrac = 1 - self.chart.xValueAxis.gridEnd = 115 - self.chart.xValueAxis.tickDown = 3 - self.chart.xValueAxis.visibleGrid = 1 - self.chart.yValueAxis.tickLeft = 3 - self.chart.yValueAxis.labels.fontName = 'Helvetica' - self.chart.yValueAxis.labels.fontSize = 7 - self._add(self,Label(),name='Title',validate=None,desc="The title at the top of the chart") - self.Title.fontName = 'Helvetica-Bold' - self.Title.fontSize = 7 - self.Title.x = 100 - self.Title.y = 135 - self.Title._text = 'Chart Title' - self.Title.maxWidth = 180 - self.Title.height = 20 - self.Title.textAnchor ='middle' - self._add(self,Legend(),name='Legend',validate=None,desc="The legend or key for the chart") - self.Legend.colorNamePairs = [(color01, 'Widgets'), (color02, 'Sprockets')] - self.Legend.fontName = 'Helvetica' - self.Legend.fontSize = 7 - self.Legend.x = 153 - self.Legend.y = 85 - self.Legend.dxTextSpace = 5 - self.Legend.dy = 5 - self.Legend.dx = 5 - self.Legend.deltay = 5 - self.Legend.alignment ='right' - self.chart.lineLabelFormat = None - self.chart.xLabel = 'X Axis' - self.chart.y = 30 - self.chart.yLabel = 'Y Axis' - self.chart.yValueAxis.labelTextFormat = '%d' - self.chart.yValueAxis.forceZero = 1 - self.chart.xValueAxis.forceZero = 1 - - - self._add(self,0,name='preview',validate=None,desc=None) - -if __name__=="__main__": #NORUNTESTS - Scatter().save(formats=['pdf'],outDir=None,fnRoot='scatter') diff --git a/reportlab/graphics/samples/scatter_lines.py b/reportlab/graphics/samples/scatter_lines.py deleted file mode 100644 index 550b7931..00000000 --- a/reportlab/graphics/samples/scatter_lines.py +++ /dev/null @@ -1,82 +0,0 @@ -#Autogenerated by ReportLab guiedit do not edit -from reportlab.graphics.charts.legends import Legend -from reportlab.graphics.charts.lineplots import ScatterPlot -from reportlab.graphics.shapes import Drawing, _DrawingEditorMixin, String -from reportlab.graphics.charts.textlabels import Label -from reportlab.graphics.samples.excelcolors import * - -class ScatterLines(_DrawingEditorMixin,Drawing): - def __init__(self,width=200,height=150,*args,**kw): - Drawing.__init__(self,width,height,*args,**kw) - self._add(self,ScatterPlot(),name='chart',validate=None,desc="The main chart") - self.chart.width = 115 - self.chart.height = 80 - self.chart.x = 30 - self.chart.y = 40 - self.chart.lines[0].strokeColor = color01 - self.chart.lines[1].strokeColor = color02 - self.chart.lines[2].strokeColor = color03 - self.chart.lines[3].strokeColor = color04 - self.chart.lines[4].strokeColor = color05 - self.chart.lines[5].strokeColor = color06 - self.chart.lines[6].strokeColor = color07 - self.chart.lines[7].strokeColor = color08 - self.chart.lines[8].strokeColor = color09 - self.chart.lines[9].strokeColor = color10 - self.chart.lines[0].symbol = None - self.chart.lines[1].symbol = None - self.chart.lines[2].symbol = None - self.chart.lines[3].symbol = None - self.chart.lines[4].symbol = None - self.chart.lines[5].symbol = None - self.chart.lines[6].symbol = None - self.chart.lines[7].symbol = None - self.chart.lines[8].symbol = None - self.chart.lines[9].symbol = None - self.chart.fillColor = backgroundGrey - self.chart.lineLabels.fontName = 'Helvetica' - self.chart.xValueAxis.labels.fontName = 'Helvetica' - self.chart.xValueAxis.labels.fontSize = 7 - self.chart.xValueAxis.forceZero = 0 - self.chart.data = [((100,100), (200,200), (250,210), (300,300), (400,500)), ((100,200), (200,300), (250,200), (300,400), (400, 600))] - self.chart.xValueAxis.avoidBoundFrac = 1 - self.chart.xValueAxis.gridEnd = 115 - self.chart.xValueAxis.tickDown = 3 - self.chart.xValueAxis.visibleGrid = 1 - self.chart.yValueAxis.tickLeft = 3 - self.chart.yValueAxis.labels.fontName = 'Helvetica' - self.chart.yValueAxis.labels.fontSize = 7 - self._add(self,Label(),name='Title',validate=None,desc="The title at the top of the chart") - self.Title.fontName = 'Helvetica-Bold' - self.Title.fontSize = 7 - self.Title.x = 100 - self.Title.y = 135 - self.Title._text = 'Chart Title' - self.Title.maxWidth = 180 - self.Title.height = 20 - self.Title.textAnchor ='middle' - self._add(self,Legend(),name='Legend',validate=None,desc="The legend or key for the chart") - self.Legend.colorNamePairs = [(color01, 'Widgets'), (color02, 'Sprockets')] - self.Legend.fontName = 'Helvetica' - self.Legend.fontSize = 7 - self.Legend.x = 153 - self.Legend.y = 85 - self.Legend.dxTextSpace = 5 - self.Legend.dy = 5 - self.Legend.dx = 5 - self.Legend.deltay = 5 - self.Legend.alignment ='right' - self.chart.lineLabelFormat = None - self.chart.xLabel = 'X Axis' - self.chart.y = 30 - self.chart.yLabel = 'Y Axis' - self.chart.yValueAxis.gridEnd = 115 - self.chart.yValueAxis.visibleGrid = 1 - self.chart.yValueAxis.labelTextFormat = '%d' - self.chart.yValueAxis.forceZero = 1 - self.chart.xValueAxis.forceZero = 1 - self.chart.joinedLines = 1 - self._add(self,0,name='preview',validate=None,desc=None) - -if __name__=="__main__": #NORUNTESTS - ScatterLines().save(formats=['pdf'],outDir=None,fnRoot='scatter_lines') diff --git a/reportlab/graphics/samples/scatter_lines_markers.py b/reportlab/graphics/samples/scatter_lines_markers.py deleted file mode 100644 index 5686e4d8..00000000 --- a/reportlab/graphics/samples/scatter_lines_markers.py +++ /dev/null @@ -1,72 +0,0 @@ -#Autogenerated by ReportLab guiedit do not edit -from reportlab.graphics.charts.legends import Legend -from reportlab.graphics.charts.lineplots import ScatterPlot -from reportlab.graphics.shapes import Drawing, _DrawingEditorMixin, String -from reportlab.graphics.charts.textlabels import Label -from reportlab.graphics.samples.excelcolors import * - -class ScatterLinesMarkers(_DrawingEditorMixin,Drawing): - def __init__(self,width=200,height=150,*args,**kw): - Drawing.__init__(self,width,height,*args,**kw) - self._add(self,ScatterPlot(),name='chart',validate=None,desc="The main chart") - self.chart.width = 115 - self.chart.height = 80 - self.chart.x = 30 - self.chart.y = 40 - self.chart.lines[0].strokeColor = color01 - self.chart.lines[1].strokeColor = color02 - self.chart.lines[2].strokeColor = color03 - self.chart.lines[3].strokeColor = color04 - self.chart.lines[4].strokeColor = color05 - self.chart.lines[5].strokeColor = color06 - self.chart.lines[6].strokeColor = color07 - self.chart.lines[7].strokeColor = color08 - self.chart.lines[8].strokeColor = color09 - self.chart.lines[9].strokeColor = color10 - self.chart.fillColor = backgroundGrey - self.chart.lineLabels.fontName = 'Helvetica' - self.chart.xValueAxis.labels.fontName = 'Helvetica' - self.chart.xValueAxis.labels.fontSize = 7 - self.chart.xValueAxis.forceZero = 0 - self.chart.data = [((100,100), (200,200), (250,210), (300,300), (400,500)), ((100,200), (200,300), (250,200), (300,400), (400, 600))] - self.chart.xValueAxis.avoidBoundFrac = 1 - self.chart.xValueAxis.gridEnd = 115 - self.chart.xValueAxis.tickDown = 3 - self.chart.xValueAxis.visibleGrid = 1 - self.chart.yValueAxis.tickLeft = 3 - self.chart.yValueAxis.labels.fontName = 'Helvetica' - self.chart.yValueAxis.labels.fontSize = 7 - self._add(self,Label(),name='Title',validate=None,desc="The title at the top of the chart") - self.Title.fontName = 'Helvetica-Bold' - self.Title.fontSize = 7 - self.Title.x = 100 - self.Title.y = 135 - self.Title._text = 'Chart Title' - self.Title.maxWidth = 180 - self.Title.height = 20 - self.Title.textAnchor ='middle' - self._add(self,Legend(),name='Legend',validate=None,desc="The legend or key for the chart") - self.Legend.colorNamePairs = [(color01, 'Widgets'), (color02, 'Sprockets')] - self.Legend.fontName = 'Helvetica' - self.Legend.fontSize = 7 - self.Legend.x = 153 - self.Legend.y = 85 - self.Legend.dxTextSpace = 5 - self.Legend.dy = 5 - self.Legend.dx = 5 - self.Legend.deltay = 5 - self.Legend.alignment ='right' - self.chart.lineLabelFormat = None - self.chart.xLabel = 'X Axis' - self.chart.y = 30 - self.chart.yLabel = 'Y Axis' - self.chart.yValueAxis.gridEnd = 115 - self.chart.yValueAxis.visibleGrid = 1 - self.chart.yValueAxis.labelTextFormat = '%d' - self.chart.yValueAxis.forceZero = 1 - self.chart.xValueAxis.forceZero = 1 - self.chart.joinedLines = 1 - self._add(self,0,name='preview',validate=None,desc=None) - -if __name__=="__main__": #NORUNTESTS - ScatterLinesMarkers().save(formats=['pdf'],outDir=None,fnRoot='scatter_lines_markers') diff --git a/reportlab/graphics/samples/simple_pie.py b/reportlab/graphics/samples/simple_pie.py deleted file mode 100644 index 57f5ae74..00000000 --- a/reportlab/graphics/samples/simple_pie.py +++ /dev/null @@ -1,61 +0,0 @@ -#Autogenerated by ReportLab guiedit do not edit -from reportlab.graphics.charts.piecharts import Pie -from reportlab.graphics.widgets.grids import ShadedRect -from reportlab.graphics.charts.legends import Legend -from reportlab.graphics.shapes import Drawing, _DrawingEditorMixin, String -from reportlab.graphics.charts.textlabels import Label -from reportlab.graphics.samples.excelcolors import * - -class SimplePie(_DrawingEditorMixin,Drawing): - def __init__(self,width=200,height=150,*args,**kw): - Drawing.__init__(self,width,height,*args,**kw) - self._add(self,Pie(),name='chart',validate=None,desc="The main chart") - self.chart.width = 100 - self.chart.height = 100 - self.chart.x = 25 - self.chart.y = 25 - self.chart.slices[0].fillColor = color01 - self.chart.slices[1].fillColor = color02 - self.chart.slices[2].fillColor = color03 - self.chart.slices[3].fillColor = color04 - self.chart.slices[4].fillColor = color05 - self.chart.slices[5].fillColor = color06 - self.chart.slices[6].fillColor = color07 - self.chart.slices[7].fillColor = color08 - self.chart.slices[8].fillColor = color09 - self.chart.slices[9].fillColor = color10 - self.chart.data = (100, 150, 180) - self._add(self,Label(),name='Title',validate=None,desc="The title at the top of the chart") - self.Title.fontName = 'Helvetica-Bold' - self.Title.fontSize = 7 - self.Title.x = 100 - self.Title.y = 135 - self.Title._text = 'Chart Title' - self.Title.maxWidth = 180 - self.Title.height = 20 - self.Title.textAnchor ='middle' - self._add(self,Legend(),name='Legend',validate=None,desc="The legend or key for the chart") - self.Legend.colorNamePairs = [(color01, 'North'), (color02, 'South'),(color03, 'Central')] - self.Legend.fontName = 'Helvetica' - self.Legend.fontSize = 7 - self.Legend.x = 160 - self.Legend.y = 85 - self.Legend.dxTextSpace = 5 - self.Legend.dy = 5 - self.Legend.dx = 5 - self.Legend.deltay = 5 - self.Legend.alignment ='right' - self.chart.slices.strokeWidth = 1 - self.chart.slices.fontName = 'Helvetica' - self.background = ShadedRect() - self.background.fillColorStart = backgroundGrey - self.background.fillColorEnd = backgroundGrey - self.background.numShades = 1 - self.background.strokeWidth = 0.5 - self.background.x = 25 - self.background.y = 25 - self.Legend.columnMaximum = 10 - self._add(self,0,name='preview',validate=None,desc=None) - -if __name__=="__main__": #NORUNTESTS - SimplePie().save(formats=['pdf'],outDir=None,fnRoot=None) diff --git a/reportlab/graphics/samples/stacked_bar.py b/reportlab/graphics/samples/stacked_bar.py deleted file mode 100644 index c5ec9c6a..00000000 --- a/reportlab/graphics/samples/stacked_bar.py +++ /dev/null @@ -1,85 +0,0 @@ -#Autogenerated by ReportLab guiedit do not edit -from reportlab.graphics.charts.legends import Legend -from reportlab.graphics.charts.barcharts import HorizontalBarChart -from reportlab.graphics.shapes import Drawing, _DrawingEditorMixin, String -from reportlab.graphics.charts.textlabels import Label -from reportlab.graphics.samples.excelcolors import * - -class StackedBar(_DrawingEditorMixin,Drawing): - def __init__(self,width=200,height=150,*args,**kw): - Drawing.__init__(self,width,height,*args,**kw) - self._add(self,HorizontalBarChart(),name='chart',validate=None,desc="The main chart") - self.chart.width = 115 - self.chart.height = 80 - self.chart.x = 30 - self.chart.y = 40 - self.chart.bars[0].fillColor = color01 - self.chart.bars[1].fillColor = color02 - self.chart.bars[2].fillColor = color03 - self.chart.bars[3].fillColor = color04 - self.chart.bars[4].fillColor = color05 - self.chart.bars[5].fillColor = color06 - self.chart.bars[6].fillColor = color07 - self.chart.bars[7].fillColor = color08 - self.chart.bars[8].fillColor = color09 - self.chart.bars[9].fillColor = color10 - self.chart.fillColor = backgroundGrey - self.chart.barLabels.fontName = 'Helvetica' - self.chart.valueAxis.labels.fontName = 'Helvetica' - self.chart.valueAxis.labels.fontSize = 6 - self.chart.valueAxis.forceZero = 1 - self.chart.data = [(100, 150, 180), (125, 180, 200)] - self.chart.groupSpacing = 15 - self.chart.valueAxis.avoidBoundFrac = 1 - self.chart.valueAxis.gridEnd = 80 - self.chart.valueAxis.tickDown = 3 - self.chart.valueAxis.visibleGrid = 1 - self.chart.categoryAxis.categoryNames = ['North', 'South', 'Central'] - self.chart.categoryAxis.tickLeft = 3 - self.chart.categoryAxis.labels.fontName = 'Helvetica' - self.chart.categoryAxis.labels.fontSize = 6 - self.chart.categoryAxis.labels.dx = -3 - self._add(self,Label(),name='Title',validate=None,desc="The title at the top of the chart") - self.Title.fontName = 'Helvetica-Bold' - self.Title.fontSize = 7 - self.Title.x = 100 - self.Title.y = 135 - self.Title._text = 'Chart Title' - self.Title.maxWidth = 180 - self.Title.height = 20 - self.Title.textAnchor ='middle' - self._add(self,Legend(),name='Legend',validate=None,desc="The legend or key for the chart") - self.Legend.colorNamePairs = [(color01, 'Widgets'), (color02, 'Sprockets')] - self.Legend.fontName = 'Helvetica' - self.Legend.fontSize = 7 - self.Legend.x = 153 - self.Legend.y = 85 - self.Legend.dxTextSpace = 5 - self.Legend.dy = 5 - self.Legend.dx = 5 - self.Legend.deltay = 5 - self.Legend.alignment ='right' - self._add(self,Label(),name='XLabel',validate=None,desc="The label on the horizontal axis") - self.XLabel.fontName = 'Helvetica' - self.XLabel.fontSize = 7 - self.XLabel.x = 85 - self.XLabel.y = 10 - self.XLabel.textAnchor ='middle' - self.XLabel.maxWidth = 100 - self.XLabel.height = 20 - self.XLabel._text = "X Axis" - self._add(self,Label(),name='YLabel',validate=None,desc="The label on the vertical axis") - self.YLabel.fontName = 'Helvetica' - self.YLabel.fontSize = 7 - self.YLabel.x = 12 - self.YLabel.y = 80 - self.YLabel.angle = 90 - self.YLabel.textAnchor ='middle' - self.YLabel.maxWidth = 100 - self.YLabel.height = 20 - self.YLabel._text = "Y Axis" - self.chart.categoryAxis.style='stacked' - self._add(self,0,name='preview',validate=None,desc=None) - -if __name__=="__main__": #NORUNTESTS - StackedBar().save(formats=['pdf'],outDir=None,fnRoot='stacked_bar') diff --git a/reportlab/graphics/samples/stacked_column.py b/reportlab/graphics/samples/stacked_column.py deleted file mode 100644 index f6028434..00000000 --- a/reportlab/graphics/samples/stacked_column.py +++ /dev/null @@ -1,84 +0,0 @@ -#Autogenerated by ReportLab guiedit do not edit -from reportlab.graphics.charts.legends import Legend -from reportlab.graphics.charts.barcharts import VerticalBarChart -from reportlab.graphics.shapes import Drawing, _DrawingEditorMixin, String -from reportlab.graphics.charts.textlabels import Label -from reportlab.graphics.samples.excelcolors import * - -class StackedColumn(_DrawingEditorMixin,Drawing): - def __init__(self,width=200,height=150,*args,**kw): - Drawing.__init__(self,width,height,*args,**kw) - self._add(self,VerticalBarChart(),name='chart',validate=None,desc="The main chart") - self.chart.width = 115 - self.chart.height = 80 - self.chart.x = 30 - self.chart.y = 40 - self.chart.bars[0].fillColor = color01 - self.chart.bars[1].fillColor = color02 - self.chart.bars[2].fillColor = color03 - self.chart.bars[3].fillColor = color04 - self.chart.bars[4].fillColor = color05 - self.chart.bars[5].fillColor = color06 - self.chart.bars[6].fillColor = color07 - self.chart.bars[7].fillColor = color08 - self.chart.bars[8].fillColor = color09 - self.chart.bars[9].fillColor = color10 - self.chart.fillColor = backgroundGrey - self.chart.barLabels.fontName = 'Helvetica' - self.chart.valueAxis.labels.fontName = 'Helvetica' - self.chart.valueAxis.labels.fontSize = 7 - self.chart.valueAxis.forceZero = 1 - self.chart.data = [(100, 150, 180), (125, 180, 200)] - self.chart.groupSpacing = 15 - self.chart.valueAxis.avoidBoundFrac = 1 - self.chart.valueAxis.gridEnd = 115 - self.chart.valueAxis.tickLeft = 3 - self.chart.valueAxis.visibleGrid = 1 - self.chart.categoryAxis.categoryNames = ['North', 'South', 'Central'] - self.chart.categoryAxis.tickDown = 3 - self.chart.categoryAxis.labels.fontName = 'Helvetica' - self.chart.categoryAxis.labels.fontSize = 7 - self._add(self,Label(),name='Title',validate=None,desc="The title at the top of the chart") - self.Title.fontName = 'Helvetica-Bold' - self.Title.fontSize = 7 - self.Title.x = 100 - self.Title.y = 135 - self.Title._text = 'Chart Title' - self.Title.maxWidth = 180 - self.Title.height = 20 - self.Title.textAnchor ='middle' - self._add(self,Legend(),name='Legend',validate=None,desc="The legend or key for the chart") - self.Legend.colorNamePairs = [(color01, 'Widgets'), (color02, 'Sprockets')] - self.Legend.fontName = 'Helvetica' - self.Legend.fontSize = 7 - self.Legend.x = 153 - self.Legend.y = 85 - self.Legend.dxTextSpace = 5 - self.Legend.dy = 5 - self.Legend.dx = 5 - self.Legend.deltay = 5 - self.Legend.alignment ='right' - self._add(self,Label(),name='XLabel',validate=None,desc="The label on the horizontal axis") - self.XLabel.fontName = 'Helvetica' - self.XLabel.fontSize = 7 - self.XLabel.x = 85 - self.XLabel.y = 10 - self.XLabel.textAnchor ='middle' - self.XLabel.maxWidth = 100 - self.XLabel.height = 20 - self.XLabel._text = "X Axis" - self._add(self,Label(),name='YLabel',validate=None,desc="The label on the vertical axis") - self.YLabel.fontName = 'Helvetica' - self.YLabel.fontSize = 7 - self.YLabel.x = 12 - self.YLabel.y = 80 - self.YLabel.angle = 90 - self.YLabel.textAnchor ='middle' - self.YLabel.maxWidth = 100 - self.YLabel.height = 20 - self.YLabel._text = "Y Axis" - self.chart.categoryAxis.style='stacked' - self._add(self,0,name='preview',validate=None,desc=None) - -if __name__=="__main__": #NORUNTESTS - StackedColumn().save(formats=['pdf'],outDir=None,fnRoot='stacked_column') diff --git a/reportlab/graphics/shapes.py b/reportlab/graphics/shapes.py deleted file mode 100644 index dbdc3541..00000000 --- a/reportlab/graphics/shapes.py +++ /dev/null @@ -1,1467 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/shapes.py - -__version__=''' $Id$ ''' -__doc__='''Core of the graphics library - defines Drawing and Shapes''' - -import os, sys -from math import pi, cos, sin, tan, sqrt -from pprint import pprint - -from reportlab.platypus import Flowable -from reportlab.rl_config import shapeChecking, verbose, defaultGraphicsFontName as _baseGFontName, _unset_, decimalSymbol -from reportlab.lib import logger -from reportlab.lib import colors -from reportlab.lib.validators import * -from reportlab.lib.utils import isSeq, asBytes -isOpacity = NoneOr(isNumberInRange(0,1)) -from reportlab.lib.attrmap import * -from reportlab.lib.rl_accel import fp_str -from reportlab.pdfbase.pdfmetrics import stringWidth -from reportlab.lib.fonts import tt2ps -_baseGFontNameB = tt2ps(_baseGFontName,1,0) -_baseGFontNameI = tt2ps(_baseGFontName,0,1) -_baseGFontNameBI = tt2ps(_baseGFontName,1,1) - -class NotImplementedError(Exception): - pass - -# two constants for filling rules -NON_ZERO_WINDING = 'Non-Zero Winding' -EVEN_ODD = 'Even-Odd' - -## these can be overridden at module level before you start -#creating shapes. So, if using a special color model, -#this provides support for the rendering mechanism. -#you can change defaults globally before you start -#making shapes; one use is to substitute another -#color model cleanly throughout the drawing. - -STATE_DEFAULTS = { # sensible defaults for all - 'transform': (1,0,0,1,0,0), - - # styles follow SVG naming - 'strokeColor': colors.black, - 'strokeWidth': 1, - 'strokeLineCap': 0, - 'strokeLineJoin': 0, - 'strokeMiterLimit' : 10, # don't know yet so let bomb here - 'strokeDashArray': None, - 'strokeOpacity': None, #100% - 'fillOpacity': None, - 'fillOverprint': False, - 'strokeOverprint': False, - 'overprintMask': 0, - - 'fillColor': colors.black, #...or text will be invisible - #'fillRule': NON_ZERO_WINDING, - these can be done later - - 'fontSize': 10, - 'fontName': _baseGFontName, - 'textAnchor': 'start' # can be start, middle, end, inherited - } - - -#################################################################### -# math utilities. These could probably be moved into lib -# somewhere. -#################################################################### - -# constructors for matrices: -def nullTransform(): - return (1, 0, 0, 1, 0, 0) - -def translate(dx, dy): - return (1, 0, 0, 1, dx, dy) - -def scale(sx, sy): - return (sx, 0, 0, sy, 0, 0) - -def rotate(angle): - a = angle * pi/180 - return (cos(a), sin(a), -sin(a), cos(a), 0, 0) - -def skewX(angle): - a = angle * pi/180 - return (1, 0, tan(a), 1, 0, 0) - -def skewY(angle): - a = angle * pi/180 - return (1, tan(a), 0, 1, 0, 0) - -def mmult(A, B): - "A postmultiplied by B" - # I checked this RGB - # [a0 a2 a4] [b0 b2 b4] - # [a1 a3 a5] * [b1 b3 b5] - # [ 1 ] [ 1 ] - # - return (A[0]*B[0] + A[2]*B[1], - A[1]*B[0] + A[3]*B[1], - A[0]*B[2] + A[2]*B[3], - A[1]*B[2] + A[3]*B[3], - A[0]*B[4] + A[2]*B[5] + A[4], - A[1]*B[4] + A[3]*B[5] + A[5]) - -def inverse(A): - "For A affine 2D represented as 6vec return 6vec version of A**(-1)" - # I checked this RGB - det = float(A[0]*A[3] - A[2]*A[1]) - R = [A[3]/det, -A[1]/det, -A[2]/det, A[0]/det] - return tuple(R+[-R[0]*A[4]-R[2]*A[5],-R[1]*A[4]-R[3]*A[5]]) - -def zTransformPoint(A,v): - "Apply the homogenous part of atransformation a to vector v --> A*v" - return (A[0]*v[0]+A[2]*v[1],A[1]*v[0]+A[3]*v[1]) - -def transformPoint(A,v): - "Apply transformation a to vector v --> A*v" - return (A[0]*v[0]+A[2]*v[1]+A[4],A[1]*v[0]+A[3]*v[1]+A[5]) - -def transformPoints(matrix, V): - r = [transformPoint(matrix,v) for v in V] - if isinstance(V,tuple): r = tuple(r) - return r - -def zTransformPoints(matrix, V): - return list(map(lambda x,matrix=matrix: zTransformPoint(matrix,x), V)) - -def _textBoxLimits(text, font, fontSize, leading, textAnchor, boxAnchor): - w = 0 - for t in text: - w = max(w,stringWidth(t,font, fontSize)) - - h = len(text)*leading - yt = fontSize - if boxAnchor[0]=='s': - yb = -h - yt = yt - h - elif boxAnchor[0]=='n': - yb = 0 - else: - yb = -h/2.0 - yt = yt + yb - - if boxAnchor[-1]=='e': - xb = -w - if textAnchor=='end': xt = 0 - elif textAnchor=='start': xt = -w - else: xt = -w/2.0 - elif boxAnchor[-1]=='w': - xb = 0 - if textAnchor=='end': xt = w - elif textAnchor=='start': xt = 0 - else: xt = w/2.0 - else: - xb = -w/2.0 - if textAnchor=='end': xt = -xb - elif textAnchor=='start': xt = xb - else: xt = 0 - - return xb, yb, w, h, xt, yt - -def _rotatedBoxLimits( x, y, w, h, angle): - ''' - Find the corner points of the rotated w x h sized box at x,y - return the corner points and the min max points in the original space - ''' - C = zTransformPoints(rotate(angle),((x,y),(x+w,y),(x+w,y+h),(x,y+h))) - X = [x[0] for x in C] - Y = [x[1] for x in C] - return min(X), max(X), min(Y), max(Y), C - - -class _DrawTimeResizeable: - '''Addin class to provide the horribleness of _drawTimeResize''' - def _drawTimeResize(self,w,h): - if hasattr(self,'_canvas'): - canvas = self._canvas - drawing = canvas._drawing - drawing.width, drawing.height = w, h - if hasattr(canvas,'_drawTimeResize'): - canvas._drawTimeResize(w,h) - -class _SetKeyWordArgs: - def __init__(self, keywords={}): - """In general properties may be supplied to the constructor.""" - for key, value in keywords.items(): - setattr(self, key, value) - - -################################################################# -# -# Helper functions for working out bounds -# -################################################################# - -def getRectsBounds(rectList): - # filter out any None objects, e.g. empty groups - L = [x for x in rectList if x is not None] - if not L: return None - - xMin, yMin, xMax, yMax = L[0] - for (x1, y1, x2, y2) in L[1:]: - if x1 < xMin: - xMin = x1 - if x2 > xMax: - xMax = x2 - if y1 < yMin: - yMin = y1 - if y2 > yMax: - yMax = y2 - return (xMin, yMin, xMax, yMax) - -def _getBezierExtrema(y0,y1,y2,y3): - ''' - this is used to find if a curveTo path operator has extrema in its range - The curveTo operator is defined by the points y0, y1, y2, y3 - - B(t):=(1-t)^3*y0+3*(1-t)^2*t*y1+3*(1-t)*t^2*y2+t^3*y3 - :=t^3*(y3-3*y2+3*y1-y0)+t^2*(3*y2-6*y1+3*y0)+t*(3*y1-3*y0)+y0 - and is a cubic bezier curve. - - The differential is a quadratic - t^2*(3*y3-9*y2+9*y1-3*y0)+t*(6*y2-12*y1+6*y0)+3*y1-3*y0 - - The extrema must be at real roots, r, of the above which lie in 0<=r<=1 - - The quadratic coefficients are - a=3*y3-9*y2+9*y1-3*y0 b=6*y2-12*y1+6*y0 c=3*y1-3*y0 - or - a=y3-3*y2+3*y1-y0 b=2*y2-4*y1+2*y0 c=y1-y0 (remove common factor of 3) - or - a=y3-3*(y2-y1)-y0 b=2*(y2-2*y1+y0) c=y1-y0 - - The returned value is [y0,x1,x2,y3] where if found x1, x2 are any extremals that were found; - there can be 0, 1 or 2 extremals - ''' - a=y3-3*(y2-y1)-y0 - b=2*(y2-2*y1+y0) - c=y1-y0 - Y = [y0] #the set of points - - #standard method to find roots of quadratic - d = b*b - 4*a*c - if d>=0: - d = sqrt(d) - if b<0: d = -d - q = -0.5*(b+d) - R = [] - try: - R.append(q/a) - except: - pass - try: - R.append(c/q) - except: - pass - b *= 1.5 - c *= 3 - for t in R: - if 0<=t<=1: - #real root in range evaluate spline there and add to X - Y.append(t*(t*(t*a+b)+c)+y0) - Y.append(y3) - return Y - -def getPathBounds(points): - n = len(points) - f = lambda i,p = points: p[i] - xs = list(map(f,range(0,n,2))) - ys = list(map(f,range(1,n,2))) - return (min(xs), min(ys), max(xs), max(ys)) - -def getPointsBounds(pointList): - "Helper function for list of points" - first = pointList[0] - if isSeq(first): - xs = [xy[0] for xy in pointList] - ys = [xy[1] for xy in pointList] - return (min(xs), min(ys), max(xs), max(ys)) - else: - return getPathBounds(pointList) - -################################################################# -# -# And now the shapes themselves.... -# -################################################################# -class Shape(_SetKeyWordArgs,_DrawTimeResizeable): - """Base class for all nodes in the tree. Nodes are simply - packets of data to be created, stored, and ultimately - rendered - they don't do anything active. They provide - convenience methods for verification but do not - check attribiute assignments or use any clever setattr - tricks this time.""" - _attrMap = AttrMap() - - def copy(self): - """Return a clone of this shape.""" - - # implement this in the descendants as they need the right init methods. - raise NotImplementedError("No copy method implemented for %s" % self.__class__.__name__) - - def getProperties(self,recur=1): - """Interface to make it easy to extract automatic - documentation""" - - #basic nodes have no children so this is easy. - #for more complex objects like widgets you - #may need to override this. - props = {} - for key, value in self.__dict__.items(): - if key[0:1] != '_': - props[key] = value - return props - - def setProperties(self, props): - """Supports the bulk setting if properties from, - for example, a GUI application or a config file.""" - - self.__dict__.update(props) - #self.verify() - - def dumpProperties(self, prefix=""): - """Convenience. Lists them on standard output. You - may provide a prefix - mostly helps to generate code - samples for documentation.""" - - propList = list(self.getProperties().items()) - propList.sort() - if prefix: - prefix = prefix + '.' - for (name, value) in propList: - print('%s%s = %s' % (prefix, name, value)) - - def verify(self): - """If the programmer has provided the optional - _attrMap attribute, this checks all expected - attributes are present; no unwanted attributes - are present; and (if a checking function is found) - checks each attribute. Either succeeds or raises - an informative exception.""" - - if self._attrMap is not None: - for key in self.__dict__.keys(): - if key[0] != '_': - assert key in self._attrMap, "Unexpected attribute %s found in %s" % (key, self) - for attr, metavalue in self._attrMap.items(): - assert hasattr(self, attr), "Missing attribute %s from %s" % (attr, self) - value = getattr(self, attr) - assert metavalue.validate(value), "Invalid value %s for attribute %s in class %s" % (value, attr, self.__class__.__name__) - - if shapeChecking: - """This adds the ability to check every attribute assignment as it is made. - It slows down shapes but is a big help when developing. It does not - get defined if rl_config.shapeChecking = 0""" - def __setattr__(self, attr, value): - """By default we verify. This could be off - in some parallel base classes.""" - validateSetattr(self,attr,value) #from reportlab.lib.attrmap - - def getBounds(self): - "Returns bounding rectangle of object as (x1,y1,x2,y2)" - raise NotImplementedError("Shapes and widgets must implement getBounds") - -class Group(Shape): - """Groups elements together. May apply a transform - to its contents. Has a publicly accessible property - 'contents' which may be used to iterate over contents. - In addition, child nodes may be given a name in which - case they are subsequently accessible as properties.""" - - _attrMap = AttrMap( - transform = AttrMapValue(isTransform,desc="Coordinate transformation to apply",advancedUsage=1), - contents = AttrMapValue(isListOfShapes,desc="Contained drawable elements"), - strokeOverprint = AttrMapValue(isBoolean,desc='Turn on stroke overprinting'), - fillOverprint = AttrMapValue(isBoolean,desc='Turn on fill overprinting',advancedUsage=1), - overprintMask = AttrMapValue(isBoolean,desc='overprinting for ordinary CMYK',advancedUsage=1), - ) - - def __init__(self, *elements, **keywords): - """Initial lists of elements may be provided to allow - compact definitions in literal Python code. May or - may not be useful.""" - - # Groups need _attrMap to be an instance rather than - # a class attribute, as it may be extended at run time. - self._attrMap = self._attrMap.clone() - self.contents = [] - self.transform = (1,0,0,1,0,0) - for elt in elements: - self.add(elt) - # this just applies keywords; do it at the end so they - #don;t get overwritten - _SetKeyWordArgs.__init__(self, keywords) - - def _addNamedNode(self,name,node): - 'if name is not None add an attribute pointing to node and add to the attrMap' - if name: - if name not in list(self._attrMap.keys()): - self._attrMap[name] = AttrMapValue(isValidChild) - setattr(self, name, node) - - def add(self, node, name=None): - """Appends non-None child node to the 'contents' attribute. In addition, - if a name is provided, it is subsequently accessible by name - """ - # propagates properties down - if node is not None: - assert isValidChild(node), "Can only add Shape or UserNode objects to a Group" - self.contents.append(node) - self._addNamedNode(name,node) - - def _nn(self,node): - self.add(node) - return self.contents[-1] - - def insert(self, i, n, name=None): - 'Inserts sub-node n in contents at specified location' - if n is not None: - assert isValidChild(n), "Can only insert Shape or UserNode objects in a Group" - if i<0: - self.contents[i:i] =[n] - else: - self.contents.insert(i,n) - self._addNamedNode(name,n) - - def expandUserNodes(self): - """Return a new object which only contains primitive shapes.""" - - # many limitations - shared nodes become multiple ones, - obj = isinstance(self,Drawing) and Drawing(self.width,self.height) or Group() - obj._attrMap = self._attrMap.clone() - if hasattr(obj,'transform'): obj.transform = self.transform[:] - - self_contents = self.contents - a = obj.contents.append - for child in self_contents: - if isinstance(child, UserNode): - newChild = child.provideNode() - elif isinstance(child, Group): - newChild = child.expandUserNodes() - else: - newChild = child.copy() - a(newChild) - - self._copyNamedContents(obj) - return obj - - def _explode(self): - ''' return a fully expanded object''' - from reportlab.graphics.widgetbase import Widget - obj = Group() - if hasattr(obj,'transform'): obj.transform = self.transform[:] - P = self.contents[:] # pending nodes - while P: - n = P.pop(0) - if isinstance(n, UserNode): - P.append(n.provideNode()) - elif isinstance(n, Group): - n = n._explode() - if n.transform==(1,0,0,1,0,0): - obj.contents.extend(n.contents) - else: - obj.add(n) - else: - obj.add(n) - return obj - - def _copyContents(self,obj): - for child in self.contents: - obj.contents.append(child) - - def _copyNamedContents(self,obj,aKeys=None,noCopy=('contents',)): - from copy import copy - self_contents = self.contents - if not aKeys: aKeys = list(self._attrMap.keys()) - for k, v in self.__dict__.items(): - if v in self_contents: - pos = self_contents.index(v) - setattr(obj, k, obj.contents[pos]) - elif k in aKeys and k not in noCopy: - setattr(obj, k, copy(v)) - - def _copy(self,obj): - """copies to obj""" - obj._attrMap = self._attrMap.clone() - self._copyContents(obj) - self._copyNamedContents(obj) - return obj - - def copy(self): - """returns a copy""" - return self._copy(self.__class__()) - - def rotate(self, theta): - """Convenience to help you set transforms""" - self.transform = mmult(self.transform, rotate(theta)) - - def translate(self, dx, dy): - """Convenience to help you set transforms""" - self.transform = mmult(self.transform, translate(dx, dy)) - - def scale(self, sx, sy): - """Convenience to help you set transforms""" - self.transform = mmult(self.transform, scale(sx, sy)) - - - def skew(self, kx, ky): - """Convenience to help you set transforms""" - self.transform = mmult(mmult(self.transform, skewX(kx)),skewY(ky)) - - def shift(self, x, y): - '''Convenience function to set the origin arbitrarily''' - self.transform = self.transform[:-2]+(x,y) - - def asDrawing(self, width, height): - """ Convenience function to make a drawing from a group - After calling this the instance will be a drawing! - """ - self.__class__ = Drawing - self._attrMap.update(self._xtraAttrMap) - self.width = width - self.height = height - - def getContents(self): - '''Return the list of things to be rendered - override to get more complicated behaviour''' - b = getattr(self,'background',None) - C = self.contents - if b and b not in C: C = [b]+C - return C - - def getBounds(self): - if self.contents: - b = [] - for elem in self.contents: - b.append(elem.getBounds()) - x1 = getRectsBounds(b) - if x1 is None: return None - x1, y1, x2, y2 = x1 - trans = self.transform - corners = [[x1,y1], [x1, y2], [x2, y1], [x2,y2]] - newCorners = [] - for corner in corners: - newCorners.append(transformPoint(trans, corner)) - return getPointsBounds(newCorners) - else: - #empty group needs a sane default; this - #will happen when interactively creating a group - #nothing has been added to yet. The alternative is - #to handle None as an allowed return value everywhere. - return None - -def _addObjImport(obj,I,n=None): - '''add an import of obj's class to a dictionary of imports''' #' - from inspect import getmodule - c = obj.__class__ - m = getmodule(c).__name__ - n = n or c.__name__ - if m not in I: - I[m] = [n] - elif n not in I[m]: - I[m].append(n) - -def _repr(self,I=None): - '''return a repr style string with named fixed args first, then keywords''' - if isinstance(self,float): - return fp_str(self) - elif isSeq(self): - s = '' - for v in self: - s = s + '%s,' % _repr(v,I) - if isinstance(self,list): - return '[%s]' % s[:-1] - else: - return '(%s%s)' % (s[:-1],len(self)==1 and ',' or '') - elif self is EmptyClipPath: - if I: _addObjImport(self,I,'EmptyClipPath') - return 'EmptyClipPath' - elif isinstance(self,Shape): - if I: _addObjImport(self,I) - from inspect import getargs - args, varargs, varkw = getargs(self.__init__.__func__.__code__) - P = self.getProperties() - s = self.__class__.__name__+'(' - for n in args[1:]: - v = P[n] - del P[n] - s = s + '%s,' % _repr(v,I) - for n,v in P.items(): - v = P[n] - s = s + '%s=%s,' % (n, _repr(v,I)) - return s[:-1]+')' - else: - return repr(self) - -def _renderGroupPy(G,pfx,I,i=0,indent='\t\t'): - s = '' - C = getattr(G,'transform',None) - if C: s = s + ('%s%s.transform = %s\n' % (indent,pfx,_repr(C))) - C = G.contents - for n in C: - if isinstance(n, Group): - npfx = 'v%d' % i - i = i + 1 - s = s + '%s%s=%s._nn(Group())\n' % (indent,npfx,pfx) - s = s + _renderGroupPy(n,npfx,I,i,indent) - i = i - 1 - else: - s = s + '%s%s.add(%s)\n' % (indent,pfx,_repr(n,I)) - return s - -def _extraKW(self,pfx,**kw): - kw.update(self.__dict__) - R = {} - n = len(pfx) - for k in kw.keys(): - if k.startswith(pfx): - R[k[n:]] = kw[k] - return R - -class Drawing(Group, Flowable): - """Outermost container; the thing a renderer works on. - This has no properties except a height, width and list - of contents.""" - - _saveModes=( - 'pdf','ps','eps','gif','png','jpg','jpeg','pct', - 'pict','tiff','tif','py','bmp','svg','tiffp','tiffl','tiff1', - ) - - _xtraAttrMap = AttrMap( - width = AttrMapValue(isNumber,desc="Drawing width in points."), - height = AttrMapValue(isNumber,desc="Drawing height in points."), - canv = AttrMapValue(None), - background = AttrMapValue(isValidChildOrNone,desc="Background widget for the drawing e.g. Rect(0,0,width,height)"), - hAlign = AttrMapValue(OneOf("LEFT", "RIGHT", "CENTER", "CENTRE"), desc="Horizontal alignment within parent document"), - vAlign = AttrMapValue(OneOf("TOP", "BOTTOM", "CENTER", "CENTRE"), desc="Vertical alignment within parent document"), - #AR temporary hack to track back up. - #fontName = AttrMapValue(isStringOrNone), - renderScale = AttrMapValue(isNumber,desc="Global scaling for rendering"), - ) - - _attrMap = AttrMap(BASE=Group, - formats = AttrMapValue(SequenceOf( - OneOf('pdf','gif','png','tif','jpg','tiff','pct','pict', - 'bmp','tiffp','tiffl','tiff1','eps','svg','ps','py'), - lo=1,emptyOK=0), desc='One or more plot modes'), - ) - _attrMap.update(_xtraAttrMap) - - def __init__(self, width=400, height=200, *nodes, **keywords): - self.background = None - Group.__init__(self,*nodes,**keywords) - self.width = width - self.height = height - self.hAlign = 'LEFT' - self.vAlign = 'BOTTOM' - self.renderScale = 1.0 - - def _renderPy(self): - I = {'reportlab.graphics.shapes': ['_DrawingEditorMixin','Drawing','Group']} - G = _renderGroupPy(self._explode(),'self',I) - n = 'ExplodedDrawing_' + self.__class__.__name__ - s = '#Autogenerated by ReportLab guiedit do not edit\n' - for m, o in I.items(): - s = s + 'from %s import %s\n' % (m,str(o)[1:-1].replace("'","")) - s = s + '\nclass %s(_DrawingEditorMixin,Drawing):\n' % n - s = s + '\tdef __init__(self,width=%s,height=%s,*args,**kw):\n' % (self.width,self.height) - s = s + '\t\tDrawing.__init__(self,width,height,*args,**kw)\n' - s = s + G - s = s + '\n\nif __name__=="__main__": #NORUNTESTS\n\t%s().save(formats=[\'pdf\'],outDir=\'.\',fnRoot=None)\n' % n - return s - - def draw(self,showBoundary=_unset_): - """This is used by the Platypus framework to let the document - draw itself in a story. It is specific to PDF and should not - be used directly.""" - from reportlab.graphics import renderPDF - renderPDF.draw(self, self.canv, 0, 0, showBoundary=showBoundary) - - def wrap(self, availWidth, availHeight): - width = self.width - height = self.height - renderScale = self.renderScale - if renderScale!=1.0: - width *= renderScale - height *= renderScale - return width, height - - def expandUserNodes(self): - """Return a new drawing which only contains primitive shapes.""" - obj = Group.expandUserNodes(self) - obj.width = self.width - obj.height = self.height - return obj - - def copy(self): - """Returns a copy""" - return self._copy(self.__class__(self.width, self.height)) - - def asGroup(self,*args,**kw): - return self._copy(Group(*args,**kw)) - - def save(self, formats=None, verbose=None, fnRoot=None, outDir=None, title='', **kw): - """Saves copies of self in desired location and formats. - Multiple formats can be supported in one call - - the extra keywords can be of the form - _renderPM_dpi=96 (which passes dpi=96 to renderPM) - """ - genFmt = kw.pop('seqNumber','') - if isinstance(genFmt,int): - genFmt = '%4d: ' % genFmt - else: - genFmt = '' - genFmt += 'generating %s file %s' - from reportlab import rl_config - ext = '' - if not fnRoot: - fnRoot = getattr(self,'fileNamePattern',(self.__class__.__name__+'%03d')) - chartId = getattr(self,'chartId',0) - if hasattr(chartId,'__call__'): - chartId = chartId(self) - if hasattr(fnRoot,'__call__'): - fnRoot = fnRoot(chartId) - else: - try: - fnRoot = fnRoot % chartId - except TypeError as err: - #the exact error message changed from 2.2 to 2.3 so we need to - #check a substring - if str(err).find('not all arguments converted') < 0: raise - - if os.path.isabs(fnRoot): - outDir, fnRoot = os.path.split(fnRoot) - else: - outDir = outDir or getattr(self,'outDir','.') - outDir = outDir.rstrip().rstrip(os.sep) - if not outDir: outDir = '.' - if not os.path.isabs(outDir): outDir = os.path.join(getattr(self,'_override_CWD',os.path.dirname(sys.argv[0])),outDir) - if not os.path.isdir(outDir): os.makedirs(outDir) - fnroot = os.path.normpath(os.path.join(outDir,fnRoot)) - plotMode = os.path.splitext(fnroot) - if plotMode[1][1:].lower() in self._saveModes: - fnroot = plotMode[0] - - plotMode = [x.lower() for x in (formats or getattr(self,'formats',['pdf']))] - verbose = (verbose is not None and (verbose,) or (getattr(self,'verbose',verbose),))[0] - _saved = logger.warnOnce.enabled, logger.infoOnce.enabled - logger.warnOnce.enabled = logger.infoOnce.enabled = verbose - if 'pdf' in plotMode: - from reportlab.graphics import renderPDF - filename = fnroot+'.pdf' - if verbose: print(genFmt % ('PDF',filename)) - renderPDF.drawToFile(self, filename, title, showBoundary=getattr(self,'showBorder',rl_config.showBoundary),**_extraKW(self,'_renderPDF_',**kw)) - ext = ext + '/.pdf' - if sys.platform=='mac': - import macfs, macostools - macfs.FSSpec(filename).SetCreatorType("CARO", "PDF ") - macostools.touched(filename) - - for bmFmt in ('gif','png','tif','jpg','tiff','pct','pict', 'bmp','tiffp','tiffl','tiff1'): - if bmFmt in plotMode: - from reportlab.graphics import renderPM - filename = '%s.%s' % (fnroot,bmFmt) - if verbose: print(genFmt % (bmFmt,filename)) - dtc = getattr(self,'_drawTimeCollector',None) - if dtc: - dtcfmts = getattr(dtc,'formats',[bmFmt]) - if bmFmt in dtcfmts and not getattr(dtc,'disabled',0): - dtc.clear() - else: - dtc = None - renderPM.drawToFile(self, filename,fmt=bmFmt,showBoundary=getattr(self,'showBorder',rl_config.showBoundary),**_extraKW(self,'_renderPM_',**kw)) - ext = ext + '/.' + bmFmt - if dtc: dtc.save(filename) - - if 'eps' in plotMode: - try: - from rlextra.graphics import renderPS_SEP as renderPS - except ImportError: - from reportlab.graphics import renderPS - filename = fnroot+'.eps' - if verbose: print(genFmt % ('EPS',filename)) - renderPS.drawToFile(self, - filename, - title = fnroot, - dept = getattr(self,'EPS_info',['Testing'])[0], - company = getattr(self,'EPS_info',['','ReportLab'])[1], - preview = getattr(self,'preview',rl_config.eps_preview), - showBoundary=getattr(self,'showBorder',rl_config.showBoundary), - ttf_embed=getattr(self,'ttf_embed',rl_config.eps_ttf_embed), - **_extraKW(self,'_renderPS_',**kw)) - ext = ext + '/.eps' - - if 'svg' in plotMode: - from reportlab.graphics import renderSVG - filename = fnroot+'.svg' - if verbose: print(genFmt % ('SVG',filename)) - renderSVG.drawToFile(self, - filename, - showBoundary=getattr(self,'showBorder',rl_config.showBoundary),**_extraKW(self,'_renderSVG_',**kw)) - ext = ext + '/.svg' - - if 'ps' in plotMode: - from reportlab.graphics import renderPS - filename = fnroot+'.ps' - if verbose: print(genFmt % ('EPS',filename)) - renderPS.drawToFile(self, filename, showBoundary=getattr(self,'showBorder',rl_config.showBoundary),**_extraKW(self,'_renderPS_',**kw)) - ext = ext + '/.ps' - - if 'py' in plotMode: - filename = fnroot+'.py' - if verbose: print(genFmt % ('py',filename)) - open(filename,'wb').write(asBytes(self._renderPy().replace('\n',os.linesep))) - ext = ext + '/.py' - - logger.warnOnce.enabled, logger.infoOnce.enabled = _saved - if hasattr(self,'saveLogger'): - self.saveLogger(fnroot,ext) - return ext and fnroot+ext[1:] or '' - - def asString(self, format, verbose=None, preview=0, **kw): - """Converts to an 8 bit string in given format.""" - assert format in ('pdf','ps','eps','gif','png','jpg','jpeg','bmp','ppm','tiff','tif','py','pict','pct','tiffp','tiffl','tiff1'), 'Unknown file format "%s"' % format - from reportlab import rl_config - #verbose = verbose is not None and (verbose,) or (getattr(self,'verbose',verbose),)[0] - if format == 'pdf': - from reportlab.graphics import renderPDF - return renderPDF.drawToString(self) - elif format in ('gif','png','tif','tiff','jpg','pct','pict','bmp','ppm','tiffp','tiffl','tiff1'): - from reportlab.graphics import renderPM - return renderPM.drawToString(self, fmt=format,showBoundary=getattr(self,'showBorder', - rl_config.showBoundary),**_extraKW(self,'_renderPM_',**kw)) - elif format == 'eps': - try: - from rlextra.graphics import renderPS_SEP as renderPS - except ImportError: - from reportlab.graphics import renderPS - - return renderPS.drawToString(self, - preview = preview, - showBoundary=getattr(self,'showBorder',rl_config.showBoundary)) - elif format == 'ps': - from reportlab.graphics import renderPS - return renderPS.drawToString(self, showBoundary=getattr(self,'showBorder',rl_config.showBoundary)) - elif format == 'py': - return self._renderPy() - - def resized(self,kind='fit',lpad=0,rpad=0,bpad=0,tpad=0): - '''return a base class drawing which ensures all the contents fits''' - C = self.getContents() - oW = self.width - oH = self.height - drawing = Drawing(oW,oH,*C) - xL,yL,xH,yH = drawing.getBounds() - if kind=='fit' or (kind=='expand' and (xLoW-rpad or yLoH-tpad)): - drawing.width = xH-xL+lpad+rpad - drawing.height = yH-yL+tpad+bpad - drawing.transform = (1,0,0,1,lpad-xL,bpad-yL) - elif kind=='fitx' or (kind=='expandx' and (xLoW-rpad)): - drawing.width = xH-xL+lpad+rpad - drawing.transform = (1,0,0,1,lpad-xL,0) - elif kind=='fity' or (kind=='expandy' and (yLoH-tpad)): - drawing.height = yH-yL+tpad+bpad - drawing.transform = (1,0,0,1,0,bpad-yL) - return drawing - -class _DrawingEditorMixin: - '''This is a mixin to provide functionality for edited drawings''' - def _add(self,obj,value,name=None,validate=None,desc=None,pos=None): - ''' - effectively setattr(obj,name,value), but takes care of things with _attrMaps etc - ''' - ivc = isValidChild(value) - if name and hasattr(obj,'_attrMap'): - if '_attrMap' not in obj.__dict__: - obj._attrMap = obj._attrMap.clone() - if ivc and validate is None: validate = isValidChild - obj._attrMap[name] = AttrMapValue(validate,desc) - if hasattr(obj,'add') and ivc: - if pos: - obj.insert(pos,value,name) - else: - obj.add(value,name) - elif name: - setattr(obj,name,value) - else: - raise ValueError("Can't add, need name") - -class LineShape(Shape): - # base for types of lines - - _attrMap = AttrMap( - strokeColor = AttrMapValue(isColorOrNone), - strokeWidth = AttrMapValue(isNumber), - strokeLineCap = AttrMapValue(OneOf(0,1,2),desc="Line cap 0=butt, 1=round & 2=square"), - strokeLineJoin = AttrMapValue(OneOf(0,1,2),desc="Line join 0=miter, 1=round & 2=bevel"), - strokeMiterLimit = AttrMapValue(isNumber,desc="miter limit control miter line joins"), - strokeDashArray = AttrMapValue(isListOfNumbersOrNone,desc="a sequence of numbers represents on and off, e.g. (2,1)"), - strokeOpacity = AttrMapValue(isOpacity,desc="The level of transparency of the line, any real number betwen 0 and 1"), - strokeOverprint = AttrMapValue(isBoolean,desc='Turn on stroke overprinting'), - overprintMask = AttrMapValue(isBoolean,desc='overprinting for ordinary CMYK',advancedUsage=1), - ) - - def __init__(self, kw): - self.strokeColor = STATE_DEFAULTS['strokeColor'] - self.strokeWidth = 1 - self.strokeLineCap = 0 - self.strokeLineJoin = 0 - self.strokeMiterLimit = 0 - self.strokeDashArray = None - self.strokeOpacity = None - self.setProperties(kw) - - -class Line(LineShape): - _attrMap = AttrMap(BASE=LineShape, - x1 = AttrMapValue(isNumber,desc=""), - y1 = AttrMapValue(isNumber,desc=""), - x2 = AttrMapValue(isNumber,desc=""), - y2 = AttrMapValue(isNumber,desc=""), - ) - - def __init__(self, x1, y1, x2, y2, **kw): - LineShape.__init__(self, kw) - self.x1 = x1 - self.y1 = y1 - self.x2 = x2 - self.y2 = y2 - - def getBounds(self): - "Returns bounding rectangle of object as (x1,y1,x2,y2)" - return (self.x1, self.y1, self.x2, self.y2) - -class SolidShape(LineShape): - # base for anything with outline and content - - _attrMap = AttrMap(BASE=LineShape, - fillColor = AttrMapValue(isColorOrNone,desc="filling color of the shape, e.g. red"), - fillOpacity = AttrMapValue(isOpacity,desc="the level of transparency of the color, any real number between 0 and 1"), - fillOverprint = AttrMapValue(isBoolean,desc='Turn on fill overprinting'), - overprintMask = AttrMapValue(isBoolean,desc='overprinting for ordinary CMYK',advancedUsage=1), - ) - - def __init__(self, kw): - self.fillColor = STATE_DEFAULTS['fillColor'] - self.fillOpacity = None - # do this at the end so keywords overwrite - #the above settings - LineShape.__init__(self, kw) - - -# path operator constants -_MOVETO, _LINETO, _CURVETO, _CLOSEPATH = list(range(4)) -_PATH_OP_ARG_COUNT = (2, 2, 6, 0) # [moveTo, lineTo, curveTo, closePath] -_PATH_OP_NAMES=['moveTo','lineTo','curveTo','closePath'] - -def _renderPath(path, drawFuncs): - """Helper function for renderers.""" - # this could be a method of Path... - points = path.points - i = 0 - hadClosePath = 0 - hadMoveTo = 0 - for op in path.operators: - nArgs = _PATH_OP_ARG_COUNT[op] - func = drawFuncs[op] - j = i + nArgs - func(*points[i:j]) - i = j - if op == _CLOSEPATH: - hadClosePath = hadClosePath + 1 - if op == _MOVETO: - hadMoveTo += 1 - return hadMoveTo == hadClosePath - -class Path(SolidShape): - """Path, made up of straight lines and bezier curves.""" - - _attrMap = AttrMap(BASE=SolidShape, - points = AttrMapValue(isListOfNumbers), - operators = AttrMapValue(isListOfNumbers), - isClipPath = AttrMapValue(isBoolean), - ) - - def __init__(self, points=None, operators=None, isClipPath=0, **kw): - SolidShape.__init__(self, kw) - if points is None: - points = [] - if operators is None: - operators = [] - assert len(points) % 2 == 0, 'Point list must have even number of elements!' - self.points = points - self.operators = operators - self.isClipPath = isClipPath - - def copy(self): - new = self.__class__(self.points[:], self.operators[:]) - new.setProperties(self.getProperties()) - return new - - def moveTo(self, x, y): - self.points.extend([x, y]) - self.operators.append(_MOVETO) - - def lineTo(self, x, y): - self.points.extend([x, y]) - self.operators.append(_LINETO) - - def curveTo(self, x1, y1, x2, y2, x3, y3): - self.points.extend([x1, y1, x2, y2, x3, y3]) - self.operators.append(_CURVETO) - - def closePath(self): - self.operators.append(_CLOSEPATH) - - def getBounds(self): - points = self.points - try: #in case this complex algorithm is not yet ready :) - X = [] - aX = X.append - eX = X.extend - Y=[] - aY = Y.append - eY = Y.extend - i = 0 - for op in self.operators: - nArgs = _PATH_OP_ARG_COUNT[op] - j = i + nArgs - if nArgs==2: - #either moveTo or lineT0 - aX(points[i]) - aY(points[i+1]) - elif nArgs==6: - #curveTo - x1,x2,x3 = points[i:j:2] - eX(_getBezierExtrema(X[-1],x1,x2,x3)) - y1,y2,y3 = points[i+1:j:2] - eY(_getBezierExtrema(Y[-1],y1,y2,y3)) - i = j - return min(X),min(Y),max(X),max(Y) - except: - return getPathBounds(points) - -EmptyClipPath=Path() #special path - -def getArcPoints(centerx, centery, radius, startangledegrees, endangledegrees, yradius=None, degreedelta=None, reverse=None): - if yradius is None: yradius = radius - points = [] - from math import sin, cos, pi - degreestoradians = pi/180.0 - startangle = startangledegrees*degreestoradians - endangle = endangledegrees*degreestoradians - while endangle.001: - degreedelta = min(angle,degreedelta or 1.) - radiansdelta = degreedelta*degreestoradians - n = max(int(angle/radiansdelta+0.5),1) - radiansdelta = angle/n - n += 1 - else: - n = 1 - radiansdelta = 0 - - for angle in range(n): - angle = startangle+angle*radiansdelta - a((centerx+radius*cos(angle),centery+yradius*sin(angle))) - - if reverse: points.reverse() - return points - -class ArcPath(Path): - '''Path with an addArc method''' - def addArc(self, centerx, centery, radius, startangledegrees, endangledegrees, yradius=None, degreedelta=None, moveTo=None, reverse=None): - P = getArcPoints(centerx, centery, radius, startangledegrees, endangledegrees, yradius=yradius, degreedelta=degreedelta, reverse=reverse) - if moveTo or not len(self.operators): - self.moveTo(P[0][0],P[0][1]) - del P[0] - for x, y in P: self.lineTo(x,y) - -def definePath(pathSegs=[],isClipPath=0, dx=0, dy=0, **kw): - O = [] - P = [] - for seg in pathSegs: - if not isSeq(seg): - opName = seg - args = [] - else: - opName = seg[0] - args = seg[1:] - if opName not in _PATH_OP_NAMES: - raise ValueError('bad operator name %s' % opName) - op = _PATH_OP_NAMES.index(opName) - if len(args)!=_PATH_OP_ARG_COUNT[op]: - raise ValueError('%s bad arguments %s' % (opName,str(args))) - O.append(op) - P.extend(list(args)) - for d,o in (dx,0), (dy,1): - for i in range(o,len(P),2): - P[i] = P[i]+d - return Path(P,O,isClipPath,**kw) - -class Rect(SolidShape): - """Rectangle, possibly with rounded corners.""" - - _attrMap = AttrMap(BASE=SolidShape, - x = AttrMapValue(isNumber), - y = AttrMapValue(isNumber), - width = AttrMapValue(isNumber,desc="width of the object in points"), - height = AttrMapValue(isNumber,desc="height of the objects in points"), - rx = AttrMapValue(isNumber), - ry = AttrMapValue(isNumber), - ) - - def __init__(self, x, y, width, height, rx=0, ry=0, **kw): - SolidShape.__init__(self, kw) - self.x = x - self.y = y - self.width = width - self.height = height - self.rx = rx - self.ry = ry - - def copy(self): - new = self.__class__(self.x, self.y, self.width, self.height) - new.setProperties(self.getProperties()) - return new - - def getBounds(self): - return (self.x, self.y, self.x + self.width, self.y + self.height) - - -class Image(SolidShape): - """Bitmap image.""" - - _attrMap = AttrMap(BASE=SolidShape, - x = AttrMapValue(isNumber), - y = AttrMapValue(isNumber), - width = AttrMapValue(isNumberOrNone,desc="width of the object in points"), - height = AttrMapValue(isNumberOrNone,desc="height of the objects in points"), - path = AttrMapValue(None), - ) - - def __init__(self, x, y, width, height, path, **kw): - SolidShape.__init__(self, kw) - self.x = x - self.y = y - self.width = width - self.height = height - self.path = path - - def copy(self): - new = self.__class__(self.x, self.y, self.width, self.height, self.path) - new.setProperties(self.getProperties()) - return new - - def getBounds(self): - # bug fix contributed by Marcel Tromp - return (self.x, self.y, self.x + self.width, self.y + self.height) - -class Circle(SolidShape): - - _attrMap = AttrMap(BASE=SolidShape, - cx = AttrMapValue(isNumber,desc="x of the centre"), - cy = AttrMapValue(isNumber,desc="y of the centre"), - r = AttrMapValue(isNumber,desc="radius in points"), - ) - - def __init__(self, cx, cy, r, **kw): - SolidShape.__init__(self, kw) - self.cx = cx - self.cy = cy - self.r = r - - def copy(self): - new = self.__class__(self.cx, self.cy, self.r) - new.setProperties(self.getProperties()) - return new - - def getBounds(self): - return (self.cx - self.r, self.cy - self.r, self.cx + self.r, self.cy + self.r) - -class Ellipse(SolidShape): - _attrMap = AttrMap(BASE=SolidShape, - cx = AttrMapValue(isNumber,desc="x of the centre"), - cy = AttrMapValue(isNumber,desc="y of the centre"), - rx = AttrMapValue(isNumber,desc="x radius"), - ry = AttrMapValue(isNumber,desc="y radius"), - ) - - def __init__(self, cx, cy, rx, ry, **kw): - SolidShape.__init__(self, kw) - self.cx = cx - self.cy = cy - self.rx = rx - self.ry = ry - - def copy(self): - new = self.__class__(self.cx, self.cy, self.rx, self.ry) - new.setProperties(self.getProperties()) - return new - - def getBounds(self): - return (self.cx - self.rx, self.cy - self.ry, self.cx + self.rx, self.cy + self.ry) - -class Wedge(SolidShape): - """A "slice of a pie" by default translates to a polygon moves anticlockwise - from start angle to end angle""" - - _attrMap = AttrMap(BASE=SolidShape, - centerx = AttrMapValue(isNumber,desc="x of the centre"), - centery = AttrMapValue(isNumber,desc="y of the centre"), - radius = AttrMapValue(isNumber,desc="radius in points"), - startangledegrees = AttrMapValue(isNumber), - endangledegrees = AttrMapValue(isNumber), - yradius = AttrMapValue(isNumberOrNone), - radius1 = AttrMapValue(isNumberOrNone), - yradius1 = AttrMapValue(isNumberOrNone), - annular = AttrMapValue(isBoolean,desc='treat as annular ring'), - ) - - degreedelta = 1 # jump every 1 degrees - - def __init__(self, centerx, centery, radius, startangledegrees, endangledegrees, yradius=None, - annular=False, **kw): - SolidShape.__init__(self, kw) - while endangledegrees0.001: - degreedelta = min(self.degreedelta or 1.,angle) - radiansdelta = degreedelta*degreestoradians - n = max(1,int(angle/radiansdelta+0.5)) - radiansdelta = angle/n - n += 1 - else: - n = 1 - radiansdelta = 0 - CA = [] - CAA = CA.append - a = points.append - for angle in xrange(n): - angle = startangle+angle*radiansdelta - CAA((cos(angle),sin(angle))) - for c,s in CA: - a(centerx+radius*c) - a(centery+yradius*s) - if (radius1==0 or radius1 is None) and (yradius1==0 or yradius1 is None): - a(centerx); a(centery) - else: - CA.reverse() - for c,s in CA: - a(centerx+radius1*c) - a(centery+yradius1*s) - if self.annular: - P = Path() - P.moveTo(points[0],points[1]) - for x in xrange(2,2*n,2): - P.lineTo(points[x],points[x+1]) - P.closePath() - P.moveTo(points[2*n],points[2*n+1]) - for x in xrange(2*n+2,4*n,2): - P.lineTo(points[x],points[x+1]) - P.closePath() - return P - else: - return Polygon(points) - - def copy(self): - new = self.__class__(self.centerx, - self.centery, - self.radius, - self.startangledegrees, - self.endangledegrees) - new.setProperties(self.getProperties()) - return new - - def getBounds(self): - return self.asPolygon().getBounds() - -class Polygon(SolidShape): - """Defines a closed shape; Is implicitly - joined back to the start for you.""" - - _attrMap = AttrMap(BASE=SolidShape, - points = AttrMapValue(isListOfNumbers,desc="list of numbers in the form x1, y1, x2, y2 ... xn, yn"), - ) - - def __init__(self, points=[], **kw): - SolidShape.__init__(self, kw) - assert len(points) % 2 == 0, 'Point list must have even number of elements!' - self.points = points or [] - - def copy(self): - new = self.__class__(self.points) - new.setProperties(self.getProperties()) - return new - - def getBounds(self): - return getPointsBounds(self.points) - -class PolyLine(LineShape): - """Series of line segments. Does not define a - closed shape; never filled even if apparently joined. - Put the numbers in the list, not two-tuples.""" - - _attrMap = AttrMap(BASE=LineShape, - points = AttrMapValue(isListOfNumbers,desc="list of numbers in the form x1, y1, x2, y2 ... xn, yn"), - ) - - def __init__(self, points=[], **kw): - LineShape.__init__(self, kw) - points = points or [] - lenPoints = len(points) - if lenPoints: - if isSeq(points[0]): - L = [] - for (x,y) in points: - L.append(x) - L.append(y) - points = L - else: - assert len(points) % 2 == 0, 'Point list must have even number of elements!' - self.points = points - - def copy(self): - new = self.__class__(self.points) - new.setProperties(self.getProperties()) - return new - - def getBounds(self): - return getPointsBounds(self.points) - -def numericXShift(tA,text,w,fontName,fontSize,encoding=None,pivotCharacter=decimalSymbol): - dp = getattr(tA,'_dp',pivotCharacter) - i = text.rfind(dp) - if i>=0: - dpOffs = getattr(tA,'_dpLen',0) - w = dpOffs + stringWidth(text[:i],fontName,fontSize,encoding) - return w - -class String(Shape): - """Not checked against the spec, just a way to make something work. - Can be anchored left, middle or end.""" - - # to do. - _attrMap = AttrMap( - x = AttrMapValue(isNumber,desc="x point of anchoring"), - y = AttrMapValue(isNumber,desc="y point of anchoring"), - text = AttrMapValue(isString,desc="the text of the string"), - fontName = AttrMapValue(None,desc="font name of the text - font is either acrobat standard or registered when using external font."), - fontSize = AttrMapValue(isNumber,desc="font size"), - fillColor = AttrMapValue(isColorOrNone,desc="color of the font"), - textAnchor = AttrMapValue(OneOf('start','middle','end','numeric'),desc="treat (x,y) as one of the options below."), - encoding = AttrMapValue(isString), - ) - encoding = 'utf8' - - def __init__(self, x, y, text, **kw): - self.x = x - self.y = y - self.text = text - self.textAnchor = 'start' - self.fontName = STATE_DEFAULTS['fontName'] - self.fontSize = STATE_DEFAULTS['fontSize'] - self.fillColor = STATE_DEFAULTS['fillColor'] - self.setProperties(kw) - - def getEast(self): - return self.x + stringWidth(self.text,self.fontName,self.fontSize, self.encoding) - - def copy(self): - new = self.__class__(self.x, self.y, self.text) - new.setProperties(self.getProperties()) - return new - - def getBounds(self): - # assumes constant drop of 0.2*size to baseline - t = self.text - w = stringWidth(t,self.fontName,self.fontSize,self.encoding) - tA = self.textAnchor - x = self.x - if tA!='start': - if tA=='middle': - x -= 0.5*w - elif tA=='end': - x -= w - elif tA=='numeric': - x -= numericXShift(tA,t,w,self.fontName,self.fontSize,self.encoding) - return (x, self.y - 0.2 * self.fontSize, x+w, self.y + self.fontSize) - -class UserNode(_DrawTimeResizeable): - """A simple template for creating a new node. The user (Python - programmer) may subclasses this. provideNode() must be defined to - provide a Shape primitive when called by a renderer. It does - NOT inherit from Shape, as the renderer always replaces it, and - your own classes can safely inherit from it without getting - lots of unintended behaviour.""" - - def provideNode(self): - """Override this to create your own node. This lets widgets be - added to drawings; they must create a shape (typically a group) - so that the renderer can draw the custom node.""" - - raise NotImplementedError("this method must be redefined by the user/programmer") - - -def test(): - r = Rect(10,10,200,50) - import pprint - pp = pprint.pprint - w = sys.stdout.write - w('a Rectangle: ') - pp(r.getProperties()) - w('\nverifying...') - r.verify() - w(' OK\n') - #print 'setting rect.z = "spam"' - #r.z = 'spam' - w('deleting rect.width ') - del r.width - w('verifying...') - r.verify() - - -if __name__=='__main__': - test() diff --git a/reportlab/graphics/testdrawings.py b/reportlab/graphics/testdrawings.py deleted file mode 100644 index 1422d94e..00000000 --- a/reportlab/graphics/testdrawings.py +++ /dev/null @@ -1,296 +0,0 @@ -#!/bin/env python -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/testdrawings.py -__version__=''' $Id $ ''' -__doc__="""Defines some standard drawings to use as test cases - -This contains a number of routines to generate test drawings -for reportlab/graphics. For now they are contrived, but we will expand them -to try and trip up any parser. Feel free to add more. - -""" - -from reportlab.graphics.shapes import * -from reportlab.lib import colors - -def getDrawing1(): - """Hello World, on a rectangular background""" - - D = Drawing(400, 200) - D.add(Rect(50, 50, 300, 100, fillColor=colors.yellow)) #round corners - D.add(String(180,100, 'Hello World', fillColor=colors.red)) - - - return D - - -def getDrawing2(): - """This demonstrates the basic shapes. There are - no groups or references. Each solid shape should have - a purple fill.""" - D = Drawing(400, 200) #, fillColor=colors.purple) - - D.add(Line(10,10,390,190)) - D.add(Circle(100,100,20, fillColor=colors.purple)) - D.add(Circle(200,100,20, fillColor=colors.purple)) - D.add(Circle(300,100,20, fillColor=colors.purple)) - - D.add(Wedge(330,100,40, -10,40, fillColor=colors.purple)) - - D.add(PolyLine([120,10,130,20,140,10,150,20,160,10, - 170,20,180,10,190,20,200,10])) - - D.add(Polygon([300,20,350,20,390,80,300,75, 330, 40])) - - D.add(Ellipse(50, 150, 40, 20)) - - D.add(Rect(120, 150, 60, 30, - strokeWidth=10, - strokeColor=colors.red, - fillColor=colors.yellow)) #square corners - - D.add(Rect(220, 150, 60, 30, 10, 10)) #round corners - - D.add(String(10,50, 'Basic Shapes', fillColor=colors.black)) - - return D - - -##def getDrawing2(): -## """This drawing uses groups. Each group has two circles and a comment. -## The line style is set at group level and should be red for the left, -## bvlue for the right.""" -## D = Drawing(400, 200) -## -## Group1 = Group() -## -## Group1.add(String(50, 50, 'Group 1', fillColor=colors.black)) -## Group1.add(Circle(75,100,25)) -## Group1.add(Circle(125,100,25)) -## D.add(Group1) -## -## Group2 = Group( -## String(250, 50, 'Group 2', fillColor=colors.black), -## Circle(275,100,25), -## Circle(325,100,25)#, - - -##def getDrawing2(): -## """This drawing uses groups. Each group has two circles and a comment. -## The line style is set at group level and should be red for the left, -## bvlue for the right.""" -## D = Drawing(400, 200) -## -## Group1 = Group() -## -## Group1.add(String(50, 50, 'Group 1', fillColor=colors.black)) -## Group1.add(Circle(75,100,25)) -## Group1.add(Circle(125,100,25)) -## D.add(Group1) -## -## Group2 = Group( -## String(250, 50, 'Group 2', fillColor=colors.black), -## Circle(275,100,25), -## Circle(325,100,25)#, -## -## #group attributes -## #strokeColor=colors.blue -## ) -## D.add(Group2) - -## return D -## -## -##def getDrawing3(): -## """This uses a named reference object. The house is a 'subroutine' -## the basic brick colored walls are defined, but the roof and window -## color are undefined and may be set by the container.""" -## -## D = Drawing(400, 200, fill=colors.bisque) -## -## -## House = Group( -## Rect(2,20,36,30, fill=colors.bisque), #walls -## Polygon([0,20,40,20,20,5]), #roof -## Rect(8, 38, 8, 12), #door -## Rect(25, 38, 8, 7), #window -## Rect(8, 25, 8, 7), #window -## Rect(25, 25, 8, 7) #window -## -## ) -## D.addDef('MyHouse', House) -## -## # one row all the same color -## D.add(String(20, 40, 'British Street...',fill=colors.black)) -## for i in range(6): -## x = i * 50 -## D.add(NamedReference('MyHouse', -## House, -## transform=translate(x, 40), -## fill = colors.brown -## ) -## ) -## -## # now do a row all different -## D.add(String(20, 120, 'Mediterranean Street...',fill=colors.black)) -## x = 0 -## for color in (colors.blue, colors.yellow, colors.orange, -## colors.red, colors.green, colors.chartreuse): -## D.add(NamedReference('MyHouse', -## House, -## transform=translate(x,120), -## fill = color, -## ) -## ) -## x = x + 50 -## #..by popular demand, the mayor gets a big one at the end -## D.add(NamedReference('MyHouse', -## House, -## transform=mmult(translate(x,110), scale(1.2,1.2)), -## fill = color, -## ) -## ) -## -## -## return D -## -##def getDrawing4(): -## """This tests that attributes are 'unset' correctly when -## one steps back out of a drawing node. All the circles are part of a -## group setting the line color to blue; the second circle explicitly -## sets it to red. Ideally, the third circle should go back to blue.""" -## D = Drawing(400, 200) -## -## -## G = Group( -## Circle(100,100,20), -## Circle(200,100,20, stroke=colors.blue), -## Circle(300,100,20), -## stroke=colors.red, -## stroke_width=3, -## fill=colors.aqua -## ) -## D.add(G) -## -## -## D.add(String(10,50, 'Stack Unwinding - should be red, blue, red')) -## -## return D -## -## -##def getDrawing5(): -## """This Rotates Coordinate Axes""" -## D = Drawing(400, 200) -## -## -## -## Axis = Group( -## Line(0,0,100,0), #x axis -## Line(0,0,0,50), # y axis -## Line(0,10,10,10), #ticks on y axis -## Line(0,20,10,20), -## Line(0,30,10,30), -## Line(0,40,10,40), -## Line(10,0,10,10), #ticks on x axis -## Line(20,0,20,10), -## Line(30,0,30,10), -## Line(40,0,40,10), -## Line(50,0,50,10), -## Line(60,0,60,10), -## Line(70,0,70,10), -## Line(80,0,80,10), -## Line(90,0,90,10), -## String(20, 35, 'Axes', fill=colors.black) -## ) -## -## D.addDef('Axes', Axis) -## -## D.add(NamedReference('Axis', Axis, -## transform=translate(10,10))) -## D.add(NamedReference('Axis', Axis, -## transform=mmult(translate(150,10),rotate(15))) -## ) -## return D -## -##def getDrawing6(): -## """This Rotates Text""" -## D = Drawing(400, 300, fill=colors.black) -## -## xform = translate(200,150) -## C = (colors.black,colors.red,colors.green,colors.blue,colors.brown,colors.gray, colors.pink, -## colors.lavender,colors.lime, colors.mediumblue, colors.magenta, colors.limegreen) -## -## for i in range(12): -## D.add(String(0, 0, ' - - Rotated Text', fill=C[i%len(C)], transform=mmult(xform, rotate(30*i)))) -## -## return D -## -##def getDrawing7(): -## """This defines and tests a simple UserNode0 (the trailing zero denotes -## an experimental method which is not part of the supported API yet). -## Each of the four charts is a subclass of UserNode which generates a random -## series when rendered.""" -## -## class MyUserNode(UserNode0): -## import whrandom, math -## -## -## def provideNode(self, sender): -## """draw a simple chart that changes everytime it's drawn""" -## # print "here's a random number %s" % self.whrandom.random() -## #print "MyUserNode.provideNode being called by %s" % sender -## g = Group() -## #g._state = self._state # this is naughty -## PingoNode.__init__(g, self._state) # is this less naughty ? -## w = 80.0 -## h = 50.0 -## g.add(Rect(0,0, w, h, stroke=colors.black)) -## N = 10.0 -## x,y = (0,h) -## dx = w/N -## for ii in range(N): -## dy = (h/N) * self.whrandom.random() -## g.add(Line(x,y,x+dx, y-dy)) -## x = x + dx -## y = y - dy -## return g -## -## D = Drawing(400,200, fill=colors.white) # AR - same size as others -## -## D.add(MyUserNode()) -## -## graphcolor= [colors.green, colors.red, colors.brown, colors.purple] -## for ii in range(4): -## D.add(Group( MyUserNode(stroke=graphcolor[ii], stroke_width=2), -## transform=translate(ii*90,0) )) -## -## #un = MyUserNode() -## #print un.provideNode() -## return D -## -##def getDrawing8(): -## """Test Path operations--lineto, curveTo, etc.""" -## D = Drawing(400, 200, fill=None, stroke=colors.purple, stroke_width=2) -## -## xform = translate(200,100) -## C = (colors.black,colors.red,colors.green,colors.blue,colors.brown,colors.gray, colors.pink, -## colors.lavender,colors.lime, colors.mediumblue, colors.magenta, colors.limegreen) -## p = Path(50,50) -## p.lineTo(100,100) -## p.moveBy(-25,25) -## p.curveTo(150,125, 125,125, 200,50) -## p.curveTo(175, 75, 175, 98, 62, 87) -## -## -## D.add(p) -## D.add(String(10,30, 'Tests of path elements-lines and bezier curves-and text formating')) -## D.add(Line(220,150, 220,200, stroke=colors.red)) -## D.add(String(220,180, "Text should be centered", text_anchor="middle") ) -## -## -## return D - - -if __name__=='__main__': - print(__doc__) diff --git a/reportlab/graphics/testshapes.py b/reportlab/graphics/testshapes.py deleted file mode 100644 index ce1b7833..00000000 --- a/reportlab/graphics/testshapes.py +++ /dev/null @@ -1,580 +0,0 @@ -#!/bin/env python -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/testshapes.py - -# testshapes.py - draws shapes onto a PDF canvas. - - -__version__ = ''' $Id $ ''' -__doc__='''Execute this script to see some test drawings. - -This contains a number of routines to generate test drawings -for reportlab/graphics. For now many of them are contrived, -but we will expand them to try and trip up any parser. -Feel free to add more. -''' - -import os, sys - -from reportlab.lib import colors -from reportlab.lib.units import cm -from reportlab.lib.utils import asNative -from reportlab.pdfgen.canvas import Canvas -from reportlab.pdfbase.pdfmetrics import stringWidth -from reportlab.platypus import Flowable -from reportlab.graphics.shapes import * -from reportlab.graphics.renderPDF import _PDFRenderer -import unittest - -_FONTS = ['Times-Roman','Vera','Times-BoldItalic',] - -def _setup(): - from reportlab.pdfbase import pdfmetrics, ttfonts - pdfmetrics.registerFont(ttfonts.TTFont("Vera", "Vera.ttf")) - pdfmetrics.registerFont(ttfonts.TTFont("VeraBd", "VeraBd.ttf")) - pdfmetrics.registerFont(ttfonts.TTFont("VeraIt", "VeraIt.ttf")) - pdfmetrics.registerFont(ttfonts.TTFont("VeraBI", "VeraBI.ttf")) - F = ['Times-Roman','Courier','Helvetica','Vera', 'VeraBd', 'VeraIt', 'VeraBI'] - if sys.platform=='win32': - for name, ttf in [ - ('Adventurer Light SF','Advlit.ttf'),('ArialMS','ARIAL.TTF'), - ('Arial Unicode MS', 'ARIALUNI.TTF'), - ('Book Antiqua','BKANT.TTF'), - ('Century Gothic','GOTHIC.TTF'), - ('Comic Sans MS', 'COMIC.TTF'), - ('Elementary Heavy SF Bold','Vwagh.ttf'), - ('Firenze SF','flot.ttf'), - ('Garamond','GARA.TTF'), - ('Jagger','Rols.ttf'), - ('Monotype Corsiva','MTCORSVA.TTF'), - ('Seabird SF','seag.ttf'), - ('Tahoma','TAHOMA.TTF'), - ('VerdanaMS','VERDANA.TTF'), - ]: - for D in ('c:\WINNT','c:\Windows'): - fn = os.path.join(D,'Fonts',ttf) - if os.path.isfile(fn): - try: - f = ttfonts.TTFont(name, fn) - pdfmetrics.registerFont(f) - F.append(name) - except: - pass - return F - -def resetFonts(): - for f in _setup(): - if f not in _FONTS: - _FONTS.append(f) -from reportlab.rl_config import register_reset -register_reset(resetFonts) -resetFonts() - -######################################################### -# -# Collections of shape drawings. -# -######################################################### -def getFailedDrawing(funcName): - """Generate a drawing in case something goes really wrong. - - This will create a drawing to be displayed whenever some - other drawing could not be executed, because the generating - function does something terribly wrong! The box contains - an attention triangle, plus some error message. - """ - - D = Drawing(400, 200) - - points = [200,170, 140,80, 260,80] - D.add(Polygon(points, - strokeWidth=0.5*cm, - strokeColor=colors.red, - fillColor=colors.yellow)) - - s = String(200, 40, - "Error in generating function '%s'!" % funcName, - textAnchor='middle') - D.add(s) - - return D - - -# These are the real drawings to be eye-balled. - -def getDrawing01(): - """Hello World, on a rectangular background. - - The rectangle's fillColor is yellow. - The string's fillColor is red. - """ - - D = Drawing(400, 200) - D.add(Rect(50, 50, 300, 100, fillColor=colors.yellow)) - D.add(String(180,100, 'Hello World', fillColor=colors.red)) - D.add(String(180,86, b'Special characters \xc2\xa2\xc2\xa9\xc2\xae\xc2\xa3\xce\xb1\xce\xb2', fillColor=colors.red)) - - return D - - -def getDrawing02(): - """Various Line shapes. - - The lines are blue and their strokeWidth is 5 mm. - One line has a strokeDashArray set to [5, 10, 15]. - """ - - D = Drawing(400, 200) - D.add(Line(50,50, 300,100, - strokeColor=colors.blue, - strokeWidth=0.5*cm, - )) - D.add(Line(50,100, 300,50, - strokeColor=colors.blue, - strokeWidth=0.5*cm, - strokeDashArray=[5, 10, 15], - )) - - #x = 1/0 # Comment this to see the actual drawing! - - return D - - -def getDrawing03(): - """Text strings in various sizes and different fonts. - - Font size increases from 12 to 36 and from bottom left - to upper right corner. The first ones should be in - Times-Roman. Finally, a solitary Courier string at - the top right corner. - """ - - D = Drawing(400, 200) - for size in range(12, 36, 4): - D.add(String(10+size*2, - 10+size*2, - 'Hello World', - fontName=_FONTS[0], - fontSize=size)) - - D.add(String(150, 150, - 'Hello World', - fontName=_FONTS[1], - fontSize=36)) - return D - - -def getDrawing04(): - """Text strings in various colours. - - Colours are blue, yellow and red from bottom left - to upper right. - """ - - D = Drawing(400, 200) - i = 0 - for color in (colors.blue, colors.yellow, colors.red): - D.add(String(50+i*30, 50+i*30, - 'Hello World', fillColor=color)) - i = i + 1 - - return D - - -def getDrawing05(): - """Text strings with various anchors (alignments). - - Text alignment conforms to the anchors in the left column. - """ - - D = Drawing(400, 200) - - lineX = 250 - D.add(Line(lineX,10, lineX,190, strokeColor=colors.gray)) - - y = 130 - for anchor in ('start', 'middle', 'end'): - D.add(String(lineX, y, 'Hello World', textAnchor=anchor)) - D.add(String(50, y, anchor + ':')) - y = y - 30 - - return D - - -def getDrawing06(): - """This demonstrates all the basic shapes at once. - - There are no groups or references. - Each solid shape should have a green fill. - """ - - green = colors.green - - D = Drawing(400, 200) #, fillColor=green) - - D.add(Line(10,10, 390,190)) - - D.add(Circle(100,100,20, fillColor=green)) - D.add(Circle(200,100,40, fillColor=green)) - D.add(Circle(300,100,30, fillColor=green)) - - D.add(Wedge(330,100,40, -10,40, fillColor=green)) - - D.add(PolyLine([120,10, 130,20, 140,10, 150,20, 160,10, - 170,20, 180,10, 190,20, 200,10], fillColor=green)) - - D.add(Polygon([300,20, 350,20, 390,80, 300,75, 330,40], fillColor=green)) - - D.add(Ellipse(50,150, 40, 20, fillColor=green)) - - D.add(Rect(120,150, 60,30, - strokeWidth=10, - strokeColor=colors.yellow, - fillColor=green)) #square corners - D.add(Rect(220, 150, 60, 30, 10, 10, fillColor=green)) #round corners - - D.add(String(10,50, 'Basic Shapes', fillColor=colors.black, fontName='Helvetica')) - - return D - -def getDrawing07(): - """This tests the ability to translate and rotate groups. The first set of axes should be - near the bottom left of the drawing. The second should be rotated counterclockwise - by 15 degrees. The third should be rotated by 30 degrees.""" - D = Drawing(400, 200) - - Axis = Group( - Line(0,0,100,0), #x axis - Line(0,0,0,50), # y axis - Line(0,10,10,10), #ticks on y axis - Line(0,20,10,20), - Line(0,30,10,30), - Line(0,40,10,40), - Line(10,0,10,10), #ticks on x axis - Line(20,0,20,10), - Line(30,0,30,10), - Line(40,0,40,10), - Line(50,0,50,10), - Line(60,0,60,10), - Line(70,0,70,10), - Line(80,0,80,10), - Line(90,0,90,10), - String(20, 35, 'Axes', fill=colors.black) - ) - - firstAxisGroup = Group(Axis) - firstAxisGroup.translate(10,10) - D.add(firstAxisGroup) - - secondAxisGroup = Group(Axis) - secondAxisGroup.translate(150,10) - secondAxisGroup.rotate(15) - - D.add(secondAxisGroup) - - - thirdAxisGroup = Group(Axis, transform=mmult(translate(300,10), rotate(30))) - D.add(thirdAxisGroup) - - return D - - -def getDrawing08(): - """This tests the ability to scale coordinates. The bottom left set of axes should be - near the bottom left of the drawing. The bottom right should be stretched vertically - by a factor of 2. The top left one should be stretched horizontally by a factor of 2. - The top right should have the vertical axiss leaning over to the right by 30 degrees.""" - D = Drawing(400, 200) - - Axis = Group( - Line(0,0,100,0), #x axis - Line(0,0,0,50), # y axis - Line(0,10,10,10), #ticks on y axis - Line(0,20,10,20), - Line(0,30,10,30), - Line(0,40,10,40), - Line(10,0,10,10), #ticks on x axis - Line(20,0,20,10), - Line(30,0,30,10), - Line(40,0,40,10), - Line(50,0,50,10), - Line(60,0,60,10), - Line(70,0,70,10), - Line(80,0,80,10), - Line(90,0,90,10), - String(20, 35, 'Axes', fill=colors.black) - ) - - firstAxisGroup = Group(Axis) - firstAxisGroup.translate(10,10) - D.add(firstAxisGroup) - - secondAxisGroup = Group(Axis) - secondAxisGroup.translate(150,10) - secondAxisGroup.scale(1,2) - D.add(secondAxisGroup) - - thirdAxisGroup = Group(Axis) - thirdAxisGroup.translate(10,125) - thirdAxisGroup.scale(2,1) - D.add(thirdAxisGroup) - - fourthAxisGroup = Group(Axis) - fourthAxisGroup.translate(250,125) - fourthAxisGroup.skew(30,0) - D.add(fourthAxisGroup) - - - return D - -def getDrawing09(): - """This tests rotated strings - - Some renderers will have a separate mechanism for font drawing. This test - just makes sure strings get transformed the same way as regular graphics.""" - D = Drawing(400, 200) - - fontName = _FONTS[0] - fontSize = 12 - text = "I should be totally horizontal and enclosed in a box" - textWidth = stringWidth(text, fontName, fontSize) - - - g1 = Group( - String(20, 20, text, fontName=fontName, fontSize = fontSize), - Rect(18, 18, textWidth + 4, fontSize + 4, fillColor=None) - ) - D.add(g1) - - text = "I should slope up by 15 degrees, so my right end is higher than my left" - textWidth = stringWidth(text, fontName, fontSize) - g2 = Group( - String(20, 20, text, fontName=fontName, fontSize = fontSize), - Rect(18, 18, textWidth + 4, fontSize + 4, fillColor=None) - ) - g2.translate(0, 50) - g2.rotate(15) - D.add(g2) - - return D - -def getDrawing10(): - """This tests nested groups with multiple levels of coordinate transformation. - Each box should be staggered up and to the right, moving by 25 points each time.""" - D = Drawing(400, 200) - - fontName = _FONTS[0] - fontSize = 12 - - g1 = Group( - Rect(0, 0, 100, 20, fillColor=colors.yellow), - String(5, 5, 'Text in the box', fontName=fontName, fontSize = fontSize) - ) - D.add(g1) - - g2 = Group(g1, transform = translate(25,25)) - D.add(g2) - - g3 = Group(g2, transform = translate(25,25)) - D.add(g3) - - g4 = Group(g3, transform = translate(25,25)) - D.add(g4) - - - return D - -from reportlab.graphics.widgets.signsandsymbols import SmileyFace -def getDrawing11(): - '''test of anchoring''' - def makeSmiley(x, y, size, color): - "Make a smiley data item representation." - d = size - s = SmileyFace() - s.fillColor = color - s.x = x-d - s.y = y-d - s.size = d*2 - return s - - D = Drawing(400, 200) #, fillColor=colors.purple) - g = Group(transform=(1,0,0,1,0,0)) - g.add(makeSmiley(100,100,10,colors.red)) - g.add(Line(90,100,110,100,strokeColor=colors.green)) - g.add(Line(100,90,100,110,strokeColor=colors.green)) - D.add(g) - g = Group(transform=(2,0,0,2,100,-100)) - g.add(makeSmiley(100,100,10,colors.blue)) - g.add(Line(90,100,110,100,strokeColor=colors.green)) - g.add(Line(100,90,100,110,strokeColor=colors.green)) - D.add(g) - g = Group(transform=(2,0,0,2,0,0)) - return D - - -def getDrawing12(): - """Text strings in a non-standard font. - All that is required is to place the .afm and .pfb files - on the font patch given in rl_config.py, - for example in reportlab/lib/fonts/. - """ - faceName = "DarkGardenMK" - D = Drawing(400, 200) - for size in range(12, 36, 4): - D.add(String(10+size*2, - 10+size*2, - 'Hello World', - fontName=faceName, - fontSize=size)) - return D - -def getDrawing13(): - 'Test Various TTF Fonts' - - def drawit(F,w=400,h=200,fontSize=12,slack=2,gap=5): - D = Drawing(w,h) - th = 2*gap + fontSize*1.2 - gh = gap + .2*fontSize - y = h - maxx = 0 - for fontName in F: - y -= th - text = fontName+asNative(b': I should be totally horizontal and enclosed in a box and end in alphabetagamma \xc2\xa2\xc2\xa9\xc2\xae\xc2\xa3\xca\xa5\xd0\x96\xd6\x83\xd7\x90\xd9\x82\xe0\xa6\x95\xce\xb1\xce\xb2\xce\xb3') - textWidth = stringWidth(text, fontName, fontSize) - maxx = max(maxx,textWidth+20) - D.add( - Group(Rect(8, y-gh, textWidth + 4, th, strokeColor=colors.red, strokeWidth=.5, fillColor=colors.lightgrey), - String(10, y, text, fontName=fontName, fontSize = fontSize))) - y -= 5 - return maxx, h-y+gap, D - maxx, maxy, D = drawit(_FONTS) - if maxx>400 or maxy>200: _,_,D = drawit(_FONTS,maxx,maxy) - return D - -##def getDrawing14(): -## """This tests inherited properties. Each font should be as it says.""" -## D = Drawing(400, 200) -## -## fontSize = 12 -## D.fontName = 'Courier' -## -## g1 = Group( -## Rect(0, 0, 150, 20, fillColor=colors.yellow), -## String(5, 5, 'Inherited Courier', fontName=inherit, fontSize = fontSize) -## ) -## D.add(g1) -## -## g2 = Group(g1, transform = translate(25,25)) -## D.add(g2) -## -## g3 = Group(g2, transform = translate(25,25)) -## D.add(g3) -## -## g4 = Group(g3, transform = translate(25,25)) -## D.add(g4) -## -## -## return D -def getAllFunctionDrawingNames(doTTF=1): - "Get a list of drawing function names from somewhere." - - funcNames = [] - - # Here we get the names from the global name space. - symbols = list(globals().keys()) - symbols.sort() - for funcName in symbols: - if funcName[0:10] == 'getDrawing': - if doTTF or funcName!='getDrawing13': - funcNames.append(funcName) - - return funcNames - -def _evalFuncDrawing(name, D, l=None, g=None): - try: - d = eval(name + '()', g or globals(), l or locals()) - except: - d = getFailedDrawing(name) - D.append((d, eval(name + '.__doc__'), name[3:])) - -def getAllTestDrawings(doTTF=1): - D = [] - for f in getAllFunctionDrawingNames(doTTF=doTTF): - _evalFuncDrawing(f,D) - return D - -def writePDF(drawings): - "Create and save a PDF file containing some drawings." - - pdfPath = os.path.splitext(sys.argv[0])[0] + '.pdf' - c = Canvas(pdfPath) - c.setFont(_FONTS[0], 32) - c.drawString(80, 750, 'ReportLab Graphics-Shapes Test') - - # Print drawings in a loop, with their doc strings. - c.setFont(_FONTS[0], 12) - y = 740 - i = 1 - for (drawing, docstring, funcname) in drawings: - if y < 300: # Allows 5-6 lines of text. - c.showPage() - y = 740 - # Draw a title. - y = y - 30 - c.setFont(_FONTS[2],12) - c.drawString(80, y, '%s (#%d)' % (funcname, i)) - c.setFont(_FONTS[0],12) - y = y - 14 - textObj = c.beginText(80, y) - textObj.textLines(docstring) - c.drawText(textObj) - y = textObj.getY() - y = y - drawing.height - drawing.drawOn(c, 80, y) - i = i + 1 - - c.save() - print('wrote %s ' % pdfPath) - - -class ShapesTestCase(unittest.TestCase): - "Test generating all kinds of shapes." - - def setUp(self): - "Prepare some things before the tests start." - - self.funcNames = getAllFunctionDrawingNames() - self.drawings = [] - - - def tearDown(self): - "Do what has to be done after the tests are over." - - writePDF(self.drawings) - - - # This should always succeed. If each drawing would be - # wrapped in a dedicated test method like this one, it - # would be possible to have a count for wrong tests - # as well... Something like this is left for later... - def testAllDrawings(self): - "Make a list of drawings." - - for f in self.funcNames: - if f[0:10] == 'getDrawing': - # Make an instance and get its doc string. - # If that fails, use a default error drawing. - _evalFuncDrawing(f,self.drawings) - - -def makeSuite(): - "Make a test suite for unit testing." - - suite = unittest.TestSuite() - suite.addTest(ShapesTestCase('testAllDrawings')) - return suite - - -if __name__ == "__main__": - unittest.TextTestRunner().run(makeSuite()) diff --git a/reportlab/graphics/widgetbase.py b/reportlab/graphics/widgetbase.py deleted file mode 100644 index 056a1e4e..00000000 --- a/reportlab/graphics/widgetbase.py +++ /dev/null @@ -1,529 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgetbase.py -__version__=''' $Id$ ''' -__doc__='''Base class for user-defined graphical widgets''' - -from reportlab.graphics import shapes -from reportlab import rl_config -from reportlab.lib import colors -from reportlab.lib.validators import * -from reportlab.lib.attrmap import * - -class PropHolder: - '''Base for property holders''' - - _attrMap = None - - def verify(self): - """If the _attrMap attribute is not None, this - checks all expected attributes are present; no - unwanted attributes are present; and (if a - checking function is found) checks each - attribute has a valid value. Either succeeds - or raises an informative exception. - """ - - if self._attrMap is not None: - for key in self.__dict__.keys(): - if key[0] != '_': - msg = "Unexpected attribute %s found in %s" % (key, self) - assert key in self._attrMap, msg - for attr, metavalue in self._attrMap.items(): - msg = "Missing attribute %s from %s" % (attr, self) - assert hasattr(self, attr), msg - value = getattr(self, attr) - args = (value, attr, self.__class__.__name__) - assert metavalue.validate(value), "Invalid value %s for attribute %s in class %s" % args - - if rl_config.shapeChecking: - """This adds the ability to check every attribute assignment - as it is made. It slows down shapes but is a big help when - developing. It does not get defined if rl_config.shapeChecking = 0. - """ - - def __setattr__(self, name, value): - """By default we verify. This could be off - in some parallel base classes.""" - validateSetattr(self,name,value) - - - def getProperties(self,recur=1): - """Returns a list of all properties which can be edited and - which are not marked as private. This may include 'child - widgets' or 'primitive shapes'. You are free to override - this and provide alternative implementations; the default - one simply returns everything without a leading underscore. - """ - - from reportlab.lib.validators import isValidChild - - # TODO when we need it, but not before - - # expose sequence contents? - - props = {} - for name in self.__dict__.keys(): - if name[0:1] != '_': - component = getattr(self, name) - - if recur and isValidChild(component): - # child object, get its properties too - childProps = component.getProperties(recur=recur) - for childKey, childValue in childProps.items(): - #key might be something indexed like '[2].fillColor' - #or simple like 'fillColor'; in the former case we - #don't need a '.' between me and my child. - if childKey[0] == '[': - props['%s%s' % (name, childKey)] = childValue - else: - props['%s.%s' % (name, childKey)] = childValue - else: - props[name] = component - - return props - - - def setProperties(self, propDict): - """Permits bulk setting of properties. These may include - child objects e.g. "chart.legend.width = 200". - - All assignments will be validated by the object as if they - were set individually in python code. - - All properties of a top-level object are guaranteed to be - set before any of the children, which may be helpful to - widget designers. - """ - - childPropDicts = {} - for name, value in propDict.items(): - parts = name.split('.', 1) - if len(parts) == 1: - #simple attribute, set it now - setattr(self, name, value) - else: - (childName, remains) = parts - try: - childPropDicts[childName][remains] = value - except KeyError: - childPropDicts[childName] = {remains: value} - - # now assign to children - for childName, childPropDict in childPropDicts.items(): - child = getattr(self, childName) - child.setProperties(childPropDict) - - - def dumpProperties(self, prefix=""): - """Convenience. Lists them on standard output. You - may provide a prefix - mostly helps to generate code - samples for documentation. - """ - - propList = list(self.getProperties().items()) - propList.sort() - if prefix: - prefix = prefix + '.' - for (name, value) in propList: - print('%s%s = %s' % (prefix, name, value)) - - -class Widget(PropHolder, shapes.UserNode): - """Base for all user-defined widgets. Keep as simple as possible. Does - not inherit from Shape so that we can rewrite shapes without breaking - widgets and vice versa.""" - - def _setKeywords(self,**kw): - for k,v in kw.items(): - if k not in self.__dict__: - setattr(self,k,v) - - def draw(self): - msg = "draw() must be implemented for each Widget!" - raise shapes.NotImplementedError(msg) - - def demo(self): - msg = "demo() must be implemented for each Widget!" - raise shapes.NotImplementedError(msg) - - def provideNode(self): - return self.draw() - - def getBounds(self): - "Return outer boundary as x1,y1,x2,y2. Can be overridden for efficiency" - return self.draw().getBounds() - -class ScaleWidget(Widget): - '''Contents with a scale and offset''' - _attrMap = AttrMap( - x = AttrMapValue(isNumber,desc="x offset"), - y = AttrMapValue(isNumber,desc="y offset"), - scale = AttrMapValue(isNumber,desc="scale"), - contents = AttrMapValue(None,desc="Contained drawable elements"), - ) - def __init__(self,x=0,y=0,scale=1.0,contents=None): - self.x = x - self.y = y - if not contents: contents=[] - elif not isinstance(contents,(tuple,list)): - contents = (contents,) - self.contents = list(contents) - self.scale = scale - - def draw(self): - return shapes.Group(transform=(self.scale,0,0,self.scale,self.x,self.y),*self.contents) - -_ItemWrapper={} - -class CloneMixin: - def clone(self,**kwds): - n = self.__class__() - n.__dict__.clear() - n.__dict__.update(self.__dict__) - if kwds: n.__dict__.update(kwds) - return n - -class TypedPropertyCollection(PropHolder): - """A container with properties for objects of the same kind. - - This makes it easy to create lists of objects. You initialize - it with a class of what it is to contain, and that is all you - can add to it. You can assign properties to the collection - as a whole, or to a numeric index within it; if so it creates - a new child object to hold that data. - - So: - wedges = TypedPropertyCollection(WedgeProperties) - wedges.strokeWidth = 2 # applies to all - wedges.strokeColor = colors.red # applies to all - wedges[3].strokeColor = colors.blue # only to one - - The last line should be taken as a prescription of how to - create wedge no. 3 if one is needed; no error is raised if - there are only two data points. - - We try and make sensible use of tuple indeces. - line[(3,x)] is backed by line[(3,)], line[3] & line - """ - - def __init__(self, exampleClass): - #give it same validation rules as what it holds - self.__dict__['_value'] = exampleClass() - self.__dict__['_children'] = {} - - def wKlassFactory(self,Klass): - class WKlass(Klass,CloneMixin): - def __getattr__(self,name): - try: - return self.__class__.__bases__[0].__getattr__(self,name) - except: - i = self._index - if i: - c = self._parent._children - if i in c and name in c[i].__dict__: - return getattr(c[i],name) - elif len(i)==1: - i = i[0] - if i in c and name in c[i].__dict__: - return getattr(c[i],name) - return getattr(self._parent,name) - return WKlass - - def __getitem__(self, index): - try: - return self._children[index] - except KeyError: - Klass = self._value.__class__ - if Klass in _ItemWrapper: - WKlass = _ItemWrapper[Klass] - else: - _ItemWrapper[Klass] = WKlass = self.wKlassFactory(Klass) - - child = WKlass() - child._parent = self - if type(index) in (type(()),type([])): - index = tuple(index) - if len(index)>1: - child._index = tuple(index[:-1]) - else: - child._index = None - else: - child._index = None - for i in filter(lambda x,K=list(child.__dict__.keys()): x in K,list(child._attrMap.keys())): - del child.__dict__[i] - - self._children[index] = child - return child - - def __contains__(self,key): - if type(key) in (type(()),type([])): key = tuple(key) - return key in self._children - - def __setitem__(self, key, value): - msg = "This collection can only hold objects of type %s" % self._value.__class__.__name__ - assert isinstance(value, self._value.__class__), msg - - def __len__(self): - return len(list(self._children.keys())) - - def getProperties(self,recur=1): - # return any children which are defined and whatever - # differs from the parent - props = {} - - for key, value in self._value.getProperties(recur=recur).items(): - props['%s' % key] = value - - for idx in self._children.keys(): - childProps = self._children[idx].getProperties(recur=recur) - for key, value in childProps.items(): - if not hasattr(self,key) or getattr(self, key)!=value: - newKey = '[%s].%s' % (idx, key) - props[newKey] = value - return props - - def setVector(self,**kw): - for name, value in kw.items(): - for i in range(len(value)): - setattr(self[i],name,value[i]) - - def __getattr__(self,name): - return getattr(self._value,name) - - def __setattr__(self,name,value): - return setattr(self._value,name,value) - -## No longer needed! -class StyleProperties(PropHolder): - """A container class for attributes used in charts and legends. - - Attributes contained can be those for any graphical element - (shape?) in the ReportLab graphics package. The idea for this - container class is to be useful in combination with legends - and/or the individual appearance of data series in charts. - - A legend could be as simple as a wrapper around a list of style - properties, where the 'desc' attribute contains a descriptive - string and the rest could be used by the legend e.g. to draw - something like a color swatch. The graphical presentation of - the legend would be its own business, though. - - A chart could be inspecting a legend or, more directly, a list - of style properties to pick individual attributes that it knows - about in order to render a particular row of the data. A bar - chart e.g. could simply use 'strokeColor' and 'fillColor' for - drawing the bars while a line chart could also use additional - ones like strokeWidth. - """ - - _attrMap = AttrMap( - strokeWidth = AttrMapValue(isNumber,desc='width of the stroke line'), - strokeLineCap = AttrMapValue(isNumber,desc='Line cap 0=butt, 1=round & 2=square',advancedUsage=1), - strokeLineJoin = AttrMapValue(isNumber,desc='Line join 0=miter, 1=round & 2=bevel',advancedUsage=1), - strokeMiterLimit = AttrMapValue(None,desc='miter limit control miter line joins',advancedUsage=1), - strokeDashArray = AttrMapValue(isListOfNumbersOrNone,desc='dashing patterns e.g. (1,3)'), - strokeOpacity = AttrMapValue(isNumber,desc='level of transparency (alpha) accepts values between 0..1',advancedUsage=1), - strokeColor = AttrMapValue(isColorOrNone,desc='the color of the stroke'), - fillColor = AttrMapValue(isColorOrNone,desc='the filling color'), - desc = AttrMapValue(isString), - ) - - def __init__(self, **kwargs): - "Initialize with attributes if any." - - for k, v in kwargs.items(): - setattr(self, k, v) - - - def __setattr__(self, name, value): - "Verify attribute name and value, before setting it." - validateSetattr(self,name,value) - - -class TwoCircles(Widget): - def __init__(self): - self.leftCircle = shapes.Circle(100,100,20, fillColor=colors.red) - self.rightCircle = shapes.Circle(300,100,20, fillColor=colors.red) - - def draw(self): - return shapes.Group(self.leftCircle, self.rightCircle) - - -class Face(Widget): - """This draws a face with two eyes. - - It exposes a couple of properties - to configure itself and hides all other details. - """ - - _attrMap = AttrMap( - x = AttrMapValue(isNumber), - y = AttrMapValue(isNumber), - size = AttrMapValue(isNumber), - skinColor = AttrMapValue(isColorOrNone), - eyeColor = AttrMapValue(isColorOrNone), - mood = AttrMapValue(OneOf('happy','sad','ok')), - ) - - def __init__(self): - self.x = 10 - self.y = 10 - self.size = 80 - self.skinColor = None - self.eyeColor = colors.blue - self.mood = 'happy' - - def demo(self): - pass - - def draw(self): - s = self.size # abbreviate as we will use this a lot - g = shapes.Group() - g.transform = [1,0,0,1,self.x, self.y] - - # background - g.add(shapes.Circle(s * 0.5, s * 0.5, s * 0.5, fillColor=self.skinColor)) - - # left eye - g.add(shapes.Circle(s * 0.35, s * 0.65, s * 0.1, fillColor=colors.white)) - g.add(shapes.Circle(s * 0.35, s * 0.65, s * 0.05, fillColor=self.eyeColor)) - - # right eye - g.add(shapes.Circle(s * 0.65, s * 0.65, s * 0.1, fillColor=colors.white)) - g.add(shapes.Circle(s * 0.65, s * 0.65, s * 0.05, fillColor=self.eyeColor)) - - # nose - g.add(shapes.Polygon( - points=[s * 0.5, s * 0.6, s * 0.4, s * 0.3, s * 0.6, s * 0.3], - fillColor=None)) - - # mouth - if self.mood == 'happy': - offset = -0.05 - elif self.mood == 'sad': - offset = +0.05 - else: - offset = 0 - - g.add(shapes.Polygon( - points = [ - s * 0.3, s * 0.2, #left of mouth - s * 0.7, s * 0.2, #right of mouth - s * 0.6, s * (0.2 + offset), # the bit going up or down - s * 0.4, s * (0.2 + offset) # the bit going up or down - ], - fillColor = colors.pink, - strokeColor = colors.red, - strokeWidth = s * 0.03 - )) - - return g - - -class TwoFaces(Widget): - def __init__(self): - self.faceOne = Face() - self.faceOne.mood = "happy" - self.faceTwo = Face() - self.faceTwo.x = 100 - self.faceTwo.mood = "sad" - - def draw(self): - """Just return a group""" - return shapes.Group(self.faceOne, self.faceTwo) - - def demo(self): - """The default case already looks good enough, - no implementation needed here""" - pass - -class Sizer(Widget): - "Container to show size of all enclosed objects" - - _attrMap = AttrMap(BASE=shapes.SolidShape, - contents = AttrMapValue(isListOfShapes,desc="Contained drawable elements"), - ) - def __init__(self, *elements): - self.contents = [] - self.fillColor = colors.cyan - self.strokeColor = colors.magenta - - for elem in elements: - self.add(elem) - - def _addNamedNode(self,name,node): - 'if name is not None add an attribute pointing to node and add to the attrMap' - if name: - if name not in list(self._attrMap.keys()): - self._attrMap[name] = AttrMapValue(isValidChild) - setattr(self, name, node) - - def add(self, node, name=None): - """Appends non-None child node to the 'contents' attribute. In addition, - if a name is provided, it is subsequently accessible by name - """ - # propagates properties down - if node is not None: - assert isValidChild(node), "Can only add Shape or UserNode objects to a Group" - self.contents.append(node) - self._addNamedNode(name,node) - - def getBounds(self): - # get bounds of each object - if self.contents: - b = [] - for elem in self.contents: - b.append(elem.getBounds()) - return shapes.getRectsBounds(b) - else: - return (0,0,0,0) - - def draw(self): - g = shapes.Group() - (x1, y1, x2, y2) = self.getBounds() - r = shapes.Rect( - x = x1, - y = y1, - width = x2-x1, - height = y2-y1, - fillColor = self.fillColor, - strokeColor = self.strokeColor - ) - g.add(r) - for elem in self.contents: - g.add(elem) - return g - -def test(): - from reportlab.graphics.charts.piecharts import WedgeProperties - wedges = TypedPropertyCollection(WedgeProperties) - wedges.fillColor = colors.red - wedges.setVector(fillColor=(colors.blue,colors.green,colors.white)) - print(len(_ItemWrapper)) - - d = shapes.Drawing(400, 200) - tc = TwoCircles() - d.add(tc) - from reportlab.graphics import renderPDF - renderPDF.drawToFile(d, 'sample_widget.pdf', 'A Sample Widget') - print('saved sample_widget.pdf') - - d = shapes.Drawing(400, 200) - f = Face() - f.skinColor = colors.yellow - f.mood = "sad" - d.add(f, name='theFace') - print('drawing 1 properties:') - d.dumpProperties() - renderPDF.drawToFile(d, 'face.pdf', 'A Sample Widget') - print('saved face.pdf') - - d2 = d.expandUserNodes() - renderPDF.drawToFile(d2, 'face_copy.pdf', 'An expanded drawing') - print('saved face_copy.pdf') - print('drawing 2 properties:') - d2.dumpProperties() - - -if __name__=='__main__': - test() diff --git a/reportlab/graphics/widgets/__init__.py b/reportlab/graphics/widgets/__init__.py deleted file mode 100644 index b539fef4..00000000 --- a/reportlab/graphics/widgets/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/__init__.py -__version__=''' $Id$ ''' -__doc__='''Some non-chart widgets''' diff --git a/reportlab/graphics/widgets/eventcal.py b/reportlab/graphics/widgets/eventcal.py deleted file mode 100644 index d875e074..00000000 --- a/reportlab/graphics/widgets/eventcal.py +++ /dev/null @@ -1,304 +0,0 @@ -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/eventcal.py -# Event Calendar widget -# author: Andy Robinson - -__version__=''' $Id$ ''' -__doc__="""This file is a -""" - -from reportlab.lib import colors -from reportlab.lib.validators import * -from reportlab.lib.attrmap import * -from reportlab.graphics.shapes import Line, Rect, Polygon, Drawing, Group, String, Circle, Wedge -from reportlab.graphics.charts.textlabels import Label -from reportlab.graphics.widgetbase import Widget -from reportlab.graphics import renderPDF - - - - -class EventCalendar(Widget): - def __init__(self): - self.x = 0 - self.y = 0 - self.width = 300 - self.height = 150 - self.timeColWidth = None # if declared, use it; otherwise auto-size. - self.trackRowHeight = 20 - self.data = [] # list of Event objects - self.trackNames = None - - self.startTime = None #displays ALL data on day if not set - self.endTime = None # displays ALL data on day if not set - self.day = 0 - - - # we will keep any internal geometry variables - # here. These are computed by computeSize(), - # which is the first thing done when drawing. - self._talksVisible = [] # subset of data which will get plotted, cache - self._startTime = None - self._endTime = None - self._trackCount = 0 - self._colWidths = [] - self._colLeftEdges = [] # left edge of each column - - def computeSize(self): - "Called at start of draw. Sets various column widths" - self._talksVisible = self.getRelevantTalks(self.data) - self._trackCount = len(self.getAllTracks()) - self.computeStartAndEndTimes() - self._colLeftEdges = [self.x] - if self.timeColWidth is None: - w = self.width / (1 + self._trackCount) - self._colWidths = [w] * (1+ self._trackCount) - for i in range(self._trackCount): - self._colLeftEdges.append(self._colLeftEdges[-1] + w) - else: - self._colWidths = [self.timeColWidth] - w = (self.width - self.timeColWidth) / self._trackCount - for i in range(self._trackCount): - self._colWidths.append(w) - self._colLeftEdges.append(self._colLeftEdges[-1] + w) - - - - def computeStartAndEndTimes(self): - "Work out first and last times to display" - if self.startTime: - self._startTime = self.startTime - else: - for (title, speaker, trackId, day, start, duration) in self._talksVisible: - - if self._startTime is None: #first one - self._startTime = start - else: - if start < self._startTime: - self._startTime = start - - if self.endTime: - self._endTime = self.endTime - else: - for (title, speaker, trackId, day, start, duration) in self._talksVisible: - if self._endTime is None: #first one - self._endTime = start + duration - else: - if start + duration > self._endTime: - self._endTime = start + duration - - - - - def getAllTracks(self): - tracks = [] - for (title, speaker, trackId, day, hours, duration) in self.data: - if trackId is not None: - if trackId not in tracks: - tracks.append(trackId) - tracks.sort() - return tracks - - def getRelevantTalks(self, talkList): - "Scans for tracks actually used" - used = [] - for talk in talkList: - (title, speaker, trackId, day, hours, duration) = talk - assert trackId != 0, "trackId must be None or 1,2,3... zero not allowed!" - if day == self.day: - if (((self.startTime is None) or ((hours + duration) >= self.startTime)) - and ((self.endTime is None) or (hours <= self.endTime))): - used.append(talk) - return used - - def scaleTime(self, theTime): - "Return y-value corresponding to times given" - axisHeight = self.height - self.trackRowHeight - # compute fraction between 0 and 1, 0 is at start of period - proportionUp = ((theTime - self._startTime) / (self._endTime - self._startTime)) - y = self.y + axisHeight - (axisHeight * proportionUp) - return y - - - def getTalkRect(self, startTime, duration, trackId, text): - "Return shapes for a specific talk" - g = Group() - y_bottom = self.scaleTime(startTime + duration) - y_top = self.scaleTime(startTime) - y_height = y_top - y_bottom - - if trackId is None: - #spans all columns - x = self._colLeftEdges[1] - width = self.width - self._colWidths[0] - else: - #trackId is 1-based and these arrays have the margin info in column - #zero, so no need to add 1 - x = self._colLeftEdges[trackId] - width = self._colWidths[trackId] - - lab = Label() - lab.setText(text) - lab.setOrigin(x + 0.5*width, y_bottom+0.5*y_height) - lab.boxAnchor = 'c' - lab.width = width - lab.height = y_height - lab.fontSize = 6 - - r = Rect(x, y_bottom, width, y_height, fillColor=colors.cyan) - g.add(r) - g.add(lab) - - #now for a label - # would expect to color-code and add text - return g - - def draw(self): - self.computeSize() - g = Group() - - # time column - g.add(Rect(self.x, self.y, self._colWidths[0], self.height - self.trackRowHeight, fillColor=colors.cornsilk)) - - # track headers - x = self.x + self._colWidths[0] - y = self.y + self.height - self.trackRowHeight - for trk in range(self._trackCount): - wid = self._colWidths[trk+1] - r = Rect(x, y, wid, self.trackRowHeight, fillColor=colors.yellow) - s = String(x + 0.5*wid, y, 'Track %d' % trk, align='middle') - g.add(r) - g.add(s) - x = x + wid - - for talk in self._talksVisible: - (title, speaker, trackId, day, start, duration) = talk - r = self.getTalkRect(start, duration, trackId, title + '\n' + speaker) - g.add(r) - - - return g - - - - -def test(): - "Make a conference event for day 1 of UP Python 2003" - - - d = Drawing(400,200) - - cal = EventCalendar() - cal.x = 50 - cal.y = 25 - cal.data = [ - # these might be better as objects instead of tuples, since I - # predict a large number of "optionsl" variables to affect - # formatting in future. - - #title, speaker, track id, day, start time (hrs), duration (hrs) - # track ID is 1-based not zero-based! - ('Keynote: Why design another programming language?', 'Guido van Rossum', None, 1, 9.0, 1.0), - - ('Siena Web Service Architecture', 'Marc-Andre Lemburg', 1, 1, 10.5, 1.5), - ('Extreme Programming in Python', 'Chris Withers', 2, 1, 10.5, 1.5), - ('Pattern Experiences in C++', 'Mark Radford', 3, 1, 10.5, 1.5), - ('What is the Type of std::toupper()', 'Gabriel Dos Reis', 4, 1, 10.5, 1.5), - ('Linguistic Variables: Clear Thinking with Fuzzy Logic ', 'Walter Banks', 5, 1, 10.5, 1.5), - - ('lunch, short presentations, vendor presentations', '', None, 1, 12.0, 2.0), - - ("CORBA? Isn't that obsolete", 'Duncan Grisby', 1, 1, 14.0, 1.5), - ("Python Design Patterns", 'Duncan Booth', 2, 1, 14.0, 1.5), - ("Inside Security Checks and Safe Exceptions", 'Brandon Bray', 3, 1, 14.0, 1.5), - ("Studying at a Distance", 'Panel Discussion, Panel to include Alan Lenton & Francis Glassborow', 4, 1, 14.0, 1.5), - ("Coding Standards - Given the ANSI C Standard why do I still need a coding Standard", 'Randy Marques', 5, 1, 14.0, 1.5), - - ("RESTful Python", 'Hamish Lawson', 1, 1, 16.0, 1.5), - ("Parsing made easier - a radical old idea", 'Andrew Koenig', 2, 1, 16.0, 1.5), - ("C++ & Multimethods", 'Julian Smith', 3, 1, 16.0, 1.5), - ("C++ Threading", 'Kevlin Henney', 4, 1, 16.0, 1.5), - ("The Organisation Strikes Back", 'Alan Griffiths & Sarah Lees', 5, 1, 16.0, 1.5), - - ('Birds of a Feather meeting', '', None, 1, 17.5, 2.0), - - ('Keynote: In the Spirit of C', 'Greg Colvin', None, 2, 9.0, 1.0), - - ('The Infinite Filing Cabinet - object storage in Python', 'Jacob Hallen', 1, 2, 10.5, 1.5), - ('Introduction to Python and Jython for C++ and Java Programmers', 'Alex Martelli', 2, 2, 10.5, 1.5), - ('Template metaprogramming in Haskell', 'Simon Peyton Jones', 3, 2, 10.5, 1.5), - ('Plenty People Programming: C++ Programming in a Group, Workshop with a difference', 'Nico Josuttis', 4, 2, 10.5, 1.5), - ('Design and Implementation of the Boost Graph Library', 'Jeremy Siek', 5, 2, 10.5, 1.5), - - ('lunch, short presentations, vendor presentations', '', None, 2, 12.0, 2.0), - - ("Building GUI Applications with PythonCard and PyCrust", 'Andy Todd', 1, 2, 14.0, 1.5), - ("Integrating Python, C and C++", 'Duncan Booth', 2, 2, 14.0, 1.5), - ("Secrets and Pitfalls of Templates", 'Nicolai Josuttis & David Vandevoorde', 3, 2, 14.0, 1.5), - ("Being a Mentor", 'Panel Discussion, Panel to include Alan Lenton & Francis Glassborow', 4, 2, 14.0, 1.5), - ("The Embedded C Extensions to C", 'Willem Wakker', 5, 2, 14.0, 1.5), - - ("Lightning Talks", 'Paul Brian', 1, 2, 16.0, 1.5), - ("Scripting Java Applications with Jython", 'Anthony Eden', 2, 2, 16.0, 1.5), - ("Metaprogramming and the Boost Metaprogramming Library", 'David Abrahams', 3, 2, 16.0, 1.5), - ("A Common Vendor ABI for C++ -- GCC's why, what and not", 'Nathan Sidwell & Gabriel Dos Reis', 4, 2, 16.0, 1.5), - ("The Timing and Cost of Choices", 'Hubert Matthews', 5, 2, 16.0, 1.5), - - ('Birds of a Feather meeting', '', None, 2, 17.5, 2.0), - - ('Keynote: The Cost of C & C++ Compatibility', 'Andy Koenig', None, 3, 9.0, 1.0), - - ('Prying Eyes: Generic Observer Implementations in C++', 'Andrei Alexandrescu', 1, 2, 10.5, 1.5), - ('The Roadmap to Generative Programming With C++', 'Ulrich Eisenecker', 2, 2, 10.5, 1.5), - ('Design Patterns in C++ and C# for the Common Language Runtime', 'Brandon Bray', 3, 2, 10.5, 1.5), - ('Extreme Hour (XH): (workshop) - Jutta Eckstein and Nico Josuttis', 'Jutta Ecstein', 4, 2, 10.5, 1.5), - ('The Lambda Library : Unnamed Functions for C++', 'Jaako Jarvi', 5, 2, 10.5, 1.5), - - ('lunch, short presentations, vendor presentations', '', None, 3, 12.0, 2.0), - - ('Reflective Metaprogramming', 'Daveed Vandevoorde', 1, 3, 14.0, 1.5), - ('Advanced Template Issues and Solutions (double session)', 'Herb Sutter',2, 3, 14.0, 3), - ('Concurrent Programming in Java (double session)', 'Angelika Langer', 3, 3, 14.0, 3), - ('What can MISRA-C (2nd Edition) do for us?', 'Chris Hills', 4, 3, 14.0, 1.5), - ('C++ Metaprogramming Concepts and Results', 'Walter E Brown', 5, 3, 14.0, 1.5), - - ('Binding C++ to Python with the Boost Python Library', 'David Abrahams', 1, 3, 16.0, 1.5), - ('Using Aspect Oriented Programming for Enterprise Application Integration', 'Arno Schmidmeier', 4, 3, 16.0, 1.5), - ('Defective C++', 'Marc Paterno', 5, 3, 16.0, 1.5), - - ("Speakers' Banquet & Birds of a Feather meeting", '', None, 3, 17.5, 2.0), - - ('Keynote: The Internet, Software and Computers - A Report Card', 'Alan Lenton', None, 4, 9.0, 1.0), - - ('Multi-Platform Software Development; Lessons from the Boost libraries', 'Beman Dawes', 1, 5, 10.5, 1.5), - ('The Stability of the C++ ABI', 'Steve Clamage', 2, 5, 10.5, 1.5), - ('Generic Build Support - A Pragmatic Approach to the Software Build Process', 'Randy Marques', 3, 5, 10.5, 1.5), - ('How to Handle Project Managers: a survival guide', 'Barb Byro', 4, 5, 10.5, 1.5), - - ('lunch, ACCU AGM', '', None, 5, 12.0, 2.0), - - ('Sauce: An OO recursive descent parser; its design and implementation.', 'Jon Jagger', 1, 5, 14.0, 1.5), - ('GNIRTS ESAC REWOL - Bringing the UNIX filters to the C++ iostream library.', 'JC van Winkel', 2, 5, 14.0, 1.5), - ('Pattern Writing: Live and Direct', 'Frank Buschmann & Kevlin Henney', 3, 5, 14.0, 3.0), - ('The Future of Programming Languages - A Goldfish Bowl', 'Francis Glassborow and friends', 3, 5, 14.0, 1.5), - - ('Honey, I Shrunk the Threads: Compile-time checked multithreaded transactions in C++', 'Andrei Alexandrescu', 1, 5, 16.0, 1.5), - ('Fun and Functionality with Functors', 'Lois Goldthwaite', 2, 5, 16.0, 1.5), - ('Agile Enough?', 'Alan Griffiths', 4, 5, 16.0, 1.5), - ("Conference Closure: A brief plenary session", '', None, 5, 17.5, 0.5), - - ] - - #return cal - cal.day = 1 - - d.add(cal) - - - for format in ['pdf']:#,'gif','png']: - out = d.asString(format) - open('eventcal.%s' % format, 'wb').write(out) - print('saved eventcal.%s' % format) - -if __name__=='__main__': - test() diff --git a/reportlab/graphics/widgets/flags.py b/reportlab/graphics/widgets/flags.py deleted file mode 100644 index d2fedd2c..00000000 --- a/reportlab/graphics/widgets/flags.py +++ /dev/null @@ -1,880 +0,0 @@ -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/flags.py -# Flag Widgets - a collection of flags as widgets -# author: John Precedo (johnp@reportlab.com) - -__version__=''' $Id$ ''' -__doc__="""This file is a collection of flag graphics as widgets. - -All flags are represented at the ratio of 1:2, even where the official ratio for the flag is something else -(such as 3:5 for the German national flag). The only exceptions are for where this would look _very_ wrong, -such as the Danish flag whose (ratio is 28:37), or the Swiss flag (which is square). - -Unless otherwise stated, these flags are all the 'national flags' of the countries, rather than their -state flags, naval flags, ensigns or any other variants. (National flags are the flag flown by civilians -of a country and the ones usually used to represent a country abroad. State flags are the variants used by -the government and by diplomatic missions overseas). - -To check on how close these are to the 'official' representations of flags, check the World Flag Database at -http://www.flags.ndirect.co.uk/ - -The flags this file contains are: - -EU Members: -United Kingdom, Austria, Belgium, Denmark, Finland, France, Germany, Greece, Ireland, Italy, Luxembourg, -Holland (The Netherlands), Spain, Sweden - -Others: -USA, Czech Republic, European Union, Switzerland, Turkey, Brazil - -(Brazilian flag contributed by Publio da Costa Melo [publio@planetarium.com.br]). -""" - -from reportlab.lib import colors -from reportlab.lib.validators import * -from reportlab.lib.attrmap import * -from reportlab.graphics.shapes import Line, Rect, Polygon, Drawing, Group, String, Circle, Wedge -from reportlab.graphics.widgetbase import Widget -from reportlab.graphics import renderPDF -from reportlab.graphics.widgets.signsandsymbols import _Symbol -import copy -from math import sin, cos, pi - -validFlag=OneOf(None, - 'UK', - 'USA', - 'Afghanistan', - 'Austria', - 'Belgium', - 'China', - 'Cuba', - 'Denmark', - 'Finland', - 'France', - 'Germany', - 'Greece', - 'Ireland', - 'Italy', - 'Japan', - 'Luxembourg', - 'Holland', - 'Palestine', - 'Portugal', - 'Russia', - 'Spain', - 'Sweden', - 'Norway', - 'CzechRepublic', - 'Turkey', - 'Switzerland', - 'EU', - 'Brazil' - ) - -_size = 100. - -class Star(_Symbol): - """This draws a 5-pointed star. - - possible attributes: - 'x', 'y', 'size', 'fillColor', 'strokeColor' - - """ - _attrMap = AttrMap(BASE=_Symbol, - angle = AttrMapValue(isNumber, desc='angle in degrees'), - ) - _size = 100. - - def __init__(self): - _Symbol.__init__(self) - self.size = 100 - self.fillColor = colors.yellow - self.strokeColor = None - self.angle = 0 - - def demo(self): - D = Drawing(200, 100) - et = Star() - et.x=50 - et.y=0 - D.add(et) - labelFontSize = 10 - D.add(String(et.x+(et.size/2.0),(et.y-(1.2*labelFontSize)), - et.__class__.__name__, fillColor=colors.black, textAnchor='middle', - fontSize=labelFontSize)) - return D - - def draw(self): - s = float(self.size) #abbreviate as we will use this a lot - g = Group() - - # new algorithm from markers.StarFive - R = float(self.size)/2 - r = R*sin(18*(pi/180.0))/cos(36*(pi/180.0)) - P = [] - angle = 90 - for i in range(5): - for radius in R, r: - theta = angle*(pi/180.0) - P.append(radius*cos(theta)) - P.append(radius*sin(theta)) - angle = angle + 36 - # star specific bits - star = Polygon(P, - fillColor = self.fillColor, - strokeColor = self.strokeColor, - strokeWidth=s/50) - g.rotate(self.angle) - g.shift(self.x+self.dx,self.y+self.dy) - g.add(star) - - return g - -class Flag(_Symbol): - """This is a generic flag class that all the flags in this file use as a basis. - - This class basically provides edges and a tidy-up routine to hide any bits of - line that overlap the 'outside' of the flag - - possible attributes: - 'x', 'y', 'size', 'fillColor' - """ - - _attrMap = AttrMap(BASE=_Symbol, - fillColor = AttrMapValue(isColor, desc='Background color'), - border = AttrMapValue(isBoolean, 'Whether a background is drawn'), - kind = AttrMapValue(validFlag, desc='Which flag'), - ) - - _cache = {} - - def __init__(self,**kw): - _Symbol.__init__(self) - self.kind = None - self.size = 100 - self.fillColor = colors.white - self.border=1 - self.setProperties(kw) - - def availableFlagNames(self): - '''return a list of the things we can display''' - return [x for x in self._attrMap['kind'].validate._enum if x is not None] - - def _Flag_None(self): - s = _size # abbreviate as we will use this a lot - g = Group() - g.add(Rect(0, 0, s*2, s, fillColor = colors.purple, strokeColor = colors.black, strokeWidth=0)) - return g - - def _borderDraw(self,f): - s = self.size # abbreviate as we will use this a lot - g = Group() - g.add(f) - x, y, sW = self.x+self.dx, self.y+self.dy, self.strokeWidth/2. - g.insert(0,Rect(-sW, -sW, width=getattr(self,'_width',2*s)+3*sW, height=getattr(self,'_height',s)+2*sW, - fillColor = None, strokeColor = self.strokeColor, strokeWidth=sW*2)) - g.shift(x,y) - g.scale(s/_size, s/_size) - return g - - def draw(self): - kind = self.kind or 'None' - f = self._cache.get(kind) - if not f: - f = getattr(self,'_Flag_'+kind)() - self._cache[kind] = f._explode() - return self._borderDraw(f) - - def clone(self): - return copy.copy(self) - - def demo(self): - D = Drawing(200, 100) - name = self.availableFlagNames() - import time - name = name[int(time.time()) % len(name)] - fx = Flag() - fx.kind = name - fx.x = 0 - fx.y = 0 - D.add(fx) - labelFontSize = 10 - D.add(String(fx.x+(fx.size/2.0),(fx.y-(1.2*labelFontSize)), - name, fillColor=colors.black, textAnchor='middle', - fontSize=labelFontSize)) - labelFontSize = int(fx.size/4.0) - D.add(String(fx.x+(fx.size),(fx.y+((fx.size/2.0))), - "SAMPLE", fillColor=colors.gold, textAnchor='middle', - fontSize=labelFontSize, fontName="Helvetica-Bold")) - return D - - def _Flag_UK(self): - s = _size - g = Group() - w = s*2 - g.add(Rect(0, 0, w, s, fillColor = colors.navy, strokeColor = colors.black, strokeWidth=0)) - g.add(Polygon([0,0, s*.225,0, w,s*(1-.1125), w,s, w-s*.225,s, 0, s*.1125], fillColor = colors.mintcream, strokeColor=None, strokeWidth=0)) - g.add(Polygon([0,s*(1-.1125), 0, s, s*.225,s, w, s*.1125, w,0, w-s*.225,0], fillColor = colors.mintcream, strokeColor=None, strokeWidth=0)) - g.add(Polygon([0, s-(s/15.0), (s-((s/10.0)*4)), (s*0.65), (s-(s/10.0)*3), (s*0.65), 0, s], fillColor = colors.red, strokeColor = None, strokeWidth=0)) - g.add(Polygon([0, 0, (s-((s/10.0)*3)), (s*0.35), (s-((s/10.0)*2)), (s*0.35), (s/10.0), 0], fillColor = colors.red, strokeColor = None, strokeWidth=0)) - g.add(Polygon([w, s, (s+((s/10.0)*3)), (s*0.65), (s+((s/10.0)*2)), (s*0.65), w-(s/10.0), s], fillColor = colors.red, strokeColor = None, strokeWidth=0)) - g.add(Polygon([w, (s/15.0), (s+((s/10.0)*4)), (s*0.35), (s+((s/10.0)*3)), (s*0.35), w, 0], fillColor = colors.red, strokeColor = None, strokeWidth=0)) - g.add(Rect(((s*0.42)*2), 0, width=(0.16*s)*2, height=s, fillColor = colors.mintcream, strokeColor = None, strokeWidth=0)) - g.add(Rect(0, (s*0.35), width=w, height=s*0.3, fillColor = colors.mintcream, strokeColor = None, strokeWidth=0)) - g.add(Rect(((s*0.45)*2), 0, width=(0.1*s)*2, height=s, fillColor = colors.red, strokeColor = None, strokeWidth=0)) - g.add(Rect(0, (s*0.4), width=w, height=s*0.2, fillColor = colors.red, strokeColor = None, strokeWidth=0)) - return g - - def _Flag_USA(self): - s = _size # abbreviate as we will use this a lot - g = Group() - - box = Rect(0, 0, s*2, s, fillColor = colors.mintcream, strokeColor = colors.black, strokeWidth=0) - g.add(box) - - for stripecounter in range (13,0, -1): - stripeheight = s/13.0 - if not (stripecounter%2 == 0): - stripecolor = colors.red - else: - stripecolor = colors.mintcream - redorwhiteline = Rect(0, (s-(stripeheight*stripecounter)), width=s*2, height=stripeheight, - fillColor = stripecolor, strokeColor = None, strokeWidth=20) - g.add(redorwhiteline) - - bluebox = Rect(0, (s-(stripeheight*7)), width=0.8*s, height=stripeheight*7, - fillColor = colors.darkblue, strokeColor = None, strokeWidth=0) - g.add(bluebox) - - lss = s*0.045 - lss2 = lss/2.0 - s9 = s/9.0 - s7 = s/7.0 - for starxcounter in range(5): - for starycounter in range(4): - ls = Star() - ls.size = lss - ls.x = 0-s/22.0+lss/2.0+s7+starxcounter*s7 - ls.fillColor = colors.mintcream - ls.y = s-(starycounter+1)*s9+lss2 - g.add(ls) - - for starxcounter in range(6): - for starycounter in range(5): - ls = Star() - ls.size = lss - ls.x = 0-(s/22.0)+lss/2.0+s/14.0+starxcounter*s7 - ls.fillColor = colors.mintcream - ls.y = s-(starycounter+1)*s9+(s/18.0)+lss2 - g.add(ls) - return g - - def _Flag_Afghanistan(self): - s = _size - g = Group() - - box = Rect(0, 0, s*2, s, - fillColor = colors.mintcream, strokeColor = colors.black, strokeWidth=0) - g.add(box) - - greenbox = Rect(0, ((s/3.0)*2.0), width=s*2.0, height=s/3.0, - fillColor = colors.limegreen, strokeColor = None, strokeWidth=0) - g.add(greenbox) - - blackbox = Rect(0, 0, width=s*2.0, height=s/3.0, - fillColor = colors.black, strokeColor = None, strokeWidth=0) - g.add(blackbox) - return g - - def _Flag_Austria(self): - s = _size # abbreviate as we will use this a lot - g = Group() - - box = Rect(0, 0, s*2, s, fillColor = colors.mintcream, - strokeColor = colors.black, strokeWidth=0) - g.add(box) - - - redbox1 = Rect(0, 0, width=s*2.0, height=s/3.0, - fillColor = colors.red, strokeColor = None, strokeWidth=0) - g.add(redbox1) - - redbox2 = Rect(0, ((s/3.0)*2.0), width=s*2.0, height=s/3.0, - fillColor = colors.red, strokeColor = None, strokeWidth=0) - g.add(redbox2) - return g - - def _Flag_Belgium(self): - s = _size - g = Group() - - box = Rect(0, 0, s*2, s, - fillColor = colors.black, strokeColor = colors.black, strokeWidth=0) - g.add(box) - - - box1 = Rect(0, 0, width=(s/3.0)*2.0, height=s, - fillColor = colors.black, strokeColor = None, strokeWidth=0) - g.add(box1) - - box2 = Rect(((s/3.0)*2.0), 0, width=(s/3.0)*2.0, height=s, - fillColor = colors.gold, strokeColor = None, strokeWidth=0) - g.add(box2) - - box3 = Rect(((s/3.0)*4.0), 0, width=(s/3.0)*2.0, height=s, - fillColor = colors.red, strokeColor = None, strokeWidth=0) - g.add(box3) - return g - - def _Flag_China(self): - s = _size - g = Group() - self._width = w = s*1.5 - g.add(Rect(0, 0, w, s, fillColor=colors.red, strokeColor=None, strokeWidth=0)) - - def addStar(x,y,size,angle,g=g,w=s/20.0,x0=0,y0=s/2.0): - s = Star() - s.fillColor=colors.yellow - s.angle = angle - s.size = size*w*2 - s.x = x*w+x0 - s.y = y*w+y0 - g.add(s) - - addStar(5,5,3, 0) - addStar(10,1,1,36.86989765) - addStar(12,3,1,8.213210702) - addStar(12,6,1,16.60154960) - addStar(10,8,1,53.13010235) - return g - - def _Flag_Cuba(self): - s = _size - g = Group() - - for i in range(5): - stripe = Rect(0, i*s/5.0, width=s*2, height=s/5.0, - fillColor = [colors.darkblue, colors.mintcream][i%2], - strokeColor = None, - strokeWidth=0) - g.add(stripe) - - redwedge = Polygon(points = [ 0, 0, 4*s/5.0, (s/2.0), 0, s], - fillColor = colors.red, strokeColor = None, strokeWidth=0) - g.add(redwedge) - - star = Star() - star.x = 2.5*s/10.0 - star.y = s/2.0 - star.size = 3*s/10.0 - star.fillColor = colors.white - g.add(star) - - box = Rect(0, 0, s*2, s, - fillColor = None, - strokeColor = colors.black, - strokeWidth=0) - g.add(box) - - return g - - def _Flag_Denmark(self): - s = _size - g = Group() - self._width = w = s*1.4 - - box = Rect(0, 0, w, s, - fillColor = colors.red, strokeColor = colors.black, strokeWidth=0) - g.add(box) - - whitebox1 = Rect(((s/5.0)*2), 0, width=s/6.0, height=s, - fillColor = colors.mintcream, strokeColor = None, strokeWidth=0) - g.add(whitebox1) - - whitebox2 = Rect(0, ((s/2.0)-(s/12.0)), width=w, height=s/6.0, - fillColor = colors.mintcream, strokeColor = None, strokeWidth=0) - g.add(whitebox2) - return g - - def _Flag_Finland(self): - s = _size - g = Group() - - # crossbox specific bits - box = Rect(0, 0, s*2, s, - fillColor = colors.ghostwhite, strokeColor = colors.black, strokeWidth=0) - g.add(box) - - blueline1 = Rect((s*0.6), 0, width=0.3*s, height=s, - fillColor = colors.darkblue, strokeColor = None, strokeWidth=0) - g.add(blueline1) - - blueline2 = Rect(0, (s*0.4), width=s*2, height=s*0.3, - fillColor = colors.darkblue, strokeColor = None, strokeWidth=0) - g.add(blueline2) - return g - - def _Flag_France(self): - s = _size - g = Group() - - box = Rect(0, 0, s*2, s, fillColor = colors.navy, strokeColor = colors.black, strokeWidth=0) - g.add(box) - - bluebox = Rect(0, 0, width=((s/3.0)*2.0), height=s, - fillColor = colors.blue, strokeColor = None, strokeWidth=0) - g.add(bluebox) - - whitebox = Rect(((s/3.0)*2.0), 0, width=((s/3.0)*2.0), height=s, - fillColor = colors.mintcream, strokeColor = None, strokeWidth=0) - g.add(whitebox) - - redbox = Rect(((s/3.0)*4.0), 0, width=((s/3.0)*2.0), height=s, - fillColor = colors.red, - strokeColor = None, - strokeWidth=0) - g.add(redbox) - return g - - def _Flag_Germany(self): - s = _size - g = Group() - - box = Rect(0, 0, s*2, s, - fillColor = colors.gold, strokeColor = colors.black, strokeWidth=0) - g.add(box) - - blackbox1 = Rect(0, ((s/3.0)*2.0), width=s*2.0, height=s/3.0, - fillColor = colors.black, strokeColor = None, strokeWidth=0) - g.add(blackbox1) - - redbox1 = Rect(0, (s/3.0), width=s*2.0, height=s/3.0, - fillColor = colors.orangered, strokeColor = None, strokeWidth=0) - g.add(redbox1) - return g - - def _Flag_Greece(self): - s = _size - g = Group() - - box = Rect(0, 0, s*2, s, fillColor = colors.gold, - strokeColor = colors.black, strokeWidth=0) - g.add(box) - - for stripecounter in range (9,0, -1): - stripeheight = s/9.0 - if not (stripecounter%2 == 0): - stripecolor = colors.deepskyblue - else: - stripecolor = colors.mintcream - - blueorwhiteline = Rect(0, (s-(stripeheight*stripecounter)), width=s*2, height=stripeheight, - fillColor = stripecolor, strokeColor = None, strokeWidth=20) - g.add(blueorwhiteline) - - bluebox1 = Rect(0, ((s)-stripeheight*5), width=(stripeheight*5), height=stripeheight*5, - fillColor = colors.deepskyblue, strokeColor = None, strokeWidth=0) - g.add(bluebox1) - - whiteline1 = Rect(0, ((s)-stripeheight*3), width=stripeheight*5, height=stripeheight, - fillColor = colors.mintcream, strokeColor = None, strokeWidth=0) - g.add(whiteline1) - - whiteline2 = Rect((stripeheight*2), ((s)-stripeheight*5), width=stripeheight, height=stripeheight*5, - fillColor = colors.mintcream, strokeColor = None, strokeWidth=0) - g.add(whiteline2) - - return g - - def _Flag_Ireland(self): - s = _size - g = Group() - - box = Rect(0, 0, s*2, s, - fillColor = colors.forestgreen, strokeColor = colors.black, strokeWidth=0) - g.add(box) - - whitebox = Rect(((s*2.0)/3.0), 0, width=(2.0*(s*2.0)/3.0), height=s, - fillColor = colors.mintcream, strokeColor = None, strokeWidth=0) - g.add(whitebox) - - orangebox = Rect(((2.0*(s*2.0)/3.0)), 0, width=(s*2.0)/3.0, height=s, - fillColor = colors.darkorange, strokeColor = None, strokeWidth=0) - g.add(orangebox) - return g - - def _Flag_Italy(self): - s = _size - g = Group() - g.add(Rect(0,0,s*2,s,fillColor=colors.forestgreen,strokeColor=None, strokeWidth=0)) - g.add(Rect((2*s)/3.0, 0, width=(s*4)/3.0, height=s, fillColor = colors.mintcream, strokeColor = None, strokeWidth=0)) - g.add(Rect((4*s)/3.0, 0, width=(s*2)/3.0, height=s, fillColor = colors.red, strokeColor = None, strokeWidth=0)) - return g - - def _Flag_Japan(self): - s = _size - g = Group() - w = self._width = s*1.5 - g.add(Rect(0,0,w,s,fillColor=colors.mintcream,strokeColor=None, strokeWidth=0)) - g.add(Circle(cx=w/2.0,cy=s/2.0,r=0.3*w,fillColor=colors.red,strokeColor=None, strokeWidth=0)) - return g - - def _Flag_Luxembourg(self): - s = _size - g = Group() - - box = Rect(0, 0, s*2, s, - fillColor = colors.mintcream, strokeColor = colors.black, strokeWidth=0) - g.add(box) - - redbox = Rect(0, ((s/3.0)*2.0), width=s*2.0, height=s/3.0, - fillColor = colors.red, strokeColor = None, strokeWidth=0) - g.add(redbox) - - bluebox = Rect(0, 0, width=s*2.0, height=s/3.0, - fillColor = colors.dodgerblue, strokeColor = None, strokeWidth=0) - g.add(bluebox) - return g - - def _Flag_Holland(self): - s = _size - g = Group() - - box = Rect(0, 0, s*2, s, - fillColor = colors.mintcream, strokeColor = colors.black, strokeWidth=0) - g.add(box) - - redbox = Rect(0, ((s/3.0)*2.0), width=s*2.0, height=s/3.0, - fillColor = colors.red, strokeColor = None, strokeWidth=0) - g.add(redbox) - - bluebox = Rect(0, 0, width=s*2.0, height=s/3.0, - fillColor = colors.darkblue, strokeColor = None, strokeWidth=0) - g.add(bluebox) - return g - - def _Flag_Portugal(self): - return Group() - - def _Flag_Russia(self): - s = _size - g = Group() - w = self._width = s*1.5 - t = s/3.0 - g.add(Rect(0, 0, width=w, height=t, fillColor = colors.red, strokeColor = None, strokeWidth=0)) - g.add(Rect(0, t, width=w, height=t, fillColor = colors.blue, strokeColor = None, strokeWidth=0)) - g.add(Rect(0, 2*t, width=w, height=t, fillColor = colors.mintcream, strokeColor = None, strokeWidth=0)) - return g - - def _Flag_Spain(self): - s = _size - g = Group() - w = self._width = s*1.5 - g.add(Rect(0, 0, width=w, height=s, fillColor = colors.red, strokeColor = None, strokeWidth=0)) - g.add(Rect(0, (s/4.0), width=w, height=s/2.0, fillColor = colors.yellow, strokeColor = None, strokeWidth=0)) - return g - - def _Flag_Sweden(self): - s = _size - g = Group() - self._width = s*1.4 - box = Rect(0, 0, self._width, s, - fillColor = colors.dodgerblue, strokeColor = colors.black, strokeWidth=0) - g.add(box) - - box1 = Rect(((s/5.0)*2), 0, width=s/6.0, height=s, - fillColor = colors.gold, strokeColor = None, strokeWidth=0) - g.add(box1) - - box2 = Rect(0, ((s/2.0)-(s/12.0)), width=self._width, height=s/6.0, - fillColor = colors.gold, - strokeColor = None, - strokeWidth=0) - g.add(box2) - return g - - def _Flag_Norway(self): - s = _size - g = Group() - self._width = s*1.4 - - box = Rect(0, 0, self._width, s, - fillColor = colors.red, strokeColor = colors.black, strokeWidth=0) - g.add(box) - - box = Rect(0, 0, self._width, s, - fillColor = colors.red, strokeColor = colors.black, strokeWidth=0) - g.add(box) - - whiteline1 = Rect(((s*0.2)*2), 0, width=s*0.2, height=s, - fillColor = colors.ghostwhite, strokeColor = None, strokeWidth=0) - g.add(whiteline1) - - whiteline2 = Rect(0, (s*0.4), width=self._width, height=s*0.2, - fillColor = colors.ghostwhite, strokeColor = None, strokeWidth=0) - g.add(whiteline2) - - blueline1 = Rect(((s*0.225)*2), 0, width=0.1*s, height=s, - fillColor = colors.darkblue, strokeColor = None, strokeWidth=0) - g.add(blueline1) - - blueline2 = Rect(0, (s*0.45), width=self._width, height=s*0.1, - fillColor = colors.darkblue, strokeColor = None, strokeWidth=0) - g.add(blueline2) - return g - - def _Flag_CzechRepublic(self): - s = _size - g = Group() - box = Rect(0, 0, s*2, s, - fillColor = colors.mintcream, - strokeColor = colors.black, - strokeWidth=0) - g.add(box) - - redbox = Rect(0, 0, width=s*2, height=s/2.0, - fillColor = colors.red, - strokeColor = None, - strokeWidth=0) - g.add(redbox) - - bluewedge = Polygon(points = [ 0, 0, s, (s/2.0), 0, s], - fillColor = colors.darkblue, strokeColor = None, strokeWidth=0) - g.add(bluewedge) - return g - - def _Flag_Palestine(self): - s = _size - g = Group() - box = Rect(0, s/3.0, s*2, s/3.0, - fillColor = colors.mintcream, - strokeColor = None, - strokeWidth=0) - g.add(box) - - greenbox = Rect(0, 0, width=s*2, height=s/3.0, - fillColor = colors.limegreen, - strokeColor = None, - strokeWidth=0) - g.add(greenbox) - - blackbox = Rect(0, 2*s/3.0, width=s*2, height=s/3.0, - fillColor = colors.black, - strokeColor = None, - strokeWidth=0) - g.add(blackbox) - - redwedge = Polygon(points = [ 0, 0, 2*s/3.0, (s/2.0), 0, s], - fillColor = colors.red, strokeColor = None, strokeWidth=0) - g.add(redwedge) - return g - - def _Flag_Turkey(self): - s = _size - g = Group() - - box = Rect(0, 0, s*2, s, - fillColor = colors.red, - strokeColor = colors.black, - strokeWidth=0) - g.add(box) - - whitecircle = Circle(cx=((s*0.35)*2), cy=s/2.0, r=s*0.3, - fillColor = colors.mintcream, - strokeColor = None, - strokeWidth=0) - g.add(whitecircle) - - redcircle = Circle(cx=((s*0.39)*2), cy=s/2.0, r=s*0.24, - fillColor = colors.red, - strokeColor = None, - strokeWidth=0) - g.add(redcircle) - - ws = Star() - ws.angle = 15 - ws.size = s/5.0 - ws.x = (s*0.5)*2+ws.size/2.0 - ws.y = (s*0.5) - ws.fillColor = colors.mintcream - ws.strokeColor = None - g.add(ws) - return g - - def _Flag_Switzerland(self): - s = _size - g = Group() - self._width = s - - g.add(Rect(0, 0, s, s, fillColor = colors.red, strokeColor = colors.black, strokeWidth=0)) - g.add(Line((s/2.0), (s/5.5), (s/2), (s-(s/5.5)), - fillColor = colors.mintcream, strokeColor = colors.mintcream, strokeWidth=(s/5.0))) - g.add(Line((s/5.5), (s/2.0), (s-(s/5.5)), (s/2.0), - fillColor = colors.mintcream, strokeColor = colors.mintcream, strokeWidth=s/5.0)) - return g - - def _Flag_EU(self): - s = _size - g = Group() - w = self._width = 1.5*s - - g.add(Rect(0, 0, w, s, fillColor = colors.darkblue, strokeColor = None, strokeWidth=0)) - centerx=w/2.0 - centery=s/2.0 - radius=s/3.0 - yradius = radius - xradius = radius - nStars = 12 - delta = 2*pi/nStars - for i in range(nStars): - rad = i*delta - gs = Star() - gs.x=cos(rad)*radius+centerx - gs.y=sin(rad)*radius+centery - gs.size=s/10.0 - gs.fillColor=colors.gold - g.add(gs) - return g - - def _Flag_Brazil(self): - s = _size # abbreviate as we will use this a lot - g = Group() - - m = s/14.0 - self._width = w = (m * 20) - - def addStar(x,y,size, g=g, w=w, s=s, m=m): - st = Star() - st.fillColor=colors.mintcream - st.size = size*m - st.x = (w/2.0) + (x * (0.35 * m)) - st.y = (s/2.0) + (y * (0.35 * m)) - g.add(st) - - g.add(Rect(0, 0, w, s, fillColor = colors.green, strokeColor = None, strokeWidth=0)) - g.add(Polygon(points = [ 1.7*m, (s/2.0), (w/2.0), s-(1.7*m), w-(1.7*m),(s/2.0),(w/2.0), 1.7*m], - fillColor = colors.yellow, strokeColor = None, strokeWidth=0)) - g.add(Circle(cx=w/2.0, cy=s/2.0, r=3.5*m, - fillColor=colors.blue,strokeColor=None, strokeWidth=0)) - g.add(Wedge((w/2.0)-(2*m), 0, 8.5*m, 50, 98.1, 8.5*m, - fillColor=colors.mintcream,strokeColor=None, strokeWidth=0)) - g.add(Wedge((w/2.0), (s/2.0), 3.501*m, 156, 352, 3.501*m, - fillColor=colors.mintcream,strokeColor=None, strokeWidth=0)) - g.add(Wedge((w/2.0)-(2*m), 0, 8*m, 48.1, 100, 8*m, - fillColor=colors.blue,strokeColor=None, strokeWidth=0)) - g.add(Rect(0, 0, w, (s/4.0) + 1.7*m, - fillColor = colors.green, strokeColor = None, strokeWidth=0)) - g.add(Polygon(points = [ 1.7*m,(s/2.0), (w/2.0),s/2.0 - 2*m, w-(1.7*m),(s/2.0) , (w/2.0),1.7*m], - fillColor = colors.yellow, strokeColor = None, strokeWidth=0)) - g.add(Wedge(w/2.0, s/2.0, 3.502*m, 166, 342.1, 3.502*m, - fillColor=colors.blue,strokeColor=None, strokeWidth=0)) - - addStar(3.2,3.5,0.3) - addStar(-8.5,1.5,0.3) - addStar(-7.5,-3,0.3) - addStar(-4,-5.5,0.3) - addStar(0,-4.5,0.3) - addStar(7,-3.5,0.3) - addStar(-3.5,-0.5,0.25) - addStar(0,-1.5,0.25) - addStar(1,-2.5,0.25) - addStar(3,-7,0.25) - addStar(5,-6.5,0.25) - addStar(6.5,-5,0.25) - addStar(7,-4.5,0.25) - addStar(-5.5,-3.2,0.25) - addStar(-6,-4.2,0.25) - addStar(-1,-2.75,0.2) - addStar(2,-5.5,0.2) - addStar(4,-5.5,0.2) - addStar(5,-7.5,0.2) - addStar(5,-5.5,0.2) - addStar(6,-5.5,0.2) - addStar(-8.8,-3.2,0.2) - addStar(2.5,0.5,0.2) - addStar(-0.2,-3.2,0.14) - addStar(-7.2,-2,0.14) - addStar(0,-8,0.1) - - sTmp = "ORDEM E PROGRESSO" - nTmp = len(sTmp) - delta = 0.850848010347/nTmp - radius = 7.9 *m - centerx = (w/2.0)-(2*m) - centery = 0 - for i in range(nTmp): - rad = 2*pi - i*delta -4.60766922527 - x=cos(rad)*radius+centerx - y=sin(rad)*radius+centery - if i == 6: - z = 0.35*m - else: - z= 0.45*m - g2 = Group(String(x, y, sTmp[i], fontName='Helvetica-Bold', - fontSize = z,strokeColor=None,fillColor=colors.green)) - g2.rotate(rad) - g.add(g2) - return g - -def makeFlag(name): - flag = Flag() - flag.kind = name - return flag - -def test(): - """This function produces three pdf files with examples of all the signs and symbols from this file. - """ -# page 1 - - labelFontSize = 10 - - X = (20,245) - - flags = [ - 'UK', - 'USA', - 'Afghanistan', - 'Austria', - 'Belgium', - 'Denmark', - 'Cuba', - 'Finland', - 'France', - 'Germany', - 'Greece', - 'Ireland', - 'Italy', - 'Luxembourg', - 'Holland', - 'Palestine', - 'Portugal', - 'Spain', - 'Sweden', - 'Norway', - 'CzechRepublic', - 'Turkey', - 'Switzerland', - 'EU', - 'Brazil', - ] - y = Y0 = 530 - f = 0 - D = None - for name in flags: - if not D: D = Drawing(450,650) - flag = makeFlag(name) - i = flags.index(name) - flag.x = X[i%2] - flag.y = y - D.add(flag) - D.add(String(flag.x+(flag.size/2.0),(flag.y-(1.2*labelFontSize)), - name, fillColor=colors.black, textAnchor='middle', fontSize=labelFontSize)) - if i%2: y = y - 125 - if (i%2 and y<0) or name==flags[-1]: - renderPDF.drawToFile(D, 'flags%02d.pdf'%f, 'flags.py - Page #%d'%(f+1)) - y = Y0 - f = f+1 - D = None - -if __name__=='__main__': - test() diff --git a/reportlab/graphics/widgets/grids.py b/reportlab/graphics/widgets/grids.py deleted file mode 100644 index 693cbd7c..00000000 --- a/reportlab/graphics/widgets/grids.py +++ /dev/null @@ -1,519 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/grids.py -__version__=''' $Id$ ''' - -from reportlab.lib import colors -from reportlab.lib.validators import isNumber, isColorOrNone, isBoolean, isListOfNumbers, OneOf, isListOfColors, isNumberOrNone -from reportlab.lib.attrmap import AttrMap, AttrMapValue -from reportlab.graphics.shapes import Drawing, Group, Line, Rect, LineShape, definePath, EmptyClipPath -from reportlab.graphics.widgetbase import Widget - -def frange(start, end=None, inc=None): - "A range function, that does accept float increments..." - - if end == None: - end = start + 0.0 - start = 0.0 - - if inc == None: - inc = 1.0 - - L = [] - end = end - inc*0.0001 #to avoid numrical problems - while 1: - next = start + len(L) * inc - if inc > 0 and next >= end: - break - elif inc < 0 and next <= end: - break - L.append(next) - - return L - - -def makeDistancesList(list): - """Returns a list of distances between adjacent numbers in some input list. - - E.g. [1, 1, 2, 3, 5, 7] -> [0, 1, 1, 2, 2] - """ - - d = [] - for i in range(len(list[:-1])): - d.append(list[i+1] - list[i]) - - return d - - -class Grid(Widget): - """This makes a rectangular grid of equidistant stripes. - - The grid contains an outer border rectangle, and stripes - inside which can be drawn with lines and/or as solid tiles. - The drawing order is: outer rectangle, then lines and tiles. - - The stripes' width is indicated as 'delta'. The sequence of - stripes can have an offset named 'delta0'. Both values need - to be positive! - """ - - _attrMap = AttrMap( - x = AttrMapValue(isNumber, desc="The grid's lower-left x position."), - y = AttrMapValue(isNumber, desc="The grid's lower-left y position."), - width = AttrMapValue(isNumber, desc="The grid's width."), - height = AttrMapValue(isNumber, desc="The grid's height."), - orientation = AttrMapValue(OneOf(('vertical', 'horizontal')), - desc='Determines if stripes are vertical or horizontal.'), - useLines = AttrMapValue(OneOf((0, 1)), - desc='Determines if stripes are drawn with lines.'), - useRects = AttrMapValue(OneOf((0, 1)), - desc='Determines if stripes are drawn with solid rectangles.'), - delta = AttrMapValue(isNumber, - desc='Determines the width/height of the stripes.'), - delta0 = AttrMapValue(isNumber, - desc='Determines the stripes initial width/height offset.'), - deltaSteps = AttrMapValue(isListOfNumbers, - desc='List of deltas to be used cyclically.'), - stripeColors = AttrMapValue(isListOfColors, - desc='Colors applied cyclically in the right or upper direction.'), - fillColor = AttrMapValue(isColorOrNone, - desc='Background color for entire rectangle.'), - strokeColor = AttrMapValue(isColorOrNone, - desc='Color used for lines.'), - strokeWidth = AttrMapValue(isNumber, - desc='Width used for lines.'), - rectStrokeColor = AttrMapValue(isColorOrNone, desc='Color for outer rect stroke.'), - rectStrokeWidth = AttrMapValue(isNumberOrNone, desc='Width for outer rect stroke.'), - ) - - def __init__(self): - self.x = 0 - self.y = 0 - self.width = 100 - self.height = 100 - self.orientation = 'vertical' - self.useLines = 0 - self.useRects = 1 - self.delta = 20 - self.delta0 = 0 - self.deltaSteps = [] - self.fillColor = colors.white - self.stripeColors = [colors.red, colors.green, colors.blue] - self.strokeColor = colors.black - self.strokeWidth = 2 - - - def demo(self): - D = Drawing(100, 100) - - g = Grid() - D.add(g) - - return D - - def makeOuterRect(self): - strokeColor = getattr(self,'rectStrokeColor',self.strokeColor) - strokeWidth = getattr(self,'rectStrokeWidth',self.strokeWidth) - if self.fillColor or (strokeColor and strokeWidth): - rect = Rect(self.x, self.y, self.width, self.height) - rect.fillColor = self.fillColor - rect.strokeColor = strokeColor - rect.strokeWidth = strokeWidth - return rect - else: - return None - - def makeLinePosList(self, start, isX=0): - "Returns a list of positions where to place lines." - - w, h = self.width, self.height - if isX: - length = w - else: - length = h - if self.deltaSteps: - r = [start + self.delta0] - i = 0 - while 1: - if r[-1] > start + length: - del r[-1] - break - r.append(r[-1] + self.deltaSteps[i % len(self.deltaSteps)]) - i = i + 1 - else: - r = frange(start + self.delta0, start + length, self.delta) - - r.append(start + length) - if self.delta0 != 0: - r.insert(0, start) - #print 'Grid.makeLinePosList() -> %s' % r - return r - - - def makeInnerLines(self): - # inner grid lines - group = Group() - - w, h = self.width, self.height - - if self.useLines == 1: - if self.orientation == 'vertical': - r = self.makeLinePosList(self.x, isX=1) - for x in r: - line = Line(x, self.y, x, self.y + h) - line.strokeColor = self.strokeColor - line.strokeWidth = self.strokeWidth - group.add(line) - elif self.orientation == 'horizontal': - r = self.makeLinePosList(self.y, isX=0) - for y in r: - line = Line(self.x, y, self.x + w, y) - line.strokeColor = self.strokeColor - line.strokeWidth = self.strokeWidth - group.add(line) - - return group - - - def makeInnerTiles(self): - # inner grid lines - group = Group() - - w, h = self.width, self.height - - # inner grid stripes (solid rectangles) - if self.useRects == 1: - cols = self.stripeColors - - if self.orientation == 'vertical': - r = self.makeLinePosList(self.x, isX=1) - elif self.orientation == 'horizontal': - r = self.makeLinePosList(self.y, isX=0) - - dist = makeDistancesList(r) - - i = 0 - for j in range(len(dist)): - if self.orientation == 'vertical': - x = r[j] - stripe = Rect(x, self.y, dist[j], h) - elif self.orientation == 'horizontal': - y = r[j] - stripe = Rect(self.x, y, w, dist[j]) - stripe.fillColor = cols[i % len(cols)] - stripe.strokeColor = None - group.add(stripe) - i = i + 1 - - return group - - - def draw(self): - # general widget bits - group = Group() - - group.add(self.makeOuterRect()) - group.add(self.makeInnerTiles()) - group.add(self.makeInnerLines(),name='_gridLines') - - return group - - -class DoubleGrid(Widget): - """This combines two ordinary Grid objects orthogonal to each other. - """ - - _attrMap = AttrMap( - x = AttrMapValue(isNumber, desc="The grid's lower-left x position."), - y = AttrMapValue(isNumber, desc="The grid's lower-left y position."), - width = AttrMapValue(isNumber, desc="The grid's width."), - height = AttrMapValue(isNumber, desc="The grid's height."), - grid0 = AttrMapValue(None, desc="The first grid component."), - grid1 = AttrMapValue(None, desc="The second grid component."), - ) - - def __init__(self): - self.x = 0 - self.y = 0 - self.width = 100 - self.height = 100 - - g0 = Grid() - g0.x = self.x - g0.y = self.y - g0.width = self.width - g0.height = self.height - g0.orientation = 'vertical' - g0.useLines = 1 - g0.useRects = 0 - g0.delta = 20 - g0.delta0 = 0 - g0.deltaSteps = [] - g0.fillColor = colors.white - g0.stripeColors = [colors.red, colors.green, colors.blue] - g0.strokeColor = colors.black - g0.strokeWidth = 1 - - g1 = Grid() - g1.x = self.x - g1.y = self.y - g1.width = self.width - g1.height = self.height - g1.orientation = 'horizontal' - g1.useLines = 1 - g1.useRects = 0 - g1.delta = 20 - g1.delta0 = 0 - g1.deltaSteps = [] - g1.fillColor = colors.white - g1.stripeColors = [colors.red, colors.green, colors.blue] - g1.strokeColor = colors.black - g1.strokeWidth = 1 - - self.grid0 = g0 - self.grid1 = g1 - - -## # This gives an AttributeError: -## # DoubleGrid instance has no attribute 'grid0' -## def __setattr__(self, name, value): -## if name in ('x', 'y', 'width', 'height'): -## setattr(self.grid0, name, value) -## setattr(self.grid1, name, value) - - - def demo(self): - D = Drawing(100, 100) - g = DoubleGrid() - D.add(g) - return D - - - def draw(self): - group = Group() - g0, g1 = self.grid0, self.grid1 - # Order groups to make sure both v and h lines - # are visible (works only when there is only - # one kind of stripes, v or h). - G = g0.useRects == 1 and g1.useRects == 0 and (g0,g1) or (g1,g0) - for g in G: - group.add(g.makeOuterRect()) - for g in G: - group.add(g.makeInnerTiles()) - group.add(g.makeInnerLines(),name='_gridLines') - - return group - - -class ShadedRect(Widget): - """This makes a rectangle with shaded colors between two colors. - - Colors are interpolated linearly between 'fillColorStart' - and 'fillColorEnd', both of which appear at the margins. - If 'numShades' is set to one, though, only 'fillColorStart' - is used. - """ - - _attrMap = AttrMap( - x = AttrMapValue(isNumber, desc="The grid's lower-left x position."), - y = AttrMapValue(isNumber, desc="The grid's lower-left y position."), - width = AttrMapValue(isNumber, desc="The grid's width."), - height = AttrMapValue(isNumber, desc="The grid's height."), - orientation = AttrMapValue(OneOf(('vertical', 'horizontal')), desc='Determines if stripes are vertical or horizontal.'), - numShades = AttrMapValue(isNumber, desc='The number of interpolating colors.'), - fillColorStart = AttrMapValue(isColorOrNone, desc='Start value of the color shade.'), - fillColorEnd = AttrMapValue(isColorOrNone, desc='End value of the color shade.'), - strokeColor = AttrMapValue(isColorOrNone, desc='Color used for border line.'), - strokeWidth = AttrMapValue(isNumber, desc='Width used for lines.'), - cylinderMode = AttrMapValue(isBoolean, desc='True if shading reverses in middle.'), - ) - - def __init__(self,**kw): - self.x = 0 - self.y = 0 - self.width = 100 - self.height = 100 - self.orientation = 'vertical' - self.numShades = 20 - self.fillColorStart = colors.pink - self.fillColorEnd = colors.black - self.strokeColor = colors.black - self.strokeWidth = 2 - self.cylinderMode = 0 - self.setProperties(kw) - - def demo(self): - D = Drawing(100, 100) - g = ShadedRect() - D.add(g) - - return D - - def _flipRectCorners(self): - "Flip rectangle's corners if width or height is negative." - x, y, width, height, fillColorStart, fillColorEnd = self.x, self.y, self.width, self.height, self.fillColorStart, self.fillColorEnd - if width < 0 and height > 0: - x = x + width - width = -width - if self.orientation=='vertical': fillColorStart, fillColorEnd = fillColorEnd, fillColorStart - elif height<0 and width>0: - y = y + height - height = -height - if self.orientation=='horizontal': fillColorStart, fillColorEnd = fillColorEnd, fillColorStart - elif height < 0 and height < 0: - x = x + width - width = -width - y = y + height - height = -height - return x, y, width, height, fillColorStart, fillColorEnd - - def draw(self): - # general widget bits - group = Group() - x, y, w, h, c0, c1 = self._flipRectCorners() - numShades = self.numShades - if self.cylinderMode: - if not numShades%2: numShades = numShades+1 - halfNumShades = int((numShades-1)/2) + 1 - num = float(numShades) # must make it float! - vertical = self.orientation == 'vertical' - if vertical: - if numShades == 1: - V = [x] - else: - V = frange(x, x + w, w/num) - else: - if numShades == 1: - V = [y] - else: - V = frange(y, y + h, h/num) - - for v in V: - stripe = vertical and Rect(v, y, w/num, h) or Rect(x, v, w, h/num) - if self.cylinderMode: - if V.index(v)>=halfNumShades: - col = colors.linearlyInterpolatedColor(c1,c0,V[halfNumShades],V[-1], v) - else: - col = colors.linearlyInterpolatedColor(c0,c1,V[0],V[halfNumShades], v) - else: - col = colors.linearlyInterpolatedColor(c0,c1,V[0],V[-1], v) - stripe.fillColor = col - stripe.strokeColor = col - stripe.strokeWidth = 1 - group.add(stripe) - if self.strokeColor and self.strokeWidth>=0: - rect = Rect(x, y, w, h) - rect.strokeColor = self.strokeColor - rect.strokeWidth = self.strokeWidth - rect.fillColor = None - group.add(rect) - return group - - -def colorRange(c0, c1, n): - "Return a range of intermediate colors between c0 and c1" - if n==1: return [c0] - - C = [] - if n>1: - lim = n-1 - for i in range(n): - C.append(colors.linearlyInterpolatedColor(c0,c1,0,lim, i)) - return C - - -def centroid(P): - '''compute average point of a set of points''' - cx = 0 - cy = 0 - for x,y in P: - cx+=x - cy+=y - n = float(len(P)) - return cx/n, cy/n - -def rotatedEnclosingRect(P, angle, rect): - ''' - given P a sequence P of x,y coordinate pairs and an angle in degrees - find the centroid of P and the axis at angle theta through it - find the extreme points of P wrt axis parallel distance and axis - orthogonal distance. Then compute the least rectangle that will still - enclose P when rotated by angle. - - The class R - ''' - from math import pi, cos, sin, tan - x0, y0 = centroid(P) - theta = (angle/180.)*pi - s,c=sin(theta),cos(theta) - def parallelAxisDist(xy,s=s,c=c,x0=x0,y0=y0): - x,y = xy - return (s*(y-y0)+c*(x-x0)) - def orthogonalAxisDist(xy,s=s,c=c,x0=x0,y0=y0): - x,y = xy - return (c*(y-y0)+s*(x-x0)) - L = list(map(parallelAxisDist,P)) - L.sort() - a0, a1 = L[0], L[-1] - L = list(map(orthogonalAxisDist,P)) - L.sort() - b0, b1 = L[0], L[-1] - rect.x, rect.width = a0, a1-a0 - rect.y, rect.height = b0, b1-b0 - g = Group(transform=(c,s,-s,c,x0,y0)) - g.add(rect) - return g - -class ShadedPolygon(Widget,LineShape): - _attrMap = AttrMap(BASE=LineShape, - angle = AttrMapValue(isNumber,desc="Shading angle"), - fillColorStart = AttrMapValue(isColorOrNone), - fillColorEnd = AttrMapValue(isColorOrNone), - numShades = AttrMapValue(isNumber, desc='The number of interpolating colors.'), - cylinderMode = AttrMapValue(isBoolean, desc='True if shading reverses in middle.'), - points = AttrMapValue(isListOfNumbers), - ) - - def __init__(self,**kw): - self.angle = 90 - self.fillColorStart = colors.red - self.fillColorEnd = colors.green - self.cylinderMode = 0 - self.numShades = 50 - self.points = [-1,-1,2,2,3,-1] - LineShape.__init__(self,kw) - - def draw(self): - P = self.points - P = list(map(lambda i, P=P:(P[i],P[i+1]),range(0,len(P),2))) - path = definePath([('moveTo',)+P[0]]+[('lineTo',)+x for x in P[1:]]+['closePath'], - fillColor=None, strokeColor=None) - path.isClipPath = 1 - g = Group() - g.add(path) - angle = self.angle - orientation = 'vertical' - if angle==180: - angle = 0 - elif angle in (90,270): - orientation ='horizontal' - angle = 0 - rect = ShadedRect(strokeWidth=0,strokeColor=None,orientation=orientation) - for k in 'fillColorStart', 'fillColorEnd', 'numShades', 'cylinderMode': - setattr(rect,k,getattr(self,k)) - g.add(rotatedEnclosingRect(P, angle, rect)) - g.add(EmptyClipPath) - path = path.copy() - path.isClipPath = 0 - path.strokeColor = self.strokeColor - path.strokeWidth = self.strokeWidth - g.add(path) - return g - -if __name__=='__main__': #noruntests - from reportlab.lib.colors import blue - from reportlab.graphics.shapes import Drawing - angle=45 - D = Drawing(120,120) - D.add(ShadedPolygon(points=(10,10,60,60,110,10),strokeColor=None,strokeWidth=1,angle=90,numShades=50,cylinderMode=0)) - D.save(formats=['gif'],fnRoot='shobj',outDir='/tmp') diff --git a/reportlab/graphics/widgets/markers.py b/reportlab/graphics/widgets/markers.py deleted file mode 100644 index 11851fd4..00000000 --- a/reportlab/graphics/widgets/markers.py +++ /dev/null @@ -1,245 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2013 -#see license.txt for license details - -__version__=''' $Id$ ''' -__doc__="""This modules defines a collection of markers used in charts. -""" - -from reportlab.graphics.shapes import Rect, Line, Circle, Polygon, Drawing, Group -from reportlab.graphics.widgets.signsandsymbols import SmileyFace -from reportlab.graphics.widgetbase import Widget -from reportlab.lib.validators import isNumber, isColorOrNone, OneOf, Validator -from reportlab.lib.attrmap import AttrMap, AttrMapValue -from reportlab.lib.colors import black -from reportlab.lib.utils import isFunction, isClass -from reportlab.graphics.widgets.flags import Flag -from math import sin, cos, pi -_toradians = pi/180.0 - -class Marker(Widget): - '''A polymorphic class of markers''' - _attrMap = AttrMap(BASE=Widget, - kind = AttrMapValue( - OneOf(None, 'Square', 'Diamond', 'Circle', 'Cross', 'Triangle', 'StarSix', - 'Pentagon', 'Hexagon', 'Heptagon', 'Octagon', 'StarFive', - 'FilledSquare', 'FilledCircle', 'FilledDiamond', 'FilledCross', - 'FilledTriangle','FilledStarSix', 'FilledPentagon', 'FilledHexagon', - 'FilledHeptagon', 'FilledOctagon', 'FilledStarFive', - 'Smiley','ArrowHead', 'FilledArrowHead'), - desc='marker type name'), - size = AttrMapValue(isNumber,desc='marker size'), - x = AttrMapValue(isNumber,desc='marker x coordinate'), - y = AttrMapValue(isNumber,desc='marker y coordinate'), - dx = AttrMapValue(isNumber,desc='marker x coordinate adjustment'), - dy = AttrMapValue(isNumber,desc='marker y coordinate adjustment'), - angle = AttrMapValue(isNumber,desc='marker rotation'), - fillColor = AttrMapValue(isColorOrNone, desc='marker fill colour'), - strokeColor = AttrMapValue(isColorOrNone, desc='marker stroke colour'), - strokeWidth = AttrMapValue(isNumber, desc='marker stroke width'), - arrowBarbDx = AttrMapValue(isNumber, desc='arrow only the delta x for the barbs'), - arrowHeight = AttrMapValue(isNumber, desc='arrow only height'), - ) - - def __init__(self,*args,**kw): - self.setProperties(kw) - self._setKeywords( - kind = None, - strokeColor = black, - strokeWidth = 0.1, - fillColor = None, - size = 5, - x = 0, - y = 0, - dx = 0, - dy = 0, - angle = 0, - arrowBarbDx = -1.25, - arrowHeight = 1.875, - ) - - def clone(self,**kwds): - n = self.__class__(**self.__dict__) - if kwds: n.__dict__.update(kwds) - return n - - def _Smiley(self): - x, y = self.x+self.dx, self.y+self.dy - d = self.size/2.0 - s = SmileyFace() - s.fillColor = self.fillColor - s.strokeWidth = self.strokeWidth - s.strokeColor = self.strokeColor - s.x = x-d - s.y = y-d - s.size = d*2 - return s - - def _Square(self): - x, y = self.x+self.dx, self.y+self.dy - d = self.size/2.0 - s = Rect(x-d,y-d,2*d,2*d,fillColor=self.fillColor,strokeColor=self.strokeColor,strokeWidth=self.strokeWidth) - return s - - def _Diamond(self): - d = self.size/2.0 - return self._doPolygon((-d,0,0,d,d,0,0,-d)) - - def _Circle(self): - x, y = self.x+self.dx, self.y+self.dy - s = Circle(x,y,self.size/2.0,fillColor=self.fillColor,strokeColor=self.strokeColor,strokeWidth=self.strokeWidth) - return s - - def _Cross(self): - x, y = self.x+self.dx, self.y+self.dy - s = float(self.size) - h, s = s/2, s/6 - return self._doPolygon((-s,-h,-s,-s,-h,-s,-h,s,-s,s,-s,h,s,h,s,s,h,s,h,-s,s,-s,s,-h)) - - def _Triangle(self): - x, y = self.x+self.dx, self.y+self.dy - r = float(self.size)/2 - c = 30*_toradians - s = sin(30*_toradians)*r - c = cos(c)*r - return self._doPolygon((0,r,-c,-s,c,-s)) - - def _StarSix(self): - r = float(self.size)/2 - c = 30*_toradians - s = sin(c)*r - c = cos(c)*r - z = s/2 - g = c/2 - return self._doPolygon((0,r,-z,s,-c,s,-s,0,-c,-s,-z,-s,0,-r,z,-s,c,-s,s,0,c,s,z,s)) - - def _StarFive(self): - R = float(self.size)/2 - r = R*sin(18*_toradians)/cos(36*_toradians) - P = [] - angle = 90 - for i in range(5): - for radius in R, r: - theta = angle*_toradians - P.append(radius*cos(theta)) - P.append(radius*sin(theta)) - angle = angle + 36 - return self._doPolygon(P) - - def _Pentagon(self): - return self._doNgon(5) - - def _Hexagon(self): - return self._doNgon(6) - - def _Heptagon(self): - return self._doNgon(7) - - def _Octagon(self): - return self._doNgon(8) - - def _ArrowHead(self): - s = self.size - h = self.arrowHeight - b = self.arrowBarbDx - return self._doPolygon((0,0,b,-h,s,0,b,h)) - - def _doPolygon(self,P): - x, y = self.x+self.dx, self.y+self.dy - if x or y: P = list(map(lambda i,P=P,A=[x,y]: P[i] + A[i&1], list(range(len(P))))) - return Polygon(P, strokeWidth =self.strokeWidth, strokeColor=self.strokeColor, fillColor=self.fillColor) - - def _doFill(self): - old = self.fillColor - if old is None: - self.fillColor = self.strokeColor - r = (self.kind and getattr(self,'_'+self.kind[6:]) or Group)() - self.fillColor = old - return r - - def _doNgon(self,n): - P = [] - size = float(self.size)/2 - for i in range(n): - r = (2.*i/n+0.5)*pi - P.append(size*cos(r)) - P.append(size*sin(r)) - return self._doPolygon(P) - - _FilledCircle = _doFill - _FilledSquare = _doFill - _FilledDiamond = _doFill - _FilledCross = _doFill - _FilledTriangle = _doFill - _FilledStarSix = _doFill - _FilledPentagon = _doFill - _FilledHexagon = _doFill - _FilledHeptagon = _doFill - _FilledOctagon = _doFill - _FilledStarFive = _doFill - _FilledArrowHead = _doFill - - def draw(self): - if self.kind: - m = getattr(self,'_'+self.kind) - if self.angle: - _x, _dx, _y, _dy = self.x, self.dx, self.y, self.dy - self.x, self.dx, self.y, self.dy = 0,0,0,0 - try: - m = m() - finally: - self.x, self.dx, self.y, self.dy = _x, _dx, _y, _dy - if not isinstance(m,Group): - _m, m = m, Group() - m.add(_m) - if self.angle: m.rotate(self.angle) - x, y = _x+_dx, _y+_dy - if x or y: m.shift(x,y) - else: - m = m() - else: - m = Group() - return m - -def uSymbol2Symbol(uSymbol,x,y,color): - if isFunction(uSymbol): - symbol = uSymbol(x, y, 5, color) - elif isClass(uSymbol) and issubclass(uSymbol,Widget): - size = 10. - symbol = uSymbol() - symbol.x = x - (size/2) - symbol.y = y - (size/2) - try: - symbol.size = size - symbol.color = color - except: - pass - elif isinstance(uSymbol,Marker) or isinstance(uSymbol,Flag): - symbol = uSymbol.clone() - if isinstance(uSymbol,Marker): symbol.fillColor = symbol.fillColor or color - symbol.x, symbol.y = x, y - else: - symbol = None - return symbol - -class _isSymbol(Validator): - def test(self,x): - return hasattr(x,'__call__') or isinstance(x,Marker) or isinstance(x,Flag) or (isinstance(x,type) and issubclass(x,Widget)) - -isSymbol = _isSymbol() - -def makeMarker(name,**kw): - if Marker._attrMap['kind'].validate(name): - m = Marker(**kw) - m.kind = name - elif name[-5:]=='_Flag' and Flag._attrMap['kind'].validate(name[:-5]): - m = Flag(**kw) - m.kind = name[:-5] - m.size = 10 - else: - raise ValueError("Invalid marker name %s" % name) - return m - -if __name__=='__main__': - D = Drawing() - D.add(Marker()) - D.save(fnRoot='Marker',formats=['pdf'], outDir='/tmp') diff --git a/reportlab/graphics/widgets/signsandsymbols.py b/reportlab/graphics/widgets/signsandsymbols.py deleted file mode 100644 index 87bcbaab..00000000 --- a/reportlab/graphics/widgets/signsandsymbols.py +++ /dev/null @@ -1,933 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/graphics/widgets/signsandsymbols.py -# signsandsymbols.py -# A collection of new widgets -# author: John Precedo (johnp@reportlab.com) - -__version__=''' $Id$ ''' -__doc__="""This file is a collection of widgets to produce some common signs and symbols. - -Widgets include: - -- ETriangle (an equilateral triangle), -- RTriangle (a right angled triangle), -- Octagon, -- Crossbox, -- Tickbox, -- SmileyFace, -- StopSign, -- NoEntry, -- NotAllowed (the red roundel from 'no smoking' signs), -- NoSmoking, -- DangerSign (a black exclamation point in a yellow triangle), -- YesNo (returns a tickbox or a crossbox depending on a testvalue), -- FloppyDisk, -- ArrowOne, and -- ArrowTwo -""" - -from reportlab.lib import colors -from reportlab.lib.validators import * -from reportlab.lib.attrmap import * -from reportlab.graphics import shapes -from reportlab.graphics.widgetbase import Widget -from reportlab.graphics import renderPDF - - -class _Symbol(Widget): - """Abstract base widget - possible attributes: - 'x', 'y', 'size', 'fillColor', 'strokeColor' - """ - _nodoc = 1 - _attrMap = AttrMap( - x = AttrMapValue(isNumber,desc='symbol x coordinate'), - y = AttrMapValue(isNumber,desc='symbol y coordinate'), - dx = AttrMapValue(isNumber,desc='symbol x coordinate adjustment'), - dy = AttrMapValue(isNumber,desc='symbol x coordinate adjustment'), - size = AttrMapValue(isNumber), - fillColor = AttrMapValue(isColorOrNone), - strokeColor = AttrMapValue(isColorOrNone), - strokeWidth = AttrMapValue(isNumber), - ) - def __init__(self): - assert self.__class__.__name__!='_Symbol', 'Abstract class _Symbol instantiated' - self.x = self.y = self.dx = self.dy = 0 - self.size = 100 - self.fillColor = colors.red - self.strokeColor = None - self.strokeWidth = 0.1 - - def demo(self): - D = shapes.Drawing(200, 100) - s = float(self.size) - ob = self.__class__() - ob.x=50 - ob.y=0 - ob.draw() - D.add(ob) - D.add(shapes.String(ob.x+(s/2),(ob.y-12), - ob.__class__.__name__, fillColor=colors.black, textAnchor='middle', - fontSize=10)) - return D - -class ETriangle(_Symbol): - """This draws an equilateral triangle.""" - - def __init__(self): - pass #AbstractSymbol - - def draw(self): - # general widget bits - s = float(self.size) # abbreviate as we will use this a lot - g = shapes.Group() - - # Triangle specific bits - ae = s*0.125 #(ae = 'an eighth') - triangle = shapes.Polygon(points = [ - self.x, self.y, - self.x+s, self.y, - self.x+(s/2),self.y+s], - fillColor = self.fillColor, - strokeColor = self.strokeColor, - strokeWidth=s/50.) - g.add(triangle) - return g - -class RTriangle(_Symbol): - """This draws a right-angled triangle. - - possible attributes: - 'x', 'y', 'size', 'fillColor', 'strokeColor' - - """ - - def __init__(self): - self.x = 0 - self.y = 0 - self.size = 100 - self.fillColor = colors.green - self.strokeColor = None - - def draw(self): - # general widget bits - s = float(self.size) # abbreviate as we will use this a lot - g = shapes.Group() - - # Triangle specific bits - ae = s*0.125 #(ae = 'an eighth') - triangle = shapes.Polygon(points = [ - self.x, self.y, - self.x+s, self.y, - self.x,self.y+s], - fillColor = self.fillColor, - strokeColor = self.strokeColor, - strokeWidth=s/50.) - g.add(triangle) - return g - -class Octagon(_Symbol): - """This widget draws an Octagon. - - possible attributes: - 'x', 'y', 'size', 'fillColor', 'strokeColor' - - """ - - def __init__(self): - self.x = 0 - self.y = 0 - self.size = 100 - self.fillColor = colors.yellow - self.strokeColor = None - - def draw(self): - # general widget bits - s = float(self.size) # abbreviate as we will use this a lot - g = shapes.Group() - - # Octagon specific bits - athird=s/3 - - octagon = shapes.Polygon(points=[self.x+athird, self.y, - self.x, self.y+athird, - self.x, self.y+(athird*2), - self.x+athird, self.y+s, - self.x+(athird*2), self.y+s, - self.x+s, self.y+(athird*2), - self.x+s, self.y+athird, - self.x+(athird*2), self.y], - strokeColor = self.strokeColor, - fillColor = self.fillColor, - strokeWidth=10) - g.add(octagon) - return g - -class Crossbox(_Symbol): - """This draws a black box with a red cross in it - a 'checkbox'. - - possible attributes: - 'x', 'y', 'size', 'crossColor', 'strokeColor', 'crosswidth' - - """ - - _attrMap = AttrMap(BASE=_Symbol, - crossColor = AttrMapValue(isColorOrNone), - crosswidth = AttrMapValue(isNumber), - ) - - def __init__(self): - self.x = 0 - self.y = 0 - self.size = 100 - self.fillColor = colors.white - self.crossColor = colors.red - self.strokeColor = colors.black - self.crosswidth = 10 - - def draw(self): - # general widget bits - s = float(self.size) # abbreviate as we will use this a lot - g = shapes.Group() - - # crossbox specific bits - box = shapes.Rect(self.x+1, self.y+1, s-2, s-2, - fillColor = self.fillColor, - strokeColor = self.strokeColor, - strokeWidth=2) - g.add(box) - - crossLine1 = shapes.Line(self.x+(s*0.15), self.y+(s*0.15), self.x+(s*0.85), self.y+(s*0.85), - fillColor = self.crossColor, - strokeColor = self.crossColor, - strokeWidth = self.crosswidth) - g.add(crossLine1) - - crossLine2 = shapes.Line(self.x+(s*0.15), self.y+(s*0.85), self.x+(s*0.85) ,self.y+(s*0.15), - fillColor = self.crossColor, - strokeColor = self.crossColor, - strokeWidth = self.crosswidth) - g.add(crossLine2) - - return g - - -class Tickbox(_Symbol): - """This draws a black box with a red tick in it - another 'checkbox'. - - possible attributes: - 'x', 'y', 'size', 'tickColor', 'strokeColor', 'tickwidth' - -""" - - _attrMap = AttrMap(BASE=_Symbol, - tickColor = AttrMapValue(isColorOrNone), - tickwidth = AttrMapValue(isNumber), - ) - - def __init__(self): - self.x = 0 - self.y = 0 - self.size = 100 - self.tickColor = colors.red - self.strokeColor = colors.black - self.fillColor = colors.white - self.tickwidth = 10 - - def draw(self): - # general widget bits - s = float(self.size) # abbreviate as we will use this a lot - g = shapes.Group() - - # tickbox specific bits - box = shapes.Rect(self.x+1, self.y+1, s-2, s-2, - fillColor = self.fillColor, - strokeColor = self.strokeColor, - strokeWidth=2) - g.add(box) - - tickLine = shapes.PolyLine(points = [self.x+(s*0.15), self.y+(s*0.35), self.x+(s*0.35), self.y+(s*0.15), - self.x+(s*0.35), self.y+(s*0.15), self.x+(s*0.85) ,self.y+(s*0.85)], - fillColor = self.tickColor, - strokeColor = self.tickColor, - strokeWidth = self.tickwidth) - g.add(tickLine) - - return g - -class SmileyFace(_Symbol): - """This draws a classic smiley face. - - possible attributes: - 'x', 'y', 'size', 'fillColor' - - """ - - def __init__(self): - _Symbol.__init__(self) - self.x = 0 - self.y = 0 - self.size = 100 - self.fillColor = colors.yellow - self.strokeColor = colors.black - - def draw(self): - # general widget bits - s = float(self.size) # abbreviate as we will use this a lot - g = shapes.Group() - - # SmileyFace specific bits - g.add(shapes.Circle(cx=self.x+(s/2), cy=self.y+(s/2), r=s/2, - fillColor=self.fillColor, strokeColor=self.strokeColor, - strokeWidth=max(s/38.,self.strokeWidth))) - - for i in (1,2): - g.add(shapes.Ellipse(self.x+(s/3)*i,self.y+(s/3)*2, s/30, s/10, - fillColor=self.strokeColor, strokeColor = self.strokeColor, - strokeWidth=max(s/38.,self.strokeWidth))) - - # calculate a pointslist for the mouth - # THIS IS A HACK! - don't use if there is a 'shapes.Arc' - centerx=self.x+(s/2) - centery=self.y+(s/2) - radius=s/3 - yradius = radius - xradius = radius - startangledegrees=200 - endangledegrees=340 - degreedelta = 1 - pointslist = [] - a = pointslist.append - from math import sin, cos, pi - degreestoradians = pi/180.0 - radiansdelta = degreedelta*degreestoradians - startangle = startangledegrees*degreestoradians - endangle = endangledegrees*degreestoradians - while endangle>> font = UnicodeCIDFont('HeiseiMin-W3') - >>> font.stringWidth(unicode(','), 10) - 2.5 - >>> font.stringWidth(unicode('m'), 10) - 7.7800000000000002 - >>> font.stringWidth(u'\u6771\u4EAC', 10) - 20.0 - >>> - -""" - -from pprint import pprint as pp - -from reportlab.pdfbase._cidfontdata import defaultUnicodeEncodings -from reportlab.pdfbase.cidfonts import UnicodeCIDFont - - -def run(): - - buf = [] - buf.append('widthsByUnichar = {}') - for fontName, (language, encName) in defaultUnicodeEncodings.items(): - print('handling %s : %s : %s' % (fontName, language, encName)) - - #this does just about all of it for us, as all the info - #we need is present. - font = UnicodeCIDFont(fontName) - - widthsByCID = font.face._explicitWidths - cmap = font.encoding._cmap - nonStandardWidthsByUnichar = {} - for codePoint, cid in cmap.items(): - width = widthsByCID.get(cid, 1000) - if width != 1000: - nonStandardWidthsByUnichar[chr(codePoint)] = width - - - - print('created font width map (%d items). ' % len(nonStandardWidthsByUnichar)) - - buf.append('widthsByUnichar["%s"] = %s' % (fontName, repr(nonStandardWidthsByUnichar))) - - - src = '\n'.join(buf) + '\n' - open('canned_widths.py','w').write(src) - print('wrote canned_widths.py') - -if __name__=='__main__': - run() - diff --git a/reportlab/pdfbase/_cidfontdata.py b/reportlab/pdfbase/_cidfontdata.py deleted file mode 100644 index b4f5ef27..00000000 --- a/reportlab/pdfbase/_cidfontdata.py +++ /dev/null @@ -1,483 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/pdfbase/_cidfontdata.py -#$Header $ -__version__=''' $Id$ ''' -__doc__=""" -This defines additional static data to support CID fonts. - -Canned data is provided for the Japanese fonts supported by Adobe. We -can add Chinese, Korean and Vietnamese in due course. The data was -extracted by creating very simple postscript documents and running -through Distiller, then examining the resulting PDFs. - -Each font is described as a big nested dictionary. This lets us keep -code out of the module altogether and avoid circular dependencies. - -The encoding and font data are grouped by some standard 'language -prefixes':: - - chs = Chinese Simplified (mainland) - cht = Chinese Traditional (Taiwan) - kor = Korean - jpn = Japanese -""" - - -languages = ['jpn', 'kor', 'cht', 'chs'] - -#breaking down the lists let us check if something is present -#for a specific language -typeFaces_chs = ['STSong-Light'] # to do -typeFaces_cht = ['MSung-Light'] #, 'MHei-Medium'] # to do -typeFaces_jpn = ['HeiseiMin-W3', 'HeiseiKakuGo-W5'] -typeFaces_kor = ['HYSMyeongJo-Medium','HYGothic-Medium'] - -allowedTypeFaces = typeFaces_chs + typeFaces_cht + typeFaces_jpn + typeFaces_kor - - - - -encodings_jpn = [ - # official encoding names, comments taken verbatim from PDF Spec - '83pv-RKSJ-H', #Macintosh, JIS X 0208 character set with KanjiTalk6 - #extensions, Shift-JIS encoding, Script Manager code 1 - '90ms-RKSJ-H', #Microsoft Code Page 932 (lfCharSet 0x80), JIS X 0208 - #character set with NEC and IBM extensions - '90ms-RKSJ-V', #Vertical version of 90ms-RKSJ-H - '90msp-RKSJ-H', #Same as 90ms-RKSJ-H, but replaces half-width Latin - #characters with proportional forms - '90msp-RKSJ-V', #Vertical version of 90msp-RKSJ-H - '90pv-RKSJ-H', #Macintosh, JIS X 0208 character set with KanjiTalk7 - #extensions, Shift-JIS encoding, Script Manager code 1 - 'Add-RKSJ-H', #JIS X 0208 character set with Fujitsu FMR extensions, - #Shift-JIS encoding - 'Add-RKSJ-V', #Vertical version of Add-RKSJ-H - 'EUC-H', #JIS X 0208 character set, EUC-JP encoding - 'EUC-V', #Vertical version of EUC-H - 'Ext-RKSJ-H', #JIS C 6226 (JIS78) character set with NEC extensions, - #Shift-JIS encoding - 'Ext-RKSJ-V', #Vertical version of Ext-RKSJ-H - 'H', #JIS X 0208 character set, ISO-2022-JP encoding, - 'V', #Vertical version of H - 'UniJIS-UCS2-H', #Unicode (UCS-2) encoding for the Adobe-Japan1 character - #collection - 'UniJIS-UCS2-V', #Vertical version of UniJIS-UCS2-H - 'UniJIS-UCS2-HW-H', #Same as UniJIS-UCS2-H, but replaces proportional Latin - #characters with half-width forms - 'UniJIS-UCS2-HW-V' #Vertical version of UniJIS-UCS2-HW-H - ] -encodings_kor = [ - 'KSC-EUC-H', # KS X 1001:1992 character set, EUC-KR encoding - 'KSC-EUC-V', # Vertical version of KSC-EUC-H - 'KSCms-UHC-H', # Microsoft Code Page 949 (lfCharSet 0x81), KS X 1001:1992 - #character set plus 8,822 additional hangul, Unified Hangul - #Code (UHC) encoding - 'KSCms-UHC-V', #Vertical version of KSCms-UHC-H - 'KSCms-UHC-HW-H', #Same as KSCms-UHC-H, but replaces proportional Latin - # characters with halfwidth forms - 'KSCms-UHC-HW-V', #Vertical version of KSCms-UHC-HW-H - 'KSCpc-EUC-H', #Macintosh, KS X 1001:1992 character set with MacOS-KH - #extensions, Script Manager Code 3 - 'UniKS-UCS2-H', #Unicode (UCS-2) encoding for the Adobe-Korea1 character collection - 'UniKS-UCS2-V' #Vertical version of UniKS-UCS2-H - - ] - -encodings_chs = [ - - 'GB-EUC-H', # Microsoft Code Page 936 (lfCharSet 0x86), GB 2312-80 - # character set, EUC-CN encoding - 'GB-EUC-V', # Vertical version of GB-EUC-H - 'GBpc-EUC-H', # Macintosh, GB 2312-80 character set, EUC-CN encoding, - # Script Manager code 2 - 'GBpc-EUC-V', # Vertical version of GBpc-EUC-H - 'GBK-EUC-H', # Microsoft Code Page 936 (lfCharSet 0x86), GBK character - # set, GBK encoding - 'GBK-EUC-V', # Vertical version of GBK-EUC-V - 'UniGB-UCS2-H', # Unicode (UCS-2) encoding for the Adobe-GB1 - # character collection - 'UniGB-UCS2-V' # Vertical version of UniGB-UCS2-H. - ] - -encodings_cht = [ - 'B5pc-H', # Macintosh, Big Five character set, Big Five encoding, - # Script Manager code 2 - 'B5pc-V', # Vertical version of B5pc-H - 'ETen-B5-H', # Microsoft Code Page 950 (lfCharSet 0x88), Big Five - # character set with ETen extensions - 'ETen-B5-V', # Vertical version of ETen-B5-H - 'ETenms-B5-H', # Microsoft Code Page 950 (lfCharSet 0x88), Big Five - # character set with ETen extensions; this uses proportional - # forms for half-width Latin characters. - 'ETenms-B5-V', # Vertical version of ETenms-B5-H - 'CNS-EUC-H', # CNS 11643-1992 character set, EUC-TW encoding - 'CNS-EUC-V', # Vertical version of CNS-EUC-H - 'UniCNS-UCS2-H', # Unicode (UCS-2) encoding for the Adobe-CNS1 - # character collection - 'UniCNS-UCS2-V' # Vertical version of UniCNS-UCS2-H. - ] - -# the Identity encodings simply dump out all character -# in the font in the order they were defined. -allowedEncodings = (['Identity-H', 'Identity-V'] + - encodings_chs + - encodings_cht + - encodings_jpn + - encodings_kor - ) - -defaultUnicodeEncodings = { - #we ddefine a default Unicode encoding for each face name; - #this should be the most commonly used horizontal unicode encoding; - #also define a 3-letter language code. - 'HeiseiMin-W3': ('jpn','UniJIS-UCS2-H'), - 'HeiseiKakuGo-W5': ('jpn','UniJIS-UCS2-H'), - 'STSong-Light': ('chs', 'UniGB-UCS2-H'), - 'MSung-Light': ('cht', 'UniGB-UCS2-H'), - #'MHei-Medium': ('cht', 'UniGB-UCS2-H'), - 'HYSMyeongJo-Medium': ('kor', 'UniKS-UCS2-H'), - 'HYGothic-Medium': ('kor','UniKS-UCS2-H'), - } - -typeFaces_chs = ['STSong-Light'] # to do -typeFaces_cht = ['MSung-Light', 'MHei-Medium'] # to do -typeFaces_jpn = ['HeiseiMin-W3', 'HeiseiKakuGo-W5'] -typeFaces_kor = ['HYSMyeongJo-Medium','HYGothic-Medium'] - - -#declare separately those used for unicode -unicode_encodings = [enc for enc in allowedEncodings if 'UCS2' in enc] - - -CIDFontInfo = {} -#statically describe the fonts in Adobe's Japanese Language Packs -CIDFontInfo['HeiseiMin-W3'] = { - 'Type':'/Font', - 'Subtype':'/Type0', - 'Name': '/%(internalName)s' , #<-- the internal name - 'BaseFont': '/HeiseiMin-W3', - 'Encoding': '/%(encodings)s', - - #there could be several descendant fonts if it is an old-style - #type 0 compound font. For CID fonts there is just one. - 'DescendantFonts': [{ - 'Type':'/Font', - 'Subtype':'/CIDFontType0', - 'BaseFont':'/HeiseiMin-W3', - 'FontDescriptor': { - 'Type': '/FontDescriptor', - 'Ascent': 723, - 'CapHeight': 709, - 'Descent': -241, - 'Flags': 6, - 'FontBBox': (-123, -257, 1001, 910), - 'FontName': '/HeiseiMin-W3', - 'ItalicAngle': 0, - 'StemV': 69, - 'XHeight': 450#, -# 'Style': {'Panose': '<010502020400000000000000>'} - }, - 'CIDSystemInfo': { - 'Registry': '(Adobe)', - 'Ordering': '(Japan1)', - 'Supplement': 2 - }, - #default width is 1000 em units - 'DW': 1000, - #widths of any which are not the default. - 'W': [1, [250, 333, 408, 500], - 5, [500, 833, 778, 180, 333], - 10, [333, 500, 564, 250, 333, 250, 278, 500], - 18, 26, 500, 27, 28, 278, 29, 31, 564, - 32, [444, 921, 722, 667], - 36, [667, 722, 611, 556, 722], - 41, [722, 333, 389, 722, 611, 889, 722], - 48, [722, 556, 722, 667, 556, 611, 722], - 55, [722, 944, 722], - 58, [722, 611, 333, 500, 333, 469, 500, 333, - 444, 500, 444, 500, 444, 333, 500], - 73, [500, 278], - 75, [278, 500, 278, 778, 500], 80, 82, 500, - 83, [333, 389, 278, 500], - 87, [500, 722, 500], - 90, [500, 444, 480, 200, 480, 333], - 97, [278], 99, [200], 101, [333, 500], 103, [500, 167], - 107, [500], 109, [500, 333], 111, [333, 556], - 113, [556, 500], 117, [250], 119, [350, 333, 444], - 123, [500], 126, [444, 333], 128, 137, 333, - 138, [1000, 889, 276, 611, 722, 889, 310, 667, 278], - 147, [278, 500, 722, 500, 564, 760, 564, 760], - 157, 158, 300, 159, [500, 300, 750], 162, 163, 750, - 164, 169, 722, 170, [667, 611], 172, 174, 611, 175, - 178, 333, 179, 185, 722, 187, 191, 722, 192, - [556, 444], 194, 203, 444, 204, 207, 278, 208, - 214, 500, 216, 222, 500, - 223, [556, 722, 611, 500, 389, 980, 444], - 231, [500], 323, [500], 325, [500], - 327, 389, 500] -## 'W': ( -## # starting at character ID 1, next n characters have the widths given. -## 1, (277,305,500,668,668,906,727,305,445,445,508,668,305,379,305,539), -## # all Characters from ID 17 to 26 are 668 em units wide -## 17, 26, 668, -## 27, (305, 305, 668, 668, 668, 566, 871, 727, 637, 652, 699, 574, 555, -## 676, 687, 242, 492, 664, 582, 789, 707, 734, 582, 734, 605, 605, -## 641, 668, 727, 945, 609, 609, 574, 445, 668, 445, 668, 668, 590, -## 555, 609, 547, 602, 574, 391, 609, 582, 234, 277, 539, 234, 895, -## 582, 605, 602, 602, 387, 508, 441, 582, 562, 781, 531, 570, 555, -## 449, 246, 449, 668), -## # these must be half width katakana and the like. -## 231, 632, 500 -## ) - }]# end list of descendant fonts - } #end HeiseiMin-W3 - -CIDFontInfo['HeiseiKakuGo-W5'] = {'Type':'/Font', - 'Subtype':'/Type0', - 'Name': '/%(internalName)s', #<-- the internal name - 'BaseFont': '/HeiseiKakuGo-W5', - 'Encoding': '/%(encodings)s', - 'DescendantFonts': [{'Type':'/Font', - 'Subtype':'/CIDFontType0', - 'BaseFont':'/HeiseiKakuGo-W5', - 'FontDescriptor': { - 'Type': '/FontDescriptor', - 'Ascent': 752, - 'CapHeight': 737, - 'Descent': -221, - 'Flags': 4, - 'FontBBox': [-92, -250, 1010, 922], - 'FontName': '/HeiseKakuGo-W5', - 'ItalicAngle': 0, - 'StemH': 0, - 'StemV': 114, - 'XHeight': 553, -## 'Style': {'Panose': '<0801020b0600000000000000>'} - }, - 'CIDSystemInfo': { - 'Registry': '(Adobe)', - 'Ordering': '(Japan1)', - 'Supplement': 2 - }, - 'DW': 1000, - 'W': ( - 1, (277,305,500,668,668,906,727,305,445,445,508,668,305,379,305,539), - 17, 26, 668, - 27, (305, 305, 668, 668, 668, 566, 871, 727, 637, 652, 699, 574, 555, - 676, 687, 242, 492, 664, 582, 789, 707, 734, 582, 734, 605, 605, - 641, 668, 727, 945, 609, 609, 574, 445, 668, 445, 668, 668, 590, - 555, 609, 547, 602, 574, 391, 609, 582, 234, 277, 539, 234, 895, - 582, 605, 602, 602, 387, 508, 441, 582, 562, 781, 531, 570, 555, - 449, 246, 449, 668), - 231, 632, 500 - ) - }] # end descendant fonts - } - -CIDFontInfo['HYGothic-Medium'] = {'Type':'/Font', - 'Subtype':'/Type0', - 'Name': '/%(internalName)s', #<-- the internal name - 'BaseFont': '/' + 'HYGothic-Medium', - 'Encoding': '/%(encodings)s', - 'DescendantFonts': [{'Type':'/Font', - 'Subtype':'/CIDFontType0', - 'BaseFont':'/'+'HYGothic-Medium', - 'FontDescriptor': { - 'Type': '/FontDescriptor', - 'Ascent': 752, - 'AvgWidth': -271, - 'CapHeight': 737, - 'Descent': -142, - 'Flags': 6, - 'FontBBox': [-6, -145, 1003, 880], - 'FontName': '/'+'HYSMyeongJo-Medium', - 'ItalicAngle': 0, - 'Leading': 148, - 'MaxWidth': 1000, - 'MissingWidth': 500, - 'StemH': 0, - 'StemV': 58, - 'XHeight': 553 - }, - 'CIDSystemInfo': { - 'Registry': '(Adobe)', - 'Ordering': '(Korea1)', - 'Supplement': 1 - }, - 'DW': 1000, - 'W': (1, 94, 500) - }] # end descendant fonts - } - -CIDFontInfo['HYSMyeongJo-Medium'] = {'Type':'/Font', - 'Subtype':'/Type0', - 'Name': '/%(internalName)s', #<-- the internal name - 'BaseFont': '/' + 'HYSMyeongJo-Medium', - 'Encoding': '/%(encodings)s', - 'DescendantFonts': [{'Type':'/Font', - 'Subtype':'/CIDFontType2', - 'BaseFont':'/'+'HYSMyeongJo-Medium', - 'FontDescriptor': { - 'Type': '/FontDescriptor', - 'Ascent': 752, - 'AvgWidth': 500, - 'CapHeight': 737, - 'Descent': -271, - 'Flags': 6, - 'FontBBox': [0, -148, 1001, 880], - 'FontName': '/'+'HYSMyeongJo-Medium', - 'ItalicAngle': 0, - 'Leading': 148, - 'MaxWidth': 1000, - 'MissingWidth': 500, - 'StemH': 91, - 'StemV': 58, - 'XHeight': 553 - }, - 'CIDSystemInfo': { - 'Registry': '(Adobe)', - 'Ordering': '(Korea1)', - 'Supplement': 1 - }, - 'DW': 1000, - 'W': [1, [333, 416], - 3, [416, 833, 625, 916, 833, 250, 500], - 10, 11, 500, - 12, [833, 291, 833, 291, 375, 625], - 18, 26, 625, 27, 28, 333, 29, 30, 833, - 31, [916, 500, 1000, 791, 708], - 36, [708, 750, 708, 666, 750, 791, 375, - 500, 791, 666, 916, 791, 750, 666, - 750, 708, 666, 791], - 54, [791, 750, 1000, 708], - 58, [708, 666, 500, 375, 500], - 63, 64, 500, - 65, [333, 541, 583, 541, 583], - 70, [583, 375, 583], - 73, [583, 291, 333, 583, 291, 875, 583], - 80, 82, 583, - 83, [458, 541, 375, 583], - 87, [583, 833, 625], - 90, [625, 500, 583], 93, 94, 583, - 95, [750] - ] - }] # end descendant fonts - } - -#WARNING - not checked, just copied Korean to get some output - -CIDFontInfo['STSong-Light'] = {'Type':'/Font', - 'Subtype':'/Type0', - 'Name': '/%(internalName)s', #<-- the internal name - 'BaseFont': '/' + 'STSong-Light', - 'Encoding': '/%(encodings)s', - 'DescendantFonts': [{'Type':'/Font', - 'Subtype':'/CIDFontType0', - 'BaseFont':'/'+'STSong-Light', - 'FontDescriptor': { - 'Type': '/FontDescriptor', - 'Ascent': 752, - 'CapHeight': 737, - 'Descent': -271, - 'Flags': 6, - 'FontBBox': [-25, -254, 1000, 880], - 'FontName': '/'+'STSongStd-Light', - 'ItalicAngle': 0, - 'Leading': 148, - 'MaxWidth': 1000, - 'MissingWidth': 500, - 'StemH': 91, - 'StemV': 58, - 'XHeight': 553 - }, - 'CIDSystemInfo': { - 'Registry': '(Adobe)', - 'Ordering': '(GB1)', - 'Supplement': 0 - }, - 'DW': 1000, - 'W': [1, [207, 270, 342, 467, 462, 797, 710, 239, 374], - 10, [374, 423, 605, 238, 375, 238, 334, 462], - 18, 26, 462, 27, 28, 238, 29, 31, 605, - 32, [344, 748, 684, 560, 695, 739, 563, 511, 729, - 793, 318, 312, 666, 526, 896, 758, 772, 544, - 772, 628, 465, 607, 753, 711, 972, 647, 620, - 607, 374, 333, 374, 606, 500, 239, 417, 503, - 427, 529, 415, 264, 444, 518, 241, 230, 495, - 228, 793, 527, 524], - 81, [524, 504, 338, 336, 277, 517, 450, 652, 466, - 452, 407, 370, 258, 370, 605] - ] - }] # end descendant fonts - } -CIDFontInfo['MSung-Light'] = {'Type':'/Font', - 'Subtype':'/Type0', - 'Name': '/%(internalName)s', #<-- the internal name - 'BaseFont': '/' + 'MSung-Light', - 'Encoding': '/%(encodings)s', - 'DescendantFonts': [{'Type':'/Font', - 'Subtype':'/CIDFontType0', - 'BaseFont':'/'+'MSung-Light', - 'FontDescriptor': { - 'Type': '/FontDescriptor', - 'Ascent': 752, - 'CapHeight': 737, - 'Descent': -271, - 'Flags': 6, - 'FontBBox': [-160, -249, 1015, 888], - 'FontName': '/'+'MSung-Light', - 'ItalicAngle': 0, - 'Leading': 148, - 'MaxWidth': 1000, - 'MissingWidth': 500, - 'StemH': 45, - 'StemV': 58, - 'XHeight': 553 - }, - 'CIDSystemInfo': { - 'Registry': '(Adobe)', - 'Ordering': '(CNS1)', - 'Supplement': 1 - }, - 'DW': 1000, - 'W': [1, 2, 250, 3, [408, 668, 490, 875, 698, 250, 240], - 10, [240, 417, 667, 250, 313, 250, 520, 500], - 18, 26, 500, 27, 28, 250, 29, 31, 667, - 32, [396, 921, 677, 615, 719, 760, 625, 552, 771, - 802, 354], - 43, [354, 781, 604, 927, 750, 823, 563, 823, 729, - 542, 698, 771, 729, 948, 771, 677, 635, 344, - 520, 344, 469, 500, 250, 469, 521, 427, 521, - 438, 271, 469, 531, 250], - 75, [250, 458, 240, 802, 531, 500, 521], - 82, [521, 365, 333, 292, 521, 458, 677, 479, 458, - 427, 480, 496, 480, 667]] - - }] # end descendant fonts - } - - -#this data was derived from the above width information and removes all dependency on CMAP files as long as we only use the unicode fonts. -widthsByUnichar = {} -widthsByUnichar["MSung-Light"] = {u' ': 250, u'$': 490, u'(': 240, u',': 250, u'0': 500, u'4': 500, u'8': 500, u'<': 667, u'@': 921, u'D': 760, u'H': 802, u'L': 604, u'P': 563, u'T': 698, u'X': 771, u'\\': 520, u'`': 250, u'd': 521, u'h': 531, u'l': 240, u'p': 521, u't': 292, u'x': 479, u'|': 496, u'#': 668, u"'": 250, u'+': 667, u'/': 520, u'3': 500, u'7': 500, u';': 250, u'?': 396, u'C': 719, u'G': 771, u'K': 781, u'O': 823, u'S': 542, u'W': 948, u'[': 344, u'_': 500, u'c': 427, u'g': 469, u'k': 458, u'o': 500, u's': 333, u'w': 677, u'{': 480, u'"': 408, u'&': 698, u'*': 417, u'.': 250, u'2': 500, u'6': 500, u':': 250, u'>': 667, u'B': 615, u'F': 552, u'J': 354, u'N': 750, u'R': 729, u'V': 729, u'Z': 635, u'^': 469, u'b': 521, u'f': 271, u'j': 250, u'n': 531, u'r': 365, u'v': 458, u'z': 427, u'~': 667, u'!': 250, u'%': 875, u')': 240, u'-': 313, u'1': 500, u'5': 500, u'9': 500, u'=': 667, u'A': 677, u'E': 625, u'I': 354, u'M': 927, u'Q': 823, u'U': 771, u'Y': 677, u']': 344, u'a': 469, u'e': 438, u'i': 250, u'm': 802, u'q': 521, u'u': 521, u'y': 458, u'}': 480} -widthsByUnichar["HeiseiKakuGo-W5"] = {u'\uff81': 500, u'\uff85': 500, u'\uff89': 500, u'\uff8d': 500, u'\uff91': 500, u'\uff95': 500, u'\uff99': 500, u'\uff9d': 500, u' ': 277, u'$': 668, u'(': 445, u',': 305, u'0': 668, u'\u0332': 668, u'4': 668, u'8': 668, u'<': 668, u'@': 871, u'D': 699, u'H': 687, u'L': 582, u'P': 582, u'T': 641, u'X': 609, u'`': 590, u'\uff62': 500, u'd': 602, u'\uff66': 500, u'h': 582, u'\uff6a': 500, u'l': 234, u'\uff6e': 500, u'p': 602, u'\uff72': 500, u't': 441, u'\uff76': 500, u'x': 531, u'\uff7a': 500, u'|': 246, u'\uff7e': 500, u'\uff82': 500, u'\uff86': 500, u'\uff8a': 500, u'\uff8e': 500, u'\uff92': 500, u'\uff96': 500, u'\uff9a': 500, u'\uff9e': 500, u'#': 668, u"'": 305, u'+': 668, u'/': 539, u'3': 668, u'7': 668, u';': 305, u'?': 566, u'C': 652, u'G': 676, u'K': 664, u'O': 734, u'S': 605, u'W': 945, u'[': 445, u'_': 668, u'\uff61': 500, u'c': 547, u'\uff65': 500, u'g': 609, u'\uff69': 500, u'k': 539, u'\uff6d': 500, u'o': 605, u'\uff71': 500, u's': 508, u'\uff75': 500, u'w': 781, u'\uff79': 500, u'{': 449, u'\uff7d': 500, u'\u0300': 590, u'\uff83': 500, u'\u2002': 500, u'\uff87': 500, u'\uff8b': 500, u'\uff8f': 500, u'\uff93': 500, u'\uff97': 500, u'\uff9b': 500, u'\uff9f': 500, u'"': 500, u'\xa5': 668, u'&': 727, u'*': 508, u'.': 305, u'2': 668, u'6': 668, u':': 305, u'>': 668, u'B': 637, u'F': 555, u'J': 492, u'N': 707, u'\u203e': 500, u'R': 605, u'V': 727, u'Z': 574, u'^': 668, u'b': 609, u'\uff64': 500, u'f': 391, u'\uff68': 500, u'j': 277, u'\uff6c': 500, u'n': 582, u'\uff70': 500, u'r': 387, u'\uff74': 500, u'v': 562, u'\uff78': 500, u'z': 555, u'\uff7c': 500, u'~': 668, u'\uff80': 500, u'\u0303': 668, u'\uff84': 500, u'\uff88': 500, u'\uff8c': 500, u'\u2011': 379, u'\uff90': 500, u'\uff94': 500, u'\uff98': 500, u'\uff9c': 500, u'!': 305, u'%': 906, u')': 445, u'-': 379, u'1': 668, u'5': 668, u'9': 668, u'=': 668, u'A': 727, u'E': 574, u'I': 242, u'M': 789, u'Q': 734, u'U': 668, u'Y': 609, u']': 445, u'a': 555, u'\uff63': 500, u'e': 574, u'\uff67': 500, u'i': 234, u'\uffe8': 500, u'\uff6b': 500, u'm': 895, u'\uff6f': 500, u'q': 602, u'\uff73': 500, u'u': 582, u'\uff77': 500, u'y': 570, u'\uff7b': 500, u'}': 449, u'\uff7f': 500} -widthsByUnichar["HYSMyeongJo-Medium"] = {u' ': 333, u'$': 625, u'(': 500, u',': 291, u'0': 625, u'4': 625, u'8': 625, u'<': 833, u'D': 750, u'H': 791, u'L': 666, u'P': 666, u'T': 791, u'X': 708, u'\\': 375, u'`': 333, u'd': 583, u'h': 583, u'l': 291, u'p': 583, u't': 375, u'x': 625, u'|': 583, u'#': 833, u"'": 250, u'+': 833, u'/': 375, u'3': 625, u'7': 625, u';': 333, u'?': 500, u'C': 708, u'G': 750, u'K': 791, u'O': 750, u'S': 666, u'[': 500, u'_': 500, u'c': 541, u'g': 583, u'k': 583, u'o': 583, u's': 541, u'w': 833, u'{': 583, u'"': 416, u'&': 833, u'*': 500, u'.': 291, u'2': 625, u'6': 625, u':': 333, u'>': 916, u'B': 708, u'F': 666, u'J': 500, u'N': 791, u'R': 708, u'V': 750, u'Z': 666, u'^': 500, u'b': 583, u'f': 375, u'j': 333, u'n': 583, u'r': 458, u'v': 583, u'z': 500, u'~': 750, u'!': 416, u'%': 916, u')': 500, u'-': 833, u'1': 625, u'5': 625, u'9': 625, u'=': 833, u'A': 791, u'E': 708, u'I': 375, u'M': 916, u'Q': 750, u'U': 791, u'Y': 708, u']': 500, u'a': 541, u'e': 583, u'i': 291, u'm': 875, u'q': 583, u'u': 583, u'y': 625, u'}': 583} -widthsByUnichar["STSong-Light"] = {u' ': 207, u'$': 462, u'(': 374, u',': 238, u'0': 462, u'4': 462, u'8': 462, u'<': 605, u'@': 748, u'D': 739, u'H': 793, u'L': 526, u'P': 544, u'T': 607, u'X': 647, u'\\': 333, u'`': 239, u'd': 529, u'h': 518, u'l': 228, u'p': 524, u't': 277, u'x': 466, u'|': 258, u'#': 467, u"'": 239, u'+': 605, u'/': 334, u'3': 462, u'7': 462, u';': 238, u'?': 344, u'C': 695, u'G': 729, u'K': 666, u'O': 772, u'S': 465, u'W': 972, u'[': 374, u'_': 500, u'c': 427, u'g': 444, u'k': 495, u'o': 524, u's': 336, u'w': 652, u'{': 370, u'"': 342, u'&': 710, u'*': 423, u'.': 238, u'2': 462, u'6': 462, u':': 238, u'>': 605, u'B': 560, u'F': 511, u'J': 312, u'N': 758, u'R': 628, u'V': 711, u'Z': 607, u'^': 606, u'b': 503, u'f': 264, u'j': 230, u'n': 527, u'r': 338, u'v': 450, u'z': 407, u'~': 605, u'!': 270, u'%': 797, u')': 374, u'-': 375, u'1': 462, u'5': 462, u'9': 462, u'=': 605, u'A': 684, u'E': 563, u'I': 318, u'M': 896, u'Q': 772, u'U': 753, u'Y': 620, u']': 374, u'a': 417, u'e': 415, u'i': 241, u'm': 793, u'q': 504, u'u': 517, u'y': 452, u'}': 370} -widthsByUnichar["HeiseiMin-W3"] = {u'\uff81': 500, u'\u0302': 333, u'\uff85': 500, u'\u0306': 333, u'\uff89': 500, u'\u030a': 333, u'\uff8d': 500, u'\uff91': 500, u'\ufb02': 556, u'\uff95': 500, u'\uff99': 500, u'\uff9d': 500, u' ': 250, u'\xa3': 500, u'\u2122': 980, u'$': 500, u'(': 333, u'\xab': 500, u',': 250, u'\xaf': 333, u'0': 500, u'\xb3': 300, u'\u0332': 500, u'4': 500, u'\xb7': 250, u'8': 500, u'\xbb': 500, u'<': 564, u'\xbf': 444, u'@': 921, u'\xc3': 722, u'\u0142': 278, u'D': 722, u'\xc7': 667, u'H': 722, u'\xcb': 611, u'L': 611, u'\xcf': 333, u'P': 556, u'\xd3': 722, u'\u0152': 889, u'T': 611, u'X': 722, u'\xdb': 722, u'\\': 278, u'\xdf': 500, u'\uff64': 500, u'`': 333, u'\xe3': 444, u'\uff62': 500, u'd': 500, u'\xe7': 444, u'\uff66': 500, u'h': 500, u'\xeb': 444, u'\uff6a': 500, u'l': 278, u'\xef': 278, u'\uff6e': 500, u'p': 500, u'\xf3': 500, u'\uff72': 500, u't': 278, u'\uff76': 500, u'x': 500, u'\xfb': 500, u'\uff7a': 500, u'|': 200, u'\xff': 500, u'\u017e': 444, u'\u0301': 333, u'\uff82': 500, u'\u0305': 500, u'\uff86': 500, u'\uff8a': 500, u'\uff8e': 500, u'\u2013': 500, u'\uff92': 500, u'\uff96': 500, u'\uff9a': 500, u'\uff9e': 500, u'#': 500, u'\xa4': 500, u"'": 180, u'\u203a': 333, u'+': 564, u'\xac': 564, u'/': 278, u'\u0131': 278, u'3': 500, u'7': 500, u'\xb8': 333, u';': 278, u'\xbc': 750, u'?': 444, u'\u0141': 611, u'\xc0': 722, u'C': 667, u'\xc4': 722, u'G': 722, u'\xc8': 611, u'K': 722, u'\xcc': 333, u'O': 722, u'\xd0': 722, u'S': 556, u'\u2022': 350, u'\xd4': 722, u'W': 944, u'\uff78': 500, u'\xd8': 722, u'[': 333, u'\xdc': 722, u'_': 500, u'\u0161': 389, u'\xe0': 444, u'c': 444, u'\uff65': 500, u'\xe4': 444, u'g': 500, u'\uff69': 500, u'\xe8': 444, u'k': 500, u'\uff6d': 500, u'\xec': 278, u'o': 500, u'\uff71': 500, u'\xf0': 500, u's': 389, u'\uff75': 500, u'\xf4': 500, u'w': 722, u'\uff79': 500, u'\xf8': 500, u'{': 480, u'\uff7e': 500, u'\u017d': 611, u'\xfc': 500, u'\u0300': 333, u'\uff83': 500, u'\u2002': 500, u'\u0304': 333, u'\uff87': 500, u'\u0308': 333, u'\uff8b': 500, u'\u030c': 333, u'\uff8f': 500, u'\uff93': 500, u'\u2012': 500, u'\uff97': 500, u'\uff9b': 500, u'\u201a': 333, u'\uff9f': 500, u'\u201e': 444, u'\xa1': 333, u'"': 408, u'\xa5': 500, u'&': 778, u'\xa9': 760, u'\u0328': 333, u'*': 500, u'\xad': 564, u'.': 250, u'\uffe8': 500, u'2': 500, u'\xb5': 500, u'6': 500, u'\xb9': 300, u':': 278, u'\xbd': 750, u'>': 564, u'\xc1': 722, u'\uff61': 500, u'B': 667, u'\xc5': 722, u'F': 556, u'\xc9': 611, u'J': 389, u'\xcd': 333, u'N': 722, u'\xd1': 722, u'\u203e': 500, u'R': 667, u'\xd5': 722, u'V': 722, u'\xd9': 722, u'Z': 611, u'\xdd': 722, u'^': 469, u'\xe1': 444, u'\u0160': 556, u'b': 500, u'\xe5': 444, u'\u2039': 333, u'f': 333, u'\xe9': 444, u'\uff68': 500, u'j': 278, u'\xed': 278, u'\uff6c': 500, u'n': 500, u'\xf1': 500, u'\uff70': 500, u'r': 333, u'\xf5': 500, u'\uff74': 500, u'v': 500, u'\xf9': 500, u'\u0178': 722, u'z': 444, u'\xfd': 500, u'\uff7c': 500, u'~': 333, u'\uff80': 500, u'\u0303': 333, u'\uff84': 500, u'\u0307': 333, u'\uff88': 500, u'\u030b': 333, u'\uff8c': 500, u'\u2011': 333, u'\uff90': 500, u'\uff94': 500, u'\uff98': 500, u'\uff9c': 500, u'\u2044': 167, u'!': 333, u'\xa2': 500, u'%': 833, u'\u0327': 333, u'\xa6': 200, u')': 333, u'\xaa': 276, u'-': 333, u'\xae': 760, u'1': 500, u'\xb2': 300, u'5': 500, u'9': 500, u'\xba': 310, u'=': 564, u'\xbe': 750, u'A': 722, u'\u01c0': 200, u'\xc2': 722, u'E': 611, u'\xc6': 889, u'I': 333, u'\xca': 611, u'M': 889, u'\xce': 333, u'Q': 722, u'\u0153': 722, u'\xd2': 722, u'U': 722, u'\xd6': 722, u'Y': 722, u'\ufb01': 556, u'\xda': 722, u']': 333, u'\xde': 556, u'a': 444, u'\uff63': 500, u'\xe2': 444, u'e': 444, u'\uff67': 500, u'\xe6': 667, u'i': 278, u'\uff7d': 500, u'\uff6b': 500, u'\xea': 444, u'm': 778, u'\uff6f': 500, u'\xee': 278, u'q': 500, u'\uff73': 500, u'\xf2': 500, u'u': 500, u'\uff77': 500, u'\xf6': 500, u'y': 500, u'\uff7b': 500, u'\xfa': 500, u'}': 480, u'\uff7f': 500, u'\xfe': 500} -widthsByUnichar["HYGothic-Medium"] = {u' ': 500, u'$': 500, u'(': 500, u',': 500, u'0': 500, u'4': 500, u'8': 500, u'<': 500, u'@': 500, u'D': 500, u'H': 500, u'L': 500, u'P': 500, u'T': 500, u'X': 500, u'\\': 500, u'`': 500, u'd': 500, u'h': 500, u'l': 500, u'p': 500, u't': 500, u'x': 500, u'|': 500, u'#': 500, u"'": 500, u'+': 500, u'/': 500, u'3': 500, u'7': 500, u';': 500, u'?': 500, u'C': 500, u'G': 500, u'K': 500, u'O': 500, u'S': 500, u'W': 500, u'[': 500, u'_': 500, u'c': 500, u'g': 500, u'k': 500, u'o': 500, u's': 500, u'w': 500, u'{': 500, u'"': 500, u'&': 500, u'*': 500, u'.': 500, u'2': 500, u'6': 500, u':': 500, u'>': 500, u'B': 500, u'F': 500, u'J': 500, u'N': 500, u'R': 500, u'V': 500, u'Z': 500, u'^': 500, u'b': 500, u'f': 500, u'j': 500, u'n': 500, u'r': 500, u'v': 500, u'z': 500, u'!': 500, u'%': 500, u')': 500, u'-': 500, u'1': 500, u'5': 500, u'9': 500, u'=': 500, u'A': 500, u'E': 500, u'I': 500, u'M': 500, u'Q': 500, u'U': 500, u'Y': 500, u']': 500, u'a': 500, u'e': 500, u'i': 500, u'm': 500, u'q': 500, u'u': 500, u'y': 500, u'}': 500} - - -#shift-jis saying 'This is Heisei-Minchou' -message1 = '\202\261\202\352\202\315\225\275\220\254\226\276\222\251\202\305\202\267\201B' -message2 = '\202\261\202\352\202\315\225\275\220\254\212p\203S\203V\203b\203N\202\305\202\267\201B' - -##def pswidths(text): -## words = text.split() -## out = [] -## for word in words: -## if word == '[': -## out.append(word) -## else: -## out.append(word + ',') -## return eval(''.join(out)) diff --git a/reportlab/pdfbase/_fontdata.py b/reportlab/pdfbase/_fontdata.py deleted file mode 100644 index a26a2888..00000000 --- a/reportlab/pdfbase/_fontdata.py +++ /dev/null @@ -1,255 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/pdfbase/_fontdata.py -#$Header $ -__version__=''' $Id$ ''' -__doc__="""Database of font related things - - - standardFonts - tuple of the 14 standard string font names - - standardEncodings - tuple of the known standard font names - - encodings - a mapping object from standard encoding names (and minor variants) - to the encoding vectors ie the tuple of string glyph names - - widthsByFontGlyph - fontname x glyphname --> width of glyph - - widthVectorsByFont - fontName -> vector of widths - - This module defines a static, large data structure. At the request - of the Jython project, we have split this off into separate modules - as Jython cannot handle more than 64k of bytecode in the 'top level' - code of a Python module. -""" -import os, sys - -# mapping of name to width vector, starts empty until fonts are added -# e.g. widths['Courier'] = [...600,600,600,...] -widthVectorsByFont = {} -fontsByName = {} -fontsByBaseEnc = {} -# this is a list of the standard 14 font names in Acrobat Reader -standardFonts = ( - 'Courier', 'Courier-Bold', 'Courier-Oblique', 'Courier-BoldOblique', - 'Helvetica', 'Helvetica-Bold', 'Helvetica-Oblique', 'Helvetica-BoldOblique', - 'Times-Roman', 'Times-Bold', 'Times-Italic', 'Times-BoldItalic', - 'Symbol','ZapfDingbats') - -standardFontAttributes = { - #family, bold, italic defined for basic ones - 'Courier':('Courier',0,0), - 'Courier-Bold':('Courier',1,0), - 'Courier-Oblique':('Courier',0,1), - 'Courier-BoldOblique':('Courier',1,1), - - 'Helvetica':('Helvetica',0,0), - 'Helvetica-Bold':('Helvetica',1,0), - 'Helvetica-Oblique':('Helvetica',0,1), - 'Helvetica-BoldOblique':('Helvetica',1,1), - - 'Times-Roman':('Times-Roman',0,0), - 'Times-Bold':('Times-Roman',1,0), - 'Times-Italic':('Times-Roman',0,1), - 'Times-BoldItalic':('Times-Roman',1,1), - - 'Symbol':('Symbol',0,0), - 'ZapfDingbats':('ZapfDingbats',0,0) - - } - -#this maps fontnames to the equivalent filename root. -_font2fnrMapWin32 = { - 'symbol': 'sy______', - 'zapfdingbats': 'zd______', - 'helvetica': '_a______', - 'helvetica-bold': '_ab_____', - 'helvetica-boldoblique': '_abi____', - 'helvetica-oblique': '_ai_____', - 'times-bold': '_eb_____', - 'times-bolditalic': '_ebi____', - 'times-italic': '_ei_____', - 'times-roman': '_er_____', - 'courier-bold': 'cob_____', - 'courier-boldoblique': 'cobo____', - 'courier': 'com_____', - 'courier-oblique': 'coo_____', - } -if sys.platform in ('linux2',): - _font2fnrMapLinux2 ={ - 'symbol': 'Symbol', - 'zapfdingbats': 'ZapfDingbats', - 'helvetica': 'Arial', - 'helvetica-bold': 'Arial-Bold', - 'helvetica-boldoblique': 'Arial-BoldItalic', - 'helvetica-oblique': 'Arial-Italic', - 'times-bold': 'TimesNewRoman-Bold', - 'times-bolditalic':'TimesNewRoman-BoldItalic', - 'times-italic': 'TimesNewRoman-Italic', - 'times-roman': 'TimesNewRoman', - 'courier-bold': 'Courier-Bold', - 'courier-boldoblique': 'Courier-BoldOblique', - 'courier': 'Courier', - 'courier-oblique': 'Courier-Oblique', - } - _font2fnrMap = _font2fnrMapLinux2 - for k, v in _font2fnrMap.items(): - if k in _font2fnrMapWin32.keys(): - _font2fnrMapWin32[v.lower()] = _font2fnrMapWin32[k] - del k, v -else: - _font2fnrMap = _font2fnrMapWin32 - -def _findFNR(fontName): - return _font2fnrMap[fontName.lower()] - -from reportlab.rl_config import T1SearchPath -from reportlab.lib.utils import rl_isfile -def _searchT1Dirs(n,rl_isfile=rl_isfile,T1SearchPath=T1SearchPath): - assert T1SearchPath!=[], "No Type-1 font search path" - for d in T1SearchPath: - f = os.path.join(d,n) - if rl_isfile(f): return f - return None -del T1SearchPath, rl_isfile - -def findT1File(fontName,ext='.pfb'): - if sys.platform in ('linux2',) and ext=='.pfb': - try: - f = _searchT1Dirs(_findFNR(fontName)) - if f: return f - except: - pass - - try: - f = _searchT1Dirs(_font2fnrMapWin32[fontName.lower()]+ext) - if f: return f - except: - pass - - return _searchT1Dirs(_findFNR(fontName)+ext) - -# this lists the predefined font encodings - WinAnsi and MacRoman. We have -# not added MacExpert - it's possible, but would complicate life and nobody -# is asking. StandardEncoding means something special. -standardEncodings = ('WinAnsiEncoding','MacRomanEncoding','StandardEncoding','SymbolEncoding','ZapfDingbatsEncoding','PDFDocEncoding', 'MacExpertEncoding') - -#this is the global mapping of standard encodings to name vectors -class _Name2StandardEncodingMap(dict): - '''Trivial fake dictionary with some [] magic''' - _XMap = {'winansi':'WinAnsiEncoding','macroman': 'MacRomanEncoding','standard':'StandardEncoding','symbol':'SymbolEncoding', 'zapfdingbats':'ZapfDingbatsEncoding','pdfdoc':'PDFDocEncoding', 'macexpert':'MacExpertEncoding'} - def __setitem__(self,x,v): - y = x.lower() - if y[-8:]=='encoding': y = y[:-8] - y = self._XMap[y] - if y in self: raise IndexError('Encoding %s is already set' % y) - dict.__setitem__(self,y,v) - - def __getitem__(self,x): - y = x.lower() - if y[-8:]=='encoding': y = y[:-8] - y = self._XMap[y] - return dict.__getitem__(self,y) - -encodings = _Name2StandardEncodingMap() - -#due to compiled method size limits in Jython, -#we pull these in from separate modules to keep this module -#well under 64k. We might well be able to ditch many of -#these anyway now we run on Unicode. - -from reportlab.pdfbase._fontdata_enc_winansi import WinAnsiEncoding -from reportlab.pdfbase._fontdata_enc_macroman import MacRomanEncoding -from reportlab.pdfbase._fontdata_enc_standard import StandardEncoding -from reportlab.pdfbase._fontdata_enc_symbol import SymbolEncoding -from reportlab.pdfbase._fontdata_enc_zapfdingbats import ZapfDingbatsEncoding -from reportlab.pdfbase._fontdata_enc_pdfdoc import PDFDocEncoding -from reportlab.pdfbase._fontdata_enc_macexpert import MacExpertEncoding -encodings.update({ - 'WinAnsiEncoding': WinAnsiEncoding, - 'MacRomanEncoding': MacRomanEncoding, - 'StandardEncoding': StandardEncoding, - 'SymbolEncoding': SymbolEncoding, - 'ZapfDingbatsEncoding': ZapfDingbatsEncoding, - 'PDFDocEncoding': PDFDocEncoding, - 'MacExpertEncoding': MacExpertEncoding, -}) - -ascent_descent = { - 'Courier': (629, -157), - 'Courier-Bold': (626, -142), - 'Courier-BoldOblique': (626, -142), - 'Courier-Oblique': (629, -157), - 'Helvetica': (718, -207), - 'Helvetica-Bold': (718, -207), - 'Helvetica-BoldOblique': (718, -207), - 'Helvetica-Oblique': (718, -207), - 'Times-Roman': (683, -217), - 'Times-Bold': (676, -205), - 'Times-BoldItalic': (699, -205), - 'Times-Italic': (683, -205), - 'Symbol': (0, 0), - 'ZapfDingbats': (0, 0) - } - -# ditto about 64k limit - profusion of external files -import reportlab.pdfbase._fontdata_widths_courier -import reportlab.pdfbase._fontdata_widths_courierbold -import reportlab.pdfbase._fontdata_widths_courieroblique -import reportlab.pdfbase._fontdata_widths_courierboldoblique -import reportlab.pdfbase._fontdata_widths_helvetica -import reportlab.pdfbase._fontdata_widths_helveticabold -import reportlab.pdfbase._fontdata_widths_helveticaoblique -import reportlab.pdfbase._fontdata_widths_helveticaboldoblique -import reportlab.pdfbase._fontdata_widths_timesroman -import reportlab.pdfbase._fontdata_widths_timesbold -import reportlab.pdfbase._fontdata_widths_timesitalic -import reportlab.pdfbase._fontdata_widths_timesbolditalic -import reportlab.pdfbase._fontdata_widths_symbol -import reportlab.pdfbase._fontdata_widths_zapfdingbats -widthsByFontGlyph = { - 'Courier': - reportlab.pdfbase._fontdata_widths_courier.widths, - 'Courier-Bold': - reportlab.pdfbase._fontdata_widths_courierbold.widths, - 'Courier-Oblique': - reportlab.pdfbase._fontdata_widths_courieroblique.widths, - 'Courier-BoldOblique': - reportlab.pdfbase._fontdata_widths_courierboldoblique.widths, - 'Helvetica': - reportlab.pdfbase._fontdata_widths_helvetica.widths, - 'Helvetica-Bold': - reportlab.pdfbase._fontdata_widths_helveticabold.widths, - 'Helvetica-Oblique': - reportlab.pdfbase._fontdata_widths_helveticaoblique.widths, - 'Helvetica-BoldOblique': - reportlab.pdfbase._fontdata_widths_helveticaboldoblique.widths, - 'Times-Roman': - reportlab.pdfbase._fontdata_widths_timesroman.widths, - 'Times-Bold': - reportlab.pdfbase._fontdata_widths_timesbold.widths, - 'Times-Italic': - reportlab.pdfbase._fontdata_widths_timesitalic.widths, - 'Times-BoldItalic': - reportlab.pdfbase._fontdata_widths_timesbolditalic.widths, - 'Symbol': - reportlab.pdfbase._fontdata_widths_symbol.widths, - 'ZapfDingbats': - reportlab.pdfbase._fontdata_widths_zapfdingbats.widths, -} - - -#preserve the initial values here -def _reset( - initial_dicts=dict( - ascent_descent=ascent_descent.copy(), - fontsByBaseEnc=fontsByBaseEnc.copy(), - fontsByName=fontsByName.copy(), - standardFontAttributes=standardFontAttributes.copy(), - widthVectorsByFont=widthVectorsByFont.copy(), - widthsByFontGlyph=widthsByFontGlyph.copy(), - ) - ): - for k,v in initial_dicts.items(): - d=globals()[k] - d.clear() - d.update(v) - -from reportlab.rl_config import register_reset -register_reset(_reset) -del register_reset diff --git a/reportlab/pdfbase/_fontdata_enc_macexpert.py b/reportlab/pdfbase/_fontdata_enc_macexpert.py deleted file mode 100644 index f0372db7..00000000 --- a/reportlab/pdfbase/_fontdata_enc_macexpert.py +++ /dev/null @@ -1,28 +0,0 @@ -MacExpertEncoding = (None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, - 'space', 'exclamsmall', 'Hungarumlautsmall', 'centoldstyle', 'dollaroldstyle', 'dollarsuperior', 'ampersandsmall', - 'Acutesmall', 'parenleftsuperior', 'parenrightsuperior', 'twodotenleader', 'onedotenleader', 'comma', 'hyphen', - 'period', 'fraction', 'zerooldstyle', 'oneoldstyle', 'twooldstyle', 'threeoldstyle', 'fouroldstyle', - 'fiveoldstyle', 'sixoldstyle', 'sevenoldstyle', 'eightoldstyle', 'nineoldstyle', 'colon', 'semicolon', None, - 'threequartersemdash', None, 'questionsmall', None, None, None, None, 'Ethsmall', None, None, 'onequarter', - 'onehalf', 'threequarters', 'oneeighth', 'threeeighths', 'fiveeighths', 'seveneighths', 'onethird', 'twothirds', - None, None, None, None, None, None, 'ff', 'fi', 'fl', 'ffi', 'ffl', 'parenleftinferior', None, - 'parenrightinferior', 'Circumflexsmall', 'hypheninferior', 'Gravesmall', 'Asmall', 'Bsmall', 'Csmall', 'Dsmall', - 'Esmall', 'Fsmall', 'Gsmall', 'Hsmall', 'Ismall', 'Jsmall', 'Ksmall', 'Lsmall', 'Msmall', 'Nsmall', 'Osmall', - 'Psmall', 'Qsmall', 'Rsmall', 'Ssmall', 'Tsmall', 'Usmall', 'Vsmall', 'Wsmall', 'Xsmall', 'Ysmall', 'Zsmall', - 'colonmonetary', 'onefitted', 'rupiah', 'Tildesmall', None, None, 'asuperior', 'centsuperior', None, None, None, - None, 'Aacutesmall', 'Agravesmall', 'Acircumflexsmall', 'Adieresissmall', 'Atildesmall', 'Aringsmall', - 'Ccedillasmall', 'Eacutesmall', 'Egravesmall', 'Ecircumflexsmall', 'Edieresissmall', 'Iacutesmall', 'Igravesmall', - 'Icircumflexsmall', 'Idieresissmall', 'Ntildesmall', 'Oacutesmall', 'Ogravesmall', 'Ocircumflexsmall', - 'Odieresissmall', 'Otildesmall', 'Uacutesmall', 'Ugravesmall', 'Ucircumflexsmall', 'Udieresissmall', None, - 'eightsuperior', 'fourinferior', 'threeinferior', 'sixinferior', 'eightinferior', 'seveninferior', 'Scaronsmall', - None, 'centinferior', 'twoinferior', None, 'Dieresissmall', None, 'Caronsmall', 'osuperior', 'fiveinferior', None, - 'commainferior', 'periodinferior', 'Yacutesmall', None, 'dollarinferior', None, None, 'Thornsmall', None, - 'nineinferior', 'zeroinferior', 'Zcaronsmall', 'AEsmall', 'Oslashsmall', 'questiondownsmall', 'oneinferior', - 'Lslashsmall', None, None, None, None, None, None, 'Cedillasmall', None, None, None, None, None, 'OEsmall', - 'figuredash', 'hyphensuperior', None, None, None, None, 'exclamdownsmall', None, 'Ydieresissmall', None, - 'onesuperior', 'twosuperior', 'threesuperior', 'foursuperior', 'fivesuperior', 'sixsuperior', 'sevensuperior', - 'ninesuperior', 'zerosuperior', None, 'esuperior', 'rsuperior', 'tsuperior', None, None, 'isuperior', 'ssuperior', - 'dsuperior', None, None, None, None, None, 'lsuperior', 'Ogoneksmall', 'Brevesmall', 'Macronsmall', 'bsuperior', - 'nsuperior', 'msuperior', 'commasuperior', 'periodsuperior', 'Dotaccentsmall', 'Ringsmall', None, None, None, None) - diff --git a/reportlab/pdfbase/_fontdata_enc_macroman.py b/reportlab/pdfbase/_fontdata_enc_macroman.py deleted file mode 100644 index b4067124..00000000 --- a/reportlab/pdfbase/_fontdata_enc_macroman.py +++ /dev/null @@ -1,35 +0,0 @@ -MacRomanEncoding = ( - None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, 'space', 'exclam', - 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', - 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', - 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', - 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', - 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', - 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', - 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', - 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', - 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', - 'asciitilde', None, 'Adieresis', 'Aring', 'Ccedilla', 'Eacute', - 'Ntilde', 'Odieresis', 'Udieresis', 'aacute', 'agrave', 'acircumflex', - 'adieresis', 'atilde', 'aring', 'ccedilla', 'eacute', 'egrave', - 'ecircumflex', 'edieresis', 'iacute', 'igrave', 'icircumflex', - 'idieresis', 'ntilde', 'oacute', 'ograve', 'ocircumflex', 'odieresis', - 'otilde', 'uacute', 'ugrave', 'ucircumflex', 'udieresis', 'dagger', - 'degree', 'cent', 'sterling', 'section', 'bullet', 'paragraph', - 'germandbls', 'registered', 'copyright', 'trademark', 'acute', - 'dieresis', None, 'AE', 'Oslash', None, 'plusminus', None, None, 'yen', - 'mu', None, None, None, None, None, 'ordfeminine', 'ordmasculine', None, - 'ae', 'oslash', 'questiondown', 'exclamdown', 'logicalnot', None, 'florin', - None, None, 'guillemotleft', 'guillemotright', 'ellipsis', 'space', 'Agrave', - 'Atilde', 'Otilde', 'OE', 'oe', 'endash', 'emdash', 'quotedblleft', - 'quotedblright', 'quoteleft', 'quoteright', 'divide', None, 'ydieresis', - 'Ydieresis', 'fraction', 'currency', 'guilsinglleft', 'guilsinglright', - 'fi', 'fl', 'daggerdbl', 'periodcentered', 'quotesinglbase', - 'quotedblbase', 'perthousand', 'Acircumflex', 'Ecircumflex', 'Aacute', - 'Edieresis', 'Egrave', 'Iacute', 'Icircumflex', 'Idieresis', 'Igrave', - 'Oacute', 'Ocircumflex', None, 'Ograve', 'Uacute', 'Ucircumflex', - 'Ugrave', 'dotlessi', 'circumflex', 'tilde', 'macron', 'breve', - 'dotaccent', 'ring', 'cedilla', 'hungarumlaut', 'ogonek', 'caron') diff --git a/reportlab/pdfbase/_fontdata_enc_pdfdoc.py b/reportlab/pdfbase/_fontdata_enc_pdfdoc.py deleted file mode 100644 index 39ccf5ce..00000000 --- a/reportlab/pdfbase/_fontdata_enc_pdfdoc.py +++ /dev/null @@ -1,22 +0,0 @@ -PDFDocEncoding = (None, None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None, - None,None,None,None,None,"breve","caron","circumflex", - "dotaccent","hungarumlaut","ogonek","ring","tilde","space","exclam","quotedbl","numbersign","dollar","percent", - "ampersand","quotesingle","parenleft","parenright","asterisk","plus","comma","hyphen","period","slash","zero", - "one","two","three","four","five","six","seven","eight","nine","colon","semicolon","less","equal","greater", - "question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X", - "Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore","grave","a","b","c","d","e","f","g", - "h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","braceleft","bar","braceright", - "asciitilde",None,"bullet","dagger","daggerdbl","ellipsis","emdash","endash","florin","fraction","guilsinglleft", - "guilsinglright","minus","perthousand","quotedblbase","quotedblleft","quotedblright","quoteleft","quoteright", - "quotesinglbase","trademark","fi","fl","Lslash","OE","Scaron","Ydieresis","Zcaron","dotlessi","lslash","oe", - "scaron","zcaron",None,"Euro","exclamdown","cent","sterling","currency","yen","brokenbar","section","dieresis", - "copyright","ordfeminine","guillemotleft","logicalnot",None,"registered","macron","degree","plusminus","twosuperior", - "threesuperior","acute","mu","paragraph","periodcentered","cedilla","onesuperior","ordmasculine","guillemotright", - "onequarter","onehalf","threequarters","questiondown","Agrave","Aacute","Acircumflex","Atilde","Adieresis","Aring", - "AE","Ccedilla","Egrave","Eacute","Ecircumflex","Edieresis","Igrave","Iacute","Icircumflex","Idieresis","Eth", - "Ntilde","Ograve","Oacute","Ocircumflex","Otilde","Odieresis","multiply","Oslash","Ugrave","Uacute","Ucircumflex", - "Udieresis","Yacute","Thorn","germandbls","agrave","aacute","acircumflex","atilde","adieresis","aring","ae", - "ccedilla","egrave","eacute","ecircumflex","edieresis","igrave","iacute","icircumflex","idieresis","eth","ntilde", - "ograve","oacute","ocircumflex","otilde","odieresis","divide","oslash","ugrave","uacute","ucircumflex","udieresis", - "yacute","thorn","ydieresis") - diff --git a/reportlab/pdfbase/_fontdata_enc_standard.py b/reportlab/pdfbase/_fontdata_enc_standard.py deleted file mode 100644 index e17aa680..00000000 --- a/reportlab/pdfbase/_fontdata_enc_standard.py +++ /dev/null @@ -1,15 +0,0 @@ -StandardEncoding =(None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,"space","exclam", - "quotedbl","numbersign","dollar","percent","ampersand","quoteright","parenleft","parenright","asterisk","plus", - "comma","hyphen","period","slash","zero","one","two","three","four","five","six","seven","eight","nine","colon", - "semicolon","less","equal","greater","question","at","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O", - "P","Q","R","S","T","U","V","W","X","Y","Z","bracketleft","backslash","bracketright","asciicircum","underscore", - "quoteleft","a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y", - "z","braceleft","bar","braceright","asciitilde",None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None, - None,None,None,"exclamdown","cent","sterling","fraction","yen","florin","section","currency","quotesingle","quotedblleft", - "guillemotleft","guilsinglleft","guilsinglright","fi","fl",None,"endash","dagger","daggerdbl","periodcentered",None, - "paragraph","bullet","quotesinglbase","quotedblbase","quotedblright","guillemotright","ellipsis","perthousand", - None,"questiondown",None,"grave","acute","circumflex","tilde","macron","breve","dotaccent","dieresis",None,"ring", - "cedilla",None,"hungarumlaut","ogonek","caron","emdash",None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,None,"AE",None,"ordfeminine", - None,None,None,None,"Lslash","Oslash","OE","ordmasculine",None,None,None,None,None,"ae",None,None,None,"dotlessi",None,None,"lslash","oslash", - "oe","germandbls",None,None,None,None) - diff --git a/reportlab/pdfbase/_fontdata_enc_symbol.py b/reportlab/pdfbase/_fontdata_enc_symbol.py deleted file mode 100644 index cc399bbe..00000000 --- a/reportlab/pdfbase/_fontdata_enc_symbol.py +++ /dev/null @@ -1,30 +0,0 @@ -SymbolEncoding = ( - None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, 'space', - 'exclam', 'universal', 'numbersign', 'existential', 'percent', 'ampersand', 'suchthat', - 'parenleft', 'parenright', 'asteriskmath', 'plus', 'comma', 'minus', 'period', 'slash', 'zero', - 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', - 'less', 'equal', 'greater', 'question', 'congruent', 'Alpha', 'Beta', 'Chi', 'Delta', 'Epsilon', - 'Phi', 'Gamma', 'Eta', 'Iota', 'theta1', 'Kappa', 'Lambda', 'Mu', 'Nu', 'Omicron', 'Pi', 'Theta', - 'Rho', 'Sigma', 'Tau', 'Upsilon', 'sigma1', 'Omega', 'Xi', 'Psi', 'Zeta', 'bracketleft', - 'therefore', 'bracketright', 'perpendicular', 'underscore', 'radicalex', 'alpha', 'beta', 'chi', - 'delta', 'epsilon', 'phi', 'gamma', 'eta', 'iota', 'phi1', 'kappa', 'lambda', 'mu', 'nu', - 'omicron', 'pi', 'theta', 'rho', 'sigma', 'tau', 'upsilon', 'omega1', 'omega', 'xi', 'psi', 'zeta', - 'braceleft', 'bar', 'braceright', 'similar', None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, 'Euro', 'Upsilon1', 'minute', 'lessequal', - 'fraction', 'infinity', 'florin', 'club', 'diamond', 'heart', 'spade', 'arrowboth', 'arrowleft', - 'arrowup', 'arrowright', 'arrowdown', 'degree', 'plusminus', 'second', 'greaterequal', 'multiply', - 'proportional', 'partialdiff', 'bullet', 'divide', 'notequal', 'equivalence', 'approxequal', - 'ellipsis', 'arrowvertex', 'arrowhorizex', 'carriagereturn', 'aleph', 'Ifraktur', 'Rfraktur', - 'weierstrass', 'circlemultiply', 'circleplus', 'emptyset', 'intersection', 'union', - 'propersuperset', 'reflexsuperset', 'notsubset', 'propersubset', 'reflexsubset', 'element', - 'notelement', 'angle', 'gradient', 'registerserif', 'copyrightserif', 'trademarkserif', 'product', - 'radical', 'dotmath', 'logicalnot', 'logicaland', 'logicalor', 'arrowdblboth', 'arrowdblleft', - 'arrowdblup', 'arrowdblright', 'arrowdbldown', 'lozenge', 'angleleft', 'registersans', - 'copyrightsans', 'trademarksans', 'summation', 'parenlefttp', 'parenleftex', 'parenleftbt', - 'bracketlefttp', 'bracketleftex', 'bracketleftbt', 'bracelefttp', 'braceleftmid', 'braceleftbt', - 'braceex', None, 'angleright', 'integral', 'integraltp', 'integralex', 'integralbt', - 'parenrighttp', 'parenrightex', 'parenrightbt', 'bracketrighttp', 'bracketrightex', - 'bracketrightbt', 'bracerighttp', 'bracerightmid', 'bracerightbt', None) - diff --git a/reportlab/pdfbase/_fontdata_enc_winansi.py b/reportlab/pdfbase/_fontdata_enc_winansi.py deleted file mode 100644 index 8cf18ba8..00000000 --- a/reportlab/pdfbase/_fontdata_enc_winansi.py +++ /dev/null @@ -1,37 +0,0 @@ -WinAnsiEncoding = ( - None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, 'space', 'exclam', - 'quotedbl', 'numbersign', 'dollar', 'percent', 'ampersand', - 'quotesingle', 'parenleft', 'parenright', 'asterisk', 'plus', 'comma', - 'hyphen', 'period', 'slash', 'zero', 'one', 'two', 'three', 'four', - 'five', 'six', 'seven', 'eight', 'nine', 'colon', 'semicolon', 'less', - 'equal', 'greater', 'question', 'at', 'A', 'B', 'C', 'D', 'E', 'F', - 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', - 'U', 'V', 'W', 'X', 'Y', 'Z', 'bracketleft', 'backslash', 'bracketright', - 'asciicircum', 'underscore', 'grave', 'a', 'b', 'c', 'd', 'e', 'f', - 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', - 'u', 'v', 'w', 'x', 'y', 'z', 'braceleft', 'bar', 'braceright', - 'asciitilde', 'bullet', 'Euro', 'bullet', 'quotesinglbase', 'florin', - 'quotedblbase', 'ellipsis', 'dagger', 'daggerdbl', 'circumflex', - 'perthousand', 'Scaron', 'guilsinglleft', 'OE', 'bullet', 'Zcaron', - 'bullet', 'bullet', 'quoteleft', 'quoteright', 'quotedblleft', - 'quotedblright', 'bullet', 'endash', 'emdash', 'tilde', 'trademark', - 'scaron', 'guilsinglright', 'oe', 'bullet', 'zcaron', 'Ydieresis', - 'space', 'exclamdown', 'cent', 'sterling', 'currency', 'yen', 'brokenbar', - 'section', 'dieresis', 'copyright', 'ordfeminine', 'guillemotleft', - 'logicalnot', 'hyphen', 'registered', 'macron', 'degree', 'plusminus', - 'twosuperior', 'threesuperior', 'acute', 'mu', 'paragraph', 'periodcentered', - 'cedilla', 'onesuperior', 'ordmasculine', 'guillemotright', 'onequarter', - 'onehalf', 'threequarters', 'questiondown', 'Agrave', 'Aacute', - 'Acircumflex', 'Atilde', 'Adieresis', 'Aring', 'AE', 'Ccedilla', - 'Egrave', 'Eacute', 'Ecircumflex', 'Edieresis', 'Igrave', 'Iacute', - 'Icircumflex', 'Idieresis', 'Eth', 'Ntilde', 'Ograve', 'Oacute', - 'Ocircumflex', 'Otilde', 'Odieresis', 'multiply', 'Oslash', 'Ugrave', - 'Uacute', 'Ucircumflex', 'Udieresis', 'Yacute', 'Thorn', 'germandbls', - 'agrave', 'aacute', 'acircumflex', 'atilde', 'adieresis', 'aring', 'ae', - 'ccedilla', 'egrave', 'eacute', 'ecircumflex', 'edieresis', 'igrave', - 'iacute', 'icircumflex', 'idieresis', 'eth', 'ntilde', 'ograve', 'oacute', - 'ocircumflex', 'otilde', 'odieresis', 'divide', 'oslash', 'ugrave', 'uacute', - 'ucircumflex', 'udieresis', 'yacute', 'thorn', 'ydieresis') - diff --git a/reportlab/pdfbase/_fontdata_enc_zapfdingbats.py b/reportlab/pdfbase/_fontdata_enc_zapfdingbats.py deleted file mode 100644 index 80b66756..00000000 --- a/reportlab/pdfbase/_fontdata_enc_zapfdingbats.py +++ /dev/null @@ -1,20 +0,0 @@ -ZapfDingbatsEncoding = ( None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, - 'space', 'a1', 'a2', 'a202', 'a3', 'a4', 'a5', 'a119', 'a118', 'a117', 'a11', 'a12', 'a13', 'a14', - 'a15', 'a16', 'a105', 'a17', 'a18', 'a19', 'a20', 'a21', 'a22', 'a23', 'a24', 'a25', 'a26', 'a27', - 'a28', 'a6', 'a7', 'a8', 'a9', 'a10', 'a29', 'a30', 'a31', 'a32', 'a33', 'a34', 'a35', 'a36', - 'a37', 'a38', 'a39', 'a40', 'a41', 'a42', 'a43', 'a44', 'a45', 'a46', 'a47', 'a48', 'a49', 'a50', - 'a51', 'a52', 'a53', 'a54', 'a55', 'a56', 'a57', 'a58', 'a59', 'a60', 'a61', 'a62', 'a63', 'a64', - 'a65', 'a66', 'a67', 'a68', 'a69', 'a70', 'a71', 'a72', 'a73', 'a74', 'a203', 'a75', 'a204', 'a76', - 'a77', 'a78', 'a79', 'a81', 'a82', 'a83', 'a84', 'a97', 'a98', 'a99', 'a100', None, 'a89', 'a90', - 'a93', 'a94', 'a91', 'a92', 'a205', 'a85', 'a206', 'a86', 'a87', 'a88', 'a95', 'a96', None, None, - None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, - None, 'a101', 'a102', 'a103', 'a104', 'a106', 'a107', 'a108', 'a112', 'a111', 'a110', 'a109', - 'a120', 'a121', 'a122', 'a123', 'a124', 'a125', 'a126', 'a127', 'a128', 'a129', 'a130', 'a131', - 'a132', 'a133', 'a134', 'a135', 'a136', 'a137', 'a138', 'a139', 'a140', 'a141', 'a142', 'a143', - 'a144', 'a145', 'a146', 'a147', 'a148', 'a149', 'a150', 'a151', 'a152', 'a153', 'a154', 'a155', - 'a156', 'a157', 'a158', 'a159', 'a160', 'a161', 'a163', 'a164', 'a196', 'a165', 'a192', 'a166', - 'a167', 'a168', 'a169', 'a170', 'a171', 'a172', 'a173', 'a162', 'a174', 'a175', 'a176', 'a177', - 'a178', 'a179', 'a193', 'a180', 'a199', 'a181', 'a200', 'a182', None, 'a201', 'a183', 'a184', - 'a197', 'a185', 'a194', 'a198', 'a186', 'a195', 'a187', 'a188', 'a189', 'a190', 'a191', None) - diff --git a/reportlab/pdfbase/_fontdata_widths_courier.py b/reportlab/pdfbase/_fontdata_widths_courier.py deleted file mode 100644 index f196a19a..00000000 --- a/reportlab/pdfbase/_fontdata_widths_courier.py +++ /dev/null @@ -1,229 +0,0 @@ -widths = {'A': 600, - 'AE': 600, - 'Aacute': 600, - 'Acircumflex': 600, - 'Adieresis': 600, - 'Agrave': 600, - 'Aring': 600, - 'Atilde': 600, - 'B': 600, - 'C': 600, - 'Ccedilla': 600, - 'D': 600, - 'E': 600, - 'Eacute': 600, - 'Ecircumflex': 600, - 'Edieresis': 600, - 'Egrave': 600, - 'Eth': 600, - 'Euro': 600, - 'F': 600, - 'G': 600, - 'H': 600, - 'I': 600, - 'Iacute': 600, - 'Icircumflex': 600, - 'Idieresis': 600, - 'Igrave': 600, - 'J': 600, - 'K': 600, - 'L': 600, - 'Lslash': 600, - 'M': 600, - 'N': 600, - 'Ntilde': 600, - 'O': 600, - 'OE': 600, - 'Oacute': 600, - 'Ocircumflex': 600, - 'Odieresis': 600, - 'Ograve': 600, - 'Oslash': 600, - 'Otilde': 600, - 'P': 600, - 'Q': 600, - 'R': 600, - 'S': 600, - 'Scaron': 600, - 'T': 600, - 'Thorn': 600, - 'U': 600, - 'Uacute': 600, - 'Ucircumflex': 600, - 'Udieresis': 600, - 'Ugrave': 600, - 'V': 600, - 'W': 600, - 'X': 600, - 'Y': 600, - 'Yacute': 600, - 'Ydieresis': 600, - 'Z': 600, - 'Zcaron': 600, - 'a': 600, - 'aacute': 600, - 'acircumflex': 600, - 'acute': 600, - 'adieresis': 600, - 'ae': 600, - 'agrave': 600, - 'ampersand': 600, - 'aring': 600, - 'asciicircum': 600, - 'asciitilde': 600, - 'asterisk': 600, - 'at': 600, - 'atilde': 600, - 'b': 600, - 'backslash': 600, - 'bar': 600, - 'braceleft': 600, - 'braceright': 600, - 'bracketleft': 600, - 'bracketright': 600, - 'breve': 600, - 'brokenbar': 600, - 'bullet': 600, - 'c': 600, - 'caron': 600, - 'ccedilla': 600, - 'cedilla': 600, - 'cent': 600, - 'circumflex': 600, - 'colon': 600, - 'comma': 600, - 'copyright': 600, - 'currency': 600, - 'd': 600, - 'dagger': 600, - 'daggerdbl': 600, - 'degree': 600, - 'dieresis': 600, - 'divide': 600, - 'dollar': 600, - 'dotaccent': 600, - 'dotlessi': 600, - 'e': 600, - 'eacute': 600, - 'ecircumflex': 600, - 'edieresis': 600, - 'egrave': 600, - 'eight': 600, - 'ellipsis': 600, - 'emdash': 600, - 'endash': 600, - 'equal': 600, - 'eth': 600, - 'exclam': 600, - 'exclamdown': 600, - 'f': 600, - 'fi': 600, - 'five': 600, - 'fl': 600, - 'florin': 600, - 'four': 600, - 'fraction': 600, - 'g': 600, - 'germandbls': 600, - 'grave': 600, - 'greater': 600, - 'guillemotleft': 600, - 'guillemotright': 600, - 'guilsinglleft': 600, - 'guilsinglright': 600, - 'h': 600, - 'hungarumlaut': 600, - 'hyphen': 600, - 'i': 600, - 'iacute': 600, - 'icircumflex': 600, - 'idieresis': 600, - 'igrave': 600, - 'j': 600, - 'k': 600, - 'l': 600, - 'less': 600, - 'logicalnot': 600, - 'lslash': 600, - 'm': 600, - 'macron': 600, - 'minus': 600, - 'mu': 600, - 'multiply': 600, - 'n': 600, - 'nine': 600, - 'ntilde': 600, - 'numbersign': 600, - 'o': 600, - 'oacute': 600, - 'ocircumflex': 600, - 'odieresis': 600, - 'oe': 600, - 'ogonek': 600, - 'ograve': 600, - 'one': 600, - 'onehalf': 600, - 'onequarter': 600, - 'onesuperior': 600, - 'ordfeminine': 600, - 'ordmasculine': 600, - 'oslash': 600, - 'otilde': 600, - 'p': 600, - 'paragraph': 600, - 'parenleft': 600, - 'parenright': 600, - 'percent': 600, - 'period': 600, - 'periodcentered': 600, - 'perthousand': 600, - 'plus': 600, - 'plusminus': 600, - 'q': 600, - 'question': 600, - 'questiondown': 600, - 'quotedbl': 600, - 'quotedblbase': 600, - 'quotedblleft': 600, - 'quotedblright': 600, - 'quoteleft': 600, - 'quoteright': 600, - 'quotesinglbase': 600, - 'quotesingle': 600, - 'r': 600, - 'registered': 600, - 'ring': 600, - 's': 600, - 'scaron': 600, - 'section': 600, - 'semicolon': 600, - 'seven': 600, - 'six': 600, - 'slash': 600, - 'space': 600, - 'sterling': 600, - 't': 600, - 'thorn': 600, - 'three': 600, - 'threequarters': 600, - 'threesuperior': 600, - 'tilde': 600, - 'trademark': 600, - 'two': 600, - 'twosuperior': 600, - 'u': 600, - 'uacute': 600, - 'ucircumflex': 600, - 'udieresis': 600, - 'ugrave': 600, - 'underscore': 600, - 'v': 600, - 'w': 600, - 'x': 600, - 'y': 600, - 'yacute': 600, - 'ydieresis': 600, - 'yen': 600, - 'z': 600, - 'zcaron': 600, - 'zero': 600} diff --git a/reportlab/pdfbase/_fontdata_widths_courierbold.py b/reportlab/pdfbase/_fontdata_widths_courierbold.py deleted file mode 100644 index f196a19a..00000000 --- a/reportlab/pdfbase/_fontdata_widths_courierbold.py +++ /dev/null @@ -1,229 +0,0 @@ -widths = {'A': 600, - 'AE': 600, - 'Aacute': 600, - 'Acircumflex': 600, - 'Adieresis': 600, - 'Agrave': 600, - 'Aring': 600, - 'Atilde': 600, - 'B': 600, - 'C': 600, - 'Ccedilla': 600, - 'D': 600, - 'E': 600, - 'Eacute': 600, - 'Ecircumflex': 600, - 'Edieresis': 600, - 'Egrave': 600, - 'Eth': 600, - 'Euro': 600, - 'F': 600, - 'G': 600, - 'H': 600, - 'I': 600, - 'Iacute': 600, - 'Icircumflex': 600, - 'Idieresis': 600, - 'Igrave': 600, - 'J': 600, - 'K': 600, - 'L': 600, - 'Lslash': 600, - 'M': 600, - 'N': 600, - 'Ntilde': 600, - 'O': 600, - 'OE': 600, - 'Oacute': 600, - 'Ocircumflex': 600, - 'Odieresis': 600, - 'Ograve': 600, - 'Oslash': 600, - 'Otilde': 600, - 'P': 600, - 'Q': 600, - 'R': 600, - 'S': 600, - 'Scaron': 600, - 'T': 600, - 'Thorn': 600, - 'U': 600, - 'Uacute': 600, - 'Ucircumflex': 600, - 'Udieresis': 600, - 'Ugrave': 600, - 'V': 600, - 'W': 600, - 'X': 600, - 'Y': 600, - 'Yacute': 600, - 'Ydieresis': 600, - 'Z': 600, - 'Zcaron': 600, - 'a': 600, - 'aacute': 600, - 'acircumflex': 600, - 'acute': 600, - 'adieresis': 600, - 'ae': 600, - 'agrave': 600, - 'ampersand': 600, - 'aring': 600, - 'asciicircum': 600, - 'asciitilde': 600, - 'asterisk': 600, - 'at': 600, - 'atilde': 600, - 'b': 600, - 'backslash': 600, - 'bar': 600, - 'braceleft': 600, - 'braceright': 600, - 'bracketleft': 600, - 'bracketright': 600, - 'breve': 600, - 'brokenbar': 600, - 'bullet': 600, - 'c': 600, - 'caron': 600, - 'ccedilla': 600, - 'cedilla': 600, - 'cent': 600, - 'circumflex': 600, - 'colon': 600, - 'comma': 600, - 'copyright': 600, - 'currency': 600, - 'd': 600, - 'dagger': 600, - 'daggerdbl': 600, - 'degree': 600, - 'dieresis': 600, - 'divide': 600, - 'dollar': 600, - 'dotaccent': 600, - 'dotlessi': 600, - 'e': 600, - 'eacute': 600, - 'ecircumflex': 600, - 'edieresis': 600, - 'egrave': 600, - 'eight': 600, - 'ellipsis': 600, - 'emdash': 600, - 'endash': 600, - 'equal': 600, - 'eth': 600, - 'exclam': 600, - 'exclamdown': 600, - 'f': 600, - 'fi': 600, - 'five': 600, - 'fl': 600, - 'florin': 600, - 'four': 600, - 'fraction': 600, - 'g': 600, - 'germandbls': 600, - 'grave': 600, - 'greater': 600, - 'guillemotleft': 600, - 'guillemotright': 600, - 'guilsinglleft': 600, - 'guilsinglright': 600, - 'h': 600, - 'hungarumlaut': 600, - 'hyphen': 600, - 'i': 600, - 'iacute': 600, - 'icircumflex': 600, - 'idieresis': 600, - 'igrave': 600, - 'j': 600, - 'k': 600, - 'l': 600, - 'less': 600, - 'logicalnot': 600, - 'lslash': 600, - 'm': 600, - 'macron': 600, - 'minus': 600, - 'mu': 600, - 'multiply': 600, - 'n': 600, - 'nine': 600, - 'ntilde': 600, - 'numbersign': 600, - 'o': 600, - 'oacute': 600, - 'ocircumflex': 600, - 'odieresis': 600, - 'oe': 600, - 'ogonek': 600, - 'ograve': 600, - 'one': 600, - 'onehalf': 600, - 'onequarter': 600, - 'onesuperior': 600, - 'ordfeminine': 600, - 'ordmasculine': 600, - 'oslash': 600, - 'otilde': 600, - 'p': 600, - 'paragraph': 600, - 'parenleft': 600, - 'parenright': 600, - 'percent': 600, - 'period': 600, - 'periodcentered': 600, - 'perthousand': 600, - 'plus': 600, - 'plusminus': 600, - 'q': 600, - 'question': 600, - 'questiondown': 600, - 'quotedbl': 600, - 'quotedblbase': 600, - 'quotedblleft': 600, - 'quotedblright': 600, - 'quoteleft': 600, - 'quoteright': 600, - 'quotesinglbase': 600, - 'quotesingle': 600, - 'r': 600, - 'registered': 600, - 'ring': 600, - 's': 600, - 'scaron': 600, - 'section': 600, - 'semicolon': 600, - 'seven': 600, - 'six': 600, - 'slash': 600, - 'space': 600, - 'sterling': 600, - 't': 600, - 'thorn': 600, - 'three': 600, - 'threequarters': 600, - 'threesuperior': 600, - 'tilde': 600, - 'trademark': 600, - 'two': 600, - 'twosuperior': 600, - 'u': 600, - 'uacute': 600, - 'ucircumflex': 600, - 'udieresis': 600, - 'ugrave': 600, - 'underscore': 600, - 'v': 600, - 'w': 600, - 'x': 600, - 'y': 600, - 'yacute': 600, - 'ydieresis': 600, - 'yen': 600, - 'z': 600, - 'zcaron': 600, - 'zero': 600} diff --git a/reportlab/pdfbase/_fontdata_widths_courierboldoblique.py b/reportlab/pdfbase/_fontdata_widths_courierboldoblique.py deleted file mode 100644 index f196a19a..00000000 --- a/reportlab/pdfbase/_fontdata_widths_courierboldoblique.py +++ /dev/null @@ -1,229 +0,0 @@ -widths = {'A': 600, - 'AE': 600, - 'Aacute': 600, - 'Acircumflex': 600, - 'Adieresis': 600, - 'Agrave': 600, - 'Aring': 600, - 'Atilde': 600, - 'B': 600, - 'C': 600, - 'Ccedilla': 600, - 'D': 600, - 'E': 600, - 'Eacute': 600, - 'Ecircumflex': 600, - 'Edieresis': 600, - 'Egrave': 600, - 'Eth': 600, - 'Euro': 600, - 'F': 600, - 'G': 600, - 'H': 600, - 'I': 600, - 'Iacute': 600, - 'Icircumflex': 600, - 'Idieresis': 600, - 'Igrave': 600, - 'J': 600, - 'K': 600, - 'L': 600, - 'Lslash': 600, - 'M': 600, - 'N': 600, - 'Ntilde': 600, - 'O': 600, - 'OE': 600, - 'Oacute': 600, - 'Ocircumflex': 600, - 'Odieresis': 600, - 'Ograve': 600, - 'Oslash': 600, - 'Otilde': 600, - 'P': 600, - 'Q': 600, - 'R': 600, - 'S': 600, - 'Scaron': 600, - 'T': 600, - 'Thorn': 600, - 'U': 600, - 'Uacute': 600, - 'Ucircumflex': 600, - 'Udieresis': 600, - 'Ugrave': 600, - 'V': 600, - 'W': 600, - 'X': 600, - 'Y': 600, - 'Yacute': 600, - 'Ydieresis': 600, - 'Z': 600, - 'Zcaron': 600, - 'a': 600, - 'aacute': 600, - 'acircumflex': 600, - 'acute': 600, - 'adieresis': 600, - 'ae': 600, - 'agrave': 600, - 'ampersand': 600, - 'aring': 600, - 'asciicircum': 600, - 'asciitilde': 600, - 'asterisk': 600, - 'at': 600, - 'atilde': 600, - 'b': 600, - 'backslash': 600, - 'bar': 600, - 'braceleft': 600, - 'braceright': 600, - 'bracketleft': 600, - 'bracketright': 600, - 'breve': 600, - 'brokenbar': 600, - 'bullet': 600, - 'c': 600, - 'caron': 600, - 'ccedilla': 600, - 'cedilla': 600, - 'cent': 600, - 'circumflex': 600, - 'colon': 600, - 'comma': 600, - 'copyright': 600, - 'currency': 600, - 'd': 600, - 'dagger': 600, - 'daggerdbl': 600, - 'degree': 600, - 'dieresis': 600, - 'divide': 600, - 'dollar': 600, - 'dotaccent': 600, - 'dotlessi': 600, - 'e': 600, - 'eacute': 600, - 'ecircumflex': 600, - 'edieresis': 600, - 'egrave': 600, - 'eight': 600, - 'ellipsis': 600, - 'emdash': 600, - 'endash': 600, - 'equal': 600, - 'eth': 600, - 'exclam': 600, - 'exclamdown': 600, - 'f': 600, - 'fi': 600, - 'five': 600, - 'fl': 600, - 'florin': 600, - 'four': 600, - 'fraction': 600, - 'g': 600, - 'germandbls': 600, - 'grave': 600, - 'greater': 600, - 'guillemotleft': 600, - 'guillemotright': 600, - 'guilsinglleft': 600, - 'guilsinglright': 600, - 'h': 600, - 'hungarumlaut': 600, - 'hyphen': 600, - 'i': 600, - 'iacute': 600, - 'icircumflex': 600, - 'idieresis': 600, - 'igrave': 600, - 'j': 600, - 'k': 600, - 'l': 600, - 'less': 600, - 'logicalnot': 600, - 'lslash': 600, - 'm': 600, - 'macron': 600, - 'minus': 600, - 'mu': 600, - 'multiply': 600, - 'n': 600, - 'nine': 600, - 'ntilde': 600, - 'numbersign': 600, - 'o': 600, - 'oacute': 600, - 'ocircumflex': 600, - 'odieresis': 600, - 'oe': 600, - 'ogonek': 600, - 'ograve': 600, - 'one': 600, - 'onehalf': 600, - 'onequarter': 600, - 'onesuperior': 600, - 'ordfeminine': 600, - 'ordmasculine': 600, - 'oslash': 600, - 'otilde': 600, - 'p': 600, - 'paragraph': 600, - 'parenleft': 600, - 'parenright': 600, - 'percent': 600, - 'period': 600, - 'periodcentered': 600, - 'perthousand': 600, - 'plus': 600, - 'plusminus': 600, - 'q': 600, - 'question': 600, - 'questiondown': 600, - 'quotedbl': 600, - 'quotedblbase': 600, - 'quotedblleft': 600, - 'quotedblright': 600, - 'quoteleft': 600, - 'quoteright': 600, - 'quotesinglbase': 600, - 'quotesingle': 600, - 'r': 600, - 'registered': 600, - 'ring': 600, - 's': 600, - 'scaron': 600, - 'section': 600, - 'semicolon': 600, - 'seven': 600, - 'six': 600, - 'slash': 600, - 'space': 600, - 'sterling': 600, - 't': 600, - 'thorn': 600, - 'three': 600, - 'threequarters': 600, - 'threesuperior': 600, - 'tilde': 600, - 'trademark': 600, - 'two': 600, - 'twosuperior': 600, - 'u': 600, - 'uacute': 600, - 'ucircumflex': 600, - 'udieresis': 600, - 'ugrave': 600, - 'underscore': 600, - 'v': 600, - 'w': 600, - 'x': 600, - 'y': 600, - 'yacute': 600, - 'ydieresis': 600, - 'yen': 600, - 'z': 600, - 'zcaron': 600, - 'zero': 600} diff --git a/reportlab/pdfbase/_fontdata_widths_courieroblique.py b/reportlab/pdfbase/_fontdata_widths_courieroblique.py deleted file mode 100644 index f196a19a..00000000 --- a/reportlab/pdfbase/_fontdata_widths_courieroblique.py +++ /dev/null @@ -1,229 +0,0 @@ -widths = {'A': 600, - 'AE': 600, - 'Aacute': 600, - 'Acircumflex': 600, - 'Adieresis': 600, - 'Agrave': 600, - 'Aring': 600, - 'Atilde': 600, - 'B': 600, - 'C': 600, - 'Ccedilla': 600, - 'D': 600, - 'E': 600, - 'Eacute': 600, - 'Ecircumflex': 600, - 'Edieresis': 600, - 'Egrave': 600, - 'Eth': 600, - 'Euro': 600, - 'F': 600, - 'G': 600, - 'H': 600, - 'I': 600, - 'Iacute': 600, - 'Icircumflex': 600, - 'Idieresis': 600, - 'Igrave': 600, - 'J': 600, - 'K': 600, - 'L': 600, - 'Lslash': 600, - 'M': 600, - 'N': 600, - 'Ntilde': 600, - 'O': 600, - 'OE': 600, - 'Oacute': 600, - 'Ocircumflex': 600, - 'Odieresis': 600, - 'Ograve': 600, - 'Oslash': 600, - 'Otilde': 600, - 'P': 600, - 'Q': 600, - 'R': 600, - 'S': 600, - 'Scaron': 600, - 'T': 600, - 'Thorn': 600, - 'U': 600, - 'Uacute': 600, - 'Ucircumflex': 600, - 'Udieresis': 600, - 'Ugrave': 600, - 'V': 600, - 'W': 600, - 'X': 600, - 'Y': 600, - 'Yacute': 600, - 'Ydieresis': 600, - 'Z': 600, - 'Zcaron': 600, - 'a': 600, - 'aacute': 600, - 'acircumflex': 600, - 'acute': 600, - 'adieresis': 600, - 'ae': 600, - 'agrave': 600, - 'ampersand': 600, - 'aring': 600, - 'asciicircum': 600, - 'asciitilde': 600, - 'asterisk': 600, - 'at': 600, - 'atilde': 600, - 'b': 600, - 'backslash': 600, - 'bar': 600, - 'braceleft': 600, - 'braceright': 600, - 'bracketleft': 600, - 'bracketright': 600, - 'breve': 600, - 'brokenbar': 600, - 'bullet': 600, - 'c': 600, - 'caron': 600, - 'ccedilla': 600, - 'cedilla': 600, - 'cent': 600, - 'circumflex': 600, - 'colon': 600, - 'comma': 600, - 'copyright': 600, - 'currency': 600, - 'd': 600, - 'dagger': 600, - 'daggerdbl': 600, - 'degree': 600, - 'dieresis': 600, - 'divide': 600, - 'dollar': 600, - 'dotaccent': 600, - 'dotlessi': 600, - 'e': 600, - 'eacute': 600, - 'ecircumflex': 600, - 'edieresis': 600, - 'egrave': 600, - 'eight': 600, - 'ellipsis': 600, - 'emdash': 600, - 'endash': 600, - 'equal': 600, - 'eth': 600, - 'exclam': 600, - 'exclamdown': 600, - 'f': 600, - 'fi': 600, - 'five': 600, - 'fl': 600, - 'florin': 600, - 'four': 600, - 'fraction': 600, - 'g': 600, - 'germandbls': 600, - 'grave': 600, - 'greater': 600, - 'guillemotleft': 600, - 'guillemotright': 600, - 'guilsinglleft': 600, - 'guilsinglright': 600, - 'h': 600, - 'hungarumlaut': 600, - 'hyphen': 600, - 'i': 600, - 'iacute': 600, - 'icircumflex': 600, - 'idieresis': 600, - 'igrave': 600, - 'j': 600, - 'k': 600, - 'l': 600, - 'less': 600, - 'logicalnot': 600, - 'lslash': 600, - 'm': 600, - 'macron': 600, - 'minus': 600, - 'mu': 600, - 'multiply': 600, - 'n': 600, - 'nine': 600, - 'ntilde': 600, - 'numbersign': 600, - 'o': 600, - 'oacute': 600, - 'ocircumflex': 600, - 'odieresis': 600, - 'oe': 600, - 'ogonek': 600, - 'ograve': 600, - 'one': 600, - 'onehalf': 600, - 'onequarter': 600, - 'onesuperior': 600, - 'ordfeminine': 600, - 'ordmasculine': 600, - 'oslash': 600, - 'otilde': 600, - 'p': 600, - 'paragraph': 600, - 'parenleft': 600, - 'parenright': 600, - 'percent': 600, - 'period': 600, - 'periodcentered': 600, - 'perthousand': 600, - 'plus': 600, - 'plusminus': 600, - 'q': 600, - 'question': 600, - 'questiondown': 600, - 'quotedbl': 600, - 'quotedblbase': 600, - 'quotedblleft': 600, - 'quotedblright': 600, - 'quoteleft': 600, - 'quoteright': 600, - 'quotesinglbase': 600, - 'quotesingle': 600, - 'r': 600, - 'registered': 600, - 'ring': 600, - 's': 600, - 'scaron': 600, - 'section': 600, - 'semicolon': 600, - 'seven': 600, - 'six': 600, - 'slash': 600, - 'space': 600, - 'sterling': 600, - 't': 600, - 'thorn': 600, - 'three': 600, - 'threequarters': 600, - 'threesuperior': 600, - 'tilde': 600, - 'trademark': 600, - 'two': 600, - 'twosuperior': 600, - 'u': 600, - 'uacute': 600, - 'ucircumflex': 600, - 'udieresis': 600, - 'ugrave': 600, - 'underscore': 600, - 'v': 600, - 'w': 600, - 'x': 600, - 'y': 600, - 'yacute': 600, - 'ydieresis': 600, - 'yen': 600, - 'z': 600, - 'zcaron': 600, - 'zero': 600} diff --git a/reportlab/pdfbase/_fontdata_widths_helvetica.py b/reportlab/pdfbase/_fontdata_widths_helvetica.py deleted file mode 100644 index 10d74db2..00000000 --- a/reportlab/pdfbase/_fontdata_widths_helvetica.py +++ /dev/null @@ -1,229 +0,0 @@ -widths = {'A': 667, - 'AE': 1000, - 'Aacute': 667, - 'Acircumflex': 667, - 'Adieresis': 667, - 'Agrave': 667, - 'Aring': 667, - 'Atilde': 667, - 'B': 667, - 'C': 722, - 'Ccedilla': 722, - 'D': 722, - 'E': 667, - 'Eacute': 667, - 'Ecircumflex': 667, - 'Edieresis': 667, - 'Egrave': 667, - 'Eth': 722, - 'Euro': 556, - 'F': 611, - 'G': 778, - 'H': 722, - 'I': 278, - 'Iacute': 278, - 'Icircumflex': 278, - 'Idieresis': 278, - 'Igrave': 278, - 'J': 500, - 'K': 667, - 'L': 556, - 'Lslash': 556, - 'M': 833, - 'N': 722, - 'Ntilde': 722, - 'O': 778, - 'OE': 1000, - 'Oacute': 778, - 'Ocircumflex': 778, - 'Odieresis': 778, - 'Ograve': 778, - 'Oslash': 778, - 'Otilde': 778, - 'P': 667, - 'Q': 778, - 'R': 722, - 'S': 667, - 'Scaron': 667, - 'T': 611, - 'Thorn': 667, - 'U': 722, - 'Uacute': 722, - 'Ucircumflex': 722, - 'Udieresis': 722, - 'Ugrave': 722, - 'V': 667, - 'W': 944, - 'X': 667, - 'Y': 667, - 'Yacute': 667, - 'Ydieresis': 667, - 'Z': 611, - 'Zcaron': 611, - 'a': 556, - 'aacute': 556, - 'acircumflex': 556, - 'acute': 333, - 'adieresis': 556, - 'ae': 889, - 'agrave': 556, - 'ampersand': 667, - 'aring': 556, - 'asciicircum': 469, - 'asciitilde': 584, - 'asterisk': 389, - 'at': 1015, - 'atilde': 556, - 'b': 556, - 'backslash': 278, - 'bar': 260, - 'braceleft': 334, - 'braceright': 334, - 'bracketleft': 278, - 'bracketright': 278, - 'breve': 333, - 'brokenbar': 260, - 'bullet': 350, - 'c': 500, - 'caron': 333, - 'ccedilla': 500, - 'cedilla': 333, - 'cent': 556, - 'circumflex': 333, - 'colon': 278, - 'comma': 278, - 'copyright': 737, - 'currency': 556, - 'd': 556, - 'dagger': 556, - 'daggerdbl': 556, - 'degree': 400, - 'dieresis': 333, - 'divide': 584, - 'dollar': 556, - 'dotaccent': 333, - 'dotlessi': 278, - 'e': 556, - 'eacute': 556, - 'ecircumflex': 556, - 'edieresis': 556, - 'egrave': 556, - 'eight': 556, - 'ellipsis': 1000, - 'emdash': 1000, - 'endash': 556, - 'equal': 584, - 'eth': 556, - 'exclam': 278, - 'exclamdown': 333, - 'f': 278, - 'fi': 500, - 'five': 556, - 'fl': 500, - 'florin': 556, - 'four': 556, - 'fraction': 167, - 'g': 556, - 'germandbls': 611, - 'grave': 333, - 'greater': 584, - 'guillemotleft': 556, - 'guillemotright': 556, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'h': 556, - 'hungarumlaut': 333, - 'hyphen': 333, - 'i': 222, - 'iacute': 278, - 'icircumflex': 278, - 'idieresis': 278, - 'igrave': 278, - 'j': 222, - 'k': 500, - 'l': 222, - 'less': 584, - 'logicalnot': 584, - 'lslash': 222, - 'm': 833, - 'macron': 333, - 'minus': 584, - 'mu': 556, - 'multiply': 584, - 'n': 556, - 'nine': 556, - 'ntilde': 556, - 'numbersign': 556, - 'o': 556, - 'oacute': 556, - 'ocircumflex': 556, - 'odieresis': 556, - 'oe': 944, - 'ogonek': 333, - 'ograve': 556, - 'one': 556, - 'onehalf': 834, - 'onequarter': 834, - 'onesuperior': 333, - 'ordfeminine': 370, - 'ordmasculine': 365, - 'oslash': 611, - 'otilde': 556, - 'p': 556, - 'paragraph': 537, - 'parenleft': 333, - 'parenright': 333, - 'percent': 889, - 'period': 278, - 'periodcentered': 278, - 'perthousand': 1000, - 'plus': 584, - 'plusminus': 584, - 'q': 556, - 'question': 556, - 'questiondown': 611, - 'quotedbl': 355, - 'quotedblbase': 333, - 'quotedblleft': 333, - 'quotedblright': 333, - 'quoteleft': 222, - 'quoteright': 222, - 'quotesinglbase': 222, - 'quotesingle': 191, - 'r': 333, - 'registered': 737, - 'ring': 333, - 's': 500, - 'scaron': 500, - 'section': 556, - 'semicolon': 278, - 'seven': 556, - 'six': 556, - 'slash': 278, - 'space': 278, - 'sterling': 556, - 't': 278, - 'thorn': 556, - 'three': 556, - 'threequarters': 834, - 'threesuperior': 333, - 'tilde': 333, - 'trademark': 1000, - 'two': 556, - 'twosuperior': 333, - 'u': 556, - 'uacute': 556, - 'ucircumflex': 556, - 'udieresis': 556, - 'ugrave': 556, - 'underscore': 556, - 'v': 500, - 'w': 722, - 'x': 500, - 'y': 500, - 'yacute': 500, - 'ydieresis': 500, - 'yen': 556, - 'z': 500, - 'zcaron': 500, - 'zero': 556} diff --git a/reportlab/pdfbase/_fontdata_widths_helveticabold.py b/reportlab/pdfbase/_fontdata_widths_helveticabold.py deleted file mode 100644 index 7b9acd2c..00000000 --- a/reportlab/pdfbase/_fontdata_widths_helveticabold.py +++ /dev/null @@ -1,229 +0,0 @@ -widths = {'A': 722, - 'AE': 1000, - 'Aacute': 722, - 'Acircumflex': 722, - 'Adieresis': 722, - 'Agrave': 722, - 'Aring': 722, - 'Atilde': 722, - 'B': 722, - 'C': 722, - 'Ccedilla': 722, - 'D': 722, - 'E': 667, - 'Eacute': 667, - 'Ecircumflex': 667, - 'Edieresis': 667, - 'Egrave': 667, - 'Eth': 722, - 'Euro': 556, - 'F': 611, - 'G': 778, - 'H': 722, - 'I': 278, - 'Iacute': 278, - 'Icircumflex': 278, - 'Idieresis': 278, - 'Igrave': 278, - 'J': 556, - 'K': 722, - 'L': 611, - 'Lslash': 611, - 'M': 833, - 'N': 722, - 'Ntilde': 722, - 'O': 778, - 'OE': 1000, - 'Oacute': 778, - 'Ocircumflex': 778, - 'Odieresis': 778, - 'Ograve': 778, - 'Oslash': 778, - 'Otilde': 778, - 'P': 667, - 'Q': 778, - 'R': 722, - 'S': 667, - 'Scaron': 667, - 'T': 611, - 'Thorn': 667, - 'U': 722, - 'Uacute': 722, - 'Ucircumflex': 722, - 'Udieresis': 722, - 'Ugrave': 722, - 'V': 667, - 'W': 944, - 'X': 667, - 'Y': 667, - 'Yacute': 667, - 'Ydieresis': 667, - 'Z': 611, - 'Zcaron': 611, - 'a': 556, - 'aacute': 556, - 'acircumflex': 556, - 'acute': 333, - 'adieresis': 556, - 'ae': 889, - 'agrave': 556, - 'ampersand': 722, - 'aring': 556, - 'asciicircum': 584, - 'asciitilde': 584, - 'asterisk': 389, - 'at': 975, - 'atilde': 556, - 'b': 611, - 'backslash': 278, - 'bar': 280, - 'braceleft': 389, - 'braceright': 389, - 'bracketleft': 333, - 'bracketright': 333, - 'breve': 333, - 'brokenbar': 280, - 'bullet': 350, - 'c': 556, - 'caron': 333, - 'ccedilla': 556, - 'cedilla': 333, - 'cent': 556, - 'circumflex': 333, - 'colon': 333, - 'comma': 278, - 'copyright': 737, - 'currency': 556, - 'd': 611, - 'dagger': 556, - 'daggerdbl': 556, - 'degree': 400, - 'dieresis': 333, - 'divide': 584, - 'dollar': 556, - 'dotaccent': 333, - 'dotlessi': 278, - 'e': 556, - 'eacute': 556, - 'ecircumflex': 556, - 'edieresis': 556, - 'egrave': 556, - 'eight': 556, - 'ellipsis': 1000, - 'emdash': 1000, - 'endash': 556, - 'equal': 584, - 'eth': 611, - 'exclam': 333, - 'exclamdown': 333, - 'f': 333, - 'fi': 611, - 'five': 556, - 'fl': 611, - 'florin': 556, - 'four': 556, - 'fraction': 167, - 'g': 611, - 'germandbls': 611, - 'grave': 333, - 'greater': 584, - 'guillemotleft': 556, - 'guillemotright': 556, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'h': 611, - 'hungarumlaut': 333, - 'hyphen': 333, - 'i': 278, - 'iacute': 278, - 'icircumflex': 278, - 'idieresis': 278, - 'igrave': 278, - 'j': 278, - 'k': 556, - 'l': 278, - 'less': 584, - 'logicalnot': 584, - 'lslash': 278, - 'm': 889, - 'macron': 333, - 'minus': 584, - 'mu': 611, - 'multiply': 584, - 'n': 611, - 'nine': 556, - 'ntilde': 611, - 'numbersign': 556, - 'o': 611, - 'oacute': 611, - 'ocircumflex': 611, - 'odieresis': 611, - 'oe': 944, - 'ogonek': 333, - 'ograve': 611, - 'one': 556, - 'onehalf': 834, - 'onequarter': 834, - 'onesuperior': 333, - 'ordfeminine': 370, - 'ordmasculine': 365, - 'oslash': 611, - 'otilde': 611, - 'p': 611, - 'paragraph': 556, - 'parenleft': 333, - 'parenright': 333, - 'percent': 889, - 'period': 278, - 'periodcentered': 278, - 'perthousand': 1000, - 'plus': 584, - 'plusminus': 584, - 'q': 611, - 'question': 611, - 'questiondown': 611, - 'quotedbl': 474, - 'quotedblbase': 500, - 'quotedblleft': 500, - 'quotedblright': 500, - 'quoteleft': 278, - 'quoteright': 278, - 'quotesinglbase': 278, - 'quotesingle': 238, - 'r': 389, - 'registered': 737, - 'ring': 333, - 's': 556, - 'scaron': 556, - 'section': 556, - 'semicolon': 333, - 'seven': 556, - 'six': 556, - 'slash': 278, - 'space': 278, - 'sterling': 556, - 't': 333, - 'thorn': 611, - 'three': 556, - 'threequarters': 834, - 'threesuperior': 333, - 'tilde': 333, - 'trademark': 1000, - 'two': 556, - 'twosuperior': 333, - 'u': 611, - 'uacute': 611, - 'ucircumflex': 611, - 'udieresis': 611, - 'ugrave': 611, - 'underscore': 556, - 'v': 556, - 'w': 778, - 'x': 556, - 'y': 556, - 'yacute': 556, - 'ydieresis': 556, - 'yen': 556, - 'z': 500, - 'zcaron': 500, - 'zero': 556} diff --git a/reportlab/pdfbase/_fontdata_widths_helveticaboldoblique.py b/reportlab/pdfbase/_fontdata_widths_helveticaboldoblique.py deleted file mode 100644 index 7b9acd2c..00000000 --- a/reportlab/pdfbase/_fontdata_widths_helveticaboldoblique.py +++ /dev/null @@ -1,229 +0,0 @@ -widths = {'A': 722, - 'AE': 1000, - 'Aacute': 722, - 'Acircumflex': 722, - 'Adieresis': 722, - 'Agrave': 722, - 'Aring': 722, - 'Atilde': 722, - 'B': 722, - 'C': 722, - 'Ccedilla': 722, - 'D': 722, - 'E': 667, - 'Eacute': 667, - 'Ecircumflex': 667, - 'Edieresis': 667, - 'Egrave': 667, - 'Eth': 722, - 'Euro': 556, - 'F': 611, - 'G': 778, - 'H': 722, - 'I': 278, - 'Iacute': 278, - 'Icircumflex': 278, - 'Idieresis': 278, - 'Igrave': 278, - 'J': 556, - 'K': 722, - 'L': 611, - 'Lslash': 611, - 'M': 833, - 'N': 722, - 'Ntilde': 722, - 'O': 778, - 'OE': 1000, - 'Oacute': 778, - 'Ocircumflex': 778, - 'Odieresis': 778, - 'Ograve': 778, - 'Oslash': 778, - 'Otilde': 778, - 'P': 667, - 'Q': 778, - 'R': 722, - 'S': 667, - 'Scaron': 667, - 'T': 611, - 'Thorn': 667, - 'U': 722, - 'Uacute': 722, - 'Ucircumflex': 722, - 'Udieresis': 722, - 'Ugrave': 722, - 'V': 667, - 'W': 944, - 'X': 667, - 'Y': 667, - 'Yacute': 667, - 'Ydieresis': 667, - 'Z': 611, - 'Zcaron': 611, - 'a': 556, - 'aacute': 556, - 'acircumflex': 556, - 'acute': 333, - 'adieresis': 556, - 'ae': 889, - 'agrave': 556, - 'ampersand': 722, - 'aring': 556, - 'asciicircum': 584, - 'asciitilde': 584, - 'asterisk': 389, - 'at': 975, - 'atilde': 556, - 'b': 611, - 'backslash': 278, - 'bar': 280, - 'braceleft': 389, - 'braceright': 389, - 'bracketleft': 333, - 'bracketright': 333, - 'breve': 333, - 'brokenbar': 280, - 'bullet': 350, - 'c': 556, - 'caron': 333, - 'ccedilla': 556, - 'cedilla': 333, - 'cent': 556, - 'circumflex': 333, - 'colon': 333, - 'comma': 278, - 'copyright': 737, - 'currency': 556, - 'd': 611, - 'dagger': 556, - 'daggerdbl': 556, - 'degree': 400, - 'dieresis': 333, - 'divide': 584, - 'dollar': 556, - 'dotaccent': 333, - 'dotlessi': 278, - 'e': 556, - 'eacute': 556, - 'ecircumflex': 556, - 'edieresis': 556, - 'egrave': 556, - 'eight': 556, - 'ellipsis': 1000, - 'emdash': 1000, - 'endash': 556, - 'equal': 584, - 'eth': 611, - 'exclam': 333, - 'exclamdown': 333, - 'f': 333, - 'fi': 611, - 'five': 556, - 'fl': 611, - 'florin': 556, - 'four': 556, - 'fraction': 167, - 'g': 611, - 'germandbls': 611, - 'grave': 333, - 'greater': 584, - 'guillemotleft': 556, - 'guillemotright': 556, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'h': 611, - 'hungarumlaut': 333, - 'hyphen': 333, - 'i': 278, - 'iacute': 278, - 'icircumflex': 278, - 'idieresis': 278, - 'igrave': 278, - 'j': 278, - 'k': 556, - 'l': 278, - 'less': 584, - 'logicalnot': 584, - 'lslash': 278, - 'm': 889, - 'macron': 333, - 'minus': 584, - 'mu': 611, - 'multiply': 584, - 'n': 611, - 'nine': 556, - 'ntilde': 611, - 'numbersign': 556, - 'o': 611, - 'oacute': 611, - 'ocircumflex': 611, - 'odieresis': 611, - 'oe': 944, - 'ogonek': 333, - 'ograve': 611, - 'one': 556, - 'onehalf': 834, - 'onequarter': 834, - 'onesuperior': 333, - 'ordfeminine': 370, - 'ordmasculine': 365, - 'oslash': 611, - 'otilde': 611, - 'p': 611, - 'paragraph': 556, - 'parenleft': 333, - 'parenright': 333, - 'percent': 889, - 'period': 278, - 'periodcentered': 278, - 'perthousand': 1000, - 'plus': 584, - 'plusminus': 584, - 'q': 611, - 'question': 611, - 'questiondown': 611, - 'quotedbl': 474, - 'quotedblbase': 500, - 'quotedblleft': 500, - 'quotedblright': 500, - 'quoteleft': 278, - 'quoteright': 278, - 'quotesinglbase': 278, - 'quotesingle': 238, - 'r': 389, - 'registered': 737, - 'ring': 333, - 's': 556, - 'scaron': 556, - 'section': 556, - 'semicolon': 333, - 'seven': 556, - 'six': 556, - 'slash': 278, - 'space': 278, - 'sterling': 556, - 't': 333, - 'thorn': 611, - 'three': 556, - 'threequarters': 834, - 'threesuperior': 333, - 'tilde': 333, - 'trademark': 1000, - 'two': 556, - 'twosuperior': 333, - 'u': 611, - 'uacute': 611, - 'ucircumflex': 611, - 'udieresis': 611, - 'ugrave': 611, - 'underscore': 556, - 'v': 556, - 'w': 778, - 'x': 556, - 'y': 556, - 'yacute': 556, - 'ydieresis': 556, - 'yen': 556, - 'z': 500, - 'zcaron': 500, - 'zero': 556} diff --git a/reportlab/pdfbase/_fontdata_widths_helveticaoblique.py b/reportlab/pdfbase/_fontdata_widths_helveticaoblique.py deleted file mode 100644 index 10d74db2..00000000 --- a/reportlab/pdfbase/_fontdata_widths_helveticaoblique.py +++ /dev/null @@ -1,229 +0,0 @@ -widths = {'A': 667, - 'AE': 1000, - 'Aacute': 667, - 'Acircumflex': 667, - 'Adieresis': 667, - 'Agrave': 667, - 'Aring': 667, - 'Atilde': 667, - 'B': 667, - 'C': 722, - 'Ccedilla': 722, - 'D': 722, - 'E': 667, - 'Eacute': 667, - 'Ecircumflex': 667, - 'Edieresis': 667, - 'Egrave': 667, - 'Eth': 722, - 'Euro': 556, - 'F': 611, - 'G': 778, - 'H': 722, - 'I': 278, - 'Iacute': 278, - 'Icircumflex': 278, - 'Idieresis': 278, - 'Igrave': 278, - 'J': 500, - 'K': 667, - 'L': 556, - 'Lslash': 556, - 'M': 833, - 'N': 722, - 'Ntilde': 722, - 'O': 778, - 'OE': 1000, - 'Oacute': 778, - 'Ocircumflex': 778, - 'Odieresis': 778, - 'Ograve': 778, - 'Oslash': 778, - 'Otilde': 778, - 'P': 667, - 'Q': 778, - 'R': 722, - 'S': 667, - 'Scaron': 667, - 'T': 611, - 'Thorn': 667, - 'U': 722, - 'Uacute': 722, - 'Ucircumflex': 722, - 'Udieresis': 722, - 'Ugrave': 722, - 'V': 667, - 'W': 944, - 'X': 667, - 'Y': 667, - 'Yacute': 667, - 'Ydieresis': 667, - 'Z': 611, - 'Zcaron': 611, - 'a': 556, - 'aacute': 556, - 'acircumflex': 556, - 'acute': 333, - 'adieresis': 556, - 'ae': 889, - 'agrave': 556, - 'ampersand': 667, - 'aring': 556, - 'asciicircum': 469, - 'asciitilde': 584, - 'asterisk': 389, - 'at': 1015, - 'atilde': 556, - 'b': 556, - 'backslash': 278, - 'bar': 260, - 'braceleft': 334, - 'braceright': 334, - 'bracketleft': 278, - 'bracketright': 278, - 'breve': 333, - 'brokenbar': 260, - 'bullet': 350, - 'c': 500, - 'caron': 333, - 'ccedilla': 500, - 'cedilla': 333, - 'cent': 556, - 'circumflex': 333, - 'colon': 278, - 'comma': 278, - 'copyright': 737, - 'currency': 556, - 'd': 556, - 'dagger': 556, - 'daggerdbl': 556, - 'degree': 400, - 'dieresis': 333, - 'divide': 584, - 'dollar': 556, - 'dotaccent': 333, - 'dotlessi': 278, - 'e': 556, - 'eacute': 556, - 'ecircumflex': 556, - 'edieresis': 556, - 'egrave': 556, - 'eight': 556, - 'ellipsis': 1000, - 'emdash': 1000, - 'endash': 556, - 'equal': 584, - 'eth': 556, - 'exclam': 278, - 'exclamdown': 333, - 'f': 278, - 'fi': 500, - 'five': 556, - 'fl': 500, - 'florin': 556, - 'four': 556, - 'fraction': 167, - 'g': 556, - 'germandbls': 611, - 'grave': 333, - 'greater': 584, - 'guillemotleft': 556, - 'guillemotright': 556, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'h': 556, - 'hungarumlaut': 333, - 'hyphen': 333, - 'i': 222, - 'iacute': 278, - 'icircumflex': 278, - 'idieresis': 278, - 'igrave': 278, - 'j': 222, - 'k': 500, - 'l': 222, - 'less': 584, - 'logicalnot': 584, - 'lslash': 222, - 'm': 833, - 'macron': 333, - 'minus': 584, - 'mu': 556, - 'multiply': 584, - 'n': 556, - 'nine': 556, - 'ntilde': 556, - 'numbersign': 556, - 'o': 556, - 'oacute': 556, - 'ocircumflex': 556, - 'odieresis': 556, - 'oe': 944, - 'ogonek': 333, - 'ograve': 556, - 'one': 556, - 'onehalf': 834, - 'onequarter': 834, - 'onesuperior': 333, - 'ordfeminine': 370, - 'ordmasculine': 365, - 'oslash': 611, - 'otilde': 556, - 'p': 556, - 'paragraph': 537, - 'parenleft': 333, - 'parenright': 333, - 'percent': 889, - 'period': 278, - 'periodcentered': 278, - 'perthousand': 1000, - 'plus': 584, - 'plusminus': 584, - 'q': 556, - 'question': 556, - 'questiondown': 611, - 'quotedbl': 355, - 'quotedblbase': 333, - 'quotedblleft': 333, - 'quotedblright': 333, - 'quoteleft': 222, - 'quoteright': 222, - 'quotesinglbase': 222, - 'quotesingle': 191, - 'r': 333, - 'registered': 737, - 'ring': 333, - 's': 500, - 'scaron': 500, - 'section': 556, - 'semicolon': 278, - 'seven': 556, - 'six': 556, - 'slash': 278, - 'space': 278, - 'sterling': 556, - 't': 278, - 'thorn': 556, - 'three': 556, - 'threequarters': 834, - 'threesuperior': 333, - 'tilde': 333, - 'trademark': 1000, - 'two': 556, - 'twosuperior': 333, - 'u': 556, - 'uacute': 556, - 'ucircumflex': 556, - 'udieresis': 556, - 'ugrave': 556, - 'underscore': 556, - 'v': 500, - 'w': 722, - 'x': 500, - 'y': 500, - 'yacute': 500, - 'ydieresis': 500, - 'yen': 556, - 'z': 500, - 'zcaron': 500, - 'zero': 556} diff --git a/reportlab/pdfbase/_fontdata_widths_symbol.py b/reportlab/pdfbase/_fontdata_widths_symbol.py deleted file mode 100644 index a18f2f69..00000000 --- a/reportlab/pdfbase/_fontdata_widths_symbol.py +++ /dev/null @@ -1,190 +0,0 @@ -widths = {'Alpha': 722, - 'Beta': 667, - 'Chi': 722, - 'Delta': 612, - 'Epsilon': 611, - 'Eta': 722, - 'Euro': 750, - 'Gamma': 603, - 'Ifraktur': 686, - 'Iota': 333, - 'Kappa': 722, - 'Lambda': 686, - 'Mu': 889, - 'Nu': 722, - 'Omega': 768, - 'Omicron': 722, - 'Phi': 763, - 'Pi': 768, - 'Psi': 795, - 'Rfraktur': 795, - 'Rho': 556, - 'Sigma': 592, - 'Tau': 611, - 'Theta': 741, - 'Upsilon': 690, - 'Upsilon1': 620, - 'Xi': 645, - 'Zeta': 611, - 'aleph': 823, - 'alpha': 631, - 'ampersand': 778, - 'angle': 768, - 'angleleft': 329, - 'angleright': 329, - 'apple': 790, - 'approxequal': 549, - 'arrowboth': 1042, - 'arrowdblboth': 1042, - 'arrowdbldown': 603, - 'arrowdblleft': 987, - 'arrowdblright': 987, - 'arrowdblup': 603, - 'arrowdown': 603, - 'arrowhorizex': 1000, - 'arrowleft': 987, - 'arrowright': 987, - 'arrowup': 603, - 'arrowvertex': 603, - 'asteriskmath': 500, - 'bar': 200, - 'beta': 549, - 'braceex': 494, - 'braceleft': 480, - 'braceleftbt': 494, - 'braceleftmid': 494, - 'bracelefttp': 494, - 'braceright': 480, - 'bracerightbt': 494, - 'bracerightmid': 494, - 'bracerighttp': 494, - 'bracketleft': 333, - 'bracketleftbt': 384, - 'bracketleftex': 384, - 'bracketlefttp': 384, - 'bracketright': 333, - 'bracketrightbt': 384, - 'bracketrightex': 384, - 'bracketrighttp': 384, - 'bullet': 460, - 'carriagereturn': 658, - 'chi': 549, - 'circlemultiply': 768, - 'circleplus': 768, - 'club': 753, - 'colon': 278, - 'comma': 250, - 'congruent': 549, - 'copyrightsans': 790, - 'copyrightserif': 790, - 'degree': 400, - 'delta': 494, - 'diamond': 753, - 'divide': 549, - 'dotmath': 250, - 'eight': 500, - 'element': 713, - 'ellipsis': 1000, - 'emptyset': 823, - 'epsilon': 439, - 'equal': 549, - 'equivalence': 549, - 'eta': 603, - 'exclam': 333, - 'existential': 549, - 'five': 500, - 'florin': 500, - 'four': 500, - 'fraction': 167, - 'gamma': 411, - 'gradient': 713, - 'greater': 549, - 'greaterequal': 549, - 'heart': 753, - 'infinity': 713, - 'integral': 274, - 'integralbt': 686, - 'integralex': 686, - 'integraltp': 686, - 'intersection': 768, - 'iota': 329, - 'kappa': 549, - 'lambda': 549, - 'less': 549, - 'lessequal': 549, - 'logicaland': 603, - 'logicalnot': 713, - 'logicalor': 603, - 'lozenge': 494, - 'minus': 549, - 'minute': 247, - 'mu': 576, - 'multiply': 549, - 'nine': 500, - 'notelement': 713, - 'notequal': 549, - 'notsubset': 713, - 'nu': 521, - 'numbersign': 500, - 'omega': 686, - 'omega1': 713, - 'omicron': 549, - 'one': 500, - 'parenleft': 333, - 'parenleftbt': 384, - 'parenleftex': 384, - 'parenlefttp': 384, - 'parenright': 333, - 'parenrightbt': 384, - 'parenrightex': 384, - 'parenrighttp': 384, - 'partialdiff': 494, - 'percent': 833, - 'period': 250, - 'perpendicular': 658, - 'phi': 521, - 'phi1': 603, - 'pi': 549, - 'plus': 549, - 'plusminus': 549, - 'product': 823, - 'propersubset': 713, - 'propersuperset': 713, - 'proportional': 713, - 'psi': 686, - 'question': 444, - 'radical': 549, - 'radicalex': 500, - 'reflexsubset': 713, - 'reflexsuperset': 713, - 'registersans': 790, - 'registerserif': 790, - 'rho': 549, - 'second': 411, - 'semicolon': 278, - 'seven': 500, - 'sigma': 603, - 'sigma1': 439, - 'similar': 549, - 'six': 500, - 'slash': 278, - 'space': 250, - 'spade': 753, - 'suchthat': 439, - 'summation': 713, - 'tau': 439, - 'therefore': 863, - 'theta': 521, - 'theta1': 631, - 'three': 500, - 'trademarksans': 786, - 'trademarkserif': 890, - 'two': 500, - 'underscore': 500, - 'union': 768, - 'universal': 713, - 'upsilon': 576, - 'weierstrass': 987, - 'xi': 493, - 'zero': 500, - 'zeta': 494} diff --git a/reportlab/pdfbase/_fontdata_widths_timesbold.py b/reportlab/pdfbase/_fontdata_widths_timesbold.py deleted file mode 100644 index 97adc79a..00000000 --- a/reportlab/pdfbase/_fontdata_widths_timesbold.py +++ /dev/null @@ -1,229 +0,0 @@ -widths = {'A': 722, - 'AE': 1000, - 'Aacute': 722, - 'Acircumflex': 722, - 'Adieresis': 722, - 'Agrave': 722, - 'Aring': 722, - 'Atilde': 722, - 'B': 667, - 'C': 722, - 'Ccedilla': 722, - 'D': 722, - 'E': 667, - 'Eacute': 667, - 'Ecircumflex': 667, - 'Edieresis': 667, - 'Egrave': 667, - 'Eth': 722, - 'Euro': 500, - 'F': 611, - 'G': 778, - 'H': 778, - 'I': 389, - 'Iacute': 389, - 'Icircumflex': 389, - 'Idieresis': 389, - 'Igrave': 389, - 'J': 500, - 'K': 778, - 'L': 667, - 'Lslash': 667, - 'M': 944, - 'N': 722, - 'Ntilde': 722, - 'O': 778, - 'OE': 1000, - 'Oacute': 778, - 'Ocircumflex': 778, - 'Odieresis': 778, - 'Ograve': 778, - 'Oslash': 778, - 'Otilde': 778, - 'P': 611, - 'Q': 778, - 'R': 722, - 'S': 556, - 'Scaron': 556, - 'T': 667, - 'Thorn': 611, - 'U': 722, - 'Uacute': 722, - 'Ucircumflex': 722, - 'Udieresis': 722, - 'Ugrave': 722, - 'V': 722, - 'W': 1000, - 'X': 722, - 'Y': 722, - 'Yacute': 722, - 'Ydieresis': 722, - 'Z': 667, - 'Zcaron': 667, - 'a': 500, - 'aacute': 500, - 'acircumflex': 500, - 'acute': 333, - 'adieresis': 500, - 'ae': 722, - 'agrave': 500, - 'ampersand': 833, - 'aring': 500, - 'asciicircum': 581, - 'asciitilde': 520, - 'asterisk': 500, - 'at': 930, - 'atilde': 500, - 'b': 556, - 'backslash': 278, - 'bar': 220, - 'braceleft': 394, - 'braceright': 394, - 'bracketleft': 333, - 'bracketright': 333, - 'breve': 333, - 'brokenbar': 220, - 'bullet': 350, - 'c': 444, - 'caron': 333, - 'ccedilla': 444, - 'cedilla': 333, - 'cent': 500, - 'circumflex': 333, - 'colon': 333, - 'comma': 250, - 'copyright': 747, - 'currency': 500, - 'd': 556, - 'dagger': 500, - 'daggerdbl': 500, - 'degree': 400, - 'dieresis': 333, - 'divide': 570, - 'dollar': 500, - 'dotaccent': 333, - 'dotlessi': 278, - 'e': 444, - 'eacute': 444, - 'ecircumflex': 444, - 'edieresis': 444, - 'egrave': 444, - 'eight': 500, - 'ellipsis': 1000, - 'emdash': 1000, - 'endash': 500, - 'equal': 570, - 'eth': 500, - 'exclam': 333, - 'exclamdown': 333, - 'f': 333, - 'fi': 556, - 'five': 500, - 'fl': 556, - 'florin': 500, - 'four': 500, - 'fraction': 167, - 'g': 500, - 'germandbls': 556, - 'grave': 333, - 'greater': 570, - 'guillemotleft': 500, - 'guillemotright': 500, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'h': 556, - 'hungarumlaut': 333, - 'hyphen': 333, - 'i': 278, - 'iacute': 278, - 'icircumflex': 278, - 'idieresis': 278, - 'igrave': 278, - 'j': 333, - 'k': 556, - 'l': 278, - 'less': 570, - 'logicalnot': 570, - 'lslash': 278, - 'm': 833, - 'macron': 333, - 'minus': 570, - 'mu': 556, - 'multiply': 570, - 'n': 556, - 'nine': 500, - 'ntilde': 556, - 'numbersign': 500, - 'o': 500, - 'oacute': 500, - 'ocircumflex': 500, - 'odieresis': 500, - 'oe': 722, - 'ogonek': 333, - 'ograve': 500, - 'one': 500, - 'onehalf': 750, - 'onequarter': 750, - 'onesuperior': 300, - 'ordfeminine': 300, - 'ordmasculine': 330, - 'oslash': 500, - 'otilde': 500, - 'p': 556, - 'paragraph': 540, - 'parenleft': 333, - 'parenright': 333, - 'percent': 1000, - 'period': 250, - 'periodcentered': 250, - 'perthousand': 1000, - 'plus': 570, - 'plusminus': 570, - 'q': 556, - 'question': 500, - 'questiondown': 500, - 'quotedbl': 555, - 'quotedblbase': 500, - 'quotedblleft': 500, - 'quotedblright': 500, - 'quoteleft': 333, - 'quoteright': 333, - 'quotesinglbase': 333, - 'quotesingle': 278, - 'r': 444, - 'registered': 747, - 'ring': 333, - 's': 389, - 'scaron': 389, - 'section': 500, - 'semicolon': 333, - 'seven': 500, - 'six': 500, - 'slash': 278, - 'space': 250, - 'sterling': 500, - 't': 333, - 'thorn': 556, - 'three': 500, - 'threequarters': 750, - 'threesuperior': 300, - 'tilde': 333, - 'trademark': 1000, - 'two': 500, - 'twosuperior': 300, - 'u': 556, - 'uacute': 556, - 'ucircumflex': 556, - 'udieresis': 556, - 'ugrave': 556, - 'underscore': 500, - 'v': 500, - 'w': 722, - 'x': 500, - 'y': 500, - 'yacute': 500, - 'ydieresis': 500, - 'yen': 500, - 'z': 444, - 'zcaron': 444, - 'zero': 500} diff --git a/reportlab/pdfbase/_fontdata_widths_timesbolditalic.py b/reportlab/pdfbase/_fontdata_widths_timesbolditalic.py deleted file mode 100644 index e7c6be43..00000000 --- a/reportlab/pdfbase/_fontdata_widths_timesbolditalic.py +++ /dev/null @@ -1,229 +0,0 @@ -widths = {'A': 667, - 'AE': 944, - 'Aacute': 667, - 'Acircumflex': 667, - 'Adieresis': 667, - 'Agrave': 667, - 'Aring': 667, - 'Atilde': 667, - 'B': 667, - 'C': 667, - 'Ccedilla': 667, - 'D': 722, - 'E': 667, - 'Eacute': 667, - 'Ecircumflex': 667, - 'Edieresis': 667, - 'Egrave': 667, - 'Eth': 722, - 'Euro': 500, - 'F': 667, - 'G': 722, - 'H': 778, - 'I': 389, - 'Iacute': 389, - 'Icircumflex': 389, - 'Idieresis': 389, - 'Igrave': 389, - 'J': 500, - 'K': 667, - 'L': 611, - 'Lslash': 611, - 'M': 889, - 'N': 722, - 'Ntilde': 722, - 'O': 722, - 'OE': 944, - 'Oacute': 722, - 'Ocircumflex': 722, - 'Odieresis': 722, - 'Ograve': 722, - 'Oslash': 722, - 'Otilde': 722, - 'P': 611, - 'Q': 722, - 'R': 667, - 'S': 556, - 'Scaron': 556, - 'T': 611, - 'Thorn': 611, - 'U': 722, - 'Uacute': 722, - 'Ucircumflex': 722, - 'Udieresis': 722, - 'Ugrave': 722, - 'V': 667, - 'W': 889, - 'X': 667, - 'Y': 611, - 'Yacute': 611, - 'Ydieresis': 611, - 'Z': 611, - 'Zcaron': 611, - 'a': 500, - 'aacute': 500, - 'acircumflex': 500, - 'acute': 333, - 'adieresis': 500, - 'ae': 722, - 'agrave': 500, - 'ampersand': 778, - 'aring': 500, - 'asciicircum': 570, - 'asciitilde': 570, - 'asterisk': 500, - 'at': 832, - 'atilde': 500, - 'b': 500, - 'backslash': 278, - 'bar': 220, - 'braceleft': 348, - 'braceright': 348, - 'bracketleft': 333, - 'bracketright': 333, - 'breve': 333, - 'brokenbar': 220, - 'bullet': 350, - 'c': 444, - 'caron': 333, - 'ccedilla': 444, - 'cedilla': 333, - 'cent': 500, - 'circumflex': 333, - 'colon': 333, - 'comma': 250, - 'copyright': 747, - 'currency': 500, - 'd': 500, - 'dagger': 500, - 'daggerdbl': 500, - 'degree': 400, - 'dieresis': 333, - 'divide': 570, - 'dollar': 500, - 'dotaccent': 333, - 'dotlessi': 278, - 'e': 444, - 'eacute': 444, - 'ecircumflex': 444, - 'edieresis': 444, - 'egrave': 444, - 'eight': 500, - 'ellipsis': 1000, - 'emdash': 1000, - 'endash': 500, - 'equal': 570, - 'eth': 500, - 'exclam': 389, - 'exclamdown': 389, - 'f': 333, - 'fi': 556, - 'five': 500, - 'fl': 556, - 'florin': 500, - 'four': 500, - 'fraction': 167, - 'g': 500, - 'germandbls': 500, - 'grave': 333, - 'greater': 570, - 'guillemotleft': 500, - 'guillemotright': 500, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'h': 556, - 'hungarumlaut': 333, - 'hyphen': 333, - 'i': 278, - 'iacute': 278, - 'icircumflex': 278, - 'idieresis': 278, - 'igrave': 278, - 'j': 278, - 'k': 500, - 'l': 278, - 'less': 570, - 'logicalnot': 606, - 'lslash': 278, - 'm': 778, - 'macron': 333, - 'minus': 606, - 'mu': 576, - 'multiply': 570, - 'n': 556, - 'nine': 500, - 'ntilde': 556, - 'numbersign': 500, - 'o': 500, - 'oacute': 500, - 'ocircumflex': 500, - 'odieresis': 500, - 'oe': 722, - 'ogonek': 333, - 'ograve': 500, - 'one': 500, - 'onehalf': 750, - 'onequarter': 750, - 'onesuperior': 300, - 'ordfeminine': 266, - 'ordmasculine': 300, - 'oslash': 500, - 'otilde': 500, - 'p': 500, - 'paragraph': 500, - 'parenleft': 333, - 'parenright': 333, - 'percent': 833, - 'period': 250, - 'periodcentered': 250, - 'perthousand': 1000, - 'plus': 570, - 'plusminus': 570, - 'q': 500, - 'question': 500, - 'questiondown': 500, - 'quotedbl': 555, - 'quotedblbase': 500, - 'quotedblleft': 500, - 'quotedblright': 500, - 'quoteleft': 333, - 'quoteright': 333, - 'quotesinglbase': 333, - 'quotesingle': 278, - 'r': 389, - 'registered': 747, - 'ring': 333, - 's': 389, - 'scaron': 389, - 'section': 500, - 'semicolon': 333, - 'seven': 500, - 'six': 500, - 'slash': 278, - 'space': 250, - 'sterling': 500, - 't': 278, - 'thorn': 500, - 'three': 500, - 'threequarters': 750, - 'threesuperior': 300, - 'tilde': 333, - 'trademark': 1000, - 'two': 500, - 'twosuperior': 300, - 'u': 556, - 'uacute': 556, - 'ucircumflex': 556, - 'udieresis': 556, - 'ugrave': 556, - 'underscore': 500, - 'v': 444, - 'w': 667, - 'x': 500, - 'y': 444, - 'yacute': 444, - 'ydieresis': 444, - 'yen': 500, - 'z': 389, - 'zcaron': 389, - 'zero': 500} diff --git a/reportlab/pdfbase/_fontdata_widths_timesitalic.py b/reportlab/pdfbase/_fontdata_widths_timesitalic.py deleted file mode 100644 index 77aaa16f..00000000 --- a/reportlab/pdfbase/_fontdata_widths_timesitalic.py +++ /dev/null @@ -1,229 +0,0 @@ -widths = {'A': 611, - 'AE': 889, - 'Aacute': 611, - 'Acircumflex': 611, - 'Adieresis': 611, - 'Agrave': 611, - 'Aring': 611, - 'Atilde': 611, - 'B': 611, - 'C': 667, - 'Ccedilla': 667, - 'D': 722, - 'E': 611, - 'Eacute': 611, - 'Ecircumflex': 611, - 'Edieresis': 611, - 'Egrave': 611, - 'Eth': 722, - 'Euro': 500, - 'F': 611, - 'G': 722, - 'H': 722, - 'I': 333, - 'Iacute': 333, - 'Icircumflex': 333, - 'Idieresis': 333, - 'Igrave': 333, - 'J': 444, - 'K': 667, - 'L': 556, - 'Lslash': 556, - 'M': 833, - 'N': 667, - 'Ntilde': 667, - 'O': 722, - 'OE': 944, - 'Oacute': 722, - 'Ocircumflex': 722, - 'Odieresis': 722, - 'Ograve': 722, - 'Oslash': 722, - 'Otilde': 722, - 'P': 611, - 'Q': 722, - 'R': 611, - 'S': 500, - 'Scaron': 500, - 'T': 556, - 'Thorn': 611, - 'U': 722, - 'Uacute': 722, - 'Ucircumflex': 722, - 'Udieresis': 722, - 'Ugrave': 722, - 'V': 611, - 'W': 833, - 'X': 611, - 'Y': 556, - 'Yacute': 556, - 'Ydieresis': 556, - 'Z': 556, - 'Zcaron': 556, - 'a': 500, - 'aacute': 500, - 'acircumflex': 500, - 'acute': 333, - 'adieresis': 500, - 'ae': 667, - 'agrave': 500, - 'ampersand': 778, - 'aring': 500, - 'asciicircum': 422, - 'asciitilde': 541, - 'asterisk': 500, - 'at': 920, - 'atilde': 500, - 'b': 500, - 'backslash': 278, - 'bar': 275, - 'braceleft': 400, - 'braceright': 400, - 'bracketleft': 389, - 'bracketright': 389, - 'breve': 333, - 'brokenbar': 275, - 'bullet': 350, - 'c': 444, - 'caron': 333, - 'ccedilla': 444, - 'cedilla': 333, - 'cent': 500, - 'circumflex': 333, - 'colon': 333, - 'comma': 250, - 'copyright': 760, - 'currency': 500, - 'd': 500, - 'dagger': 500, - 'daggerdbl': 500, - 'degree': 400, - 'dieresis': 333, - 'divide': 675, - 'dollar': 500, - 'dotaccent': 333, - 'dotlessi': 278, - 'e': 444, - 'eacute': 444, - 'ecircumflex': 444, - 'edieresis': 444, - 'egrave': 444, - 'eight': 500, - 'ellipsis': 889, - 'emdash': 889, - 'endash': 500, - 'equal': 675, - 'eth': 500, - 'exclam': 333, - 'exclamdown': 389, - 'f': 278, - 'fi': 500, - 'five': 500, - 'fl': 500, - 'florin': 500, - 'four': 500, - 'fraction': 167, - 'g': 500, - 'germandbls': 500, - 'grave': 333, - 'greater': 675, - 'guillemotleft': 500, - 'guillemotright': 500, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'h': 500, - 'hungarumlaut': 333, - 'hyphen': 333, - 'i': 278, - 'iacute': 278, - 'icircumflex': 278, - 'idieresis': 278, - 'igrave': 278, - 'j': 278, - 'k': 444, - 'l': 278, - 'less': 675, - 'logicalnot': 675, - 'lslash': 278, - 'm': 722, - 'macron': 333, - 'minus': 675, - 'mu': 500, - 'multiply': 675, - 'n': 500, - 'nine': 500, - 'ntilde': 500, - 'numbersign': 500, - 'o': 500, - 'oacute': 500, - 'ocircumflex': 500, - 'odieresis': 500, - 'oe': 667, - 'ogonek': 333, - 'ograve': 500, - 'one': 500, - 'onehalf': 750, - 'onequarter': 750, - 'onesuperior': 300, - 'ordfeminine': 276, - 'ordmasculine': 310, - 'oslash': 500, - 'otilde': 500, - 'p': 500, - 'paragraph': 523, - 'parenleft': 333, - 'parenright': 333, - 'percent': 833, - 'period': 250, - 'periodcentered': 250, - 'perthousand': 1000, - 'plus': 675, - 'plusminus': 675, - 'q': 500, - 'question': 500, - 'questiondown': 500, - 'quotedbl': 420, - 'quotedblbase': 556, - 'quotedblleft': 556, - 'quotedblright': 556, - 'quoteleft': 333, - 'quoteright': 333, - 'quotesinglbase': 333, - 'quotesingle': 214, - 'r': 389, - 'registered': 760, - 'ring': 333, - 's': 389, - 'scaron': 389, - 'section': 500, - 'semicolon': 333, - 'seven': 500, - 'six': 500, - 'slash': 278, - 'space': 250, - 'sterling': 500, - 't': 278, - 'thorn': 500, - 'three': 500, - 'threequarters': 750, - 'threesuperior': 300, - 'tilde': 333, - 'trademark': 980, - 'two': 500, - 'twosuperior': 300, - 'u': 500, - 'uacute': 500, - 'ucircumflex': 500, - 'udieresis': 500, - 'ugrave': 500, - 'underscore': 500, - 'v': 444, - 'w': 667, - 'x': 444, - 'y': 444, - 'yacute': 444, - 'ydieresis': 444, - 'yen': 500, - 'z': 389, - 'zcaron': 389, - 'zero': 500} diff --git a/reportlab/pdfbase/_fontdata_widths_timesroman.py b/reportlab/pdfbase/_fontdata_widths_timesroman.py deleted file mode 100644 index 82d0347c..00000000 --- a/reportlab/pdfbase/_fontdata_widths_timesroman.py +++ /dev/null @@ -1,229 +0,0 @@ -widths = {'A': 722, - 'AE': 889, - 'Aacute': 722, - 'Acircumflex': 722, - 'Adieresis': 722, - 'Agrave': 722, - 'Aring': 722, - 'Atilde': 722, - 'B': 667, - 'C': 667, - 'Ccedilla': 667, - 'D': 722, - 'E': 611, - 'Eacute': 611, - 'Ecircumflex': 611, - 'Edieresis': 611, - 'Egrave': 611, - 'Eth': 722, - 'Euro': 500, - 'F': 556, - 'G': 722, - 'H': 722, - 'I': 333, - 'Iacute': 333, - 'Icircumflex': 333, - 'Idieresis': 333, - 'Igrave': 333, - 'J': 389, - 'K': 722, - 'L': 611, - 'Lslash': 611, - 'M': 889, - 'N': 722, - 'Ntilde': 722, - 'O': 722, - 'OE': 889, - 'Oacute': 722, - 'Ocircumflex': 722, - 'Odieresis': 722, - 'Ograve': 722, - 'Oslash': 722, - 'Otilde': 722, - 'P': 556, - 'Q': 722, - 'R': 667, - 'S': 556, - 'Scaron': 556, - 'T': 611, - 'Thorn': 556, - 'U': 722, - 'Uacute': 722, - 'Ucircumflex': 722, - 'Udieresis': 722, - 'Ugrave': 722, - 'V': 722, - 'W': 944, - 'X': 722, - 'Y': 722, - 'Yacute': 722, - 'Ydieresis': 722, - 'Z': 611, - 'Zcaron': 611, - 'a': 444, - 'aacute': 444, - 'acircumflex': 444, - 'acute': 333, - 'adieresis': 444, - 'ae': 667, - 'agrave': 444, - 'ampersand': 778, - 'aring': 444, - 'asciicircum': 469, - 'asciitilde': 541, - 'asterisk': 500, - 'at': 921, - 'atilde': 444, - 'b': 500, - 'backslash': 278, - 'bar': 200, - 'braceleft': 480, - 'braceright': 480, - 'bracketleft': 333, - 'bracketright': 333, - 'breve': 333, - 'brokenbar': 200, - 'bullet': 350, - 'c': 444, - 'caron': 333, - 'ccedilla': 444, - 'cedilla': 333, - 'cent': 500, - 'circumflex': 333, - 'colon': 278, - 'comma': 250, - 'copyright': 760, - 'currency': 500, - 'd': 500, - 'dagger': 500, - 'daggerdbl': 500, - 'degree': 400, - 'dieresis': 333, - 'divide': 564, - 'dollar': 500, - 'dotaccent': 333, - 'dotlessi': 278, - 'e': 444, - 'eacute': 444, - 'ecircumflex': 444, - 'edieresis': 444, - 'egrave': 444, - 'eight': 500, - 'ellipsis': 1000, - 'emdash': 1000, - 'endash': 500, - 'equal': 564, - 'eth': 500, - 'exclam': 333, - 'exclamdown': 333, - 'f': 333, - 'fi': 556, - 'five': 500, - 'fl': 556, - 'florin': 500, - 'four': 500, - 'fraction': 167, - 'g': 500, - 'germandbls': 500, - 'grave': 333, - 'greater': 564, - 'guillemotleft': 500, - 'guillemotright': 500, - 'guilsinglleft': 333, - 'guilsinglright': 333, - 'h': 500, - 'hungarumlaut': 333, - 'hyphen': 333, - 'i': 278, - 'iacute': 278, - 'icircumflex': 278, - 'idieresis': 278, - 'igrave': 278, - 'j': 278, - 'k': 500, - 'l': 278, - 'less': 564, - 'logicalnot': 564, - 'lslash': 278, - 'm': 778, - 'macron': 333, - 'minus': 564, - 'mu': 500, - 'multiply': 564, - 'n': 500, - 'nine': 500, - 'ntilde': 500, - 'numbersign': 500, - 'o': 500, - 'oacute': 500, - 'ocircumflex': 500, - 'odieresis': 500, - 'oe': 722, - 'ogonek': 333, - 'ograve': 500, - 'one': 500, - 'onehalf': 750, - 'onequarter': 750, - 'onesuperior': 300, - 'ordfeminine': 276, - 'ordmasculine': 310, - 'oslash': 500, - 'otilde': 500, - 'p': 500, - 'paragraph': 453, - 'parenleft': 333, - 'parenright': 333, - 'percent': 833, - 'period': 250, - 'periodcentered': 250, - 'perthousand': 1000, - 'plus': 564, - 'plusminus': 564, - 'q': 500, - 'question': 444, - 'questiondown': 444, - 'quotedbl': 408, - 'quotedblbase': 444, - 'quotedblleft': 444, - 'quotedblright': 444, - 'quoteleft': 333, - 'quoteright': 333, - 'quotesinglbase': 333, - 'quotesingle': 180, - 'r': 333, - 'registered': 760, - 'ring': 333, - 's': 389, - 'scaron': 389, - 'section': 500, - 'semicolon': 278, - 'seven': 500, - 'six': 500, - 'slash': 278, - 'space': 250, - 'sterling': 500, - 't': 278, - 'thorn': 500, - 'three': 500, - 'threequarters': 750, - 'threesuperior': 300, - 'tilde': 333, - 'trademark': 980, - 'two': 500, - 'twosuperior': 300, - 'u': 500, - 'uacute': 500, - 'ucircumflex': 500, - 'udieresis': 500, - 'ugrave': 500, - 'underscore': 500, - 'v': 500, - 'w': 722, - 'x': 500, - 'y': 500, - 'yacute': 500, - 'ydieresis': 500, - 'yen': 500, - 'z': 444, - 'zcaron': 444, - 'zero': 500} diff --git a/reportlab/pdfbase/_fontdata_widths_zapfdingbats.py b/reportlab/pdfbase/_fontdata_widths_zapfdingbats.py deleted file mode 100644 index 5fc9f7ff..00000000 --- a/reportlab/pdfbase/_fontdata_widths_zapfdingbats.py +++ /dev/null @@ -1,202 +0,0 @@ -widths = {'a1': 974, - 'a10': 692, - 'a100': 668, - 'a101': 732, - 'a102': 544, - 'a103': 544, - 'a104': 910, - 'a105': 911, - 'a106': 667, - 'a107': 760, - 'a108': 760, - 'a109': 626, - 'a11': 960, - 'a110': 694, - 'a111': 595, - 'a112': 776, - 'a117': 690, - 'a118': 791, - 'a119': 790, - 'a12': 939, - 'a120': 788, - 'a121': 788, - 'a122': 788, - 'a123': 788, - 'a124': 788, - 'a125': 788, - 'a126': 788, - 'a127': 788, - 'a128': 788, - 'a129': 788, - 'a13': 549, - 'a130': 788, - 'a131': 788, - 'a132': 788, - 'a133': 788, - 'a134': 788, - 'a135': 788, - 'a136': 788, - 'a137': 788, - 'a138': 788, - 'a139': 788, - 'a14': 855, - 'a140': 788, - 'a141': 788, - 'a142': 788, - 'a143': 788, - 'a144': 788, - 'a145': 788, - 'a146': 788, - 'a147': 788, - 'a148': 788, - 'a149': 788, - 'a15': 911, - 'a150': 788, - 'a151': 788, - 'a152': 788, - 'a153': 788, - 'a154': 788, - 'a155': 788, - 'a156': 788, - 'a157': 788, - 'a158': 788, - 'a159': 788, - 'a16': 933, - 'a160': 894, - 'a161': 838, - 'a162': 924, - 'a163': 1016, - 'a164': 458, - 'a165': 924, - 'a166': 918, - 'a167': 927, - 'a168': 928, - 'a169': 928, - 'a17': 945, - 'a170': 834, - 'a171': 873, - 'a172': 828, - 'a173': 924, - 'a174': 917, - 'a175': 930, - 'a176': 931, - 'a177': 463, - 'a178': 883, - 'a179': 836, - 'a18': 974, - 'a180': 867, - 'a181': 696, - 'a182': 874, - 'a183': 760, - 'a184': 946, - 'a185': 865, - 'a186': 967, - 'a187': 831, - 'a188': 873, - 'a189': 927, - 'a19': 755, - 'a190': 970, - 'a191': 918, - 'a192': 748, - 'a193': 836, - 'a194': 771, - 'a195': 888, - 'a196': 748, - 'a197': 771, - 'a198': 888, - 'a199': 867, - 'a2': 961, - 'a20': 846, - 'a200': 696, - 'a201': 874, - 'a202': 974, - 'a203': 762, - 'a204': 759, - 'a205': 509, - 'a206': 410, - 'a21': 762, - 'a22': 761, - 'a23': 571, - 'a24': 677, - 'a25': 763, - 'a26': 760, - 'a27': 759, - 'a28': 754, - 'a29': 786, - 'a3': 980, - 'a30': 788, - 'a31': 788, - 'a32': 790, - 'a33': 793, - 'a34': 794, - 'a35': 816, - 'a36': 823, - 'a37': 789, - 'a38': 841, - 'a39': 823, - 'a4': 719, - 'a40': 833, - 'a41': 816, - 'a42': 831, - 'a43': 923, - 'a44': 744, - 'a45': 723, - 'a46': 749, - 'a47': 790, - 'a48': 792, - 'a49': 695, - 'a5': 789, - 'a50': 776, - 'a51': 768, - 'a52': 792, - 'a53': 759, - 'a54': 707, - 'a55': 708, - 'a56': 682, - 'a57': 701, - 'a58': 826, - 'a59': 815, - 'a6': 494, - 'a60': 789, - 'a61': 789, - 'a62': 707, - 'a63': 687, - 'a64': 696, - 'a65': 689, - 'a66': 786, - 'a67': 787, - 'a68': 713, - 'a69': 791, - 'a7': 552, - 'a70': 785, - 'a71': 791, - 'a72': 873, - 'a73': 761, - 'a74': 762, - 'a75': 759, - 'a76': 892, - 'a77': 892, - 'a78': 788, - 'a79': 784, - 'a8': 537, - 'a81': 438, - 'a82': 138, - 'a83': 277, - 'a84': 415, - 'a85': 509, - 'a86': 410, - 'a87': 234, - 'a88': 234, - 'a89': 390, - 'a9': 577, - 'a90': 390, - 'a91': 276, - 'a92': 276, - 'a93': 317, - 'a94': 317, - 'a95': 334, - 'a96': 334, - 'a97': 392, - 'a98': 392, - 'a99': 668, - 'space': 278} diff --git a/reportlab/pdfbase/cidfonts.py b/reportlab/pdfbase/cidfonts.py deleted file mode 100644 index 22a5c37f..00000000 --- a/reportlab/pdfbase/cidfonts.py +++ /dev/null @@ -1,520 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/pdfbase/cidfonts.py -#$Header $ -__version__=''' $Id$ ''' -__doc__="""CID (Asian multi-byte) font support. - -This defines classes to represent CID fonts. They know how to calculate -their own width and how to write themselves into PDF files.""" - -import os -import marshal -import time -try: - from hashlib import md5 -except ImportError: - from md5 import md5 - -import reportlab -from reportlab.pdfbase import pdfmetrics -from reportlab.pdfbase._cidfontdata import allowedTypeFaces, allowedEncodings, CIDFontInfo, \ - defaultUnicodeEncodings, widthsByUnichar -from reportlab.pdfgen.canvas import Canvas -from reportlab.pdfbase import pdfdoc -from reportlab.lib.rl_accel import escapePDF -from reportlab.rl_config import CMapSearchPath -from reportlab.lib.utils import isSeq, isBytes - -#quick hackery for 2.0 release. Now we always do unicode, and have built in -#the CMAP data, any code to load CMap files is not needed. -DISABLE_CMAP = True - - -def findCMapFile(name): - "Returns full filename, or raises error" - for dirname in CMapSearchPath: - cmapfile = dirname + os.sep + name - if os.path.isfile(cmapfile): - #print "found", cmapfile - return cmapfile - raise IOError('CMAP file for encodings "%s" not found!' % name) - -def structToPDF(structure): - "Converts deeply nested structure to PDFdoc dictionary/array objects" - if isinstance(structure,dict): - newDict = {} - for k, v in structure.items(): - newDict[k] = structToPDF(v) - return pdfdoc.PDFDictionary(newDict) - elif isSeq(structure): - newList = [] - for elem in structure: - newList.append(structToPDF(elem)) - return pdfdoc.PDFArray(newList) - else: - return structure - -class CIDEncoding(pdfmetrics.Encoding): - """Multi-byte encoding. These are loaded from CMAP files. - - A CMAP file is like a mini-codec. It defines the correspondence - between code points in the (multi-byte) input data and Character - IDs. """ - # aims to do similar things to Brian Hooper's CMap class, - # but I could not get it working and had to rewrite. - # also, we should really rearrange our current encoding - # into a SingleByteEncoding since many of its methods - # should not apply here. - - def __init__(self, name, useCache=1): - self.name = name - self._mapFileHash = None - self._codeSpaceRanges = [] - self._notDefRanges = [] - self._cmap = {} - self.source = None - if not DISABLE_CMAP: - if useCache: - from reportlab.lib.utils import get_rl_tempdir - fontmapdir = get_rl_tempdir('FastCMAPS') - if os.path.isfile(fontmapdir + os.sep + name + '.fastmap'): - self.fastLoad(fontmapdir) - self.source = fontmapdir + os.sep + name + '.fastmap' - else: - self.parseCMAPFile(name) - self.source = 'CMAP: ' + name - self.fastSave(fontmapdir) - else: - self.parseCMAPFile(name) - - def _hash(self, text): - hasher = md5() - hasher.update(text) - return hasher.digest() - - def parseCMAPFile(self, name): - """This is a tricky one as CMAP files are Postscript - ones. Some refer to others with a 'usecmap' - command""" - #started = time.clock() - cmapfile = findCMapFile(name) - # this will CRAWL with the unicode encodings... - rawdata = open(cmapfile, 'r').read() - - self._mapFileHash = self._hash(rawdata) - #if it contains the token 'usecmap', parse the other - #cmap file first.... - usecmap_pos = rawdata.find('usecmap') - if usecmap_pos > -1: - #they tell us to look in another file - #for the code space ranges. The one - # to use will be the previous word. - chunk = rawdata[0:usecmap_pos] - words = chunk.split() - otherCMAPName = words[-1] - #print 'referred to another CMAP %s' % otherCMAPName - self.parseCMAPFile(otherCMAPName) - # now continue parsing this, as it may - # override some settings - - - words = rawdata.split() - while words != []: - if words[0] == 'begincodespacerange': - words = words[1:] - while words[0] != 'endcodespacerange': - strStart, strEnd, words = words[0], words[1], words[2:] - start = int(strStart[1:-1], 16) - end = int(strEnd[1:-1], 16) - self._codeSpaceRanges.append((start, end),) - elif words[0] == 'beginnotdefrange': - words = words[1:] - while words[0] != 'endnotdefrange': - strStart, strEnd, strValue = words[0:3] - start = int(strStart[1:-1], 16) - end = int(strEnd[1:-1], 16) - value = int(strValue) - self._notDefRanges.append((start, end, value),) - words = words[3:] - elif words[0] == 'begincidrange': - words = words[1:] - while words[0] != 'endcidrange': - strStart, strEnd, strValue = words[0:3] - start = int(strStart[1:-1], 16) - end = int(strEnd[1:-1], 16) - value = int(strValue) - # this means that 'start' corresponds to 'value', - # start+1 corresponds to value+1 and so on up - # to end - offset = 0 - while start + offset <= end: - self._cmap[start + offset] = value + offset - offset = offset + 1 - words = words[3:] - - else: - words = words[1:] - #finished = time.clock() - #print 'parsed CMAP %s in %0.4f seconds' % (self.name, finished - started) - - def translate(self, text): - "Convert a string into a list of CIDs" - output = [] - cmap = self._cmap - lastChar = '' - for char in text: - if lastChar != '': - #print 'convert character pair "%s"' % (lastChar + char) - num = ord(lastChar) * 256 + ord(char) - else: - #print 'convert character "%s"' % char - num = ord(char) - lastChar = char - found = 0 - for low, high in self._codeSpaceRanges: - if low < num < high: - try: - cid = cmap[num] - #print '%d -> %d' % (num, cid) - except KeyError: - #not defined. Try to find the appropriate - # notdef character, or failing that return - # zero - cid = 0 - for low2, high2, notdef in self._notDefRanges: - if low2 < num < high2: - cid = notdef - break - output.append(cid) - found = 1 - break - if found: - lastChar = '' - else: - lastChar = char - return output - - def fastSave(self, directory): - f = open(os.path.join(directory, self.name + '.fastmap'), 'wb') - marshal.dump(self._mapFileHash, f) - marshal.dump(self._codeSpaceRanges, f) - marshal.dump(self._notDefRanges, f) - marshal.dump(self._cmap, f) - f.close() - - def fastLoad(self, directory): - started = time.clock() - f = open(os.path.join(directory, self.name + '.fastmap'), 'rb') - self._mapFileHash = marshal.load(f) - self._codeSpaceRanges = marshal.load(f) - self._notDefRanges = marshal.load(f) - self._cmap = marshal.load(f) - f.close() - finished = time.clock() - #print 'loaded %s in %0.4f seconds' % (self.name, finished - started) - - def getData(self): - """Simple persistence helper. Return a dict with all that matters.""" - return { - 'mapFileHash': self._mapFileHash, - 'codeSpaceRanges': self._codeSpaceRanges, - 'notDefRanges': self._notDefRanges, - 'cmap': self._cmap, - } - -class CIDTypeFace(pdfmetrics.TypeFace): - """Multi-byte type face. - - Conceptually similar to a single byte typeface, - but the glyphs are identified by a numeric Character - ID (CID) and not a glyph name. """ - def __init__(self, name): - """Initialised from one of the canned dictionaries in allowedEncodings - - Or rather, it will be shortly...""" - pdfmetrics.TypeFace.__init__(self, name) - self._extractDictInfo(name) - def _extractDictInfo(self, name): - try: - fontDict = CIDFontInfo[name] - except KeyError: - raise KeyError("Unable to find information on CID typeface '%s'" % name + - "Only the following font names work:" + repr(allowedTypeFaces)) - descFont = fontDict['DescendantFonts'][0] - self.ascent = descFont['FontDescriptor']['Ascent'] - self.descent = descFont['FontDescriptor']['Descent'] - self._defaultWidth = descFont['DW'] - self._explicitWidths = self._expandWidths(descFont['W']) - - # should really support self.glyphWidths, self.glyphNames - # but not done yet. - - - def _expandWidths(self, compactWidthArray): - """Expands Adobe nested list structure to get a dictionary of widths. - - Here is an example of such a structure.:: - - ( - # starting at character ID 1, next n characters have the widths given. - 1, (277,305,500,668,668,906,727,305,445,445,508,668,305,379,305,539), - # all Characters from ID 17 to 26 are 668 em units wide - 17, 26, 668, - 27, (305, 305, 668, 668, 668, 566, 871, 727, 637, 652, 699, 574, 555, - 676, 687, 242, 492, 664, 582, 789, 707, 734, 582, 734, 605, 605, - 641, 668, 727, 945, 609, 609, 574, 445, 668, 445, 668, 668, 590, - 555, 609, 547, 602, 574, 391, 609, 582, 234, 277, 539, 234, 895, - 582, 605, 602, 602, 387, 508, 441, 582, 562, 781, 531, 570, 555, - 449, 246, 449, 668), - # these must be half width katakana and the like. - 231, 632, 500 - ) - - """ - data = compactWidthArray[:] - widths = {} - while data: - start, data = data[0], data[1:] - if isSeq(data[0]): - items, data = data[0], data[1:] - for offset in range(len(items)): - widths[start + offset] = items[offset] - else: - end, width, data = data[0], data[1], data[2:] - for idx in range(start, end+1): - widths[idx] = width - return widths - - def getCharWidth(self, characterId): - return self._explicitWidths.get(characterId, self._defaultWidth) - -class CIDFont(pdfmetrics.Font): - "Represents a built-in multi-byte font" - _multiByte = 1 - - def __init__(self, face, encoding): - - assert face in allowedTypeFaces, "TypeFace '%s' not supported! Use any of these instead: %s" % (face, allowedTypeFaces) - self.faceName = face - #should cache in registry... - self.face = CIDTypeFace(face) - - assert encoding in allowedEncodings, "Encoding '%s' not supported! Use any of these instead: %s" % (encoding, allowedEncodings) - self.encodingName = encoding - self.encoding = CIDEncoding(encoding) - - #legacy hack doing quick cut and paste. - self.fontName = self.faceName + '-' + self.encodingName - self.name = self.fontName - - # need to know if it is vertical or horizontal - self.isVertical = (self.encodingName[-1] == 'V') - - #no substitutes initially - self.substitutionFonts = [] - - def formatForPdf(self, text): - encoded = escapePDF(text) - #print 'encoded CIDFont:', encoded - return encoded - - def stringWidth(self, text, size, encoding=None): - """This presumes non-Unicode input. UnicodeCIDFont wraps it for that context""" - cidlist = self.encoding.translate(text) - if self.isVertical: - #this part is "not checked!" but seems to work. - #assume each is 1000 ems high - return len(cidlist) * size - else: - w = 0 - for cid in cidlist: - w = w + self.face.getCharWidth(cid) - return 0.001 * w * size - - - def addObjects(self, doc): - """The explicit code in addMinchoObjects and addGothicObjects - will be replaced by something that pulls the data from - _cidfontdata.py in the next few days.""" - internalName = 'F' + repr(len(doc.fontMapping)+1) - - bigDict = CIDFontInfo[self.face.name] - bigDict['Name'] = '/' + internalName - bigDict['Encoding'] = '/' + self.encodingName - - #convert to PDF dictionary/array objects - cidObj = structToPDF(bigDict) - - # link into document, and add to font map - r = doc.Reference(cidObj, internalName) - fontDict = doc.idToObject['BasicFonts'].dict - fontDict[internalName] = r - doc.fontMapping[self.name] = '/' + internalName - - -class UnicodeCIDFont(CIDFont): - """Wraps up CIDFont to hide explicit encoding choice; - encodes text for output as UTF16. - - lang should be one of 'jpn',chs','cht','kor' for now. - if vertical is set, it will select a different widths array - and possibly glyphs for some punctuation marks. - - halfWidth is only for Japanese. - - - >>> dodgy = UnicodeCIDFont('nonexistent') - Traceback (most recent call last): - ... - KeyError: "don't know anything about CID font nonexistent" - >>> heisei = UnicodeCIDFont('HeiseiMin-W3') - >>> heisei.name - 'HeiseiMin-W3' - >>> heisei.language - 'jpn' - >>> heisei.encoding.name - 'UniJIS-UCS2-H' - >>> #This is how PDF data gets encoded. - >>> print(heisei.formatForPdf('hello')) - \\000h\\000e\\000l\\000l\\000o - >>> tokyo = u'\u6771\u4AEC' - >>> print(heisei.formatForPdf(tokyo)) - gqJ\\354 - >>> print(heisei.stringWidth(tokyo,10)) - 20.0 - >>> print(heisei.stringWidth('hello world',10)) - 45.83 - """ - - def __init__(self, face, isVertical=False, isHalfWidth=False): - #pass - try: - lang, defaultEncoding = defaultUnicodeEncodings[face] - except KeyError: - raise KeyError("don't know anything about CID font %s" % face) - - #we know the languages now. - self.language = lang - - #rebuilt encoding string. They follow rules which work - #for the 7 fonts provided. - enc = defaultEncoding[:-1] - if isHalfWidth: - enc = enc + 'HW-' - if isVertical: - enc = enc + 'V' - else: - enc = enc + 'H' - - #now we can do the more general case - CIDFont.__init__(self, face, enc) - #self.encName = 'utf_16_le' - #it's simpler for unicode, just use the face name - self.name = self.fontName = face - self.vertical = isVertical - self.isHalfWidth = isHalfWidth - - self.unicodeWidths = widthsByUnichar[self.name] - - - def formatForPdf(self, text): - #these ones should be encoded asUTF16 minus the BOM - from codecs import utf_16_be_encode - #print 'formatting %s: %s' % (type(text), repr(text)) - if isBytes(text): - text = text.decode('utf8') - utfText = utf_16_be_encode(text)[0] - encoded = escapePDF(utfText) - #print ' encoded:',encoded - return encoded - # - #result = escapePDF(encoded) - #print ' -> %s' % repr(result) - #return result - - - def stringWidth(self, text, size, encoding=None): - "Just ensure we do width test on characters, not bytes..." - if isBytes(text): - text = text.decode('utf8') - - widths = self.unicodeWidths - return size * 0.001 * sum([widths.get(uch, 1000) for uch in text]) - #return CIDFont.stringWidth(self, text, size, encoding) - - -def precalculate(cmapdir): - # crunches through all, making 'fastmap' files - import os - files = os.listdir(cmapdir) - for file in files: - if os.path.isfile(cmapdir + os.sep + file + '.fastmap'): - continue - try: - enc = CIDEncoding(file) - except: - print('cannot parse %s, skipping' % enc) - continue - enc.fastSave(cmapdir) - print('saved %s.fastmap' % file) - -def test(): - # only works if you have cirrect encodings on your box! - c = Canvas('test_japanese.pdf') - c.setFont('Helvetica', 30) - c.drawString(100,700, 'Japanese Font Support') - - pdfmetrics.registerFont(CIDFont('HeiseiMin-W3','90ms-RKSJ-H')) - pdfmetrics.registerFont(CIDFont('HeiseiKakuGo-W5','90ms-RKSJ-H')) - - - # the two typefaces - c.setFont('HeiseiMin-W3-90ms-RKSJ-H', 16) - # this says "This is HeiseiMincho" in shift-JIS. Not all our readers - # have a Japanese PC, so I escaped it. On a Japanese-capable - # system, print the string to see Kanji - message1 = '\202\261\202\352\202\315\225\275\220\254\226\276\222\251\202\305\202\267\201B' - c.drawString(100, 675, message1) - c.save() - print('saved test_japanese.pdf') - - -## print 'CMAP_DIR = ', CMAP_DIR -## tf1 = CIDTypeFace('HeiseiMin-W3') -## print 'ascent = ',tf1.ascent -## print 'descent = ',tf1.descent -## for cid in [1,2,3,4,5,18,19,28,231,1742]: -## print 'width of cid %d = %d' % (cid, tf1.getCharWidth(cid)) - - encName = '90ms-RKSJ-H' - enc = CIDEncoding(encName) - print(message1, '->', enc.translate(message1)) - - f = CIDFont('HeiseiMin-W3','90ms-RKSJ-H') - print('width = %0.2f' % f.stringWidth(message1, 10)) - - - #testing all encodings -## import time -## started = time.time() -## import glob -## for encName in _cidfontdata.allowedEncodings: -## #encName = '90ms-RKSJ-H' -## enc = CIDEncoding(encName) -## print 'encoding %s:' % encName -## print ' codeSpaceRanges = %s' % enc._codeSpaceRanges -## print ' notDefRanges = %s' % enc._notDefRanges -## print ' mapping size = %d' % len(enc._cmap) -## finished = time.time() -## print 'constructed all encodings in %0.2f seconds' % (finished - started) - -if __name__=='__main__': - import doctest - from reportlab.pdfbase import cidfonts - doctest.testmod(cidfonts) - #test() - - - - diff --git a/reportlab/pdfbase/pdfdoc.py b/reportlab/pdfbase/pdfdoc.py deleted file mode 100644 index 248d258e..00000000 --- a/reportlab/pdfbase/pdfdoc.py +++ /dev/null @@ -1,2394 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/pdfbase/pdfdoc.py -__version__=''' $Id$ ''' -__doc__=""" -The module pdfdoc.py handles the 'outer structure' of PDF documents, ensuring that -all objects are properly cross-referenced and indexed to the nearest byte. The -'inner structure' - the page descriptions - are presumed to be generated before -each page is saved. -pdfgen.py calls this and provides a 'canvas' object to handle page marking operators. -piddlePDF calls pdfgen and offers a high-level interface. - -The classes within this generally mirror structures in the PDF file -and are not part of any public interface. Instead, canvas and font -classes are made available elsewhere for users to manipulate. -""" -import types, binascii, codecs -from collections import OrderedDict -from reportlab.pdfbase import pdfutils -from reportlab import rl_config -from reportlab.lib.utils import import_zlib, open_for_read, makeFileName, isSeq, isBytes, isUnicode, _digester, isStr, bytestr, isPy3 -from reportlab.lib.rl_accel import escapePDF, fp_str, asciiBase85Encode, asciiBase85Decode -from reportlab.pdfbase import pdfmetrics -from hashlib import md5 - -from sys import platform -from sys import version_info -from sys import stderr - -if platform[:4] == 'java' and version_info[:2] == (2, 1): - # workaround for list()-bug in Jython 2.1 (should be fixed in 2.2) - def list(sequence): - def f(x): - return x - return list(map(f, sequence)) - -class PDFError(Exception): - pass - -# __InternalName__ is a special attribute that can only be set by the Document arbitrator -__InternalName__ = "__InternalName__" - -# __RefOnly__ marks reference only elements that must be formatted on top level -__RefOnly__ = "__RefOnly__" - -# __Comment__ provides a (one line) comment to inline with an object ref, if present -# if it is more than one line then percentize it... -__Comment__ = "__Comment__" - -# name for standard font dictionary -BasicFonts = "BasicFonts" - -# name for the pages object -Pages = "Pages" - - -PDF_VERSION_DEFAULT = (1, 3) -PDF_SUPPORT_VERSION = dict( #map keyword to min version that supports it - transparency = (1, 4), - ) - -if isPy3: - def pdfdocEnc(x): - return x.encode('extpdfdoc') if isinstance(x,str) else x -else: - def pdfdocEnc(x): - return x.encode('extpdfdoc') if isinstance(x,unicode) else x - -def format(element, document, toplevel=0): - """Indirection step for formatting. - Ensures that document parameters alter behaviour - of formatting for all elements. - """ - if isinstance(element,PDFObject): - if not toplevel and hasattr(element, __RefOnly__): - # the object cannot be a component at non top level. - # make a reference to it and return it's format - return document.Reference(element).format(document) - else: - f = element.format(document) - if not rl_config.invariant and rl_config.pdfComments and hasattr(element, __Comment__): - f = pdfdocEnc("%% %s\r\n" % element.__Comment__)+f - return f - elif type(element) in (float, int): - #use a controlled number formatting routine - #instead of str, so Jython/Python etc do not differ - return pdfdocEnc(fp_str(element)) - elif isBytes(element): - return element - elif isUnicode(element): - return pdfdocEnc(element) - else: - return pdfdocEnc(str(element)) - -def xObjectName(externalname): - return "FormXob.%s" % externalname - -# backwards compatibility -formName = xObjectName - -# no encryption -class NoEncryption: - def encode(self, t): - "encode a string, stream, text" - return t - def prepare(self, document): - # get ready to do encryption - pass - def register(self, objnum, version): - # enter a new direct object - pass - def info(self): - # the representation of self in file if any (should be None or PDFDict) - return None - -class PDFObject(object): - pass - -class DummyDoc(PDFObject): - "used to bypass encryption when required" - encrypt = NoEncryption() - -### the global document structure manager -class PDFDocument(PDFObject): - # set this to define filters - defaultStreamFilters = None - encrypt = NoEncryption() # default no encryption - def __init__(self, - dummyoutline=0, - compression=rl_config.pageCompression, - invariant=rl_config.invariant, - filename=None, - pdfVersion=PDF_VERSION_DEFAULT, - ): - self._ID = None - self.objectcounter = 0 - self.shadingCounter = 0 - self.inObject = None - self.pageCounter = 1 - - # allow None value to be passed in to mean 'give system defaults' - if invariant is None: - self.invariant = rl_config.invariant - else: - self.invariant = invariant - self.setCompression(compression) - self._pdfVersion = pdfVersion - # signature for creating PDF ID - sig = self.signature = md5() - sig.update(b"a reportlab document") - if not self.invariant: - cat = _getTimeStamp() - else: - cat = 946684800.0 - cat = ascii(cat) - sig.update(bytestr(cat)) # initialize with timestamp digest - # mapping of internal identifier ("Page001") to PDF objectnumber and generation number (34, 0) - self.idToObjectNumberAndVersion = {} - # mapping of internal identifier ("Page001") to PDF object (PDFPage instance) - self.idToObject = {} - # internal id to file location - self.idToOffset = {} - # number to id - self.numberToId = {} - cat = self.Catalog = self._catalog = PDFCatalog() - pages = self.Pages = PDFPages() - cat.Pages = pages - if dummyoutline: - outlines = PDFOutlines0() - else: - outlines = PDFOutlines() - self.Outlines = self.outline = outlines - cat.Outlines = outlines - self.info = PDFInfo() - self.info.invariant = self.invariant - #self.Reference(self.Catalog) - #self.Reference(self.Info) - self.fontMapping = {} - #make an empty font dictionary - DD = PDFDictionary({}) - DD.__Comment__ = "The standard fonts dictionary" - self.Reference(DD, BasicFonts) - self.delayedFonts = [] - - def setCompression(self, onoff): - # XXX: maybe this should also set self.defaultStreamFilters? - self.compression = onoff - - def ensureMinPdfVersion(self, *keys): - "Ensure that the pdf version is greater than or equal to that specified by the keys" - for k in keys: - self._pdfVersion = max(self._pdfVersion, PDF_SUPPORT_VERSION[k]) - - def updateSignature(self, thing): - "add information to the signature" - if self._ID: return # but not if its used already! - self.signature.update(bytestr(thing)) - - def ID(self): - "A unique fingerprint for the file (unless in invariant mode)" - if self._ID: - return self._ID - digest = self.signature.digest() - doc = DummyDoc() - IDs = PDFString(digest,enc='raw').format(doc) - self._ID = (b'\r\n % ReportLab generated PDF document -- digest (http://www.reportlab.com)\r\n [' - +IDs+b' '+IDs+b']\r\n') - return self._ID - - def SaveToFile(self, filename, canvas): - if hasattr(getattr(filename, "write",None),'__call__'): - myfile = 0 - f = filename - filename = makeFileName(getattr(filename,'name','')) - else : - myfile = 1 - filename = makeFileName(filename) - f = open(filename, "wb") - data = self.GetPDFData(canvas) - if isUnicode(data): - data = data.encode('latin1') - f.write(data) - if myfile: - f.close() - import os - if os.name=='mac': - from reportlab.lib.utils import markfilename - markfilename(filename) # do platform specific file junk - if getattr(canvas,'_verbosity',None): print('saved %s' % (filename,)) - - def GetPDFData(self, canvas): - # realize delayed fonts - for fnt in self.delayedFonts: - fnt.addObjects(self) - # add info stuff to signature - self.info.invariant = self.invariant - self.info.digest(self.signature) - ### later: maybe add more info to sig? - # prepare outline - self.Reference(self.Catalog) - self.Reference(self.info) - outline = self.outline - outline.prepare(self, canvas) - return self.format() - - def inPage(self): - """specify the current object as a page (enables reference binding and other page features)""" - if self.inObject is not None: - if self.inObject=="page": return - raise ValueError("can't go in page already in object %s" % self.inObject) - self.inObject = "page" - - def inForm(self): - """specify that we are in a form xobject (disable page features, etc)""" - # don't need this check anymore since going in a form pushes old context at canvas level. - #if self.inObject not in ["form", None]: - # raise ValueError("can't go in form already in object %s" % self.inObject) - self.inObject = "form" - # don't need to do anything else, I think... - - def getInternalFontName(self, psfontname): - fm = self.fontMapping - if psfontname in fm: - return fm[psfontname] - else: - try: - # does pdfmetrics know about it? if so, add - fontObj = pdfmetrics.getFont(psfontname) - if fontObj._dynamicFont: - raise PDFError("getInternalFontName(%s) called for a dynamic font" % repr(psfontname)) - fontObj.addObjects(self) - #self.addFont(fontObj) - return fm[psfontname] - except KeyError: - raise PDFError("Font %s not known!" % repr(psfontname)) - - def thisPageName(self): - return "Page"+repr(self.pageCounter) - - def thisPageRef(self): - return PDFObjectReference(self.thisPageName()) - - def addPage(self, page): - name = self.thisPageName() - self.Reference(page, name) - self.Pages.addPage(page) - self.pageCounter += 1 - self.inObject = None - - def addForm(self, name, form): - """add a Form XObject.""" - # XXX should check that name is a legal PDF name - if self.inObject != "form": - self.inForm() - self.Reference(form, xObjectName(name)) - self.inObject = None - - def annotationName(self, externalname): - return "Annot.%s"%externalname - - def addAnnotation(self, name, annotation): - self.Reference(annotation, self.annotationName(name)) - - def refAnnotation(self, name): - internalname = self.annotationName(name) - return PDFObjectReference(internalname) - - def addShading(self, shading): - name = "Sh%d" % self.shadingCounter - self.Reference(shading, name) - self.shadingCounter += 1 - return name - - def addColor(self,cmyk): - sname = cmyk.spotName - if not sname: - if cmyk.cyan==0 and cmyk.magenta==0 and cmyk.yellow==0: - sname = 'BLACK' - elif cmyk.black==0 and cmyk.magenta==0 and cmyk.yellow==0: - sname = 'CYAN' - elif cmyk.cyan==0 and cmyk.black==0 and cmyk.yellow==0: - sname = 'MAGENTA' - elif cmyk.cyan==0 and cmyk.magenta==0 and cmyk.black==0: - sname = 'YELLOW' - if not sname: - raise ValueError("CMYK colour %r used without a spotName" % cmyk) - else: - cmyk = cmyk.clone(spotName = sname) - name = PDFName(sname)[1:] - if name not in self.idToObject: - sep = PDFSeparationCMYKColor(cmyk).value() #PDFArray([/Separation /name /DeviceCMYK tint_tf]) - self.Reference(sep,name) - return name,sname - - def setTitle(self, title): - "embeds in PDF file" - if title is None: - self.info.title = '(anonymous)' - else: - self.info.title = title - - def setAuthor(self, author): - "embedded in PDF file" - #allow resetting to clear it - if author is None: - self.info.author = '(anonymous)' - else: - self.info.author = author - - def setSubject(self, subject): - "embeds in PDF file" - - #allow resetting to clear it - if subject is None: - self.info.subject = '(unspecified)' - else: - self.info.subject = subject - - def setCreator(self, creator): - "embeds in PDF file" - - #allow resetting to clear it - if creator is None: - self.info.creator = '(unspecified)' - else: - self.info.creator = creator - - def setKeywords(self, keywords): - "embeds a string containing keywords in PDF file" - - #allow resetting to clear it but ensure it's a string - if keywords is None: - self.info.keywords = '' - else: - self.info.keywords = keywords - - def setDateFormatter(self, dateFormatter): - self.info._dateFormatter = dateFormatter - - def getAvailableFonts(self): - fontnames = list(self.fontMapping.keys()) - # the standard 14 are also always available! (even if not initialized yet) - from reportlab.pdfbase import _fontdata - for name in _fontdata.standardFonts: - if name not in fontnames: - fontnames.append(name) - fontnames.sort() - return fontnames - - def format(self): - # register the Catalog/INfo and then format the objects one by one until exhausted - # (possible infinite loop if there is a bug that continually makes new objects/refs...) - # Prepare encryption - self.encrypt.prepare(self) - cat = self.Catalog - info = self.info - self.Reference(self.Catalog) - self.Reference(self.info) - # register the encryption dictionary if present - encryptref = None - encryptinfo = self.encrypt.info() - if encryptinfo: - encryptref = self.Reference(encryptinfo) - # make std fonts (this could be made optional - counter = 0 # start at first object (object 1 after preincrement) - ids = [] # the collection of object ids in object number order - numbertoid = self.numberToId - idToNV = self.idToObjectNumberAndVersion - idToOb = self.idToObject - idToOf = self.idToOffset - ### note that new entries may be "appended" DURING FORMATTING - done = None - # __accum__ allows objects to know where they are in the file etc etc - self.__accum__ = File = PDFFile(self._pdfVersion) # output collector - while done is None: - counter += 1 # do next object... - if counter in numbertoid: - id = numbertoid[counter] - #printidToOb - obj = idToOb[id] - IO = PDFIndirectObject(id, obj) - # register object number and version - #encrypt.register(id, - IOf = IO.format(self) - # add a comment to the PDF output - if not rl_config.invariant and rl_config.pdfComments: - try: - classname = obj.__class__.__name__ - except: - classname = ascii(obj) - File.add("%% %s: class %s \r\n" % (ascii(id), classname[:50])) - offset = File.add(IOf) - idToOf[id] = offset - ids.append(id) - else: - done = 1 - del self.__accum__ - # sanity checks (must happen AFTER formatting) - lno = len(numbertoid) - if counter-1!=lno: - raise ValueError("counter %s doesn't match number to id dictionary %s" %(counter, lno)) - # now add the xref - xref = PDFCrossReferenceTable() - xref.addsection(0, ids) - xreff = xref.format(self) - xrefoffset = File.add(xreff) - # now add the trailer - trailer = PDFTrailer( - startxref = xrefoffset, - Size = lno+1, - Root = self.Reference(cat), - Info = self.Reference(info), - Encrypt = encryptref, - ID = self.ID(), - ) - trailerf = trailer.format(self) - File.add(trailerf) - for ds in getattr(self,'_digiSigs',[]): - ds.sign(File) - # return string format for pdf file - return File.format(self) - - def hasForm(self, name): - """test for existence of named form""" - internalname = xObjectName(name) - return internalname in self.idToObject - - def getFormBBox(self, name, boxType="MediaBox"): - """get the declared bounding box of the form as a list. - If you specify a different PDF box definition (e.g. the - ArtBox) and it has one, that's what you'll get.""" - internalname = xObjectName(name) - if internalname in self.idToObject: - theform = self.idToObject[internalname] - if hasattr(theform,'_extra_pageCatcher_info'): - return theform._extra_pageCatcher_info[boxType] - if isinstance(theform, PDFFormXObject): - # internally defined form - return theform.BBoxList() - elif isinstance(theform, PDFStream): - # externally defined form - return list(theform.dictionary.dict[boxType].sequence) - else: - raise ValueError("I don't understand the form instance %s" % repr(name)) - - def getXObjectName(self, name): - """Lets canvas find out what form is called internally. - Never mind whether it is defined yet or not.""" - return xObjectName(name) - - def xobjDict(self, formnames): - """construct an xobject dict (for inclusion in a resource dict, usually) - from a list of form names (images not yet supported)""" - D = {} - for name in formnames: - internalname = xObjectName(name) - reference = PDFObjectReference(internalname) - D[internalname] = reference - #print "xobjDict D", D - return PDFDictionary(D) - - def Reference(self, obj, name=None): - ### note references may "grow" during the final formatting pass: don't use d.keys()! - # don't make references to other references, or non instances, unless they are named! - iob = isinstance(obj,PDFObject) - idToObject = self.idToObject - if name is None and (not iob or obj.__class__ is PDFObjectReference): - return obj - if hasattr(obj, __InternalName__): - # already registered - intname = obj.__InternalName__ - if name is not None and name!=intname: - raise ValueError("attempt to reregister object %s with new name %s" % ( - repr(intname), repr(name))) - if intname not in idToObject: - raise ValueError("object of type %s named as %s, but not registered" % (type(obj),ascii(intname))) - return PDFObjectReference(intname) - # otherwise register the new object - objectcounter = self.objectcounter = self.objectcounter+1 - if name is None: - name = "R"+repr(objectcounter) - if name in idToObject: - other = idToObject[name] - if other!=obj: - raise ValueError("redefining named object: "+repr(name)) - return PDFObjectReference(name) - if iob: - obj.__InternalName__ = name - #print "name", name, "counter", objectcounter - self.idToObjectNumberAndVersion[name] = (objectcounter, 0) - self.numberToId[objectcounter] = name - idToObject[name] = obj - return PDFObjectReference(name) - -### chapter 4 Objects -PDFtrue = "true" -PDFfalse = "false" -PDFnull = "null" - -class PDFText(PDFObject): - def __init__(self, t): - self.t = t - def format(self, document): - t = self.t - if isUnicode(t): - t = t.encode('utf-8') - result = binascii.hexlify(document.encrypt.encode(t)) - return b"<" + result + b">" - def __str__(self): - dummydoc = DummyDoc() - return self.format(dummydoc) - -def PDFnumber(n): - return n - -import re -_re_cleanparens=re.compile('[^()]') -del re -def _isbalanced(s): - '''test whether a string is balanced in parens''' - s = _re_cleanparens.sub('',s) - n = 0 - for c in s: - if c=='(': n+=1 - else: - n -= 1 - if n<0: return 0 - return not n and 1 or 0 - -def _checkPdfdoc(utext): - '''return true if no Pdfdoc encoding errors''' - try: - utext.encode('pdfdoc') - return 1 - except UnicodeEncodeError as e: - return 0 - -class PDFString(PDFObject): - def __init__(self, s, escape=1, enc='auto'): - '''s can be unicode/utf8 or a PDFString - if escape is true then the output will be passed through escape - if enc is raw then the string will be left alone - if enc is auto we'll try and automatically adapt to utf_16_be if the - effective string is not entirely in pdfdoc - ''' - if isinstance(s,PDFString): - self.s = s.s - self.escape = s.escape - self.enc = s.enc - else: - self.s = s - self.escape = escape - self.enc = enc - def format(self, document): - s = self.s - enc = getattr(self,'enc','auto') - if (isBytes(s)): - if enc is 'auto': - try: - u = s.decode(s.startswith(codecs.BOM_UTF16_BE) and 'utf16' or 'utf8') - if _checkPdfdoc(u): - s = u.encode('pdfdoc') - else: - s = codecs.BOM_UTF16_BE+u.encode('utf_16_be') - except: - try: - s.decode('pdfdoc') - except: - stderr.write('Error in %s' % (repr(s),)) - raise - elif isUnicode(s): - if enc is 'auto': - if _checkPdfdoc(s): - s = s.encode('pdfdoc') - else: - s = codecs.BOM_UTF16_BE+s.encode('utf_16_be') - else: - s = codecs.BOM_UTF16_BE+s.encode('utf_16_be') - else: - raise ValueError('PDFString argument must be str/unicode not %s' % type(s)) - - escape = getattr(self,'escape',1) - if not isinstance(document.encrypt,NoEncryption): - s = document.encrypt.encode(s) - escape = 1 - if escape: - try: - es = "(%s)" % escapePDF(s) - except: - raise ValueError("cannot escape %s %s" % (s, repr(s))) - if escape&2: - es = es.replace('\\012','\n') - if escape&4 and _isbalanced(es): - es = es.replace('\\(','(').replace('\\)',')') - return pdfdocEnc(es) - else: - return b'(' + s + b')' - - def __str__(self): - return "(%s)" % escapePDF(self.s) - -def PDFName(data,lo=chr(0x21),hi=chr(0x7e)): - # might need to change this to class for encryption - # NOTE: RESULT MUST ALWAYS SUPPORT MEANINGFUL COMPARISONS (EQUALITY) AND HASH - # first convert the name - L = list(data) - for i,c in enumerate(L): - if chi or c in "%()<>{}[]#": - L[i] = "#"+hex(ord(c))[2:] # forget the 0x thing... - return "/"+(''.join(L)) - -class PDFDictionary(PDFObject): - multiline = True - def __init__(self, dict=None): - """dict should be namestring to value eg "a": 122 NOT pdfname to value NOT "/a":122""" - if dict is None: - self.dict = {} - else: - self.dict = dict.copy() - def __setitem__(self, name, value): - self.dict[name] = value - def __getitem__(self, a): - return self.dict[a] - def __contains__(self,a): - return a in self.dict - def Reference(self, name, document): - self.dict[name] = document.Reference(self.dict[name]) - def format(self, document,IND=b'\r\n '): - dict = self.dict - try: - keys = list(dict.keys()) - except: - print(ascii(dict)) - raise - if not isinstance(dict,OrderedDict): keys.sort() - L = [(format(PDFName(k),document)+b" "+format(dict[k],document)) for k in keys] - if self.multiline and rl_config.pdfMultiLine: - L = IND.join(L) - else: - # break up every 6 elements anyway - t=L.insert - for i in reversed(range(6, len(L), 6)): - t(i,b'\r\n ') - L = b" ".join(L) - return b'<< '+L+b' >>' - - def copy(self): - return PDFDictionary(self.dict) - - def normalize(self): - #normalize the names to use RL standard ie Name not /Name - D = self.dict - K = [k for k in D.keys() if k.startswith('/')] - for k in K: - D[k[1:]] = D.pop(k) - -class checkPDFNames: - def __init__(self,*names): - self.names = list(map(PDFName,names)) - def __call__(self,value): - if not value.startswith('/'): - value=PDFName(value) - if value in self.names: - return value - -def checkPDFBoolean(value): - if value in ('true','false'): return value - -class CheckedPDFDictionary(PDFDictionary): - validate = {} - def __init__(self,dict=None,validate=None): - PDFDictionary.__init__(self,dict) - if validate: self.validate = validate - - def __setitem__(self,name,value): - if name not in self.validate: - raise ValueError('invalid key, %r' % name) - cvalue = self.validate[name](value) - if cvalue is None: - raise ValueError('Bad value %r for key %r' % (value,name)) - PDFDictionary.__setitem__(self,name,cvalue) - -class ViewerPreferencesPDFDictionary(CheckedPDFDictionary): - validate=dict( - HideToolbar=checkPDFBoolean, - HideMenubar=checkPDFBoolean, - HideWindowUI=checkPDFBoolean, - FitWindow=checkPDFBoolean, - CenterWindow=checkPDFBoolean, - DisplayDocTitle=checkPDFBoolean, #contributed by mark Erbaugh - NonFullScreenPageMode=checkPDFNames(*'UseNone UseOutlines UseThumbs UseOC'.split()), - Direction=checkPDFNames(*'L2R R2L'.split()), - ViewArea=checkPDFNames(*'MediaBox CropBox BleedBox TrimBox ArtBox'.split()), - ViewClip=checkPDFNames(*'MediaBox CropBox BleedBox TrimBox ArtBox'.split()), - PrintArea=checkPDFNames(*'MediaBox CropBox BleedBox TrimBox ArtBox'.split()), - PrintClip=checkPDFNames(*'MediaBox CropBox BleedBox TrimBox ArtBox'.split()), - PrintScaling=checkPDFNames(*'None AppDefault'.split()), - ) - -# stream filters are objects to support round trip and -# possibly in the future also support parameters -class PDFStreamFilterZCompress: - pdfname = "FlateDecode" - def encode(self, text): - from reportlab.lib.utils import import_zlib - zlib = import_zlib() - if not zlib: raise ImportError("cannot z-compress zlib unavailable") - if isUnicode(text): - text = text.encode('utf8') - return zlib.compress(text) - def decode(self, encoded): - from reportlab.lib.utils import import_zlib - zlib = import_zlib() - if not zlib: raise ImportError("cannot z-decompress zlib unavailable") - return zlib.decompress(encoded) - -# need only one of these, unless we implement parameters later -PDFZCompress = PDFStreamFilterZCompress() - -class PDFStreamFilterBase85Encode: - pdfname = "ASCII85Decode" - def encode(self, text): - from reportlab.pdfbase.pdfutils import _wrap - text = asciiBase85Encode(text) - if rl_config.wrapA85: - text = _wrap(text) - return text - def decode(self, text): - return asciiBase85Decode(text) - -# need only one of these too -PDFBase85Encode = PDFStreamFilterBase85Encode() - -class PDFStream(PDFObject): - '''set dictionary elements explicitly stream.dictionary[name]=value''' - ### compression stuff not implemented yet - __RefOnly__ = 1 # must be at top level - def __init__(self, dictionary=None, content=None, filters=None): - if dictionary is None: - dictionary = PDFDictionary() - self.dictionary = dictionary - self.content = content - self.filters = filters - def format(self, document): - dictionary = self.dictionary - # copy it for modification - dictionary = PDFDictionary(dictionary.dict.copy()) - content = self.content - filters = self.filters - if self.content is None: - raise ValueError("stream content not set") - if filters is None: - filters = document.defaultStreamFilters - # only apply filters if they haven't been applied elsewhere - if filters is not None and "Filter" not in dictionary.dict: - # apply filters in reverse order listed - rf = list(filters) - rf.reverse() - fnames = [] - for f in rf: - #print "*****************content:"; print repr(content[:200]) - #print "*****************filter", f.pdfname - content = f.encode(content) - fnames.insert(0, PDFName(f.pdfname)) - #print "*****************finally:"; print content[:200] - #print "****** FILTERS", fnames - #stop - dictionary["Filter"] = PDFArray(fnames) - # "stream encoding is done after all filters have been applied" - content = document.encrypt.encode(content) - fc = format(content, document) - dictionary["Length"] = len(content) - fd = format(dictionary, document) - return fd+b'\r\nstream\r\n'+fc+b'endstream\r\n' - -def teststream(content=None): - #content = "" # test - if content is None: - content = teststreamcontent - content = content.strip() - content = content.replace("\n", '\n\r') + '\n\r' - S = PDFStream(content = content, - filters=rl_config.useA85 and [PDFBase85Encode,PDFZCompress] or [PDFZCompress]) - # nothing else needed... - S.__Comment__ = "test stream" - return S - -teststreamcontent = """ -1 0 0 1 0 0 cm BT /F9 12 Tf 14.4 TL ET -1.00 0.00 1.00 rg -n 72.00 72.00 432.00 648.00 re B* -""" -class PDFArray(PDFObject): - multiline = True - def __init__(self, sequence): - self.sequence = list(sequence) - def References(self, document): - """make all objects in sequence references""" - self.sequence = list(map(document.Reference, self.sequence)) - def format(self, document, IND=b'\r\n '): - L = [format(e, document) for e in self.sequence] - if self.multiline and rl_config.pdfMultiLine: - L = IND.join(L) - else: - n=len(L) - if n>10: - # break up every 10 elements anyway - t=L.insert - for i in reversed(range(10, n, 10)): - t(i,b'\r\n ') - L = b' '.join(L) - else: - L = b' '.join(L) - return b'[ ' + L + b' ]' - -class PDFArrayCompact(PDFArray): - multiline=False - -class PDFIndirectObject(PDFObject): - __RefOnly__ = 1 - def __init__(self, name, content): - self.name = name - self.content = content - def format(self, document): - name = self.name - n, v = document.idToObjectNumberAndVersion[name] - # set encryption parameters - document.encrypt.register(n, v) - fcontent = format(self.content, document, toplevel=1) # yes this is at top level - return (pdfdocEnc("%s %s obj\r\n"%(n,v)) - +fcontent+ (b'' if fcontent.endswith(b'\r\n') else b'\r\n') - +b'endobj\r\n') - -class PDFObjectReference(PDFObject): - def __init__(self, name): - self.name = name - def format(self, document): - try: - return pdfdocEnc("%s %s R" % document.idToObjectNumberAndVersion[self.name]) - except: - raise KeyError("forward reference to %s not resolved upon final formatting" % repr(self.name)) - -class PDFFile(PDFObject): - ### just accumulates strings: keeps track of current offset - def __init__(self,pdfVersion=PDF_VERSION_DEFAULT): - self.strings = [] - self.write = self.strings.append - self.offset = 0 - ### chapter 5 - # Following Ken Lunde's advice and the PDF spec, this includes - # some high-order bytes. I chose the characters for Tokyo - # in Shift-JIS encoding, as these cannot be mistaken for - # any other encoding, and we'll be able to tell if something - # has run our PDF files through a dodgy Unicode conversion. - self.add((pdfdocEnc("%%PDF-%s.%s" % pdfVersion) + - b'\r\n%\223\214\213\236 ReportLab Generated PDF document http://www.reportlab.com\r\n' - )) - - def closeOrReset(self): - pass - - def add(self, s): - """should be constructed as late as possible, return position where placed""" - s = pdfdocEnc(s) - result = self.offset - self.offset = result+len(s) - self.write(s) - return result - - def format(self, document): - return b''.join(self.strings) - -XREFFMT = '%0.10d %0.5d n' - -class PDFCrossReferenceSubsection(PDFObject): - def __init__(self, firstentrynumber, idsequence): - self.firstentrynumber = firstentrynumber - self.idsequence = idsequence - def format(self, document): - """id sequence should represent contiguous object nums else error. free numbers not supported (yet)""" - firstentrynumber = self.firstentrynumber - idsequence = self.idsequence - entries = list(idsequence) - nentries = len(idsequence) - # special case: object number 0 is always free - taken = {} - if firstentrynumber==0: - taken[0] = "standard free entry" - nentries = nentries+1 - entries.insert(0, "0000000000 65535 f") - idToNV = document.idToObjectNumberAndVersion - idToOffset = document.idToOffset - lastentrynumber = firstentrynumber+nentries-1 - for id in idsequence: - (num, version) = idToNV[id] - if num in taken: - raise ValueError("object number collision %s %s %s" % (num, repr(id), repr(taken[id]))) - if num>lastentrynumber or num -class PDFPageLabels(PDFCatalog): - __comment__ = None - __RefOnly__ = 0 - __Defaults__ = {} - __NoDefault__ = ["Nums"] - __Refs__ = [] - - def __init__(self): - self.labels = [] - - def addPageLabel(self, page, label): - """ Adds a new PDFPageLabel to this catalog. - The 'page' argument, an integer, is the page number in the PDF document - with which the 'label' should be associated. Page numbering in the PDF - starts at zero! Thus, to change the label on the first page, '0' should be - provided as an argument, and to change the 6th page, '5' should be provided - as the argument. - - The 'label' argument should be a PDFPageLabel instance, which describes the - format of the labels starting on page 'page' in the PDF and continuing - until the next encounter of a PDFPageLabel. - - The order in which labels are added is not important. - """ - self.labels.append((page, label)) - - def format(self, document): - self.labels.sort() - labels = [] - for page, label in self.labels: - labels.append(page) - labels.append(label) - - self.Nums = PDFArray(labels) #PDFArray makes a copy with list() - return PDFCatalog.format(self, document) - -class PDFPageLabel(PDFCatalog): - __Comment__ = None - __RefOnly__ = 0 - __Defaults__ = {} - __NoDefault__ = "Type S P St".split() - __convertible__ = 'ARABIC ROMAN_UPPER ROMAN_LOWER LETTERS_UPPER LETTERS_LOWER' - - ARABIC = 'D' - ROMAN_UPPER = 'R' - ROMAN_LOWER = 'r' - LETTERS_UPPER = 'A' - LETTERS_LOWER = 'a' - - def __init__(self, style=None, start=None, prefix=None): - """ - A PDFPageLabel changes the style of page numbering as displayed in a PDF - viewer. PDF page labels have nothing to do with 'physical' page numbers - printed on a canvas, but instead influence the 'logical' page numbers - displayed by PDF viewers. However, when using roman numerals (i, ii, - iii...) or page prefixes for appendecies (A.1, A.2...) on the physical - pages PDF page labels are necessary to change the logical page numbers - displayed by the PDF viewer to match up with the physical numbers. A - PDFPageLabel changes the properties of numbering at the page on which it - appears (see the class 'PDFPageLabels' for specifying where a PDFPageLabel - is associated) and all subsequent pages, until a new PDFPageLabel is - encountered. - - The arguments to this initialiser determine the properties of all - subsequent page labels. 'style' determines the numberings style, arabic, - roman, letters; 'start' specifies the starting number; and 'prefix' any - prefix to be applied to the page numbers. All these arguments can be left - out or set to None. - - * style: - - - None: No numbering, can be used to display the prefix only. - - PDFPageLabel.ARABIC: Use arabic numbers: 1, 2, 3, 4... - - PDFPageLabel.ROMAN_UPPER: Use upper case roman numerals: I, II, III... - - PDFPageLabel.ROMAN_LOWER: Use lower case roman numerals: i, ii, iii... - - PDFPageLabel.LETTERS_UPPER: Use upper case letters: A, B, C, D... - - PDFPageLabel.LETTERS_LOWER: Use lower case letters: a, b, c, d... - - * start: - - - An integer specifying the starting number for this PDFPageLabel. This - can be used when numbering style changes to reset the page number back - to one, ie from roman to arabic, or from arabic to appendecies. Can be - any positive integer or None. I'm not sure what the effect of - specifying None is, probably that page numbering continues with the - current sequence, I'd have to check the spec to clarify though. - - * prefix: - - - A string which is prefixed to the page numbers. Can be used to display - appendecies in the format: A.1, A.2, ..., B.1, B.2, ... where a - PDFPageLabel is used to set the properties for the first page of each - appendix to restart the page numbering at one and set the prefix to the - appropriate letter for current appendix. The prefix can also be used to - display text only, if the 'style' is set to None. This can be used to - display strings such as 'Front', 'Back', or 'Cover' for the covers on - books. - - """ - if style: - if style.upper() in self.__convertible__: style = getattr(self,style.upper()) - self.S = PDFName(style) - if start: self.St = PDFnumber(start) - if prefix: self.P = PDFString(prefix) -#ends code contributed by Christian Jacobs - -def testpage(document): - P = PDFPage() - P.Contents = teststream() - pages = document.Pages - P.Parent = document.Reference(pages) - P.MediaBox = PDFArray([0, 0, 595, 841]) - resources = PDFResourceDictionary() - resources.allProcs() # enable all procsets - resources.basicFonts() - P.Resources = resources - pages.addPage(P) - -#### DUMMY OUTLINES IMPLEMENTATION FOR testing -DUMMYOUTLINE = """ -<< - /Count - 0 - /Type - /Outlines ->>""" - -class PDFOutlines0(PDFObject): - __Comment__ = "TEST OUTLINE!" - text = DUMMYOUTLINE.replace("\n", '\r\n') - __RefOnly__ = 1 - def format(self, document): - return pdfdocEnc(self.text) - -class OutlineEntryObject(PDFObject): - "an entry in an outline" - Title = Dest = Parent = Prev = Next = First = Last = Count = None - def format(self, document): - D = {} - D["Title"] = PDFString(self.Title) - D["Parent"] = self.Parent - D["Dest"] = self.Dest - for n in ("Prev", "Next", "First", "Last", "Count"): - v = getattr(self, n) - if v is not None: - D[n] = v - PD = PDFDictionary(D) - return PD.format(document) - -class PDFOutlines(PDFObject): - """ - takes a recursive list of outline destinations like:: - - out = PDFOutline1() - out.setNames(canvas, # requires canvas for name resolution - "chapter1dest", - ("chapter2dest", - ["chapter2section1dest", - "chapter2section2dest", - "chapter2conclusiondest"] - ), # end of chapter2 description - "chapter3dest", - ("chapter4dest", ["c4s1", "c4s2"]) - ) - - Higher layers may build this structure incrementally. KISS at base level. - """ - # first attempt, many possible features missing. - #no init for now - mydestinations = ready = None - counter = 0 - currentlevel = -1 # ie, no levels yet - - def __init__(self): - self.destinationnamestotitles = {} - self.destinationstotitles = {} - self.levelstack = [] - self.buildtree = [] - self.closedict = {} # dictionary of "closed" destinations in the outline - - def addOutlineEntry(self, destinationname, level=0, title=None, closed=None): - """destinationname of None means "close the tree" """ - if destinationname is None and level!=0: - raise ValueError("close tree must have level of 0") - if not isinstance(level,int): raise ValueError("level must be integer, got %s" % type(level)) - if level<0: raise ValueError("negative levels not allowed") - if title is None: title = destinationname - currentlevel = self.currentlevel - stack = self.levelstack - tree = self.buildtree - # adjust currentlevel and stack to match level - if level>currentlevel: - if level>currentlevel+1: - raise ValueError("can't jump from outline level %s to level %s, need intermediates (destinationname=%r, title=%r)" %(currentlevel, level, destinationname, title)) - level = currentlevel = currentlevel+1 - stack.append([]) - while levelref - if isSeq(object): - L = [] - for o in object: - L.append(self.translateNames(canvas, o)) - if isinstance(object,tuple): - return tuple(L) - return L - # bug contributed by Benjamin Dumke - raise TypeError("in outline, destination name must be string: got a %s"%type(object)) - - def prepare(self, document, canvas): - """prepare all data structures required for save operation (create related objects)""" - if self.mydestinations is None: - if self.levelstack: - self.addOutlineEntry(None) # close the tree - destnames = self.levelstack[0] - #from pprint import pprint; pprint(destnames); stop - self.mydestinations = self.translateNames(canvas, destnames) - else: - self.first = self.last = None - self.count = 0 - self.ready = 1 - return - #self.first = document.objectReference("Outline.First") - #self.last = document.objectReference("Outline.Last") - # XXXX this needs to be generalized for closed entries! - self.count = count(self.mydestinations, self.closedict) - (self.first, self.last) = self.maketree(document, self.mydestinations, toplevel=1) - self.ready = 1 - - def maketree(self, document, destinationtree, Parent=None, toplevel=0): - if toplevel: - levelname = "Outline" - Parent = document.Reference(document.Outlines) - else: - self.count = self.count+1 - levelname = "Outline.%s" % self.count - if Parent is None: - raise ValueError("non-top level outline elt parent must be specified") - if not isSeq(destinationtree): - raise ValueError("destinationtree must be list or tuple, got %s") - nelts = len(destinationtree) - lastindex = nelts-1 - lastelt = firstref = lastref = None - destinationnamestotitles = self.destinationnamestotitles - closedict = self.closedict - for index in range(nelts): - eltobj = OutlineEntryObject() - eltobj.Parent = Parent - eltname = "%s.%s" % (levelname, index) - eltref = document.Reference(eltobj, eltname) - #document.add(eltname, eltobj) - if lastelt is not None: - lastelt.Next = eltref - eltobj.Prev = lastref - if firstref is None: - firstref = eltref - lastref = eltref - lastelt = eltobj # advance eltobj - lastref = eltref - elt = destinationtree[index] - if isinstance(elt,dict): - # simple leaf {name: dest} - leafdict = elt - elif isinstance(elt,tuple): - # leaf with subsections: ({name: ref}, subsections) XXXX should clean up (see count(...)) - try: - (leafdict, subsections) = elt - except: - raise ValueError("destination tree elt tuple should have two elts, got %s" % len(elt)) - eltobj.Count = count(subsections, closedict) - (eltobj.First, eltobj.Last) = self.maketree(document, subsections, eltref) - else: - raise ValueError("destination tree elt should be dict or tuple, got %s" % type(elt)) - try: - [(Title, Dest)] = list(leafdict.items()) - except: - raise ValueError("bad outline leaf dictionary, should have one entry "+bytestr(elt)) - eltobj.Title = destinationnamestotitles[Title] - eltobj.Dest = Dest - if isinstance(elt,tuple) and Dest in closedict: - # closed subsection, count should be negative - eltobj.Count = -eltobj.Count - return (firstref, lastref) - -def count(tree, closedict=None): - """utility for outline: recursively count leaves in a tuple/list tree""" - from operator import add - if isinstance(tree,tuple): - # leaf with subsections XXXX should clean up this structural usage - (leafdict, subsections) = tree - [(Title, Dest)] = list(leafdict.items()) - if closedict and Dest in closedict: - return 1 # closed tree element - if isSeq(tree): - #return reduce(add, map(count, tree)) - counts = [] - for e in tree: - counts.append(count(e, closedict)) - return sum(counts) #used to be: return reduce(add, counts) - return 1 - -class PDFInfo(PDFObject): - """PDF documents can have basic information embedded, viewable from - File | Document Info in Acrobat Reader. If this is wrong, you get - Postscript errors while printing, even though it does not print.""" - producer = "ReportLab PDF Library - www.reportlab.com" - creator = "ReportLab PDF Library - www.reportlab.com" - title = "untitled" - author = "anonymous" - subject = "unspecified" - keywords = "" - _dateFormatter = None - - def __init__(self): - self.invariant = rl_config.invariant - - def digest(self, md5object): - # add self information to signature - for x in (self.title, self.author, self.subject, self.keywords): - md5object.update(bytestr(x)) - - def format(self, document): - D = {} - D["Title"] = PDFString(self.title) - D["Author"] = PDFString(self.author) - D["CreationDate"] = PDFDate(invariant=self.invariant,dateFormatter=self._dateFormatter) - D["Producer"] = PDFString(self.producer) - D["Creator"] = PDFString(self.creator) - D["Subject"] = PDFString(self.subject) - D["Keywords"] = PDFString(self.keywords) - - PD = PDFDictionary(D) - return PD.format(document) - - def copy(self): - "shallow copy - useful in pagecatchering" - thing = self.__klass__() - for k, v in self.__dict__.items(): - setattr(thing, k, v) - return thing -# skipping thumbnails, etc - -class Annotation(PDFObject): - """superclass for all annotations.""" - defaults = [("Type", PDFName("Annot"),)] - required = ("Type", "Rect", "Contents", "Subtype") - permitted = required+( - "Border", "C", "T", "M", "F", "H", "BS", "AA", "AS", "Popup", "P", "AP") - def cvtdict(self, d, escape=1): - """transform dict args from python form to pdf string rep as needed""" - Rect = d["Rect"] - if not isStr(Rect): - d["Rect"] = PDFArray(Rect) - d["Contents"] = PDFString(d["Contents"],escape) - return d - def AnnotationDict(self, **kw): - if 'escape' in kw: - escape = kw['escape'] - del kw['escape'] - else: - escape = 1 - d = {} - for (name,val) in self.defaults: - d[name] = val - d.update(kw) - for name in self.required: - if name not in d: - raise ValueError("keyword argument %s missing" % name) - d = self.cvtdict(d,escape=escape) - permitted = self.permitted - for name in d.keys(): - if name not in permitted: - raise ValueError("bad annotation dictionary name %s" % name) - return PDFDictionary(d) - def Dict(self): - raise ValueError("DictString undefined for virtual superclass Annotation, must overload") - # but usually - #return self.AnnotationDict(self, Rect=(a,b,c,d)) or whatever - def format(self, document): - D = self.Dict() - return D.format(document) - -class TextAnnotation(Annotation): - permitted = Annotation.permitted + ( - "Open", "Name") - def __init__(self, Rect, Contents, **kw): - self.Rect = Rect - self.Contents = Contents - self.otherkw = kw - def Dict(self): - d = {} - d.update(self.otherkw) - d["Rect"] = self.Rect - d["Contents"] = self.Contents - d["Subtype"] = "/Text" - return self.AnnotationDict(**d) - -class FreeTextAnnotation(Annotation): - permitted = Annotation.permitted + ("DA",) - def __init__(self, Rect, Contents, DA, **kw): - self.Rect = Rect - self.Contents = Contents - self.DA = DA - self.otherkw = kw - def Dict(self): - d = {} - d.update(self.otherkw) - d["Rect"] = self.Rect - d["Contents"] = self.Contents - d["DA"] = self.DA - d["Subtype"] = "/FreeText" - return self.AnnotationDict(**d) - -class LinkAnnotation(Annotation): - - permitted = Annotation.permitted + ( - "Dest", "A", "PA") - def __init__(self, Rect, Contents, Destination, Border="[0 0 1]", **kw): - self.Border = Border - self.Rect = Rect - self.Contents = Contents - self.Destination = Destination - self.otherkw = kw - - def dummyDictString(self): # old, testing - return """ - << /Type /Annot /Subtype /Link /Rect [71 717 190 734] /Border [16 16 1] - /Dest [23 0 R /Fit] >> - """ - - def Dict(self): - d = {} - d.update(self.otherkw) - d["Border"] = self.Border - d["Rect"] = self.Rect - d["Contents"] = self.Contents - d["Subtype"] = "/Link" - d["Dest"] = self.Destination - return self.AnnotationDict(**d) - -class HighlightAnnotation(Annotation): - """ - HighlightAnnotation is an annotation that highlights the selected area. - - Rect is the mouseover area that will show the contents. - - QuadPoints is a list of points to highlight, you can have many groups of - four QuadPoints to allow highlighting many lines. - """ - permitted = Annotation.permitted + ("QuadPoints", ) - - def __init__(self, Rect, Contents, QuadPoints, Color=[0.83, 0.89, 0.95], **kw): - self.Rect = Rect - self.Contents = Contents - self.otherkw = kw - self.QuadPoints = QuadPoints - self.Color = Color - - def cvtdict(self, d, escape=1): - """transform dict args from python form to pdf string rep as needed""" - Rect = d["Rect"] - Quad = d["QuadPoints"] - Color = d["C"] - if not isinstance(Rect, str): - d["Rect"] = PDFArray(Rect).format(d, IND=b" ") - if not isinstance(Quad, str): - d["QuadPoints"] = PDFArray(Quad).format(d, IND=b" ") - if not isinstance(Color, str): - d["C"] = PDFArray(Color).format(d, IND=b" ") - d["Contents"] = PDFString(d["Contents"], escape) - return d - - def Dict(self): - d = {} - d.update(self.otherkw) - d["Rect"] = self.Rect - d["Contents"] = self.Contents - d["Subtype"] = "/Highlight" - d["QuadPoints"] = self.QuadPoints - d["C"] = self.Color - return self.AnnotationDict(**d) - - -def rect_to_quad(Rect): - """ - Utility method to convert a Rect to a QuadPoint - """ - return [Rect[0], Rect[1], Rect[2], Rect[1], - Rect[0], Rect[3], Rect[2], Rect[3]] - -# skipping names tree -# skipping actions -# skipping names trees -# skipping to chapter 7 - -class PDFRectangle(PDFObject): - def __init__(self, llx, lly, urx, ury): - self.llx, self.lly, self.ulx, self.ury = llx, lly, urx, ury - def format(self, document): - A = PDFArray([self.llx, self.lly, self.ulx, self.ury]) - return format(A, document) - -_NOWT=None -def _getTimeStamp(): - global _NOWT - if not _NOWT: - import time - _NOWT = time.time() - return _NOWT - -class PDFDate(PDFObject): - # gmt offset now suppported properly - def __init__(self, invariant=rl_config.invariant, dateFormatter=None): - if invariant: - now = (2000,1,1,0,0,0,0) - self.dhh = 0 - self.dmm = 0 - else: - import time - now = tuple(time.localtime(_getTimeStamp())[:6]) - from time import timezone - self.dhh = int(timezone / (3600.0)) - self.dmm = (timezone % 3600) % 60 - self.date = now[:6] - self.dateFormatter = dateFormatter - - def format(self, doc): - dfmt = self.dateFormatter or ( - lambda yyyy,mm,dd,hh,m,s: - "D:%04d%02d%02d%02d%02d%02d%+03d'%02d'" - % (yyyy,mm,dd,hh,m,s,self.dhh,self.dmm)) - return format(PDFString(dfmt(*self.date)), doc) - -class Destination(PDFObject): - """ - - not a PDFObject! This is a placeholder that can delegates - to a pdf object only after it has been defined by the methods - below. - - EG a Destination can refer to Appendix A before it has been - defined, but only if Appendix A is explicitly noted as a destination - and resolved before the document is generated... - - For example the following sequence causes resolution before doc generation. - d = Destination() - d.fit() # or other format defining method call - d.setPage(p) - (at present setPageRef is called on generation of the page). - """ - representation = format = page = None - def __init__(self,name): - self.name = name - self.fmt = self.page = None - def format(self, document): - f = self.fmt - if f is None: raise ValueError("format not resolved %s" % self.name) - p = self.page - if p is None: raise ValueError("Page reference unbound %s" % self.name) - f.page = p - return f.format(document) - def xyz(self, left, top, zoom): # see pdfspec mar 11 99 pp184+ - self.fmt = PDFDestinationXYZ(None, left, top, zoom) - def fit(self): - self.fmt = PDFDestinationFit(None) - def fitb(self): - self.fmt = PDFDestinationFitB(None) - def fith(self, top): - self.fmt = PDFDestinationFitH(None,top) - def fitv(self, left): - self.fmt = PDFDestinationFitV(None, left) - def fitbh(self, top): - self.fmt = PDFDestinationFitBH(None, top) - def fitbv(self, left): - self.fmt = PDFDestinationFitBV(None, left) - def fitr(self, left, bottom, right, top): - self.fmt = PDFDestinationFitR(None, left, bottom, right, top) - def setPage(self, page): - self.page = page - #self.fmt.page = page # may not yet be defined! - -class PDFDestinationXYZ(PDFObject): - typename = "XYZ" - def __init__(self, page, left, top, zoom): - self.page = page - self.top = top - self.zoom = zoom - self.left = left - def format(self, document): - pageref = document.Reference(self.page) - A = PDFArray( [ pageref, PDFName(self.typename), self.left, self.top, self.zoom ] ) - return format(A, document) - -class PDFDestinationFit(PDFObject): - typename = "Fit" - def __init__(self, page): - self.page = page - def format(self, document): - pageref = document.Reference(self.page) - A = PDFArray( [ pageref, PDFName(self.typename) ] ) - return format(A, document) - -class PDFDestinationFitB(PDFDestinationFit): - typename = "FitB" - -class PDFDestinationFitH(PDFObject): - typename = "FitH" - def __init__(self, page, top): - self.page = page; self.top=top - def format(self, document): - pageref = document.Reference(self.page) - A = PDFArray( [ pageref, PDFName(self.typename), self.top ] ) - return format(A, document) - -class PDFDestinationFitBH(PDFDestinationFitH): - typename = "FitBH" - -class PDFDestinationFitV(PDFObject): - typename = "FitV" - def __init__(self, page, left): - self.page = page; self.left=left - def format(self, document): - pageref = document.Reference(self.page) - A = PDFArray( [ pageref, PDFName(self.typename), self.left ] ) - return format(A, document) - -class PDFDestinationFitBV(PDFDestinationFitV): - typename = "FitBV" - -class PDFDestinationFitR(PDFObject): - typename = "FitR" - def __init__(self, page, left, bottom, right, top): - self.page = page; self.left=left; self.bottom=bottom; self.right=right; self.top=top - def format(self, document): - pageref = document.Reference(self.page) - A = PDFArray( [ pageref, PDFName(self.typename), self.left, self.bottom, self.right, self.top] ) - return format(A, document) - -# named destinations need nothing - -# skipping filespecs - -class PDFResourceDictionary(PDFObject): - """each element *could* be reset to a reference if desired""" - def __init__(self): - self.ColorSpace = {} - self.XObject = {} - self.ExtGState = {} - self.Font = {} - self.Pattern = {} - self.ProcSet = [] - self.Properties = {} - self.Shading = {} - # ?by default define the basicprocs - self.basicProcs() - stdprocs = [PDFName(s) for s in "PDF Text ImageB ImageC ImageI".split()] - dict_attributes = ("ColorSpace", "XObject", "ExtGState", "Font", "Pattern", "Properties", "Shading") - - def allProcs(self): - # define all standard procsets - self.ProcSet = self.stdprocs - - def basicProcs(self): - self.ProcSet = self.stdprocs[:2] # just PDF and Text - - def basicFonts(self): - self.Font = PDFObjectReference(BasicFonts) - - def setColorSpace(self,colorsUsed): - for c,s in colorsUsed.items(): - self.ColorSpace[s] = PDFObjectReference(c) - - def setShading(self,shadingUsed): - for c,s in shadingUsed.items(): - self.Shading[s] = PDFObjectReference(c) - - def format(self, document): - D = {} - for dname in self.dict_attributes: - v = getattr(self, dname) - if isinstance(v,dict): - if v: - dv = PDFDictionary(v) - D[dname] = dv - else: - D[dname] = v - v = self.ProcSet - dname = "ProcSet" - if isSeq(v): - if v: - dv = PDFArray(v) - D[dname] = dv - else: - D[dname] = v - DD = PDFDictionary(D) - return format(DD, document) - -############################################################################## -# -# Font objects - the PDFDocument.addFont() method knows which of these -# to construct when given a user-facing Font object -# -############################################################################## -class PDFType1Font(PDFObject): - """no init: set attributes explicitly""" - __RefOnly__ = 1 - # note! /Name appears to be an undocumented attribute.... - name_attributes = "Type Subtype BaseFont Name".split() - Type = "Font" - Subtype = "Type1" - # these attributes are assumed to already be of the right type - local_attributes = "FirstChar LastChar Widths Encoding ToUnicode FontDescriptor".split() - def format(self, document): - D = {} - for name in self.name_attributes: - if hasattr(self, name): - value = getattr(self, name) - D[name] = PDFName(value) - for name in self.local_attributes: - if hasattr(self, name): - value = getattr(self, name) - D[name] = value - #print D - PD = PDFDictionary(D) - return PD.format(document) - -## These attribute listings will be useful in future, even if we -## put them elsewhere - -class PDFTrueTypeFont(PDFType1Font): - Subtype = "TrueType" - #local_attributes = "FirstChar LastChar Widths Encoding ToUnicode FontDescriptor".split() #same - -##class PDFMMType1Font(PDFType1Font): -## Subtype = "MMType1" -## -##class PDFType3Font(PDFType1Font): -## Subtype = "Type3" -## local_attributes = "FirstChar LastChar Widths CharProcs FontBBox FontMatrix Resources Encoding".split() -## -##class PDFType0Font(PDFType1Font): -## Subtype = "Type0" -## local_attributes = "DescendantFonts Encoding".split( -## -##class PDFCIDFontType0(PDFType1Font): -## Subtype = "CIDFontType0" -## local_attributes = "CIDSystemInfo FontDescriptor DW W DW2 W2 Registry Ordering Supplement".split() -## -##class PDFCIDFontType0(PDFType1Font): -## Subtype = "CIDFontType2" -## local_attributes = "BaseFont CIDToGIDMap CIDSystemInfo FontDescriptor DW W DW2 W2".split() -## -##class PDFEncoding(PDFType1Font): -## Type = "Encoding" -## name_attributes = "Type BaseEncoding".split() -## # these attributes are assumed to already be of the right type -## local_attributes = ["Differences"] -## - -# UGLY ALERT - this needs turning into something O-O, it was hacked -# across from the pdfmetrics.Encoding class to avoid circularity - -# skipping CMaps - -class PDFFormXObject(PDFObject): - # like page requires .info set by some higher level (doc) - # XXXX any resource used in a form must be propagated up to the page that (recursively) uses - # the form!! (not implemented yet). - XObjects = Annots = BBox = Matrix = Contents = stream = Resources = None - hasImages = 1 # probably should change - compression = 0 - def __init__(self, lowerx, lowery, upperx, uppery): - #not done - self.lowerx = lowerx; self.lowery=lowery; self.upperx=upperx; self.uppery=uppery - - def setStreamList(self, data): - if isSeq(data): - data = '\r\n'.join(data) - self.stream = pdfdocEnc(data) - - def BBoxList(self): - "get the declared bounding box for the form as a list" - if self.BBox: - return list(self.BBox.sequence) - else: - return [self.lowerx, self.lowery, self.upperx, self.uppery] - - def format(self, document): - self.BBox = self.BBox or PDFArray([self.lowerx, self.lowery, self.upperx, self.uppery]) - self.Matrix = self.Matrix or PDFArray([1, 0, 0, 1, 0, 0]) - if not self.Annots: - self.Annots = None - else: - #these must be transferred to the page when the form is used - raise ValueError("annotations don't work in PDFFormXObjects yet") - if not self.Contents: - stream = self.stream - if not stream: - self.Contents = teststream() - else: - S = PDFStream() - S.content = stream - # need to add filter stuff (?) - S.__Comment__ = "xobject form stream" - self.Contents = S - if not self.Resources: - resources = PDFResourceDictionary() - # fonts! - resources.basicFonts() - if self.hasImages: - resources.allProcs() - else: - resources.basicProcs() - if self.XObjects: - #print "XObjects", self.XObjects.dict - resources.XObject = self.XObjects - self.Resources=resources - if self.compression: - self.Contents.filters = rl_config.useA85 and [PDFBase85Encode, PDFZCompress] or [PDFZCompress] - sdict = self.Contents.dictionary - sdict["Type"] = PDFName("XObject") - sdict["Subtype"] = PDFName("Form") - sdict["FormType"] = 1 - sdict["BBox"] = self.BBox - sdict["Matrix"] = self.Matrix - sdict["Resources"] = self.Resources - return self.Contents.format(document) - -class PDFPostScriptXObject(PDFObject): - "For embedding PD (e.g. tray commands) in PDF" - def __init__(self, content=None): - self.content = content - - def format(self, document): - S = PDFStream() - S.content = self.content - S.__Comment__ = "xobject postscript stream" - sdict = S.dictionary - sdict["Type"] = PDFName("XObject") - sdict["Subtype"] = PDFName("PS") - return S.format(document) - -_mode2CS={'RGB':'DeviceRGB', 'L':'DeviceGray', 'CMYK':'DeviceCMYK'} -class PDFImageXObject(PDFObject): - # first attempts at a hard-coded one - # in the file, Image XObjects are stream objects. We already - # have a PDFStream object with 3 attributes: dictionary, content - # and filters. So the job of this thing is to construct the - # right PDFStream instance and ask it to format itself. - def __init__(self, name, source=None, mask=None): - self.name = name - self.width = 24 - self.height = 23 - self.bitsPerComponent = 1 - self.colorSpace = 'DeviceGray' - self._filters = rl_config.useA85 and ('ASCII85Decode',) or () - self.streamContent = """ - 003B00 002700 002480 0E4940 114920 14B220 3CB650 - 75FE88 17FF8C 175F14 1C07E2 3803C4 703182 F8EDFC - B2BBC2 BB6F84 31BFC2 18EA3C 0E3E00 07FC00 03F800 - 1E1800 1FF800> - """ - self.mask = mask - - if source is None: - pass # use the canned one. - elif hasattr(source,'jpeg_fh'): - self.loadImageFromSRC(source) #it is already a PIL Image - else: - # it is a filename - import os - ext = os.path.splitext(source)[1].lower() - src = open_for_read(source) - if not(ext in ('.jpg', '.jpeg') and self.loadImageFromJPEG(src)): - if rl_config.useA85: - self.loadImageFromA85(src) - else: - self.loadImageFromRaw(src) - - def loadImageFromA85(self,source): - IMG=[] - imagedata = [s.strip() for s in pdfutils.makeA85Image(source,IMG=IMG)] - words = imagedata[1].split() - self.width, self.height = (int(words[1]),int(words[3])) - self.colorSpace = {'/RGB':'DeviceRGB', '/G':'DeviceGray', '/CMYK':'DeviceCMYK'}[words[7]] - self.bitsPerComponent = 8 - self._filters = 'ASCII85Decode','FlateDecode' #'A85','Fl' - if IMG: self._checkTransparency(IMG[0]) - elif self.mask=='auto': self.mask = None - self.streamContent = ''.join(imagedata[3:-1]) - - def loadImageFromJPEG(self,imageFile): - try: - try: - info = pdfutils.readJPEGInfo(imageFile) - finally: - imageFile.seek(0) #reset file pointer - except: - return False - self.width, self.height = info[0], info[1] - self.bitsPerComponent = 8 - if info[2] == 1: - self.colorSpace = 'DeviceGray' - elif info[2] == 3: - self.colorSpace = 'DeviceRGB' - else: #maybe should generate an error, is this right for CMYK? - self.colorSpace = 'DeviceCMYK' - self._dotrans = 1 - self.streamContent = imageFile.read() - if rl_config.useA85: - self.streamContent = asciiBase85Encode(self.streamContent) - self._filters = 'ASCII85Decode','DCTDecode' #'A85','DCT' - else: - self._filters = 'DCTDecode', #'DCT' - self.mask = None - return True - - def loadImageFromRaw(self,source): - IMG=[] - imagedata = pdfutils.makeRawImage(source,IMG=IMG) - words = imagedata[1].split() - self.width = int(words[1]) - self.height = int(words[3]) - self.colorSpace = {'/RGB':'DeviceRGB', '/G':'DeviceGray', '/CMYK':'DeviceCMYK'}[words[7]] - self.bitsPerComponent = 8 - self._filters = 'FlateDecode', #'Fl' - if IMG: self._checkTransparency(IMG[0]) - elif self.mask=='auto': self.mask = None - self.streamContent = ''.join(imagedata[3:-1]) - - def _checkTransparency(self,im): - if self.mask=='auto': - if im._dataA: - self.mask = None - self._smask = PDFImageXObject(_digester(im._dataA.getRGBData()),im._dataA,mask=None) - self._smask._decode = [0,1] - else: - tc = im.getTransparent() - if tc: - self.mask = (tc[0], tc[0], tc[1], tc[1], tc[2], tc[2]) - else: - self.mask = None - elif hasattr(self.mask,'rgb'): - _ = self.mask.rgb() - self.mask = _[0],_[0],_[1],_[1],_[2],_[2] - - def loadImageFromSRC(self, im): - "Extracts the stream, width and height" - fp = im.jpeg_fh() - if fp: - self.loadImageFromJPEG(fp) - else: - zlib = import_zlib() - if not zlib: return - self.width, self.height = im.getSize() - raw = im.getRGBData() - #assert len(raw) == self.width*self.height, "Wrong amount of data for image expected %sx%s=%s got %s" % (self.width,self.height,self.width*self.height,len(raw)) - self.streamContent = zlib.compress(raw) - if rl_config.useA85: - self.streamContent = asciiBase85Encode(self.streamContent) - self._filters = 'ASCII85Decode','FlateDecode' #'A85','Fl' - else: - self._filters = 'FlateDecode', #'Fl' - self.colorSpace= _mode2CS[im.mode] - self.bitsPerComponent = 8 - self._checkTransparency(im) - - def format(self, document): - S = PDFStream(content = self.streamContent) - dict = S.dictionary - dict["Type"] = PDFName("XObject") - dict["Subtype"] = PDFName("Image") - dict["Width"] = self.width - dict["Height"] = self.height - dict["BitsPerComponent"] = self.bitsPerComponent - dict["ColorSpace"] = PDFName(self.colorSpace) - if self.colorSpace=='DeviceCMYK' and getattr(self,'_dotrans',0): - dict["Decode"] = PDFArray([1,0,1,0,1,0,1,0]) - elif getattr(self,'_decode',None): - dict["Decode"] = PDFArray(self._decode) - dict["Filter"] = PDFArray(map(PDFName,self._filters)) - dict["Length"] = len(self.streamContent) - if self.mask: dict["Mask"] = PDFArray(self.mask) - if getattr(self,'smask',None): dict["SMask"] = self.smask - return S.format(document) - -class PDFSeparationCMYKColor: - def __init__(self, cmyk): - from reportlab.lib.colors import CMYKColor - if not isinstance(cmyk,CMYKColor): - raise ValueError('%s needs a CMYKColor argument' % self.__class__.__name__) - elif not cmyk.spotName: - raise ValueError('%s needs a CMYKColor argument with a spotName' % self.__class__.__name__) - self.cmyk = cmyk - - def _makeFuncPS(self): - '''create the postscript code for the tint transfer function - effectively this is tint*c, tint*y, ... tint*k''' - R = [].append - for i,v in enumerate(self.cmyk.cmyk()): - v=float(v) - if i==3: - if v==0.0: - R('pop') - R('0.0') - else: - R(str(v)) - R('mul') - else: - if v==0: - R('0.0') - else: - R('dup') - R(str(v)) - R('mul') - R('exch') - return '{%s}' % (' '.join(R.__self__)) - - def value(self): - return PDFArrayCompact(( - PDFName('Separation'), - PDFName(self.cmyk.spotName), - PDFName('DeviceCMYK'), - PDFStream( - dictionary=PDFDictionary(dict( - FunctionType=4, - Domain=PDFArrayCompact((0,1)), - Range=PDFArrayCompact((0,1,0,1,0,1,0,1)) - )), - content=self._makeFuncPS(), - filters=None,#[PDFBase85Encode, PDFZCompress], - ) - )) - -class PDFFunction(PDFObject): - """superclass for all function types.""" - defaults = [] - required = ("FunctionType", "Domain") - permitted = required+("Range",) - def FunctionDict(self, **kw): - d = {} - for (name,val) in self.defaults: - d[name] = val - d.update(kw) - for name in self.required: - if name not in d: - raise ValueError("keyword argument %s missing" % name) - permitted = self.permitted - for name in d.keys(): - if name not in permitted: - raise ValueError("bad annotation dictionary name %s" % name) - return PDFDictionary(d) - - def Dict(self, document): - raise ValueError("Dict undefined for virtual superclass PDFShading, must overload") - # but usually - #return self.FunctionDict(self, ...) - - def format(self, document): - D = self.Dict(document) - return D.format(document) - -class PDFExponentialFunction(PDFFunction): - defaults = PDFFunction.defaults + [("Domain", PDFArrayCompact((0.0, 1.0)))] - required = PDFFunction.required + ("N",) - permitted = PDFFunction.permitted + ("C0", "C1", "N") - def __init__(self, C0, C1, N, **kw): - self.C0 = C0 - self.C1 = C1 - self.N = N - self.otherkw = kw - def Dict(self, document): - d = {} - d.update(self.otherkw) - d["FunctionType"] = 2 - d["C0"] = PDFArrayCompact(self.C0) - d["C1"] = PDFArrayCompact(self.C1) - d["N"] = self.N - return self.FunctionDict(**d) - -class PDFStitchingFunction(PDFFunction): - required = PDFFunction.required + ("Functions", "Bounds", "Encode") - permitted = PDFFunction.permitted + ("Functions", "Bounds", "Encode") - def __init__(self, Functions, Bounds, Encode, **kw): - self.Functions = Functions - self.Bounds = Bounds - self.Encode = Encode - self.otherkw = kw - def Dict(self, document): - d = {} - d.update(self.otherkw) - d["FunctionType"] = 3 - d["Functions"] = PDFArray([document.Reference(x) for x in self.Functions]) - d["Bounds"] = PDFArray(self.Bounds) - d["Encode"] = PDFArray(self.Encode) - return self.FunctionDict(**d) - -class PDFShading(PDFObject): - """superclass for all shading types.""" - required = ("ShadingType", "ColorSpace") - permitted = required+("Background", "BBox", "AntiAlias") - def ShadingDict(self, **kw): - d = {} - d.update(kw) - for name in self.required: - if name not in d: - raise ValueError("keyword argument %s missing" % name) - permitted = self.permitted - for name in d.keys(): - if name not in permitted: - raise ValueError("bad annotation dictionary name %s" % name) - return PDFDictionary(d) - - def Dict(self, document): - raise ValueError("Dict undefined for virtual superclass PDFShading, must overload") - # but usually - #return self.ShadingDict(self, ...) - - def format(self, document): - D = self.Dict(document) - return D.format(document) - -class PDFFunctionShading(PDFShading): - required = PDFShading.required + ("Function",) - permitted = PDFShading.permitted + ("Domain", "Matrix", "Function") - def __init__(self, Function, ColorSpace, **kw): - self.Function = Function - self.ColorSpace = ColorSpace - self.otherkw = kw - def Dict(self, document): - d = {} - d.update(self.otherkw) - d["ShadingType"] = 1 - d["ColorSpace"] = PDFName(self.ColorSpace) - d["Function"] = document.Reference(self.Function) - return self.ShadingDict(**d) - -class PDFAxialShading(PDFShading): - required = PDFShading.required + ("Coords", "Function") - permitted = PDFShading.permitted + ( - "Coords", "Domain", "Function", "Extend") - def __init__(self, x0, y0, x1, y1, Function, ColorSpace, **kw): - self.Coords = (x0, y0, x1, y1) - self.Function = Function - self.ColorSpace = ColorSpace - self.otherkw = kw - def Dict(self, document): - d = {} - d.update(self.otherkw) - d["ShadingType"] = 2 - d["ColorSpace"] = PDFName(self.ColorSpace) - d["Coords"] = PDFArrayCompact(self.Coords) - d["Function"] = document.Reference(self.Function) - return self.ShadingDict(**d) - -class PDFRadialShading(PDFShading): - required = PDFShading.required + ("Coords", "Function") - permitted = PDFShading.permitted + ( - "Coords", "Domain", "Function", "Extend") - def __init__(self, x0, y0, r0, x1, y1, r1, Function, ColorSpace, **kw): - self.Coords = (x0, y0, r0, x1, y1, r1) - self.Function = Function - self.ColorSpace = ColorSpace - self.otherkw = kw - def Dict(self, document): - d = {} - d.update(self.otherkw) - d["ShadingType"] = 3 - d["ColorSpace"] = PDFName(self.ColorSpace) - d["Coords"] = PDFArrayCompact(self.Coords) - d["Function"] = document.Reference(self.Function) - return self.ShadingDict(**d) - -if __name__=="__main__": - print("There is no script interpretation for pdfdoc.") diff --git a/reportlab/pdfbase/pdfform.py b/reportlab/pdfbase/pdfform.py deleted file mode 100644 index 90cb1bc7..00000000 --- a/reportlab/pdfbase/pdfform.py +++ /dev/null @@ -1,634 +0,0 @@ - -"""Support for Acrobat Forms in ReportLab documents - -This module is somewhat experimental at this time. - -Includes basic support for - textfields, - select fields (drop down lists), and - check buttons. - -The public interface consists of functions at the moment. -At some later date these operations may be made into canvas -methods. (comments?) - -The ...Absolute(...) functions position the fields with respect -to the absolute canvas coordinate space -- that is, they do not -respect any coordinate transforms in effect for the canvas. - -The ...Relative(...) functions position the ONLY THE LOWER LEFT -CORNER of the field using the coordinate transform in effect for -the canvas. THIS WILL ONLY WORK CORRECTLY FOR TRANSLATED COORDINATES --- THE SHAPE, SIZE, FONTSIZE, AND ORIENTATION OF THE FIELD WILL NOT BE EFFECTED -BY SCALING, ROTATION, SKEWING OR OTHER NON-TRANSLATION COORDINATE -TRANSFORMS. - -Please note that all field names (titles) in a given document must be unique. -Textfields and select fields only support the "base 14" canvas fonts -at this time. - -See individual function docstrings below for more information. - -The function test1(...) generates a simple test file. - -THIS CONTRIBUTION WAS COMMISSIONED BY REPORTLAB USERS -WHO WISH TO REMAIN ANONYMOUS. -""" - -### NOTE: MAKE THE STRING FORMATS DYNAMIC IN PATTERNS TO SUPPORT ENCRYPTION XXXX - -import string -from reportlab.pdfbase.pdfdoc import PDFString, PDFStream, PDFDictionary, PDFName, PDFObject -from reportlab.lib.colors import obj_R_G_B - -#==========================public interfaces - -def textFieldAbsolute(canvas, title, x, y, width, height, value="", maxlen=1000000, multiline=0): - """Place a text field on the current page - with name title at ABSOLUTE position (x,y) with - dimensions (width, height), using value as the default value and - maxlen as the maximum permissible length. If multiline is set make - it a multiline field. - """ - theform = getForm(canvas) - return theform.textField(canvas, title, x, y, x+width, y+height, value, maxlen, multiline) - -def textFieldRelative(canvas, title, xR, yR, width, height, value="", maxlen=1000000, multiline=0): - "same as textFieldAbsolute except the x and y are relative to the canvas coordinate transform" - (xA, yA) = canvas.absolutePosition(xR,yR) - return textFieldAbsolute(canvas, title, xA, yA, width, height, value, maxlen, multiline) - -def buttonFieldAbsolute(canvas, title, value, x, y): - """Place a check button field on the current page - with name title and default value value (one of "Yes" or "Off") - at ABSOLUTE position (x,y). - """ - theform = getForm(canvas) - return theform.buttonField(canvas, title, value, x, y) - -def buttonFieldRelative(canvas, title, value, xR, yR): - "same as buttonFieldAbsolute except the x and y are relative to the canvas coordinate transform" - (xA, yA) = canvas.absolutePosition(xR,yR) - return buttonFieldAbsolute(canvas, title, value, xA, yA) - -def selectFieldAbsolute(canvas, title, value, options, x, y, width, height): - """Place a select field (drop down list) on the current page - with name title and - with options listed in the sequence options - default value value (must be one of options) - at ABSOLUTE position (x,y) with dimensions (width, height).""" - theform = getForm(canvas) - theform.selectField(canvas, title, value, options, x, y, x+width, y+height) - -def selectFieldRelative(canvas, title, value, options, xR, yR, width, height): - "same as textFieldAbsolute except the x and y are relative to the canvas coordinate transform" - (xA, yA) = canvas.absolutePosition(xR,yR) - return selectFieldAbsolute(canvas, title, value, options, xA, yA, width, height) - -def test1(): - from reportlab.pdfgen import canvas - fn = "formtest1.pdf" - c = canvas.Canvas(fn) - # first page - c.setFont("Courier", 10) - c.drawString(100, 500, "hello world") - textFieldAbsolute(c, "fieldA", 100, 600, 100, 20, "default value") - textFieldAbsolute(c, "fieldB", 100, 300, 100, 50, "another default value", multiline=1) - selectFieldAbsolute(c, "fieldC", "France", ["Canada", "France", "China"], 100, 200, 100, 20) - c.rect(100, 600, 100, 20) - buttonFieldAbsolute(c, "field2", "Yes", 100, 700) - c.rect(100, 700, 20, 20) - buttonFieldAbsolute(c, "field3", "Off", 100, 800) - c.rect(100, 800, 20, 20) - # second page - c.showPage() - c.setFont("Helvetica", 7) - c.translate(50, 20) - c.drawString(100, 500, "hello world") - textFieldRelative(c, "fieldA_1", 100, 600, 100, 20, "default value 2") - c.setStrokeColorRGB(1,0,0) - c.setFillColorRGB(0,1,0.5) - textFieldRelative(c, "fieldB_1", 100, 300, 100, 50, "another default value 2", multiline=1) - selectFieldRelative(c, "fieldC_1", "France 1", ["Canada 0", "France 1", "China 2"], 100, 200, 100, 20) - c.rect(100, 600, 100, 20) - buttonFieldRelative(c, "field2_1", "Yes", 100, 700) - c.rect(100, 700, 20, 20) - buttonFieldRelative(c, "field3_1", "Off", 100, 800) - c.rect(100, 800, 20, 20) - c.save() - print("wrote", fn) - -#==========================end of public interfaces - -from reportlab.pdfbase.pdfpattern import PDFPattern, PDFPatternIf - -def getForm(canvas): - "get form from canvas, create the form if needed" - try: - return canvas.AcroForm - except AttributeError: - theform = canvas.AcroForm = AcroForm() - # install the form in the document - d = canvas._doc - cat = d._catalog - cat.AcroForm = theform - return theform - -class AcroForm(PDFObject): - def __init__(self): - self.fields = [] - def textField(self, canvas, title, xmin, ymin, xmax, ymax, value="", maxlen=1000000, multiline=0): - # determine the page ref - doc = canvas._doc - page = doc.thisPageRef() - # determine text info - R, G, B = obj_R_G_B(canvas._fillColorObj) - #print "rgb", (R,G,B) - font = canvas. _fontname - fontsize = canvas. _fontsize - field = TextField(title, value, xmin, ymin, xmax, ymax, page, maxlen, - font, fontsize, R, G, B, multiline) - self.fields.append(field) - canvas._addAnnotation(field) - def selectField(self, canvas, title, value, options, xmin, ymin, xmax, ymax): - # determine the page ref - doc = canvas._doc - page = doc.thisPageRef() - # determine text info - R, G, B = obj_R_G_B(canvas._fillColorObj) - #print "rgb", (R,G,B) - font = canvas. _fontname - fontsize = canvas. _fontsize - field = SelectField(title, value, options, xmin, ymin, xmax, ymax, page, - font=font, fontsize=fontsize, R=R, G=G, B=B) - self.fields.append(field) - canvas._addAnnotation(field) - def buttonField(self, canvas, title, value, xmin, ymin): - # determine the page ref - doc = canvas._doc - page = doc.thisPageRef() - field = ButtonField(title, value, xmin, ymin, page) - self.fields.append(field) - canvas._addAnnotation(field) - def format(self, document): - from reportlab.pdfbase.pdfdoc import PDFArray - proxy = PDFPattern(FormPattern, Resources=getattr(self,'resources',GLOBALRESOURCES), - NeedAppearances=getattr(self,'needAppearances','false'), - fields=PDFArray(self.fields), SigFlags=getattr(self,'sigFlags',0)) - return proxy.format(document) - -FormPattern = [ -'<<\r\n', -'/NeedAppearances ',['NeedAppearances'],'\r\n' -'/DA ', PDFString('/Helv 0 Tf 0 g '), '\r\n', -'/DR ',["Resources"],'\r\n', -'/Fields ', ["fields"],'\r\n', -PDFPatternIf('SigFlags',['\r\n/SigFlags ',['SigFlags']]), -'>>' -] - -def FormFontsDictionary(): - from reportlab.pdfbase.pdfdoc import PDFDictionary - fontsdictionary = PDFDictionary() - fontsdictionary.__RefOnly__ = 1 - for fullname, shortname in FORMFONTNAMES.items(): - fontsdictionary[shortname] = FormFont(fullname, shortname) - fontsdictionary["ZaDb"] = ZADB.clone() - return fontsdictionary - -def FormResources(): - return PDFPattern(FormResourcesDictionaryPattern, - Encoding=ENCODING.clone(), Font=GLOBALFONTSDICTIONARY) - -ZaDbPattern = [ -' <<' -' /BaseFont' -' /ZapfDingbats' -' /Name' -' /ZaDb' -' /Subtype' -' /Type1' -' /Type' -' /Font' -'>>'] - - -FormResourcesDictionaryPattern = [ -'<<', -' /Encoding ', -["Encoding"], '\r\n', -' /Font ', -["Font"], '\r\n', -'>>' -] - -FORMFONTNAMES = { - "Helvetica": "Helv", - "Helvetica-Bold": "HeBo", - 'Courier': "Cour", - 'Courier-Bold': "CoBo", - 'Courier-Oblique': "CoOb", - 'Courier-BoldOblique': "CoBO", - 'Helvetica-Oblique': "HeOb", - 'Helvetica-BoldOblique': "HeBO", - 'Times-Roman': "Time", - 'Times-Bold': "TiBo", - 'Times-Italic': "TiIt", - 'Times-BoldItalic': "TiBI", - } - -EncodingPattern = [ -'<<', -' /PDFDocEncoding ', -["PDFDocEncoding"], '\r\n', -'>>', -] - -PDFDocEncodingPattern = [ -'<<' -' /Differences' -' [' -' 24' -' /breve' -' /caron' -' /circumflex' -' /dotaccent' -' /hungarumlaut' -' /ogonek' -' /ring' -' /tilde' -' 39' -' /quotesingle' -' 96' -' /grave' -' 128' -' /bullet' -' /dagger' -' /daggerdbl' -' /ellipsis' -' /emdash' -' /endash' -' /florin' -' /fraction' -' /guilsinglleft' -' /guilsinglright' -' /minus' -' /perthousand' -' /quotedblbase' -' /quotedblleft' -' /quotedblright' -' /quoteleft' -' /quoteright' -' /quotesinglbase' -' /trademark' -' /fi' -' /fl' -' /Lslash' -' /OE' -' /Scaron' -' /Ydieresis' -' /Zcaron' -' /dotlessi' -' /lslash' -' /oe' -' /scaron' -' /zcaron' -' 160' -' /Euro' -' 164' -' /currency' -' 166' -' /brokenbar' -' 168' -' /dieresis' -' /copyright' -' /ordfeminine' -' 172' -' /logicalnot' -' /.notdef' -' /registered' -' /macron' -' /degree' -' /plusminus' -' /twosuperior' -' /threesuperior' -' /acute' -' /mu' -' 183' -' /periodcentered' -' /cedilla' -' /onesuperior' -' /ordmasculine' -' 188' -' /onequarter' -' /onehalf' -' /threequarters' -' 192' -' /Agrave' -' /Aacute' -' /Acircumflex' -' /Atilde' -' /Adieresis' -' /Aring' -' /AE' -' /Ccedilla' -' /Egrave' -' /Eacute' -' /Ecircumflex' -' /Edieresis' -' /Igrave' -' /Iacute' -' /Icircumflex' -' /Idieresis' -' /Eth' -' /Ntilde' -' /Ograve' -' /Oacute' -' /Ocircumflex' -' /Otilde' -' /Odieresis' -' /multiply' -' /Oslash' -' /Ugrave' -' /Uacute' -' /Ucircumflex' -' /Udieresis' -' /Yacute' -' /Thorn' -' /germandbls' -' /agrave' -' /aacute' -' /acircumflex' -' /atilde' -' /adieresis' -' /aring' -' /ae' -' /ccedilla' -' /egrave' -' /eacute' -' /ecircumflex' -' /edieresis' -' /igrave' -' /iacute' -' /icircumflex' -' /idieresis' -' /eth' -' /ntilde' -' /ograve' -' /oacute' -' /ocircumflex' -' /otilde' -' /odieresis' -' /divide' -' /oslash' -' /ugrave' -' /uacute' -' /ucircumflex' -' /udieresis' -' /yacute' -' /thorn' -' /ydieresis' -' ]' -' /Type' -' /Encoding' -'>>'] - -def FormFont(BaseFont, Name): - from reportlab.pdfbase.pdfdoc import PDFName - return PDFPattern(FormFontPattern, BaseFont=PDFName(BaseFont), Name=PDFName(Name), Encoding=PDFDOCENC.clone()) - -FormFontPattern = [ -'<<', -' /BaseFont ', -["BaseFont"], '\r\n', -' /Encoding ', -["Encoding"], '\r\n', -' /Name ', -["Name"], '\r\n', -' /Subtype ' -' /Type1 ' -' /Type ' -' /Font ' -'>>' ] - -def resetPdfForm(): - global PDFDOCENC,ENCODING,GLOBALFONTSDICTIONARY,GLOBALRESOURCES,ZADB - PDFDOCENC = PDFPattern(PDFDocEncodingPattern) - ENCODING = PDFPattern(EncodingPattern, PDFDocEncoding=PDFDOCENC.clone()) - ZADB = PDFPattern(ZaDbPattern) - GLOBALFONTSDICTIONARY = FormFontsDictionary() - GLOBALRESOURCES = FormResources() -from reportlab.rl_config import register_reset -register_reset(resetPdfForm) -resetPdfForm() - -def TextField(title, value, xmin, ymin, xmax, ymax, page, - maxlen=1000000, font="Helvetica-Bold", fontsize=9, R=0, G=0, B=0.627, multiline=0): - from reportlab.pdfbase.pdfdoc import PDFString, PDFName - Flags = 0 - if multiline: - Flags = Flags | (1<<12) # bit 13 is at position 12 :) - fontname = FORMFONTNAMES[font] - return PDFPattern(TextFieldPattern, - value=PDFString(value), maxlen=maxlen, page=page, - title=PDFString(title), - xmin=xmin, ymin=ymin, xmax=xmax, ymax=ymax, - fontname=PDFName(fontname), fontsize=fontsize, R=R, G=G, B=B, Flags=Flags) - - -TextFieldPattern = [ -'<<' -' /DA' -' (', ["fontname"],' ',["fontsize"],' Tf ',["R"],' ',["G"],' ',["B"],' rg)' -' /DV ', -["value"], '\r\n', -' /F 4 /FT /Tx' -'/MK << /BC [ 0 0 0 ] >>' -' /MaxLen ', -["maxlen"], '\r\n', -' /P ', -["page"], '\r\n', -' /Rect ' -' [', ["xmin"], " ", ["ymin"], " ", ["xmax"], " ", ["ymax"], ' ]' -'/Subtype /Widget' -' /T ', -["title"], '\r\n', -' /Type' -' /Annot' -' /V ', -["value"], '\r\n', -' /Ff ', -["Flags"],'\r\n', -'>>'] - -def SelectField(title, value, options, xmin, ymin, xmax, ymax, page, - font="Helvetica-Bold", fontsize=9, R=0, G=0, B=0.627): - #print "ARGS", (title, value, options, xmin, ymin, xmax, ymax, page, font, fontsize, R, G, B) - from reportlab.pdfbase.pdfdoc import PDFString, PDFName, PDFArray - if value not in options: - raise ValueError("value %s must be one of options %s" % (repr(value), repr(options))) - fontname = FORMFONTNAMES[font] - optionstrings = list(map(PDFString, options)) - optionarray = PDFArray(optionstrings) - return PDFPattern(SelectFieldPattern, - Options=optionarray, - Selected=PDFString(value), Page=page, - Name=PDFString(title), - xmin=xmin, ymin=ymin, xmax=xmax, ymax=ymax, - fontname=PDFName(fontname), fontsize=fontsize, R=R, G=G, B=B) - -SelectFieldPattern = [ -'<< % a select list\r\n' -' /DA ', -' (', ["fontname"],' ',["fontsize"],' Tf ',["R"],' ',["G"],' ',["B"],' rg)\r\n', -#' (/Helv 12 Tf 0 g)\r\n', -' /DV ', -["Selected"],'\r\n', -' /F ', -' 4\r\n', -' /FT ', -' /Ch\r\n', -' /MK ', -' <<', -' /BC', -' [', -' 0', -' 0', -' 0', -' ]', -' /BG', -' [', -' 1', -' 1', -' 1', -' ]', -' >>\r\n', -' /Opt ', -["Options"],'\r\n', -' /P ', -["Page"],'\r\n', -'/Rect', -' [',["xmin"], " ", ["ymin"], " ", ["xmax"], " ", ["ymax"], -' ] \r\n', -'/Subtype', -' /Widget\r\n', -' /T ', -["Name"],'\r\n', -' /Type ', -' /Annot', -' /V ', -["Selected"],'\r\n', -'>>'] - -def ButtonField(title, value, xmin, ymin, page): - if value not in ("Yes", "Off"): - raise ValueError("button value must be 'Yes' or 'Off': "+repr(value)) - (dx, dy) = (16.77036, 14.90698) - return PDFPattern(ButtonFieldPattern, - Name=PDFString(title), - xmin=xmin, ymin=ymin, xmax=xmin+dx, ymax=ymin+dy, - Hide=HIDE, - APDOff=APDOFF, - APDYes=APDYES, - APNYes=APNYES, - Value=PDFName(value), - Page=page) - -ButtonFieldPattern = ['<< ', -'/AA', -' <<', -' /D ', -["Hide"],'\r\n', -#' %(imported.18.0)s', -' >> ', -'/AP ', -' <<', -' /D', -' <<', -' /Off ', -#' %(imported.40.0)s', -["APDOff"], '\r\n', -' /Yes ', -#' %(imported.39.0)s', -["APDYes"], '\r\n', -' >>', '\r\n', -' /N', -' << ', -' /Yes ', -#' %(imported.38.0)s', -["APNYes"], '\r\n', -' >>', -' >>\r\n', -' /AS ', -["Value"], '\r\n', -' /DA ', -PDFString('/ZaDb 0 Tf 0 g'), '\r\n', -'/DV ', -["Value"], '\r\n', -'/F ', -' 4 ', -'/FT ', -' /Btn ', -'/H ', -' /T ', -'/MK ', -' <<', -' /AC (\\376\\377)', -#PDFString('\376\377'), -' /CA ', -PDFString('4'), -' /RC ', -PDFString('\376\377'), -' >> ','\r\n', -'/P ', -["Page"], '\r\n', -'/Rect', -' [',["xmin"], " ", ["ymin"], " ", ["xmax"], " ", ["ymax"], -' ] ','\r\n', -'/Subtype', -' /Widget ', -'/T ', -["Name"], '\r\n', -'/Type', -' /Annot ', -'/V ', -["Value"], '\r\n', -' >>'] - -HIDE = PDFPattern([ -'<< ' -'/S ' -' /Hide ' -'>>']) - -def buttonStreamDictionary(): - "everything except the length for the button appearance streams" - result = PDFDictionary() - result["SubType"] = "/Form" - result["BBox"] = "[0 0 16.77036 14.90698]" - font = PDFDictionary() - font["ZaDb"] = ZADB.clone() - resources = PDFDictionary() - resources["ProcSet"] = "[ /PDF /Text ]" - resources["Font"] = font - result["Resources"] = resources - return result - -def ButtonStream(content): - dict = buttonStreamDictionary() - result = PDFStream(dict, content) - result.filters = [] - return result - -APDOFF = ButtonStream('0.749 g 0 0 16.7704 14.907 re f\r\n') -APDYES = ButtonStream( -'0.749 g 0 0 16.7704 14.907 re f q 1 1 14.7704 12.907 re W '+ -'n BT /ZaDb 11.3086 Tf 0 g 1 0 0 1 3.6017 3.3881 Tm (4) Tj ET\r\n') -APNYES = ButtonStream( -'q 1 1 14.7704 12.907 re W n BT /ZaDb 11.3086 Tf 0 g 1 0 0 1 3.6017 3.3881 Tm (4) Tj ET Q\r\n') - - -#==== script interpretation - -if __name__=="__main__": - test1() diff --git a/reportlab/pdfbase/pdfmetrics.py b/reportlab/pdfbase/pdfmetrics.py deleted file mode 100644 index 9a7566fb..00000000 --- a/reportlab/pdfbase/pdfmetrics.py +++ /dev/null @@ -1,799 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/pdfbase/pdfmetrics.py -#$Header $ -__version__=''' $Id$ ''' -__doc__="""This provides a database of font metric information and -efines Font, Encoding and TypeFace classes aimed at end users. - -There are counterparts to some of these in pdfbase/pdfdoc.py, but -the latter focus on constructing the right PDF objects. These -classes are declarative and focus on letting the user construct -and query font objects. - -The module maintains a registry of font objects at run time. - -It is independent of the canvas or any particular context. It keeps -a registry of Font, TypeFace and Encoding objects. Ideally these -would be pre-loaded, but due to a nasty circularity problem we -trap attempts to access them and do it on first access. -""" -import string, os, sys -from reportlab.pdfbase import _fontdata -from reportlab.lib.logger import warnOnce -from reportlab.lib.utils import rl_isfile, rl_glob, rl_isdir, open_and_read, open_and_readlines, findInPaths, isSeq, isStr, isUnicode, isPy3 -from reportlab.rl_config import defaultEncoding, T1SearchPath -from reportlab.lib.rl_accel import unicode2T1, instanceStringWidthT1 -from reportlab.pdfbase import rl_codecs -_notdefChar = b'n' - -rl_codecs.RL_Codecs.register() -standardFonts = _fontdata.standardFonts -standardEncodings = _fontdata.standardEncodings - -_typefaces = {} -_encodings = {} -_fonts = {} - - -class FontError(Exception): - pass -class FontNotFoundError(Exception): - pass - -def parseAFMFile(afmFileName): - """Quick and dirty - gives back a top-level dictionary - with top-level items, and a 'widths' key containing - a dictionary of glyph names and widths. Just enough - needed for embedding. A better parser would accept - options for what data you wwanted, and preserve the - order.""" - - lines = open_and_readlines(afmFileName, 'r') - if len(lines)<=1: - #likely to be a MAC file - if lines: lines = lines[0].split('\r') - if len(lines)<=1: - raise ValueError('AFM file %s hasn\'t enough data' % afmFileName) - topLevel = {} - glyphLevel = [] - - lines = [l.strip() for l in lines] - lines = [l for l in lines if not l.lower().startswith('comment')] - #pass 1 - get the widths - inMetrics = 0 # os 'TOP', or 'CHARMETRICS' - for line in lines: - if line[0:16] == 'StartCharMetrics': - inMetrics = 1 - elif line[0:14] == 'EndCharMetrics': - inMetrics = 0 - elif inMetrics: - chunks = line.split(';') - chunks = [chunk.strip() for chunk in chunks] - cidChunk, widthChunk, nameChunk = chunks[0:3] - - # character ID - l, r = cidChunk.split() - assert l == 'C', 'bad line in font file %s' % line - cid = int(r) - - # width - l, r = widthChunk.split() - assert l == 'WX', 'bad line in font file %s' % line - width = int(r) - - # name - l, r = nameChunk.split() - assert l == 'N', 'bad line in font file %s' % line - name = r - - glyphLevel.append((cid, width, name)) - - # pass 2 font info - inHeader = 0 - for line in lines: - if line[0:16] == 'StartFontMetrics': - inHeader = 1 - if line[0:16] == 'StartCharMetrics': - inHeader = 0 - elif inHeader: - if line[0:7] == 'Comment': pass - try: - left, right = line.split(' ',1) - except: - raise ValueError("Header information error in afm %s: line='%s'" % (afmFileName, line)) - try: - right = int(right) - except: - pass - topLevel[left] = right - - - return (topLevel, glyphLevel) - -class TypeFace: - def __init__(self, name): - self.name = name - self.glyphNames = [] - self.glyphWidths = {} - self.ascent = 0 - self.descent = 0 - - - # all typefaces of whatever class should have these 3 attributes. - # these are the basis for family detection. - self.familyName = None # should set on load/construction if possible - self.bold = 0 # bold faces should set this - self.italic = 0 #italic faces should set this - - if name == 'ZapfDingbats': - self.requiredEncoding = 'ZapfDingbatsEncoding' - elif name == 'Symbol': - self.requiredEncoding = 'SymbolEncoding' - else: - self.requiredEncoding = None - if name in standardFonts: - self.builtIn = 1 - self._loadBuiltInData(name) - else: - self.builtIn = 0 - - def _loadBuiltInData(self, name): - """Called for the built in 14 fonts. Gets their glyph data. - We presume they never change so this can be a shared reference.""" - name = str(name) #needed for pycanvas&jython/2.1 compatibility - self.glyphWidths = _fontdata.widthsByFontGlyph[name] - self.glyphNames = list(self.glyphWidths.keys()) - self.ascent,self.descent = _fontdata.ascent_descent[name] - - def getFontFiles(self): - "Info function, return list of the font files this depends on." - return [] - - def findT1File(self, ext='.pfb'): - possible_exts = (ext.lower(), ext.upper()) - if hasattr(self,'pfbFileName'): - r_basename = os.path.splitext(self.pfbFileName)[0] - for e in possible_exts: - if rl_isfile(r_basename + e): - return r_basename + e - try: - r = _fontdata.findT1File(self.name) - except: - afm = bruteForceSearchForAFM(self.name) - if afm: - if ext.lower() == '.pfb': - for e in possible_exts: - pfb = os.path.splitext(afm)[0] + e - if rl_isfile(pfb): - r = pfb - else: - r = None - elif ext.lower() == '.afm': - r = afm - else: - r = None - if r is None: - warnOnce("Can't find %s for face '%s'" % (ext, self.name)) - return r - -def bruteForceSearchForFile(fn,searchPath=None): - if searchPath is None: from reportlab.rl_config import T1SearchPath as searchPath - if rl_isfile(fn): return fn - bfn = os.path.basename(fn) - for dirname in searchPath: - if not rl_isdir(dirname): continue - tfn = os.path.join(dirname,bfn) - if rl_isfile(tfn): return tfn - return fn - -def bruteForceSearchForAFM(faceName): - """Looks in all AFM files on path for face with given name. - - Returns AFM file name or None. Ouch!""" - from reportlab.rl_config import T1SearchPath - - for dirname in T1SearchPath: - if not rl_isdir(dirname): continue - possibles = rl_glob(dirname + os.sep + '*.[aA][fF][mM]') - for possible in possibles: - try: - topDict, glyphDict = parseAFMFile(possible) - if topDict['FontName'] == faceName: - return possible - except: - t,v,b=sys.exc_info() - v.args = (' '.join(map(str,v.args))+', while looking for faceName=%r' % faceName,) - raise - - -#for faceName in standardFonts: -# registerTypeFace(TypeFace(faceName)) - - -class Encoding: - """Object to help you create and refer to encodings.""" - def __init__(self, name, base=None): - self.name = name - self.frozen = 0 - if name in standardEncodings: - assert base is None, "Can't have a base encoding for a standard encoding" - self.baseEncodingName = name - self.vector = _fontdata.encodings[name] - elif base == None: - # assume based on the usual one - self.baseEncodingName = defaultEncoding - self.vector = _fontdata.encodings[defaultEncoding] - elif isStr(base): - baseEnc = getEncoding(base) - self.baseEncodingName = baseEnc.name - self.vector = baseEnc.vector[:] - elif isSeq(base): - self.baseEncodingName = defaultEncoding - self.vector = base[:] - elif isinstance(base, Encoding): - # accept a vector - self.baseEncodingName = base.name - self.vector = base.vector[:] - - def __getitem__(self, index): - "Return glyph name for that code point, or None" - # THIS SHOULD BE INLINED FOR SPEED - return self.vector[index] - - def __setitem__(self, index, value): - # should fail if they are frozen - assert self.frozen == 0, 'Cannot modify a frozen encoding' - if self.vector[index]!=value: - L = list(self.vector) - L[index] = value - self.vector = tuple(L) - - def freeze(self): - self.vector = tuple(self.vector) - self.frozen = 1 - - def isEqual(self, other): - return self.name==other.name and tuple(self.vector)==tuple(other.vector) - - def modifyRange(self, base, newNames): - """Set a group of character names starting at the code point 'base'.""" - assert self.frozen == 0, 'Cannot modify a frozen encoding' - idx = base - for name in newNames: - self.vector[idx] = name - idx = idx + 1 - - def getDifferences(self, otherEnc): - """ - Return a compact list of the code points differing between two encodings - - This is in the Adobe format: list of - [[b1, name1, name2, name3], - [b2, name4]] - - where b1...bn is the starting code point, and the glyph names following - are assigned consecutive code points. - - """ - - ranges = [] - curRange = None - for i in range(len(self.vector)): - glyph = self.vector[i] - if glyph==otherEnc.vector[i]: - if curRange: - ranges.append(curRange) - curRange = [] - else: - if curRange: - curRange.append(glyph) - elif glyph: - curRange = [i, glyph] - if curRange: - ranges.append(curRange) - return ranges - - def makePDFObject(self): - "Returns a PDF Object representing self" - # avoid circular imports - this cannot go at module level - from reportlab.pdfbase import pdfdoc - - D = {} - baseEnc = getEncoding(self.baseEncodingName) - differences = self.getDifferences(baseEnc) #[None] * 256) - - # if no differences, we just need the base name - if differences == []: - return pdfdoc.PDFName(self.baseEncodingName) - else: - #make up a dictionary describing the new encoding - diffArray = [] - for range in differences: - diffArray.append(range[0]) # numbers go 'as is' - for glyphName in range[1:]: - if glyphName is not None: - # there is no way to 'unset' a character in the base font. - diffArray.append('/' + glyphName) - - #print 'diffArray = %s' % diffArray - D["Differences"] = pdfdoc.PDFArray(diffArray) - D["BaseEncoding"] = pdfdoc.PDFName(self.baseEncodingName) - D["Type"] = pdfdoc.PDFName("Encoding") - PD = pdfdoc.PDFDictionary(D) - return PD - -#for encName in standardEncodings: -# registerEncoding(Encoding(encName)) - - -standardT1SubstitutionFonts = [] -class Font: - """Represents a font (i.e combination of face and encoding). - - Defines suitable machinery for single byte fonts. This is - a concrete class which can handle the basic built-in fonts; - not clear yet if embedded ones need a new font class or - just a new typeface class (which would do the job through - composition)""" - - _multiByte = 0 # do not want our own stringwidth - _dynamicFont = 0 # do not want dynamic subsetting - - def __init__(self, name, faceName, encName): - self.fontName = name - face = self.face = getTypeFace(faceName) - self.encoding= getEncoding(encName) - self.encName = encName - if face.builtIn and face.requiredEncoding is None: - _ = standardT1SubstitutionFonts - else: - _ = [] - self.substitutionFonts = _ - self._calcWidths() - self._notdefChar = _notdefChar - self._notdefFont = name=='ZapfDingbats' and self or _notdefFont - - def stringWidth(self, text, size, encoding='utf8'): - return instanceStringWidthT1(self, text, size, encoding=encoding) - - def __repr__(self): - return "<%s %s>" % (self.__class__.__name__, self.face.name) - - def _calcWidths(self): - """Vector of widths for stringWidth function""" - #synthesize on first request - w = [0] * 256 - gw = self.face.glyphWidths - vec = self.encoding.vector - for i in range(256): - glyphName = vec[i] - if glyphName is not None: - try: - width = gw[glyphName] - w[i] = width - except KeyError: - import reportlab.rl_config - if reportlab.rl_config.warnOnMissingFontGlyphs: - print('typeface "%s" does not have a glyph "%s", bad font!' % (self.face.name, glyphName)) - else: - pass - self.widths = w - - def _formatWidths(self): - "returns a pretty block in PDF Array format to aid inspection" - text = b'[' - for i in range(256): - text = text + b' ' + bytes(str(self.widths[i]),'utf8') - if i == 255: - text = text + b' ]' - if i % 16 == 15: - text = text + b'\n' - return text - - def addObjects(self, doc): - """Makes and returns one or more PDF objects to be added - to the document. The caller supplies the internal name - to be used (typically F1, F2... in sequence) """ - # avoid circular imports - this cannot go at module level - from reportlab.pdfbase import pdfdoc - - # construct a Type 1 Font internal object - internalName = 'F' + repr(len(doc.fontMapping)+1) - pdfFont = pdfdoc.PDFType1Font() - pdfFont.Name = internalName - pdfFont.BaseFont = self.face.name - pdfFont.__Comment__ = 'Font %s' % self.fontName - pdfFont.Encoding = self.encoding.makePDFObject() - - # is it a built-in one? if not, need more stuff. - if not self.face.name in standardFonts: - pdfFont.FirstChar = 0 - pdfFont.LastChar = 255 - pdfFont.Widths = pdfdoc.PDFArray(self.widths) - pdfFont.FontDescriptor = self.face.addObjects(doc) - # now link it in - ref = doc.Reference(pdfFont, internalName) - - # also refer to it in the BasicFonts dictionary - fontDict = doc.idToObject['BasicFonts'].dict - fontDict[internalName] = pdfFont - - # and in the font mappings - doc.fontMapping[self.fontName] = '/' + internalName - -PFB_MARKER=chr(0x80) -PFB_ASCII=chr(1) -PFB_BINARY=chr(2) -PFB_EOF=chr(3) - -if isPy3: - def _pfbCheck(p,d,m,fn): - if chr(d[p])!=PFB_MARKER or chr(d[p+1])!=m: - raise ValueError('Bad pfb file\'%s\' expected chr(%d)chr(%d) at char %d, got chr(%d)chr(%d)' % (fn,ord(PFB_MARKER),ord(m),p,d[p],d[p+1])) - if m==PFB_EOF: return - p = p + 2 - l = (((((d[p+3])<<8)|(d[p+2])<<8)|(d[p+1]))<<8)|(d[p]) - p = p + 4 - if p+l>len(d): - raise ValueError('Bad pfb file\'%s\' needed %d+%d bytes have only %d!' % (fn,p,l,len(d))) - return p, p+l -else: - def _pfbSegLen(p,d): - '''compute a pfb style length from the first 4 bytes of string d''' - return ((((ord(d[p+3])<<8)|ord(d[p+2])<<8)|ord(d[p+1]))<<8)|ord(d[p]) - - def _pfbCheck(p,d,m,fn): - if d[p]!=PFB_MARKER or d[p+1]!=m: - raise ValueError('Bad pfb file\'%s\' expected chr(%d)chr(%d) at char %d, got chr(%d)chr(%d)' % (fn,ord(PFB_MARKER),ord(m),p,ord(d[p]),ord(d[p+1]))) - if m==PFB_EOF: return - p = p + 2 - l = _pfbSegLen(p,d) - p = p + 4 - if p+l>len(d): - raise ValueError('Bad pfb file\'%s\' needed %d+%d bytes have only %d!' % (fn,p,l,len(d))) - return p, p+l - -class EmbeddedType1Face(TypeFace): - """A Type 1 font other than one of the basic 14. - - Its glyph data will be embedded in the PDF file.""" - def __init__(self, afmFileName, pfbFileName): - # ignore afm file for now - TypeFace.__init__(self, None) - #None is a hack, name will be supplied by AFM parse lower done - #in this __init__ method. - afmFileName = findInPaths(afmFileName,T1SearchPath) - pfbFileName = findInPaths(pfbFileName,T1SearchPath) - self.afmFileName = os.path.abspath(afmFileName) - self.pfbFileName = os.path.abspath(pfbFileName) - self.requiredEncoding = None - self._loadGlyphs(pfbFileName) - self._loadMetrics(afmFileName) - - def getFontFiles(self): - return [self.afmFileName, self.pfbFileName] - - def _loadGlyphs(self, pfbFileName): - """Loads in binary glyph data, and finds the four length - measurements needed for the font descriptor""" - pfbFileName = bruteForceSearchForFile(pfbFileName) - assert rl_isfile(pfbFileName), 'file %s not found' % pfbFileName - d = open_and_read(pfbFileName, 'b') - s1, l1 = _pfbCheck(0,d,PFB_ASCII,pfbFileName) - s2, l2 = _pfbCheck(l1,d,PFB_BINARY,pfbFileName) - s3, l3 = _pfbCheck(l2,d,PFB_ASCII,pfbFileName) - _pfbCheck(l3,d,PFB_EOF,pfbFileName) - self._binaryData = d[s1:l1]+d[s2:l2]+d[s3:l3] - - self._length = len(self._binaryData) - self._length1 = l1-s1 - self._length2 = l2-s2 - self._length3 = l3-s3 - - - def _loadMetrics(self, afmFileName): - """Loads in and parses font metrics""" - #assert os.path.isfile(afmFileName), "AFM file %s not found" % afmFileName - afmFileName = bruteForceSearchForFile(afmFileName) - (topLevel, glyphData) = parseAFMFile(afmFileName) - - self.name = topLevel['FontName'] - self.familyName = topLevel['FamilyName'] - self.ascent = topLevel.get('Ascender', 1000) - self.descent = topLevel.get('Descender', 0) - self.capHeight = topLevel.get('CapHeight', 1000) - self.italicAngle = topLevel.get('ItalicAngle', 0) - self.stemV = topLevel.get('stemV', 0) - self.xHeight = topLevel.get('XHeight', 1000) - - strBbox = topLevel.get('FontBBox', [0,0,1000,1000]) - tokens = strBbox.split() - self.bbox = [] - for tok in tokens: - self.bbox.append(int(tok)) - - glyphWidths = {} - for (cid, width, name) in glyphData: - glyphWidths[name] = width - self.glyphWidths = glyphWidths - self.glyphNames = list(glyphWidths.keys()) - self.glyphNames.sort() - - # for font-specific encodings like Symbol, Dingbats, Carta we - # need to make a new encoding as well.... - if topLevel.get('EncodingScheme', None) == 'FontSpecific': - names = [None] * 256 - for (code, width, name) in glyphData: - if code >=0 and code <=255: - names[code] = name - encName = self.name + 'Encoding' - self.requiredEncoding = encName - enc = Encoding(encName, names) - registerEncoding(enc) - - def addObjects(self, doc): - """Add whatever needed to PDF file, and return a FontDescriptor reference""" - from reportlab.pdfbase import pdfdoc - - fontFile = pdfdoc.PDFStream() - fontFile.content = self._binaryData - #fontFile.dictionary['Length'] = self._length - fontFile.dictionary['Length1'] = self._length1 - fontFile.dictionary['Length2'] = self._length2 - fontFile.dictionary['Length3'] = self._length3 - #fontFile.filters = [pdfdoc.PDFZCompress] - - fontFileRef = doc.Reference(fontFile, 'fontFile:' + self.pfbFileName) - - fontDescriptor = pdfdoc.PDFDictionary({ - 'Type': '/FontDescriptor', - 'Ascent':self.ascent, - 'CapHeight':self.capHeight, - 'Descent':self.descent, - 'Flags': 34, - 'FontBBox':pdfdoc.PDFArray(self.bbox), - 'FontName':pdfdoc.PDFName(self.name), - 'ItalicAngle':self.italicAngle, - 'StemV':self.stemV, - 'XHeight':self.xHeight, - 'FontFile': fontFileRef, - }) - fontDescriptorRef = doc.Reference(fontDescriptor, 'fontDescriptor:' + self.name) - return fontDescriptorRef - -def registerTypeFace(face): - assert isinstance(face, TypeFace), 'Not a TypeFace: %s' % face - _typefaces[face.name] = face - if not face.name in standardFonts: - # HACK - bold/italic do not apply for type 1, so egister - # all combinations of mappings. - registerFontFamily(face.name) - -def registerEncoding(enc): - assert isinstance(enc, Encoding), 'Not an Encoding: %s' % enc - if enc.name in _encodings: - # already got one, complain if they are not the same - if enc.isEqual(_encodings[enc.name]): - enc.freeze() - else: - raise FontError('Encoding "%s" already registered with a different name vector!' % enc.name) - else: - _encodings[enc.name] = enc - enc.freeze() - # have not yet dealt with immutability! - -def registerFontFamily(family,normal=None,bold=None,italic=None,boldItalic=None): - from reportlab.lib import fonts - if not normal: normal = family - family = family.lower() - if not boldItalic: boldItalic = italic or bold or normal - if not bold: bold = normal - if not italic: italic = normal - fonts.addMapping(family, 0, 0, normal) - fonts.addMapping(family, 1, 0, bold) - fonts.addMapping(family, 0, 1, italic) - fonts.addMapping(family, 1, 1, boldItalic) - -def registerFont(font): - "Registers a font, including setting up info for accelerated stringWidth" - #assert isinstance(font, Font), 'Not a Font: %s' % font - fontName = font.fontName - _fonts[fontName] = font - if font._multiByte: - # CID fonts don't need to have typeface registered. - #need to set mappings so it can go in a paragraph even if within - # bold tags - registerFontFamily(font.fontName) - -def getTypeFace(faceName): - """Lazily construct known typefaces if not found""" - try: - return _typefaces[faceName] - except KeyError: - # not found, construct it if known - if faceName in standardFonts: - face = TypeFace(faceName) - (face.familyName, face.bold, face.italic) = _fontdata.standardFontAttributes[faceName] - registerTypeFace(face) -## print 'auto-constructing type face %s with family=%s, bold=%d, italic=%d' % ( -## face.name, face.familyName, face.bold, face.italic) - return face - else: - #try a brute force search - afm = bruteForceSearchForAFM(faceName) - if afm: - for e in ('.pfb', '.PFB'): - pfb = os.path.splitext(afm)[0] + e - if rl_isfile(pfb): break - assert rl_isfile(pfb), 'file %s not found!' % pfb - face = EmbeddedType1Face(afm, pfb) - registerTypeFace(face) - return face - else: - raise - -def getEncoding(encName): - """Lazily construct known encodings if not found""" - try: - return _encodings[encName] - except KeyError: - if encName in standardEncodings: - enc = Encoding(encName) - registerEncoding(enc) - #print 'auto-constructing encoding %s' % encName - return enc - else: - raise - -def findFontAndRegister(fontName): - '''search for and register a font given its name''' - fontName = str(fontName) - assert type(fontName) is str, 'fontName=%s is not required type str' % ascii(fontName) - #it might have a font-specific encoding e.g. Symbol - # or Dingbats. If not, take the default. - face = getTypeFace(fontName) - if face.requiredEncoding: - font = Font(fontName, fontName, face.requiredEncoding) - else: - font = Font(fontName, fontName, defaultEncoding) - registerFont(font) - return font - -def getFont(fontName): - """Lazily constructs known fonts if not found. - - Names of form 'face-encoding' will be built if - face and encoding are known. Also if the name is - just one of the standard 14, it will make up a font - in the default encoding.""" - try: - return _fonts[fontName] - except KeyError: - return findFontAndRegister(fontName) - -_notdefFont = getFont('ZapfDingbats') -standardT1SubstitutionFonts.extend([getFont('Symbol'),_notdefFont]) - -def getAscentDescent(fontName,fontSize=None): - font = getFont(fontName) - try: - ascent = font.ascent - descent = font.descent - except: - ascent = font.face.ascent - descent = font.face.descent - if fontSize: - norm = fontSize/1000. - return ascent*norm, descent*norm - else: - return ascent, descent - -def getAscent(fontName,fontSize=None): - return getAscentDescent(fontName,fontSize)[0] - -def getDescent(fontName,fontSize=None): - return getAscentDescent(fontName,fontSize)[1] - -def getRegisteredFontNames(): - "Returns what's in there" - reg = list(_fonts.keys()) - reg.sort() - return reg - -def stringWidth(text, fontName, fontSize, encoding='utf8'): - """Compute width of string in points; - not accelerated as fast enough because of instanceStringWidthT1/TTF""" - return getFont(fontName).stringWidth(text, fontSize, encoding=encoding) - -def dumpFontData(): - print('Registered Encodings:') - keys = list(_encodings.keys()) - keys.sort() - for encName in keys: - print(' ',encName) - - print() - print('Registered Typefaces:') - faces = list(_typefaces.keys()) - faces.sort() - for faceName in faces: - print(' ',faceName) - - - print() - print('Registered Fonts:') - k = list(_fonts.keys()) - k.sort() - for key in k: - font = _fonts[key] - print(' %s (%s/%s)' % (font.fontName, font.face.name, font.encoding.name)) - -def test3widths(texts): - # checks all 3 algorithms give same answer, note speed - import time - for fontName in standardFonts[0:1]: -## t0 = time.time() -## for text in texts: -## l1 = stringWidth(text, fontName, 10) -## t1 = time.time() -## print 'fast stringWidth took %0.4f' % (t1 - t0) - - t0 = time.time() - w = getFont(fontName).widths - for text in texts: - l2 = 0 - for ch in text: - l2 = l2 + w[ord(ch)] - t1 = time.time() - print('slow stringWidth took %0.4f' % (t1 - t0)) - - t0 = time.time() - for text in texts: - l3 = getFont(fontName).stringWidth(text, 10) - t1 = time.time() - print('class lookup and stringWidth took %0.4f' % (t1 - t0)) - print() - -def testStringWidthAlgorithms(): - rawdata = open('../../rlextra/rml2pdf/doc/rml_user_guide.prep').read() - print('rawdata length %d' % len(rawdata)) - print('test one huge string...') - test3widths([rawdata]) - print() - words = rawdata.split() - print('test %d shorter strings (average length %0.2f chars)...' % (len(words), 1.0*len(rawdata)/len(words))) - test3widths(words) - - -def test(): - helv = TypeFace('Helvetica') - registerTypeFace(helv) - print(helv.glyphNames[0:30]) - - wombat = TypeFace('Wombat') - print(wombat.glyphNames) - registerTypeFace(wombat) - - dumpFontData() - -#preserve the initial values here -def _reset( - initial_dicts = dict( - _typefaces = _typefaces.copy(), - _encodings = _encodings.copy(), - _fonts = _fonts.copy(), - ) - ): - for k,v in initial_dicts.items(): - d=globals()[k] - d.clear() - d.update(v) - -from reportlab.rl_config import register_reset -register_reset(_reset) -del register_reset - -if __name__=='__main__': - test() - testStringWidthAlgorithms() diff --git a/reportlab/pdfbase/pdfpattern.py b/reportlab/pdfbase/pdfpattern.py deleted file mode 100644 index 774ff334..00000000 --- a/reportlab/pdfbase/pdfpattern.py +++ /dev/null @@ -1,93 +0,0 @@ -__doc__="""helper for importing pdf structures into a ReportLab generated document -""" -from reportlab.pdfbase.pdfdoc import format, PDFObject, pdfdocEnc -from reportlab.lib.utils import strTypes - -def _patternSequenceCheck(pattern_sequence): - allowedTypes = strTypes if isinstance(strTypes, tuple) else (strTypes,) - allowedTypes = allowedTypes + (PDFObject,PDFPatternIf) - for x in pattern_sequence: - if not isinstance(x,allowedTypes): - if len(x)!=1: - raise ValueError("sequence elts must be strings/bytes/PDFPatternIfs or singletons containing strings: "+ascii(x)) - if not isinstance(x[0],strTypes): - raise ValueError("Singletons must contain strings/bytes or PDFObject instances only: "+ascii(x[0])) - -class PDFPattern(PDFObject): - __RefOnly__ = 1 - def __init__(self, pattern_sequence, **keywordargs): - """ - Description of a kind of PDF object using a pattern. - - Pattern sequence should contain strings, singletons of form [string] or - PDFPatternIf objects. - Strings are literal strings to be used in the object. - Singletons are names of keyword arguments to include. - PDFpatternIf objects allow some conditionality. - Keyword arguments can be non-instances which are substituted directly in string conversion, - or they can be object instances in which case they should be pdfdoc.* style - objects with a x.format(doc) method. - Keyword arguments may be set on initialization or subsequently using __setitem__, before format. - "constant object" instances can also be inserted in the patterns. - """ - _patternSequenceCheck(pattern_sequence) - self.pattern = pattern_sequence - self.arguments = keywordargs - - def __setitem__(self, item, value): - self.arguments[item] = value - - def __getitem__(self, item): - return self.arguments[item] - - def eval(self,L): - arguments = self.arguments - document = self.__document - for x in L: - if isinstance(x,strTypes): - yield pdfdocEnc(x) - elif isinstance(x,PDFObject): - yield x.format(document) - elif isinstance(x,PDFPatternIf): - result = list(self.eval(x.cond)) - cond = result and result[0] - for z in self.eval(x.thenPart if cond else x.elsePart): - yield z - else: - name = x[0] - value = arguments.get(name, None) - if value is None: - raise ValueError("%s value not defined" % ascii(name)) - if isinstance(value,PDFObject): - yield format(value,document) - elif isinstance(value,strTypes): - yield pdfdocEnc(value) - else: - yield pdfdocEnc(str(value)) - - def format(self, document): - self.__document = document - try: - return b"".join(self.eval(self.pattern)) - finally: - del self.__document - - def clone(self): - c = object.__new__(self.__class__) - c.pattern = self.pattern - c.arguments = self.arguments - return c - -class PDFPatternIf(object): - '''cond will be evaluated as [cond] in PDFpattern eval. - It should evaluate to a list with value 0/1 etc etc. - thenPart is a list to be evaluated if the cond evaulates true, - elsePart is the false sequence. - ''' - def __init__(self,cond,thenPart=[],elsePart=[]): - if not isinstance(cond,list): cond = [cond] - for x in cond, thenPart, elsePart: - _patternSequenceCheck(x) - self.cond = cond - self.thenPart = thenPart - self.elsePart = elsePart diff --git a/reportlab/pdfbase/pdfutils.py b/reportlab/pdfbase/pdfutils.py deleted file mode 100644 index aad6ffa4..00000000 --- a/reportlab/pdfbase/pdfutils.py +++ /dev/null @@ -1,284 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/pdfbase/pdfutils.py -__version__=''' $Id$ ''' -__doc__='' -# pdfutils.py - everything to do with images, streams, -# compression, and some constants - -import sys -import os -import binascii -from reportlab import rl_config -from reportlab.lib.utils import getBytesIO, ImageReader, isUnicode, isPy3 -from reportlab.lib.rl_accel import asciiBase85Encode, asciiBase85Decode - -def _chunker(src,dst=[],chunkSize=60): - for i in range(0,len(src),chunkSize): - dst.append(src[i:i+chunkSize]) - return dst - -########################################################## -# -# Image compression helpers. Preprocessing a directory -# of images will offer a vast speedup. -# -########################################################## -_mode2cs = {'RGB':'RGB', 'CMYK': 'CMYK', 'L': 'G'} -_mode2bpp = {'RGB': 3, 'CMYK':4, 'L':1} -def makeA85Image(filename,IMG=None): - import zlib - img = ImageReader(filename) - if IMG is not None: IMG.append(img) - - imgwidth, imgheight = img.getSize() - raw = img.getRGBData() - - code = [] - append = code.append - # this describes what is in the image itself - append('BI') - append('/W %s /H %s /BPC 8 /CS /%s /F [/A85 /Fl]' % (imgwidth, imgheight,_mode2cs[img.mode])) - append('ID') - #use a flate filter and Ascii Base 85 - assert len(raw) == imgwidth * imgheight*_mode2bpp[img.mode], "Wrong amount of data for image" - compressed = zlib.compress(raw) #this bit is very fast... - encoded = asciiBase85Encode(compressed) #...sadly this may not be - - #append in blocks of 60 characters - _chunker(encoded,code) - - append('EI') - return code -def makeRawImage(filename,IMG=None): - import zlib - img = ImageReader(filename) - if IMG is not None: IMG.append(img) - - imgwidth, imgheight = img.getSize() - raw = img.getRGBData() - - code = [] - append = code.append - # this describes what is in the image itself - append('BI') - append('/W %s /H %s /BPC 8 /CS /%s /F [/Fl]' % (imgwidth, imgheight,_mode2cs[img.mode])) - append('ID') - #use a flate filter - assert len(raw) == imgwidth * imgheight*_mode2bpp[img.mode], "Wrong amount of data for image" - compressed = zlib.compress(raw) #this bit is very fast... - - #append in blocks of 60 characters - _chunker(compressed,code) - - append('EI') - return code - -def cacheImageFile(filename, returnInMemory=0, IMG=None): - "Processes image as if for encoding, saves to a file with .a85 extension." - - cachedname = os.path.splitext(filename)[0] + (rl_config.useA85 and '.a85' or '.bin') - if filename==cachedname: - if cachedImageExists(filename): - from reportlab.lib.utils import open_for_read - if returnInMemory: return filter(None,open_for_read(cachedname).read().split('\r\n')) - else: - raise IOError('No such cached image %s' % filename) - else: - if rl_config.useA85: - code = makeA85Image(filename,IMG) - else: - code = makeRawImage(filename,IMG) - if returnInMemory: return code - - #save it to a file - f = open(cachedname,'wb') - f.write('\r\n'.join(code)+'\r\n') - f.close() - if rl_config.verbose: - print('cached image as %s' % cachedname) - - -def preProcessImages(spec): - """Preprocesses one or more image files. - - Accepts either a filespec ('C:\mydir\*.jpg') or a list - of image filenames, crunches them all to save time. Run this - to save huge amounts of time when repeatedly building image - documents.""" - - import glob - - if isinstance(spec,str): - filelist = glob.glob(spec) - else: #list or tuple OK - filelist = spec - - for filename in filelist: - if cachedImageExists(filename): - if rl_config.verbose: - print('cached version of %s already exists' % filename) - else: - cacheImageFile(filename) - - -def cachedImageExists(filename): - """Determines if a cached image already exists for a given file. - - Determines if a cached image exists which has the same name - and equal or newer date to the given file.""" - cachedname = os.path.splitext(filename)[0] + (rl_config.useA85 and '.a85' or 'bin') - if os.path.isfile(cachedname): - #see if it is newer - original_date = os.stat(filename)[8] - cached_date = os.stat(cachedname)[8] - if original_date > cached_date: - return 0 - else: - return 1 - else: - return 0 - - -############################################################## -# -# PDF Helper functions -# -############################################################## - -def _normalizeLineEnds(text,desired='\r\n',unlikely='\x00\x01\x02\x03'): - """Normalizes different line end character(s). - - Ensures all instances of CR, LF and CRLF end up as - the specified one.""" - - return (text - .replace('\r\n', unlikely) - .replace('\r', unlikely) - .replace('\n', unlikely) - .replace(unlikely, desired)) - -def _AsciiHexEncode(input): - """Encodes input using ASCII-Hex coding. - - This is a verbose encoding used for binary data within - a PDF file. One byte binary becomes two bytes of ASCII. - Helper function used by images.""" - if isUnicode(input): - input = input.encode('utf-8') - output = getBytesIO() - output.write(binascii.b2a_hex(input)) - output.write(b'>') - return output.getvalue() - - -def _AsciiHexDecode(input): - """Decodes input using ASCII-Hex coding. - - Not used except to provide a test of the inverse function.""" - - #strip out all whitespace - if not isUnicode(input): - input = input.decode('utf-8') - stripped = ''.join(input.split()) - assert stripped[-1] == '>', 'Invalid terminator for Ascii Hex Stream' - stripped = stripped[:-1] #chop off terminator - assert len(stripped) % 2 == 0, 'Ascii Hex stream has odd number of bytes' - - return ''.join([chr(int(stripped[i:i+2],16)) for i in range(0,len(stripped),2)]) - -def _wrap(input, columns=60): - "Wraps input at a given column size by inserting \r\n characters." - output = [] - length = len(input) - i = 0 - pos = columns * i - while pos < length: - output.append(input[pos:pos+columns]) - i = i + 1 - pos = columns * i - #avoid HP printer problem - if len(output[-1])==1: - output[-2:] = [output[-2][:-1],output[-2][-1]+output[-1]] - return '\r\n'.join(output) - - -######################################################################### -# -# JPEG processing code - contributed by Eric Johnson -# -######################################################################### - -# Read data from the JPEG file. We should probably be using PIL to -# get this information for us -- but this way is more fun! -# Returns (width, height, color components) as a triple -# This is based on Thomas Merz's code from GhostScript (viewjpeg.ps) -def readJPEGInfo(image): - "Read width, height and number of components from open JPEG file." - - import struct - from reportlab.pdfbase.pdfdoc import PDFError - - #Acceptable JPEG Markers: - # SROF0=baseline, SOF1=extended sequential or SOF2=progressive - validMarkers = [0xC0, 0xC1, 0xC2] - - #JPEG markers without additional parameters - noParamMarkers = \ - [ 0xD0, 0xD1, 0xD2, 0xD3, 0xD4, 0xD5, 0xD6, 0xD7, 0xD8, 0x01 ] - - #Unsupported JPEG Markers - unsupportedMarkers = \ - [ 0xC3, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCD, 0xCE, 0xCF ] - - #read JPEG marker segments until we find SOFn marker or EOF - done = 0 - while not done: - x = struct.unpack('B', image.read(1)) - if x[0] == 0xFF: #found marker - x = struct.unpack('B', image.read(1)) - #print "Marker: ", '%0.2x' % x[0] - #check marker type is acceptable and process it - if x[0] in validMarkers: - image.seek(2, 1) #skip segment length - x = struct.unpack('B', image.read(1)) #data precision - if x[0] != 8: - raise PDFError('JPEG must have 8 bits per component') - y = struct.unpack('BB', image.read(2)) - height = (y[0] << 8) + y[1] - y = struct.unpack('BB', image.read(2)) - width = (y[0] << 8) + y[1] - y = struct.unpack('B', image.read(1)) - color = y[0] - return width, height, color - elif x[0] in unsupportedMarkers: - raise PDFError('JPEG Unsupported JPEG marker: %0.2x' % x[0]) - elif x[0] not in noParamMarkers: - #skip segments with parameters - #read length and skip the data - x = struct.unpack('BB', image.read(2)) - image.seek( (x[0] << 8) + x[1] - 2, 1) - -class _fusc: - def __init__(self,k, n): - assert k, 'Argument k should be a non empty string' - self._k = k - self._klen = len(k) - self._n = int(n) or 7 - - def encrypt(self,s): - return self.__rotate(asciiBase85Encode(''.join(map(chr,self.__fusc(list(map(ord,s)))))),self._n) - - def decrypt(self,s): - return ''.join(map(chr,self.__fusc(list(map(ord,asciiBase85Decode(self.__rotate(s,-self._n))))))) - - def __rotate(self,s,n): - l = len(s) - if n<0: n = l+n - n %= l - if not n: return s - return s[-n:]+s[:l-n] - - def __fusc(self,s): - slen = len(s) - return list(map(lambda x,y: x ^ y,s,list(map(ord,((int(slen/self._klen)+1)*self._k)[:slen])))) diff --git a/reportlab/pdfbase/rl_codecs.py b/reportlab/pdfbase/rl_codecs.py deleted file mode 100644 index bf3a4195..00000000 --- a/reportlab/pdfbase/rl_codecs.py +++ /dev/null @@ -1,1054 +0,0 @@ -#codecs support -__all__=['RL_Codecs'] -from collections import namedtuple -StdCodecData=namedtuple('StdCodecData','exceptions rexceptions') -ExtCodecData=namedtuple('ExtCodecData','baseName exceptions rexceptions') -class RL_Codecs: - __rl_codecs_data = { - 'winansi':StdCodecData({ - 0x007f: 0x2022, # BULLET - 0x0080: 0x20ac, # EURO SIGN - 0x0081: 0x2022, # BULLET - 0x0082: 0x201a, # SINGLE LOW-9 QUOTATION MARK - 0x0083: 0x0192, # LATIN SMALL LETTER F WITH HOOK - 0x0084: 0x201e, # DOUBLE LOW-9 QUOTATION MARK - 0x0085: 0x2026, # HORIZONTAL ELLIPSIS - 0x0086: 0x2020, # DAGGER - 0x0087: 0x2021, # DOUBLE DAGGER - 0x0088: 0x02c6, # MODIFIER LETTER CIRCUMFLEX ACCENT - 0x0089: 0x2030, # PER MILLE SIGN - 0x008a: 0x0160, # LATIN CAPITAL LETTER S WITH CARON - 0x008b: 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 0x008c: 0x0152, # LATIN CAPITAL LIGATURE OE - 0x008d: 0x2022, # BULLET - 0x008e: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON - 0x008f: 0x2022, # BULLET - 0x0090: 0x2022, # BULLET - 0x0091: 0x2018, # LEFT SINGLE QUOTATION MARK - 0x0092: 0x2019, # RIGHT SINGLE QUOTATION MARK - 0x0093: 0x201c, # LEFT DOUBLE QUOTATION MARK - 0x0094: 0x201d, # RIGHT DOUBLE QUOTATION MARK - 0x0095: 0x2022, # BULLET - 0x0096: 0x2013, # EN DASH - 0x0097: 0x2014, # EM DASH - 0x0098: 0x02dc, # SMALL TILDE - 0x0099: 0x2122, # TRADE MARK SIGN - 0x009a: 0x0161, # LATIN SMALL LETTER S WITH CARON - 0x009b: 0x203a, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 0x009c: 0x0153, # LATIN SMALL LIGATURE OE - 0x009d: 0x2022, # BULLET - 0x009e: 0x017e, # LATIN SMALL LETTER Z WITH CARON - 0x009f: 0x0178, # LATIN CAPITAL LETTER Y WITH DIAERESIS - 0x00a0: 0x0020, # SPACE - }, {0x2022:0x7f,0x20:0x20,0xa0:0x20}), - 'macroman':StdCodecData({ - 0x007f: None, # UNDEFINED - 0x0080: 0x00c4, # LATIN CAPITAL LETTER A WITH DIAERESIS - 0x0081: 0x00c5, # LATIN CAPITAL LETTER A WITH RING ABOVE - 0x0082: 0x00c7, # LATIN CAPITAL LETTER C WITH CEDILLA - 0x0083: 0x00c9, # LATIN CAPITAL LETTER E WITH ACUTE - 0x0084: 0x00d1, # LATIN CAPITAL LETTER N WITH TILDE - 0x0085: 0x00d6, # LATIN CAPITAL LETTER O WITH DIAERESIS - 0x0086: 0x00dc, # LATIN CAPITAL LETTER U WITH DIAERESIS - 0x0087: 0x00e1, # LATIN SMALL LETTER A WITH ACUTE - 0x0088: 0x00e0, # LATIN SMALL LETTER A WITH GRAVE - 0x0089: 0x00e2, # LATIN SMALL LETTER A WITH CIRCUMFLEX - 0x008a: 0x00e4, # LATIN SMALL LETTER A WITH DIAERESIS - 0x008b: 0x00e3, # LATIN SMALL LETTER A WITH TILDE - 0x008c: 0x00e5, # LATIN SMALL LETTER A WITH RING ABOVE - 0x008d: 0x00e7, # LATIN SMALL LETTER C WITH CEDILLA - 0x008e: 0x00e9, # LATIN SMALL LETTER E WITH ACUTE - 0x008f: 0x00e8, # LATIN SMALL LETTER E WITH GRAVE - 0x0090: 0x00ea, # LATIN SMALL LETTER E WITH CIRCUMFLEX - 0x0091: 0x00eb, # LATIN SMALL LETTER E WITH DIAERESIS - 0x0092: 0x00ed, # LATIN SMALL LETTER I WITH ACUTE - 0x0093: 0x00ec, # LATIN SMALL LETTER I WITH GRAVE - 0x0094: 0x00ee, # LATIN SMALL LETTER I WITH CIRCUMFLEX - 0x0095: 0x00ef, # LATIN SMALL LETTER I WITH DIAERESIS - 0x0096: 0x00f1, # LATIN SMALL LETTER N WITH TILDE - 0x0097: 0x00f3, # LATIN SMALL LETTER O WITH ACUTE - 0x0098: 0x00f2, # LATIN SMALL LETTER O WITH GRAVE - 0x0099: 0x00f4, # LATIN SMALL LETTER O WITH CIRCUMFLEX - 0x009a: 0x00f6, # LATIN SMALL LETTER O WITH DIAERESIS - 0x009b: 0x00f5, # LATIN SMALL LETTER O WITH TILDE - 0x009c: 0x00fa, # LATIN SMALL LETTER U WITH ACUTE - 0x009d: 0x00f9, # LATIN SMALL LETTER U WITH GRAVE - 0x009e: 0x00fb, # LATIN SMALL LETTER U WITH CIRCUMFLEX - 0x009f: 0x00fc, # LATIN SMALL LETTER U WITH DIAERESIS - 0x00a0: 0x2020, # DAGGER - 0x00a1: 0x00b0, # DEGREE SIGN - 0x00a4: 0x00a7, # SECTION SIGN - 0x00a5: 0x2022, # BULLET - 0x00a6: 0x00b6, # PILCROW SIGN - 0x00a7: 0x00df, # LATIN SMALL LETTER SHARP S - 0x00a8: 0x00ae, # REGISTERED SIGN - 0x00aa: 0x2122, # TRADE MARK SIGN - 0x00ab: 0x00b4, # ACUTE ACCENT - 0x00ac: 0x00a8, # DIAERESIS - 0x00ad: None, # UNDEFINED - 0x00ae: 0x00c6, # LATIN CAPITAL LETTER AE - 0x00af: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE - 0x00b0: None, # UNDEFINED - 0x00b2: None, # UNDEFINED - 0x00b3: None, # UNDEFINED - 0x00b4: 0x00a5, # YEN SIGN - 0x00b6: None, # UNDEFINED - 0x00b7: None, # UNDEFINED - 0x00b8: None, # UNDEFINED - 0x00b9: None, # UNDEFINED - 0x00ba: None, # UNDEFINED - 0x00bb: 0x00aa, # FEMININE ORDINAL INDICATOR - 0x00bc: 0x00ba, # MASCULINE ORDINAL INDICATOR - 0x00bd: None, # UNDEFINED - 0x00be: 0x00e6, # LATIN SMALL LETTER AE - 0x00bf: 0x00f8, # LATIN SMALL LETTER O WITH STROKE - 0x00c0: 0x00bf, # INVERTED QUESTION MARK - 0x00c1: 0x00a1, # INVERTED EXCLAMATION MARK - 0x00c2: 0x00ac, # NOT SIGN - 0x00c3: None, # UNDEFINED - 0x00c4: 0x0192, # LATIN SMALL LETTER F WITH HOOK - 0x00c5: None, # UNDEFINED - 0x00c6: None, # UNDEFINED - 0x00c7: 0x00ab, # LEFT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00c8: 0x00bb, # RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK - 0x00c9: 0x2026, # HORIZONTAL ELLIPSIS - 0x00ca: 0x0020, # SPACE - 0x00cb: 0x00c0, # LATIN CAPITAL LETTER A WITH GRAVE - 0x00cc: 0x00c3, # LATIN CAPITAL LETTER A WITH TILDE - 0x00cd: 0x00d5, # LATIN CAPITAL LETTER O WITH TILDE - 0x00ce: 0x0152, # LATIN CAPITAL LIGATURE OE - 0x00cf: 0x0153, # LATIN SMALL LIGATURE OE - 0x00d0: 0x2013, # EN DASH - 0x00d1: 0x2014, # EM DASH - 0x00d2: 0x201c, # LEFT DOUBLE QUOTATION MARK - 0x00d3: 0x201d, # RIGHT DOUBLE QUOTATION MARK - 0x00d4: 0x2018, # LEFT SINGLE QUOTATION MARK - 0x00d5: 0x2019, # RIGHT SINGLE QUOTATION MARK - 0x00d6: 0x00f7, # DIVISION SIGN - 0x00d7: None, # UNDEFINED - 0x00d8: 0x00ff, # LATIN SMALL LETTER Y WITH DIAERESIS - 0x00d9: 0x0178, # LATIN CAPITAL LETTER Y WITH DIAERESIS - 0x00da: 0x2044, # FRACTION SLASH - 0x00db: 0x00a4, # CURRENCY SIGN - 0x00dc: 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 0x00dd: 0x203a, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 0x00de: 0xfb01, # LATIN SMALL LIGATURE FI - 0x00df: 0xfb02, # LATIN SMALL LIGATURE FL - 0x00e0: 0x2021, # DOUBLE DAGGER - 0x00e1: 0x00b7, # MIDDLE DOT - 0x00e2: 0x201a, # SINGLE LOW-9 QUOTATION MARK - 0x00e3: 0x201e, # DOUBLE LOW-9 QUOTATION MARK - 0x00e4: 0x2030, # PER MILLE SIGN - 0x00e5: 0x00c2, # LATIN CAPITAL LETTER A WITH CIRCUMFLEX - 0x00e6: 0x00ca, # LATIN CAPITAL LETTER E WITH CIRCUMFLEX - 0x00e7: 0x00c1, # LATIN CAPITAL LETTER A WITH ACUTE - 0x00e8: 0x00cb, # LATIN CAPITAL LETTER E WITH DIAERESIS - 0x00e9: 0x00c8, # LATIN CAPITAL LETTER E WITH GRAVE - 0x00ea: 0x00cd, # LATIN CAPITAL LETTER I WITH ACUTE - 0x00eb: 0x00ce, # LATIN CAPITAL LETTER I WITH CIRCUMFLEX - 0x00ec: 0x00cf, # LATIN CAPITAL LETTER I WITH DIAERESIS - 0x00ed: 0x00cc, # LATIN CAPITAL LETTER I WITH GRAVE - 0x00ee: 0x00d3, # LATIN CAPITAL LETTER O WITH ACUTE - 0x00ef: 0x00d4, # LATIN CAPITAL LETTER O WITH CIRCUMFLEX - 0x00f0: None, # UNDEFINED - 0x00f1: 0x00d2, # LATIN CAPITAL LETTER O WITH GRAVE - 0x00f2: 0x00da, # LATIN CAPITAL LETTER U WITH ACUTE - 0x00f3: 0x00db, # LATIN CAPITAL LETTER U WITH CIRCUMFLEX - 0x00f4: 0x00d9, # LATIN CAPITAL LETTER U WITH GRAVE - 0x00f5: 0x0131, # LATIN SMALL LETTER DOTLESS I - 0x00f6: 0x02c6, # MODIFIER LETTER CIRCUMFLEX ACCENT - 0x00f7: 0x02dc, # SMALL TILDE - 0x00f8: 0x00af, # MACRON - 0x00f9: 0x02d8, # BREVE - 0x00fa: 0x02d9, # DOT ABOVE - 0x00fb: 0x02da, # RING ABOVE - 0x00fc: 0x00b8, # CEDILLA - 0x00fd: 0x02dd, # DOUBLE ACUTE ACCENT - 0x00fe: 0x02db, # OGONEK - 0x00ff: 0x02c7, # CARON - },None), - 'standard':StdCodecData({ - 0x0027: 0x2019, # RIGHT SINGLE QUOTATION MARK - 0x0060: 0x2018, # LEFT SINGLE QUOTATION MARK - 0x007f: None, # UNDEFINED - 0x0080: None, # UNDEFINED - 0x0081: None, # UNDEFINED - 0x0082: None, # UNDEFINED - 0x0083: None, # UNDEFINED - 0x0084: None, # UNDEFINED - 0x0085: None, # UNDEFINED - 0x0086: None, # UNDEFINED - 0x0087: None, # UNDEFINED - 0x0088: None, # UNDEFINED - 0x0089: None, # UNDEFINED - 0x008a: None, # UNDEFINED - 0x008b: None, # UNDEFINED - 0x008c: None, # UNDEFINED - 0x008d: None, # UNDEFINED - 0x008e: None, # UNDEFINED - 0x008f: None, # UNDEFINED - 0x0090: None, # UNDEFINED - 0x0091: None, # UNDEFINED - 0x0092: None, # UNDEFINED - 0x0093: None, # UNDEFINED - 0x0094: None, # UNDEFINED - 0x0095: None, # UNDEFINED - 0x0096: None, # UNDEFINED - 0x0097: None, # UNDEFINED - 0x0098: None, # UNDEFINED - 0x0099: None, # UNDEFINED - 0x009a: None, # UNDEFINED - 0x009b: None, # UNDEFINED - 0x009c: None, # UNDEFINED - 0x009d: None, # UNDEFINED - 0x009e: None, # UNDEFINED - 0x009f: None, # UNDEFINED - 0x00a0: None, # UNDEFINED - 0x00a4: 0x2044, # FRACTION SLASH - 0x00a6: 0x0192, # LATIN SMALL LETTER F WITH HOOK - 0x00a8: 0x00a4, # CURRENCY SIGN - 0x00a9: 0x0027, # APOSTROPHE - 0x00aa: 0x201c, # LEFT DOUBLE QUOTATION MARK - 0x00ac: 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 0x00ad: 0x203a, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 0x00ae: 0xfb01, # LATIN SMALL LIGATURE FI - 0x00af: 0xfb02, # LATIN SMALL LIGATURE FL - 0x00b0: None, # UNDEFINED - 0x00b1: 0x2013, # EN DASH - 0x00b2: 0x2020, # DAGGER - 0x00b3: 0x2021, # DOUBLE DAGGER - 0x00b4: 0x00b7, # MIDDLE DOT - 0x00b5: None, # UNDEFINED - 0x00b7: 0x2022, # BULLET - 0x00b8: 0x201a, # SINGLE LOW-9 QUOTATION MARK - 0x00b9: 0x201e, # DOUBLE LOW-9 QUOTATION MARK - 0x00ba: 0x201d, # RIGHT DOUBLE QUOTATION MARK - 0x00bc: 0x2026, # HORIZONTAL ELLIPSIS - 0x00bd: 0x2030, # PER MILLE SIGN - 0x00be: None, # UNDEFINED - 0x00c0: None, # UNDEFINED - 0x00c1: 0x0060, # GRAVE ACCENT - 0x00c2: 0x00b4, # ACUTE ACCENT - 0x00c3: 0x02c6, # MODIFIER LETTER CIRCUMFLEX ACCENT - 0x00c4: 0x02dc, # SMALL TILDE - 0x00c5: 0x00af, # MACRON - 0x00c6: 0x02d8, # BREVE - 0x00c7: 0x02d9, # DOT ABOVE - 0x00c8: 0x00a8, # DIAERESIS - 0x00c9: None, # UNDEFINED - 0x00ca: 0x02da, # RING ABOVE - 0x00cb: 0x00b8, # CEDILLA - 0x00cc: None, # UNDEFINED - 0x00cd: 0x02dd, # DOUBLE ACUTE ACCENT - 0x00ce: 0x02db, # OGONEK - 0x00cf: 0x02c7, # CARON - 0x00d0: 0x2014, # EM DASH - 0x00d1: None, # UNDEFINED - 0x00d2: None, # UNDEFINED - 0x00d3: None, # UNDEFINED - 0x00d4: None, # UNDEFINED - 0x00d5: None, # UNDEFINED - 0x00d6: None, # UNDEFINED - 0x00d7: None, # UNDEFINED - 0x00d8: None, # UNDEFINED - 0x00d9: None, # UNDEFINED - 0x00da: None, # UNDEFINED - 0x00db: None, # UNDEFINED - 0x00dc: None, # UNDEFINED - 0x00dd: None, # UNDEFINED - 0x00de: None, # UNDEFINED - 0x00df: None, # UNDEFINED - 0x00e0: None, # UNDEFINED - 0x00e1: 0x00c6, # LATIN CAPITAL LETTER AE - 0x00e2: None, # UNDEFINED - 0x00e3: 0x00aa, # FEMININE ORDINAL INDICATOR - 0x00e4: None, # UNDEFINED - 0x00e5: None, # UNDEFINED - 0x00e6: None, # UNDEFINED - 0x00e7: None, # UNDEFINED - 0x00e8: 0x0141, # LATIN CAPITAL LETTER L WITH STROKE - 0x00e9: 0x00d8, # LATIN CAPITAL LETTER O WITH STROKE - 0x00ea: 0x0152, # LATIN CAPITAL LIGATURE OE - 0x00eb: 0x00ba, # MASCULINE ORDINAL INDICATOR - 0x00ec: None, # UNDEFINED - 0x00ed: None, # UNDEFINED - 0x00ee: None, # UNDEFINED - 0x00ef: None, # UNDEFINED - 0x00f0: None, # UNDEFINED - 0x00f1: 0x00e6, # LATIN SMALL LETTER AE - 0x00f2: None, # UNDEFINED - 0x00f3: None, # UNDEFINED - 0x00f4: None, # UNDEFINED - 0x00f5: 0x0131, # LATIN SMALL LETTER DOTLESS I - 0x00f6: None, # UNDEFINED - 0x00f7: None, # UNDEFINED - 0x00f8: 0x0142, # LATIN SMALL LETTER L WITH STROKE - 0x00f9: 0x00f8, # LATIN SMALL LETTER O WITH STROKE - 0x00fa: 0x0153, # LATIN SMALL LIGATURE OE - 0x00fb: 0x00df, # LATIN SMALL LETTER SHARP S - 0x00fc: None, # UNDEFINED - 0x00fd: None, # UNDEFINED - 0x00fe: None, # UNDEFINED - 0x00ff: None, # UNDEFINED - },None), - 'symbol':StdCodecData({ - 0x0022: 0x2200, # FOR ALL - 0x0024: 0x2203, # THERE EXISTS - 0x0027: 0x220b, # CONTAINS AS MEMBER - 0x002a: 0x2217, # ASTERISK OPERATOR - 0x002d: 0x2212, # MINUS SIGN - 0x0040: 0x2245, # APPROXIMATELY EQUAL TO - 0x0041: 0x0391, # GREEK CAPITAL LETTER ALPHA - 0x0042: 0x0392, # GREEK CAPITAL LETTER BETA - 0x0043: 0x03a7, # GREEK CAPITAL LETTER CHI - 0x0044: 0x2206, # INCREMENT - 0x0045: 0x0395, # GREEK CAPITAL LETTER EPSILON - 0x0046: 0x03a6, # GREEK CAPITAL LETTER PHI - 0x0047: 0x0393, # GREEK CAPITAL LETTER GAMMA - 0x0048: 0x0397, # GREEK CAPITAL LETTER ETA - 0x0049: 0x0399, # GREEK CAPITAL LETTER IOTA - 0x004a: 0x03d1, # GREEK THETA SYMBOL - 0x004b: 0x039a, # GREEK CAPITAL LETTER KAPPA - 0x004c: 0x039b, # GREEK CAPITAL LETTER LAMDA - 0x004d: 0x039c, # GREEK CAPITAL LETTER MU - 0x004e: 0x039d, # GREEK CAPITAL LETTER NU - 0x004f: 0x039f, # GREEK CAPITAL LETTER OMICRON - 0x0050: 0x03a0, # GREEK CAPITAL LETTER PI - 0x0051: 0x0398, # GREEK CAPITAL LETTER THETA - 0x0052: 0x03a1, # GREEK CAPITAL LETTER RHO - 0x0053: 0x03a3, # GREEK CAPITAL LETTER SIGMA - 0x0054: 0x03a4, # GREEK CAPITAL LETTER TAU - 0x0055: 0x03a5, # GREEK CAPITAL LETTER UPSILON - 0x0056: 0x03c2, # GREEK SMALL LETTER FINAL SIGMA - 0x0057: 0x2126, # OHM SIGN - 0x0058: 0x039e, # GREEK CAPITAL LETTER XI - 0x0059: 0x03a8, # GREEK CAPITAL LETTER PSI - 0x005a: 0x0396, # GREEK CAPITAL LETTER ZETA - 0x005c: 0x2234, # THEREFORE - 0x005e: 0x22a5, # UP TACK - 0x0060: 0xf8e5, # [unknown unicode name for radicalex] - 0x0061: 0x03b1, # GREEK SMALL LETTER ALPHA - 0x0062: 0x03b2, # GREEK SMALL LETTER BETA - 0x0063: 0x03c7, # GREEK SMALL LETTER CHI - 0x0064: 0x03b4, # GREEK SMALL LETTER DELTA - 0x0065: 0x03b5, # GREEK SMALL LETTER EPSILON - 0x0066: 0x03c6, # GREEK SMALL LETTER PHI - 0x0067: 0x03b3, # GREEK SMALL LETTER GAMMA - 0x0068: 0x03b7, # GREEK SMALL LETTER ETA - 0x0069: 0x03b9, # GREEK SMALL LETTER IOTA - 0x006a: 0x03d5, # GREEK PHI SYMBOL - 0x006b: 0x03ba, # GREEK SMALL LETTER KAPPA - 0x006c: 0x03bb, # GREEK SMALL LETTER LAMDA - 0x006d: 0x00b5, # MICRO SIGN - 0x006e: 0x03bd, # GREEK SMALL LETTER NU - 0x006f: 0x03bf, # GREEK SMALL LETTER OMICRON - 0x0070: 0x03c0, # GREEK SMALL LETTER PI - 0x0071: 0x03b8, # GREEK SMALL LETTER THETA - 0x0072: 0x03c1, # GREEK SMALL LETTER RHO - 0x0073: 0x03c3, # GREEK SMALL LETTER SIGMA - 0x0074: 0x03c4, # GREEK SMALL LETTER TAU - 0x0075: 0x03c5, # GREEK SMALL LETTER UPSILON - 0x0076: 0x03d6, # GREEK PI SYMBOL - 0x0077: 0x03c9, # GREEK SMALL LETTER OMEGA - 0x0078: 0x03be, # GREEK SMALL LETTER XI - 0x0079: 0x03c8, # GREEK SMALL LETTER PSI - 0x007a: 0x03b6, # GREEK SMALL LETTER ZETA - 0x007e: 0x223c, # TILDE OPERATOR - 0x007f: None, # UNDEFINED - 0x0080: None, # UNDEFINED - 0x0081: None, # UNDEFINED - 0x0082: None, # UNDEFINED - 0x0083: None, # UNDEFINED - 0x0084: None, # UNDEFINED - 0x0085: None, # UNDEFINED - 0x0086: None, # UNDEFINED - 0x0087: None, # UNDEFINED - 0x0088: None, # UNDEFINED - 0x0089: None, # UNDEFINED - 0x008a: None, # UNDEFINED - 0x008b: None, # UNDEFINED - 0x008c: None, # UNDEFINED - 0x008d: None, # UNDEFINED - 0x008e: None, # UNDEFINED - 0x008f: None, # UNDEFINED - 0x0090: None, # UNDEFINED - 0x0091: None, # UNDEFINED - 0x0092: None, # UNDEFINED - 0x0093: None, # UNDEFINED - 0x0094: None, # UNDEFINED - 0x0095: None, # UNDEFINED - 0x0096: None, # UNDEFINED - 0x0097: None, # UNDEFINED - 0x0098: None, # UNDEFINED - 0x0099: None, # UNDEFINED - 0x009a: None, # UNDEFINED - 0x009b: None, # UNDEFINED - 0x009c: None, # UNDEFINED - 0x009d: None, # UNDEFINED - 0x009e: None, # UNDEFINED - 0x009f: None, # UNDEFINED - 0x00a0: 0x20ac, # EURO SIGN - 0x00a1: 0x03d2, # GREEK UPSILON WITH HOOK SYMBOL - 0x00a2: 0x2032, # PRIME - 0x00a3: 0x2264, # LESS-THAN OR EQUAL TO - 0x00a4: 0x2044, # FRACTION SLASH - 0x00a5: 0x221e, # INFINITY - 0x00a6: 0x0192, # LATIN SMALL LETTER F WITH HOOK - 0x00a7: 0x2663, # BLACK CLUB SUIT - 0x00a8: 0x2666, # BLACK DIAMOND SUIT - 0x00a9: 0x2665, # BLACK HEART SUIT - 0x00aa: 0x2660, # BLACK SPADE SUIT - 0x00ab: 0x2194, # LEFT RIGHT ARROW - 0x00ac: 0x2190, # LEFTWARDS ARROW - 0x00ad: 0x2191, # UPWARDS ARROW - 0x00ae: 0x2192, # RIGHTWARDS ARROW - 0x00af: 0x2193, # DOWNWARDS ARROW - 0x00b2: 0x2033, # DOUBLE PRIME - 0x00b3: 0x2265, # GREATER-THAN OR EQUAL TO - 0x00b4: 0x00d7, # MULTIPLICATION SIGN - 0x00b5: 0x221d, # PROPORTIONAL TO - 0x00b6: 0x2202, # PARTIAL DIFFERENTIAL - 0x00b7: 0x2022, # BULLET - 0x00b8: 0x00f7, # DIVISION SIGN - 0x00b9: 0x2260, # NOT EQUAL TO - 0x00ba: 0x2261, # IDENTICAL TO - 0x00bb: 0x2248, # ALMOST EQUAL TO - 0x00bc: 0x2026, # HORIZONTAL ELLIPSIS - 0x00bd: 0xf8e6, # [unknown unicode name for arrowvertex] - 0x00be: 0xf8e7, # [unknown unicode name for arrowhorizex] - 0x00bf: 0x21b5, # DOWNWARDS ARROW WITH CORNER LEFTWARDS - 0x00c0: 0x2135, # ALEF SYMBOL - 0x00c1: 0x2111, # BLACK-LETTER CAPITAL I - 0x00c2: 0x211c, # BLACK-LETTER CAPITAL R - 0x00c3: 0x2118, # SCRIPT CAPITAL P - 0x00c4: 0x2297, # CIRCLED TIMES - 0x00c5: 0x2295, # CIRCLED PLUS - 0x00c6: 0x2205, # EMPTY SET - 0x00c7: 0x2229, # INTERSECTION - 0x00c8: 0x222a, # UNION - 0x00c9: 0x2283, # SUPERSET OF - 0x00ca: 0x2287, # SUPERSET OF OR EQUAL TO - 0x00cb: 0x2284, # NOT A SUBSET OF - 0x00cc: 0x2282, # SUBSET OF - 0x00cd: 0x2286, # SUBSET OF OR EQUAL TO - 0x00ce: 0x2208, # ELEMENT OF - 0x00cf: 0x2209, # NOT AN ELEMENT OF - 0x00d0: 0x2220, # ANGLE - 0x00d1: 0x2207, # NABLA - 0x00d2: 0xf6da, # [unknown unicode name for registerserif] - 0x00d3: 0xf6d9, # [unknown unicode name for copyrightserif] - 0x00d4: 0xf6db, # [unknown unicode name for trademarkserif] - 0x00d5: 0x220f, # N-ARY PRODUCT - 0x00d6: 0x221a, # SQUARE ROOT - 0x00d7: 0x22c5, # DOT OPERATOR - 0x00d8: 0x00ac, # NOT SIGN - 0x00d9: 0x2227, # LOGICAL AND - 0x00da: 0x2228, # LOGICAL OR - 0x00db: 0x21d4, # LEFT RIGHT DOUBLE ARROW - 0x00dc: 0x21d0, # LEFTWARDS DOUBLE ARROW - 0x00dd: 0x21d1, # UPWARDS DOUBLE ARROW - 0x00de: 0x21d2, # RIGHTWARDS DOUBLE ARROW - 0x00df: 0x21d3, # DOWNWARDS DOUBLE ARROW - 0x00e0: 0x25ca, # LOZENGE - 0x00e1: 0x2329, # LEFT-POINTING ANGLE BRACKET - 0x00e2: 0xf8e8, # [unknown unicode name for registersans] - 0x00e3: 0xf8e9, # [unknown unicode name for copyrightsans] - 0x00e4: 0xf8ea, # [unknown unicode name for trademarksans] - 0x00e5: 0x2211, # N-ARY SUMMATION - 0x00e6: 0xf8eb, # [unknown unicode name for parenlefttp] - 0x00e7: 0xf8ec, # [unknown unicode name for parenleftex] - 0x00e8: 0xf8ed, # [unknown unicode name for parenleftbt] - 0x00e9: 0xf8ee, # [unknown unicode name for bracketlefttp] - 0x00ea: 0xf8ef, # [unknown unicode name for bracketleftex] - 0x00eb: 0xf8f0, # [unknown unicode name for bracketleftbt] - 0x00ec: 0xf8f1, # [unknown unicode name for bracelefttp] - 0x00ed: 0xf8f2, # [unknown unicode name for braceleftmid] - 0x00ee: 0xf8f3, # [unknown unicode name for braceleftbt] - 0x00ef: 0xf8f4, # [unknown unicode name for braceex] - 0x00f0: None, # UNDEFINED - 0x00f1: 0x232a, # RIGHT-POINTING ANGLE BRACKET - 0x00f2: 0x222b, # INTEGRAL - 0x00f3: 0x2320, # TOP HALF INTEGRAL - 0x00f4: 0xf8f5, # [unknown unicode name for integralex] - 0x00f5: 0x2321, # BOTTOM HALF INTEGRAL - 0x00f6: 0xf8f6, # [unknown unicode name for parenrighttp] - 0x00f7: 0xf8f7, # [unknown unicode name for parenrightex] - 0x00f8: 0xf8f8, # [unknown unicode name for parenrightbt] - 0x00f9: 0xf8f9, # [unknown unicode name for bracketrighttp] - 0x00fa: 0xf8fa, # [unknown unicode name for bracketrightex] - 0x00fb: 0xf8fb, # [unknown unicode name for bracketrightbt] - 0x00fc: 0xf8fc, # [unknown unicode name for bracerighttp] - 0x00fd: 0xf8fd, # [unknown unicode name for bracerightmid] - 0x00fe: 0xf8fe, # [unknown unicode name for bracerightbt] - 0x00ff: None, # UNDEFINED - }, - { - 0x0394:0x0044, # GREEK CAPITAL LETTER DELTA - 0x03a9:0x0057, # GREEK CAPITAL LETTER OMEGA - 0x03bc:0x006d, # GREEK SMALL LETTER MU - } - ), - 'zapfdingbats':StdCodecData({ - 0x0021: 0x2701, # UPPER BLADE SCISSORS - 0x0022: 0x2702, # BLACK SCISSORS - 0x0023: 0x2703, # LOWER BLADE SCISSORS - 0x0024: 0x2704, # WHITE SCISSORS - 0x0025: 0x260e, # BLACK TELEPHONE - 0x0026: 0x2706, # TELEPHONE LOCATION SIGN - 0x0027: 0x2707, # TAPE DRIVE - 0x0028: 0x2708, # AIRPLANE - 0x0029: 0x2709, # ENVELOPE - 0x002a: 0x261b, # BLACK RIGHT POINTING INDEX - 0x002b: 0x261e, # WHITE RIGHT POINTING INDEX - 0x002c: 0x270c, # VICTORY HAND - 0x002d: 0x270d, # WRITING HAND - 0x002e: 0x270e, # LOWER RIGHT PENCIL - 0x002f: 0x270f, # PENCIL - 0x0030: 0x2710, # UPPER RIGHT PENCIL - 0x0031: 0x2711, # WHITE NIB - 0x0032: 0x2712, # BLACK NIB - 0x0033: 0x2713, # CHECK MARK - 0x0034: 0x2714, # HEAVY CHECK MARK - 0x0035: 0x2715, # MULTIPLICATION X - 0x0036: 0x2716, # HEAVY MULTIPLICATION X - 0x0037: 0x2717, # BALLOT X - 0x0038: 0x2718, # HEAVY BALLOT X - 0x0039: 0x2719, # OUTLINED GREEK CROSS - 0x003a: 0x271a, # HEAVY GREEK CROSS - 0x003b: 0x271b, # OPEN CENTRE CROSS - 0x003c: 0x271c, # HEAVY OPEN CENTRE CROSS - 0x003d: 0x271d, # LATIN CROSS - 0x003e: 0x271e, # SHADOWED WHITE LATIN CROSS - 0x003f: 0x271f, # OUTLINED LATIN CROSS - 0x0040: 0x2720, # MALTESE CROSS - 0x0041: 0x2721, # STAR OF DAVID - 0x0042: 0x2722, # FOUR TEARDROP-SPOKED ASTERISK - 0x0043: 0x2723, # FOUR BALLOON-SPOKED ASTERISK - 0x0044: 0x2724, # HEAVY FOUR BALLOON-SPOKED ASTERISK - 0x0045: 0x2725, # FOUR CLUB-SPOKED ASTERISK - 0x0046: 0x2726, # BLACK FOUR POINTED STAR - 0x0047: 0x2727, # WHITE FOUR POINTED STAR - 0x0048: 0x2605, # BLACK STAR - 0x0049: 0x2729, # STRESS OUTLINED WHITE STAR - 0x004a: 0x272a, # CIRCLED WHITE STAR - 0x004b: 0x272b, # OPEN CENTRE BLACK STAR - 0x004c: 0x272c, # BLACK CENTRE WHITE STAR - 0x004d: 0x272d, # OUTLINED BLACK STAR - 0x004e: 0x272e, # HEAVY OUTLINED BLACK STAR - 0x004f: 0x272f, # PINWHEEL STAR - 0x0050: 0x2730, # SHADOWED WHITE STAR - 0x0051: 0x2731, # HEAVY ASTERISK - 0x0052: 0x2732, # OPEN CENTRE ASTERISK - 0x0053: 0x2733, # EIGHT SPOKED ASTERISK - 0x0054: 0x2734, # EIGHT POINTED BLACK STAR - 0x0055: 0x2735, # EIGHT POINTED PINWHEEL STAR - 0x0056: 0x2736, # SIX POINTED BLACK STAR - 0x0057: 0x2737, # EIGHT POINTED RECTILINEAR BLACK STAR - 0x0058: 0x2738, # HEAVY EIGHT POINTED RECTILINEAR BLACK STAR - 0x0059: 0x2739, # TWELVE POINTED BLACK STAR - 0x005a: 0x273a, # SIXTEEN POINTED ASTERISK - 0x005b: 0x273b, # TEARDROP-SPOKED ASTERISK - 0x005c: 0x273c, # OPEN CENTRE TEARDROP-SPOKED ASTERISK - 0x005d: 0x273d, # HEAVY TEARDROP-SPOKED ASTERISK - 0x005e: 0x273e, # SIX PETALLED BLACK AND WHITE FLORETTE - 0x005f: 0x273f, # BLACK FLORETTE - 0x0060: 0x2740, # WHITE FLORETTE - 0x0061: 0x2741, # EIGHT PETALLED OUTLINED BLACK FLORETTE - 0x0062: 0x2742, # CIRCLED OPEN CENTRE EIGHT POINTED STAR - 0x0063: 0x2743, # HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK - 0x0064: 0x2744, # SNOWFLAKE - 0x0065: 0x2745, # TIGHT TRIFOLIATE SNOWFLAKE - 0x0066: 0x2746, # HEAVY CHEVRON SNOWFLAKE - 0x0067: 0x2747, # SPARKLE - 0x0068: 0x2748, # HEAVY SPARKLE - 0x0069: 0x2749, # BALLOON-SPOKED ASTERISK - 0x006a: 0x274a, # EIGHT TEARDROP-SPOKED PROPELLER ASTERISK - 0x006b: 0x274b, # HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK - 0x006c: 0x25cf, # BLACK CIRCLE - 0x006d: 0x274d, # SHADOWED WHITE CIRCLE - 0x006e: 0x25a0, # BLACK SQUARE - 0x006f: 0x274f, # LOWER RIGHT DROP-SHADOWED WHITE SQUARE - 0x0070: 0x2750, # UPPER RIGHT DROP-SHADOWED WHITE SQUARE - 0x0071: 0x2751, # LOWER RIGHT SHADOWED WHITE SQUARE - 0x0072: 0x2752, # UPPER RIGHT SHADOWED WHITE SQUARE - 0x0073: 0x25b2, # BLACK UP-POINTING TRIANGLE - 0x0074: 0x25bc, # BLACK DOWN-POINTING TRIANGLE - 0x0075: 0x25c6, # BLACK DIAMOND - 0x0076: 0x2756, # BLACK DIAMOND MINUS WHITE X - 0x0077: 0x25d7, # RIGHT HALF BLACK CIRCLE - 0x0078: 0x2758, # LIGHT VERTICAL BAR - 0x0079: 0x2759, # MEDIUM VERTICAL BAR - 0x007a: 0x275a, # HEAVY VERTICAL BAR - 0x007b: 0x275b, # HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT - 0x007c: 0x275c, # HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT - 0x007d: 0x275d, # HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT - 0x007e: 0x275e, # HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT - 0x007f: None, # UNDEFINED - 0x0080: 0x2768, # MEDIUM LEFT PARENTHESIS ORNAMENT - 0x0081: 0x2769, # MEDIUM RIGHT PARENTHESIS ORNAMENT - 0x0082: 0x276a, # MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT - 0x0083: 0x276b, # MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT - 0x0084: 0x276c, # MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT - 0x0085: 0x276d, # MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT - 0x0086: 0x276e, # HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT - 0x0087: 0x276f, # HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT - 0x0088: 0x2770, # HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT - 0x0089: 0x2771, # HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT - 0x008a: 0x2772, # LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT - 0x008b: 0x2773, # LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT - 0x008c: 0x2774, # MEDIUM LEFT CURLY BRACKET ORNAMENT - 0x008d: 0x2775, # MEDIUM RIGHT CURLY BRACKET ORNAMENT - 0x008e: None, # UNDEFINED - 0x008f: None, # UNDEFINED - 0x0090: None, # UNDEFINED - 0x0091: None, # UNDEFINED - 0x0092: None, # UNDEFINED - 0x0093: None, # UNDEFINED - 0x0094: None, # UNDEFINED - 0x0095: None, # UNDEFINED - 0x0096: None, # UNDEFINED - 0x0097: None, # UNDEFINED - 0x0098: None, # UNDEFINED - 0x0099: None, # UNDEFINED - 0x009a: None, # UNDEFINED - 0x009b: None, # UNDEFINED - 0x009c: None, # UNDEFINED - 0x009d: None, # UNDEFINED - 0x009e: None, # UNDEFINED - 0x009f: None, # UNDEFINED - 0x00a0: None, # UNDEFINED - 0x00a1: 0x2761, # CURVED STEM PARAGRAPH SIGN ORNAMENT - 0x00a2: 0x2762, # HEAVY EXCLAMATION MARK ORNAMENT - 0x00a3: 0x2763, # HEAVY HEART EXCLAMATION MARK ORNAMENT - 0x00a4: 0x2764, # HEAVY BLACK HEART - 0x00a5: 0x2765, # ROTATED HEAVY BLACK HEART BULLET - 0x00a6: 0x2766, # FLORAL HEART - 0x00a7: 0x2767, # ROTATED FLORAL HEART BULLET - 0x00a8: 0x2663, # BLACK CLUB SUIT - 0x00a9: 0x2666, # BLACK DIAMOND SUIT - 0x00aa: 0x2665, # BLACK HEART SUIT - 0x00ab: 0x2660, # BLACK SPADE SUIT - 0x00ac: 0x2460, # CIRCLED DIGIT ONE - 0x00ad: 0x2461, # CIRCLED DIGIT TWO - 0x00ae: 0x2462, # CIRCLED DIGIT THREE - 0x00af: 0x2463, # CIRCLED DIGIT FOUR - 0x00b0: 0x2464, # CIRCLED DIGIT FIVE - 0x00b1: 0x2465, # CIRCLED DIGIT SIX - 0x00b2: 0x2466, # CIRCLED DIGIT SEVEN - 0x00b3: 0x2467, # CIRCLED DIGIT EIGHT - 0x00b4: 0x2468, # CIRCLED DIGIT NINE - 0x00b5: 0x2469, # CIRCLED NUMBER TEN - 0x00b6: 0x2776, # DINGBAT NEGATIVE CIRCLED DIGIT ONE - 0x00b7: 0x2777, # DINGBAT NEGATIVE CIRCLED DIGIT TWO - 0x00b8: 0x2778, # DINGBAT NEGATIVE CIRCLED DIGIT THREE - 0x00b9: 0x2779, # DINGBAT NEGATIVE CIRCLED DIGIT FOUR - 0x00ba: 0x277a, # DINGBAT NEGATIVE CIRCLED DIGIT FIVE - 0x00bb: 0x277b, # DINGBAT NEGATIVE CIRCLED DIGIT SIX - 0x00bc: 0x277c, # DINGBAT NEGATIVE CIRCLED DIGIT SEVEN - 0x00bd: 0x277d, # DINGBAT NEGATIVE CIRCLED DIGIT EIGHT - 0x00be: 0x277e, # DINGBAT NEGATIVE CIRCLED DIGIT NINE - 0x00bf: 0x277f, # DINGBAT NEGATIVE CIRCLED NUMBER TEN - 0x00c0: 0x2780, # DINGBAT CIRCLED SANS-SERIF DIGIT ONE - 0x00c1: 0x2781, # DINGBAT CIRCLED SANS-SERIF DIGIT TWO - 0x00c2: 0x2782, # DINGBAT CIRCLED SANS-SERIF DIGIT THREE - 0x00c3: 0x2783, # DINGBAT CIRCLED SANS-SERIF DIGIT FOUR - 0x00c4: 0x2784, # DINGBAT CIRCLED SANS-SERIF DIGIT FIVE - 0x00c5: 0x2785, # DINGBAT CIRCLED SANS-SERIF DIGIT SIX - 0x00c6: 0x2786, # DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN - 0x00c7: 0x2787, # DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT - 0x00c8: 0x2788, # DINGBAT CIRCLED SANS-SERIF DIGIT NINE - 0x00c9: 0x2789, # DINGBAT CIRCLED SANS-SERIF NUMBER TEN - 0x00ca: 0x278a, # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE - 0x00cb: 0x278b, # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO - 0x00cc: 0x278c, # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE - 0x00cd: 0x278d, # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR - 0x00ce: 0x278e, # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE - 0x00cf: 0x278f, # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX - 0x00d0: 0x2790, # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN - 0x00d1: 0x2791, # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT - 0x00d2: 0x2792, # DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE - 0x00d3: 0x2793, # DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN - 0x00d4: 0x2794, # HEAVY WIDE-HEADED RIGHTWARDS ARROW - 0x00d5: 0x2192, # RIGHTWARDS ARROW - 0x00d6: 0x2194, # LEFT RIGHT ARROW - 0x00d7: 0x2195, # UP DOWN ARROW - 0x00d8: 0x2798, # HEAVY SOUTH EAST ARROW - 0x00d9: 0x2799, # HEAVY RIGHTWARDS ARROW - 0x00da: 0x279a, # HEAVY NORTH EAST ARROW - 0x00db: 0x279b, # DRAFTING POINT RIGHTWARDS ARROW - 0x00dc: 0x279c, # HEAVY ROUND-TIPPED RIGHTWARDS ARROW - 0x00dd: 0x279d, # TRIANGLE-HEADED RIGHTWARDS ARROW - 0x00de: 0x279e, # HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW - 0x00df: 0x279f, # DASHED TRIANGLE-HEADED RIGHTWARDS ARROW - 0x00e0: 0x27a0, # HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW - 0x00e1: 0x27a1, # BLACK RIGHTWARDS ARROW - 0x00e2: 0x27a2, # THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD - 0x00e3: 0x27a3, # THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD - 0x00e4: 0x27a4, # BLACK RIGHTWARDS ARROWHEAD - 0x00e5: 0x27a5, # HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW - 0x00e6: 0x27a6, # HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW - 0x00e7: 0x27a7, # SQUAT BLACK RIGHTWARDS ARROW - 0x00e8: 0x27a8, # HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW - 0x00e9: 0x27a9, # RIGHT-SHADED WHITE RIGHTWARDS ARROW - 0x00ea: 0x27aa, # LEFT-SHADED WHITE RIGHTWARDS ARROW - 0x00eb: 0x27ab, # BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW - 0x00ec: 0x27ac, # FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW - 0x00ed: 0x27ad, # HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW - 0x00ee: 0x27ae, # HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW - 0x00ef: 0x27af, # NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW - 0x00f0: None, # UNDEFINED - 0x00f1: 0x27b1, # NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW - 0x00f2: 0x27b2, # CIRCLED HEAVY WHITE RIGHTWARDS ARROW - 0x00f3: 0x27b3, # WHITE-FEATHERED RIGHTWARDS ARROW - 0x00f4: 0x27b4, # BLACK-FEATHERED SOUTH EAST ARROW - 0x00f5: 0x27b5, # BLACK-FEATHERED RIGHTWARDS ARROW - 0x00f6: 0x27b6, # BLACK-FEATHERED NORTH EAST ARROW - 0x00f7: 0x27b7, # HEAVY BLACK-FEATHERED SOUTH EAST ARROW - 0x00f8: 0x27b8, # HEAVY BLACK-FEATHERED RIGHTWARDS ARROW - 0x00f9: 0x27b9, # HEAVY BLACK-FEATHERED NORTH EAST ARROW - 0x00fa: 0x27ba, # TEARDROP-BARBED RIGHTWARDS ARROW - 0x00fb: 0x27bb, # HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW - 0x00fc: 0x27bc, # WEDGE-TAILED RIGHTWARDS ARROW - 0x00fd: 0x27bd, # HEAVY WEDGE-TAILED RIGHTWARDS ARROW - 0x00fe: 0x27be, # OPEN-OUTLINED RIGHTWARDS ARROW - 0x00ff: None, # UNDEFINED - },None), - 'pdfdoc':StdCodecData({ - 0x007f: None, # UNDEFINED - 0x0080: 0x2022, # BULLET - 0x0081: 0x2020, # DAGGER - 0x0082: 0x2021, # DOUBLE DAGGER - 0x0083: 0x2026, # HORIZONTAL ELLIPSIS - 0x0084: 0x2014, # EM DASH - 0x0085: 0x2013, # EN DASH - 0x0086: 0x0192, # LATIN SMALL LETTER F WITH HOOK - 0x0087: 0x2044, # FRACTION SLASH - 0x0088: 0x2039, # SINGLE LEFT-POINTING ANGLE QUOTATION MARK - 0x0089: 0x203a, # SINGLE RIGHT-POINTING ANGLE QUOTATION MARK - 0x008a: 0x2212, # MINUS SIGN - 0x008b: 0x2030, # PER MILLE SIGN - 0x008c: 0x201e, # DOUBLE LOW-9 QUOTATION MARK - 0x008d: 0x201c, # LEFT DOUBLE QUOTATION MARK - 0x008e: 0x201d, # RIGHT DOUBLE QUOTATION MARK - 0x008f: 0x2018, # LEFT SINGLE QUOTATION MARK - 0x0090: 0x2019, # RIGHT SINGLE QUOTATION MARK - 0x0091: 0x201a, # SINGLE LOW-9 QUOTATION MARK - 0x0092: 0x2122, # TRADE MARK SIGN - 0x0093: 0xfb01, # LATIN SMALL LIGATURE FI - 0x0094: 0xfb02, # LATIN SMALL LIGATURE FL - 0x0095: 0x0141, # LATIN CAPITAL LETTER L WITH STROKE - 0x0096: 0x0152, # LATIN CAPITAL LIGATURE OE - 0x0097: 0x0160, # LATIN CAPITAL LETTER S WITH CARON - 0x0098: 0x0178, # LATIN CAPITAL LETTER Y WITH DIAERESIS - 0x0099: 0x017d, # LATIN CAPITAL LETTER Z WITH CARON - 0x009a: 0x0131, # LATIN SMALL LETTER DOTLESS I - 0x009b: 0x0142, # LATIN SMALL LETTER L WITH STROKE - 0x009c: 0x0153, # LATIN SMALL LIGATURE OE - 0x009d: 0x0161, # LATIN SMALL LETTER S WITH CARON - 0x009e: 0x017e, # LATIN SMALL LETTER Z WITH CARON - 0x009f: None, # UNDEFINED - 0x00a0: 0x20ac, # EURO SIGN - 0x00ad: None, # UNDEFINED - 24: 0x02d8, #breve - 25: 0x02c7, #caron - 26: 0x02c6, #circumflex - 27: 0x02d9, #dotaccent - 28: 0x02dd, #hungarumlaut - 29: 0x02db, #ogonek - 30: 0x02da, #ring - 31: 0x02dc, #tilde - },None), - 'macexpert':StdCodecData({ - 0x0021: 0xf721, # [unknown unicode name for exclamsmall] - 0x0022: 0xf6f8, # [unknown unicode name for Hungarumlautsmall] - 0x0023: 0xf7a2, # [unknown unicode name for centoldstyle] - 0x0024: 0xf724, # [unknown unicode name for dollaroldstyle] - 0x0025: 0xf6e4, # [unknown unicode name for dollarsuperior] - 0x0026: 0xf726, # [unknown unicode name for ampersandsmall] - 0x0027: 0xf7b4, # [unknown unicode name for Acutesmall] - 0x0028: 0x207d, # SUPERSCRIPT LEFT PARENTHESIS - 0x0029: 0x207e, # SUPERSCRIPT RIGHT PARENTHESIS - 0x002a: 0x2025, # TWO DOT LEADER - 0x002b: 0x2024, # ONE DOT LEADER - 0x002f: 0x2044, # FRACTION SLASH - 0x0030: 0xf730, # [unknown unicode name for zerooldstyle] - 0x0031: 0xf731, # [unknown unicode name for oneoldstyle] - 0x0032: 0xf732, # [unknown unicode name for twooldstyle] - 0x0033: 0xf733, # [unknown unicode name for threeoldstyle] - 0x0034: 0xf734, # [unknown unicode name for fouroldstyle] - 0x0035: 0xf735, # [unknown unicode name for fiveoldstyle] - 0x0036: 0xf736, # [unknown unicode name for sixoldstyle] - 0x0037: 0xf737, # [unknown unicode name for sevenoldstyle] - 0x0038: 0xf738, # [unknown unicode name for eightoldstyle] - 0x0039: 0xf739, # [unknown unicode name for nineoldstyle] - 0x003c: None, # UNDEFINED - 0x003d: 0xf6de, # [unknown unicode name for threequartersemdash] - 0x003e: None, # UNDEFINED - 0x003f: 0xf73f, # [unknown unicode name for questionsmall] - 0x0040: None, # UNDEFINED - 0x0041: None, # UNDEFINED - 0x0042: None, # UNDEFINED - 0x0043: None, # UNDEFINED - 0x0044: 0xf7f0, # [unknown unicode name for Ethsmall] - 0x0045: None, # UNDEFINED - 0x0046: None, # UNDEFINED - 0x0047: 0x00bc, # VULGAR FRACTION ONE QUARTER - 0x0048: 0x00bd, # VULGAR FRACTION ONE HALF - 0x0049: 0x00be, # VULGAR FRACTION THREE QUARTERS - 0x004a: 0x215b, # VULGAR FRACTION ONE EIGHTH - 0x004b: 0x215c, # VULGAR FRACTION THREE EIGHTHS - 0x004c: 0x215d, # VULGAR FRACTION FIVE EIGHTHS - 0x004d: 0x215e, # VULGAR FRACTION SEVEN EIGHTHS - 0x004e: 0x2153, # VULGAR FRACTION ONE THIRD - 0x004f: 0x2154, # VULGAR FRACTION TWO THIRDS - 0x0050: None, # UNDEFINED - 0x0051: None, # UNDEFINED - 0x0052: None, # UNDEFINED - 0x0053: None, # UNDEFINED - 0x0054: None, # UNDEFINED - 0x0055: None, # UNDEFINED - 0x0056: 0xfb00, # LATIN SMALL LIGATURE FF - 0x0057: 0xfb01, # LATIN SMALL LIGATURE FI - 0x0058: 0xfb02, # LATIN SMALL LIGATURE FL - 0x0059: 0xfb03, # LATIN SMALL LIGATURE FFI - 0x005a: 0xfb04, # LATIN SMALL LIGATURE FFL - 0x005b: 0x208d, # SUBSCRIPT LEFT PARENTHESIS - 0x005c: None, # UNDEFINED - 0x005d: 0x208e, # SUBSCRIPT RIGHT PARENTHESIS - 0x005e: 0xf6f6, # [unknown unicode name for Circumflexsmall] - 0x005f: 0xf6e5, # [unknown unicode name for hypheninferior] - 0x0060: 0xf760, # [unknown unicode name for Gravesmall] - 0x0061: 0xf761, # [unknown unicode name for Asmall] - 0x0062: 0xf762, # [unknown unicode name for Bsmall] - 0x0063: 0xf763, # [unknown unicode name for Csmall] - 0x0064: 0xf764, # [unknown unicode name for Dsmall] - 0x0065: 0xf765, # [unknown unicode name for Esmall] - 0x0066: 0xf766, # [unknown unicode name for Fsmall] - 0x0067: 0xf767, # [unknown unicode name for Gsmall] - 0x0068: 0xf768, # [unknown unicode name for Hsmall] - 0x0069: 0xf769, # [unknown unicode name for Ismall] - 0x006a: 0xf76a, # [unknown unicode name for Jsmall] - 0x006b: 0xf76b, # [unknown unicode name for Ksmall] - 0x006c: 0xf76c, # [unknown unicode name for Lsmall] - 0x006d: 0xf76d, # [unknown unicode name for Msmall] - 0x006e: 0xf76e, # [unknown unicode name for Nsmall] - 0x006f: 0xf76f, # [unknown unicode name for Osmall] - 0x0070: 0xf770, # [unknown unicode name for Psmall] - 0x0071: 0xf771, # [unknown unicode name for Qsmall] - 0x0072: 0xf772, # [unknown unicode name for Rsmall] - 0x0073: 0xf773, # [unknown unicode name for Ssmall] - 0x0074: 0xf774, # [unknown unicode name for Tsmall] - 0x0075: 0xf775, # [unknown unicode name for Usmall] - 0x0076: 0xf776, # [unknown unicode name for Vsmall] - 0x0077: 0xf777, # [unknown unicode name for Wsmall] - 0x0078: 0xf778, # [unknown unicode name for Xsmall] - 0x0079: 0xf779, # [unknown unicode name for Ysmall] - 0x007a: 0xf77a, # [unknown unicode name for Zsmall] - 0x007b: 0x20a1, # COLON SIGN - 0x007c: 0xf6dc, # [unknown unicode name for onefitted] - 0x007d: 0xf6dd, # [unknown unicode name for rupiah] - 0x007e: 0xf6fe, # [unknown unicode name for Tildesmall] - 0x007f: None, # UNDEFINED - 0x0080: None, # UNDEFINED - 0x0081: 0xf6e9, # [unknown unicode name for asuperior] - 0x0082: 0xf6e0, # [unknown unicode name for centsuperior] - 0x0083: None, # UNDEFINED - 0x0084: None, # UNDEFINED - 0x0085: None, # UNDEFINED - 0x0086: None, # UNDEFINED - 0x0087: 0xf7e1, # [unknown unicode name for Aacutesmall] - 0x0088: 0xf7e0, # [unknown unicode name for Agravesmall] - 0x0089: 0xf7e2, # [unknown unicode name for Acircumflexsmall] - 0x008a: 0xf7e4, # [unknown unicode name for Adieresissmall] - 0x008b: 0xf7e3, # [unknown unicode name for Atildesmall] - 0x008c: 0xf7e5, # [unknown unicode name for Aringsmall] - 0x008d: 0xf7e7, # [unknown unicode name for Ccedillasmall] - 0x008e: 0xf7e9, # [unknown unicode name for Eacutesmall] - 0x008f: 0xf7e8, # [unknown unicode name for Egravesmall] - 0x0090: 0xf7ea, # [unknown unicode name for Ecircumflexsmall] - 0x0091: 0xf7eb, # [unknown unicode name for Edieresissmall] - 0x0092: 0xf7ed, # [unknown unicode name for Iacutesmall] - 0x0093: 0xf7ec, # [unknown unicode name for Igravesmall] - 0x0094: 0xf7ee, # [unknown unicode name for Icircumflexsmall] - 0x0095: 0xf7ef, # [unknown unicode name for Idieresissmall] - 0x0096: 0xf7f1, # [unknown unicode name for Ntildesmall] - 0x0097: 0xf7f3, # [unknown unicode name for Oacutesmall] - 0x0098: 0xf7f2, # [unknown unicode name for Ogravesmall] - 0x0099: 0xf7f4, # [unknown unicode name for Ocircumflexsmall] - 0x009a: 0xf7f6, # [unknown unicode name for Odieresissmall] - 0x009b: 0xf7f5, # [unknown unicode name for Otildesmall] - 0x009c: 0xf7fa, # [unknown unicode name for Uacutesmall] - 0x009d: 0xf7f9, # [unknown unicode name for Ugravesmall] - 0x009e: 0xf7fb, # [unknown unicode name for Ucircumflexsmall] - 0x009f: 0xf7fc, # [unknown unicode name for Udieresissmall] - 0x00a0: None, # UNDEFINED - 0x00a1: 0x2078, # SUPERSCRIPT EIGHT - 0x00a2: 0x2084, # SUBSCRIPT FOUR - 0x00a3: 0x2083, # SUBSCRIPT THREE - 0x00a4: 0x2086, # SUBSCRIPT SIX - 0x00a5: 0x2088, # SUBSCRIPT EIGHT - 0x00a6: 0x2087, # SUBSCRIPT SEVEN - 0x00a7: 0xf6fd, # [unknown unicode name for Scaronsmall] - 0x00a8: None, # UNDEFINED - 0x00a9: 0xf6df, # [unknown unicode name for centinferior] - 0x00aa: 0x2082, # SUBSCRIPT TWO - 0x00ab: None, # UNDEFINED - 0x00ac: 0xf7a8, # [unknown unicode name for Dieresissmall] - 0x00ad: None, # UNDEFINED - 0x00ae: 0xf6f5, # [unknown unicode name for Caronsmall] - 0x00af: 0xf6f0, # [unknown unicode name for osuperior] - 0x00b0: 0x2085, # SUBSCRIPT FIVE - 0x00b1: None, # UNDEFINED - 0x00b2: 0xf6e1, # [unknown unicode name for commainferior] - 0x00b3: 0xf6e7, # [unknown unicode name for periodinferior] - 0x00b4: 0xf7fd, # [unknown unicode name for Yacutesmall] - 0x00b5: None, # UNDEFINED - 0x00b6: 0xf6e3, # [unknown unicode name for dollarinferior] - 0x00b7: None, # UNDEFINED - 0x00b8: None, # UNDEFINED - 0x00b9: 0xf7fe, # [unknown unicode name for Thornsmall] - 0x00ba: None, # UNDEFINED - 0x00bb: 0x2089, # SUBSCRIPT NINE - 0x00bc: 0x2080, # SUBSCRIPT ZERO - 0x00bd: 0xf6ff, # [unknown unicode name for Zcaronsmall] - 0x00be: 0xf7e6, # [unknown unicode name for AEsmall] - 0x00bf: 0xf7f8, # [unknown unicode name for Oslashsmall] - 0x00c0: 0xf7bf, # [unknown unicode name for questiondownsmall] - 0x00c1: 0x2081, # SUBSCRIPT ONE - 0x00c2: 0xf6f9, # [unknown unicode name for Lslashsmall] - 0x00c3: None, # UNDEFINED - 0x00c4: None, # UNDEFINED - 0x00c5: None, # UNDEFINED - 0x00c6: None, # UNDEFINED - 0x00c7: None, # UNDEFINED - 0x00c8: None, # UNDEFINED - 0x00c9: 0xf7b8, # [unknown unicode name for Cedillasmall] - 0x00ca: None, # UNDEFINED - 0x00cb: None, # UNDEFINED - 0x00cc: None, # UNDEFINED - 0x00cd: None, # UNDEFINED - 0x00ce: None, # UNDEFINED - 0x00cf: 0xf6fa, # [unknown unicode name for OEsmall] - 0x00d0: 0x2012, # FIGURE DASH - 0x00d1: 0xf6e6, # [unknown unicode name for hyphensuperior] - 0x00d2: None, # UNDEFINED - 0x00d3: None, # UNDEFINED - 0x00d4: None, # UNDEFINED - 0x00d5: None, # UNDEFINED - 0x00d6: 0xf7a1, # [unknown unicode name for exclamdownsmall] - 0x00d7: None, # UNDEFINED - 0x00d8: 0xf7ff, # [unknown unicode name for Ydieresissmall] - 0x00d9: None, # UNDEFINED - 0x00da: 0x00b9, # SUPERSCRIPT ONE - 0x00db: 0x00b2, # SUPERSCRIPT TWO - 0x00dc: 0x00b3, # SUPERSCRIPT THREE - 0x00dd: 0x2074, # SUPERSCRIPT FOUR - 0x00de: 0x2075, # SUPERSCRIPT FIVE - 0x00df: 0x2076, # SUPERSCRIPT SIX - 0x00e0: 0x2077, # SUPERSCRIPT SEVEN - 0x00e1: 0x2079, # SUPERSCRIPT NINE - 0x00e2: 0x2070, # SUPERSCRIPT ZERO - 0x00e3: None, # UNDEFINED - 0x00e4: 0xf6ec, # [unknown unicode name for esuperior] - 0x00e5: 0xf6f1, # [unknown unicode name for rsuperior] - 0x00e6: 0xf6f3, # [unknown unicode name for tsuperior] - 0x00e7: None, # UNDEFINED - 0x00e8: None, # UNDEFINED - 0x00e9: 0xf6ed, # [unknown unicode name for isuperior] - 0x00ea: 0xf6f2, # [unknown unicode name for ssuperior] - 0x00eb: 0xf6eb, # [unknown unicode name for dsuperior] - 0x00ec: None, # UNDEFINED - 0x00ed: None, # UNDEFINED - 0x00ee: None, # UNDEFINED - 0x00ef: None, # UNDEFINED - 0x00f0: None, # UNDEFINED - 0x00f1: 0xf6ee, # [unknown unicode name for lsuperior] - 0x00f2: 0xf6fb, # [unknown unicode name for Ogoneksmall] - 0x00f3: 0xf6f4, # [unknown unicode name for Brevesmall] - 0x00f4: 0xf7af, # [unknown unicode name for Macronsmall] - 0x00f5: 0xf6ea, # [unknown unicode name for bsuperior] - 0x00f6: 0x207f, # SUPERSCRIPT LATIN SMALL LETTER N - 0x00f7: 0xf6ef, # [unknown unicode name for msuperior] - 0x00f8: 0xf6e2, # [unknown unicode name for commasuperior] - 0x00f9: 0xf6e8, # [unknown unicode name for periodsuperior] - 0x00fa: 0xf6f7, # [unknown unicode name for Dotaccentsmall] - 0x00fb: 0xf6fc, # [unknown unicode name for Ringsmall] - 0x00fc: None, # UNDEFINED - 0x00fd: None, # UNDEFINED - 0x00fe: None, # UNDEFINED - 0x00ff: None, # UNDEFINED - },None), - } - __rl_extension_codecs = { - 'extpdfdoc':ExtCodecData('pdfdoc',{0x000a:0x000a,0x000d:0x000d},None), - } - #for k,v in __rl_codecs_data.items(): - # __rl_codecs_data[k+'enc'] = __rl_codecs_data[k+'encoding'] = v - #del k,v - - def __init__(self): - raise NotImplementedError - - def _256_exception_codec(name,exceptions,rexceptions,baseRange=range(32,256)): - import codecs - decoding_map = codecs.make_identity_dict(baseRange) - decoding_map.update(exceptions) - encoding_map = codecs.make_encoding_map(decoding_map) - if rexceptions: encoding_map.update(rexceptions) - ### Codec APIs - class Codec(codecs.Codec): - def encode(self,input,errors='strict',charmap_encode=codecs.charmap_encode,encoding_map=encoding_map): - return charmap_encode(input,errors,encoding_map) - - def decode(self,input,errors='strict',charmap_decode=codecs.charmap_decode,decoding_map=decoding_map): - return charmap_decode(input,errors,decoding_map) - - class StreamWriter(Codec,codecs.StreamWriter): - pass - - class StreamReader(Codec,codecs.StreamReader): - pass - C = Codec() - return codecs.CodecInfo(C.encode,C.decode,streamreader=StreamReader,streamwriter=StreamWriter,name=name) - _256_exception_codec=staticmethod(_256_exception_codec) - - __rl_codecs_cache = {} - - def __rl_codecs(name,cache=__rl_codecs_cache,data=__rl_codecs_data,extension_codecs=__rl_extension_codecs): - try: - return cache[name] - except KeyError: - if name in extension_codecs: - x = extension_codecs[name] - e,r = data[x.baseName] - if x.exceptions: - if e: - e = e.copy() - e.update(x.exceptions) - else: - e = x.exceptions - if x.rexceptions: - if r: - r = r.copy() - r.update(x.rexceptions) - else: - r = x.exceptions - else: - e,r = data[name] - cache[name] = c = RL_Codecs._256_exception_codec(name,e,r) - return c - __rl_codecs=staticmethod(__rl_codecs) - - def _rl_codecs(name): - name = name.lower() - from reportlab.pdfbase.pdfmetrics import standardEncodings - for e in standardEncodings+('ExtPdfdocEncoding',): - e = e[:-8].lower() - if name.startswith(e): return RL_Codecs.__rl_codecs(e) - return None - _rl_codecs=staticmethod(_rl_codecs) - - def register(): - import codecs - codecs.register(RL_Codecs._rl_codecs) - register=staticmethod(register) diff --git a/reportlab/pdfbase/ttfonts.py b/reportlab/pdfbase/ttfonts.py deleted file mode 100644 index 4f873962..00000000 --- a/reportlab/pdfbase/ttfonts.py +++ /dev/null @@ -1,1220 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -__version__ = '$Id$' -__doc__="""TrueType font support - -This defines classes to represent TrueType fonts. They know how to calculate -their own width and how to write themselves into PDF files. They support -subsetting and embedding and can represent all 16-bit Unicode characters. - -Note on dynamic fonts ---------------------- - -Usually a Font in ReportLab corresponds to a fixed set of PDF objects (Font, -FontDescriptor, Encoding). But with dynamic font subsetting a single TTFont -will result in a number of Font/FontDescriptor/Encoding object sets, and the -contents of those will depend on the actual characters used for printing. - -To support dynamic font subsetting a concept of "dynamic font" was introduced. -Dynamic Fonts have a _dynamicFont attribute set to 1. - -Dynamic fonts have the following additional functions:: - - def splitString(self, text, doc): - '''Splits text into a number of chunks, each of which belongs to a - single subset. Returns a list of tuples (subset, string). Use - subset numbers with getSubsetInternalName. Doc is used to identify - a document so that different documents may have different dynamically - constructed subsets.''' - - def getSubsetInternalName(self, subset, doc): - '''Returns the name of a PDF Font object corresponding to a given - subset of this dynamic font. Use this function instead of - PDFDocument.getInternalFontName.''' - -You must never call PDFDocument.getInternalFontName for dynamic fonts. - -If you have a traditional static font, mapping to PDF text output operators -is simple:: - - '%s 14 Tf (%s) Tj' % (getInternalFontName(psfontname), text) - -If you have a dynamic font, use this instead:: - - for subset, chunk in font.splitString(text, doc): - '%s 14 Tf (%s) Tj' % (font.getSubsetInternalName(subset, doc), chunk) - -(Tf is a font setting operator and Tj is a text ouput operator. You should -also escape invalid characters in Tj argument, see TextObject._formatText. -Oh, and that 14 up there is font size.) - -Canvas and TextObject have special support for dynamic fonts. -""" - -from struct import pack, unpack, error as structError -from reportlab.lib.utils import getBytesIO, isPy3, bytestr, isUnicode, char2int -from reportlab.pdfbase import pdfmetrics, pdfdoc -from reportlab import rl_config -from reportlab.lib.rl_accel import hex32, add32, calcChecksum, instanceStringWidthTTF -from collections import namedtuple - -class TTFError(pdfdoc.PDFError): - "TrueType font exception" - pass - - -if isPy3: - def SUBSETN(n,table=bytes.maketrans(b'0123456789',b'ABCDEFGIJK')): - return bytes('%6.6d'%n,'ASCII').translate(table) -else: - import string - def SUBSETN(n,table=string.maketrans(b'0123456789',b'ABCDEFGIJK'),translate=string.translate): - return translate('%6.6d'%n,table) -# -# Helpers -# -def makeToUnicodeCMap(fontname, subset): - """Creates a ToUnicode CMap for a given subset. See Adobe - _PDF_Reference (ISBN 0-201-75839-3) for more information.""" - cmap = [ - "/CIDInit /ProcSet findresource begin", - "12 dict begin", - "begincmap", - "/CIDSystemInfo", - "<< /Registry (%s)" % fontname, - "/Ordering (%s)" % fontname, - "/Supplement 0", - ">> def", - "/CMapName /%s def" % fontname, - "/CMapType 2 def", - "1 begincodespacerange", - "<00> <%02X>" % (len(subset) - 1), - "endcodespacerange", - "%d beginbfchar" % len(subset) - ] + ["<%02X> <%04X>" % (i,v) for i,v in enumerate(subset)] + [ - "endbfchar", - "endcmap", - "CMapName currentdict /CMap defineresource pop", - "end", - "end" - ] - return '\n'.join(cmap) - -def splice(stream, offset, value): - """Splices the given value into stream at the given offset and - returns the resulting stream (the original is unchanged)""" - return stream[:offset] + value + stream[offset + len(value):] - -def _set_ushort(stream, offset, value): - """Writes the given unsigned short value into stream at the given - offset and returns the resulting stream (the original is unchanged)""" - return splice(stream, offset, pack(">H", value)) -# -# TrueType font handling -# - -GF_ARG_1_AND_2_ARE_WORDS = 1 << 0 -GF_ARGS_ARE_XY_VALUES = 1 << 1 -GF_ROUND_XY_TO_GRID = 1 << 2 -GF_WE_HAVE_A_SCALE = 1 << 3 -GF_RESERVED = 1 << 4 -GF_MORE_COMPONENTS = 1 << 5 -GF_WE_HAVE_AN_X_AND_Y_SCALE = 1 << 6 -GF_WE_HAVE_A_TWO_BY_TWO = 1 << 7 -GF_WE_HAVE_INSTRUCTIONS = 1 << 8 -GF_USE_MY_METRICS = 1 << 9 -GF_OVERLAP_COMPOUND = 1 << 10 -GF_SCALED_COMPONENT_OFFSET = 1 << 11 -GF_UNSCALED_COMPONENT_OFFSET = 1 << 12 - -def TTFOpenFile(fn): - '''Opens a TTF file possibly after searching TTFSearchPath - returns (filename,file) - ''' - from reportlab.lib.utils import rl_isfile, open_for_read - try: - f = open_for_read(fn,'rb') - return fn, f - except IOError: - import os - if not os.path.isabs(fn): - for D in rl_config.TTFSearchPath: - tfn = os.path.join(D,fn) - if rl_isfile(tfn): - f = open_for_read(tfn,'rb') - return tfn, f - raise TTFError('Can\'t open file "%s"' % fn) - -class TTFontParser: - "Basic TTF file parser" - ttfVersions = (0x00010000,0x74727565,0x74746366) - ttcVersions = (0x00010000,0x00020000) - fileKind='TTF' - - def __init__(self, file, validate=0,subfontIndex=0): - """Loads and parses a TrueType font file. file can be a filename or a - file object. If validate is set to a false values, skips checksum - validation. This can save time, especially if the font is large. - """ - self.validate = validate - self.readFile(file) - isCollection = self.readHeader() - if isCollection: - self.readTTCHeader() - self.getSubfont(subfontIndex) - else: - if self.validate: self.checksumFile() - self.readTableDirectory() - self.subfontNameX = b'' - - def readTTCHeader(self): - self.ttcVersion = self.read_ulong() - self.fileKind = 'TTC' - self.ttfVersions = self.ttfVersions[:-1] - if self.ttcVersion not in self.ttcVersions: - raise TTFError('"%s" is not a %s file: can\'t read version 0x%8.8x' %(self.filename,self.fileKind,self.ttcVersion)) - self.numSubfonts = self.read_ulong() - self.subfontOffsets = [] - a = self.subfontOffsets.append - for i in xrange(self.numSubfonts): - a(self.read_ulong()) - - def getSubfont(self,subfontIndex): - if self.fileKind!='TTC': - raise TTFError('"%s" is not a TTC file: use this method' % (self.filename,self.fileKind)) - try: - pos = self.subfontOffsets[subfontIndex] - except IndexError: - raise TTFError('TTC file "%s": bad subfontIndex %s not in [0,%d]' % (self.filename,subfontIndex,self.numSubfonts-1)) - self.seek(pos) - self.readHeader() - self.readTableDirectory() - self.subfontNameX = bytestr('-'+str(subfontIndex)) - - def readTableDirectory(self): - try: - self.numTables = self.read_ushort() - self.searchRange = self.read_ushort() - self.entrySelector = self.read_ushort() - self.rangeShift = self.read_ushort() - - # Read table directory - self.table = {} - self.tables = [] - for n in xrange(self.numTables): - record = {} - record['tag'] = self.read_tag() - record['checksum'] = self.read_ulong() - record['offset'] = self.read_ulong() - record['length'] = self.read_ulong() - self.tables.append(record) - self.table[record['tag']] = record - except: - raise TTFError('Corrupt %s file "%s" cannot read Table Directory' % (self.fileKind, self.filename)) - if self.validate: self.checksumTables() - - def readHeader(self): - '''read the sfnt header at the current position''' - try: - self.version = version = self.read_ulong() - except: - raise TTFError('"%s" is not a %s file: can\'t read version' %(self.filename,self.fileKind)) - - if version==0x4F54544F: - raise TTFError('%s file "%s": postscript outlines are not supported'%(self.fileKind,self.filename)) - - if version not in self.ttfVersions: - raise TTFError('Not a TrueType font: version=0x%8.8X' % version) - return version==self.ttfVersions[-1] - - def readFile(self,f): - if hasattr(f,'read'): - self.filename = '(ttf)' - else: - self.filename, f = TTFOpenFile(f) - - self._ttf_data = f.read() - self._pos = 0 - - def checksumTables(self): - # Check the checksums for all tables - for t in self.tables: - table = self.get_chunk(t['offset'], t['length']) - checksum = calcChecksum(table) - if t['tag'] == 'head': - adjustment = unpack('>l', table[8:8+4])[0] - checksum = add32(checksum, -adjustment) - xchecksum = t['checksum'] - if xchecksum != checksum: - raise TTFError('TTF file "%s": invalid checksum %s table: %s (expected %s)' % (self.filename,hex32(checksum),t['tag'],hex32(xchecksum))) - - def checksumFile(self): - # Check the checksums for the whole file - checksum = calcChecksum(self._ttf_data) - if 0xB1B0AFBA!=checksum: - raise TTFError('TTF file "%s": invalid checksum %s (expected 0xB1B0AFBA) len: %d &3: %d' % (self.filename,hex32(checksum),len(self._ttf_data),(len(self._ttf_data)&3))) - - def get_table_pos(self, tag): - "Returns the offset and size of a given TTF table." - offset = self.table[tag]['offset'] - length = self.table[tag]['length'] - return (offset, length) - - def seek(self, pos): - "Moves read pointer to a given offset in file." - self._pos = pos - - def skip(self, delta): - "Skip the given number of bytes." - self._pos = self._pos + delta - - def seek_table(self, tag, offset_in_table = 0): - """Moves read pointer to the given offset within a given table and - returns absolute offset of that position in the file.""" - self._pos = self.get_table_pos(tag)[0] + offset_in_table - return self._pos - - if isPy3: - def read_tag(self): - "Read a 4-character tag" - self._pos += 4 - return str(self._ttf_data[self._pos - 4:self._pos],'utf8') - - def get_chunk(self, pos, length): - "Return a chunk of raw data at given position" - return bytes(self._ttf_data[pos:pos+length]) - - def read_uint8(self): - self._pos += 1 - return int(self._ttf_data[self._pos-1]) - else: - def read_tag(self): - "Read a 4-character tag" - self._pos += 4 - return self._ttf_data[self._pos - 4:self._pos] - - def get_chunk(self, pos, length): - "Return a chunk of raw data at given position" - return self._ttf_data[pos:pos+length] - - def read_uint8(self): - self._pos += 1 - return ord(self._ttf_data[self._pos-1]) - - def read_ushort(self): - "Reads an unsigned short" - self._pos += 2 - return unpack('>H',self._ttf_data[self._pos-2:self._pos])[0] - - def read_ulong(self): - "Reads an unsigned long" - self._pos += 4 - return unpack('>L',self._ttf_data[self._pos - 4:self._pos])[0] - - def read_short(self): - "Reads a signed short" - self._pos += 2 - try: - return unpack('>h',self._ttf_data[self._pos-2:self._pos])[0] - except structError as error: - raise TTFError(error) - - def get_ushort(self, pos): - "Return an unsigned short at given position" - return unpack('>H',self._ttf_data[pos:pos+2])[0] - - def get_ulong(self, pos): - "Return an unsigned long at given position" - return unpack('>L',self._ttf_data[pos:pos+4])[0] - - def get_table(self, tag): - "Return the given TTF table" - pos, length = self.get_table_pos(tag) - return self._ttf_data[pos:pos+length] - -class TTFontMaker: - "Basic TTF file generator" - - def __init__(self): - "Initializes the generator." - self.tables = {} - - def add(self, tag, data): - "Adds a table to the TTF file." - if tag == 'head': - data = splice(data, 8, b'\0\0\0\0') - self.tables[tag] = data - - def makeStream(self): - "Finishes the generation and returns the TTF file as a string" - stm = getBytesIO() - write = stm.write - - tables = self.tables - numTables = len(tables) - searchRange = 1 - entrySelector = 0 - while searchRange * 2 <= numTables: - searchRange = searchRange * 2 - entrySelector = entrySelector + 1 - searchRange = searchRange * 16 - rangeShift = numTables * 16 - searchRange - - # Header - write(pack(">lHHHH", 0x00010000, numTables, searchRange, - entrySelector, rangeShift)) - - # Table directory - offset = 12 + numTables * 16 - wStr = (lambda x:write(bytes(tag,'latin1'))) if isPy3 else write - tables_items = list(sorted(tables.items())) - for tag, data in tables_items: - if tag == 'head': - head_start = offset - checksum = calcChecksum(data) - wStr(tag) - write(pack(">LLL", checksum, offset, len(data))) - paddedLength = (len(data)+3)&~3 - offset = offset + paddedLength - - # Table data - for tag, data in tables_items: - data += b"\0\0\0" - write(data[:len(data)&~3]) - - checksum = calcChecksum(stm.getvalue()) - checksum = add32(0xB1B0AFBA, -checksum) - stm.seek(head_start + 8) - write(pack('>L', checksum)) - - return stm.getvalue() - -#this is used in the cmap encoding fmt==2 case -CMapFmt2SubHeader = namedtuple('CMapFmt2SubHeader', 'firstCode entryCount idDelta idRangeOffset') - -class TTFontFile(TTFontParser): - "TTF file parser and generator" - - def __init__(self, file, charInfo=1, validate=0,subfontIndex=0): - """Loads and parses a TrueType font file. - - file can be a filename or a file object. If validate is set to a false - values, skips checksum validation. This can save time, especially if - the font is large. See TTFontFile.extractInfo for more information. - """ - TTFontParser.__init__(self, file, validate=validate,subfontIndex=subfontIndex) - self.extractInfo(charInfo) - - def extractInfo(self, charInfo=1): - """ - Extract typographic information from the loaded font file. - - The following attributes will be set:: - - name PostScript font name - flags Font flags - ascent Typographic ascender in 1/1000ths of a point - descent Typographic descender in 1/1000ths of a point - capHeight Cap height in 1/1000ths of a point (0 if not available) - bbox Glyph bounding box [l,t,r,b] in 1/1000ths of a point - _bbox Glyph bounding box [l,t,r,b] in unitsPerEm - unitsPerEm Glyph units per em - italicAngle Italic angle in degrees ccw - stemV stem weight in 1/1000ths of a point (approximate) - - If charInfo is true, the following will also be set:: - - defaultWidth default glyph width in 1/1000ths of a point - charWidths dictionary of character widths for every supported UCS character - code - - This will only work if the font has a Unicode cmap (platform 3, - encoding 1, format 4 or platform 0 any encoding format 4). Setting - charInfo to false avoids this requirement - - """ - # name - Naming table - name_offset = self.seek_table("name") - format = self.read_ushort() - if format != 0: - raise TTFError("Unknown name table format (%d)" % format) - numRecords = self.read_ushort() - string_data_offset = name_offset + self.read_ushort() - names = {1:None,2:None,3:None,4:None,6:None} - K = list(names.keys()) - nameCount = len(names) - for i in xrange(numRecords): - platformId = self.read_ushort() - encodingId = self.read_ushort() - languageId = self.read_ushort() - nameId = self.read_ushort() - length = self.read_ushort() - offset = self.read_ushort() - if nameId not in K: continue - N = None - if platformId == 3 and encodingId == 1 and languageId == 0x409: # Microsoft, Unicode, US English, PS Name - opos = self._pos - try: - self.seek(string_data_offset + offset) - if length % 2 != 0: - raise TTFError("PostScript name is UTF-16BE string of odd length") - length /= 2 - N = [] - A = N.append - while length > 0: - char = self.read_ushort() - A(bytes([char]) if isPy3 else chr(char)) - length -= 1 - N = b''.join(N) - finally: - self._pos = opos - elif platformId == 1 and encodingId == 0 and languageId == 0: # Macintosh, Roman, English, PS Name - # According to OpenType spec, if PS name exists, it must exist - # both in MS Unicode and Macintosh Roman formats. Apparently, - # you can find live TTF fonts which only have Macintosh format. - N = self.get_chunk(string_data_offset + offset, length) - if N and names[nameId]==None: - names[nameId] = N - nameCount -= 1 - if nameCount==0: break - if names[6] is not None: - psName = names[6].replace(b" ", b"-") #Dinu Gherman's fix for font names with spaces - elif names[4] is not None: - psName = names[4].replace(b" ", b"-") - # Fine, one last try before we bail. - elif names[1] is not None: - psName = names[1].replace(b" ", b"-") - else: - psName = None - - # Don't just assume, check for None since some shoddy fonts cause crashes here... - if not psName: - raise TTFError("Could not find PostScript font name") - for c in psName: - if char2int(c)>126 or c in b' [](){}<>/%': - raise TTFError("psName=%r contains invalid character %s" % (psName,ascii(c))) - self.name = psName - self.familyName = names[1] or psName - self.styleName = names[2] or 'Regular' - self.fullName = names[4] or psName - self.uniqueFontID = names[3] or psName - - # head - Font header table - self.seek_table("head") - ver_maj, ver_min = self.read_ushort(), self.read_ushort() - if ver_maj != 1: - raise TTFError('Unknown head table version %d.%04x' % (ver_maj, ver_min)) - self.fontRevision = self.read_ushort(), self.read_ushort() - - self.skip(4) - magic = self.read_ulong() - if magic != 0x5F0F3CF5: - raise TTFError('Invalid head table magic %04x' % magic) - self.skip(2) - self.unitsPerEm = unitsPerEm = self.read_ushort() - scale = lambda x, unitsPerEm=unitsPerEm: x * 1000. / unitsPerEm - self.skip(16) - xMin = self.read_short() - yMin = self.read_short() - xMax = self.read_short() - yMax = self.read_short() - self.bbox = list(map(scale, [xMin, yMin, xMax, yMax])) - self.skip(3*2) - indexToLocFormat = self.read_ushort() - glyphDataFormat = self.read_ushort() - - # OS/2 - OS/2 and Windows metrics table - # (needs data from head table) - if "OS/2" in self.table: - self.seek_table("OS/2") - version = self.read_ushort() - self.skip(2) - usWeightClass = self.read_ushort() - self.skip(2) - fsType = self.read_ushort() - if fsType == 0x0002 or (fsType & 0x0300) != 0: - raise TTFError('Font does not allow subsetting/embedding (%04X)' % fsType) - self.skip(58) #11*2 + 10 + 4*4 + 4 + 3*2 - sTypoAscender = self.read_short() - sTypoDescender = self.read_short() - self.ascent = scale(sTypoAscender) # XXX: for some reason it needs to be multiplied by 1.24--1.28 - self.descent = scale(sTypoDescender) - - if version > 1: - self.skip(16) #3*2 + 2*4 + 2 - sCapHeight = self.read_short() - self.capHeight = scale(sCapHeight) - else: - self.capHeight = self.ascent - else: - # Microsoft TTFs require an OS/2 table; Apple ones do not. Try to - # cope. The data is not very important anyway. - usWeightClass = 500 - self.ascent = scale(yMax) - self.descent = scale(yMin) - self.capHeight = self.ascent - - # There's no way to get stemV from a TTF file short of analyzing actual outline data - # This fuzzy formula is taken from pdflib sources, but we could just use 0 here - self.stemV = 50 + int((usWeightClass / 65.0) ** 2) - - # post - PostScript table - # (needs data from OS/2 table) - self.seek_table("post") - ver_maj, ver_min = self.read_ushort(), self.read_ushort() - if ver_maj not in (1, 2, 3, 4): - # Adobe/MS documents 1, 2, 2.5, 3; Apple also has 4. - # From Apple docs it seems that we do not need to care - # about the exact version, so if you get this error, you can - # try to remove this check altogether. - raise TTFError('Unknown post table version %d.%04x' % (ver_maj, ver_min)) - self.italicAngle = self.read_short() + self.read_ushort() / 65536.0 - self.underlinePosition = self.read_short() - self.underlineThickness = self.read_short() - isFixedPitch = self.read_ulong() - - self.flags = FF_SYMBOLIC # All fonts that contain characters - # outside the original Adobe character - # set are considered "symbolic". - if self.italicAngle!= 0: - self.flags = self.flags | FF_ITALIC - if usWeightClass >= 600: # FW_REGULAR == 500, FW_SEMIBOLD == 600 - self.flags = self.flags | FF_FORCEBOLD - if isFixedPitch: - self.flags = self.flags | FF_FIXED - # XXX: FF_SERIF? FF_SCRIPT? FF_ALLCAP? FF_SMALLCAP? - - # hhea - Horizontal header table - self.seek_table("hhea") - ver_maj, ver_min = self.read_ushort(), self.read_ushort() - if ver_maj != 1: - raise TTFError('Unknown hhea table version %d.%04x' % (ver_maj, ver_min)) - self.skip(28) - metricDataFormat = self.read_ushort() - if metricDataFormat != 0: - raise TTFError('Unknown horizontal metric data format (%d)' % metricDataFormat) - numberOfHMetrics = self.read_ushort() - if numberOfHMetrics == 0: - raise TTFError('Number of horizontal metrics is 0') - - # maxp - Maximum profile table - self.seek_table("maxp") - ver_maj, ver_min = self.read_ushort(), self.read_ushort() - if ver_maj != 1: - raise TTFError('Unknown maxp table version %d.%04x' % (ver_maj, ver_min)) - self.numGlyphs = numGlyphs = self.read_ushort() - - if not charInfo: - self.charToGlyph = None - self.defaultWidth = None - self.charWidths = None - return - - if glyphDataFormat != 0: - raise TTFError('Unknown glyph data format (%d)' % glyphDataFormat) - - # cmap - Character to glyph index mapping table - cmap_offset = self.seek_table("cmap") - cmapVersion = self.read_ushort() - cmapTableCount = self.read_ushort() - if cmapTableCount==0 and cmapVersion!=0: - cmapTableCount, cmapVersion = cmapVersion, cmapTableCount - encoffs = None - enc = 0 - for n in xrange(cmapTableCount): - platform = self.read_ushort() - encoding = self.read_ushort() - offset = self.read_ulong() - if platform==3: - enc = 1 - encoffs = offset - elif platform==1 and encoding==0 and enc!=1: - enc = 2 - encoffs = offset - elif platform==1 and encoding==1: - enc = 1 - encoffs = offset - elif platform==0 and encoding!=5: - enc = 1 - encoffs = offset - if encoffs is None: - raise TTFError('could not find a suitable cmap encoding') - encoffs += cmap_offset - self.seek(encoffs) - fmt = self.read_ushort() - self.charToGlyph = charToGlyph = {} - glyphToChar = {} - if fmt in (13,12,10,8): - self.skip(2) #padding - length = self.read_ulong() - lang = self.read_ulong() - else: - length = self.read_ushort() - lang = self.read_ushort() - if fmt==0: - T = [self.read_uint8() for i in xrange(length-6)] - for unichar in xrange(min(256,self.numGlyphs,len(table))): - glyph = T[glyph] - charToGlyph[unichar] = glyph - glyphToChar.setdefault(glyph,[]).append(unichar) - elif fmt==4: - limit = encoffs + length - segCount = int(self.read_ushort() / 2.0) - self.skip(6) - endCount = [self.read_ushort() for _ in xrange(segCount)] - self.skip(2) - startCount = [self.read_ushort() for _ in xrange(segCount)] - idDelta = [self.read_short() for _ in xrange(segCount)] - idRangeOffset_start = self._pos - idRangeOffset = [self.read_ushort() for _ in xrange(segCount)] - - # Now it gets tricky. - for n in xrange(segCount): - for unichar in xrange(startCount[n], endCount[n] + 1): - if idRangeOffset[n] == 0: - glyph = (unichar + idDelta[n]) & 0xFFFF - else: - offset = (unichar - startCount[n]) * 2 + idRangeOffset[n] - offset = idRangeOffset_start + 2 * n + offset - if offset >= limit: - # workaround for broken fonts (like Thryomanes) - glyph = 0 - else: - glyph = self.get_ushort(offset) - if glyph != 0: - glyph = (glyph + idDelta[n]) & 0xFFFF - charToGlyph[unichar] = glyph - glyphToChar.setdefault(glyph,[]).append(unichar) - elif fmt==6: - first = self.read_ushort() - count = self.read_ushort() - for glyph in xrange(first,first+count): - unichar = self.read_ushort() - charToGlyph[unichar] = glyph - glyphToChar.setdefault(glyph,[]).append(unichar) - elif fmt==10: - first = self.read_ulong() - count = self.read_ulong() - for glyph in xrange(first,first+count): - unichar = self.read_ushort() - charToGlyph[unichar] = glyph - glyphToChar.setdefault(glyph,[]).append(unichar) - elif fmt==12: - segCount = self.read_ulong() - for n in xrange(segCount): - start = self.read_ulong() - end = self.read_ulong() - inc = self.read_ulong() - start - for unichar in xrange(start,end+1): - glyph = unichar + inc - charToGlyph[unichar] = glyph - glyphToChar.setdefault(glyph,[]).append(unichar) - elif fmt==13: - segCount = self.read_ulong() - for n in xrange(segCount): - start = self.read_ulong() - end = self.read_ulong() - gid = self.read_ulong() - for unichar in xrange(start,end+1): - charToGlyph[unichar] = gid - glyphToChar.setdefault(gid,[]).append(unichar) - elif fmt==2: - T = [self.read_ushort() for i in xrange(256)] #subheader keys - maxSHK = max(T) - SH = [] - for i in xrange(maxSHK+1): - firstCode = self.read_ushort() - entryCount = self.read_ushort() - idDelta = self.read_ushort() - idRangeOffset = (self.read_ushort()-(maxSHK-i)*8-2)>>1 - SH.append(CMapFmt2SubHeader(firstCode,entryCount,idDelta,idRangeOffset)) - #number of glyph indexes to read. it is the length of the entire subtable minus that bit we've read so far - entryCount = (length-(self._pos-(cmap_offset+encoffs)))>>1 - glyphs = [self.read_short() for i in xrange(entryCount)] - last = -1 - for unichar in xrange(256): - if T[unichar]==0: - #Special case, single byte encoding entry, look unichar up in subhead - if last!=-1: - glyph = 0 - elif (unichar=SH[0].firstCode+SH[0].entryCount or - SH[0].idRangeOffset+(unichar-SH[0].firstCode)>=entryCount): - glyph = 0 - else: - glyph = glyphs[SH[0].idRangeOffset+(unichar-SH[0].firstCode)] - if glyph!=0: - glyph += SH[0].idDelta - #assume the single byte codes are ascii - if glyph!=0 and glyph=entryCount: - glyph = 0 - else: - glyph = glyphs[SH[k].idRangeOffset+j] - if glyph!= 0: - glyph += SH[k].idDelta - if glyph!=0 and glyph 0: "missing character" - glyphMap = [0] # new glyph index -> old glyph index - glyphSet = {0:0} # old glyph index -> new glyph index - codeToGlyph = {} # unicode -> new glyph index - for code in subset: - if code in self.charToGlyph: - originalGlyphIdx = self.charToGlyph[code] - else: - originalGlyphIdx = 0 - if originalGlyphIdx not in glyphSet: - glyphSet[originalGlyphIdx] = len(glyphMap) - glyphMap.append(originalGlyphIdx) - codeToGlyph[code] = glyphSet[originalGlyphIdx] - - # Also include glyphs that are parts of composite glyphs - start = self.get_table_pos('glyf')[0] - n = 0 - while n < len(glyphMap): - originalGlyphIdx = glyphMap[n] - glyphPos = self.glyphPos[originalGlyphIdx] - glyphLen = self.glyphPos[originalGlyphIdx + 1] - glyphPos - n += 1 - if not glyphLen: continue - self.seek(start + glyphPos) - numberOfContours = self.read_short() - if numberOfContours < 0: - # composite glyph - self.skip(8) - flags = GF_MORE_COMPONENTS - while flags & GF_MORE_COMPONENTS: - flags = self.read_ushort() - glyphIdx = self.read_ushort() - if glyphIdx not in glyphSet: - glyphSet[glyphIdx] = len(glyphMap) - glyphMap.append(glyphIdx) - if flags & GF_ARG_1_AND_2_ARE_WORDS: - self.skip(4) - else: - self.skip(2) - if flags & GF_WE_HAVE_A_SCALE: - self.skip(2) - elif flags & GF_WE_HAVE_AN_X_AND_Y_SCALE: - self.skip(4) - elif flags & GF_WE_HAVE_A_TWO_BY_TWO: - self.skip(8) - - - # The following tables are simply copied from the original - for tag in ('name', 'OS/2', 'cvt ', 'fpgm', 'prep'): - try: - output.add(tag, self.get_table(tag)) - except KeyError: - # Apparently some of the tables are optional (cvt, fpgm, prep). - # The lack of the required ones (name, OS/2) would have already - # been caught before. - pass - - # post - PostScript - post = b"\x00\x03\x00\x00" + self.get_table('post')[4:16] + b"\x00" * 16 - output.add('post', post) - - numGlyphs = len(glyphMap) - - # hmtx - Horizontal Metrics - hmtx = [] - for n in xrange(numGlyphs): - aw, lsb = self.hmetrics[glyphMap[n]] - hmtx.append(int(aw)) - hmtx.append(int(lsb)) - - #work out n as 0 or first aw that's the start of a run - n = len(hmtx)-2 - while n and hmtx[n]==hmtx[n-2]: - n -= 2 - if not n: n = 2 #need at least one pair - numberOfHMetrics = n>>1 #number of full H Metric pairs - hmtx = hmtx[:n] + hmtx[n+1::2] #full pairs + all the trailing lsb's - - hmtx = pack(*([">%dH" % len(hmtx)] + hmtx)) - output.add('hmtx', hmtx) - - # hhea - Horizontal Header - hhea = self.get_table('hhea') - hhea = _set_ushort(hhea, 34, numberOfHMetrics) - output.add('hhea', hhea) - - # maxp - Maximum Profile - maxp = self.get_table('maxp') - maxp = _set_ushort(maxp, 4, numGlyphs) - output.add('maxp', maxp) - - # cmap - Character to glyph mapping - # XXX maybe use format 0 if possible, not 6? - entryCount = len(subset) - length = 10 + entryCount * 2 - cmap = [0, 1, # version, number of tables - 1, 0, 0,12, # platform, encoding, offset (hi,lo) - 6, length, 0, # format, length, language - 0, - entryCount] + \ - list(map(codeToGlyph.get, subset)) - cmap = pack(*([">%dH" % len(cmap)] + cmap)) - output.add('cmap', cmap) - - # glyf - Glyph data - glyphData = self.get_table('glyf') - offsets = [] - glyf = [] - pos = 0 - for n in xrange(numGlyphs): - offsets.append(pos) - originalGlyphIdx = glyphMap[n] - glyphPos = self.glyphPos[originalGlyphIdx] - glyphLen = self.glyphPos[originalGlyphIdx + 1] - glyphPos - data = glyphData[glyphPos:glyphPos+glyphLen] - # Fix references in composite glyphs - if glyphLen > 2 and unpack(">h", data[:2])[0] < 0: - # composite glyph - pos_in_glyph = 10 - flags = GF_MORE_COMPONENTS - while flags & GF_MORE_COMPONENTS: - flags = unpack(">H", data[pos_in_glyph:pos_in_glyph+2])[0] - glyphIdx = unpack(">H", data[pos_in_glyph+2:pos_in_glyph+4])[0] - data = _set_ushort(data, pos_in_glyph + 2, glyphSet[glyphIdx]) - pos_in_glyph = pos_in_glyph + 4 - if flags & GF_ARG_1_AND_2_ARE_WORDS: - pos_in_glyph = pos_in_glyph + 4 - else: - pos_in_glyph = pos_in_glyph + 2 - if flags & GF_WE_HAVE_A_SCALE: - pos_in_glyph = pos_in_glyph + 2 - elif flags & GF_WE_HAVE_AN_X_AND_Y_SCALE: - pos_in_glyph = pos_in_glyph + 4 - elif flags & GF_WE_HAVE_A_TWO_BY_TWO: - pos_in_glyph = pos_in_glyph + 8 - glyf.append(data) - pos = pos + glyphLen - if pos % 4 != 0: - padding = 4 - pos % 4 - glyf.append(b'\0' * padding) - pos = pos + padding - offsets.append(pos) - output.add('glyf', b''.join(glyf)) - - # loca - Index to location - loca = [] - if (pos + 1) >> 1 > 0xFFFF: - indexToLocFormat = 1 # long format - for offset in offsets: - loca.append(offset) - loca = pack(*([">%dL" % len(loca)] + loca)) - else: - indexToLocFormat = 0 # short format - for offset in offsets: - loca.append(offset >> 1) - loca = pack(*([">%dH" % len(loca)] + loca)) - output.add('loca', loca) - - # head - Font header - head = self.get_table('head') - head = _set_ushort(head, 50, indexToLocFormat) - output.add('head', head) - - return output.makeStream() - - -# -# TrueType font embedding -# - -# PDF font flags (see PDF Reference Guide table 5.19) -FF_FIXED = 1 << 1-1 -FF_SERIF = 1 << 2-1 -FF_SYMBOLIC = 1 << 3-1 -FF_SCRIPT = 1 << 4-1 -FF_NONSYMBOLIC = 1 << 6-1 -FF_ITALIC = 1 << 7-1 -FF_ALLCAP = 1 << 17-1 -FF_SMALLCAP = 1 << 18-1 -FF_FORCEBOLD = 1 << 19-1 - -class TTFontFace(TTFontFile, pdfmetrics.TypeFace): - """TrueType typeface. - - Conceptually similar to a single byte typeface, but the glyphs are - identified by UCS character codes instead of glyph names.""" - - def __init__(self, filename, validate=0, subfontIndex=0): - "Loads a TrueType font from filename." - pdfmetrics.TypeFace.__init__(self, None) - TTFontFile.__init__(self, filename, validate=validate, subfontIndex=subfontIndex) - - def getCharWidth(self, code): - "Returns the width of character U+" - return self.charWidths.get(code, self.defaultWidth) - - def addSubsetObjects(self, doc, fontname, subset): - """Generate a TrueType font subset and add it to the PDF document. - Returns a PDFReference to the new FontDescriptor object.""" - - fontFile = pdfdoc.PDFStream() - fontFile.content = self.makeSubset(subset) - fontFile.dictionary['Length1'] = len(fontFile.content) - if doc.compression: - fontFile.filters = [pdfdoc.PDFZCompress] - fontFileRef = doc.Reference(fontFile, 'fontFile:%s(%s)' % (self.filename, fontname)) - - flags = self.flags & ~ FF_NONSYMBOLIC - flags = flags | FF_SYMBOLIC - - fontDescriptor = pdfdoc.PDFDictionary({ - 'Type': '/FontDescriptor', - 'Ascent': self.ascent, - 'CapHeight': self.capHeight, - 'Descent': self.descent, - 'Flags': flags, - 'FontBBox': pdfdoc.PDFArray(self.bbox), - 'FontName': pdfdoc.PDFName(fontname), - 'ItalicAngle': self.italicAngle, - 'StemV': self.stemV, - 'FontFile2': fontFileRef, - }) - return doc.Reference(fontDescriptor, 'fontDescriptor:' + fontname) - -class TTEncoding: - """Encoding for TrueType fonts (always UTF-8). - - TTEncoding does not directly participate in PDF object creation, since - we need a number of different 8-bit encodings for every generated font - subset. TTFont itself cares about that.""" - - def __init__(self): - self.name = "UTF-8" - -class TTFont: - """Represents a TrueType font. - - Its encoding is always UTF-8. - - Note: you cannot use the same TTFont object for different documents - at the same time. - - Example of usage: - - font = ttfonts.TTFont('PostScriptFontName', '/path/to/font.ttf') - pdfmetrics.registerFont(font) - - canvas.setFont('PostScriptFontName', size) - canvas.drawString(x, y, "Some text encoded in UTF-8") - """ - class State: - namePrefix = 'F' - def __init__(self,asciiReadable=None): - self.assignments = {} - self.nextCode = 0 - self.internalName = None - self.frozen = 0 - - if asciiReadable is None: - asciiReadable = rl_config.ttfAsciiReadable - - if asciiReadable: - # Let's add the first 128 unicodes to the 0th subset, so ' ' - # always has code 32 (for word spacing to work) and the ASCII - # output is readable - subset0 = list(xrange(128)) - self.subsets = [subset0] - for n in subset0: - self.assignments[n] = n - self.nextCode = 128 - else: - self.subsets = [[32]*33] - self.assignments[32] = 32 - - _multiByte = 1 # We want our own stringwidth - _dynamicFont = 1 # We want dynamic subsetting - - def __init__(self, name, filename, validate=0, subfontIndex=0,asciiReadable=None): - """Loads a TrueType font from filename. - - If validate is set to a false values, skips checksum validation. This - can save time, especially if the font is large. - """ - self.fontName = name - self.face = TTFontFace(filename, validate=validate, subfontIndex=subfontIndex) - self.encoding = TTEncoding() - from weakref import WeakKeyDictionary - self.state = WeakKeyDictionary() - if asciiReadable is None: - asciiReadable = rl_config.ttfAsciiReadable - self._asciiReadable = asciiReadable - - def stringWidth(self,text,size,encoding='utf8'): - return instanceStringWidthTTF(self,text,size,encoding) - - def _assignState(self,doc,asciiReadable=None,namePrefix=None): - '''convenience function for those wishing to roll their own state properties''' - if asciiReadable is None: - asciiReadable = self._asciiReadable - try: - state = self.state[doc] - except KeyError: - state = self.state[doc] = TTFont.State(asciiReadable) - if namePrefix is not None: - state.namePrefix = namePrefix - return state - - def splitString(self, text, doc, encoding='utf-8'): - """Splits text into a number of chunks, each of which belongs to a - single subset. Returns a list of tuples (subset, string). Use subset - numbers with getSubsetInternalName. Doc is needed for distinguishing - subsets when building different documents at the same time.""" - asciiReadable = self._asciiReadable - try: state = self.state[doc] - except KeyError: state = self.state[doc] = TTFont.State(asciiReadable) - curSet = -1 - cur = [] - results = [] - if not isUnicode(text): - text = text.decode('utf-8') # encoding defaults to utf-8 - assignments = state.assignments - subsets = state.subsets - for code in map(ord,text): - if code in assignments: - n = assignments[code] - else: - if state.frozen: - raise pdfdoc.PDFError("Font %s is already frozen, cannot add new character U+%04X" % (self.fontName, code)) - n = state.nextCode - if n&0xFF==32: - # make code 32 always be a space character - if n!=32: subsets[n >> 8].append(32) - state.nextCode += 1 - n = state.nextCode - state.nextCode += 1 - assignments[code] = n - if n>32: - if not(n&0xFF): subsets.append([]) - subsets[n >> 8].append(code) - else: - subsets[0][n] = code - if (n >> 8) != curSet: - if cur: - results.append((curSet,bytes(cur) if isPy3 else ''.join(chr(c) for c in cur))) - curSet = (n >> 8) - cur = [] - cur.append(n & 0xFF) - if cur: - results.append((curSet,bytes(cur) if isPy3 else ''.join(chr(c) for c in cur))) - return results - - def getSubsetInternalName(self, subset, doc): - """Returns the name of a PDF Font object corresponding to a given - subset of this dynamic font. Use this function instead of - PDFDocument.getInternalFontName.""" - try: state = self.state[doc] - except KeyError: state = self.state[doc] = TTFont.State(self._asciiReadable) - if subset < 0 or subset >= len(state.subsets): - raise IndexError('Subset %d does not exist in font %s' % (subset, self.fontName)) - if state.internalName is None: - state.internalName = state.namePrefix +repr(len(doc.fontMapping) + 1) - doc.fontMapping[self.fontName] = '/' + state.internalName - doc.delayedFonts.append(self) - return '/%s+%d' % (state.internalName, subset) - - def addObjects(self, doc): - """Makes one or more PDF objects to be added to the document. The - caller supplies the internal name to be used (typically F1, F2, ... in - sequence). - - This method creates a number of Font and FontDescriptor objects. Every - FontDescriptor is a (no more than) 256 character subset of the original - TrueType font.""" - try: state = self.state[doc] - except KeyError: state = self.state[doc] = TTFont.State(self._asciiReadable) - state.frozen = 1 - for n,subset in enumerate(state.subsets): - internalName = self.getSubsetInternalName(n, doc)[1:] - baseFontName = (b''.join((SUBSETN(n),b'+',self.face.name,self.face.subfontNameX))).decode('pdfdoc') - - pdfFont = pdfdoc.PDFTrueTypeFont() - pdfFont.__Comment__ = 'Font %s subset %d' % (self.fontName, n) - pdfFont.Name = internalName - pdfFont.BaseFont = baseFontName - - pdfFont.FirstChar = 0 - pdfFont.LastChar = len(subset) - 1 - - widths = list(map(self.face.getCharWidth, subset)) - pdfFont.Widths = pdfdoc.PDFArray(widths) - - cmapStream = pdfdoc.PDFStream() - cmapStream.content = makeToUnicodeCMap(baseFontName, subset) - if doc.compression: - cmapStream.filters = [pdfdoc.PDFZCompress] - pdfFont.ToUnicode = doc.Reference(cmapStream, 'toUnicodeCMap:' + baseFontName) - - pdfFont.FontDescriptor = self.face.addSubsetObjects(doc, baseFontName, subset) - - # link it in - ref = doc.Reference(pdfFont, internalName) - fontDict = doc.idToObject['BasicFonts'].dict - fontDict[internalName] = pdfFont - del self.state[doc] diff --git a/reportlab/pdfgen/__init__.py b/reportlab/pdfgen/__init__.py deleted file mode 100644 index 934fc827..00000000 --- a/reportlab/pdfgen/__init__.py +++ /dev/null @@ -1,5 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/pdfgen/__init__.py -__version__=''' $Id$ ''' -__doc__='''Defines a high-level Canvas interface for creating PDF files''' diff --git a/reportlab/pdfgen/canvas.py b/reportlab/pdfgen/canvas.py deleted file mode 100644 index e84b85fd..00000000 --- a/reportlab/pdfgen/canvas.py +++ /dev/null @@ -1,1837 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -__version__=''' $Id$ ''' -__doc__=""" -The Canvas object is the primary interface for creating PDF files. See -doc/reportlab-userguide.pdf for copious examples. -""" - -__all__ = ['Canvas'] -ENABLE_TRACKING = 1 # turn this off to do profile testing w/o tracking - -import os -import sys -import re -import hashlib -from string import digits -import tempfile -from math import sin, cos, tan, pi, ceil -from reportlab import rl_config -from reportlab.pdfbase import pdfutils -from reportlab.pdfbase import pdfdoc -from reportlab.pdfbase import pdfmetrics -from reportlab.pdfgen import pdfgeom, pathobject, textobject -from reportlab.lib.colors import black, _chooseEnforceColorSpace, Color, CMYKColor, toColor -from reportlab.lib.utils import import_zlib, ImageReader, isSeq, isStr, isUnicode, _digester -from reportlab.lib.rl_accel import fp_str, escapePDF -from reportlab.lib.boxstuff import aspectRatioFix - -digitPat = re.compile('\d') #used in decimal alignment -zlib = import_zlib() - -# Robert Kern -# Constants for closing paths. -# May be useful if one changes 'arc' and 'rect' to take a -# default argument that tells how to close the path. -# That way we can draw filled shapes. - -FILL_EVEN_ODD = 0 -FILL_NON_ZERO = 1 - #this is used by path-closing routines. - #map stroke, fill, fillmode -> operator - # fillmode: 1 = non-Zero (obviously), 0 = evenOdd -PATH_OPS = {(0, 0, FILL_EVEN_ODD) : 'n', #no op - (0, 0, FILL_NON_ZERO) : 'n', #no op - (1, 0, FILL_EVEN_ODD) : 'S', #stroke only - (1, 0, FILL_NON_ZERO) : 'S', #stroke only - (0, 1, FILL_EVEN_ODD) : 'f*', #Fill only - (0, 1, FILL_NON_ZERO) : 'f', #Fill only - (1, 1, FILL_EVEN_ODD) : 'B*', #Stroke and Fill - (1, 1, FILL_NON_ZERO) : 'B', #Stroke and Fill - } - -def _annFormat(D,color,thickness,dashArray,hradius=0,vradius=0): - from reportlab.pdfbase.pdfdoc import PDFArray, PDFDictionary - if color and 'C' not in D: - D["C"] = PDFArray([color.red, color.green, color.blue]) - if 'Border' not in D: - border = [hradius,vradius,thickness or 0] - if dashArray: - border.append(PDFArray(dashArray)) - D["Border"] = PDFArray(border) -# BS = PDFDictionary() -# bss = 'S' -# if dashArray: -# BS['D'] = PDFArray(dashArray) -# bss = 'D' -# BS['W'] = thickness or 0 -# BS['S'] = bss -# D['BS'] = BS - -# helpers to guess color space for gradients -def _normalizeColor(aColor): - if isinstance(aColor, CMYKColor): - d = aColor.density - return "DeviceCMYK", tuple(c*d for c in aColor.cmyk()) - elif isinstance(aColor, Color): - return "DeviceRGB", aColor.rgb() - elif isinstance(aColor, (tuple, list)): - l = len(aColor) - if l == 3: - return "DeviceRGB", aColor - elif l == 4: - return "DeviceCMYK", aColor - elif isinstance(aColor, str): - return _normalizeColor(toColor(aColor)) - raise ValueError("Unknown color %r" % aColor) - -def _normalizeColors(colors): - space = None - outcolors = [] - for aColor in colors: - nspace, outcolor = _normalizeColor(aColor) - if space is not None and space != nspace: - raise ValueError("Mismatch in color spaces: %s and %s" % (space, nspace)) - space = nspace - outcolors.append(outcolor) - return space, outcolors - -def _buildColorFunction(colors, positions): - from reportlab.pdfbase.pdfdoc import PDFExponentialFunction, PDFStitchingFunction - if positions is not None and len(positions) != len(colors): - raise ValueError("need to have the same number of colors and positions") - # simplified functions for edge cases - if len(colors) == 1: - # for completeness - return PDFExponentialFunction(N=1, C0=colors[0], C1=colors[0]) - if len(colors) == 2: - if positions is None or (positions[0] == 0 and positions[1] == 1): - return PDFExponentialFunction(N=1, C0=colors[0], C1=colors[1]) - # equally distribute if positions not specified - if positions is None: - nc = len(colors) - positions = [(1.0*x)/(nc-1) for x in range(nc)] - else: - # sort positions and colors in increasing order - poscolors = list(zip(positions, colors)) - poscolors.sort(key=lambda x: x[0]) - # add endpoint positions if not already present - if poscolors[0][0] != 0: - poscolors.insert(0, (0.0, poscolors[0][1])) - if poscolors[-1][0] != 1: - poscolors.append((1.0, poscolors[-1][1])) - positions, colors = list(zip(*poscolors)) # unzip - # build stitching function - functions = [] - bounds = [pos for pos in positions[1:-1]] - encode = [] - lastcolor = colors[0] - for color in colors[1:]: - functions.append(PDFExponentialFunction(N=1, C0=lastcolor, C1=color)) - lastcolor = color - encode.append(0.0) - encode.append(1.0) - return PDFStitchingFunction(functions, bounds, encode, Domain="[0.0 1.0]") - -class ExtGState: - defaults = dict( - CA=1, - ca=1, - OP=False, - op=False, - OPM=0, - ) - - def __init__(self): - self._d = {} - self._c = {} - - def set(self,canv,a,v): - d = self.defaults[a] - isbool = isinstance(d,bool) - if isbool: v=bool(v) - if v!=self._d.get(a,d) or (a=='op' and self.getValue('OP')!=d): - self._d[a] = v - if isbool: v=str(v).lower() - t = a,v - if t in self._c: - name = self._c[t] - else: - name = 'gRLs'+str(len(self._c)) - self._c[t] = name - canv._code.append('/%s gs' % name) - - def getValue(self,a): - return self._d.get(a,self.defaults[a]) - - def getState(self): - S = {} - for t,name in self._c.items(): - S[name] = pdfdoc.PDFDictionary(dict((t,))) - return S and pdfdoc.PDFDictionary(S) or None - - def pushCopy(self): - '''the states must be shared across push/pop, but the values not''' - x = self.__class__() - x._d = self._d.copy() - x._c = self._c - return x - -class Canvas(textobject._PDFColorSetter): - """This class is the programmer's interface to the PDF file format. Methods - are (or will be) provided here to do just about everything PDF can do. - - The underlying model to the canvas concept is that of a graphics state machine - that at any given point in time has a current font, fill color (for figure - interiors), stroke color (for figure borders), line width and geometric transform, among - many other characteristics. - - Canvas methods generally either draw something (like canvas.line) using the - current state of the canvas or change some component of the canvas - state (like canvas.setFont). The current state can be saved and restored - using the saveState/restoreState methods. - - Objects are "painted" in the order they are drawn so if, for example - two rectangles overlap the last draw will appear "on top". PDF form - objects (supported here) are used to draw complex drawings only once, - for possible repeated use. - - There are other features of canvas which are not visible when printed, - such as outlines and bookmarks which are used for navigating a document - in a viewer. - - Here is a very silly example usage which generates a Hello World pdf document. - - Example:: - - from reportlab.pdfgen import canvas - c = canvas.Canvas("hello.pdf") - from reportlab.lib.units import inch - # move the origin up and to the left - c.translate(inch,inch) - # define a large font - c.setFont("Helvetica", 80) - # choose some colors - c.setStrokeColorRGB(0.2,0.5,0.3) - c.setFillColorRGB(1,0,1) - # draw a rectangle - c.rect(inch,inch,6*inch,9*inch, fill=1) - # make text go straight up - c.rotate(90) - # change color - c.setFillColorRGB(0,0,0.77) - # say hello (note after rotate the y coord needs to be negative!) - c.drawString(3*inch, -3*inch, "Hello World") - c.showPage() - c.save() - - """ - - def __init__(self,filename, - pagesize=None, - bottomup = 1, - pageCompression=None, - invariant = None, - verbosity=0, - encrypt=None, - cropMarks=None, - pdfVersion=None, - enforceColorSpace=None, - ): - """Create a canvas of a given size. etc. - - You may pass a file-like object to filename as an alternative to - a string. - For more information about the encrypt parameter refer to the setEncrypt method. - - Most of the attributes are private - we will use set/get methods - as the preferred interface. Default page size is A4. - cropMarks may be True/False or an object with parameters borderWidth, markColor, markWidth - and markLength - - if enforceColorSpace is in ('cmyk', 'rgb', 'sep','sep_black','sep_cmyk') then one of - the standard _PDFColorSetter callables will be used to enforce appropriate color settings. - If it is a callable then that will be used. - """ - if pagesize is None: pagesize = rl_config.defaultPageSize - if invariant is None: invariant = rl_config.invariant - self._filename = filename - - self._doc = pdfdoc.PDFDocument(compression=pageCompression, - invariant=invariant, filename=filename, - pdfVersion=pdfVersion or pdfdoc.PDF_VERSION_DEFAULT, - ) - - self._enforceColorSpace = _chooseEnforceColorSpace(enforceColorSpace) - - #this only controls whether it prints 'saved ...' - 0 disables - self._verbosity = verbosity - - #this is called each time a page is output if non-null - self._onPage = None - self._cropMarks = cropMarks - - self._pagesize = pagesize - self._hanging_pagesize = None - self._pageRotation = 0 - #self._currentPageHasImages = 0 - self._pageTransition = None - self._pageDuration = None - self._destinations = {} # dictionary of destinations for cross indexing. - - self.setPageCompression(pageCompression) - self._pageNumber = 1 # keep a count - # when we create a form we need to save operations not in the form - self._codeStack = [] - self._restartAccumulators() # restart all accumulation state (generalized, arw) - self._annotationCount = 0 - - self._outlines = [] # list for a name tree - self._psCommandsBeforePage = [] #for postscript tray/font commands - self._psCommandsAfterPage = [] #for postscript tray/font commands - - #PostScript has the origin at bottom left. It is easy to achieve a top- - #down coord system by translating to the top of the page and setting y - #scale to -1, but then text is inverted. So self.bottomup is used - #to also set the text matrix accordingly. You can now choose your - #drawing coordinates. - self.bottomup = bottomup - self.imageCaching = rl_config.defaultImageCaching - self.init_graphics_state() - self._make_preamble() - self.state_stack = [] - - self.setEncrypt(encrypt) - - def setEncrypt(self, encrypt): - ''' - Set the encryption used for the pdf generated by this canvas. - If encrypt is a string object, it is used as the user password for the pdf. - If encrypt is an instance of reportlab.lib.pdfencrypt.StandardEncryption, this object is - used to encrypt the pdf. This allows more finegrained control over the encryption settings. - ''' - if encrypt: - from reportlab.lib import pdfencrypt - if isStr(encrypt): #encrypt is the password itself - if isUnicode(encrypt): - encrypt = encrypt.encode('utf-8') - encrypt = pdfencrypt.StandardEncryption(encrypt) #now it's the encrypt object - encrypt.setAllPermissions(1) - elif not isinstance(encrypt, pdfencrypt.StandardEncryption): - raise TypeError('Expected string or instance of reportlab.lib.pdfencrypt.StandardEncryption as encrypt parameter but got %r' % encrypt) - self._doc.encrypt = encrypt - else: - try: - del self._doc.encrypt - except AttributeError: - pass - - def init_graphics_state(self): - #initial graphics state, never modify any of these in place - self._x = 0 - self._y = 0 - self._fontname = rl_config.canvas_basefontname - self._fontsize = 12 - - self._textMode = 0 #track if between BT/ET - self._leading = 14.4 - self._currentMatrix = (1., 0., 0., 1., 0., 0.) - self._fillMode = 0 #even-odd - - #text state - self._charSpace = 0 - self._wordSpace = 0 - self._horizScale = 100 - self._textRenderMode = 0 - self._rise = 0 - self._textLineMatrix = (1., 0., 0., 1., 0., 0.) - self._textMatrix = (1., 0., 0., 1., 0., 0.) - - # line drawing - self._lineCap = 0 - self._lineJoin = 0 - self._lineDash = None #not done - self._lineWidth = 1 - self._mitreLimit = 0 - - self._fillColorObj = self._strokeColorObj = rl_config.canvas_baseColor or (0,0,0) - self._extgstate = ExtGState() - - def push_state_stack(self): - state = {} - d = self.__dict__ - for name in self.STATE_ATTRIBUTES: - state[name] = d[name] #getattr(self, name) - self.state_stack.append(state) - self._extgstate = self._extgstate.pushCopy() - - def pop_state_stack(self): - self.__dict__.update(self.state_stack.pop()) - - STATE_ATTRIBUTES = """_x _y _fontname _fontsize _textMode _leading _currentMatrix _fillMode - _charSpace _wordSpace _horizScale _textRenderMode _rise _textLineMatrix - _textMatrix _lineCap _lineJoin _lineDash _lineWidth _mitreLimit _fillColorObj - _strokeColorObj _extgstate""".split() - STATE_RANGE = list(range(len(STATE_ATTRIBUTES))) - - #self._addStandardFonts() - - def _make_preamble(self): - P = [].append - if self.bottomup: - P('1 0 0 1 0 0 cm') - else: - P('1 0 0 -1 0 %s cm' % fp_str(self._pagesize[1])) - C = self._code - n = len(C) - if self._fillColorObj != (0,0,0): - self.setFillColor(self._fillColorObj) - if self._strokeColorObj != (0,0,0): - self.setStrokeColor(self._strokeColorObj) - P(' '.join(C[n:])) - del C[n:] - font = pdfmetrics.getFont(self._fontname) - if not font._dynamicFont: - #set an initial font - if font.face.builtIn or not getattr(self,'_drawTextAsPath',False): - P('BT %s 12 Tf 14.4 TL ET' % self._doc.getInternalFontName(self._fontname)) - self._preamble = ' '.join(P.__self__) - - def _escape(self, s): - return escapePDF(s) - - #info functions - non-standard - def setAuthor(self, author): - """identify the author for invisible embedding inside the PDF document. - the author annotation will appear in the the text of the file but will - not automatically be seen when the document is viewed, but is visible - in document properties etc etc.""" - self._doc.setAuthor(author) - - def setDateFormatter(self, dateFormatter): - """accepts a func(yyyy,mm,dd,hh,m,s) used to create embedded formatted date""" - self._doc.setDateFormatter(dateFormatter) - - def addOutlineEntry(self, title, key, level=0, closed=None): - """Adds a new entry to the outline at given level. If LEVEL not specified, - entry goes at the top level. If level specified, it must be - no more than 1 greater than the outline level in the last call. - - The key must be the (unique) name of a bookmark. - the title is the (non-unique) name to be displayed for the entry. - - If closed is set then the entry should show no subsections by default - when displayed. - - Example:: - - c.addOutlineEntry("first section", "section1") - c.addOutlineEntry("introduction", "s1s1", 1, closed=1) - c.addOutlineEntry("body", "s1s2", 1) - c.addOutlineEntry("detail1", "s1s2s1", 2) - c.addOutlineEntry("detail2", "s1s2s2", 2) - c.addOutlineEntry("conclusion", "s1s3", 1) - c.addOutlineEntry("further reading", "s1s3s1", 2) - c.addOutlineEntry("second section", "section1") - c.addOutlineEntry("introduction", "s2s1", 1) - c.addOutlineEntry("body", "s2s2", 1, closed=1) - c.addOutlineEntry("detail1", "s2s2s1", 2) - c.addOutlineEntry("detail2", "s2s2s2", 2) - c.addOutlineEntry("conclusion", "s2s3", 1) - c.addOutlineEntry("further reading", "s2s3s1", 2) - - generated outline looks like:: - - - first section - |- introduction - |- body - | |- detail1 - | |- detail2 - |- conclusion - | |- further reading - - second section - |- introduction - |+ body - |- conclusion - | |- further reading - - Note that the second "body" is closed. - - Note that you can jump from level 5 to level 3 but not - from 3 to 5: instead you need to provide all intervening - levels going down (4 in this case). Note that titles can - collide but keys cannot. - """ - #to be completed - #self._outlines.append(title) - self._doc.outline.addOutlineEntry(key, level, title, closed=closed) - - def setOutlineNames0(self, *nametree): # keep this for now (?) - """nametree should can be a recursive tree like so:: - - c.setOutlineNames( - "chapter1dest", - ("chapter2dest", - ["chapter2section1dest", - "chapter2section2dest", - "chapter2conclusiondest"] - ), # end of chapter2 description - "chapter3dest", - ("chapter4dest", ["c4s1", "c4s2"]) - ) - - each of the string names inside must be bound to a bookmark - before the document is generated. - """ - self._doc.outline.setNames(*((self,)+nametree)) - - def setTitle(self, title): - """write a title into the PDF file that won't automatically display - in the document itself.""" - self._doc.setTitle(title) - - def setSubject(self, subject): - """write a subject into the PDF file that won't automatically display - in the document itself.""" - self._doc.setSubject(subject) - - def setCreator(self, creator): - """write a creator into the PDF file that won't automatically display - in the document itself. This should be used to name the original app - which is passing data into ReportLab, if you wish to name it.""" - self._doc.setCreator(creator) - - def setKeywords(self, keywords): - """write a list of keywords into the PDF file which shows in document properties. - Either submit a single string or a list/tuple""" - if isinstance(keywords,(list,tuple)): - keywords = ', '.join(keywords) - self._doc.setKeywords(keywords) - - def pageHasData(self): - "Info function - app can call it after showPage to see if it needs a save" - return len(self._code) == 0 - - def showOutline(self): - """Specify that Acrobat Reader should start with the outline tree visible. - showFullScreen() and showOutline() conflict; the one called last - wins.""" - self._doc._catalog.showOutline() - - def showFullScreen0(self): - """Specify that Acrobat Reader should start in full screen mode. - showFullScreen() and showOutline() conflict; the one called last - wins.""" - self._doc._catalog.showFullScreen() - - def _setStrokeAlpha(self,v): - """ - Define the transparency/opacity of strokes. 0 is fully - transparent, 1 is fully opaque. - - Note that calling this function will cause a version 1.4 PDF - to be generated (rather than 1.3). - """ - self._doc.ensureMinPdfVersion('transparency') - self._extgstate.set(self,'CA',v) - - def _setFillAlpha(self,v): - """ - Define the transparency/opacity of non-strokes. 0 is fully - transparent, 1 is fully opaque. - - Note that calling this function will cause a version 1.4 PDF - to be generated (rather than 1.3). - """ - self._doc.ensureMinPdfVersion('transparency') - self._extgstate.set(self,'ca',v) - - def _setStrokeOverprint(self,v): - self._extgstate.set(self,'OP',v) - - def _setFillOverprint(self,v): - self._extgstate.set(self,'op',v) - - def _setOverprintMask(self,v): - self._extgstate.set(self,'OPM',v and 1 or 0) - - def _getCmShift(self): - cM = self._cropMarks - if cM: - bleedW = max(0,getattr(cM,'bleedWidth',0)) - bw = max(0,getattr(cM,'borderWidth',36)) - if bleedW: - bw -= bleedW - return bw - - def showPage(self): - """Close the current page and possibly start on a new page.""" - # ensure a space at the end of the stream - Acrobat does - # not mind, but Ghostscript dislikes 'Qendstream' even if - # the length marker finishes after 'Q' - - pageWidth = self._pagesize[0] - pageHeight = self._pagesize[1] - cM = self._cropMarks - code = self._code - if cM: - bw = max(0,getattr(cM,'borderWidth',36)) - if bw: - markLast = getattr(cM,'markLast',1) - ml = min(bw,max(0,getattr(cM,'markLength',18))) - mw = getattr(cM,'markWidth',0.5) - mc = getattr(cM,'markColor',black) - mg = 2*bw-ml - cx0 = len(code) - if ml and mc: - self.saveState() - self.setStrokeColor(mc) - self.setLineWidth(mw) - self.lines([ - (bw,0,bw,ml), - (pageWidth+bw,0,pageWidth+bw,ml), - (bw,pageHeight+mg,bw,pageHeight+2*bw), - (pageWidth+bw,pageHeight+mg,pageWidth+bw,pageHeight+2*bw), - (0,bw,ml,bw), - (pageWidth+mg,bw,pageWidth+2*bw,bw), - (0,pageHeight+bw,ml,pageHeight+bw), - (pageWidth+mg,pageHeight+bw,pageWidth+2*bw,pageHeight+bw), - ]) - self.restoreState() - if markLast: - #if the marks are to be drawn after the content - #save the code we just drew for later use - L = code[cx0:] - del code[cx0:] - cx0 = len(code) - - bleedW = max(0,getattr(cM,'bleedWidth',0)) - self.saveState() - self.translate(bw-bleedW,bw-bleedW) - if bleedW: - #scale everything - self.scale(1+(2.0*bleedW)/pageWidth,1+(2.0*bleedW)/pageHeight) - - #move our translation/expansion code to the beginning - C = code[cx0:] - del code[cx0:] - code[0:0] = C - self.restoreState() - if markLast: - code.extend(L) - pageWidth = 2*bw + pageWidth - pageHeight = 2*bw + pageHeight - - code.append(' ') - page = pdfdoc.PDFPage() - page.pagewidth = pageWidth - page.pageheight = pageHeight - page.Rotate = self._pageRotation - page.hasImages = self._currentPageHasImages - page.setPageTransition(self._pageTransition) - page.setCompression(self._pageCompression) - if self._pageDuration is not None: - page.Dur = self._pageDuration - - strm = self._psCommandsBeforePage + [self._preamble] + code + self._psCommandsAfterPage - page.setStream(strm) - self._setColorSpace(page) - self._setExtGState(page) - self._setXObjects(page) - self._setShadingUsed(page) - self._setAnnotations(page) - self._doc.addPage(page) - - if self._onPage: self._onPage(self._pageNumber) - self._startPage() - - def _startPage(self): - #now get ready for the next one - if self._hanging_pagesize: - self.setPageSize(self._hanging_pagesize) - self._hanging_pagesize = None - self._pageNumber += 1 - self._restartAccumulators() - self.init_graphics_state() - self.state_stack = [] - - def setPageCallBack(self, func): - """func(pageNum) will be called on each page end. - - This is mainly a hook for progress monitoring. - Call setPageCallback(None) to clear a callback.""" - self._onPage = func - - def _setAnnotations(self,page): - page.Annots = self._annotationrefs - - def _setColorSpace(self,obj): - obj._colorsUsed = self._colorsUsed - - def _setShadingUsed(self, page): - page._shadingUsed = self._shadingUsed - - def _setXObjects(self, thing): - """for pages and forms, define the XObject dictionary for resources, if needed""" - forms = self._formsinuse - if forms: - xobjectsdict = self._doc.xobjDict(forms) - thing.XObjects = xobjectsdict - else: - thing.XObjects = None - - def _bookmarkReference(self, name): - """get a reference to a (possibly undefined, possibly unbound) bookmark""" - d = self._destinations - try: - return d[name] - except: - result = d[name] = pdfdoc.Destination(name) # newly defined, unbound - return result - - def bookmarkPage(self, key, - fit="Fit", - left=None, - top=None, - bottom=None, - right=None, - zoom=None - ): - """ - This creates a bookmark to the current page which can - be referred to with the given key elsewhere. - - PDF offers very fine grained control over how Acrobat - reader is zoomed when people link to this. The default - is to keep the user's current zoom settings. the last - arguments may or may not be needed depending on the - choice of 'fitType'. - - Fit types and the other arguments they use are: - - - XYZ left top zoom - fine grained control. null - or zero for any of the parameters means 'leave - as is', so "0,0,0" will keep the reader's settings. - NB. Adobe Reader appears to prefer "null" to 0's. - - - Fit - entire page fits in window - - - FitH top - top coord at top of window, width scaled - to fit. - - - FitV left - left coord at left of window, height - scaled to fit - - - FitR left bottom right top - scale window to fit - the specified rectangle - - (question: do we support /FitB, FitBH and /FitBV - which are hangovers from version 1.1 / Acrobat 3.0?)""" - dest = self._bookmarkReference(key) - self._doc.inPage() # try to enable page-only features - pageref = self._doc.thisPageRef() - - #None = "null" for PDF - if left is None: - left = "null" - if top is None: - top = "null" - if bottom is None: - bottom = "null" - if right is None: - right = "null" - if zoom is None: - zoom = "null" - - if fit == "XYZ": - dest.xyz(left,top,zoom) - elif fit == "Fit": - dest.fit() - elif fit == "FitH": - dest.fith(top) - elif fit == "FitV": - dest.fitv(left) - elif fit == "FitR": - dest.fitr(left,bottom,right,top) - #Do we need these (version 1.1 / Acrobat 3 versions)? - elif fit == "FitB": - dest.fitb() - elif fit == "FitBH": - dest.fitbh(top) - elif fit == "FitBV": - dest.fitbv(left) - else: - raise ValueError("Unknown Fit type %s" % ascii(fit)) - - dest.setPage(pageref) - return dest - - def bookmarkHorizontalAbsolute(self, key, top, left=0, fit='XYZ', **kw): - """Bind a bookmark (destination) to the current page at a horizontal position. - Note that the yhorizontal of the book mark is with respect to the default - user space (where the origin is at the lower left corner of the page) - and completely ignores any transform (translation, scale, skew, rotation, - etcetera) in effect for the current graphics state. The programmer is - responsible for making sure the bookmark matches an appropriate item on - the page.""" - #This method should probably be deprecated since it is just a sub-set of bookmarkPage - return self.bookmarkPage(key, fit=fit, top=top, left=left, zoom=0) - - def bookmarkHorizontal(self, key, relativeX, relativeY, **kw): - """w.r.t. the current transformation, bookmark this horizontal.""" - (left, top) = self.absolutePosition(relativeX,relativeY) - self.bookmarkHorizontalAbsolute(key, top, left=left, **kw) - - #def _inPage0(self): disallowed! - # """declare a page, enable page features""" - # self._doc.inPage() - - #def _inForm0(self): - # "deprecated in favore of beginForm...endForm" - # self._doc.inForm() - - def doForm(self, name): - """use a form XObj in current operation stream. - - The form should either have been defined previously using - beginForm ... endForm, or may be defined later. If it is not - defined at save time, an exception will be raised. The form - will be drawn within the context of the current graphics - state.""" - self._code.append("/%s Do" % self._doc.getXObjectName(name)) - self._formsinuse.append(name) - - def hasForm(self, name): - """Query whether form XObj really exists yet.""" - return self._doc.hasForm(name) - - ###################################################### - # - # Image routines - # - ###################################################### - def drawInlineImage(self, image, x,y, width=None,height=None, - preserveAspectRatio=False,anchor='c'): - """See drawImage, which should normally be used instead... - - drawInlineImage behaves like drawImage, but stores the image content - within the graphics stream for the page. This means that the mask - parameter for transparency is not available. It also means that there - is no saving in file size or time if the same image is reused. - - In theory it allows images to be displayed slightly faster; however, - we doubt if the difference is noticeable to any human user these days. - Only use this if you have studied the PDF specification and know the - implications. - """ - - self._currentPageHasImages = 1 - from reportlab.pdfgen.pdfimages import PDFImage - img_obj = PDFImage(image, x,y, width, height) - img_obj.drawInlineImage(self, - preserveAspectRatio=preserveAspectRatio, - anchor=anchor) - return (img_obj.width, img_obj.height) - - def drawImage(self, image, x, y, width=None, height=None, mask=None, - preserveAspectRatio=False, anchor='c'): - """Draws the image (ImageReader object or filename) as specified. - - "image" may be an image filename or an ImageReader object. - - x and y define the lower left corner of the image you wish to - draw (or of its bounding box, if using preserveAspectRation below). - - If width and height are not given, the width and height of the - image in pixels is used at a scale of 1 point to 1 pixel. - - If width and height are given, the image will be stretched to fill - the given rectangle bounded by (x, y, x+width, y-height). - - If you supply negative widths and/or heights, it inverts them and adjusts - x and y accordingly. - - The method returns the width and height of the underlying image, since - this is often useful for layout algorithms and saves you work if you have - not specified them yourself. - - The mask parameter supports transparent backgrounds. It takes 6 numbers - and defines the range of RGB values which will be masked out or treated - as transparent. For example with [0,2,40,42,136,139], it will mask out - any pixels with a Red value from 0-2, Green from 40-42 and - Blue from 136-139 (on a scale of 0-255). - - New post version 2.0: drawImage can center an image in a box you - provide, while preserving its aspect ratio. For example, you might - have a fixed square box in your design, and a collection of photos - which might be landscape or portrait that you want to appear within - the box. If preserveAspectRatio is true, your image will appear within - the box specified. - - - If preserveAspectRatio is True, the anchor property can be used to - specify how images should fit into the given box. It should - be set to one of the following values, taken from the points of - the compass (plus 'c' for 'centre'): - - nw n ne - w c e - sw s se - - The default value is 'c' for 'centre'. Thus, if you want your - bitmaps to always be centred and appear at the top of the given box, - set anchor='n'. There are good examples of this in the output - of test_pdfgen_general.py - - Unlike drawInlineImage, this creates 'external images' which - are only stored once in the PDF file but can be drawn many times. - If you give it the same filename twice, even at different locations - and sizes, it will reuse the first occurrence, resulting in a saving - in file size and generation time. If you use ImageReader objects, - it tests whether the image content has changed before deciding - whether to reuse it. - - In general you should use drawImage in preference to drawInlineImage - unless you have read the PDF Spec and understand the tradeoffs.""" - - self._currentPageHasImages = 1 - - # first, generate a unique name/signature for the image. If ANYTHING - # is different, even the mask, this should be different. - if isinstance(image,ImageReader): - rawdata = image.getRGBData() - smask = image._dataA - if mask=='auto' and smask: - mdata = smask.getRGBData() - else: - mdata = str(mask) - if isUnicode(mdata): - mdata = mdata.encode('utf8') - name = _digester(rawdata+mdata) - else: - #filename, use it - s = '%s%s' % (image, mask) - if isUnicode(s): - s = s.encode('utf-8') - name = _digester(s) - - # in the pdf document, this will be prefixed with something to - # say it is an XObject. Does it exist yet? - regName = self._doc.getXObjectName(name) - imgObj = self._doc.idToObject.get(regName, None) - if not imgObj: - #first time seen, create and register the PDFImageXobject - imgObj = pdfdoc.PDFImageXObject(name, image, mask=mask) - imgObj.name = name - self._setXObjects(imgObj) - self._doc.Reference(imgObj, regName) - self._doc.addForm(name, imgObj) - smask = getattr(imgObj,'_smask',None) - if smask: #set up the softmask obtained above - mRegName = self._doc.getXObjectName(smask.name) - mImgObj = self._doc.idToObject.get(mRegName, None) - if not mImgObj: - self._setXObjects(smask) - imgObj.smask = self._doc.Reference(smask,mRegName) - else: - imgObj.smask = pdfdoc.PDFObjectReference(mRegName) - del imgObj._smask - - # ensure we have a size, as PDF will make it 1x1 pixel otherwise! - x,y,width,height,scaled = aspectRatioFix(preserveAspectRatio,anchor,x,y,width,height,imgObj.width,imgObj.height) - - # scale and draw - self.saveState() - self.translate(x, y) - self.scale(width, height) - self._code.append("/%s Do" % regName) - self.restoreState() - - # track what's been used on this page - self._formsinuse.append(name) - - return (imgObj.width, imgObj.height) - - def _restartAccumulators(self): - if self._codeStack: - # restore the saved code - saved = self._codeStack[-1] - del self._codeStack[-1] - self._code, self._formsinuse, self._annotationrefs, self._formData,self._colorsUsed, self._shadingUsed = saved - else: - self._code = [] # ready for more... - self._psCommandsAfterPage = [] - self._currentPageHasImages = 1 # for safety... - self._formsinuse = [] - self._annotationrefs = [] - self._formData = None - self._colorsUsed = {} - self._shadingUsed = {} - - def _pushAccumulators(self): - "when you enter a form, save accumulator info not related to the form for page (if any)" - saved = (self._code, self._formsinuse, self._annotationrefs, self._formData, self._colorsUsed, self._shadingUsed) - self._codeStack.append(saved) - self._code = [] # ready for more... - self._currentPageHasImages = 1 # for safety... - self._formsinuse = [] - self._annotationrefs = [] - self._formData = None - self._colorsUsed = {} - self._shadingUsed = {} - - def _setExtGState(self, obj): - obj.ExtGState = self._extgstate.getState() - - def beginForm(self, name, lowerx=0, lowery=0, upperx=None, uppery=None): - """declare the current graphics stream to be a named form. - A graphics stream can either be a page or a form, not both. - Some operations (like bookmarking) are permitted for pages - but not forms. The form will not automatically be shown in the - document but must be explicitly referenced using doForm in pages - that require the form.""" - self.push_state_stack() - self.init_graphics_state() - if self._code or self._formData: - # save the code that is not in the formf - self._pushAccumulators() - #self._codeStack.append(self._code) - #self._code = [] - self._formData = (name, lowerx, lowery, upperx, uppery) - self._doc.inForm() - #self._inForm0() - - def endForm(self,**extra_attributes): - """emit the current collection of graphics operations as a Form - as declared previously in beginForm.""" - (name, lowerx, lowery, upperx, uppery) = self._formData - #self.makeForm0(name, lowerx, lowery, upperx, uppery) - # fall through! makeForm0 disallowed - #def makeForm0(self, name, lowerx=0, lowery=0, upperx=None, uppery=None): - """Like showpage, but make a form using accumulated operations instead""" - # deprecated in favor or beginForm(...)... endForm() - (w,h) = self._pagesize - if upperx is None: upperx=w - if uppery is None: uppery=h - form = pdfdoc.PDFFormXObject(lowerx=lowerx, lowery=lowery, upperx=upperx, uppery=uppery) - form.compression = self._pageCompression - form.setStreamList([self._preamble] + self._code) # ??? minus preamble (seems to be needed!) - for k, v in extra_attributes.items(): - setattr(form,k,v) - self._setColorSpace(form) - self._setExtGState(form) - self._setXObjects(form) - self._setAnnotations(form) - self._doc.addForm(name, form) - self._restartAccumulators() - self.pop_state_stack() - - def addPostScriptCommand(self, command, position=1): - """Embed literal Postscript in the document. - - With position=0, it goes at very beginning of page stream; - with position=1, at current point; and - with position=2, at very end of page stream. What that does - to the resulting Postscript depends on Adobe's header :-) - - Use with extreme caution, but sometimes needed for printer tray commands. - Acrobat 4.0 will export Postscript to a printer or file containing - the given commands. Adobe Reader 6.0 no longer does as this feature is - deprecated. 5.0, I don't know about (please let us know!). This was - funded by Bob Marshall of Vector.co.uk and tested on a Lexmark 750. - See test_pdfbase_postscript.py for 2 test cases - one will work on - any Postscript device, the other uses a 'setpapertray' command which - will error in Distiller but work on printers supporting it. - """ - #check if we've done this one already... - if isUnicode(command): - rawName = 'PS' + hashlib.md5(command.encode('utf-8')).hexdigest() - else: - rawName = 'PS' + hashlib.md5(command).hexdigest() - regName = self._doc.getXObjectName(rawName) - psObj = self._doc.idToObject.get(regName, None) - if not psObj: - #first use of this chunk of Postscript, make an object - psObj = pdfdoc.PDFPostScriptXObject(command + '\r\n') - self._setXObjects(psObj) - self._doc.Reference(psObj, regName) - self._doc.addForm(rawName, psObj) - if position == 0: - self._psCommandsBeforePage.append("/%s Do" % regName) - elif position==1: - self._code.append("/%s Do" % regName) - else: - self._psCommandsAfterPage.append("/%s Do" % regName) - - self._formsinuse.append(rawName) - - def _absRect(self,rect,relative=0): - if not rect: - w,h = self._pagesize - rect = (0,0,w,h) - elif relative: - lx, ly, ux, uy = rect - xll,yll = self.absolutePosition(lx,ly) - xur,yur = self.absolutePosition(ux, uy) - xul,yul = self.absolutePosition(lx, uy) - xlr,ylr = self.absolutePosition(ux, ly) - xs = xll, xur, xul, xlr - ys = yll, yur, yul, ylr - xmin, ymin = min(xs), min(ys) - xmax, ymax = max(xs), max(ys) - rect = xmin, ymin, xmax, ymax - bw = self._getCmShift() - if bw: - rect = rect[0]+bw,rect[1]+bw,rect[2]+bw,rect[3]+bw - return rect - - def freeTextAnnotation(self, contents, DA, Rect=None, addtopage=1, name=None, relative=0, **kw): - """DA is the default appearance string???""" - Rect = self._absRect(Rect,relative) - self._addAnnotation(pdfdoc.FreeTextAnnotation(Rect, contents, DA, **kw), name, addtopage) - - def textAnnotation(self, contents, Rect=None, addtopage=1, name=None, relative=0, **kw): - """Experimental, but works. - """ - Rect = self._absRect(Rect,relative) - self._addAnnotation(pdfdoc.TextAnnotation(Rect, contents, **kw), name, addtopage) - textAnnotation0 = textAnnotation #deprecated - - def highlightAnnotation(self, contents, Rect, QuadPoints=None, Color=[0.83, 0.89, 0.95], addtopage=1, - name=None, relative=0, **kw): - """ - Allows adding of a highlighted annotation. - - Rect: Mouseover area to show contents of annotation - QuadPoints: List of four x/y points [TOP-LEFT, TOP-RIGHT, BOTTOM-LEFT, BOTTOM-RIGHT] - These points outline the areas to highlight. - You can have multiple groups of four to allow multiple highlighted areas. - Is in the format [x1, y1, x2, y2, x3, y3, x4, y4, x1, y1, x2, y2, x3, y3, x4, y4] etc - QuadPoints defaults to be area inside of passed in Rect - Color: The color of the highlighting. - """ - Rect = self._absRect(Rect, relative) - if not QuadPoints: - QuadPoints = pdfdoc.rect_to_quad(Rect) - self._addAnnotation(pdfdoc.HighlightAnnotation(Rect, contents, QuadPoints, Color, **kw), name, addtopage) - - def inkAnnotation(self, contents, InkList=None, Rect=None, addtopage=1, name=None, relative=0, **kw): - raise NotImplementedError - "Experimental" - Rect = self._absRect(Rect,relative) - if not InkList: - InkList = ((100,100,100,h-100,w-100,h-100,w-100,100),) - self._addAnnotation(pdfdoc.InkAnnotation(Rect, contents, InkList, **kw), name, addtopage) - inkAnnotation0 = inkAnnotation #deprecated - - def linkAbsolute(self, contents, destinationname, Rect=None, addtopage=1, name=None, - thickness=0, color=None, dashArray=None, **kw): - """rectangular link annotation positioned wrt the default user space. - The identified rectangle on the page becomes a "hot link" which - when clicked will send the viewer to the page and position identified - by the destination. - - Rect identifies (lowerx, lowery, upperx, uppery) for lower left - and upperright points of the rectangle. Translations and other transforms - are IGNORED (the rectangular position is given with respect - to the default user space. - destinationname should be the name of a bookmark (which may be defined later - but must be defined before the document is generated). - - You may want to use the keyword argument Border='[0 0 0]' to - suppress the visible rectangle around the during viewing link.""" - return self.linkRect(contents, destinationname, Rect, addtopage, name, relative=0, - thickness=thickness, color=color, dashArray=dashArray, **kw) - - def linkRect(self, contents, destinationname, Rect=None, addtopage=1, name=None, relative=1, - thickness=0, color=None, dashArray=None, **kw): - """rectangular link annotation w.r.t the current user transform. - if the transform is skewed/rotated the absolute rectangle will use the max/min x/y - """ - destination = self._bookmarkReference(destinationname) # permitted to be undefined... must bind later... - Rect = self._absRect(Rect,relative) - kw["Rect"] = Rect - kw["Contents"] = contents - kw["Destination"] = destination - _annFormat(kw,color,thickness,dashArray) - return self._addAnnotation(pdfdoc.LinkAnnotation(**kw), name, addtopage) - - def linkURL(self, url, rect, relative=0, thickness=0, color=None, dashArray=None, kind="URI", **kw): - """Create a rectangular URL 'hotspot' in the given rectangle. - - if relative=1, this is in the current coord system, otherwise - in absolute page space. - The remaining options affect the border appearance; the border is - drawn by Acrobat, not us. Set thickness to zero to hide it. - Any border drawn this way is NOT part of the page stream and - will not show when printed to a Postscript printer or distilled; - it is safest to draw your own.""" - from reportlab.pdfbase.pdfdoc import PDFDictionary, PDFName, PDFArray, PDFString - #tried the documented BS element in the pdf spec but it - #does not work, and Acrobat itself does not appear to use it! - - ann = PDFDictionary(dict=kw) - ann["Type"] = PDFName("Annot") - ann["Subtype"] = PDFName("Link") - ann["Rect"] = PDFArray(self._absRect(rect,relative)) # the whole page for testing - - # the action is a separate dictionary - A = PDFDictionary() - A["Type"] = PDFName("Action") # not needed? - uri = PDFString(url) - A['S'] = PDFName(kind) - if kind=="URI": - A["URI"] = uri - elif kind=='GoToR': - A["F"] = uri - A["D"] = "[ 0 /XYZ null null null ]" - else: - raise ValueError("Unknown linkURI kind '%s'" % kind) - - ann["A"] = A - _annFormat(ann,color,thickness,dashArray) - self._addAnnotation(ann) - - def _addAnnotation(self, annotation, name=None, addtopage=1): - count = self._annotationCount = self._annotationCount+1 - if not name: name="NUMBER"+repr(count) - self._doc.addAnnotation(name, annotation) - if addtopage: - self._annotatePage(name) - - def _annotatePage(self, name): - ref = self._doc.refAnnotation(name) - self._annotationrefs.append(ref) - - def getPageNumber(self): - "get the page number for the current page being generated." - return self._pageNumber - - def save(self): - """Saves and close the PDF document in the file. - If there is current data a ShowPage is executed automatically. - After this operation the canvas must not be used further.""" - if len(self._code): self.showPage() - self._doc.SaveToFile(self._filename, self) - - def getpdfdata(self): - """Returns the PDF data that would normally be written to a file. - If there is current data a ShowPage is executed automatically. - After this operation the canvas must not be used further.""" - if len(self._code): self.showPage() - s = self._doc.GetPDFData(self) - if isUnicode(s): - s = s.encode('utf-8') - return s - - def setPageSize(self, size): - """accepts a 2-tuple in points for paper size for this - and subsequent pages""" - self._pagesize = size - self._make_preamble() - - def setPageRotation(self, rot): - """Instruct display device that this page is to be rotated""" - assert rot % 90.0 == 0.0, "Rotation must be a multiple of 90 degrees" - self._pageRotation = rot - - def addLiteral(self, s, escaped=1): - """introduce the literal text of PDF operations s into the current stream. - Only use this if you are an expert in the PDF file format.""" - s = str(s) # make sure its a string - if escaped==0: - s = self._escape(s) # convert to string for safety - self._code.append(s) - - ###################################################################### - # - # coordinate transformations - # - ###################################################################### - def resetTransforms(self): - """I want to draw something (eg, string underlines) w.r.t. the default user space. - Reset the matrix! This should be used usually as follows:: - - canv.saveState() - canv.resetTransforms() - #...draw some stuff in default space coords... - canv.restoreState() # go back! - """ - # we have to adjoin the inverse, since reset is not a basic operation (without save/restore) - (selfa, selfb, selfc, selfd, selfe, selff) = self._currentMatrix - det = selfa*selfd - selfc*selfb - resulta = selfd/det - resultc = -selfc/det - resulte = (selfc*selff - selfd*selfe)/det - resultd = selfa/det - resultb = -selfb/det - resultf = (selfe*selfb - selff*selfa)/det - self.transform(resulta, resultb, resultc, resultd, resulte, resultf) - - def transform(self, a,b,c,d,e,f): - """adjoin a mathematical transform to the current graphics state matrix. - Not recommended for beginners.""" - #How can Python track this? - if ENABLE_TRACKING: - a0,b0,c0,d0,e0,f0 = self._currentMatrix - self._currentMatrix = (a0*a+c0*b, b0*a+d0*b, - a0*c+c0*d, b0*c+d0*d, - a0*e+c0*f+e0, b0*e+d0*f+f0) - if self._code and self._code[-1][-3:]==' cm': - L = self._code[-1].split() - a0, b0, c0, d0, e0, f0 = list(map(float,L[-7:-1])) - s = len(L)>7 and join(L)+ ' %s cm' or '%s cm' - self._code[-1] = s % fp_str(a0*a+c0*b,b0*a+d0*b,a0*c+c0*d,b0*c+d0*d,a0*e+c0*f+e0,b0*e+d0*f+f0) - else: - self._code.append('%s cm' % fp_str(a,b,c,d,e,f)) - - def absolutePosition(self, x, y): - """return the absolute position of x,y in user space w.r.t. default user space""" - if not ENABLE_TRACKING: - raise ValueError("tracking not enabled! (canvas.ENABLE_TRACKING=0)") - (a,b,c,d,e,f) = self._currentMatrix - xp = a*x + c*y + e - yp = b*x + d*y + f - return (xp, yp) - - def translate(self, dx, dy): - """move the origin from the current (0,0) point to the (dx,dy) point - (with respect to the current graphics state).""" - self.transform(1,0,0,1,dx,dy) - - def scale(self, x, y): - """Scale the horizontal dimension by x and the vertical by y - (with respect to the current graphics state). - For example canvas.scale(2.0, 0.5) will make everything short and fat.""" - self.transform(x,0,0,y,0,0) - - def rotate(self, theta): - """Canvas.rotate(theta) - - Rotate the canvas by the angle theta (in degrees).""" - c = cos(theta * pi / 180) - s = sin(theta * pi / 180) - self.transform(c, s, -s, c, 0, 0) - - def skew(self, alpha, beta): - tanAlpha = tan(alpha * pi / 180) - tanBeta = tan(beta * pi / 180) - self.transform(1, tanAlpha, tanBeta, 1, 0, 0) - - ###################################################################### - # - # graphics state management - # - ###################################################################### - - def saveState(self): - """Save the current graphics state to be restored later by restoreState. - - For example: - canvas.setFont("Helvetica", 20) - canvas.saveState() - ... - canvas.setFont("Courier", 9) - ... - canvas.restoreState() - # if the save/restore pairs match then font is Helvetica 20 again. - """ - self.push_state_stack() - self._code.append('q') - - def restoreState(self): - """restore the graphics state to the matching saved state (see saveState).""" - self._code.append('Q') - self.pop_state_stack() - - ############################################################### - # - # Drawing methods. These draw things directly without - # fiddling around with Path objects. We can add any geometry - # methods we wish as long as their meaning is precise and - # they are of general use. - # - # In general there are two patterns. Closed shapes - # have the pattern shape(self, args, stroke=1, fill=0); - # by default they draw an outline only. Line segments come - # in three flavours: line, bezier, arc (which is a segment - # of an elliptical arc, approximated by up to four bezier - # curves, one for each quadrant. - # - # In the case of lines, we provide a 'plural' to unroll - # the inner loop; it is useful for drawing big grids - ################################################################ - - #--------first the line drawing methods----------------------- - - def line(self, x1,y1, x2,y2): - """draw a line segment from (x1,y1) to (x2,y2) (with color, thickness and - other attributes determined by the current graphics state).""" - self._code.append('n %s m %s l S' % (fp_str(x1, y1), fp_str(x2, y2))) - - def lines(self, linelist): - """Like line(), permits many lines to be drawn in one call. - for example for the figure:: - - | - -- -- - | - - crosshairs = [(20,0,20,10), (20,30,20,40), (0,20,10,20), (30,20,40,20)] - canvas.lines(crosshairs) - """ - self._code.append('n') - for (x1,y1,x2,y2) in linelist: - self._code.append('%s m %s l' % (fp_str(x1, y1), fp_str(x2, y2))) - self._code.append('S') - - def grid(self, xlist, ylist): - """Lays out a grid in current line style. Supply list of - x an y positions.""" - assert len(xlist) > 1, "x coordinate list must have 2+ items" - assert len(ylist) > 1, "y coordinate list must have 2+ items" - lines = [] - y0, y1 = ylist[0], ylist[-1] - x0, x1 = xlist[0], xlist[-1] - for x in xlist: - lines.append((x,y0,x,y1)) - for y in ylist: - lines.append((x0,y,x1,y)) - self.lines(lines) - - def bezier(self, x1, y1, x2, y2, x3, y3, x4, y4): - "Bezier curve with the four given control points" - self._code.append('n %s m %s c S' % - (fp_str(x1, y1), fp_str(x2, y2, x3, y3, x4, y4)) - ) - def arc(self, x1,y1, x2,y2, startAng=0, extent=90): - """Draw a partial ellipse inscribed within the rectangle x1,y1,x2,y2, - starting at startAng degrees and covering extent degrees. Angles - start with 0 to the right (+x) and increase counter-clockwise. - These should have x1 - from reportlab.pdfbase.pdfdoc import PDFAxialShading - colorSpace, ncolors = _normalizeColors(colors) - fcn = _buildColorFunction(ncolors, positions) - if extend: - extendStr = "[true true]" - else: - extendStr = "[false false]" - shading = PDFAxialShading(x0, y0, x1, y1, Function=fcn, - ColorSpace=colorSpace, Extend=extendStr) - self.shade(shading) - - def radialGradient(self, x, y, radius, colors, positions=None, extend=True): - #this code contributed by Peter Johnson - from reportlab.pdfbase.pdfdoc import PDFRadialShading - colorSpace, ncolors = _normalizeColors(colors) - fcn = _buildColorFunction(ncolors, positions) - if extend: - extendStr = "[true true]" - else: - extendStr = "[false false]" - shading = PDFRadialShading(x, y, 0.0, x, y, radius, Function=fcn, - ColorSpace=colorSpace, Extend=extendStr) - self.shade(shading) - - ################################################## - # - # Text methods - # - # As with graphics, a separate object ensures that - # everything is bracketed between text operators. - # The methods below are a high-level convenience. - # use PDFTextObject for multi-line text. - ################################################## - - def drawString(self, x, y, text, mode=None): - """Draws a string in the current text styles.""" - if sys.version_info[0] == 3 and not isinstance(text, str): - text = text.decode('utf-8') - #we could inline this for speed if needed - t = self.beginText(x, y) - if mode is not None: t.setTextRenderMode(mode) - t.textLine(text) - self.drawText(t) - - def drawRightString(self, x, y, text, mode=None): - """Draws a string right-aligned with the x coordinate""" - if sys.version_info[0] == 3 and not isinstance(text, str): - text = text.decode('utf-8') - width = self.stringWidth(text, self._fontname, self._fontsize) - t = self.beginText(x - width, y) - if mode is not None: t.setTextRenderMode(mode) - t.textLine(text) - self.drawText(t) - - def drawCentredString(self, x, y, text,mode=None): - """Draws a string centred on the x coordinate. - - We're British, dammit, and proud of our spelling!""" - if sys.version_info[0] == 3 and not isinstance(text, str): - text = text.decode('utf-8') - width = self.stringWidth(text, self._fontname, self._fontsize) - t = self.beginText(x - 0.5*width, y) - if mode is not None: t.setTextRenderMode(mode) - t.textLine(text) - self.drawText(t) - - def drawAlignedString(self, x, y, text, pivotChar=rl_config.decimalSymbol): - """Draws a string aligned on the first '.' (or other pivot character). - - The centre position of the pivot character will be used as x. - So, you could draw a straight line down through all the decimals in a - column of numbers, and anything without a decimal should be - optically aligned with those that have. - - There is one special rule to help with accounting formatting. Here's - how normal numbers should be aligned on the 'dot'. Look at the - LAST two:: - - 12,345,67 - 987.15 - 42 - -1,234.56 - (456.78) - (456) - 27 inches - 13cm - - Since the last three do not contain a dot, a crude dot-finding - rule would place them wrong. So we test for the special case - where no pivot is found, digits are present, but the last character - is not a digit. We then work back from the end of the string - This case is a tad slower but hopefully rare. - - """ - parts = text.split(pivotChar,1) - pivW = self.stringWidth(pivotChar, self._fontname, self._fontsize) - - if len(parts) == 1 and digitPat.search(text) is not None and text[-1] not in digits: - #we have no decimal but it ends in a bracket, or 'in' or something. - #the cut should be after the last digit. - leftText = parts[0][0:-1] - rightText = parts[0][-1] - #any more? - while leftText[-1] not in digits: - rightText = leftText[-1] + rightText - leftText = leftText[0:-1] - - self.drawRightString(x-0.5*pivW, y, leftText) - self.drawString(x-0.5*pivW, y, rightText) - - else: - #normal case - leftText = parts[0] - self.drawRightString(x-0.5*pivW, y, leftText) - if len(parts) > 1: - rightText = pivotChar + parts[1] - self.drawString(x-0.5*pivW, y, rightText) - - def getAvailableFonts(self): - """Returns the list of PostScript font names available. - - Standard set now, but may grow in future with font embedding.""" - fontnames = self._doc.getAvailableFonts() - fontnames.sort() - return fontnames - - def addFont(self, fontObj): - "add a new font for subsequent use." - self._doc.addFont(fontObj) - - def _addStandardFonts(self): - """Ensures the standard 14 fonts are available in the system encoding. - Called by canvas on initialization""" - for fontName in pdfmetrics.standardFonts: - self.addFont(pdfmetrics.fontsByName[fontName]) - - def listLoadedFonts0(self): - "Convenience function to list all loaded fonts" - names = list(pdfmetrics.widths.keys()) - names.sort() - return names - - def setFont(self, psfontname, size, leading = None): - """Sets the font. If leading not specified, defaults to 1.2 x - font size. Raises a readable exception if an illegal font - is supplied. Font names are case-sensitive! Keeps track - of font name and size for metrics.""" - self._fontname = psfontname - self._fontsize = size - if leading is None: - leading = size * 1.2 - self._leading = leading - font = pdfmetrics.getFont(self._fontname) - if not font._dynamicFont: - if font.face.builtIn or not getattr(self,'_drawTextAsPath',False): - pdffontname = self._doc.getInternalFontName(psfontname) - self._code.append('BT %s %s Tf %s TL ET' % (pdffontname, fp_str(size), fp_str(leading))) - - def setFontSize(self, size=None, leading=None): - '''Sets font size or leading without knowing the font face''' - if size is None: size = self._fontsize - if leading is None: leading = self._leading - self.setFont(self._fontname, size, leading) - - def stringWidth(self, text, fontName=None, fontSize=None): - "gets width of a string in the given font and size" - return pdfmetrics.stringWidth(text, fontName or self._fontname, - (fontSize,self._fontsize)[fontSize is None]) - - # basic graphics modes - - def setLineWidth(self, width): - self._lineWidth = width - self._code.append('%s w' % fp_str(width)) - - def setLineCap(self, mode): - """0=butt,1=round,2=square""" - assert mode in (0,1,2), "Line caps allowed: 0=butt,1=round,2=square" - self._lineCap = mode - self._code.append('%d J' % mode) - - def setLineJoin(self, mode): - """0=mitre, 1=round, 2=bevel""" - assert mode in (0,1,2), "Line Joins allowed: 0=mitre, 1=round, 2=bevel" - self._lineJoin = mode - self._code.append('%d j' % mode) - - def setMiterLimit(self, limit): - self._miterLimit = limit - self._code.append('%s M' % fp_str(limit)) - - def setDash(self, array=[], phase=0): - """Two notations. pass two numbers, or an array and phase""" - if isinstance(array,(int,float)): - self._code.append('[%s %s] 0 d' % (array, phase)) - elif isSeq(array): - assert phase >= 0, "phase is a length in user space" - textarray = ' '.join([str(s) for s in array]) - self._code.append('[%s] %s d' % (textarray, phase)) - - # path stuff - the separate path object builds it - - def beginPath(self): - """Returns a fresh path object. Paths are used to draw - complex figures. The object returned follows the protocol - for a pathobject.PDFPathObject instance""" - return pathobject.PDFPathObject() - - def drawPath(self, aPath, stroke=1, fill=0): - "Draw the path object in the mode indicated" - self._code.append(str(aPath.getCode())) - self._strokeAndFill(stroke,fill) - - def _strokeAndFill(self,stroke,fill): - self._code.append(PATH_OPS[stroke, fill, self._fillMode]) - - def clipPath(self, aPath, stroke=1, fill=0): - "clip as well as drawing" - gc = aPath.getCode(); pathops = PATH_OPS[stroke, fill, self._fillMode] - clip = (self._fillMode == FILL_EVEN_ODD and ' W* ' or ' W ') - item = "%s%s%s" % (gc, clip, pathops) # ensure string conversion - self._code.append(item) - #self._code.append( aPath.getCode() - # + (self._fillMode == FILL_EVEN_ODD and ' W* ' or ' W ') - # + PATH_OPS[stroke,fill,self._fillMode]) - - def beginText(self, x=0, y=0): - """Returns a fresh text object. Text objects are used - to add large amounts of text. See textobject.PDFTextObject""" - return textobject.PDFTextObject(self, x, y) - - def drawText(self, aTextObject): - """Draws a text object""" - self._code.append(str(aTextObject.getCode())) - - def setPageCompression(self, pageCompression=1): - """Possible values None, 1 or 0 - If None the value from rl_config will be used. - If on, the page data will be compressed, leading to much - smaller files, but takes a little longer to create the files. - This applies to all subsequent pages, or until setPageCompression() - is next called.""" - if pageCompression is None: pageCompression = rl_config.pageCompression - if pageCompression and not zlib: - self._pageCompression = 0 - else: - self._pageCompression = pageCompression - self._doc.setCompression(self._pageCompression) - - def setPageDuration(self, duration=None): - """Allows hands-off animation of presentations :-) - - If this is set to a number, in full screen mode, Acrobat Reader - will advance to the next page after this many seconds. The - duration of the transition itself (fade/flicker etc.) is controlled - by the 'duration' argument to setPageTransition; this controls - the time spent looking at the page. This is effective for all - subsequent pages.""" - - self._pageDuration = duration - - def setPageTransition(self, effectname=None, duration=1, - direction=0,dimension='H',motion='I'): - """PDF allows page transition effects for use when giving - presentations. There are six possible effects. You can - just guive the effect name, or supply more advanced options - to refine the way it works. There are three types of extra - argument permitted, and here are the allowed values:: - - direction_arg = [0,90,180,270] - dimension_arg = ['H', 'V'] - motion_arg = ['I','O'] (start at inside or outside) - - This table says which ones take which arguments:: - - PageTransitionEffects = { - 'Split': [direction_arg, motion_arg], - 'Blinds': [dimension_arg], - 'Box': [motion_arg], - 'Wipe' : [direction_arg], - 'Dissolve' : [], - 'Glitter':[direction_arg] - } - - Have fun! - """ - # This builds a Python dictionary with the right arguments - # for the Trans dictionary in the PDFPage object, - # and stores it in the variable _pageTransition. - # showPage later passes this to the setPageTransition method - # of the PDFPage object, which turns it to a PDFDictionary. - self._pageTransition = {} - if not effectname: - return - - #first check each optional argument has an allowed value - if direction in [0,90,180,270]: - direction_arg = ('Di', '/%d' % direction) - else: - raise pdfdoc.PDFError(' directions allowed are 0,90,180,270') - - if dimension in ['H', 'V']: - dimension_arg = ('Dm', '/' + dimension) - else: - raise pdfdoc.PDFError('dimension values allowed are H and V') - - if motion in ['I','O']: - motion_arg = ('M', '/' + motion) - else: - raise pdfdoc.PDFError('motion values allowed are I and O') - - # this says which effects require which argument types from above - PageTransitionEffects = { - 'Split': [direction_arg, motion_arg], - 'Blinds': [dimension_arg], - 'Box': [motion_arg], - 'Wipe' : [direction_arg], - 'Dissolve' : [], - 'Glitter':[direction_arg] - } - - try: - args = PageTransitionEffects[effectname] - except KeyError: - raise pdfdoc.PDFError('Unknown Effect Name "%s"' % effectname) - - # now build the dictionary - transDict = {} - transDict['Type'] = '/Trans' - transDict['D'] = '%d' % duration - transDict['S'] = '/' + effectname - for (key, value) in args: - transDict[key] = value - self._pageTransition = transDict - - def getCurrentPageContent(self): - """Return uncompressed contents of current page buffer. - - This is useful in creating test cases and assertions of what - got drawn, without necessarily saving pages to disk""" - return '\n'.join(self._code) - - def setViewerPreference(self,pref,value): - '''set one of the allowed enbtries in the documents viewer preferences''' - catalog = self._doc.Catalog - VP = getattr(catalog,'ViewerPreferences',None) - if VP is None: - from reportlab.pdfbase.pdfdoc import ViewerPreferencesPDFDictionary - VP = catalog.ViewerPreferences = ViewerPreferencesPDFDictionary() - VP[pref] = value - - def getViewerPreference(self,pref): - '''you'll get an error here if none have been set''' - return self._doc.Catalog.ViewerPreferences[pref] - - def delViewerPreference(self,pref): - '''you'll get an error here if none have been set''' - del self._doc.Catalog.ViewerPreferences[pref] - - def addPageLabel(self, pageNum, style=None, start=None, prefix=None): - '''add a PDFPageLabel for pageNum''' - catalog = self._doc.Catalog - PL = getattr(catalog,'PageLabels',None) - if PL is None: - from reportlab.pdfbase.pdfdoc import PDFPageLabels - PL = catalog.PageLabels = PDFPageLabels() - - from reportlab.pdfbase.pdfdoc import PDFPageLabel - PL.addPageLabel(pageNum,PDFPageLabel(style,start,prefix)) - -if __name__ == '__main__': - print('For test scripts, look in tests') diff --git a/reportlab/pdfgen/pathobject.py b/reportlab/pdfgen/pathobject.py deleted file mode 100644 index 07b56e43..00000000 --- a/reportlab/pdfgen/pathobject.py +++ /dev/null @@ -1,127 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/pdfgen/pathobject.py -__version__=''' $Id$ ''' -__doc__=""" -PDFPathObject is an efficient way to draw paths on a Canvas. Do not -instantiate directly, obtain one from the Canvas instead. - -Progress Reports: -8.83, 2000-01-13, gmcm: created from pdfgen.py - -""" - -from reportlab.pdfgen import pdfgeom -from reportlab.lib.rl_accel import fp_str - - -class PDFPathObject: - """Represents a graphic path. There are certain 'modes' to PDF - drawing, and making a separate object to expose Path operations - ensures they are completed with no run-time overhead. Ask - the Canvas for a PDFPath with getNewPathObject(); moveto/lineto/ - curveto wherever you want; add whole shapes; and then add it back - into the canvas with one of the relevant operators. - - Path objects are probably not long, so we pack onto one line - - the code argument allows a canvas to get the operatiosn appended directly so - avoiding the final getCode - """ - def __init__(self,code=None): - self._code = (code,[])[code is None] - self._code_append = self._init_code_append - - def _init_code_append(self,c): - assert c.endswith(' m') or c.endswith(' re'), 'path must start with a moveto or rect' - code_append = self._code.append - code_append('n') - code_append(c) - self._code_append = code_append - - def getCode(self): - "pack onto one line; used internally" - return ' '.join(self._code) - - def moveTo(self, x, y): - self._code_append('%s m' % fp_str(x,y)) - - def lineTo(self, x, y): - self._code_append('%s l' % fp_str(x,y)) - - def curveTo(self, x1, y1, x2, y2, x3, y3): - self._code_append('%s c' % fp_str(x1, y1, x2, y2, x3, y3)) - - def arc(self, x1,y1, x2,y2, startAng=0, extent=90): - """Contributed to piddlePDF by Robert Kern, 28/7/99. - Draw a partial ellipse inscribed within the rectangle x1,y1,x2,y2, - starting at startAng degrees and covering extent degrees. Angles - start with 0 to the right (+x) and increase counter-clockwise. - These should have x1.""" - - self._curves(pdfgeom.bezierArc(x1,y1, x2,y2, startAng, extent)) - - def arcTo(self, x1,y1, x2,y2, startAng=0, extent=90): - """Like arc, but draws a line from the current point to - the start if the start is not the current point.""" - self._curves(pdfgeom.bezierArc(x1,y1, x2,y2, startAng, extent),'lineTo') - - def rect(self, x, y, width, height): - """Adds a rectangle to the path""" - self._code_append('%s re' % fp_str((x, y, width, height))) - - def ellipse(self, x, y, width, height): - """adds an ellipse to the path""" - self._curves(pdfgeom.bezierArc(x, y, x + width,y + height, 0, 360)) - - def _curves(self,curves,initial='moveTo'): - getattr(self,initial)(*curves[0][:2]) - for curve in curves: - self.curveTo(*curve[2:]) - - def circle(self, x_cen, y_cen, r): - """adds a circle to the path""" - x1 = x_cen - r - y1 = y_cen - r - width = height = 2*r - self.ellipse(x1, y1, width, height) - - def roundRect(self, x, y, width, height, radius): - """Draws a rectangle with rounded corners. The corners are - approximately quadrants of a circle, with the given radius.""" - #use a precomputed set of factors for the bezier approximation - #to a circle. There are six relevant points on the x axis and y axis. - #sketch them and it should all make sense! - t = 0.4472 * radius - - x0 = x - x1 = x0 + t - x2 = x0 + radius - x3 = x0 + width - radius - x4 = x0 + width - t - x5 = x0 + width - - y0 = y - y1 = y0 + t - y2 = y0 + radius - y3 = y0 + height - radius - y4 = y0 + height - t - y5 = y0 + height - - self.moveTo(x2, y0) - self.lineTo(x3, y0) #bottom row - self.curveTo(x4, y0, x5, y1, x5, y2) #bottom right - self.lineTo(x5, y3) #right edge - self.curveTo(x5, y4, x4, y5, x3, y5) #top right - self.lineTo(x2, y5) #top row - self.curveTo(x1, y5, x0, y4, x0, y3) #top left - self.lineTo(x0, y2) #left edge - self.curveTo(x0, y1, x1, y0, x2, y0) #bottom left - self.close() - - def close(self): - "draws a line back to where it started" - self._code_append('h') diff --git a/reportlab/pdfgen/pdfgeom.py b/reportlab/pdfgen/pdfgeom.py deleted file mode 100644 index 3d5c801c..00000000 --- a/reportlab/pdfgen/pdfgeom.py +++ /dev/null @@ -1,77 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/pdfgen/pdfgeom.py -__version__=''' $Id$ ''' -__doc__=""" -This module includes any mathematical methods needed for PIDDLE. -It should have no dependencies beyond the Python library. - -So far, just Robert Kern's bezierArc. -""" - -from math import sin, cos, pi, ceil - - -def bezierArc(x1,y1, x2,y2, startAng=0, extent=90): - """bezierArc(x1,y1, x2,y2, startAng=0, extent=90) --> List of Bezier -curve control points. - -(x1, y1) and (x2, y2) are the corners of the enclosing rectangle. The -coordinate system has coordinates that increase to the right and down. -Angles, measured in degress, start with 0 to the right (the positive X -axis) and increase counter-clockwise. The arc extends from startAng -to startAng+extent. I.e. startAng=0 and extent=180 yields an openside-down -semi-circle. - -The resulting coordinates are of the form (x1,y1, x2,y2, x3,y3, x4,y4) -such that the curve goes from (x1, y1) to (x4, y4) with (x2, y2) and -(x3, y3) as their respective Bezier control points.""" - - x1,y1, x2,y2 = min(x1,x2), max(y1,y2), max(x1,x2), min(y1,y2) - - if abs(extent) <= 90: - arcList = [startAng] - fragAngle = float(extent) - Nfrag = 1 - else: - arcList = [] - Nfrag = int(ceil(abs(extent)/90.)) - fragAngle = float(extent) / Nfrag - - x_cen = (x1+x2)/2. - y_cen = (y1+y2)/2. - rx = (x2-x1)/2. - ry = (y2-y1)/2. - halfAng = fragAngle * pi / 360. - kappa = abs(4. / 3. * (1. - cos(halfAng)) / sin(halfAng)) - - if fragAngle < 0: - sign = -1 - else: - sign = 1 - - pointList = [] - - for i in range(Nfrag): - theta0 = (startAng + i*fragAngle) * pi / 180. - theta1 = (startAng + (i+1)*fragAngle) *pi / 180. - if fragAngle > 0: - pointList.append((x_cen + rx * cos(theta0), - y_cen - ry * sin(theta0), - x_cen + rx * (cos(theta0) - kappa * sin(theta0)), - y_cen - ry * (sin(theta0) + kappa * cos(theta0)), - x_cen + rx * (cos(theta1) + kappa * sin(theta1)), - y_cen - ry * (sin(theta1) - kappa * cos(theta1)), - x_cen + rx * cos(theta1), - y_cen - ry * sin(theta1))) - else: - pointList.append((x_cen + rx * cos(theta0), - y_cen - ry * sin(theta0), - x_cen + rx * (cos(theta0) + kappa * sin(theta0)), - y_cen - ry * (sin(theta0) - kappa * cos(theta0)), - x_cen + rx * (cos(theta1) - kappa * sin(theta1)), - y_cen - ry * (sin(theta1) + kappa * cos(theta1)), - x_cen + rx * cos(theta1), - y_cen - ry * sin(theta1))) - - return pointList \ No newline at end of file diff --git a/reportlab/pdfgen/pdfimages.py b/reportlab/pdfgen/pdfimages.py deleted file mode 100644 index d5822dfb..00000000 --- a/reportlab/pdfgen/pdfimages.py +++ /dev/null @@ -1,217 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/pdfgen/pdfimages.py -__version__=''' $Id$ ''' -__doc__=""" -Image functionality sliced out of canvas.py for generalization -""" - -import os -import reportlab -from reportlab import rl_config -from reportlab.pdfbase import pdfutils -from reportlab.pdfbase import pdfdoc -from reportlab.lib.utils import import_zlib, haveImages, getBytesIO, isStr -from reportlab.lib.rl_accel import fp_str, asciiBase85Encode -from reportlab.lib.boxstuff import aspectRatioFix - - -class PDFImage: - """Wrapper around different "image sources". You can make images - from a PIL Image object, a filename (in which case it uses PIL), - an image we previously cached (optimisation, hardly used these - days) or a JPEG (which PDF supports natively).""" - - def __init__(self, image, x,y, width=None, height=None, caching=0): - self.image = image - self.x = x - self.y = y - self.width = width - self.height = height - self.filename = None - self.imageCaching = caching - # the following facts need to be determined, - # whatever the source. Declare what they are - # here for clarity. - self.colorSpace = 'DeviceRGB' - self.bitsPerComponent = 8 - self.filters = [] - self.source = None # JPEG or PIL, set later - self.getImageData() - - def jpg_imagedata(self): - #directly process JPEG files - #open file, needs some error handling!! - fp = open(self.image, 'rb') - try: - result = self._jpg_imagedata(fp) - finally: - fp.close() - return result - - def _jpg_imagedata(self,imageFile): - info = pdfutils.readJPEGInfo(imageFile) - self.source = 'JPEG' - imgwidth, imgheight = info[0], info[1] - if info[2] == 1: - colorSpace = 'DeviceGray' - elif info[2] == 3: - colorSpace = 'DeviceRGB' - else: #maybe should generate an error, is this right for CMYK? - colorSpace = 'DeviceCMYK' - imageFile.seek(0) #reset file pointer - imagedata = [] - #imagedata.append('BI /Width %d /Height /BitsPerComponent 8 /ColorSpace /%s /Filter [/Filter [ /ASCII85Decode /DCTDecode] ID' % (info[0], info[1], colorSpace)) - imagedata.append('BI /W %d /H %d /BPC 8 /CS /%s /F [%s/DCT] ID' % (imgwidth, imgheight, colorSpace, rl_config.useA85 and '/A85 ' or '')) - #write in blocks of (??) 60 characters per line to a list - data = imageFile.read() - if rl_config.useA85: - data = asciiBase85Encode(data) - pdfutils._chunker(data,imagedata) - imagedata.append('EI') - return (imagedata, imgwidth, imgheight) - - def cache_imagedata(self): - image = self.image - if not pdfutils.cachedImageExists(image): - zlib = import_zlib() - if not zlib: return - if not haveImages: return - pdfutils.cacheImageFile(image) - - #now we have one cached, slurp it in - cachedname = os.path.splitext(image)[0] + (rl_config.useA85 and '.a85' or '.bin') - imagedata = open(cachedname,'rb').readlines() - #trim off newlines... - imagedata = list(map(str.strip, imagedata)) - return imagedata - - def PIL_imagedata(self): - image = self.image - if image.format=='JPEG': - fp=image.fp - fp.seek(0) - return self._jpg_imagedata(fp) - self.source = 'PIL' - zlib = import_zlib() - if not zlib: return - - bpc = 8 - # Use the colorSpace in the image - if image.mode == 'CMYK': - myimage = image - colorSpace = 'DeviceCMYK' - bpp = 4 - elif image.mode == '1': - myimage = image - colorSpace = 'DeviceGray' - bpp = 1 - bpc = 1 - elif image.mode == 'L': - myimage = image - colorSpace = 'DeviceGray' - bpp = 1 - else: - myimage = image.convert('RGB') - colorSpace = 'RGB' - bpp = 3 - imgwidth, imgheight = myimage.size - - # this describes what is in the image itself - # *NB* according to the spec you can only use the short form in inline images - imagedata=['BI /W %d /H %d /BPC %d /CS /%s /F [%s/Fl] ID' % (imgwidth, imgheight, bpc, colorSpace, rl_config.useA85 and '/A85 ' or '')] - - #use a flate filter and, optionally, Ascii Base 85 to compress - raw = (myimage.tobytes if hasattr(myimage,'tobytes') else myimage.tostring)() - rowstride = (imgwidth*bpc*bpp+7)>>3 - assert len(raw) == rowstride*imgheight, "Wrong amount of data for image" - data = zlib.compress(raw) #this bit is very fast... - if rl_config.useA85: - data = asciiBase85Encode(data) #...sadly this may not be - #append in blocks of 60 characters - pdfutils._chunker(data,imagedata) - imagedata.append('EI') - return (imagedata, imgwidth, imgheight) - - def non_jpg_imagedata(self,image): - if not self.imageCaching: - imagedata = pdfutils.cacheImageFile(image,returnInMemory=1) - else: - imagedata = self.cache_imagedata() - words = imagedata[1].split() - imgwidth = int(words[1]) - imgheight = int(words[3]) - return imagedata, imgwidth, imgheight - - def getImageData(self,preserveAspectRatio=False): - "Gets data, height, width - whatever type of image" - image = self.image - - if isStr(image): - self.filename = image - if os.path.splitext(image)[1] in ['.jpg', '.JPG', '.jpeg', '.JPEG']: - try: - imagedata, imgwidth, imgheight = self.jpg_imagedata() - except: - imagedata, imgwidth, imgheight = self.non_jpg_imagedata(image) #try for normal kind of image - else: - imagedata, imgwidth, imgheight = self.non_jpg_imagedata(image) - else: - import sys - if sys.platform[0:4] == 'java': - #jython, PIL not available - imagedata, imgwidth, imgheight = self.JAVA_imagedata() - else: - imagedata, imgwidth, imgheight = self.PIL_imagedata() - self.imageData = imagedata - self.imgwidth = imgwidth - self.imgheight = imgheight - self.width = self.width or imgwidth - self.height = self.height or imgheight - - def drawInlineImage(self, canvas, preserveAspectRatio=False,anchor='sw'): - """Draw an Image into the specified rectangle. If width and - height are omitted, they are calculated from the image size. - Also allow file names as well as images. This allows a - caching mechanism""" - width = self.width - height = self.height - if width<1e-6 or height<1e-6: return False - x,y,self.width,self.height, scaled = aspectRatioFix(preserveAspectRatio,anchor,self.x,self.y,width,height,self.imgwidth,self.imgheight) - # this says where and how big to draw it - if not canvas.bottomup: y = y+height - canvas._code.append('q %s 0 0 %s cm' % (fp_str(self.width), fp_str(self.height, x, y))) - # self._code.extend(imagedata) if >=python-1.5.2 - for line in self.imageData: - canvas._code.append(line) - canvas._code.append('Q') - return True - - def format(self, document): - """Allow it to be used within pdfdoc framework. This only - defines how it is stored, not how it is drawn later.""" - - dict = pdfdoc.PDFDictionary() - dict['Type'] = '/XObject' - dict['Subtype'] = '/Image' - dict['Width'] = self.width - dict['Height'] = self.height - dict['BitsPerComponent'] = 8 - dict['ColorSpace'] = pdfdoc.PDFName(self.colorSpace) - content = '\n'.join(self.imageData[3:-1]) + '\n' - strm = pdfdoc.PDFStream(dictionary=dict, content=content) - return strm.format(document) - -if __name__=='__main__': - srcfile = os.path.join( - os.path.dirname(reportlab.__file__), - 'test', - 'pythonpowered.gif' - ) - assert os.path.isfile(srcfile), 'image not found' - pdfdoc.LongFormat = 1 - img = PDFImage(srcfile, 100, 100) - import pprint - doc = pdfdoc.PDFDocument() - print('source=',img.source) - print(img.format(doc)) diff --git a/reportlab/pdfgen/textobject.py b/reportlab/pdfgen/textobject.py deleted file mode 100644 index ce6c2483..00000000 --- a/reportlab/pdfgen/textobject.py +++ /dev/null @@ -1,465 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/pdfgen/textobject.py -__version__=''' $Id$ ''' -__doc__=""" -PDFTextObject is an efficient way to add text to a Canvas. Do not -instantiate directly, obtain one from the Canvas instead. - -Progress Reports: -8.83, 2000-01-13, gmcm: created from pdfgen.py -""" -import string -from types import * -from reportlab.lib.colors import Color, CMYKColor, CMYKColorSep, toColor, black, white, _CMYK_black, _CMYK_white -from reportlab.lib.utils import isBytes, isStr, asUnicode -from reportlab.lib.rl_accel import fp_str -from reportlab.pdfbase import pdfmetrics -from reportlab.rl_config import rtlSupport - -log2vis = None -if rtlSupport: - try: - from pyfribidi2 import log2vis, ON as DIR_ON, LTR as DIR_LTR, RTL as DIR_RTL - directionsMap = dict(LTR=DIR_LTR,RTL=DIR_RTL) - except: - import warnings - warnings.warn('pyfribidi is not installed - RTL not supported') - -class _PDFColorSetter: - '''Abstracts the color setting operations; used in Canvas and Textobject - asseumes we have a _code object''' - def _checkSeparation(self,cmyk): - if isinstance(cmyk,CMYKColorSep): - name,sname = self._doc.addColor(cmyk) - if name not in self._colorsUsed: - self._colorsUsed[name] = sname - return name - - #if this is set to a callable(color) --> color it can be used to check color setting - #see eg _enforceCMYK/_enforceRGB - _enforceColorSpace = None - - def setFillColorCMYK(self, c, m, y, k, alpha=None): - """set the fill color useing negative color values - (cyan, magenta, yellow and darkness value). - Takes 4 arguments between 0.0 and 1.0""" - self.setFillColor((c,m,y,k),alpha=alpha) - - def setStrokeColorCMYK(self, c, m, y, k, alpha=None): - """set the stroke color useing negative color values - (cyan, magenta, yellow and darkness value). - Takes 4 arguments between 0.0 and 1.0""" - self.setStrokeColor((c,m,y,k),alpha=alpha) - - def setFillColorRGB(self, r, g, b, alpha=None): - """Set the fill color using positive color description - (Red,Green,Blue). Takes 3 arguments between 0.0 and 1.0""" - self.setFillColor((r,g,b),alpha=alpha) - - def setStrokeColorRGB(self, r, g, b, alpha=None): - """Set the stroke color using positive color description - (Red,Green,Blue). Takes 3 arguments between 0.0 and 1.0""" - self.setStrokeColor((r,g,b),alpha=alpha) - - def setFillColor(self, aColor, alpha=None): - """Takes a color object, allowing colors to be referred to by name""" - if self._enforceColorSpace: - aColor = self._enforceColorSpace(aColor) - if isinstance(aColor, CMYKColor): - d = aColor.density - c,m,y,k = (d*aColor.cyan, d*aColor.magenta, d*aColor.yellow, d*aColor.black) - self._fillColorObj = aColor - name = self._checkSeparation(aColor) - if name: - self._code.append('/%s cs %s scn' % (name,fp_str(d))) - else: - self._code.append('%s k' % fp_str(c, m, y, k)) - elif isinstance(aColor, Color): - rgb = (aColor.red, aColor.green, aColor.blue) - self._fillColorObj = aColor - self._code.append('%s rg' % fp_str(rgb) ) - elif isinstance(aColor,(tuple,list)): - l = len(aColor) - if l==3: - self._fillColorObj = aColor - self._code.append('%s rg' % fp_str(aColor) ) - elif l==4: - self._fillColorObj = aColor - self._code.append('%s k' % fp_str(aColor)) - else: - raise ValueError('Unknown color %r' % aColor) - elif isStr(aColor): - self.setFillColor(toColor(aColor)) - else: - raise ValueError('Unknown color %r' % aColor) - if alpha is not None: - self.setFillAlpha(alpha) - elif getattr(aColor, 'alpha', None) is not None: - self.setFillAlpha(aColor.alpha) - - def setStrokeColor(self, aColor, alpha=None): - """Takes a color object, allowing colors to be referred to by name""" - if self._enforceColorSpace: - aColor = self._enforceColorSpace(aColor) - if isinstance(aColor, CMYKColor): - d = aColor.density - c,m,y,k = (d*aColor.cyan, d*aColor.magenta, d*aColor.yellow, d*aColor.black) - self._strokeColorObj = aColor - name = self._checkSeparation(aColor) - if name: - self._code.append('/%s CS %s SCN' % (name,fp_str(d))) - else: - self._code.append('%s K' % fp_str(c, m, y, k)) - elif isinstance(aColor, Color): - rgb = (aColor.red, aColor.green, aColor.blue) - self._strokeColorObj = aColor - self._code.append('%s RG' % fp_str(rgb) ) - elif isinstance(aColor,(tuple,list)): - l = len(aColor) - if l==3: - self._strokeColorObj = aColor - self._code.append('%s RG' % fp_str(aColor) ) - elif l==4: - self._strokeColorObj = aColor - self._code.append('%s K' % fp_str(aColor)) - else: - raise ValueError('Unknown color %r' % aColor) - elif isStr(aColor): - self.setStrokeColor(toColor(aColor)) - else: - raise ValueError('Unknown color %r' % aColor) - if alpha is not None: - self.setStrokeAlpha(alpha) - elif getattr(aColor, 'alpha', None) is not None: - self.setStrokeAlpha(aColor.alpha) - - def setFillGray(self, gray, alpha=None): - """Sets the gray level; 0.0=black, 1.0=white""" - self._fillColorObj = (gray, gray, gray) - self._code.append('%s g' % fp_str(gray)) - if alpha is not None: - self.setFillAlpha(alpha) - - def setStrokeGray(self, gray, alpha=None): - """Sets the gray level; 0.0=black, 1.0=white""" - self._strokeColorObj = (gray, gray, gray) - self._code.append('%s G' % fp_str(gray)) - if alpha is not None: - self.setFillAlpha(alpha) - - def setStrokeAlpha(self,a): - if not (isinstance(a,(float,int)) and 0<=a<=1): - raise ValueError('setStrokeAlpha invalid value %r' % a) - getattr(self,'_setStrokeAlpha',lambda x: None)(a) - - def setFillAlpha(self,a): - if not (isinstance(a,(float,int)) and 0<=a<=1): - raise ValueError('setFillAlpha invalid value %r' % a) - getattr(self,'_setFillAlpha',lambda x: None)(a) - - def setStrokeOverprint(self,a): - getattr(self,'_setStrokeOverprint',lambda x: None)(a) - - def setFillOverprint(self,a): - getattr(self,'_setFillOverprint',lambda x: None)(a) - - def setOverprintMask(self,a): - getattr(self,'_setOverprintMask',lambda x: None)(a) - -class PDFTextObject(_PDFColorSetter): - """PDF logically separates text and graphics drawing; text - operations need to be bracketed between BT (Begin text) and - ET operators. This class ensures text operations are - properly encapusalted. Ask the canvas for a text object - with beginText(x, y). Do not construct one directly. - Do not use multiple text objects in parallel; PDF is - not multi-threaded! - - It keeps track of x and y coordinates relative to its origin.""" - - def __init__(self, canvas, x=0,y=0, direction=None): - self._code = ['BT'] #no point in [] then append RGB - self._canvas = canvas #canvas sets this so it has access to size info - self._fontname = self._canvas._fontname - self._fontsize = self._canvas._fontsize - self._leading = self._canvas._leading - self._doc = self._canvas._doc - self._colorsUsed = self._canvas._colorsUsed - self._enforceColorSpace = getattr(canvas,'_enforceColorSpace',None) - font = pdfmetrics.getFont(self._fontname) - self._curSubset = -1 - self.direction = direction - self.setTextOrigin(x, y) - self._textRenderMode = 0 - self._clipping = 0 - - def getCode(self): - "pack onto one line; used internally" - self._code.append('ET') - if self._clipping: - self._code.append('%d Tr' % (self._textRenderMode^4)) - return ' '.join(self._code) - - def setTextOrigin(self, x, y): - if self._canvas.bottomup: - self._code.append('1 0 0 1 %s Tm' % fp_str(x, y)) #bottom up - else: - self._code.append('1 0 0 -1 %s Tm' % fp_str(x, y)) #top down - - # The current cursor position is at the text origin - self._x0 = self._x = x - self._y0 = self._y = y - - def setTextTransform(self, a, b, c, d, e, f): - "Like setTextOrigin, but does rotation, scaling etc." - if not self._canvas.bottomup: - c = -c #reverse bottom row of the 2D Transform - d = -d - self._code.append('%s Tm' % fp_str(a, b, c, d, e, f)) - - # The current cursor position is at the text origin Note that - # we aren't keeping track of all the transform on these - # coordinates: they are relative to the rotations/sheers - # defined in the matrix. - self._x0 = self._x = e - self._y0 = self._y = f - - def moveCursor(self, dx, dy): - """Starts a new line at an offset dx,dy from the start of the - current line. This does not move the cursor relative to the - current position, and it changes the current offset of every - future line drawn (i.e. if you next do a textLine() call, it - will move the cursor to a position one line lower than the - position specificied in this call. """ - - # Check if we have a previous move cursor call, and combine - # them if possible. - if self._code and self._code[-1][-3:]==' Td': - L = self._code[-1].split() - if len(L)==3: - del self._code[-1] - else: - self._code[-1] = ''.join(L[:-4]) - - # Work out the last movement - lastDx = float(L[-3]) - lastDy = float(L[-2]) - - # Combine the two movement - dx += lastDx - dy -= lastDy - - # We will soon add the movement to the line origin, so if - # we've already done this for lastDx, lastDy, remove it - # first (so it will be right when added back again). - self._x0 -= lastDx - self._y0 -= lastDy - - # Output the move text cursor call. - self._code.append('%s Td' % fp_str(dx, -dy)) - - # Keep track of the new line offsets and the cursor position - self._x0 += dx - self._y0 += dy - self._x = self._x0 - self._y = self._y0 - - def setXPos(self, dx): - """Starts a new line dx away from the start of the - current line - NOT from the current point! So if - you call it in mid-sentence, watch out.""" - self.moveCursor(dx,0) - - def getCursor(self): - """Returns current text position relative to the last origin.""" - return (self._x, self._y) - - def getStartOfLine(self): - """Returns a tuple giving the text position of the start of the - current line.""" - return (self._x0, self._y0) - - def getX(self): - """Returns current x position relative to the last origin.""" - return self._x - - def getY(self): - """Returns current y position relative to the last origin.""" - return self._y - - def _setFont(self, psfontname, size): - """Sets the font and fontSize - Raises a readable exception if an illegal font - is supplied. Font names are case-sensitive! Keeps track - of font anme and size for metrics.""" - self._fontname = psfontname - self._fontsize = size - font = pdfmetrics.getFont(self._fontname) - - if font._dynamicFont: - self._curSubset = -1 - else: - pdffontname = self._canvas._doc.getInternalFontName(psfontname) - self._code.append('%s %s Tf' % (pdffontname, fp_str(size))) - - def setFont(self, psfontname, size, leading = None): - """Sets the font. If leading not specified, defaults to 1.2 x - font size. Raises a readable exception if an illegal font - is supplied. Font names are case-sensitive! Keeps track - of font anme and size for metrics.""" - self._fontname = psfontname - self._fontsize = size - if leading is None: - leading = size * 1.2 - self._leading = leading - font = pdfmetrics.getFont(self._fontname) - if font._dynamicFont: - self._curSubset = -1 - else: - pdffontname = self._canvas._doc.getInternalFontName(psfontname) - self._code.append('%s %s Tf %s TL' % (pdffontname, fp_str(size), fp_str(leading))) - - def setCharSpace(self, charSpace): - """Adjusts inter-character spacing""" - self._charSpace = charSpace - self._code.append('%s Tc' % fp_str(charSpace)) - - def setWordSpace(self, wordSpace): - """Adjust inter-word spacing. This can be used - to flush-justify text - you get the width of the - words, and add some space between them.""" - self._wordSpace = wordSpace - self._code.append('%s Tw' % fp_str(wordSpace)) - - def setHorizScale(self, horizScale): - "Stretches text out horizontally" - self._horizScale = 100 + horizScale - self._code.append('%s Tz' % fp_str(horizScale)) - - def setLeading(self, leading): - "How far to move down at the end of a line." - self._leading = leading - self._code.append('%s TL' % fp_str(leading)) - - def setTextRenderMode(self, mode): - """Set the text rendering mode. - - 0 = Fill text - 1 = Stroke text - 2 = Fill then stroke - 3 = Invisible - 4 = Fill text and add to clipping path - 5 = Stroke text and add to clipping path - 6 = Fill then stroke and add to clipping path - 7 = Add to clipping path - - after we start clipping we mustn't change the mode back until after the ET - """ - - assert mode in (0,1,2,3,4,5,6,7), "mode must be in (0,1,2,3,4,5,6,7)" - if (mode & 4)!=self._clipping: - mode |= 4 - self._clipping = mode & 4 - if self._textRenderMode!=mode: - self._textRenderMode = mode - self._code.append('%d Tr' % mode) - - def setRise(self, rise): - "Move text baseline up or down to allow superscript/subscripts" - self._rise = rise - self._y = self._y - rise # + ? _textLineMatrix? - self._code.append('%s Ts' % fp_str(rise)) - - def _formatText(self, text): - "Generates PDF text output operator(s)" - if log2vis and self.direction in ('LTR','RTL'): - # Use pyfribidi to write the text in the correct visual order. - text = log2vis(text, directionsMap.get(self.direction.upper(),DIR_ON)) - canv = self._canvas - font = pdfmetrics.getFont(self._fontname) - R = [] - if font._dynamicFont: - #it's a truetype font and should be utf8. If an error is raised, - for subset, t in font.splitString(text, canv._doc): - if subset!=self._curSubset: - pdffontname = font.getSubsetInternalName(subset, canv._doc) - R.append("%s %s Tf %s TL" % (pdffontname, fp_str(self._fontsize), fp_str(self._leading))) - self._curSubset = subset - R.append("(%s) Tj" % canv._escape(t)) - elif font._multiByte: - #all the fonts should really work like this - let them know more about PDF... - R.append("%s %s Tf %s TL" % ( - canv._doc.getInternalFontName(font.fontName), - fp_str(self._fontsize), - fp_str(self._leading) - )) - R.append("(%s) Tj" % font.formatForPdf(text)) - else: - #convert to T1 coding - fc = font - if isBytes(text): - try: - text = text.decode('utf8') - except UnicodeDecodeError as e: - i,j = e.args[2:4] - raise UnicodeDecodeError(*(e.args[:4]+('%s\n%s-->%s<--%s' % (e.args[4],text[max(i-10,0):i],text[i:j],text[j:j+10]),))) - - for f, t in pdfmetrics.unicode2T1(text,[font]+font.substitutionFonts): - if f!=fc: - R.append("%s %s Tf %s TL" % (canv._doc.getInternalFontName(f.fontName), fp_str(self._fontsize), fp_str(self._leading))) - fc = f - R.append("(%s) Tj" % canv._escape(t)) - if font!=fc: - R.append("%s %s Tf %s TL" % (canv._doc.getInternalFontName(self._fontname), fp_str(self._fontsize), fp_str(self._leading))) - return ' '.join(R) - - def _textOut(self, text, TStar=0): - "prints string at current point, ignores text cursor" - self._code.append('%s%s' % (self._formatText(text), (TStar and ' T*' or ''))) - - def textOut(self, text): - """prints string at current point, text cursor moves across.""" - self._x = self._x + self._canvas.stringWidth(text, self._fontname, self._fontsize) - self._code.append(self._formatText(text)) - - def textLine(self, text=''): - """prints string at current point, text cursor moves down. - Can work with no argument to simply move the cursor down.""" - # Update the coordinates of the cursor - self._x = self._x0 - if self._canvas.bottomup: - self._y = self._y - self._leading - else: - self._y = self._y + self._leading - - # Update the location of the start of the line - # self._x0 is unchanged - self._y0 = self._y - - # Output the text followed by a PDF newline command - self._code.append('%s T*' % self._formatText(text)) - - def textLines(self, stuff, trim=1): - """prints multi-line or newlined strings, moving down. One - comon use is to quote a multi-line block in your Python code; - since this may be indented, by default it trims whitespace - off each line and from the beginning; set trim=0 to preserve - whitespace.""" - if isStr(stuff): - lines = asUnicode(stuff).strip().split(u'\n') - if trim==1: - lines = [s.strip() for s in lines] - elif isinstance(stuff,(tuple,list)): - lines = stuff - else: - assert 1==0, "argument to textlines must be string,, list or tuple" - - # Output each line one at a time. This used to be a long-hand - # copy of the textLine code, now called as a method. - for line in lines: - self.textLine(line) - - def __nonzero__(self): - 'PDFTextObject is true if it has something done after the init' - return self._code != ['BT'] diff --git a/reportlab/platypus/__init__.py b/reportlab/platypus/__init__.py deleted file mode 100644 index ec6071aa..00000000 --- a/reportlab/platypus/__init__.py +++ /dev/null @@ -1,17 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/platypus/__init__.py -__version__=''' $Id$ ''' -__doc__='''Page Layout and Typography Using Scripts" - higher-level framework for flowing documents''' - -from reportlab.platypus.flowables import Flowable, Image, Macro, PageBreak, Preformatted, Spacer, XBox, \ - CondPageBreak, KeepTogether, TraceInfo, FailOnWrap, FailOnDraw, PTOContainer, \ - KeepInFrame, ParagraphAndImage, ImageAndFlowables, ListFlowable, ListItem, FrameBG, \ - PageBreakIfNotEmpty -from reportlab.platypus.paragraph import Paragraph, cleanBlockQuotedText, ParaLines -from reportlab.platypus.paraparser import ParaFrag -from reportlab.platypus.tables import Table, TableStyle, CellStyle, LongTable -from reportlab.platypus.frames import Frame -from reportlab.platypus.doctemplate import BaseDocTemplate, NextPageTemplate, PageTemplate, ActionFlowable, \ - SimpleDocTemplate, FrameBreak, PageBegin, Indenter, NotAtTopPageBreak -from reportlab.platypus.xpreformatted import XPreformatted diff --git a/reportlab/platypus/doctemplate.py b/reportlab/platypus/doctemplate.py deleted file mode 100644 index d9f32405..00000000 --- a/reportlab/platypus/doctemplate.py +++ /dev/null @@ -1,1250 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/platypus/doctemplate.py - -__version__=''' $Id$ ''' - -__doc__=""" -This module contains the core structure of platypus. - -rlatypus constructs documents. Document styles are determined by DocumentTemplates. - -Each DocumentTemplate contains one or more PageTemplates which defines the look of the -pages of the document. - -Each PageTemplate has a procedure for drawing the "non-flowing" part of the page -(for example the header, footer, page number, fixed logo graphic, watermark, etcetera) and -a set of Frames which enclose the flowing part of the page (for example the paragraphs, -tables, or non-fixed diagrams of the text). - -A document is built when a DocumentTemplate is fed a sequence of Flowables. -The action of the build consumes the flowables in order and places them onto -frames on pages as space allows. When a frame runs out of space the next frame -of the page is used. If no frame remains a new page is created. A new page -can also be created if a page break is forced. - -The special invisible flowable NextPageTemplate can be used to specify -the page template for the next page (which by default is the one being used -for the current frame). -""" - -from reportlab.platypus.flowables import * -from reportlab.lib.units import inch -from reportlab.platypus.paragraph import Paragraph -from reportlab.platypus.frames import Frame -from reportlab.rl_config import defaultPageSize, verbose -import reportlab.lib.sequencer -from reportlab.pdfgen import canvas -from reportlab.lib.utils import isSeq, encode_label, decode_label, annotateException, strTypes -try: - set -except NameError: - from sets import Set as set - -import sys -import logging -logger = logging.getLogger("reportlab.platypus") - -class LayoutError(Exception): - pass - -def _fSizeString(f): - #used to get size during error messages - w=getattr(f,'width',None) - if w is None: - w=getattr(f,'_width',None) - - h=getattr(f,'height',None) - if h is None: - h=getattr(f,'_height',None) - #tables in particular may have some nasty large culprit - if hasattr(f, '_culprit'): - c = ', %s, ' % f._culprit() - else: - c = '' - if w is not None or h is not None: - if w is None: w='???' - if h is None: h='???' - return '(%s x %s)%s' % (w,h,c) - return '' - -def _doNothing(canvas, doc): - "Dummy callback for onPage" - pass - -class PTCycle(list): - def __new__(cls,*args,**kwds): - self = list.__new__(cls,*args,**kwds) - self._restart = 0 - self._idx = 0 - return self - - @property - def next_value(self): - v = self[self._idx] - self._idx += 1 - if self._idx>=len(self): - self._idx = self._restart - return v - - @property - def peek(self): - return self[self._idx] - -class IndexingFlowable(Flowable): - """Abstract interface definition for flowables which might - hold references to other pages or themselves be targets - of cross-references. XRefStart, XRefDest, Table of Contents, - Indexes etc.""" - def isIndexing(self): - return 1 - - def isSatisfied(self): - return 1 - - def notify(self, kind, stuff): - """This will be called by the framework wherever 'stuff' happens. - 'kind' will be a value that can be used to decide whether to - pay attention or not.""" - pass - - def beforeBuild(self): - """Called by multiBuild before it starts; use this to clear - old contents""" - pass - - def afterBuild(self): - """Called after build ends but before isSatisfied""" - pass - -class ActionFlowable(Flowable): - '''This Flowable is never drawn, it can be used for data driven controls - For example to change a page template (from one column to two, for example) - use NextPageTemplate which creates an ActionFlowable. - ''' - def __init__(self,action=()): - #must call super init to ensure it has a width and height (of zero), - #as in some cases the packer might get called on it... - Flowable.__init__(self) - if not isSeq(action): - action = (action,) - self.action = tuple(action) - - def apply(self,doc): - ''' - This is called by the doc.build processing to allow the instance to - implement its behaviour - ''' - action = self.action[0] - args = tuple(self.action[1:]) - arn = 'handle_'+action - if arn=="handle_nextPageTemplate" and args[0]=='main': - pass - try: - getattr(doc,arn)(*args) - except AttributeError as aerr: - if aerr.args[0]==arn: - raise NotImplementedError("Can't handle ActionFlowable(%s)" % action) - else: - raise - except: - annotateException("\nhandle_%s args=%s"%(action,ascii(args))) - - def __call__(self): - return self - - def identity(self, maxLen=None): - return "ActionFlowable: %s%s" % (str(self.action),self._frameName()) - -class LCActionFlowable(ActionFlowable): - locChanger = 1 #we cause a frame or page change - - def wrap(self, availWidth, availHeight): - '''Should never be called.''' - raise NotImplementedError - - def draw(self): - '''Should never be called.''' - raise NotImplementedError - -class NextFrameFlowable(ActionFlowable): - def __init__(self,ix,resume=0): - ActionFlowable.__init__(self,('nextFrame',ix,resume)) - -class CurrentFrameFlowable(LCActionFlowable): - def __init__(self,ix,resume=0): - ActionFlowable.__init__(self,('currentFrame',ix,resume)) - -class NullActionFlowable(ActionFlowable): - def apply(self,doc): - pass - -class _FrameBreak(LCActionFlowable): - ''' - A special ActionFlowable that allows setting doc._nextFrameIndex - - eg story.append(FrameBreak('mySpecialFrame')) - ''' - def __call__(self,ix=None,resume=0): - r = self.__class__(self.action+(resume,)) - r._ix = ix - return r - - def apply(self,doc): - if getattr(self,'_ix',None): - doc.handle_nextFrame(self._ix) - ActionFlowable.apply(self,doc) - -FrameBreak = _FrameBreak('frameEnd') -PageBegin = LCActionFlowable('pageBegin') - -def _evalMeasurement(n): - if isinstance(n,str): - from reportlab.platypus.paraparser import _num - n = _num(n) - if isSeq(n): n = n[1] - return n - -class FrameActionFlowable(Flowable): - _fixedWidth = _fixedHeight = 1 - def __init__(self,*arg,**kw): - raise NotImplementedError('Abstract Class') - - def frameAction(self,frame): - raise NotImplementedError('Abstract Class') - -class Indenter(FrameActionFlowable): - """Increases or decreases left and right margins of frame. - - This allows one to have a 'context-sensitive' indentation - and makes nested lists way easier. - """ - _ZEROSIZE=True - width=0 - height=0 - def __init__(self, left=0, right=0): - self.left = _evalMeasurement(left) - self.right = _evalMeasurement(right) - - def frameAction(self, frame): - frame._leftExtraIndent += self.left - frame._rightExtraIndent += self.right - -class NotAtTopPageBreak(FrameActionFlowable): - def __init__(self,nextTemplate=None): - self.nextTemplate = nextTemplate - - def frameAction(self,frame): - if not frame._atTop: - frame.add_generated_content(PageBreak(nextTemplate=self.nextTemplate)) - -class NextPageTemplate(ActionFlowable): - """When you get to the next page, use the template specified (change to two column, for example) """ - def __init__(self,pt): - ActionFlowable.__init__(self,('nextPageTemplate',pt)) - -class PageTemplate: - """ - essentially a list of Frames and an onPage routine to call at the start - of a page when this is selected. onPageEnd gets called at the end. - derived classes can also implement beforeDrawPage and afterDrawPage if they want - """ - def __init__(self,id=None,frames=[],onPage=_doNothing, onPageEnd=_doNothing, - pagesize=None, autoNextPageTemplate=None): - frames = frames or [] - if not isSeq(frames): frames = [frames] - assert [x for x in frames if not isinstance(x,Frame)]==[], "frames argument error" - self.id = id - self.frames = frames - self.onPage = onPage - self.onPageEnd = onPageEnd - self.pagesize = pagesize - self.autoNextPageTemplate = autoNextPageTemplate - - def beforeDrawPage(self,canv,doc): - """Override this if you want additional functionality or prefer - a class based page routine. Called before any flowables for - this page are processed.""" - pass - - def checkPageSize(self,canv,doc): - """This gets called by the template framework - If canv size != template size then the canv size is set to - the template size or if that's not available to the - doc size. - """ - #### NEVER EVER EVER COMPARE FLOATS FOR EQUALITY - #RGB converting pagesizes to ints means we are accurate to one point - #RGB I suggest we should be aiming a little better - cp = None - dp = None - sp = None - if canv._pagesize: cp = list(map(int, canv._pagesize)) - if self.pagesize: sp = list(map(int, self.pagesize)) - if doc.pagesize: dp = list(map(int, doc.pagesize)) - if cp!=sp: - if sp: - canv.setPageSize(self.pagesize) - elif cp!=dp: - canv.setPageSize(doc.pagesize) - - def afterDrawPage(self, canv, doc): - """This is called after the last flowable for the page has - been processed. You might use this if the page header or - footer needed knowledge of what flowables were drawn on - this page.""" - pass - -def _addGeneratedContent(flowables,frame): - S = getattr(frame,'_generated_content',None) - if S: - flowables[0:0] = S - del frame._generated_content - - -class onDrawStr(str): - def __new__(cls,value,onDraw,label,kind=None): - self = str.__new__(cls,value) - self.onDraw = onDraw - self.kind = kind - self.label = label - return self - -class PageAccumulator: - '''gadget to accumulate information in a page - and then allow it to be interrogated at the end - of the page''' - _count = 0 - def __init__(self,name=None): - if name is None: - name = self.__class__.__name__+str(self.__class__._count) - self.__class__._count += 1 - self.name = name - self.data = [] - - def reset(self): - self.data[:] = [] - - def add(self,*args): - self.data.append(args) - - def onDrawText(self,*args): - return '' % (self.name,encode_label(args)) - - def __call__(self,canv,kind,label): - self.add(*decode_label(label)) - - def attachToPageTemplate(self,pt): - if pt.onPage: - def onPage(canv,doc,oop=pt.onPage): - self.onPage(canv,doc) - oop(canv,doc) - else: - def onPage(canv,doc): - self.onPage(canv,doc) - pt.onPage = onPage - if pt.onPageEnd: - def onPageEnd(canv,doc,oop=pt.onPageEnd): - self.onPageEnd(canv,doc) - oop(canv,doc) - else: - def onPageEnd(canv,doc): - self.onPageEnd(canv,doc) - pt.onPageEnd = onPageEnd - - def onPage(self,canv,doc): - '''this will be called at the start of the page''' - setattr(canv,self.name,self) #push ourselves onto the canvas - self.reset() - - def onPageEnd(self,canv,doc): - '''this will be called at the end of a page''' - self.pageEndAction(canv,doc) - try: - delattr(canv,self.name) - except: - pass - self.reset() - - def pageEndAction(self,canv,doc): - '''this should be overridden to do something useful''' - pass - - def onDrawStr(self,value,*args): - return onDrawStr(value,self,encode_label(args)) - -class BaseDocTemplate: - """ - First attempt at defining a document template class. - - The basic idea is simple. - - 1) The document has a list of data associated with it - this data should derive from flowables. We'll have - special classes like PageBreak, FrameBreak to do things - like forcing a page end etc. - - 2) The document has one or more page templates. - - 3) Each page template has one or more frames. - - 4) The document class provides base methods for handling the - story events and some reasonable methods for getting the - story flowables into the frames. - - 5) The document instances can override the base handler routines. - - Most of the methods for this class are not called directly by the user, - but in some advanced usages they may need to be overridden via subclassing. - - EXCEPTION: doctemplate.build(...) must be called for most reasonable uses - since it builds a document using the page template. - - Each document template builds exactly one document into a file specified - by the filename argument on initialization. - - Possible keyword arguments for the initialization: - - - pageTemplates: A list of templates. Must be nonempty. Names - assigned to the templates are used for referring to them so no two used - templates should have the same name. For example you might want one template - for a title page, one for a section first page, one for a first page of - a chapter and two more for the interior of a chapter on odd and even pages. - If this argument is omitted then at least one pageTemplate should be provided - using the addPageTemplates method before the document is built. - - pageSize: a 2-tuple or a size constant from reportlab/lib/pagesizes.pu. - Used by the SimpleDocTemplate subclass which does NOT accept a list of - pageTemplates but makes one for you; ignored when using pageTemplates. - - - showBoundary: if set draw a box around the frame boundaries. - - leftMargin: - - rightMargin: - - topMargin: - - bottomMargin: Margin sizes in points (default 1 inch). These margins may be - overridden by the pageTemplates. They are primarily of interest for the - SimpleDocumentTemplate subclass. - - - allowSplitting: If set flowables (eg, paragraphs) may be split across frames or pages - (default: 1) - - title: Internal title for document (does not automatically display on any page) - - author: Internal author for document (does not automatically display on any page) - """ - _initArgs = { 'pagesize':defaultPageSize, - 'pageTemplates':[], - 'showBoundary':0, - 'leftMargin':inch, - 'rightMargin':inch, - 'topMargin':inch, - 'bottomMargin':inch, - 'allowSplitting':1, - 'title':None, - 'author':None, - 'subject':None, - 'creator':None, - 'keywords':[], - 'invariant':None, - 'pageCompression':None, - '_pageBreakQuick':1, - 'rotation':0, - '_debug':0, - 'encrypt': None, - 'cropMarks': None, - 'enforceColorSpace': None, - } - _invalidInitArgs = () - _firstPageTemplateIndex = 0 - - def __init__(self, filename, **kw): - """create a document template bound to a filename (see class documentation for keyword arguments)""" - self.filename = filename - self._nameSpace = dict(doc=self) - self._lifetimes = {} - - for k in self._initArgs.keys(): - if k not in kw: - v = self._initArgs[k] - else: - if k in self._invalidInitArgs: - raise ValueError("Invalid argument %s" % k) - v = kw[k] - setattr(self,k,v) - - p = self.pageTemplates - self.pageTemplates = [] - self.addPageTemplates(p) - - # facility to assist multi-build and cross-referencing. - # various hooks can put things into here - key is what - # you want, value is a page number. This can then be - # passed to indexing flowables. - self._pageRefs = {} - self._indexingFlowables = [] - - #callback facility for progress monitoring - self._onPage = None - self._onProgress = None - self._flowableCount = 0 # so we know how far to go - - #infinite loop detection if we start doing lots of empty pages - self._curPageFlowableCount = 0 - self._emptyPages = 0 - self._emptyPagesAllowed = 10 - - #context sensitive margins - set by story, not from outside - self._leftExtraIndent = 0.0 - self._rightExtraIndent = 0.0 - self._frameBGs = [] - - self._calc() - self.afterInit() - - def _calc(self): - self._rightMargin = self.pagesize[0] - self.rightMargin - self._topMargin = self.pagesize[1] - self.topMargin - self.width = self._rightMargin - self.leftMargin - self.height = self._topMargin - self.bottomMargin - - def setPageCallBack(self, func): - 'Simple progress monitor - func(pageNo) called on each new page' - self._onPage = func - - def setProgressCallBack(self, func): - '''Cleverer progress monitor - func(typ, value) called regularly''' - self._onProgress = func - - def clean_hanging(self): - 'handle internal postponed actions' - while len(self._hanging): - self.handle_flowable(self._hanging) - - def addPageTemplates(self,pageTemplates): - 'add one or a sequence of pageTemplates' - if not isSeq(pageTemplates): - pageTemplates = [pageTemplates] - #this test below fails due to inconsistent imports! - #assert filter(lambda x: not isinstance(x,PageTemplate), pageTemplates)==[], "pageTemplates argument error" - for t in pageTemplates: - self.pageTemplates.append(t) - - def handle_documentBegin(self): - '''implement actions at beginning of document''' - self._hanging = [PageBegin] - self.pageTemplate = self.pageTemplates[self._firstPageTemplateIndex] - self.page = 0 - self.beforeDocument() - - def handle_pageBegin(self): - """Perform actions required at beginning of page. - shouldn't normally be called directly""" - self.page += 1 - if self._debug: logger.debug("beginning page %d" % self.page) - self.pageTemplate.beforeDrawPage(self.canv,self) - self.pageTemplate.checkPageSize(self.canv,self) - self.pageTemplate.onPage(self.canv,self) - for f in self.pageTemplate.frames: f._reset() - self.beforePage() - #keep a count of flowables added to this page. zero indicates bad stuff - self._curPageFlowableCount = 0 - if hasattr(self,'_nextFrameIndex'): - del self._nextFrameIndex - self.frame = self.pageTemplate.frames[0] - self.frame._debug = self._debug - self.handle_frameBegin() - - def _setPageTemplate(self): - if hasattr(self,'_nextPageTemplateCycle'): - #they are cycling through pages'; we keep the index - self.pageTemplate = self._nextPageTemplateCycle.next_value - elif hasattr(self,'_nextPageTemplateIndex'): - self.pageTemplate = self.pageTemplates[self._nextPageTemplateIndex] - del self._nextPageTemplateIndex - elif self.pageTemplate.autoNextPageTemplate: - self.handle_nextPageTemplate(self.pageTemplate.autoNextPageTemplate) - self.pageTemplate = self.pageTemplates[self._nextPageTemplateIndex] - - def _samePT(self,npt): - if isSeq(npt): - return getattr(self,'_nextPageTemplateCycle',[]) - if isinstance(npt,strTypes): - return npt == (self.pageTemplates[self._nextPageTemplateIndex].id if hasattr(self,'_nextPageTemplateIndex') else self.pageTemplate.id) - if isinstance(npt,int) and 0<=npt= self._emptyPagesAllowed: - if 1: - ident = "More than %d pages generated without content - halting layout. Likely that a flowable is too large for any frame." % self._emptyPagesAllowed - #leave to keep apart from the raise - raise LayoutError(ident) - else: - pass #attempt to restore to good state - else: - if self._onProgress: - self._onProgress('PAGE', self.canv.getPageNumber()) - self.pageTemplate.afterDrawPage(self.canv, self) - self.pageTemplate.onPageEnd(self.canv, self) - self.afterPage() - if self._debug: logger.debug("ending page %d" % self.page) - self.canv.setPageRotation(getattr(self.pageTemplate,'rotation',self.rotation)) - self.canv.showPage() - self._setPageTemplate() - if self._emptyPages==0: - pass #store good state here - self._hanging.append(PageBegin) - - def handle_pageBreak(self,slow=None): - '''some might choose not to end all the frames''' - if self._pageBreakQuick and not slow: - self.handle_pageEnd() - else: - n = len(self._hanging) - while len(self._hanging)==n: - self.handle_frameEnd() - - def handle_frameBegin(self,resume=0): - '''What to do at the beginning of a frame''' - f = self.frame - if f._atTop: - if self.showBoundary or self.frame.showBoundary: - self.frame.drawBoundary(self.canv) - f._leftExtraIndent = self._leftExtraIndent - f._rightExtraIndent = self._rightExtraIndent - f._frameBGs = self._frameBGs - - def handle_frameEnd(self,resume=0): - ''' Handles the semantics of the end of a frame. This includes the selection of - the next frame or if this is the last frame then invoke pageEnd. - ''' - self._removeVars(('frame',)) - self._leftExtraIndent = self.frame._leftExtraIndent - self._rightExtraIndent = self.frame._rightExtraIndent - self._frameBGs = self.frame._frameBGs - - f = self.frame - if hasattr(self,'_nextFrameIndex'): - self.frame = self.pageTemplate.frames[self._nextFrameIndex] - self.frame._debug = self._debug - del self._nextFrameIndex - self.handle_frameBegin(resume) - elif hasattr(f,'lastFrame') or f is self.pageTemplate.frames[-1]: - self.handle_pageEnd() - self.frame = None - else: - self.frame = self.pageTemplate.frames[self.pageTemplate.frames.index(f) + 1] - self.frame._debug = self._debug - self.handle_frameBegin() - - def handle_nextPageTemplate(self,pt): - '''On endPage change to the page template with name or index pt''' - if isinstance(pt,strTypes): - if hasattr(self, '_nextPageTemplateCycle'): del self._nextPageTemplateCycle - for t in self.pageTemplates: - if t.id == pt: - self._nextPageTemplateIndex = self.pageTemplates.index(t) - return - raise ValueError("can't find template('%s')"%pt) - elif isinstance(pt,int): - if hasattr(self, '_nextPageTemplateCycle'): del self._nextPageTemplateCycle - self._nextPageTemplateIndex = pt - elif isSeq(pt): - #used for alternating left/right pages - #collect the refs to the template objects, complain if any are bad - c = PTCycle() - for ptn in pt: - found = 0 - if ptn=='*': #special case name used to short circuit the iteration - c._restart = len(c) - continue - for t in self.pageTemplates: - if t.id == ptn: - c.append(t) - found = 1 - if not found: - raise ValueError("Cannot find page template called %s" % ptn) - if not c: - raise ValueError("No valid page templates in cycle") - elif c._restart>len(c): - raise ValueError("Invalid cycle restart position") - - #ensure we start on the first one - self._nextPageTemplateCycle = c - else: - raise TypeError("argument pt should be string or integer or list") - - def handle_nextFrame(self,fx,resume=0): - '''On endFrame change to the frame with name or index fx''' - if isinstance(fx,strTypes): - for f in self.pageTemplate.frames: - if f.id == fx: - self._nextFrameIndex = self.pageTemplate.frames.index(f) - return - raise ValueError("can't find frame('%s') in %r(%s) which has frames %r"%(fx,self.pageTemplate,self.pageTemplate.id,[(f,f.id) for f in self.pageTemplate.frames])) - elif isinstance(fx,int): - self._nextFrameIndex = fx - else: - raise TypeError("argument fx should be string or integer") - - def handle_currentFrame(self,fx,resume=0): - '''change to the frame with name or index fx''' - self.handle_nextFrame(fx,resume) - self.handle_frameEnd(resume) - - def handle_breakBefore(self, flowables): - '''preprocessing step to allow pageBreakBefore and frameBreakBefore attributes''' - first = flowables[0] - # if we insert a page break before, we'll process that, see it again, - # and go in an infinite loop. So we need to set a flag on the object - # saying 'skip me'. This should be unset on the next pass - if hasattr(first, '_skipMeNextTime'): - delattr(first, '_skipMeNextTime') - return - # this could all be made much quicker by putting the attributes - # in to the flowables with a defult value of 0 - if hasattr(first,'pageBreakBefore') and first.pageBreakBefore == 1: - first._skipMeNextTime = 1 - first.insert(0, PageBreak()) - return - if hasattr(first,'style') and hasattr(first.style, 'pageBreakBefore') and first.style.pageBreakBefore == 1: - first._skipMeNextTime = 1 - flowables.insert(0, PageBreak()) - return - if hasattr(first,'frameBreakBefore') and first.frameBreakBefore == 1: - first._skipMeNextTime = 1 - flowables.insert(0, FrameBreak()) - return - if hasattr(first,'style') and hasattr(first.style, 'frameBreakBefore') and first.style.frameBreakBefore == 1: - first._skipMeNextTime = 1 - flowables.insert(0, FrameBreak()) - return - - def handle_keepWithNext(self, flowables): - "implements keepWithNext" - i = 0 - n = len(flowables) - while i maxPasses: - raise IndexError("Index entries not resolved after %d passes" % maxPasses) - - #work through any edits - while mbe: - e = mbe.pop(0) - e[0](*e[1:]) - - del self._multiBuildEdits - if verbose: print('saved') - return passes - - #these are pure virtuals override in derived classes - #NB these get called at suitable places by the base class - #so if you derive and override the handle_xxx methods - #it's up to you to ensure that they maintain the needed consistency - def afterInit(self): - """This is called after initialisation of the base class.""" - pass - - def beforeDocument(self): - """This is called before any processing is - done on the document.""" - pass - - def beforePage(self): - """This is called at the beginning of page - processing, and immediately before the - beforeDrawPage method of the current page - template.""" - pass - - def afterPage(self): - """This is called after page processing, and - immediately after the afterDrawPage method - of the current page template.""" - pass - - def filterFlowables(self,flowables): - '''called to filter flowables at the start of the main handle_flowable method. - Upon return if flowables[0] has been set to None it is discarded and the main - method returns. - ''' - pass - - def afterFlowable(self, flowable): - '''called after a flowable has been rendered''' - pass - - _allowedLifetimes = 'page','frame','build','forever' - def docAssign(self,var,expr,lifetime): - if not isinstance(expr,strTypes): expr=str(expr) - expr=expr.strip() - var=var.strip() - self.docExec('%s=(%s)'%(var.strip(),expr.strip()),lifetime) - - def docExec(self,stmt,lifetime): - stmt=stmt.strip() - NS=self._nameSpace - K0=list(NS.keys()) - try: - if lifetime not in self._allowedLifetimes: - raise ValueError('bad lifetime %r not in %r'%(lifetime,self._allowedLifetimes)) - exec(stmt, {},NS) - except: - exc = sys.exc_info()[1] - args = list(exc.args) - msg = '\ndocExec %s lifetime=%r failed!' % (stmt,lifetime) - args.append(msg) - exc.args = tuple(args) - for k in NS.keys(): - if k not in K0: - del NS[k] - raise - self._addVars([k for k in NS.keys() if k not in K0],lifetime) - - def _addVars(self,vars,lifetime): - '''add namespace variables to lifetimes lists''' - LT=self._lifetimes - for var in vars: - for v in LT.values(): - if var in v: - v.remove(var) - LT.setdefault(lifetime,set([])).add(var) - - def _removeVars(self,lifetimes): - '''remove namespace variables for with lifetime in lifetimes''' - LT=self._lifetimes - NS=self._nameSpace - for lifetime in lifetimes: - for k in LT.setdefault(lifetime,[]): - try: - del NS[k] - except KeyError: - pass - del LT[lifetime] - - def docEval(self,expr): - try: - return eval(expr.strip(),{},self._nameSpace) - except: - exc = sys.exc_info()[1] - args = list(exc.args) - args[-1] += '\ndocEval %s failed!' % expr - exc.args = tuple(args) - raise - -class SimpleDocTemplate(BaseDocTemplate): - """A special case document template that will handle many simple documents. - See documentation for BaseDocTemplate. No pageTemplates are required - for this special case. A page templates are inferred from the - margin information and the onFirstPage, onLaterPages arguments to the build method. - - A document which has all pages with the same look except for the first - page may can be built using this special approach. - """ - _invalidInitArgs = ('pageTemplates',) - - def handle_pageBegin(self): - '''override base method to add a change of page template after the firstpage. - ''' - self._handle_pageBegin() - self._handle_nextPageTemplate('Later') - - def build(self,flowables,onFirstPage=_doNothing, onLaterPages=_doNothing, canvasmaker=canvas.Canvas): - """build the document using the flowables. Annotate the first page using the onFirstPage - function and later pages using the onLaterPages function. The onXXX pages should follow - the signature - - def myOnFirstPage(canvas, document): - # do annotations and modify the document - ... - - The functions can do things like draw logos, page numbers, - footers, etcetera. They can use external variables to vary - the look (for example providing page numbering or section names). - """ - self._calc() #in case we changed margins sizes etc - frameT = Frame(self.leftMargin, self.bottomMargin, self.width, self.height, id='normal') - self.addPageTemplates([PageTemplate(id='First',frames=frameT, onPage=onFirstPage,pagesize=self.pagesize), - PageTemplate(id='Later',frames=frameT, onPage=onLaterPages,pagesize=self.pagesize)]) - if onFirstPage is _doNothing and hasattr(self,'onFirstPage'): - self.pageTemplates[0].beforeDrawPage = self.onFirstPage - if onLaterPages is _doNothing and hasattr(self,'onLaterPages'): - self.pageTemplates[1].beforeDrawPage = self.onLaterPages - BaseDocTemplate.build(self,flowables, canvasmaker=canvasmaker) - -def progressCB(typ, value): - """Example prototype for progress monitoring. - - This aims to provide info about what is going on - during a big job. It should enable, for example, a reasonably - smooth progress bar to be drawn. We design the argument - signature to be predictable and conducive to programming in - other (type safe) languages. If set, this will be called - repeatedly with pairs of values. The first is a string - indicating the type of call; the second is a numeric value. - - typ 'STARTING', value = 0 - typ 'SIZE_EST', value = numeric estimate of job size - typ 'PASS', value = number of this rendering pass - typ 'PROGRESS', value = number between 0 and SIZE_EST - typ 'PAGE', value = page number of page - type 'FINISHED', value = 0 - - The sequence is - STARTING - always called once - SIZE_EST - always called once - PROGRESS - called often - PAGE - called often when page is emitted - FINISHED - called when really, really finished - - some juggling is needed to accurately estimate numbers of - pages in pageDrawing mode. - - NOTE: the SIZE_EST is a guess. It is possible that the - PROGRESS value may slightly exceed it, or may even step - back a little on rare occasions. The only way to be - really accurate would be to do two passes, and I don't - want to take that performance hit. - """ - print('PROGRESS MONITOR: %-10s %d' % (typ, value)) - -if __name__ == '__main__': - from reportlab.lib.styles import _baseFontName, _baseFontNameB - def myFirstPage(canvas, doc): - from reportlab.lib.colors import red - PAGE_HEIGHT = canvas._pagesize[1] - canvas.saveState() - canvas.setStrokeColor(red) - canvas.setLineWidth(5) - canvas.line(66,72,66,PAGE_HEIGHT-72) - canvas.setFont(_baseFontNameB,24) - canvas.drawString(108, PAGE_HEIGHT-108, "TABLE OF CONTENTS DEMO") - canvas.setFont(_baseFontName,12) - canvas.drawString(4 * inch, 0.75 * inch, "First Page") - canvas.restoreState() - - def myLaterPages(canvas, doc): - from reportlab.lib.colors import red - PAGE_HEIGHT = canvas._pagesize[1] - canvas.saveState() - canvas.setStrokeColor(red) - canvas.setLineWidth(5) - canvas.line(66,72,66,PAGE_HEIGHT-72) - canvas.setFont(_baseFontName,12) - canvas.drawString(4 * inch, 0.75 * inch, "Page %d" % doc.page) - canvas.restoreState() - - def run(): - objects_to_draw = [] - from reportlab.lib.styles import ParagraphStyle - #from paragraph import Paragraph - from reportlab.platypus.doctemplate import SimpleDocTemplate - - #need a style - normal = ParagraphStyle('normal') - normal.firstLineIndent = 18 - normal.spaceBefore = 6 - from reportlab.lib.randomtext import randomText - import random - for i in range(15): - height = 0.5 + (2*random.random()) - box = XBox(6 * inch, height * inch, 'Box Number %d' % i) - objects_to_draw.append(box) - para = Paragraph(randomText(), normal) - objects_to_draw.append(para) - - SimpleDocTemplate('doctemplate.pdf').build(objects_to_draw, - onFirstPage=myFirstPage,onLaterPages=myLaterPages) - - run() diff --git a/reportlab/platypus/figures.py b/reportlab/platypus/figures.py deleted file mode 100644 index 33aaad62..00000000 --- a/reportlab/platypus/figures.py +++ /dev/null @@ -1,433 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/platypus/figures.py -"""This includes some demos of platypus for use in the API proposal""" -__version__=''' $Id$ ''' - -import os - -from reportlab.lib import colors -from reportlab.pdfgen.canvas import Canvas -from reportlab.lib.styles import ParagraphStyle -from reportlab.lib.utils import recursiveImport, strTypes -from reportlab.platypus import Frame -from reportlab.platypus import Flowable -from reportlab.platypus import Paragraph -from reportlab.lib.units import inch -from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER -from reportlab.lib.validators import isColor -from reportlab.lib.colors import toColor -from reportlab.lib.styles import _baseFontName, _baseFontNameI - -captionStyle = ParagraphStyle('Caption', fontName=_baseFontNameI, fontSize=10, alignment=TA_CENTER) - -class Figure(Flowable): - def __init__(self, width, height, caption="", - captionFont=_baseFontNameI, captionSize=12, - background=None, - captionTextColor=toColor('black'), - captionBackColor=None, - border=None, - spaceBefore=12, - spaceAfter=12, - captionGap=None, - captionAlign='centre', - captionPosition='bottom', - hAlign='CENTER', - ): - Flowable.__init__(self) - self.width = width - self.figureHeight = height - self.caption = caption - self.captionFont = captionFont - self.captionSize = captionSize - self.captionTextColor = captionTextColor - self.captionBackColor = captionBackColor - self.captionGap = captionGap or 0.5*captionSize - self.captionAlign = captionAlign - self.captionPosition = captionPosition - self._captionData = None - self.captionHeight = 0 # work out later - self.background = background - self.border = border - self.spaceBefore = spaceBefore - self.spaceAfter = spaceAfter - self.hAlign=hAlign - self._getCaptionPara() #Larry Meyn's fix - otherwise they all get the number of the last chapter. - - def _getCaptionPara(self): - caption = self.caption - captionFont = self.captionFont - captionSize = self.captionSize - captionTextColor = self.captionTextColor - captionBackColor = self.captionBackColor - captionAlign = self.captionAlign - captionPosition = self.captionPosition - if self._captionData!=(caption,captionFont,captionSize,captionTextColor,captionBackColor,captionAlign,captionPosition): - self._captionData = (caption,captionFont,captionSize,captionTextColor,captionBackColor,captionAlign,captionPosition) - if isinstance(caption,Paragraph): - self.captionPara = caption - elif isinstance(caption,strTypes): - self.captionStyle = ParagraphStyle( - 'Caption', - fontName=captionFont, - fontSize=captionSize, - leading=1.2*captionSize, - textColor = captionTextColor, - backColor = captionBackColor, - #seems to be getting ignored - spaceBefore=self.captionGap, - alignment=TA_LEFT if captionAlign=='left' else TA_RIGHT if captionAlign=='right' else TA_CENTER, - ) - #must build paragraph now to get sequencing in synch with rest of story - self.captionPara = Paragraph(self.caption, self.captionStyle) - else: - raise ValueError('Figure caption of type %r is not a string or Paragraph' % type(caption)) - - def wrap(self, availWidth, availHeight): - # try to get the caption aligned - if self.caption: - self._getCaptionPara() - w, h = self.captionPara.wrap(self.width, availHeight - self.figureHeight) - self.captionHeight = h + self.captionGap - self.height = self.captionHeight + self.figureHeight - if w>self.width: self.width = w - else: - self.height = self.figureHeight - if self.hAlign in ('CENTER','CENTRE',TA_CENTER): - self.dx = 0.5 * (availWidth - self.width) - elif self.hAlign in ('RIGHT',TA_RIGHT): - self.dx = availWidth - self.width - else: - self.dx = 0 - return (self.width, self.height) - - def draw(self): - self.canv.translate(self.dx, 0) - if self.caption and self.captionPosition=='bottom': - self.canv.translate(0, self.captionHeight) - if self.background: - self.drawBackground() - if self.border: - self.drawBorder() - self.canv.saveState() - self.drawFigure() - self.canv.restoreState() - if self.caption: - if self.captionPosition=='bottom': - self.canv.translate(0, -self.captionHeight) - else: - self.canv.translate(0, self.figureHeight+self.captionGap) - self._getCaptionPara() - self.drawCaption() - - def drawBorder(self): - canv = self.canv - border = self.border - bc = getattr(border,'color',None) - bw = getattr(border,'width',None) - bd = getattr(border,'dashArray',None) - ss = bc or bw or bd - if ss: - canv.saveState() - if bc: canv.setStrokeColor(bc) - if bw: canv.setLineWidth(bw) - if bd: canv.setDash(bd) - canv.rect(0, 0, self.width, self.figureHeight,fill=0,stroke=1) - if ss: - canv.restoreState() - - def _doBackground(self, color): - self.canv.saveState() - self.canv.setFillColor(self.background) - self.canv.rect(0, 0, self.width, self.figureHeight, fill=1) - self.canv.restoreState() - - def drawBackground(self): - """For use when using a figure on a differently coloured background. - Allows you to specify a colour to be used as a background for the figure.""" - if isColor(self.background): - self._doBackground(self.background) - else: - try: - c = toColor(self.background) - self._doBackground(c) - except: - pass - - def drawCaption(self): - self.captionPara.drawOn(self.canv, 0, 0) - - def drawFigure(self): - pass - -def drawPage(canvas,x, y, width, height): - #draws something which looks like a page - pth = canvas.beginPath() - corner = 0.05*width - - # shaded backdrop offset a little - canvas.setFillColorRGB(0.5,0.5,0.5) - canvas.rect(x + corner, y - corner, width, height, stroke=0, fill=1) - - #'sheet of paper' in light yellow - canvas.setFillColorRGB(1,1,0.9) - canvas.setLineWidth(0) - canvas.rect(x, y, width, height, stroke=1, fill=1) - - #reset - canvas.setFillColorRGB(0,0,0) - canvas.setStrokeColorRGB(0,0,0) - -class PageFigure(Figure): - """Shows a blank page in a frame, and draws on that. Used in - illustrations of how PLATYPUS works.""" - def __init__(self, background=None): - Figure.__init__(self, 3*inch, 3*inch) - self.caption = 'Figure 1 - a blank page' - self.captionStyle = captionStyle - self.background = background - - def drawVirtualPage(self): - pass - - def drawFigure(self): - drawPage(self.canv, 0.625*inch, 0.25*inch, 1.75*inch, 2.5*inch) - self.canv.translate(0.625*inch, 0.25*inch) - self.canv.scale(1.75/8.27, 2.5/11.69) - self.drawVirtualPage() - -class PlatPropFigure1(PageFigure): - """This shows a page with a frame on it""" - def __init__(self): - PageFigure.__init__(self) - self.caption = "Figure 1 - a page with a simple frame" - def drawVirtualPage(self): - demo1(self.canv) - -class FlexFigure(Figure): - """Base for a figure class with a caption. Can grow or shrink in proportion""" - def __init__(self, width, height, caption, background=None, - captionFont='Helvetica-Oblique',captionSize=8, - captionTextColor=colors.black, - shrinkToFit=1, - growToFit=1, - spaceBefore=12, - spaceAfter=12, - captionGap=9, - captionAlign='centre', - captionPosition='top', - scaleFactor=None, - hAlign='CENTER', - border=1, - ): - Figure.__init__(self, width, height, caption, - captionFont=captionFont, - captionSize=captionSize, - background=None, - captionTextColor=captionTextColor, - spaceBefore = spaceBefore, - spaceAfter = spaceAfter, - captionGap=captionGap, - captionAlign=captionAlign, - captionPosition=captionPosition, - hAlign=hAlign, - border=border, - ) - self.shrinkToFit = shrinkToFit #if set and wrap is too tight, shrinks - self.growToFit = growToFit #if set and wrap is too small, grows - self.scaleFactor = scaleFactor - self._scaleFactor = None - self.background = background - - def _scale(self,availWidth,availHeight): - "Rescale to fit according to the rules, but only once" - if self._scaleFactor is None or self.width>availWidth or self.height>availHeight: - w, h = Figure.wrap(self, availWidth, availHeight) - captionHeight = h - self.figureHeight - if self.scaleFactor is None: - #scale factor None means auto - self._scaleFactor = min(availWidth/self.width,(availHeight-captionHeight)/self.figureHeight) - else: #they provided a factor - self._scaleFactor = self.scaleFactor - if self._scaleFactor<1 and self.shrinkToFit: - self.width = self.width * self._scaleFactor - 0.0001 - self.figureHeight = self.figureHeight * self._scaleFactor - elif self._scaleFactor>1 and self.growToFit: - self.width = self.width*self._scaleFactor - 0.0001 - self.figureHeight = self.figureHeight * self._scaleFactor - - def wrap(self, availWidth, availHeight): - self._scale(availWidth,availHeight) - return Figure.wrap(self, availWidth, availHeight) - - def split(self, availWidth, availHeight): - self._scale(availWidth,availHeight) - return Figure.split(self, availWidth, availHeight) - -class ImageFigure(FlexFigure): - """Image with a caption below it""" - def __init__(self, filename, caption, background=None,scaleFactor=None,hAlign='CENTER',border=None): - assert os.path.isfile(filename), 'image file %s not found' % filename - from reportlab.lib.utils import ImageReader - w, h = ImageReader(filename).getSize() - self.filename = filename - FlexFigure.__init__(self, w, h, caption, background,scaleFactor=scaleFactor,hAlign=hAlign,border=border) - - def drawFigure(self): - self.canv.drawImage(self.filename, - 0, 0,self.width, self.figureHeight) - -class DrawingFigure(FlexFigure): - """Drawing with a caption below it. Clunky, scaling fails.""" - def __init__(self, modulename, classname, caption, baseDir=None, background=None): - module = recursiveImport(modulename, baseDir) - klass = getattr(module, classname) - self.drawing = klass() - FlexFigure.__init__(self, - self.drawing.width, - self.drawing.height, - caption, - background) - self.growToFit = 1 - - def drawFigure(self): - self.canv.scale(self._scaleFactor, self._scaleFactor) - self.drawing.drawOn(self.canv, 0, 0) - -try: - from rlextra.pageCatcher.pageCatcher import restoreForms, storeForms, storeFormsInMemory, restoreFormsInMemory - _hasPageCatcher = 1 -except ImportError: - _hasPageCatcher = 0 -if _hasPageCatcher: - #################################################################### - # - # PageCatcher plugins - # These let you use our PageCatcher product to add figures - # to other documents easily. - #################################################################### - class PageCatcherCachingMixIn: - "Helper functions to cache pages for figures" - - def getFormName(self, pdfFileName, pageNo): - #naming scheme works within a directory only - dirname, filename = os.path.split(pdfFileName) - root, ext = os.path.splitext(filename) - return '%s_page%d' % (root, pageNo) - - def needsProcessing(self, pdfFileName, pageNo): - "returns 1 if no forms or form is older" - formName = self.getFormName(pdfFileName, pageNo) - if os.path.exists(formName + '.frm'): - formModTime = os.stat(formName + '.frm')[8] - pdfModTime = os.stat(pdfFileName)[8] - return (pdfModTime > formModTime) - else: - return 1 - - def processPDF(self, pdfFileName, pageNo): - formName = self.getFormName(pdfFileName, pageNo) - storeForms(pdfFileName, formName + '.frm', - prefix= formName + '_', - pagenumbers=[pageNo]) - #print 'stored %s.frm' % formName - return formName + '.frm' - - class cachePageCatcherFigureNonA4(FlexFigure, PageCatcherCachingMixIn): - """PageCatcher page with a caption below it. Size to be supplied.""" - # This should merge with PageFigure into one class that reuses - # form information to determine the page orientation... - def __init__(self, filename, pageNo, caption, width, height, background=None): - self.dirname, self.filename = os.path.split(filename) - if self.dirname == '': - self.dirname = os.curdir - self.pageNo = pageNo - self.formName = self.getFormName(self.filename, self.pageNo) + '_' + str(pageNo) - FlexFigure.__init__(self, width, height, caption, background) - - def drawFigure(self): - self.canv.saveState() - if not self.canv.hasForm(self.formName): - restorePath = self.dirname + os.sep + self.filename - #does the form file exist? if not, generate it. - formFileName = self.getFormName(restorePath, self.pageNo) + '.frm' - if self.needsProcessing(restorePath, self.pageNo): - #print 'preprocessing PDF %s page %s' % (restorePath, self.pageNo) - self.processPDF(restorePath, self.pageNo) - names = restoreForms(formFileName, self.canv) - self.canv.scale(self._scaleFactor, self._scaleFactor) - self.canv.doForm(self.formName) - self.canv.restoreState() - - class cachePageCatcherFigure(cachePageCatcherFigureNonA4): - """PageCatcher page with a caption below it. Presumes A4, Portrait. - This needs our commercial PageCatcher product, or you'll get a blank.""" - def __init__(self, filename, pageNo, caption, width=595, height=842, background=None): - cachePageCatcherFigureNonA4.__init__(self, filename, pageNo, caption, width, height, background=background) - - class PageCatcherFigureNonA4(FlexFigure): - """PageCatcher page with a caption below it. Size to be supplied.""" - # This should merge with PageFigure into one class that reuses - # form information to determine the page orientation... - _cache = {} - def __init__(self, filename, pageNo, caption, width, height, background=None, caching=None): - fn = self.filename = filename - self.pageNo = pageNo - fn = fn.replace(os.sep,'_').replace('/','_').replace('\\','_').replace('-','_').replace(':','_') - self.prefix = fn.replace('.','_')+'_'+str(pageNo)+'_' - self.formName = self.prefix + str(pageNo) - self.caching = caching - FlexFigure.__init__(self, width, height, caption, background) - - def drawFigure(self): - if not self.canv.hasForm(self.formName): - if self.filename in self._cache: - f,data = self._cache[self.filename] - else: - f = open(self.filename,'rb') - pdf = f.read() - f.close() - f, data = storeFormsInMemory(pdf, pagenumbers=[self.pageNo], prefix=self.prefix) - if self.caching=='memory': - self._cache[self.filename] = f, data - f = restoreFormsInMemory(data, self.canv) - self.canv.saveState() - self.canv.scale(self._scaleFactor, self._scaleFactor) - self.canv.doForm(self.formName) - self.canv.restoreState() - - class PageCatcherFigure(PageCatcherFigureNonA4): - """PageCatcher page with a caption below it. Presumes A4, Portrait. - This needs our commercial PageCatcher product, or you'll get a blank.""" - def __init__(self, filename, pageNo, caption, width=595, height=842, background=None, caching=None): - PageCatcherFigureNonA4.__init__(self, filename, pageNo, caption, width, height, background=background, caching=caching) - -def demo1(canvas): - frame = Frame( - 2*inch, # x - 4*inch, # y at bottom - 4*inch, # width - 5*inch, # height - showBoundary = 1 # helps us see what's going on - ) - bodyStyle = ParagraphStyle('Body', fontName=_baseFontName, fontSize=24, leading=28, spaceBefore=6) - para1 = Paragraph('Spam spam spam spam. ' * 5, bodyStyle) - para2 = Paragraph('Eggs eggs eggs. ' * 5, bodyStyle) - mydata = [para1, para2] - - #this does the packing and drawing. The frame will consume - #items from the front of the list as it prints them - frame.addFromList(mydata,canvas) - -def test1(): - c = Canvas('figures.pdf') - f = Frame(inch, inch, 6*inch, 9*inch, showBoundary=1) - v = PlatPropFigure1() - v.captionTextColor = toColor('blue') - v.captionBackColor = toColor('lightyellow') - f.addFromList([v],c) - c.save() - -if __name__ == '__main__': - test1() diff --git a/reportlab/platypus/flowables.py b/reportlab/platypus/flowables.py deleted file mode 100644 index f14c3640..00000000 --- a/reportlab/platypus/flowables.py +++ /dev/null @@ -1,1979 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/platypus/flowables.py -__version__=''' $Id$ ''' -__doc__=""" -A flowable is a "floating element" in a document whose exact position is determined by the -other elements that precede it, such as a paragraph, a diagram interspersed between paragraphs, -a section header, etcetera. Examples of non-flowables include page numbering annotations, -headers, footers, fixed diagrams or logos, among others. - -Flowables are defined here as objects which know how to determine their size and which -can draw themselves onto a page with respect to a relative "origin" position determined -at a higher level. The object's draw() method should assume that (0,0) corresponds to the -bottom left corner of the enclosing rectangle that will contain the object. The attributes -vAlign and hAlign may be used by 'packers' as hints as to how the object should be placed. - -Some Flowables also know how to "split themselves". For example a -long paragraph might split itself between one page and the next. - -Packers should set the canv attribute during wrap, split & draw operations to allow -the flowable to work out sizes etc in the proper context. - -The "text" of a document usually consists mainly of a sequence of flowables which -flow into a document from top to bottom (with column and page breaks controlled by -higher level components). -""" -import os -from copy import deepcopy, copy -from reportlab.lib.colors import red, gray, lightgrey -from reportlab.lib.rl_accel import fp_str -from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_RIGHT, TA_JUSTIFY -from reportlab.lib.styles import _baseFontName -from reportlab.lib.utils import strTypes -from reportlab.pdfbase import pdfutils -from reportlab.pdfbase.pdfmetrics import stringWidth -from reportlab.rl_config import _FUZZ, overlapAttachedSpace, ignoreContainerActions, listWrapOnFakeWidth -import collections - -__all__=('TraceInfo','Flowable','XBox','Preformatted','Image','Spacer','PageBreak','SlowPageBreak', - 'CondPageBreak','KeepTogether','Macro','CallerMacro','ParagraphAndImage', - 'FailOnWrap','HRFlowable','PTOContainer','KeepInFrame','UseUpSpace', - 'ListFlowable','ListItem','DDIndenter','LIIndenter', - 'DocAssign', 'DocExec', 'DocAssert', 'DocPara', 'DocIf', 'DocWhile', - 'PageBreakIfNotEmpty', - ) -class TraceInfo: - "Holder for info about where an object originated" - def __init__(self): - self.srcFile = '(unknown)' - self.startLineNo = -1 - self.startLinePos = -1 - self.endLineNo = -1 - self.endLinePos = -1 - -############################################################# -# Flowable Objects - a base class and a few examples. -# One is just a box to get some metrics. We also have -# a paragraph, an image and a special 'page break' -# object which fills the space. -############################################################# -class Flowable: - """Abstract base class for things to be drawn. Key concepts: - - 1. It knows its size - 2. It draws in its own coordinate system (this requires the - base API to provide a translate() function. - - """ - _fixedWidth = 0 #assume wrap results depend on arguments? - _fixedHeight = 0 - - def __init__(self): - self.width = 0 - self.height = 0 - self.wrapped = 0 - - #these are hints to packers/frames as to how the floable should be positioned - self.hAlign = 'LEFT' #CENTER/CENTRE or RIGHT - self.vAlign = 'BOTTOM' #MIDDLE or TOP - - #optional holder for trace info - self._traceInfo = None - self._showBoundary = None - - #many flowables handle text and must be processed in the - #absence of a canvas. tagging them with their encoding - #helps us to get conversions right. Use Python codec names. - self.encoding = None - - def _drawOn(self,canv): - '''ensure canv is set on and then draw''' - self.canv = canv - self.draw()#this is the bit you overload - del self.canv - - def _hAlignAdjust(self,x,sW=0): - if sW and hasattr(self,'hAlign'): - a = self.hAlign - if a in ('CENTER','CENTRE', TA_CENTER): - x += 0.5*sW - elif a in ('RIGHT',TA_RIGHT): - x += sW - elif a not in ('LEFT',TA_LEFT): - raise ValueError("Bad hAlign value "+str(a)) - return x - - def drawOn(self, canvas, x, y, _sW=0): - "Tell it to draw itself on the canvas. Do not override" - x = self._hAlignAdjust(x,_sW) - canvas.saveState() - canvas.translate(x, y) - self._drawOn(canvas) - if hasattr(self, '_showBoundary') and self._showBoundary: - #diagnostic tool support - canvas.setStrokeColor(gray) - canvas.rect(0,0,self.width, self.height) - canvas.restoreState() - - def wrapOn(self, canv, aW, aH): - '''intended for use by packers allows setting the canvas on - during the actual wrap''' - self.canv = canv - w, h = self.wrap(aW,aH) - del self.canv - return w, h - - def wrap(self, availWidth, availHeight): - """This will be called by the enclosing frame before objects - are asked their size, drawn or whatever. It returns the - size actually used.""" - return (self.width, self.height) - - def minWidth(self): - """This should return the minimum required width""" - return getattr(self,'_minWidth',self.width) - - def splitOn(self, canv, aW, aH): - '''intended for use by packers allows setting the canvas on - during the actual split''' - self.canv = canv - S = self.split(aW,aH) - del self.canv - return S - - def split(self, availWidth, availheight): - """This will be called by more sophisticated frames when - wrap fails. Stupid flowables should return []. Clever flowables - should split themselves and return a list of flowables. - If they decide that nothing useful can be fitted in the - available space (e.g. if you have a table and not enough - space for the first row), also return []""" - return [] - - def getKeepWithNext(self): - """returns boolean determining whether the next flowable should stay with this one""" - if hasattr(self,'keepWithNext'): return self.keepWithNext - elif hasattr(self,'style') and hasattr(self.style,'keepWithNext'): return self.style.keepWithNext - else: return 0 - - def getSpaceAfter(self): - """returns how much space should follow this item if another item follows on the same page.""" - if hasattr(self,'spaceAfter'): return self.spaceAfter - elif hasattr(self,'style') and hasattr(self.style,'spaceAfter'): return self.style.spaceAfter - else: return 0 - - def getSpaceBefore(self): - """returns how much space should precede this item if another item precedess on the same page.""" - if hasattr(self,'spaceBefore'): return self.spaceBefore - elif hasattr(self,'style') and hasattr(self.style,'spaceBefore'): return self.style.spaceBefore - else: return 0 - - def isIndexing(self): - """Hook for IndexingFlowables - things which have cross references""" - return 0 - - def identity(self, maxLen=None): - ''' - This method should attempt to return a string that can be used to identify - a particular flowable uniquely. The result can then be used for debugging - and or error printouts - ''' - if hasattr(self, 'getPlainText'): - r = self.getPlainText(identify=1) - elif hasattr(self, 'text'): - r = str(self.text) - else: - r = '...' - if r and maxLen: - r = r[:maxLen] - return "<%s at %s%s>%s" % (self.__class__.__name__, hex(id(self)), self._frameName(), r) - - def _doctemplateAttr(self,a): - return getattr(getattr(getattr(self,'canv',None),'_doctemplate',None),a,None) - - def _frameName(self): - f = getattr(self,'_frame',None) - if not f: f = self._doctemplateAttr('frame') - if f and f.id: return ' frame=%s' % f.id - return '' - -class XBox(Flowable): - """Example flowable - a box with an x through it and a caption. - This has a known size, so does not need to respond to wrap().""" - def __init__(self, width, height, text = 'A Box'): - Flowable.__init__(self) - self.width = width - self.height = height - self.text = text - - def __repr__(self): - return "XBox(w=%s, h=%s, t=%s)" % (self.width, self.height, self.text) - - def draw(self): - self.canv.rect(0, 0, self.width, self.height) - self.canv.line(0, 0, self.width, self.height) - self.canv.line(0, self.height, self.width, 0) - - #centre the text - self.canv.setFont(_baseFontName,12) - self.canv.drawCentredString(0.5*self.width, 0.5*self.height, self.text) - -def _trimEmptyLines(lines): - #don't want the first or last to be empty - while len(lines) and lines[0].strip() == '': - lines = lines[1:] - while len(lines) and lines[-1].strip() == '': - lines = lines[:-1] - return lines - -def _dedenter(text,dedent=0): - ''' - tidy up text - carefully, it is probably code. If people want to - indent code within a source script, you can supply an arg to dedent - and it will chop off that many character, otherwise it leaves - left edge intact. - ''' - lines = text.split('\n') - if dedent>0: - templines = _trimEmptyLines(lines) - lines = [] - for line in templines: - line = line[dedent:].rstrip() - lines.append(line) - else: - lines = _trimEmptyLines(lines) - - return lines - - -SPLIT_CHARS = "[{( ,.;:/\\-" - -def splitLines(lines, maximum_length, split_characters, new_line_characters): - if split_characters is None: - split_characters = SPLIT_CHARS - if new_line_characters is None: - new_line_characters = "" - # Return a table of lines - lines_splitted = [] - for line in lines: - if len(line) > maximum_length: - splitLine(line, lines_splitted, maximum_length, \ - split_characters, new_line_characters) - else: - lines_splitted.append(line) - return lines_splitted - -def splitLine(line_to_split, lines_splitted, maximum_length, \ -split_characters, new_line_characters): - # Used to implement the characters added - #at the beginning of each new line created - first_line = True - - # Check if the text can be splitted - while line_to_split and len(line_to_split)>0: - - # Index of the character where we can split - split_index = 0 - - # Check if the line length still exceeds the maximum length - if len(line_to_split) <= maximum_length: - # Return the remaining of the line - split_index = len(line_to_split) - else: - # Iterate for each character of the line - for line_index in range(maximum_length): - # Check if the character is in the list - # of allowed characters to split on - if line_to_split[line_index] in split_characters: - split_index = line_index + 1 - - # If the end of the line was reached - # with no character to split on - if split_index==0: - split_index = line_index + 1 - - if first_line: - lines_splitted.append(line_to_split[0:split_index]) - first_line = False - maximum_length -= len(new_line_characters) - else: - lines_splitted.append(new_line_characters + \ - line_to_split[0:split_index]) - - # Remaining text to split - line_to_split = line_to_split[split_index:] - -class Preformatted(Flowable): - """This is like the HTML
 tag.
-    It attempts to display text exactly as you typed it in a fixed width "typewriter" font.
-    By default the line breaks are exactly where you put them, and it will not be wrapped.
-    You can optionally define a maximum line length and the code will be wrapped; and 
-    extra characters to be inserted at the beginning of each wrapped line (e.g. '> ').
-    """
-    def __init__(self, text, style, bulletText = None, dedent=0, maxLineLength=None, splitChars=None, newLineChars=""):
-        """text is the text to display. If dedent is set then common leading space
-        will be chopped off the front (for example if the entire text is indented
-        6 spaces or more then each line will have 6 spaces removed from the front).
-        """
-        self.style = style
-        self.bulletText = bulletText
-        self.lines = _dedenter(text,dedent)
-        if text and maxLineLength:
-            self.lines = splitLines(
-                                self.lines, 
-                                maxLineLength, 
-                                splitChars, 
-                                newLineChars
-                        )
-
-    def __repr__(self):
-        bT = self.bulletText
-        H = "Preformatted("
-        if bT is not None:
-            H = "Preformatted(bulletText=%s," % repr(bT)
-        return "%s'''\\ \n%s''')" % (H, '\n'.join(self.lines))
-
-    def wrap(self, availWidth, availHeight):
-        self.width = availWidth
-        self.height = self.style.leading*len(self.lines)
-        return (self.width, self.height)
-
-    def minWidth(self):
-        style = self.style
-        fontSize = style.fontSize
-        fontName = style.fontName
-        return max([stringWidth(line,fontName,fontSize) for line in self.lines])
-
-    def split(self, availWidth, availHeight):
-        #returns two Preformatted objects
-
-        #not sure why they can be called with a negative height
-        if availHeight < self.style.leading:
-            return []
-
-        linesThatFit = int(availHeight * 1.0 / self.style.leading)
-
-        text1 = '\n'.join(self.lines[0:linesThatFit])
-        text2 = '\n'.join(self.lines[linesThatFit:])
-        style = self.style
-        if style.firstLineIndent != 0:
-            style = deepcopy(style)
-            style.firstLineIndent = 0
-        return [Preformatted(text1, self.style), Preformatted(text2, style)]
-
-    def draw(self):
-        #call another method for historical reasons.  Besides, I
-        #suspect I will be playing with alternate drawing routines
-        #so not doing it here makes it easier to switch.
-
-        cur_x = self.style.leftIndent
-        cur_y = self.height - self.style.fontSize
-        self.canv.addLiteral('%PreformattedPara')
-        if self.style.textColor:
-            self.canv.setFillColor(self.style.textColor)
-        tx = self.canv.beginText(cur_x, cur_y)
-        #set up the font etc.
-        tx.setFont( self.style.fontName,
-                    self.style.fontSize,
-                    self.style.leading)
-
-        for text in self.lines:
-            tx.textLine(text)
-        self.canv.drawText(tx)
-
-class Image(Flowable):
-    """an image (digital picture).  Formats supported by PIL/Java 1.4 (the Python/Java Imaging Library
-       are supported.  At the present time images as flowables are always centered horozontally
-       in the frame. We allow for two kinds of lazyness to allow for many images in a document
-       which could lead to file handle starvation.
-       lazy=1 don't open image until required.
-       lazy=2 open image when required then shut it.
-    """
-    _fixedWidth = 1
-    _fixedHeight = 1
-    def __init__(self, filename, width=None, height=None, kind='direct', mask="auto", lazy=1):
-        """If size to draw at not specified, get it from the image."""
-        self.hAlign = 'CENTER'
-        self._mask = mask
-        fp = hasattr(filename,'read')
-        if fp:
-            self._file = filename
-            self.filename = repr(filename)
-        else:
-            self._file = self.filename = filename
-        if not fp and os.path.splitext(filename)[1] in ['.jpg', '.JPG', '.jpeg', '.JPEG']:
-            # if it is a JPEG, will be inlined within the file -
-            # but we still need to know its size now
-            from reportlab.lib.utils import open_for_read
-            f = open_for_read(filename, 'b')
-            try:
-                try:
-                    info = pdfutils.readJPEGInfo(f)
-                except:
-                    #couldn't read as a JPEG, try like normal
-                    self._setup(width,height,kind,lazy)
-                    return
-            finally:
-                f.close()
-            self.imageWidth = info[0]
-            self.imageHeight = info[1]
-            self._img = None
-            self._setup(width,height,kind,0)
-        elif fp:
-            self._setup(width,height,kind,0)
-        else:
-            self._setup(width,height,kind,lazy)
-
-    def _setup(self,width,height,kind,lazy):
-        self._lazy = lazy
-        self._width = width
-        self._height = height
-        self._kind = kind
-        if lazy<=0: self._setup_inner()
-
-    def _setup_inner(self):
-        width = self._width
-        height = self._height
-        kind = self._kind
-        img = self._img
-        if img: self.imageWidth, self.imageHeight = img.getSize()
-        if self._lazy>=2: del self._img
-        if kind in ['direct','absolute']:
-            self.drawWidth = width or self.imageWidth
-            self.drawHeight = height or self.imageHeight
-        elif kind in ['percentage','%']:
-            self.drawWidth = self.imageWidth*width*0.01
-            self.drawHeight = self.imageHeight*height*0.01
-        elif kind in ['bound','proportional']:
-            factor = min(float(width)/self.imageWidth,float(height)/self.imageHeight)
-            self.drawWidth = self.imageWidth*factor
-            self.drawHeight = self.imageHeight*factor
-
-    def _restrictSize(self,aW,aH):
-        if self.drawWidth>aW+_FUZZ or self.drawHeight>aH+_FUZZ:
-            self._oldDrawSize = self.drawWidth, self.drawHeight
-            factor = min(float(aW)/self.drawWidth,float(aH)/self.drawHeight)
-            self.drawWidth *= factor
-            self.drawHeight *= factor
-        return self.drawWidth, self.drawHeight
-
-    def _unRestrictSize(self):
-        dwh = getattr(self,'_oldDrawSize',None)
-        if dwh:
-            self.drawWidth, self.drawHeight = dwh
-
-    def __getattr__(self,a):
-        if a=='_img':
-            from reportlab.lib.utils import ImageReader  #this may raise an error
-            self._img = ImageReader(self._file)
-            if not isinstance(self._file,strTypes):
-                self._file = None
-                if self._lazy>=2: self._lazy = 1    #here we're assuming we cannot read again
-            return self._img
-        elif a in ('drawWidth','drawHeight','imageWidth','imageHeight'):
-            self._setup_inner()
-            return self.__dict__[a]
-        raise AttributeError(".%s" % (id(self),a))
-
-    def wrap(self, availWidth, availHeight):
-        #the caller may decide it does not fit.
-        return self.drawWidth, self.drawHeight
-
-    def draw(self):
-        lazy = self._lazy
-        if lazy>=2: self._lazy = 1
-        self.canv.drawImage(    self._img or self.filename,
-                                getattr(self,'_offs_x',0),
-                                getattr(self,'_offs_y',0),
-                                self.drawWidth,
-                                self.drawHeight,
-                                mask=self._mask,
-                                )
-        if lazy>=2:
-            self._img = self._file = None
-            self._lazy = lazy
-
-    def identity(self,maxLen=None):
-        r = Flowable.identity(self,maxLen)
-        if r[-4:]=='>...' and isinstance(self.filename,str):
-            r = "%s filename=%s>" % (r[:-4],self.filename)
-        return r
-
-class NullDraw(Flowable):
-    def draw(self):
-        pass
-
-class Spacer(NullDraw):
-    """A spacer just takes up space and doesn't draw anything - it guarantees
-       a gap between objects."""
-    _fixedWidth = 1
-    _fixedHeight = 1
-    def __init__(self, width, height, isGlue=False):
-        self.width = width
-        if isGlue:
-            self.height = 1e-4
-            self.spacebefore = height
-        self.height = height
-
-    def __repr__(self):
-        return "%s(%s, %s)" % (self.__class__.__name__,self.width, self.height)
-
-class UseUpSpace(NullDraw):
-    def __init__(self):
-        pass
-
-    def __repr__(self):
-        return "%s()" % self.__class__.__name__
-
-    def wrap(self, availWidth, availHeight):
-        self.width = availWidth
-        self.height = availHeight
-        return (availWidth,availHeight-1e-8)  #step back a point
-
-class PageBreak(UseUpSpace):
-    """Move on to the next page in the document.
-       This works by consuming all remaining space in the frame!"""
-    def __init__(self,nextTemplate=None):
-        self.nextTemplate = nextTemplate
-
-class SlowPageBreak(PageBreak):
-    pass
-
-class PageBreakIfNotEmpty(PageBreak):
-    pass
-
-class CondPageBreak(Spacer):
-    """use up a frame if not enough vertical space effectively CondFrameBreak"""
-    def __init__(self, height):
-        self.height = height
-
-    def __repr__(self):
-        return "CondPageBreak(%s)" %(self.height,)
-
-    def wrap(self, availWidth, availHeight):
-        if availHeightaH and (not self._maxHeight or aH>self._maxHeight)
-        C1 = (self._H0>aH) or C0 and atTop
-        if C0 or C1:
-            if C0:
-                from reportlab.platypus.doctemplate import FrameBreak
-                A = FrameBreak
-            else:
-                from reportlab.platypus.doctemplate import NullActionFlowable
-                A = NullActionFlowable
-            S.insert(0,A())
-        return S
-
-    def identity(self, maxLen=None):
-        msg = "<%s at %s%s> containing :%s" % (self.__class__.__name__,hex(id(self)),self._frameName(),"\n".join([f.identity() for f in self._content]))
-        if maxLen:
-            return msg[0:maxLen]
-        else:
-            return msg
-
-class Macro(Flowable):
-    """This is not actually drawn (i.e. it has zero height)
-    but is executed when it would fit in the frame.  Allows direct
-    access to the canvas through the object 'canvas'"""
-    def __init__(self, command):
-        self.command = command
-    def __repr__(self):
-        return "Macro(%s)" % repr(self.command)
-    def wrap(self, availWidth, availHeight):
-        return (0,0)
-    def draw(self):
-        exec(self.command, globals(), {'canvas':self.canv})
-
-def _nullCallable(*args,**kwds):
-    pass
-
-class CallerMacro(Flowable):
-    '''
-    like Macro, but with callable command(s)
-    drawCallable(self)
-    wrapCallable(self,aW,aH)
-    '''
-    def __init__(self, drawCallable=None, wrapCallable=None):
-        self._drawCallable = drawCallable or _nullCallable
-        self._wrapCallable = wrapCallable or _nullCallable
-    def __repr__(self):
-        return "CallerMacro(%r,%r)" % (self._drawCallable,self._wrapCallable)
-    def wrap(self, aW, aH):
-        self._wrapCallable(self,aW,aH)
-        return (0,0)
-    def draw(self):
-        self._drawCallable(self)
-
-class ParagraphAndImage(Flowable):
-    '''combine a Paragraph and an Image'''
-    def __init__(self,P,I,xpad=3,ypad=3,side='right'):
-        self.P = P
-        self.I = I
-        self.xpad = xpad
-        self.ypad = ypad
-        self._side = side
-
-    def getSpaceBefore(self):
-        return max(self.P.getSpaceBefore(),self.I.getSpaceBefore())
-
-    def getSpaceAfter(self):
-        return max(self.P.getSpaceAfter(),self.I.getSpaceAfter())
-
-    def wrap(self,availWidth,availHeight):
-        wI, hI = self.I.wrap(availWidth,availHeight)
-        self.wI = wI
-        self.hI = hI
-        # work out widths array for breaking
-        self.width = availWidth
-        P = self.P
-        style = P.style
-        xpad = self.xpad
-        ypad = self.ypad
-        leading = style.leading
-        leftIndent = style.leftIndent
-        later_widths = availWidth - leftIndent - style.rightIndent
-        intermediate_widths = later_widths - xpad - wI
-        first_line_width = intermediate_widths - style.firstLineIndent
-        P.width = 0
-        nIW = int((hI+ypad)/(leading*1.0))
-        P.blPara = P.breakLines([first_line_width] + nIW*[intermediate_widths]+[later_widths])
-        if self._side=='left':
-            self._offsets = [wI+xpad]*(1+nIW)+[0]
-        P.height = len(P.blPara.lines)*leading
-        self.height = max(hI,P.height)
-        return (self.width, self.height)
-
-    def split(self,availWidth, availHeight):
-        P, wI, hI, ypad = self.P, self.wI, self.hI, self.ypad
-        if hI+ypad>availHeight or len(P.frags)<=0: return []
-        S = P.split(availWidth,availHeight)
-        if not S: return S
-        P = self.P = S[0]
-        del S[0]
-        style = P.style
-        P.height = len(self.P.blPara.lines)*style.leading
-        self.height = max(hI,P.height)
-        return [self]+S
-
-    def draw(self):
-        canv = self.canv
-        if self._side=='left':
-            self.I.drawOn(canv,0,self.height-self.hI)
-            self.P._offsets = self._offsets
-            try:
-                self.P.drawOn(canv,0,0)
-            finally:
-                del self.P._offsets
-        else:
-            self.I.drawOn(canv,self.width-self.wI-self.xpad,self.height-self.hI)
-            self.P.drawOn(canv,0,0)
-
-class FailOnWrap(NullDraw):
-    def wrap(self, availWidth, availHeight):
-        raise ValueError("FailOnWrap flowable wrapped and failing as ordered!")
-
-class FailOnDraw(Flowable):
-    def wrap(self, availWidth, availHeight):
-        return 0,0
-
-    def draw(self):
-        raise ValueError("FailOnDraw flowable drawn, and failing as ordered!")
-
-class HRFlowable(Flowable):
-    '''Like the hr tag'''
-    def __init__(self,
-            width="80%",
-            thickness=1,
-            lineCap='round',
-            color=lightgrey,
-            spaceBefore=1, spaceAfter=1,
-            hAlign='CENTER', vAlign='BOTTOM',
-            dash=None):
-        Flowable.__init__(self)
-        self.width = width
-        self.lineWidth = thickness
-        self.lineCap=lineCap
-        self.spaceBefore = spaceBefore
-        self.spaceAfter = spaceAfter
-        self.color = color
-        self.hAlign = hAlign
-        self.vAlign = vAlign
-        self.dash = dash
-
-    def __repr__(self):
-        return "HRFlowable(width=%s, height=%s)" % (self.width, self.height)
-
-    def wrap(self, availWidth, availHeight):
-        w = self.width
-        if type(w) is type(''):
-            w = w.strip()
-            if w.endswith('%'): w = availWidth*float(w[:-1])*0.01
-            else: w = float(w)
-        w = min(w,availWidth)
-        self._width = w
-        return w, self.lineWidth
-
-    def draw(self):
-        canv = self.canv
-        canv.saveState()
-        canv.setLineWidth(self.lineWidth)
-        canv.setLineCap({'butt':0,'round':1, 'square': 2}[self.lineCap.lower()])
-        canv.setStrokeColor(self.color)
-        if self.dash: canv.setDash(self.dash)
-        canv.line(0, 0, self._width, self.height)
-        canv.restoreState()
-
-class _PTOInfo:
-    def __init__(self,trailer,header):
-        self.trailer = _flowableSublist(trailer)
-        self.header = _flowableSublist(header)
-
-def cdeepcopy(obj):
-    if hasattr(obj,'deepcopy'):
-        return obj.deepcopy()
-    else:
-        return deepcopy(obj)
-
-class _Container(_ContainerSpace):  #Abstract some common container like behaviour
-    def drawOn(self, canv, x, y, _sW=0, scale=1.0, content=None, aW=None):
-        '''we simulate being added to a frame'''
-        from reportlab.platypus.doctemplate import ActionFlowable, Indenter
-        x0 = x
-        y0 = y
-        pS = 0
-        if aW is None: aW = self.width
-        aW *= scale
-        if content is None:
-            content = self._content
-        x = self._hAlignAdjust(x,_sW*scale)
-        y += self.height*scale
-        yt = y
-        frame = getattr(self,'_frame',None)
-        for c in content:
-            if not ignoreContainerActions and isinstance(c,ActionFlowable):
-                c.apply(self.canv._doctemplate)
-                continue
-            if isinstance(c,Indenter):
-                x += c.left*scale
-                aW -= (c.left+c.right)*scale
-                continue
-            w, h = c.wrapOn(canv,aW,0xfffffff)
-            if (w<_FUZZ or h<_FUZZ) and not getattr(c,'_ZEROSIZE',None): continue
-            if yt!=y:
-                s = c.getSpaceBefore()
-                if not getattr(c,'_SPACETRANSFER',False):
-                    h += max(s-pS,0)
-            y -= h
-            fbg = getattr(frame,'_frameBGs',None)
-            s = c.getSpaceAfter()
-            if getattr(c,'_SPACETRANSFER',False):
-                s = pS
-            pS = s
-            if fbg:
-                fbgl, fbgr, fbgc = fbg[-1]
-                fbw = scale*(frame._width-fbgl-fbgr)
-                fbh = y + h + pS
-                fby = max(y0,y-pS)
-                fbh = max(0,fbh-fby)
-                if abs(fbw)>_FUZZ and abs(fbh)>_FUZZ:
-                    canv.saveState()
-                    canv.setFillColor(fbgc)
-                    canv.rect(x0+scale*(fbgl-frame._leftPadding)-0.1,fby-0.1,fbw+0.2,fbh+0.2,stroke=0,fill=1)
-                    canv.restoreState()
-            c._frame = frame
-            c.drawOn(canv,x,y,_sW=aW-w)
-            if c is not content[-1] and not getattr(c,'_SPACETRANSFER',None):
-                y -= pS
-            del c._frame
-
-    def copyContent(self,content=None):
-        C = [].append
-        for c in (content or self._content):
-            C(cdeepcopy(c))
-        self._content = C.__self__
-
-class PTOContainer(_Container,Flowable):
-    '''PTOContainer(contentList,trailerList,headerList)
-
-    A container for flowables decorated with trailer & header lists.
-    If the split operation would be called then the trailer and header
-    lists are injected before and after the split. This allows specialist
-    "please turn over" and "continued from previous" like behaviours.'''
-    def __init__(self,content,trailer=None,header=None):
-        I = _PTOInfo(trailer,header)
-        self._content = C = []
-        for _ in _flowableSublist(content):
-            if isinstance(_,PTOContainer):
-                C.extend(_._content)
-            else:
-                C.append(_)
-                if not hasattr(_,'_ptoinfo'): _._ptoinfo = I
-
-    def wrap(self,availWidth,availHeight):
-        self.width, self.height = _listWrapOn(self._content,availWidth,self.canv)
-        return self.width,self.height
-
-    def split(self, availWidth, availHeight):
-        from reportlab.platypus.doctemplate import Indenter
-        if availHeight<0: return []
-        canv = self.canv
-        C = self._content
-        x = i = H = pS = hx = 0
-        n = len(C)
-        I2W = {}
-        dLeft = dRight = 0
-        for x in xrange(n):
-            c = C[x]
-            I = c._ptoinfo
-            if I not in I2W.keys():
-                T = I.trailer
-                Hdr = I.header
-                tW, tH = _listWrapOn(T, availWidth, self.canv)
-                if len(T):  #trailer may have no content
-                    tSB = T[0].getSpaceBefore()
-                else:
-                    tSB = 0
-                I2W[I] = T,tW,tH,tSB
-            else:
-                T,tW,tH,tSB = I2W[I]
-            _, h = c.wrapOn(canv,availWidth,0xfffffff)
-            if isinstance(c,Indenter):
-                dw = c.left+c.right
-                dLeft += c.left
-                dRight += c.right
-                availWidth -= dw
-                pS = 0
-                hx = 0
-            else:
-                if x:
-                    hx = max(c.getSpaceBefore()-pS,0)
-                    h += hx
-                pS = c.getSpaceAfter()
-            H += h+pS
-            tHS = tH+max(tSB,pS)
-            if H+tHS>=availHeight-_FUZZ: break
-            i += 1
-
-        #first retract last thing we tried
-        H -= (h+pS)
-
-        #attempt a sub split on the last one we have
-        aH = (availHeight-H-tHS-hx)*0.99999
-        if aH>=0.05*availHeight:
-            SS = c.splitOn(canv,availWidth,aH)
-        else:
-            SS = []
-
-        if abs(dLeft)+abs(dRight)>1e-8:
-            R1I = [Indenter(-dLeft,-dRight)]
-            R2I = [Indenter(dLeft,dRight)]
-        else:
-            R1I = R2I = []
-
-        if not SS:
-            j = i
-            while i>1 and C[i-1].getKeepWithNext():
-                i -= 1
-                C[i].keepWithNext = 0
-
-            if i==1 and C[0].getKeepWithNext():
-                #robin's black sheep
-                i = j
-                C[0].keepWithNext = 0
-
-        F = [UseUpSpace()]
-
-        if len(SS)>1:
-            R1 = C[:i]+SS[:1]+R1I+T+F
-            R2 = Hdr+R2I+SS[1:]+C[i+1:]
-        elif not i:
-            return []
-        else:
-            R1 = C[:i]+R1I+T+F
-            R2 = Hdr+R2I+C[i:]
-        T =  R1 + [PTOContainer(R2,[copy(x) for x in I.trailer],[copy(x) for x in I.header])]
-        return T
-
-#utility functions used by KeepInFrame
-def _hmodel(s0,s1,h0,h1):
-    # calculate the parameters in the model
-    # h = a/s**2 + b/s
-    a11 = 1./s0**2
-    a12 = 1./s0
-    a21 = 1./s1**2
-    a22 = 1./s1
-    det = a11*a22-a12*a21
-    b11 = a22/det
-    b12 = -a12/det
-    b21 = -a21/det
-    b22 = a11/det
-    a = b11*h0+b12*h1
-    b = b21*h0+b22*h1
-    return a,b
-
-def _qsolve(h,ab):
-    '''solve the model v = a/s**2 + b/s for an s which gives us v==h'''
-    a,b = ab
-    if abs(a)<=_FUZZ:
-        return b/h
-    t = 0.5*b/a
-    from math import sqrt
-    f = -h/a
-    r = t*t-f
-    if r<0: return None
-    r = sqrt(r)
-    if t>=0:
-        s1 = -t - r
-    else:
-        s1 = -t + r
-    s2 = f/s1
-    return max(1./s1, 1./s2)
-
-class KeepInFrame(_Container,Flowable):
-    def __init__(self, maxWidth, maxHeight, content=[], mergeSpace=1, mode='shrink', name='',hAlign='LEFT',vAlign='BOTTOM', fakeWidth=None):
-        '''mode describes the action to take when overflowing
-            error       raise an error in the normal way
-            continue    ignore ie just draw it and report maxWidth, maxHeight
-            shrink      shrinkToFit
-            truncate    fit as much as possible
-            set fakeWidth to False to make _listWrapOn do the 'right' thing
-        '''
-        self.name = name
-        self.maxWidth = maxWidth
-        self.maxHeight = maxHeight
-        self.mode = mode
-        assert mode in ('error','overflow','shrink','truncate'), '%s invalid mode value %s' % (self.identity(),mode)
-        assert maxHeight>=0,  '%s invalid maxHeight value %s' % (self.identity(),maxHeight)
-        if mergeSpace is None: mergeSpace = overlapAttachedSpace
-        self.mergespace = mergeSpace
-        self._content = content or []
-        self.vAlign = vAlign
-        self.hAlign = hAlign
-        self.fakeWidth = fakeWidth
-
-    def _getAvailableWidth(self):
-        return self.maxWidth - self._leftExtraIndent - self._rightExtraIndent
-
-    def identity(self, maxLen=None):
-        return "<%s at %s%s%s> size=%sx%s" % (self.__class__.__name__, hex(id(self)), self._frameName(),
-                getattr(self,'name','') and (' name="%s"'% getattr(self,'name','')) or '',
-                getattr(self,'maxWidth','') and (' maxWidth=%s'%fp_str(getattr(self,'maxWidth',0))) or '',
-                getattr(self,'maxHeight','')and (' maxHeight=%s' % fp_str(getattr(self,'maxHeight')))or '')
-
-    def wrap(self,availWidth,availHeight):
-        from reportlab.platypus.doctemplate import LayoutError
-        mode = self.mode
-        maxWidth = float(min(self.maxWidth or availWidth,availWidth))
-        maxHeight = float(min(self.maxHeight or availHeight,availHeight))
-        fakeWidth = self.fakeWidth
-        W, H = _listWrapOn(self._content,maxWidth,self.canv, fakeWidth=fakeWidth)
-        if (mode=='error' and (W>maxWidth+_FUZZ or H>maxHeight+_FUZZ)):
-            ident = 'content %sx%s too large for %s' % (W,H,self.identity(30))
-            #leave to keep apart from the raise
-            raise LayoutError(ident)
-        elif W<=maxWidth+_FUZZ and H<=maxHeight+_FUZZ:
-            self.width = W-_FUZZ      #we take what we get
-            self.height = H-_FUZZ
-        elif mode in ('overflow','truncate'):   #we lie
-            self.width = min(maxWidth,W)-_FUZZ
-            self.height = min(maxHeight,H)-_FUZZ
-        else:
-            def func(x):
-                x = float(x)
-                W, H = _listWrapOn(self._content,x*maxWidth,self.canv, fakeWidth=fakeWidth)
-                W /= x
-                H /= x
-                return W, H
-            W0 = W
-            H0 = H
-            s0 = 1
-            if W>maxWidth+_FUZZ:
-                #squeeze out the excess width and or Height
-                s1 = W/maxWidth     #linear model
-                W, H = func(s1)
-                if H<=maxHeight+_FUZZ:
-                    self.width = W-_FUZZ
-                    self.height = H-_FUZZ
-                    self._scale = s1
-                    return W,H
-                s0 = s1
-                H0 = H
-                W0 = W
-            s1 = H/maxHeight
-            W, H = func(s1)
-            self.width = W-_FUZZ
-            self.height = H-_FUZZ
-            self._scale = s1
-            if H=maxHeight+_FUZZ:
-                #the standard case W should be OK, H is short we want
-                #to find the smallest s with H<=maxHeight
-                H1 = H
-                for f in 0, 0.01, 0.05, 0.10, 0.15:
-                    #apply the quadratic model
-                    s = _qsolve(maxHeight*(1-f),_hmodel(s0,s1,H0,H1))
-                    W, H = func(s)
-                    if H<=maxHeight+_FUZZ and W<=maxWidth+_FUZZ:
-                        self.width = W-_FUZZ
-                        self.height = H-_FUZZ
-                        self._scale = s
-                        break
-
-        return self.width, self.height
-
-    def drawOn(self, canv, x, y, _sW=0):
-        scale = getattr(self,'_scale',1.0)
-        truncate = self.mode=='truncate'
-        ss = scale!=1.0 or truncate
-        if ss:
-            canv.saveState()
-            if truncate:
-                p = canv.beginPath()
-                p.rect(x, y, self.width,self.height)
-                canv.clipPath(p,stroke=0)
-            else:
-                canv.translate(x,y)
-                x=y=0
-                canv.scale(1.0/scale, 1.0/scale)
-        _Container.drawOn(self, canv, x, y, _sW=_sW, scale=scale)
-        if ss: canv.restoreState()
-
-class ImageAndFlowables(_Container,Flowable):
-    '''combine a list of flowables and an Image'''
-    def __init__(self,I,F,imageLeftPadding=0,imageRightPadding=3,imageTopPadding=0,imageBottomPadding=3,
-                    imageSide='right', imageHref=None):
-        self._content = _flowableSublist(F)
-        self._I = I
-        self._irpad = imageRightPadding
-        self._ilpad = imageLeftPadding
-        self._ibpad = imageBottomPadding
-        self._itpad = imageTopPadding
-        self._side = imageSide
-        self.imageHref = imageHref
-
-    def deepcopy(self):
-        c = copy(self)  #shallow
-        self._reset()
-        c.copyContent() #partially deep?
-        return c
-
-    def getSpaceAfter(self):
-        if hasattr(self,'_C1'):
-            C = self._C1
-        elif hasattr(self,'_C0'):
-            C = self._C0
-        else:
-            C = self._content
-        return _Container.getSpaceAfter(self,C)
-
-    def getSpaceBefore(self):
-        return max(self._I.getSpaceBefore(),_Container.getSpaceBefore(self))
-
-    def _reset(self):
-        for a in ('_wrapArgs','_C0','_C1'):
-            try:
-                delattr(self,a)
-            except:
-                pass
-
-    def wrap(self,availWidth,availHeight):
-        canv = self.canv
-        I = self._I
-        if hasattr(self,'_wrapArgs'):
-            if self._wrapArgs==(availWidth,availHeight) and getattr(I,'_oldDrawSize',None) is None:
-                return self.width,self.height
-            self._reset()
-            I._unRestrictSize()
-        self._wrapArgs = availWidth, availHeight
-        I.wrap(availWidth,availHeight)
-        wI, hI = I._restrictSize(availWidth,availHeight)
-        self._wI = wI
-        self._hI = hI
-        ilpad = self._ilpad
-        irpad = self._irpad
-        ibpad = self._ibpad
-        itpad = self._itpad
-        self._iW = iW = availWidth - irpad - wI - ilpad
-        aH = itpad + hI + ibpad
-        if iW>_FUZZ:
-            W,H0,self._C0,self._C1 = self._findSplit(canv,iW,aH)
-        else:
-            W = availWidth
-            H0 = 0
-        if W>iW+_FUZZ:
-            self._C0 = []
-            self._C1 = self._content
-        aH = self._aH = max(aH,H0)
-        self.width = availWidth
-        if not self._C1:
-            self.height = aH
-        else:
-            W1,H1 = _listWrapOn(self._C1,availWidth,canv)
-            self.height = aH+H1
-        return self.width, self.height
-
-    def split(self,availWidth, availHeight):
-        if hasattr(self,'_wrapArgs'):
-            I = self._I
-            if self._wrapArgs!=(availWidth,availHeight) or getattr(I,'_oldDrawSize',None) is not None:
-                self._reset()
-                I._unRestrictSize()
-        W,H=self.wrap(availWidth,availHeight)
-        if self._aH>availHeight: return []
-        C1 = self._C1
-        if C1:
-            S = C1[0].split(availWidth,availHeight-self._aH)
-            if not S:
-                _C1 = []
-            else:
-                _C1 = [S[0]]
-                C1 = S[1:]+C1[1:]
-        else:
-            _C1 = []
-        return [ImageAndFlowables(
-                    self._I,
-                    self._C0+_C1,
-                    imageLeftPadding=self._ilpad,
-                    imageRightPadding=self._irpad,
-                    imageTopPadding=self._itpad,
-                    imageBottomPadding=self._ibpad,
-                    imageSide=self._side, imageHref=self.imageHref)
-                    ]+C1
-
-    def drawOn(self, canv, x, y, _sW=0):
-        if self._side=='left':
-            Ix = x + self._ilpad
-            Fx = Ix+ self._irpad + self._wI
-        else:
-            Ix = x + self.width-self._wI-self._irpad
-            Fx = x
-        self._I.drawOn(canv,Ix,y+self.height-self._itpad-self._hI)
-
-        if self.imageHref:
-            canv.linkURL(self.imageHref, (Ix, y+self.height-self._itpad-self._hI, Ix + self._wI, y+self.height), relative=1)
-
-        if self._C0:
-            _Container.drawOn(self, canv, Fx, y, content=self._C0, aW=self._iW)
-        if self._C1:
-            aW, aH = self._wrapArgs
-            _Container.drawOn(self, canv, x, y-self._aH,content=self._C1, aW=aW)
-
-    def _findSplit(self,canv,availWidth,availHeight,mergeSpace=1,obj=None):
-        '''return max width, required height for a list of flowables F'''
-        W = 0
-        H = 0
-        pS = sB = 0
-        atTop = 1
-        F = self._content
-        for i,f in enumerate(F):
-            w,h = f.wrapOn(canv,availWidth,0xfffffff)
-            if w<=_FUZZ or h<=_FUZZ: continue
-            W = max(W,w)
-            if not atTop:
-                s = f.getSpaceBefore()
-                if mergeSpace: s = max(s-pS,0)
-                H += s
-            else:
-                if obj is not None: obj._spaceBefore = f.getSpaceBefore()
-                atTop = 0
-            if H>=availHeight or w>availWidth:
-                return W, availHeight, F[:i],F[i:]
-            H += h
-            if H>availHeight:
-                from reportlab.platypus.paragraph import Paragraph
-                aH = availHeight-(H-h)
-                if isinstance(f,(Paragraph,Preformatted)):
-                    leading = f.style.leading
-                    nH = leading*int(aH/float(leading))+_FUZZ
-                    if nH1:
-            S[0] = TopPadder(S[0])
-        return S
-
-    def drawOn(self, canvas, x, y, _sW=0):
-        self.__f.drawOn(canvas,x,y-max(0,self.__dh-1e-8),_sW)
-
-    def __setattr__(self,a,v):
-        setattr(self.__f,a,v)
-
-    def __getattr__(self,a):
-        return getattr(self.__f,a)
-
-    def __delattr__(self,a):
-        delattr(self.__f,a)
-
-class DocAssign(NullDraw):
-    '''At wrap time this flowable evaluates var=expr in the doctemplate namespace'''
-    _ZEROSIZE=1
-    def __init__(self,var,expr,life='forever'):
-        Flowable.__init__(self)
-        self.args = var,expr,life
-
-    def funcWrap(self,aW,aH):
-        NS=self._doctemplateAttr('_nameSpace')
-        NS.update(dict(availableWidth=aW,availableHeight=aH))
-        try:
-            return self.func()
-        finally:
-            for k in 'availableWidth','availableHeight':
-                try:
-                    del NS[k]
-                except:
-                    pass
-
-    def func(self):
-        return self._doctemplateAttr('d'+self.__class__.__name__[1:])(*self.args)
-
-    def wrap(self,aW,aH):
-        self.funcWrap(aW,aH)
-        return 0,0
-
-class DocExec(DocAssign):
-    '''at wrap time exec stmt in doc._nameSpace'''
-    def __init__(self,stmt,lifetime='forever'):
-        Flowable.__init__(self)
-        self.args=stmt,lifetime
-
-class DocPara(DocAssign):
-    '''at wrap time create a paragraph with the value of expr as text
-    if format is specified it should use %(__expr__)s for string interpolation
-    of the expression expr (if any). It may also use %(name)s interpolations
-    for other variables in the namespace.
-    suitable defaults will be used if style and klass are None
-    '''
-    def __init__(self,expr,format=None,style=None,klass=None,escape=True):
-        Flowable.__init__(self)
-        self.expr=expr
-        self.format=format
-        self.style=style
-        self.klass=klass
-        self.escape=escape
-
-    def func(self):
-        expr = self.expr
-        if expr:
-            if not isinstance(expr,str): expr = str(expr)
-            return self._doctemplateAttr('docEval')(expr)
-
-    def add_content(self,*args):
-        self._doctemplateAttr('frame').add_generated_content(*args)
-
-    def get_value(self,aW,aH):
-        value = self.funcWrap(aW,aH)
-        if self.format:
-            NS=self._doctemplateAttr('_nameSpace').copy()
-            NS.update(dict(availableWidth=aW,availableHeight=aH))
-            NS['__expr__'] = value
-            value = self.format % NS
-        else:
-            value = str(value)
-        return value
-
-    def wrap(self,aW,aH):
-        value = self.get_value(aW,aH)
-        P = self.klass
-        if not P:
-            from reportlab.platypus.paragraph import Paragraph as P
-        style = self.style
-        if not style:
-            from reportlab.lib.styles import getSampleStyleSheet
-            style=getSampleStyleSheet()['Code']
-        if self.escape:
-            from xml.sax.saxutils import escape
-            value=escape(value)
-        self.add_content(P(value,style=style))
-        return 0,0
-
-class DocAssert(DocPara):
-    def __init__(self,cond,format=None):
-        Flowable.__init__(self)
-        self.expr=cond
-        self.format=format
-
-    def funcWrap(self,aW,aH):
-        self._cond = DocPara.funcWrap(self,aW,aH)
-        return self._cond
-
-    def wrap(self,aW,aH):
-        value = self.get_value(aW,aH)
-        if not bool(self._cond):
-            raise AssertionError(value)
-        return 0,0
-
-class DocIf(DocPara):
-    def __init__(self,cond,thenBlock,elseBlock=[]):
-        Flowable.__init__(self)
-        self.expr = cond
-        self.blocks = elseBlock or [],thenBlock
-
-    def checkBlock(self,block):
-        if not isinstance(block,(list,tuple)):
-            block = (block,)
-        return block
-
-    def wrap(self,aW,aH):
-        self.add_content(*self.checkBlock(self.blocks[int(bool(self.funcWrap(aW,aH)))]))
-        return 0,0
-
-class DocWhile(DocIf):
-    def __init__(self,cond,whileBlock):
-        Flowable.__init__(self)
-        self.expr = cond
-        self.block = self.checkBlock(whileBlock)
-
-    def wrap(self,aW,aH):
-        if bool(self.funcWrap(aW,aH)):
-            self.add_content(*(list(self.block)+[self]))
-        return 0,0
diff --git a/reportlab/platypus/frames.py b/reportlab/platypus/frames.py
deleted file mode 100644
index 81a3277c..00000000
--- a/reportlab/platypus/frames.py
+++ /dev/null
@@ -1,282 +0,0 @@
-#Copyright ReportLab Europe Ltd. 2000-2012
-#see license.txt for license details
-#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/platypus/frames.py
-
-__version__=''' $Id$ '''
-
-__doc__="""A frame is a container for content on a page.
-"""
-
-import logging
-logger = logging.getLogger('reportlab.platypus')
-
-_geomAttr=('x1', 'y1', 'width', 'height', 'leftPadding', 'bottomPadding', 'rightPadding', 'topPadding')
-from reportlab import rl_config, isPy3
-_FUZZ=rl_config._FUZZ
-
-class ShowBoundaryValue:
-    def __init__(self,color=(0,0,0),width=0.1):
-        self.color = color
-        self.width = width
-
-    if isPy3:
-        def __bool__(self):
-            return self.color is not None and self.width>=0
-    else:
-        def __nonzero__(self):
-            return self.color is not None and self.width>=0
-
-
-class Frame:
-    '''
-    A Frame is a piece of space in a document that is filled by the
-    "flowables" in the story.  For example in a book like document most
-    pages have the text paragraphs in one or two frames.  For generality
-    a page might have several frames (for example for 3 column text or
-    for text that wraps around a graphic).
-
-    After creation a Frame is not usually manipulated directly by the
-    applications program -- it is used internally by the platypus modules.
-
-    Here is a diagramatid abstraction for the definitional part of a Frame::
-
-                width                    x2,y2
-        +---------------------------------+
-        | l  top padding                r | h
-        | e +-------------------------+ i | e
-        | f |                         | g | i
-        | t |                         | h | g
-        |   |                         | t | h
-        | p |                         |   | t
-        | a |                         | p |
-        | d |                         | a |
-        |   |                         | d |
-        |   +-------------------------+   |
-        |    bottom padding               |
-        +---------------------------------+
-        (x1,y1) <-- lower left corner
-
-    NOTE!! Frames are stateful objects.  No single frame should be used in
-    two documents at the same time (especially in the presence of multithreading.
-    '''
-    def __init__(self, x1, y1, width,height, leftPadding=6, bottomPadding=6,
-            rightPadding=6, topPadding=6, id=None, showBoundary=0,
-            overlapAttachedSpace=None,_debug=None):
-        self.id = id
-        self._debug = _debug
-
-        #these say where it goes on the page
-        self.__dict__['_x1'] = x1
-        self.__dict__['_y1'] = y1
-        self.__dict__['_width'] = width
-        self.__dict__['_height'] = height
-
-        #these create some padding.
-        self.__dict__['_leftPadding'] = leftPadding
-        self.__dict__['_bottomPadding'] = bottomPadding
-        self.__dict__['_rightPadding'] = rightPadding
-        self.__dict__['_topPadding'] = topPadding
-
-        # if we want a boundary to be shown
-        self.showBoundary = showBoundary
-
-        if overlapAttachedSpace is None: overlapAttachedSpace = rl_config.overlapAttachedSpace
-        self._oASpace = overlapAttachedSpace
-        self._geom()
-        self._reset()
-
-    def __getattr__(self,a):
-        if a in _geomAttr: return self.__dict__['_'+a]
-        raise AttributeError(a)
-
-    def __setattr__(self,a,v):
-        if a in _geomAttr:
-            self.__dict__['_'+a] = v
-            self._geom()
-        else:
-            self.__dict__[a] = v
-
-    def _saveGeom(self, **kwds):
-        if not self.__dict__.setdefault('_savedGeom',{}):
-            for ga in _geomAttr:
-                ga = '_'+ga
-                self.__dict__['_savedGeom'][ga] = self.__dict__[ga]
-        for k,v in kwds.items():
-            setattr(self,k,v)
-
-    def _restoreGeom(self):
-        if self.__dict__.get('_savedGeom',None):
-            for ga in _geomAttr:
-                ga = '_'+ga
-                self.__dict__[ga] = self.__dict__[ga]['_savedGeom']
-                del self.__dict__['_savedGeom']
-            self._geom()
-
-    def _geom(self):
-        self._x2 = self._x1 + self._width
-        self._y2 = self._y1 + self._height
-        #efficiency
-        self._y1p = self._y1 + self._bottomPadding
-        #work out the available space
-        self._aW = self._x2 - self._x1 - self._leftPadding - self._rightPadding
-        self._aH = self._y2 - self._y1p - self._topPadding
-
-    def _reset(self):
-        self._restoreGeom()
-        #drawing starts at top left
-        self._x = self._x1 + self._leftPadding
-        self._y = self._y2 - self._topPadding
-        self._atTop = 1
-        self._prevASpace = 0
-
-        # these two should NOT be set on a frame.
-        # they are used when Indenter flowables want
-        # to adjust edges e.g. to do nested lists
-        self._leftExtraIndent = 0.0
-        self._rightExtraIndent = 0.0
-
-    def _getAvailableWidth(self):
-        return self._aW - self._leftExtraIndent - self._rightExtraIndent
-
-    def _add(self, flowable, canv, trySplit=0):
-        """ Draws the flowable at the current position.
-        Returns 1 if successful, 0 if it would not fit.
-        Raises a LayoutError if the object is too wide,
-        or if it is too high for a totally empty frame,
-        to avoid infinite loops"""
-        flowable._frame = self
-        flowable.canv = canv #so they can use stringWidth etc
-        try:
-            if getattr(flowable,'frameAction',None):
-                flowable.frameAction(self)
-                return 1
-
-            y = self._y
-            p = self._y1p
-            s = 0
-            aW = self._getAvailableWidth()
-            if not self._atTop:
-                s =flowable.getSpaceBefore()
-                if self._oASpace:
-                    if getattr(flowable,'_SPACETRANSFER',False):
-                        s = self._prevASpace
-                    s = max(s-self._prevASpace,0)
-            h = y - p - s
-            if h>0:
-                w, h = flowable.wrap(aW, h)
-            else:
-                return 0
-
-            h += s
-            y -= h
-
-            if y < p-_FUZZ:
-                if not rl_config.allowTableBoundsErrors and ((h>self._aH or w>aW) and not trySplit):
-                    from reportlab.platypus.doctemplate import LayoutError
-                    raise LayoutError("Flowable %s (%sx%s points) too large for frame (%sx%s points)." % (
-                        flowable.__class__, w,h, aW,self._aH))
-                return 0
-            else:
-                #now we can draw it, and update the current point.
-                s = flowable.getSpaceAfter()
-                fbg = getattr(self,'_frameBGs',None)
-                if fbg:
-                    fbgl, fbgr, fbgc = fbg[-1]
-                    fbw = self._width-fbgl-fbgr
-                    fbh = y + h + s
-                    fby = max(p,y-s)
-                    fbh = max(0,fbh-fby)
-                    if abs(fbw)>_FUZZ and abs(fbh)>_FUZZ:
-                        canv.saveState()
-                        canv.setFillColor(fbgc)
-                        canv.rect(self._x1+fbgl,fby,fbw,fbh,stroke=0,fill=1)
-                        canv.restoreState()
-
-                flowable.drawOn(canv, self._x + self._leftExtraIndent, y, _sW=aW-w)
-                flowable.canv=canv
-                if self._debug: logger.debug('drew %s' % flowable.identity())
-                y -= s
-                if self._oASpace:
-                    if getattr(flowable,'_SPACETRANSFER',False):
-                        s = self._prevASpace
-                    self._prevASpace = s
-                if y!=self._y: self._atTop = 0
-                self._y = y
-                return 1
-        finally:
-            #sometimes canv/_frame aren't still on the flowable
-            for a in ('canv', '_frame'):
-                if hasattr(flowable,a):
-                    delattr(flowable,a)
-
-    add = _add
-
-    def split(self,flowable,canv):
-        '''Ask the flowable to split using up the available space.'''
-        y = self._y
-        p = self._y1p
-        s = 0
-        if not self._atTop:
-            s = flowable.getSpaceBefore()
-            if self._oASpace:
-                s = max(s-self._prevASpace,0)
-        flowable._frame = self                  #some flowables might need these
-        flowable.canv = canv        
-        try:
-            r = flowable.split(self._aW, y-p-s)
-        finally:
-            #sometimes canv/_frame aren't still on the flowable
-            for a in ('canv', '_frame'):
-                if hasattr(flowable,a):
-                    delattr(flowable,a)
-        return r
-
-
-    def drawBoundary(self,canv):
-        "draw the frame boundary as a rectangle (primarily for debugging)."
-        from reportlab.lib.colors import Color, toColor
-        sb = self.showBoundary
-        ss = isinstance(sb,(str,tuple,list)) or isinstance(sb,Color)
-        w = -1
-        if ss:
-            c = toColor(sb,self)
-            ss = c is not self
-        elif isinstance(sb,ShowBoundaryValue) and sb:
-            c = toColor(sb.color,self)
-            w = sb.width
-            ss = c is not self
-        if ss:
-            canv.saveState()
-            canv.setStrokeColor(c)
-            if w>=0:
-                canv.setLineWidth(w)
-        canv.rect(
-                self._x1,
-                self._y1,
-                self._x2 - self._x1,
-                self._y2 - self._y1
-                )
-        if ss: canv.restoreState()
-
-    def addFromList(self, drawlist, canv):
-        """Consumes objects from the front of the list until the
-        frame is full.  If it cannot fit one object, raises
-        an exception."""
-
-        if self._debug: logger.debug("enter Frame.addFromlist() for frame %s" % self.id)
-        if self.showBoundary:
-            self.drawBoundary(canv)
-
-        while len(drawlist) > 0:
-            head = drawlist[0]
-            if self.add(head,canv,trySplit=0):
-                del drawlist[0]
-            else:
-                #leave it in the list for later
-                break
-
-    def add_generated_content(self,*C):
-        self.__dict__.setdefault('_generated_content',[]).extend(C)
-
-    def _aSpaceString(self):
-        return '(%s x %s%s)' % (self._getAvailableWidth(),self._aH,self._atTop and '*' or '')
diff --git a/reportlab/platypus/para.py b/reportlab/platypus/para.py
deleted file mode 100644
index 898ff8a3..00000000
--- a/reportlab/platypus/para.py
+++ /dev/null
@@ -1,2366 +0,0 @@
-"""new experimental paragraph implementation
-
-Intended to allow support for paragraphs in paragraphs, hotlinks,
-embedded flowables, and underlining.  The main entry point is the
-function
-
-def Paragraph(text, style, bulletText=None, frags=None)
-
-Which is intended to be plug compatible with the "usual" platypus
-paragraph except that it supports more functionality.
-
-In this implementation you may embed paragraphs inside paragraphs
-to create hierarchically organized documents.
-
-This implementation adds the following paragraph-like tags (which
-support the same attributes as paragraphs, for font specification, etc).
-
-- Unnumberred lists (ala html)::
-
-    
    -
  • first one
  • -
  • second one
  • -
- - -Also
    (default) or
      ,
        . - -- Numberred lists (ala html):: - -
          -
        1. first one
        2. -
        3. second one
        4. -
        - -Also
          (default) or
            ,
              . - -- Display lists (ala HTML): - -For example - -
              -
              frogs
              Little green slimy things. Delicious with garlic
              -
              kittens
              cute, furry, not edible
              -
              bunnies
              cute, furry,. Delicious with garlic
              -
              - -ALSO the following additional internal paragraph markup tags are supported - -underlined text - -hyperlinked text -hyperlinked text - -Go to the end (go to document internal destination) -Go to the beginning - -This is the document start - (define document destination inside paragraph, color is optional) - -""" -from reportlab.pdfbase.pdfmetrics import stringWidth -from reportlab.lib.rl_accel import fp_str -from reportlab.platypus.flowables import Flowable -from reportlab.lib import colors -from reportlab.lib.styles import _baseFontName - -# SET THIS TO CAUSE A VIEWING BUG WITH ACROREAD 3 (for at least one input) -# CAUSEERROR = 0 - -debug = 0 - -DUMPPROGRAM = 0 - -TOOSMALLSPACE = 1e-5 - -from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_RIGHT, TA_JUSTIFY - -# indent changes effect the next line -# align changes effect the current line - -# need to fix spacing questions... if ends with space then space may be inserted - -# NEGATIVE SPACE SHOULD NEVER BE EXPANDED (IN JUSTIFICATION, EG) - -class paragraphEngine: - # text origin of 0,0 is upper left corner - def __init__(self, program = None): - from reportlab.lib.colors import black - if program is None: - program = [] - self.lineOpHandlers = [] # for handling underlining and hyperlinking, etc - self.program = program - self.indent = self.rightIndent = 0.0 - self.baseindent = 0.0 # adjust this to add more indentation for bullets, eg - self.fontName = "Helvetica" - self.fontSize = 10 - self.leading = 12 - self.fontColor = black - self.x = self.y = self.rise = 0.0 - from reportlab.lib.enums import TA_LEFT - self.alignment = TA_LEFT - self.textStateStack = [] - - TEXT_STATE_VARIABLES = ("indent", "rightIndent", "fontName", "fontSize", - "leading", "fontColor", "lineOpHandlers", "rise", - "alignment") - #"textStateStack") - - def pushTextState(self): - state = [] - for var in self.TEXT_STATE_VARIABLES: - val = getattr(self, var) - state.append(val) - #self.textStateStack.append(state) - self.textStateStack = self.textStateStack+[state] # fresh copy - #print "push", self.textStateStack - #print "push", len(self.textStateStack), state - return state - - def popTextState(self): - state = self.textStateStack[-1] - self.textStateStack = self.textStateStack[:-1] - #print "pop", self.textStateStack - state = state[:] # copy for destruction - #print "pop", len(self.textStateStack), state - #print "handlers before", self.lineOpHandlers - for var in self.TEXT_STATE_VARIABLES: - val = state[0] - del state[0] - setattr(self, var, val) - - def format(self, maxwidth, maxheight, program, leading=0): - "return program with line operations added if at least one line fits" - # note: a generated formatted segment should not be formatted again - startstate = self.__dict__.copy() - #remainder = self.cleanProgram(program) - remainder = program[:] - #program1 = remainder[:] # debug only - lineprogram = [] - #if maxheight=self.leading and remainder: - #print "getting line with statestack", len(self.textStateStack) - #heightremaining = heightremaining - self.leading - indent = self.indent - rightIndent = self.rightIndent - linewidth = maxwidth - indent - rightIndent - beforelinestate = self.__dict__.copy() - if linewidthleading: - heightremaining = heightremaining-leading - else: - room = 0 - #self.resetState(beforelinestate) - self.__dict__.update(beforelinestate) - break # no room for this line -## if debug: -## print "line", line -## if lineIsFull: print "is full" -## else: print "is partially full" -## print "consumes", cursor, "elements" -## print "covers", currentLength, "of", maxwidth - alignment = self.alignment # last declared alignment for this line used - # recompute linewidth using the used indent - #linewidth = maxwidth - usedIndent - rightIndent - remainder = remainder[cursor:] - if not remainder: - # trim off the extra end of line - del line[-1] - # do justification if any - #line = self.shrinkWrap(line - if alignment==TA_LEFT: - #if debug: - # print "ALIGN LEFT" - if justStrings: - line = stringLine(line, currentLength) - else: - line = self.shrinkWrap(line) - pass - elif alignment==TA_CENTER: - #if debug: - # print "ALIGN CENTER" - if justStrings: - line = stringLine(line, currentLength) - else: - line = self.shrinkWrap(line) - line = self.centerAlign(line, currentLength, maxLength) - elif alignment==TA_RIGHT: - #if debug: - # print "ALIGN RIGHT" - if justStrings: - line = stringLine(line, currentLength) - else: - line = self.shrinkWrap(line) - line = self.rightAlign(line, currentLength, maxLength) - elif alignment==TA_JUSTIFY: - #if debug: - # print "JUSTIFY" - if remainder and lineIsFull: - if justStrings: - line = simpleJustifyAlign(line, currentLength, maxLength) - else: - line = self.justifyAlign(line, currentLength, maxLength) - else: - if justStrings: - line = stringLine(line, currentLength) - else: - line = self.shrinkWrap(line) - if debug: - print("no justify because line is not full or end of para") - else: - raise ValueError("bad alignment "+repr(alignment)) - if not justStrings: - line = self.cleanProgram(line) - lineprogram.extend(line) - laststate = self.__dict__.copy() - #self.resetState(startstate) - self.__dict__.update(startstate) - heightused = maxheight - heightremaining - return (lineprogram, remainder, laststate, heightused) - - def getState(self): - # inlined - return self.__dict__.copy() - - def resetState(self, state): - # primarily inlined - self.__dict__.update(state) - -## def sizeOfWord(self, word): -## inlineThisFunctionForEfficiency -## return float(stringWidth(word, self.fontName, self.fontSize)) - - def fitLine(self, program, totalLength): - "fit words (and other things) onto a line" - # assuming word lengths and spaces have not been yet added - # fit words onto a line up to maxlength, adding spaces and respecting extra space - from reportlab.pdfbase.pdfmetrics import stringWidth - usedIndent = self.indent - maxLength = totalLength - usedIndent - self.rightIndent - done = 0 - line = [] - cursor = 0 - lineIsFull = 0 - currentLength = 0 - maxcursor = len(program) - needspace = 0 - first = 1 - terminated = None - fontName = self.fontName - fontSize = self.fontSize - spacewidth = stringWidth(" ", fontName, fontSize) #self.sizeOfWord(" ") - justStrings = 1 - while not done and cursormaxLength and not first: # always do at least one thing - # this word won't fit - #if debug: - # print "WORD", opcode, "wont fit, width", width, "fullwidth", fullwidth - # print " currentLength", currentLength, "newlength", newlength, "maxLength", maxLength - done = 1 - lineIsFull = 1 - else: - # fit the word: add a space then the word - if lastneedspace: - line.append( spacewidth ) # expandable space: positive - if opcode: - line.append( opcode ) - if abs(width)>TOOSMALLSPACE: - line.append( -width ) # non expanding space: negative - currentLength = newlength - #print line - #stop - first = 0 - elif isinstance(opcode,float): - justStrings = 0 - aopcode = abs(opcode) # negative means non expanding - if aopcode>TOOSMALLSPACE: - nextLength = currentLength+aopcode - if nextLength>maxLength and not first: # always do at least one thing - #if debug: print "EXPLICIT spacer won't fit", maxLength, nextLength, opcode - done = 1 - else: - if aopcode>TOOSMALLSPACE: - currentLength = nextLength - line.append(opcode) - first = 0 - elif isinstance(opcode,tuple): - justStrings = 0 - indicator = opcode[0] - #line.append(opcode) - if indicator=="nextLine": - # advance to nextLine - #(i, endallmarks) = opcode - line.append(opcode) - cursor = cursor+1 # consume this element - terminated = done = 1 - #if debug: - # print "nextLine encountered" - elif indicator=="color": - # change fill color - oldcolor = self.fontColor - (i, colorname) = opcode - #print "opcode", opcode - if isinstance(colorname,str): - color = self.fontColor = getattr(colors, colorname) - else: - color = self.fontColor = colorname # assume its something sensible :) - line.append(opcode) - elif indicator=="face": - # change font face - (i, fontname) = opcode - fontName = self.fontName = fontname - spacewidth = stringWidth(" ", fontName, fontSize) #self.sizeOfWord(" ") - line.append(opcode) - elif indicator=="size": - # change font size - (i, fontsize) = opcode - size = abs(float(fontsize)) - if isinstance(fontsize,str): - if fontsize[:1]=="+": - fontSize = self.fontSize = self.fontSize + size - elif fontsize[:1]=="-": - fontSize = self.fontSize = self.fontSize - size - else: - fontSize = self.fontSize = size - else: - fontSize = self.fontSize = size - spacewidth = stringWidth(" ", fontName, fontSize) #self.sizeOfWord(" ") - line.append(opcode) - elif indicator=="leading": - # change font leading - (i, leading) = opcode - self.leading = leading - line.append(opcode) - elif indicator=="indent": - # increase the indent - (i, increment) = opcode - indent = self.indent = self.indent + increment - if first: - usedIndent = max(indent, usedIndent) - maxLength = totalLength - usedIndent - self.rightIndent - line.append(opcode) - elif indicator=="push": - self.pushTextState() - line.append(opcode) - elif indicator=="pop": - try: - self.popTextState() - except: -## print "stack fault near", cursor -## for i in program[max(0, cursor-10):cursor+10]: -## if i==cursor: -## print "***>>>", -## print i - raise - fontName = self.fontName - fontSize = self.fontSize - spacewidth = stringWidth(" ", fontName, fontSize) #self.sizeOfWord(" ") - line.append(opcode) - elif indicator=="bullet": - (i, bullet, indent, font, size) = opcode - # adjust for base indent (only at format time -- only execute once) - indent = indent + self.baseindent - opcode = (i, bullet, indent, font, size) - if not first: - raise ValueError("bullet not at beginning of line") - bulletwidth = float(stringWidth(bullet, font, size)) - spacewidth = float(stringWidth(" ", font, size)) - bulletmin = indent+spacewidth+bulletwidth - # decrease the line size to allow bullet - usedIndent = max(bulletmin, usedIndent) - if first: - maxLength = totalLength - usedIndent - self.rightIndent - line.append(opcode) - elif indicator=="rightIndent": - # increase the right indent - (i, increment) = opcode - self.rightIndent = self.rightIndent+increment - if first: - maxLength = totalLength - usedIndent - self.rightIndent - line.append(opcode) - elif indicator=="rise": - (i, rise) = opcode - newrise = self.rise = self.rise+rise - line.append(opcode) - elif indicator=="align": - (i, alignment) = opcode - #if debug: - # print "SETTING ALIGNMENT", alignment - self.alignment = alignment - line.append(opcode) - elif indicator=="lineOperation": - (i, handler) = opcode - line.append(opcode) - self.lineOpHandlers = self.lineOpHandlers + [handler] # fresh copy - elif indicator=="endLineOperation": - (i, handler) = opcode - h = self.lineOpHandlers[:] # fresh copy - h.remove(handler) - self.lineOpHandlers = h - line.append(opcode) - - else: - raise ValueError("at format time don't understand indicator "+repr(indicator)) - else: - raise ValueError("op must be string, float, instance, or tuple "+repr(opcode)) - if not done: - cursor = cursor+1 - #first = 0 -## if debug: -## if done: -## print "DONE FLAG IS SET" -## if cursor>=maxcursor: -## print "AT END OF PROGRAM" - if not terminated: - line.append( ("nextLine", 0) ) - #print "fitline", line - return (lineIsFull, line, cursor, currentLength, usedIndent, maxLength, justStrings) - - def centerAlign(self, line, lineLength, maxLength): - diff = maxLength-lineLength - shift = diff/2.0 - if shift>TOOSMALLSPACE: - return self.insertShift(line, shift) - return line - - def rightAlign(self, line, lineLength, maxLength): - shift = maxLength-lineLength - #die - if shift>TOOSMALLSPACE: - return self.insertShift(line, shift) - return line - - def insertShift(self, line, shift): - # insert shift just before first visible element in line - result = [] - first = 1 - for e in line: - if first and (isinstance(e,str) or hasattr(e,'width')): - result.append(shift) - first = 0 - result.append(e) - return result - - def justifyAlign(self, line, lineLength, maxLength): - diff = maxLength-lineLength - # count EXPANDABLE SPACES AFTER THE FIRST VISIBLE - spacecount = 0 - visible = 0 - for e in line: - if isinstance(e,float) and e>TOOSMALLSPACE and visible: - spacecount = spacecount+1 - elif first and (isinstance(e,str) or hasattr(e,'width')): - visible = 1 - #if debug: print "diff is", diff, "wordcount", wordcount #; die - if spacecount<1: - return line - shift = diff/float(spacecount) - if shift<=TOOSMALLSPACE: - #if debug: print "shift too small", shift - return line - first = 1 - visible = 0 - result = [] - cursor = 0 - nline = len(line) - while cursorTOOSMALLSPACE and visible: - expanded = e+shift - result[-1] = expanded - cursor = cursor+1 - return result - -## if not first: -## #if debug: print "shifting", shift, e -## #result.append(shift) -## # add the shift in result before any start markers before e -## insertplace = len(result)-1 -## done = 0 -## myshift = shift -## while insertplace>0 and not done: -## beforeplace = insertplace-1 -## beforething = result[beforeplace] -## if isinstance(beforething,tuple): -## indicator = beforething[0] -## if indicator=="endLineOperation": -## done = 1 -## elif debug: -## print "adding shift before", beforething -## elif isinstance(beforething,float): -## myshift = myshift + beforething -## del result[beforeplace] -## else: -## done = 1 -## if not done: -## insertplace = beforeplace -## result.insert(insertplace, myshift) -## first = 0 -## cursor = cursor+1 -## return result - - def shrinkWrap(self, line): - # for non justified text, collapse adjacent text/shift's into single operations - result = [] - index = 0 - maxindex = len(line) - while index0: - thefloats = -thefloats - if nexte<0 and thefloats>0: - nexte = -nexte - thefloats = thefloats + nexte - elif isinstance(nexte,str): - thestrings.append(nexte) - index = index+1 - if index0: - last = -last - if e<0 and last>0: - e = -e - last = float(last)+e - else: - if abs(last)>TOOSMALLSPACE: - result.append(last) - result.append(e) - last = 0 - if last: - result.append(last) - # now go backwards and delete all floats occurring after all visible elements -## count = len(result)-1 -## done = 0 -## while count>0 and not done: -## e = result[count] -## if hasattr(e,'width') or isinstance(e,str): -## done = 1 -## elif isinstance(e,float): -## del result[count] -## count = count-1 - # move end operations left and start operations left up to visibles - change = 1 - rline = list(range(len(result)-1)) - while change: - #print line - change = 0 - for index in rline: - nextindex = index+1 - this = result[index] - next = result[nextindex] - doswap = 0 - # don't swap visibles - if isinstance(this,str) or \ - isinstance(next,str) or \ - hasattr(this,'width') or hasattr(next,'width'): - doswap = 0 - # only swap two tuples if the second one is an end operation and the first is something else - elif isinstance(this,tuple): - thisindicator = this[0] - if isinstance(next,tuple): - nextindicator = next[0] - doswap = 0 - if (nextindicator=="endLineOperation" and thisindicator!="endLineOperation" - and thisindicator!="lineOperation"): - doswap = 1 # swap nonend!=end - elif isinstance(next,float): - if thisindicator=="lineOperation": - doswap = 1 # begin != space - if doswap: - #print "swap", line[index],line[nextindex] - result[index] = next - result[nextindex] = this - change = 1 - return result - - def runOpCodes(self, program, canvas, textobject): - "render the line(s)" - - escape = canvas._escape - code = textobject._code - startstate = self.__dict__.copy() - font = None - size = None - # be sure to set them before using them (done lazily below) - #textobject.setFont(self.fontName, self.fontSize) - textobject.setFillColor(self.fontColor) - xstart = self.x - thislineindent = self.indent - thislinerightIndent = self.rightIndent - indented = 0 - for opcode in program: - if isinstance(opcode,str) or hasattr(opcode,'width'): - if not indented: - if abs(thislineindent)>TOOSMALLSPACE: - #if debug: print "INDENTING", thislineindent - #textobject.moveCursor(thislineindent, 0) - code.append('%s Td' % fp_str(thislineindent, 0)) - self.x = self.x + thislineindent - for handler in self.lineOpHandlers: - #handler.end_at(x, y, self, canvas, textobject) # finish, eg, underlining this line - handler.start_at(self.x, self.y, self, canvas, textobject) # start underlining the next - indented = 1 - # lazily set font (don't do it again if not needed) - if font!=self.fontName or size!=self.fontSize: - font = self.fontName - size = self.fontSize - textobject.setFont(font, size) - if isinstance(opcode,str): - textobject.textOut(opcode) - else: - # drawable thing - opcode.execute(self, textobject, canvas) - elif isinstance(opcode,float): - # use abs value (ignore expandable marking) - opcode = abs(opcode) - if opcode>TOOSMALLSPACE: - #textobject.moveCursor(opcode, 0) - code.append('%s Td' % fp_str(opcode, 0)) - self.x = self.x + opcode - elif isinstance(opcode,tuple): - indicator = opcode[0] - if indicator=="nextLine": - # advance to nextLine - (i, endallmarks) = opcode - x = self.x - y = self.y - newy = self.y = self.y-self.leading - newx = self.x = xstart - thislineindent = self.indent - thislinerightIndent = self.rightIndent - indented = 0 - for handler in self.lineOpHandlers: - handler.end_at(x, y, self, canvas, textobject) # finish, eg, underlining this line - #handler.start_at(newx, newy, self, canvas, textobject)) # start underlining the next - textobject.setTextOrigin(newx, newy) - elif indicator=="color": - # change fill color - oldcolor = self.fontColor - (i, colorname) = opcode - #print "opcode", opcode - if isinstance(colorname,str): - color = self.fontColor = getattr(colors, colorname) - else: - color = self.fontColor = colorname # assume its something sensible :) - #if debug: - # print color.red, color.green, color.blue - # print dir(color) - #print "color is", color - #from reportlab.lib.colors import green - #if color is green: print "color is green" - if color!=oldcolor: - textobject.setFillColor(color) - elif indicator=="face": - # change font face - (i, fontname) = opcode - self.fontName = fontname - #textobject.setFont(self.fontName, self.fontSize) - elif indicator=="size": - # change font size - (i, fontsize) = opcode - size = abs(float(fontsize)) - if isinstance(fontsize,str): - if fontsize[:1]=="+": - fontSize = self.fontSize = self.fontSize + size - elif fontsize[:1]=="-": - fontSize = self.fontSize = self.fontSize - size - else: - fontSize = self.fontSize = size - else: - fontSize = self.fontSize = size - #(i, fontsize) = opcode - self.fontSize = fontSize - textobject.setFont(self.fontName, self.fontSize) - elif indicator=="leading": - # change font leading - (i, leading) = opcode - self.leading = leading - elif indicator=="indent": - # increase the indent - (i, increment) = opcode - indent = self.indent = self.indent + increment - thislineindent = max(thislineindent, indent) - elif indicator=="push": - self.pushTextState() - elif indicator=="pop": - oldcolor = self.fontColor - oldfont = self.fontName - oldsize = self.fontSize - self.popTextState() - #if CAUSEERROR or oldfont!=self.fontName or oldsize!=self.fontSize: - # textobject.setFont(self.fontName, self.fontSize) - if oldcolor!=self.fontColor: - textobject.setFillColor(self.fontColor) - elif indicator=="wordSpacing": - (i, ws) = opcode - textobject.setWordSpace(ws) - elif indicator=="bullet": - (i, bullet, indent, font, size) = opcode - if abs(self.x-xstart)>TOOSMALLSPACE: - raise ValueError("bullet not at beginning of line") - bulletwidth = float(stringWidth(bullet, font, size)) - spacewidth = float(stringWidth(" ", font, size)) - bulletmin = indent+spacewidth+bulletwidth - # decrease the line size to allow bullet as needed - if bulletmin > thislineindent: - #if debug: print "BULLET IS BIG", bullet, bulletmin, thislineindent - thislineindent = bulletmin - textobject.moveCursor(indent, 0) - textobject.setFont(font, size) - textobject.textOut(bullet) - textobject.moveCursor(-indent, 0) - #textobject.textOut("M") - textobject.setFont(self.fontName, self.fontSize) - elif indicator=="rightIndent": - # increase the right indent - (i, increment) = opcode - self.rightIndent = self.rightIndent+increment - elif indicator=="rise": - (i, rise) = opcode - newrise = self.rise = self.rise+rise - textobject.setRise(newrise) - elif indicator=="align": - (i, alignment) = opcode - self.alignment = alignment - elif indicator=="lineOperation": - (i, handler) = opcode - handler.start_at(self.x, self.y, self, canvas, textobject) - #self.lineOpHandlers.append(handler) - #if debug: print "adding", handler, self.lineOpHandlers - self.lineOpHandlers = self.lineOpHandlers + [handler] # fresh copy! - elif indicator=="endLineOperation": - (i, handler) = opcode - handler.end_at(self.x, self.y, self, canvas, textobject) - newh = self.lineOpHandlers = self.lineOpHandlers[:] # fresh copy - #if debug: print "removing", handler, self.lineOpHandlers - if handler in newh: - self.lineOpHandlers.remove(handler) - else: - pass - #print "WARNING: HANDLER", handler, "NOT IN", newh - else: - raise ValueError("don't understand indicator "+repr(indicator)) - else: - raise ValueError("op must be string float or tuple "+repr(opcode)) - laststate = self.__dict__.copy() - #self.resetState(startstate) - self.__dict__.update(startstate) - return laststate - -def stringLine(line, length): - "simple case: line with just strings and spacings which can be ignored" - - strings = [] - for x in line: - if isinstance(x,str): - strings.append(x) - text = ' '.join(strings) - result = [text, float(length)] - nextlinemark = ("nextLine", 0) - if line and line[-1]==nextlinemark: - result.append( nextlinemark ) - return result - -def simpleJustifyAlign(line, currentLength, maxLength): - "simple justification with only strings" - - strings = [] - for x in line[:-1]: - if isinstance(x,str): - strings.append(x) - nspaces = len(strings)-1 - slack = maxLength-currentLength - text = ' '.join(strings) - if nspaces>0 and slack>0: - wordspacing = slack/float(nspaces) - result = [("wordSpacing", wordspacing), text, maxLength, ("wordSpacing", 0)] - else: - result = [text, currentLength, ("nextLine", 0)] - nextlinemark = ("nextLine", 0) - if line and line[-1]==nextlinemark: - result.append( nextlinemark ) - return result - -from reportlab.lib.colors import black - -def readBool(text): - if text.upper() in ("Y", "YES", "TRUE", "1"): - return 1 - elif text.upper() in ("N", "NO", "FALSE", "0"): - return 0 - else: - raise ValueError("true/false attribute has illegal value '%s'" % text) - -def readAlignment(text): - up = text.upper() - if up == 'LEFT': - return TA_LEFT - elif up == 'RIGHT': - return TA_RIGHT - elif up in ['CENTER', 'CENTRE']: - return TA_CENTER - elif up == 'JUSTIFY': - return TA_JUSTIFY - -def readLength(text): - """Read a dimension measurement: accept "3in", "5cm", - "72 pt" and so on.""" - text = text.strip() - try: - return float(text) - except ValueError: - text = text.lower() - numberText, units = text[:-2],text[-2:] - numberText = numberText.strip() - try: - number = float(numberText) - except ValueError: - raise ValueError("invalid length attribute '%s'" % text) - try: - multiplier = { - 'in':72, - 'cm':28.3464566929, #72/2.54; is this accurate? - 'mm':2.83464566929, - 'pt':1 - }[units] - except KeyError: - raise ValueError("invalid length attribute '%s'" % text) - - return number * multiplier - -def lengthSequence(s, converter=readLength): - """from "(2, 1)" or "2,1" return [2,1], for example""" - s = s.strip() - if s[:1]=="(" and s[-1:]==")": - s = s[1:-1] - sl = s.split(',') - sl = [s.strip() for s in sl] - sl = [converter(s) for s in sl] - return sl - - -def readColor(text): - """Read color names or tuples, RGB or CMYK, and return a Color object.""" - if not text: - return None - from reportlab.lib import colors - from string import letters - if text[0] in letters: - return colors.__dict__[text] - tup = lengthSequence(text) - - msg = "Color tuple must have 3 (or 4) elements for RGB (or CMYC)." - assert 3 <= len(tup) <= 4, msg - msg = "Color tuple must have all elements <= 1.0." - for i in range(len(tup)): - assert tup[i] <= 1.0, msg - - if len(tup) == 3: - colClass = colors.Color - elif len(tup) == 4: - colClass = colors.CMYKColor - return colClass(*tup) - -class StyleAttributeConverters: - fontSize=[readLength] - leading=[readLength] - leftIndent=[readLength] - rightIndent=[readLength] - firstLineIndent=[readLength] - alignment=[readAlignment] - spaceBefore=[readLength] - spaceAfter=[readLength] - bulletFontSize=[readLength] - bulletIndent=[readLength] - textColor=[readColor] - backColor=[readColor] - -class SimpleStyle: - "simplified paragraph style without all the fancy stuff" - name = "basic" - fontName=_baseFontName - fontSize=10 - leading=12 - leftIndent=0 - rightIndent=0 - firstLineIndent=0 - alignment=TA_LEFT - spaceBefore=0 - spaceAfter=0 - bulletFontName=_baseFontName - bulletFontSize=10 - bulletIndent=0 - textColor=black - backColor=None - - def __init__(self, name, parent=None, **kw): - mydict = self.__dict__ - if parent: - for a,b in parent.__dict__.items(): - mydict[a]=b - for a,b in kw.items(): - mydict[a] = b - - def addAttributes(self, dictionary): - for key in dictionary.keys(): - value = dictionary[key] - if value is not None: - if hasattr(StyleAttributeConverters, key): - converter = getattr(StyleAttributeConverters, key)[0] - value = converter(value) - setattr(self, key, value) - - -DEFAULT_ALIASES = { - "h1.defaultStyle": "Heading1", - "h2.defaultStyle": "Heading2", - "h3.defaultStyle": "Heading3", - "h4.defaultStyle": "Heading4", - "h5.defaultStyle": "Heading5", - "h6.defaultStyle": "Heading6", - "title.defaultStyle": "Title", - "subtitle.defaultStyle": "SubTitle", - "para.defaultStyle": "Normal", - "pre.defaultStyle": "Code", - "ul.defaultStyle": "UnorderedList", - "ol.defaultStyle": "OrderedList", - "li.defaultStyle": "Definition", - } - -class FastPara(Flowable): - "paragraph with no special features (not even a single ampersand!)" - - def __init__(self, style, simpletext): - #if debug: - # print "FAST", id(self) - if "&" in simpletext: - raise ValueError("no ampersands please!") - self.style = style - self.simpletext = simpletext - self.lines = None - - def wrap(self, availableWidth, availableHeight): - simpletext = self.simpletext - self.availableWidth = availableWidth - style = self.style - text = self.simpletext - rightIndent = style.rightIndent - leftIndent = style.leftIndent - leading = style.leading - font = style.fontName - size = style.fontSize - firstindent = style.firstLineIndent - #textcolor = style.textColor - words = simpletext.split() - lines = [] - from reportlab.pdfbase.pdfmetrics import stringWidth - spacewidth = stringWidth(" ", font, size) - currentline = [] - currentlength = 0 - firstmaxlength = availableWidth - rightIndent - firstindent - maxlength = availableWidth - rightIndent - leftIndent - if maxlengthavailableHeight: - done = 1 - if currentlength and not done: - lines.append( (' '.join(currentline), currentlength, len(currentline) )) - heightused = heightused+leading - self.lines = lines - self.height = heightused - remainder = self.remainder = ' '.join(words[cursor:]) - #print "lines", lines - #print "remainder is", remainder - else: - remainder = None - heightused = self.height - lines = self.lines - if remainder: - result = (availableWidth, availableHeight+leading) # need to split - else: - result = (availableWidth, heightused) - #if debug: print "wrap is", (availableWidth, availableHeight), result, len(lines) - return result - - def split(self, availableWidth, availableHeight): - style = self.style - leading = style.leading - if availableHeight1: - # patch from doug@pennatus.com, 9 Nov 2002, no extraspace on last line - textobject.setWordSpace((basicWidth-length)/(nwords-1.0)) - else: - textobject.setWordSpace(0.0) - textobject.setTextOrigin(x,y) - textobject.textOut(text) - y = y-leading - c.drawText(textobject) - - def getSpaceBefore(self): - #if debug: - # print "got space before", self.spaceBefore - return self.style.spaceBefore - - def getSpaceAfter(self): - #print "got space after", self.spaceAfter - return self.style.spaceAfter - -def defaultContext(): - result = {} - from reportlab.lib.styles import getSampleStyleSheet - styles = getSampleStyleSheet() - for stylenamekey, stylenamevalue in DEFAULT_ALIASES.items(): - result[stylenamekey] = styles[stylenamevalue] - return result - -def buildContext(stylesheet=None): - result = {} - from reportlab.lib.styles import getSampleStyleSheet - if stylesheet is not None: - # Copy styles with the same name as aliases - for stylenamekey, stylenamevalue in DEFAULT_ALIASES.items(): - if stylenamekey in stylesheet: - result[stylenamekey] = stylesheet[stylenamekey] - # Then make aliases - for stylenamekey, stylenamevalue in DEFAULT_ALIASES.items(): - if stylenamevalue in stylesheet: - result[stylenamekey] = stylesheet[stylenamevalue] - - styles = getSampleStyleSheet() - # Then, fill in defaults if they were not filled yet. - for stylenamekey, stylenamevalue in DEFAULT_ALIASES.items(): - if stylenamekey not in result and stylenamevalue in styles: - result[stylenamekey] = styles[stylenamevalue] - return result - -class Para(Flowable): - - spaceBefore = 0 - spaceAfter = 0 - - def __init__(self, style, parsedText=None, bulletText=None, state=None, context=None, baseindent=0): - #print id(self), "para", parsedText - self.baseindent = baseindent - self.context = buildContext(context) - self.parsedText = parsedText - self.bulletText = bulletText - self.style1 = style # make sure Flowable doesn't use this unless wanted! call it style1 NOT style - #self.spaceBefore = self.spaceAfter = 0 - self.program = [] # program before layout - self.formattedProgram = [] # after layout - self.remainder = None # follow on paragraph if any - self.state = state # initial formatting state (for completions) - if not state: - self.spaceBefore = style.spaceBefore - self.spaceAfter = style.spaceAfter - #self.spaceBefore = "invalid value" - #if hasattr(self, "spaceBefore") and debug: - # print "spaceBefore is", self.spaceBefore, self.parsedText - self.bold = 0 - self.italic = 0 - self.face = style.fontName - self.size = style.fontSize - - def getSpaceBefore(self): - #if debug: - # print "got space before", self.spaceBefore - return self.spaceBefore - - def getSpaceAfter(self): - #print "got space after", self.spaceAfter - return self.spaceAfter - - def wrap(self, availableWidth, availableHeight): - if debug: - print("WRAPPING", id(self), availableWidth, availableHeight) - print(" ", self.formattedProgram) - print(" ", self.program) - self.availableHeight = availableHeight - self.myengine = p = paragraphEngine() - p.baseindent = self.baseindent # for shifting bullets as needed - parsedText = self.parsedText - formattedProgram = self.formattedProgram - state = self.state - if state: - leading = state["leading"] - else: - leading = self.style1.leading - program = self.program - self.cansplit = 1 # until proven otherwise - if state: - p.resetState(state) - p.x = 0 - p.y = 0 - needatleast = state["leading"] - else: - needatleast = self.style1.leading - if availableHeight<=needatleast: - self.cansplit = 0 - #if debug: - # print "CANNOT COMPILE, NEED AT LEAST", needatleast, 'AVAILABLE', availableHeight - return (availableHeight+1, availableWidth) # cannot split - if parsedText is None and program is None: - raise ValueError("need parsedText for formatting") - if not program: - self.program = program = self.compileProgram(parsedText) - if not self.formattedProgram: - (formattedProgram, remainder, \ - laststate, heightused) = p.format(availableWidth, availableHeight, program, leading) - self.formattedProgram = formattedProgram - self.height = heightused - self.laststate = laststate - self.remainderProgram = remainder - else: - heightused = self.height - remainder = None - # too big if there is a remainder - if remainder: - # lie about the height: it must be split anyway - #if debug: - # print "I need to split", self.formattedProgram - # print "heightused", heightused, "available", availableHeight, "remainder", len(remainder) - height = availableHeight + 1 - #print "laststate is", laststate - #print "saving remainder", remainder - self.remainder = Para(self.style1, parsedText=None, bulletText=None, \ - state=laststate, context=self.context) - self.remainder.program = remainder - self.remainder.spaceAfter = self.spaceAfter - self.spaceAfter = 0 - else: - self.remainder = None # no extra - height = heightused - if height>availableHeight: - height = availableHeight-0.1 - #if debug: - # print "giving height", height, "of", availableHeight, self.parsedText - result = (availableWidth, height) - if debug: - (w, h) = result - if abs(availableHeight-h)<0.2: - print("exact match???" + repr(availableHeight, h)) - print("wrap is", (availableWidth, availableHeight), result) - return result - - def split(self, availableWidth, availableHeight): - #if debug: - # print "SPLITTING", id(self), availableWidth, availableHeight - if availableHeight<=0 or not self.cansplit: - #if debug: - # print "cannot split", availableWidth, "too small" - return [] # wrap failed to find a split - self.availableHeight = availableHeight - formattedProgram = self.formattedProgram - #print "formattedProgram is", formattedProgram - if formattedProgram is None: - raise ValueError("must call wrap before split") - elif not formattedProgram: - # no first line in self: fail to split - return [] - remainder = self.remainder - if remainder: - #print "SPLITTING" - result= [self, remainder] - else: - result= [self] - #if debug: print "split is", result - return result - - def draw(self): - p = self.myengine #paragraphEngine() - formattedProgram = self.formattedProgram - if formattedProgram is None: - raise ValueError("must call wrap before draw") - state = self.state - laststate = self.laststate - if state: - p.resetState(state) - p.x = 0 - p.y = 0 - c = self.canv - #if debug: - # print id(self), "page number", c.getPageNumber() - height = self.height - if state: - leading = state["leading"] - else: - leading = self.style1.leading - #if debug: - # c.rect(0,0,-1, height-self.size, fill=1, stroke=1) - c.translate(0, height-self.size) - t = c.beginText() - #t.setTextOrigin(0,0) - if DUMPPROGRAM or debug: - print("="*44, "now running program") - for x in formattedProgram: - print(x) - print("-"*44) - laststate = p.runOpCodes(formattedProgram, c, t) - #print laststate["x"], laststate["y"] - c.drawText(t) - - def compileProgram(self, parsedText, program=None): - style = self.style1 - # standard parameters - #program = self.program - if program is None: - program = [] - a = program.append - fn = style.fontName - # add style information if there was no initial state - a( ("face", fn ) ) - from reportlab.lib.fonts import ps2tt - (self.face, self.bold, self.italic) = ps2tt(fn) - a( ("size", style.fontSize ) ) - self.size = style.fontSize - a( ("align", style.alignment ) ) - a( ("indent", style.leftIndent ) ) - if style.firstLineIndent: - a( ("indent", style.firstLineIndent ) ) # must be undone later - a( ("rightIndent", style.rightIndent ) ) - a( ("leading", style.leading) ) - if style.textColor: - a( ("color", style.textColor) ) - #a( ("nextLine", 0) ) # clear for next line - if self.bulletText: - self.do_bullet(self.bulletText, program) - self.compileComponent(parsedText, program) - # now look for a place where to insert the unindent after the first line - if style.firstLineIndent: - count = 0 - for x in program: - count = count+1 - if isinstance(x,str) or hasattr(x,'width'): - break - program.insert( count, ("indent", -style.firstLineIndent ) ) # defaults to end if no visibles - #print "="*8, id(self), "program is" - #for x in program: - # print x -## print "="*11 -## # check pushes and pops -## stackcount = 0 -## dump = 0 -## for x in program: -## if dump: -## print "dump:", x -## if isinstance(x,tuple): -## i = x[0] -## if i=="push": -## stackcount = stackcount+1 -## print " "*stackcount, "push", stackcount -## if i=="pop": -## stackcount = stackcount-1 -## print " "*stackcount, "pop", stackcount -## if stackcount<0: -## dump=1 -## print "STACK UNDERFLOW!" -## if dump: stop - return program - - def linearize(self, program = None, parsedText=None): - #print "LINEARIZING", self - #program = self.program = [] - if parsedText is None: - parsedText = self.parsedText - style = self.style1 - if program is None: - program = [] - program.append( ("push",) ) - if style.spaceBefore: - program.append( ("leading", style.spaceBefore+style.leading) ) - else: - program.append( ("leading", style.leading) ) - program.append( ("nextLine", 0) ) - program = self.compileProgram(parsedText, program=program) - program.append( ("pop",) ) - # go to old margin - program.append( ("push",) ) - if style.spaceAfter: - program.append( ("leading", style.spaceAfter) ) - else: - program.append( ("leading", 0) ) - program.append( ("nextLine", 0) ) - program.append( ("pop",) ) - - def compileComponent(self, parsedText, program): - #program = self.program - if isinstance(parsedText,str): - # handle special characters here... - # short cut - if parsedText: - stext = parsedText.strip() - if not stext: - program.append(" ") # contract whitespace to single space - else: - handleSpecialCharacters(self, parsedText, program) - elif isinstance(parsedText,list): - for e in parsedText: - self.compileComponent(e, program) - elif isinstance(parsedText,tuple): - (tagname, attdict, content, extra) = parsedText - if not attdict: - attdict = {} - compilername = "compile_"+tagname - compiler = getattr(self, compilername, None) - if compiler is not None: - compiler(attdict, content, extra, program) - else: - # just pass the tag through - if debug: - L = [ "<" + tagname ] - a = L.append - if not attdict: attdict = {} - for k, v in attdict.items(): - a(" %s=%s" % (k,v)) - if content: - a(">") - a(str(content)) - a("" % tagname) - else: - a("/>") - t = ''.join(L) - handleSpecialCharacters(self, t, program) - else: - raise ValueError("don't know how to handle tag " + repr(tagname)) - - def shiftfont(self, program, face=None, bold=None, italic=None): - oldface = self.face - oldbold = self.bold - olditalic = self.italic - oldfontinfo = (oldface, oldbold, olditalic) - if face is None: face = oldface - if bold is None: bold = oldbold - if italic is None: italic = olditalic - self.face = face - self.bold = bold - self.italic = italic - from reportlab.lib.fonts import tt2ps - font = tt2ps(face,bold,italic) - oldfont = tt2ps(oldface,oldbold,olditalic) - if font!=oldfont: - program.append( ("face", font ) ) - return oldfontinfo - - def compile_(self, attdict, content, extra, program): - # "anonymous" tag: just do the content - for e in content: - self.compileComponent(e, program) - #compile_para = compile_ # at least for now... - - def compile_pageNumber(self, attdict, content, extra, program): - program.append(PageNumberObject()) - - def compile_b(self, attdict, content, extra, program): - (f,b,i) = self.shiftfont(program, bold=1) - for e in content: - self.compileComponent(e, program) - self.shiftfont(program, bold=b) - - def compile_i(self, attdict, content, extra, program): - (f,b,i) = self.shiftfont(program, italic=1) - for e in content: - self.compileComponent(e, program) - self.shiftfont(program, italic=i) - - def compile_u(self, attdict, content, extra, program): - # XXXX must eventually add things like alternative colors - #program = self.program - program.append( ('lineOperation', UNDERLINE) ) - for e in content: - self.compileComponent(e, program) - program.append( ('endLineOperation', UNDERLINE) ) - - def compile_sub(self, attdict, content, extra, program): - size = self.size - self.size = newsize = size * 0.7 - rise = size*0.5 - #program = self.program - program.append( ('size', newsize) ) - self.size = size - program.append( ('rise', -rise) ) - for e in content: - self.compileComponent(e, program) - program.append( ('size', size) ) - program.append( ('rise', rise) ) - - def compile_ul(self, attdict, content, extra, program, tagname="ul"): - # by transformation - #print "compile", tagname, attdict - atts = attdict.copy() - bulletmaker = bulletMaker(tagname, atts, self.context) - # now do each element as a separate paragraph - for e in content: - if isinstance(e,str): - if e.strip(): - raise ValueError("don't expect CDATA between list elements") - elif isinstance(e,tuple): - (tagname, attdict1, content1, extra) = e - if tagname!="li": - raise ValueError("don't expect %s inside list" % repr(tagname)) - newatts = atts.copy() - if attdict1: - newatts.update(attdict1) - bulletmaker.makeBullet(newatts) - self.compile_para(newatts, content1, extra, program) - - def compile_ol(self, attdict, content, extra, program): - return self.compile_ul(attdict, content, extra, program, tagname="ol") - - def compile_dl(self, attdict, content, extra, program): - # by transformation - #print "compile", tagname, attdict - atts = attdict.copy() - # by transformation - #print "compile", tagname, attdict - atts = attdict.copy() - bulletmaker = bulletMaker("dl", atts, self.context) - # now do each element as a separate paragraph - contentcopy = list(content) # copy for destruction - bullet = "" - while contentcopy: - e = contentcopy[0] - del contentcopy[0] - if isinstance(e,str): - if e.strip(): - raise ValueError("don't expect CDATA between list elements") - elif not contentcopy: - break # done at ending whitespace - else: - continue # ignore intermediate whitespace - elif isinstance(e,tuple): - (tagname, attdict1, content1, extra) = e - if tagname!="dd" and tagname!="dt": - raise ValueError("don't expect %s here inside list, expect 'dd' or 'dt'" % \ - repr(tagname)) - if tagname=="dt": - if bullet: - raise ValueError("dt will not be displayed unless followed by a dd: "+repr(bullet)) - if content1: - self.compile_para(attdict1, content1, extra, program) - # raise ValueError, \ - # "only simple strings supported in dd content currently: "+repr(content1) - elif tagname=="dd": - newatts = atts.copy() - if attdict1: - newatts.update(attdict1) - bulletmaker.makeBullet(newatts, bl=bullet) - self.compile_para(newatts, content1, extra, program) - bullet = "" # don't use this bullet again - if bullet: - raise ValueError("dt will not be displayed unless followed by a dd"+repr(bullet)) - - def compile_super(self, attdict, content, extra, program): - size = self.size - self.size = newsize = size * 0.7 - rise = size*0.5 - #program = self.program - program.append( ('size', newsize) ) - program.append( ('rise', rise) ) - for e in content: - self.compileComponent(e, program) - program.append( ('size', size) ) - self.size = size - program.append( ('rise', -rise) ) - - def compile_font(self, attdict, content, extra, program): - #program = self.program - program.append( ("push",) ) # store current data - if "face" in attdict: - face = attdict["face"] - from reportlab.lib.fonts import tt2ps - try: - font = tt2ps(face,self.bold,self.italic) - except: - font = face # better work! - program.append( ("face", font ) ) - if "color" in attdict: - colorname = attdict["color"] - program.append( ("color", colorname) ) - if "size" in attdict: - #size = float(attdict["size"]) # really should convert int, cm etc here! - size = attdict["size"] - program.append( ("size", size) ) - for e in content: - self.compileComponent(e, program) - program.append( ("pop",) ) # restore as before - - def compile_a(self, attdict, content, extra, program): - url = attdict["href"] - colorname = attdict.get("color", "blue") - #program = self.program - Link = HotLink(url) - program.append( ("push",) ) # store current data - program.append( ("color", colorname) ) - program.append( ('lineOperation', Link) ) - program.append( ('lineOperation', UNDERLINE) ) - for e in content: - self.compileComponent(e, program) - program.append( ('endLineOperation', UNDERLINE) ) - program.append( ('endLineOperation', Link) ) - program.append( ("pop",) ) # restore as before - - def compile_link(self, attdict, content, extra, program): - dest = attdict["destination"] - colorname = attdict.get("color", None) - #program = self.program - Link = InternalLink(dest) - program.append( ("push",) ) # store current data - if colorname: - program.append( ("color", colorname) ) - program.append( ('lineOperation', Link) ) - program.append( ('lineOperation', UNDERLINE) ) - for e in content: - self.compileComponent(e, program) - program.append( ('endLineOperation', UNDERLINE) ) - program.append( ('endLineOperation', Link) ) - program.append( ("pop",) ) # restore as before - - def compile_setLink(self, attdict, content, extra, program): - dest = attdict["destination"] - colorname = attdict.get("color", "blue") - #program = self.program - Link = DefDestination(dest) - program.append( ("push",) ) # store current data - if colorname: - program.append( ("color", colorname) ) - program.append( ('lineOperation', Link) ) - if colorname: - program.append( ('lineOperation', UNDERLINE) ) - for e in content: - self.compileComponent(e, program) - if colorname: - program.append( ('endLineOperation', UNDERLINE) ) - program.append( ('endLineOperation', Link) ) - program.append( ("pop",) ) # restore as before - - #def compile_p(self, attdict, content, extra, program): - # # have to be careful about base indent here! - # not finished - - def compile_bullet(self, attdict, content, extra, program): - ### eventually should allow things like images and graphics in bullets too XXXX - if len(content)!=1 or not isinstance(content[0],str): - raise ValueError("content for bullet must be a single string") - text = content[0] - self.do_bullet(text, program) - - def do_bullet(self, text, program): - style = self.style1 - #program = self.program - indent = style.bulletIndent + self.baseindent - font = style.bulletFontName - size = style.bulletFontSize - program.append( ("bullet", text, indent, font, size) ) - - def compile_tt(self, attdict, content, extra, program): - (f,b,i) = self.shiftfont(program, face="Courier") - for e in content: - self.compileComponent(e, program) - self.shiftfont(program, face=f) - - def compile_greek(self, attdict, content, extra, program): - self.compile_font({"face": "symbol"}, content, extra, program) - - def compile_evalString(self, attdict, content, extra, program): - program.append( EvalStringObject(attdict, content, extra, self.context) ) - - def compile_name(self, attdict, content, extra, program): - program.append( NameObject(attdict, content, extra, self.context) ) - - def compile_getName(self, attdict, content, extra, program): - program.append( GetNameObject(attdict, content, extra, self.context) ) - - def compile_seq(self, attdict, content, extra, program): - program.append( SeqObject(attdict, content, extra, self.context) ) - - def compile_seqReset(self, attdict, content, extra, program): - program.append( SeqResetObject(attdict, content, extra, self.context) ) - - def compile_seqDefault(self, attdict, content, extra, program): - program.append( SeqDefaultObject(attdict, content, extra, self.context) ) - - def compile_para(self, attdict, content, extra, program, stylename = "para.defaultStyle"): - if attdict is None: - attdict = {} - context = self.context - stylename = attdict.get("style", stylename) - style = context[stylename] - newstyle = SimpleStyle(name="rml2pdf internal embedded style", parent=style) - newstyle.addAttributes(attdict) - bulletText = attdict.get("bulletText", None) - mystyle = self.style1 - thepara = Para(newstyle, content, context=context, bulletText=bulletText) - # possible ref loop on context, break later - # now compile it and add it to the program - mybaseindent = self.baseindent - self.baseindent = thepara.baseindent = mystyle.leftIndent + self.baseindent - thepara.linearize(program=program) - program.append( ("nextLine", 0) ) - self.baseindent = mybaseindent - -class bulletMaker: - def __init__(self, tagname, atts, context): - self.tagname = tagname - #print "context is", context - style = "li.defaultStyle" - self.style = style = atts.get("style", style) - typ = {"ul": "disc", "ol": "1", "dl": None}[tagname] - #print tagname, "bulletmaker type is", typ - self.typ =typ = atts.get("type", typ) - #print tagname, "bulletmaker type is", typ - if "leftIndent" not in atts: - # get the style so you can choose an indent length - thestyle = context[style] - from reportlab.pdfbase.pdfmetrics import stringWidth - size = thestyle.fontSize - indent = stringWidth("XXX", "Courier", size) - atts["leftIndent"] = str(indent) - self.count = 0 - self._first = 1 - - def makeBullet(self, atts, bl=None): - if not self._first: - # forget space before for non-first elements - atts["spaceBefore"] = "0" - else: - self._first = 0 - typ = self.typ - tagname = self.tagname - if bl is None: - if tagname=="ul": - if typ=="disc": bl = chr(109) - elif typ=="circle": bl = chr(108) - elif typ=="square": bl = chr(110) - else: - raise ValueError("unordered list type %s not implemented" % repr(typ)) - if "bulletFontName" not in atts: - atts["bulletFontName"] = "ZapfDingbats" - elif tagname=="ol": - if 'value' in atts: - self.count = int(atts['value']) - else: - self.count += 1 - if typ=="1": bl = str(self.count) - elif typ=="a": - theord = ord("a")+self.count-1 - bl = chr(theord) - elif typ=="A": - theord = ord("A")+self.count-1 - bl = chr(theord) - else: - raise ValueError("ordered bullet type %s not implemented" % repr(typ)) - else: - raise ValueError("bad tagname "+repr(tagname)) - if "bulletText" not in atts: - atts["bulletText"] = bl - if "style" not in atts: - atts["style"] = self.style - -class EvalStringObject: - "this will only work if rml2pdf is present" - - tagname = "evalString" - - def __init__(self, attdict, content, extra, context): - if not attdict: - attdict = {} - self.attdict = attdict - self.content = content - self.context = context - self.extra = extra - - def getOp(self, tuple, engine): - from rlextra.rml2pdf.rml2pdf import Controller - #print "tuple", tuple - op = self.op = Controller.processTuple(tuple, self.context, {}) - return op - - def width(self, engine): - from reportlab.pdfbase.pdfmetrics import stringWidth - content = self.content - if not content: - content = [] - tuple = (self.tagname, self.attdict, content, self.extra) - op = self.op = self.getOp(tuple, engine) - #print op.__class__ - #print op.pcontent - #print self - s = str(op) - return stringWidth(s, engine.fontName, engine.fontSize) - - def execute(self, engine, textobject, canvas): - textobject.textOut(str(self.op)) - -class SeqObject(EvalStringObject): - - def getOp(self, tuple, engine): - from reportlab.lib.sequencer import getSequencer - globalsequencer = getSequencer() - attr = self.attdict - #if it has a template, use that; otherwise try for id; - #otherwise take default sequence - if 'template' in attr: - templ = attr['template'] - op = self.op = templ % globalsequencer - return op - elif 'id' in attr: - id = attr['id'] - else: - id = None - op = self.op = globalsequencer.nextf(id) - return op - -class NameObject(EvalStringObject): - tagname = "name" - def execute(self, engine, textobject, canvas): - pass # name doesn't produce any output - -class SeqDefaultObject(NameObject): - - def getOp(self, tuple, engine): - from reportlab.lib.sequencer import getSequencer - globalsequencer = getSequencer() - attr = self.attdict - try: - default = attr['id'] - except KeyError: - default = None - globalsequencer.setDefaultCounter(default) - self.op = "" - return "" - -class SeqResetObject(NameObject): - - def getOp(self, tuple, engine): - from reportlab.lib.sequencer import getSequencer - globalsequencer = getSequencer() - attr = self.attdict - try: - id = attr['id'] - except KeyError: - id = None - try: - base = int(attr['base']) - except: - base=0 - globalsequencer.reset(id, base) - self.op = "" - return "" - -class GetNameObject(EvalStringObject): - tagname = "getName" - -class PageNumberObject: - - def __init__(self, example="XXX"): - self.example = example # XXX SHOULD ADD THE ABILITY TO PASS IN EXAMPLES - - def width(self, engine): - from reportlab.pdfbase.pdfmetrics import stringWidth - return stringWidth(self.example, engine.fontName, engine.fontSize) - - def execute(self, engine, textobject, canvas): - n = canvas.getPageNumber() - textobject.textOut(str(n)) - -### this should be moved into rml2pdf -def EmbedInRml2pdf(): - "make the para the default para implementation in rml2pdf" - from rlextra.rml2pdf.rml2pdf import MapNode, Controller # may not need to use superclass? - global paraMapper, theParaMapper, ulMapper - - class paraMapper(MapNode): - #stylename = "para.defaultStyle" - def translate(self, nodetuple, controller, context, overrides): - (tagname, attdict, content, extra) = nodetuple - stylename = tagname+".defaultStyle" - stylename = attdict.get("style", stylename) - style = context[stylename] - mystyle = SimpleStyle(name="rml2pdf internal style", parent=style) - mystyle.addAttributes(attdict) - bulletText = attdict.get("bulletText", None) - # can we use the fast implementation? - result = None - if not bulletText and len(content)==1: - text = content[0] - if isinstance(text,str) and "&" not in text: - result = FastPara(mystyle, text) - if result is None: - result = Para(mystyle, content, context=context, bulletText=bulletText) # possible ref loop on context, break later - return result - - theParaMapper = paraMapper() - - class ulMapper(MapNode): - # wrap in a default para and let the para do it - def translate(self, nodetuple, controller, context, overrides): - thepara = ("para", {}, [nodetuple], None) - return theParaMapper.translate(thepara, controller, context, overrides) - - # override rml2pdf interpreters (should be moved to rml2pdf) - theListMapper = ulMapper() - Controller["ul"] = theListMapper - Controller["ol"] = theListMapper - Controller["dl"] = theListMapper - Controller["para"] = theParaMapper - Controller["h1"] = theParaMapper - Controller["h2"] = theParaMapper - Controller["h3"] = theParaMapper - Controller["title"] = theParaMapper - -def handleSpecialCharacters(engine, text, program=None): - from reportlab.platypus.paraparser import greeks - from string import whitespace - standard={'lt':'<', 'gt':'>', 'amp':'&'} - # add space prefix if space here - if text[0:1] in whitespace: - program.append(" ") - #print "handling", repr(text) - # shortcut - if 0 and "&" not in text: - result = [] - for x in text.split(): - result.append(x+" ") - if result: - last = result[-1] - if text[-1:] not in whitespace: - result[-1] = last.strip() - program.extend(result) - return program - if program is None: - program = [] - amptext = text.split("&") - first = 1 - lastfrag = amptext[-1] - for fragment in amptext: - if not first: - # check for special chars - semi = fragment.find(";") - if semi>0: - name = fragment[:semi] - if name[0]=='#': - try: - if name[1] == 'x': - n = int(name[2:], 16) - else: - n = int(name[1:]) - except ValueError: - n = -1 - if n>=0: - fragment = chr(n).encode('utf8')+fragment[semi+1:] - else: - fragment = "&"+fragment - elif name in standard: - s = standard[name] - if isinstance(fragment,str): - s = s.decode('utf8') - fragment = s+fragment[semi+1:] - elif name in greeks: - s = greeks[name] - if isinstance(fragment,str): - s = s.decode('utf8') - fragment = s+fragment[semi+1:] - else: - # add back the & - fragment = "&"+fragment - else: - # add back the & - fragment = "&"+fragment - # add white separated components of fragment followed by space - sfragment = fragment.split() - for w in sfragment[:-1]: - program.append(w+" ") - # does the last one need a space? - if sfragment and fragment: - # reader 3 used to go nuts if you don't special case the last frag, but it's fixed? - if fragment[-1] in whitespace: # or fragment==lastfrag: - program.append( sfragment[-1]+" " ) - else: - last = sfragment[-1].strip() - if last: - #print "last is", repr(last) - program.append( last ) - first = 0 - #print "HANDLED", program - return program - -def Paragraph(text, style, bulletText=None, frags=None, context=None): - """ Paragraph(text, style, bulletText=None) - intended to be like a platypus Paragraph but better. - """ - # if there is no & or < in text then use the fast paragraph - if "&" not in text and "<" not in text: - return FastPara(style, simpletext=text) - else: - # use the fully featured one. - from reportlab.lib import rparsexml - parsedpara = rparsexml.parsexmlSimple(text,entityReplacer=None) - return Para(style, parsedText=parsedpara, bulletText=bulletText, state=None, context=context) - -class UnderLineHandler: - def __init__(self, color=None): - self.color = color - def start_at(self, x,y, para, canvas, textobject): - self.xStart = x - self.yStart = y - def end_at(self, x, y, para, canvas, textobject): - offset = para.fontSize/8.0 - canvas.saveState() - color = self.color - if self.color is None: - color = para.fontColor - canvas.setStrokeColor(color) - canvas.line(self.xStart, self.yStart-offset, x,y-offset) - canvas.restoreState() - -UNDERLINE = UnderLineHandler() - -class HotLink(UnderLineHandler): - - def __init__(self, url): - self.url = url - - def end_at(self, x, y, para, canvas, textobject): - fontsize = para.fontSize - rect = [self.xStart, self.yStart, x,y+fontsize] - if debug: - print("LINKING RECTANGLE", rect) - #canvas.rect(self.xStart, self.yStart, x-self.xStart,y+fontsize-self.yStart, stroke=1) - self.link(rect, canvas) - - def link(self, rect, canvas): - canvas.linkURL(self.url, rect, relative=1) - -class InternalLink(HotLink): - - def link(self, rect, canvas): - destinationname = self.url - contents = "" - canvas.linkRect(contents, destinationname, rect, Border="[0 0 0]") - -class DefDestination(HotLink): - - defined = 0 - - def link(self, rect, canvas): - destinationname = self.url - if not self.defined: - [x, y, x1, y1] = rect - canvas.bookmarkHorizontal(destinationname, x, y1) # use the upper y - self.defined = 1 - -def splitspace(text): - # split on spacing but include spaces at element ends - stext = text.split() - result = [] - for e in stext: - result.append(e+" ") - return result - - -testparagraph = """ -This is Text. -This is bold text. -This is Text. -This is italic text. - -
                -
              • this is an element at 1 -more text and even more text and on and on and so forth -more text and even more text and on and on and so forth -more text and even more text and on and on and so forth -more text and even more text and on and on and so forth -more text and even more text and on and on and so forth -more text monospaced and back to normal - -
                  -
                • this is an element at 2 - -more text and even more text and on and on and so forth -more text and even more text and on and on and so forth - -
                    -
                  • this is an element at 3 - -more text and even more text and on and on and so forth - - -
                    -
                    frogs
                    Little green slimy things. Delicious with garlic
                    -
                    kittens
                    cute, furry, not edible
                    -
                    bunnies
                    cute, furry,. Delicious with garlic
                    -
                    - -more text and even more text and on and on and so forth - -
                      -
                    • this is an element at 4 -more text and even more text and on and on and so forth -
                    • -
                    • this is an element at4 -more text and even more text and on and on and so forth -
                    • -
                    -more text and even more text and on and on and so forth -more text and even more text and on and on and so forth - -
                  • -
                  -more text and even more text and on and on and so forth -more text and even more text and on and on and so forth -
                • -
                -UNDERLINED more text and even more text and on and on and so forth -more text and even more text and on and on and so forth - -
                  -
                1. first element of the alpha list - -
                    -
                  • first element of the square unnumberred list
                  • - -
                  • second element of the unnumberred list
                  • - -
                  • third element of the unnumberred list - third element of the unnumberred list - third element of the unnumberred list - third element of the unnumberred list - third element of the unnumberred list - third element of the unnumberred list - third element of the unnumberred list -
                  • - -
                  • fourth element of the unnumberred list
                  • - -
                  - -
                2. - -
                3. second element of the alpha list
                4. - -
                5. third element of the alpha list - third element of the unnumberred list &#33; --> ! - third element of the unnumberred list &#8704; --> ∀ - third element of the unnumberred list &exist; --> ∃ - third element of the unnumberred list - third element of the unnumberred list - third element of the unnumberred list -
                6. - -
                7. fourth element of the alpha list
                8. - -
                - - -
              • -
              -""" - -testparagraph1 = """ -goto www.reportlab.com. - - - -Red letter. thisisareallylongword andsoisthis andthisislonger -justified text paragraph example with a pound sign \xc2\xa3 -justified text paragraph example -justified text paragraph example - - - -Green letter. -centered text paragraph example -centered text paragraph example -centered text paragraph example - - -Blue letter. -right justified text paragraph example -right justified text paragraph example -right justified text paragraph example - - -Yellow letter. -left justified text paragraph example -left justified text paragraph example -left justified text paragraph example - - -""" - -def test2(canv,testpara): - #print test_program; return - from reportlab.lib.units import inch - from reportlab.lib.styles import ParagraphStyle - from reportlab.lib import rparsexml - parsedpara = rparsexml.parsexmlSimple(testpara,entityReplacer=None) - S = ParagraphStyle("Normal", None) - P = Para(S, parsedpara) - (w, h) = P.wrap(5*inch, 10*inch) - print("wrapped as", (h,w)) - canv.saveState() - canv.translate(1*inch, 1*inch) - canv.rect(0,0,5*inch,10*inch, fill=0, stroke=1) - P.canv = canv - canv.saveState() - P.draw() - canv.restoreState() - canv.setStrokeColorRGB(1, 0, 0) - #canv.translate(0, 3*inch) - canv.rect(0,0,w,h, fill=0, stroke=1) - canv.restoreState() - canv.showPage() - -testlink = HotLink("http://www.reportlab.com") - -test_program = [ - ('push',), - ('indent', 100), - ('rightIndent', 200), - ('bullet', 'very long bullet', 50, 'Courier', 14), - ('align', TA_CENTER), - ('face', _baseFontName), - ('size', 12), - ('leading', 14), - ] + splitspace("This is the first segment of the first paragraph.") + [ - ('lineOperation', testlink), - ]+splitspace("HOTLINK This is the first segment of the first paragraph. This is the first segment of the first paragraph. This is the first segment of the first paragraph. This is the first segment of the first paragraph. ") + [ - ('endLineOperation', testlink), - ('nextLine', 0), - ('align', TA_LEFT), - ('bullet', 'Bullet', 10, 'Courier', 8), - ('face', _baseFontName), - ('size', 12), - ('leading', 14), - ] + splitspace("This is the SECOND!!! segment of the first paragraph. This is the first segment of the first paragraph. This is the first segment of the first paragraph. This is the first segment of the first paragraph. This is the first segment of the first paragraph. ") + [ - ('nextLine', 0), - ('align', TA_JUSTIFY), - ('bullet', 'Bullet not quite as long this time', 50, 'Courier', 8), - ('face', "Helvetica-Oblique"), - ('size', 12), - ('leading', 14), - ('push',), - ('color', 'red'), - ] + splitspace("This is the THIRD!!! segment of the first paragraph." - ) + [ - ('lineOperation', UNDERLINE), - ] + splitspace("This is the first segment of the first paragraph. This is the first segment of the first paragraph. This is the first segment of the first paragraph. This is the first segment of the first paragraph. ") + [ - ('endLineOperation', UNDERLINE), - ('rise', 5), - "raised ", "text ", - ('rise', -10), - "lowered ", "text ", - ('rise', 5), - "normal ", "text ", - ('pop',), - ('indent', 100), - ('rightIndent', 50), - ('nextLine', 0), - ('align', TA_RIGHT), - ('bullet', 'O', 50, 'Courier', 14), - ('face', "Helvetica"), - ('size', 12), - ('leading', 14), - ] + splitspace("And this is the remainder of the paragraph indented further. a a a a a a a a And this is the remainder of the paragraph indented further. a a a a a a a a And this is the remainder of the paragraph indented further. a a a a a a a a And this is the remainder of the paragraph indented further. a a a a a a a a And this is the remainder of the paragraph indented further. a a a a a a a a And this is the remainder of the paragraph indented further. a a a a a a a a And this is the remainder of the paragraph indented further. a a a a a a a a ") + [ - ('pop',), - ('nextLine', 0),] - -def test(): - from pprint import pprint - #print test_program; return - from reportlab.pdfgen import canvas - from reportlab.lib.units import inch - fn = "paratest0.pdf" - c = canvas.Canvas(fn) - test2(c,testparagraph) - test2(c,testparagraph1) - if 1: - remainder = test_program + test_program + test_program - laststate = {} - while remainder: - print("NEW PAGE") - c.translate(inch, 8*inch) - t = c.beginText() - t.setTextOrigin(0,0) - p = paragraphEngine() - p.resetState(laststate) - p.x = 0 - p.y = 0 - maxwidth = 7*inch - maxheight = 500 - (formattedprogram, remainder, laststate, height) = p.format(maxwidth, maxheight, remainder) - if debug: - pprint( formattedprogram )#; return - laststate = p.runOpCodes(formattedprogram, c, t) - c.drawText(t) - c.showPage() - print("="*30, "x=", laststate["x"], "y=", laststate["y"]) - c.save() - print(fn) - -if __name__=="__main__": - test() diff --git a/reportlab/platypus/paragraph.py b/reportlab/platypus/paragraph.py deleted file mode 100644 index b5ad704b..00000000 --- a/reportlab/platypus/paragraph.py +++ /dev/null @@ -1,1957 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/platypus/paragraph.py -__version__=''' $Id$ ''' -__doc__='''The standard paragraph implementation''' -from string import whitespace -from operator import truth -from unicodedata import category -from reportlab.pdfbase.pdfmetrics import stringWidth, getFont, getAscentDescent -from reportlab.platypus.paraparser import ParaParser -from reportlab.platypus.flowables import Flowable -from reportlab.lib.colors import Color -from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY -from reportlab.lib.geomutils import normalizeTRBL -from reportlab.lib.textsplit import wordSplit, ALL_CANNOT_START -from copy import deepcopy -from reportlab.lib.abag import ABag -from reportlab.rl_config import platypus_link_underline, decimalSymbol, _FUZZ, paraFontSizeHeightOffset -from reportlab.lib.utils import _className, isBytes, unicodeT, bytesT, strTypes -from reportlab.lib.rl_accel import sameFrag -import re -from types import MethodType - -#on UTF8/py33 branch, split and strip must be unicode-safe! -#thanks to Dirk Holtwick for helpful discussions/insight -#on this one -_wsc = ''.join(( - u'\u0009', # HORIZONTAL TABULATION - u'\u000A', # LINE FEED - u'\u000B', # VERTICAL TABULATION - u'\u000C', # FORM FEED - u'\u000D', # CARRIAGE RETURN - u'\u001C', # FILE SEPARATOR - u'\u001D', # GROUP SEPARATOR - u'\u001E', # RECORD SEPARATOR - u'\u001F', # UNIT SEPARATOR - u'\u0020', # SPACE - u'\u0085', # NEXT LINE - #u'\u00A0', # NO-BREAK SPACE - u'\u1680', # OGHAM SPACE MARK - u'\u2000', # EN QUAD - u'\u2001', # EM QUAD - u'\u2002', # EN SPACE - u'\u2003', # EM SPACE - u'\u2004', # THREE-PER-EM SPACE - u'\u2005', # FOUR-PER-EM SPACE - u'\u2006', # SIX-PER-EM SPACE - u'\u2007', # FIGURE SPACE - u'\u2008', # PUNCTUATION SPACE - u'\u2009', # THIN SPACE - u'\u200A', # HAIR SPACE - u'\u200B', # ZERO WIDTH SPACE - u'\u2028', # LINE SEPARATOR - u'\u2029', # PARAGRAPH SEPARATOR - u'\u202F', # NARROW NO-BREAK SPACE - u'\u205F', # MEDIUM MATHEMATICAL SPACE - u'\u3000', # IDEOGRAPHIC SPACE - )) -_wsc_re_split=re.compile('[%s]+'% re.escape(_wsc)).split -_wsc_end_search=re.compile('[%s]+$'% re.escape(_wsc)).search - -def split(text, delim=None): - if isBytes(text): text = text.decode('utf8') - if delim is not None and isBytes(delim): delim = delim.decode('utf8') - return [uword for uword in (_wsc_re_split(text) if delim is None and u'\xa0' in text else text.split(delim))] - -def strip(text): - if isBytes(text): text = text.decode('utf8') - return text.strip(_wsc) - -class ParaLines(ABag): - """ - class ParaLines contains the broken into lines representation of Paragraphs - kind=0 Simple - fontName, fontSize, textColor apply to whole Paragraph - lines [(extraSpace1,words1),....,(extraspaceN,wordsN)] - - kind==1 Complex - lines [FragLine1,...,FragLineN] - """ - -class FragLine(ABag): - """ - class FragLine contains a styled line (ie a line with more than one style):: - - extraSpace unused space for justification only - wordCount 1+spaces in line for justification purposes - words [ParaFrags] style text lumps to be concatenated together - fontSize maximum fontSize seen on the line; not used at present, - but could be used for line spacing. - """ - -def _lineClean(L): - return ' '.join(list(filter(truth,split(strip(L))))) - -def cleanBlockQuotedText(text,joiner=' '): - """This is an internal utility which takes triple- - quoted text form within the document and returns - (hopefully) the paragraph the user intended originally.""" - L=list(filter(truth,list(map(_lineClean, split(text, '\n'))))) - return joiner.join(L) - -def setXPos(tx,dx): - if dx>1e-6 or dx<-1e-6: - tx.setXPos(dx) - -def _leftDrawParaLine( tx, offset, extraspace, words, last=0): - setXPos(tx,offset) - tx._textOut(' '.join(words),1) - setXPos(tx,-offset) - return offset - -def _centerDrawParaLine( tx, offset, extraspace, words, last=0): - m = offset + 0.5 * extraspace - setXPos(tx,m) - tx._textOut(' '.join(words),1) - setXPos(tx,-m) - return m - -def _rightDrawParaLine( tx, offset, extraspace, words, last=0): - m = offset + extraspace - setXPos(tx,m) - tx._textOut(' '.join(words),1) - setXPos(tx,-m) - return m - -def _nbspCount(w): - if isBytes(w): - return w.count(b'\xc2\xa0') - else: - return w.count(u'\xa0') - -def _justifyDrawParaLine( tx, offset, extraspace, words, last=0): - setXPos(tx,offset) - text = ' '.join(words) - if last or extraspace<=1e-8: - #last one, left align - tx._textOut(text,1) - else: - nSpaces = len(words)+sum([_nbspCount(w) for w in words])-1 - if nSpaces: - tx.setWordSpace(extraspace / float(nSpaces)) - tx._textOut(text,1) - tx.setWordSpace(0) - else: - tx._textOut(text,1) - setXPos(tx,-offset) - return offset - -def imgVRange(h,va,fontSize): - '''return bottom,top offsets relative to baseline(0)''' - if va=='baseline': - iyo = 0 - elif va in ('text-top','top'): - iyo = fontSize-h - elif va=='middle': - iyo = fontSize - (1.2*fontSize+h)*0.5 - elif va in ('text-bottom','bottom'): - iyo = fontSize - 1.2*fontSize - elif va=='super': - iyo = 0.5*fontSize - elif va=='sub': - iyo = -0.5*fontSize - elif hasattr(va,'normalizedValue'): - iyo = va.normalizedValue(fontSize) - else: - iyo = va - return iyo,iyo+h - -def imgNormV(v,nv): - if hasattr(v,'normalizedValue'): - return v.normalizedValue(nv) - else: - return v - -def _getDotsInfo(style): - dots = style.endDots - if isinstance(dots,str): - text = dots - fontName = style.fontName - fontSize = style.fontSize - textColor = style.textColor - backColor = style.backColor - dy = 0 - else: - text = getattr(dots,'text','.') - fontName = getattr(dots,'fontName',style.fontName) - fontSize = getattr(dots,'fontSize',style.fontSize) - textColor = getattr(dots,'textColor',style.textColor) - backColor = getattr(dots,'backColor',style.backColor) - dy = getattr(dots,'dy',0) - return text,fontName,fontSize,textColor,backColor,dy - -_56=5./6 -_16=1./6 -def _putFragLine(cur_x, tx, line, last, pKind): - xs = tx.XtraState - cur_y = xs.cur_y - x0 = tx._x0 - autoLeading = xs.autoLeading - leading = xs.leading - cur_x += xs.leftIndent - dal = autoLeading in ('min','max') - if dal: - if autoLeading=='max': - ascent = max(_56*leading,line.ascent) - descent = max(_16*leading,-line.descent) - else: - ascent = line.ascent - descent = -line.descent - leading = ascent+descent - if tx._leading!=leading: - tx.setLeading(leading) - if dal: - olb = tx._olb - if olb is not None: - xcy = olb-ascent - if tx._oleading!=leading: - cur_y += leading - tx._oleading - if abs(xcy-cur_y)>1e-8: - cur_y = xcy - tx.setTextOrigin(x0,cur_y) - xs.cur_y = cur_y - tx._olb = cur_y - descent - tx._oleading = leading - ws = getattr(tx,'_wordSpace',0) - nSpaces = 0 - words = line.words - for i, f in enumerate(words): - if hasattr(f,'cbDefn'): - cbDefn = f.cbDefn - kind = cbDefn.kind - if kind=='img': - #draw image cbDefn,cur_y,cur_x - txfs = tx._fontsize - if txfs is None: - txfs = xs.style.fontSize - w = imgNormV(cbDefn.width,None) - h = imgNormV(cbDefn.height,txfs) - iy0,iy1 = imgVRange(h,cbDefn.valign,txfs) - cur_x_s = cur_x + nSpaces*ws - tx._canvas.drawImage(cbDefn.image,cur_x_s,cur_y+iy0,w,h,mask='auto') - cur_x += w - cur_x_s += w - setXPos(tx,cur_x_s-tx._x0) - else: - name = cbDefn.name - if kind=='anchor': - tx._canvas.bookmarkHorizontal(name,cur_x,cur_y+leading) - else: - func = getattr(tx._canvas,name,None) - if not func: - raise AttributeError("Missing %s callback attribute '%s'" % (kind,name)) - tx._canvas._curr_tx_info=dict(tx=tx,cur_x=cur_x,cur_y=cur_y,leading=leading,xs=tx.XtraState) - try: - func(tx._canvas,kind,cbDefn.label) - finally: - del tx._canvas._curr_tx_info - if f is words[-1]: - if not tx._fontname: - tx.setFont(xs.style.fontName,xs.style.fontSize) - tx._textOut('',1) - else: - cur_x_s = cur_x + nSpaces*ws - end_x = cur_x_s - if i > 0: - end_x = cur_x_s - _trailingSpaceLength(words[i-1].text, tx) - if (tx._fontname,tx._fontsize)!=(f.fontName,f.fontSize): - tx._setFont(f.fontName, f.fontSize) - if xs.textColor!=f.textColor: - xs.textColor = f.textColor - tx.setFillColor(f.textColor) - if xs.rise!=f.rise: - xs.rise=f.rise - tx.setRise(f.rise) - text = f.text - tx._textOut(text,f is words[-1]) # cheap textOut - if not xs.underline and f.underline: - xs.underline = 1 - xs.underline_x = cur_x_s - xs.underlineColor = f.textColor - elif xs.underline: - if not f.underline: - xs.underline = 0 - xs.underlines.append( (xs.underline_x, end_x, xs.underlineColor) ) - xs.underlineColor = None - elif xs.textColor!=xs.underlineColor: - xs.underlines.append( (xs.underline_x, end_x, xs.underlineColor) ) - xs.underlineColor = xs.textColor - xs.underline_x = cur_x_s - if not xs.strike and f.strike: - xs.strike = 1 - xs.strike_x = cur_x_s - xs.strikeColor = f.textColor - elif xs.strike: - if not f.strike: - xs.strike = 0 - xs.strikes.append( (xs.strike_x, end_x, xs.strikeColor) ) - xs.strikeColor = None - elif xs.textColor!=xs.strikeColor: - xs.strikes.append( (xs.strike_x, end_x, xs.strikeColor) ) - xs.strikeColor = xs.textColor - xs.strike_x = cur_x_s - if f.link and not xs.link: - if not xs.link: - xs.link = f.link - xs.link_x = cur_x_s - xs.linkColor = xs.textColor - elif xs.link: - if not f.link: - xs.links.append( (xs.link_x, end_x, xs.link, xs.linkColor) ) - xs.link = None - xs.linkColor = None - elif f.link!=xs.link or xs.textColor!=xs.linkColor: - xs.links.append( (xs.link_x, end_x, xs.link, xs.linkColor) ) - xs.link = f.link - xs.link_x = cur_x_s - xs.linkColor = xs.textColor - bg = getattr(f,'backColor',None) - if bg and not xs.backColor: - xs.backColor = bg - xs.backColor_x = cur_x_s - elif xs.backColor: - if not bg: - xs.backColors.append( (xs.backColor_x, end_x, xs.backColor) ) - xs.backColor = None - elif f.backColor!=xs.backColor or xs.textColor!=xs.backColor: - xs.backColors.append( (xs.backColor_x, end_x, xs.backColor) ) - xs.backColor = bg - xs.backColor_x = cur_x_s - txtlen = tx._canvas.stringWidth(text, tx._fontname, tx._fontsize) - cur_x += txtlen - nSpaces += text.count(' ')+_nbspCount(text) - cur_x_s = cur_x+(nSpaces-1)*ws - if last and pKind!='right' and xs.style.endDots: - _do_dots_frag(cur_x,cur_x_s,line.maxWidth,xs,tx) - if xs.underline: - xs.underlines.append( (xs.underline_x, cur_x_s, xs.underlineColor) ) - if xs.strike: - xs.strikes.append( (xs.strike_x, cur_x_s, xs.strikeColor) ) - if xs.link: - xs.links.append( (xs.link_x, cur_x_s, xs.link,xs.linkColor) ) - if xs.backColor: - xs.backColors.append( (xs.backColor_x, cur_x_s, xs.backColor) ) - if tx._x0!=x0: - setXPos(tx,x0-tx._x0) - -def _do_dots_frag(cur_x, cur_x_s, maxWidth, xs, tx): - text,fontName,fontSize,textColor,backColor,dy = _getDotsInfo(xs.style) - txtlen = tx._canvas.stringWidth(text, fontName, fontSize) - if cur_x_s+txtlen<=maxWidth: - if tx._fontname!=fontName or tx._fontsize!=fontSize: - tx.setFont(fontName,fontSize) - maxWidth += getattr(tx,'_dotsOffsetX',tx._x0) - tx.setTextOrigin(0,xs.cur_y+dy) - setXPos(tx,cur_x_s-cur_x) - n = int((maxWidth-cur_x_s)/txtlen) - setXPos(tx,maxWidth - txtlen*n) - if xs.textColor!=textColor: - tx.setFillColor(textColor) - if backColor: xs.backColors.append((cur_x,maxWidth,backColor)) - tx._textOut(n*text,1) - if dy: tx.setTextOrigin(tx._x0,xs.cur_y-dy) - -def _leftDrawParaLineX( tx, offset, line, last=0): - setXPos(tx,offset) - _putFragLine(offset, tx, line, last, 'left') - setXPos(tx,-offset) - -def _centerDrawParaLineX( tx, offset, line, last=0): - tx._dotsOffsetX = offset + tx._x0 - try: - m = offset+0.5*line.extraSpace - setXPos(tx,m) - _putFragLine(m,tx, line, last,'center') - setXPos(tx,-m) - finally: - del tx._dotsOffsetX - -def _rightDrawParaLineX( tx, offset, line, last=0): - m = offset+line.extraSpace - setXPos(tx,m) - _putFragLine(m,tx, line, last, 'right') - setXPos(tx,-m) - -def _justifyDrawParaLineX( tx, offset, line, last=0): - setXPos(tx,offset) - extraSpace = line.extraSpace - simple = last or abs(extraSpace)<=1e-8 or line.lineBreak - if not simple: - nSpaces = line.wordCount+sum([_nbspCount(w.text) for w in line.words if not hasattr(w,'cbDefn')])-1 - simple = not nSpaces - if not simple: - tx.setWordSpace(extraSpace / float(nSpaces)) - _putFragLine(offset, tx, line, last, 'justify') - tx.setWordSpace(0) - else: - _putFragLine(offset, tx, line, last, 'justify') #no space modification - setXPos(tx,-offset) - -def _trailingSpaceLength(text, tx): - ws = _wsc_end_search(text) - return tx._canvas.stringWidth(ws.group(), tx._fontname, tx._fontsize) if ws else 0 - -def _getFragWords(frags,maxWidth=None): - ''' given a Parafrag list return a list of fragwords - [[size, (f00,w00), ..., (f0n,w0n)],....,[size, (fm0,wm0), ..., (f0n,wmn)]] - each pair f,w represents a style and some string - each sublist represents a word - ''' - R = [] - W = [] - n = 0 - hangingStrip = False - for f in frags: - text = f.text - #del f.text # we can't do this until we sort out splitting - # of paragraphs - if text!='': - if hangingStrip: - hangingStrip = False - text = text.lstrip() - S = split(text) - if S==[]: S = [''] - if W!=[] and text[0] in whitespace: - W.insert(0,n) - R.append(W) - W = [] - n = 0 - - for w in S[:-1]: - W.append((f,w)) - n += stringWidth(w, f.fontName, f.fontSize) - W.insert(0,n) - R.append(W) - W = [] - n = 0 - - w = S[-1] - W.append((f,w)) - n += stringWidth(w, f.fontName, f.fontSize) - if text and text[-1] in whitespace: - W.insert(0,n) - R.append(W) - W = [] - n = 0 - elif hasattr(f,'cbDefn'): - cb = f.cbDefn - w = getattr(cb,'width',0) - if w: - if hasattr(w,'normalizedValue'): - w._normalizer = maxWidth - w = w.normalizedValue(maxWidth) - if W!=[]: - W.insert(0,n) - R.append(W) - W = [] - n = 0 - R.append([w,(f,'')]) - else: - W.append((f,'')) - elif hasattr(f, 'lineBreak'): - #pass the frag through. The line breaker will scan for it. - if W!=[]: - W.insert(0,n) - R.append(W) - W = [] - n = 0 - R.append([0,(f,'')]) - hangingStrip = True - - if W!=[]: - W.insert(0,n) - R.append(W) - - return R - -def _fragWordIter(w): - for f, s in w[1:]: - if hasattr(f,'cbDefn'): - yield f, getattr(f,'width'), s - elif s: - if isBytes(s): - s = s.decode('utf8') #only encoding allowed - for c in s: - yield f, stringWidth(c,f.fontName, f.fontSize), c - else: - yield f, 0, s - -class _SplitList(list): - pass - -def _splitFragWord(w,maxWidth,maxWidths,lineno): - '''given a frag word, w, as returned by getFragWords - split it into frag words that fit in lines of length - maxWidth - maxWidths[lineno+1] - ..... - maxWidths[lineno+n] - - return the new word list - ''' - R = [] - maxlineno = len(maxWidths)-1 - W = [] - lineWidth = 0 - fragText = u'' - wordWidth = 0 - f = w[1][0] - for g,cw,c in _fragWordIter(w): - newLineWidth = lineWidth+cw - tooLong = newLineWidth>maxWidth - if g is not f or tooLong: - f = f.clone() - if hasattr(f,'text'): - f.text = fragText - W.append((f,fragText)) - if tooLong: - W = _SplitList([wordWidth]+W) - R.append(W) - lineno += 1 - maxWidth = maxWidths[min(maxlineno,lineno)] - W = [] - newLineWidth = wordWidth = cw - fragText = u'' - f = g - wordWidth = 0 - wordWidth += cw - fragText += c - lineWidth = newLineWidth - W.append((f,fragText)) - W = _SplitList([wordWidth]+W) - R.append(W) - return R - -class _SplitText(unicodeT): - pass - -def _splitWord(w,maxWidth,maxWidths,lineno,fontName,fontSize,encoding='utf8'): - ''' - split w into words that fit in lines of length - maxWidth - maxWidths[lineno+1] - ..... - maxWidths[lineno+n] - - then push those new words onto words - ''' - #TODO fix this to use binary search for the split points - R = [] - maxlineno = len(maxWidths)-1 - lineWidth = 0 - wordText = u'' - if isBytes(w): - w = w.decode(encoding) - for c in w: - cw = stringWidth(c,fontName,fontSize,encoding) - newLineWidth = lineWidth+cw - if newLineWidth>maxWidth: - R.append(_SplitText(wordText)) - lineno += 1 - maxWidth = maxWidths[min(maxlineno,lineno)] - newLineWidth = cw - wordText = u'' - wordText += c - lineWidth = newLineWidth - R.append(_SplitText(wordText)) - return R - -def _split_blParaSimple(blPara,start,stop): - f = blPara.clone() - for a in ('lines', 'kind', 'text'): - if hasattr(f,a): delattr(f,a) - - f.words = [] - for l in blPara.lines[start:stop]: - for w in l[1]: - f.words.append(w) - return [f] - -def _split_blParaHard(blPara,start,stop): - f = [] - lines = blPara.lines[start:stop] - for l in lines: - for w in l.words: - f.append(w) - if l is not lines[-1]: - i = len(f)-1 - while i>=0 and hasattr(f[i],'cbDefn') and not getattr(f[i].cbDefn,'width',0): i -= 1 - if i>=0: - g = f[i] - if not g.text: g.text = ' ' - elif g.text[-1]!=' ': g.text += ' ' - return f - -def _drawBullet(canvas, offset, cur_y, bulletText, style, rtl): - '''draw a bullet text could be a simple string or a frag list''' - bulletAnchor = style.bulletAnchor - if rtl or style.bulletAnchor!='start': - numeric = bulletAnchor=='numeric' - if isinstance(bulletText,strTypes): - t = bulletText - q = numeric and decimalSymbol in t - if q: t = t[:t.index(decimalSymbol)] - bulletWidth = stringWidth(t, style.bulletFontName, style.bulletFontSize) - if q: bulletWidth += 0.5 * stringWidth(decimalSymbol, style.bulletFontName, style.bulletFontSize) - else: - #it's a list of fragments - bulletWidth = 0 - for f in bulletText: - t = f.text - q = numeric and decimalSymbol in t - if q: - t = t[:t.index(decimalSymbol)] - bulletWidth += 0.5 * stringWidth(decimalSymbol, f.fontName, f.fontSize) - bulletWidth += stringWidth(t, f.fontName, f.fontSize) - if q: - break - else: - bulletWidth = 0 - if bulletAnchor=='middle': bulletWidth *= 0.5 - cur_y += getattr(style,"bulletOffsetY",0) - if not rtl: - tx2 = canvas.beginText(style.bulletIndent-bulletWidth,cur_y) - else: - width = rtl[0] - bulletStart = width+style.rightIndent-(style.bulletIndent+bulletWidth) - tx2 = canvas.beginText(bulletStart, cur_y) - tx2.setFont(style.bulletFontName, style.bulletFontSize) - tx2.setFillColor(getattr(style,'bulletColor',style.textColor)) - if isinstance(bulletText,strTypes): - tx2.textOut(bulletText) - else: - for f in bulletText: - tx2.setFont(f.fontName, f.fontSize) - tx2.setFillColor(f.textColor) - tx2.textOut(f.text) - - canvas.drawText(tx2) - if not rtl: - #AR making definition lists a bit less ugly - #bulletEnd = tx2.getX() - bulletEnd = tx2.getX() + style.bulletFontSize * 0.6 - offset = max(offset,bulletEnd - style.leftIndent) - return offset - -def _handleBulletWidth(bulletText,style,maxWidths): - '''work out bullet width and adjust maxWidths[0] if neccessary - ''' - if bulletText: - if isinstance(bulletText,strTypes): - bulletWidth = stringWidth( bulletText, style.bulletFontName, style.bulletFontSize) - else: - #it's a list of fragments - bulletWidth = 0 - for f in bulletText: - bulletWidth += stringWidth(f.text, f.fontName, f.fontSize) - bulletLen = style.bulletIndent + bulletWidth + 0.6 * style.bulletFontSize - if style.wordWrap=='RTL': - indent = style.rightIndent+style.firstLineIndent - else: - indent = style.leftIndent+style.firstLineIndent - if bulletLen > indent: - #..then it overruns, and we have less space available on line 1 - maxWidths[0] -= (bulletLen - indent) - -def splitLines0(frags,widths): - ''' - given a list of ParaFrags we return a list of ParaLines - - each ParaLine has - 1) ExtraSpace - 2) blankCount - 3) [textDefns....] - each text definition is a (ParaFrag, start, limit) triplet - ''' - #initialise the algorithm - lines = [] - lineNum = 0 - maxW = widths[lineNum] - i = -1 - l = len(frags) - lim = start = 0 - while 1: - #find a non whitespace character - while imaxW and line!=[]: - cLen = cLen-w - #this is the end of the line - while g.text[lim]==' ': - lim = lim - 1 - nSpaces = nSpaces-1 - break - if j<0: j = lim - if g[0] is f: g[2] = j #extend - else: - g = (f,start,j) - line.append(g) - if j==lim: - i += 1 - -def _old_do_line(tx, x1, y1, x2, y2): - tx._canvas.line(x1, y1, x2, y2) - -def _do_line(tx, x1, y1, x2, y2): - olw = tx._canvas._lineWidth - nlw = tx._underlineProportion*tx._fontsize - if nlw!=olw: - tx._canvas.setLineWidth(nlw) - tx._canvas.line(x1, y1, x2, y2) - tx._canvas.setLineWidth(olw) - else: - tx._canvas.line(x1, y1, x2, y2) - -def _do_under_line(i, t_off, ws, tx, lm=-0.125): - y = tx.XtraState.cur_y - i*tx.XtraState.style.leading + lm*tx.XtraState.f.fontSize - textlen = tx._canvas.stringWidth(' '.join(tx.XtraState.lines[i][1]), tx._fontname, tx._fontsize) - tx._do_line(t_off, y, t_off+textlen, y) - -_scheme_re = re.compile('^[a-zA-Z][-+a-zA-Z0-9]+$') -def _doLink(tx,link,rect): - parts = link.split(':',1) - scheme = len(parts)==2 and parts[0].lower() or '' - if _scheme_re.match(scheme) and scheme!='document': - kind=scheme.lower()=='pdf' and 'GoToR' or 'URI' - if kind=='GoToR': link = parts[1] - tx._canvas.linkURL(link, rect, relative=1, kind=kind) - else: - if link[0]=='#': - link = link[1:] - scheme='' - tx._canvas.linkRect("", scheme!='document' and link or parts[1], rect, relative=1) - -def _do_link_line(i, t_off, ws, tx): - xs = tx.XtraState - leading = xs.style.leading - y = xs.cur_y - i*leading - xs.f.fontSize/8.0 # 8.0 factor copied from para.py - text = ' '.join(xs.lines[i][1]) - textlen = tx._canvas.stringWidth(text, tx._fontname, tx._fontsize) - _doLink(tx, xs.link, (t_off, y, t_off+textlen, y+leading)) - -def _do_post_text(tx): - xs = tx.XtraState - leading = xs.style.leading - autoLeading = xs.autoLeading - f = xs.f - if autoLeading=='max': - leading = max(leading,1.2*f.fontSize) - elif autoLeading=='min': - leading = 1.2*f.fontSize - ff = 0.125*f.fontSize - y0 = xs.cur_y - y = y0 - ff - csc = None - for x1,x2,c in xs.underlines: - if c!=csc: - tx._canvas.setStrokeColor(c) - csc = c - tx._do_line(x1, y, x2, y) - xs.underlines = [] - xs.underline=0 - xs.underlineColor=None - - ys = y0 + 2*ff - for x1,x2,c in xs.strikes: - if c!=csc: - tx._canvas.setStrokeColor(c) - csc = c - tx._do_line(x1, ys, x2, ys) - xs.strikes = [] - xs.strike=0 - xs.strikeColor=None - - yl = y0 + f.fontSize - ydesc = yl - leading - for x1,x2,link,c in xs.links: - if platypus_link_underline: - if c!=csc: - tx._canvas.setStrokeColor(c) - csc = c - tx._do_line(x1, y, x2, y) - _doLink(tx, link, (x1, ydesc, x2, yl)) - xs.links = [] - xs.link=None - xs.linkColor=None - - for x1,x2,c in xs.backColors: - tx._canvas.setFillColor(c) - tx._canvas.rect(x1,ydesc,x2-x1,leading,stroke=0,fill=1) - - xs.backColors=[] - xs.backColor=None - xs.cur_y -= leading - -def textTransformFrags(frags,style): - tt = style.textTransform - if tt: - tt=tt.lower() - if tt=='lowercase': - tt = unicodeT.lower - elif tt=='uppercase': - tt = unicodeT.upper - elif tt=='capitalize': - tt = unicodeT.title - elif tt=='none': - return - else: - raise ValueError('ParaStyle.textTransform value %r is invalid' % style.textTransform) - n = len(frags) - if n==1: - #single fragment the easy case - frags[0].text = tt(frags[0].text) - elif tt is unicodeT.title: - pb = True - for f in frags: - u = f.text - if not u: continue - if u.startswith(u' ') or pb: - u = tt(u) - else: - i = u.find(u' ') - if i>=0: - u = u[:i]+tt(u[i:]) - pb = u.endswith(u' ') - f.text = u - else: - for f in frags: - u = f.text - if not u: continue - f.text = tt(u) - -class cjkU(unicodeT): - '''simple class to hold the frag corresponding to a str''' - def __new__(cls,value,frag,encoding): - self = unicodeT.__new__(cls,value) - self._frag = frag - if hasattr(frag,'cbDefn'): - w = getattr(frag.cbDefn,'width',0) - self._width = w - else: - self._width = stringWidth(value,frag.fontName,frag.fontSize) - return self - frag = property(lambda self: self._frag) - width = property(lambda self: self._width) - -def makeCJKParaLine(U,maxWidth,widthUsed,extraSpace,lineBreak,calcBounds): - words = [] - CW = [] - f0 = FragLine() - maxSize = maxAscent = minDescent = 0 - for u in U: - f = u.frag - fontSize = f.fontSize - if calcBounds: - cbDefn = getattr(f,'cbDefn',None) - if getattr(cbDefn,'width',0): - descent, ascent = imgVRange(imgNormV(cbDefn.height,fontSize),cbDefn.valign,fontSize) - else: - ascent, descent = getAscentDescent(f.fontName,fontSize) - else: - ascent, descent = getAscentDescent(f.fontName,fontSize) - maxSize = max(maxSize,fontSize) - maxAscent = max(maxAscent,ascent) - minDescent = min(minDescent,descent) - if not sameFrag(f0,f): - f0=f0.clone() - f0.text = u''.join(CW) - words.append(f0) - CW = [] - f0 = f - CW.append(u) - if CW: - f0=f0.clone() - f0.text = u''.join(CW) - words.append(f0) - return FragLine(kind=1,extraSpace=extraSpace,wordCount=1,words=words[1:],fontSize=maxSize,ascent=maxAscent,descent=minDescent,maxWidth=maxWidth,currentWidth=widthUsed,lineBreak=lineBreak) - -def cjkFragSplit(frags, maxWidths, calcBounds, encoding='utf8'): - '''This attempts to be wordSplit for frags using the dumb algorithm''' - U = [] #get a list of single glyphs with their widths etc etc - for f in frags: - text = f.text - if isBytes(text): - text = text.decode(encoding) - if text: - U.extend([cjkU(t,f,encoding) for t in text]) - else: - U.append(cjkU(text,f,encoding)) - lines = [] - i = widthUsed = lineStartPos = 0 - maxWidth = maxWidths[0] - nU = len(U) - while imaxWidth + _FUZZ and widthUsed>0) or lineBreak - if endLine: - extraSpace = maxWidth - widthUsed - if not lineBreak: - if ord(u)<0x3000: - # we appear to be inside a non-Asian script section. - # (this is a very crude test but quick to compute). - # This is likely to be quite rare so the speed of the - # code below is hopefully not a big issue. The main - # situation requiring this is that a document title - # with an english product name in it got cut. - - - # we count back and look for - # - a space-like character - # - reversion to Kanji (which would be a good split point) - # - in the worst case, roughly half way back along the line - limitCheck = (lineStartPos+i)>>1 #(arbitrary taste issue) - for j in xrange(i-1,limitCheck,-1): - uj = U[j] - if uj and category(uj)=='Zs' or ord(uj)>=0x3000: - k = j+1 - if k - if u not in ALL_CANNOT_START and i>lineStartPos+1: - #otherwise we need to push the character back - #the i>lineStart+1 condition ensures progress - i -= 1 - extraSpace += w - lines.append(makeCJKParaLine(U[lineStartPos:i],maxWidth,widthUsed,extraSpace,lineBreak,calcBounds)) - try: - maxWidth = maxWidths[len(lines)] - except IndexError: - maxWidth = maxWidths[-1] # use the last one - - lineStartPos = i - widthUsed = 0 - - #any characters left? - if widthUsed > 0: - lines.append(makeCJKParaLine(U[lineStartPos:],maxWidth,widthUsed,maxWidth-widthUsed,False,calcBounds)) - - return ParaLines(kind=1,lines=lines) - -class Paragraph(Flowable): - """ Paragraph(text, style, bulletText=None, caseSensitive=1) - text a string of stuff to go into the paragraph. - style is a style definition as in reportlab.lib.styles. - bulletText is an optional bullet defintion. - caseSensitive set this to 0 if you want the markup tags and their attributes to be case-insensitive. - - This class is a flowable that can format a block of text - into a paragraph with a given style. - - The paragraph Text can contain XML-like markup including the tags: - ... - bold - ... - italics - ... - underline - ... - strike through - ... - superscript - ... - subscript - - - - - link text - attributes of links - size/fontSize=num - name/face/fontName=name - fg/textColor/color=color - backcolor/backColor/bgcolor=color - dest/destination/target/href/link=target - anchor text - attributes of anchors - fontSize=num - fontName=name - fg/textColor/color=color - backcolor/backColor/bgcolor=color - href=href - - - - - width="w%" --> fontSize*w/100 idea from Roberto Alsina - height="h%" --> linewidth*h/100 - - The whole may be surrounded by tags - - The and tags will work for the built-in fonts (Helvetica - /Times / Courier). For other fonts you need to register a family - of 4 fonts using reportlab.pdfbase.pdfmetrics.registerFont; then - use the addMapping function to tell the library that these 4 fonts - form a family e.g. - from reportlab.lib.fonts import addMapping - addMapping('Vera', 0, 0, 'Vera') #normal - addMapping('Vera', 0, 1, 'Vera-Italic') #italic - addMapping('Vera', 1, 0, 'Vera-Bold') #bold - addMapping('Vera', 1, 1, 'Vera-BoldItalic') #italic and bold - - It will also be able to handle any MathML specified Greek characters. - """ - def __init__(self, text, style, bulletText = None, frags=None, caseSensitive=1, encoding='utf8'): - self.caseSensitive = caseSensitive - self.encoding = encoding - self._setup(text, style, bulletText or getattr(style,'bulletText',None), frags, cleanBlockQuotedText) - - - def __repr__(self): - n = self.__class__.__name__ - L = [n+"("] - keys = list(self.__dict__.keys()) - for k in keys: - L.append('%s: %s' % (repr(k).replace("\n", " ").replace(" "," "),repr(getattr(self, k)).replace("\n", " ").replace(" "," "))) - L.append(") #"+n) - return '\n'.join(L) - - def _setup(self, text, style, bulletText, frags, cleaner): - - #This used to be a global parser to save overhead. - #In the interests of thread safety it is being instantiated per paragraph. - #On the next release, we'll replace with a cElementTree parser - - if frags is None: - text = cleaner(text) - _parser = ParaParser() - _parser.caseSensitive = self.caseSensitive - style, frags, bulletTextFrags = _parser.parse(text,style) - if frags is None: - raise ValueError("xml parser error (%s) in paragraph beginning\n'%s'"\ - % (_parser.errors[0],text[:min(30,len(text))])) - textTransformFrags(frags,style) - if bulletTextFrags: bulletText = bulletTextFrags - - #AR hack - self.text = text - self.frags = frags - self.style = style - self.bulletText = bulletText - self.debug = 0 #turn this on to see a pretty one with all the margins etc. - - def wrap(self, availWidth, availHeight): - # work out widths array for breaking - self.width = availWidth - style = self.style - leftIndent = style.leftIndent - first_line_width = availWidth - (leftIndent+style.firstLineIndent) - style.rightIndent - later_widths = availWidth - leftIndent - style.rightIndent - self._wrapWidths = [first_line_width, later_widths] - - if style.wordWrap == 'CJK': - #use Asian text wrap algorithm to break characters - blPara = self.breakLinesCJK(self._wrapWidths) - else: - blPara = self.breakLines(self._wrapWidths) - self.blPara = blPara - autoLeading = getattr(self,'autoLeading',getattr(style,'autoLeading','')) - leading = style.leading - if blPara.kind==1: - if autoLeading not in ('','off'): - height = 0 - if autoLeading=='max': - for l in blPara.lines: - height += max(l.ascent-l.descent,leading) - elif autoLeading=='min': - for l in blPara.lines: - height += l.ascent - l.descent - else: - raise ValueError('invalid autoLeading value %r' % autoLeading) - else: - height = len(blPara.lines) * leading - else: - if autoLeading=='max': - leading = max(leading,blPara.ascent-blPara.descent) - elif autoLeading=='min': - leading = blPara.ascent-blPara.descent - height = len(blPara.lines) * leading - self.height = height - return self.width, height - - def minWidth(self): - 'Attempt to determine a minimum sensible width' - frags = self.frags - nFrags= len(frags) - if not nFrags: return 0 - if nFrags==1: - f = frags[0] - fS = f.fontSize - fN = f.fontName - words = hasattr(f,'text') and split(f.text, ' ') or f.words - func = lambda w, fS=fS, fN=fN: stringWidth(w,fN,fS) - else: - words = _getFragWords(frags) - func = lambda x: x[0] - return max(list(map(func,words))) - - def _get_split_blParaFunc(self): - return self.blPara.kind==0 and _split_blParaSimple or _split_blParaHard - - def split(self,availWidth, availHeight): - if len(self.frags)<=0: return [] - - #the split information is all inside self.blPara - if not hasattr(self,'blPara'): - self.wrap(availWidth,availHeight) - blPara = self.blPara - style = self.style - autoLeading = getattr(self,'autoLeading',getattr(style,'autoLeading','')) - leading = style.leading - lines = blPara.lines - if blPara.kind==1 and autoLeading not in ('','off'): - s = height = 0 - if autoLeading=='max': - for i,l in enumerate(blPara.lines): - h = max(l.ascent-l.descent,leading) - n = height+h - if n>availHeight+1e-8: - break - height = n - s = i+1 - elif autoLeading=='min': - for i,l in enumerate(blPara.lines): - n = height+l.ascent-l.descent - if n>availHeight+1e-8: - break - height = n - s = i+1 - else: - raise ValueError('invalid autoLeading value %r' % autoLeading) - else: - l = leading - if autoLeading=='max': - l = max(leading,1.2*style.fontSize) - elif autoLeading=='min': - l = 1.2*style.fontSize - s = int(availHeight/(l*1.0)) - height = s*l - - allowOrphans = getattr(self,'allowOrphans',getattr(style,'allowOrphans',0)) - if (not allowOrphans and s<=1) or s==0: #orphan or not enough room - del self.blPara - return [] - n = len(lines) - allowWidows = getattr(self,'allowWidows',getattr(style,'allowWidows',1)) - if n<=s: - return [self] - if not allowWidows: - if n==s+1: #widow? - if (allowOrphans and n==3) or n>3: - s -= 1 #give the widow some company - else: - del self.blPara #no room for adjustment; force the whole para onwards - return [] - func = self._get_split_blParaFunc() - - if style.endDots: - style1 = deepcopy(style) - style1.endDots = None - else: - style1 = style - P1=self.__class__(None,style1,bulletText=self.bulletText,frags=func(blPara,0,s)) - #this is a major hack - P1.blPara = ParaLines(kind=1,lines=blPara.lines[0:s],aH=availHeight,aW=availWidth) - P1._JustifyLast = 1 - P1._splitpara = 1 - P1.height = height - P1.width = availWidth - if style.firstLineIndent != 0: - style = deepcopy(style) - style.firstLineIndent = 0 - P2=self.__class__(None,style,bulletText=None,frags=func(blPara,s,n)) - #propagate attributes that might be on self; suggestion from Dirk Holtwick - for a in ('autoLeading', #possible attributes that might be directly on self. - ): - if hasattr(self,a): - setattr(P1,a,getattr(self,a)) - setattr(P2,a,getattr(self,a)) - return [P1,P2] - - def draw(self): - #call another method for historical reasons. Besides, I - #suspect I will be playing with alternate drawing routines - #so not doing it here makes it easier to switch. - self.drawPara(self.debug) - - def breakLines(self, width): - """ - Returns a broken line structure. There are two cases - - A) For the simple case of a single formatting input fragment the output is - A fragment specifier with - - kind = 0 - - fontName, fontSize, leading, textColor - - lines= A list of lines - - Each line has two items. - - 1. unused width in points - 2. word list - - B) When there is more than one input formatting fragment the output is - A fragment specifier with - - kind = 1 - - lines= A list of fragments each having fields - - extraspace (needed for justified) - - fontSize - - words=word list - each word is itself a fragment with - various settings - - This structure can be used to easily draw paragraphs with the various alignments. - You can supply either a single width or a list of widths; the latter will have its - last item repeated until necessary. A 2-element list is useful when there is a - different first line indent; a longer list could be created to facilitate custom wraps - around irregular objects.""" - - if not isinstance(width,(tuple,list)): maxWidths = [width] - else: maxWidths = width - lines = [] - self.height = lineno = 0 - maxlineno = len(maxWidths)-1 - style = self.style - splitLongWords = style.splitLongWords - - #for bullets, work out width and ensure we wrap the right amount onto line one - _handleBulletWidth(self.bulletText,style,maxWidths) - - maxWidth = maxWidths[0] - - autoLeading = getattr(self,'autoLeading',getattr(style,'autoLeading','')) - calcBounds = autoLeading not in ('','off') - frags = self.frags - nFrags= len(frags) - if nFrags==1 and not (style.endDots or hasattr(frags[0],'cbDefn') or hasattr(frags[0],'backColor')): - f = frags[0] - fontSize = f.fontSize - fontName = f.fontName - ascent, descent = getAscentDescent(fontName,fontSize) - if hasattr(f,'text'): - text = strip(f.text) - if not text: - return f.clone(kind=0, lines=[],ascent=ascent,descent=descent,fontSize=fontSize) - else: - words = split(text) - else: - words = f.words[:] - for w in words: - if strip(w): break - else: - return f.clone(kind=0, lines=[],ascent=ascent,descent=descent,fontSize=fontSize) - spaceWidth = stringWidth(' ', fontName, fontSize, self.encoding) - cLine = [] - currentWidth = -spaceWidth # hack to get around extra space for word 1 - while words: - word = words.pop(0) - #this underscores my feeling that Unicode throughout would be easier! - wordWidth = stringWidth(word, fontName, fontSize, self.encoding) - newWidth = currentWidth + spaceWidth + wordWidth - if newWidth>maxWidth: - nmw = min(lineno,maxlineno) - if wordWidth>max(maxWidths[nmw:nmw+1]) and not isinstance(word,_SplitText) and splitLongWords: - #a long word - words[0:0] = _splitWord(word,maxWidth-spaceWidth-currentWidth,maxWidths,lineno,fontName,fontSize,self.encoding) - continue - if newWidth <= maxWidth or not len(cLine): - # fit one more on this line - cLine.append(word) - currentWidth = newWidth - else: - if currentWidth > self.width: self.width = currentWidth - #end of line - lines.append((maxWidth - currentWidth, cLine)) - cLine = [word] - currentWidth = wordWidth - lineno += 1 - maxWidth = maxWidths[min(maxlineno,lineno)] - - #deal with any leftovers on the final line - if cLine!=[]: - if currentWidth>self.width: self.width = currentWidth - lines.append((maxWidth - currentWidth, cLine)) - - return f.clone(kind=0, lines=lines,ascent=ascent,descent=descent,fontSize=fontSize) - elif nFrags<=0: - return ParaLines(kind=0, fontSize=style.fontSize, fontName=style.fontName, - textColor=style.textColor, ascent=style.fontSize,descent=-0.2*style.fontSize, - lines=[]) - else: - if hasattr(self,'blPara') and getattr(self,'_splitpara',0): - #NB this is an utter hack that awaits the proper information - #preserving splitting algorithm - return self.blPara - n = 0 - words = [] - _words = _getFragWords(frags,maxWidth) - while _words: - w = _words.pop(0) - f=w[-1][0] - fontName = f.fontName - fontSize = f.fontSize - spaceWidth = stringWidth(' ',fontName, fontSize) - - if not words: - currentWidth = -spaceWidth # hack to get around extra space for word 1 - maxSize = fontSize - maxAscent, minDescent = getAscentDescent(fontName,fontSize) - - wordWidth = w[0] - f = w[1][0] - if wordWidth>0: - newWidth = currentWidth + spaceWidth + wordWidth - else: - newWidth = currentWidth - - #test to see if this frag is a line break. If it is we will only act on it - #if the current width is non-negative or the previous thing was a deliberate lineBreak - lineBreak = hasattr(f,'lineBreak') - if not lineBreak and newWidth>maxWidth and not isinstance(w,_SplitList) and splitLongWords: - nmw = min(lineno,maxlineno) - if wordWidth>max(maxWidths[nmw:nmw+1]): - #a long word - _words[0:0] = _splitFragWord(w,maxWidth-spaceWidth-currentWidth,maxWidths,lineno) - continue - endLine = (newWidth>maxWidth and n>0) or lineBreak - if not endLine: - if lineBreak: continue #throw it away - nText = w[1][1] - if nText: n += 1 - fontSize = f.fontSize - if calcBounds: - cbDefn = getattr(f,'cbDefn',None) - if getattr(cbDefn,'width',0): - descent,ascent = imgVRange(imgNormV(cbDefn.height,fontSize),cbDefn.valign,fontSize) - else: - ascent, descent = getAscentDescent(f.fontName,fontSize) - else: - ascent, descent = getAscentDescent(f.fontName,fontSize) - maxSize = max(maxSize,fontSize) - maxAscent = max(maxAscent,ascent) - minDescent = min(minDescent,descent) - if not words: - g = f.clone() - words = [g] - g.text = nText - elif not sameFrag(g,f): - if currentWidth>0 and ((nText!='' and nText[0]!=' ') or hasattr(f,'cbDefn')): - if hasattr(g,'cbDefn'): - i = len(words)-1 - while i>=0: - wi = words[i] - cbDefn = getattr(wi,'cbDefn',None) - if cbDefn: - if not getattr(cbDefn,'width',0): - i -= 1 - continue - if not wi.text.endswith(' '): - wi.text += ' ' - break - else: - if not g.text.endswith(' '): - g.text += ' ' - g = f.clone() - words.append(g) - g.text = nText - else: - if nText and nText[0]!=' ': - g.text += ' ' + nText - - ni = 0 - for i in w[2:]: - g = i[0].clone() - g.text=i[1] - if g.text: ni = 1 - words.append(g) - fontSize = g.fontSize - if calcBounds: - cbDefn = getattr(g,'cbDefn',None) - if getattr(cbDefn,'width',0): - descent,ascent = imgVRange(imgNormV(cbDefn.height,fontSize),cbDefn.valign,fontSize) - else: - ascent, descent = getAscentDescent(g.fontName,fontSize) - else: - ascent, descent = getAscentDescent(g.fontName,fontSize) - maxSize = max(maxSize,fontSize) - maxAscent = max(maxAscent,ascent) - minDescent = min(minDescent,descent) - if not nText and ni: - #one bit at least of the word was real - n+=1 - - currentWidth = newWidth - else: #either it won't fit, or it's a lineBreak tag - if lineBreak: - g = f.clone() - #del g.lineBreak - words.append(g) - - if currentWidth>self.width: self.width = currentWidth - #end of line - lines.append(FragLine(extraSpace=maxWidth-currentWidth, wordCount=n, - lineBreak=lineBreak, words=words, fontSize=maxSize, ascent=maxAscent, descent=minDescent, maxWidth=maxWidth)) - - #start new line - lineno += 1 - maxWidth = maxWidths[min(maxlineno,lineno)] - - if lineBreak: - n = 0 - words = [] - continue - - currentWidth = wordWidth - n = 1 - g = f.clone() - maxSize = g.fontSize - if calcBounds: - cbDefn = getattr(g,'cbDefn',None) - if getattr(cbDefn,'width',0): - minDescent,maxAscent = imgVRange(imgNormV(cbDefn.height,fontSize),cbDefn.valign,maxSize) - else: - maxAscent, minDescent = getAscentDescent(g.fontName,maxSize) - else: - maxAscent, minDescent = getAscentDescent(g.fontName,maxSize) - words = [g] - g.text = w[1][1] - - for i in w[2:]: - g = i[0].clone() - g.text=i[1] - words.append(g) - fontSize = g.fontSize - if calcBounds: - cbDefn = getattr(g,'cbDefn',None) - if getattr(cbDefn,'width',0): - descent,ascent = imgVRange(imgNormV(cbDefn.height,fontSize),cbDefn.valign,fontSize) - else: - ascent, descent = getAscentDescent(g.fontName,fontSize) - else: - ascent, descent = getAscentDescent(g.fontName,fontSize) - maxSize = max(maxSize,fontSize) - maxAscent = max(maxAscent,ascent) - minDescent = min(minDescent,descent) - - #deal with any leftovers on the final line - if words!=[]: - if currentWidth>self.width: self.width = currentWidth - lines.append(ParaLines(extraSpace=(maxWidth - currentWidth),wordCount=n, - words=words, fontSize=maxSize,ascent=maxAscent,descent=minDescent,maxWidth=maxWidth)) - return ParaLines(kind=1, lines=lines) - - return lines - - def breakLinesCJK(self, maxWidths): - """Initially, the dumbest possible wrapping algorithm. - Cannot handle font variations.""" - - if not isinstance(maxWidths,(list,tuple)): maxWidths = [maxWidths] - style = self.style - self.height = 0 - - #for bullets, work out width and ensure we wrap the right amount onto line one - _handleBulletWidth(self.bulletText, style, maxWidths) - frags = self.frags - nFrags = len(frags) - if nFrags==1 and not hasattr(frags[0],'cbDefn') and not style.endDots: - f = frags[0] - if hasattr(self,'blPara') and getattr(self,'_splitpara',0): - return f.clone(kind=0, lines=self.blPara.lines) - #single frag case - lines = [] - lineno = 0 - if hasattr(f,'text'): - text = f.text - else: - text = ''.join(getattr(f,'words',[])) - - from reportlab.lib.textsplit import wordSplit - lines = wordSplit(text, maxWidths, f.fontName, f.fontSize) - #the paragraph drawing routine assumes multiple frags per line, so we need an - #extra list like this - # [space, [text]] - # - wrappedLines = [(sp, [line]) for (sp, line) in lines] - return f.clone(kind=0, lines=wrappedLines, ascent=f.fontSize, descent=-0.2*f.fontSize) - elif nFrags<=0: - return ParaLines(kind=0, fontSize=style.fontSize, fontName=style.fontName, - textColor=style.textColor, lines=[],ascent=style.fontSize,descent=-0.2*style.fontSize) - - #general case nFrags>1 or special - if hasattr(self,'blPara') and getattr(self,'_splitpara',0): - return self.blPara - autoLeading = getattr(self,'autoLeading',getattr(style,'autoLeading','')) - calcBounds = autoLeading not in ('','off') - return cjkFragSplit(frags, maxWidths, calcBounds) - - def beginText(self, x, y): - return self.canv.beginText(x, y) - - def drawPara(self,debug=0): - """Draws a paragraph according to the given style. - Returns the final y position at the bottom. Not safe for - paragraphs without spaces e.g. Japanese; wrapping - algorithm will go infinite.""" - - #stash the key facts locally for speed - canvas = self.canv - style = self.style - blPara = self.blPara - lines = blPara.lines - leading = style.leading - autoLeading = getattr(self,'autoLeading',getattr(style,'autoLeading','')) - - #work out the origin for line 1 - leftIndent = style.leftIndent - cur_x = leftIndent - - if debug: - bw = 0.5 - bc = Color(1,1,0) - bg = Color(0.9,0.9,0.9) - else: - bw = getattr(style,'borderWidth',None) - bc = getattr(style,'borderColor',None) - bg = style.backColor - - #if has a background or border, draw it - if bg or (bc and bw): - canvas.saveState() - op = canvas.rect - kwds = dict(fill=0,stroke=0) - if bc and bw: - canvas.setStrokeColor(bc) - canvas.setLineWidth(bw) - kwds['stroke'] = 1 - br = getattr(style,'borderRadius',0) - if br and not debug: - op = canvas.roundRect - kwds['radius'] = br - if bg: - canvas.setFillColor(bg) - kwds['fill'] = 1 - bp = getattr(style,'borderPadding',0) - tbp, rbp, bbp, lbp = normalizeTRBL(bp) - op(leftIndent - lbp, - -bbp, - self.width - (leftIndent+style.rightIndent) + lbp+rbp, - self.height + tbp+bbp, - **kwds) - canvas.restoreState() - - nLines = len(lines) - bulletText = self.bulletText - if nLines > 0: - _offsets = getattr(self,'_offsets',[0]) - _offsets += (nLines-len(_offsets))*[_offsets[-1]] - canvas.saveState() - #canvas.addLiteral('%% %s.drawPara' % _className(self)) - alignment = style.alignment - offset = style.firstLineIndent+_offsets[0] - lim = nLines-1 - noJustifyLast = not (hasattr(self,'_JustifyLast') and self._JustifyLast) - - if blPara.kind==0: - if alignment == TA_LEFT: - dpl = _leftDrawParaLine - elif alignment == TA_CENTER: - dpl = _centerDrawParaLine - elif self.style.alignment == TA_RIGHT: - dpl = _rightDrawParaLine - elif self.style.alignment == TA_JUSTIFY: - dpl = _justifyDrawParaLine - f = blPara - if paraFontSizeHeightOffset: - cur_y = self.height - f.fontSize - else: - cur_y = self.height - getattr(f,'ascent',f.fontSize) - if bulletText: - offset = _drawBullet(canvas,offset,cur_y,bulletText,style,rtl=style.wordWrap=='RTL' and self._wrapWidths or False) - - #set up the font etc. - canvas.setFillColor(f.textColor) - - tx = self.beginText(cur_x, cur_y) - if style.underlineProportion: - tx._underlineProportion = style.underlineProportion - tx._do_line = _do_line - else: - tx._do_line = _old_do_line - tx._do_line = MethodType(tx._do_line,tx) - if autoLeading=='max': - leading = max(leading,blPara.ascent-blPara.descent) - elif autoLeading=='min': - leading = blPara.ascent-blPara.descent - - # set the paragraph direction - tx.direction = self.style.wordWrap - - #now the font for the rest of the paragraph - tx.setFont(f.fontName, f.fontSize, leading) - ws = lines[0][0] - t_off = dpl( tx, offset, ws, lines[0][1], noJustifyLast and nLines==1) - if f.underline or f.link or f.strike or style.endDots: - xs = tx.XtraState = ABag() - xs.cur_y = cur_y - xs.f = f - xs.style = style - xs.lines = lines - xs.underlines=[] - xs.underlineColor=None - xs.strikes=[] - xs.strikeColor=None - xs.links=[] - xs.link=f.link - xs.textColor = f.textColor - xs.backColors = [] - canvas.setStrokeColor(f.textColor) - dx = t_off+leftIndent - if dpl!=_justifyDrawParaLine: ws = 0 - underline = f.underline or (f.link and platypus_link_underline) - strike = f.strike - link = f.link - if underline: _do_under_line(0, dx, ws, tx) - if strike: _do_under_line(0, dx, ws, tx, lm=0.125) - if link: _do_link_line(0, dx, ws, tx) - if noJustifyLast and nLines==1 and style.endDots and dpl!=_rightDrawParaLine: _do_dots(0, dx, ws, xs, tx, dpl) - - #now the middle of the paragraph, aligned with the left margin which is our origin. - for i in xrange(1, nLines): - ws = lines[i][0] - t_off = dpl( tx, _offsets[i], ws, lines[i][1], noJustifyLast and i==lim) - dx = t_off+leftIndent - if dpl!=_justifyDrawParaLine: ws = 0 - if underline: _do_under_line(i, dx, ws, tx) - if strike: _do_under_line(i, dx, ws, tx, lm=0.125) - if link: _do_link_line(i, dx, ws, tx) - if noJustifyLast and i==lim and style.endDots and dpl!=_rightDrawParaLine: _do_dots(i, dx, ws, xs, tx, dpl) - else: - for i in xrange(1, nLines): - dpl( tx, _offsets[i], lines[i][0], lines[i][1], noJustifyLast and i==lim) - else: - if self.style.wordWrap == 'RTL': - for line in lines: - line.words = line.words[::-1] - f = lines[0] - if paraFontSizeHeightOffset: - cur_y = self.height - f.fontSize - else: - cur_y = self.height - getattr(f,'ascent',f.fontSize) - # default? - dpl = _leftDrawParaLineX - if bulletText: - oo = offset - offset = _drawBullet(canvas,offset,cur_y,bulletText,style, rtl=style.wordWrap=='RTL' and self._wrapWidths or False) - if alignment == TA_LEFT: - dpl = _leftDrawParaLineX - elif alignment == TA_CENTER: - dpl = _centerDrawParaLineX - elif self.style.alignment == TA_RIGHT: - dpl = _rightDrawParaLineX - elif self.style.alignment == TA_JUSTIFY: - dpl = _justifyDrawParaLineX - else: - raise ValueError("bad align %s" % repr(alignment)) - - #set up the font etc. - tx = self.beginText(cur_x, cur_y) - if style.underlineProportion: - tx._underlineProportion = style.underlineProportion - tx._do_line = _do_line - else: - tx._do_line = _old_do_line - tx._do_line = MethodType(tx._do_line,tx) - # set the paragraph direction - tx.direction = self.style.wordWrap - - xs = tx.XtraState=ABag() - xs.textColor=None - xs.backColor=None - xs.rise=0 - xs.underline=0 - xs.underlines=[] - xs.underlineColor=None - xs.strike=0 - xs.strikes=[] - xs.strikeColor=None - xs.backColors=[] - xs.links=[] - xs.link=None - xs.leading = style.leading - xs.leftIndent = leftIndent - tx._leading = None - tx._olb = None - xs.cur_y = cur_y - xs.f = f - xs.style = style - xs.autoLeading = autoLeading - - tx._fontname,tx._fontsize = None, None - dpl( tx, offset, lines[0], noJustifyLast and nLines==1) - _do_post_text(tx) - - #now the middle of the paragraph, aligned with the left margin which is our origin. - for i in xrange(1, nLines): - f = lines[i] - dpl( tx, _offsets[i], f, noJustifyLast and i==lim) - _do_post_text(tx) - - canvas.drawText(tx) - canvas.restoreState() - - def getPlainText(self,identify=None): - """Convenience function for templates which want access - to the raw text, without XML tags. """ - frags = getattr(self,'frags',None) - if frags: - plains = [] - for frag in frags: - if hasattr(frag, 'text'): - plains.append(frag.text) - return ''.join(plains) - elif identify: - text = getattr(self,'text',None) - if text is None: text = repr(self) - return text - else: - return '' - - def getActualLineWidths0(self): - """Convenience function; tells you how wide each line - actually is. For justified styles, this will be - the same as the wrap width; for others it might be - useful for seeing if paragraphs will fit in spaces.""" - assert hasattr(self, 'width'), "Cannot call this method before wrap()" - if self.blPara.kind: - func = lambda frag, w=self.width: w - frag.extraSpace - else: - func = lambda frag, w=self.width: w - frag[0] - return list(map(func,self.blPara.lines)) - -if __name__=='__main__': #NORUNTESTS - def dumpParagraphLines(P): - print('dumpParagraphLines()' % id(P)) - lines = P.blPara.lines - outw = sys.stdout.write - for l,line in enumerate(lines): - line = lines[l] - if hasattr(line,'words'): - words = line.words - else: - words = line[1] - nwords = len(words) - outw('line%d: %d(%s)\n ' % (l,nwords,str(getattr(line,'wordCount','Unknown')))) - for w in xrange(nwords): - outw(" %d:'%s'"%(w,getattr(words[w],'text',words[w]))) - print() - - def fragDump(w): - R= ["'%s'" % w[1]] - for a in ('fontName', 'fontSize', 'textColor', 'rise', 'underline', 'strike', 'link', 'cbDefn','lineBreak'): - if hasattr(w[0],a): - R.append('%s=%r' % (a,getattr(w[0],a))) - return ', '.join(R) - - def dumpParagraphFrags(P): - print('dumpParagraphFrags() minWidth() = %.2f' % (id(P), P.minWidth())) - frags = P.frags - n =len(frags) - for l in xrange(n): - print("frag%d: '%s' %s" % (l, frags[l].text,' '.join(['%s=%s' % (k,getattr(frags[l],k)) for k in frags[l].__dict__ if k!=text]))) - - outw = sys.stdout.write - l = 0 - cum = 0 - for W in _getFragWords(frags,360): - cum += W[0] - outw("fragword%d: cum=%3d size=%d" % (l, cum, W[0])) - for w in W[1:]: - outw(' (%s)' % fragDump(w)) - print() - l += 1 - - - from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle - from reportlab.lib.units import cm - import sys - TESTS = sys.argv[1:] - if TESTS==[]: TESTS=['4'] - def flagged(i,TESTS=TESTS): - return 'all' in TESTS or '*' in TESTS or str(i) in TESTS - - styleSheet = getSampleStyleSheet() - B = styleSheet['BodyText'] - style = ParagraphStyle("discussiontext", parent=B) - style.fontName= 'Helvetica' - if flagged(1): - text='''The CMYK or subtractive method follows the way a printer -mixes three pigments (cyan, magenta, and yellow) to form colors. -Because mixing chemicals is more difficult than combining light there -is a fourth parameter for darkness. For example a chemical -combination of the CMY pigments generally never makes a perfect -black -- instead producing a muddy color -- so, to get black printers -don't use the CMY pigments but use a direct black ink. Because -CMYK maps more directly to the way printer hardware works it may -be the case that &| & | colors specified in CMYK will provide better fidelity -and better control when printed. -''' - P=Paragraph(text,style) - dumpParagraphFrags(P) - aW, aH = 456.0, 42.8 - w,h = P.wrap(aW, aH) - dumpParagraphLines(P) - S = P.split(aW,aH) - for s in S: - s.wrap(aW,aH) - dumpParagraphLines(s) - aH = 500 - - if flagged(2): - P=Paragraph("""Price*""", styleSheet['Normal']) - dumpParagraphFrags(P) - w,h = P.wrap(24, 200) - dumpParagraphLines(P) - - if flagged(3): - text = """Dieses Kapitel bietet eine schnelle Programme :: starten - -Eingabeaufforderung :: (>>>) - ->>> (Eingabeaufforderung) - -Einführung in Python Python :: Einführung -. -Das Ziel ist, die grundlegenden Eigenschaften von Python darzustellen, ohne -sich zu sehr in speziellen Regeln oder Details zu verstricken. Dazu behandelt -dieses Kapitel kurz die wesentlichen Konzepte wie Variablen, Ausdrücke, -Kontrollfluss, Funktionen sowie Ein- und Ausgabe. Es erhebt nicht den Anspruch, -umfassend zu sein.""" - P=Paragraph(text, styleSheet['Code']) - dumpParagraphFrags(P) - w,h = P.wrap(6*72, 9.7*72) - dumpParagraphLines(P) - - if flagged(4): - text='''Die eingebaute Funktion range(i, j [, stride]) erzeugt eine Liste von Ganzzahlen und füllt sie mit Werten k, für die gilt: i <= k < j. Man kann auch eine optionale Schrittweite angeben. Die eingebaute Funktion xrange() erfüllt einen ähnlichen Zweck, gibt aber eine unveränderliche Sequenz vom Typ XRangeType zurück. Anstatt alle Werte in der Liste abzuspeichern, berechnet diese Liste ihre Werte, wann immer sie angefordert werden. Das ist sehr viel speicherschonender, wenn mit sehr langen Listen von Ganzzahlen gearbeitet wird. XRangeType kennt eine einzige Methode, s.tolist(), die seine Werte in eine Liste umwandelt.''' - aW = 420 - aH = 64.4 - P=Paragraph(text, B) - dumpParagraphFrags(P) - w,h = P.wrap(aW,aH) - print('After initial wrap',w,h) - dumpParagraphLines(P) - S = P.split(aW,aH) - dumpParagraphFrags(S[0]) - w0,h0 = S[0].wrap(aW,aH) - print('After split wrap',w0,h0) - dumpParagraphLines(S[0]) - - if flagged(5): - text = ' %s & %s < >]]>' % (chr(163),chr(163)) - P=Paragraph(text, styleSheet['Code']) - dumpParagraphFrags(P) - w,h = P.wrap(6*72, 9.7*72) - dumpParagraphLines(P) - - if flagged(6): - for text in ['''Here comes Helvetica 14 with strong emphasis.''', - '''Here comes Helvetica 14 with strong emphasis.''', - '''Here comes Courier 3cm and normal again.''', - ]: - P=Paragraph(text, styleSheet['Normal'], caseSensitive=0) - dumpParagraphFrags(P) - w,h = P.wrap(6*72, 9.7*72) - dumpParagraphLines(P) - - if flagged(7): - text = """Generated by:Dilbert""" - P=Paragraph(text, styleSheet['Code']) - dumpParagraphFrags(P) - w,h = P.wrap(6*72, 9.7*72) - dumpParagraphLines(P) - - if flagged(8): - text ="""- bullet 0
              - bullet 1
              - bullet 2
              - bullet 3
              - bullet 4
              - bullet 5""" - P=Paragraph(text, styleSheet['Normal']) - dumpParagraphFrags(P) - w,h = P.wrap(6*72, 9.7*72) - dumpParagraphLines(P) - S = P.split(6*72,h/2.0) - print(len(S)) - dumpParagraphLines(S[0]) - dumpParagraphLines(S[1]) - - - if flagged(9): - text="""Furthermore, the fundamental error of -regarding functional notions as -categorial delimits a general -convention regarding the forms of the
              -grammar. I suggested that these results -would follow from the assumption that""" - P=Paragraph(text,ParagraphStyle('aaa',parent=styleSheet['Normal'],align=TA_JUSTIFY)) - dumpParagraphFrags(P) - w,h = P.wrap(6*cm-12, 9.7*72) - dumpParagraphLines(P) - - if flagged(10): - text="""a b c\xc2\xa0d e f""" - P=Paragraph(text,ParagraphStyle('aaa',parent=styleSheet['Normal'],align=TA_JUSTIFY)) - dumpParagraphFrags(P) - w,h = P.wrap(6*cm-12, 9.7*72) - dumpParagraphLines(P) - - if flagged(11): - text="""This page tests out a number of attributes of the paraStyle tag. -This paragraph is in a style we have called "style1". It should be a normal paragraph, set in Courier 12 pt. -It should be a normal paragraph, set in Courier (not bold). -It should be a normal paragraph, set in Courier 12 pt.""" - P=Paragraph(text,style=ParagraphStyle('style1',fontName="Courier",fontSize=10)) - dumpParagraphFrags(P) - w,h = P.wrap(6.27*72-12,10000) - dumpParagraphLines(P) diff --git a/reportlab/platypus/paraparser.py b/reportlab/platypus/paraparser.py deleted file mode 100644 index 994b1853..00000000 --- a/reportlab/platypus/paraparser.py +++ /dev/null @@ -1,1349 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/platypus/paraparser.py -__version__=''' $Id$ ''' -__doc__='''The parser used to process markup within paragraphs''' -import string -import re -import sys -import os -import copy -import base64 -from pprint import pprint as pp - -try: - import pickle as pickle -except: - import pickle -import unicodedata -import reportlab.lib.sequencer - -from reportlab.lib.abag import ABag -from reportlab.lib.utils import ImageReader, isPy3, annotateException, encode_label, asUnicode, asBytes, uniChr -from reportlab.lib.colors import toColor, white, black, red, Color -from reportlab.lib.fonts import tt2ps, ps2tt -from reportlab.lib.enums import TA_LEFT, TA_RIGHT, TA_CENTER, TA_JUSTIFY -from reportlab.lib.units import inch,mm,cm,pica -if isPy3: - from html.parser import HTMLParser - from html.entities import name2codepoint -else: - from HTMLParser import HTMLParser - from htmlentitydefs import name2codepoint - -_re_para = re.compile(r'^\s*<\s*para(?:\s+|>|/>)') - -sizeDelta = 2 # amount to reduce font size by for super and sub script -subFraction = 0.5 # fraction of font size that a sub script should be lowered -superFraction = 0.5 # fraction of font size that a super script should be raised - -DEFAULT_INDEX_NAME='_indexAdd' - -def _convnum(s, unit=1, allowRelative=True): - if s[0] in ('+','-') and allowRelative: - try: - return ('relative',int(s)*unit) - except ValueError: - return ('relative',float(s)*unit) - else: - try: - return int(s)*unit - except ValueError: - return float(s)*unit - -def _num(s, unit=1, allowRelative=True): - """Convert a string like '10cm' to an int or float (in points). - The default unit is point, but optionally you can use other - default units like mm. - """ - if s.endswith('cm'): - unit=cm - s = s[:-2] - if s.endswith('in'): - unit=inch - s = s[:-2] - if s.endswith('pt'): - unit=1 - s = s[:-2] - if s.endswith('i'): - unit=inch - s = s[:-1] - if s.endswith('mm'): - unit=mm - s = s[:-2] - if s.endswith('pica'): - unit=pica - s = s[:-4] - return _convnum(s,unit,allowRelative) - -def _numpct(s,unit=1,allowRelative=False): - if s.endswith('%'): - return _PCT(_convnum(s[:-1],allowRelative=allowRelative)) - else: - return _num(s,unit,allowRelative) - -class _PCT: - def __init__(self,v): - self._value = v*0.01 - - def normalizedValue(self,normalizer): - normalizer = normalizer or getattr(self,'_normalizer') - return normalizer*self._value - -def _valignpc(s): - s = s.lower() - if s in ('baseline','sub','super','top','text-top','middle','bottom','text-bottom'): - return s - if s.endswith('%'): - n = _convnum(s[:-1]) - if isinstance(n,tuple): - n = n[1] - return _PCT(n) - n = _num(s) - if isinstance(n,tuple): - n = n[1] - return n - -def _autoLeading(x): - x = x.lower() - if x in ('','min','max','off'): - return x - raise ValueError('Invalid autoLeading=%r' % x ) - -def _align(s): - s = s.lower() - if s=='left': return TA_LEFT - elif s=='right': return TA_RIGHT - elif s=='justify': return TA_JUSTIFY - elif s in ('centre','center'): return TA_CENTER - else: raise ValueError('illegal alignment %r' % s) - -def _bAnchor(s): - s = s.lower() - if not s in ('start','middle','end','numeric'): - raise ValueError('illegal bullet anchor %r' % s) - return s - -_paraAttrMap = {'font': ('fontName', None), - 'face': ('fontName', None), - 'fontsize': ('fontSize', _num), - 'size': ('fontSize', _num), - 'leading': ('leading', _num), - 'autoleading': ('autoLeading', _autoLeading), - 'lindent': ('leftIndent', _num), - 'rindent': ('rightIndent', _num), - 'findent': ('firstLineIndent', _num), - 'align': ('alignment', _align), - 'spaceb': ('spaceBefore', _num), - 'spacea': ('spaceAfter', _num), - 'bfont': ('bulletFontName', None), - 'bfontsize': ('bulletFontSize',_num), - 'boffsety': ('bulletOffsetY',_num), - 'bindent': ('bulletIndent',_num), - 'bcolor': ('bulletColor',toColor), - 'banchor': ('bulletAnchor',_bAnchor), - 'color':('textColor',toColor), - 'backcolor':('backColor',toColor), - 'bgcolor':('backColor',toColor), - 'bg':('backColor',toColor), - 'fg': ('textColor',toColor), - } - -_bulletAttrMap = { - 'font': ('bulletFontName', None), - 'face': ('bulletFontName', None), - 'size': ('bulletFontSize',_num), - 'fontsize': ('bulletFontSize',_num), - 'offsety': ('bulletOffsetY',_num), - 'indent': ('bulletIndent',_num), - 'color': ('bulletColor',toColor), - 'fg': ('bulletColor',toColor), - 'anchor': ('bulletAnchor',_bAnchor), - } - -#things which are valid font attributes -_fontAttrMap = {'size': ('fontSize', _num), - 'face': ('fontName', None), - 'name': ('fontName', None), - 'fg': ('textColor', toColor), - 'color':('textColor', toColor), - 'backcolor':('backColor',toColor), - 'bgcolor':('backColor',toColor), - } -#things which are valid span attributes -_spanAttrMap = {'size': ('fontSize', _num), - 'face': ('fontName', None), - 'name': ('fontName', None), - 'fg': ('textColor', toColor), - 'color':('textColor', toColor), - 'backcolor':('backColor',toColor), - 'bgcolor':('backColor',toColor), - 'style': ('style',None), - } -#things which are valid font attributes -_linkAttrMap = {'size': ('fontSize', _num), - 'face': ('fontName', None), - 'name': ('fontName', None), - 'fg': ('textColor', toColor), - 'color':('textColor', toColor), - 'backcolor':('backColor',toColor), - 'bgcolor':('backColor',toColor), - 'dest': ('link', None), - 'destination': ('link', None), - 'target': ('link', None), - 'href': ('link', None), - } -_anchorAttrMap = {'fontSize': ('fontSize', _num), - 'fontName': ('fontName', None), - 'name': ('name', None), - 'fg': ('textColor', toColor), - 'color':('textColor', toColor), - 'backcolor':('backColor',toColor), - 'bgcolor':('backColor',toColor), - 'href': ('href', None), - } -_imgAttrMap = { - 'src': ('src', None), - 'width': ('width',_numpct), - 'height':('height',_numpct), - 'valign':('valign',_valignpc), - } -_indexAttrMap = { - 'name': ('name',None), - 'item': ('item',None), - 'offset': ('offset',None), - 'format': ('format',None), - } - -def _addAttributeNames(m): - K = list(m.keys()) - for k in K: - n = m[k][0] - if n not in m: m[n] = m[k] - n = n.lower() - if n not in m: m[n] = m[k] - -_addAttributeNames(_paraAttrMap) -_addAttributeNames(_fontAttrMap) -_addAttributeNames(_spanAttrMap) -_addAttributeNames(_bulletAttrMap) -_addAttributeNames(_anchorAttrMap) -_addAttributeNames(_linkAttrMap) - -def _applyAttributes(obj, attr): - for k, v in attr.items(): - if isinstance(v,(list,tuple)) and v[0]=='relative': - if hasattr(obj, k): - v = v[1]+getattr(obj,k) - else: - v = v[1] - setattr(obj,k,v) - -#Named character entities intended to be supported from the special font -#with additions suggested by Christoph Zwerschke who also suggested the -#numeric entity names that follow. -greeks = { - 'Aacute': u'\xc1', - 'aacute': u'\xe1', - 'Acirc': u'\xc2', - 'acirc': u'\xe2', - 'acute': u'\xb4', - 'AElig': u'\xc6', - 'aelig': u'\xe6', - 'Agrave': u'\xc0', - 'agrave': u'\xe0', - 'alefsym': u'\u2135', - 'Alpha': u'\u0391', - 'alpha': u'\u03b1', - 'and': u'\u2227', - 'ang': u'\u2220', - 'Aring': u'\xc5', - 'aring': u'\xe5', - 'asymp': u'\u2248', - 'Atilde': u'\xc3', - 'atilde': u'\xe3', - 'Auml': u'\xc4', - 'auml': u'\xe4', - 'bdquo': u'\u201e', - 'Beta': u'\u0392', - 'beta': u'\u03b2', - 'brvbar': u'\xa6', - 'bull': u'\u2022', - 'cap': u'\u2229', - 'Ccedil': u'\xc7', - 'ccedil': u'\xe7', - 'cedil': u'\xb8', - 'cent': u'\xa2', - 'Chi': u'\u03a7', - 'chi': u'\u03c7', - 'circ': u'\u02c6', - 'clubs': u'\u2663', - 'cong': u'\u2245', - 'copy': u'\xa9', - 'crarr': u'\u21b5', - 'cup': u'\u222a', - 'curren': u'\xa4', - 'dagger': u'\u2020', - 'Dagger': u'\u2021', - 'darr': u'\u2193', - 'dArr': u'\u21d3', - 'deg': u'\xb0', - 'delta': u'\u03b4', - 'Delta': u'\u2206', - 'diams': u'\u2666', - 'divide': u'\xf7', - 'Eacute': u'\xc9', - 'eacute': u'\xe9', - 'Ecirc': u'\xca', - 'ecirc': u'\xea', - 'Egrave': u'\xc8', - 'egrave': u'\xe8', - 'empty': u'\u2205', - 'emsp': u'\u2003', - 'ensp': u'\u2002', - 'Epsilon': u'\u0395', - 'epsilon': u'\u03b5', - 'epsiv': u'\u03b5', - 'equiv': u'\u2261', - 'Eta': u'\u0397', - 'eta': u'\u03b7', - 'ETH': u'\xd0', - 'eth': u'\xf0', - 'Euml': u'\xcb', - 'euml': u'\xeb', - 'euro': u'\u20ac', - 'exist': u'\u2203', - 'fnof': u'\u0192', - 'forall': u'\u2200', - 'frac12': u'\xbd', - 'frac14': u'\xbc', - 'frac34': u'\xbe', - 'frasl': u'\u2044', - 'Gamma': u'\u0393', - 'gamma': u'\u03b3', - 'ge': u'\u2265', - 'harr': u'\u2194', - 'hArr': u'\u21d4', - 'hearts': u'\u2665', - 'hellip': u'\u2026', - 'Iacute': u'\xcd', - 'iacute': u'\xed', - 'Icirc': u'\xce', - 'icirc': u'\xee', - 'iexcl': u'\xa1', - 'Igrave': u'\xcc', - 'igrave': u'\xec', - 'image': u'\u2111', - 'infin': u'\u221e', - 'int': u'\u222b', - 'Iota': u'\u0399', - 'iota': u'\u03b9', - 'iquest': u'\xbf', - 'isin': u'\u2208', - 'Iuml': u'\xcf', - 'iuml': u'\xef', - 'Kappa': u'\u039a', - 'kappa': u'\u03ba', - 'Lambda': u'\u039b', - 'lambda': u'\u03bb', - 'lang': u'\u2329', - 'laquo': u'\xab', - 'larr': u'\u2190', - 'lArr': u'\u21d0', - 'lceil': u'\uf8ee', - 'ldquo': u'\u201c', - 'le': u'\u2264', - 'lfloor': u'\uf8f0', - 'lowast': u'\u2217', - 'loz': u'\u25ca', - 'lrm': u'\u200e', - 'lsaquo': u'\u2039', - 'lsquo': u'\u2018', - 'macr': u'\xaf', - 'mdash': u'\u2014', - 'micro': u'\xb5', - 'middot': u'\xb7', - 'minus': u'\u2212', - 'mu': u'\xb5', - 'Mu': u'\u039c', - 'nabla': u'\u2207', - 'nbsp': u'\xa0', - 'ndash': u'\u2013', - 'ne': u'\u2260', - 'ni': u'\u220b', - 'notin': u'\u2209', - 'not': u'\xac', - 'nsub': u'\u2284', - 'Ntilde': u'\xd1', - 'ntilde': u'\xf1', - 'Nu': u'\u039d', - 'nu': u'\u03bd', - 'Oacute': u'\xd3', - 'oacute': u'\xf3', - 'Ocirc': u'\xd4', - 'ocirc': u'\xf4', - 'OElig': u'\u0152', - 'oelig': u'\u0153', - 'Ograve': u'\xd2', - 'ograve': u'\xf2', - 'oline': u'\uf8e5', - 'omega': u'\u03c9', - 'Omega': u'\u2126', - 'Omicron': u'\u039f', - 'omicron': u'\u03bf', - 'oplus': u'\u2295', - 'ordf': u'\xaa', - 'ordm': u'\xba', - 'or': u'\u2228', - 'Oslash': u'\xd8', - 'oslash': u'\xf8', - 'Otilde': u'\xd5', - 'otilde': u'\xf5', - 'otimes': u'\u2297', - 'Ouml': u'\xd6', - 'ouml': u'\xf6', - 'para': u'\xb6', - 'part': u'\u2202', - 'permil': u'\u2030', - 'perp': u'\u22a5', - 'phis': u'\u03c6', - 'Phi': u'\u03a6', - 'phi': u'\u03d5', - 'piv': u'\u03d6', - 'Pi': u'\u03a0', - 'pi': u'\u03c0', - 'plusmn': u'\xb1', - 'pound': u'\xa3', - 'prime': u'\u2032', - 'Prime': u'\u2033', - 'prod': u'\u220f', - 'prop': u'\u221d', - 'Psi': u'\u03a8', - 'psi': u'\u03c8', - 'radic': u'\u221a', - 'rang': u'\u232a', - 'raquo': u'\xbb', - 'rarr': u'\u2192', - 'rArr': u'\u21d2', - 'rceil': u'\uf8f9', - 'rdquo': u'\u201d', - 'real': u'\u211c', - 'reg': u'\xae', - 'rfloor': u'\uf8fb', - 'Rho': u'\u03a1', - 'rho': u'\u03c1', - 'rlm': u'\u200f', - 'rsaquo': u'\u203a', - 'rsquo': u'\u2019', - 'sbquo': u'\u201a', - 'Scaron': u'\u0160', - 'scaron': u'\u0161', - 'sdot': u'\u22c5', - 'sect': u'\xa7', - 'shy': u'\xad', - 'sigmaf': u'\u03c2', - 'sigmav': u'\u03c2', - 'Sigma': u'\u03a3', - 'sigma': u'\u03c3', - 'sim': u'\u223c', - 'spades': u'\u2660', - 'sube': u'\u2286', - 'sub': u'\u2282', - 'sum': u'\u2211', - 'sup1': u'\xb9', - 'sup2': u'\xb2', - 'sup3': u'\xb3', - 'supe': u'\u2287', - 'sup': u'\u2283', - 'szlig': u'\xdf', - 'Tau': u'\u03a4', - 'tau': u'\u03c4', - 'there4': u'\u2234', - 'thetasym': u'\u03d1', - 'thetav': u'\u03d1', - 'Theta': u'\u0398', - 'theta': u'\u03b8', - 'thinsp': u'\u2009', - 'THORN': u'\xde', - 'thorn': u'\xfe', - 'tilde': u'\u02dc', - 'times': u'\xd7', - 'trade': u'\uf8ea', - 'Uacute': u'\xda', - 'uacute': u'\xfa', - 'uarr': u'\u2191', - 'uArr': u'\u21d1', - 'Ucirc': u'\xdb', - 'ucirc': u'\xfb', - 'Ugrave': u'\xd9', - 'ugrave': u'\xf9', - 'uml': u'\xa8', - 'upsih': u'\u03d2', - 'Upsilon': u'\u03a5', - 'upsilon': u'\u03c5', - 'Uuml': u'\xdc', - 'uuml': u'\xfc', - 'weierp': u'\u2118', - 'Xi': u'\u039e', - 'xi': u'\u03be', - 'Yacute': u'\xdd', - 'yacute': u'\xfd', - 'yen': u'\xa5', - 'yuml': u'\xff', - 'Yuml': u'\u0178', - 'Zeta': u'\u0396', - 'zeta': u'\u03b6', - 'zwj': u'\u200d', - 'zwnj': u'\u200c', - } - -known_entities = dict([(k,uniChr(v)) for k,v in name2codepoint.items()]) -for k in greeks: - if k not in known_entities: - known_entities[k] = greeks[k] -f = isPy3 and asBytes or asUnicode -K = list(known_entities.keys()) -for k in K: - known_entities[f(k)] = known_entities[k] -del k, f, K - -#------------------------------------------------------------------------ -class ParaFrag(ABag): - """class ParaFrag contains the intermediate representation of string - segments as they are being parsed by the ParaParser. - fontname, fontSize, rise, textColor, cbDefn - """ - -_greek2Utf8=None -def _greekConvert(data): - global _greek2Utf8 - if not _greek2Utf8: - from reportlab.pdfbase.rl_codecs import RL_Codecs - import codecs - #our decoding map - dm = codecs.make_identity_dict(range(32,256)) - for k in range(0,32): - dm[k] = None - dm.update(RL_Codecs._RL_Codecs__rl_codecs_data['symbol'][0]) - _greek2Utf8 = {} - for k,v in dm.items(): - if not v: - u = '\0' - else: - if isPy3: - u = chr(v) - else: - u = unichr(v).encode('utf8') - _greek2Utf8[chr(k)] = u - return ''.join(map(_greek2Utf8.__getitem__,data)) - -#------------------------------------------------------------------ -# !!! NOTE !!! THIS TEXT IS NOW REPLICATED IN PARAGRAPH.PY !!! -# The ParaFormatter will be able to format the following -# tags: -# < /b > - bold -# < /i > - italics -# < u > < /u > - underline -# < strike > < /strike > - strike through -# < super > < /super > - superscript -# < sup > < /sup > - superscript -# < sub > < /sub > - subscript -# -# -# < bullet > - bullet text (at head of para only) -# -# -# link text -# attributes of links -# size/fontSize=num -# name/face/fontName=name -# fg/textColor/color=color -# backcolor/backColor/bgcolor=color -# dest/destination/target/href/link=target -#
              anchor text -# attributes of anchors -# fontSize=num -# fontName=name -# fg/textColor/color=color -# backcolor/backColor/bgcolor=color -# href=href -# -# -# -# -# width="w%" --> fontSize*w/100 idea from Roberto Alsina -# height="h%" --> linewidth*h/100 -# - -# -# The whole may be surrounded by tags -# -# It will also be able to handle any MathML specified Greek characters. -#------------------------------------------------------------------ -class ParaParser(HTMLParser): - - #---------------------------------------------------------- - # First we will define all of the xml tag handler functions. - # - # start_(attributes) - # end_() - # - # While parsing the xml ParaFormatter will call these - # functions to handle the string formatting tags. - # At the start of each tag the corresponding field will - # be set to 1 and at the end tag the corresponding field will - # be set to 0. Then when handle_data is called the options - # for that data will be aparent by the current settings. - #---------------------------------------------------------- - - def __getattr__( self, attrName ): - """This way we can handle the same way as (ignoring case).""" - if attrName!=attrName.lower() and attrName!="caseSensitive" and not self.caseSensitive and \ - (attrName.startswith("start_") or attrName.startswith("end_")): - return getattr(self,attrName.lower()) - raise AttributeError(attrName) - - #### bold - def start_b( self, attributes ): - self._push('b',bold=1) - - def end_b( self ): - self._pop('b') - - def start_strong( self, attributes ): - self._push('strong',bold=1) - - def end_strong( self ): - self._pop('strong') - - #### italics - def start_i( self, attributes ): - self._push('i',italic=1) - - def end_i( self ): - self._pop('i') - - def start_em( self, attributes ): - self._push('em', italic=1) - - def end_em( self ): - self._pop('em') - - #### underline - def start_u( self, attributes ): - self._push('u',underline=1) - - def end_u( self ): - self._pop('u') - - #### strike - def start_strike( self, attributes ): - self._push('strike',strike=1) - - def end_strike( self ): - self._pop('strike') - - #### link - def start_link(self, attributes): - self._push('link',**self.getAttributes(attributes,_linkAttrMap)) - - def end_link(self): - if self._pop('link').link is None: - raise ValueError(' has no target or href') - - #### anchor - def start_a(self, attributes): - A = self.getAttributes(attributes,_anchorAttrMap) - name = A.get('name',None) - if name is not None: - name = name.strip() - if not name: - self._syntax_error(' anchor variant requires non-blank name') - if len(A)>1: - self._syntax_error(' anchor variant only allows name attribute') - A = dict(name=A['name']) - A['_selfClosingTag'] = 'anchor' - else: - href = A.get('href','').strip() - A['link'] = href #convert to our link form - A.pop('href',None) - self._push('a',**A) - - def end_a(self): - frag = self._stack[-1] - sct = getattr(frag,'_selfClosingTag','') - if sct: - if not (sct=='anchor' and frag.name): - raise ValueError('Parser failure in ') - defn = frag.cbDefn = ABag() - defn.label = defn.kind = 'anchor' - defn.name = frag.name - del frag.name, frag._selfClosingTag - self.handle_data('') - self._pop('a') - else: - if self._pop('a').link is None: - raise ValueError(' has no href') - - def start_img(self,attributes): - A = self.getAttributes(attributes,_imgAttrMap) - if not A.get('src'): - self._syntax_error(' needs src attribute') - A['_selfClosingTag'] = 'img' - self._push('img',**A) - - def end_img(self): - frag = self._stack[-1] - if not getattr(frag,'_selfClosingTag',''): - raise ValueError('Parser failure in ') - defn = frag.cbDefn = ABag() - defn.kind = 'img' - defn.src = getattr(frag,'src',None) - defn.image = ImageReader(defn.src) - size = defn.image.getSize() - defn.width = getattr(frag,'width',size[0]) - defn.height = getattr(frag,'height',size[1]) - defn.valign = getattr(frag,'valign','bottom') - del frag._selfClosingTag - self.handle_data('') - self._pop('img') - - #### super script - def start_super( self, attributes ): - self._push('super',super=1) - - def end_super( self ): - self._pop('super') - - def start_sup( self, attributes ): - self._push('sup',super=1) - - def end_sup( self ): - self._pop('sup') - - #### sub script - def start_sub( self, attributes ): - self._push('sub',sub=1) - - def end_sub( self ): - self._pop('sub') - - #### greek script - #### add symbol encoding - def handle_charref(self, name): - try: - if name[0]=='x': - n = int(name[1:],16) - else: - n = int(name) - except ValueError: - self.unknown_charref(name) - return - self.handle_data(uniChr(n)) #.encode('utf8')) - - def syntax_error(self,lineno,message): - self._syntax_error(message) - - def _syntax_error(self,message): - if message[:10]=="attribute " and message[-17:]==" value not quoted": return - self.errors.append(message) - - def start_greek(self, attr): - self._push('greek',greek=1) - - def end_greek(self): - self._pop('greek') - - def start_unichar(self, attr): - if 'name' in attr: - if 'code' in attr: - self._syntax_error(' invalid with both name and code attributes') - try: - v = unicodedata.lookup(attr['name']) - except KeyError: - self._syntax_error(' invalid name attribute\n"%s"' % ascii(attr['name'])) - v = '\0' - elif 'code' in attr: - try: - v = int(eval(attr['code'])) - v = chr(v) if isPy3 else unichr(v) - except: - self._syntax_error(' invalid code attribute %s' % ascii(attr['code'])) - v = '\0' - else: - v = None - if attr: - self._syntax_error(' invalid attribute %s' % list(attr.keys())[0]) - - if v is not None: - self.handle_data(v) - self._push('unichar',_selfClosingTag='unichar') - - def end_unichar(self): - self._pop('unichar') - - def start_font(self,attr): - A = self.getAttributes(attr,_spanAttrMap) - if 'fontName' in A: - A['fontName'], A['bold'], A['italic'] = ps2tt(A['fontName']) - self._push('font',**A) - - def end_font(self): - self._pop('font') - - def start_span(self,attr): - A = self.getAttributes(attr,_spanAttrMap) - if 'style' in A: - style = self.findSpanStyle(A.pop('style')) - D = {} - for k in 'fontName fontSize textColor backColor'.split(): - v = getattr(style,k,self) - if v is self: continue - D[k] = v - D.update(A) - A = D - if 'fontName' in A: - A['fontName'], A['bold'], A['italic'] = ps2tt(A['fontName']) - self._push('span',**A) - - def end_span(self): - self._pop('span') - - def start_br(self, attr): - self._push('br',_selfClosingTag='br',lineBreak=True,text='') - - def end_br(self): - #print('\nend_br called, %d frags in list' % len(self.fragList)) - frag = self._stack[-1] - if not (frag._selfClosingTag=='br' and frag.lineBreak): - raise ValueError('Parser failure in
              ') - del frag._selfClosingTag - self.handle_data('') - self._pop('br') - - def _initial_frag(self,attr,attrMap,bullet=0): - style = self._style - if attr!={}: - style = copy.deepcopy(style) - _applyAttributes(style,self.getAttributes(attr,attrMap)) - self._style = style - - # initialize semantic values - frag = ParaFrag() - frag.sub = 0 - frag.super = 0 - frag.rise = 0 - frag.underline = 0 - frag.strike = 0 - frag.greek = 0 - frag.link = None - if bullet: - frag.fontName, frag.bold, frag.italic = ps2tt(style.bulletFontName) - frag.fontSize = style.bulletFontSize - frag.textColor = hasattr(style,'bulletColor') and style.bulletColor or style.textColor - else: - frag.fontName, frag.bold, frag.italic = ps2tt(style.fontName) - frag.fontSize = style.fontSize - frag.textColor = style.textColor - return frag - - def start_para(self,attr): - frag = self._initial_frag(attr,_paraAttrMap) - frag.__tag__ = 'para' - self._stack = [frag] - - def end_para(self): - self._pop('para') - - def start_bullet(self,attr): - if hasattr(self,'bFragList'): - self._syntax_error('only one tag allowed') - self.bFragList = [] - frag = self._initial_frag(attr,_bulletAttrMap,1) - frag.isBullet = 1 - frag.__tag__ = 'bullet' - self._stack.append(frag) - - def end_bullet(self): - self._pop('bullet') - - #--------------------------------------------------------------- - def start_seqdefault(self, attr): - try: - default = attr['id'] - except KeyError: - default = None - self._seq.setDefaultCounter(default) - - def end_seqdefault(self): - pass - - def start_seqreset(self, attr): - try: - id = attr['id'] - except KeyError: - id = None - try: - base = int(attr['base']) - except: - base=0 - self._seq.reset(id, base) - - def end_seqreset(self): - pass - - def start_seqchain(self, attr): - try: - order = attr['order'] - except KeyError: - order = '' - order = order.split() - seq = self._seq - for p,c in zip(order[:-1],order[1:]): - seq.chain(p, c) - end_seqchain = end_seqreset - - def start_seqformat(self, attr): - try: - id = attr['id'] - except KeyError: - id = None - try: - value = attr['value'] - except KeyError: - value = '1' - self._seq.setFormat(id,value) - end_seqformat = end_seqreset - - # AR hacking in aliases to allow the proper casing for RML. - # the above ones should be deprecated over time. 2001-03-22 - start_seqDefault = start_seqdefault - end_seqDefault = end_seqdefault - start_seqReset = start_seqreset - end_seqReset = end_seqreset - start_seqChain = start_seqchain - end_seqChain = end_seqchain - start_seqFormat = start_seqformat - end_seqFormat = end_seqformat - - def start_seq(self, attr): - #if it has a template, use that; otherwise try for id; - #otherwise take default sequence - if 'template' in attr: - templ = attr['template'] - self.handle_data(templ % self._seq) - return - elif 'id' in attr: - id = attr['id'] - else: - id = None - increment = attr.get('inc', None) - if not increment: - output = self._seq.nextf(id) - else: - #accepts "no" for do not increment, or an integer. - #thus, 0 and 1 increment by the right amounts. - if increment.lower() == 'no': - output = self._seq.thisf(id) - else: - incr = int(increment) - output = self._seq.thisf(id) - self._seq.reset(id, self._seq._this() + incr) - self.handle_data(output) - - def end_seq(self): - pass - - def start_ondraw(self,attr): - defn = ABag() - if 'name' in attr: defn.name = attr['name'] - else: self._syntax_error(' needs at least a name attribute') - - if 'label' in attr: defn.label = attr['label'] - defn.kind='onDraw' - self._push('ondraw',cbDefn=defn) - self.handle_data('') - self._pop('ondraw') - start_onDraw=start_ondraw - end_onDraw=end_ondraw=end_seq - - def start_index(self,attr): - attr=self.getAttributes(attr,_indexAttrMap) - defn = ABag() - if 'item' in attr: - label = attr['item'] - else: - self._syntax_error(' needs at least an item attribute') - if 'name' in attr: - name = attr['name'] - else: - name = DEFAULT_INDEX_NAME - format = attr.get('format',None) - if format is not None and format not in ('123','I','i','ABC','abc'): - raise ValueError('index tag format is %r not valid 123 I i ABC or abc' % offset) - offset = attr.get('offset',None) - if offset is not None: - try: - offset = int(offset) - except: - raise ValueError('index tag offset is %r not an int' % offset) - defn.label = encode_label((label,format,offset)) - defn.name = name - defn.kind='index' - self._push('index',cbDefn=defn) - self.handle_data('') - self._pop('index',) - end_index=end_seq - - def start_unknown(self,attr): - pass - end_unknown=end_seq - - #--------------------------------------------------------------- - def _push(self,tag,**attr): - frag = copy.copy(self._stack[-1]) - frag.__tag__ = tag - _applyAttributes(frag,attr) - self._stack.append(frag) - - def _pop(self,tag): - frag = self._stack.pop() - if tag==frag.__tag__: return frag - raise ValueError('Parse error: saw instead of expected ' % (tag,frag.__tag__)) - - def getAttributes(self,attr,attrMap): - A = {} - for k, v in attr.items(): - if not self.caseSensitive: - k = k.lower() - if k in list(attrMap.keys()): - j = attrMap[k] - func = j[1] - try: - A[j[0]] = v if func is None else func(v) - except: - self._syntax_error('%s: invalid value %s'%(k,v)) - else: - self._syntax_error('invalid attribute name %s'%k) - return A - - #---------------------------------------------------------------- - - def __init__(self,verbose=0, caseSensitive=0, ignoreUnknownTags=1): - HTMLParser.__init__(self, - **(dict(convert_charrefs=False) if sys.version_info>=(3,4) else {})) - self.verbose = verbose - #HTMLParser is case insenstive anyway, but the rml interface still needs this - #all start/end_ methods should have a lower case version for HMTMParser - self.caseSensitive = caseSensitive - self.ignoreUnknownTags = ignoreUnknownTags - - def _iReset(self): - self.fragList = [] - if hasattr(self, 'bFragList'): delattr(self,'bFragList') - - def _reset(self, style): - '''reset the parser''' - - HTMLParser.reset(self) - # initialize list of string segments to empty - self.errors = [] - self._style = style - self._iReset() - - #---------------------------------------------------------------- - def handle_data(self,data): - "Creates an intermediate representation of string segments." - - #The old parser would only 'see' a string after all entities had - #been processed. Thus, 'Hello ™ World' would emerge as one - #fragment. HTMLParser processes these separately. We want to ensure - #that successive calls like this are concatenated, to prevent too many - #fragments being created. - - frag = copy.copy(self._stack[-1]) - if hasattr(frag,'cbDefn'): - kind = frag.cbDefn.kind - if data: self._syntax_error('Only empty <%s> tag allowed' % kind) - elif hasattr(frag,'_selfClosingTag'): - if data!='': self._syntax_error('No content allowed in %s tag' % frag._selfClosingTag) - return - else: - # if sub and super are both on they will cancel each other out - if frag.sub == 1 and frag.super == 1: - frag.sub = 0 - frag.super = 0 - - if frag.sub: - frag.rise = -frag.fontSize*subFraction - frag.fontSize = max(frag.fontSize-sizeDelta,3) - elif frag.super: - frag.rise = frag.fontSize*superFraction - frag.fontSize = max(frag.fontSize-sizeDelta,3) - - if frag.greek: - frag.fontName = 'symbol' - data = _greekConvert(data) - - # bold, italic, and underline - frag.fontName = tt2ps(frag.fontName,frag.bold,frag.italic) - - #save our data - frag.text = data - - if hasattr(frag,'isBullet'): - delattr(frag,'isBullet') - self.bFragList.append(frag) - else: - self.fragList.append(frag) - - def handle_cdata(self,data): - self.handle_data(data) - - def _setup_for_parse(self,style): - self._seq = reportlab.lib.sequencer.getSequencer() - self._reset(style) # reinitialise the parser - - def _complete_parse(self): - "Reset after parsing, to be ready for next paragraph" - del self._seq - style = self._style - del self._style - if len(self.errors)==0: - fragList = self.fragList - bFragList = hasattr(self,'bFragList') and self.bFragList or None - self._iReset() - else: - fragList = bFragList = None - - return style, fragList, bFragList - - def _tt_handle(self,tt): - "Iterate through a pre-parsed tuple tree (e.g. from pyRXP)" - #import pprint - #pprint.pprint(tt) - #find the corresponding start_tagname and end_tagname methods. - #These must be defined. - tag = tt[0] - try: - start = getattr(self,'start_'+tag) - end = getattr(self,'end_'+tag) - except AttributeError: - if not self.ignoreUnknownTags: - raise ValueError('Invalid tag "%s"' % tag) - start = self.start_unknown - end = self.end_unknown - - #call the start_tagname method - start(tt[1] or {}) - #if tree node has any children, they will either be further nodes, - #or text. Accordingly, call either this function, or handle_data. - C = tt[2] - if C: - M = self._tt_handlers - for c in C: - M[isinstance(c,(list,tuple))](c) - - #call the end_tagname method - end() - - def _tt_start(self,tt): - self._tt_handlers = self.handle_data,self._tt_handle - self._tt_handle(tt) - - def tt_parse(self,tt,style): - '''parse from tupletree form''' - self._setup_for_parse(style) - self._tt_start(tt) - return self._complete_parse() - - def findSpanStyle(self,style): - raise ValueError('findSpanStyle not implemented in this parser') - - #HTMLParser interface - def parse(self, text, style): - "attempt replacement for parse" - self._setup_for_parse(style) - text = asUnicode(text) - if not(len(text)>=6 and text[0]=='<' and _re_para.match(text)): - text = u""+text+u"" - try: - self.feed(text) - except: - annotateException('\nparagraph text %s caused exception' % ascii(text)) - return self._complete_parse() - - def handle_starttag(self, tag, attrs): - "Called by HTMLParser when a tag starts" - - #tuple tree parser used to expect a dict. HTML parser - #gives list of two-element tuples - if isinstance(attrs, list): - d = {} - for (k, v) in attrs: - d[k] = v - attrs = d - if not self.caseSensitive: tag = tag.lower() - try: - start = getattr(self,'start_'+tag) - except AttributeError: - if not self.ignoreUnknownTags: - raise ValueError('Invalid tag "%s"' % tag) - start = self.start_unknown - #call it - start(attrs or {}) - - def handle_endtag(self, tag): - "Called by HTMLParser when a tag ends" - #find the existing end_tagname method - if not self.caseSensitive: tag = tag.lower() - try: - end = getattr(self,'end_'+tag) - except AttributeError: - if not self.ignoreUnknownTags: - raise ValueError('Invalid tag "%s"' % tag) - end = self.end_unknown - #call it - end() - - def handle_entityref(self, name): - "Handles a named entity. " - try: - v = known_entities[name] - except: - v = u'&%s;' % name - self.handle_data(v) - -if __name__=='__main__': - from reportlab.platypus import cleanBlockQuotedText - from reportlab.lib.styles import _baseFontName - _parser=ParaParser() - def check_text(text,p=_parser): - print('##########') - text = cleanBlockQuotedText(text) - l,rv,bv = p.parse(text,style) - if rv is None: - for l in _parser.errors: - print(l) - else: - print('ParaStyle', l.fontName,l.fontSize,l.textColor) - for l in rv: - sys.stdout.write(l.fontName,l.fontSize,l.textColor,l.bold, l.rise, '|%s|'%l.text[:25]) - if hasattr(l,'cbDefn'): - print('cbDefn',getattr(l.cbDefn,'name',''),getattr(l.cbDefn,'label',''),l.cbDefn.kind) - else: print() - - style=ParaFrag() - style.fontName=_baseFontName - style.fontSize = 12 - style.textColor = black - style.bulletFontName = black - style.bulletFontName=_baseFontName - style.bulletFontSize=12 - - text=''' - aDβ - - Tell me, O muse, of that ingenious hero who travelled far and wide - after he had sacked the famous town of Troy. Many cities did he visit, - and many were the nations with whose manners and customs he was acquainted; - moreover he suffered much by sea while trying to save his own life - and bring his men safely home; but do what he might he could not save - his men, for they perished through their own sheer folly in eating - the cattle of the Sun-god Hyperion; so the god prevented them from - ever reaching home. Tell me, too, about all these things, O daughter - of Jove, from whatsoever source you1 may know them. - ''' - check_text(text) - check_text(' ') - check_text('ReportLab -- Reporting for the Internet Age'%_baseFontName) - check_text(''' - τTell me, O muse, of that ingenious hero who travelled far and wide - after he had sacked the famous town of Troy. Many cities did he visit, - and many were the nations with whose manners and customs he was acquainted; - moreover he suffered much by sea while trying to save his own life - and bring his men safely home; but do what he might he could not save - his men, for they perished through their own sheer folly in eating - the cattle of the Sun-god Hyperion; so the god prevented them from - ever reaching home. Tell me, too, about all these things, O daughter - of Jove, from whatsoever source you may know them.''') - check_text(''' - Telemachus took this speech as of good omen and rose at once, for - he was bursting with what he had to say. He stood in the middle of - the assembly and the good herald Pisenor brought him his staff. Then, - turning to Aegyptius, "Sir," said he, "it is I, as you will shortly - learn, who have convened you, for it is I who am the most aggrieved. - I have not got wind of any host approaching about which I would warn - you, nor is there any matter of public moment on which I would speak. - My grieveance is purely personal, and turns on two great misfortunes - which have fallen upon my house. The first of these is the loss of - my excellent father, who was chief among all you here present, and - was like a father to every one of you; the second is much more serious, - and ere long will be the utter ruin of my estate. The sons of all - the chief men among you are pestering my mother to marry them against - her will. They are afraid to go to her father Icarius, asking him - to choose the one he likes best, and to provide marriage gifts for - his daughter, but day by day they keep hanging about my father's house, - sacrificing our oxen, sheep, and fat goats for their banquets, and - never giving so much as a thought to the quantity of wine they drink. - No estate can stand such recklessness; we have now no Ulysses to ward - off harm from our doors, and I cannot hold my own against them. I - shall never all my days be as good a man as he was, still I would - indeed defend myself if I had power to do so, for I cannot stand such - treatment any longer; my house is being disgraced and ruined. Have - respect, therefore, to your own consciences and to public opinion. - Fear, too, the wrath of heaven, lest the gods should be displeased - and turn upon you. I pray you by Jove and Themis, who is the beginning - and the end of councils, [do not] hold back, my friends, and leave - me singlehanded- unless it be that my brave father Ulysses did some - wrong to the Achaeans which you would now avenge on me, by aiding - and abetting these suitors. Moreover, if I am to be eaten out of house - and home at all, I had rather you did the eating yourselves, for I - could then take action against you to some purpose, and serve you - with notices from house to house till I got paid in full, whereas - now I have no remedy."''') - - check_text(''' -But as the sun was rising from the fair sea into the firmament of -heaven to shed light on mortals and immortals, they reached Pylos -the city of Neleus. Now the people of Pylos were gathered on the sea -shore to offer sacrifice of black bulls to Neptune lord of the Earthquake. -There were nine guilds with five hundred men in each, and there were -nine bulls to each guild. As they were eating the inward meats and -burning the thigh bones [on the embers] in the name of Neptune, Telemachus -and his crew arrived, furled their sails, brought their ship to anchor, -and went ashore. ''') - check_text(''' -So the neighbours and kinsmen of Menelaus were feasting and making -merry in his house. There was a bard also to sing to them and play -his lyre, while two tumblers went about performing in the midst of -them when the man struck up with his tune.]''') - check_text(''' -"When we had passed the [Wandering] rocks, with Scylla and terrible -Charybdis, we reached the noble island of the sun-god, where were -the goodly cattle and sheep belonging to the sun Hyperion. While still -at sea in my ship I could bear the cattle lowing as they came home -to the yards, and the sheep bleating. Then I remembered what the blind -Theban prophet Teiresias had told me, and how carefully Aeaean Circe -had warned me to shun the island of the blessed sun-god. So being -much troubled I said to the men, 'My men, I know you are hard pressed, -but listen while I tell you the prophecy that Teiresias made me, and -how carefully Aeaean Circe warned me to shun the island of the blessed -sun-god, for it was here, she said, that our worst danger would lie. -Head the ship, therefore, away from the island.''') - check_text('''A<B>C&D"E'F''') - check_text('''A< B> C& D" E' F''') - check_text('''&'"]]>''') - check_text('''+ -There was a bard also to sing to them and play -his lyre, while two tumblers went about performing in the midst of -them when the man struck up with his tune.]''') - check_text('''A paragraph''') - check_text('''B paragraph''') - # HVB, 30.05.2003: Test for new features - _parser.caseSensitive=0 - check_text('''Here comes Helvetica 14 with strong emphasis.''') - check_text('''Here comes Helvetica 14 with strong emphasis.''') - check_text('''Here comes Courier 3cm and normal again.''') - check_text('''Before the break
              the middle line
              and the last line.''') - check_text('''This should be an inline image !''') - check_text('''aaa bbbb underline cccc''') diff --git a/reportlab/platypus/tableofcontents.py b/reportlab/platypus/tableofcontents.py deleted file mode 100644 index 53ed64a4..00000000 --- a/reportlab/platypus/tableofcontents.py +++ /dev/null @@ -1,553 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/platypus/tableofcontents.py - -__version__=''' $Id$ ''' -__doc__="""Experimental class to generate Tables of Contents easily - -This module defines a single TableOfContents() class that can be used to -create automatically a table of tontents for Platypus documents like -this: - - story = [] - toc = TableOfContents() - story.append(toc) - # some heading paragraphs here... - doc = MyTemplate(path) - doc.multiBuild(story) - -The data needed to create the table is a list of (level, text, pageNum) -triplets, plus some paragraph styles for each level of the table itself. -The triplets will usually be created in a document template's method -like afterFlowable(), making notification calls using the notify() -method with appropriate data like this: - - (level, text, pageNum) = ... - self.notify('TOCEntry', (level, text, pageNum)) - -Optionally the list can contain four items in which case the last item -is a destination key which the entry should point to. A bookmark -with this key needs to be created first like this: - - key = 'ch%s' % self.seq.nextf('chapter') - self.canv.bookmarkPage(key) - self.notify('TOCEntry', (level, text, pageNum, key)) - -As the table of contents need at least two passes over the Platypus -story which is why the moultiBuild0() method must be called. - -The levelParaStyle variables are the paragraph styles used -to format the entries in the table of contents. Their indentation -is calculated like this: each entry starts at a multiple of some -constant named delta. If one entry spans more than one line, all -lines after the first are indented by the same constant named -epsilon. -""" - -from reportlab.lib import enums -from reportlab.lib.units import cm -from reportlab.lib.utils import commasplit, escapeOnce, encode_label, decode_label, strTypes -from reportlab.lib.styles import ParagraphStyle, _baseFontName -from reportlab.platypus.paragraph import Paragraph -from reportlab.platypus.doctemplate import IndexingFlowable -from reportlab.platypus.tables import TableStyle, Table -from reportlab.platypus.flowables import Spacer, Flowable -from reportlab.pdfbase.pdfmetrics import stringWidth -from reportlab.pdfgen import canvas - -def unquote(txt): - from xml.sax.saxutils import unescape - return unescape(txt, {"'": "'", """: '"'}) - -try: - set -except: - class set(list): - def add(self,x): - if x not in self: - list.append(self,x) - -def drawPageNumbers(canvas, style, pages, availWidth, availHeight, dot=' . '): - ''' - Draws pagestr on the canvas using the given style. - If dot is None, pagestr is drawn at the current position in the canvas. - If dot is a string, pagestr is drawn right-aligned. If the string is not empty, - the gap is filled with it. - ''' - pagestr = ', '.join([str(p) for p, _ in pages]) - x, y = canvas._curr_tx_info['cur_x'], canvas._curr_tx_info['cur_y'] - - fontSize = style.fontSize - pagestrw = stringWidth(pagestr, style.fontName, fontSize) - - #if it's too long to fit, we need to shrink to fit in 10% increments. - #it would be very hard to output multiline entries. - #however, we impose a minimum size of 1 point as we don't want an - #infinite loop. Ultimately we should allow a TOC entry to spill - #over onto a second line if needed. - freeWidth = availWidth-x - while pagestrw > freeWidth and fontSize >= 1.0: - fontSize = 0.9 * fontSize - pagestrw = stringWidth(pagestr, style.fontName, fontSize) - - - if isinstance(dot, strTypes): - if dot: - dotw = stringWidth(dot, style.fontName, fontSize) - dotsn = int((availWidth-x-pagestrw)/dotw) - else: - dotsn = dotw = 0 - text = '%s%s' % (dotsn * dot, pagestr) - newx = availWidth - dotsn*dotw - pagestrw - pagex = availWidth - pagestrw - elif dot is None: - text = ', ' + pagestr - newx = x - pagex = newx - else: - raise TypeError('Argument dot should either be None or an instance of basestring.') - - tx = canvas.beginText(newx, y) - tx.setFont(style.fontName, fontSize) - tx.setFillColor(style.textColor) - tx.textLine(text) - canvas.drawText(tx) - - commaw = stringWidth(', ', style.fontName, fontSize) - for p, key in pages: - if not key: - continue - w = stringWidth(str(p), style.fontName, fontSize) - canvas.linkRect('', key, (pagex, y, pagex+w, y+style.leading), relative=1) - pagex += w + commaw - -# Default paragraph styles for tables of contents. -# (This could also be generated automatically or even -# on-demand if it is not known how many levels the -# TOC will finally need to display...) - -delta = 1*cm -epsilon = 0.5*cm - -defaultLevelStyles = [ - ParagraphStyle( - name='Level 0', - fontName=_baseFontName, - fontSize=10, - leading=11, - firstLineIndent = 0, - leftIndent = epsilon)] - -defaultTableStyle = \ - TableStyle([ - ('VALIGN', (0,0), (-1,-1), 'TOP'), - ('RIGHTPADDING', (0,0), (-1,-1), 0), - ('LEFTPADDING', (0,0), (-1,-1), 0), - ]) - -class TableOfContents(IndexingFlowable): - """This creates a formatted table of contents. - - It presumes a correct block of data is passed in. - The data block contains a list of (level, text, pageNumber) - triplets. You can supply a paragraph style for each level - (starting at zero). - Set dotsMinLevel to determine from which level on a line of - dots should be drawn between the text and the page number. - If dotsMinLevel is set to a negative value, no dotted lines are drawn. - """ - - def __init__(self): - self.rightColumnWidth = 72 - self.levelStyles = defaultLevelStyles - self.tableStyle = defaultTableStyle - self.dotsMinLevel = 1 - self._table = None - self._entries = [] - self._lastEntries = [] - - def beforeBuild(self): - # keep track of the last run - self._lastEntries = self._entries[:] - self.clearEntries() - - def isIndexing(self): - return 1 - - def isSatisfied(self): - return (self._entries == self._lastEntries) - - def notify(self, kind, stuff): - """The notification hook called to register all kinds of events. - - Here we are interested in 'TOCEntry' events only. - """ - if kind == 'TOCEntry': - self.addEntry(*stuff) - - def clearEntries(self): - self._entries = [] - - def getLevelStyle(self, n): - '''Returns the style for level n, generating and caching styles on demand if not present.''' - try: - return self.levelStyles[n] - except IndexError: - prevstyle = self.getLevelStyle(n-1) - self.levelStyles.append(ParagraphStyle( - name='%s-%d-indented' % (prevstyle.name, n), - parent=prevstyle, - firstLineIndent = prevstyle.firstLineIndent+delta, - leftIndent = prevstyle.leftIndent+delta)) - return self.levelStyles[n] - - def addEntry(self, level, text, pageNum, key=None): - """Adds one entry to the table of contents. - - This allows incremental buildup by a doctemplate. - Requires that enough styles are defined.""" - - assert type(level) == type(1), "Level must be an integer" - self._entries.append((level, text, pageNum, key)) - - - def addEntries(self, listOfEntries): - """Bulk creation of entries in the table of contents. - - If you knew the titles but not the page numbers, you could - supply them to get sensible output on the first run.""" - - for entryargs in listOfEntries: - self.addEntry(*entryargs) - - - def wrap(self, availWidth, availHeight): - "All table properties should be known by now." - - # makes an internal table which does all the work. - # we draw the LAST RUN's entries! If there are - # none, we make some dummy data to keep the table - # from complaining - if len(self._lastEntries) == 0: - _tempEntries = [(0,'Placeholder for table of contents',0,None)] - else: - _tempEntries = self._lastEntries - - def drawTOCEntryEnd(canvas, kind, label): - '''Callback to draw dots and page numbers after each entry.''' - label = label.split(',') - page, level, key = int(label[0]), int(label[1]), eval(label[2],{}) - style = self.getLevelStyle(level) - if self.dotsMinLevel >= 0 and level >= self.dotsMinLevel: - dot = ' . ' - else: - dot = '' - drawPageNumbers(canvas, style, [(page, key)], availWidth, availHeight, dot) - self.canv.drawTOCEntryEnd = drawTOCEntryEnd - - tableData = [] - for (level, text, pageNum, key) in _tempEntries: - style = self.getLevelStyle(level) - if key: - text = '
              %s' % (key, text) - keyVal = repr(key).replace(',','\\x2c').replace('"','\\x2c') - else: - keyVal = None - para = Paragraph('%s' % (text, pageNum, level, keyVal), style) - if style.spaceBefore: - tableData.append([Spacer(1, style.spaceBefore),]) - tableData.append([para,]) - - self._table = Table(tableData, colWidths=(availWidth,), style=self.tableStyle) - - self.width, self.height = self._table.wrapOn(self.canv,availWidth, availHeight) - return (self.width, self.height) - - - def split(self, availWidth, availHeight): - """At this stage we do not care about splitting the entries, - we will just return a list of platypus tables. Presumably the - calling app has a pointer to the original TableOfContents object; - Platypus just sees tables. - """ - return self._table.splitOn(self.canv,availWidth, availHeight) - - - def drawOn(self, canvas, x, y, _sW=0): - """Don't do this at home! The standard calls for implementing - draw(); we are hooking this in order to delegate ALL the drawing - work to the embedded table object. - """ - self._table.drawOn(canvas, x, y, _sW) - -def makeTuple(x): - if hasattr(x, '__iter__'): - return tuple(x) - return (x,) - -class SimpleIndex(IndexingFlowable): - """Creates multi level indexes. - The styling can be cutomized and alphabetic headers turned on and off. - """ - - def __init__(self, **kwargs): - """ - Constructor of SimpleIndex. - Accepts the same arguments as the setup method. - """ - #keep stuff in a dictionary while building - self._entries = {} - self._lastEntries = {} - self._flowable = None - self.setup(**kwargs) - - def getFormatFunc(self,format): - try: - D = {} - exec('from reportlab.lib.sequencer import _format_%s as formatFunc' % format, D) - return D['formatFunc'] - except ImportError: - raise ValueError('Unknown format %r' % format) - - def setup(self, style=None, dot=None, tableStyle=None, headers=True, name=None, format='123', offset=0): - """ - This method makes it possible to change styling and other parameters on an existing object. - - style is the paragraph style to use for index entries. - dot can either be None or a string. If it's None, entries are immediatly followed by their - corresponding page numbers. If it's a string, page numbers are aligned on the right side - of the document and the gap filled with a repeating sequence of the string. - tableStyle is the style used by the table which the index uses to draw itself. Use this to - change properties like spacing between elements. - headers is a boolean. If it is True, alphabetic headers are displayed in the Index when the first - letter changes. If False, we just output some extra space before the next item - name makes it possible to use several indexes in one document. If you want this use this - parameter to give each index a unique name. You can then index a term by refering to the - name of the index which it should appear in: - - - - format can be 'I', 'i', '123', 'ABC', 'abc' - """ - - if style is None: - style = ParagraphStyle(name='index', - fontName=_baseFontName, - fontSize=11) - self.textStyle = style - self.tableStyle = tableStyle or defaultTableStyle - self.dot = dot - self.headers = headers - if name is None: - from reportlab.platypus.paraparser import DEFAULT_INDEX_NAME as name - self.name = name - self.formatFunc = self.getFormatFunc(format) - self.offset = offset - - def __call__(self,canv,kind,label): - try: - terms, format, offset = decode_label(label) - except: - terms = label - format = offset = None - if format is None: - formatFunc = self.formatFunc - else: - formatFunc = self.getFormatFunc(format) - if offset is None: - offset = self.offset - - terms = commasplit(terms) - cPN = canv.getPageNumber() - pns = formatFunc(cPN-offset) - key = 'ix_%s_%s_p_%s' % (self.name, label, pns) - - info = canv._curr_tx_info - canv.bookmarkHorizontal(key, info['cur_x'], info['cur_y'] + info['leading']) - self.addEntry(terms, (cPN,pns), key) - - def getCanvasMaker(self, canvasmaker=canvas.Canvas): - - def newcanvasmaker(*args, **kwargs): - from reportlab.pdfgen import canvas - c = canvasmaker(*args, **kwargs) - setattr(c,self.name,self) - return c - - return newcanvasmaker - - def isIndexing(self): - return 1 - - def isSatisfied(self): - return (self._entries == self._lastEntries) - - def beforeBuild(self): - # keep track of the last run - self._lastEntries = self._entries.copy() - self.clearEntries() - - def clearEntries(self): - self._entries = {} - - def notify(self, kind, stuff): - """The notification hook called to register all kinds of events. - - Here we are interested in 'IndexEntry' events only. - """ - if kind == 'IndexEntry': - text, pageNum = stuff - self.addEntry(text, (self._canv.getPageNumber(),pageNum)) - - def addEntry(self, text, pageNum, key=None): - """Allows incremental buildup""" - self._entries.setdefault(makeTuple(text),set([])).add((pageNum, key)) - - def split(self, availWidth, availHeight): - """At this stage we do not care about splitting the entries, - we will just return a list of platypus tables. Presumably the - calling app has a pointer to the original TableOfContents object; - Platypus just sees tables. - """ - return self._flowable.splitOn(self.canv,availWidth, availHeight) - - def _getlastEntries(self, dummy=[(['Placeholder for index'],enumerate((None,)*3))]): - '''Return the last run's entries! If there are none, returns dummy.''' - if not self._lastEntries: - if self._entries: - return list(self._entries.items()) - return dummy - return list(self._lastEntries.items()) - - def _build(self,availWidth,availHeight): - _tempEntries = self._getlastEntries() - def getkey(seq): - return [x.upper() for x in seq[0]] - _tempEntries.sort(key=getkey) - leveloffset = self.headers and 1 or 0 - - def drawIndexEntryEnd(canvas, kind, label): - '''Callback to draw dots and page numbers after each entry.''' - style = self.getLevelStyle(leveloffset) - pages = [(p[1],k) for p,k in sorted(decode_label(label))] - drawPageNumbers(canvas, style, pages, availWidth, availHeight, self.dot) - self.canv.drawIndexEntryEnd = drawIndexEntryEnd - - alpha = '' - tableData = [] - lastTexts = [] - alphaStyle = self.getLevelStyle(0) - for texts, pageNumbers in _tempEntries: - texts = list(texts) - #track when the first character changes; either output some extra - #space, or the first letter on a row of its own. We cannot do - #widow/orphan control, sadly. - nalpha = texts[0][0].upper() - if alpha != nalpha: - alpha = nalpha - if self.headers: - header = alpha - else: - header = ' ' - tableData.append([Spacer(1, alphaStyle.spaceBefore),]) - tableData.append([Paragraph(header, alphaStyle),]) - tableData.append([Spacer(1, alphaStyle.spaceAfter),]) - - - i, diff = listdiff(lastTexts, texts) - if diff: - lastTexts = texts - texts = texts[i:] - label = encode_label(list(pageNumbers)) - texts[-1] = '%s' % (texts[-1], label) - for text in texts: - #Platypus and RML differ on how parsed XML attributes are escaped. - #e.g. . The only place this seems to bite us is in - #the index entries so work around it here. - text = escapeOnce(text) - - style = self.getLevelStyle(i+leveloffset) - para = Paragraph(text, style) - if style.spaceBefore: - tableData.append([Spacer(1, style.spaceBefore),]) - tableData.append([para,]) - i += 1 - - self._flowable = Table(tableData, colWidths=[availWidth], style=self.tableStyle) - - def wrap(self, availWidth, availHeight): - "All table properties should be known by now." - self._build(availWidth,availHeight) - self.width, self.height = self._flowable.wrapOn(self.canv,availWidth, availHeight) - return self.width, self.height - - def drawOn(self, canvas, x, y, _sW=0): - """Don't do this at home! The standard calls for implementing - draw(); we are hooking this in order to delegate ALL the drawing - work to the embedded table object. - """ - self._flowable.drawOn(canvas, x, y, _sW) - - def draw(self): - t = self._flowable - ocanv = getattr(t,'canv',None) - if not ocanv: - t.canv = self.canv - try: - t.draw() - finally: - if not ocanv: - del t.canv - - def getLevelStyle(self, n): - '''Returns the style for level n, generating and caching styles on demand if not present.''' - if not hasattr(self.textStyle, '__iter__'): - self.textStyle = [self.textStyle] - try: - return self.textStyle[n] - except IndexError: - self.textStyle = list(self.textStyle) - prevstyle = self.getLevelStyle(n-1) - self.textStyle.append(ParagraphStyle( - name='%s-%d-indented' % (prevstyle.name, n), - parent=prevstyle, - firstLineIndent = prevstyle.firstLineIndent+.2*cm, - leftIndent = prevstyle.leftIndent+.2*cm)) - return self.textStyle[n] - -AlphabeticIndex = SimpleIndex - -def listdiff(l1, l2): - m = min(len(l1), len(l2)) - for i in range(m): - if l1[i] != l2[i]: - return i, l2[i:] - return m, l2[m:] - -class ReferenceText(IndexingFlowable): - """Fakery to illustrate how a reference would work if we could - put it in a paragraph.""" - def __init__(self, textPattern, targetKey): - self.textPattern = textPattern - self.target = targetKey - self.paraStyle = ParagraphStyle('tmp') - self._lastPageNum = None - self._pageNum = -999 - self._para = None - - def beforeBuild(self): - self._lastPageNum = self._pageNum - - def notify(self, kind, stuff): - if kind == 'Target': - (key, pageNum) = stuff - if key == self.target: - self._pageNum = pageNum - - def wrap(self, availWidth, availHeight): - text = self.textPattern % self._lastPageNum - self._para = Paragraph(text, self.paraStyle) - return self._para.wrap(availWidth, availHeight) - - def drawOn(self, canvas, x, y, _sW=0): - self._para.drawOn(canvas, x, y, _sW) diff --git a/reportlab/platypus/tables.py b/reportlab/platypus/tables.py deleted file mode 100644 index 3f3529cb..00000000 --- a/reportlab/platypus/tables.py +++ /dev/null @@ -1,1612 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/platypus/tables.py -__version__=''' $Id$ ''' - -__doc__=""" -Tables are created by passing the constructor a tuple of column widths, a tuple of row heights and the data in -row order. Drawing of the table can be controlled by using a TableStyle instance. This allows control of the -color and weight of the lines (if any), and the font, alignment and padding of the text. - -None values in the sequence of row heights or column widths, mean that the corresponding rows -or columns should be automatically sized. - -All the cell values should be convertible to strings; embedded newline '\\n' characters -cause the value to wrap (ie are like a traditional linefeed). - -See the test output from running this module as a script for a discussion of the method for constructing -tables and table styles. -""" -from reportlab.platypus.flowables import Flowable, Preformatted, Spacer -from reportlab import rl_config -from reportlab.lib.styles import PropertySet, ParagraphStyle, _baseFontName -from reportlab.lib import colors -from reportlab.lib.utils import annotateException, IdentStr, flatten, isStr, asNative, strTypes -from reportlab.lib.rl_accel import fp_str -from reportlab.lib.abag import ABag as CellFrame -from reportlab.pdfbase.pdfmetrics import stringWidth -from reportlab.platypus.doctemplate import Indenter -from reportlab.platypus.flowables import LIIndenter - -LINECAPS={None: None, 'butt':0,'round':1,'projecting':2,'squared':2} -LINEJOINS={None: None, 'miter':0, 'mitre':0, 'round':1,'bevel':2} - -class CellStyle(PropertySet): - fontname = _baseFontName - fontsize = 10 - leading = 12 - leftPadding = 6 - rightPadding = 6 - topPadding = 3 - bottomPadding = 3 - firstLineIndent = 0 - color = 'black' - alignment = 'LEFT' - background = 'white' - valign = "BOTTOM" - href = None - destination = None - def __init__(self, name, parent=None): - self.name = name - if parent is not None: - parent.copy(self) - def copy(self, result=None): - if result is None: - result = CellStyle() - for name in dir(self): - setattr(result, name, getattr(self, name)) - return result - -class TableStyle: - def __init__(self, cmds=None, parent=None, **kw): - #handle inheritance from parent first. - commands = [] - if parent: - # copy the parents list at construction time - commands = commands + parent.getCommands() - self._opts = parent._opts - for a in ('spaceBefore','spaceAfter'): - if hasattr(parent,a): - setattr(self,a,getattr(parent,a)) - if cmds: - commands = commands + list(cmds) - self._cmds = commands - self._opts={} - self._opts.update(kw) - - def add(self, *cmd): - self._cmds.append(cmd) - def __repr__(self): - return "TableStyle(\n%s\n) # end TableStyle" % " \n".join(map(repr, self._cmds)) - def getCommands(self): - return self._cmds - -def _rowLen(x): - return not isinstance(x,(tuple,list)) and 1 or len(x) - -def _calc_pc(V,avail): - '''check list V for percentage or * values - 1) absolute values go through unchanged - 2) percentages are used as weights for unconsumed space - 3) if no None values were seen '*' weights are - set equally with unclaimed space - otherwise * weights are assigned as None''' - R = [] - r = R.append - I = [] - i = I.append - J = [] - j = J.append - s = avail - w = n = 0. - for v in V: - if isinstance(v,strTypes): - v = str(v).strip() - if not v: - v = None - n += 1 - elif v.endswith('%'): - v = float(v[:-1]) - w += v - i(len(R)) - elif v=='*': - j(len(R)) - else: - v = float(v) - s -= v - elif v is None: - n += 1 - else: - s -= v - r(v) - s = max(0.,s) - f = s/max(100.,w) - for i in I: - R[i] *= f - s -= R[i] - s = max(0.,s) - m = len(J) - if m: - v = n==0 and s/m or None - for j in J: - R[j] = v - return R - -def _hLine(canvLine, scp, ecp, y, hBlocks, FUZZ=rl_config._FUZZ): - ''' - Draw horizontal lines; do not draw through regions specified in hBlocks - This also serves for vertical lines with a suitable canvLine - ''' - if hBlocks: hBlocks = hBlocks.get(y,None) - if not hBlocks or scp>=hBlocks[-1][1]-FUZZ or ecp<=hBlocks[0][0]+FUZZ: - canvLine(scp,y,ecp,y) - else: - i = 0 - n = len(hBlocks) - while scp=ecp-FUZZ: - i += 1 - continue - i0 = max(scp,x0) - i1 = min(ecp,x1) - if i0>scp: canvLine(scp,y,i0,y) - scp = i1 - if scp=lim: continue - x1 += 1 - t = sum([V[x]+M.get(x,0) for x in xrange(x0,x1)]) - if t>=v-FUZZ: continue #already good enough - X = [x for x in xrange(x0,x1) if V0[x] is None] #variable candidates - if not X: continue #something wrong here mate - v -= t - v /= float(len(X)) - for x in X: - M[x] = M.get(x,0)+v - for x,v in M.items(): - V[x] += v - -class _ExpandedCellTuple(tuple): - pass - -class Table(Flowable): - def __init__(self, data, colWidths=None, rowHeights=None, style=None, - repeatRows=0, repeatCols=0, splitByRow=1, emptyTableAction=None, ident=None, - hAlign=None,vAlign=None, normalizedData=0, cellStyles=None): - self.ident = ident - self.hAlign = hAlign or 'CENTER' - self.vAlign = vAlign or 'MIDDLE' - if not isinstance(data,(tuple,list)): - raise ValueError("%s invalid data type" % self.identity()) - self._nrows = nrows = len(data) - self._cellvalues = [] - _seqCW = isinstance(colWidths,(tuple,list)) - _seqRH = isinstance(rowHeights,(tuple,list)) - if nrows: self._ncols = ncols = max(list(map(_rowLen,data))) - elif colWidths and _seqCW: ncols = len(colWidths) - else: ncols = 0 - if not emptyTableAction: emptyTableAction = rl_config.emptyTableAction - self._longTableOptimize = getattr(self,'_longTableOptimize',rl_config.longTableOptimize) - if not (nrows and ncols): - if emptyTableAction=='error': - raise ValueError("%s must have at least a row and column" % self.identity()) - elif emptyTableAction=='indicate': - self.__class__ = Preformatted - global _emptyTableStyle - if '_emptyTableStyle' not in list(globals().keys()): - _emptyTableStyle = ParagraphStyle('_emptyTableStyle') - _emptyTableStyle.textColor = colors.red - _emptyTableStyle.backColor = colors.yellow - Preformatted.__init__(self,'%s(%d,%d)' % (self.__class__.__name__,nrows,ncols), _emptyTableStyle) - elif emptyTableAction=='ignore': - self.__class__ = Spacer - Spacer.__init__(self,0,0) - else: - raise ValueError('%s bad emptyTableAction: "%s"' % (self.identity(),emptyTableAction)) - return - - # we need a cleanup pass to ensure data is strings - non-unicode and non-null - if normalizedData: - self._cellvalues = data - else: - self._cellvalues = data = self.normalizeData(data) - if not _seqCW: colWidths = ncols*[colWidths] - elif len(colWidths)!=ncols: - if rl_config.allowShortTableRows and isinstance(colWidths,list): - n = len(colWidths) - if n%s" % (self.__class__.__name__, id(self), nr, nc, tallest, vx) - - def _cellListIter(self,C,aW,aH): - canv = getattr(self,'canv',None) - for c in C: - if getattr(c,'__split_only__',None): - for d in c.splitOn(canv,aW,aH): - yield d - else: - yield c - - def _cellListProcess(self,C,aW,aH): - if not isinstance(C,_ExpandedCellTuple): - frame = None - R = [].append - for c in self._cellListIter(C,aW,aH): - if isinstance(c,Indenter): - if not frame: - frame = CellFrame(_leftExtraIndent=0,_rightExtraIndent=0) - c.frameAction(frame) - if frame._leftExtraIndent<1e-8 and frame._rightExtraIndent<1e-8: - frame = None - continue - if frame: - R(LIIndenter(c,leftIndent=frame._leftExtraIndent,rightIndent=frame._rightExtraIndent)) - else: - R(c) - C = _ExpandedCellTuple(R.__self__) - return C - - def _listCellGeom(self, V,w,s,W=None,H=None,aH=72000): - if not V: return 0,0 - aW = w - s.leftPadding - s.rightPadding - aH = aH - s.topPadding - s.bottomPadding - t = 0 - w = 0 - canv = getattr(self,'canv',None) - sb0 = None - for v in V: - vw, vh = v.wrapOn(canv, aW, aH) - sb = v.getSpaceBefore() - sa = v.getSpaceAfter() - if W is not None: W.append(vw) - if H is not None: H.append(vh) - w = max(w,vw) - t += vh + sa + sb - if sb0 is None: - sb0 = sb - return w, t - sb0 - sa - - def _listValueWidth(self,V,aH=72000,aW=72000): - if not V: return 0,0 - t = 0 - w = 0 - canv = getattr(self,'canv',None) - return max([v.wrapOn(canv,aW,aH)[0] for v in V]) - - def _calc_width(self,availWidth,W=None): - if getattr(self,'_width_calculated_once',None): return - #comments added by Andy to Robin's slightly terse variable names - if not W: W = _calc_pc(self._argW,availWidth) #widths array - if None in W: #some column widths are not given - canv = getattr(self,'canv',None) - saved = None - if self._spanCmds: - colSpanCells = self._colSpanCells - spanRanges = self._spanRanges - else: - colSpanCells = () - spanRanges = {} - spanCons = {} - if W is self._argW: - W0 = W - W = W[:] - else: - W0 = W[:] - V = self._cellvalues - S = self._cellStyles - while None in W: - j = W.index(None) #find first unspecified column - w = 0 - for i,Vi in enumerate(V): - v = Vi[j] - s = S[i][j] - ji = j,i - span = spanRanges.get(ji,None) - if ji in colSpanCells and not span: #if the current cell is part of a spanned region, - t = 0.0 #assume a zero size. - else:#work out size - t = self._elementWidth(v,s) - if t is None: - raise ValueError("Flowable %s in cell(%d,%d) can't have auto width\n%s" % (v.identity(30),i,j,self.identity(30))) - t += s.leftPadding+s.rightPadding - if span: - c0 = span[0] - c1 = span[2] - if c0!=c1: - x = c0,c1 - spanCons[x] = max(spanCons.get(x,t),t) - t = 0 - if t>w: w = t #record a new maximum - - W[j] = w - - if spanCons: - try: - spanFixDim(W0,W,spanCons) - except: - annotateException('\nspanning problem in %s\nW0=%r W=%r\nspanCons=%r' % (self.identity(),W0,W,spanCons)) - - self._colWidths = W - width = 0 - self._colpositions = [0] #index -1 is right side boundary; we skip when processing cells - for w in W: - width = width + w - self._colpositions.append(width) - - self._width = width - self._width_calculated_once = 1 - - def _elementWidth(self,v,s): - if isinstance(v,(list,tuple)): - w = 0 - for e in v: - ew = self._elementWidth(e,s) - if ew is None: return None - w = max(w,ew) - return w - elif isinstance(v,Flowable) and v._fixedWidth: - if hasattr(v, 'width') and isinstance(v.width,(int,float)): return v.width - if hasattr(v, 'drawWidth') and isinstance(v.drawWidth,(int,float)): return v.drawWidth - # Even if something is fixedWidth, the attribute to check is not - # necessarily consistent (cf. Image.drawWidth). Therefore, we'll - # be extra-careful and fall through to this code if necessary. - if hasattr(v, 'minWidth'): - try: - w = v.minWidth() # should be all flowables - if isinstance(w,(float,int)): return w - except AttributeError: - pass - if v is None: - return 0 - else: - try: - v = str(v).split("\n") - except: - return 0 - fontName = s.fontname - fontSize = s.fontsize - return max([stringWidth(x,fontName,fontSize) for x in v]) - - def _calc_height(self, availHeight, availWidth, H=None, W=None): - H = self._argH - if not W: W = _calc_pc(self._argW,availWidth) #widths array - - hmax = lim = len(H) - longTable = self._longTableOptimize - - if None in H: - canv = getattr(self,'canv',None) - saved = None - #get a handy list of any cells which span rows. should be ignored for sizing - if self._spanCmds: - rowSpanCells = self._rowSpanCells - colSpanCells = self._colSpanCells - spanRanges = self._spanRanges - colpositions = self._colpositions - else: - rowSpanCells = colSpanCells = () - spanRanges = {} - if canv: saved = canv._fontname, canv._fontsize, canv._leading - H0 = H - H = H[:] #make a copy as we'll change it - self._rowHeights = H - spanCons = {} - FUZZ = rl_config._FUZZ - while None in H: - i = H.index(None) - V = self._cellvalues[i] # values for row i - S = self._cellStyles[i] # styles for row i - h = 0 - j = 0 - for j,(v, s, w) in enumerate(list(zip(V, S, W))): # value, style, width (lengths must match) - ji = j,i - span = spanRanges.get(ji,None) - if ji in rowSpanCells and not span: - continue # don't count it, it's either occluded or unreliable - else: - if isinstance(v,(tuple,list,Flowable)): - if isinstance(v,Flowable): v = (v,) - else: v = flatten(v) - v = V[j] = self._cellListProcess(v,w,None) - if w is None and not self._canGetWidth(v): - raise ValueError("Flowable %s in cell(%d,%d) can't have auto width in\n%s" % (v[0].identity(30),i,j,self.identity(30))) - if canv: canv._fontname, canv._fontsize, canv._leading = s.fontname, s.fontsize, s.leading or 1.2*s.fontsize - if ji in colSpanCells: - if not span: continue - w = max(colpositions[span[2]+1]-colpositions[span[0]],w) - dW,t = self._listCellGeom(v,w or self._listValueWidth(v),s) - if canv: canv._fontname, canv._fontsize, canv._leading = saved - dW = dW + s.leftPadding + s.rightPadding - if not rl_config.allowTableBoundsErrors and dW>w: - from reportlab.platypus.doctemplate import LayoutError - raise LayoutError("Flowable %s (%sx%s points) too wide for cell(%d,%d) (%sx* points) in\n%s" % (v[0].identity(30),fp_str(dW),fp_str(t),i,j, fp_str(w), self.identity(30))) - else: - v = (v is not None and str(v) or '').split("\n") - t = (s.leading or 1.2*s.fontsize)*len(v) - t += s.bottomPadding+s.topPadding - if span: - r0 = span[1] - r1 = span[3] - if r0!=r1: - x = r0,r1 - spanCons[x] = max(spanCons.get(x,t),t) - t = 0 - if t>h: h = t #record a new maximum - H[i] = h - # we can stop if we have filled up all available room - if longTable: - hmax = i - height = sum(H[:i]) - if height > availHeight: - #we can terminate if all spans are complete in H[:i] - if spanCons: - msr = max([x[1] for x in spanCons.keys()]) #RS=[endrowspan,.....] - if hmax>=msr: - break - if None not in H: hmax = lim - - if spanCons: - try: - spanFixDim(H0,H,spanCons,lim=hmax) - except: - annotateException('\nspanning problem in %s hmax=%s lim=%s avail=%s x %s\nH0=%r H=%r\nspanCons=%r' % (self.identity(),hmax,lim,availWidth,availHeight,H0,H,spanCons)) - - height = self._height = sum(H[:hmax]) - self._rowpositions = [height] # index 0 is actually topline; we skip when processing cells - for h in H[:hmax]: - height -= h - self._rowpositions.append(height) - assert abs(height)<1e-8, '!!!!!%s\ninternal height error height=%r hmax=%d Sum(H[:%d])=%r\nH=%r\nrowPositions=%r' % (self.identity(),height,hmax,hmax,self._height,H[:hmax],self._rowpositions) - self._hmax = hmax - - def _calc(self, availWidth, availHeight): - #if hasattr(self,'_width'): return - - #in some cases there are unsizable things in - #cells. If so, apply a different algorithm - #and assign some withs in a less (thanks to Gary Poster) dumb way. - #this CHANGES the widths array. - if (None in self._colWidths or '*' in self._colWidths) and self._hasVariWidthElements(): - W = self._calcPreliminaryWidths(availWidth) #widths - else: - W = None - - # need to know which cells are part of spanned - # ranges, so _calc_height and _calc_width can ignore them - # in sizing - if self._spanCmds: - self._calcSpanRanges() - if None in self._argH: - self._calc_width(availWidth,W=W) - - if self._nosplitCmds: - self._calcNoSplitRanges() - - # calculate the full table height - self._calc_height(availHeight,availWidth,W=W) - - # calculate the full table width - self._calc_width(availWidth,W=W) - - if self._spanCmds: - #now work out the actual rect for each spanned cell from the underlying grid - self._calcSpanRects() - - def _culprit(self): - """Return a string describing the tallest element. - - Usually this is what causes tables to fail to split. Currently - tables are the only items to have a '_culprit' method. Doctemplate - checks for it. - """ - rh = self._rowHeights - tallest = max(rh) - rowNum = rh.index(tallest) - #rowNum of limited interest as usually it's a split one - #and we see row #1. Text might be a nice addition. - - return 'tallest cell %0.1f points' % tallest - - - - def _hasVariWidthElements(self, upToRow=None): - """Check for flowables in table cells and warn up front. - - Allow a couple which we know are fixed size such as - images and graphics.""" - if upToRow is None: upToRow = self._nrows - for row in xrange(min(self._nrows, upToRow)): - for col in xrange(self._ncols): - value = self._cellvalues[row][col] - if not self._canGetWidth(value): - return 1 - return 0 - - def _canGetWidth(self, thing): - "Can we work out the width quickly?" - if isinstance(thing,(list, tuple)): - for elem in thing: - if not self._canGetWidth(elem): - return 0 - return 1 - elif isinstance(thing, Flowable): - return thing._fixedWidth # must loosen this up - else: #str, number, None etc. - #anything else gets passed to str(...) - # so should be sizable - return 1 - - def _calcPreliminaryWidths(self, availWidth): - """Fallback algorithm for when main one fails. - - Where exact width info not given but things like - paragraphs might be present, do a preliminary scan - and assign some best-guess values.""" - - W = list(self._argW) # _calc_pc(self._argW,availWidth) - verbose = 0 - totalDefined = 0.0 - percentDefined = 0 - percentTotal = 0 - numberUndefined = 0 - numberGreedyUndefined = 0 - for w in W: - if w is None: - numberUndefined += 1 - elif w == '*': - numberUndefined += 1 - numberGreedyUndefined += 1 - elif _endswith(w,'%'): - percentDefined += 1 - percentTotal += float(w[:-1]) - else: - assert isinstance(w,(int,float)) - totalDefined = totalDefined + w - if verbose: print('prelim width calculation. %d columns, %d undefined width, %0.2f units remain' % ( - self._ncols, numberUndefined, availWidth - totalDefined)) - - #check columnwise in each None column to see if they are sizable. - given = [] - sizeable = [] - unsizeable = [] - minimums = {} - totalMinimum = 0 - elementWidth = self._elementWidth - for colNo in xrange(self._ncols): - w = W[colNo] - if w is None or w=='*' or _endswith(w,'%'): - siz = 1 - final = 0 - for rowNo in xrange(self._nrows): - value = self._cellvalues[rowNo][colNo] - style = self._cellStyles[rowNo][colNo] - pad = style.leftPadding+style.rightPadding - new = elementWidth(value,style) - if new: - new += pad - else: - new = pad - new += style.leftPadding+style.rightPadding - final = max(final, new) - siz = siz and self._canGetWidth(value) # irrelevant now? - if siz: - sizeable.append(colNo) - else: - unsizeable.append(colNo) - minimums[colNo] = final - totalMinimum += final - else: - given.append(colNo) - if len(given) == self._ncols: - return - if verbose: print('predefined width: ',given) - if verbose: print('uncomputable width: ',unsizeable) - if verbose: print('computable width: ',sizeable) - - # how much width is left: - remaining = availWidth - (totalMinimum + totalDefined) - if remaining > 0: - # we have some room left; fill it. - definedPercentage = (totalDefined/availWidth)*100 - percentTotal += definedPercentage - if numberUndefined and percentTotal < 100: - undefined = numberGreedyUndefined or numberUndefined - defaultWeight = (100-percentTotal)/undefined - percentTotal = 100 - defaultDesired = (defaultWeight/percentTotal)*availWidth - else: - defaultWeight = defaultDesired = 1 - # we now calculate how wide each column wanted to be, and then - # proportionately shrink that down to fit the remaining available - # space. A column may not shrink less than its minimum width, - # however, which makes this a bit more complicated. - desiredWidths = [] - totalDesired = 0 - effectiveRemaining = remaining - for colNo, minimum in minimums.items(): - w = W[colNo] - if _endswith(w,'%'): - desired = (float(w[:-1])/percentTotal)*availWidth - elif w == '*': - desired = defaultDesired - else: - desired = not numberGreedyUndefined and defaultDesired or 1 - if desired <= minimum: - W[colNo] = minimum - else: - desiredWidths.append( - (desired-minimum, minimum, desired, colNo)) - totalDesired += desired - effectiveRemaining += minimum - if desiredWidths: # else we're done - # let's say we have two variable columns. One wanted - # 88 points, and one wanted 264 points. The first has a - # minWidth of 66, and the second of 55. We have 71 points - # to divide up in addition to the totalMinimum (i.e., - # remaining==71). Our algorithm tries to keep the proportion - # of these variable columns. - # - # To do this, we add up the minimum widths of the variable - # columns and the remaining width. That's 192. We add up the - # totalDesired width. That's 352. That means we'll try to - # shrink the widths by a proportion of 192/352--.545454. - # That would make the first column 48 points, and the second - # 144 points--adding up to the desired 192. - # - # Unfortunately, that's too small for the first column. It - # must be 66 points. Therefore, we go ahead and save that - # column width as 88 points. That leaves (192-88==) 104 - # points remaining. The proportion to shrink the remaining - # column is (104/264), which, multiplied by the desired - # width of 264, is 104: the amount assigned to the remaining - # column. - proportion = effectiveRemaining/totalDesired - # we sort the desired widths by difference between desired and - # and minimum values, a value called "disappointment" in the - # code. This means that the columns with a bigger - # disappointment will have a better chance of getting more of - # the available space. - desiredWidths.sort() - finalSet = [] - for disappointment, minimum, desired, colNo in desiredWidths: - adjusted = proportion * desired - if adjusted < minimum: - W[colNo] = minimum - totalDesired -= desired - effectiveRemaining -= minimum - if totalDesired: - proportion = effectiveRemaining/totalDesired - else: - finalSet.append((minimum, desired, colNo)) - for minimum, desired, colNo in finalSet: - adjusted = proportion * desired - assert adjusted >= minimum - W[colNo] = adjusted - else: - for colNo, minimum in minimums.items(): - W[colNo] = minimum - if verbose: print('new widths are:', W) - self._argW = self._colWidths = W - return W - - def minWidth(self): - W = list(self._argW) - width = 0 - elementWidth = self._elementWidth - rowNos = xrange(self._nrows) - values = self._cellvalues - styles = self._cellStyles - for colNo in xrange(len(W)): - w = W[colNo] - if w is None or w=='*' or _endswith(w,'%'): - final = 0 - for rowNo in rowNos: - value = values[rowNo][colNo] - style = styles[rowNo][colNo] - new = (elementWidth(value,style)+ - style.leftPadding+style.rightPadding) - final = max(final, new) - width += final - else: - width += float(w) - return width # XXX + 1/2*(left and right border widths) - - def _calcSpanRanges(self): - """Work out rects for tables which do row and column spanning. - - This creates some mappings to let the later code determine - if a cell is part of a "spanned" range. - self._spanRanges shows the 'coords' in integers of each - 'cell range', or None if it was clobbered: - (col, row) -> (col0, row0, col1, row1) - - Any cell not in the key is not part of a spanned region - """ - self._spanRanges = spanRanges = {} - for x in xrange(self._ncols): - for y in xrange(self._nrows): - spanRanges[x,y] = (x, y, x, y) - self._colSpanCells = [] - self._rowSpanCells = [] - csa = self._colSpanCells.append - rsa = self._rowSpanCells.append - for (cmd, start, stop) in self._spanCmds: - x0, y0 = start - x1, y1 = stop - - #normalize - if x0 < 0: x0 = x0 + self._ncols - if x1 < 0: x1 = x1 + self._ncols - if y0 < 0: y0 = y0 + self._nrows - if y1 < 0: y1 = y1 + self._nrows - if x0 > x1: x0, x1 = x1, x0 - if y0 > y1: y0, y1 = y1, y0 - - if x0!=x1 or y0!=y1: - if x0!=x1: #column span - for y in xrange(y0, y1+1): - for x in xrange(x0,x1+1): - csa((x,y)) - if y0!=y1: #row span - for y in xrange(y0, y1+1): - for x in xrange(x0,x1+1): - rsa((x,y)) - - for y in xrange(y0, y1+1): - for x in xrange(x0,x1+1): - spanRanges[x,y] = None - # set the main entry - spanRanges[x0,y0] = (x0, y0, x1, y1) - - def _calcNoSplitRanges(self): - """ - This creates some mappings to let the later code determine - if a cell is part of a "nosplit" range. - self._nosplitRanges shows the 'coords' in integers of each - 'cell range', or None if it was clobbered: - (col, row) -> (col0, row0, col1, row1) - - Any cell not in the key is not part of a spanned region - """ - self._nosplitRanges = nosplitRanges = {} - for x in xrange(self._ncols): - for y in xrange(self._nrows): - nosplitRanges[x,y] = (x, y, x, y) - self._colNoSplitCells = [] - self._rowNoSplitCells = [] - csa = self._colNoSplitCells.append - rsa = self._rowNoSplitCells.append - for (cmd, start, stop) in self._nosplitCmds: - x0, y0 = start - x1, y1 = stop - - #normalize - if x0 < 0: x0 = x0 + self._ncols - if x1 < 0: x1 = x1 + self._ncols - if y0 < 0: y0 = y0 + self._nrows - if y1 < 0: y1 = y1 + self._nrows - if x0 > x1: x0, x1 = x1, x0 - if y0 > y1: y0, y1 = y1, y0 - - if x0!=x1 or y0!=y1: - #column span - if x0!=x1: - for y in xrange(y0, y1+1): - for x in xrange(x0,x1+1): - csa((x,y)) - #row span - if y0!=y1: - for y in xrange(y0, y1+1): - for x in xrange(x0,x1+1): - rsa((x,y)) - - for y in xrange(y0, y1+1): - for x in xrange(x0,x1+1): - nosplitRanges[x,y] = None - # set the main entry - nosplitRanges[x0,y0] = (x0, y0, x1, y1) - - def _calcSpanRects(self): - """Work out rects for tables which do row and column spanning. - - Based on self._spanRanges, which is already known, - and the widths which were given or previously calculated, - self._spanRects shows the real coords for drawing: - - (col, row) -> (x, y, width, height) - - for each cell. Any cell which 'does not exist' as another - has spanned over it will get a None entry on the right - """ - spanRects = getattr(self,'_spanRects',{}) - hmax = getattr(self,'_hmax',None) - longTable = self._longTableOptimize - if spanRects and (longTable and hmax==self._hmax_spanRects or not longTable): - return - colpositions = self._colpositions - rowpositions = self._rowpositions - vBlocks = {} - hBlocks = {} - rlim = len(rowpositions)-1 - for (coord, value) in self._spanRanges.items(): - if value is None: - spanRects[coord] = None - else: - col0, row0, col1, row1 = value - if row1>=rlim: continue - col,row = coord - if col1-col0>0: - for _ in xrange(col0+1,col1+1): - vBlocks.setdefault(colpositions[_],[]).append((rowpositions[row1+1],rowpositions[row0])) - if row1-row0>0: - for _ in xrange(row0+1,row1+1): - hBlocks.setdefault(rowpositions[_],[]).append((colpositions[col0],colpositions[col1+1])) - x = colpositions[col0] - y = rowpositions[row1+1] - width = colpositions[col1+1] - x - height = rowpositions[row0] - y - spanRects[coord] = (x, y, width, height) - - for _ in hBlocks, vBlocks: - for value in _.values(): - value.sort() - self._spanRects = spanRects - self._vBlocks = vBlocks - self._hBlocks = hBlocks - self._hmax_spanRects = hmax - - def setStyle(self, tblstyle): - if not isinstance(tblstyle,TableStyle): - tblstyle = TableStyle(tblstyle) - for cmd in tblstyle.getCommands(): - self._addCommand(cmd) - for k,v in tblstyle._opts.items(): - setattr(self,k,v) - for a in ('spaceBefore','spaceAfter'): - if not hasattr(self,a) and hasattr(tblstyle,a): - setattr(self,a,getattr(tblstyle,a)) - - def _addCommand(self,cmd): - if cmd[0] in ('BACKGROUND','ROWBACKGROUNDS','COLBACKGROUNDS'): - self._bkgrndcmds.append(cmd) - elif cmd[0] == 'SPAN': - self._spanCmds.append(cmd) - elif cmd[0] == 'NOSPLIT': - # we expect op, start, stop - self._nosplitCmds.append(cmd) - elif _isLineCommand(cmd): - # we expect op, start, stop, weight, colour, cap, dashes, join - cmd = list(cmd) - if len(cmd)<5: raise ValueError('bad line command '+ascii(cmd)) - - #determine line cap value at position 5. This can be str or numeric. - if len(cmd)<6: - cmd.append(1) - else: - cap = _convert2int(cmd[5], LINECAPS, 0, 2, 'cap', cmd) - cmd[5] = cap - - #dashes at index 6 - this is a dash array: - if len(cmd)<7: cmd.append(None) - - #join mode at index 7 - can be str or numeric, look up as for caps - if len(cmd)<8: cmd.append(1) - else: - join = _convert2int(cmd[7], LINEJOINS, 0, 2, 'join', cmd) - cmd[7] = join - - #linecount at index 8. Default is 1, set to 2 for double line. - if len(cmd)<9: cmd.append(1) - else: - lineCount = cmd[8] - if lineCount is None: - lineCount = 1 - cmd[8] = lineCount - assert lineCount >= 1 - #linespacing at index 9. Not applicable unless 2+ lines, defaults to line - #width so you get a visible gap between centres - if len(cmd)<10: cmd.append(cmd[3]) - else: - space = cmd[9] - if space is None: - space = cmd[3] - cmd[9] = space - assert len(cmd) == 10 - - self._linecmds.append(tuple(cmd)) - else: - (op, (sc, sr), (ec, er)), values = cmd[:3] , cmd[3:] - if sc < 0: sc = sc + self._ncols - if ec < 0: ec = ec + self._ncols - if sr < 0: sr = sr + self._nrows - if er < 0: er = er + self._nrows - for i in xrange(sr, er+1): - for j in xrange(sc, ec+1): - _setCellStyle(self._cellStyles, i, j, op, values) - - def _drawLines(self): - ccap, cdash, cjoin = None, None, None - self.canv.saveState() - for op, (sc,sr), (ec,er), weight, color, cap, dash, join, count, space in self._linecmds: - if isinstance(sr,strTypes) and sr.startswith('split'): continue - if sc < 0: sc = sc + self._ncols - if ec < 0: ec = ec + self._ncols - if sr < 0: sr = sr + self._nrows - if er < 0: er = er + self._nrows - if cap!=None and ccap!=cap: - self.canv.setLineCap(cap) - ccap = cap - if dash is None or dash == []: - if cdash is not None: - self.canv.setDash() - cdash = None - elif dash != cdash: - self.canv.setDash(dash) - cdash = dash - if join is not None and cjoin!=join: - self.canv.setLineJoin(join) - cjoin = join - getattr(self,_LineOpMap.get(op, '_drawUnknown' ))( (sc, sr), (ec, er), weight, color, count, space) - self.canv.restoreState() - self._curcolor = None - - def _drawUnknown(self, start, end, weight, color, count, space): - #we are only called from _drawLines which is one level up - import sys - op = sys._getframe(1).f_locals['op'] - raise ValueError("Unknown line command '%s'" % op) - - def _drawGrid(self, start, end, weight, color, count, space): - self._drawBox( start, end, weight, color, count, space) - self._drawInnerGrid( start, end, weight, color, count, space) - - def _drawBox(self, start, end, weight, color, count, space): - sc,sr = start - ec,er = end - self._drawHLines((sc, sr), (ec, sr), weight, color, count, space) - self._drawHLines((sc, er+1), (ec, er+1), weight, color, count, space) - self._drawVLines((sc, sr), (sc, er), weight, color, count, space) - self._drawVLines((ec+1, sr), (ec+1, er), weight, color, count, space) - - def _drawInnerGrid(self, start, end, weight, color, count, space): - sc,sr = start - ec,er = end - self._drawHLines((sc, sr+1), (ec, er), weight, color, count, space) - self._drawVLines((sc+1, sr), (ec, er), weight, color, count, space) - - def _prepLine(self, weight, color): - if color != self._curcolor: - self.canv.setStrokeColor(color) - self._curcolor = color - if weight != self._curweight: - self.canv.setLineWidth(weight) - self._curweight = weight - - def _drawHLines(self, start, end, weight, color, count, space): - sc,sr = start - ec,er = end - ecp = self._colpositions[sc:ec+2] - rp = self._rowpositions[sr:er+1] - if len(ecp)<=1 or len(rp)<1: return - self._prepLine(weight, color) - scp = ecp[0] - ecp = ecp[-1] - hBlocks = getattr(self,'_hBlocks',{}) - canvLine = self.canv.line - if count == 1: - for y in rp: - _hLine(canvLine, scp, ecp, y, hBlocks) - else: - lf = lambda x0,y0,x1,y1,canvLine=canvLine, ws=weight+space, count=count: _multiLine(x0,x1,y0,canvLine,ws,count) - for y in rp: - _hLine(lf, scp, ecp, y, hBlocks) - - def _drawHLinesB(self, start, end, weight, color, count, space): - sc,sr = start - ec,er = end - self._drawHLines((sc, sr+1), (ec, er+1), weight, color, count, space) - - def _drawVLines(self, start, end, weight, color, count, space): - sc,sr = start - ec,er = end - erp = self._rowpositions[sr:er+2] - cp = self._colpositions[sc:ec+1] - if len(erp)<=1 or len(cp)<1: return - self._prepLine(weight, color) - srp = erp[0] - erp = erp[-1] - vBlocks = getattr(self,'_vBlocks',{}) - canvLine = lambda y0, x0, y1, x1, _line=self.canv.line: _line(x0,y0,x1,y1) - if count == 1: - for x in cp: - _hLine(canvLine, erp, srp, x, vBlocks) - else: - lf = lambda x0,y0,x1,y1,canvLine=canvLine, ws=weight+space, count=count: _multiLine(x0,x1,y0,canvLine,ws,count) - for x in cp: - _hLine(lf, erp, srp, x, vBlocks) - - def _drawVLinesA(self, start, end, weight, color, count, space): - sc,sr = start - ec,er = end - self._drawVLines((sc+1, sr), (ec+1, er), weight, color, count, space) - - def wrap(self, availWidth, availHeight): - self._calc(availWidth, availHeight) - self.availWidth = availWidth - return (self._width, self._height) - - def onSplit(self,T,byRow=1): - ''' - This method will be called when the Table is split. - Special purpose tables can override to do special stuff. - ''' - pass - - def _cr_0(self,n,cmds): - for c in cmds: - c = tuple(c) - (sc,sr), (ec,er) = c[1:3] - if isinstance(sr,strTypes) or sr>=n: continue - if er>=n: er = n-1 - self._addCommand((c[0],)+((sc, sr), (ec, er))+c[3:]) - - def _cr_1_1(self,n,repeatRows, cmds): - for c in cmds: - c = tuple(c) - (sc,sr), (ec,er) = c[1:3] - if sr in ('splitfirst','splitlast'): self._addCommand(c) - else: - if sr>=0 and sr>=repeatRows and sr=0 and er=repeatRows and sr=repeatRows and sr>=n: sr=sr+repeatRows-n - if er>=repeatRows and er=repeatRows and er>=n: er=er+repeatRows-n - self._addCommand((c[0],)+((sc, sr), (ec, er))+c[3:]) - - def _cr_1_0(self,n,cmds): - for c in cmds: - c = tuple(c) - (sc,sr), (ec,er) = c[1:3] - if sr in ('splitfirst','splitlast'): self._addCommand(c) - else: - if er>=0 and er=0 and sr=n: sr = sr-n - if er>=n: er = er-n - self._addCommand((c[0],)+((sc, sr), (ec, er))+c[3:]) - - def _splitRows(self,availHeight): - n=self._getFirstPossibleSplitRowPosition(availHeight) - if n<=self.repeatRows: return [] - lim = len(self._rowHeights) - if n==lim: return [self] - - repeatRows = self.repeatRows - repeatCols = self.repeatCols - splitByRow = self.splitByRow - data = self._cellvalues - - #we're going to split into two superRows - ident = self.ident - if ident: ident = IdentStr(ident) - R0 = self.__class__( data[:n], colWidths=self._colWidths, rowHeights=self._argH[:n], - repeatRows=repeatRows, repeatCols=repeatCols, - splitByRow=splitByRow, normalizedData=1, cellStyles=self._cellStyles[:n], - ident=ident) - - #copy the commands - - A = [] - # hack up the line commands - for op, (sc,sr), (ec,er), weight, color, cap, dash, join, count, space in self._linecmds: - if isinstance(sr,strTypes) and sr.startswith('split'): - A.append((op,(sc,sr), (ec,sr), weight, color, cap, dash, join, count, space)) - if sr=='splitlast': - sr = er = n-1 - elif sr=='splitfirst': - sr = n - er = n - - if sc < 0: sc = sc + self._ncols - if ec < 0: ec = ec + self._ncols - if sr < 0: sr = sr + self._nrows - if er < 0: er = er + self._nrows - - if op in ('BOX','OUTLINE','GRID'): - if sr=n: - # we have to split the BOX - A.append(('LINEABOVE',(sc,sr), (ec,sr), weight, color, cap, dash, join, count, space)) - A.append(('LINEBEFORE',(sc,sr), (sc,er), weight, color, cap, dash, join, count, space)) - A.append(('LINEAFTER',(ec,sr), (ec,er), weight, color, cap, dash, join, count, space)) - A.append(('LINEBELOW',(sc,er), (ec,er), weight, color, cap, dash, join, count, space)) - if op=='GRID': - A.append(('LINEBELOW',(sc,n-1), (ec,n-1), weight, color, cap, dash, join, count, space)) - A.append(('LINEABOVE',(sc,n), (ec,n), weight, color, cap, dash, join, count, space)) - A.append(('INNERGRID',(sc,sr), (ec,er), weight, color, cap, dash, join, count, space)) - else: - A.append((op,(sc,sr), (ec,er), weight, color, cap, dash, join, count, space)) - elif op in ('INNERGRID','LINEABOVE'): - if sr=n: - A.append(('LINEBELOW',(sc,n-1), (ec,n-1), weight, color, cap, dash, join, count, space)) - A.append(('LINEABOVE',(sc,n), (ec,n), weight, color, cap, dash, join, count, space)) - A.append((op,(sc,sr), (ec,er), weight, color, cap, dash, join, count, space)) - elif op == 'LINEBELOW': - if sr=(n-1): - A.append(('LINEABOVE',(sc,n), (ec,n), weight, color, cap, dash, join, count, space)) - A.append((op,(sc,sr), (ec,er), weight, color)) - elif op == 'LINEABOVE': - if sr<=n and er>=n: - A.append(('LINEBELOW',(sc,n-1), (ec,n-1), weight, color, cap, dash, join, count, space)) - A.append((op,(sc,sr), (ec,er), weight, color, cap, dash, join, count, space)) - else: - A.append((op,(sc,sr), (ec,er), weight, color, cap, dash, join, count, space)) - - R0._cr_0(n,A) - R0._cr_0(n,self._bkgrndcmds) - R0._cr_0(n,self._spanCmds) - R0._cr_0(n,self._nosplitCmds) - - if ident: ident = IdentStr(ident) - if repeatRows: - #R1 = slelf.__class__(data[:repeatRows]+data[n:],self._argW, - R1 = self.__class__(data[:repeatRows]+data[n:],colWidths=self._colWidths, - rowHeights=self._argH[:repeatRows]+self._argH[n:], - repeatRows=repeatRows, repeatCols=repeatCols, - splitByRow=splitByRow, normalizedData=1, - cellStyles=self._cellStyles[:repeatRows]+self._cellStyles[n:], - ident=ident, - ) - R1._cr_1_1(n,repeatRows,A) - R1._cr_1_1(n,repeatRows,self._bkgrndcmds) - R1._cr_1_1(n,repeatRows,self._spanCmds) - R1._cr_1_1(n,repeatRows,self._nosplitCmds) - else: - #R1 = slelf.__class__(data[n:], self._argW, self._argH[n:], - R1 = self.__class__(data[n:], colWidths=self._colWidths, rowHeights=self._argH[n:], - repeatRows=repeatRows, repeatCols=repeatCols, - splitByRow=splitByRow, normalizedData=1, cellStyles=self._cellStyles[n:], - ident=ident, - ) - R1._cr_1_0(n,A) - R1._cr_1_0(n,self._bkgrndcmds) - R1._cr_1_0(n,self._spanCmds) - R1._cr_1_0(n,self._nosplitCmds) - - R0.hAlign = R1.hAlign = self.hAlign - R0.vAlign = R1.vAlign = self.vAlign - self.onSplit(R0) - self.onSplit(R1) - return [R0,R1] - - def _getRowImpossible(impossible,cells,ranges): - for xy in cells: - r=ranges[xy] - if r!=None: - y1,y2=r[1],r[3] - if y1!=y2: - ymin=min(y1,y2) #normalize - ymax=max(y1,y2) #normalize - y=ymin+1 - while 1: - if y>ymax: break - impossible[y]=None #split at position y is impossible because of overlapping rowspan - y+=1 - _getRowImpossible=staticmethod(_getRowImpossible) - - def _getFirstPossibleSplitRowPosition(self,availHeight): - impossible={} - if self._spanCmds: - self._getRowImpossible(impossible,self._rowSpanCells,self._spanRanges) - if self._nosplitCmds: - self._getRowImpossible(impossible,self._rowNoSplitCells,self._nosplitRanges) - h = 0 - n = 1 - split_at = 0 # from this point of view 0 is the first position where the table may *always* be splitted - for rh in self._rowHeights: - if h+rh>availHeight: - break - if n not in impossible: - split_at=n - h=h+rh - n=n+1 - return split_at - - def split(self, availWidth, availHeight): - self._calc(availWidth, availHeight) - if self.splitByRow: - if not rl_config.allowTableBoundsErrors and self._width>availWidth: return [] - return self._splitRows(availHeight) - else: - raise NotImplementedError - - def draw(self): - self._curweight = self._curcolor = self._curcellstyle = None - self._drawBkgrnd() - if not self._spanCmds: - # old fashioned case, no spanning, steam on and do each cell - for row, rowstyle, rowpos, rowheight in zip(self._cellvalues, self._cellStyles, self._rowpositions[1:], self._rowHeights): - for cellval, cellstyle, colpos, colwidth in zip(row, rowstyle, self._colpositions[:-1], self._colWidths): - self._drawCell(cellval, cellstyle, (colpos, rowpos), (colwidth, rowheight)) - else: - # we have some row or col spans, need a more complex algorithm - # to find the rect for each - for rowNo in xrange(self._nrows): - for colNo in xrange(self._ncols): - cellRect = self._spanRects[colNo, rowNo] - if cellRect is not None: - (x, y, width, height) = cellRect - cellval = self._cellvalues[rowNo][colNo] - cellstyle = self._cellStyles[rowNo][colNo] - self._drawCell(cellval, cellstyle, (x, y), (width, height)) - self._drawLines() - - def _drawBkgrnd(self): - nrows = self._nrows - ncols = self._ncols - canv = self.canv - colpositions = self._colpositions - rowpositions = self._rowpositions - rowHeights = self._rowHeights - colWidths = self._colWidths - spanRects = getattr(self,'_spanRects',None) - for cmd, (sc, sr), (ec, er), arg in self._bkgrndcmds: - if sc < 0: sc = sc + ncols - if ec < 0: ec = ec + ncols - if sr < 0: sr = sr + nrows - if er < 0: er = er + nrows - x0 = colpositions[sc] - y0 = rowpositions[sr] - x1 = colpositions[min(ec+1,ncols)] - y1 = rowpositions[min(er+1,nrows)] - w, h = x1-x0, y1-y0 - if hasattr(arg,'__call__'): - arg(self,canv, x0, y0, w, h) - elif cmd == 'ROWBACKGROUNDS': - #Need a list of colors to cycle through. The arguments - #might be already colours, or convertible to colors, or - # None, or the str 'None'. - #It's very common to alternate a pale shade with None. - colorCycle = list(map(colors.toColorOrNone, arg)) - count = len(colorCycle) - rowCount = er - sr + 1 - for i in xrange(rowCount): - color = colorCycle[i%count] - h = rowHeights[sr + i] - if color: - canv.setFillColor(color) - canv.rect(x0, y0, w, -h, stroke=0,fill=1) - y0 = y0 - h - elif cmd == 'COLBACKGROUNDS': - #cycle through colours columnwise - colorCycle = list(map(colors.toColorOrNone, arg)) - count = len(colorCycle) - colCount = ec - sc + 1 - for i in xrange(colCount): - color = colorCycle[i%count] - w = colWidths[sc + i] - if color: - canv.setFillColor(color) - canv.rect(x0, y0, w, h, stroke=0,fill=1) - x0 = x0 +w - else: #cmd=='BACKGROUND' - color = colors.toColorOrNone(arg) - if color: - if ec==sc and er==sr and spanRects: - xywh = spanRects.get((sc,sr)) - if xywh: - #it's a single cell - x0, y0, w, h = xywh - canv.setFillColor(color) - canv.rect(x0, y0, w, h, stroke=0,fill=1) - - def _drawCell(self, cellval, cellstyle, pos, size): - colpos, rowpos = pos - colwidth, rowheight = size - if self._curcellstyle is not cellstyle: - cur = self._curcellstyle - if cur is None or cellstyle.color != cur.color: - self.canv.setFillColor(cellstyle.color) - if cur is None or cellstyle.leading != cur.leading or cellstyle.fontname != cur.fontname or cellstyle.fontsize != cur.fontsize: - self.canv.setFont(cellstyle.fontname, cellstyle.fontsize, cellstyle.leading) - self._curcellstyle = cellstyle - - just = cellstyle.alignment - valign = cellstyle.valign - if isinstance(cellval,(tuple,list,Flowable)): - if not isinstance(cellval,(tuple,list)): cellval = (cellval,) - # we assume it's a list of Flowables - W = [] - H = [] - w, h = self._listCellGeom(cellval,colwidth,cellstyle,W=W, H=H,aH=rowheight) - if valign=='TOP': - y = rowpos + rowheight - cellstyle.topPadding - elif valign=='BOTTOM': - y = rowpos+cellstyle.bottomPadding + h - else: - y = rowpos+(rowheight+cellstyle.bottomPadding-cellstyle.topPadding+h)/2.0 - if cellval: y += cellval[0].getSpaceBefore() - for v, w, h in zip(cellval,W,H): - if just=='LEFT': x = colpos+cellstyle.leftPadding - elif just=='RIGHT': x = colpos+colwidth-cellstyle.rightPadding - w - elif just in ('CENTRE', 'CENTER'): - x = colpos+(colwidth+cellstyle.leftPadding-cellstyle.rightPadding-w)/2.0 - else: - raise ValueError('Invalid justification %s' % just) - y -= v.getSpaceBefore() - y -= h - v.drawOn(self.canv,x,y) - y -= v.getSpaceAfter() - else: - if just == 'LEFT': - draw = self.canv.drawString - x = colpos + cellstyle.leftPadding - elif just in ('CENTRE', 'CENTER'): - draw = self.canv.drawCentredString - x = colpos+(colwidth+cellstyle.leftPadding-cellstyle.rightPadding)*0.5 - elif just == 'RIGHT': - draw = self.canv.drawRightString - x = colpos + colwidth - cellstyle.rightPadding - elif just == 'DECIMAL': - draw = self.canv.drawAlignedString - x = colpos + colwidth - cellstyle.rightPadding - else: - raise ValueError('Invalid justification %s' % just) - vals = str(cellval).split("\n") - n = len(vals) - leading = cellstyle.leading - fontsize = cellstyle.fontsize - if valign=='BOTTOM': - y = rowpos + cellstyle.bottomPadding+n*leading-fontsize - elif valign=='TOP': - y = rowpos + rowheight - cellstyle.topPadding - fontsize - elif valign=='MIDDLE': - #tim roberts pointed out missing fontsize correction 2004-10-04 - y = rowpos + (cellstyle.bottomPadding + rowheight-cellstyle.topPadding+n*leading)/2.0 - fontsize - else: - raise ValueError("Bad valign: '%s'" % str(valign)) - - for v in vals: - draw(x, y, v) - y -= leading - onDraw = getattr(cellval,'onDraw',None) - if onDraw: - onDraw(self.canv,cellval.kind,cellval.label) - - if cellstyle.href: - #external hyperlink - self.canv.linkURL(cellstyle.href, (colpos, rowpos, colpos + colwidth, rowpos + rowheight), relative=1) - if cellstyle.destination: - #external hyperlink - self.canv.linkRect("", cellstyle.destination, Rect=(colpos, rowpos, colpos + colwidth, rowpos + rowheight), relative=1) - -_LineOpMap = { 'GRID':'_drawGrid', - 'BOX':'_drawBox', - 'OUTLINE':'_drawBox', - 'INNERGRID':'_drawInnerGrid', - 'LINEBELOW':'_drawHLinesB', - 'LINEABOVE':'_drawHLines', - 'LINEBEFORE':'_drawVLines', - 'LINEAFTER':'_drawVLinesA', } - -class LongTable(Table): - '''Henning von Bargen's changes will be active''' - _longTableOptimize = 1 - -LINECOMMANDS = list(_LineOpMap.keys()) - -def _isLineCommand(cmd): - return cmd[0] in LINECOMMANDS - -def _setCellStyle(cellStyles, i, j, op, values): - #new = CellStyle('<%d, %d>' % (i,j), cellStyles[i][j]) - #cellStyles[i][j] = new - ## modify in place!!! - new = cellStyles[i][j] - if op == 'FONT': - n = len(values) - new.fontname = values[0] - if n>1: - new.fontsize = values[1] - if n>2: - new.leading = values[2] - else: - new.leading = new.fontsize*1.2 - elif op in ('FONTNAME', 'FACE'): - new.fontname = values[0] - elif op in ('SIZE', 'FONTSIZE'): - new.fontsize = values[0] - elif op == 'LEADING': - new.leading = values[0] - elif op == 'TEXTCOLOR': - new.color = colors.toColor(values[0], colors.Color(0,0,0)) - elif op in ('ALIGN', 'ALIGNMENT'): - new.alignment = values[0] - elif op == 'VALIGN': - new.valign = values[0] - elif op == 'LEFTPADDING': - new.leftPadding = values[0] - elif op == 'RIGHTPADDING': - new.rightPadding = values[0] - elif op == 'TOPPADDING': - new.topPadding = values[0] - elif op == 'BOTTOMPADDING': - new.bottomPadding = values[0] - elif op == 'HREF': - new.href = values[0] - elif op == 'DESTINATION': - new.destination = values[0] - -GRID_STYLE = TableStyle( - [('GRID', (0,0), (-1,-1), 0.25, colors.black), - ('ALIGN', (1,1), (-1,-1), 'RIGHT')] - ) -BOX_STYLE = TableStyle( - [('BOX', (0,0), (-1,-1), 0.50, colors.black), - ('ALIGN', (1,1), (-1,-1), 'RIGHT')] - ) -LABELED_GRID_STYLE = TableStyle( - [('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), - ('BOX', (0,0), (-1,-1), 2, colors.black), - ('LINEBELOW', (0,0), (-1,0), 2, colors.black), - ('LINEAFTER', (0,0), (0,-1), 2, colors.black), - ('ALIGN', (1,1), (-1,-1), 'RIGHT')] - ) -COLORED_GRID_STYLE = TableStyle( - [('INNERGRID', (0,0), (-1,-1), 0.25, colors.black), - ('BOX', (0,0), (-1,-1), 2, colors.red), - ('LINEBELOW', (0,0), (-1,0), 2, colors.black), - ('LINEAFTER', (0,0), (0,-1), 2, colors.black), - ('ALIGN', (1,1), (-1,-1), 'RIGHT')] - ) -LIST_STYLE = TableStyle( - [('LINEABOVE', (0,0), (-1,0), 2, colors.green), - ('LINEABOVE', (0,1), (-1,-1), 0.25, colors.black), - ('LINEBELOW', (0,-1), (-1,-1), 2, colors.green), - ('ALIGN', (1,1), (-1,-1), 'RIGHT')] - ) - -# experimental iterator which can apply a sequence -# of colors e.g. Blue, None, Blue, None as you move -# down. -if __name__ == '__main__': - from tests.test_platypus_tables import old_tables_test - old_tables_test() diff --git a/reportlab/platypus/xpreformatted.py b/reportlab/platypus/xpreformatted.py deleted file mode 100644 index 3af9730d..00000000 --- a/reportlab/platypus/xpreformatted.py +++ /dev/null @@ -1,338 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2012 -#see license.txt for license details -#history http://www.reportlab.co.uk/cgi-bin/viewcvs.cgi/public/reportlab/trunk/reportlab/platypus/xpreformatted.py -__version__=''' $Id$ ''' -__doc__='''A 'rich preformatted text' widget allowing internal markup''' -from reportlab.lib import PyFontify -from reportlab.platypus.paragraph import Paragraph, cleanBlockQuotedText, _handleBulletWidth, \ - ParaLines, _getFragWords, stringWidth, getAscentDescent, imgVRange, imgNormV -from reportlab.lib.utils import isSeq -from reportlab.platypus.flowables import _dedenter - -def _getFragLines(frags): - lines = [] - cline = [] - W = frags[:] - while W != []: - w = W[0] - t = w.text - del W[0] - i = t.find('\n') - if i>=0: - tleft = t[i+1:] - cline.append(w.clone(text=t[:i])) - lines.append(cline) - cline = [] - if tleft!='': - W.insert(0,w.clone(text=tleft)) - else: - cline.append(w) - if cline!=[]: - lines.append(cline) - return lines - -def _split_blPara(blPara,start,stop): - f = blPara.clone() - for a in ('lines', 'text'): - if hasattr(f,a): delattr(f,a) - f.lines = blPara.lines[start:stop] - return [f] - -# Will be removed shortly. -def _countSpaces(text): - return text.count(' ') -## i = 0 -## s = 0 -## while 1: -## j = text.find(' ',i) -## if j<0: return s -## s = s + 1 -## i = j + 1 - -def _getFragWord(frags,maxWidth): - ''' given a fragment list return a list of lists - [size, spaces, (f00,w00), ..., (f0n,w0n)] - each pair f,w represents a style and some string - ''' - W = [] - n = 0 - s = 0 - for f in frags: - text = f.text[:] - W.append((f,text)) - cb = getattr(f,'cbDefn',None) - if cb: - _w = getattr(cb,'width',0) - if hasattr(_w,'normalizedValue'): - _w._normalizer = maxWidth - n = n + stringWidth(text, f.fontName, f.fontSize) - - #s = s + _countSpaces(text) - s = s + text.count(' ') # much faster for many blanks - - #del f.text # we can't do this until we sort out splitting - # of paragraphs - return n, s, W - -class XPreformatted(Paragraph): - def __init__(self, text, style, bulletText = None, frags=None, caseSensitive=1, dedent=0): - self.caseSensitive = caseSensitive - cleaner = lambda text, dedent=dedent: '\n'.join(_dedenter(text or '',dedent)) - self._setup(text, style, bulletText, frags, cleaner) - - def breakLines(self, width): - """ - Returns a broken line structure. There are two cases - - A) For the simple case of a single formatting input fragment the output is - A fragment specifier with - - kind = 0 - - fontName, fontSize, leading, textColor - - lines= A list of lines - - Each line has two items: - - 1. unused width in points - 2. a list of words - - B) When there is more than one input formatting fragment the out put is - A fragment specifier with - - kind = 1 - - lines = A list of fragments each having fields: - - - extraspace (needed for justified) - - fontSize - - words=word list - - each word is itself a fragment with - - various settings - - This structure can be used to easily draw paragraphs with the various alignments. - You can supply either a single width or a list of widths; the latter will have its - last item repeated until necessary. A 2-element list is useful when there is a - different first line indent; a longer list could be created to facilitate custom wraps - around irregular objects.""" - - if not isSeq(width): maxWidths = [width] - else: maxWidths = width - lines = [] - lineno = 0 - maxWidth = maxWidths[lineno] - style = self.style - fFontSize = float(style.fontSize) - requiredWidth = 0 - - #for bullets, work out width and ensure we wrap the right amount onto line one - _handleBulletWidth(self.bulletText,style,maxWidths) - - self.height = 0 - autoLeading = getattr(self,'autoLeading',getattr(style,'autoLeading','')) - calcBounds = autoLeading not in ('','off') - frags = self.frags - nFrags= len(frags) - if nFrags==1: - f = frags[0] - if hasattr(f,'text'): - fontSize = f.fontSize - fontName = f.fontName - ascent, descent = getAscentDescent(fontName,fontSize) - kind = 0 - L=f.text.split('\n') - for l in L: - currentWidth = stringWidth(l,fontName,fontSize) - requiredWidth = max(currentWidth,requiredWidth) - extraSpace = maxWidth-currentWidth - lines.append((extraSpace,l.split(' '),currentWidth)) - lineno = lineno+1 - maxWidth = lineno', '
              '), - 'keyword' : ('', ''), - 'parameter' : ('', ''), - 'identifier' : ('', ''), - 'string' : ('', '') } - - def __init__(self, text, style, bulletText = None, dedent=0, frags=None): - if text: - text = self.fontify(self.escapeHtml(text)) - XPreformatted.__init__(self, text, style,bulletText=bulletText,dedent=dedent,frags=frags) - - def escapeHtml(self, text): - s = text.replace('&', '&') - s = s.replace('<', '<') - s = s.replace('>', '>') - return s - - def fontify(self, code): - "Return a fontified version of some Python code." - - if code[0] == '\n': - code = code[1:] - - tags = PyFontify.fontify(code) - fontifiedCode = '' - pos = 0 - for k, i, j, dummy in tags: - fontifiedCode = fontifiedCode + code[pos:i] - s, e = self.formats[k] - fontifiedCode = fontifiedCode + s + code[i:j] + e - pos = j - - fontifiedCode = fontifiedCode + code[pos:] - - return fontifiedCode - -if __name__=='__main__': #NORUNTESTS - import sys - def dumpXPreformattedLines(P): - print('\n############dumpXPreforemattedLines(%s)' % str(P)) - lines = P.blPara.lines - n =len(lines) - outw=sys.stdout.write - for l in range(n): - line = lines[l] - words = line.words - nwords = len(words) - outw('line%d: %d(%d)\n ' % (l,nwords,line.wordCount)) - for w in range(nwords): - outw(" %d:'%s'"%(w,words[w].text)) - print() - - def dumpXPreformattedFrags(P): - print('\n############dumpXPreforemattedFrags(%s)' % str(P)) - frags = P.frags - n =len(frags) - for l in range(n): - print("frag%d: '%s'" % (l, frags[l].text)) - - outw=sys.stdout.write - l = 0 - for L in _getFragLines(frags): - n=0 - for W in _getFragWords(L,360): - outw("frag%d.%d: size=%d" % (l, n, W[0])) - n = n + 1 - for w in W[1:]: - outw(" '%s'" % w[1]) - print() - l = l + 1 - - def try_it(text,style,dedent,aW,aH): - P=XPreformatted(text,style,dedent=dedent) - dumpXPreformattedFrags(P) - w,h = P.wrap(aW, aH) - dumpXPreformattedLines(P) - S = P.split(aW,aH) - dumpXPreformattedLines(P) - for s in S: - s.wrap(aW,aH) - dumpXPreformattedLines(s) - aH = 500 - - from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle - styleSheet = getSampleStyleSheet() - B = styleSheet['BodyText'] - DTstyle = ParagraphStyle("discussiontext", parent=B) - DTstyle.fontName= 'Helvetica' - for (text,dedent,style, aW, aH, active) in [(''' - - -The CMYK or subtractive - -method follows the way a printer -mixes three pigments (cyan, magenta, and yellow) to form colors. -Because mixing chemicals is more difficult than combining light there -is a fourth parameter for darkness. For example a chemical -combination of the CMY pigments generally never makes a perfect - -black -- instead producing a muddy color -- so, to get black printers -don't use the CMY pigments but use a direct black ink. Because -CMYK maps more directly to the way printer hardware works it may -be the case that &| & | colors specified in CMYK will provide better fidelity -and better control when printed. - - -''',0,DTstyle, 456.0, 42.8, 0), -(''' - - This is a non rearranging form of the Paragraph class; - XML tags are allowed in text and have the same - - meanings as for the Paragraph class. - As for Preformatted, if dedent is non zero dedent - common leading spaces will be removed from the - front of each line. - -''',3, DTstyle, 456.0, 42.8, 0), -("""\ - class FastXMLParser: - # Nonsense method - def nonsense(self): - self.foo = 'bar' -""",0, styleSheet['Code'], 456.0, 4.8, 1), -]: - if active: try_it(text,style,dedent,aW,aH) diff --git a/reportlab/rl_config.py b/reportlab/rl_config.py deleted file mode 100644 index 8c24a0e6..00000000 --- a/reportlab/rl_config.py +++ /dev/null @@ -1,131 +0,0 @@ -'''module that aggregates config information''' -__all__=('_reset','register_reset') - -def _defaults_init(): - ''' - create & return defaults for all reportlab settings from - reportlab.rl_settings.py - reportlab.local_rl_settings.py - reportlab_settings.py or ~/.reportlab_settings - - latter values override earlier - ''' - from reportlab.lib.utils import rl_exec - import os - - _DEFAULTS={} - rl_exec('from reportlab.rl_settings import *',_DEFAULTS) - - _overrides=_DEFAULTS.copy() - try: - rl_exec('from reportlab.local_rl_settings import *',_overrides) - _DEFAULTS.update(_overrides) - except ImportError: - pass - - _overrides=_DEFAULTS.copy() - try: - rl_exec('from reportlab_settings import *',_overrides) - _DEFAULTS.update(_overrides) - except ImportError: - _overrides=_DEFAULTS.copy() - try: - try: - fn = os.path.expanduser(os.path.join('~','.reportlab_settings')) #appengine fails with ImportError - except ImportError: - fn = None - if fn: - with open(fn,'rb') as f: - rl_exec(f.read(),_overrides) - _DEFAULTS.update(_overrides) - except: - pass - return _DEFAULTS - -_DEFAULTS=_defaults_init() - -_SAVED = {} -sys_version=None - -#this is used to set the options from -def _setOpt(name, value, conv=None): - '''set a module level value from environ/default''' - from os import environ - ename = 'RL_'+name - if ename in environ: - value = environ[ename] - if conv: value = conv(value) - globals()[name] = value - -def _startUp(): - '''This function allows easy resetting to the global defaults - If the environment contains 'RL_xxx' then we use the value - else we use the given default''' - import os, sys - global sys_version, _unset_ - sys_version = sys.version.split()[0] #strip off the other garbage - from reportlab.lib import pagesizes - from reportlab.lib.utils import rl_isdir - - if _SAVED=={}: - _unset_ = getattr(sys,'_rl_config__unset_',None) - if _unset_ is None: - class _unset_: pass - sys._rl_config__unset_ = _unset_ = _unset_() - global __all__ - A = list(__all__) - for k,v in _DEFAULTS.items(): - _SAVED[k] = globals()[k] = v - if k not in __all__: - A.append(k) - __all__ = tuple(A) - - #places to search for Type 1 Font files - import reportlab - D = {'REPORTLAB_DIR': os.path.abspath(os.path.dirname(reportlab.__file__)), - 'CWD': os.getcwd(), - 'disk': os.getcwd().split(':')[0], - 'sys_version': sys_version, - 'XDG_DATA_HOME': os.environ.get('XDG_DATA_HOME','~/.local/share'), - } - - for k in _SAVED: - if k.endswith('SearchPath'): - P=[] - for p in _SAVED[k]: - d = (p % D).replace('/',os.sep) - if '~' in d: - try: - d = os.path.expanduser(d) #appengine fails with ImportError - except ImportError: - continue - if rl_isdir(d): P.append(d) - _setOpt(k,os.pathsep.join(P),lambda x:x.split(os.pathsep)) - globals()[k] = list(filter(rl_isdir,globals()[k])) - else: - v = _SAVED[k] - if isinstance(v,(int,float)): conv = type(v) - elif k=='defaultPageSize': conv = lambda v,M=pagesizes: getattr(M,v) - else: conv = None - _setOpt(k,v,conv) - -_registered_resets=[] -def register_reset(func): - '''register a function to be called by rl_config._reset''' - _registered_resets[:] = [x for x in _registered_resets if x()] - L = [x for x in _registered_resets if x() is func] - if L: return - from weakref import ref - _registered_resets.append(ref(func)) - -def _reset(): - '''attempt to reset reportlab and friends''' - _startUp() #our reset - for f in _registered_resets[:]: - c = f() - if c: - c() - else: - _registered_resets.remove(f) - -_startUp() diff --git a/reportlab/rl_settings.py b/reportlab/rl_settings.py deleted file mode 100644 index 593404e2..00000000 --- a/reportlab/rl_settings.py +++ /dev/null @@ -1,209 +0,0 @@ -#Copyright ReportLab Europe Ltd. 2000-2013 -#see license.txt for license details -'''default settings for reportlab - -to override these drop a module rl_local_settings.py parallel to this file or -anywhere on the path. -''' -import os, sys -__version__=''' $Id$ ''' -__all__=tuple('''allowTableBoundsErrors -shapeChecking -defaultEncoding -defaultGraphicsFontName -pageCompression -useA85 -defaultPageSize -defaultImageCaching -ZLIB_WARNINGS -warnOnMissingFontGlyphs -verbose -showBoundary -emptyTableAction -invariant -eps_preview_transparent -eps_preview -eps_ttf_embed -eps_ttf_embed_uid -overlapAttachedSpace -longTableOptimize -autoConvertEncoding -_FUZZ -wrapA85 -fsEncodings -odbc_driver -platypus_link_underline -canvas_basefontname -allowShortTableRows -imageReaderFlags -paraFontSizeHeightOffset -canvas_baseColor -ignoreContainerActions -ttfAsciiReadable -pdfMultiLine -pdfComments -debug -rtlSupport -listWrapOnFakeWidth -T1SearchPath -TTFSearchPath -CMapSearchPath -baseUnderlineProportion -decimalSymbol'''.split()) - -allowTableBoundsErrors = 1 # set to 0 to die on too large elements in tables in debug (recommend 1 for production use) -shapeChecking = 1 -defaultEncoding = 'WinAnsiEncoding' # 'WinAnsi' or 'MacRoman' -defaultGraphicsFontName= 'Times-Roman' #initializer for STATE_DEFAULTS in shapes.py -pageCompression = 1 # default page compression mode -useA85 = 1 #set to 0 to disable Ascii Base 85 stream filters -defaultPageSize = 'A4' #default page size -defaultImageCaching = 0 #set to zero to remove those annoying cached images -ZLIB_WARNINGS = 1 -warnOnMissingFontGlyphs = 0 #if 1, warns of each missing glyph -verbose = 0 -showBoundary = 0 # turns on and off boundary behaviour in Drawing -emptyTableAction= 'error' # one of 'error', 'indicate', 'ignore' -invariant= 0 #produces repeatable,identical PDFs with same timestamp info (for regression testing) -eps_preview_transparent= None #set to white etc -eps_preview= 1 #set to False to disable -eps_ttf_embed= 1 #set to False to disable -eps_ttf_embed_uid= 0 #set to 1 to enable -overlapAttachedSpace= 1 #if set non false then adajacent flowable space after - #and space before are merged (max space is used). -longTableOptimize = 1 #default don't use Henning von Bargen's long table optimizations -autoConvertEncoding = 0 #convert internally as needed (experimental) -_FUZZ= 1e-6 #fuzz for layout arithmetic -wrapA85= 0 #set to 1 to get old wrapped line behaviour -fsEncodings=('utf8','cp1252','cp430') #encodings to attempt utf8 conversion with -odbc_driver= 'odbc' #default odbc driver -platypus_link_underline= 0 #paragraph links etc underlined if true -canvas_basefontname= 'Helvetica' #this is used to initialize the canvas; if you override to make - #something else you are responsible for ensuring the font is registered etc etc - #this will be used everywhere and the font family connections will be made - #if the bold/italic/bold italic fonts are also registered and defined as a family. - -allowShortTableRows=1 #allows some rows in a table to be short -imageReaderFlags=0 #attempt to convert images into internal memory files to reduce - #the number of open files (see lib.utils.ImageReader) - #if imageReaderFlags&2 then attempt autoclosing of those files - #if imageReaderFlags&4 then cache data - #if imageReaderFlags==-1 then use Ralf Schmitt's re-opening approach -paraFontSizeHeightOffset= 1 #if true paragraphs start at height-fontSize -canvas_baseColor= None #initialize the canvas fill and stroke colors if this is set -ignoreContainerActions= 1 #if true then action flowables in flowable _Containers will be ignored -ttfAsciiReadable= 1 #smaller subsets when set to 0 -pdfMultiLine= 0 #use more lines in pdf etc -pdfComments= 0 #put in pdf comments -debug= 0 #for debugging code -rtlSupport= 0 #set to 1 to attempt import of RTL assistance eg fribidi etc etc -listWrapOnFakeWidth= 1 #set to 0/False to force platypus.flowables._listWrapOn to report correct widths - #else it reports minimum(required,available) width -baseUnderlineProportion= 0.0 #non-zero for doing font size proportional lines in Paragraph.py - #by default typical value 0.05. may be overridden on a parastyle. -decimalSymbol= '.' #what we use to align floats numerically - -# places to look for T1Font information -T1SearchPath = ( - 'c:/Program Files/Adobe/Acrobat 9.0/Resource/Font', - 'c:/Program Files/Adobe/Acrobat 8.0/Resource/Font', - 'c:/Program Files/Adobe/Acrobat 7.0/Resource/Font', - 'c:/Program Files/Adobe/Acrobat 6.0/Resource/Font', #Win32, Acrobat 6 - 'c:/Program Files/Adobe/Acrobat 5.0/Resource/Font', #Win32, Acrobat 5 - 'c:/Program Files/Adobe/Acrobat 4.0/Resource/Font', #Win32, Acrobat 4 - '%(disk)s/Applications/Python %(sys_version)s/reportlab/fonts', #Mac? - '/usr/lib/Acrobat9/Resource/Font', #Linux, Acrobat 5? - '/usr/lib/Acrobat8/Resource/Font', #Linux, Acrobat 5? - '/usr/lib/Acrobat7/Resource/Font', #Linux, Acrobat 5? - '/usr/lib/Acrobat6/Resource/Font', #Linux, Acrobat 5? - '/usr/lib/Acrobat5/Resource/Font', #Linux, Acrobat 5? - '/usr/lib/Acrobat4/Resource/Font', #Linux, Acrobat 4 - '/usr/local/Acrobat9/Resource/Font', #Linux, Acrobat 5? - '/usr/local/Acrobat8/Resource/Font', #Linux, Acrobat 5? - '/usr/local/Acrobat7/Resource/Font', #Linux, Acrobat 5? - '/usr/local/Acrobat6/Resource/Font', #Linux, Acrobat 5? - '/usr/local/Acrobat5/Resource/Font', #Linux, Acrobat 5? - '/usr/local/Acrobat4/Resource/Font', #Linux, Acrobat 4 - '/usr/share/fonts/default/Type1', #Linux, Fedora - '%(REPORTLAB_DIR)s/fonts', #special - '%(REPORTLAB_DIR)s/../fonts', #special - '%(REPORTLAB_DIR)s/../../fonts', #special - '%(CWD)s/fonts', #special - '~/fonts', - '~/.fonts', - '%(XDG_DATA_HOME)s/fonts', - '~/.local/share/fonts', - ) - -# places to look for TT Font information -TTFSearchPath = ( - 'c:/winnt/fonts', - 'c:/windows/fonts', - '/usr/lib/X11/fonts/TrueType/', - '/usr/share/fonts/truetype', - '/usr/share/fonts', #Linux, Fedora - '/usr/share/fonts/dejavu', #Linux, Fedora - '%(REPORTLAB_DIR)s/fonts', #special - '%(REPORTLAB_DIR)s/../fonts', #special - '%(REPORTLAB_DIR)s/../../fonts',#special - '%(CWD)s/fonts', #special - '~/fonts', - '~/.fonts', - '%(XDG_DATA_HOME)s/fonts', - '~/.local/share/fonts', - #mac os X - from - #http://developer.apple.com/technotes/tn/tn2024.html - '~/Library/Fonts', - '/Library/Fonts', - '/Network/Library/Fonts', - '/System/Library/Fonts', - ) - -# places to look for CMap files - should ideally merge with above -CMapSearchPath = ( - '/usr/lib/Acrobat9/Resource/CMap', - '/usr/lib/Acrobat8/Resource/CMap', - '/usr/lib/Acrobat7/Resource/CMap', - '/usr/lib/Acrobat6/Resource/CMap', - '/usr/lib/Acrobat5/Resource/CMap', - '/usr/lib/Acrobat4/Resource/CMap', - '/usr/local/Acrobat9/Resource/CMap', - '/usr/local/Acrobat8/Resource/CMap', - '/usr/local/Acrobat7/Resource/CMap', - '/usr/local/Acrobat6/Resource/CMap', - '/usr/local/Acrobat5/Resource/CMap', - '/usr/local/Acrobat4/Resource/CMap', - 'C:\\Program Files\\Adobe\\Acrobat\\Resource\\CMap', - 'C:\\Program Files\\Adobe\\Acrobat 9.0\\Resource\\CMap', - 'C:\\Program Files\\Adobe\\Acrobat 8.0\\Resource\\CMap', - 'C:\\Program Files\\Adobe\\Acrobat 7.0\\Resource\\CMap', - 'C:\\Program Files\\Adobe\\Acrobat 6.0\\Resource\\CMap', - 'C:\\Program Files\\Adobe\\Acrobat 5.0\\Resource\\CMap', - 'C:\\Program Files\\Adobe\\Acrobat 4.0\\Resource\\CMap', - '%(REPORTLAB_DIR)s/fonts/CMap', #special - '%(REPORTLAB_DIR)s/../fonts/CMap', #special - '%(REPORTLAB_DIR)s/../../fonts/CMap', #special - '%(CWD)s/fonts/CMap', #special - '%(CWD)s/fonts', #special - '~/fonts/CMap', - '~/.fonts/CMap', - '%(XDG_DATA_HOME)s/fonts/CMap', - '~/.local/share/fonts/CMap', - ) - -if sys.platform.startswith('linux'): - def _findFontDirs(*ROOTS): - R = [].append - for rootd in ROOTS: - for root, dirs, files in os.walk(rootd): - if not files: continue - R(root) - return tuple(R.__self__) - T1SearchPath = T1SearchPath + _findFontDirs( - '/usr/share/fonts/type1', - '/usr/share/fonts/Type1', - ) - TTFSearchPath = TTFSearchPath + _findFontDirs( - '/usr/share/fonts/truetype', - '/usr/share/fonts/TTF', - ) diff --git a/requirements.txt b/requirements.txt index 6cc17e3c..c7a586a1 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,6 @@ django-registration-redux==1.1 django-reversion==1.8.5 sqlparse==0.1.13 simplejson==3.6.5 -lxml==3.4.1 \ No newline at end of file +lxml==3.4.1 +pil==1.1.7 +z3c.rlm==2.7.2 \ No newline at end of file diff --git a/z3c/__init__.py b/z3c/__init__.py deleted file mode 100644 index bf99a9da..00000000 --- a/z3c/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -# this is a namespace package -try: - import pkg_resources - pkg_resources.declare_namespace(__name__) -except ImportError: - import pkgutil - __path__ = pkgutil.extend_path(__path__, __name__) - diff --git a/z3c/rml/README.txt b/z3c/rml/README.txt deleted file mode 100644 index 2d9ff334..00000000 --- a/z3c/rml/README.txt +++ /dev/null @@ -1,18 +0,0 @@ -========================= -Reportlab Markup Language -========================= - -This package is a free implementation of the RML markup language developed by -Reportlab. Unfortunately, full compliance cannot be immediately verified, -since the RML User Guide is ambiguous, incomplete and even incorrect. This -package can also not support the commercial extensions to Reportlab. - -In the course of implementing the specification, I made already some -improvements for various tags and added others fully. I also tried hard to -test all features. If you have any new sample RML files that you would like to -share, please check them in. - -Why reimplement RML? The other free implementation of RML tinyRML is -unfortunately pretty messy code and hard to debug. It makes it also hard to -add additional tags. However, much thanks goes to their authors, since they -have solved some of the very tricky issues. diff --git a/z3c/rml/__init__.py b/z3c/rml/__init__.py deleted file mode 100644 index fc80500c..00000000 --- a/z3c/rml/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# Hook up our custom paragraph parser. -import z3c.rml.paraparser -import z3c.rml.rlfix - - -from reportlab.lib.styles import getSampleStyleSheet -SampleStyleSheet = getSampleStyleSheet() diff --git a/z3c/rml/attr.py b/z3c/rml/attr.py deleted file mode 100644 index 7dae41ee..00000000 --- a/z3c/rml/attr.py +++ /dev/null @@ -1,607 +0,0 @@ -# ############################################################################# -# -# Copyright (c) 2007 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -# ############################################################################# -"""RML Attribute Implementation -""" -import cStringIO -import logging -import os -import re -import reportlab.graphics.widgets.markers -import reportlab.lib.colors -import reportlab.lib.pagesizes -import reportlab.lib.styles -import reportlab.lib.units -import reportlab.lib.utils -import urllib -import zope.interface -import zope.schema -from lxml import etree - -from z3c.rml import interfaces, SampleStyleSheet - -MISSING = object() -logger = logging.getLogger("z3c.rml") - - -def getFileInfo(directive): - root = directive - while root.parent: - root = root.parent - return '(file %s, line %i)' % ( - root.filename, directive.element.sourceline) - - -def getManager(context, interface=None): - if interface is None: - # Avoid circular imports - from z3c.rml import interfaces - - interface = interfaces.IManager - # Walk up the path until the manager is found - # Using interface.providedBy is much slower because it does many more checks - while ( - context is not None and - not interface in context.__class__.__dict__.get('__implemented__', {}) - ): - context = context.parent - # If no manager was found, raise an error - if context is None: - raise ValueError('The manager could not be found.') - return context - - -def deprecated(oldName, attr, reason): - zope.interface.directlyProvides(attr, interfaces.IDeprecated) - attr.deprecatedName = oldName - attr.deprecatedReason = reason - return attr - - -class RMLAttribute(zope.schema.Field): - """An attribute of the RML directive.""" - - missing_value = MISSING - default = MISSING - - def fromUnicode(self, ustr): - """See zope.schema.interfaces.IField""" - if self.context is None: - raise ValueError('Attribute not bound to a context.') - return super(RMLAttribute, self).fromUnicode(unicode(ustr)) - - def get(self): - """See zope.schema.interfaces.IField""" - # If the attribute has a deprecated partner and the deprecated name - # has been specified, use it. - if (interfaces.IDeprecated.providedBy(self) and - self.deprecatedName in self.context.element.attrib): - name = self.deprecatedName - logger.warn( - u'Deprecated attribute "%s": %s %s' % ( - name, self.deprecatedReason, getFileInfo(self.context))) - else: - name = self.__name__ - # Extract the value. - value = self.context.element.get(name, self.missing_value) - # Get the correct default value. - if value is self.missing_value: - if self.default is not None: - return self.default - return self.missing_value - return self.fromUnicode(value) - - -class BaseChoice(RMLAttribute): - choices = {} - doLower = True - - def fromUnicode(self, value): - if self.doLower: - value = value.lower() - if value in self.choices: - return self.choices[value] - raise ValueError( - '%r not a valid value for attribute "%s". %s' % ( - value, self.__name__, getFileInfo(self.context))) - - -class Combination(RMLAttribute): - """A combination of several other attribute types.""" - - def __init__(self, value_types=(), *args, **kw): - super(Combination, self).__init__(*args, **kw) - self.value_types = value_types - - def fromUnicode(self, value): - for value_type in self.value_types: - bound = value_type.bind(self) - try: - return bound.fromUnicode(value) - except ValueError: - pass - raise ValueError( - '"%s" is not a valid value. %s' % ( - value, getFileInfo(self.context))) - - -class String(RMLAttribute, zope.schema.Bytes): - """A simple Bytes string.""" - - -class Text(RMLAttribute, zope.schema.Text): - """A simple unicode string.""" - - -class Integer(RMLAttribute, zope.schema.Int): - """An integer. A minimum and maximum value can be specified.""" - # By making min and max simple attributes, we avoid some validation - # problems. - min = None - max = None - - -class Float(RMLAttribute, zope.schema.Float): - """An flaoting point. A minimum and maximum value can be specified.""" - # By making min and max simple attributes, we avoid some validation - # problems. - min = None - max = None - - -class StringOrInt(RMLAttribute): - """A (bytes) string or an integer.""" - - def fromUnicode(self, value): - try: - return int(value) - except ValueError: - return str(value) - - -class Sequence(RMLAttribute, zope.schema._field.AbstractCollection): - """A list of values of a specified type.""" - - splitre = re.compile('[ \t\n,;]*') - - def __init__(self, splitre=None, *args, **kw): - super(Sequence, self).__init__(*args, **kw) - if splitre is not None: - self.splitre = splitre - - def fromUnicode(self, ustr): - if ustr.startswith('(') and ustr.endswith(')'): - ustr = ustr[1:-1] - ustr = ustr.strip() - raw_values = self.splitre.split(ustr) - result = [self.value_type.bind(self.context).fromUnicode(raw.strip()) - for raw in raw_values] - if ((self.min_length is not None and len(result) < self.min_length) and - (self.max_length is not None and len(result) > self.max_length)): - raise ValueError( - 'Length of sequence must be at least %s and at most %i. %s' % ( - self.min_length, self.max_length, - getFileInfo(self.context))) - return result - - -class IntegerSequence(Sequence): - """A sequence of integers.""" - - def fromUnicode(self, ustr): - ustr = ustr.strip() - pieces = self.splitre.split(ustr) - numbers = set([]) - for piece in pieces: - # Ignore empty pieces. - if not piece: - continue - # The piece is a range. - if '-' in piece: - start, end = piece.split('-') - # Make range lower and upper bound inclusive. - numbers.update(range(int(start), int(end) + 1)) - continue - # The piece is just a number - numbers.add(int(piece)) - return list(numbers) - - -class Choice(BaseChoice): - """A choice of several values. The values are always case-insensitive.""" - - def __init__(self, choices=None, doLower=True, *args, **kw): - super(Choice, self).__init__(*args, **kw) - if isinstance(choices, (tuple, list)): - choices = dict( - [(val.lower() if doLower else val, val) for val in choices]) - else: - choices = dict( - [(key.lower() if doLower else key, val) - for key, val in choices.items()]) - self.choices = choices - self.doLower = doLower - - -class Boolean(BaseChoice): - '''A boolean value. - - For true the values "true", "yes", and "1" are allowed. For false, the - values "false", "no", "1" are allowed. - ''' - choices = {'true': True, 'false': False, - 'yes': True, 'no': False, - '1': True, '0': False, - } - - -class TextBoolean(BaseChoice): - '''A boolean value as text. - - ReportLab sometimes exposes low-level APIs, so we have to provide values - that are directly inserted into the PDF. - - For "true" the values "true", "yes", and "1" are allowed. For "false", the - values "false", "no", "1" are allowed. - ''' - choices = {'true': 'true', 'false': 'false', - 'yes': 'true', 'no': 'false', - '1': 'true', '0': 'false', - } - - -class BooleanWithDefault(Boolean): - '''This is a boolean field that can also receive the value "default".''' - choices = Boolean.choices.copy() - choices.update({'default': None}) - - -class Measurement(RMLAttribute): - '''This field represents a length value. - - The units "in" (inch), "cm", "mm", and "pt" are allowed. If no units are - specified, the value is given in points/pixels. - ''' - - def __init__(self, allowPercentage=False, allowStar=False, *args, **kw): - super(Measurement, self).__init__(*args, **kw) - self.allowPercentage = allowPercentage - self.allowStar = allowStar - - units = [ - (re.compile('^(-?[0-9\.]+)\s*in$'), reportlab.lib.units.inch), - (re.compile('^(-?[0-9\.]+)\s*cm$'), reportlab.lib.units.cm), - (re.compile('^(-?[0-9\.]+)\s*mm$'), reportlab.lib.units.mm), - (re.compile('^(-?[0-9\.]+)\s*pt$'), 1), - (re.compile('^(-?[0-9\.]+)\s*$'), 1) - ] - - allowPercentage = False - allowStar = False - - def fromUnicode(self, value): - if value == 'None': - return None - if value == '*' and self.allowStar: - return value - if value.endswith('%') and self.allowPercentage: - return value - - for unit in self.units: - res = unit[0].search(value, 0) - if res: - return unit[1] * float(res.group(1)) - raise ValueError( - 'The value %r is not a valid measurement. %s' % ( - value, getFileInfo(self.context))) - - -class File(Text): - """This field will return a file object. - - The value itself can eith be be a relative or absolute path. Additionally - the following syntax is supported: [path.to.python.mpackage]/path/to/file - """ - open = staticmethod(urllib.urlopen) - packageExtract = re.compile('^\[([0-9A-z_.]*)\]/(.*)$') - - doNotOpen = False - - def __init__(self, doNotOpen=False, *args, **kw): - super(File, self).__init__(*args, **kw) - self.doNotOpen = doNotOpen - - def fromUnicode(self, value): - # Check whether the value is of the form: - # []/rel/path/image.gif" - if value.startswith('['): - result = self.packageExtract.match(value) - if result is None: - raise ValueError( - 'The package-path-pair you specified was incorrect. %s' % ( - getFileInfo(self.context))) - modulepath, path = result.groups() - module = __import__(modulepath, {}, {}, (modulepath)) - value = os.path.join(os.path.dirname(module.__file__), path) - # If there is a drive name in the path, then we want a local file to - # be opened. This is only interesting for Windows of course. - if os.path.splitdrive(value)[0]: - value = 'file:///' + value - # If the file is not to be opened, simply return the path. - if self.doNotOpen: - return value - # Open/Download the file - fileObj = self.open(value) - sio = cStringIO.StringIO(fileObj.read()) - fileObj.close() - sio.seek(0) - return sio - - -class Image(File): - """Similar to the file File attribute, except that an image is internally - expected.""" - - def __init__(self, onlyOpen=False, *args, **kw): - super(Image, self).__init__(*args, **kw) - self.onlyOpen = onlyOpen - - def fromUnicode(self, value): - if value.lower().endswith('.svg') or value.lower().endswith('.svgz'): - return self._load_svg(value) - fileObj = super(Image, self).fromUnicode(value) - if self.onlyOpen: - return fileObj - return reportlab.lib.utils.ImageReader(fileObj) - - def _load_svg(self, value): - manager = getManager(self.context) - - width = self.context.element.get('width') - if width is not None: - width = Measurement().fromUnicode(width) - height = self.context.element.get('height') - if height is not None: - height = Measurement().fromUnicode(height) - preserve = self.context.element.get('preserveAspectRatio') - if preserve is not None: - preserve = Boolean().fromUnicode(preserve) - - cache_key = '%s-%sx%s-%s' % (value, width, height, preserve) - if cache_key in manager.svgs: - return manager.svgs[cache_key] - - from gzip import GzipFile - from reportlab.graphics import renderPM - from svg2rlg import Renderer - from xml.etree import cElementTree - - fileObj = super(Image, self).fromUnicode(value) - svg = fileObj.getvalue() - if svg[:2] == '\037\213': - svg = GzipFile(fileobj=fileObj).read() - svg = cElementTree.fromstring(svg) - svg = Renderer(value).render(svg) - - if preserve: - if width is not None or height is not None: - if width is not None and height is None: - height = svg.height * width / svg.width - elif height is not None and width is None: - width = svg.width * height / svg.height - elif float(width) / height > float(svg.width) / svg.height: - width = svg.width * height / svg.height - else: - height = svg.height * width / svg.width - else: - if width is None: - width = svg.width - if height is None: - height = svg.height - - svg.scale(width / svg.width, height / svg.height) - svg.width = width - svg.height = height - - svg = renderPM.drawToPIL(svg, dpi=300) - svg = reportlab.lib.utils.ImageReader(svg) - svg.read = True # A hack to get ImageReader through as an open Image - # when used with imageAndFlowables - manager.svgs[cache_key] = svg - return svg - - -class Color(RMLAttribute): - """Requires the input of a color. There are several supported formats. - - Three values in a row are interpreted as RGB value ranging from 0-255. - A string is interpreted as a name to a pre-defined color. - The 'CMYK()' wrapper around four values represents a CMYK color - specification. - """ - - def __init__(self, acceptNone=False, *args, **kw): - super(Color, self).__init__(*args, **kw) - self.acceptNone = acceptNone - - def fromUnicode(self, value): - if self.acceptNone and value.lower() == 'none': - return None - manager = getManager(self.context) - - if value.startswith('rml:'): - value = manager.get_name(value[4:], '#000000') - - if value in manager.colors: - return manager.colors[value] - try: - return reportlab.lib.colors.toColor(value) - # Bare except, since code raises string exception: Invalid color value - except: - raise ValueError( - 'The color specification "%s" is not valid. %s' % ( - value, getFileInfo(self.context))) - - -def _getStyle(context, value): - manager = getManager(context) - for styles in (manager.styles, SampleStyleSheet.byName): - if value in styles: - return styles[value] - elif 'style.' + value in styles: - return styles['style.' + value] - elif value.startswith('style.') and value[6:] in styles: - return styles[value[6:]] - raise ValueError('Style %r could not be found. %s' % ( - value, getFileInfo(context))) - - -class Style(String): - """Requires a valid style to be entered. - - Whether the style is a paragraph, table or box style is irrelevant, except - that it has to fit the tag. - """ - default = SampleStyleSheet.byName['Normal'] - - def fromUnicode(self, value): - return _getStyle(self.context, value) - - -class Padding(Sequence): - """This attribute is specific for padding and will produce the proper - length of the padding sequence.""" - - def __init__(self, *args, **kw): - kw.update(dict(value_type=Integer(), min_length=1, max_length=4)) - super(Padding, self).__init__(*args, **kw) - - def fromUnicode(self, value): - seq = super(Padding, self).fromUnicode(value) - # pdfgen does not like a single paddign value. - if len(seq) == 1: - seq.append(seq[0]) - return seq - - -class Symbol(Text): - """This attribute should contain the text representation of a symbol to be - used.""" - - def fromUnicode(self, value): - return reportlab.graphics.widgets.markers.makeMarker(value) - - -class PageSize(RMLAttribute): - """A simple measurement pair that specifies the page size. Optionally you - can also specify a the name of a page size, such as A4, letter, or legal. - """ - - sizePair = Sequence(value_type=Measurement()) - words = Sequence(value_type=String()) - - def fromUnicode(self, value): - # First try to get a pair - try: - return self.sizePair.bind(self.context).fromUnicode(value) - except ValueError: - pass - # Now we try to lookup a name. The following type of combinations must - # work: "Letter" "LETTER" "A4 landscape" "letter portrait" - words = self.words.bind(self.context).fromUnicode(value) - words = [word.lower() for word in words] - # First look for the orientation - orienter = None - for orientation in ('landscape', 'portrait'): - if orientation in words: - orienter = getattr(reportlab.lib.pagesizes, orientation) - words.remove(orientation) - # We must have exactely one value left that matches a paper size - pagesize = getattr(reportlab.lib.pagesizes, words[0].upper()) - # Now do the final touches - if orienter: - pagesize = orienter(pagesize) - return pagesize - - -class TextNode(RMLAttribute): - """Return the text content of an element.""" - - def get(self): - if self.context.element.text is None: - return u'' - return unicode(self.context.element.text).strip() - - -class FirstLevelTextNode(TextNode): - """Gets all the text content of an element without traversing into any - child-elements.""" - - def get(self): - text = self.context.element.text or u'' - for child in self.context.element.getchildren(): - text += child.tail or u'' - return text.strip() - - -class TextNodeSequence(Sequence, TextNode): - """A sequence of values retrieved from the element's content.""" - - def get(self): - return self.fromUnicode(self.context.element.text) - - -class TextNodeGrid(TextNodeSequence): - """A grid/matrix of values retrieved from the element's content. - - The number of columns is specified for every case, but the number of rows - is dynamic. - """ - - def __init__(self, columns=None, *args, **kw): - super(TextNodeGrid, self).__init__(*args, **kw) - self.columns = columns - - def fromUnicode(self, ustr): - result = super(TextNodeGrid, self).fromUnicode(ustr) - if len(result) % self.columns != 0: - raise ValueError( - 'Number of elements must be divisible by %i. %s' % ( - self.columns, getFileInfo(self.context))) - return [result[i * self.columns:(i + 1) * self.columns] - for i in range(len(result) / self.columns)] - - -class RawXMLContent(RMLAttribute): - """Retrieve the raw content of an element. - - Only some special element substitution will be made. - """ - - def __init__(self, *args, **kw): - super(RawXMLContent, self).__init__(*args, **kw) - - def get(self): - # ReportLab's paragraph parser does not like attributes from other - # namespaces; sigh. So we have to improvize. - text = etree.tounicode(self.context.element, pretty_print=False) - text = text[text.find('>') + 1:text.rfind('<')] - return text - - -class XMLContent(RawXMLContent): - """Same as 'RawXMLContent', except that the whitespace is normalized.""" - - def get(self): - text = super(XMLContent, self).get() - return text.strip().replace('\t', ' ') diff --git a/z3c/rml/canvas.py b/z3c/rml/canvas.py deleted file mode 100644 index 416a2545..00000000 --- a/z3c/rml/canvas.py +++ /dev/null @@ -1,1012 +0,0 @@ -############################################################################## -# -# Copyright (c) 2007 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Page Drawing Related Element Processing -""" -import zope.interface -import reportlab.pdfgen.canvas -from z3c.rml import attr, directive, interfaces, occurence, stylesheet -from z3c.rml import chart, flowable, form, page, special - - -class IShape(interfaces.IRMLDirectiveSignature): - """A shape to be drawn on the canvas.""" - - x = attr.Measurement( - title=u'X-Coordinate', - description=(u'The X-coordinate of the lower-left position of the ' - u'shape.'), - required=True) - - y = attr.Measurement( - title=u'Y-Coordinate', - description=(u'The Y-coordinate of the lower-left position of the ' - u'shape.'), - required=True) - - fill = attr.Boolean( - title=u'Fill', - description=u'A flag to specify whether the shape should be filled.', - required=False) - - stroke = attr.Boolean( - title=u'Stroke', - description=(u"A flag to specify whether the shape's outline should " - u"be drawn."), - required=False) - - -class CanvasRMLDirective(directive.RMLDirective): - callable = None - attrMapping = None - - def process(self): - kwargs = dict(self.getAttributeValues(attrMapping=self.attrMapping)) - canvas = attr.getManager(self, interfaces.ICanvasManager).canvas - getattr(canvas, self.callable)(**kwargs) - - -class ISaveState(interfaces.IRMLDirectiveSignature): - """Saves the current canvas state.""" - -class SaveState(CanvasRMLDirective): - signature = ISaveState - callable = 'saveState' - - -class IRestoreState(interfaces.IRMLDirectiveSignature): - """Saves the current canvas state.""" - -class RestoreState(CanvasRMLDirective): - signature = IRestoreState - callable = 'restoreState' - - -class IDrawString(interfaces.IRMLDirectiveSignature): - """Draws a simple string (left aligned) onto the canvas at the specified - location.""" - - x = attr.Measurement( - title=u'X-Coordinate', - description=(u'The X-coordinate of the lower-left position of the ' - u'string.'), - required=True) - - y = attr.Measurement( - title=u'Y-Coordinate', - description=(u'The Y-coordinate of the lower-left position of the ' - u'string.'), - required=True) - - text = attr.RawXMLContent( - title=u'Text', - description=(u'The string/text that is put onto the canvas.'), - required=True) - -class DrawString(CanvasRMLDirective, special.TextFlowables): - signature = IDrawString - callable = 'drawString' - - def process(self): - canvas = attr.getManager(self, interfaces.ICanvasManager).canvas - kwargs = dict(self.getAttributeValues(attrMapping=self.attrMapping)) - kwargs['text'] = self._getText(self.element, canvas).strip() - getattr(canvas, self.callable)(**kwargs) - -class IDrawRightString(IDrawString): - """Draws a simple string (right aligned) onto the canvas at the specified - location.""" - -class DrawRightString(DrawString): - signature = IDrawRightString - callable = 'drawRightString' - - -class IDrawCenteredString(IDrawString): - """Draws a simple string (centered aligned) onto the canvas at the specified - location.""" - -class DrawCenteredString(DrawString): - signature = IDrawCenteredString - callable = 'drawCentredString' - - -class IDrawAlignedString(IDrawString): - """Draws a simple string (aligned to the pivot character) onto the canvas - at the specified location.""" - - pivotChar = attr.Text( - title=u'Text', - description=(u'The string/text that is put onto the canvas.'), - min_length=1, - max_length=1, - default=u'.', - required=True) - -class DrawAlignedString(DrawString): - signature = IDrawAlignedString - callable = 'drawAlignedString' - - -class IEllipse(IShape): - """Draws an ellipse on the canvas.""" - - width = attr.Measurement( - title=u'Width', - description=u'The width of the ellipse.', - required=True) - - height = attr.Measurement( - title=u'Height', - description=u'The height of the ellipse.', - required=True) - -class Ellipse(CanvasRMLDirective): - signature = IEllipse - callable = 'ellipse' - attrMapping = {'x': 'x1', 'y': 'y1'} - - def process(self): - kwargs = dict(self.getAttributeValues(attrMapping=self.attrMapping)) - canvas = attr.getManager(self, interfaces.ICanvasManager).canvas - # Convert width and height to end locations - kwargs['x2'] = kwargs['x1'] + kwargs['width'] - del kwargs['width'] - kwargs['y2'] = kwargs['y1'] + kwargs['height'] - del kwargs['height'] - getattr(canvas, self.callable)(**kwargs) - - -class ICircle(IShape): - """Draws a circle on the canvas.""" - - radius = attr.Measurement( - title=u'Radius', - description=u'The radius of the circle.', - required=True) - -class Circle(CanvasRMLDirective): - signature = ICircle - callable = 'circle' - attrMapping = {'x': 'x_cen', 'y': 'y_cen', 'radius': 'r'} - - -class IRectangle(IShape): - """Draws an ellipse on the canvas.""" - - width = attr.Measurement( - title=u'Width', - description=u'The width of the rectangle.', - required=True) - - height = attr.Measurement( - title=u'Height', - description=u'The height of the rectangle.', - required=True) - - round = attr.Measurement( - title=u'Corner Radius', - description=u'The radius of the rounded corners.', - required=False) - - href = attr.Text( - title=u'Link URL', - description=u'When specified, the rectangle becomes a link to that URL.', - required=False) - - destination = attr.Text( - title=u'Link Destination', - description=(u'When specified, the rectangle becomes a link to that ' - u'destination.'), - required=False) - -class Rectangle(CanvasRMLDirective): - signature = IRectangle - callable = 'rect' - attrMapping = {'round': 'radius'} - - def process(self): - if 'round' in self.element.keys(): - self.callable = 'roundRect' - kwargs = dict(self.getAttributeValues(attrMapping=self.attrMapping)) - canvas = attr.getManager(self, interfaces.ICanvasManager).canvas - # Create a link - url = kwargs.pop('href', None) - if url: - canvas.linkURL( - url, - (kwargs['x'], kwargs['y'], - kwargs['x']+kwargs['width'], kwargs['y']+kwargs['height'])) - dest = kwargs.pop('destination', None) - if dest: - canvas.linkRect( - '', dest, - (kwargs['x'], kwargs['y'], - kwargs['x']+kwargs['width'], kwargs['y']+kwargs['height'])) - - # Render the rectangle - getattr(canvas, self.callable)(**kwargs) - -class IGrid(interfaces.IRMLDirectiveSignature): - """A shape to be drawn on the canvas.""" - - xs = attr.Sequence( - title=u'X-Coordinates', - description=(u'A sequence x-coordinates that represent the vertical ' - u'line positions.'), - value_type=attr.Measurement(), - required=True) - - ys = attr.Sequence( - title=u'Y-Coordinates', - description=(u'A sequence y-coordinates that represent the horizontal ' - u'line positions.'), - value_type=attr.Measurement(), - required=True) - - -class Grid(CanvasRMLDirective): - signature = IGrid - callable = 'grid' - attrMapping = {'xs': 'xlist', 'ys': 'ylist'} - - -class ILines(interfaces.IRMLDirectiveSignature): - """A path of connected lines drawn on the canvas.""" - - linelist = attr.TextNodeGrid( - title=u'Line List', - description=(u'A list of lines coordinates to draw.'), - value_type=attr.Measurement(), - columns=4, - required=True) - -class Lines(CanvasRMLDirective): - signature = ILines - callable = 'lines' - - -class ICurves(interfaces.IRMLDirectiveSignature): - """A path of connected bezier curves drawn on the canvas.""" - - curvelist = attr.TextNodeGrid( - title=u'Curve List', - description=(u'A list of curve coordinates to draw.'), - value_type=attr.Measurement(), - columns=8, - required=True) - -class Curves(CanvasRMLDirective): - signature = ICurves - callable = 'bezier' - - def process(self): - argset = self.getAttributeValues(valuesOnly=True)[0] - canvas = attr.getManager(self, interfaces.ICanvasManager).canvas - for args in argset: - getattr(canvas, self.callable)(*args) - - -class IImage(interfaces.IRMLDirectiveSignature): - """Draws an external image on the canvas.""" - - file = attr.Image( - title=u'File', - description=(u'Reference to the external file of the iamge.'), - required=True) - - x = attr.Measurement( - title=u'X-Coordinate', - description=(u'The X-coordinate of the lower-left position of the ' - u'shape.'), - required=True) - - y = attr.Measurement( - title=u'Y-Coordinate', - description=(u'The Y-coordinate of the lower-left position of the ' - u'shape.'), - required=True) - - width = attr.Measurement( - title=u'Width', - description=u'The width of the image.', - required=False) - - height = attr.Measurement( - title=u'Height', - description=u'The height of the image.', - required=False) - - showBoundary = attr.Boolean( - title=u'Show Boundary', - description=(u'A flag determining whether a border should be drawn ' - u'around the image.'), - default=False, - required=False) - - preserveAspectRatio = attr.Boolean( - title=u'Preserve Aspect Ratio', - description=(u"A flag determining whether the image's aspect ration " - u"should be conserved under any circumstances."), - default=False, - required=False) - -class Image(CanvasRMLDirective): - signature = IImage - callable = 'drawImage' - attrMapping = {'file': 'image'} - - def process(self): - kwargs = dict(self.getAttributeValues(attrMapping=self.attrMapping)) - preserve = kwargs.pop('preserveAspectRatio') - show = kwargs.pop('showBoundary') - - if preserve: - imgX, imgY = kwargs['image'].getSize() - - # Scale image correctly, if width and/or height were specified - if 'width' in kwargs and 'height' not in kwargs: - kwargs['height'] = imgY * kwargs['width'] / imgX - elif 'height' in kwargs and 'width' not in kwargs: - kwargs['width'] = imgX * kwargs['height'] / imgY - elif 'width' in kwargs and 'height' in kwargs: - if float(kwargs['width'])/kwargs['height'] > float(imgX)/imgY: - kwargs['width'] = imgX * kwargs['height'] / imgY - else: - kwargs['height'] = imgY * kwargs['width'] / imgX - - canvas = attr.getManager(self, interfaces.ICanvasManager).canvas - getattr(canvas, self.callable)(**kwargs) - - if show: - width = kwargs.get('width', kwargs['image'].getSize()[0]) - height = kwargs.get('height', kwargs['image'].getSize()[1]) - canvas.rect(kwargs['x'], kwargs['y'], width, height) - - -class IPlace(interfaces.IRMLDirectiveSignature): - """Draws a set of flowables on the canvas within a given region.""" - - x = attr.Measurement( - title=u'X-Coordinate', - description=(u'The X-coordinate of the lower-left position of the ' - u'place.'), - required=True) - - y = attr.Measurement( - title=u'Y-Coordinate', - description=(u'The Y-coordinate of the lower-left position of the ' - u'place.'), - required=True) - - width = attr.Measurement( - title=u'Width', - description=u'The width of the place.', - required=False) - - height = attr.Measurement( - title=u'Height', - description=u'The height of the place.', - required=False) - -class Place(CanvasRMLDirective): - signature = IPlace - - def process(self): - x, y, width, height = self.getAttributeValues( - select=('x', 'y', 'width', 'height'), valuesOnly=True) - y += height - - flows = flowable.Flow(self.element, self.parent) - flows.process() - - canvas = attr.getManager(self, interfaces.ICanvasManager).canvas - for flow in flows.flow: - flowWidth, flowHeight = flow.wrap(width, height) - if flowWidth <= width and flowHeight <= height: - y -= flowHeight - flow.drawOn(canvas, x, y) - height -= flowHeight - else: - raise ValueError("Not enough space") - - -class IParam(interfaces.IRMLDirectiveSignature): - """Sets one paramter for the text annotation.""" - - name = attr.String( - title=u'Name', - description=u'The name of the paramter.', - required=True) - - value = attr.TextNode( - title=u'Value', - description=(u'The parameter value.'), - required=True) - -class Param(directive.RMLDirective): - signature = IParam - - def process(self): - args = dict(self.getAttributeValues()) - self.parent.params[args['name']] = args['value'] - - -class ITextAnnotation(interfaces.IRMLDirectiveSignature): - """Writes a low-level text annotation into the PDF.""" - occurence.containing( - occurence.ZeroOrMore('param', IParam)) - - contents = attr.FirstLevelTextNode( - title=u'Contents', - description=u'The PDF commands that are inserted as annotation.', - required=True) - -class TextAnnotation(CanvasRMLDirective): - signature = ITextAnnotation - factories = {'param': Param} - - paramTypes = {'escape': attr.Integer()} - - def process(self): - contents = self.getAttributeValues(valuesOnly=True)[0] - self.params = {} - self.processSubDirectives() - for name, type in self.paramTypes.items(): - if name in self.params: - bound = type.bind(self) - self.params[name] = bound.fromUnicode(self.params[name]) - canvas = attr.getManager(self, interfaces.ICanvasManager).canvas - canvas.textAnnotation(contents, **self.params) - - -class IMoveTo(interfaces.IRMLDirectiveSignature): - """Move the path cursor to the specified location.""" - - position = attr.TextNodeSequence( - title=u'Position', - description=u'Position to which the path pointer is moved to.', - value_type=attr.Measurement(), - min_length=2, - max_length=2, - required=True) - -class MoveTo(directive.RMLDirective): - signature = IMoveTo - - def process(self): - args = self.getAttributeValues(valuesOnly=True) - self.parent.path.moveTo(*args[0]) - - -class ICurveTo(interfaces.IRMLDirectiveSignature): - """Create a bezier curve from the current location to the specified one.""" - - curvelist = attr.TextNodeGrid( - title=u'Curve Specification', - description=u'Describes the end position and the curve properties.', - value_type=attr.Measurement(), - columns=6, - required=True) - -class CurveTo(directive.RMLDirective): - signature = ICurveTo - - def process(self): - argset = self.getAttributeValues(valuesOnly=True)[0] - for args in argset: - self.parent.path.curveTo(*args) - -class ICurvesTo(ICurveTo): - pass -directive.DeprecatedDirective( - ICurvesTo, - 'Available for ReportLab RML compatibility. Please use the "curveto" ' - 'directive instead.') - - -class IPath(IShape): - """Create a line path.""" - occurence.containing( - occurence.ZeroOrMore('moveto', IMoveTo), - occurence.ZeroOrMore('curveto', ICurveTo), - occurence.ZeroOrMore('curvesto', ICurvesTo), - ) - - points = attr.TextNodeGrid( - title=u'Points', - description=(u'A list of coordinate points that define th path.'), - value_type=attr.Measurement(), - columns=2, - required=True) - - close = attr.Boolean( - title=u'Close Path', - description=(u"A flag specifying whether the path should be closed."), - default=False, - required=False) - - clip = attr.Boolean( - title=u'Clip Path', - description=(u"A flag specifying whether the path should clip " - u"overlapping elements."), - default=False, - required=False) - -class Path(CanvasRMLDirective): - signature = IPath - factories = { - 'moveto': MoveTo, - 'curveto': CurveTo, - 'curvesto': CurveTo - } - - def processPoints(self, text): - if text.strip() == '': - return - bound = self.signature['points'].bind(self) - for coords in bound.fromUnicode(text): - self.path.lineTo(*coords) - - def process(self): - kwargs = dict(self.getAttributeValues(ignore=('points',))) - - # Start the path and set the cursor to the start location. - canvas = attr.getManager(self, interfaces.ICanvasManager).canvas - self.path = canvas.beginPath() - self.path.moveTo(kwargs.pop('x'), kwargs.pop('y')) - - # Process the text before the first sub-directive. - if self.element.text is not None: - self.processPoints(self.element.text) - # Handle each sub-directive. - for directive in self.element.getchildren(): - if directive.tag in self.factories: - self.factories[directive.tag](directive, self).process() - # If there is more text after sub-directive, process it. - if directive.tail is not None: - self.processPoints(directive.tail) - - if kwargs.pop('close', False): - self.path.close() - - if kwargs.pop('clip', False): - canvas.clipPath(self.path, **kwargs) - else: - canvas.drawPath(self.path, **kwargs) - - -class IFill(interfaces.IRMLDirectiveSignature): - """Set the fill color.""" - - color = attr.Color( - title=u'Color', - description=(u'The color value to be set.'), - required=True) - -class Fill(CanvasRMLDirective): - signature = IFill - callable = 'setFillColor' - attrMapping = {'color': 'aColor'} - - -class IStroke(interfaces.IRMLDirectiveSignature): - """Set the stroke/line color.""" - - color = attr.Color( - title=u'Color', - description=(u'The color value to be set.'), - required=True) - -class Stroke(CanvasRMLDirective): - signature = IStroke - callable = 'setStrokeColor' - attrMapping = {'color': 'aColor'} - - -class ISetFont(interfaces.IRMLDirectiveSignature): - """Set the font name and/or size.""" - - name = attr.String( - title=u'Font Name', - description=(u'The name of the font as it was registered.'), - required=True) - - size = attr.Measurement( - title=u'Size', - description=(u'The font size.'), - required=True) - - leading = attr.Measurement( - title=u'Leading', - description=(u'The font leading.'), - required=False) - -class SetFont(CanvasRMLDirective): - signature = ISetFont - callable = 'setFont' - attrMapping = {'name': 'psfontname'} - - -class ISetFontSize(interfaces.IRMLDirectiveSignature): - """Set the font size.""" - - size = attr.Measurement( - title=u'Size', - description=(u'The font size.'), - required=True) - - leading = attr.Measurement( - title=u'Leading', - description=(u'The font leading.'), - required=False) - -class SetFontSize(CanvasRMLDirective): - signature = ISetFontSize - callable = 'setFontSize' - - -class IScale(interfaces.IRMLDirectiveSignature): - """Scale the drawing using x and y scaling factors.""" - - sx = attr.Float( - title=u'X-Scaling-Factor', - description=(u'The scaling factor applied on x-coordinates.'), - default=1, - required=False) - - sy = attr.Float( - title=u'Y-Scaling-Factor', - description=(u'The scaling factor applied on y-coordinates.'), - default=1, - required=False) - -class Scale(CanvasRMLDirective): - signature = IScale - callable = 'scale' - attrMapping = {'sx': 'x', 'sy': 'y'} - - -class ITranslate(interfaces.IRMLDirectiveSignature): - """Translate the drawing coordinates by the specified x and y offset.""" - - dx = attr.Measurement( - title=u'X-Offset', - description=(u'The amount to move the drawing to the right.'), - required=True) - - dy = attr.Measurement( - title=u'Y-Offset', - description=(u'The amount to move the drawing upward.'), - required=True) - -class Translate(CanvasRMLDirective): - signature = ITranslate - callable = 'translate' - - -class IRotate(interfaces.IRMLDirectiveSignature): - """Rotate the drawing counterclockwise.""" - - degrees = attr.Measurement( - title=u'Angle', - description=(u'The angle in degrees.'), - required=True) - -class Rotate(CanvasRMLDirective): - signature = IRotate - callable = 'rotate' - attrMapping = {'degrees': 'theta'} - - -class ISkew(interfaces.IRMLDirectiveSignature): - """Skew the drawing.""" - - alpha = attr.Measurement( - title=u'Alpha', - description=(u'The amount to skew the drawing in the horizontal.'), - required=True) - - beta = attr.Measurement( - title=u'Beta', - description=(u'The amount to skew the drawing in the vertical.'), - required=True) - -class Skew(CanvasRMLDirective): - signature = ISkew - callable = 'skew' - - -class ITransform(interfaces.IRMLDirectiveSignature): - """A full 2-D matrix transformation""" - - matrix = attr.TextNodeSequence( - title=u'Matrix', - description=u'The transformation matrix.', - value_type=attr.Float(), - min_length=6, - max_length=6, - required=True) - -class Transform(CanvasRMLDirective): - signature = ITransform - - def process(self): - args = self.getAttributeValues(valuesOnly=True) - canvas = attr.getManager(self, interfaces.ICanvasManager).canvas - canvas.transform(*args[0]) - - -class ILineMode(interfaces.IRMLDirectiveSignature): - """Set the line mode for the following graphics elements.""" - - width = attr.Measurement( - title=u'Width', - description=(u'The line width.'), - required=False) - - dash = attr.Sequence( - title=u'Dash-Pattern', - description=(u'The dash-pattern of a line.'), - value_type=attr.Measurement(), - required=False) - - miterLimit = attr.Measurement( - title=u'Miter Limit', - description=(u'The ???.'), - required=False) - - join = attr.Choice( - title=u'Join', - description=u'The way lines are joined together.', - choices=interfaces.JOIN_CHOICES, - required=False) - - cap = attr.Choice( - title=u'Cap', - description=u'The cap is the desciption of how the line-endings look.', - choices=interfaces.CAP_CHOICES, - required=False) - -class LineMode(CanvasRMLDirective): - signature = ILineMode - - def process(self): - kw = dict(self.getAttributeValues()) - canvas = attr.getManager(self, interfaces.ICanvasManager).canvas - if 'width' in kw: - canvas.setLineWidth(kw['width']) - if 'join' in kw: - canvas.setLineJoin(kw['join']) - if 'cap' in kw: - canvas.setLineCap(kw['cap']) - if 'miterLimit' in kw: - canvas.setMiterLimit(kw['miterLimit']) - if 'dash' in kw: - canvas.setDash(kw['dash']) - - -class IBookmark(interfaces.IRMLDirectiveSignature): - """ - This creates a bookmark to the current page which can be referred to with - the given key elsewhere. (Used inside a page drawing.) - """ - - name = attr.Text( - title=u'Name', - description=u'The name of the bookmark.', - required=True) - - fit = attr.Choice( - title=u'Fit', - description=u'The Fit Type.', - choices=('XYZ', 'Fit', 'FitH', 'FitV', 'FitR'), - required=False) - - zoom = attr.Float( - title=u'Zoom', - description=u'The zoom level when clicking on the bookmark.', - required=False) - - x = attr.Measurement( - title=u'X-Position', - description=u'The x-position.', - required=False) - - y = attr.Measurement( - title=u'Y-Position', - description=u'The y-position.', - required=False) - -class Bookmark(CanvasRMLDirective): - signature = IBookmark - - def process(self): - args = dict(self.getAttributeValues()) - canvas = attr.getManager(self, interfaces.ICanvasManager).canvas - args['left'], args['top'] = canvas.absolutePosition(args['x'], args['y']) - canvas.bookmarkPage(**args) - - -class IPlugInGraphic(interfaces.IRMLDirectiveSignature): - """Inserts a custom graphic developed in Python.""" - - module = attr.String( - title=u'Module', - description=u'The Python module in which the flowable is located.', - required=True) - - function = attr.String( - title=u'Function', - description=(u'The name of the factory function within the module ' - u'that returns the custom flowable.'), - required=True) - - params = attr.TextNode( - title=u'Parameters', - description=(u'A list of parameters encoded as a long string.'), - required=False) - -class PlugInGraphic(CanvasRMLDirective): - signature = IPlugInGraphic - - def process(self): - modulePath, functionName, params = self.getAttributeValues( - valuesOnly=True) - module = __import__(modulePath, {}, {}, [modulePath]) - function = getattr(module, functionName) - canvas = attr.getManager(self, interfaces.ICanvasManager).canvas - function(canvas, params) - - -class IDrawing(interfaces.IRMLDirectiveSignature): - """A container directive for all directives that draw directly on the - cnavas.""" - occurence.containing( - # State Manipulation - occurence.ZeroOrMore('saveState', ISaveState), - occurence.ZeroOrMore('restoreState', IRestoreState), - # String Drawing - occurence.ZeroOrMore('drawString', IDrawString), - occurence.ZeroOrMore('drawRightString', IDrawRightString), - occurence.ZeroOrMore('drawCenteredString', IDrawCenteredString), - occurence.ZeroOrMore('drawCentredString', IDrawCenteredString), - occurence.ZeroOrMore('drawAlignedString', IDrawAlignedString), - # Drawing Operations - occurence.ZeroOrMore('ellipse', IEllipse), - occurence.ZeroOrMore('circle', ICircle), - occurence.ZeroOrMore('rect', IRectangle), - occurence.ZeroOrMore('grid', IGrid), - occurence.ZeroOrMore('lines', ILines), - occurence.ZeroOrMore('curves', ICurves), - occurence.ZeroOrMore('image', IImage), - occurence.ZeroOrMore('place', IPlace), - occurence.ZeroOrMore('textAnnotation', ITextAnnotation), - occurence.ZeroOrMore('path', IPath), - # State Change Operations - occurence.ZeroOrMore('fill', IFill), - occurence.ZeroOrMore('stroke', IStroke), - occurence.ZeroOrMore('setFont', ISetFont), - occurence.ZeroOrMore('setFontSize', ISetFontSize), - occurence.ZeroOrMore('scale', IScale), - occurence.ZeroOrMore('translate', ITranslate), - occurence.ZeroOrMore('rotate', IRotate), - occurence.ZeroOrMore('skew', ISkew), - occurence.ZeroOrMore('transform', ITransform), - occurence.ZeroOrMore('lineMode', ILineMode), - # Form Field Elements - occurence.ZeroOrMore('barCode', form.IBarCode), - occurence.ZeroOrMore('textField', form.ITextField), - occurence.ZeroOrMore('buttonField', form.IButtonField), - occurence.ZeroOrMore('selectField', form.ISelectField), - # Charts - occurence.ZeroOrMore('barChart', chart.IBarChart), - occurence.ZeroOrMore('barChart3D', chart.IBarChart3D), - occurence.ZeroOrMore('linePlot', chart.ILinePlot), - occurence.ZeroOrMore('linePlot3D', chart.ILinePlot3D), - occurence.ZeroOrMore('pieChart', chart.IPieChart), - occurence.ZeroOrMore('pieChart3D', chart.IPieChart3D), - occurence.ZeroOrMore('spiderChart', chart.ISpiderChart), - # Misc - occurence.ZeroOrMore('bookmark', IBookmark), - occurence.ZeroOrMore('plugInGraphic', IPlugInGraphic), - ) - -class Drawing(directive.RMLDirective): - signature = IDrawing - - factories = { - # State Management - 'saveState': SaveState, - 'restoreState': RestoreState, - # Drawing Strings - 'drawString': DrawString, - 'drawRightString': DrawRightString, - 'drawCenteredString': DrawCenteredString, - 'drawCentredString': DrawCenteredString, - 'drawAlignedString': DrawAlignedString, - # Drawing Operations - 'ellipse': Ellipse, - 'circle': Circle, - 'rect': Rectangle, - 'grid': Grid, - 'lines': Lines, - 'curves': Curves, - 'image': Image, - 'place': Place, - 'textAnnotation': TextAnnotation, - 'path': Path, - # Form Field Elements - 'barCode': form.BarCode, - 'textField': form.TextField, - 'buttonField': form.ButtonField, - 'selectField': form.SelectField, - # State Change Operations - 'fill': Fill, - 'stroke': Stroke, - 'setFont': SetFont, - 'setFontSize': SetFontSize, - 'scale': Scale, - 'translate': Translate, - 'rotate': Rotate, - 'skew': Skew, - 'transform': Transform, - 'lineMode': LineMode, - # Charts - 'barChart': chart.BarChart, - 'barChart3D': chart.BarChart3D, - 'linePlot': chart.LinePlot, - 'linePlot3D': chart.LinePlot3D, - 'pieChart': chart.PieChart, - 'pieChart3D': chart.PieChart3D, - 'spiderChart': chart.SpiderChart, - # Misc - 'bookmark': Bookmark, - 'plugInGraphic': PlugInGraphic, - } - - -class IPageDrawing(IDrawing): - """Draws directly on the content of one page's canvas. Every call of this - directive creates a new page.""" - - occurence.containing( - #'mergePage': IMergePage, - *IDrawing.getTaggedValue('directives')) - -class PageDrawing(Drawing): - signature = IDrawing - - factories = Drawing.factories.copy() - factories.update({ - 'mergePage': page.MergePage - }) - - def process(self): - super(Drawing, self).process() - canvas = attr.getManager(self, interfaces.ICanvasManager).canvas - canvas.showPage() - - -class IPageInfo(interfaces.IRMLDirectiveSignature): - """Set's up page-global settings.""" - - pageSize = attr.PageSize( - title=u'Page Size', - description=(u'The page size of all pages within this document.'), - required=True) - -class PageInfo(CanvasRMLDirective): - signature=IPageInfo - callable = 'setPageSize' - attrMapping = {'pageSize': 'size'} diff --git a/z3c/rml/chart.py b/z3c/rml/chart.py deleted file mode 100644 index f0f93c61..00000000 --- a/z3c/rml/chart.py +++ /dev/null @@ -1,1662 +0,0 @@ -############################################################################## -# -# Copyright (c) 2007 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Chart Element Processing -""" -import reportlab.lib.formatters -from reportlab.graphics import shapes -from reportlab.graphics.charts import barcharts, lineplots, piecharts -from reportlab.graphics.charts import spider, doughnut -from z3c.rml import attr, directive, interfaces, occurence - -# Patches against Reportlab 2.0 -lineplots.Formatter = reportlab.lib.formatters.Formatter - - -class PropertyItem(directive.RMLDirective): - - def process(self): - attrs = dict(self.getAttributeValues()) - self.parent.dataList.append(attrs) - - -class PropertyCollection(directive.RMLDirective): - propertyName = None - - def processAttributes(self): - prop = getattr(self.parent.context, self.propertyName) - # Get global properties - for name, value in self.getAttributeValues(): - setattr(prop, name, value) - - def process(self): - self.processAttributes() - # Get item specific properties - prop = getattr(self.parent.context, self.propertyName) - self.dataList = [] - self.processSubDirectives() - for index, data in enumerate(self.dataList): - for name, value in data.items(): - setattr(prop[index], name, value) - - -class IText(interfaces.IRMLDirectiveSignature): - """Draw a text on the chart.""" - - x = attr.Measurement( - title=u'X-Coordinate', - description=(u'The X-coordinate of the lower-left position of the ' - u'text.'), - required=True) - - y = attr.Measurement( - title=u'Y-Coordinate', - description=(u'The Y-coordinate of the lower-left position of the ' - u'text.'), - required=True) - - angle = attr.Float( - title=u'Rotation Angle', - description=(u'The angle about which the text will be rotated.'), - required=False) - - text = attr.TextNode( - title=u'Text', - description=u'The text to be printed.', - required=True) - - fontName = attr.String( - title=u'Font Name', - description=u'The name of the font.', - required=False) - - fontSize = attr.Measurement( - title=u'Font Size', - description=u'The font size for the text.', - required=False) - - fillColor = attr.Color( - title=u'Fill Color', - description=u'The color in which the text will appear.', - required=False) - - textAnchor = attr.Choice( - title=u'Text Anchor', - description=u'The position in the text to which the coordinates refer.', - choices=('start', 'middle', 'end', 'boxauto'), - required=False) - - -class Text(directive.RMLDirective): - signature = IText - - def process(self): - attrs = dict(self.getAttributeValues()) - string = shapes.String( - attrs.pop('x'), attrs.pop('y'), attrs.pop('text')) - angle = attrs.pop('angle', 0) - for name, value in attrs.items(): - setattr(string, name, value) - group = shapes.Group(string) - group.translate(0,0) - group.rotate(angle) - self.parent.parent.drawing.add(group) - - -class ITexts(interfaces.IRMLDirectiveSignature): - """A set of texts drawn on the chart.""" - occurence.containing( - occurence.ZeroOrMore('text', IText) - ) - -class Texts(directive.RMLDirective): - signature = ITexts - factories = {'text': Text} - - -class Series(directive.RMLDirective): - - def process(self): - attrs = self.getAttributeValues(valuesOnly=True) - self.parent.data.append(attrs[0]) - - -class Data(directive.RMLDirective): - series = None - - def process(self): - self.data = [] - self.factories = {'series': self.series} - self.processSubDirectives() - self.parent.context.data = self.data - - -class ISeries1D(interfaces.IRMLDirectiveSignature): - """A one-dimensional series.""" - - values = attr.TextNodeSequence( - title=u'Values', - description=u"Numerical values representing the series' data.", - value_type=attr.Float(), - required=True) - -class Series1D(Series): - signature = ISeries1D - - -class IData1D(interfaces.IRMLDirectiveSignature): - """A 1-D data set.""" - occurence.containing( - occurence.OneOrMore('series', ISeries1D) - ) - -class Data1D(Data): - signature = IData1D - series = Series1D - - -class ISingleData1D(interfaces.IRMLDirectiveSignature): - """A 1-D data set.""" - occurence.containing( - occurence.One('series', ISeries1D) - ) - -class SingleData1D(Data1D): - signature = ISingleData1D - - def process(self): - self.data = [] - self.factories = {'series': self.series} - self.processSubDirectives() - self.parent.context.data = self.data[0] - - -class ISeries2D(interfaces.IRMLDirectiveSignature): - """A two-dimensional series.""" - - values = attr.TextNodeGrid( - title=u'Values', - description=u"Numerical values representing the series' data.", - value_type=attr.Float(), - columns=2, - required=True) - -class Series2D(Series): - signature = ISeries2D - - -class IData2D(interfaces.IRMLDirectiveSignature): - """A 2-D data set.""" - occurence.containing( - occurence.OneOrMore('series', ISeries2D) - ) - -class Data2D(Data): - signature = IData2D - series = Series2D - - -class IBar(interfaces.IRMLDirectiveSignature): - """Define the look of a bar.""" - - strokeColor = attr.Color( - title=u'Stroke Color', - description=u'The color in which the bar border is drawn.', - required=False) - - strokeWidth = attr.Measurement( - title=u'Stroke Width', - description=u'The width of the bar border line.', - required=False) - - fillColor = attr.Color( - title=u'Fill Color', - description=u'The color with which the bar is filled.', - required=False) - -class Bar(PropertyItem): - signature = IBar - -class IBars(IBar): - """Collection of bar subscriptions.""" - occurence.containing( - occurence.ZeroOrMore('bar', IBar) - ) - -class Bars(PropertyCollection): - signature = IBars - propertyName = 'bars' - factories = {'bar': Bar} - - -class ILabelBase(interfaces.IRMLDirectiveSignature): - - dx = attr.Measurement( - title=u'Horizontal Extension', - description=(u'The width of the label.'), - required=False) - - dy = attr.Measurement( - title=u'Vertical Extension', - description=(u'The height of the label.'), - required=False) - - angle = attr.Float( - title=u'Angle', - description=(u'The angle to rotate the label.'), - required=False) - - boxAnchor = attr.Choice( - title=u'Box Anchor', - description=(u'The position relative to the label.'), - choices=('nw','n','ne','w','c','e','sw','s','se', 'autox', 'autoy'), - required=False) - - boxStrokeColor = attr.Color( - title=u'Box Stroke Color', - description=(u'The color of the box border line.'), - required=False) - - boxStrokeWidth = attr.Measurement( - title=u'Box Stroke Width', - description=u'The width of the box border line.', - required=False) - - boxFillColor = attr.Color( - title=u'Box Fill Color', - description=(u'The color in which the box is filled.'), - required=False) - - boxTarget = attr.Text( - title=u'Box Target', - description=u'The box target.', - required=False) - - fillColor = attr.Color( - title=u'Fill Color', - description=(u'The color in which the label is filled.'), - required=False) - - strokeColor = attr.Color( - title=u'Stroke Color', - description=(u'The color of the label.'), - required=False) - - strokeWidth = attr.Measurement( - title=u'Stroke Width', - description=u'The width of the label line.', - required=False) - - fontName = attr.String( - title=u'Font Name', - description=u'The font used to print the value.', - required=False) - - fontSize = attr.Measurement( - title=u'Font Size', - description=u'The size of the value text.', - required=False) - - leading = attr.Measurement( - title=u'Leading', - description=(u'The height of a single text line. It includes ' - u'character height.'), - required=False) - - width = attr.Measurement( - title=u'Width', - description=u'The width the label.', - required=False) - - maxWidth = attr.Measurement( - title=u'Maximum Width', - description=u'The maximum width the label.', - required=False) - - height = attr.Measurement( - title=u'Height', - description=u'The height the label.', - required=False) - - textAnchor = attr.Choice( - title=u'Text Anchor', - description=u'The position in the text to which the coordinates refer.', - choices=('start', 'middle', 'end', 'boxauto'), - required=False) - - visible = attr.Boolean( - title=u'Visible', - description=u'A flag making the label text visible.', - required=False) - - leftPadding = attr.Measurement( - title=u'Left Padding', - description=u'The size of the padding on the left side.', - required=False) - - rightPadding = attr.Measurement( - title=u'Right Padding', - description=u'The size of the padding on the right side.', - required=False) - - topPadding = attr.Measurement( - title=u'Top Padding', - description=u'The size of the padding on the top.', - required=False) - - bottomPadding = attr.Measurement( - title=u'Bottom Padding', - description=u'The size of the padding on the bottom.', - required=False) - - -class IPositionLabelBase(ILabelBase): - - x = attr.Measurement( - title=u'X-Coordinate', - description=(u'The X-coordinate of the lower-left position of the ' - u'label.'), - required=False) - - y = attr.Measurement( - title=u'Y-Coordinate', - description=(u'The Y-coordinate of the lower-left position of the ' - u'label.'), - required=False) - - -class ILabel(IPositionLabelBase): - """A label for the chart on an axis.""" - - text = attr.TextNode( - title=u'Text', - description=u'The label text to be displayed.', - required=True) - -class Label(PropertyItem): - signature = ILabel - -class IBarLabels(ILabelBase): - """A set of labels for a bar chart""" - occurence.containing( - occurence.ZeroOrMore('label', ILabel) - ) - -class BarLabels(PropertyCollection): - signature = IBarLabels - propertyName = 'barLabels' - factories = {'label': Label} - name = 'barLabels' - -class ILabels(IPositionLabelBase): - """A set of labels of an axis.""" - occurence.containing( - occurence.ZeroOrMore('label', ILabel) - ) - -class Labels(PropertyCollection): - signature = ILabels - propertyName = 'labels' - factories = {'label': Label} - - -class IAxis(interfaces.IRMLDirectiveSignature): - occurence.containing( - occurence.ZeroOrMore('labels', ILabels) - ) - - visible = attr.Boolean( - title=u'Visible', - description=u'When true, draw the entire axis with all details.', - required=False) - - visibleAxis = attr.Boolean( - title=u'Visible Axis', - description=u'When true, draw the axis line.', - required=False) - - visibleTicks = attr.Boolean( - title=u'Visible Ticks', - description=u'When true, draw the axis ticks on the line.', - required=False) - - visibleLabels = attr.Boolean( - title=u'Visible Labels', - description=u'When true, draw the axis labels.', - required=False) - - visibleGrid = attr.Boolean( - title=u'Visible Grid', - description=u'When true, draw the grid lines for the axis.', - required=False) - - strokeWidth = attr.Measurement( - title=u'Stroke Width', - description=u'The width of axis line and ticks.', - required=False) - - strokeColor = attr.Color( - title=u'Stroke Color', - description=u'The color in which the axis line and ticks are drawn.', - required=False) - - strokeDashArray = attr.Sequence( - title=u'Stroke Dash Array', - description=u'The dash array that is used for the axis line and ticks.', - value_type=attr.Float(), - required=False) - - gridStrokeWidth = attr.Measurement( - title=u'Grid Stroke Width', - description=u'The width of the grid lines.', - required=False) - - gridStrokeColor = attr.Color( - title=u'Grid Stroke Color', - description=u'The color in which the grid lines are drawn.', - required=False) - - gridStrokeDashArray = attr.Sequence( - title=u'Grid Stroke Dash Array', - description=u'The dash array that is used for the grid lines.', - value_type=attr.Float(), - required=False) - - gridStart = attr.Measurement( - title=u'Grid Start', - description=(u'The start of the grid lines with respect to the ' - u'axis origin.'), - required=False) - - gridEnd = attr.Measurement( - title=u'Grid End', - description=(u'The end of the grid lines with respect to the ' - u'axis origin.'), - required=False) - - style = attr.Choice( - title=u'Style', - description=u'The plot style of the common categories.', - choices=('parallel', 'stacked', 'parallel_3d'), - required=False) - - -class Axis(directive.RMLDirective): - signature = IAxis - name = '' - factories = {'labels': Labels} - - def process(self): - self.context = axis = getattr(self.parent.context, self.name) - for name, value in self.getAttributeValues(): - setattr(axis, name, value) - self.processSubDirectives() - - -class IName(interfaces.IRMLDirectiveSignature): - """A category name""" - text = attr.TextNode( - title=u'Text', - description=u'The text value that is the name.', - required=True) - -class Name(directive.RMLDirective): - signature = IName - - def process(self): - text = self.getAttributeValues(valuesOnly=True)[0] - self.parent.names.append(text) - - -class ICategoryNames(interfaces.IRMLDirectiveSignature): - """A list of category names.""" - occurence.containing( - occurence.OneOrMore('name', IName), - ) - -class CategoryNames(directive.RMLDirective): - signature = ICategoryNames - factories = {'name': Name} - - def process(self): - self.names = [] - self.processSubDirectives() - self.parent.context.categoryNames = self.names - - -class ICategoryAxis(IAxis): - """An axis displaying categories (instead of numerical values).""" - occurence.containing( - occurence.ZeroOrOne('categoryNames', ICategoryNames), - *IAxis.queryTaggedValue('directives', ()) - ) - - categoryNames = attr.Sequence( - title=u'Category Names', - description=u'A simple list of category names.', - value_type=attr.Text(), - required=False) - - joinAxis = attr.Boolean( - title=u'Join Axis', - description=u'When true, both axes join together.', - required=False) - - joinAxisPos = attr.Measurement( - title=u'Join Axis Position', - description=u'The position at which the axes should join together.', - required=False) - - reverseDirection = attr.Boolean( - title=u'Reverse Direction', - description=u'A flag to reverse the direction of category names.', - required=False) - - labelAxisMode = attr.Choice( - title=u'Label Axis Mode', - description=u'Defines the relative position of the axis labels.', - choices=('high', 'low', 'axis'), - required=False) - - tickShift = attr.Boolean( - title=u'Tick Shift', - description=(u'When true, place the ticks in the center of a ' - u'category instead the beginning and end.'), - required=False) - -class CategoryAxis(Axis): - signature = ICategoryAxis - name = 'categoryAxis' - factories = Axis.factories.copy() - factories.update({ - 'categoryNames': CategoryNames, - }) - - -class IXCategoryAxis(ICategoryAxis): - """X-Category Axis""" - - tickUp = attr.Measurement( - title=u'Tick Up', - description=u'Length of tick above the axis line.', - required=False) - - tickDown = attr.Measurement( - title=u'Tick Down', - description=u'Length of tick below the axis line.', - required=False) - - joinAxisMode = attr.Choice( - title=u'Join Axis Mode', - description=u'Mode for connecting axes.', - choices=('bottom', 'top', 'value', 'points', 'None'), - required=False) - -class XCategoryAxis(CategoryAxis): - signature = IXCategoryAxis - - -class IYCategoryAxis(ICategoryAxis): - """Y-Category Axis""" - - tickLeft = attr.Measurement( - title=u'Tick Left', - description=u'Length of tick left to the axis line.', - required=False) - - tickRight = attr.Measurement( - title=u'Tick Right', - description=u'Length of tick right to the axis line.', - required=False) - - joinAxisMode = attr.Choice( - title=u'Join Axis Mode', - description=u'Mode for connecting axes.', - choices=('bottom', 'top', 'value', 'points', 'None'), - required=False) - -class YCategoryAxis(CategoryAxis): - signature = IYCategoryAxis - - -class IValueAxis(IAxis): - - forceZero = attr.Boolean( - title=u'Force Zero', - description=u'When set, the range will contain the origin.', - required=False) - - minimumTickSpacing = attr.Measurement( - title=u'Minimum Tick Spacing', - description=u'The minimum distance between ticks.', - required=False) - - maximumTicks = attr.Integer( - title=u'Maximum Ticks', - description=u'The maximum number of ticks to be shown.', - required=False) - - labelTextFormat = attr.String( - title=u'Label Text Format', - description=u'Formatting string for axis labels.', - required=False) - - labelTextPostFormat = attr.Text( - title=u'Label Text Post Format', - description=u'An additional formatting string.', - required=False) - - labelTextScale = attr.Float( - title=u'Label Text Scale', - description=u'The sclaing factor for the label tick values.', - required=False) - - valueMin = attr.Float( - title=u'Minimum Value', - description=u'The smallest value on the axis.', - required=False) - - valueMax = attr.Float( - title=u'Maximum Value', - description=u'The largest value on the axis.', - required=False) - - valueStep = attr.Float( - title=u'Value Step', - description=u'The step size between ticks', - required=False) - - valueSteps = attr.Sequence( - title=u'Step Sizes', - description=u'List of step sizes between ticks.', - value_type = attr.Float(), - required=False) - - rangeRound = attr.Choice( - title=u'Range Round', - description=u'Method to be used to round the range values.', - choices=('none', 'both', 'ceiling', 'floor'), - required=False) - - zrangePref = attr.Float( - title=u'Zero Range Preference', - description=u'Zero range axis limit preference.', - required=False) - -class ValueAxis(Axis): - signature = IValueAxis - name = 'valueAxis' - - -class IXValueAxis(IValueAxis): - """X-Value Axis""" - - tickUp = attr.Measurement( - title=u'Tick Up', - description=u'Length of tick above the axis line.', - required=False) - - tickDown = attr.Measurement( - title=u'Tick Down', - description=u'Length of tick below the axis line.', - required=False) - - joinAxis = attr.Boolean( - title=u'Join Axis', - description=u'Whether to join the axes.', - required=False) - - joinAxisMode = attr.Choice( - title=u'Join Axis Mode', - description=u'Mode for connecting axes.', - choices=('bottom', 'top', 'value', 'points', 'None'), - required=False) - - joinAxisPos = attr.Measurement( - title=u'Join Axis Position', - description=u'The position in the plot at which to join the axes.', - required=False) - -class XValueAxis(ValueAxis): - signature = IXValueAxis - -class LineXValueAxis(XValueAxis): - name = 'xValueAxis' - -class IYValueAxis(IValueAxis): - """Y-Value Axis""" - - tickLeft = attr.Measurement( - title=u'Tick Left', - description=u'Length of tick left to the axis line.', - required=False) - - tickRight = attr.Measurement( - title=u'Tick Right', - description=u'Length of tick right to the axis line.', - required=False) - - joinAxis = attr.Boolean( - title=u'Join Axis', - description=u'Whether to join the axes.', - required=False) - - joinAxisMode = attr.Choice( - title=u'Join Axis Mode', - description=u'Mode for connecting axes.', - choices=('bottom', 'top', 'value', 'points', 'None'), - required=False) - - joinAxisPos = attr.Measurement( - title=u'Join Axis Position', - description=u'The position in the plot at which to join the axes.', - required=False) - - -class YValueAxis(ValueAxis): - signature = IYValueAxis - -class LineYValueAxis(YValueAxis): - name = 'yValueAxis' - - -class ILineLabels(IPositionLabelBase): - """A set of labels of an axis.""" - occurence.containing( - occurence.ZeroOrMore('label', ILabel) - ) - -class LineLabels(PropertyCollection): - signature = ILineLabels - propertyName = 'lineLabels' - factories = {'label': Label} - - -class ILineBase(interfaces.IRMLDirectiveSignature): - - strokeWidth = attr.Measurement( - title=u'Stroke Width', - description=u'The width of the plot line.', - required=False) - - strokeColor = attr.Color( - title=u'Stroke Color', - description=u'The color of the plot line.', - required=False) - - strokeDashArray = attr.Sequence( - title=u'Stroke Dash Array', - description=u'The dash array of the plot line.', - value_type = attr.Float(), - required=False) - - symbol = attr.Symbol( - title=u'Symbol', - description=u'The symbol to be used for every data point in the plot.', - required=False) - -class ILine(ILineBase): - """A line description of a series of a line plot.""" - - name = attr.Text( - title=u'Name', - description=u'The name of the line.', - required=False) - -class Line(PropertyItem): - signature = ILine - -class ILines(ILineBase): - """The set of all line descriptions in the line plot.""" - occurence.containing( - occurence.OneOrMore('line', ILine), - ) - -class Lines(PropertyCollection): - signature = ILines - propertyName = 'lines' - factories = {'line': Line} - - -class ISliceLabel(ILabelBase): - """The label of a slice within a bar chart.""" - - text = attr.TextNode( - title=u'Text', - description=u'The label text to be displayed.', - required=True) - -class SliceLabel(Label): - signature = ISliceLabel - - def process(self): - for name, value in self.getAttributeValues(): - self.parent.context['label_'+name] = value - # Now we do not have simple labels anymore - self.parent.parent.parent.context.simpleLabels = False - - -class ISlicePointer(interfaces.IRMLDirectiveSignature): - """A pointer to a slice in a pie chart.""" - - strokeColor = attr.Color( - title=u'Stroke Color', - description=u'The color of the pointer line.', - required=False) - - strokeWidth = attr.Measurement( - title=u'Stroke Width', - description=u'The wodth of the pointer line.', - required=False) - - elbowLength = attr.Measurement( - title=u'Elbow Length', - description=u'The length of the final segment of the pointer.', - required=False) - - edgePad = attr.Measurement( - title=u'Edge Padding', - description=u'The padding between between the pointer label and box.', - required=False) - - piePad = attr.Measurement( - title=u'Pie Padding', - description=u'The padding between between the pointer label and chart.', - required=False) - -class SlicePointer(directive.RMLDirective): - signature = ISlicePointer - - def process(self): - for name, value in self.getAttributeValues(): - self.parent.context['label_pointer_'+name] = value - - -class ISliceBase(interfaces.IRMLDirectiveSignature): - - strokeWidth = attr.Measurement( - title=u'Stroke Width', - description=u'The wodth of the slice line.', - required=False) - - fillColor = attr.Color( - title=u'Fill Color', - description=u'The fill color of the slice.', - required=False) - - strokeColor = attr.Color( - title=u'Stroke Color', - description=u'The color of the pointer line.', - required=False) - - strokeDashArray = attr.Sequence( - title=u'Stroke Dash Array', - description=u'Teh dash array of the slice borderline.', - value_type=attr.Float(), - required=False) - - popout = attr.Measurement( - title=u'Popout', - description=u'The distance of how much the slice should be popped out.', - required=False) - - fontName = attr.String( - title=u'Font Name', - description=u'The font name of the label.', - required=False) - - fontSize = attr.Measurement( - title=u'Font Size', - description=u'The font size of the label.', - required=False) - - labelRadius = attr.Measurement( - title=u'Label Radius', - description=(u'The radius at which the label should be placed around ' - u'the pie.'), - required=False) - - -class ISlice(ISliceBase): - """A slice in a pie chart.""" - occurence.containing( - occurence.ZeroOrOne('label', ISliceLabel), - occurence.ZeroOrOne('pointer', ISlicePointer), - ) - - swatchMarker = attr.Symbol( - required=False) - -class Slice(directive.RMLDirective): - signature = ISlice - factories = { - 'label': SliceLabel, - 'pointer': SlicePointer} - - def process(self): - self.context = attrs = dict(self.getAttributeValues()) - self.processSubDirectives() - self.parent.context.append(attrs) - - -class ISlice3D(ISlice): - """A 3-D slice of a 3-D pie chart.""" - - fillColorShaded = attr.Color( - title=u'Fill Color Shade', - description=u'The shade used for the fill color.', - required=False) - -class Slice3D(Slice): - signature = ISlice3D - factories = {} - # Sigh, the 3-D Pie does not support advanced slice labels. :-( - # 'label': SliceLabel} - - -class ISlices(ISliceBase): - """The collection of all 2-D slice descriptions.""" - occurence.containing( - occurence.OneOrMore('slice', ISlice), - ) - -class Slices(directive.RMLDirective): - signature = ISlices - factories = {'slice': Slice} - - def process(self): - # Get global slice properties - for name, value in self.getAttributeValues(): - setattr(self.parent.context.slices, name, value) - # Get slice specific properties - self.context = slicesData = [] - self.processSubDirectives() - for index, sliceData in enumerate(slicesData): - for name, value in sliceData.items(): - setattr(self.parent.context.slices[index], name, value) - - -class ISlices3D(ISliceBase): - """The collection of all 3-D slice descriptions.""" - occurence.containing( - occurence.OneOrMore('slice', ISlice3D), - ) - - fillColorShaded = attr.Color( - required=False) - -class Slices3D(Slices): - signature = ISlices3D - factories = {'slice': Slice3D} - - -class ISimpleLabel(IName): - """A simple label""" - -class SimpleLabel(Name): - signature = ISimpleLabel - -class ISimpleLabels(interfaces.IRMLDirectiveSignature): - """A set of simple labels for a chart.""" - occurence.containing( - occurence.OneOrMore('label', ISimpleLabel), - ) - -class SimpleLabels(directive.RMLDirective): - signature = ISimpleLabels - factories = {'label': Name} - - def process(self): - self.names = [] - self.processSubDirectives() - self.parent.context.labels = self.names - - -class IStrandBase(interfaces.IRMLDirectiveSignature): - - strokeWidth = attr.Measurement( - title=u'Stroke Width', - description=u'The line width of the strand.', - required=False) - - fillColor = attr.Color( - title=u'Fill Color', - description=u'The fill color of the strand area.', - required=False) - - strokeColor= attr.Color( - title=u'Stroke Color', - description=u'The color of the strand line.', - required=False) - - strokeDashArray = attr.Sequence( - title=u'Stroke Dash Array', - description=u'The dash array of the strand line.', - value_type=attr.Float(), - required=False) - - symbol = attr.Symbol( - title=u'Symbol', - description=u'The symbol to use to mark the strand.', - required=False) - - symbolSize = attr.Measurement( - title=u'Symbol Size', - description=u'The size of the strand symbol.', - required=False) - -class IStrand(IStrandBase): - """A strand in the spider diagram""" - - name = attr.Text( - title=u'Name', - description=u'The name of the strand.', - required=False) - -class Strand(PropertyItem): - signature = IStrand - - -class IStrands(IStrand): - """A collection of strands.""" - occurence.containing( - occurence.OneOrMore('strand', IStrand) - ) - -class Strands(PropertyCollection): - signature = IStrands - propertyName = 'strands' - attrs = IStrandBase - factories = {'strand': Strand} - - -class IStrandLabelBase(ILabelBase): - - _text = attr.TextNode( - title=u'Text', - description=u'The label text of the strand.', - required=False) - - row = attr.Integer( - title=u'Row', - description=u'The row of the strand label', - required=False) - - col = attr.Integer( - title=u'Column', - description=u'The column of the strand label.', - required=False) - - format = attr.String( - title=u'Format', - description=u'The format string for the label.', - required=False) - -class IStrandLabel(IStrandLabelBase): - """A label for a strand.""" - - dR = attr.Float( - title=u'Radial Shift', - description=u'The radial shift of the label.', - required=False) - -class StrandLabel(Label): - signature = IStrandLabel - - -class IStrandLabels(IStrandLabelBase): - """A set of strand labels.""" - occurence.containing( - occurence.OneOrMore('label', IStrandLabel) - ) - -class StrandLabels(PropertyCollection): - signature = IStrandLabels - propertyName = 'strandLabels' - factories = {'label': StrandLabel} - - def process(self): - self.processAttributes() - # Get item specific properties - prop = getattr(self.parent.context, self.propertyName) - self.dataList = [] - self.processSubDirectives() - for data in self.dataList: - row = data.pop('row') - col = data.pop('col') - for name, value in data.items(): - setattr(prop[row, col], name, value) - - -class ISpoke(interfaces.IRMLDirectiveSignature): - """A spoke in the spider diagram.""" - - strokeWidth = attr.Measurement( - title=u'Stroke Width', - description=u"The width of the spoke's line.", - required=False) - - fillColor = attr.Color( - title=u'Fill Color', - description=u"The fill color of the spoke's area.", - required=False) - - strokeColor= attr.Color( - title=u'Stroke Color', - description=u'The color of the spoke line.', - required=False) - - strokeDashArray = attr.Sequence( - title=u'Stroke Dash Array', - description=u'The dash array of the spoke line.', - value_type=attr.Float(), - required=False) - - labelRadius = attr.Measurement( - title=u'Label Radius', - description=u'The radius of the label arouns the spoke.', - required=False) - - visible = attr.Boolean( - title=u'Visible', - description=u'When true, the spoke line is drawn.', - required=False) - -class Spoke(PropertyItem): - signature = ISpoke - - -class ISpokes(ISpoke): - """A collection of spokes.""" - occurence.containing( - occurence.OneOrMore('spoke', ISpoke) - ) - -class Spokes(PropertyCollection): - signature = ISpokes - propertyName = 'spokes' - factories = {'spoke': Spoke} - - -class ISpokeLabelBase(ILabelBase): - pass - -class ISpokeLabel(ISpokeLabelBase): - """A label for a spoke.""" - _text = attr.TextNode( - title=u'Text', - description=u'The text of the spoke (label).', - required=False) - -class SpokeLabel(Label): - signature = ISpokeLabel - - -class ISpokeLabels(ISpokeLabelBase): - """A set of spoke labels.""" - occurence.containing( - occurence.OneOrMore('label', ISpokeLabel) - ) - -class SpokeLabels(PropertyCollection): - signature = ISpokeLabels - propertyName = 'spokeLabels' - factories = {'label': SpokeLabel} - - -class IChart(interfaces.IRMLDirectiveSignature): - occurence.containing( - occurence.ZeroOrOne('texts', ITexts), - ) - - # Drawing Options - - dx = attr.Measurement( - title=u'Drawing X-Position', - description=u'The x-position of the entire drawing on the canvas.', - required=False) - - dy = attr.Measurement( - title=u'Drawing Y-Position', - description=u'The y-position of the entire drawing on the canvas.', - required=False) - - dwidth = attr.Measurement( - title=u'Drawing Width', - description=u'The width of the entire drawing', - required=False) - - dheight = attr.Measurement( - title=u'Drawing Height', - description=u'The height of the entire drawing', - required=False) - - angle = attr.Float( - title=u'Angle', - description=u'The orientation of the drawing as an angle in degrees.', - required=False) - - # Plot Area Options - - x = attr.Measurement( - title=u'Chart X-Position', - description=u'The x-position of the chart within the drawing.', - required=False) - - y = attr.Measurement( - title=u'Chart Y-Position', - description=u'The y-position of the chart within the drawing.', - required=False) - - width = attr.Measurement( - title=u'Chart Width', - description=u'The width of the chart.', - required=False) - - height = attr.Measurement( - title=u'Chart Height', - description=u'The height of the chart.', - required=False) - - strokeColor = attr.Color( - title=u'Stroke Color', - description=u'Color of the chart border.', - required=False) - - strokeWidth = attr.Measurement( - title=u'Stroke Width', - description=u'Width of the chart border.', - required=False) - - fillColor = attr.Color( - title=u'Fill Color', - description=u'Color of the chart interior.', - required=False) - - debug = attr.Boolean( - title=u'Debugging', - description=u'A flag that when set to True turns on debug messages.', - required=False) - -class Chart(directive.RMLDirective): - signature = IChart - factories = { - 'texts': Texts - } - attrMapping = {} - - def createChart(self, attributes): - raise NotImplementedError - - def process(self): - attrs = dict(self.getAttributeValues(attrMapping=self.attrMapping)) - angle = attrs.pop('angle', 0) - x, y = attrs.pop('dx'), attrs.pop('dy') - self.drawing = shapes.Drawing(attrs.pop('dwidth'), attrs.pop('dheight')) - self.context = chart = self.createChart(attrs) - self.processSubDirectives() - group = shapes.Group(chart) - group.translate(0,0) - group.rotate(angle) - self.drawing.add(group) - manager = attr.getManager(self, interfaces.ICanvasManager) - self.drawing.drawOn(manager.canvas, x, y) - - -class IBarChart(IChart): - """Creates a two-dimensional bar chart.""" - occurence.containing( - occurence.One('data', IData1D), - occurence.ZeroOrOne('bars', IBars), - occurence.ZeroOrOne('categoryAxis', ICategoryAxis), - occurence.ZeroOrOne('valueAxis', IValueAxis), - occurence.ZeroOrOne('barLabels', IBarLabels), - *IChart.queryTaggedValue('directives', ()) - ) - - direction = attr.Choice( - title=u'Direction', - description=u'The direction of the bars within the chart.', - choices=('horizontal', 'vertical'), - default='horizontal', - required=False) - - useAbsolute = attr.Boolean( - title=u'Use Absolute Spacing', - description=u'Flag to use absolute spacing values.', - default=False, - required=False) - - barWidth = attr.Measurement( - title=u'Bar Width', - description=u'The width of an individual bar.', - default=10, - required=False) - - groupSpacing = attr.Measurement( - title=u'Group Spacing', - description=u'Width between groups of bars.', - default=5, - required=False) - - barSpacing = attr.Measurement( - title=u'Bar Spacing', - description=u'Width between individual bars.', - default=0, - required=False) - - barLabelFormat = attr.String( - title=u'Bar Label Text Format', - description=u'Formatting string for bar labels.', - required=False) - - -class BarChart(Chart): - signature = IBarChart - nameBase = 'BarChart' - factories = Chart.factories.copy() - factories.update({ - 'data': Data1D, - 'bars': Bars, - 'barLabels': BarLabels, - }) - - def createChart(self, attrs): - direction = attrs.pop('direction') - # Setup sub-elements based on direction - if direction == 'horizontal': - self.factories['categoryAxis'] = YCategoryAxis - self.factories['valueAxis'] = XValueAxis - else: - self.factories['categoryAxis'] = XCategoryAxis - self.factories['valueAxis'] = YValueAxis - # Generate the chart - chart = getattr( - barcharts, direction.capitalize()+self.nameBase)() - for name, value in attrs.items(): - setattr(chart, name, value) - return chart - - -class IBarChart3D(IBarChart): - """Creates a three-dimensional bar chart.""" - occurence.containing( - *IBarChart.queryTaggedValue('directives', ()) - ) - - thetaX = attr.Float( - title=u'Theta-X', - description=u'Fraction of dx/dz.', - required=False) - - thetaY = attr.Float( - title=u'Theta-Y', - description=u'Fraction of dy/dz.', - required=False) - - zDepth = attr.Measurement( - title=u'Z-Depth', - description=u'Depth of an individual series/bar.', - required=False) - - zSpace = attr.Measurement( - title=u'Z-Space', - description=u'Z-Gap around a series/bar.', - required=False) - -class BarChart3D(BarChart): - signature = IBarChart3D - nameBase = 'BarChart3D' - attrMapping = {'thetaX': 'theta_x', 'thetaY': 'theta_y'} - - -class ILinePlot(IChart): - """A line plot.""" - occurence.containing( - occurence.One('data', IData2D), - occurence.ZeroOrOne('lines', ILines), - occurence.ZeroOrOne('xValueAxis', IXValueAxis), - occurence.ZeroOrOne('yValueAxis', IYValueAxis), - occurence.ZeroOrOne('lineLabels', ILineLabels), - *IChart.queryTaggedValue('directives', ()) - ) - - reversePlotOrder = attr.Boolean( - title=u'Reverse Plot Order', - description=u'When true, the coordinate system is reversed.', - required=False) - - lineLabelNudge = attr.Measurement( - title=u'Line Label Nudge', - description=u'The distance between the data point and its label.', - required=False) - - lineLabelFormat = attr.String( - title=u'Line Label Format', - description=u'Formatting string for data point labels.', - required=False) - - joinedLines = attr.Boolean( - title=u'Joined Lines', - description=u'When true, connect all data points with lines.', - required=False) - -class LinePlot(Chart): - signature = ILinePlot - - factories = Chart.factories.copy() - factories.update({ - 'data': Data2D, - 'lines': Lines, - 'xValueAxis': LineXValueAxis, - 'yValueAxis': LineYValueAxis, - 'lineLabels': LineLabels, - }) - - def createChart(self, attrs): - # Generate the chart - chart = lineplots.LinePlot() - for name, value in attrs.items(): - setattr(chart, name, value) - return chart - -class ILinePlot3D(ILinePlot): - """Creates a three-dimensional line plot.""" - occurence.containing( - *ILinePlot.queryTaggedValue('directives', ()) - ) - - thetaX = attr.Float( - title=u'Theta-X', - description=u'Fraction of dx/dz.', - required=False) - - thetaY = attr.Float( - title=u'Theta-Y', - description=u'Fraction of dy/dz.', - required=False) - - zDepth = attr.Measurement( - title=u'Z-Depth', - description=u'Depth of an individual series/bar.', - required=False) - - zSpace = attr.Measurement( - title=u'Z-Space', - description=u'Z-Gap around a series/bar.', - required=False) - -class LinePlot3D(LinePlot): - signature = ILinePlot3D - nameBase = 'LinePlot3D' - attrMapping = {'thetaX': 'theta_x', 'thetaY': 'theta_y'} - - def createChart(self, attrs): - # Generate the chart - chart = lineplots.LinePlot3D() - for name, value in attrs.items(): - setattr(chart,name, value) - return chart - - - -class IPieChart(IChart): - """A pie chart.""" - occurence.containing( - occurence.One('data', ISingleData1D), - occurence.ZeroOrOne('slices', ISlices), - occurence.ZeroOrOne('labels', ISimpleLabels), - *IChart.queryTaggedValue('directives', ()) - ) - - startAngle = attr.Integer( - title=u'Start Angle', - description=u'The start angle in the chart of the first slice ' - u'in degrees.', - required=False) - - direction = attr.Choice( - title=u'Direction', - description=u'The direction in which the pie chart will be built.', - choices=('clockwise', 'anticlockwise'), - required=False) - - checkLabelOverlap = attr.Boolean( - title=u'Check Label Overlap', - description=(u'When true, check and attempt to fix standard ' - u'label overlaps'), - required=False) - - pointerLabelMode = attr.Choice( - title=u'Pointer Label Mode', - description=(u'The location relative to the slace the label should ' - u'be placed.'), - choices={'none': None, - 'leftright': 'LeftRight', - 'leftandright': 'LeftAndRight'}, - required=False) - - sameRadii = attr.Boolean( - title=u'Same Radii', - description=u'When true, make x/y radii the same.', - required=False) - - orderMode = attr.Choice( - title=u'Order Mode', - description=u'', - choices=('fixed', 'alternate'), - required=False) - - xradius = attr.Measurement( - title=u'X-Radius', - description=u'The radius of the X-directions', - required=False) - - yradius = attr.Measurement( - title=u'Y-Radius', - description=u'The radius of the Y-directions', - required=False) - - -class PieChart(Chart): - signature = IPieChart - chartClass = piecharts.Pie - - factories = Chart.factories.copy() - factories.update({ - 'data': SingleData1D, - 'slices': Slices, - 'labels': SimpleLabels, - }) - - def createChart(self, attrs): - # Generate the chart - chart = self.chartClass() - for name, value in attrs.items(): - setattr(chart, name, value) - return chart - - -class IPieChart3D(IPieChart): - """A 3-D pie chart.""" - occurence.containing( - occurence.One('slices', ISlices3D), - *IChart.queryTaggedValue('directives', ()) - ) - - perspective = attr.Float( - title=u'Perspsective', - description=u'The flattening parameter.', - required=False) - - depth_3d = attr.Measurement( - title=u'3-D Depth', - description=u'The depth of the pie.', - required=False) - - angle_3d = attr.Float( - title=u'3-D Angle', - description=u'The view angle in the Z-coordinate.', - required=False) - -class PieChart3D(PieChart): - signature = IPieChart3D - chartClass = piecharts.Pie3d - - factories = PieChart.factories.copy() - factories.update({ - 'slices': Slices3D, - }) - -class ISpiderChart(IChart): - """A spider chart.""" - occurence.containing( - occurence.One('data', IData1D), - occurence.ZeroOrOne('strands', IStrands), - occurence.ZeroOrOne('strandLabels', IStrandLabels), - occurence.ZeroOrOne('spokes', ISpokes), - occurence.ZeroOrOne('spokeLabels', ISpokeLabels), - occurence.ZeroOrOne('labels', ISimpleLabels), - *IChart.queryTaggedValue('directives', ()) - ) - - startAngle = attr.Integer( - title=u'Start Angle', - description=u'The start angle in the chart of the first strand ' - u'in degrees.', - required=False) - - direction = attr.Choice( - title=u'Direction', - description=u'The direction in which the spider chart will be built.', - choices=('clockwise', 'anticlockwise'), - required=False) - -class SpiderChart(Chart): - signature = ISpiderChart - factories = Chart.factories.copy() - factories.update({ - 'data': Data1D, - 'strands': Strands, - 'strandLabels': StrandLabels, - 'spokes': Spokes, - 'spokeLabels': SpokeLabels, - 'labels': SimpleLabels, - }) - - def createChart(self, attrs): - # Generate the chart - chart = spider.SpiderChart() - for name, value in attrs.items(): - setattr(chart, name, value) - return chart diff --git a/z3c/rml/directive.py b/z3c/rml/directive.py deleted file mode 100644 index 1e059c64..00000000 --- a/z3c/rml/directive.py +++ /dev/null @@ -1,123 +0,0 @@ -############################################################################## -# -# Copyright (c) 2007 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""RML Directive Implementation -""" -import logging -import zope.interface -import zope.schema - -from lxml import etree -from z3c.rml import interfaces -from z3c.rml.attr import getManager - -logging.raiseExceptions = False -logger = logging.getLogger("z3c.rml") - -ABORT_ON_INVALID_DIRECTIVE = False - -def DeprecatedDirective(iface, reason): - zope.interface.directlyProvides(iface, interfaces.IDeprecatedDirective) - iface.setTaggedValue('deprecatedReason', reason) - return iface - -def getFileInfo(directive, element=None): - root = directive - while root.parent: - root = root.parent - if element is None: - element = directive.element - return '(file %s, line %i)' %(root.filename, element.sourceline) - -class RMLDirective(object): - zope.interface.implements(interfaces.IRMLDirective) - signature = None - factories = {} - - def __init__(self, element, parent): - self.element = element - self.parent = parent - - def getAttributeValues(self, ignore=None, select=None, attrMapping=None, - includeMissing=False, valuesOnly=False): - """See interfaces.IRMLDirective""" - manager = getManager(self) - cache = '%s.%s' % (self.signature.__module__, self.signature.__name__) - if cache in manager.attributesCache: - fields = manager.attributesCache[cache] - else: - fields = [] - for name, attr in zope.schema.getFieldsInOrder(self.signature): - fields.append((name, attr)) - manager.attributesCache[cache] = fields - - items = [] - for name, attr in fields: - # Only add the attribute to the list, if it is supposed there - if ((ignore is None or name not in ignore) and - (select is None or name in select)): - # Get the value. - value = attr.bind(self).get() - # If no value was found for a required field, raise a value - # error - if attr.required and value is attr.missing_value: - raise ValueError( - 'No value for required attribute "%s" ' - 'in directive "%s" %s.' % ( - name, self.element.tag, getFileInfo(self))) - # Only add the entry if the value is not the missing value or - # missing values are requested to be included. - if value is not attr.missing_value or includeMissing: - items.append((name, value)) - - # Sort the items based on the section - if select is not None: - select = list(select) - items = sorted(items, key=lambda (n, v): select.index(n)) - - # If the attribute name does not match the internal API - # name, then convert the name to the internal one - if attrMapping: - items = [(attrMapping.get(name, name), value) - for name, value in items] - - # Sometimes we only want the values without the names - if valuesOnly: - return [value for name, value in items] - - return items - - def processSubDirectives(self, select=None, ignore=None): - # Go through all children of the directive and try to process them. - for element in self.element.getchildren(): - # Ignore all comments - if isinstance(element, etree._Comment): - continue - # Raise an error/log any unknown directive. - if element.tag not in self.factories: - msg = "Directive %r could not be processed and was " \ - "ignored. %s" %(element.tag, getFileInfo(self, element)) - # Record any tags/elements that could not be processed. - logger.warn(msg) - if ABORT_ON_INVALID_DIRECTIVE: - raise ValueError(msg) - continue - if select is not None and element.tag not in select: - continue - if ignore is not None and element.tag in ignore: - continue - directive = self.factories[element.tag](element, self) - directive.process() - - def process(self): - self.processSubDirectives() diff --git a/z3c/rml/doclogic.py b/z3c/rml/doclogic.py deleted file mode 100644 index 19bd264a..00000000 --- a/z3c/rml/doclogic.py +++ /dev/null @@ -1,169 +0,0 @@ -############################################################################## -# -# Copyright (c) 2012 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""``doc*`` directives. -""" -import reportlab.platypus -from z3c.rml import attr, directive, flowable, interfaces, occurence - -class IDocAssign(interfaces.IRMLDirectiveSignature): - """Assign a value to the namesapce.""" - - var = attr.String( - title=u'Variable Name', - description=u'The name under which the value is stored.', - required=True) - - expr = attr.String( - title=u'Expression', - description=u'The expression that creates the value when evaluated.', - required=True) - -class DocAssign(flowable.Flowable): - signature = IDocAssign - klass = reportlab.platypus.flowables.DocAssign - - -class IDocExec(interfaces.IRMLDirectiveSignature): - """Execute a statement.""" - - stmt = attr.String( - title=u'Statement', - description=u'The statement to be executed.', - required=True) - -class DocExec(flowable.Flowable): - signature = IDocExec - klass = reportlab.platypus.flowables.DocExec - - -class IDocPara(interfaces.IRMLDirectiveSignature): - """Create a paragraph with the value returned from the expression.""" - - expr = attr.String( - title=u'Expression', - description=u'The expression to be executed.', - required=True) - - format = attr.String( - title=u'Format', - description=u'The format used to render the expression value.', - required=False) - - style = attr.Style( - title=u'Style', - description=u'The style of the paragraph.', - required=False) - - escape = attr.Boolean( - title=u'Escape Text', - description=u'When set (default) the expression value is escaped.', - required=False) - -class DocPara(flowable.Flowable): - signature = IDocPara - klass = reportlab.platypus.flowables.DocPara - - -class IDocAssert(interfaces.IRMLDirectiveSignature): - """Assert a certain condition.""" - - cond = attr.String( - title=u'Condition', - description=u'The condition to be asserted.', - required=True) - - format = attr.String( - title=u'Format', - description=u'The text displayed if assertion fails.', - required=False) - -class DocAssert(flowable.Flowable): - signature = IDocAssert - klass = reportlab.platypus.flowables.DocAssert - - -class IDocElse(interfaces.IRMLDirectiveSignature): - """Starts 'else' block.""" - -class DocElse(flowable.Flowable): - signature = IDocElse - - def process(self): - if not isinstance(self.parent, DocIf): - raise ValueError(" can only be placed inside a ") - self.parent.flow = self.parent.elseFlow - - -class IDocIf(flowable.IFlow): - """Display story flow based on the value of the condition.""" - - cond = attr.String( - title=u'Condition', - description=u'The condition to be tested.', - required=True) - -class DocIf(flowable.Flow): - signature = IDocAssert - klass = reportlab.platypus.flowables.DocIf - - def __init__(self, *args, **kw): - super(flowable.Flow, self).__init__(*args, **kw) - self.thenFlow = self.flow = [] - self.elseFlow = [] - - def process(self): - args = dict(self.getAttributeValues()) - self.processSubDirectives() - dif = self.klass( - thenBlock = self.thenFlow, elseBlock = self.elseFlow, **args) - self.parent.flow.append(dif) - -class IDocWhile(flowable.IFlow): - """Repeat the included directives as long as the condition is true.""" - - cond = attr.String( - title=u'Condition', - description=u'The condition to be tested.', - required=True) - -class DocWhile(flowable.Flow): - signature = IDocAssert - klass = reportlab.platypus.flowables.DocWhile - - def process(self): - args = dict(self.getAttributeValues()) - self.processSubDirectives() - dwhile = self.klass(whileBlock = self.flow, **args) - self.parent.flow.append(dwhile) - - -flowable.Flow.factories['docAssign'] = DocAssign -flowable.Flow.factories['docExec'] = DocExec -flowable.Flow.factories['docPara'] = DocPara -flowable.Flow.factories['docAssert'] = DocAssert -flowable.Flow.factories['docIf'] = DocIf -flowable.Flow.factories['docElse'] = DocElse -flowable.Flow.factories['docWhile'] = DocWhile - -flowable.IFlow.setTaggedValue( - 'directives', - flowable.IFlow.getTaggedValue('directives') + - (occurence.ZeroOrMore('docAssign', IDocAssign), - occurence.ZeroOrMore('docExec', IDocExec), - occurence.ZeroOrMore('docPara', IDocPara), - occurence.ZeroOrMore('docIf', IDocIf), - occurence.ZeroOrMore('docElse', IDocElse), - occurence.ZeroOrMore('docWhile', IDocWhile), - ) - ) diff --git a/z3c/rml/document.py b/z3c/rml/document.py deleted file mode 100644 index fdc32bc0..00000000 --- a/z3c/rml/document.py +++ /dev/null @@ -1,757 +0,0 @@ -############################################################################## -# -# Copyright (c) 2007 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""RML ``document`` element -""" -import cStringIO -import logging -import sys -import zope.interface -import reportlab.pdfgen.canvas -from reportlab.pdfbase import pdfmetrics, ttfonts, cidfonts -from reportlab.lib import colors, fonts -from reportlab.platypus import tableofcontents -from reportlab.platypus.doctemplate import IndexingFlowable - -from z3c.rml import attr, canvas, directive, doclogic, interfaces, list -from z3c.rml import occurence, pdfinclude, special, storyplace, stylesheet -from z3c.rml import template - -LOGGER_NAME = 'z3c.rml.render' - -class IRegisterType1Face(interfaces.IRMLDirectiveSignature): - """Register a new Type 1 font face.""" - - afmFile = attr.File( - title=u'AFM File', - description=u'Path to AFM file used to register the Type 1 face.', - doNotOpen=True, - required=True) - - pfbFile = attr.File( - title=u'PFB File', - description=u'Path to PFB file used to register the Type 1 face.', - doNotOpen=True, - required=True) - -class RegisterType1Face(directive.RMLDirective): - signature = IRegisterType1Face - - def process(self): - args = self.getAttributeValues(valuesOnly=True) - face = pdfmetrics.EmbeddedType1Face(*args) - pdfmetrics.registerTypeFace(face) - - -class IRegisterFont(interfaces.IRMLDirectiveSignature): - """Register a new font based on a face and encoding.""" - - name = attr.String( - title=u'Name', - description=(u'The name under which the font can be used in style ' - u'declarations or other parameters that lookup a font.'), - required=True) - - faceName = attr.String( - title=u'Face Name', - description=(u'The name of the face the font uses. The face has to ' - u'be previously registered.'), - required=True) - - encName = attr.String( - title=u'Encoding Name', - description=(u'The name of the encdoing to be used.'), - required=True) - -class RegisterFont(directive.RMLDirective): - signature = IRegisterFont - - def process(self): - args = self.getAttributeValues(valuesOnly=True) - font = pdfmetrics.Font(*args) - pdfmetrics.registerFont(font) - - -class IAddMapping(interfaces.IRMLDirectiveSignature): - """Map various styles(bold, italic) of a font name to the actual ps fonts - used.""" - - faceName = attr.String( - title=u'Name', - description=(u'The name of the font to be mapped'), - required=True) - - bold = attr.Integer( - title=u'Bold', - description=(u'Bold'), - required=True) - - italic = attr.Integer( - title=u'Italic', - description=(u'Italic'), - required=True) - - psName = attr.String( - title=u'psName', - description=(u'Actual font name mapped'), - required=True) - -class AddMapping(directive.RMLDirective): - signature = IAddMapping - - def process(self): - args = self.getAttributeValues(valuesOnly=True) - fonts.addMapping(*args) - -class IRegisterTTFont(interfaces.IRMLDirectiveSignature): - """Register a new TrueType font given the TT file and face name.""" - - faceName = attr.String( - title=u'Face Name', - description=(u'The name of the face the font uses. The face has to ' - u'be previously registered.'), - required=True) - - fileName = attr.File( - title=u'File Name', - description=u'File path of the of the TrueType font.', - doNotOpen=True, - required=True) - -class RegisterTTFont(directive.RMLDirective): - signature = IRegisterTTFont - - def process(self): - args = self.getAttributeValues(valuesOnly=True) - font = ttfonts.TTFont(*args) - pdfmetrics.registerFont(font) - - -class IRegisterCidFont(interfaces.IRMLDirectiveSignature): - """Register a new CID font given the face name.""" - - faceName = attr.String( - title=u'Face Name', - description=(u'The name of the face the font uses. The face has to ' - u'be previously registered.'), - required=True) - - encName = attr.String( - title=u'Encoding Name', - description=(u'The name of the encoding to use for the font.'), - required=False) - -class RegisterCidFont(directive.RMLDirective): - signature = IRegisterCidFont - attrMapping = {'faceName': 'face', 'encName': 'encoding'} - - def process(self): - args = dict(self.getAttributeValues(attrMapping=self.attrMapping)) - if 'encoding' in args: - font = cidfonts.CIDFont(**args) - else: - font = cidfonts.UnicodeCIDFont(**args) - pdfmetrics.registerFont(font) - - -class IRegisterFontFamily(interfaces.IRMLDirectiveSignature): - """Register a new font family.""" - - name = attr.String( - title=u'Name', - description=(u'The name of the font family.'), - required=True) - - normal = attr.String( - title=u'Normal Font Name', - description=(u'The name of the normal font variant.'), - required=False) - - bold = attr.String( - title=u'Bold Font Name', - description=(u'The name of the bold font variant.'), - required=False) - - italic = attr.String( - title=u'Italic Font Name', - description=(u'The name of the italic font variant.'), - required=False) - - boldItalic = attr.String( - title=u'Bold/Italic Font Name', - description=(u'The name of the bold/italic font variant.'), - required=True) - -class RegisterFontFamily(directive.RMLDirective): - signature = IRegisterFontFamily - attrMapping = {'name': 'family'} - - def process(self): - args = dict(self.getAttributeValues(attrMapping=self.attrMapping)) - pdfmetrics.registerFontFamily(**args) - - -class IColorDefinition(interfaces.IRMLDirectiveSignature): - """Define a new color and give it a name to be known under.""" - - id = attr.String( - title=u'Id', - description=(u'The id/name the color will be available under.'), - required=True) - - RGB = attr.Color( - title=u'RGB Color', - description=(u'The color value that is represented.'), - required=False) - - CMYK = attr.Color( - title=u'CMYK Color', - description=(u'The color value that is represented.'), - required=False) - - value = attr.Color( - title=u'Color', - description=(u'The color value that is represented.'), - required=False) - - spotName = attr.String( - title=u'Spot Name', - description=(u'The Spot Name of the CMYK color.'), - required=False) - - density = attr.Float( - title=u'Density', - description=(u'The color density of the CMYK color.'), - min=0.0, - max=1.0, - required=False) - - knockout = attr.String( - title=u'Knockout', - description=(u'The knockout of the CMYK color.'), - required=False) - - alpha = attr.Float( - title=u'Alpha', - description=(u'The alpha channel of the color.'), - min=0.0, - max=1.0, - required=False) - -class ColorDefinition(directive.RMLDirective): - signature = IColorDefinition - - def process(self): - kwargs = dict(self.getAttributeValues()) - id = kwargs.pop('id') - for attrName in ('RGB', 'CMYK', 'value'): - color = kwargs.pop(attrName, None) - if color is not None: - # CMYK has additional attributes. - for name, value in kwargs.items(): - setattr(color, name, value) - manager = attr.getManager(self) - manager.colors[id] = color - return - raise ValueError('At least one color definition must be specified.') - -# Initialize also supports the tag. -stylesheet.Initialize.factories['color'] = ColorDefinition -stylesheet.IInitialize.setTaggedValue( - 'directives', - stylesheet.IInitialize.getTaggedValue('directives') + - (occurence.ZeroOrMore('color', IColorDefinition),) - ) - - -class IStartIndex(interfaces.IRMLDirectiveSignature): - """Start a new index.""" - - name = attr.String( - title=u'Name', - description=u'The name of the index.', - default='index', - required=True) - - offset = attr.Integer( - title=u'Offset', - description=u'The counting offset.', - min=0, - required=False) - - format = attr.Choice( - title=u'Format', - description=(u'The format the index is going to use.'), - choices=interfaces.LIST_FORMATS, - required=False) - -class StartIndex(directive.RMLDirective): - signature = IStartIndex - - def process(self): - kwargs = dict(self.getAttributeValues()) - name = kwargs['name'] - manager = attr.getManager(self) - manager.indexes[name] = tableofcontents.SimpleIndex(**kwargs) - - -class ICropMarks(interfaces.IRMLDirectiveSignature): - """Crop Marks specification""" - - name = attr.String( - title=u'Name', - description=u'The name of the index.', - default='index', - required=True) - - borderWidth = attr.Measurement( - title=u'Border Width', - description=u'The width of the crop mark border.', - required=False) - - markColor = attr.Color( - title=u'Mark Color', - description=u'The color of the crop marks.', - required=False) - - markWidth = attr.Measurement( - title=u'Mark Width', - description=u'The line width of the actual crop marks.', - required=False) - - markLength = attr.Measurement( - title=u'Mark Length', - description=u'The length of the actual crop marks.', - required=False) - - markLast = attr.Boolean( - title=u'Mark Last', - description=u'If set, marks are drawn after the content is rendered.', - required=False) - - bleedWidth = attr.Measurement( - title=u'Bleed Width', - description=(u'The width of the page bleed.'), - required=False) - -class CropMarksProperties(object): - borderWidth = 36 - markWidth = 0.5 - markColor = colors.toColor('green') - markLength = 18 - markLast = True - bleedWidth = 0 - -class CropMarks(directive.RMLDirective): - signature = ICropMarks - - def process(self): - cmp = CropMarksProperties() - for name, value in self.getAttributeValues(): - setattr(cmp, name, value) - self.parent.parent.cropMarks = cmp - -class ILogConfig(interfaces.IRMLDirectiveSignature): - """Configure the render logger.""" - - level = attr.Choice( - title=u'Level', - description=u'The default log level.', - choices=interfaces.LOG_LEVELS, - doLower=False, - required=False) - - format = attr.String( - title=u'Format', - description=u'The format of the log messages.', - required=False) - - filename = attr.File( - title=u'File Name', - description=u'The path to the file that is being logged.', - doNotOpen=True, - required=True) - - filemode = attr.Choice( - title=u'File Mode', - description=u'The mode to open the file in.', - choices={'WRITE': 'w', 'APPEND': 'a'}, - default='a', - required=False) - - datefmt = attr.String( - title=u'Date Format', - description=u'The format of the log message date.', - required=False) - -class LogConfig(directive.RMLDirective): - signature = ILogConfig - - def process(self): - args = dict(self.getAttributeValues()) - - # cleanup win paths like: - # ....\\input\\file:///D:\\trunk\\... - if sys.platform[:3].lower() == "win": - if args['filename'].startswith('file:///'): - args['filename'] = args['filename'][len('file:///'):] - - logger = logging.getLogger(LOGGER_NAME) - handler = logging.FileHandler(args['filename'], args['filemode']) - formatter = logging.Formatter( - args.get('format'), args.get('datefmt')) - handler.setFormatter(formatter) - logger.addHandler(handler) - if 'level' in args: - logger.setLevel(args['level']) - self.parent.parent.logger = logger - - -class IDocInit(interfaces.IRMLDirectiveSignature): - occurence.containing( - occurence.ZeroOrMore('color', IColorDefinition), - occurence.ZeroOrMore('name', special.IName), - occurence.ZeroOrMore('registerType1Face', IRegisterType1Face), - occurence.ZeroOrMore('registerFont', IRegisterFont), - occurence.ZeroOrMore('registerCidFont', IRegisterCidFont), - occurence.ZeroOrMore('registerTTFont', IRegisterTTFont), - occurence.ZeroOrMore('registerFontFamily', IRegisterFontFamily), - occurence.ZeroOrMore('addMapping', IAddMapping), - occurence.ZeroOrMore('logConfig', ILogConfig), - occurence.ZeroOrMore('cropMarks', ICropMarks), - occurence.ZeroOrMore('startIndex', IStartIndex), - ) - - pageMode = attr.Choice( - title=u'Page Mode', - description=(u'The page mode in which the document is opened in ' - u'the viewer.'), - choices=('UseNone', 'UseOutlines', 'UseThumbs', 'FullScreen'), - required=False) - - pageLayout = attr.Choice( - title=u'Page Layout', - description=(u'The layout in which the pages are displayed in ' - u'the viewer.'), - choices=('SinglePage', 'OneColumn', 'TwoColumnLeft', 'TwoColumnRight'), - required=False) - - useCropMarks = attr.Boolean( - title=u'Use Crop Marks', - description=u'A flag when set shows crop marks on the page.', - required=False) - - hideToolbar = attr.TextBoolean( - title=u'Hide Toolbar', - description=(u'A flag indicating that the toolbar is hidden in ' - u'the viewer.'), - required=False) - - hideMenubar = attr.TextBoolean( - title=u'Hide Menubar', - description=(u'A flag indicating that the menubar is hidden in ' - u'the viewer.'), - required=False) - - hideWindowUI = attr.TextBoolean( - title=u'Hide Window UI', - description=(u'A flag indicating that the window UI is hidden in ' - u'the viewer.'), - required=False) - - fitWindow = attr.TextBoolean( - title=u'Fit Window', - description=u'A flag indicating that the page fits in the viewer.', - required=False) - - centerWindow = attr.TextBoolean( - title=u'Center Window', - description=(u'A flag indicating that the page fits is centered ' - u'in the viewer.'), - required=False) - - displayDocTitle = attr.TextBoolean( - title=u'Display Doc Title', - description=(u'A flag indicating that the document title is displayed ' - u'in the viewer.'), - required=False) - - nonFullScreenPageMode = attr.Choice( - title=u'Non-Full-Screen Page Mode', - description=(u'Non-Full-Screen page mode in the viewer.'), - choices=('UseNone', 'UseOutlines', 'UseThumbs', 'UseOC'), - required=False) - - direction = attr.Choice( - title=u'Text Direction', - description=(u'The text direction of the PDF.'), - choices=('L2R', 'R2L'), - required=False) - - viewArea = attr.Choice( - title=u'View Area', - description=(u'View Area setting used in the viewer.'), - choices=('MediaBox', 'CropBox', 'BleedBox', 'TrimBox', 'ArtBox'), - required=False) - - viewClip = attr.Choice( - title=u'View Clip', - description=(u'View Clip setting used in the viewer.'), - choices=('MediaBox', 'CropBox', 'BleedBox', 'TrimBox', 'ArtBox'), - required=False) - - printArea = attr.Choice( - title=u'Print Area', - description=(u'Print Area setting used in the viewer.'), - choices=('MediaBox', 'CropBox', 'BleedBox', 'TrimBox', 'ArtBox'), - required=False) - - printClip = attr.Choice( - title=u'Print Clip', - description=(u'Print Clip setting used in the viewer.'), - choices=('MediaBox', 'CropBox', 'BleedBox', 'TrimBox', 'ArtBox'), - required=False) - - printScaling = attr.Choice( - title=u'Print Scaling', - description=(u'The print scaling mode in which the document is opened ' - u'in the viewer.'), - choices=('None', 'AppDefault'), - required=False) - -class DocInit(directive.RMLDirective): - signature = IDocInit - factories = { - 'name': special.Name, - 'color': ColorDefinition, - 'registerType1Face': RegisterType1Face, - 'registerFont': RegisterFont, - 'registerTTFont': RegisterTTFont, - 'registerCidFont': RegisterCidFont, - 'registerFontFamily': RegisterFontFamily, - 'addMapping': AddMapping, - 'logConfig': LogConfig, - 'cropMarks': CropMarks, - 'startIndex': StartIndex, - } - - viewerOptions = dict( - (option[0].lower()+option[1:], option) - for option in ['HideToolbar', 'HideMenubar', 'HideWindowUI', 'FitWindow', - 'CenterWindow', 'DisplayDocTitle', - 'NonFullScreenPageMode', 'Direction', 'ViewArea', - 'ViewClip', 'PrintArea', 'PrintClip', 'PrintScaling']) - - def process(self): - kwargs = dict(self.getAttributeValues()) - self.parent.cropMarks = kwargs.get('useCropMarks', False) - self.parent.pageMode = kwargs.get('pageMode') - self.parent.pageLayout = kwargs.get('pageLayout') - for name in self.viewerOptions: - setattr(self.parent, name, kwargs.get(name)) - super(DocInit, self).process() - - -class IDocument(interfaces.IRMLDirectiveSignature): - occurence.containing( - occurence.ZeroOrOne('docinit', IDocInit), - occurence.ZeroOrOne('stylesheet', stylesheet.IStylesheet), - occurence.ZeroOrOne('template', template.ITemplate), - occurence.ZeroOrOne('story', template.IStory), - occurence.ZeroOrOne('pageInfo', canvas.IPageInfo), - occurence.ZeroOrMore('pageDrawing', canvas.IPageDrawing), - ) - - filename = attr.String( - title=u'File Name', - description=(u'The default name of the output file, if no output ' - u'file was provided.'), - required=True) - - title = attr.String( - title=u'Title', - description=(u'The "Title" annotation for the PDF document.'), - required=False) - - subject = attr.String( - title=u'Subject', - description=(u'The "Subject" annotation for the PDF document.'), - required=False) - - author = attr.String( - title=u'Author', - description=(u'The "Author" annotation for the PDF document.'), - required=False) - - creator = attr.String( - title=u'Creator', - description=(u'The "Creator" annotation for the PDF document.'), - required=False) - - debug = attr.Boolean( - title=u'Debug', - description=u'A flag to activate the debug output.', - default=False, - required=False) - - compression = attr.BooleanWithDefault( - title=u'Compression', - description=(u'A flag determining whether page compression should ' - u'be used.'), - required=False) - - invariant = attr.BooleanWithDefault( - title=u'Invariant', - description=(u'A flag that determines whether the produced PDF ' - u'should be invariant with respect to the date and ' - u'the exact contents.'), - required=False) - -class Document(directive.RMLDirective): - signature = IDocument - zope.interface.implements(interfaces.IManager, - interfaces.IPostProcessorManager, - interfaces.ICanvasManager) - - factories = { - 'docinit': DocInit, - 'stylesheet': stylesheet.Stylesheet, - 'template': template.Template, - 'story': template.Story, - 'pageInfo': canvas.PageInfo, - 'pageDrawing': canvas.PageDrawing, - } - - def __init__(self, element): - super(Document, self).__init__(element, None) - self.names = {} - self.styles = {} - self.colors = {} - self.indexes = {} - self.postProcessors = [] - self.filename = '' - self.cropMarks = False - self.pageLayout = None - self.pageMode = None - self.logger = None - self.svgs = {} - self.attributesCache = {} - for name in DocInit.viewerOptions: - setattr(self, name, None) - - def _indexAdd(self, canvas, name, label): - self.indexes[name](canvas, name, label) - - def _beforeDocument(self): - self._initCanvas(self.doc.canv) - self.canvas = self.doc.canv - - def _initCanvas(self, canvas): - canvas._indexAdd = self._indexAdd - canvas.manager = self - if self.pageLayout: - canvas._doc._catalog.setPageLayout(self.pageLayout) - if self.pageMode: - canvas._doc._catalog.setPageMode(self.pageMode) - for name, option in DocInit.viewerOptions.items(): - if getattr(self, name) is not None: - canvas.setViewerPreference(option, getattr(self, name)) - # Setting annotations. - data = dict(self.getAttributeValues( - select=('title', 'subject', 'author', 'creator'))) - canvas.setTitle(data.get('title')) - canvas.setSubject(data.get('subject')) - canvas.setAuthor(data.get('author')) - canvas.setCreator(data.get('creator')) - - def process(self, outputFile=None, maxPasses=2): - """Process document""" - # Reset all reportlab global variables. This is very important for - # ReportLab not to fail. - reportlab.rl_config._reset() - - debug = self.getAttributeValues(select=('debug',), valuesOnly=True)[0] - if not debug: - reportlab.rl_config.shapeChecking = 0 - - # Add our colors mapping to the default ones. - colors.toColor.setExtraColorsNameSpace(self.colors) - - if outputFile is None: - # TODO: This is relative to the input file *not* the CWD!!! - outputFile = open(self.element.get('filename'), 'wb') - - # Create a temporary output file, so that post-processors can - # massage the output - self.outputFile = tempOutput = cStringIO.StringIO() - - # Process common sub-directives - self.processSubDirectives(select=('docinit', 'stylesheet')) - - # Handle Page Drawing Documents - if self.element.find('pageDrawing') is not None: - kwargs = dict(self.getAttributeValues( - select=('compression', 'debug'), - attrMapping={'compression': 'pageCompression', - 'debug': 'verbosity'} - )) - kwargs['cropMarks'] = self.cropMarks - - self.canvas = reportlab.pdfgen.canvas.Canvas(tempOutput, **kwargs) - self._initCanvas(self.canvas) - self.processSubDirectives(select=('pageInfo', 'pageDrawing')) - self.canvas.save() - - # Handle Flowable-based documents. - elif self.element.find('template') is not None: - self.processSubDirectives(select=('template', 'story')) - self.doc.beforeDocument = self._beforeDocument - self.doc.multiBuild(self.flowables, maxPasses=maxPasses) - - # Process all post processors - for name, processor in self.postProcessors: - tempOutput.seek(0) - tempOutput = processor.process(tempOutput) - - # Save the result into our real output file - tempOutput.seek(0) - outputFile.write(tempOutput.getvalue()) - - # Cleanup. - colors.toColor.setExtraColorsNameSpace({}) - reportlab.rl_config.shapeChecking = 1 - - def get_name(self, name, default=None): - if default is None: - default = u'' - - if name not in self.names: - if self.doc._indexingFlowables and isinstance( - self.doc._indexingFlowables[-1], - DummyIndexingFlowable - ): - return default - self.doc._indexingFlowables.append(DummyIndexingFlowable()) - - return self.names.get(name, default) - - -class DummyIndexingFlowable(IndexingFlowable): - """A dummy flowable to trick multiBuild into performing +1 pass.""" - - def __init__(self): - self.i = -1 - - def isSatisfied(self): - self.i += 1 - return self.i diff --git a/z3c/rml/dtd.py b/z3c/rml/dtd.py deleted file mode 100644 index f78628d5..00000000 --- a/z3c/rml/dtd.py +++ /dev/null @@ -1,76 +0,0 @@ -############################################################################## -# -# Copyright (c) 2007 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Generate a DTD from the code -""" -import zope.schema - -from z3c.rml import attr, document, occurence - -occurence2Symbol = { - occurence.ZeroOrMore: '*', - occurence.ZeroOrOne: '?', - occurence.OneOrMore: '+', - } - - -def generateElement(name, signature): - if signature is None: - return '' - # Create the list of sub-elements. - subElementList = [] - for occurence in signature.queryTaggedValue('directives', ()): - subElementList.append( - occurence.tag + occurence2Symbol.get(occurence.__class__, '') - ) - fields = zope.schema.getFieldsInOrder(signature) - for attrName, field in fields: - if isinstance(field, attr.TextNode): - subElementList.append('#PCDATA') - break - subElementList = ','.join(subElementList) - if subElementList: - subElementList = ' (' + subElementList + ')' - text = '\n' %(name, subElementList) - # Create a list of attributes for this element. - for attrName, field in fields: - # Ignore text nodes, since they are not attributes. - if isinstance(field, attr.TextNode): - continue - # Create the type - if isinstance(field, attr.Choice): - type = '(' + '|'.join(field.choices.keys()) + ')' - else: - type = 'CDATA' - # Create required flag - if field.required: - required = '#REQUIRED' - else: - required = '#IMPLIED' - # Put it all together - text += '\n' %(name, attrName, type, required) - text += '\n' - # Walk through all sub-elements, creating th eDTD entries for them. - for occurence in signature.queryTaggedValue('directives', ()): - text += generateElement(occurence.tag, occurence.signature) - return text - - -def generate(useWrapper=False): - text = generateElement('document', document.Document.signature) - if useWrapper: - text = '\n' %text - return text - -def main(): - print generate() diff --git a/z3c/rml/flowable.py b/z3c/rml/flowable.py deleted file mode 100644 index 8b139e95..00000000 --- a/z3c/rml/flowable.py +++ /dev/null @@ -1,1611 +0,0 @@ -############################################################################## -# -# Copyright (c) 2007 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Flowable Element Processing -""" -import copy -import logging -import re -import reportlab.lib.styles -import reportlab.platypus -import reportlab.platypus.doctemplate -import reportlab.platypus.flowables -import reportlab.platypus.tables -import zope.schema -from reportlab.lib import styles, utils -from xml.sax.saxutils import unescape -from z3c.rml import attr, directive, interfaces, occurence -from z3c.rml import form, platypus, special, SampleStyleSheet, stylesheet - -try: - import reportlab.graphics.barcode -except ImportError: - # barcode package has not been installed - import types - import reportlab.graphics - reportlab.graphics.barcode = types.ModuleType('barcode') - reportlab.graphics.barcode.createBarcodeDrawing = None - -# XXX:Copy of reportlab.lib.pygments2xpre.pygments2xpre to fix bug in Python 2. -def pygments2xpre(s, language="python"): - "Return markup suitable for XPreformatted" - try: - from pygments import highlight - from pygments.formatters import HtmlFormatter - except ImportError: - return s - - from pygments.lexers import get_lexer_by_name - - l = get_lexer_by_name(language) - - h = HtmlFormatter() - # XXX: Does not work in Python 2, since pygments creates non-unicode - # outpur snippets. - #from io import StringIO - from cStringIO import StringIO - out = StringIO() - highlight(s,l,h,out) - styles = [(cls, style.split(';')[0].split(':')[1].strip()) - for cls, (style, ttype, level) in h.class2style.items() - if cls and style and style.startswith('color:')] - from reportlab.lib.pygments2xpre import _2xpre - return _2xpre(out.getvalue(),styles) - - -class Flowable(directive.RMLDirective): - klass=None - attrMapping = None - - def process(self): - args = dict(self.getAttributeValues(attrMapping=self.attrMapping)) - self.parent.flow.append(self.klass(**args)) - -class ISpacer(interfaces.IRMLDirectiveSignature): - """Creates a vertical space in the flow.""" - - width = attr.Measurement( - title=u'Width', - description=u'The width of the spacer. Currently not implemented.', - default=100, - required=False) - - length = attr.Measurement( - title=u'Length', - description=u'The height of the spacer.', - required=True) - -class Spacer(Flowable): - signature = ISpacer - klass = reportlab.platypus.Spacer - attrMapping = {'length': 'height'} - - -class IIllustration(interfaces.IRMLDirectiveSignature): - """Inserts an illustration with graphics elements.""" - - width = attr.Measurement( - title=u'Width', - description=u'The width of the illustration.', - required=True) - - height = attr.Measurement( - title=u'Height', - description=u'The height of the illustration.', - default=100, - required=True) - -class Illustration(Flowable): - signature = IIllustration - klass = platypus.Illustration - - def process(self): - args = dict(self.getAttributeValues()) - self.parent.flow.append(self.klass(self, **args)) - - -class IBarCodeFlowable(form.IBarCodeBase): - """Creates a bar code as a flowable.""" - - value = attr.String( - title=u'Value', - description=u'The value represented by the code.', - required=True) - -class BarCodeFlowable(Flowable): - signature = IBarCodeFlowable - klass = staticmethod(reportlab.graphics.barcode.createBarcodeDrawing) - attrMapping = {'code': 'codeName'} - -class IPluginFlowable(interfaces.IRMLDirectiveSignature): - """Inserts a custom flowable developed in Python.""" - - module = attr.String( - title=u'Module', - description=u'The Python module in which the flowable is located.', - required=True) - - function = attr.String( - title=u'Function', - description=(u'The name of the factory function within the module ' - u'that returns the custom flowable.'), - required=True) - - params = attr.TextNode( - title=u'Parameters', - description=(u'A list of parameters encoded as a long string.'), - required=False) - -class PluginFlowable(Flowable): - signature = IPluginFlowable - - def process(self): - modulePath, functionName, text = self.getAttributeValues( - valuesOnly=True) - module = __import__(modulePath, {}, {}, [modulePath]) - function = getattr(module, functionName) - flowables = function(text) - if not isinstance(flowables, (tuple, list)): - flowables = [flowables] - self.parent.flow += list(flowables) - - -class IMinimalParagraphBase(interfaces.IRMLDirectiveSignature): - - style = attr.Style( - title=u'Style', - description=(u'The paragraph style that is applied to the paragraph. ' - u'See the ``paraStyle`` tag for creating a paragraph ' - u'style.'), - required=False) - - bulletText = attr.String( - title=u'Bullet Character', - description=(u'The bullet character is the ASCII representation of ' - u'the symbol making up the bullet in a listing.'), - required=False) - - dedent = attr.Integer( - title=u'Dedent', - description=(u'Number of characters to be removed in front of every ' - u'line of the text.'), - required=False) - - -class IBold(interfaces.IRMLDirectiveSignature): - """Renders the text inside as bold.""" - -class IItalic(interfaces.IRMLDirectiveSignature): - """Renders the text inside as italic.""" - -class IUnderLine(interfaces.IRMLDirectiveSignature): - """Underlines the contained text.""" - -class IBreak(interfaces.IRMLDirectiveSignature): - """Inserts a line break in the paragraph.""" - -class IPageNumber(interfaces.IRMLDirectiveSignature): - """Inserts the current page number into the text.""" - -class IParagraphBase(IMinimalParagraphBase): - occurence.containing( - occurence.ZeroOrMore('b', IBold), - occurence.ZeroOrMore('i', IItalic), - occurence.ZeroOrMore('u', IUnderLine), - occurence.ZeroOrMore('br', IBreak, - condition=occurence.laterThanReportlab21), - occurence.ZeroOrMore('pageNumber', IPageNumber) - ) - -class IPreformatted(IMinimalParagraphBase): - """A preformatted text, similar to the
               tag in HTML."""
              -
              -    style = attr.Style(
              -        title=u'Style',
              -        description=(u'The paragraph style that is applied to the paragraph. '
              -                     u'See the ``paraStyle`` tag for creating a paragraph '
              -                     u'style.'),
              -        default=SampleStyleSheet['Code'],
              -        required=False)
              -
              -    text = attr.RawXMLContent(
              -        title=u'Text',
              -        description=(u'The text that will be layed out.'),
              -        required=True)
              -
              -    maxLineLength = attr.Integer(
              -        title=u'Max Line Length',
              -        description=(u'The maximum number of characters on one line.'),
              -        required=False)
              -
              -    newLineChars = attr.Text(
              -        title=u'New Line Characters',
              -        description=u'The characters placed at the beginning of a wrapped line',
              -        required=False)
              -
              -class Preformatted(Flowable):
              -    signature = IPreformatted
              -    klass = reportlab.platypus.Preformatted
              -
              -class IXPreformatted(IParagraphBase):
              -    """A preformatted text that allows paragraph markup."""
              -
              -    style = attr.Style(
              -        title=u'Style',
              -        description=(u'The paragraph style that is applied to the paragraph. '
              -                     u'See the ``paraStyle`` tag for creating a paragraph '
              -                     u'style.'),
              -        default=SampleStyleSheet['Normal'],
              -        required=False)
              -
              -    text = attr.RawXMLContent(
              -        title=u'Text',
              -        description=(u'The text that will be layed out.'),
              -        required=True)
              -
              -class XPreformatted(Flowable):
              -    signature = IXPreformatted
              -    klass = reportlab.platypus.XPreformatted
              -
              -
              -class ICodeSnippet(IXPreformatted):
              -    """A code snippet with text highlighting."""
              -
              -    style = attr.Style(
              -        title=u'Style',
              -        description=(u'The paragraph style that is applied to the paragraph. '
              -                     u'See the ``paraStyle`` tag for creating a paragraph '
              -                     u'style.'),
              -        required=False)
              -
              -    language = attr.String(
              -        title=u'Language',
              -        description=u'The language the code snippet is written in.',
              -        required=False)
              -
              -class CodeSnippet(XPreformatted):
              -    signature = ICodeSnippet
              -
              -    def process(self):
              -        args = dict(self.getAttributeValues())
              -        lang = args.pop('language', None)
              -        args['text'] = unescape(args['text'])
              -        if lang is not None:
              -            args['text'] = pygments2xpre(args['text'], lang.lower())
              -        if 'style' not in args:
              -            args['style'] = attr._getStyle(self, 'Code')
              -        self.parent.flow.append(self.klass(**args))
              -
              -
              -class IParagraph(IParagraphBase, stylesheet.IBaseParagraphStyle):
              -    """Lays out an entire paragraph."""
              -
              -    text = attr.XMLContent(
              -        title=u'Text',
              -        description=(u'The text that will be layed out.'),
              -        required=True)
              -
              -class Paragraph(Flowable):
              -    signature = IParagraph
              -    klass = reportlab.platypus.Paragraph
              -    defaultStyle = 'Normal'
              -
              -    styleAttributes = zope.schema.getFieldNames(stylesheet.IBaseParagraphStyle)
              -
              -    def processStyle(self, style):
              -        attrs = []
              -        for attr in self.styleAttributes:
              -            if self.element.get(attr) is not None:
              -                attrs.append(attr)
              -        attrs = self.getAttributeValues(select=attrs)
              -        if attrs:
              -            style = copy.deepcopy(style)
              -            for name, value in attrs:
              -                setattr(style, name, value)
              -        return style
              -
              -    def process(self):
              -        args = dict(self.getAttributeValues(ignore=self.styleAttributes))
              -        if 'style' not in args:
              -            args['style'] = attr._getStyle(self, self.defaultStyle)
              -        args['style'] = self.processStyle(args['style'])
              -        self.parent.flow.append(self.klass(**args))
              -
              -
              -class ITitle(IParagraph):
              -    """The title is a simple paragraph with a special title style."""
              -
              -class Title(Paragraph):
              -    signature = ITitle
              -    defaultStyle = 'Title'
              -
              -class IHeading1(IParagraph):
              -    """Heading 1 is a simple paragraph with a special heading 1 style."""
              -
              -class Heading1(Paragraph):
              -    signature = IHeading1
              -    defaultStyle = 'Heading1'
              -
              -
              -class IHeading2(IParagraph):
              -    """Heading 2 is a simple paragraph with a special heading 2 style."""
              -
              -class Heading2(Paragraph):
              -    signature = IHeading2
              -    defaultStyle = 'Heading2'
              -
              -
              -class IHeading3(IParagraph):
              -    """Heading 3 is a simple paragraph with a special heading 3 style."""
              -
              -class Heading3(Paragraph):
              -    signature = IHeading3
              -    defaultStyle = 'Heading3'
              -
              -
              -class IHeading4(IParagraph):
              -    """Heading 4 is a simple paragraph with a special heading 4 style."""
              -
              -class Heading4(Paragraph):
              -    signature = IHeading4
              -    defaultStyle = 'Heading4'
              -
              -
              -class IHeading5(IParagraph):
              -    """Heading 5 is a simple paragraph with a special heading 5 style."""
              -
              -class Heading5(Paragraph):
              -    signature = IHeading5
              -    defaultStyle = 'Heading5'
              -
              -
              -class IHeading6(IParagraph):
              -    """Heading 6 is a simple paragraph with a special heading 6 style."""
              -
              -class Heading6(Paragraph):
              -    signature = IHeading6
              -    defaultStyle = 'Heading6'
              -
              -
              -class ITableCell(interfaces.IRMLDirectiveSignature):
              -    """A table cell within a table."""
              -
              -    content = attr.RawXMLContent(
              -        title=u'Content',
              -        description=(u'The content of the cell; can be text or any flowable.'),
              -        required=True)
              -
              -    fontName = attr.String(
              -        title=u'Font Name',
              -        description=u'The name of the font for the cell.',
              -        required=False)
              -
              -    fontSize = attr.Measurement(
              -        title=u'Font Size',
              -        description=u'The font size for the text of the cell.',
              -        required=False)
              -
              -    leading = attr.Measurement(
              -        title=u'Leading',
              -        description=(u'The height of a single text line. It includes '
              -                     u'character height.'),
              -        required=False)
              -
              -    fontColor = attr.Color(
              -        title=u'Font Color',
              -        description=u'The color in which the text will appear.',
              -        required=False)
              -
              -    leftPadding = attr.Measurement(
              -        title=u'Left Padding',
              -        description=u'The size of the padding on the left side.',
              -        required=False)
              -
              -    rightPadding = attr.Measurement(
              -        title=u'Right Padding',
              -        description=u'The size of the padding on the right side.',
              -        required=False)
              -
              -    topPadding = attr.Measurement(
              -        title=u'Top Padding',
              -        description=u'The size of the padding on the top.',
              -        required=False)
              -
              -    bottomPadding = attr.Measurement(
              -        title=u'Bottom Padding',
              -        description=u'The size of the padding on the bottom.',
              -        required=False)
              -
              -    background = attr.Color(
              -        title=u'Background Color',
              -        description=u'The color to use as the background for the cell.',
              -        required=False)
              -
              -    align = attr.Choice(
              -        title=u'Text Alignment',
              -        description=u'The text alignment within the cell.',
              -        choices=interfaces.ALIGN_TEXT_CHOICES,
              -        required=False)
              -
              -    vAlign = attr.Choice(
              -        title=u'Vertical Alignment',
              -        description=u'The vertical alignment of the text within the cell.',
              -        choices=interfaces.VALIGN_TEXT_CHOICES,
              -        required=False)
              -
              -    lineBelowThickness = attr.Measurement(
              -        title=u'Line Below Thickness',
              -        description=u'The thickness of the line below the cell.',
              -        required=False)
              -
              -    lineBelowColor = attr.Color(
              -        title=u'Line Below Color',
              -        description=u'The color of the line below the cell.',
              -        required=False)
              -
              -    lineBelowCap = attr.Choice(
              -        title=u'Line Below Cap',
              -        description=u'The cap at the end of the line below the cell.',
              -        choices=interfaces.CAP_CHOICES,
              -        required=False)
              -
              -    lineBelowCount = attr.Integer(
              -        title=u'Line Below Count',
              -        description=(u'Describes whether the line below is a single (1) or '
              -                     u'double (2) line.'),
              -        required=False)
              -
              -    lineBelowSpace = attr.Measurement(
              -        title=u'Line Below Space',
              -        description=u'The space of the line below the cell.',
              -        required=False)
              -
              -    lineAboveThickness = attr.Measurement(
              -        title=u'Line Above Thickness',
              -        description=u'The thickness of the line above the cell.',
              -        required=False)
              -
              -    lineAboveColor = attr.Color(
              -        title=u'Line Above Color',
              -        description=u'The color of the line above the cell.',
              -        required=False)
              -
              -    lineAboveCap = attr.Choice(
              -        title=u'Line Above Cap',
              -        description=u'The cap at the end of the line above the cell.',
              -        choices=interfaces.CAP_CHOICES,
              -        required=False)
              -
              -    lineAboveCount = attr.Integer(
              -        title=u'Line Above Count',
              -        description=(u'Describes whether the line above is a single (1) or '
              -                     u'double (2) line.'),
              -        required=False)
              -
              -    lineAboveSpace = attr.Measurement(
              -        title=u'Line Above Space',
              -        description=u'The space of the line above the cell.',
              -        required=False)
              -
              -    lineLeftThickness = attr.Measurement(
              -        title=u'Left Line Thickness',
              -        description=u'The thickness of the line left of the cell.',
              -        required=False)
              -
              -    lineLeftColor = attr.Color(
              -        title=u'Left Line Color',
              -        description=u'The color of the line left of the cell.',
              -        required=False)
              -
              -    lineLeftCap = attr.Choice(
              -        title=u'Line Left Cap',
              -        description=u'The cap at the end of the line left of the cell.',
              -        choices=interfaces.CAP_CHOICES,
              -        required=False)
              -
              -    lineLeftCount = attr.Integer(
              -        title=u'Line Left Count',
              -        description=(u'Describes whether the left line is a single (1) or '
              -                     u'double (2) line.'),
              -        required=False)
              -
              -    lineLeftSpace = attr.Measurement(
              -        title=u'Line Left Space',
              -        description=u'The space of the line left of the cell.',
              -        required=False)
              -
              -    lineRightThickness = attr.Measurement(
              -        title=u'Right Line Thickness',
              -        description=u'The thickness of the line right of the cell.',
              -        required=False)
              -
              -    lineRightColor = attr.Color(
              -        title=u'Right Line Color',
              -        description=u'The color of the line right of the cell.',
              -        required=False)
              -
              -    lineRightCap = attr.Choice(
              -        title=u'Line Right Cap',
              -        description=u'The cap at the end of the line right of the cell.',
              -        choices=interfaces.CAP_CHOICES,
              -        required=False)
              -
              -    lineRightCount = attr.Integer(
              -        title=u'Line Right Count',
              -        description=(u'Describes whether the right line is a single (1) or '
              -                     u'double (2) line.'),
              -        required=False)
              -
              -    lineRightSpace = attr.Measurement(
              -        title=u'Line Right Space',
              -        description=u'The space of the line right of the cell.',
              -        required=False)
              -
              -    href = attr.Text(
              -        title=u'Link URL',
              -        description=u'When specified, the cell becomes a link to that URL.',
              -        required=False)
              -
              -    destination = attr.Text(
              -        title=u'Link Destination',
              -        description=(u'When specified, the cell becomes a link to that '
              -                     u'destination.'),
              -        required=False)
              -
              -
              -class TableCell(directive.RMLDirective):
              -    signature = ITableCell
              -    styleAttributesMapping = (
              -        ('FONTNAME', ('fontName',)),
              -        ('FONTSIZE', ('fontSize',)),
              -        ('TEXTCOLOR', ('fontColor',)),
              -        ('LEADING', ('leading',)),
              -        ('LEFTPADDING', ('leftPadding',)),
              -        ('RIGHTPADDING', ('rightPadding',)),
              -        ('TOPPADDING', ('topPadding',)),
              -        ('BOTTOMPADDING', ('bottomPadding',)),
              -        ('BACKGROUND', ('background',)),
              -        ('ALIGNMENT', ('align',)),
              -        ('VALIGN', ('vAlign',)),
              -        ('LINEBELOW', ('lineBelowThickness', 'lineBelowColor',
              -                       'lineBelowCap', 'lineBelowCount', 'lineBelowSpace')),
              -        ('LINEABOVE', ('lineAboveThickness', 'lineAboveColor',
              -                       'lineAboveCap', 'lineAboveCount', 'lineAboveSpace')),
              -        ('LINEBEFORE', ('lineLeftThickness', 'lineLeftColor',
              -                        'lineLeftCap', 'lineLeftCount', 'lineLeftSpace')),
              -        ('LINEAFTER', ('lineRightThickness', 'lineRightColor',
              -                       'lineRightCap', 'lineRightCount', 'lineRightSpace')),
              -        ('HREF', ('href',)),
              -        ('DESTINATION', ('destination',)),
              -        )
              -
              -    def processStyle(self):
              -        row = len(self.parent.parent.rows)
              -        col = len(self.parent.cols)
              -        for styleAction, attrNames in self.styleAttributesMapping:
              -            attrs = []
              -            for attr in attrNames:
              -                if self.element.get(attr) is not None:
              -                    attrs.append(attr)
              -            if not attrs:
              -                continue
              -            args = self.getAttributeValues(select=attrs, valuesOnly=True)
              -            if args:
              -                self.parent.parent.style.add(
              -                    styleAction, [col, row], [col, row], *args)
              -
              -    def process(self):
              -        # Produce style
              -        self.processStyle()
              -        # Produce cell data
              -        flow = Flow(self.element, self.parent)
              -        flow.process()
              -        content = flow.flow
              -        if len(content) == 0:
              -            content = self.getAttributeValues(
              -                select=('content',), valuesOnly=True)[0]
              -        self.parent.cols.append(content)
              -
              -
              -class ITableRow(interfaces.IRMLDirectiveSignature):
              -    """A table row in the block table."""
              -    occurence.containing(
              -        occurence.OneOrMore('td', ITableCell),
              -        )
              -
              -class TableRow(directive.RMLDirective):
              -    signature = ITableRow
              -    factories = {'td': TableCell}
              -
              -    def process(self):
              -        self.cols = []
              -        self.processSubDirectives()
              -        self.parent.rows.append(self.cols)
              -
              -
              -class ITableBulkData(interfaces.IRMLDirectiveSignature):
              -    """Bulk Data allows one to quickly create a table."""
              -
              -    content = attr.TextNodeSequence(
              -        title=u'Content',
              -        description=u'The bulk data.',
              -        splitre=re.compile('\n'),
              -        value_type=attr.Sequence(splitre=re.compile(','),
              -                                 value_type=attr.Text())
              -        )
              -
              -class TableBulkData(directive.RMLDirective):
              -    signature = ITableBulkData
              -
              -    def process(self):
              -        self.parent.rows = self.getAttributeValues(valuesOnly=True)[0]
              -
              -
              -class BlockTableStyle(stylesheet.BlockTableStyle):
              -
              -    def process(self):
              -        self.style = copy.deepcopy(self.parent.style)
              -        attrs = self.getAttributeValues()
              -        for name, value in attrs:
              -            setattr(self.style, name, value)
              -        self.processSubDirectives()
              -        self.parent.style = self.style
              -
              -
              -class IBlockTable(interfaces.IRMLDirectiveSignature):
              -    """A typical block table."""
              -    occurence.containing(
              -        occurence.ZeroOrMore('tr', ITableRow),
              -        occurence.ZeroOrOne('bulkData', ITableBulkData),
              -        occurence.ZeroOrMore('blockTableStyle', stylesheet.IBlockTableStyle),
              -        )
              -
              -    style = attr.Style(
              -        title=u'Style',
              -        description=(u'The table style that is applied to the table. '),
              -        required=False)
              -
              -    rowHeights = attr.Sequence(
              -        title=u'Row Heights',
              -        description=u'A list of row heights in the table.',
              -        value_type=attr.Measurement(),
              -        required=False)
              -
              -    colWidths = attr.Sequence(
              -        title=u'Column Widths',
              -        description=u'A list of column widths in the table.',
              -        value_type=attr.Measurement(allowPercentage=True, allowStar=True),
              -        required=False)
              -
              -    repeatRows = attr.Integer(
              -        title=u'Repeat Rows',
              -        description=u'A flag to repeat rows upon table splits.',
              -        required=False)
              -
              -    alignment = attr.Choice(
              -        title=u'Alignment',
              -        description=u'The alignment of whole table.',
              -        choices=interfaces.ALIGN_TEXT_CHOICES,
              -        required=False)
              -
              -class BlockTable(Flowable):
              -    signature = IBlockTable
              -    klass = reportlab.platypus.Table
              -    factories = {
              -        'tr': TableRow,
              -        'bulkData': TableBulkData,
              -        'blockTableStyle': BlockTableStyle}
              -
              -    def process(self):
              -        attrs = dict(self.getAttributeValues())
              -        # Get the table style; create a new one, if none is found
              -        style = attrs.pop('style', None)
              -        if style is None:
              -            self.style = reportlab.platypus.tables.TableStyle()
              -        else:
              -            self.style = copy.deepcopy(style)
              -        hAlign = attrs.pop('alignment', None)
              -        # Extract all table rows and cells
              -        self.rows = []
              -        self.processSubDirectives(None)
              -        # Create the table
              -        repeatRows = attrs.pop('repeatRows', None)
              -        table = self.klass(self.rows, style=self.style, **attrs)
              -        if repeatRows:
              -            table.repeatRows = repeatRows
              -        if hAlign:
              -            table.hAlign = hAlign
              -        # Must set keepWithNext on table, since the style is not stored corr.
              -        if hasattr(self.style, 'keepWithNext'):
              -            table.keepWithNext = self.style.keepWithNext
              -        self.parent.flow.append(table)
              -
              -
              -class INextFrame(interfaces.IRMLDirectiveSignature):
              -    """Switch to the next frame."""
              -    name = attr.StringOrInt(
              -        title=u'Name',
              -        description=(u'The name or index of the next frame.'),
              -        required=False)
              -
              -class NextFrame(Flowable):
              -    signature = INextFrame
              -    klass = reportlab.platypus.doctemplate.FrameBreak
              -    attrMapping = {'name': 'ix'}
              -
              -
              -class ISetNextFrame(interfaces.IRMLDirectiveSignature):
              -    """Define the next frame to switch to."""
              -    name = attr.StringOrInt(
              -        title=u'Name',
              -        description=(u'The name or index of the next frame.'),
              -        required=True)
              -
              -class SetNextFrame(Flowable):
              -    signature = INextFrame
              -    klass = reportlab.platypus.doctemplate.NextFrameFlowable
              -    attrMapping = {'name': 'ix'}
              -
              -
              -class INextPage(interfaces.IRMLDirectiveSignature):
              -    """Switch to the next page."""
              -
              -class NextPage(Flowable):
              -    signature = INextPage
              -    klass = reportlab.platypus.PageBreak
              -
              -
              -class ISetNextTemplate(interfaces.IRMLDirectiveSignature):
              -    """Define the next page template to use."""
              -    name = attr.StringOrInt(
              -        title=u'Name',
              -        description=u'The name or index of the next page template.',
              -        required=True)
              -
              -class SetNextTemplate(Flowable):
              -    signature = ISetNextTemplate
              -    klass = reportlab.platypus.doctemplate.NextPageTemplate
              -    attrMapping = {'name': 'pt'}
              -
              -
              -class IConditionalPageBreak(interfaces.IRMLDirectiveSignature):
              -    """Switch to the next page if not enough vertical space is available."""
              -    height = attr.Measurement(
              -        title=u'height',
              -        description=u'The minimal height that must be remaining on the page.',
              -        required=True)
              -
              -class ConditionalPageBreak(Flowable):
              -    signature = IConditionalPageBreak
              -    klass = reportlab.platypus.CondPageBreak
              -
              -
              -class IKeepInFrame(interfaces.IRMLDirectiveSignature):
              -    """Ask a flowable to stay within the frame."""
              -
              -    maxWidth = attr.Measurement(
              -        title=u'Maximum Width',
              -        description=u'The maximum width the flowables are allotted.',
              -        default=None,
              -        required=False)
              -
              -    maxHeight = attr.Measurement(
              -        title=u'Maximum Height',
              -        description=u'The maximum height the flowables are allotted.',
              -        default=None,
              -        required=False)
              -
              -    mergeSpace = attr.Boolean(
              -        title=u'Merge Space',
              -        description=u'A flag to set whether the space should be merged.',
              -        required=False)
              -
              -    onOverflow = attr.Choice(
              -        title=u'On Overflow',
              -        description=u'Defines what has to be done, if an overflow is detected.',
              -        choices=('error', 'overflow', 'shrink', 'truncate'),
              -        required=False)
              -
              -    id = attr.Text(
              -        title=u'Name/Id',
              -        description=u'The name/id of the flowable.',
              -        required=False)
              -
              -    frame = attr.StringOrInt(
              -        title=u'Frame',
              -        description=u'The frame to which the flowable should be fitted.',
              -        required=False)
              -
              -class KeepInFrame(Flowable):
              -    signature = IKeepInFrame
              -    klass = platypus.KeepInFrame
              -    attrMapping = {'onOverflow': 'mode', 'id': 'name'}
              -
              -    def process(self):
              -        args = dict(self.getAttributeValues(attrMapping=self.attrMapping))
              -        # Circumvent broken-ness in zope.schema
              -        args['maxWidth'] = args.get('maxWidth', None)
              -        args['maxHeight'] = args.get('maxHeight', None)
              -        # If the frame was specifed, get us there
              -        frame = args.pop('frame', None)
              -        if frame:
              -            self.parent.flow.append(
              -                reportlab.platypus.doctemplate.FrameBreak(frame))
              -        # Create the content of the container
              -        flow = Flow(self.element, self.parent)
              -        flow.process()
              -        args['content'] = flow.flow
              -        # Create the keep in frame container
              -        frame = self.klass(**args)
              -        self.parent.flow.append(frame)
              -
              -class IKeepTogether(interfaces.IRMLDirectiveSignature):
              -    """Keep the child flowables in the same frame. Add frame break when
              -    necessary."""
              -
              -    maxHeight = attr.Measurement(
              -        title=u'Maximum Height',
              -        description=u'The maximum height the flowables are allotted.',
              -        default=None,
              -        required=False)
              -
              -class KeepTogether(Flowable):
              -    signature = IKeepTogether
              -    klass = reportlab.platypus.flowables.KeepTogether
              -
              -    def process(self):
              -        args = dict(self.getAttributeValues())
              -
              -        # Create the content of the container
              -        flow = Flow(self.element, self.parent)
              -        flow.process()
              -
              -        # Create the keep in frame container
              -        frame = self.klass(flow.flow, **args)
              -        self.parent.flow.append(frame)
              -
              -class IImage(interfaces.IRMLDirectiveSignature):
              -    """An image."""
              -
              -    src = attr.Image(
              -        title=u'Image Source',
              -        description=u'The file that is used to extract the image data.',
              -        onlyOpen=True,
              -        required=True)
              -
              -    width = attr.Measurement(
              -        title=u'Image Width',
              -        description=u'The width of the image.',
              -        required=False)
              -
              -    height = attr.Measurement(
              -        title=u'Image Height',
              -        description=u'The height the image.',
              -        required=False)
              -
              -    preserveAspectRatio = attr.Boolean(
              -        title=u'Preserve Aspect Ratio',
              -        description=(u'If set, the aspect ratio of the image is kept. When '
              -                     u'both, width and height, are specified, the image '
              -                     u'will be fitted into that bounding box.'),
              -        default=False,
              -        required=False)
              -
              -    mask = attr.Color(
              -        title=u'Mask',
              -        description=u'The color mask used to render the image.',
              -        required=False)
              -
              -    align = attr.Choice(
              -        title=u'Alignment',
              -        description=u'The alignment of the image within the frame.',
              -        choices=interfaces.ALIGN_TEXT_CHOICES,
              -        required=False)
              -
              -    vAlign = attr.Choice(
              -        title=u'Vertical Alignment',
              -        description=u'The vertical alignment of the image.',
              -        choices=interfaces.VALIGN_TEXT_CHOICES,
              -        required=False)
              -
              -class Image(Flowable):
              -    signature = IImage
              -    klass = reportlab.platypus.flowables.Image
              -    attrMapping = {'src': 'filename', 'align': 'hAlign'}
              -
              -    def process(self):
              -        args = dict(self.getAttributeValues(attrMapping=self.attrMapping))
              -        preserveAspectRatio = args.pop('preserveAspectRatio', False)
              -        if preserveAspectRatio:
              -            img = utils.ImageReader(args['filename'])
              -            args['filename'].seek(0)
              -            iw, ih = img.getSize()
              -            if 'width' in args and 'height' not in args:
              -                args['height'] = args['width'] * ih / iw
              -            elif 'width' not in args and 'height' in args:
              -                args['width'] = args['height'] * iw / ih
              -            elif 'width' in args and 'height' in args:
              -                # In this case, the width and height specify a bounding box
              -                # and the size of the image within that box is maximized.
              -                if args['width'] * ih / iw <= args['height']:
              -                    args['height'] = args['width'] * ih / iw
              -                elif args['height'] * iw / ih < args['width']:
              -                    args['width'] = args['height'] * iw / ih
              -                else:
              -                    # This should not happen.
              -                    raise ValueError('Cannot keep image in bounding box.')
              -            else:
              -                # No size was specified, so do nothing.
              -                pass
              -
              -        vAlign = args.pop('vAlign', None)
              -        hAlign = args.pop('hAlign', None)
              -        img = self.klass(**args)
              -        if hAlign:
              -            img.hAlign = hAlign
              -        if vAlign:
              -            img.vAlign = vAlign
              -        self.parent.flow.append(img)
              -
              -
              -class IImageAndFlowables(interfaces.IRMLDirectiveSignature):
              -    """An image with flowables around it."""
              -
              -    imageName = attr.Image(
              -        title=u'Image',
              -        description=u'The file that is used to extract the image data.',
              -        onlyOpen=True,
              -        required=True)
              -
              -    imageWidth = attr.Measurement(
              -        title=u'Image Width',
              -        description=u'The width of the image.',
              -        required=False)
              -
              -    imageHeight = attr.Measurement(
              -        title=u'Image Height',
              -        description=u'The height the image.',
              -        required=False)
              -
              -    imageMask = attr.Color(
              -        title=u'Mask',
              -        description=u'The height the image.',
              -        required=False)
              -
              -    imageLeftPadding = attr.Measurement(
              -        title=u'Image Left Padding',
              -        description=u'The padding on the left side of the image.',
              -        required=False)
              -
              -    imageRightPadding = attr.Measurement(
              -        title=u'Image Right Padding',
              -        description=u'The padding on the right side of the image.',
              -        required=False)
              -
              -    imageTopPadding = attr.Measurement(
              -        title=u'Image Top Padding',
              -        description=u'The padding on the top of the image.',
              -        required=False)
              -
              -    imageBottomPadding = attr.Measurement(
              -        title=u'Image Bottom Padding',
              -        description=u'The padding on the bottom of the image.',
              -        required=False)
              -
              -    imageSide = attr.Choice(
              -        title=u'Image Side',
              -        description=u'The side at which the image will be placed.',
              -        choices=('left', 'right'),
              -        required=False)
              -
              -class ImageAndFlowables(Flowable):
              -    signature = IImageAndFlowables
              -    klass = reportlab.platypus.flowables.ImageAndFlowables
              -    attrMapping = {'imageWidth': 'width', 'imageHeight': 'height',
              -                   'imageMask': 'mask', 'imageName': 'filename'}
              -
              -    def process(self):
              -        flow = Flow(self.element, self.parent)
              -        flow.process()
              -        # Create the image
              -        args = dict(self.getAttributeValues(
              -            select=('imageName', 'imageWidth', 'imageHeight', 'imageMask'),
              -            attrMapping=self.attrMapping))
              -        img = reportlab.platypus.flowables.Image(**args)
              -        # Create the flowable and add it
              -        args = dict(self.getAttributeValues(
              -            ignore=('imageName', 'imageWidth', 'imageHeight', 'imageMask'),
              -            attrMapping=self.attrMapping))
              -        self.parent.flow.append(
              -            self.klass(img, flow.flow, **args))
              -
              -
              -class IPTO(interfaces.IRMLDirectiveSignature):
              -    '''A container for flowables decorated with trailer & header lists.
              -    If the split operation would be called then the trailer and header
              -    lists are injected before and after the split. This allows specialist
              -    "please turn over" and "continued from previous" like behaviours.'''
              -
              -class PTO(Flowable):
              -    signature = IPTO
              -    klass = reportlab.platypus.flowables.PTOContainer
              -
              -    def process(self):
              -        # Get Content
              -        flow = Flow(self.element, self.parent)
              -        flow.process()
              -        # Get the header
              -        ptoHeader = self.element.find('pto_header')
              -        header = None
              -        if ptoHeader is not None:
              -            header = Flow(ptoHeader, self.parent)
              -            header.process()
              -            header = header.flow
              -        # Get the trailer
              -        ptoTrailer = self.element.find('pto_trailer')
              -        trailer = None
              -        if ptoTrailer is not None:
              -            trailer = Flow(ptoTrailer, self.parent)
              -            trailer.process()
              -            trailer = trailer.flow
              -        # Create and add the PTO Container
              -        self.parent.flow.append(self.klass(flow.flow, trailer, header))
              -
              -
              -class IIndent(interfaces.IRMLDirectiveSignature):
              -    """Indent the contained flowables."""
              -
              -    left = attr.Measurement(
              -        title=u'Left',
              -        description=u'The indentation to the left.',
              -        required=False)
              -
              -    right = attr.Measurement(
              -        title=u'Right',
              -        description=u'The indentation to the right.',
              -        required=False)
              -
              -class Indent(Flowable):
              -    signature = IIndent
              -
              -    def process(self):
              -        kw = dict(self.getAttributeValues())
              -        # Indent
              -        self.parent.flow.append(reportlab.platypus.doctemplate.Indenter(**kw))
              -        # Add Content
              -        flow = Flow(self.element, self.parent)
              -        flow.process()
              -        self.parent.flow += flow.flow
              -        # Dedent
              -        for name, value in kw.items():
              -            kw[name] = -value
              -        self.parent.flow.append(reportlab.platypus.doctemplate.Indenter(**kw))
              -
              -
              -class IFixedSize(interfaces.IRMLDirectiveSignature):
              -    """Create a container flowable of a fixed size."""
              -
              -    width = attr.Measurement(
              -        title=u'Width',
              -        description=u'The width the flowables are allotted.',
              -        required=True)
              -
              -    height = attr.Measurement(
              -        title=u'Height',
              -        description=u'The height the flowables are allotted.',
              -        required=True)
              -
              -class FixedSize(Flowable):
              -    signature = IFixedSize
              -    klass = reportlab.platypus.flowables.KeepInFrame
              -    attrMapping = {'width': 'maxWidth', 'height': 'maxHeight'}
              -
              -    def process(self):
              -        flow = Flow(self.element, self.parent)
              -        flow.process()
              -        args = dict(self.getAttributeValues(attrMapping=self.attrMapping))
              -        frame = self.klass(content=flow.flow, mode='shrink', **args)
              -        self.parent.flow.append(frame)
              -
              -
              -class IBookmarkPage(interfaces.IRMLDirectiveSignature):
              -    """
              -    This creates a bookmark to the current page which can be referred to with
              -    the given key elsewhere.
              -
              -    PDF offers very fine grained control over how Acrobat reader is zoomed
              -    when people link to this. The default is to keep the user's current zoom
              -    settings. the last arguments may or may not be needed depending on the
              -    choice of 'fitType'.
              -    """
              -
              -    name = attr.Text(
              -        title=u'Name',
              -        description=u'The name of the bookmark.',
              -        required=True)
              -
              -    fit = attr.Choice(
              -        title=u'Fit',
              -        description=u'The Fit Type.',
              -        choices=('XYZ', 'Fit', 'FitH', 'FitV', 'FitR'),
              -        required=False)
              -
              -    top = attr.Measurement(
              -        title=u'Top',
              -        description=u'The top position.',
              -        required=False)
              -
              -    bottom = attr.Measurement(
              -        title=u'Bottom',
              -        description=u'The bottom position.',
              -        required=False)
              -
              -    left = attr.Measurement(
              -        title=u'Left',
              -        description=u'The left position.',
              -        required=False)
              -
              -    right = attr.Measurement(
              -        title=u'Right',
              -        description=u'The right position.',
              -        required=False)
              -
              -    zoom = attr.Float(
              -        title=u'Zoom',
              -        description=u'The zoom level when clicking on the bookmark.',
              -        required=False)
              -
              -class BookmarkPage(Flowable):
              -    signature = IBookmarkPage
              -    klass = platypus.BookmarkPage
              -    attrMapping = {'name': 'key', 'fitType': 'fit'}
              -
              -
              -class IBookmark(interfaces.IRMLDirectiveSignature):
              -    """
              -    This creates a bookmark to the current page which can be referred to with
              -    the given key elsewhere. (Used inside a story.)
              -    """
              -
              -    name = attr.Text(
              -        title=u'Name',
              -        description=u'The name of the bookmark.',
              -        required=True)
              -
              -    x = attr.Measurement(
              -        title=u'X Coordinate',
              -        description=u'The x-position of the bookmark.',
              -        default=0,
              -        required=False)
              -
              -    y = attr.Measurement(
              -        title=u'Y Coordinate',
              -        description=u'The y-position of the bookmark.',
              -        default=0,
              -        required=False)
              -
              -class Bookmark(Flowable):
              -    signature = IBookmark
              -    klass = platypus.Bookmark
              -    attrMapping = {'name': 'key', 'x': 'relativeX', 'y': 'relativeY'}
              -
              -
              -class ILink(interfaces.IRMLDirectiveSignature):
              -    """Place an internal link around a set of flowables."""
              -
              -    destination = attr.Text(
              -        title=u'Destination',
              -        description=u'The name of the destination to link to.',
              -        required=False)
              -
              -    url = attr.Text(
              -        title=u'URL',
              -        description=u'The URL to link to.',
              -        required=False)
              -
              -    boxStrokeWidth = attr.Measurement(
              -        title=u'Box Stroke Width',
              -        description=u'The width of the box border line.',
              -        required=False)
              -
              -    boxStrokeDashArray = attr.Sequence(
              -        title=u'Box Stroke Dash Array',
              -        description=u'The dash array of the box border line.',
              -        value_type=attr.Float(),
              -        required=False)
              -
              -    boxStrokeColor = attr.Color(
              -        title=u'Box Stroke Color',
              -        description=(u'The color in which the box border is drawn.'),
              -        required=False)
              -
              -
              -class Link(Flowable):
              -    signature = ILink
              -    attrMapping = {'destination': 'destinationname',
              -                   'boxStrokeWidth': 'thickness',
              -                   'boxStrokeDashArray': 'dashArray',
              -                   'boxStrokeColor': 'color'}
              -
              -    def process(self):
              -        flow = Flow(self.element, self.parent)
              -        flow.process()
              -        args = dict(self.getAttributeValues(attrMapping=self.attrMapping))
              -        self.parent.flow.append(platypus.Link(flow.flow, **args))
              -
              -
              -class IHorizontalRow(interfaces.IRMLDirectiveSignature):
              -    """Create a horizontal line on the page."""
              -
              -    width = attr.Measurement(
              -        title=u'Width',
              -        description=u'The width of the line on the page.',
              -        allowPercentage=True,
              -        required=False)
              -
              -    thickness = attr.Measurement(
              -        title=u'Thickness',
              -        description=u'Line Thickness',
              -        required=False)
              -
              -    color = attr.Color(
              -        title=u'Color',
              -        description=u'The color of the line.',
              -        required=False)
              -
              -    lineCap = attr.Choice(
              -        title=u'Cap',
              -        description=u'The cap at the end of the line.',
              -        choices=interfaces.CAP_CHOICES.keys(),
              -        required=False)
              -
              -    spaceBefore = attr.Measurement(
              -        title=u'Space Before',
              -        description=u'The vertical space before the line.',
              -        required=False)
              -
              -    spaceAfter = attr.Measurement(
              -        title=u'Space After',
              -        description=u'The vertical space after the line.',
              -        required=False)
              -
              -    align = attr.Choice(
              -        title=u'Alignment',
              -        description=u'The alignment of the line within the frame.',
              -        choices=interfaces.ALIGN_TEXT_CHOICES,
              -        required=False)
              -
              -    valign = attr.Choice(
              -        title=u'Vertical Alignment',
              -        description=u'The vertical alignment of the line.',
              -        choices=interfaces.VALIGN_TEXT_CHOICES,
              -        required=False)
              -
              -    dash = attr.Sequence(
              -        title=u'Dash-Pattern',
              -        description=u'The dash-pattern of a line.',
              -        value_type=attr.Measurement(),
              -        default=None,
              -        required=False)
              -
              -class HorizontalRow(Flowable):
              -    signature = IHorizontalRow
              -    klass = reportlab.platypus.flowables.HRFlowable
              -    attrMapping = {'align': 'hAlign'}
              -
              -
              -class IOutlineAdd(interfaces.IRMLDirectiveSignature):
              -    """Add a new entry to the outline of the PDF."""
              -
              -    title = attr.TextNode(
              -        title=u'Title',
              -        description=u'The text displayed for this item.',
              -        required=True)
              -
              -    key = attr.String(
              -        title=u'Key',
              -        description=u'The unique key of the item.',
              -        required=False)
              -
              -    level = attr.Integer(
              -        title=u'Level',
              -        description=u'The level in the outline tree.',
              -        required=False)
              -
              -    closed = attr.Boolean(
              -        title=u'Closed',
              -        description=(u'A flag to determine whether the sub-tree is closed '
              -                     u'by default.'),
              -        required=False)
              -
              -
              -class OutlineAdd(Flowable):
              -    signature = IOutlineAdd
              -    klass = platypus.OutlineAdd
              -
              -
              -class NamedStringFlowable(reportlab.platypus.flowables.Flowable,
              -                          special.TextFlowables):
              -
              -    def __init__(self, manager, id, value):
              -        reportlab.platypus.flowables.Flowable.__init__(self)
              -        self.manager = manager
              -        self.id = id
              -        self._value = value
              -        self.value = u''
              -
              -    def wrap(self, *args):
              -        return (0, 0)
              -
              -    def draw(self):
              -        text = self._getText(self._value, self.manager.canvas,
              -                             include_final_tail=False)
              -        self.manager.names[self.id] = text
              -
              -
              -class INamedString(interfaces.IRMLDirectiveSignature):
              -    """Defines a name for a string."""
              -
              -    id = attr.String(
              -        title=u'Id',
              -        description=u'The id under which the value will be known.',
              -        required=True)
              -
              -    value = attr.XMLContent(
              -        title=u'Value',
              -        description=u'The text that is displayed if the id is called.',
              -        required=True)
              -
              -class NamedString(directive.RMLDirective):
              -    signature = INamedString
              -
              -    def process(self):
              -        id, value = self.getAttributeValues(valuesOnly=True)
              -        manager = attr.getManager(self)
              -        # We have to delay assigning values, otherwise the last one wins.
              -        self.parent.flow.append(NamedStringFlowable(manager, id, self.element))
              -
              -
              -class IShowIndex(interfaces.IRMLDirectiveSignature):
              -    """Creates an index in the document."""
              -
              -    name = attr.String(
              -        title=u'Name',
              -        description=u'The name of the index.',
              -        default='index',
              -        required=False)
              -
              -    dot = attr.String(
              -        title=u'Dot',
              -        description=u'The character to use as a dot.',
              -        required=False)
              -
              -    style = attr.Style(
              -        title=u'Style',
              -        description=u'The paragraph style that is applied to the index. ',
              -        required=False)
              -
              -    tableStyle = attr.Style(
              -        title=u'Table Style',
              -        description=u'The table style that is applied to the index layout. ',
              -        required=False)
              -
              -class ShowIndex(directive.RMLDirective):
              -    signature = IShowIndex
              -
              -    def process(self):
              -        args = dict(self.getAttributeValues())
              -        manager = attr.getManager(self)
              -        index = manager.indexes[args['name']]
              -        args['format'] = index.formatFunc.__name__[8:]
              -        args['offset'] = index.offset
              -        index.setup(**args)
              -        self.parent.flow.append(index)
              -
              -
              -class IBaseLogCall(interfaces.IRMLDirectiveSignature):
              -
              -    message = attr.RawXMLContent(
              -        title=u'Message',
              -        description=u'The message to be logged.',
              -        required=True)
              -
              -class LogCallFlowable(reportlab.platypus.flowables.Flowable):
              -
              -    def __init__(self, logger, level, message):
              -        self.logger = logger
              -        self.level = level
              -        self.message = message
              -
              -    def wrap(self, *args):
              -        return (0, 0)
              -
              -    def draw(self):
              -        self.logger.log(self.level, self.message)
              -
              -class BaseLogCall(directive.RMLDirective):
              -    signature = IBaseLogCall
              -    level = None
              -
              -    def process(self):
              -        message = self.getAttributeValues(
              -            select=('message',), valuesOnly=True)[0]
              -        manager = attr.getManager(self)
              -        self.parent.flow.append(
              -            LogCallFlowable(manager.logger, self.level, message))
              -
              -class ILog(IBaseLogCall):
              -    """Log message at DEBUG level."""
              -
              -    level = attr.Choice(
              -        title=u'Level',
              -        description=u'The default log level.',
              -        choices=interfaces.LOG_LEVELS,
              -        doLower=False,
              -        default=logging.INFO,
              -        required=True)
              -
              -class Log(BaseLogCall):
              -    signature = ILog
              -
              -    @property
              -    def level(self):
              -        return self.getAttributeValues(select=('level',), valuesOnly=True)[0]
              -
              -class IDebug(IBaseLogCall):
              -    """Log message at DEBUG level."""
              -
              -class Debug(BaseLogCall):
              -    signature = IDebug
              -    level = logging.DEBUG
              -
              -
              -class IInfo(IBaseLogCall):
              -    """Log message at INFO level."""
              -
              -class Info(BaseLogCall):
              -    signature = IInfo
              -    level = logging.INFO
              -
              -
              -class IWarning(IBaseLogCall):
              -    """Log message at WARNING level."""
              -
              -class Warning(BaseLogCall):
              -    signature = IWarning
              -    level = logging.WARNING
              -
              -
              -class IError(IBaseLogCall):
              -    """Log message at ERROR level."""
              -
              -class Error(BaseLogCall):
              -    signature = IError
              -    level = logging.ERROR
              -
              -
              -class ICritical(IBaseLogCall):
              -    """Log message at CRITICAL level."""
              -
              -class Critical(BaseLogCall):
              -    signature = ICritical
              -    level = logging.CRITICAL
              -
              -
              -class IFlow(interfaces.IRMLDirectiveSignature):
              -    """A list of flowables."""
              -    occurence.containing(
              -        occurence.ZeroOrMore('spacer', ISpacer),
              -        occurence.ZeroOrMore('illustration', IIllustration),
              -        occurence.ZeroOrMore('pre', IPreformatted),
              -        occurence.ZeroOrMore('xpre', IXPreformatted),
              -        occurence.ZeroOrMore('codesnippet', ICodeSnippet),
              -        occurence.ZeroOrMore('plugInFlowable', IPluginFlowable),
              -        occurence.ZeroOrMore('barCodeFlowable', IBarCodeFlowable),
              -        occurence.ZeroOrMore('outlineAdd', IOutlineAdd),
              -        occurence.ZeroOrMore('title', ITitle),
              -        occurence.ZeroOrMore('h1', IHeading1),
              -        occurence.ZeroOrMore('h2', IHeading2),
              -        occurence.ZeroOrMore('h3', IHeading3),
              -        occurence.ZeroOrMore('h4', IHeading4),
              -        occurence.ZeroOrMore('h5', IHeading5),
              -        occurence.ZeroOrMore('h6', IHeading6),
              -        occurence.ZeroOrMore('para', IParagraph),
              -        occurence.ZeroOrMore('blockTable', IBlockTable),
              -        occurence.ZeroOrMore('nextFrame', INextFrame),
              -        occurence.ZeroOrMore('setNextFrame', ISetNextFrame),
              -        occurence.ZeroOrMore('nextPage', INextPage),
              -        occurence.ZeroOrMore('setNextTemplate', ISetNextTemplate),
              -        occurence.ZeroOrMore('condPageBreak', IConditionalPageBreak),
              -        occurence.ZeroOrMore('keepInFrame', IKeepInFrame),
              -        occurence.ZeroOrMore('keepTogether', IKeepTogether),
              -        occurence.ZeroOrMore('img', IImage),
              -        occurence.ZeroOrMore('imageAndFlowables', IImageAndFlowables),
              -        occurence.ZeroOrMore('pto', IPTO),
              -        occurence.ZeroOrMore('indent', IIndent),
              -        occurence.ZeroOrMore('fixedSize', IFixedSize),
              -        occurence.ZeroOrMore('bookmarkPage', IBookmarkPage),
              -        occurence.ZeroOrMore('bookmark', IBookmark),
              -        occurence.ZeroOrMore('link', ILink),
              -        occurence.ZeroOrMore('hr', IHorizontalRow),
              -        occurence.ZeroOrMore('showIndex', IShowIndex),
              -        occurence.ZeroOrMore('name', special.IName),
              -        occurence.ZeroOrMore('namedString', INamedString),
              -        occurence.ZeroOrMore('log', ILog),
              -        occurence.ZeroOrMore('debug', IDebug),
              -        occurence.ZeroOrMore('info', IInfo),
              -        occurence.ZeroOrMore('warning', IWarning),
              -        occurence.ZeroOrMore('error', IError),
              -        occurence.ZeroOrMore('critical', ICritical),
              -        )
              -
              -class Flow(directive.RMLDirective):
              -
              -    factories = {
              -        # Generic Flowables
              -        'spacer': Spacer,
              -        'illustration': Illustration,
              -        'pre': Preformatted,
              -        'xpre': XPreformatted,
              -        'codesnippet': CodeSnippet,
              -        'plugInFlowable': PluginFlowable,
              -        'barCodeFlowable': BarCodeFlowable,
              -        'outlineAdd': OutlineAdd,
              -        # Paragraph-Like Flowables
              -        'title': Title,
              -        'h1': Heading1,
              -        'h2': Heading2,
              -        'h3': Heading3,
              -        'h4': Heading4,
              -        'h5': Heading5,
              -        'h6': Heading6,
              -        'para': Paragraph,
              -        # Table Flowable
              -        'blockTable': BlockTable,
              -        # Page-level Flowables
              -        'nextFrame': NextFrame,
              -        'setNextFrame': SetNextFrame,
              -        'nextPage': NextPage,
              -        'setNextTemplate': SetNextTemplate,
              -        'condPageBreak': ConditionalPageBreak,
              -        'keepInFrame': KeepInFrame,
              -        'keepTogether': KeepTogether,
              -        'img': Image,
              -        'imageAndFlowables': ImageAndFlowables,
              -        'pto': PTO,
              -        'indent': Indent,
              -        'fixedSize': FixedSize,
              -        'bookmarkPage': BookmarkPage,
              -        'bookmark': Bookmark,
              -        'link': Link,
              -        'hr': HorizontalRow,
              -        'showIndex': ShowIndex,
              -        # Special Elements
              -        'name': special.Name,
              -        'namedString': NamedString,
              -        # Logging
              -        'log': Log,
              -        'debug': Debug,
              -        'info': Info,
              -        'warning': Warning,
              -        'error': Error,
              -        'critical': Critical,
              -        }
              -
              -    def __init__(self, *args, **kw):
              -        super(Flow, self).__init__(*args, **kw)
              -        self.flow = []
              -
              -    def process(self):
              -        self.processSubDirectives()
              -        return self.flow
              diff --git a/z3c/rml/form.py b/z3c/rml/form.py
              deleted file mode 100644
              index c6cce9f2..00000000
              --- a/z3c/rml/form.py
              +++ /dev/null
              @@ -1,356 +0,0 @@
              -##############################################################################
              -#
              -# Copyright (c) 2007 Zope Foundation and Contributors.
              -# All Rights Reserved.
              -#
              -# This software is subject to the provisions of the Zope Public License,
              -# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
              -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
              -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
              -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
              -# FOR A PARTICULAR PURPOSE.
              -#
              -##############################################################################
              -"""Page Drawing Related Element Processing
              -"""
              -import types
              -import reportlab.pdfbase.pdfform
              -from z3c.rml import attr, directive, interfaces, occurence
              -
              -try:
              -    import reportlab.graphics.barcode
              -except ImportError:
              -    # barcode package has not been installed
              -    import types
              -    import reportlab.graphics
              -    reportlab.graphics.barcode = types.ModuleType('barcode')
              -    reportlab.graphics.barcode.getCodeNames = lambda : ()
              -
              -
              -class IBarCodeBase(interfaces.IRMLDirectiveSignature):
              -    """Create a bar code."""
              -
              -    code = attr.Choice(
              -        title=u'Code',
              -        description=u'The name of the type of code to use.',
              -        choices=reportlab.graphics.barcode.getCodeNames(),
              -        required=True)
              -
              -    value = attr.TextNode(
              -        title=u'Value',
              -        description=u'The value represented by the code.',
              -        required=True)
              -
              -    width = attr.Measurement(
              -        title=u'Width',
              -        description=u'The width of the barcode.',
              -        required=False)
              -
              -    height = attr.Measurement(
              -        title=u'Height',
              -        description=u'The height of the barcode.',
              -        required=False)
              -
              -    barStrokeColor = attr.Color(
              -        title=u'Bar Stroke Color',
              -        description=(u'The color of the line strokes in the barcode.'),
              -        required=False)
              -
              -    barStrokeWidth = attr.Measurement(
              -        title=u'Bar Stroke Width',
              -        description=u'The width of the line strokes in the barcode.',
              -        required=False)
              -
              -    barFillColor = attr.Color(
              -        title=u'Bar Fill Color',
              -        description=(u'The color of the filled shapes in the barcode.'),
              -        required=False)
              -
              -    gap = attr.Measurement(
              -        title=u'Gap',
              -        description=u'The width of the inter-character gaps.',
              -        required=False)
              -
              -    # Bar code dependent attributes
              -    # I2of5, Code128, Standard93, FIM, POSTNET, Ean13B
              -    barWidth = attr.Measurement(
              -        title=u'Bar Width',
              -        description=u'The width of the smallest bar within the barcode',
              -        required=False)
              -
              -    # I2of5, Code128, Standard93, FIM, POSTNET
              -    barHeight = attr.Measurement(
              -        title=u'Bar Height',
              -        description=u'The height of the symbol.',
              -        required=False)
              -
              -    # I2of5
              -    ratio = attr.Float(
              -        title=u'Ratio',
              -        description=(u'The ratio of wide elements to narrow elements. '
              -                     u'Must be between 2.0 and 3.0 (or 2.2 and 3.0 if the '
              -                     u'barWidth is greater than 20 mils (.02 inch)).'),
              -        min=2.0,
              -        max=3.0,
              -        required=False)
              -
              -    # I2of5
              -    # Should be boolean, but some code want it as int; will still work
              -    checksum = attr.Integer(
              -        title=u'Ratio',
              -        description=(u'A flag that enables the computation and inclusion of '
              -                     u'the check digit.'),
              -        required=False)
              -
              -    # I2of5
              -    bearers = attr.Float(
              -        title=u'Bearers',
              -        description=(u'Height of bearer bars (horizontal bars along the top '
              -                     u'and bottom of the barcode). Default is 3 '
              -                     u'x-dimensions. Set to zero for no bearer bars.'
              -                     u'(Bearer bars help detect misscans, so it is '
              -                     u'suggested to leave them on).'),
              -        required=False)
              -
              -    # I2of5, Code128, Standard93, FIM, Ean13
              -    quiet = attr.Boolean(
              -        title=u'Quiet Zone',
              -        description=(u'A flag to include quiet zones in the symbol.'),
              -        required=False)
              -
              -    # I2of5, Code128, Standard93, FIM, Ean13
              -    lquiet = attr.Measurement(
              -        title=u'Left Quiet Zone',
              -        description=(u"Quiet zone size to the left of code, if quiet is "
              -                     u"true. Default is the greater of .25 inch or .15 times "
              -                     u"the symbol's length."),
              -        required=False)
              -
              -    # I2of5, Code128, Standard93, FIM, Ean13
              -    rquiet = attr.Measurement(
              -        title=u'Right Quiet Zone',
              -        description=(u"Quiet zone size to the right of code, if quiet is "
              -                     u"true. Default is the greater of .25 inch or .15 times "
              -                     u"the symbol's length."),
              -        required=False)
              -
              -    # I2of5, Code128, Standard93, FIM, POSTNET, Ean13
              -    fontName = attr.String(
              -        title=u'Font Name',
              -        description=(u'The font used to print the value.'),
              -        required=False)
              -
              -    # I2of5, Code128, Standard93, FIM, POSTNET, Ean13
              -    fontSize = attr.Measurement(
              -        title=u'Font Size',
              -        description=(u'The size of the value text.'),
              -        required=False)
              -
              -    # I2of5, Code128, Standard93, FIM, POSTNET, Ean13
              -    humanReadable = attr.Boolean(
              -        title=u'Human Readable',
              -        description=(u'A flag when set causes the value to be printed below '
              -                     u'the bar code.'),
              -        required=False)
              -
              -    # I2of5, Standard93
              -    stop = attr.Boolean(
              -        title=u'Show Start/Stop',
              -        description=(u'A flag to specify whether the start/stop symbols '
              -                     u'are to be shown.'),
              -        required=False)
              -
              -    # FIM, POSTNET
              -    spaceWidth = attr.Measurement(
              -        title=u'Space Width',
              -        description=u'The space of the inter-character gaps.',
              -        required=False)
              -
              -    # POSTNET
              -    shortHeight = attr.Measurement(
              -        title=u'Short Height',
              -        description=u'The height of the short bar.',
              -        required=False)
              -
              -    # Ean13
              -    textColor = attr.Color(
              -        title=u'Text Color',
              -        description=(u'The color of human readable text.'),
              -        required=False)
              -
              -    # USPS4S
              -    routing = attr.String(
              -        title=u'Routing',
              -        description=u'The routing information string.',
              -        required=False)
              -    
              -    # QR
              -    barLevel = attr.Choice(
              -        title=u'Bar Level',
              -        description=u'The error correction level for QR code',
              -        choices=['L', 'M', 'Q', 'H'],
              -        required=False)
              -
              -
              -class IBarCode(IBarCodeBase):
              -    """A barcode graphic."""
              -
              -    x = attr.Measurement(
              -        title=u'X-Position',
              -        description=u'The x-position of the lower-left corner of the barcode.',
              -        default=0,
              -        required=False)
              -
              -    y = attr.Measurement(
              -        title=u'Y-Position',
              -        description=u'The y-position of the lower-left corner of the barcode.',
              -        default=0,
              -        required=False)
              -
              -    isoScale = attr.Boolean(
              -        title=u'Isometric Scaling',
              -        description=u'When set, the aspect ration of the barcode is enforced.',
              -        required=False)
              -
              -class BarCode(directive.RMLDirective):
              -    signature = IBarCode
              -
              -    def process(self):
              -        kw = dict(self.getAttributeValues())
              -        name = kw.pop('code')
              -        kw['value'] = str(kw['value'])
              -        x = kw.pop('x', 0)
              -        y = kw.pop('y', 0)
              -        code = reportlab.graphics.barcode.createBarcodeDrawing(name, **kw)
              -        manager = attr.getManager(self, interfaces.ICanvasManager)
              -        code.drawOn(manager.canvas, x, y)
              -
              -
              -class IField(interfaces.IRMLDirectiveSignature):
              -    """A field."""
              -
              -    title = attr.Text(
              -        title=u'Title',
              -        description=u'The title of the field.',
              -        required=True)
              -
              -    x = attr.Measurement(
              -        title=u'X-Position',
              -        description=u'The x-position of the lower-left corner of the field.',
              -        default=0,
              -        required=True)
              -
              -    y = attr.Measurement(
              -        title=u'Y-Position',
              -        description=u'The y-position of the lower-left corner of the field.',
              -        default=0,
              -        required=True)
              -
              -
              -class Field(directive.RMLDirective):
              -    signature = IField
              -    callable = None
              -    attrMapping = {}
              -
              -    def process(self):
              -        kwargs = dict(self.getAttributeValues(attrMapping=self.attrMapping))
              -        canvas = attr.getManager(self, interfaces.ICanvasManager).canvas
              -        getattr(reportlab.pdfbase.pdfform, self.callable)(canvas, **kwargs)
              -
              -
              -class ITextField(IField):
              -    """A text field within the PDF"""
              -
              -    width = attr.Measurement(
              -        title=u'Width',
              -        description=u'The width of the text field.',
              -        required=True)
              -
              -    height = attr.Measurement(
              -        title=u'Height',
              -        description=u'The height of the text field.',
              -        required=True)
              -
              -    value = attr.Text(
              -        title=u'Value',
              -        description=u'The default text value of the field.',
              -        required=False)
              -
              -    maxLength = attr.Integer(
              -        title=u'Maximum Length',
              -        description=u'The maximum amount of characters allowed in the field.',
              -        required=False)
              -
              -    multiline = attr.Boolean(
              -        title=u'Multiline',
              -        description=u'A flag when set allows multiple lines within the field.',
              -        required=False)
              -
              -class TextField(Field):
              -    signature = ITextField
              -    callable = 'textFieldAbsolute'
              -    attrMapping = {'maxLength': 'maxlen'}
              -
              -
              -class IButtonField(IField):
              -    """A button field within the PDF"""
              -
              -    value = attr.Choice(
              -        title=u'Value',
              -        description=u'The value of the button.',
              -        choices=('Yes', 'Off'),
              -        required=True)
              -
              -class ButtonField(Field):
              -    signature = IButtonField
              -    callable = 'buttonFieldAbsolute'
              -
              -
              -class IOption(interfaces.IRMLDirectiveSignature):
              -    """An option in the select field."""
              -
              -    value = attr.TextNode(
              -        title=u'Value',
              -        description=u'The value of the option.',
              -        required=True)
              -
              -class Option(directive.RMLDirective):
              -    signature = IOption
              -
              -    def process(self):
              -        value = self.getAttributeValues(valuesOnly=True)[0]
              -        self.parent.options.append(value)
              -
              -
              -class ISelectField(IField):
              -    """A selection field within the PDF"""
              -    occurence.containing(
              -        occurence.ZeroOrMore('option', IOption))
              -
              -    width = attr.Measurement(
              -        title=u'Width',
              -        description=u'The width of the select field.',
              -        required=True)
              -
              -    height = attr.Measurement(
              -        title=u'Height',
              -        description=u'The height of the select field.',
              -        required=True)
              -
              -    value = attr.Text(
              -        title=u'Value',
              -        description=u'The default value of the field.',
              -        required=False)
              -
              -class SelectField(Field):
              -    signature = ISelectField
              -    callable = 'selectFieldAbsolute'
              -    factories = {'option': Option}
              -
              -    def process(self):
              -        self.options = []
              -        self.processSubDirectives()
              -        kwargs = dict(self.getAttributeValues(attrMapping=self.attrMapping))
              -        kwargs['options'] = self.options
              -        canvas = attr.getManager(self, interfaces.ICanvasManager).canvas
              -        getattr(reportlab.pdfbase.pdfform, self.callable)(canvas, **kwargs)
              diff --git a/z3c/rml/interfaces.py b/z3c/rml/interfaces.py
              deleted file mode 100644
              index c92ee9d7..00000000
              --- a/z3c/rml/interfaces.py
              +++ /dev/null
              @@ -1,148 +0,0 @@
              -##############################################################################
              -#
              -# Copyright (c) 2007 Zope Foundation and Contributors.
              -# All Rights Reserved.
              -#
              -# This software is subject to the provisions of the Zope Public License,
              -# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
              -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
              -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
              -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
              -# FOR A PARTICULAR PURPOSE.
              -#
              -##############################################################################
              -"""RML to PDF Converter Interfaces
              -"""
              -__docformat__ = "reStructuredText"
              -import logging
              -import reportlab.lib.enums
              -import zope.interface
              -import zope.schema
              -
              -from z3c.rml.occurence import ZeroOrMore, ZeroOrOne, OneOrMore
              -
              -JOIN_CHOICES = {'round': 1, 'mitered': 0, 'bevelled': 2}
              -CAP_CHOICES = {'default': 0, 'butt': 0, 'round': 1, 'square': 2}
              -ALIGN_CHOICES = {
              -    'left': reportlab.lib.enums.TA_LEFT,
              -    'right': reportlab.lib.enums.TA_RIGHT,
              -    'center': reportlab.lib.enums.TA_CENTER,
              -    'centre': reportlab.lib.enums.TA_CENTER,
              -    'justify': reportlab.lib.enums.TA_JUSTIFY}
              -ALIGN_TEXT_CHOICES = {
              -    'left': 'LEFT', 'right': 'RIGHT', 'center': 'CENTER', 'centre': 'CENTER',
              -    'decimal': 'DECIMAL'}
              -VALIGN_TEXT_CHOICES = {
              -    'top': 'TOP', 'middle': 'MIDDLE', 'bottom': 'BOTTOM'}
              -SPLIT_CHOICES = ('splitfirst', 'splitlast')
              -TEXT_TRANSFORM_CHOICES = ('uppercase', 'lowercase')
              -LIST_FORMATS = ('I', 'i', '123',  'ABC', 'abc')
              -ORDERED_LIST_TYPES = ('I', 'i', '1', 'A', 'a')
              -UNORDERED_BULLET_VALUES = ('bullet', 'circle', 'square', 'disc', 'diamond',
              -                           'rarrowhead')
              -LOG_LEVELS = {
              -    'DEBUG': logging.DEBUG,
              -    'INFO': logging.INFO,
              -    'WARNING': logging.WARNING,
              -    'ERROR': logging.ERROR,
              -    'CRITICAL': logging.CRITICAL}
              -
              -class IRML2PDF(zope.interface.Interface):
              -    """This is the main public API of z3c.rml"""
              -
              -    def parseString(xml):
              -        """Parse an XML string and convert it to PDF.
              -
              -        The output is a ``StringIO`` object.
              -        """
              -
              -    def go(xmlInputName, outputFileName=None, outDir=None, dtdDir=None):
              -        """Convert RML 2 PDF.
              -
              -        The generated file will be located in the ``outDir`` under the name
              -        ``outputFileName``.
              -        """
              -
              -class IManager(zope.interface.Interface):
              -    """A manager of all document-global variables."""
              -    names = zope.interface.Attribute("Names dict")
              -    styles = zope.interface.Attribute("Styles dict")
              -    colors = zope.interface.Attribute("Colors dict")
              -
              -class IPostProcessorManager(zope.interface.Interface):
              -    """Manages all post processors"""
              -
              -    postProcessors = zope.interface.Attribute(
              -        "List of tuples of the form: (name, processor)")
              -
              -class ICanvasManager(zope.interface.Interface):
              -    """A manager for the canvas."""
              -    canvas = zope.interface.Attribute("Canvas")
              -
              -class IRMLDirectiveSignature(zope.interface.Interface):
              -    """The attribute and sub-directives signature of the current
              -    RML directive."""
              -
              -
              -class IRMLDirective(zope.interface.Interface):
              -    """A directive in RML extracted from an Element Tree element."""
              -
              -    signature = zope.schema.Field(
              -        title=u'Signature',
              -        description=(u'The signature of the RML directive.'),
              -        required=True)
              -
              -    parent = zope.schema.Field(
              -        title=u'Parent RML Element',
              -        description=u'The parent in the RML element hierarchy',
              -        required=True,)
              -
              -    element = zope.schema.Field(
              -        title=u'Element',
              -        description=(u'The Element Tree element from which the data '
              -                     u'is retrieved.'),
              -        required=True)
              -
              -    def getAttributeValues(ignore=None, select=None, includeMissing=False):
              -        """Return a list of name-value-tuples based on the signature.
              -
              -        If ``ignore`` is specified, all attributes are returned except the
              -        ones listed in the argument. The values of the sequence are the
              -        attribute names.
              -
              -        If ``select`` is specified, only attributes listed in the argument are
              -        returned. The values of the sequence are the attribute names.
              -
              -        If ``includeMissing`` is set to true, then even missing attributes are
              -        included in the value list.
              -        """
              -
              -    def processSubDirectives(self):
              -        """Process all sub-directives."""
              -
              -    def process(self):
              -        """Process the directive.
              -
              -        The main task for this method is to interpret the available data and
              -        to make the corresponding calls in the Reportlab document.
              -
              -        This call should also process all sub-directives and process them.
              -        """
              -
              -
              -class IDeprecated(zope.interface.Interface):
              -    """Mark an attribute as being compatible."""
              -
              -    deprecatedName = zope.schema.TextLine(
              -        title=u'Name',
              -        description=u'The name of the original attribute.',
              -        required=True)
              -
              -    deprecatedReason = zope.schema.Text(
              -        title=u'Reason',
              -        description=u'The reason the attribute has been deprecated.',
              -        required=False)
              -
              -
              -class IDeprecatedDirective(zope.interface.interfaces.IInterface):
              -    """A directive that is deprecated."""
              diff --git a/z3c/rml/list.py b/z3c/rml/list.py
              deleted file mode 100644
              index d6de49da..00000000
              --- a/z3c/rml/list.py
              +++ /dev/null
              @@ -1,181 +0,0 @@
              -##############################################################################
              -#
              -# Copyright (c) 2012 Zope Foundation and Contributors.
              -# All Rights Reserved.
              -#
              -# This software is subject to the provisions of the Zope Public License,
              -# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
              -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
              -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
              -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
              -# FOR A PARTICULAR PURPOSE.
              -#
              -##############################################################################
              -"""``ul``, ``ol``, and ``li`` directives.
              -"""
              -__docformat__ = "reStructuredText"
              -import copy
              -import reportlab.lib.styles
              -import reportlab.platypus
              -import zope.schema
              -from reportlab.platypus import flowables
              -
              -from z3c.rml import attr, directive, flowable, interfaces, occurence, stylesheet
              -
              -
              -class IListItem(stylesheet.IMinimalListStyle, flowable.IFlow):
              -    """A list item in an ordered or unordered list."""
              -
              -    style = attr.Style(
              -        title=u'Style',
              -        description=u'The list style that is applied to the list.',
              -        required=False)
              -
              -class ListItem(flowable.Flow):
              -    signature = IListItem
              -    klass = reportlab.platypus.ListItem
              -    attrMapping = {}
              -
              -    styleAttributes = zope.schema.getFieldNames(stylesheet.IMinimalListStyle)
              -
              -    def processStyle(self, style):
              -        attrs = self.getAttributeValues(select=self.styleAttributes)
              -        if attrs or not hasattr(style, 'value'):
              -            style = copy.deepcopy(style)
              -            # Sigh, this is needed since unordered list items expect the value.
              -            style.value = style.start
              -            for name, value in attrs:
              -                setattr(style, name, value)
              -        return style
              -
              -    def process(self):
              -        self.processSubDirectives()
              -        args = dict(self.getAttributeValues(ignore=self.styleAttributes))
              -        if 'style' not in args:
              -            args['style'] = self.parent.baseStyle
              -        args['style'] = self.processStyle(args['style'])
              -        li = self.klass(self.flow, **args)
              -        self.parent.flow.append(li)
              -
              -
              -class IOrderedListItem(IListItem):
              -    """An ordered list item."""
              -
              -    value = attr.Integer(
              -        title=u'Bullet Value',
              -        description=u'The counter value.',
              -        required=False)
              -
              -class OrderedListItem(ListItem):
              -    signature = IOrderedListItem
              -
              -
              -class IUnorderedListItem(IListItem):
              -    """An ordered list item."""
              -
              -    value = attr.Choice(
              -        title=u'Bullet Value',
              -        description=u'The type of bullet character.',
              -        choices=interfaces.UNORDERED_BULLET_VALUES,
              -        required=False)
              -
              -class UnorderedListItem(ListItem):
              -    signature = IUnorderedListItem
              -
              -    styleAttributes = ListItem.styleAttributes + ['value']
              -
              -
              -class IListBase(stylesheet.IBaseListStyle):
              -
              -    style = attr.Style(
              -        title=u'Style',
              -        description=u'The list style that is applied to the list.',
              -        required=False)
              -
              -class ListBase(directive.RMLDirective):
              -    klass = reportlab.platypus.ListFlowable
              -    factories = {'li': ListItem}
              -    attrMapping = {}
              -
              -    styleAttributes = zope.schema.getFieldNames(stylesheet.IBaseListStyle)
              -
              -    def __init__(self, *args, **kw):
              -        super(ListBase, self).__init__(*args, **kw)
              -        self.flow = []
              -
              -    def processStyle(self, style):
              -        attrs = self.getAttributeValues(
              -            select=self.styleAttributes, attrMapping=self.attrMapping)
              -        if attrs:
              -            style = copy.deepcopy(style)
              -            for name, value in attrs:
              -                setattr(style, name, value)
              -        return style
              -
              -    def process(self):
              -        args = dict(self.getAttributeValues(
              -                ignore=self.styleAttributes, attrMapping=self.attrMapping))
              -        if 'style' not in args:
              -            args['style'] = reportlab.lib.styles.ListStyle('List')
              -        args['style'] = self.baseStyle = self.processStyle(args['style'])
              -        self.processSubDirectives()
              -        li = self.klass(self.flow, **args)
              -        self.parent.flow.append(li)
              -
              -
              -class IOrderedList(IListBase):
              -    """An ordered list."""
              -    occurence.containing(
              -        occurence.ZeroOrMore('li', IOrderedListItem),
              -        )
              -
              -    bulletType = attr.Choice(
              -        title=u'Bullet Type',
              -        description=u'The type of bullet formatting.',
              -        choices=interfaces.ORDERED_LIST_TYPES,
              -        doLower=False,
              -        required=False)
              -
              -class OrderedList(ListBase):
              -    signature = IOrderedList
              -    factories = {'li': OrderedListItem}
              -
              -    styleAttributes = ListBase.styleAttributes + ['bulletType']
              -
              -
              -class IUnorderedList(IListBase):
              -    """And unordered list."""
              -    occurence.containing(
              -        occurence.ZeroOrMore('li', IUnorderedListItem),
              -        )
              -
              -    value = attr.Choice(
              -        title=u'Bullet Value',
              -        description=u'The type of bullet character.',
              -        choices=interfaces.UNORDERED_BULLET_VALUES,
              -        default='disc',
              -        required=False)
              -
              -class UnorderedList(ListBase):
              -    signature = IUnorderedList
              -    attrMapping = {'value': 'start'}
              -    factories = {'li': UnorderedListItem}
              -
              -    def getAttributeValues(self, *args, **kw):
              -        res = super(UnorderedList, self).getAttributeValues(*args, **kw)
              -        res.append(('bulletType', 'bullet'))
              -        return res
              -
              -flowable.Flow.factories['ol'] = OrderedList
              -flowable.IFlow.setTaggedValue(
              -    'directives',
              -    flowable.IFlow.getTaggedValue('directives') +
              -    (occurence.ZeroOrMore('ol', IOrderedList),)
              -    )
              -
              -flowable.Flow.factories['ul'] = UnorderedList
              -flowable.IFlow.setTaggedValue(
              -    'directives',
              -    flowable.IFlow.getTaggedValue('directives') +
              -    (occurence.ZeroOrMore('ul', IUnorderedList),)
              -    )
              diff --git a/z3c/rml/occurence.py b/z3c/rml/occurence.py
              deleted file mode 100644
              index b4f3fe29..00000000
              --- a/z3c/rml/occurence.py
              +++ /dev/null
              @@ -1,113 +0,0 @@
              -##############################################################################
              -#
              -# Copyright (c) 2007 Zope Foundation and Contributors.
              -# All Rights Reserved.
              -#
              -# This software is subject to the provisions of the Zope Public License,
              -# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
              -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
              -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
              -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
              -# FOR A PARTICULAR PURPOSE.
              -#
              -##############################################################################
              -"""Condition Implementation
              -"""
              -import reportlab
              -import sys
              -import zope.interface
              -import zope.schema
              -from zope.schema import fieldproperty
              -
              -class ICondition(zope.interface.Interface):
              -    """Condition that is checked before a  directive is available."""
              -
              -    __doc__ = zope.schema.TextLine(
              -        title=u'Description',
              -        description=u'The description of the condition.',
              -        required=True)
              -
              -    def __call__(directive):
              -        """Check whether the condition is fulfilled for the given directive."""
              -
              -
              -class IOccurence(zope.interface.Interface):
              -    """Description of the occurence of a sub-directive."""
              -
              -    __doc__ = zope.schema.TextLine(
              -        title=u'Description',
              -        description=u'The description of the occurence.',
              -        required=True)
              -
              -    tag = zope.schema.BytesLine(
              -        title=u'Tag',
              -        description=u'The tag of the sub-directive within the directive',
              -        required=True)
              -
              -    signature = zope.schema.Field(
              -        title=u'Signature',
              -        description=u'The signature of the sub-directive.',
              -        required=True)
              -
              -    condition = zope.schema.Field(
              -        title=u'Condition',
              -        description=u'The condition that the directive is available.',
              -        required=False)
              -
              -
              -@zope.interface.implementer(ICondition)
              -def laterThanReportlab21(directive):
              -    """The directive is only available in Reportlab 2.1 and higher."""
              -    return [int(num) for num in reportlab.Version.split('.')] >= (2, 0)
              -
              -
              -def containing(*occurences):
              -    frame = sys._getframe(1)
              -    f_locals = frame.f_locals
              -    f_globals = frame.f_globals
              -
              -    if not (f_locals is not f_globals
              -            and f_locals.get('__module__')
              -            and f_locals.get('__module__') == f_globals.get('__name__')
              -            ):
              -        raise TypeError("contains not called from signature interface")
              -
              -    f_locals['__interface_tagged_values__'] = {'directives': occurences}
              -
              -
              -class Occurence(object):
              -    zope.interface.implements(IOccurence)
              -
              -    tag = fieldproperty.FieldProperty(IOccurence['tag'])
              -    signature = fieldproperty.FieldProperty(IOccurence['signature'])
              -    condition = fieldproperty.FieldProperty(IOccurence['condition'])
              -
              -    def __init__(self, tag, signature, condition=None):
              -        self.tag = tag
              -        self.signature = signature
              -        self.condition = condition
              -
              -
              -class ZeroOrMore(Occurence):
              -    """Zero or More
              -
              -    This sub-directive can occur zero or more times.
              -    """
              -
              -class ZeroOrOne(Occurence):
              -    """Zero or one
              -
              -    This sub-directive can occur zero or one time.
              -    """
              -
              -class OneOrMore(Occurence):
              -    """One or More
              -
              -    This sub-directive can occur one or more times.
              -    """
              -
              -class One(Occurence):
              -    """One
              -
              -    This sub-directive must occur exactly one time.
              -    """
              diff --git a/z3c/rml/page.py b/z3c/rml/page.py
              deleted file mode 100644
              index 8ad54bcd..00000000
              --- a/z3c/rml/page.py
              +++ /dev/null
              @@ -1,115 +0,0 @@
              -##############################################################################
              -#
              -# Copyright (c) 2007 Zope Foundation and Contributors.
              -# All Rights Reserved.
              -#
              -# This software is subject to the provisions of the Zope Public License,
              -# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
              -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
              -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
              -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
              -# FOR A PARTICULAR PURPOSE.
              -#
              -##############################################################################
              -"""Page Drawing Related Element Processing
              -"""
              -import cStringIO
              -from z3c.rml import attr, directive, interfaces
              -
              -try:
              -    import PyPDF2
              -    from PyPDF2.generic import NameObject
              -except ImportError:
              -    # We don't want to require pyPdf, if you do not want to use the features
              -    # in this module.
              -    PyPDF2 = None
              -
              -
              -class MergePostProcessor(object):
              -
              -    def __init__(self):
              -        self.operations = {}
              -
              -    def process(self, inputFile1):
              -        input1 = PyPDF2.PdfFileReader(inputFile1)
              -        output = PyPDF2.PdfFileWriter()
              -        # TODO: Do not access protected classes
              -        output._info.getObject().update(input1.documentInfo)
              -        if output._root:
              -            # Backwards-compatible with PyPDF2 version 1.21
              -            output._root.getObject()[NameObject("/Outlines")] = (
              -                output._addObject(input1.trailer["/Root"]["/Outlines"]))
              -        else:
              -            # Compatible with PyPDF2 version 1.22+
              -            output._root_object[NameObject("/Outlines")] = (
              -                output._addObject(input1.trailer["/Root"]["/Outlines"]))
              -        for (num, page) in enumerate(input1.pages):
              -            if num in self.operations:
              -                for mergeFile, mergeNumber in self.operations[num]:
              -                    merger = PyPDF2.PdfFileReader(mergeFile)
              -                    mergerPage = merger.getPage(mergeNumber)
              -                    mergerPage.mergePage(page)
              -                    page = mergerPage
              -            output.addPage(page)
              -
              -        outputFile = cStringIO.StringIO()
              -        output.write(outputFile)
              -        return outputFile
              -
              -
              -class IMergePage(interfaces.IRMLDirectiveSignature):
              -    """Merges an existing PDF Page into the one to be generated."""
              -
              -    filename = attr.File(
              -        title=u'File',
              -        description=(u'Reference to the PDF file to extract the page from.'),
              -        required=True)
              -
              -    page = attr.Integer(
              -        title=u'Page Number',
              -        description=u'The page number of the PDF file that is used to merge..',
              -        required=True)
              -
              -
              -class MergePage(directive.RMLDirective):
              -    signature = IMergePage
              -
              -    def getProcessor(self):
              -        manager = attr.getManager(self, interfaces.IPostProcessorManager)
              -        procs = dict(manager.postProcessors)
              -        if 'MERGE' not in procs:
              -            proc = MergePostProcessor()
              -            manager.postProcessors.append(('MERGE', proc))
              -            return proc
              -        return procs['MERGE']
              -
              -    def process(self):
              -        if PyPDF2 is None:
              -            raise Exception(
              -                'pyPdf is not installed, so this feature is not available.')
              -        inputFile, inPage = self.getAttributeValues(valuesOnly=True)
              -        manager = attr.getManager(self, interfaces.ICanvasManager)
              -        outPage = manager.canvas.getPageNumber()-1
              -
              -        proc = self.getProcessor()
              -        pageOperations = proc.operations.setdefault(outPage, [])
              -        pageOperations.append((inputFile, inPage))
              -
              -
              -class MergePageInPageTemplate(MergePage):
              -
              -    def process(self):
              -        if PyPDF2 is None:
              -            raise Exception(
              -                'pyPdf is not installed, so this feature is not available.')
              -        inputFile, inPage = self.getAttributeValues(valuesOnly=True)
              -
              -        onPage = self.parent.pt.onPage
              -        def drawOnCanvas(canvas, doc):
              -            onPage(canvas, doc)
              -            outPage = canvas.getPageNumber()-1
              -            proc = self.getProcessor()
              -            pageOperations = proc.operations.setdefault(outPage, [])
              -            pageOperations.append((inputFile, inPage))
              -
              -        self.parent.pt.onPage = drawOnCanvas
              diff --git a/z3c/rml/pagetemplate.py b/z3c/rml/pagetemplate.py
              deleted file mode 100644
              index 65440c77..00000000
              --- a/z3c/rml/pagetemplate.py
              +++ /dev/null
              @@ -1,45 +0,0 @@
              -##############################################################################
              -#
              -# Copyright (c) 2007 Zope Foundation and Contributors.
              -# All Rights Reserved.
              -#
              -# This software is subject to the provisions of the Zope Public License,
              -# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
              -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
              -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
              -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
              -# FOR A PARTICULAR PURPOSE.
              -#
              -##############################################################################
              -"""Page Template Support
              -"""
              -import zope
              -from z3c.rml import rml2pdf
              -
              -try:
              -    import zope.pagetemplate.pagetemplatefile
              -except ImportError, err:
              -    raise
              -    # zope.pagetemplate package has not been installed
              -    import types
              -    zope.pagetemplate = types.ModuleType('pagetemplate')
              -    zope.pagetemplate.pagetemplatefile = types.ModuleType('pagetemplatefile')
              -    zope.pagetemplate.pagetemplatefile.PageTemplateFile = object
              -
              -
              -class RMLPageTemplateFile(zope.pagetemplate.pagetemplatefile.PageTemplateFile):
              -
              -    def pt_getContext(self, args=(), options=None, **ignore):
              -        rval = {'template': self,
              -                'args': args,
              -                'nothing': None,
              -                'context': options
              -                }
              -        rval.update(self.pt_getEngine().getBaseNames())
              -        return rval
              -
              -    def __call__(self, *args, **kwargs):
              -        rml = super(RMLPageTemplateFile, self).__call__(*args, **kwargs)
              -
              -        return rml2pdf.parseString(
              -            rml, filename=self.pt_source_file()).getvalue()
              diff --git a/z3c/rml/pagetemplate.txt b/z3c/rml/pagetemplate.txt
              deleted file mode 100644
              index 9f4aca43..00000000
              --- a/z3c/rml/pagetemplate.txt
              +++ /dev/null
              @@ -1,54 +0,0 @@
              -==================
              -RML Page Templates
              -==================
              -
              -This package also provides optional support a helper class to use page
              -templates with RML without using the entire Zope framework. This document will
              -demonstrate how to use page templates and RML together.
              -
              -In this example, we will simply iterate through a list of names and display
              -them in the PDF.
              -
              -The first step is to create a page template:
              -
              -  >>> import tempfile
              -  >>> ptFileName = tempfile.mktemp('.pt')
              -  >>> open(ptFileName, 'w').write('''\
              -  ... 
              -  ... 
              -  ... 
              -  ...
              -  ...   
              -  ...
              -  ...   
              -  ...     
              -  ...   
              -  ...
              -  ... 
              -  ... ''')
              -
              -The ``context`` namespace will be created during rendering. I get back to this
              -later. In th enext step we instantiate the page template:
              -
              -  >>> from z3c.rml import pagetemplate
              -  >>> rmlPageTemplate = pagetemplate.RMLPageTemplateFile(ptFileName)
              -
              -All we have to do now is to render the template. The context of the template
              -is effectively the keyword arguments dictionary:
              -
              -  >>> rmlPageTemplate(names=(u'Roy', u'Daniel', u'Julian', u'Stephan'))
              -  '%PDF-1.4...'
              -
              -You can uncomment the following line to write out the PDF in the current
              -working directory:
              -
              -  #>>> open('pagetemplate-test.pdf', 'w').write(
              -  #...   rmlPageTemplate(names=(u'Roy', u'Daniel', u'Julian', u'Stephan')))
              diff --git a/z3c/rml/paraparser.py b/z3c/rml/paraparser.py
              deleted file mode 100644
              index 2c90c168..00000000
              --- a/z3c/rml/paraparser.py
              +++ /dev/null
              @@ -1,181 +0,0 @@
              -##############################################################################
              -#
              -# Copyright (c) 2007-2008 Zope Foundation and Contributors.
              -# All Rights Reserved.
              -#
              -# This software is subject to the provisions of the Zope Public License,
              -# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
              -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
              -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
              -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
              -# FOR A PARTICULAR PURPOSE.
              -#
              -##############################################################################
              -"""Paragraph-internal XML parser extensions.
              -"""
              -import copy
              -import inspect
              -
              -import reportlab.lib.fonts
              -import reportlab.platypus.paraparser
              -
              -
              -class PageNumberFragment(reportlab.platypus.paraparser.ParaFrag):
              -    """A fragment whose `text` is computed at access time."""
              -
              -    def __init__(self, **attributes):
              -        reportlab.platypus.paraparser.ParaFrag.__init__(self, **attributes)
              -        self.counting_from = attributes.get('countingFrom', 1)
              -
              -    @property
              -    def text(self):
              -        # Guess 1: We're in a paragraph in a story.
              -        frame = inspect.currentframe(4)
              -        canvas = frame.f_locals.get('canvas', None)
              -
              -        if canvas is None:
              -            # Guess 2: We're in a template
              -            canvas = frame.f_locals.get('canv', None)
              -
              -        if canvas is None:
              -            # Guess 3: We're in evalString or namedString
              -            canvas = getattr(frame.f_locals.get('self', None), 'canv', None)
              -
              -        if canvas is None:
              -            raise Exception("Can't use  in this location.")
              -
              -        return str(canvas.getPageNumber() + int(self.counting_from) - 1)
              -
              -
              -class GetNameFragment(reportlab.platypus.paraparser.ParaFrag):
              -    """A fragment whose `text` is computed at access time."""
              -
              -    def __init__(self, **attributes):
              -        reportlab.platypus.paraparser.ParaFrag.__init__(self, **attributes)
              -        self.id = attributes['id']
              -        self.default = attributes.get('default')
              -
              -    @property
              -    def text(self):
              -        # Guess 1: We're in a paragraph in a story.
              -        frame = inspect.currentframe(4)
              -        canvas = frame.f_locals.get('canvas', None)
              -
              -        if canvas is None:
              -            # Guess 2: We're in a template
              -            canvas = frame.f_locals.get('canv', None)
              -
              -        if canvas is None:
              -            # Guess 3: We're in evalString or namedString
              -            canvas = getattr(frame.f_locals.get('self', None), 'canv', None)
              -
              -        if canvas is None:
              -            raise Exception("Can't use  in this location.")
              -
              -        return canvas.manager.get_name(self.id, self.default)
              -
              -
              -class EvalStringFragment(reportlab.platypus.paraparser.ParaFrag):
              -    """A fragment whose `text` is evaluated at access time."""
              -
              -    def __init__(self, **attributes):
              -        reportlab.platypus.paraparser.ParaFrag.__init__(self, **attributes)
              -        self.frags = []
              -
              -    @property
              -    def text(self):
              -        text = u''
              -        for frag in self.frags:
              -            if isinstance(frag, basestring):
              -                text += frag
              -            else:
              -                text += frag.text
              -        from z3c.rml.special import do_eval
              -        return do_eval(text)
              -
              -
              -class NameFragment(reportlab.platypus.paraparser.ParaFrag):
              -    """A fragment whose attribute `value` is set to a variable."""
              -
              -    def __init__(self, **attributes):
              -        reportlab.platypus.paraparser.ParaFrag.__init__(self, **attributes)
              -
              -    @property
              -    def text(self):
              -        # Guess 1: We're in a paragraph in a story.
              -        frame = inspect.currentframe(4)
              -        canvas = frame.f_locals.get('canvas', None)
              -
              -        if canvas is None:
              -            # Guess 2: We're in a template
              -            canvas = frame.f_locals.get('canv', None)
              -
              -        if canvas is None:
              -            # Guess 3: We're in evalString or namedString
              -            canvas = getattr(frame.f_locals.get('self', None), 'canv', None)
              -
              -        if canvas is None:
              -            raise Exception("Can't use  in this location.")
              -
              -        canvas.manager.names[self.id] = self.value
              -        return u''
              -
              -
              -class Z3CParagraphParser(reportlab.platypus.paraparser.ParaParser):
              -    """Extensions to paragraph-internal XML parsing."""
              -
              -    def __init__(self, *args, **kwargs):
              -        reportlab.platypus.paraparser.ParaParser.__init__(self, *args, **kwargs)
              -        self.in_eval = False
              -
              -    def startDynamic(self, attributes, klass):
              -        frag = klass(**attributes)
              -        frag.__dict__.update(self._stack[-1].__dict__)
              -        frag.fontName = reportlab.lib.fonts.tt2ps(
              -            frag.fontName, frag.bold, frag.italic)
              -        if self.in_eval:
              -            self._stack[-1].frags.append(frag)
              -        else:
              -            self.fragList.append(frag)
              -            self._stack.append(frag)
              -
              -    def endDynamic(self):
              -        if not self.in_eval:
              -            self._pop()
              -
              -    def start_pagenumber(self, attributes):
              -        self.startDynamic(attributes, PageNumberFragment)
              -
              -    def end_pagenumber(self):
              -        self.endDynamic()
              -
              -    def start_getname(self, attributes):
              -        self.startDynamic(attributes, GetNameFragment)
              -
              -    def end_getname(self):
              -        self.endDynamic()
              -
              -    def start_name(self, attributes):
              -        self.startDynamic(attributes, NameFragment)
              -
              -    def end_name(self):
              -        self.endDynamic()
              -
              -    def start_evalstring(self, attributes):
              -        self.startDynamic(attributes, EvalStringFragment)
              -        self.in_eval = True
              -
              -    def end_evalstring(self):
              -        self.in_eval = False
              -        self.endDynamic()
              -
              -    def handle_data(self, data):
              -        if not self.in_eval:
              -            reportlab.platypus.paraparser.ParaParser.handle_data(self, data)
              -        else:
              -            frag = self._stack[-1].frags.append(data)
              -
              -
              -# Monkey-patch reportlabs global parser instance. Wah.
              -import reportlab.platypus.paragraph
              -reportlab.platypus.paragraph.ParaParser = Z3CParagraphParser
              diff --git a/z3c/rml/pdfinclude.py b/z3c/rml/pdfinclude.py
              deleted file mode 100644
              index ddb529c8..00000000
              --- a/z3c/rml/pdfinclude.py
              +++ /dev/null
              @@ -1,149 +0,0 @@
              -##############################################################################
              -#
              -# Copyright (c) 2012 Zope Foundation and Contributors.
              -# All Rights Reserved.
              -#
              -# This software is subject to the provisions of the Zope Public License,
              -# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
              -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
              -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
              -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
              -# FOR A PARTICULAR PURPOSE.
              -#
              -##############################################################################
              -"""``pdfInclude`` Directive.
              -"""
              -__docformat__ = "reStructuredText"
              -import cStringIO
              -try:
              -    import PyPDF2
              -    from PyPDF2.generic import NameObject
              -except ImportError:
              -    PyPDF2 = None
              -from reportlab.platypus import flowables
              -
              -from z3c.rml import attr, flowable, interfaces, occurence, page
              -
              -class ConcatenationPostProcessor(object):
              -
              -    def __init__(self):
              -        self.operations = []
              -
              -    def process(self, inputFile1):
              -        input1 = PyPDF2.PdfFileReader(inputFile1)
              -        merger = PyPDF2.PdfFileMerger()
              -        merger.output._info.getObject().update(input1.documentInfo)
              -
              -        prev_insert = 0
              -        for start_page, inputFile2, pages, num_pages in self.operations:
              -            if prev_insert < start_page:
              -                merger.append(inputFile1, pages=(prev_insert, start_page))
              -            if not pages:
              -                merger.append(inputFile2)
              -            else:
              -                # Note, users start counting at 1. ;-)
              -                for page in pages:
              -                    merger.append(inputFile2, pages=(page-1, page))
              -            prev_insert = start_page + num_pages
              -
              -        input1 = PyPDF2.PdfFileReader(inputFile1)
              -        num_pages = input1.getNumPages()
              -        if prev_insert < num_pages:
              -            merger.append(
              -                inputFile1, pages=(prev_insert, num_pages))
              -
              -        outputFile = cStringIO.StringIO()
              -        merger.write(outputFile)
              -        return outputFile
              -
              -
              -class PDFPageFlowable(flowables.Flowable):
              -
              -    def __init__(self, width, height):
              -        flowables.Flowable.__init__(self)
              -        self.width = width
              -        self.height = height
              -
              -    def draw(self):
              -        pass
              -
              -    def split(self, availWidth, availheight):
              -        return [self]
              -
              -
              -class IncludePdfPagesFlowable(flowables.Flowable):
              -
              -    def __init__(self, pdf_file, pages, concatprocessor):
              -        flowables.Flowable.__init__(self)
              -        self.pdf_file = pdf_file
              -        self.proc = concatprocessor
              -        self.pages = pages
              -
              -        self.width = 10<<32
              -        self.height = 10<<32
              -
              -    def draw():
              -        return NotImplementedError('PDFPages shall be drawn not me')
              -
              -    def split(self, availWidth, availheight):
              -        pages = self.pages
              -        if not pages:
              -            pdf = PyPDF2.PdfFileReader(self.pdf_file)
              -            num_pages = pdf.getNumPages()
              -            pages = range(num_pages)
              -        else:
              -            num_pages = len(pages)
              -
              -        start_page = self.canv.getPageNumber()
              -        self.proc.operations.append(
              -            (start_page, self.pdf_file, self.pages, num_pages))
              -
              -        result = []
              -        for i in pages:
              -            result.append(flowables.PageBreak())
              -            result.append(PDFPageFlowable(availWidth, availheight))
              -        return result
              -
              -
              -class IIncludePdfPages(interfaces.IRMLDirectiveSignature):
              -    """Inserts a set of pages from a given PDF."""
              -
              -    filename = attr.File(
              -        title=u'Path to file',
              -        description=u'The pdf file to include.',
              -        required=True)
              -
              -    pages = attr.IntegerSequence(
              -        title=u'Pages',
              -        description=u'A list of pages to insert.',
              -        required=False)
              -
              -
              -class IncludePdfPages(flowable.Flowable):
              -    signature = IIncludePdfPages
              -
              -    def getProcessor(self):
              -        manager = attr.getManager(self, interfaces.IPostProcessorManager)
              -        procs = dict(manager.postProcessors)
              -        if 'CONCAT' not in procs:
              -            proc = ConcatenationPostProcessor()
              -            manager.postProcessors.append(('CONCAT', proc))
              -            return proc
              -        return procs['CONCAT']
              -
              -    def process(self):
              -        if PyPDF2 is None:
              -            raise Exception(
              -                'PyPDF2 is not installed, so this feature is not available.')
              -        args = dict(self.getAttributeValues())
              -        proc = self.getProcessor()
              -        self.parent.flow.append(
              -            IncludePdfPagesFlowable(args['filename'], args.get('pages'), proc))
              -
              -
              -flowable.Flow.factories['includePdfPages'] = IncludePdfPages
              -flowable.IFlow.setTaggedValue(
              -    'directives',
              -    flowable.IFlow.getTaggedValue('directives') +
              -    (occurence.ZeroOrMore('includePdfPages', IIncludePdfPages),)
              -    )
              diff --git a/z3c/rml/platypus.py b/z3c/rml/platypus.py
              deleted file mode 100644
              index 288ce604..00000000
              --- a/z3c/rml/platypus.py
              +++ /dev/null
              @@ -1,135 +0,0 @@
              -##############################################################################
              -#
              -# Copyright (c) 2007 Zope Foundation and Contributors.
              -# All Rights Reserved.
              -#
              -# This software is subject to the provisions of the Zope Public License,
              -# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
              -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
              -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
              -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
              -# FOR A PARTICULAR PURPOSE.
              -#
              -##############################################################################
              -"""Style Related Element Processing
              -"""
              -import reportlab.platypus.flowables
              -import reportlab.rl_config
              -from reportlab.rl_config import overlapAttachedSpace
              -import zope.interface
              -
              -from z3c.rml import interfaces
              -
              -# Fix problem with reportlab 2.0
              -class KeepInFrame(reportlab.platypus.flowables.KeepInFrame):
              -
              -    def __init__(self, maxWidth, maxHeight, content=[], mergeSpace=1,
              -                 mode='shrink', name=''):
              -        self.name = name
              -        self.maxWidth = maxWidth
              -        self.maxHeight = maxHeight
              -        self.mode = mode
              -        assert mode in ('error','overflow','shrink','truncate'), \
              -               '%s invalid mode value %s' % (self.identity(),mode)
              -        # This is an unnecessary check, since wrap() handles None just fine!
              -        #assert maxHeight>=0,  \
              -        #       '%s invalid maxHeight value %s' % (self.identity(),maxHeight)
              -        if mergeSpace is None: mergeSpace = overlapAttachedSpace
              -        self.mergespace = mergeSpace
              -        self._content = content
              -
              -
              -class BaseFlowable(reportlab.platypus.flowables.Flowable):
              -    def __init__(self, *args, **kw):
              -        reportlab.platypus.flowables.Flowable.__init__(self)
              -        self.args = args
              -        self.kw = kw
              -
              -    def wrap(self, *args):
              -        return (0, 0)
              -
              -    def draw(self):
              -        pass
              -
              -class Illustration(reportlab.platypus.flowables.Flowable):
              -    def __init__(self, processor, width, height):
              -        self.processor = processor
              -        self.width = width
              -        self.height = height
              -
              -    def wrap(self, *args):
              -        return (self.width, self.height)
              -
              -    def draw(self):
              -        # Import here to avoid recursive imports
              -        from z3c.rml import canvas
              -        self.canv.saveState()
              -        drawing = canvas.Drawing(
              -            self.processor.element, self.processor)
              -        zope.interface.alsoProvides(drawing, interfaces.ICanvasManager)
              -        drawing.canvas = self.canv
              -        drawing.process()
              -        self.canv.restoreState()
              -
              -class BookmarkPage(BaseFlowable):
              -    def draw(self):
              -        self.canv.bookmarkPage(*self.args, **self.kw)
              -
              -
              -class Bookmark(BaseFlowable):
              -    def draw(self):
              -        self.canv.bookmarkHorizontal(*self.args, **self.kw)
              -
              -
              -class OutlineAdd(BaseFlowable):
              -    def draw(self):
              -        if self.kw.get('key', None) is None:
              -            self.kw['key'] = str(hash(self))
              -        self.canv.bookmarkPage(self.kw['key'])
              -        self.canv.addOutlineEntry(**self.kw)
              -
              -
              -class Link(reportlab.platypus.flowables._Container,
              -           reportlab.platypus.flowables.Flowable):
              -
              -    def __init__(self, content, **args):
              -        self._content = content
              -        self.args = args
              -
              -    def wrap(self, availWidth, availHeight):
              -        self.width, self.height = reportlab.platypus.flowables._listWrapOn(
              -            self._content, availWidth, self.canv)
              -        return self.width, self.height
              -
              -    def drawOn(self, canv, x, y, _sW=0, scale=1.0, content=None, aW=None):
              -        '''we simulate being added to a frame'''
              -        pS = 0
              -        if aW is None: aW = self.width
              -        aW = scale*(aW+_sW)
              -        if content is None:
              -            content = self._content
              -        y += self.height*scale
              -
              -        startX = x
              -        startY = y
              -        totalWidth = 0
              -        totalHeight = 0
              -
              -        for c in content:
              -            w, h = c.wrapOn(canv,aW,0xfffffff)
              -            if w < reportlab.rl_config._FUZZ or h < reportlab.rl_config._FUZZ:
              -                continue
              -            if c is not content[0]: h += max(c.getSpaceBefore()-pS,0)
              -            y -= h
              -            c.drawOn(canv,x,y,_sW=aW-w)
              -            if c is not content[-1]:
              -                pS = c.getSpaceAfter()
              -                y -= pS
              -            totalWidth += w
              -            totalHeight += h
              -        rectangle = [startX, startY-totalHeight,
              -                startX+totalWidth, startY]
              -        if 'url' in self.args:
              -            canv.linkURL(rect=rectangle, **self.args)
              -        else:
              -            canv.linkAbsolute('', Rect=rectangle, **self.args)
              diff --git a/z3c/rml/reference.pt b/z3c/rml/reference.pt
              deleted file mode 100644
              index 1d5879e2..00000000
              --- a/z3c/rml/reference.pt
              +++ /dev/null
              @@ -1,294 +0,0 @@
              -
              -
              -
              -
              -
              -  
              -    
              -  
              -
              -  
              -    
              -    
              -    
              -    
              -    
              -    
              -    
              -    
              -    
              -    
              -    
              -    
              -    
              -      
              -    
              -  
              -
              -  
              -
              -  
              -    
              -    
              -    
              -      Introduction
              -    
              -    
              -      RML is a XML dialect for generating PDF files. Like HTML produces a page
              -      within the browser, RML produces a PDF file. The RML processor uses the
              -      ReportLab library to convert the RML text into a full PDF template.
              -    
              -    
              -      The original version of RML was developed by ReportLab, Inc. as a
              -      commercial extension to the free ReportLab library. This original
              -      version of RML is still available and supported by ReportLab, Inc. This
              -      version of RML, z3c.RML, is a free implementation of the XML dialect
              -      based on the available documentation. While it tries to keep some level
              -      of compatibility with the original version of RML, it is intended to
              -      provde a as clean and feature-rich API as possible.
              -    
              -    
              -      The contents of this document is auto-generated from the code itself and
              -      should thus be very accurate and complete.
              -    
              -
              -    
              -    
              -      Attribute Types
              -    
              -    Attribute Types
              -    
              -      This section list the types of attributes used for the attributes within
              -      the RML elements.
              -    
              -    
              -    
              -      
              -        Attribute Name
              -      
              -      Attribute Name
              -      
              -        Attribute purpose and data description.
              -      
              -    
              -
              -    
              -    
              -      Directives
              -    
              -    Directives
              -    
              -      
              -        Element Name
              -      
              -      
              -        Element Name
              -      
              -      
              -      
              -        Deprecated:
              -        Reason
              -      
              -      
              -        What is this element doing?
              -      
              -
              -      
              -        
              -          Attributes
              -        
              -        
              -          
              -            para
              -            
              -              (required)
              -            
              -            -
              -            Type
              -          
              -          
              -            Deprecated:
              -            Reason
              -          
              -          
              -            Title:
              -            Description
              -          
              -        
              -      
              -
              -      
              -        
              -          Content
              -        
              -        
              -          Type
              -          
              -            (required)
              -          
              -        
              -        
              -          Title:
              -          Description
              -        
              -      
              -
              -      
              -        
              -          Sub-Directives
              -        
              -        
              -          
              -            
              -              para
              -            
              -            
              -              (ZeroOrMore)
              -            
              -            
              -              (Deprecated)
              -            
              -          
              -        
              -      
              -
              -      
              -        
              -          Examples
              -        
              -        
              -          
              -            Example Code
              -          
              -          
              -            
              -              
              -                
              -                  (Extracted from file
              -                  
              -                    File,
              -                  
              -                  line )
              -                
              -              
              -              
              -                
              -                  
              -                    [PDF]
              -                  
              -                
              -              
              -            
              -          
              -        
              -      
              -
              -    
              -
              -  
              -
              -
              diff --git a/z3c/rml/reference.py b/z3c/rml/reference.py
              deleted file mode 100644
              index e5aeda69..00000000
              --- a/z3c/rml/reference.py
              +++ /dev/null
              @@ -1,242 +0,0 @@
              -##############################################################################
              -#
              -# Copyright (c) 2007 Zope Foundation and Contributors.
              -# All Rights Reserved.
              -#
              -# This software is subject to the provisions of the Zope Public License,
              -# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
              -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
              -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
              -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
              -# FOR A PARTICULAR PURPOSE.
              -#
              -##############################################################################
              -"""RML Reference Generator
              -"""
              -import copy
              -import re
              -import os
              -import pygments.token
              -import zope.schema
              -import zope.schema.interfaces
              -from lxml import etree
              -from xml.sax import saxutils
              -from pygments.lexers import XmlLexer
              -from z3c.rml import attr, document, interfaces, pagetemplate
              -
              -
              -INPUT_URL = ('https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/'
              -             'rml/tests/input/%s')
              -EXPECTED_URL = ('https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/'
              -                'rml/tests/expected/%s?raw=true')
              -
              -EXAMPLES_DIRECTORY = os.path.join(os.path.dirname(__file__), 'tests', 'input')
              -IGNORE_ATTRIBUTES = ('RMLAttribute', 'BaseChoice')
              -CONTENT_FIELD_TYPES = (
              -    attr.TextNode, attr.TextNodeSequence, attr.TextNodeGrid,
              -    attr.RawXMLContent, attr.XMLContent)
              -STYLES_FORMATTING = {
              -     pygments.token.Name.Tag : ('', ''),
              -     pygments.token.Literal.String : ('', ''),
              -    }
              -EXAMPLE_NS = 'http://namespaces.zope.org/rml/doc'
              -EXAMPLE_ATTR_NAME = '{%s}example' %EXAMPLE_NS
              -
              -
              -def dedent(rml):
              -    spaces = re.findall('\n( *)<', rml)
              -    if not spaces:
              -        return rml
              -    least = min([len(s) for s in spaces if s != ''])
              -    return rml.replace('\n'+' '*least, '\n')
              -
              -
              -def enforceColumns(rml, columns=80):
              -    result = []
              -    for line in rml.split('\n'):
              -        if len(line) <= columns:
              -            result.append(line)
              -            continue
              -        # Determine the indentation for all other lines
              -        lineStart = re.findall('^( *<[a-zA-Z0-9]+ )', line)
              -        lineIndent = 0
              -        if lineStart:
              -            lineIndent = len(lineStart[0])
              -        # Create lines having at most the specified number of columns
              -        while len(line) > columns:
              -            end = line[:columns].rfind(' ')
              -            result.append(line[:end])
              -            line = ' '*lineIndent + line[end+1:]
              -        result.append(line)
              -
              -    return '\n'.join(result)
              -
              -def highlightRML(rml):
              -    lexer = XmlLexer()
              -    styledRml = ''
              -    for ttype, token in lexer.get_tokens(rml):
              -        start, end = STYLES_FORMATTING.get(ttype, ('', ''))
              -        styledRml += start + saxutils.escape(token) + end
              -    return styledRml
              -
              -
              -def removeDocAttributes(elem):
              -    for name in elem.attrib.keys():
              -        if name.startswith('{'+EXAMPLE_NS+'}'):
              -            del elem.attrib[name]
              -    for child in elem.getchildren():
              -        removeDocAttributes(child)
              -
              -
              -def getAttributeTypes():
              -    types = []
              -    candidates = sorted(attr.__dict__.items(), key=lambda e: e[0])
              -    for name, candidate in candidates:
              -        if not (isinstance(candidate, type) and
              -                zope.schema.interfaces.IField.implementedBy(candidate) and
              -                name not in IGNORE_ATTRIBUTES):
              -            continue
              -        types.append({
              -            'name': name,
              -            'description': candidate.__doc__
              -            })
              -    return types
              -
              -
              -def formatField(field):
              -    return field.__class__.__name__
              -
              -def formatChoice(field):
              -    choices = ', '.join([repr(choice) for choice in field.choices.keys()])
              -    return '%s of (%s)' %(field.__class__.__name__, choices)
              -
              -def formatSequence(field):
              -    vtFormatter = typeFormatters.get(field.value_type.__class__, formatField)
              -    return '%s of %s' %(field.__class__.__name__, vtFormatter(field.value_type))
              -
              -def formatGrid(field):
              -    vtFormatter = typeFormatters.get(field.value_type.__class__, formatField)
              -    return '%s with %i cols of %s' %(
              -        field.__class__.__name__, field.columns, vtFormatter(field.value_type))
              -
              -def formatCombination(field):
              -    vts = [typeFormatters.get(vt.__class__, formatField)(vt)
              -           for vt in field.value_types]
              -    return '%s of %s' %(field.__class__.__name__, ', '.join(vts))
              -
              -typeFormatters = {
              -    attr.Choice: formatChoice,
              -    attr.Sequence: formatSequence,
              -    attr.Combination: formatCombination,
              -    attr.TextNodeSequence: formatSequence,
              -    attr.TextNodeGrid: formatGrid}
              -
              -def processSignature(name, signature, examples, directives=None):
              -    if directives is None:
              -        directives = {}
              -    # Process this directive
              -    if signature not in directives:
              -        info = {'name': name, 'description': signature.getDoc(),
              -                'id': str(hash(signature)), 'deprecated': False}
              -        # If directive is deprecated, then add some info
              -        if interfaces.IDeprecatedDirective.providedBy(signature):
              -            info['deprecated'] = True
              -            info['reason'] = signature.getTaggedValue('deprecatedReason')
              -        attrs = []
              -        content = None
              -        for fname, field in zope.schema.getFieldsInOrder(signature):
              -            # Handle the case, where the field describes the content
              -            typeFormatter = typeFormatters.get(field.__class__, formatField)
              -            fieldInfo = {
              -                'name': fname,
              -                'type': typeFormatter(field),
              -                'title': field.title,
              -                'description': field.description,
              -                'required': field.required,
              -                'deprecated': False,
              -                }
              -            if field.__class__ in CONTENT_FIELD_TYPES:
              -                content = fieldInfo
              -            else:
              -                attrs.append(fieldInfo)
              -
              -            # Add a separate entry for the deprecated field
              -            if interfaces.IDeprecated.providedBy(field):
              -                deprFieldInfo = fieldInfo.copy()
              -                deprFieldInfo['deprecated'] = True
              -                deprFieldInfo['name'] = field.deprecatedName
              -                deprFieldInfo['reason'] = field.deprecatedReason
              -                attrs.append(deprFieldInfo)
              -
              -        info['attributes'] = attrs
              -        info['content'] = content
              -        # Examples can be either gotten by interface path or tag name
              -        ifacePath = signature.__module__ + '.' + signature.__name__
              -        if ifacePath in examples:
              -            info['examples'] = examples[ifacePath]
              -        else:
              -            info['examples'] = examples.get(name, None)
              -
              -        subs = []
              -        for occurence in signature.queryTaggedValue('directives', ()):
              -            subs.append({
              -                'name': occurence.tag,
              -                'occurence': occurence.__class__.__name__,
              -                'deprecated': interfaces.IDeprecatedDirective.providedBy(
              -                                 occurence.signature),
              -                'id': str(hash(occurence.signature))
              -                })
              -        info['sub-directives'] = subs
              -        directives[signature] = info
              -    # Process Children
              -    for occurence in signature.queryTaggedValue('directives', ()):
              -        processSignature(occurence.tag, occurence.signature,
              -                         examples, directives)
              -
              -
              -def extractExamples(directory):
              -    examples = {}
              -    for filename in os.listdir(directory):
              -        if not filename.endswith('.rml'):
              -            continue
              -        rmlFile = open(os.path.join(directory, filename), 'r')
              -        root = etree.parse(rmlFile).getroot()
              -        elements = root.xpath('//@doc:example/parent::*',
              -                              namespaces={'doc': EXAMPLE_NS})
              -        # Phase 1: Collect all elements
              -        for elem in elements:
              -            demoTag = elem.get(EXAMPLE_ATTR_NAME) or elem.tag
              -            elemExamples = examples.setdefault(demoTag, [])
              -            elemExamples.append({
              -                'filename': filename,
              -                'line': elem.sourceline,
              -                'element': elem,
              -                'rmlurl': INPUT_URL %filename,
              -                'pdfurl': EXPECTED_URL %(filename[:-4]+'.pdf')
              -                })
              -        # Phase 2: Render all elements
              -        removeDocAttributes(root)
              -        for dirExamples in examples.values():
              -            for example in dirExamples:
              -                xml = etree.tounicode(example['element']).strip()
              -                xml = re.sub(
              -                    ' ?xmlns:doc="http://namespaces.zope.org/rml/doc"', '', xml)
              -                xml = dedent(xml)
              -                xml = enforceColumns(xml, 80)
              -                xml = highlightRML(xml)
              -                example['code'] = xml
              -
              -    return examples
              -
              -
              -def main(outPath=None):
              -    examples = extractExamples(EXAMPLES_DIRECTORY)
              -
              -    template = pagetemplate.RMLPageTemplateFile('reference.pt')
              -
              -    directives = {}
              -    processSignature('document', document.IDocument, examples, directives)
              -    directives = sorted(directives.values(), key=lambda d: d['name'])
              -
              -    pdf = template(types=getAttributeTypes(), directives=directives)
              -    open(outPath or 'rml-reference.pdf', 'wb').write(pdf)
              diff --git a/z3c/rml/rlfix.py b/z3c/rml/rlfix.py
              deleted file mode 100644
              index 78001c99..00000000
              --- a/z3c/rml/rlfix.py
              +++ /dev/null
              @@ -1,50 +0,0 @@
              -##############################################################################
              -#
              -# Copyright (c) 2012 Zope Foundation and Contributors.
              -# All Rights Reserved.
              -#
              -# This software is subject to the provisions of the Zope Public License,
              -# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
              -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
              -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
              -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
              -# FOR A PARTICULAR PURPOSE.
              -#
              -##############################################################################
              -"""ReportLab fixups.
              -"""
              -__docformat__ = "reStructuredText"
              -from reportlab.pdfbase import pdfform, pdfmetrics, ttfonts
              -from reportlab.pdfbase.pdfpattern import PDFPattern
              -from reportlab.graphics import testshapes
              -
              -def resetPdfForm():
              -    pdfform.PDFDOCENC = PDFPattern(pdfform.PDFDocEncodingPattern)
              -    pdfform.ENCODING = PDFPattern(
              -        pdfform.EncodingPattern, PDFDocEncoding=pdfform.PDFDOCENC)
              -    pdfform.GLOBALFONTSDICTIONARY = pdfform.FormFontsDictionary()
              -    pdfform.GLOBALRESOURCES = pdfform.FormResources()
              -    pdfform.ZADB = PDFPattern(pdfform.ZaDbPattern)
              -
              -def resetFonts():
              -    # testshapes._setup registers the Vera fonts every time which is a little
              -    # slow on all platforms. On Windows it lists the entire system font
              -    # directory and registers them all which is very slow.
              -    pdfmetrics.registerFont(ttfonts.TTFont("Vera", "Vera.ttf"))
              -    pdfmetrics.registerFont(ttfonts.TTFont("VeraBd", "VeraBd.ttf"))
              -    pdfmetrics.registerFont(ttfonts.TTFont("VeraIt", "VeraIt.ttf"))
              -    pdfmetrics.registerFont(ttfonts.TTFont("VeraBI", "VeraBI.ttf"))
              -    for f in ('Times-Roman','Courier','Helvetica','Vera', 'VeraBd', 'VeraIt',
              -              'VeraBI'):
              -        if f not in testshapes._FONTS:
              -            testshapes._FONTS.append(f)
              -
              -def setSideLabels():
              -    from reportlab.graphics.charts import piecharts
              -    piecharts.Pie3d.sideLabels = 0
              -setSideLabels()
              -
              -from reportlab.rl_config import register_reset
              -register_reset(resetPdfForm)
              -register_reset(resetFonts)
              -del register_reset
              diff --git a/z3c/rml/rml-reference.pdf b/z3c/rml/rml-reference.pdf
              deleted file mode 100644
              index 863fb038..00000000
              --- a/z3c/rml/rml-reference.pdf
              +++ /dev/null
              @@ -1,5978 +0,0 @@
              -%PDF-1.4
              -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com
              -1 0 obj
              -<< /F1 2 0 R /F2 4 0 R /F3 5 0 R /F4 7 0 R /F5 10 0 R /F6 11 0 R 
              -  /F7 12 0 R >>
              -endobj
              -2 0 obj
              -<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font >>
              -endobj
              -3 0 obj
              -<< /Contents 1294 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans <<  >> 
              -  /Type /Page >>
              -endobj
              -4 0 obj
              -<< /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font >>
              -endobj
              -5 0 obj
              -<< /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font >>
              -endobj
              -6 0 obj
              -<< /Contents 1295 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans <<  >> 
              -  /Type /Page >>
              -endobj
              -7 0 obj
              -<< /BaseFont /Times-Bold /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font >>
              -endobj
              -8 0 obj
              -<< /Contents 1296 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans <<  >> 
              -  /Type /Page >>
              -endobj
              -9 0 obj
              -<< /Contents 1297 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans <<  >> 
              -  /Type /Page >>
              -endobj
              -10 0 obj
              -<< /BaseFont /Times-BoldItalic /Encoding /WinAnsiEncoding /Name /F5 /Subtype /Type1 /Type /Font >>
              -endobj
              -11 0 obj
              -<< /BaseFont /Times-Italic /Encoding /WinAnsiEncoding /Name /F6 /Subtype /Type1 /Type /Font >>
              -endobj
              -12 0 obj
              -<< /BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F7 /Subtype /Type1 /Type /Font >>
              -endobj
              -13 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-addMapping.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 482.9469 241.3961 494.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -14 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-addMapping.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 482.9469 297.6378 494.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -15 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-addMapping.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 482.9469 323.1978 494.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -16 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-addMapping.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 482.9469 323.1978 494.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -17 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-alias.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 306.9469 209.7361 318.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -18 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-alias.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 306.9469 297.6378 318.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -19 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-alias.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 306.9469 323.1978 318.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -20 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-alias.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 306.9469 323.1978 318.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -21 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-barChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 101.9469 227.5161 113.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -22 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 101.9469 297.6378 113.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -23 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 101.9469 323.1978 113.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -24 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 101.9469 323.1978 113.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -25 0 obj
              -<< /Annots [ 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 
              -  23 0 R 24 0 R ] /Contents 1298 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -26 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 229 0 R /Fit ] /Rect [ 56.69291 183.1969 538.5827 195.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -27 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 69 0 R /Fit ] /Rect [ 56.69291 171.1969 538.5827 183.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -28 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 166 0 R /Fit ] /Rect [ 56.69291 159.1969 538.5827 171.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -29 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1058 0 R /Fit ] /Rect [ 56.69291 147.1969 538.5827 159.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -30 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 67 0 R /Fit ] /Rect [ 56.69291 135.1969 538.5827 147.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -31 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1023 0 R /Fit ] /Rect [ 56.69291 123.1969 538.5827 135.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -32 0 obj
              -<< /Annots [ 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R ] /Contents 1299 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -33 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-barChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 518.9469 227.5161 530.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -34 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 518.9469 297.6378 530.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -35 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 518.9469 323.1978 530.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -36 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 518.9469 323.1978 530.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -37 0 obj
              -<< /Annots [ 33 0 R 34 0 R 35 0 R 36 0 R ] /Contents 1300 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -38 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 229 0 R /Fit ] /Rect [ 56.69291 473.1969 538.5827 485.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -39 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 69 0 R /Fit ] /Rect [ 56.69291 461.1969 538.5827 473.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -40 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 166 0 R /Fit ] /Rect [ 56.69291 449.1969 538.5827 461.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -41 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1058 0 R /Fit ] /Rect [ 56.69291 437.1969 538.5827 449.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -42 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 67 0 R /Fit ] /Rect [ 56.69291 425.1969 538.5827 437.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -43 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1023 0 R /Fit ] /Rect [ 56.69291 413.1969 538.5827 425.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -44 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-barChart3d.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 119.9469 237.5161 131.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -45 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart3d.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 119.9469 297.6378 131.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -46 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart3d.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 119.9469 323.1978 131.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -47 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart3d.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 119.9469 323.1978 131.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -48 0 obj
              -<< /Annots [ 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R ] /Contents 1301 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -49 0 obj
              -<< /Contents 1302 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans <<  >> 
              -  /Type /Page >>
              -endobj
              -50 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-barcode.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 516.9469 223.0561 528.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -51 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barcode.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 516.9469 297.6378 528.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -52 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barcode.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 516.9469 323.1978 528.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -53 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barcode.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 516.9469 323.1978 528.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -54 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-barcode.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 426.9469 223.0561 438.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -55 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barcode.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 426.9469 297.6378 438.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -56 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barcode.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 426.9469 323.1978 438.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -57 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barcode.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 426.9469 323.1978 438.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -58 0 obj
              -<< /Annots [ 50 0 R 51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 56 0 R 57 0 R ] /Contents 1303 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -59 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-barCodeFlowable.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 224.9469 263.0661 236.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -60 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barCodeFlowable.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 212.9469 297.6378 224.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -61 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barCodeFlowable.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 212.9469 323.1978 224.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -62 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barCodeFlowable.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 212.9469 323.1978 224.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -63 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-barCodeFlowable.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 146.9469 263.0661 158.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -64 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barCodeFlowable.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 134.9469 297.6378 146.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -65 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barCodeFlowable.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 134.9469 323.1978 146.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -66 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barCodeFlowable.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 134.9469 323.1978 146.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -67 0 obj
              -<< /Annots [ 59 0 R 60 0 R 61 0 R 62 0 R 63 0 R 64 0 R 65 0 R 66 0 R ] /Contents 1304 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -68 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 474 0 R /Fit ] /Rect [ 56.69291 84.19685 538.5827 96.19685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -69 0 obj
              -<< /Annots [ 68 0 R ] /Contents 1305 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -70 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 25 0 R /Fit ] /Rect [ 56.69291 625.1969 538.5827 637.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -71 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 423.9469 254.1661 435.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -72 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 423.9469 297.6378 435.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -73 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 423.9469 323.1978 435.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -74 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 423.9469 323.1978 435.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -75 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 160.9469 254.1661 172.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -76 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 160.9469 297.6378 172.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -77 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 160.9469 323.1978 172.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -78 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 160.9469 323.1978 172.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -79 0 obj
              -<< /Annots [ 70 0 R 71 0 R 72 0 R 73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R ] /Contents 1306 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -80 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 678.9469 254.1661 690.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -81 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 678.9469 297.6378 690.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -82 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 678.9469 323.1978 690.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -83 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 678.9469 323.1978 690.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -84 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 473.9469 254.1661 485.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -85 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 473.9469 297.6378 485.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -86 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 473.9469 323.1978 485.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -87 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 473.9469 323.1978 485.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -88 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 210.9469 254.1661 222.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -89 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 210.9469 297.6378 222.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -90 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 210.9469 323.1978 222.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -91 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 210.9469 323.1978 222.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -92 0 obj
              -<< /Annots [ 80 0 R 81 0 R 82 0 R 83 0 R 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 
              -  90 0 R 91 0 R ] /Contents 1307 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -93 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 741.9469 254.1661 753.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -94 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 741.9469 297.6378 753.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -95 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 741.9469 323.1978 753.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -96 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 741.9469 323.1978 753.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -97 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 536.9469 254.1661 548.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -98 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 536.9469 297.6378 548.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -99 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 536.9469 323.1978 548.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -100 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 536.9469 323.1978 548.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -101 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 331.9469 254.1661 343.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -102 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 331.9469 297.6378 343.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -103 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 331.9469 323.1978 343.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -104 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 331.9469 323.1978 343.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -105 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 126.9469 254.1661 138.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -106 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 126.9469 297.6378 138.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -107 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 126.9469 323.1978 138.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -108 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 126.9469 323.1978 138.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -109 0 obj
              -<< /Annots [ 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R 
              -  103 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R ] /Contents 1308 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -110 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 678.9469 254.1661 690.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -111 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 678.9469 297.6378 690.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -112 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 678.9469 323.1978 690.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -113 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 678.9469 323.1978 690.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -114 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1043 0 R /Fit ] /Rect [ 56.69291 430.1969 538.5827 442.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -115 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 166 0 R /Fit ] /Rect [ 56.69291 418.1969 538.5827 430.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -116 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 124 0 R /Fit ] /Rect [ 56.69291 406.1969 538.5827 418.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -117 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-blockTable-1.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 244.9469 243.0561 256.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -118 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTable-1.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 244.9469 297.6378 256.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -119 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTable-1.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 244.9469 323.1978 256.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -120 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTable-1.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 244.9469 323.1978 256.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -121 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 92 0 R /Fit ] /Rect [ 56.69291 83.19685 538.5827 95.19685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -122 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 92 0 R /Fit ] /Rect [ 56.69291 71.19685 538.5827 83.19685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -123 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 148 0 R /Fit ] /Rect [ 56.69291 59.19685 538.5827 71.19685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -124 0 obj
              -<< /Annots [ 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R 119 0 R 
              -  120 0 R 121 0 R 122 0 R 123 0 R ] /Contents 1309 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -125 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 79 0 R /Fit ] /Rect [ 56.69291 773.1969 538.5827 785.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -126 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 109 0 R /Fit ] /Rect [ 56.69291 761.1969 538.5827 773.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -127 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 109 0 R /Fit ] /Rect [ 56.69291 749.1969 538.5827 761.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -128 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 79 0 R /Fit ] /Rect [ 56.69291 737.1969 538.5827 749.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -129 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 148 0 R /Fit ] /Rect [ 56.69291 725.1969 538.5827 737.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -130 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 79 0 R /Fit ] /Rect [ 56.69291 713.1969 538.5827 725.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -131 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 109 0 R /Fit ] /Rect [ 56.69291 701.1969 538.5827 713.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -132 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 92 0 R /Fit ] /Rect [ 56.69291 689.1969 538.5827 701.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -133 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 148 0 R /Fit ] /Rect [ 56.69291 677.1969 538.5827 689.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -134 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 109 0 R /Fit ] /Rect [ 56.69291 665.1969 538.5827 677.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -135 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 543 0 R /Fit ] /Rect [ 56.69291 653.1969 538.5827 665.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -136 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 575.9469 254.1661 587.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -137 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 575.9469 297.6378 587.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -138 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 575.9469 323.1978 587.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -139 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 575.9469 323.1978 587.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -140 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 370.9469 254.1661 382.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -141 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 370.9469 297.6378 382.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -142 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 370.9469 323.1978 382.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -143 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 370.9469 323.1978 382.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -144 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 165.9469 254.1661 177.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -145 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 165.9469 297.6378 177.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -146 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 165.9469 323.1978 177.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -147 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 165.9469 323.1978 177.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -148 0 obj
              -<< /Annots [ 125 0 R 126 0 R 127 0 R 128 0 R 129 0 R 130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 
              -  135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R 141 0 R 142 0 R 143 0 R 144 0 R 
              -  145 0 R 146 0 R 147 0 R ] /Contents 1310 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -149 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-blockTableStyle.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 678.9469 254.1661 690.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -150 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 678.9469 297.6378 690.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -151 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 678.9469 323.1978 690.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -152 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTableStyle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 678.9469 323.1978 690.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -153 0 obj
              -<< /Annots [ 149 0 R 150 0 R 151 0 R 152 0 R ] /Contents 1311 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -154 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-bookmark.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 661.9469 230.2761 673.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -155 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-bookmark.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 661.9469 297.6378 673.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -156 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-bookmark.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 661.9469 323.1978 673.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -157 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-bookmark.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 661.9469 323.1978 673.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -158 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-bookmark.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 619.9469 230.2761 631.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -159 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-bookmark.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 619.9469 297.6378 631.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -160 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-bookmark.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 619.9469 323.1978 631.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -161 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-bookmark.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 619.9469 323.1978 631.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -162 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-blockTable-bulkData.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 388.9469 275.2761 400.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -163 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTable-bulkData.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 376.9469 297.6378 388.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -164 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTable-bulkData.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 376.9469 323.1978 388.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -165 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTable-bulkData.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 376.9469 323.1978 388.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -166 0 obj
              -<< /Annots [ 154 0 R 155 0 R 156 0 R 157 0 R 158 0 R 159 0 R 160 0 R 161 0 R 162 0 R 163 0 R 
              -  164 0 R 165 0 R ] /Contents 1312 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -167 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 183 0 R /Fit ] /Rect [ 56.69291 241.1969 538.5827 253.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -168 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 476 0 R /Fit ] /Rect [ 56.69291 229.1969 538.5827 241.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -169 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-barChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 79.94685 227.5161 91.94685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -170 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 79.94685 297.6378 91.94685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -171 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 79.94685 323.1978 91.94685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -172 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 79.94685 323.1978 91.94685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -173 0 obj
              -<< /Annots [ 167 0 R 168 0 R 169 0 R 170 0 R 171 0 R 172 0 R ] /Contents 1313 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -174 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 583 0 R /Fit ] /Rect [ 56.69291 717.1969 538.5827 729.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -175 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-barChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 603.9469 227.5161 615.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -176 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 603.9469 297.6378 615.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -177 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 603.9469 323.1978 615.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -178 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 603.9469 323.1978 615.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -179 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-circle.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 340.9469 213.0561 352.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -180 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-circle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 340.9469 297.6378 352.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -181 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-circle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 340.9469 323.1978 352.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -182 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-circle.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 340.9469 323.1978 352.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -183 0 obj
              -<< /Annots [ 174 0 R 175 0 R 176 0 R 177 0 R 178 0 R 179 0 R 180 0 R 181 0 R 182 0 R ] /Contents 1314 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -184 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-codesnippet.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 698.9469 238.0561 710.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -185 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-codesnippet.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 698.9469 297.6378 710.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -186 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-codesnippet.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 698.9469 323.1978 710.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -187 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-codesnippet.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 698.9469 323.1978 710.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -188 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-codesnippet.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 620.9469 238.0561 632.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -189 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-codesnippet.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 620.9469 297.6378 632.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -190 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-codesnippet.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 620.9469 323.1978 632.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -191 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-codesnippet.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 620.9469 323.1978 632.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -192 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-color.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 270.9469 211.3961 282.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -193 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-color.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 270.9469 297.6378 282.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -194 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-color.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 270.9469 323.1978 282.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -195 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-color.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 270.9469 323.1978 282.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -196 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-condPageBreak.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 123.9469 254.1561 135.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -197 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-condPageBreak.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 123.9469 297.6378 135.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -198 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-condPageBreak.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 123.9469 323.1978 135.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -199 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-condPageBreak.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 123.9469 323.1978 135.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -200 0 obj
              -<< /Annots [ 184 0 R 185 0 R 186 0 R 187 0 R 188 0 R 189 0 R 190 0 R 191 0 R 192 0 R 193 0 R 
              -  194 0 R 195 0 R 196 0 R 197 0 R 198 0 R 199 0 R ] /Contents 1315 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -201 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-log.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 707.9469 203.0661 719.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -202 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 707.9469 297.6378 719.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -203 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 707.9469 323.1978 719.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -204 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 707.9469 323.1978 719.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -205 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-cropMarks.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 374.9469 234.1661 386.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -206 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-cropMarks.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 374.9469 297.6378 386.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -207 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-cropMarks.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 374.9469 323.1978 386.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -208 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-cropMarks.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 374.9469 323.1978 386.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -209 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-curves.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 179.9469 216.3861 191.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -210 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-curves.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 179.9469 297.6378 191.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -211 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-curves.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 179.9469 323.1978 191.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -212 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-curves.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 179.9469 323.1978 191.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -213 0 obj
              -<< /Annots [ 201 0 R 202 0 R 203 0 R 204 0 R 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R 210 0 R 
              -  211 0 R 212 0 R ] /Contents 1316 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -214 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-path.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 627.9469 208.0661 639.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -215 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-path.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 627.9469 297.6378 639.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -216 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-path.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 627.9469 323.1978 639.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -217 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-path.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 627.9469 323.1978 639.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -218 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 814 0 R /Fit ] /Rect [ 56.69291 546.1969 538.5827 558.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -219 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-barChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 456.9469 227.5161 468.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -220 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 456.9469 297.6378 468.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -221 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 456.9469 323.1978 468.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -222 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 456.9469 323.1978 468.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -223 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 814 0 R /Fit ] /Rect [ 56.69291 375.1969 538.5827 387.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -224 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-linePlot.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 141.9469 221.9561 153.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -225 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 141.9469 297.6378 153.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -226 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 141.9469 323.1978 153.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -227 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 141.9469 323.1978 153.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -228 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 814 0 R /Fit ] /Rect [ 56.69291 60.19685 538.5827 72.19685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -229 0 obj
              -<< /Annots [ 214 0 R 215 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R 221 0 R 222 0 R 223 0 R 
              -  224 0 R 225 0 R 226 0 R 227 0 R 228 0 R ] /Contents 1317 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -230 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-pieChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 717.9469 225.8461 729.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -231 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 717.9469 297.6378 729.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -232 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 717.9469 323.1978 729.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -233 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 717.9469 323.1978 729.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -234 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-log.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 570.9469 203.0661 582.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -235 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 570.9469 297.6378 582.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -236 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 570.9469 323.1978 582.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -237 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 570.9469 323.1978 582.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -238 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-doc.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 394.9469 204.7261 406.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -239 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 394.9469 297.6378 406.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -240 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 394.9469 323.1978 406.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -241 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 394.9469 323.1978 406.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -242 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-doc.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 364.9469 204.7261 376.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -243 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 364.9469 297.6378 376.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -244 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 364.9469 323.1978 376.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -245 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 364.9469 323.1978 376.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -246 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-doc.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 268.9469 204.7261 280.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -247 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 268.9469 297.6378 280.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -248 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 268.9469 323.1978 280.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -249 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 268.9469 323.1978 280.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -250 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-doc.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 121.9469 204.7261 133.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -251 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 121.9469 297.6378 133.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -252 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 121.9469 323.1978 133.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -253 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 121.9469 323.1978 133.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -254 0 obj
              -<< /Annots [ 230 0 R 231 0 R 232 0 R 233 0 R 234 0 R 235 0 R 236 0 R 237 0 R 238 0 R 239 0 R 
              -  240 0 R 241 0 R 242 0 R 243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 
              -  250 0 R 251 0 R 252 0 R 253 0 R ] /Contents 1318 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -255 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-doc.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 659.9469 204.7261 671.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -256 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 659.9469 297.6378 671.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -257 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 659.9469 323.1978 671.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -258 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 659.9469 323.1978 671.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -259 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-doc.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 425.9469 204.7261 437.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -260 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 425.9469 297.6378 437.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -261 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 425.9469 323.1978 437.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -262 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 425.9469 323.1978 437.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -263 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-doc.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 242.9469 204.7261 254.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -264 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 242.9469 297.6378 254.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -265 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 242.9469 323.1978 254.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -266 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-doc.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 242.9469 323.1978 254.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -267 0 obj
              -<< /Annots [ 255 0 R 256 0 R 257 0 R 258 0 R 259 0 R 260 0 R 261 0 R 262 0 R 263 0 R 264 0 R 
              -  265 0 R 266 0 R ] /Contents 1319 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -268 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 200 0 R /Fit ] /Rect [ 56.69291 415.1969 538.5827 427.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -269 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 583 0 R /Fit ] /Rect [ 56.69291 403.1969 538.5827 415.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -270 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 783 0 R /Fit ] /Rect [ 56.69291 391.1969 538.5827 403.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -271 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 766 0 R /Fit ] /Rect [ 56.69291 379.1969 538.5827 391.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -272 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 766 0 R /Fit ] /Rect [ 56.69291 367.1969 538.5827 379.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -273 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 783 0 R /Fit ] /Rect [ 56.69291 355.1969 538.5827 367.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -274 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 783 0 R /Fit ] /Rect [ 56.69291 343.1969 538.5827 355.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -275 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 25 0 R /Fit ] /Rect [ 56.69291 331.1969 538.5827 343.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -276 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 570 0 R /Fit ] /Rect [ 56.69291 319.1969 538.5827 331.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -277 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 213 0 R /Fit ] /Rect [ 56.69291 307.1969 538.5827 319.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -278 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 909 0 R /Fit ] /Rect [ 56.69291 295.1969 538.5827 307.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -279 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-docinit-viewer-options.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 181.9469 278.3361 193.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -280 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-docinit-viewer-options.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 169.9469 297.6378 181.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -281 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-docinit-viewer-options.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 169.9469 323.1978 181.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -282 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-docinit-viewer-options.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 169.9469 323.1978 181.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -283 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-addMapping.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 103.9469 241.3961 115.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -284 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-addMapping.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 103.9469 297.6378 115.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -285 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-addMapping.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 103.9469 323.1978 115.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -286 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-addMapping.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 103.9469 323.1978 115.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -287 0 obj
              -<< /Annots [ 268 0 R 269 0 R 270 0 R 271 0 R 272 0 R 273 0 R 274 0 R 275 0 R 276 0 R 277 0 R 
              -  278 0 R 279 0 R 280 0 R 281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R ] /Contents 1320 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -288 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-registerTTFont.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 746.9469 251.4061 758.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -289 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerTTFont.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 746.9469 297.6378 758.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -290 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerTTFont.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 746.9469 323.1978 758.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -291 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerTTFont.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 746.9469 323.1978 758.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -292 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 267 0 R /Fit ] /Rect [ 56.69291 411.1969 538.5827 423.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -293 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 985 0 R /Fit ] /Rect [ 56.69291 399.1969 538.5827 411.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -294 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 995 0 R /Fit ] /Rect [ 56.69291 387.1969 538.5827 399.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -295 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 909 0 R /Fit ] /Rect [ 56.69291 375.1969 538.5827 387.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -296 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 683 0 R /Fit ] /Rect [ 56.69291 363.1969 538.5827 375.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -297 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 614 0 R /Fit ] /Rect [ 56.69291 351.1969 538.5827 363.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -298 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-document-annotations.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 165.9469 277.2261 177.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -299 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-annotations.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 153.9469 297.6378 165.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -300 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-annotations.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 153.9469 323.1978 165.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -301 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-annotations.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 153.9469 323.1978 165.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -302 0 obj
              -<< /Annots [ 288 0 R 289 0 R 290 0 R 291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 
              -  298 0 R 299 0 R 300 0 R 301 0 R ] /Contents 1321 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -303 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-document-story.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 734.9469 252.4961 746.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -304 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-story.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 734.9469 297.6378 746.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -305 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-story.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 734.9469 323.1978 746.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -306 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-story.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 734.9469 323.1978 746.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -307 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-document-pageDrawing.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 656.9469 284.9961 668.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -308 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-pageDrawing.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 644.9469 297.6378 656.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -309 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-pageDrawing.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 644.9469 323.1978 656.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -310 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-pageDrawing.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 644.9469 323.1978 656.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -311 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-drawAlignedString.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 388.9469 266.4061 400.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -312 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-drawAlignedString.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 376.9469 297.6378 388.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -313 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-drawAlignedString.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 376.9469 323.1978 388.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -314 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-drawAlignedString.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 376.9469 323.1978 388.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -315 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-drawCenteredString.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 149.9469 271.9561 161.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -316 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-drawCenteredString.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 137.9469 297.6378 149.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -317 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-drawCenteredString.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 137.9469 323.1978 149.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -318 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-drawCenteredString.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 137.9469 323.1978 149.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -319 0 obj
              -<< /Annots [ 303 0 R 304 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R 310 0 R 311 0 R 312 0 R 
              -  313 0 R 314 0 R 315 0 R 316 0 R 317 0 R 318 0 R ] /Contents 1322 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -320 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-drawRightString.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 627.9469 256.9661 639.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -321 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-drawRightString.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 627.9469 297.6378 639.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -322 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-drawRightString.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 627.9469 323.1978 639.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -323 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-drawRightString.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 627.9469 323.1978 639.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -324 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-drawString.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 400.9469 235.2961 412.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -325 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-drawString.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 400.9469 297.6378 412.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -326 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-drawString.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 400.9469 323.1978 412.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -327 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-drawString.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 400.9469 323.1978 412.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -328 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-ellipse.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 96.94685 216.3961 108.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -329 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ellipse.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 96.94685 297.6378 108.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -330 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ellipse.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 96.94685 323.1978 108.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -331 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ellipse.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 96.94685 323.1978 108.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -332 0 obj
              -<< /Annots [ 320 0 R 321 0 R 322 0 R 323 0 R 324 0 R 325 0 R 326 0 R 327 0 R 328 0 R 329 0 R 
              -  330 0 R 331 0 R ] /Contents 1323 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -333 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-log.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 668.9469 203.0661 680.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -334 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 668.9469 297.6378 680.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -335 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 668.9469 323.1978 680.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -336 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 668.9469 323.1978 680.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -337 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-fill.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 521.9469 201.4061 533.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -338 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-fill.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 521.9469 297.6378 533.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -339 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-fill.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 521.9469 323.1978 533.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -340 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-fill.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 521.9469 323.1978 533.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -341 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-fixedSize.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 201.9469 225.8361 213.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -342 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-fixedSize.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 201.9469 297.6378 213.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -343 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-fixedSize.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 201.9469 323.1978 213.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -344 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-fixedSize.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 201.9469 323.1978 213.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -345 0 obj
              -<< /Annots [ 333 0 R 334 0 R 335 0 R 336 0 R 337 0 R 338 0 R 339 0 R 340 0 R 341 0 R 342 0 R 
              -  343 0 R 344 0 R ] /Contents 1324 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -346 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-document-annotations.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 516.9469 277.2261 528.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -347 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-annotations.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 504.9469 297.6378 516.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -348 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-annotations.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 504.9469 323.1978 516.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -349 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-annotations.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 504.9469 323.1978 516.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -350 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-document-story.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 474.9469 252.4961 486.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -351 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-story.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 474.9469 297.6378 486.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -352 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-story.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 474.9469 323.1978 486.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -353 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-story.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 474.9469 323.1978 486.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -354 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-grid.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 298.9469 206.9561 310.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -355 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-grid.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 298.9469 297.6378 310.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -356 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-grid.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 298.9469 323.1978 310.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -357 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-grid.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 298.9469 323.1978 310.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -358 0 obj
              -<< /Annots [ 346 0 R 347 0 R 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R 355 0 R 
              -  356 0 R 357 0 R ] /Contents 1325 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -359 0 obj
              -<< /Contents 1326 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans <<  >> 
              -  /Type /Page >>
              -endobj
              -360 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-para.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 741.9469 209.1761 753.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -361 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 741.9469 297.6378 753.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -362 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 741.9469 323.1978 753.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -363 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 741.9469 323.1978 753.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -364 0 obj
              -<< /Annots [ 360 0 R 361 0 R 362 0 R 363 0 R ] /Contents 1327 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -365 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-para.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 453.9469 209.1761 465.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -366 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 453.9469 297.6378 465.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -367 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 453.9469 323.1978 465.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -368 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 453.9469 323.1978 465.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -369 0 obj
              -<< /Annots [ 365 0 R 366 0 R 367 0 R 368 0 R ] /Contents 1328 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -370 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-para.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 163.9469 209.1761 175.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -371 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 163.9469 297.6378 175.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -372 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 163.9469 323.1978 175.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -373 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 163.9469 323.1978 175.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -374 0 obj
              -<< /Annots [ 370 0 R 371 0 R 372 0 R 373 0 R ] /Contents 1329 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -375 0 obj
              -<< /Contents 1330 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans <<  >> 
              -  /Type /Page >>
              -endobj
              -376 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-para.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 598.9469 209.1761 610.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -377 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 598.9469 297.6378 610.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -378 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 598.9469 323.1978 610.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -379 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 598.9469 323.1978 610.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -380 0 obj
              -<< /Annots [ 376 0 R 377 0 R 378 0 R 379 0 R ] /Contents 1331 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -381 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-para.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 308.9469 209.1761 320.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -382 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 308.9469 297.6378 320.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -383 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 308.9469 323.1978 320.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -384 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 308.9469 323.1978 320.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -385 0 obj
              -<< /Annots [ 381 0 R 382 0 R 383 0 R 384 0 R ] /Contents 1332 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -386 0 obj
              -<< /Contents 1333 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans <<  >> 
              -  /Type /Page >>
              -endobj
              -387 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-para.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 741.9469 209.1761 753.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -388 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 741.9469 297.6378 753.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -389 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 741.9469 323.1978 753.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -390 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 741.9469 323.1978 753.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -391 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-hr.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 350.9469 199.1761 362.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -392 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-hr.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 350.9469 297.6378 362.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -393 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-hr.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 350.9469 323.1978 362.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -394 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-hr.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 350.9469 323.1978 362.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -395 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-illustration.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 90.94685 234.7461 102.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -396 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-illustration.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 90.94685 297.6378 102.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -397 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-illustration.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 90.94685 323.1978 102.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -398 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-illustration.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 90.94685 323.1978 102.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -399 0 obj
              -<< /Annots [ 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R 392 0 R 393 0 R 394 0 R 395 0 R 396 0 R 
              -  397 0 R 398 0 R ] /Contents 1334 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -400 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-image.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 470.9469 214.7261 482.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -401 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-image.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 470.9469 297.6378 482.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -402 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-image.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 470.9469 323.1978 482.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -403 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-image.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 470.9469 323.1978 482.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -404 0 obj
              -<< /Annots [ 400 0 R 401 0 R 402 0 R 403 0 R ] /Contents 1335 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -405 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-imageAndFlowables.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 770.9469 272.5061 782.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -406 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-imageAndFlowables.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 758.9469 297.6378 770.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -407 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-imageAndFlowables.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 758.9469 323.1978 770.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -408 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-imageAndFlowables.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 758.9469 323.1978 770.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -409 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-imageAndFlowables-svg.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 680.9469 286.6661 692.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -410 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-imageAndFlowables-svg.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 668.9469 297.6378 680.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -411 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-imageAndFlowables-svg.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 668.9469 323.1978 680.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -412 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-imageAndFlowables-svg.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 668.9469 323.1978 680.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -413 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-img.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 335.9469 205.2861 347.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -414 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-img.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 335.9469 297.6378 347.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -415 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-img.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 335.9469 323.1978 347.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -416 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-img.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 335.9469 323.1978 347.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -417 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-img.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 305.9469 205.2861 317.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -418 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-img.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 305.9469 297.6378 317.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -419 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-img.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 305.9469 323.1978 317.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -420 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-img.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 305.9469 323.1978 317.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -421 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-img.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 263.9469 205.2861 275.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -422 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-img.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 263.9469 297.6378 275.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -423 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-img.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 263.9469 323.1978 275.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -424 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-img.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 263.9469 323.1978 275.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -425 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-includePdfPages.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 87.94685 258.0561 99.94685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -426 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-includePdfPages.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 87.94685 297.6378 99.94685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -427 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-includePdfPages.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 87.94685 323.1978 99.94685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -428 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-includePdfPages.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 87.94685 323.1978 99.94685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -429 0 obj
              -<< /Annots [ 405 0 R 406 0 R 407 0 R 408 0 R 409 0 R 410 0 R 411 0 R 412 0 R 413 0 R 414 0 R 
              -  415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R 422 0 R 423 0 R 424 0 R 
              -  425 0 R 426 0 R 427 0 R 428 0 R ] /Contents 1336 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -430 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-indent.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 495.9469 215.2861 507.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -431 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-indent.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 495.9469 297.6378 507.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -432 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-indent.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 495.9469 323.1978 507.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -433 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-indent.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 495.9469 323.1978 507.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -434 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-log.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 348.9469 203.0661 360.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -435 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 348.9469 297.6378 360.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -436 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 348.9469 323.1978 360.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -437 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 348.9469 323.1978 360.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -438 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 583 0 R /Fit ] /Rect [ 56.69291 267.1969 538.5827 279.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -439 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 25 0 R /Fit ] /Rect [ 56.69291 255.1969 538.5827 267.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -440 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 200 0 R /Fit ] /Rect [ 56.69291 243.1969 538.5827 255.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -441 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-alias.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 165.9469 209.7361 177.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -442 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-alias.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 165.9469 297.6378 177.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -443 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-alias.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 165.9469 323.1978 177.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -444 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-alias.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 165.9469 323.1978 177.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -445 0 obj
              -<< /Annots [ 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R 435 0 R 436 0 R 437 0 R 438 0 R 439 0 R 
              -  440 0 R 441 0 R 442 0 R 443 0 R 444 0 R ] /Contents 1337 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -446 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-keepInFrame.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 543.9469 243.5961 555.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -447 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-keepInFrame.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 543.9469 297.6378 555.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -448 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-keepInFrame.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 543.9469 323.1978 555.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -449 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-keepInFrame.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 543.9469 323.1978 555.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -450 0 obj
              -<< /Annots [ 446 0 R 447 0 R 448 0 R 449 0 R ] /Contents 1338 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -451 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-keepTogether.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 746.9469 244.7161 758.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -452 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-keepTogether.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 746.9469 297.6378 758.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -453 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-keepTogether.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 746.9469 323.1978 758.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -454 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-keepTogether.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 746.9469 323.1978 758.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -455 0 obj
              -<< /Annots [ 451 0 R 452 0 R 453 0 R 454 0 R ] /Contents 1339 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -456 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-spiderChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 511.9469 238.6261 523.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -457 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 511.9469 297.6378 523.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -458 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 511.9469 323.1978 523.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -459 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 511.9469 323.1978 523.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -460 0 obj
              -<< /Annots [ 456 0 R 457 0 R 458 0 R 459 0 R ] /Contents 1340 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -461 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-pieChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 395.9469 225.8461 407.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -462 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 395.9469 297.6378 407.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -463 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 395.9469 323.1978 407.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -464 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 395.9469 323.1978 407.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -465 0 obj
              -<< /Annots [ 461 0 R 462 0 R 463 0 R 464 0 R ] /Contents 1341 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -466 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-spiderChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 279.9469 238.6261 291.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -467 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 279.9469 297.6378 291.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -468 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 279.9469 323.1978 291.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -469 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 279.9469 323.1978 291.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -470 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-pieChart3d.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 132.9469 235.8461 144.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -471 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart3d.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 132.9469 297.6378 144.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -472 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart3d.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 132.9469 323.1978 144.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -473 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart3d.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 132.9469 323.1978 144.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -474 0 obj
              -<< /Annots [ 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R 473 0 R ] /Contents 1342 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -475 0 obj
              -<< /Contents 1343 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans <<  >> 
              -  /Type /Page >>
              -endobj
              -476 0 obj
              -<< /Contents 1344 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans <<  >> 
              -  /Type /Page >>
              -endobj
              -477 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 474 0 R /Fit ] /Rect [ 56.69291 647.1969 538.5827 659.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -478 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-barChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 593.9469 227.5161 605.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -479 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 593.9469 297.6378 605.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -480 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 593.9469 323.1978 605.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -481 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 593.9469 323.1978 605.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -482 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 474 0 R /Fit ] /Rect [ 56.69291 512.1969 538.5827 524.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -483 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-pieChart3d.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 374.9469 235.8461 386.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -484 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart3d.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 374.9469 297.6378 386.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -485 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart3d.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 374.9469 323.1978 386.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -486 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart3d.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 374.9469 323.1978 386.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -487 0 obj
              -<< /Annots [ 477 0 R 478 0 R 479 0 R 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R 485 0 R 486 0 R ] /Contents 1345 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -488 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-ul-ol-li.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 608.9469 218.0661 620.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -489 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ul-ol-li.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 608.9469 297.6378 620.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -490 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ul-ol-li.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 608.9469 323.1978 620.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -491 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ul-ol-li.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 608.9469 323.1978 620.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -492 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-ul-ol-li.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 118.9469 218.0661 130.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -493 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ul-ol-li.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 118.9469 297.6378 130.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -494 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ul-ol-li.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 118.9469 323.1978 130.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -495 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ul-ol-li.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 118.9469 323.1978 130.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -496 0 obj
              -<< /Annots [ 488 0 R 489 0 R 490 0 R 491 0 R 492 0 R 493 0 R 494 0 R 495 0 R ] /Contents 1346 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -497 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-linePlot.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 574.9469 221.9561 586.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -498 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 574.9469 297.6378 586.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -499 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 574.9469 323.1978 586.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -500 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 574.9469 323.1978 586.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -501 0 obj
              -<< /Annots [ 497 0 R 498 0 R 499 0 R 500 0 R ] /Contents 1347 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -502 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 474 0 R /Fit ] /Rect [ 56.69291 473.1969 538.5827 485.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -503 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-linePlot.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 419.9469 221.9561 431.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -504 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 419.9469 297.6378 431.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -505 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 419.9469 323.1978 431.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -506 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 419.9469 323.1978 431.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -507 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-lineMode.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 156.9469 228.0561 168.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -508 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-lineMode.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 156.9469 297.6378 168.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -509 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-lineMode.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 156.9469 323.1978 168.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -510 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-lineMode.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 156.9469 323.1978 168.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -511 0 obj
              -<< /Annots [ 502 0 R 503 0 R 504 0 R 505 0 R 506 0 R 507 0 R 508 0 R 509 0 R 510 0 R ] /Contents 1348 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -512 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 229 0 R /Fit ] /Rect [ 56.69291 287.1969 538.5827 299.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -513 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 543 0 R /Fit ] /Rect [ 56.69291 275.1969 538.5827 287.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -514 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1067 0 R /Fit ] /Rect [ 56.69291 263.1969 538.5827 275.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -515 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1077 0 R /Fit ] /Rect [ 56.69291 251.1969 538.5827 263.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -516 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 501 0 R /Fit ] /Rect [ 56.69291 239.1969 538.5827 251.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -517 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1023 0 R /Fit ] /Rect [ 56.69291 227.1969 538.5827 239.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -518 0 obj
              -<< /Annots [ 512 0 R 513 0 R 514 0 R 515 0 R 516 0 R 517 0 R ] /Contents 1349 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -519 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-linePlot.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 542.9469 221.9561 554.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -520 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 542.9469 297.6378 554.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -521 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 542.9469 323.1978 554.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -522 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 542.9469 323.1978 554.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -523 0 obj
              -<< /Annots [ 519 0 R 520 0 R 521 0 R 522 0 R ] /Contents 1350 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -524 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 229 0 R /Fit ] /Rect [ 56.69291 548.1969 538.5827 560.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -525 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 543 0 R /Fit ] /Rect [ 56.69291 536.1969 538.5827 548.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -526 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1067 0 R /Fit ] /Rect [ 56.69291 524.1969 538.5827 536.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -527 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1077 0 R /Fit ] /Rect [ 56.69291 512.1969 538.5827 524.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -528 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 501 0 R /Fit ] /Rect [ 56.69291 500.1969 538.5827 512.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -529 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1023 0 R /Fit ] /Rect [ 56.69291 488.1969 538.5827 500.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -530 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-linePlot3D.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 74.94685 234.1761 86.94685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -531 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot3D.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 74.94685 297.6378 86.94685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -532 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot3D.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 74.94685 323.1978 86.94685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -533 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot3D.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 74.94685 323.1978 86.94685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -534 0 obj
              -<< /Annots [ 524 0 R 525 0 R 526 0 R 527 0 R 528 0 R 529 0 R 530 0 R 531 0 R 532 0 R 533 0 R ] /Contents 1351 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -535 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-blockTable-5.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 395.9469 243.0561 407.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -536 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTable-5.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 395.9469 297.6378 407.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -537 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTable-5.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 395.9469 323.1978 407.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -538 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTable-5.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 395.9469 323.1978 407.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -539 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-lines.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 200.9469 209.1761 212.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -540 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-lines.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 200.9469 297.6378 212.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -541 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-lines.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 200.9469 323.1978 212.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -542 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-lines.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 200.9469 323.1978 212.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -543 0 obj
              -<< /Annots [ 535 0 R 536 0 R 537 0 R 538 0 R 539 0 R 540 0 R 541 0 R 542 0 R ] /Contents 1352 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -544 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 496 0 R /Fit ] /Rect [ 56.69291 705.1969 538.5827 717.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -545 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-linePlot.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 615.9469 221.9561 627.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -546 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 615.9469 297.6378 627.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -547 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 615.9469 323.1978 627.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -548 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 615.9469 323.1978 627.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -549 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-bookmark.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 316.9469 230.2761 328.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -550 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-bookmark.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 316.9469 297.6378 328.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -551 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-bookmark.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 316.9469 323.1978 328.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -552 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-bookmark.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 316.9469 323.1978 328.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -553 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-bookmark.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 262.9469 230.2761 274.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -554 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-bookmark.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 262.9469 297.6378 274.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -555 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-bookmark.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 262.9469 323.1978 274.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -556 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-bookmark.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 262.9469 323.1978 274.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -557 0 obj
              -<< /Annots [ 544 0 R 545 0 R 546 0 R 547 0 R 548 0 R 549 0 R 550 0 R 551 0 R 552 0 R 553 0 R 
              -  554 0 R 555 0 R 556 0 R ] /Contents 1353 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -558 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-ul-ol-li.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 475.9469 218.0661 487.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -559 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ul-ol-li.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 475.9469 297.6378 487.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -560 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ul-ol-li.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 475.9469 323.1978 487.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -561 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ul-ol-li.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 475.9469 323.1978 487.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -562 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-ul-ol-li.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 433.9469 218.0661 445.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -563 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ul-ol-li.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 433.9469 297.6378 445.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -564 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ul-ol-li.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 433.9469 323.1978 445.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -565 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ul-ol-li.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 433.9469 323.1978 445.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -566 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-log.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 235.9469 203.0661 247.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -567 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 235.9469 297.6378 247.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -568 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 235.9469 323.1978 247.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -569 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 235.9469 323.1978 247.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -570 0 obj
              -<< /Annots [ 558 0 R 559 0 R 560 0 R 561 0 R 562 0 R 563 0 R 564 0 R 565 0 R 566 0 R 567 0 R 
              -  568 0 R 569 0 R ] /Contents 1354 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -571 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-log.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 666.9469 203.0661 678.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -572 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 666.9469 297.6378 678.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -573 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 666.9469 323.1978 678.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -574 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 666.9469 323.1978 678.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -575 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-path.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 376.9469 208.0661 388.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -576 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-path.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 376.9469 297.6378 388.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -577 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-path.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 376.9469 323.1978 388.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -578 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-path.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 376.9469 323.1978 388.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -579 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-barChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 229.9469 227.5161 241.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -580 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 229.9469 297.6378 241.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -581 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 229.9469 323.1978 241.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -582 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 229.9469 323.1978 241.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -583 0 obj
              -<< /Annots [ 571 0 R 572 0 R 573 0 R 574 0 R 575 0 R 576 0 R 577 0 R 578 0 R 579 0 R 580 0 R 
              -  581 0 R 582 0 R ] /Contents 1355 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -584 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-name.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 770.9469 211.9461 782.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -585 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-name.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 770.9469 297.6378 782.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -586 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-name.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 770.9469 323.1978 782.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -587 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-name.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 770.9469 323.1978 782.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -588 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-nextFrame.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 482.9469 233.6061 494.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -589 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-nextFrame.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 482.9469 297.6378 494.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -590 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-nextFrame.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 482.9469 323.1978 494.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -591 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-nextFrame.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 482.9469 323.1978 494.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -592 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-nextPage.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 386.9469 227.4961 398.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -593 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-nextPage.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 386.9469 297.6378 398.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -594 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-nextPage.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 386.9469 323.1978 398.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -595 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-nextPage.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 386.9469 323.1978 398.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -596 0 obj
              -<< /Annots [ 584 0 R 585 0 R 586 0 R 587 0 R 588 0 R 589 0 R 590 0 R 591 0 R 592 0 R 593 0 R 
              -  594 0 R 595 0 R ] /Contents 1356 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -597 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 496 0 R /Fit ] /Rect [ 56.69291 664.1969 538.5827 676.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -598 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-ul-ol-li.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 526.9469 218.0661 538.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -599 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ul-ol-li.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 526.9469 297.6378 538.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -600 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ul-ol-li.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 526.9469 323.1978 538.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -601 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ul-ol-li.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 526.9469 323.1978 538.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -602 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-selectField.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 379.9469 234.1661 391.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -603 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-selectField.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 379.9469 297.6378 391.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -604 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-selectField.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 379.9469 323.1978 391.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -605 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-selectField.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 379.9469 323.1978 391.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -606 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-outlineAdd.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 123.9469 234.1761 135.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -607 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-outlineAdd.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 123.9469 297.6378 135.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -608 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-outlineAdd.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 123.9469 323.1978 135.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -609 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-outlineAdd.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 123.9469 323.1978 135.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -610 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-outlineAdd.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 93.94685 234.1761 105.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -611 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-outlineAdd.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 93.94685 297.6378 105.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -612 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-outlineAdd.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 93.94685 323.1978 105.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -613 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-outlineAdd.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 93.94685 323.1978 105.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -614 0 obj
              -<< /Annots [ 597 0 R 598 0 R 599 0 R 600 0 R 601 0 R 602 0 R 603 0 R 604 0 R 605 0 R 606 0 R 
              -  607 0 R 608 0 R 609 0 R 610 0 R 611 0 R 612 0 R 613 0 R ] /Contents 1357 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -615 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 800 0 R /Fit ] /Rect [ 56.69291 734.1969 538.5827 746.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -616 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 783 0 R /Fit ] /Rect [ 56.69291 722.1969 538.5827 734.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -617 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 332 0 R /Fit ] /Rect [ 56.69291 710.1969 538.5827 722.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -618 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 319 0 R /Fit ] /Rect [ 56.69291 698.1969 538.5827 710.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -619 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 319 0 R /Fit ] /Rect [ 56.69291 686.1969 538.5827 698.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -620 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 319 0 R /Fit ] /Rect [ 56.69291 674.1969 538.5827 686.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -621 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 319 0 R /Fit ] /Rect [ 56.69291 662.1969 538.5827 674.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -622 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 332 0 R /Fit ] /Rect [ 56.69291 650.1969 538.5827 662.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -623 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 183 0 R /Fit ] /Rect [ 56.69291 638.1969 538.5827 650.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -624 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 753 0 R /Fit ] /Rect [ 56.69291 626.1969 538.5827 638.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -625 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 358 0 R /Fit ] /Rect [ 56.69291 614.1969 538.5827 626.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -626 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 543 0 R /Fit ] /Rect [ 56.69291 602.1969 538.5827 614.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -627 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 213 0 R /Fit ] /Rect [ 56.69291 590.1969 538.5827 602.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -628 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 399 0 R /Fit ] /Rect [ 56.69291 578.1969 538.5827 590.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -629 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 731 0 R /Fit ] /Rect [ 56.69291 566.1969 538.5827 578.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -630 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1023 0 R /Fit ] /Rect [ 56.69291 554.1969 538.5827 566.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -631 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 698 0 R /Fit ] /Rect [ 56.69291 542.1969 538.5827 554.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -632 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 345 0 R /Fit ] /Rect [ 56.69291 530.1969 538.5827 542.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -633 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 985 0 R /Fit ] /Rect [ 56.69291 518.1969 538.5827 530.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -634 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 814 0 R /Fit ] /Rect [ 56.69291 506.1969 538.5827 518.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -635 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 835 0 R /Fit ] /Rect [ 56.69291 494.1969 538.5827 506.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -636 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 800 0 R /Fit ] /Rect [ 56.69291 482.1969 538.5827 494.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -637 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1052 0 R /Fit ] /Rect [ 56.69291 470.1969 538.5827 482.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -638 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 800 0 R /Fit ] /Rect [ 56.69291 458.1969 538.5827 470.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -639 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 850 0 R /Fit ] /Rect [ 56.69291 446.1969 538.5827 458.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -640 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1052 0 R /Fit ] /Rect [ 56.69291 434.1969 538.5827 446.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -641 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 511 0 R /Fit ] /Rect [ 56.69291 422.1969 538.5827 434.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -642 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 48 0 R /Fit ] /Rect [ 56.69291 410.1969 538.5827 422.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -643 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1023 0 R /Fit ] /Rect [ 56.69291 398.1969 538.5827 410.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -644 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 166 0 R /Fit ] /Rect [ 56.69291 386.1969 538.5827 398.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -645 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 800 0 R /Fit ] /Rect [ 56.69291 374.1969 538.5827 386.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -646 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 25 0 R /Fit ] /Rect [ 56.69291 362.1969 538.5827 374.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -647 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 37 0 R /Fit ] /Rect [ 56.69291 350.1969 538.5827 362.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -648 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 511 0 R /Fit ] /Rect [ 56.69291 338.1969 538.5827 350.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -649 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 523 0 R /Fit ] /Rect [ 56.69291 326.1969 538.5827 338.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -650 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 710 0 R /Fit ] /Rect [ 56.69291 314.1969 538.5827 326.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -651 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 720 0 R /Fit ] /Rect [ 56.69291 302.1969 538.5827 314.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -652 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 878 0 R /Fit ] /Rect [ 56.69291 290.1969 538.5827 302.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -653 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 153 0 R /Fit ] /Rect [ 56.69291 278.1969 538.5827 290.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -654 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 740 0 R /Fit ] /Rect [ 56.69291 266.1969 538.5827 278.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -655 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-drawString.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 188.9469 235.2961 200.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -656 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-drawString.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 188.9469 297.6378 200.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -657 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-drawString.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 188.9469 323.1978 200.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -658 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-drawString.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 188.9469 323.1978 200.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -659 0 obj
              -<< /Annots [ 615 0 R 616 0 R 617 0 R 618 0 R 619 0 R 620 0 R 621 0 R 622 0 R 623 0 R 624 0 R 
              -  625 0 R 626 0 R 627 0 R 628 0 R 629 0 R 630 0 R 631 0 R 632 0 R 633 0 R 634 0 R 
              -  635 0 R 636 0 R 637 0 R 638 0 R 639 0 R 640 0 R 641 0 R 642 0 R 643 0 R 644 0 R 
              -  645 0 R 646 0 R 647 0 R 648 0 R 649 0 R 650 0 R 651 0 R 652 0 R 653 0 R 654 0 R 
              -  655 0 R 656 0 R 657 0 R 658 0 R ] /Contents 1358 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -660 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-pageGraphics.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 770.9469 246.9461 782.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -661 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pageGraphics.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 770.9469 297.6378 782.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -662 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pageGraphics.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 770.9469 323.1978 782.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -663 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pageGraphics.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 770.9469 323.1978 782.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -664 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-pageInfo-2.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 623.9469 234.1661 635.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -665 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pageInfo-2.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 623.9469 297.6378 635.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -666 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pageInfo-2.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 623.9469 323.1978 635.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -667 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pageInfo-2.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 623.9469 323.1978 635.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -668 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-pageInfo.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 593.9469 225.8361 605.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -669 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pageInfo.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 593.9469 297.6378 605.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -670 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pageInfo.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 593.9469 323.1978 605.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -671 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pageInfo.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 593.9469 323.1978 605.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -672 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 345 0 R /Fit ] /Rect [ 56.69291 403.1969 538.5827 415.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -673 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 659 0 R /Fit ] /Rect [ 56.69291 391.1969 538.5827 403.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -674 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 583 0 R /Fit ] /Rect [ 56.69291 379.1969 538.5827 391.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -675 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-document-annotations.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 301.9469 277.2261 313.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -676 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-annotations.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 289.9469 297.6378 301.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -677 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-annotations.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 289.9469 323.1978 301.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -678 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-annotations.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 289.9469 323.1978 301.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -679 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-document-story.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 235.9469 252.4961 247.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -680 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-story.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 235.9469 297.6378 247.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -681 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-story.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 235.9469 323.1978 247.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -682 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-story.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 235.9469 323.1978 247.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -683 0 obj
              -<< /Annots [ 660 0 R 661 0 R 662 0 R 663 0 R 664 0 R 665 0 R 666 0 R 667 0 R 668 0 R 669 0 R 
              -  670 0 R 671 0 R 672 0 R 673 0 R 674 0 R 675 0 R 676 0 R 677 0 R 678 0 R 679 0 R 
              -  680 0 R 681 0 R 682 0 R ] /Contents 1359 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -684 0 obj
              -<< /Contents 1360 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans <<  >> 
              -  /Type /Page >>
              -endobj
              -685 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-para.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 668.9469 209.1761 680.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -686 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 668.9469 297.6378 680.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -687 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 668.9469 323.1978 680.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -688 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 668.9469 323.1978 680.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -689 0 obj
              -<< /Annots [ 685 0 R 686 0 R 687 0 R 688 0 R ] /Contents 1361 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -690 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/simple-layout.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 429.9469 228.6161 441.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -691 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/simple-layout.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 429.9469 297.6378 441.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -692 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/simple-layout.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 429.9469 323.1978 441.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -693 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/simple-layout.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 429.9469 323.1978 441.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -694 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-textAnnotation.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 231.9469 249.1761 243.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -695 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-textAnnotation.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 231.9469 297.6378 243.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -696 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-textAnnotation.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 231.9469 323.1978 243.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -697 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-textAnnotation.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 231.9469 323.1978 243.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -698 0 obj
              -<< /Annots [ 690 0 R 691 0 R 692 0 R 693 0 R 694 0 R 695 0 R 696 0 R 697 0 R ] /Contents 1362 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -699 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 583 0 R /Fit ] /Rect [ 56.69291 625.1969 538.5827 637.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -700 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 229 0 R /Fit ] /Rect [ 56.69291 613.1969 538.5827 625.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -701 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 213 0 R /Fit ] /Rect [ 56.69291 601.1969 538.5827 613.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -702 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-path.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 439.9469 208.0661 451.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -703 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-path.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 439.9469 297.6378 451.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -704 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-path.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 439.9469 323.1978 451.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -705 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-path.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 439.9469 323.1978 451.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -706 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-path.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 361.9469 208.0661 373.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -707 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-path.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 361.9469 297.6378 373.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -708 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-path.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 361.9469 323.1978 373.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -709 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-path.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 361.9469 323.1978 373.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -710 0 obj
              -<< /Annots [ 699 0 R 700 0 R 701 0 R 702 0 R 703 0 R 704 0 R 705 0 R 706 0 R 707 0 R 708 0 R 
              -  709 0 R ] /Contents 1363 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -711 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 229 0 R /Fit ] /Rect [ 56.69291 374.1969 538.5827 386.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -712 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 866 0 R /Fit ] /Rect [ 56.69291 362.1969 538.5827 374.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -713 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 487 0 R /Fit ] /Rect [ 56.69291 350.1969 538.5827 362.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -714 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1023 0 R /Fit ] /Rect [ 56.69291 338.1969 538.5827 350.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -715 0 obj
              -<< /Annots [ 711 0 R 712 0 R 713 0 R 714 0 R ] /Contents 1364 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -716 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-pieChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 746.9469 225.8461 758.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -717 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 746.9469 297.6378 758.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -718 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 746.9469 323.1978 758.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -719 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 746.9469 323.1978 758.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -720 0 obj
              -<< /Annots [ 716 0 R 717 0 R 718 0 R 719 0 R ] /Contents 1365 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -721 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 856 0 R /Fit ] /Rect [ 56.69291 664.1969 538.5827 676.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -722 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1023 0 R /Fit ] /Rect [ 56.69291 652.1969 538.5827 664.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -723 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-pieChart3d.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 334.9469 235.8461 346.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -724 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart3d.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 334.9469 297.6378 346.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -725 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart3d.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 334.9469 323.1978 346.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -726 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart3d.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 334.9469 323.1978 346.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -727 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-place.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 76.94685 211.9461 88.94685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -728 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-place.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 76.94685 297.6378 88.94685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -729 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-place.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 76.94685 323.1978 88.94685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -730 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-place.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 76.94685 323.1978 88.94685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -731 0 obj
              -<< /Annots [ 721 0 R 722 0 R 723 0 R 724 0 R 725 0 R 726 0 R 727 0 R 728 0 R 729 0 R 730 0 R ] /Contents 1366 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -732 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-plugInFlowable.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 547.9469 254.1761 559.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -733 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-plugInFlowable.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 547.9469 297.6378 559.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -734 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-plugInFlowable.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 547.9469 323.1978 559.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -735 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-plugInFlowable.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 547.9469 323.1978 559.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -736 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-plugInGraphic.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 272.9469 249.7261 284.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -737 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-plugInGraphic.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 272.9469 297.6378 284.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -738 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-plugInGraphic.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 272.9469 323.1978 284.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -739 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-plugInGraphic.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 272.9469 323.1978 284.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -740 0 obj
              -<< /Annots [ 732 0 R 733 0 R 734 0 R 735 0 R 736 0 R 737 0 R 738 0 R 739 0 R ] /Contents 1367 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -741 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-pieChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 741.9469 225.8461 753.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -742 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 741.9469 297.6378 753.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -743 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 741.9469 323.1978 753.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -744 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 741.9469 323.1978 753.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -745 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-para.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 427.9469 209.1761 439.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -746 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 427.9469 297.6378 439.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -747 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 427.9469 323.1978 439.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -748 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 427.9469 323.1978 439.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -749 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-pto.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 139.9469 203.0661 151.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -750 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pto.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 139.9469 297.6378 151.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -751 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pto.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 139.9469 323.1978 151.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -752 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pto.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 139.9469 323.1978 151.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -753 0 obj
              -<< /Annots [ 741 0 R 742 0 R 743 0 R 744 0 R 745 0 R 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 
              -  751 0 R 752 0 R ] /Contents 1368 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -754 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-rectange.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 487.9469 225.2761 499.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -755 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-rectange.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 487.9469 297.6378 499.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -756 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-rectange.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 487.9469 323.1978 499.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -757 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-rectange.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 487.9469 323.1978 499.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -758 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-registerCidFont.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 311.9469 254.7361 323.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -759 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerCidFont.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 311.9469 297.6378 323.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -760 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerCidFont.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 311.9469 323.1978 323.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -761 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerCidFont.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 311.9469 323.1978 323.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -762 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-registerCidFont.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 281.9469 254.7361 293.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -763 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerCidFont.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 281.9469 297.6378 293.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -764 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerCidFont.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 281.9469 323.1978 293.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -765 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerCidFont.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 281.9469 323.1978 293.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -766 0 obj
              -<< /Annots [ 754 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R 760 0 R 761 0 R 762 0 R 763 0 R 
              -  764 0 R 765 0 R ] /Contents 1369 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -767 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-registerType1Face.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 770.9469 265.8261 782.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -768 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerType1Face.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 758.9469 297.6378 770.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -769 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerType1Face.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 758.9469 323.1978 770.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -770 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerType1Face.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 758.9469 323.1978 770.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -771 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-registerTTFont.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 376.9469 251.4061 388.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -772 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerTTFont.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 376.9469 297.6378 388.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -773 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerTTFont.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 376.9469 323.1978 388.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -774 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerTTFont.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 376.9469 323.1978 388.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -775 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-registerTTFont.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 334.9469 251.4061 346.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -776 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerTTFont.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 334.9469 297.6378 346.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -777 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerTTFont.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 334.9469 323.1978 346.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -778 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerTTFont.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 334.9469 323.1978 346.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -779 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-registerType1Face.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 158.9469 265.8261 170.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -780 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerType1Face.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 146.9469 297.6378 158.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -781 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerType1Face.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 146.9469 323.1978 158.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -782 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-registerType1Face.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 146.9469 323.1978 158.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -783 0 obj
              -<< /Annots [ 767 0 R 768 0 R 769 0 R 770 0 R 771 0 R 772 0 R 773 0 R 774 0 R 775 0 R 776 0 R 
              -  777 0 R 778 0 R 779 0 R 780 0 R 781 0 R 782 0 R ] /Contents 1370 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -784 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-saveState-restoreState.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 770.9469 277.2161 782.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -785 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-saveState-restoreState.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 758.9469 297.6378 770.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -786 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-saveState-restoreState.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 758.9469 323.1978 770.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -787 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-saveState-restoreState.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 758.9469 323.1978 770.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -788 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-rotate.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 611.9469 214.1761 623.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -789 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-rotate.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 611.9469 297.6378 623.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -790 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-rotate.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 611.9469 323.1978 623.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -791 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-rotate.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 611.9469 323.1978 623.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -792 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-saveState-restoreState.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 419.9469 277.2161 431.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -793 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-saveState-restoreState.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 407.9469 297.6378 419.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -794 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-saveState-restoreState.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 407.9469 323.1978 419.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -795 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-saveState-restoreState.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 407.9469 323.1978 419.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -796 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-scale.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 231.9469 210.8361 243.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -797 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-scale.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 231.9469 297.6378 243.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -798 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-scale.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 231.9469 323.1978 243.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -799 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-scale.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 231.9469 323.1978 243.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -800 0 obj
              -<< /Annots [ 784 0 R 785 0 R 786 0 R 787 0 R 788 0 R 789 0 R 790 0 R 791 0 R 792 0 R 793 0 R 
              -  794 0 R 795 0 R 796 0 R 797 0 R 798 0 R 799 0 R ] /Contents 1371 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -801 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 614 0 R /Fit ] /Rect [ 56.69291 676.1969 538.5827 688.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -802 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-selectField.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 562.9469 234.1661 574.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -803 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-selectField.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 562.9469 297.6378 574.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -804 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-selectField.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 562.9469 323.1978 574.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -805 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-selectField.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 562.9469 323.1978 574.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -806 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-barChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 415.9469 227.5161 427.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -807 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 415.9469 297.6378 427.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -808 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 415.9469 323.1978 427.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -809 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 415.9469 323.1978 427.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -810 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-linePlot.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 196.9469 221.9561 208.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -811 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 196.9469 297.6378 208.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -812 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 196.9469 323.1978 208.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -813 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 196.9469 323.1978 208.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -814 0 obj
              -<< /Annots [ 801 0 R 802 0 R 803 0 R 804 0 R 805 0 R 806 0 R 807 0 R 808 0 R 809 0 R 810 0 R 
              -  811 0 R 812 0 R 813 0 R ] /Contents 1372 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -815 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-pageGraphics.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 719.9469 246.9461 731.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -816 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pageGraphics.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 719.9469 297.6378 731.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -817 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pageGraphics.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 719.9469 323.1978 731.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -818 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pageGraphics.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 719.9469 323.1978 731.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -819 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-setFont.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 689.9469 220.2861 701.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -820 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-setFont.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 689.9469 297.6378 701.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -821 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-setFont.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 689.9469 323.1978 701.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -822 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-setFont.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 689.9469 323.1978 701.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -823 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-setFontSize.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 513.9469 236.3961 525.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -824 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-setFontSize.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 513.9469 297.6378 525.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -825 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-setFontSize.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 513.9469 323.1978 525.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -826 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-setFontSize.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 513.9469 323.1978 525.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -827 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-setNextFrame.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 366.9469 246.3861 378.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -828 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-setNextFrame.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 366.9469 297.6378 378.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -829 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-setNextFrame.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 366.9469 323.1978 378.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -830 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-setNextFrame.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 366.9469 323.1978 378.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -831 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-setNextTemplate.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 219.9469 256.9461 231.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -832 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-setNextTemplate.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 219.9469 297.6378 231.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -833 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-setNextTemplate.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 219.9469 323.1978 231.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -834 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-setNextTemplate.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 219.9469 323.1978 231.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -835 0 obj
              -<< /Annots [ 815 0 R 816 0 R 817 0 R 818 0 R 819 0 R 820 0 R 821 0 R 822 0 R 823 0 R 824 0 R 
              -  825 0 R 826 0 R 827 0 R 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R 834 0 R ] /Contents 1373 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -836 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-index.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 707.9469 211.9461 719.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -837 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-index.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 707.9469 297.6378 719.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -838 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-index.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 707.9469 323.1978 719.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -839 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-index.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 707.9469 323.1978 719.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -840 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-skew.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 531.9469 209.7261 543.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -841 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-skew.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 531.9469 297.6378 543.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -842 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-skew.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 531.9469 323.1978 543.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -843 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-skew.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 531.9469 323.1978 543.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -844 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 460 0 R /Fit ] /Rect [ 56.69291 179.1969 538.5827 191.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -845 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 740 0 R /Fit ] /Rect [ 56.69291 167.1969 538.5827 179.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -846 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-pieChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 113.9469 225.8461 125.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -847 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 113.9469 297.6378 125.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -848 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 113.9469 323.1978 125.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -849 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 113.9469 323.1978 125.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -850 0 obj
              -<< /Annots [ 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R 844 0 R 845 0 R 
              -  846 0 R 847 0 R 848 0 R 849 0 R ] /Contents 1374 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -851 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-pieChart3d.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 441.9469 235.8461 453.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -852 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart3d.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 441.9469 297.6378 453.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -853 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart3d.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 441.9469 323.1978 453.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -854 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart3d.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 441.9469 323.1978 453.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -855 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 850 0 R /Fit ] /Rect [ 56.69291 89.19685 538.5827 101.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -856 0 obj
              -<< /Annots [ 851 0 R 852 0 R 853 0 R 854 0 R 855 0 R ] /Contents 1375 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -857 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-pieChart3d.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 662.9469 235.8461 674.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -858 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart3d.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 662.9469 297.6378 674.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -859 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart3d.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 662.9469 323.1978 674.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -860 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart3d.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 662.9469 323.1978 674.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -861 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 850 0 R /Fit ] /Rect [ 56.69291 327.1969 538.5827 339.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -862 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-pieChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 177.9469 225.8461 189.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -863 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 177.9469 297.6378 189.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -864 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 177.9469 323.1978 189.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -865 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-pieChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 177.9469 323.1978 189.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -866 0 obj
              -<< /Annots [ 857 0 R 858 0 R 859 0 R 860 0 R 861 0 R 862 0 R 863 0 R 864 0 R 865 0 R ] /Contents 1376 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -867 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-spacer.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 719.9469 216.9461 731.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -868 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spacer.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 719.9469 297.6378 731.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -869 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spacer.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 719.9469 323.1978 731.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -870 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spacer.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 719.9469 323.1978 731.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -871 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 229 0 R /Fit ] /Rect [ 56.69291 181.1969 538.5827 193.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -872 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 985 0 R /Fit ] /Rect [ 56.69291 169.1969 538.5827 181.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -873 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 965 0 R /Fit ] /Rect [ 56.69291 157.1969 538.5827 169.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -874 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 889 0 R /Fit ] /Rect [ 56.69291 145.1969 538.5827 157.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -875 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 883 0 R /Fit ] /Rect [ 56.69291 133.1969 538.5827 145.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -876 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 487 0 R /Fit ] /Rect [ 56.69291 121.1969 538.5827 133.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -877 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1023 0 R /Fit ] /Rect [ 56.69291 109.1969 538.5827 121.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -878 0 obj
              -<< /Annots [ 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R 874 0 R 875 0 R 876 0 R 
              -  877 0 R ] /Contents 1377 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -879 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-spiderChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 530.9469 238.6261 542.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -880 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 530.9469 297.6378 542.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -881 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 530.9469 323.1978 542.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -882 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 530.9469 323.1978 542.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -883 0 obj
              -<< /Annots [ 879 0 R 880 0 R 881 0 R 882 0 R ] /Contents 1378 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -884 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 465 0 R /Fit ] /Rect [ 56.69291 258.1969 538.5827 270.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -885 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-spiderChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 120.9469 238.6261 132.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -886 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 120.9469 297.6378 132.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -887 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 120.9469 323.1978 132.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -888 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 120.9469 323.1978 132.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -889 0 obj
              -<< /Annots [ 884 0 R 885 0 R 886 0 R 887 0 R 888 0 R ] /Contents 1379 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -890 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 883 0 R /Fit ] /Rect [ 56.69291 560.1969 538.5827 572.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -891 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-spiderChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 506.9469 238.6261 518.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -892 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 506.9469 297.6378 518.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -893 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 506.9469 323.1978 518.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -894 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 506.9469 323.1978 518.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -895 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-index.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 301.9469 211.9461 313.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -896 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-index.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 301.9469 297.6378 313.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -897 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-index.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 301.9469 323.1978 313.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -898 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-index.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 301.9469 323.1978 313.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -899 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 866 0 R /Fit ] /Rect [ 56.69291 169.1969 538.5827 181.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -900 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 399 0 R /Fit ] /Rect [ 56.69291 157.1969 538.5827 169.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -901 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 753 0 R /Fit ] /Rect [ 56.69291 145.1969 538.5827 157.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -902 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1077 0 R /Fit ] /Rect [ 56.69291 133.1969 538.5827 145.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -903 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 183 0 R /Fit ] /Rect [ 56.69291 121.1969 538.5827 133.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -904 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 740 0 R /Fit ] /Rect [ 56.69291 109.1969 538.5827 121.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -905 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 58 0 R /Fit ] /Rect [ 56.69291 97.19685 538.5827 109.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -906 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 614 0 R /Fit ] /Rect [ 56.69291 85.19685 538.5827 97.19685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -907 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1029 0 R /Fit ] /Rect [ 56.69291 73.19685 538.5827 85.19685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -908 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 358 0 R /Fit ] /Rect [ 56.69291 61.19685 538.5827 73.19685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -909 0 obj
              -<< /Annots [ 890 0 R 891 0 R 892 0 R 893 0 R 894 0 R 895 0 R 896 0 R 897 0 R 898 0 R 899 0 R 
              -  900 0 R 901 0 R 902 0 R 903 0 R 904 0 R 905 0 R 906 0 R 907 0 R 908 0 R ] /Contents 1380 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -910 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 364 0 R /Fit ] /Rect [ 56.69291 773.1969 538.5827 785.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -911 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 369 0 R /Fit ] /Rect [ 56.69291 761.1969 538.5827 773.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -912 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 374 0 R /Fit ] /Rect [ 56.69291 749.1969 538.5827 761.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -913 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 380 0 R /Fit ] /Rect [ 56.69291 737.1969 538.5827 749.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -914 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 385 0 R /Fit ] /Rect [ 56.69291 725.1969 538.5827 737.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -915 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 683 0 R /Fit ] /Rect [ 56.69291 713.1969 538.5827 725.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -916 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 124 0 R /Fit ] /Rect [ 56.69291 701.1969 538.5827 713.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -917 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 596 0 R /Fit ] /Rect [ 56.69291 689.1969 538.5827 701.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -918 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 835 0 R /Fit ] /Rect [ 56.69291 677.1969 538.5827 689.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -919 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 596 0 R /Fit ] /Rect [ 56.69291 665.1969 538.5827 677.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -920 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 835 0 R /Fit ] /Rect [ 56.69291 653.1969 538.5827 665.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -921 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 200 0 R /Fit ] /Rect [ 56.69291 641.1969 538.5827 653.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -922 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 445 0 R /Fit ] /Rect [ 56.69291 629.1969 538.5827 641.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -923 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 450 0 R /Fit ] /Rect [ 56.69291 617.1969 538.5827 629.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -924 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 429 0 R /Fit ] /Rect [ 56.69291 605.1969 538.5827 617.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -925 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 404 0 R /Fit ] /Rect [ 56.69291 593.1969 538.5827 605.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -926 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 753 0 R /Fit ] /Rect [ 56.69291 581.1969 538.5827 593.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -927 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 429 0 R /Fit ] /Rect [ 56.69291 569.1969 538.5827 581.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -928 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 345 0 R /Fit ] /Rect [ 56.69291 557.1969 538.5827 569.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -929 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 153 0 R /Fit ] /Rect [ 56.69291 545.1969 538.5827 557.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -930 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 153 0 R /Fit ] /Rect [ 56.69291 533.1969 538.5827 545.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -931 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 557 0 R /Fit ] /Rect [ 56.69291 521.1969 538.5827 533.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -932 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 399 0 R /Fit ] /Rect [ 56.69291 509.1969 538.5827 521.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -933 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 835 0 R /Fit ] /Rect [ 56.69291 497.1969 538.5827 509.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -934 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 583 0 R /Fit ] /Rect [ 56.69291 485.1969 538.5827 497.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -935 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 596 0 R /Fit ] /Rect [ 56.69291 473.1969 538.5827 485.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -936 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 570 0 R /Fit ] /Rect [ 56.69291 461.1969 538.5827 473.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -937 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 254 0 R /Fit ] /Rect [ 56.69291 449.1969 538.5827 461.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -938 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 445 0 R /Fit ] /Rect [ 56.69291 437.1969 538.5827 449.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -939 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1067 0 R /Fit ] /Rect [ 56.69291 425.1969 538.5827 437.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -940 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 332 0 R /Fit ] /Rect [ 56.69291 413.1969 538.5827 425.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -941 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 200 0 R /Fit ] /Rect [ 56.69291 401.1969 538.5827 413.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -942 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 254 0 R /Fit ] /Rect [ 56.69291 389.1969 538.5827 401.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -943 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 254 0 R /Fit ] /Rect [ 56.69291 377.1969 538.5827 389.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -944 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 267 0 R /Fit ] /Rect [ 56.69291 365.1969 538.5827 377.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -945 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 254 0 R /Fit ] /Rect [ 56.69291 353.1969 538.5827 365.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -946 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 254 0 R /Fit ] /Rect [ 56.69291 341.1969 538.5827 353.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -947 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 267 0 R /Fit ] /Rect [ 56.69291 329.1969 538.5827 341.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -948 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 596 0 R /Fit ] /Rect [ 56.69291 317.1969 538.5827 329.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -949 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1052 0 R /Fit ] /Rect [ 56.69291 305.1969 538.5827 317.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -950 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 429 0 R /Fit ] /Rect [ 56.69291 293.1969 538.5827 305.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -951 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 956 0 R /Fit ] /Rect [ 56.69291 281.1969 538.5827 293.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -952 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/simple-layout.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 203.9469 228.6161 215.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -953 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/simple-layout.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 203.9469 297.6378 215.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -954 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/simple-layout.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 203.9469 323.1978 215.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -955 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/simple-layout.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 203.9469 323.1978 215.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -956 0 obj
              -<< /Annots [ 910 0 R 911 0 R 912 0 R 913 0 R 914 0 R 915 0 R 916 0 R 917 0 R 918 0 R 919 0 R 
              -  920 0 R 921 0 R 922 0 R 923 0 R 924 0 R 925 0 R 926 0 R 927 0 R 928 0 R 929 0 R 
              -  930 0 R 931 0 R 932 0 R 933 0 R 934 0 R 935 0 R 936 0 R 937 0 R 938 0 R 939 0 R 
              -  940 0 R 941 0 R 942 0 R 943 0 R 944 0 R 945 0 R 946 0 R 947 0 R 948 0 R 949 0 R 
              -  950 0 R 951 0 R 952 0 R 953 0 R 954 0 R 955 0 R ] /Contents 1381 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -957 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-storyPlace.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 637.9469 233.0561 649.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -958 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-storyPlace.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 637.9469 297.6378 649.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -959 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-storyPlace.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 637.9469 323.1978 649.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -960 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-storyPlace.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 637.9469 323.1978 649.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -961 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-spiderChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 316.9469 238.6261 328.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -962 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 316.9469 297.6378 328.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -963 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 316.9469 323.1978 328.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -964 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 316.9469 323.1978 328.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -965 0 obj
              -<< /Annots [ 957 0 R 958 0 R 959 0 R 960 0 R 961 0 R 962 0 R 963 0 R 964 0 R ] /Contents 1382 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -966 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 455 0 R /Fit ] /Rect [ 56.69291 132.1969 538.5827 144.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -967 0 obj
              -<< /Annots [ 966 0 R ] /Contents 1383 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -968 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-spiderChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 734.9469 238.6261 746.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -969 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 734.9469 297.6378 746.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -970 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 734.9469 323.1978 746.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -971 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 734.9469 323.1978 746.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -972 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 965 0 R /Fit ] /Rect [ 56.69291 428.1969 538.5827 440.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -973 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-spiderChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 326.9469 238.6261 338.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -974 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 326.9469 297.6378 338.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -975 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 326.9469 323.1978 338.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -976 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-spiderChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 326.9469 323.1978 338.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -977 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-stroke.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 179.9469 214.7261 191.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -978 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-stroke.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 179.9469 297.6378 191.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -979 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-stroke.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 179.9469 323.1978 191.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -980 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-stroke.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 179.9469 323.1978 191.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -981 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 445 0 R /Fit ] /Rect [ 56.69291 98.19685 538.5827 110.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -982 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 689 0 R /Fit ] /Rect [ 56.69291 86.19685 538.5827 98.19685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -983 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 124 0 R /Fit ] /Rect [ 56.69291 74.19685 538.5827 86.19685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -984 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 557 0 R /Fit ] /Rect [ 56.69291 62.19685 538.5827 74.19685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -985 0 obj
              -<< /Annots [ 968 0 R 969 0 R 970 0 R 971 0 R 972 0 R 973 0 R 974 0 R 975 0 R 976 0 R 977 0 R 
              -  978 0 R 979 0 R 980 0 R 981 0 R 982 0 R 983 0 R 984 0 R ] /Contents 1384 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -986 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/simple-layout.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 717.9469 228.6161 729.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -987 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/simple-layout.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 717.9469 297.6378 729.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -988 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/simple-layout.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 717.9469 323.1978 729.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -989 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/simple-layout.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 717.9469 323.1978 729.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -990 0 obj
              -<< /Annots [ 986 0 R 987 0 R 988 0 R 989 0 R ] /Contents 1385 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -991 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-blockTable-1.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 308.9469 243.0561 320.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -992 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTable-1.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 308.9469 297.6378 320.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -993 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTable-1.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 308.9469 323.1978 320.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -994 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTable-1.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 308.9469 323.1978 320.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -995 0 obj
              -<< /Annots [ 991 0 R 992 0 R 993 0 R 994 0 R ] /Contents 1386 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -996 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 683 0 R /Fit ] /Rect [ 56.69291 635.1969 538.5827 647.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -997 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-document-annotations.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 533.9469 277.2261 545.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -998 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-annotations.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 521.9469 297.6378 533.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -999 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-annotations.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 521.9469 323.1978 533.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1000 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-annotations.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 521.9469 323.1978 533.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1001 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-document-story.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 443.9469 252.4961 455.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1002 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-story.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 443.9469 297.6378 455.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1003 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-story.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 443.9469 323.1978 455.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1004 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-document-story.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 443.9469 323.1978 455.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1005 0 obj
              -<< /Annots [ 996 0 R 997 0 R 998 0 R 999 0 R 1000 0 R 1001 0 R 1002 0 R 1003 0 R 1004 0 R ] /Contents 1387 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -1006 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-linePlot.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 758.9469 221.9561 770.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1007 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 758.9469 297.6378 770.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1008 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 758.9469 323.1978 770.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1009 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 758.9469 323.1978 770.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1010 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 698 0 R /Fit ] /Rect [ 56.69291 626.1969 538.5827 638.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1011 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-textAnnotation.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 488.9469 249.1761 500.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1012 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-textAnnotation.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 488.9469 297.6378 500.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1013 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-textAnnotation.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 488.9469 323.1978 500.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1014 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-textAnnotation.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 488.9469 323.1978 500.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1015 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-textField.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 138.9469 225.8361 150.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1016 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-textField.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 138.9469 297.6378 150.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1017 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-textField.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 138.9469 323.1978 150.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1018 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-textField.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 138.9469 323.1978 150.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1019 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-textField.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 96.94685 225.8361 108.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1020 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-textField.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 96.94685 297.6378 108.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1021 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-textField.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 96.94685 323.1978 108.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1022 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-textField.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 96.94685 323.1978 108.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1023 0 obj
              -<< /Annots [ 1006 0 R 1007 0 R 1008 0 R 1009 0 R 1010 0 R 1011 0 R 1012 0 R 1013 0 R 1014 0 R 1015 0 R 
              -  1016 0 R 1017 0 R 1018 0 R 1019 0 R 1020 0 R 1021 0 R 1022 0 R ] /Contents 1388 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -1024 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 1005 0 R /Fit ] /Rect [ 56.69291 734.1969 538.5827 746.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1025 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-linePlot.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 572.9469 221.9561 584.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1026 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 572.9469 297.6378 584.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1027 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 572.9469 323.1978 584.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1028 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 572.9469 323.1978 584.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1029 0 obj
              -<< /Annots [ 1024 0 R 1025 0 R 1026 0 R 1027 0 R 1028 0 R ] /Contents 1389 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -1030 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-para.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 279.9469 209.1761 291.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1031 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 279.9469 297.6378 291.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1032 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 279.9469 323.1978 291.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1033 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 279.9469 323.1978 291.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1034 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-cropMarks.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 249.9469 234.1661 261.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1035 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-cropMarks.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 249.9469 297.6378 261.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1036 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-cropMarks.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 249.9469 323.1978 261.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1037 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-cropMarks.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 249.9469 323.1978 261.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1038 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 990 0 R /Fit ] /Rect [ 56.69291 168.1969 538.5827 180.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1039 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-blockTable-1.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 78.94685 243.0561 90.94685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1040 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTable-1.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 78.94685 297.6378 90.94685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1041 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTable-1.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 78.94685 323.1978 90.94685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1042 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-blockTable-1.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 78.94685 323.1978 90.94685 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1043 0 obj
              -<< /Annots [ 1030 0 R 1031 0 R 1032 0 R 1033 0 R 1034 0 R 1035 0 R 1036 0 R 1037 0 R 1038 0 R 1039 0 R 
              -  1040 0 R 1041 0 R 1042 0 R ] /Contents 1390 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -1044 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-transform.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 603.9469 229.7361 615.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1045 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-transform.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 603.9469 297.6378 615.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1046 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-transform.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 603.9469 323.1978 615.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1047 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-transform.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 603.9469 323.1978 615.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1048 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-translate.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 427.9469 225.8461 439.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1049 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-translate.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 427.9469 297.6378 439.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1050 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-translate.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 427.9469 323.1978 439.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1051 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-translate.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 427.9469 323.1978 439.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1052 0 obj
              -<< /Annots [ 1044 0 R 1045 0 R 1046 0 R 1047 0 R 1048 0 R 1049 0 R 1050 0 R 1051 0 R ] /Contents 1391 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -1053 0 obj
              -<< /Border [ 0 0 0 ] /Contents () /Dest [ 487 0 R /Fit ] /Rect [ 56.69291 664.1969 538.5827 676.1969 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1054 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-ul-ol-li.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 442.9469 218.0661 454.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1055 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ul-ol-li.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 442.9469 297.6378 454.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1056 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ul-ol-li.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 442.9469 323.1978 454.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1057 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-ul-ol-li.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 442.9469 323.1978 454.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1058 0 obj
              -<< /Annots [ 1053 0 R 1054 0 R 1055 0 R 1056 0 R 1057 0 R ] /Contents 1392 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -1059 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-barChart.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 265.9469 227.5161 277.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1060 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 265.9469 297.6378 277.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1061 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 265.9469 323.1978 277.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1062 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-barChart.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 265.9469 323.1978 277.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1063 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-log.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 118.9469 203.0661 130.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1064 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 118.9469 297.6378 130.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1065 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 118.9469 323.1978 130.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1066 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-log.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 118.9469 323.1978 130.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1067 0 obj
              -<< /Annots [ 1059 0 R 1060 0 R 1061 0 R 1062 0 R 1063 0 R 1064 0 R 1065 0 R 1066 0 R ] /Contents 1393 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -1068 0 obj
              -<< /Contents 1394 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans <<  >> 
              -  /Type /Page >>
              -endobj
              -1069 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-linePlot.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 521.9469 221.9561 533.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1070 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 521.9469 297.6378 533.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1071 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 521.9469 323.1978 533.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1072 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 521.9469 323.1978 533.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1073 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-para.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 265.9469 209.1761 277.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1074 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 265.9469 297.6378 277.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1075 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 265.9469 323.1978 277.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1076 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-para.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 265.9469 323.1978 277.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1077 0 obj
              -<< /Annots [ 1069 0 R 1070 0 R 1071 0 R 1072 0 R 1073 0 R 1074 0 R 1075 0 R 1076 0 R ] /Contents 1395 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -1078 0 obj
              -<< /Contents 1396 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans <<  >> 
              -  /Type /Page >>
              -endobj
              -1079 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/input/tag-linePlot.rml) >> /Border [ 0 0 0 ] /Rect [ 150.2861 666.9469 221.9561 678.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1080 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 666.9469 297.6378 678.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1081 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 297.6378 666.9469 323.1978 678.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1082 0 obj
              -<< /A << /S /URI /Type /Action /URI (https://github.com/zopefoundation/z3c.rml/blob/master/src/z3c/rml/tests/expected/tag-linePlot.pdf?raw=true) >> /Border [ 0 0 0 ] /Rect [ 323.1978 666.9469 323.1978 678.9469 ] /Subtype /Link /Type /Annot >>
              -endobj
              -1083 0 obj
              -<< /Annots [ 1079 0 R 1080 0 R 1081 0 R 1082 0 R ] /Contents 1397 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 1293 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 
              -  /Trans <<  >> /Type /Page >>
              -endobj
              -1084 0 obj
              -<< /Outlines 1086 0 R /PageMode /UseNone /Pages 1293 0 R /Type /Catalog >>
              -endobj
              -1085 0 obj
              -<< /Author (\(anonymous\)) /CreationDate (D:20140910123008+05'00') /Creator (\(unspecified\)) /Keywords () /Producer (ReportLab PDF Library - www.reportlab.com) /Subject (\(unspecified\)) 
              -  /Title (\(anonymous\)) >>
              -endobj
              -1086 0 obj
              -<< /Count 208 /First 1087 0 R /Last 1114 0 R /Type /Outlines >>
              -endobj
              -1087 0 obj
              -<< /Count 26 /Dest [ 8 0 R /Fit ] /First 1088 0 R /Last 1113 0 R /Next 1114 0 R /Parent 1086 0 R 
              -  /Title (Attribute Types) >>
              -endobj
              -1088 0 obj
              -<< /Dest [ 8 0 R /Fit ] /Next 1089 0 R /Parent 1087 0 R /Title (Boolean) >>
              -endobj
              -1089 0 obj
              -<< /Dest [ 8 0 R /Fit ] /Next 1090 0 R /Parent 1087 0 R /Prev 1088 0 R /Title (BooleanWithDefault) >>
              -endobj
              -1090 0 obj
              -<< /Dest [ 8 0 R /Fit ] /Next 1091 0 R /Parent 1087 0 R /Prev 1089 0 R /Title (Choice) >>
              -endobj
              -1091 0 obj
              -<< /Dest [ 8 0 R /Fit ] /Next 1092 0 R /Parent 1087 0 R /Prev 1090 0 R /Title (Color) >>
              -endobj
              -1092 0 obj
              -<< /Dest [ 8 0 R /Fit ] /Next 1093 0 R /Parent 1087 0 R /Prev 1091 0 R /Title (Combination) >>
              -endobj
              -1093 0 obj
              -<< /Dest [ 8 0 R /Fit ] /Next 1094 0 R /Parent 1087 0 R /Prev 1092 0 R /Title (File) >>
              -endobj
              -1094 0 obj
              -<< /Dest [ 8 0 R /Fit ] /Next 1095 0 R /Parent 1087 0 R /Prev 1093 0 R /Title (FirstLevelTextNode) >>
              -endobj
              -1095 0 obj
              -<< /Dest [ 8 0 R /Fit ] /Next 1096 0 R /Parent 1087 0 R /Prev 1094 0 R /Title (Float) >>
              -endobj
              -1096 0 obj
              -<< /Dest [ 8 0 R /Fit ] /Next 1097 0 R /Parent 1087 0 R /Prev 1095 0 R /Title (Image) >>
              -endobj
              -1097 0 obj
              -<< /Dest [ 8 0 R /Fit ] /Next 1098 0 R /Parent 1087 0 R /Prev 1096 0 R /Title (Integer) >>
              -endobj
              -1098 0 obj
              -<< /Dest [ 8 0 R /Fit ] /Next 1099 0 R /Parent 1087 0 R /Prev 1097 0 R /Title (IntegerSequence) >>
              -endobj
              -1099 0 obj
              -<< /Dest [ 8 0 R /Fit ] /Next 1100 0 R /Parent 1087 0 R /Prev 1098 0 R /Title (Measurement) >>
              -endobj
              -1100 0 obj
              -<< /Dest [ 8 0 R /Fit ] /Next 1101 0 R /Parent 1087 0 R /Prev 1099 0 R /Title (Padding) >>
              -endobj
              -1101 0 obj
              -<< /Dest [ 8 0 R /Fit ] /Next 1102 0 R /Parent 1087 0 R /Prev 1100 0 R /Title (PageSize) >>
              -endobj
              -1102 0 obj
              -<< /Dest [ 9 0 R /Fit ] /Next 1103 0 R /Parent 1087 0 R /Prev 1101 0 R /Title (RawXMLContent) >>
              -endobj
              -1103 0 obj
              -<< /Dest [ 9 0 R /Fit ] /Next 1104 0 R /Parent 1087 0 R /Prev 1102 0 R /Title (Sequence) >>
              -endobj
              -1104 0 obj
              -<< /Dest [ 9 0 R /Fit ] /Next 1105 0 R /Parent 1087 0 R /Prev 1103 0 R /Title (String) >>
              -endobj
              -1105 0 obj
              -<< /Dest [ 9 0 R /Fit ] /Next 1106 0 R /Parent 1087 0 R /Prev 1104 0 R /Title (StringOrInt) >>
              -endobj
              -1106 0 obj
              -<< /Dest [ 9 0 R /Fit ] /Next 1107 0 R /Parent 1087 0 R /Prev 1105 0 R /Title (Style) >>
              -endobj
              -1107 0 obj
              -<< /Dest [ 9 0 R /Fit ] /Next 1108 0 R /Parent 1087 0 R /Prev 1106 0 R /Title (Symbol) >>
              -endobj
              -1108 0 obj
              -<< /Dest [ 9 0 R /Fit ] /Next 1109 0 R /Parent 1087 0 R /Prev 1107 0 R /Title (Text) >>
              -endobj
              -1109 0 obj
              -<< /Dest [ 9 0 R /Fit ] /Next 1110 0 R /Parent 1087 0 R /Prev 1108 0 R /Title (TextBoolean) >>
              -endobj
              -1110 0 obj
              -<< /Dest [ 9 0 R /Fit ] /Next 1111 0 R /Parent 1087 0 R /Prev 1109 0 R /Title (TextNode) >>
              -endobj
              -1111 0 obj
              -<< /Dest [ 9 0 R /Fit ] /Next 1112 0 R /Parent 1087 0 R /Prev 1110 0 R /Title (TextNodeGrid) >>
              -endobj
              -1112 0 obj
              -<< /Dest [ 9 0 R /Fit ] /Next 1113 0 R /Parent 1087 0 R /Prev 1111 0 R /Title (TextNodeSequence) >>
              -endobj
              -1113 0 obj
              -<< /Dest [ 9 0 R /Fit ] /Parent 1087 0 R /Prev 1112 0 R /Title (XMLContent) >>
              -endobj
              -1114 0 obj
              -<< /Count 178 /Dest [ 25 0 R /Fit ] /First 1115 0 R /Last 1292 0 R /Parent 1086 0 R /Prev 1087 0 R 
              -  /Title (Directives) >>
              -endobj
              -1115 0 obj
              -<< /Dest [ 25 0 R /Fit ] /Next 1116 0 R /Parent 1114 0 R /Title (addMapping) >>
              -endobj
              -1116 0 obj
              -<< /Dest [ 25 0 R /Fit ] /Next 1117 0 R /Parent 1114 0 R /Prev 1115 0 R /Title (alias) >>
              -endobj
              -1117 0 obj
              -<< /Dest [ 25 0 R /Fit ] /Next 1118 0 R /Parent 1114 0 R /Prev 1116 0 R /Title (bar) >>
              -endobj
              -1118 0 obj
              -<< /Dest [ 25 0 R /Fit ] /Next 1119 0 R /Parent 1114 0 R /Prev 1117 0 R /Title (barChart) >>
              -endobj
              -1119 0 obj
              -<< /Dest [ 37 0 R /Fit ] /Next 1120 0 R /Parent 1114 0 R /Prev 1118 0 R /Title (barChart3D) >>
              -endobj
              -1120 0 obj
              -<< /Dest [ 48 0 R /Fit ] /Next 1121 0 R /Parent 1114 0 R /Prev 1119 0 R /Title (barCode) >>
              -endobj
              -1121 0 obj
              -<< /Dest [ 58 0 R /Fit ] /Next 1122 0 R /Parent 1114 0 R /Prev 1120 0 R /Title (barCodeFlowable) >>
              -endobj
              -1122 0 obj
              -<< /Dest [ 67 0 R /Fit ] /Next 1123 0 R /Parent 1114 0 R /Prev 1121 0 R /Title (barLabels) >>
              -endobj
              -1123 0 obj
              -<< /Dest [ 69 0 R /Fit ] /Next 1124 0 R /Parent 1114 0 R /Prev 1122 0 R /Title (bars) >>
              -endobj
              -1124 0 obj
              -<< /Dest [ 79 0 R /Fit ] /Next 1125 0 R /Parent 1114 0 R /Prev 1123 0 R /Title (blockAlignment) >>
              -endobj
              -1125 0 obj
              -<< /Dest [ 79 0 R /Fit ] /Next 1126 0 R /Parent 1114 0 R /Prev 1124 0 R /Title (blockBackground) >>
              -endobj
              -1126 0 obj
              -<< /Dest [ 79 0 R /Fit ] /Next 1127 0 R /Parent 1114 0 R /Prev 1125 0 R /Title (blockBottomPadding) >>
              -endobj
              -1127 0 obj
              -<< /Dest [ 92 0 R /Fit ] /Next 1128 0 R /Parent 1114 0 R /Prev 1126 0 R /Title (blockColBackground) >>
              -endobj
              -1128 0 obj
              -<< /Dest [ 92 0 R /Fit ] /Next 1129 0 R /Parent 1114 0 R /Prev 1127 0 R /Title (blockFont) >>
              -endobj
              -1129 0 obj
              -<< /Dest [ 92 0 R /Fit ] /Next 1130 0 R /Parent 1114 0 R /Prev 1128 0 R /Title (blockLeading) >>
              -endobj
              -1130 0 obj
              -<< /Dest [ 109 0 R /Fit ] /Next 1131 0 R /Parent 1114 0 R /Prev 1129 0 R /Title (blockLeftPadding) >>
              -endobj
              -1131 0 obj
              -<< /Dest [ 109 0 R /Fit ] /Next 1132 0 R /Parent 1114 0 R /Prev 1130 0 R /Title (blockRightPadding) >>
              -endobj
              -1132 0 obj
              -<< /Dest [ 109 0 R /Fit ] /Next 1133 0 R /Parent 1114 0 R /Prev 1131 0 R /Title (blockRowBackground) >>
              -endobj
              -1133 0 obj
              -<< /Dest [ 109 0 R /Fit ] /Next 1134 0 R /Parent 1114 0 R /Prev 1132 0 R /Title (blockSpan) >>
              -endobj
              -1134 0 obj
              -<< /Dest [ 124 0 R /Fit ] /Next 1135 0 R /Parent 1114 0 R /Prev 1133 0 R /Title (blockTable) >>
              -endobj
              -1135 0 obj
              -<< /Dest [ 124 0 R /Fit ] /Next 1136 0 R /Parent 1114 0 R /Prev 1134 0 R /Title (blockTableStyle) >>
              -endobj
              -1136 0 obj
              -<< /Dest [ 148 0 R /Fit ] /Next 1137 0 R /Parent 1114 0 R /Prev 1135 0 R /Title (blockTextColor) >>
              -endobj
              -1137 0 obj
              -<< /Dest [ 148 0 R /Fit ] /Next 1138 0 R /Parent 1114 0 R /Prev 1136 0 R /Title (blockTopPadding) >>
              -endobj
              -1138 0 obj
              -<< /Dest [ 148 0 R /Fit ] /Next 1139 0 R /Parent 1114 0 R /Prev 1137 0 R /Title (blockValign) >>
              -endobj
              -1139 0 obj
              -<< /Dest [ 153 0 R /Fit ] /Next 1140 0 R /Parent 1114 0 R /Prev 1138 0 R /Title (bookmark) >>
              -endobj
              -1140 0 obj
              -<< /Dest [ 153 0 R /Fit ] /Next 1141 0 R /Parent 1114 0 R /Prev 1139 0 R /Title (bookmark) >>
              -endobj
              -1141 0 obj
              -<< /Dest [ 153 0 R /Fit ] /Next 1142 0 R /Parent 1114 0 R /Prev 1140 0 R /Title (bookmarkPage) >>
              -endobj
              -1142 0 obj
              -<< /Dest [ 166 0 R /Fit ] /Next 1143 0 R /Parent 1114 0 R /Prev 1141 0 R /Title (bulkData) >>
              -endobj
              -1143 0 obj
              -<< /Dest [ 166 0 R /Fit ] /Next 1144 0 R /Parent 1114 0 R /Prev 1142 0 R /Title (buttonField) >>
              -endobj
              -1144 0 obj
              -<< /Dest [ 166 0 R /Fit ] /Next 1145 0 R /Parent 1114 0 R /Prev 1143 0 R /Title (categoryAxis) >>
              -endobj
              -1145 0 obj
              -<< /Dest [ 183 0 R /Fit ] /Next 1146 0 R /Parent 1114 0 R /Prev 1144 0 R /Title (categoryNames) >>
              -endobj
              -1146 0 obj
              -<< /Dest [ 183 0 R /Fit ] /Next 1147 0 R /Parent 1114 0 R /Prev 1145 0 R /Title (circle) >>
              -endobj
              -1147 0 obj
              -<< /Dest [ 183 0 R /Fit ] /Next 1148 0 R /Parent 1114 0 R /Prev 1146 0 R /Title (codesnippet) >>
              -endobj
              -1148 0 obj
              -<< /Dest [ 200 0 R /Fit ] /Next 1149 0 R /Parent 1114 0 R /Prev 1147 0 R /Title (color) >>
              -endobj
              -1149 0 obj
              -<< /Dest [ 200 0 R /Fit ] /Next 1150 0 R /Parent 1114 0 R /Prev 1148 0 R /Title (condPageBreak) >>
              -endobj
              -1150 0 obj
              -<< /Dest [ 200 0 R /Fit ] /Next 1151 0 R /Parent 1114 0 R /Prev 1149 0 R /Title (critical) >>
              -endobj
              -1151 0 obj
              -<< /Dest [ 213 0 R /Fit ] /Next 1152 0 R /Parent 1114 0 R /Prev 1150 0 R /Title (cropMarks) >>
              -endobj
              -1152 0 obj
              -<< /Dest [ 213 0 R /Fit ] /Next 1153 0 R /Parent 1114 0 R /Prev 1151 0 R /Title (curves) >>
              -endobj
              -1153 0 obj
              -<< /Dest [ 213 0 R /Fit ] /Next 1154 0 R /Parent 1114 0 R /Prev 1152 0 R /Title (curvesto) >>
              -endobj
              -1154 0 obj
              -<< /Dest [ 229 0 R /Fit ] /Next 1155 0 R /Parent 1114 0 R /Prev 1153 0 R /Title (curveto) >>
              -endobj
              -1155 0 obj
              -<< /Dest [ 229 0 R /Fit ] /Next 1156 0 R /Parent 1114 0 R /Prev 1154 0 R /Title (data) >>
              -endobj
              -1156 0 obj
              -<< /Dest [ 229 0 R /Fit ] /Next 1157 0 R /Parent 1114 0 R /Prev 1155 0 R /Title (data) >>
              -endobj
              -1157 0 obj
              -<< /Dest [ 229 0 R /Fit ] /Next 1158 0 R /Parent 1114 0 R /Prev 1156 0 R /Title (data) >>
              -endobj
              -1158 0 obj
              -<< /Dest [ 254 0 R /Fit ] /Next 1159 0 R /Parent 1114 0 R /Prev 1157 0 R /Title (debug) >>
              -endobj
              -1159 0 obj
              -<< /Dest [ 254 0 R /Fit ] /Next 1160 0 R /Parent 1114 0 R /Prev 1158 0 R /Title (docAssign) >>
              -endobj
              -1160 0 obj
              -<< /Dest [ 254 0 R /Fit ] /Next 1161 0 R /Parent 1114 0 R /Prev 1159 0 R /Title (docElse) >>
              -endobj
              -1161 0 obj
              -<< /Dest [ 254 0 R /Fit ] /Next 1162 0 R /Parent 1114 0 R /Prev 1160 0 R /Title (docExec) >>
              -endobj
              -1162 0 obj
              -<< /Dest [ 254 0 R /Fit ] /Next 1163 0 R /Parent 1114 0 R /Prev 1161 0 R /Title (docIf) >>
              -endobj
              -1163 0 obj
              -<< /Dest [ 267 0 R /Fit ] /Next 1164 0 R /Parent 1114 0 R /Prev 1162 0 R /Title (docPara) >>
              -endobj
              -1164 0 obj
              -<< /Dest [ 267 0 R /Fit ] /Next 1165 0 R /Parent 1114 0 R /Prev 1163 0 R /Title (docWhile) >>
              -endobj
              -1165 0 obj
              -<< /Dest [ 267 0 R /Fit ] /Next 1166 0 R /Parent 1114 0 R /Prev 1164 0 R /Title (docinit) >>
              -endobj
              -1166 0 obj
              -<< /Dest [ 302 0 R /Fit ] /Next 1167 0 R /Parent 1114 0 R /Prev 1165 0 R /Title (document) >>
              -endobj
              -1167 0 obj
              -<< /Dest [ 319 0 R /Fit ] /Next 1168 0 R /Parent 1114 0 R /Prev 1166 0 R /Title (drawAlignedString) >>
              -endobj
              -1168 0 obj
              -<< /Dest [ 319 0 R /Fit ] /Next 1169 0 R /Parent 1114 0 R /Prev 1167 0 R /Title (drawCenteredString) >>
              -endobj
              -1169 0 obj
              -<< /Dest [ 319 0 R /Fit ] /Next 1170 0 R /Parent 1114 0 R /Prev 1168 0 R /Title (drawRightString) >>
              -endobj
              -1170 0 obj
              -<< /Dest [ 332 0 R /Fit ] /Next 1171 0 R /Parent 1114 0 R /Prev 1169 0 R /Title (drawString) >>
              -endobj
              -1171 0 obj
              -<< /Dest [ 332 0 R /Fit ] /Next 1172 0 R /Parent 1114 0 R /Prev 1170 0 R /Title (ellipse) >>
              -endobj
              -1172 0 obj
              -<< /Dest [ 332 0 R /Fit ] /Next 1173 0 R /Parent 1114 0 R /Prev 1171 0 R /Title (error) >>
              -endobj
              -1173 0 obj
              -<< /Dest [ 345 0 R /Fit ] /Next 1174 0 R /Parent 1114 0 R /Prev 1172 0 R /Title (fill) >>
              -endobj
              -1174 0 obj
              -<< /Dest [ 345 0 R /Fit ] /Next 1175 0 R /Parent 1114 0 R /Prev 1173 0 R /Title (fixedSize) >>
              -endobj
              -1175 0 obj
              -<< /Dest [ 345 0 R /Fit ] /Next 1176 0 R /Parent 1114 0 R /Prev 1174 0 R /Title (frame) >>
              -endobj
              -1176 0 obj
              -<< /Dest [ 358 0 R /Fit ] /Next 1177 0 R /Parent 1114 0 R /Prev 1175 0 R /Title (grid) >>
              -endobj
              -1177 0 obj
              -<< /Dest [ 358 0 R /Fit ] /Next 1178 0 R /Parent 1114 0 R /Prev 1176 0 R /Title (h1) >>
              -endobj
              -1178 0 obj
              -<< /Dest [ 364 0 R /Fit ] /Next 1179 0 R /Parent 1114 0 R /Prev 1177 0 R /Title (h2) >>
              -endobj
              -1179 0 obj
              -<< /Dest [ 369 0 R /Fit ] /Next 1180 0 R /Parent 1114 0 R /Prev 1178 0 R /Title (h3) >>
              -endobj
              -1180 0 obj
              -<< /Dest [ 374 0 R /Fit ] /Next 1181 0 R /Parent 1114 0 R /Prev 1179 0 R /Title (h4) >>
              -endobj
              -1181 0 obj
              -<< /Dest [ 380 0 R /Fit ] /Next 1182 0 R /Parent 1114 0 R /Prev 1180 0 R /Title (h5) >>
              -endobj
              -1182 0 obj
              -<< /Dest [ 385 0 R /Fit ] /Next 1183 0 R /Parent 1114 0 R /Prev 1181 0 R /Title (h6) >>
              -endobj
              -1183 0 obj
              -<< /Dest [ 399 0 R /Fit ] /Next 1184 0 R /Parent 1114 0 R /Prev 1182 0 R /Title (hr) >>
              -endobj
              -1184 0 obj
              -<< /Dest [ 399 0 R /Fit ] /Next 1185 0 R /Parent 1114 0 R /Prev 1183 0 R /Title (illustration) >>
              -endobj
              -1185 0 obj
              -<< /Dest [ 399 0 R /Fit ] /Next 1186 0 R /Parent 1114 0 R /Prev 1184 0 R /Title (image) >>
              -endobj
              -1186 0 obj
              -<< /Dest [ 404 0 R /Fit ] /Next 1187 0 R /Parent 1114 0 R /Prev 1185 0 R /Title (imageAndFlowables) >>
              -endobj
              -1187 0 obj
              -<< /Dest [ 429 0 R /Fit ] /Next 1188 0 R /Parent 1114 0 R /Prev 1186 0 R /Title (img) >>
              -endobj
              -1188 0 obj
              -<< /Dest [ 429 0 R /Fit ] /Next 1189 0 R /Parent 1114 0 R /Prev 1187 0 R /Title (includePdfPages) >>
              -endobj
              -1189 0 obj
              -<< /Dest [ 429 0 R /Fit ] /Next 1190 0 R /Parent 1114 0 R /Prev 1188 0 R /Title (indent) >>
              -endobj
              -1190 0 obj
              -<< /Dest [ 445 0 R /Fit ] /Next 1191 0 R /Parent 1114 0 R /Prev 1189 0 R /Title (info) >>
              -endobj
              -1191 0 obj
              -<< /Dest [ 445 0 R /Fit ] /Next 1192 0 R /Parent 1114 0 R /Prev 1190 0 R /Title (initialize) >>
              -endobj
              -1192 0 obj
              -<< /Dest [ 445 0 R /Fit ] /Next 1193 0 R /Parent 1114 0 R /Prev 1191 0 R /Title (keepInFrame) >>
              -endobj
              -1193 0 obj
              -<< /Dest [ 450 0 R /Fit ] /Next 1194 0 R /Parent 1114 0 R /Prev 1192 0 R /Title (keepTogether) >>
              -endobj
              -1194 0 obj
              -<< /Dest [ 455 0 R /Fit ] /Next 1195 0 R /Parent 1114 0 R /Prev 1193 0 R /Title (label) >>
              -endobj
              -1195 0 obj
              -<< /Dest [ 460 0 R /Fit ] /Next 1196 0 R /Parent 1114 0 R /Prev 1194 0 R /Title (label) >>
              -endobj
              -1196 0 obj
              -<< /Dest [ 465 0 R /Fit ] /Next 1197 0 R /Parent 1114 0 R /Prev 1195 0 R /Title (label) >>
              -endobj
              -1197 0 obj
              -<< /Dest [ 474 0 R /Fit ] /Next 1198 0 R /Parent 1114 0 R /Prev 1196 0 R /Title (label) >>
              -endobj
              -1198 0 obj
              -<< /Dest [ 474 0 R /Fit ] /Next 1199 0 R /Parent 1114 0 R /Prev 1197 0 R /Title (label) >>
              -endobj
              -1199 0 obj
              -<< /Dest [ 476 0 R /Fit ] /Next 1200 0 R /Parent 1114 0 R /Prev 1198 0 R /Title (labels) >>
              -endobj
              -1200 0 obj
              -<< /Dest [ 487 0 R /Fit ] /Next 1201 0 R /Parent 1114 0 R /Prev 1199 0 R /Title (labels) >>
              -endobj
              -1201 0 obj
              -<< /Dest [ 487 0 R /Fit ] /Next 1202 0 R /Parent 1114 0 R /Prev 1200 0 R /Title (li) >>
              -endobj
              -1202 0 obj
              -<< /Dest [ 496 0 R /Fit ] /Next 1203 0 R /Parent 1114 0 R /Prev 1201 0 R /Title (li) >>
              -endobj
              -1203 0 obj
              -<< /Dest [ 496 0 R /Fit ] /Next 1204 0 R /Parent 1114 0 R /Prev 1202 0 R /Title (line) >>
              -endobj
              -1204 0 obj
              -<< /Dest [ 501 0 R /Fit ] /Next 1205 0 R /Parent 1114 0 R /Prev 1203 0 R /Title (lineLabels) >>
              -endobj
              -1205 0 obj
              -<< /Dest [ 511 0 R /Fit ] /Next 1206 0 R /Parent 1114 0 R /Prev 1204 0 R /Title (lineMode) >>
              -endobj
              -1206 0 obj
              -<< /Dest [ 511 0 R /Fit ] /Next 1207 0 R /Parent 1114 0 R /Prev 1205 0 R /Title (linePlot) >>
              -endobj
              -1207 0 obj
              -<< /Dest [ 523 0 R /Fit ] /Next 1208 0 R /Parent 1114 0 R /Prev 1206 0 R /Title (linePlot3D) >>
              -endobj
              -1208 0 obj
              -<< /Dest [ 543 0 R /Fit ] /Next 1209 0 R /Parent 1114 0 R /Prev 1207 0 R /Title (lineStyle) >>
              -endobj
              -1209 0 obj
              -<< /Dest [ 543 0 R /Fit ] /Next 1210 0 R /Parent 1114 0 R /Prev 1208 0 R /Title (lines) >>
              -endobj
              -1210 0 obj
              -<< /Dest [ 543 0 R /Fit ] /Next 1211 0 R /Parent 1114 0 R /Prev 1209 0 R /Title (lines) >>
              -endobj
              -1211 0 obj
              -<< /Dest [ 557 0 R /Fit ] /Next 1212 0 R /Parent 1114 0 R /Prev 1210 0 R /Title (link) >>
              -endobj
              -1212 0 obj
              -<< /Dest [ 557 0 R /Fit ] /Next 1213 0 R /Parent 1114 0 R /Prev 1211 0 R /Title (listStyle) >>
              -endobj
              -1213 0 obj
              -<< /Dest [ 570 0 R /Fit ] /Next 1214 0 R /Parent 1114 0 R /Prev 1212 0 R /Title (log) >>
              -endobj
              -1214 0 obj
              -<< /Dest [ 570 0 R /Fit ] /Next 1215 0 R /Parent 1114 0 R /Prev 1213 0 R /Title (logConfig) >>
              -endobj
              -1215 0 obj
              -<< /Dest [ 583 0 R /Fit ] /Next 1216 0 R /Parent 1114 0 R /Prev 1214 0 R /Title (mergePage) >>
              -endobj
              -1216 0 obj
              -<< /Dest [ 583 0 R /Fit ] /Next 1217 0 R /Parent 1114 0 R /Prev 1215 0 R /Title (moveto) >>
              -endobj
              -1217 0 obj
              -<< /Dest [ 583 0 R /Fit ] /Next 1218 0 R /Parent 1114 0 R /Prev 1216 0 R /Title (name) >>
              -endobj
              -1218 0 obj
              -<< /Dest [ 583 0 R /Fit ] /Next 1219 0 R /Parent 1114 0 R /Prev 1217 0 R /Title (name) >>
              -endobj
              -1219 0 obj
              -<< /Dest [ 596 0 R /Fit ] /Next 1220 0 R /Parent 1114 0 R /Prev 1218 0 R /Title (namedString) >>
              -endobj
              -1220 0 obj
              -<< /Dest [ 596 0 R /Fit ] /Next 1221 0 R /Parent 1114 0 R /Prev 1219 0 R /Title (nextFrame) >>
              -endobj
              -1221 0 obj
              -<< /Dest [ 596 0 R /Fit ] /Next 1222 0 R /Parent 1114 0 R /Prev 1220 0 R /Title (nextPage) >>
              -endobj
              -1222 0 obj
              -<< /Dest [ 596 0 R /Fit ] /Next 1223 0 R /Parent 1114 0 R /Prev 1221 0 R /Title (ol) >>
              -endobj
              -1223 0 obj
              -<< /Dest [ 614 0 R /Fit ] /Next 1224 0 R /Parent 1114 0 R /Prev 1222 0 R /Title (option) >>
              -endobj
              -1224 0 obj
              -<< /Dest [ 614 0 R /Fit ] /Next 1225 0 R /Parent 1114 0 R /Prev 1223 0 R /Title (outlineAdd) >>
              -endobj
              -1225 0 obj
              -<< /Dest [ 614 0 R /Fit ] /Next 1226 0 R /Parent 1114 0 R /Prev 1224 0 R /Title (pageDrawing) >>
              -endobj
              -1226 0 obj
              -<< /Dest [ 659 0 R /Fit ] /Next 1227 0 R /Parent 1114 0 R /Prev 1225 0 R /Title (pageGraphics) >>
              -endobj
              -1227 0 obj
              -<< /Dest [ 683 0 R /Fit ] /Next 1228 0 R /Parent 1114 0 R /Prev 1226 0 R /Title (pageInfo) >>
              -endobj
              -1228 0 obj
              -<< /Dest [ 683 0 R /Fit ] /Next 1229 0 R /Parent 1114 0 R /Prev 1227 0 R /Title (pageTemplate) >>
              -endobj
              -1229 0 obj
              -<< /Dest [ 683 0 R /Fit ] /Next 1230 0 R /Parent 1114 0 R /Prev 1228 0 R /Title (para) >>
              -endobj
              -1230 0 obj
              -<< /Dest [ 689 0 R /Fit ] /Next 1231 0 R /Parent 1114 0 R /Prev 1229 0 R /Title (paraStyle) >>
              -endobj
              -1231 0 obj
              -<< /Dest [ 698 0 R /Fit ] /Next 1232 0 R /Parent 1114 0 R /Prev 1230 0 R /Title (param) >>
              -endobj
              -1232 0 obj
              -<< /Dest [ 698 0 R /Fit ] /Next 1233 0 R /Parent 1114 0 R /Prev 1231 0 R /Title (path) >>
              -endobj
              -1233 0 obj
              -<< /Dest [ 710 0 R /Fit ] /Next 1234 0 R /Parent 1114 0 R /Prev 1232 0 R /Title (pieChart) >>
              -endobj
              -1234 0 obj
              -<< /Dest [ 720 0 R /Fit ] /Next 1235 0 R /Parent 1114 0 R /Prev 1233 0 R /Title (pieChart3D) >>
              -endobj
              -1235 0 obj
              -<< /Dest [ 731 0 R /Fit ] /Next 1236 0 R /Parent 1114 0 R /Prev 1234 0 R /Title (place) >>
              -endobj
              -1236 0 obj
              -<< /Dest [ 740 0 R /Fit ] /Next 1237 0 R /Parent 1114 0 R /Prev 1235 0 R /Title (plugInFlowable) >>
              -endobj
              -1237 0 obj
              -<< /Dest [ 740 0 R /Fit ] /Next 1238 0 R /Parent 1114 0 R /Prev 1236 0 R /Title (plugInGraphic) >>
              -endobj
              -1238 0 obj
              -<< /Dest [ 740 0 R /Fit ] /Next 1239 0 R /Parent 1114 0 R /Prev 1237 0 R /Title (pointer) >>
              -endobj
              -1239 0 obj
              -<< /Dest [ 753 0 R /Fit ] /Next 1240 0 R /Parent 1114 0 R /Prev 1238 0 R /Title (pre) >>
              -endobj
              -1240 0 obj
              -<< /Dest [ 753 0 R /Fit ] /Next 1241 0 R /Parent 1114 0 R /Prev 1239 0 R /Title (pto) >>
              -endobj
              -1241 0 obj
              -<< /Dest [ 753 0 R /Fit ] /Next 1242 0 R /Parent 1114 0 R /Prev 1240 0 R /Title (rect) >>
              -endobj
              -1242 0 obj
              -<< /Dest [ 766 0 R /Fit ] /Next 1243 0 R /Parent 1114 0 R /Prev 1241 0 R /Title (registerCidFont) >>
              -endobj
              -1243 0 obj
              -<< /Dest [ 766 0 R /Fit ] /Next 1244 0 R /Parent 1114 0 R /Prev 1242 0 R /Title (registerFont) >>
              -endobj
              -1244 0 obj
              -<< /Dest [ 783 0 R /Fit ] /Next 1245 0 R /Parent 1114 0 R /Prev 1243 0 R /Title (registerFontFamily) >>
              -endobj
              -1245 0 obj
              -<< /Dest [ 783 0 R /Fit ] /Next 1246 0 R /Parent 1114 0 R /Prev 1244 0 R /Title (registerTTFont) >>
              -endobj
              -1246 0 obj
              -<< /Dest [ 783 0 R /Fit ] /Next 1247 0 R /Parent 1114 0 R /Prev 1245 0 R /Title (registerType1Face) >>
              -endobj
              -1247 0 obj
              -<< /Dest [ 783 0 R /Fit ] /Next 1248 0 R /Parent 1114 0 R /Prev 1246 0 R /Title (restoreState) >>
              -endobj
              -1248 0 obj
              -<< /Dest [ 800 0 R /Fit ] /Next 1249 0 R /Parent 1114 0 R /Prev 1247 0 R /Title (rotate) >>
              -endobj
              -1249 0 obj
              -<< /Dest [ 800 0 R /Fit ] /Next 1250 0 R /Parent 1114 0 R /Prev 1248 0 R /Title (saveState) >>
              -endobj
              -1250 0 obj
              -<< /Dest [ 800 0 R /Fit ] /Next 1251 0 R /Parent 1114 0 R /Prev 1249 0 R /Title (scale) >>
              -endobj
              -1251 0 obj
              -<< /Dest [ 800 0 R /Fit ] /Next 1252 0 R /Parent 1114 0 R /Prev 1250 0 R /Title (selectField) >>
              -endobj
              -1252 0 obj
              -<< /Dest [ 814 0 R /Fit ] /Next 1253 0 R /Parent 1114 0 R /Prev 1251 0 R /Title (series) >>
              -endobj
              -1253 0 obj
              -<< /Dest [ 814 0 R /Fit ] /Next 1254 0 R /Parent 1114 0 R /Prev 1252 0 R /Title (series) >>
              -endobj
              -1254 0 obj
              -<< /Dest [ 814 0 R /Fit ] /Next 1255 0 R /Parent 1114 0 R /Prev 1253 0 R /Title (setFont) >>
              -endobj
              -1255 0 obj
              -<< /Dest [ 835 0 R /Fit ] /Next 1256 0 R /Parent 1114 0 R /Prev 1254 0 R /Title (setFontSize) >>
              -endobj
              -1256 0 obj
              -<< /Dest [ 835 0 R /Fit ] /Next 1257 0 R /Parent 1114 0 R /Prev 1255 0 R /Title (setNextFrame) >>
              -endobj
              -1257 0 obj
              -<< /Dest [ 835 0 R /Fit ] /Next 1258 0 R /Parent 1114 0 R /Prev 1256 0 R /Title (setNextTemplate) >>
              -endobj
              -1258 0 obj
              -<< /Dest [ 835 0 R /Fit ] /Next 1259 0 R /Parent 1114 0 R /Prev 1257 0 R /Title (showIndex) >>
              -endobj
              -1259 0 obj
              -<< /Dest [ 850 0 R /Fit ] /Next 1260 0 R /Parent 1114 0 R /Prev 1258 0 R /Title (skew) >>
              -endobj
              -1260 0 obj
              -<< /Dest [ 850 0 R /Fit ] /Next 1261 0 R /Parent 1114 0 R /Prev 1259 0 R /Title (slice) >>
              -endobj
              -1261 0 obj
              -<< /Dest [ 850 0 R /Fit ] /Next 1262 0 R /Parent 1114 0 R /Prev 1260 0 R /Title (slice) >>
              -endobj
              -1262 0 obj
              -<< /Dest [ 856 0 R /Fit ] /Next 1263 0 R /Parent 1114 0 R /Prev 1261 0 R /Title (slices) >>
              -endobj
              -1263 0 obj
              -<< /Dest [ 866 0 R /Fit ] /Next 1264 0 R /Parent 1114 0 R /Prev 1262 0 R /Title (slices) >>
              -endobj
              -1264 0 obj
              -<< /Dest [ 866 0 R /Fit ] /Next 1265 0 R /Parent 1114 0 R /Prev 1263 0 R /Title (spacer) >>
              -endobj
              -1265 0 obj
              -<< /Dest [ 878 0 R /Fit ] /Next 1266 0 R /Parent 1114 0 R /Prev 1264 0 R /Title (spiderChart) >>
              -endobj
              -1266 0 obj
              -<< /Dest [ 883 0 R /Fit ] /Next 1267 0 R /Parent 1114 0 R /Prev 1265 0 R /Title (spoke) >>
              -endobj
              -1267 0 obj
              -<< /Dest [ 883 0 R /Fit ] /Next 1268 0 R /Parent 1114 0 R /Prev 1266 0 R /Title (spokeLabels) >>
              -endobj
              -1268 0 obj
              -<< /Dest [ 889 0 R /Fit ] /Next 1269 0 R /Parent 1114 0 R /Prev 1267 0 R /Title (spokes) >>
              -endobj
              -1269 0 obj
              -<< /Dest [ 909 0 R /Fit ] /Next 1270 0 R /Parent 1114 0 R /Prev 1268 0 R /Title (startIndex) >>
              -endobj
              -1270 0 obj
              -<< /Dest [ 909 0 R /Fit ] /Next 1271 0 R /Parent 1114 0 R /Prev 1269 0 R /Title (story) >>
              -endobj
              -1271 0 obj
              -<< /Dest [ 956 0 R /Fit ] /Next 1272 0 R /Parent 1114 0 R /Prev 1270 0 R /Title (storyPlace) >>
              -endobj
              -1272 0 obj
              -<< /Dest [ 965 0 R /Fit ] /Next 1273 0 R /Parent 1114 0 R /Prev 1271 0 R /Title (strand) >>
              -endobj
              -1273 0 obj
              -<< /Dest [ 965 0 R /Fit ] /Next 1274 0 R /Parent 1114 0 R /Prev 1272 0 R /Title (strandLabels) >>
              -endobj
              -1274 0 obj
              -<< /Dest [ 985 0 R /Fit ] /Next 1275 0 R /Parent 1114 0 R /Prev 1273 0 R /Title (strands) >>
              -endobj
              -1275 0 obj
              -<< /Dest [ 985 0 R /Fit ] /Next 1276 0 R /Parent 1114 0 R /Prev 1274 0 R /Title (stroke) >>
              -endobj
              -1276 0 obj
              -<< /Dest [ 985 0 R /Fit ] /Next 1277 0 R /Parent 1114 0 R /Prev 1275 0 R /Title (stylesheet) >>
              -endobj
              -1277 0 obj
              -<< /Dest [ 990 0 R /Fit ] /Next 1278 0 R /Parent 1114 0 R /Prev 1276 0 R /Title (td) >>
              -endobj
              -1278 0 obj
              -<< /Dest [ 995 0 R /Fit ] /Next 1279 0 R /Parent 1114 0 R /Prev 1277 0 R /Title (template) >>
              -endobj
              -1279 0 obj
              -<< /Dest [ 1005 0 R /Fit ] /Next 1280 0 R /Parent 1114 0 R /Prev 1278 0 R /Title (text) >>
              -endobj
              -1280 0 obj
              -<< /Dest [ 1023 0 R /Fit ] /Next 1281 0 R /Parent 1114 0 R /Prev 1279 0 R /Title (textAnnotation) >>
              -endobj
              -1281 0 obj
              -<< /Dest [ 1023 0 R /Fit ] /Next 1282 0 R /Parent 1114 0 R /Prev 1280 0 R /Title (textField) >>
              -endobj
              -1282 0 obj
              -<< /Dest [ 1023 0 R /Fit ] /Next 1283 0 R /Parent 1114 0 R /Prev 1281 0 R /Title (texts) >>
              -endobj
              -1283 0 obj
              -<< /Dest [ 1029 0 R /Fit ] /Next 1284 0 R /Parent 1114 0 R /Prev 1282 0 R /Title (title) >>
              -endobj
              -1284 0 obj
              -<< /Dest [ 1043 0 R /Fit ] /Next 1285 0 R /Parent 1114 0 R /Prev 1283 0 R /Title (tr) >>
              -endobj
              -1285 0 obj
              -<< /Dest [ 1052 0 R /Fit ] /Next 1286 0 R /Parent 1114 0 R /Prev 1284 0 R /Title (transform) >>
              -endobj
              -1286 0 obj
              -<< /Dest [ 1052 0 R /Fit ] /Next 1287 0 R /Parent 1114 0 R /Prev 1285 0 R /Title (translate) >>
              -endobj
              -1287 0 obj
              -<< /Dest [ 1052 0 R /Fit ] /Next 1288 0 R /Parent 1114 0 R /Prev 1286 0 R /Title (ul) >>
              -endobj
              -1288 0 obj
              -<< /Dest [ 1058 0 R /Fit ] /Next 1289 0 R /Parent 1114 0 R /Prev 1287 0 R /Title (valueAxis) >>
              -endobj
              -1289 0 obj
              -<< /Dest [ 1067 0 R /Fit ] /Next 1290 0 R /Parent 1114 0 R /Prev 1288 0 R /Title (warning) >>
              -endobj
              -1290 0 obj
              -<< /Dest [ 1067 0 R /Fit ] /Next 1291 0 R /Parent 1114 0 R /Prev 1289 0 R /Title (xValueAxis) >>
              -endobj
              -1291 0 obj
              -<< /Dest [ 1077 0 R /Fit ] /Next 1292 0 R /Parent 1114 0 R /Prev 1290 0 R /Title (xpre) >>
              -endobj
              -1292 0 obj
              -<< /Dest [ 1077 0 R /Fit ] /Parent 1114 0 R /Prev 1291 0 R /Title (yValueAxis) >>
              -endobj
              -1293 0 obj
              -<< /Count 104 /Kids [ 3 0 R 6 0 R 8 0 R 9 0 R 25 0 R 32 0 R 37 0 R 48 0 R 49 0 R 58 0 R 
              -  67 0 R 69 0 R 79 0 R 92 0 R 109 0 R 124 0 R 148 0 R 153 0 R 166 0 R 173 0 R 
              -  183 0 R 200 0 R 213 0 R 229 0 R 254 0 R 267 0 R 287 0 R 302 0 R 319 0 R 332 0 R 
              -  345 0 R 358 0 R 359 0 R 364 0 R 369 0 R 374 0 R 375 0 R 380 0 R 385 0 R 386 0 R 
              -  399 0 R 404 0 R 429 0 R 445 0 R 450 0 R 455 0 R 460 0 R 465 0 R 474 0 R 475 0 R 
              -  476 0 R 487 0 R 496 0 R 501 0 R 511 0 R 518 0 R 523 0 R 534 0 R 543 0 R 557 0 R 
              -  570 0 R 583 0 R 596 0 R 614 0 R 659 0 R 683 0 R 684 0 R 689 0 R 698 0 R 710 0 R 
              -  715 0 R 720 0 R 731 0 R 740 0 R 753 0 R 766 0 R 783 0 R 800 0 R 814 0 R 835 0 R 
              -  850 0 R 856 0 R 866 0 R 878 0 R 883 0 R 889 0 R 909 0 R 956 0 R 965 0 R 967 0 R 
              -  985 0 R 990 0 R 995 0 R 1005 0 R 1023 0 R 1029 0 R 1043 0 R 1052 0 R 1058 0 R 1067 0 R 
              -  1068 0 R 1077 0 R 1078 0 R 1083 0 R ] /Type /Pages >>
              -endobj
              -1294 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 190 >>
              -stream
              -GarWrYmS?5%*%i9i83E3eKHj8?$fi\Sa'Sh^-K5\KiY:E:[b]ui#mS%J+=hC/.F8E*Is@5G[[gA40Tq7X`7BW?Il4&Kt7#BMQN_jWtRVk1(WkC6'YCX*O,G%/N),u:$gjRa#<@Z4nPs!c`4KXPsF;h.XBG^-W\Yg=lgFm*iJbm3C8OO_4*endstream
              -endobj
              -1295 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 722 >>
              -stream
              -Gasam?#SFN'R`L25Ffc2C9n+X.$'k+C.M%`W^tmFj4o/da3JK+`d[lhbu\+H$%Ynu+.mWB\L6IJiD6%oAIEl^;o(G=YUl?E_Ik@/>!Y5^6ns[$/h,e!Rp+"joT,;Xt2-c?F=CS?7,UPVqo,r^Q],$2mEPF)o6AHAUEjZI9a7VV(,rIU>?c#lN\;=p[nYTWnu"1?:i"Ar29rpLod6G=Jc'hni!Vfuo^Yu,c$mPnD?L&jKW9pqtP[0Yd5.W#[akbVij!<3TV(tAi4aPs,Cm/+AKL\aPd^Gnheb1iS($7tt&2=o6gQnAj'nE2+P8JNgT(P'Pj60/l0h:*Z>Om1&KAo_G=stsP9b=1Vn%6[4gK?@ul"7EjQ0gG)]';F.MSX+)4-6b/f+Ti-Wp/k3KAk`Q]n_),~>endstream
              -endobj
              -1296 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1620 >>
              -stream
              -Gau0D>u)\('R`L25@!;]fd_[!7g@DNYUunUTcXiFW_+AWjA+^:a.B\%,jDN$[3o=_#ik?O,![hlhs9c,Uc)JRDU#ME[@0>1(1FeWd(G.uB:+/2A,YOsY==H\+s))C(klKXCpH[AHYp'W0":q7\`HG8i5U@S+BXsRVukU0B`kcZ)&,^?#7eb?gb-,/U\AuAJ-&B.edTDRQsI[`@8&r"Z,%t1m[lMR_=P1i@7o^-Yet7Q">Uj^c=k_!:(i8V'?.-V5(TUY+a@Un`W=jS89Kn55sJtSk6?6\kcN7Z0.(>YMgE/q+YSLPiiJPL0O_3c@\t74os`[=lUg1RqJ(0r)T-Q=i.!,'r."sOKaj$1[[tq)L(D.ath=YkpGf_RnJ[NdcdP_"8g!Fa7@IM)@R^+2V2lE2/nsLg.#=flbA!Tt@8/31MV`R/V@eT8'R*F?)_M32-B6dQ3?8<(cB014"hN+B,o;03A8CSR?VloYSj&?F3RAf)et=G(F!]upp&NL#4W,OcU_U4o*MR21fo3O1TZ4M8Kj#nV,$g1q[Bsc38nD(khnu(8\lFAtD&:.JZ=)5'nB+3d%M^VHNb[7#DY&X9-Tb/%[0Ks.SdQJ/pUTdh@5cejki#pGJklGDj3-3hBcT!H3CEI-.+n-:crX)-h11AHh+sF/sph*!IKJW$>4Ug]l[!_+WF&#Rb8rd/IE`Rhn*,FmQgU;GQJ:_CA\YhFIO[U_?/KN8na:Zq`IiNAX6Vc'IRiZm5g;a:="&Z]-gAM"?Q$B]3=cN5\+;G63q1Xkbhc5Y5I7WQro9NK8_0[)h,^B&XNm;n0>2T'IWL<5F$I1&Z))pmVW3F$n[Dsg`s;T>@.@T0*Q1#43C=^LcdC'Y$nj,G1$-+b#oTn8%^T`CfcWbt`_c@2pnc]tc*aSG+#c"iel4AAK"Hs.\F+9p]-[;a8+VGHZ;&b2SW'E=eTVL)i1,X*c2pa:rWQ*9*7+~>endstream
              -endobj
              -1297 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1134 >>
              -stream
              -Gatm;gMZ%0&:G(NIi.r,ftset/sbPhVEqu7Za_p9S*DQ#P^Ho]Qh*%#lD=,1e3AV$GeU?+)!iSsmTGmf3C#Mtc'#*"8?K5AN3"FI(qEClMg0t:%`jkA>8C_2kREAIe6_lHr`g`7qS@U*``0_hpMLG4,*msPQrSVP*b`60l;I(R[.(r!]JJH2P$;WC`#CXg)&pp'HB/-k-:12.R7!]%O\,"EK@OeBaLCZ5M5Mh[Q$$Uk;$[6d1eK,Vo5rn8JdP]f+LSl1)XB\1b(pA;XOJ(,jCDhH&Dml^%?eF.SEOk+Tq_nF\V3bBYjpQJ&-hdh3hq`Y---eVMX2"3+mW$goT[X=7)4'^"Jj;`Ao]5$s;CA9m#\)FNJB_X[cc"iqWT`G=i0PdaqbeLdmPPAL:$p^l`gAFZg;ilCo[/pk#p%p4;=COKcBlR`BiY%"/JjHV7q-!cC692cJE24/C$S3[(H0g@Fg1=P%tBFTouG6:q#N=IN'r1oMu`>#J;\B`%&'qZ-%U'dcs?3,ra4nSVnFP62a"@'YGW3,&hn*&0a1[IW?/XI(^/J`eqOCD3]$B6PDWk<*euNG8&;"o_JtVk,9`E3i>P,FUbiP`:,=)(uMbI_j#_@g)K2bTE:?^A`ju2P,71a-gO`$YtX^?,]>Ypendstream
              -endobj
              -1298 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1399 >>
              -stream
              -Gb!;e?#SIU'R^LRs)?@5B4tP4qQbim5asTDJTYX'UO/C&5[1V?7@%29Nn8cq/(,N&AQNsk":GhFL3,!gT)3Mf(]kcX&H-gY!-g;Q=*FcQL#E_:cjsOZ41lS??@9H!+Ih";l:2.T#fM;O-V9Q\2g'YK"6Ah>!ZsdQ:QAhm^o(*"U["fZXe+4X'p;@WGi7Zu%0(n;:O8F)qY02_Upep4Qma+9J?Gk;']9Jo4q/^%VB=H2.IrlIU1b*\,I3/_!uoa]!UXfh@mD8JG[OD`WtJ%t/`Yrk2_ME.,m_IF0c=7_0a.d1,$0l4"UA%XRWDjM[:1")97&Zj\n*YkauZ*>ODteDn1437dtj`T@:S!3Cbq:L@ErIfj^B&No2&E0)>bUnRdhm8&6j)V*g*q;ZthmrTikUd5PA[Z/F`%_shF7ZpI>7bk,'hct`fR'X\"WE61f?IOhVG;V\:Leg=C="R;60-P6PfbAX0[8c\lp`R6j-8Y,jgkD"S&`qe\-1\fjS8/$En>\a3H(sqc@.:j9TaOhV:[E=9bi*&Iho%dES)k!iNj(`3cI)!))KH[%2sG_GZ_pQ%]:L?%eUgdMW3J4J`%:p)kI70GecVEo)V@\A9#q6M@;qg4br]Q9.\$WeDdgS;HpLcN[GaCaD57?WBj01;_G*WSP!KGG)5j3f_\UCC4:iL&"Jn8aVQ?BQA>ajV\C'[25K7PXu4qX&Q"J#C*;1b(HERKi:tM;U$>24HouCMq4u<)>72^Y=`mhaeLmr:!:d2:]H>$!&COkendstream
              -endobj
              -1299 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1445 >>
              -stream
              -GauI79lK&M&;KWSnfJ'_M77.<;dZtj[Qq-([tcQD79lW?EhR>RAh/dBMK56dqN@(Zb:BTiQ:d@V:ui5ao&1!i7L2KS([98b#2jA'2cBk#K@pT.0FV@_!T)-T00WZJTZT0OL/IV4=M)s(3/L6>F6J.Ms^\T]`nSqUKeBC\X=U]\m2m(@:(/W3!8a52*aY$`#7Vl?&EbH0V_3TG]\Z8TJW&sQ?%rj/S.DV1UAs4a]e<[,q1Q6S#-VKipp7nhA4_F;IQH@30e/r4\5=pM0$HMPUiCE/4m\bYms]c>hSe52o<)Tokis,>@T;"+DWP#F3dgeBiYIS8MHZZXos)C(u_t^$G$i9Sh=7SL;#1ShD.M:[)PHlMRIdsZa0hs[2)iPT__:l+_p]IDPZW_6PichgfcqqZH<>`J!5(-A_[8Zhm_)jBm"B!<;0QhD:0(sV8e^4S27l)g_NrOgcgt,*r:c3+E[#r.V(,^ps9;`NlZV27U\a7Zk)WrS3)G(<78UlBI4"_bSo$Q]bM[]+u*K:@k8ocZd[mRmTk@kOmFUI'2H$@8oZ%(@@7JS,_MTm&.E0`+30NYC_&boaRl"gY.7kaZMZ[5F]eU:0i:E4)!sk!)P*Rd&ASE4$usd"T,]Htt/gEc2li;U$ZL\<=u^kEtH*ihK/4n3cBiTub@C4D/@O9FXBK#PFWlLu34S#(<[tWn=`@(--RFEje02L!HfPnhj'PVnQaPc$/RmjD5q-S>9*'2qZV?a?%N@S#=d0>`//63!oVK9iQm(Xqla%9E%sfV05ePq9f5mJ1Pp%*H#S[K/XjrhDEG_)J3KCRBG$XVNK!-I*L0F%1K[>NMD5&;de(oX=e>5W-2bQLS#?Y^-V"gg1g+m(tVF'L,fT6qr:G#D\W#8d;cck+#?'&F?6qEp_S1!6#H~>endstream
              -endobj
              -1300 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1475 >>
              -stream
              -Gau`Uhf%7-&:P.Os5B'+\4(7mqIOHp#,FhM5,:Q$)!H]c&%##'>\'h/keu^m5DkV6aV&G?dL\JM*:]'emc0l+UOp8mD^9i0COhIe(s`a9'BUf1p;i!a/UX"ZTDa+cL'h/**P%d+M(b/P6D!KL:MCrAG;d;Q9e=`pdhYlajb1*Pl3SRXS(`sB(;KpglQ+4L.9s2P5KgeH$d@[uP3n,rd<-'Jm$F%N,Y'I&d=tmGR\uZ%&#@m0Oeoqo)dW$=AoEWuMZ]L0*9XNUBjgqS\#>li'I?PWiX-MGEN@/WX14Un)N1iJp23(V,Y6SZeX!(LJm:^rJ*7YY]3U?aJj_JPX!HiBiAIU:p6e=0KMruE0P2q]oLI`V1jV`s*MXLRUDor!+r7>@SqH?&U[ErTZfdNnRWU_Z-H->Ict-EH?"IEB3NB`q>gsr3urJ.alcWRBPPW$$r'f4XfHc2$qhWEtLmClo_]2lX=bjfJS2'n22Z?1U*&Z1X$a:o`>:k1_b6\i'X@K9*.Ns"=RIVjf!;7[YbmWF='0=qM-9WS+EIi9%@EqYB-[t#01;YHCJ_HVu,#UfM#Nje4'r%g)V)Pd+=54Srj'Y*XY=s>gbKd;jtWa!YH"=EdoqKEpOQ,S19UNc5Bo(GYs[&(UGG9%lL;U2Ia-l2;OU'fOq<+)[t[5_,Hr^G&-LTc+30F%e_N)mg6p%F5)?R.[kAs*4@/'"s$X-+k'GW7p@b16*6Qq*,[!TRP5bW1M7l)6-+Brbu0io>LG].:sH'VJ@j0?U9:l^3/C*-BsT5(\o\h4K\*'d.RVV-;Bka9b]10aGL_O=^PX1qJB"f=fu"N[1,V5$.sJ]!%OA0!p0+Vc%-"mm.Ch_)JqB\?Z/m&a3RVQq8sZ)HD)g.4ib:l6c/UAAX9aA_5L4/VY>6Q<2T7&cf#\LKbcD'2MYf>QYu'3pm(4,Kf@BSEH+A#1([$!S%>9:"E0peZ9qh+MooS^.lOAVrhP<\)%QPbHA-KpVh4FNcA4o1<@;OL3(\)KWc/U.a$9$DXTL7FmX@->9(:A!04_a*K]l'."-*6(?g=G072/dhSr.*!hk7BS@Ud+XJ+Q!ctdn^c*f>ZZB(eaI8nR%^\ZnCNLq#W+o]5m"SaQ'C(ctMsgn;Thq1B&g9--b7ARf86GRZ2S*^N@Kkq-rrMHskFD~>endstream
              -endobj
              -1301 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1552 >>
              -stream
              -Gb!TX?$#!`'Sc'4PQ,T6YLlSNb9)6rD.iFEU_h^%4)nmlBmLr,!&qop[NK+1I3mPn#"_)jUc[$:(bk.:]R"ZF*>ntqHQ_i>ScbJfclF;q2?X[YDT@Ih)En;%-i]^.T[MEWFaCdh,O"lm%e=s1o+VDQ\[&KRNebu3]n'QDR_*/@pAe@/@7r_g.C:_&N/VJ8-LW,QRoq_I7I(0aAd$!9CIfg@+kW_ep1[5.i^36D@4bY*t"*hhrcD`1BkIQ"R!sebXk,1jWO"gK',)qTgtZ&O$YB8I.!GDlhO&lZt!#*[&Mq.f*n'akF++^f/`u?CHNg20[8aI._sleXO=jjO0).U-Hq,c#frH$+\T)YMrYODTIgAmEKE-"jY^Raala=W\TQ-&>%]rGf`67PS'MJ.PYl"/SJh)SCr?lb<$@+ntF7Q1jo)e`KL"-JM)U*Qc`*=VJL:rdr-pmhetY9s^b(FnF7rSc'kL\ScE@p^]dIg4R6-P!bHVD_2kJF7)n+0"nMta%*=?SNa.FHkDjN9?>f$A(^2bSUT6J[-@1C+r29G$\$R?\J1ZO9Z$HuRnEfrl^]%Bmj,4eaimbQM8Q*!g/FEb82Ql7ULn(sQ=M3JgpQ+^>>Y2qMtIbc1g3nTMIK['drEm7[mm5`Yp=,@f>XIrOSk3aDfaN%11$*%7UmDS0$h*$ZSM67;42s_ia%Jd:+ti6\Oba;P@BS^4FWC!(*9*5_hTN'#88^.%-lWO.u9\*ZJdY.UWk;)j?8A$,dkAJded9O$9'ilA*J%5Sc'+&_[HF>HK`W<&%]3Z7_Y@U;T%o<-VF'%65Jl6X+?AWSrTWZrB^ks`.ku00]5_;^jgcKNT5r,AFl@LYB8K*FJ@KKng]crKQeP>YA^$/hTal[SWZ+1224d6U)8dMqZ4ghuj=rj4U3lN?jj'+_U['FN3cKO-sUIAp?%g`erMendstream
              -endobj
              -1302 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1742 >>
              -stream
              -Gatn(?#SIU'Sc&Yj?K0H3(*#!qXDPng2:$tZie_n-nlJTBUQ<=8u+dO:"s%46V;Nler&]g8kkSUh_Z)%FjP<%(d[04jQdf2;RsEfffXZN)=t*)l>8sr]eVVF2QeEhh-P-acjR7L-V;?&k=[-.f5^]M!88CPm>](MZ29t?[TZqQc`LQl]3OocJR$*%E5AIqn\m#g\6&AWqeDL#YuNomYI(!47905bXto:r:bgdE42^6j"9o[MY4R2M5&$C$KS&HO]"Uh^mCu8.,FGa&CL4Gd(a8bYcC?.$a`Y11&5=enQ_(#5W/Gb^%T>]kGd.btd>a`LIeNuPHZS[[DMI>fnA&*P5;9ho(tH$',nn9sb:!k>ouUr/bc?lZ!^eJ?Dmdr?e3SFK^:ej".SPer6HRB3#%V6)rhc!:ul"sd*DlJ=XcecIP0[$!;(0SHW"7;]-^r8r#7ap3JId/FCa.tKq?3&G5:;^M;ZWRemYBa";i5g#o)'GhBZtd8P\AlO)"ZiR3M]#8ZTaWlelGJaS_sZ(e51J/4BK9ZG(_[Gi7tC7p`;"g:^s!W)UYQCIJFE1@]?'"N2Mt?Nq^/5naTtLFB^B+dMD.2(q;QF7krV7(Yb/7lAY4*N*gib<0ir4Zk7X#t_,fukV)PV2kf2%+^][qP(3!U*A6II&4sM%iA67:7^1tp\4rUNtL)XKk,hVW[7MSi_bk(AC@m(nU8IUT??[:Mp1.%bdVGQTn>Uo_Y$:Ba6%P=L/1tt8u3PnF'N%BIYiR+ar#@#Zg0\5%LcLP=LY;f"3SIl:%4(`;*I:l0h)Il4WrS`NiOSbKQ6`\%-.8cT(e<'kM+Lb+d^JZ'(fPb7j2Go'oY#12MrE-_'ZoH!DE&CO8OZRh/NCV%Ljk(LASuiGaa7+7B$oJ"Pc9pAf_EQSCOh@u6^\LiB;kn+$,W9K1D=Y^pL/I4K5%$>Y8I>[>ATu]`Gasm(NJ!%HaZZOKRK\%Aoen\Tq"XjVkjn*RedLV0D)5Jej?-1qSKnK.S0W@:\AffmO$0?:FaA!Gbf.S#8K>BW]LF2TV&ZY?XAF7UkjihLb)?GsKbh)b(,:\u]kg^(=]=tOk#$)dG0I%Z_p"X!gD/:j!lMbKeh:PLSH=/8%F(K^>YoqX8g)3>sl$[rfctM3i7U35#C\kJeJJ6g]Zf!^SG-(5%)floFh\2.*PX#j;Q>d9qPQLXW,9,E_i-LJ>kh.LFW+BFA7McjQI_O"pU>\r_`B)N`=P,L0_]\-ISc^ec0`B>1FOcd\ND+EMm_/K03bF#j8R&4<;<9BFo%+cO&g%S.=Zr<\P1n0I$p^//SL,DII?AGp@UP%9toT	cHgq>^Mcr8~>endstream
              -endobj
              -1303 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1665 >>
              -stream
              -Gb!Sm>>HJ&'RiR35?PR[X[mX%\Q(S)B3G89c3u9!2@-#*.lXQ)&F?Dt[cS33=%EAa$!tPhod-5M!ms]`s=0d9/#\"EV'Sc#Ua$C-&=oae&),S;G93aFsk5'3:n6uo:XBt8W&&1Ip?I!(bgnAq*p]h)7PsDO6XsAc-qYot7%H36E2ZaQB&hTqD(n7`,O"29N9CQTV0$/INg\^4@Rqcg/a'/`df8JRo%c:*sP@0N=([:%.TNn-C%0e0.nKm-s/.,t=5C-1R@CUd:G`A=Su+,ph_*d2ZbE6GP&HEXDJ1bRuAu]<_6CT^a8%@`DQr$>G@7g$&IEN;_Q3>`)LC@A`Cj5HUM-o1HNVQ&gmu1H(PVab''Z!B>n0d*a.k.-Sh4Hl!b,iPrsCjm\Tg*7"R=%fNU^LT)]*&t1NWQ,dI(0j7[GnMZ,T/WCi?R57BK#uZS<\aXp^+Rq13Urf??$?;"aD,ORmLf/ekb*E>Qfs41MUT$_k1)Y4f=hHujlSV;\Vfu#Sdba/W=8KYcZJ1I(a\QZC'hL].\!nFOpTp*jO_rtJj3A8+'?t.5m/.CZ&`RWLR/hik#i3e6TjH^@IRr=5RFVj@ds`TZKZ*bni%dpdPdj(-XAGm[Rq]XHdr=EaN@+/L]3*n-4h'3DGa)NHpqeELKnC)f`1Q:.apNFggCWX'dnj..eVm0c5C5/.p2G`1@bad6"D5nN-#kl$iU/_qAsF;lu"hR@-k6B>SF5@*BabmZ'@#:[k:Csf1/4]EjXU50XV/>R%ZCFXOn):k;J%4n.Gn_AFJ*]@B%\[k,ciEFii<&f]jYbFNbKi!^s:2ZG6VAWR,kH1eoq=Y'A!TG1*)*Kk6GE04*\fFc6N@i<(E\_7]LO69h!DVMin)*?E[3=<-CHX10hf1SY=lL;7(J.M7cn(1[\G7aVg@;+KFEf-Te8YiG)Ul`Nl.WK+8(8pC`AUgR5E#WEe&L9B3b!9j-o/)`s9#9AaSl$Ds*leXsA7l3Oq]'dGVW@s'(C/Okt+=0lU-[1"X]VJH\;2$:P0R@&lh4j]Ee#m"E@-IQ`BOfC(e"3Q3eFZN:h8qpd0*&,s*;GrPRV#Z@R4")`GgkIjm+hCgt(U2K@Rk-Rll>u?CZ:$KWmeEL(:>FY?<\=9_\$NjR:3PT;[Lk$1$N;BJ/r1TJ3Ec#79?b]TcH15:cZch[7b[ke^E\O-l`QW<[q01K@j9T^cMD0Te[%1g"^<`si!A`=r=*LOp"'~>endstream
              -endobj
              -1304 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1951 >>
              -stream
              -Gb!Sm>Ar7S'Rh^^s)?>O3('Er\iCh?!DQdn"k')YN"tQh#?muVXd&%4FOKm7muXi&P81E(*k'%BK?/i/a7%eI1'DuP&c7t3!*:DT(_RqlN+P=!07qS/]G`q]o(hM`ZEfH'0,Xlp!r[dsA<74=Uc#s([7q3Z0d2lC'@'G,q6"`""Ggu.p?bMuU%b/D>b&[pDu;LuIG=W:7Mu;B^&g$Aqg?P:EE9;A/'n>i.]'X^5P!b";JDLPI-Z.!8dIO$BK:bXIueqCie(Y;+J451QsFe*'D*VNI`SEJK3Z5t19-b\mjV#k6]lGD'6ns+H'r:)e+'D=%lCBCf_7[LU8X%jUm:Si!-c%L9a$.9;Nk]DrM5__D!8,>]lSEsC,T_Q&P-99UTLl`p?MOV563T,p9[4W9&EPP\*iM,A6Y/)*l/eAPkL$:m/2?XfKK,06>oQe)+4n+L]]18*kFoT,W^KUF98l%Z)Z.YgQOMdGL1bj48L,J5/-"WoE=4;*:dFA_?HhK\*Li?IAgB9'-O#G#@.5+69HjKa.0[KYt%Hm@rLf@`/'[hpJY#Ns%-ElQWi1G$thdt/TZc`NLY3Hmk(3]*7[*A^)/@%\Lje[;GHQcHN2&\;9f4AZ,pm;2M7$?Cj"SPfkU[8!8*)HHE<+ANbD9tuiE[OepdRrjtMb35e,N5hE"p2,NmghJ>3`@W9[81^\C9Cph<__+h6X0QA.g:^H#&=&ukBi[3;l,m\l=_t,B9j)VAHA(@>K%B:.k10M6Ml7r8XhcL%9h0rB&_)(q"*;B-A^i)APh6W=jrfdI)Cm:]Y:@"BqMC90AXYeWk`lpfs42X]imCidf0eG/sBO^rf&O*+MRA5Wc`<2INc]A\k+%@Q8Uc$S2]h2hhn2BAE5%+1_tr1%h]h*6';D_kTh)9EYW.96bCYH(;MB*Ase]1GsT]S"a^,05[N>[Pf\\@ksNBX-Kbj6;]&g5d"b#O[]$?Yu.2anWiXA?t1uDK1K4D684q9*tc0?+qlG#>sGPh5FLK8cHm;I7)]B&Z/Hn`QacGa3:@)hCGD7.7qAl95WF1"U,ce`BNCE^mUnVo<,HKOi!WpS,[BSou5#C]C(SH[F#<@NfB1r>DK!a2Ur9*AaJ!k_qeYugg65j)M9kIh.,o2=XqHZC3?;+[#j%TDSf5`[O.~>endstream
              -endobj
              -1305 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1372 >>
              -stream
              -Gatn(?#uJp'Sc'4PQ.;f\2tY]ile3C8[k;Z9[_`T9KU_FN=<*i$cjjZf^5m",CqfI(1L]dS.G`'?9K8KSQEgE!["MQBo12RJmQbX_B)=8#RBAi-$SQYEd@3$jTTPVL=%u<]bmO/e0!^1MW%1`!&!-;JP5O_pO(Uf8q"<5\8d$Q<]?W6O'&)Q[R75pndWn?mCCV%\u2@\#[5YKlBB>.>/Ef.djZQZI6tSc*+D$_SO4P4_NSIQn$ugjGpQ%5hX)SjCNBkUJi0$VlQr,\uC`+i"m\WTt/iku*brJFrH?kRHX7Y\$F@F`WhPtFhpFCYWD=g-"OaOXqq4Z+lc*g]7Y71:bm2[LM`,GG]24a$P^?.;:&@+jRJk5U2?bp.DiR@o*#:]FlqN_rR00gO:PS<[!QQb!"4U2Ms"^\4:[K@Fo!5B_Q!Yqf2VWb[\1NZuG2Kk/r,MYAHc2aeS)9a2c!=\#@!Pg]G$3u\0c?]`4&9(7dl*t4FV5'^SH6_40c5?YZoDebqC1X=hYkANI:kFprDGj(Tg=.rX("jLi8^6UY'H:OeT!`K5.N[6g/mQ9r$sOYVbtRBdAl^FYD/a2c8AZW_8B['r*CN1b"sN%/Q9V^YrU1X^Vq`[$ClS5l;GInH(;dUJEf)PoG+,aD2l2:n5TN3#aiel?JV6Yf2218bSP!.<\8nh8,1=n_SQl^IjFlr^eI?V:?0gZ2%='C/i:%=8>q]\'gHJ$6i(3'N*Ann-H1]h/B=lQA&ae5ED_5]s203V9UJQ)QtobHc^uG)<4gani:TS/dc5!opc='nU%$gV=?K#t#jB%'pBN^E3%,pYiML2M`1riY3.59*%-5:PNs!F/7l.3c'B&O46TiTV+nmpQkk=mY1m_JYBPTZ!gm=S4A`Z[Z6A;fr@c?\S.e/]G10s\5$P-8.8%'u@eMsETpTW),#YK\-@(lDJkdQ9PMiudd,MGNgb)]1X1s,YM-ao)V'1EJ]>^/DfI'),X-j6o4FA&UTeY.]Q%BF>:e/Vl)+dsQSk50'l:]"IeSFgUkb~>endstream
              -endobj
              -1306 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1517 >>
              -stream
              -Gb!kugMZ%0&:G(NIi.Oq3ecsW\uTKPj9dHBgMUd-"^:XdP%e-[,^Lmh?N5FFb)UVL@leWH9o9()/gKrVbj]R`JjA?\8H+THJ865Zmh$Z_r$`b0BS-6rmel[_0BZt]D/7flgXA:gNaiK[B7'PLBqS$"3]fRd_k>/nI`b/<2P]PHbh`e#&fe0DA3d"'"r-VPbTe#Z`3Xi9!WM!7IjZWD@%eef=EOmNN6sU9(sWjD1X+Q`Ppn[ma>%eN7PRh%roLg"#`8@8W1]J58ffZn4/!cEQ+TY_h>lVX74c$a%uY<7/VIAX;8luHdcsq(&kce6M+&?U^'B.J+d+hF%$pKERKMT2KVLk#-^[-E@7#TXVWoYU3XpGN`tLAg_;6OZj9A>DY!>^?F:nB%EQuWXFo)4H\M)0VO'J`fg>QAfVH]BX`TB!;l-^C^lm]srC[pa/rEi5>.f@=Sr5uQXD?E8>s_,KTV$'+"%8Alg6B63l"ijsj.k)*VZ2jqrt@8V020@[<\s",nS'ippj4I6a'MK"_,.^!Jg03?r@Y(!Mn7QNa4072/F=3KKpTsCItN5V*3>&I+X6^n4p[.i$09'75q'qP*KPJcdUfcU"4_"8@-ai$u+Nm,-OA_n$m*53CgOTT!&nJ=k^]4@94&F]3N_["2/:B,\AY*)9"T$<\bf@H'9P,q^P2BA11I%c^"um0p6tq-N*M,.Jg]Geoe5`8d3Q4^"lNELIJb(HGQ8_*)ET@COM\%/:.!2r\q68mHe-RJ$0Wendstream
              -endobj
              -1307 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1417 >>
              -stream
              -Gb!kuD3*[7&H9DlreJmL3OSuINpXJYD5CHS=#t&">moO^5D3De]d2_[7sE]p?cNHa#V>+i[Ui5WPa@4_o?>G=R/ql85"P^.$,G@&DBBE4)b)VKUebCj#kt+[X3]C!W03uPhskP*Ja;;Znf;(#Wo7bgqj^0.9uf2s/)>iO]#iB^!M@2Y-^,qfAAlsVoKt+]S;Aj,(-F&m`gsTl161EH&t+.%L%6c)eB.JT00]4u>Pu,4m^:e8L[;H`T-E?qK=]m]&o67iqfJi[j^MCAbHd+)>-@HAN"uhh&sC'VAe8iJ@E&IAFZ5L[l;!RU;WM7pYbCW@ZuoQrd^`ViFka)NaE#*0Q:aNhZ/$2h`uWFjBP5^W3^=$gQbcY;4ms=>L9)uG1h*01cG%iNipKrP`)-7u#oMpp$4QX"*E%<0\)M=[SRlZb#LS+"EPW\bD>-"iFYYkK;#l4)g.ahDU=C(5e;j&dQJj%UP%EUAI)R;1k9$rWe\##P.(ujQ'%5(l[CHAd[JFASf"kXYbgk_l5Eh=%3.+o;HJgW71@TFsb98>:FA2*IdcppMs%u]fAM^7-g`btT[-]V(/2EAWG2R3*B+oYduXDRXXY51!dr;#m]_dD0DC:s-UoI2[iJ=^%YJ793jb5`!oJB)k"ph;@*Sk]`C:;"hUgW3dcK_37-Y[0`,n;-V:*oA)'[\1mVIW#A\,H<.39&pUE9biZ43=]\r:h&1nN$Ur:*&f8XLos(0":DGfPg(4bq$O48R:e+\5'/@BS1_p1/&]B.(Sm9$3&jiRde(E36Gd*<^iaG_h:=IW@^#e7$u#GLnD%-"TMrRX43js#\_-#Eo=?:;%fLtB(;Hf1ba)^4uirFI7,dC7_@6RF[/c]m.f'R\#UN,!_mfiMl[,fK7\Y!Bo(_2e84(MMI-0"XBdcM'=;_t8ON@i2ZrNMUCIguep-pXOfU\/'8R0iu3;:i,+f_:)"WP:k+:/)3H,a+c^4Xb/3iEI\i-[kl53mDC`bP5lOOIJ*c?6.5&L[u;&T-_P(`#Q#>/iG26ulcoR%F"lIq#HGUdFP)+\_4p`l_\=NkdWo*V<`D_?p`NRkL2fCWM&S&K?'pK6),iMOrDHY/D'+i5'<:nO"a.Og*pkK?Mc=Uc%X9TM-CW,X#]D=gp'brKe!m(<]=u(hgt10pf`">3"irK7Oe:qIl>1FhgSeH=[?5HfqO-MNK9DQnoaT"JO]09>/NWuD\"4UGAg`+*l[dN7gBf"g?n:iK4+VDZk0]+R"C-%Fq>^8_jOA)Wqf@7MT=(JIl`5L9G763M~>endstream
              -endobj
              -1308 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1266 >>
              -stream
              -Gb!ku?#SIU'R^LRs)?AP3eQhh9P&MQGs;e"Y;%0u^udM1!RdlbCUPl=WhWj[Gd'$hu"5`0^,fhX86J<=!:Z3a"8R$C-6OTqG]\A*oa[2D:)#fr5`eZ\_BfSmO1A+ZXT9K*F="HRO).DMQ)hS]qA4oHLL#\[iudV>NDFr!,V9)=+u.gT])6Pp,9)@koso[9m[)C^/!1#DX%V;QE;/,3)`U4V4G4W9YGN^T+N@!$DZU]Uli;jT65S%Cqtk2V6Zf)kHna7kpMn&DB4jqHUlG*gFFO>?Ksp2;PUWtYum7t5ZRL@#SnGe7PuN:"3'<%Zq.g,W6-Y.;jC:r0"c+4AMp"^Hk"g2/Y>D"dhWnP1MN/T]I-4DYtEOpA-;NfFq4c$R>:gWVP4ehb#[=H"O*P"1\=(+8S_4b:0COs^8`*-Rpnb:)m\PU=B2mtp%>0#qp[SOOo70m]=+7&7[jB'Sb#at)H:Mj>:7DO`_JD4F^,$Y'G1?b,hY>$p`r[k)(!C8ig&k-Fu49,?[a&R9-A%O\cRA\CjT`>BW(i*rM\GP4ZD>R[st$81Vh"tI-]o-dK6=M[GnK=/-9He-bKj.I?iihGL&2Rj#1K]8`)GD#3[H?83RT@YjCP?#YjU\=C](CY;0[(+uaYR"4E)9[C(2-l,>Q:rmZS$&cLfEZ56&aP^j\Hj4#RuG]jI`n=/iq#9q;i@91@?.YT1(4O`J/&BQ%2^(e'Rng_'Xedo[b=o2XP;mB>pd67-TUaa[!8_1C[.<5p->_r$LT30"l7CL5R)MD51W-endstream
              -endobj
              -1309 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1564 >>
              -stream
              -Gb!;dD/\/e&H3^ns5?d^W&$DnW#*2W>CeUa=Kusb(BX[rmfP/h()L.R.=,n2rCBP@Cs.hfb8h->EFejV^GhI:J`2RF?A<04$_0YGo\a*%[1-.3E+9#qIraL>c)W!op%!R>!J5BTYX;\5mERkT6f7kf_>XTJ_a\&muAEtT[`WQ]7+Rtg2#YSTnDunBLIo9'UP"@A=[F(9EpjR;1nauK7c?#I9mO!ea]8\54j#[]1CZ(PHf$)L5$NJ(^YY8M98aGLXSu&O(]6C7B@"2dln^K)U8'a3p?-s=9oE'ZT98\t'KD=&Jr/DAQr$7mi%*KEa-+BiF2Qm3LXNkrRZO2=Wtio@I'a30`<1U<^:sPmh,T^t?XQ+fCh!4qc%B/95Q48/Q_[a[g@(B/23IF?2)Kc/*51i>)g58!VV'#H>SLaYK9[22.M^a;od:@LPPE3&Z$%8DJ!Sa)*REF!24"";d%:qtbg+KYjq,c&2=GbOgZpesXm3;oDI@J"+ih=%.VmrW;P)4M9%+J65CiU2FBE,A;,KWQ_@k-PH`_MBb.e+a+]KR911l[`d^p+<8/m4d"&-L4iAUsN6&HeMIqrZJYrRIZ-m&Sob@l4Pei_<>M`%nX#endstream
              -endobj
              -1310 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1366 >>
              -stream
              -Gb!ku>Ap!%'Rl+-s)=3h3\/rn\5RNOC=5MMPjW^1CEI`U#6JC^[_U6u]]o.AmkA,gN*SujW6QlT-/b;]mp,&9J3X]r8H*oY_"ADEmLUKUVK5$!=GQ-(geQ2A5+eI@>h1ULVP?0X/5$p,a)m!3'G/E&)52p=:";K['[#P*`PNN9-!`Ko@1*Y@o_dS(+e[\if)]#B+cc=D9`H_Y8/3FN)*n2B>V")(IptlsA+(h`ZV1+9qND'\]DUOoh*bO9^W1EphXu:0/WL9HGIe"YJLm+8U"?BKd9fhtC"O)He`[qNPf>jp8"CI_[Hi6E0Y3/>@q/S$YLjBXYrDHTh0I9%d%EVu^3;;S2MU`l@ja<<$c6`&KIM'#ZX8;2oHHY)nKJ]ZdCW>r9E;&CK1Hc]-^lrf'KZS@e%u4BBP`V0t5YLbY,Jm)6:&;VB*CNJG*9&PX1pueE"jH3;-e+BF&[b#%"8ImOgsj-B;4Gm*sj!Qmp1p'_^),Q`;QG8(X]k.m<#\A/S\$@^bA4_i@Q?ZXN6_hpBiLUs84[R4$<'+l9b:35*0[YZK+()%\L`ra/N=+k"3FpYe/,FF:B3:\cM3S`!NJOD+<1eKFY7N='8)oBj_P"]=CG`foFiH)jKraH/dj`hsW__[NGWi,0dS5&==,FWWHbC`>4a8q%LFEneYuTqUc:_(O-bkAiL0j"@oIRO&p\O%\Ia\"3,Q"9H#PN8:B0;chJ_aJZY[^<$N:2mXT9((ubsPHK:m24<+Jq_tKcQAq0GGD(s^iQLmg54;BmdqPBYRF+i^I^Js#Q?2CC4oon=&TER;Yn7C@Y]u+`n@X.LTWZF/]fI33"rI+usWCY*3]Pa$\mqgW/O^n('[ZKpHcL12;``ef-_I,F#WoIk]p$F2\O@qW%JI0J90n3:O68S#gK)mhf+a"5dnhO2ncgr9QY]-NH@~>endstream
              -endobj
              -1311 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1545 >>
              -stream
              -Gb!;eD/\/e&H3^ns5D>2sXkhPf0>ApY>;L,>B;r&$`lP!UqFio.'kfKQIJFDT@jQK?No^ki;1FRE6eHG,HGU$$;1ENR6S2q.J@bu(!CN%_dhpeG`SDsbS\DE]TpHdQW/$/RbOH,bskBt_V;?VNPnQWUojjP6`t0PEXL'^TQkPLg:f]J``i;@rGK$T6[%-'-LHJJ*aYr%NKs_5G$gOql7,eOP\'O9-nEpG(=Fo>L-h=="G:M>$:CdX@rJKIfYbm9X%?n3G#UYcI@YOO`J"&5D9X:/cZ?p]2_Z:H1QYe`_VHG6kj+?A9PL(q!>g?Kb(>n)]2S.[Ec`pHCbQ@Hlp8NPf40/o0d5hjU\Z6<;h(t#RN^f0/NCL;k0)6-d^jh!73uP#[!/NFJ,bsC6`N4(T.H*#cHaoX#asLtYUJ-/9.2MOWRBZWSeCqm1^`X&0pZ"O@t2A`&n+HI'c3gQbu)625hJ]$OXN_*ko`;pn=$KMrZOgD:pdV6[*Ym\1XfR8q(kaUL9#t\D)MsO[TY'Bl$8o+aNW[HF>'1ak!+.;'?/Wp0Cg&-e:Mu,YE^`KqWoeWB97'T04[U5*PcCfC#m.[i%=n>'B]n+tV=Z,Mh`MV,Y`FaE-Cm(>Tm>B.1Ha&o%)4N%"Z/cus_;<,u,SP;!T?/0JD)HI]qGGS<`]6`DO#l-Nqm'?h9"`:AMe)c7qDsEl$N5g+ja:S\'gEM:i9R&uYjYB4HdS;YU(qh^6.XZ/Cp*Bs-Y"NlctWLmFoH0n`dK\T#"R5+OD,%hZ]-%UMG4SK/@CWB,^."+hSVdZjFD!8LZ\@;[5:;m9%nm"@^6UT">=Dfo&X"RbCi7.L3+WH)2J1"N)`op8^5aV]eIX\M)Ea#CW!`#--Sq0:c4]/po^<`;io-[V:6"1o9bDAR)KcA!P^WcV2_6,1Mk,?3giqgpZW7M[pdLrendstream
              -endobj
              -1312 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1505 >>
              -stream
              -Gb!Sl>>O9K'RiR35902i9U,aAY=WXFm)#b8?.#h*m=hPYlq*Sap&o^DA:K#ga0?<<5UMl#Zm@-*Arc9II-3Zr9`,Ip*@:ca!?@^F+;P)i+O7cRhu_2UrOpta4gL;p]n&,J7Ke+r*fuLC_E4"_hH\0)m_C,ZL_gUJl>[X8?k8&r4P3W*C]_T[)p9H3rkVI:NO&kYb[QlR^<5@$\d_j@V<4SNjZE,^UXJ[q:7,3f&I0aZf_>%_;2Y[qO28fgJQc>Bm'qGq&";_oIVD=9.@bKGgPJ!h=CLq0O>aWSK,9p2ILd`,9]E!IKps7DqBogGqno#%A#,f>[`Xn!BTgQ'%aGcWIQnX]J&q-gS-Wqm+L@X+MjK%jEj+Y)Q+,:Oe?>`A+!$pM1u_4hYU:*b!5sg.]eYR>C"!m,9U`NXDHL@?uahb%0A8]R')mO!_i/mF4eF%Aa2mtP&hPA"h$LRMCknVB-ZcKmJ4c#6^TL]gr9$_@NU#qA[?UTaT?.,]?81Du.cJhCDnrC2e!bf^.]>XTA.WGM9DDXQZLO1X.9[mI'<,1\aXI&+>'.G_t&9K^g20s:De/_X;QV1+])d&`7!uo87U3:2o*d0^[$(?\%Mh=p)-t\1TPRTLNK]R>?(jY=;im&o"QJ;3,*`d'EH8l*`Vpbl#2/m_rh5gYB&\Ct!f&j*BfEn`E=1ZIulG%MpZ\m(oA4Nt6A[9@TZ9"b(=RYti#2Z(e_/".K-#^WSGKinuO'g#D(DCSlO>D4d-$AD@Y.eO^)^&OXM.=\KXN+lZB5lm^>t4O#1I;*ekV:KYV()ODH,=%Bj?g)UC!?&L/C:Zj.b3QI_1KBo-:&Mokj+u-_,H&8?akoYgn?^]/A&#,$>.qcm:LbW,&Zfl[l)&XVF.?AOE99o,Gd-XS7&I)MI/5HU2U=kYoW2"A`Mi,6Ce(6`F2d_KKJ;;UE3.q1CIfW^S&=E~>endstream
              -endobj
              -1313 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1646 >>
              -stream
              -GauI8CN%rc'Sa@-aF?25QafEBLq;6iYRO-Efe=[g2]F9OAJf*;[b/Z19$t3Af8l_<>I(&XZJ<HHm&A-/-+O$i:I?WZ=,KjjRulH>f5[anDMLK!Qs/CKDrZqI0@H]dmsDQQT]Hnfm2,fpA,gs,P_Bf$iP5"nr!a'/G6uJIdfAirh:j4`WRVF\4b_rjKi[ajK3_m_P`28+S_*>6cedBLkl%[U+$Au*a#/oM.oi/bGN9Ef'Qj:_tk'^*:89VjnT,/_1&8+#8O1dg?cF*3\(B6bo.ad`sQ]!:5^5mR.$qJJ$1&Rh:?U'gcV+tQ2:Zts(?;sZ>&sQ[B=OPOY-)s7c:*f.LJe_(_noKaSqtZ:[F`@`;>jF?V"%dO=Ii).IE@e/Y>STdHpM@j6W\@iM6W]aKilVZU%[)V[bnVV;Pi_>U9hF0B<-Qj8"D.TFkmF/b_t`W5/ol(W7d.8c0fo\RBHnJQV*a?V+E-B%X!CQO_:PE-?EJ1b7g3kAZophQ/L(1e[(e$l'8`h-J-`5NL/+Xgjfq20)GEpc,J%U=\C06!_T7bAkS]".ig=P^_Yk3epk(Y^"_E$KX23e6UFJKAD=;+:$0=Q\uTT[`A`aF9=BSe0CIp8<[T$-AbG_aG3$>)`uc&d%.fm\opgN[6`ns^IFKZA.GS\;]`(UBmCeo[leK1Qn"K2h.QpVZHDBDbEc3i&*l(gO>\7CJ$cC4k,#g6s`qk\5%n(^^25c@m?c5&+/H+@2)WrgUCVO3uGR#=.8`7qoq1$!LZpZ(u*Q.0T]endstream
              -endobj
              -1314 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1646 >>
              -stream
              -Gb!;d>Ar7S'RgRSs)?>O3Q(3>]%JRA!GTti!KqVA$nT@[+LFPkC1U8=W&XeN,:WGc92/WXJKe1:7m,])cCG4LnV,J2Ih(sc#a`"+O9rf2+M2:(n/gEscd0=rT:nU&EI4j$H3j@qX+rgh'5o?$6OC!]q3a2HX\\AB_rfr\>9'T%2`.&]@N?#F8U*I^,"]:Y-TG(F1!3nASVeLcp+/%BAebtkp]/LlX4qD#-8ONFsKj/;FK2LM]/PmM2FXVSGWABlL;ojBbSopj.9(,4Z<[L':MN?PXpo*d=-6LnCARonVLY)3hisC&3MW[R,99"i6H`;"/\EOfaTs`"W.TJ@Rh"b7S=d()hF1o5*0^Kl?>;7V1AEMU_Ibc^W[=X1m97fhB$,+1,`e+nH)Qp,^jZDNSdH>]bA6\m]iG!eq[SckuP:M!c"m@,8!I=PiR:q205/N\dhBQ6"H0>F*Z[U^.4!h$AMdKW4fY40DH.R2GacM-_*Z/tacOKa34YN0-,W\L)!#1k@QUSqGAim=r)S8^"%"25Mi0@o6%EC%`t;8Sl;/peA(CJ2*0l-mF3pFdCLB\s,#IQ*_maCePgSnfAO-UZhS("e'G]HoFFtU>X)'4;r*A*Z5I)/3S:L>@(h1kS!opKR>lKF/r>ESbGlR:9D6UWYNNop8)/N,0#B/S%ONCT2!Y<0Fbb!"OpKc[_3\%^U+8Mo6,:j/HY`1&Ha]DRH"b9uh&(5/s"(qg9foX`alq)MR:A=R=%s0&;9O:1416mE5'2orTB-%/rj+_GiCLX2jP<4('=B,Sb/)mu2tDq3XW*a'XN`O$"CqEYoE&NgLLDMl;Yf3Dgo/FWF+]#[;n\F9Uh_K66oG)E/!$EH2rI9p:Y/\K2)7BZqh%=`U@@'"3W>EQW5UK,cA5@4jn`-V5!Z1'P(5>HA'jKW%DecgmbjqY;!sbCKt2i%osraGSn-*N_molF1*l,90K84K[dP^N:U-p%EiA+K=OQNDg:MgU1?I@)51T8M$T=QT4;m?;i?Df-4S/LMUKBQkrfB7A')/l/BA'qVA8='9^a(8S#0,pQK@'.PV]ZYoZQa/OaQ5,tl]G"4`&/c3]5TB<\G:eiC1qoNrN+[`7W5kZ.oSABAI@Xr58K"fM]fkpm(O;GDE^YJ8T],FkY##DjZ$2e>i?lHo&;iq(R:gF>4&IeFk5_k5-~>endstream
              -endobj
              -1315 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1484 >>
              -stream
              -Gb!Sl>Ar7S'RgRSs)=9Z<@J\feBM%+(dE-&_\6Sjn[VX5=2Z$2fp]2#-<8@C@qV@rc7!N":9SSE%N(%Mc#`^WK&9J!'p[A'o[!\9d_[Yg)qA7K,2"i;)f0JRVQ@#g&grX4hoS6PJga=PFtCY**CUNUqLgiX$t59[b8ABgddZ%e=!,_HT#<*/@%\mIenpY"X^uNF.p65pJk7)Qnp3gq;a94l:8W`Z:G9cquCOat2Gg?_>Xsrg#'OAAcEU:G?_!Xh!V`9t=>`IPpn9Sq1>d/oXA<4Urn,#PTr9W#B=HJ^uDkP'[h_#UkK$o'bn6Q\hkArOe!oIk)]KR.Kt+_%P59C78TojDSg6;Oq3Y0MWIgqNYiplI+SLZa!QU8KcjOn/Z9S%K:9'BDX?Vk$3DBju1:fUH+KVqA51MFr^ugAi**P6L=R2HD)rLK:rc_;rP-B@o)&H,L\b5(`9dc#p(c.+H2Th,+_$>0`dl]%=q`LgbDpl#>J!8MrL3i1j9VeZ02D>c%;-QF"uEfD3h,j6R$Vc1]=(VS\]?FSFu0`fLX,n7?isCHjEa<,IeMV=f;YZ)JfLl\NLb&+kfV9Y?%in6+,e1^h>&](\C_c`-2sH]84ltLj4b$MJjor/We'?b3ddk-OkHolIUsS&%g8T@p#p:@ne[(cQBtCjq)+`Z8PKM-4U=pBQE2C;-0nq5Q1D_,?`mS@aHDoK)"kP\Q2e?'SL@G3Eu)ZS$!jYPgqBS>+!Ip$3*0W$f)_fK=5C%/mHp/$04pO)1*?XA1F(99Ld.!-eVhB#5U/5+=(WlcKs>o,6t`=4Yt#f&c-U8't"n!]ZTV`X"/`g5.*(HN)1Xr#Wn"WdF3@L@)P+pjT)+,8VrE,^?)WVKSk^RA:EB8(+(XO_(;k3BcFioWB[)q`CcDbBkD40Mdok4npenT]L9ZK.QeV6ZS>&I&e,pVd8k-fiT8*iUpKp-aR(Pjb;%%4bpT##"2BtiaaAe=bJS5P*AHM9Hfnc$-@*CO6T'<9j$P--kOe1ZTt%C.%KgBj5*c]INgaUUa.R!4gcLVFB49!jQ18$7kBNd(mU)lU;i+MkB^"@`+#*fO>*(2GogWg(V*_Wo0!QaA8`3<4!+OSOtF(b`DE\G%juA+`f;VAAMj)n2m!N1GqYo0X4I\GpR*%.>QjU=W#'+(0!3[?7_N8E`SB8(YEBH+P%Ao+(R9IGol>/"H@,m\/.'jT+lr(nTMjLAV:Y,S/&D5A^Kdj$_>~>endstream
              -endobj
              -1316 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1541 >>
              -stream
              -Gb!;d;/`4!&:T\)s"MTZYIZ\E/7;4i--*Qs+uuQ:c;H/MI9;uHDd*XaAY#Xqoc4fa^qb49]-enbNA1P4mC+nCbq&l'?UTChQ2oMM\GAI@fJ&]qTm[930ta-KT7&je,DE8cotA-N#l)-_-\3)lS_='^hUpbg`-6#&^J:*kEFXAMSs&HVQ@?pZo^:D]ms!eh&h>"RGQX/Ed*+#aH4N0\^TN:OiPQU_D=W;`o;hk/L#e@K8@I8s#oVZf.O6"WW^FAXC!%4(^u?'[HgbA5Ku5[\#V(BSLF?:VGh=s.jodPTRh9EYZVNu5otfIcJ]?Ais3-e0Lo5tpg%O9VWNk@tZQr`jIafV8Al:$3@o7^KZTaUQ%:O@.41Q@@`uAKp6/sCqD3*@7$]C=WW3N1)e10_9EDR#_j-_ugom]64Q"2\i6^Z&-$$-^?oBKDEdu$?_tc0h2H[_gVcN6mG(2\Ea&"\R7pY*9`AnmUn7%AK,nI^\Hg'<;idsk@Km8[dM8C23I7Y;8Sg?ilF]6TLIt,m>q=Bsp2'3%CeG`#2J1-)?H[EV2j5l\>$o-Z6ldoh+VT0<2Z?g2>YW2jA0@:m_XAZYq6OKNFp%bH*iFi'\bo0Tl:VLPGFYLFad8r>L56'%Yr#a%7%b^2e+KNa(49\e$;5JfaJWK>SMrNo\no_j&gai;3;pH4'"9Y6N-.=RIQ:qkYaItk93>q$eW/@uOK-e*R,.$"#8-Y=&(=-PF#+NX22bd+*jJI+hO)?Ae$)>p:<,ST]c9lSI6$"+WM>*k!r*o'=K5P\]2"NF1IH;\?=sN`7N,`M;Kb-WPcM8R3PZnq:pQu9fN_i/e1k0L'do@(;5rU#)'6JA:TUB@[/f2H4Hg:OhpeWDOc8DC8H[P9snL`ab#Des0TJ*Qe3+7Fg5_r:"9\_]@Bs*:;[hf[+.4`)U1e@ilJ(a62@trjMmb8$'al3AR'8"F\in;puF;SEEc5kgWL2p=@W0G+,Wdu37r?,8e]/rr^ISrG:.J%`=XfhPe5UPQ"FG!/GH#"#8u$3:?nC"7IY\.R(*V@gC9(Kh3Ea9/)s1u6/R(ufosEtjkD!]IG&PF@L(#jC"RVqmmnel&!n6Mk'f1*I4,81[,g'?cmlJM25,1W&TiVm_Rl"5d0,,QOslCU7f_S.DZYf:ma*uC@PQ!?S1.aLFm`'33I!]8793H.bD5i2Md5X+Qendstream
              -endobj
              -1317 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1060 >>
              -stream
              -Gb!;d>Ar4L'RiR35Ffc9)A(YC0%2Xk/+$Zo[8V>iHO.HP9L,Od\n]!/[M*=,d$R_Y+`I_[n-puSmFH]tKlU>]G23-'#X"/i;;_ZLU_^2B!5E!4pHf1\7SB4)g+GQ2D=0bfP0Ct5eJn5X\R7t.$$<"mpOMDd=8+A_[Z`cJ4_k1%)_1a;*V3"C/MM:;PZagF%#1U8,Es:.Aip;+/F#G)2)1o9\0!L^d.71b].>!hnln[47S[@-&-X!0a>U5ZD5!Ya:&W]F5eHocE0eAMFek$>4QTX##c]TYK`^S*L_o0.#;9s&Sm)$`6N[#*@(D5u*degLF$M5UJbJNOf!7I$W8!kJ6qF,dW*[C8SAZWFZ`)5ZP2ij,2n11Ahce30J*Dc`]/?a=&biWmrhVN0EdgUeq=f0kq'X=.#ej4s3hA>/d6'gB"-([RSt-(LB$2oQ"q[/Gg,nPE_7Li5\/S)W8?H?uo@WY!MA3=FLQLU;f?>f>L%T_FD"(L*3S'>R\-!X(0`>X)$o;0.%33<]U/L&?<:Em_tfc=sMm6dS\4gqdkQ6Q=.?I0cUficoqg-\9[8HT`,lhTj0ps-1J/4kepHUTkt+atcBQd$cKQ_61GfTL$L\KgDJgaNZ8M*]+"l`1TE;kWbAc#7X"uEJU"'"G%2J%n0"c\_qc1=F>fgj4\'sD_Yq6eLn45rr=FND"I~>endstream
              -endobj
              -1318 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1319 >>
              -stream
              -Gb!Sl=`<=Y&:P.Os"MO;HAb8TV5reqaDU@=5dk>F[j]Vj""i!1=rgq,:9so6eDX%a6q*"J%MCa]4e*D72rDY!0d-FIMq9'UGX$fZ&-F75RK@(:K@(\J7[Fp`0/%9UCHIjB'-Dkm;@EA^Y?)JDW%a=>b7!\ADgER!HaW0InbJRH(`T6J*6r'7CXfrk^?fkl:neJjguUl5HCk/c_:Y@I(6X8'/HYPXfq'T5Qh*V^_#-(*-Bh%s+HFqpATYiWm,+tMm4b\%NGYPBN+pLVE4[>V;8:*XW20bn4BCS,S--,^f70c9Z'DcM3m>j&"RH4:\!-2+qu-]>UiCd;>'n1C%'es75"u]!S%#=p>hDNL+JrOs'Y\:2fDsI]/%R%i3-L*LO\b[Z4lhSg%DBP&["^I"JuR=`Is'b05"nl3hEqieA]G8>;2E31A#\tlt/C>POgYYp2p,-lHORS?3`m,m[uRca#sZme^ueg/3OAl[@*.`*>@'^\B2$qQ5IK>+1Xs.NGOFFI$#uo"qD/+=r(pTRbS5$^!%:D0P%PMSED^)7O]48QcbQAbk'SG/_^rn#;.t&=t8l1ab@>!2;IMn'>s4%\SbJ#re&CUO!=ZiCM42.EXj!=PDPCj3"LXeJRf(&QpITIBro\*6![,7Se`t`A*.p9nNa"R,s4kb_Z^hAmr`@;6kW&,Fk:N]q/J#"&G^\OKlO@h#P,7V%N0#YNo>/kUNN%El9`R9ld&0t^'^0(lD\ADFba;R(Z\TP>G9kWe(i^c-Wd\b[GP^4V*7(u9f.@XVG.c:B^#Dq$n4)WKhnV3DK7==h&rP%/D'[&p?]X5_J6HuU3;..H+sCU87Db"$<).E&8Hae+;Ql3q7Q.BG.p=D#`^mf'j%fC&]`Rt`anY=4#AEu#,L(Tl]McW8trVIn2@a/1=_#Fk9/hendstream
              -endobj
              -1319 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1609 >>
              -stream
              -Gb!Sm>>O9K'RiR359(iSQtcpKO.F4+\'cloq``mH>hB3HeAAYCM&BE(Sjb"\rX1f%h.]12csJV'/AXN:>d.m^!h5r\iAW312Uh'RD`$*RoXbiYTBq0rGWh+L+[2tp7M'_Vni9&!P3:L*M&p)R$fdU?\EF-b_^tu4$H]$6+[#$Ki%9+h!*,YInEe"rkXf9l7e]20:KV&6jE6oQ1W8q#:Be^mKD#P:POY87)1\WW,o!n\>hmlV+K:d&[>ZBQiQ"A-]XT)o7(5SAkj'-QHppAu@%Z:Sc+0S%bq?0].>nB)7!^s*4(s[Q5=R5/K:%:#a$h;[!AaZgM")5U*?I2R-W"c<:M=1564/&B\ZBPar0t8-T)C>Fp[Z*lB"b0q/*Y0*IK8a;1)7g=cF0YbJqSCD^kNhg9gVr?*i\gm6AFgj4T]f3G9Xr%E,ffC*q.Q(t0Ng6:VjB6CXnpFIl?o;1XH?!3`\+q8'aWp$*+<>QQD4&%TPZ9Wb,Scm4\SHg&9C;2Iac*=nO/^c,!Qp2<]b;`s%OR)A:'91hU#_RCA6Qbn^@6nK2A?aP"NLd9T11p84k4L08)&,c]`/<2(-khGWUWp)D&Q4HrlC>$OPRPp>mfVn6oPV=s(Xhhh>QNo=*AjTWUlQ30.8RGMO0.nNjl@O=t5RC9`tC;)qRE%qu&sMbDOo<>)[H^YUnZ7<60/#%YrO-5g20(]oH4Z___NXlh>"049a.lOTHQ0j8JB[a>5FXPtRX\g$PWU&ALR@HYNm3h=&\Q_2M[];;3hc4O/5N_ns>Q`hR%0BC,C6*)Fa'.71jQVLDs/N6Ck%W.3m)<+]5Pn$0`p&D_9SY>GR%;R@et,pT3X8=mY'ber]e#]6M6=XI.mbNDRT"_#0[+l_jK$,`i5]%6rii+;D.eEp1e]Z\2T.FUu[=Y(ei22NpEDohUCsM2,=s1t6QHLZ.3Dc8/1;]^ET6r68)aWeb,2@Ll-NV]9C3jQh1$k*guendstream
              -endobj
              -1320 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1676 >>
              -stream
              -Gb!kuD/ZI5'`MF^^9#Th2!$)!:'-pHMh1ZT`%PH%&Q!hcObF6SA3"<5rqU7*de*3+"[I!4lRY\_?Jjj`5NMs6"0pe"I@!tE%#>;(VUO[KNUORRIa^CrKm;gP^sZO0G*=(E*rr.Gm5UGE0l,X*WIGtd\hk9Yb_oWdX&^FchrAm+/;XEP%f(`C4ZaS>W7i=.C3b>X>+NAm%!R06PlahX0&B8_Ga;N.CqhR$j;p\+W3)(4%QS.W8SO58F%00Pb8=,M2'\2:_qnhEg>fWaH6c\ikiI]5%cKV>6sQcJDcF]h8l,Nh$cKOn$1(N5/bW687ncLQS?b7VAlEUuF%F3jg@t&AL2hGc!anX619iL!PdhRW3I''!ee&[@q!8*E6gCNN^0CoL./WJ%q]s,-g#IEJ1.Gh5Wdbr&!2I%?J;"ia*o/A+63\5gW)Cn/giKW'Aka9PaE?&ZF&2m1*'AkQ,s6515nXb*?c;eF1+16>UeaieO38'CLjeP;0qUS_l-BUI#0Wm&\eH%J=+HbmRSq08=#JG:eWq%C-cd.Mbns%:h\mds8@?nqYS,(41h;bn66_)]!>_&E1t"0jk<@oUMjfF^t@GlIso/:Vh!"4/r\b>Z`Lendstream
              -endobj
              -1321 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1572 >>
              -stream
              -Gb"/'D/Z1=&H7,Vrkg.V89HXn^t;V'V-G$6-f%uGe4RF0#@\IT-c>eH,qo5i>o#,%?G$S9eOgWJH%DC:B:bN^SK.i3nNla/3WaQdK"aR%$uc;6f#.Xa*F-0'YJ-R?6A=dMT%K(^+ILnsJfNMWRSlC!QSLlBbtZ(iIt/J0HgcXL3M:(uGq)$p!u_Ss"_AN3f/&0fDiY1HV\-4iB0)b.VQSY0)sOPfisW#_>U&So2@9:qfGPA_Wr+,/u.Aaq;"VsAQE?+p*D)L;!E-u_Z?<,0S]ojlMR&%riWZPHd98]a$'Wb7Zt%s365J'atAo8mVU5ehN3D#k.3&]o8LOQW\gikcLnOrM(pQacN`2aXQd[./>psPBbNTi"CDQ#k>0:OQZd$\CCY<%1_[,[Itd#i_U2GNbfV[\RYZ,*iKu.8);3PD0.^TpQAT%ugoX_iD0*0=3+q;!(&LAC0mc)K^74HY'JuOr11n'5MsX]EPSC'/@fG:hA,'8#)"t/Zi)'7iXp".ca2LK2rcF:ZOi.`(r*-g_66fo95!4[8C;_AE;gha0F";'&Y,Im=XfJ.\FI-aWCrNI&Il0!_X[7AYZg10Ah1DnqIT#u8Ti5IG4*[`e!J256F-id*36rhBk1R>NR.,A>cRq8R4<;^himLS"%Y,JIm]b<,Ia^:ACEQql)6sEpqmjp+iZ0pH?&jPToPT%BX\^ZpVN<\^"8)g0hp?=$Nmhu*uO9nZVpZY%d4:1Siu6HbV1]2KB>chU,hE"jfY,&D./?Bh)ajZt&o+ea=Q4Xo\>XVRFX[j-X!;TWjNI^%pkf*$Q=bl"l)b*X\k%[@8Jifid_WZPI&VW^QlI"tIbu3?!ldso>ILC;ZO]W'-s,mC5#9q'$"b\1WiRQj-[04l@MEb(n_mq8`9@,+34>i^l?frendstream
              -endobj
              -1322 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1246 >>
              -stream
              -Gb!TWD/Ymt&BE[0l?BaP_hX0:7H_0)$;;u+W->`c'kYL_B$Afhjs_@#ZUdiihnR;G]1FV!Wg/G9`\sc#1b)j>K96`NfR"OWuHq)@M?RS1DOF=-MJ2Ygc;_"Y%U?[!Gm9D(\bQ&G9-f`j#a=$(!`HWr9G&uhl18dd;/9da'@cSjNk/.*9,]K&jlEe,22iK'[,/,uC8'lm-f`FK)+hj$dOfThA$=p3iH*'Y,lZ)B@`BrSsG=O4gjgQXcjFC4GOm9>"U*P\j5o?G7hWW^V$EW)*,h0m7[PZcQ!+Z$a,aQ*P&7Z/:HYG(>rI$(k8q9?D&VCBg=5,^J2`P\TMLPKR>,+QK'-Ig<*,+AP&kK\H9a`Ud.jl9NUMfu@&YtXY%&j+4\j!=?.OqH=X\atMF+VO=_\7[2b!"4>5:ft6:!<_N)(*+'K:Ef5V99/DsgAD^[]SdQTEMkG`oE*'FDW!$cC?QnM72C2(Mg(-#rG0Mg,e9:.)Y\*5D`qEH<1KT26fX(Tq5HqL)#$AnBBb.m_W<7OpYcdnULd!J)b+nqHL5-nF[\f6KSoA1$'8C+('/L];g>9W;?0Nb6RA_5/[$'gd(]i[_k7)&c_#$asLgu3oH?eOrM.=&X@C@h7QjW4dfZGfT6g/K='q`,dn(h="Z=/1sJ?SWm^J\L4sS"LI68%c@'1(Jq]1$LAoXaghTQ;b2@+N*m9n^N)JL[nP4L5]_bQ3X])Vqk+(9U?p.h#BL%/QfG)7Th?2q#g;HF'16Brsd26*$T2"Z`if`L:*^1U^e?#9?&=;NKLqR.LY9Qp5!8$",Uj@/W^C$O8]3n;ShM~>endstream
              -endobj
              -1323 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1306 >>
              -stream
              -Gb!;e?&ta='R_';rkm:#PcYjUYmmCA/+(r%+(hAJ5h]@`qVY)._([:71!Uqjti=uFT69#-:C]`QQ]Ep5E^0P'#-)`UUUhWk]3,"@(]&.'lG3T7arg!6D`S!dmQ#rMX#mi(@mSf+<=QE&I=8C,;%,naocPntDWA"FPJ769&mK;0?dpuTHA""V.NOfV-sefU[?>^k++kf+'SE;05s$dpWQeDm=b=ki@nbDt;Ob&0$!+0C!1GoR4e/CJcP[nKGB_d*8ckNo+gXlZU<4*7<=2Z1&LN!%_">.h9$DO!.lb/TT?@%)rV9V],=)te#K/4@TlK@Ub(F:l"6lRt[s.uk7F7c"eA/og6.OC76&S0iX5L0o#]TC6,orRH#CesMN&n$j_70Q;r#:pko)![9"gk464"VLcK"XcL__*Y?<#)9&cokR8;=;'*qmIXt]r(BG:AZU@m&19FbNjjjk+Nh[54cFK$K]m)1sJ1JGipHf..1%ek97Meo$:*X;2:aPoHL%OJT[(H,2RlJp#DkbTtOsu<76\4UJg\j82#QUfCT['lRAm;,6Sgc(YGW;\.#cGE#)=ZqaRQ3^q*hVjcaaaULE"#1!%$-J'>&4je?Wl.r8-VPL9b*UfZlV%>@oM'3;U)/uH0?7?`GoY#chb\!MY9!Ma8L\7/fP0se'#f6-8mV0gV($OZ=,DEODt;]/^bI/(P6Q%AI6V9c<`5:A%?Yq\2VenU:@GXolY%L*-]`ZioKM[?g]UpoH9J/UUs$npa=-V+TD[#\I`-AT9"j*%s)2,_l^S`s3g*Ijj'_nk>mit'8XUE4>O#tnd6.kX`X@DNMbA8]l(tu)]@gUq3+0oDmkE"-nWr-u`>NT^k'U?/I>X9c=N:k@_h5Bj`Trg%IH'"XC/s^cQZgY`ZfIl"l\BDEdT!#sY91F25__19H1endstream
              -endobj
              -1324 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1327 >>
              -stream
              -Gb!;d;/b2I&:P.Os)?%HV[g*d8sEkg>Ck!mY_N?s;ZUa_lp7mj=drs5'O>AKoqNqgOt8\hc.5.A+EksRn%8%Khjo_A'L,.f*N&nP#;EYWJ1Lu'J8cStE!'1Xq:XBk1K<'hDVt+=++`V.IH8#SfI78'Bu$J71NaHsOaN9^Z7;6F*\@O=[adNlB$ZPZO,m)+MYj(Qg;XE&Br3B1Ru;aJV6K)RAf8e1lou+eROt!&sB6)EeegN@N$eBAX$lG_QVCO5o?AuGl'tE<'4HP[@,V@C@*+M%d4,c3YhDo8b*(S'e2Wi='=mS<1taLF=,!oA`,c!ggJPEq2Z#\Xr_DNd'/J9r>ajd4^V"o?rDtd>/Y>fmNg97:B,.8""fJcV'Kd\!RC.g8*uu.YMqa/abTXUU6]-PUJ=B\ZLRkQATu'`aMgOtC3\#kOXUL`KW`1IKE.R#cXfq7M5V,,20QX]kqU2TXrae+$(pJInLY'R,pTD[N/k$6Xt"p;!jAZ1N2^KgAMQ%IR7MC^:sP=r@uQL%]/('i1Oa@jD;WsApQ$oeFaf7IoEhrhNOs45#IIJO40#(bC[QrWO4XdI(j&5s,_pQH8pendstream
              -endobj
              -1325 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1574 >>
              -stream
              -Gb"/hgMZ%0&;KWUj;eGOjV5*IlE$^3OL1KpJ98&5%(&IP$V$jB(:N;#k`*8O?]pS"P%<%=[mbhaZ/A.tl/sumc=hmH&g*pXnJ'o)#hO8+O:B)>+Eub\n,_AU0/#Lq?D,Hlo*9_T7gO^^)5,'3`0nb5S6Xh$hS;K,'L,tb_rO'c\^H,n^&Y["F`LSnu\U`&8XH_(Ob1F5Si>tr[r-HC^O-,KEb"2)F"hW?6pmL&LcH)5\>Z83!RK@oHUO88=3NA:)g4:\NR^DW,rNTA&q(*F5;L3tA/(Z"S(AP5]%ha7'5K6\V:p`qCRL@Gq,hF/(4@W2P4UgB$1s5[s:.\37F**FN2'J[mqSHC->:-2_^]YZ%tE%\eVF3>5TiIh!Oo7le%@Q[mK]ZSQ?V58q$0q!`*GB;J=q03?73dCk?EOBZ9+@a;GFedO8=PH,qG"8grMEa?'Gk]guf,FDMp4=5)Xr@;#mo/6#%DGM`gKuAA$_F\9CLELlmjDW+e<9$X.-lc*@&7r=N=R/H93uGb$_"XuH@,p;ZZb2q"5Dc[!N+p4m-3'p#D7*HZNMl;[hbATKZ2(X4d11U+jM&RSUe4n82Zf$*g3;ZgGH$uE=oe^dgV:i+%#/4E."V-c1JFS0P=^mZYg[bPONPcY_$hcC649mVOIp;GTA77B;MjCLiqd<\I++`oe5K\L5qO3X7h"\AS8AW]B]\8M1k5G\b-WlhgbN3RB=KbS*j1`$n`4KN0Db13JNpi:?9SI?qtNk8[TdEE&.c/DE4ZBDh&V<.s@;R3NOQG,Jg:F]#T5*lP->+%P3Dk'/7RJX!PaVKua`$*m/]l?$%TdHoeS$'uJ.!,*0oo`~>endstream
              -endobj
              -1326 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1705 >>
              -stream
              -Gau10d;n5)'Sc'4PBT!m2dnd^JrOW?GCeSoUmn/o@4&\/7>*7&/]RA(+tS0=*m#6cYYu.]8VT3,[XW]d8()nR5T>1mr>El]#%P0UG//*+*/!9WGVHjcYN+)q+/^L3\ud&Z"F[cJ5e#LYE;DjBYLF$Nii3Gol?#+*#7njrICi^rYm6;aDVWf-@L=]MZ=u4pR=rm?rf0]6lR&`@@@2!L;W'8l[E_YgbHl7L'5X-$K+K]1U,iod*IV9/P/XK.VpG3Wj'T1c5P8r3#6Lg&"0R.44&-:s??[LlVnLi9X/Z8+rOPG`2]*nV,lK0#e&_tb=e99L[E(p1#;kRper[S?Uf[o6Oo=0p3j('5O\u=YUj?&p<(Idf'XW+PPj0Qdab_-=61Vr.T]7*ti)P^ZFqfDm`_8COT2oKUO(do&Tbm>&>C)K%RSnFU1O2dYFV-TrJn7kJ4l+,"0SMI4H9_ct)2B7sQ&8'IalF9PT\jW\##gNm<=lu3CBH/k4qO&apY4naZ;ZKDkk2#o9DQ4*&k+d%2&OqX%/"_E?-")(f)g+<Pec7f3c%hj*8Wlcg=rkMQaPO\^8%aOEnm&4Q2-lAFTo(EQdprhd8rA?!,_c4Ejso'7Fsb5DAU0Oe6$<'jYUL&UBPOJd'HQBitO/9kf\j:0@Hde?;MeZoXYAK0gS1K?Ap&>en.@3p+\!Xeo'SQ#N4R.bJ='@3'2P(5?#X'>$n/GmgW:hXBj'DBm[J2mG(N1XU8IGlV8>W6\E'fB4+,#Ra9=F97?-hB96Z(lX_6"K2`KhH$a=*k^gDZdM9B6rEOcl1?\H+7]OMu7\u(ajJ..4`n=Qu_Xt4/[lm<.AgA8Z1(bI6+O=?i$LNm%_:%bU6BAfJ]N5(#f#&_jnJL]HashW3SHBU+]KI&7`/JYH,pH.F7^*g/dK^3i"sE-^WG6ok%>#WAR'I`Wib+7m5aSj>qW4p\3M2qN9=l"kDg"[06H5^mQu6Iei:fl8`AgrQ]as4\8XlN)HsuET;tgJUu:6IfZ9:O3.~>endstream
              -endobj
              -1327 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1581 >>
              -stream
              -Gatn'>BAd^'Z])ePOEI&?c$t!@eg5rF?1)`A\6c7Rr4V86dl9K$`o>m?!/_jqroWQ-=F'15b9[GT\Egk@^aYlhPrnYQG#\J^[,?+,H&ZK;CW5q>$GG#&VUI=bp4oorPTlZhNl,?K;DAhSS=]9R]ltr2j:b98TS6V7%-N.ac&:*O+Wdjm:UZ!?b%;7%dNG-lrSgc*7(g/b]'1+P,`@^@ILMgh+MER^d_+5c6ZK1>*+>r13b>]l7qs1//Hr,;O9p==Tp3V%!+?75^S@\/[>G^RhOJN+g.&cb`OG>i/30.K:Gq?_V8P!h&nOrV.InrUBDlDM=YttL"b-"tI%$R&D.Rdr*i8Rms(B9cun8a&j-fgpQTKUXD:!c'9>V$aqOHaP'5sZmZUn21=MH1n^Y*!_pNNZJ+NR+n)nKjH5F[47\>!5-;hHd+XR9`MM4BAOo^e!XrJ0Es#+$OY:Bp^Fr;Eu(/Pt+q6:m7lfF!Wf&l&:*_,6=q\XF@42k[U0'-l$/cZZMi.H]f!g!\N5M!qDFC.UcG!X*\=mdu0PGS^h*\\TDkNN1b"+1TeE,s)9Xtp!%`sN_`7RX:GMQ:AdKT:d'gX:JRFPBU3":Sn/+G;FeXpB>G3c9t."F64RI[rILKZk&3.=J^(-\h,T0gj1>&S;ioVTeW+ai(i*S_O@\q;WJOjX=:Y2\_5.:V6cVI?RQQ2B4FriBdr#g3??6pP(0[JrqkZ=(UdVKkY=o8J<\9-0MYDR1U(MN[7O9dQ*F\MKA9G-g6N^/1f1H+-Dkb+isJ'e^nmr?kJHV`1dWFomLL$Tu<(/TXnepO1o,N$!f.G8hTrK(YsPZ5#M9,kKTG.)q<7_PEQ-'PAfeP0[E0=`^&TP*V'?3n8,m:,lC'*K96dOuZ"JH#l3W%USes1"#,W)l32'#-L0:'X<2+HX;4$lp2Bk*Bmbmfcmr9SoDq`[X~>endstream
              -endobj
              -1328 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1819 >>
              -stream
              -Gau10CJWt['SaB+`.'c(aArj-^>r0lQ+2!7=gTcC[Sj*C`&Wjk34=#nJYg,qB>uidM%*sb$C$o3A&%W*bFCS$0VBMb?bIc$aV9af(bc>p4tro'_"7uZVgBN"msST_=EiC>:94bSdE(a^a`'R&o`1FcNhNFgA6Urt:7(g#=*.pW(fN@7kT@'[T#;^k.X7KZM-+BZ&Z4H!S6_*>*PuNPKH_ej=AQ)5rlT&KYLlpo0-n]1#e4`C1\1rb1t]AH0i4H^a^K!ku7%5=:3>ZQeVg3Ka51I'U]*$/(=!Ri0Z@c,5K>5(,+`qo`kmDjIMB\;6qHVigRrcW0JS'f=6u,roC%YNJ'n]SJ;AN)fO)IcH00rtq0Z.#X@R4j_3bpr3B1W5!I]m^o;Z1$D,>.;BU+fN30]bJ:FQG^,3JjhGIMkd`'Pi2&Lt`bhVU3YrODWM!X6#;u'#8/.RIY=>(BTrF"8P$@o0l!HTL&@'ie]A/=>EssW$tNS)RcKRb(A+nXlS]_/IQ=,VVWaN-s,p3P??"aZ*u:YfB93oOeq`*V=e_Q!l(oeF3[LtdRU5s\S22E%R^&cm+CUCRPI7m\=%`c*e^*WP_Z!I#\gbJO)g1LoG`mP[HkbX%SjJ.&_@P-mTJ$ke4J)WGO>3U[>B(f,D0heSHqod[35?5%+4nBEL05?FMD`kCIGGM&#Cq*t_)]I;]3-00Z_cViLZ)b.)HrY#`[]V8+$WSHP%OZ@kU!H_ua!1k]LUS]Sm.'08d=!RF31-hDBme[1`ac5m+\lbG=r"9t.M[<_\9f1HheLbA;X+p6X@*iYTG"B-]kV7p.+RS;'2m/k$3.,[p)/.aU5/K[\^l)?&.Bk9nSM+hhs"j>Kl=Q^`%<(,:ikRBR3K!',Op$;_g(P0g-4rK?[,Rft$qf&OW>q]C+ku>/FT_""p9W`Q+'$;.\aH4V?I7nBb:GgB*jY2shEqZpc:*>31+Q'r?`;nLn5&aK%r@VBoQl@^@FZ*1UK?1;XtGdcY1'cGuj>5PqqZ,Xqg?)R1$2`5j:\/`-:]7k0fijteY>kf.h?Ei,V>F.QcF$q,s<.T*XUgpHF$13lCW^>#NP<7f>;Q(C9cV(>s'OgIJJ,#^O@K~>endstream
              -endobj
              -1329 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1794 >>
              -stream
              -Gau10D/\Dn&BE[0l?=*4S$JrXOs_;GViqI)[CpF(]kaF8F?QUX(m6*h=iZco\%f0g$@u`'0IJ?CM&lWpo?;I!=O=pO-/V3KJA)QWf+qIHpg^P`V@3AT>kuE1hi.o(iHccQFH.`D6=rkY,n>ed;O1W@9]3ne$_(GIl'5.g;ED61&'$u.$;AMCRO;6gt3K'&WVNO]VmH^Kn67!bNgef,i_)Am&O=$'a=7R%h%=\3NknFTr24[X\ImD3\(>(k#=7(-h9b0ajlmW9dG_c@PG&*X7QfH!3LnHE/JJ;1&L^U2/e+u=(9%O@9mU75%O'gYC<7KtOHZaK!LdFs?Q?b%2(gD^0]a$A[K-h(N*.B#=ai!"@RVUf)(HG\9Qo8r?/)ljQr9A976J4!CM2k1Y%:jBHpp%4XY=/sK'LhF;ZqlpltR&-)f!#.D`J4pjX\I8A4C"O`&l*&Q#S:D?)08dr$91IC9i#/`cXgA-FD)IRJ&'j#W9TgFH,UK#?1h(&h$K/`#gcrMT-7Q0qH.LKedA?fPN%Kj^C32",/k8N)T7Pc;)^r,">'bHI[c*2D/%kC*/VEB3_QD9*9KsP8ocfG!UY(HO!Y%t&ANN8GsBNs0L.Q/]Sb6'HB]&O(d@=_]:BAen%RP->RU3uUV$ZIk`k@GlC#;-&_fmL.ZoTjbG,Z!e)l<(aC2J;d.$R'Y=pqEZV*!<0@ULbs\!eTs]j5B&((sNoBhp3^/bW^NG%FZ/+A1DQE1O66M&-d:ZEKlBHd,](gN@UoWesu`r,b.W.B(]lINU*E6.:aCjrHpN!nr2t,F=o*airrJ*kptILOrL_AB7Z'+.qNXT0qh8&+rSqml'C.KWNJ'$nW#Cc^\3s@ol?]pR*hBYr(,bhR&ACe[cneeoj6]=5.RLH`l,(Phmm*[PfuZc%Pr.+"jbs.5/lqQp3jMO^lmCj-d$n&VI6uAr`Rc\Zj@_c!f&?[W_-\VsHL^389e%335L1NYDXB]`"9XAh^*\Ia/E9^0CQX5QlHOt>h?a&G'UlpEG/Gb>curB;H7.r*/N66:uCY9n^Ss)\f#X[eJ0@2]Nq<#OUS3a8~>endstream
              -endobj
              -1330 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1572 >>
              -stream
              -Gatn(9lo&I&;KYFnUK35`D4HR"F`r-c#Vi>&gpC`c01;u7"QUlMI8`kCAR8.!$m&NF8[QN,.d/^/\%Li>H8r)`[;BX="@`@>Foc@.K7r\D6jEY?eH-\r!^+_*WZ.OP6PHnOS#jabqR.*%9+rs`QD"0E=W/N4IY'Y^?p570erNb^-/;UW,n39lJI?[O/p)6]@>cjKq_H8el!41g+7ARS\<6s)%a-buD9'cXpn"h[INFiG=j$Tsh,-FXf&1*s1idp.="1'H2:emW3O\7T.+O-]UY2e31QHUTkqi[d%?WO4NVH8K0.FW=PT:bAl3P0etoD%uEMAJ"X4-E8ZrE)"9kKP_I(;-m:"bb>@I0hXa5bGbEWpTd'nMY"cK^um`Db!,,9@V$r@rj@O+t=J]ZbN?l[rR"R43p]1Q%^l;5=(!a2?1R3JOS-UV8*W+7?r]#n?3[s/m(3?Dn?_hkjpfa+"jnWob8,oh:/QoQVs,NU^[Kuiu8bmRQ/V]Xdn6l-0A9i4ZX1J1j16"?(LQmB/M?p+d#g/!G%GWM5FW0T<\nbh%W0LT/Z*7U19_DN+"Md0FhmY!EnNgD5.NY;GRtn(F:Pe.[)=O?J7m"[%FIdsPs5&&#*%A_4ib(JMJ9ad1LdA`I@S*Do.TZ+!$(p\mW<^2Ed\Z-(jm7&pB/etS/"sc5Go/ktb.=7259f+S3@oicShADUo^B$^oG_lrp+>m0hNo/#:Zf]DO(e,tIV.[2WLiLGR5ogK1&]r`uH\Ne]H:,keY]n$2!)9(i9kmG)LKc:CAoVH5NPDSK44['Z"CgK*)aendstream
              -endobj
              -1331 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1731 >>
              -stream
              -Gatn(CJWt['SaB+`.'c#04ZR=*oE,[<@)%>/M4'4,ncJ8,oh7EHZ$jK1nNU.8NU^#J^CkH$H^sEP'*7*kl2u$hq(m?W(kXWjiQY%loLCZ*REUOV0jF+U&re\YpPC@:IfW7YuDY5U$L3Tu+_?Ql;\508JlCWZ5@M^2=&.#kB-%[;;S*M5<_Erb[;=sE!:Hk+I[kfqg$;Pb+^)o19q=gj,'m(CAnK?5,fK57CH#&us`TeX!hf4VV&:r&W!qXI/m&+^1YmWC$VU6FKa@=j/6!(BM75:8NY?3&7)GcY2ceD3!LmQ=AZmeG8p9/R5SQ3;he8(&p@R,VT,u&4[@O#H!?ms@KfNRYI`0ufMHIDWO0F`n]eQXiMg^5a]SBAdu(\;Up6;I+&4n;_2ggRCtWV&cY3NA@IBrt!0#+7.5-eo0$&H(/BqihVW@34jmk8>$?P=;A6h\I0t13WE<>6p/[0`=#0)5.J86NOs5f@-q.(B="Om3Umf20(XVT%s6?95E[P.#10;bmk.pDPPqXll6S"M(=Sul45UCIG"D?Kf#;qA]j=hTAFtT\K=%6UkI&;m0D%F)Cr;q:("29WPS8iPKQ*b$[7ip<)@$T>l'$;Y93YDb+J6D6uWR5JpXLgp!t(N("067FM7K\ndqrRKmJl-2R+`0A>@^;S:'DcdPr2ShW5F[pIaE+[g>hmaZ#/RaY\hVjZLHIels2`h_*qCY)AHb?Vu[1HFlOO9<-BE>5KKI=gBXZdJ9H_`R>H/#H#LNgXBO^*&):\Oep9QeN.lJ:6afZ<,;T4keH4Pi.KP]Qb;2BV[aEq.4G"9\15k,ijmR]35=#C!Nh8;h59OS?9C/9!WugPcWg-9h8*/_on1qb:!'&>/F8Yl\n8L\IJAftWif\D%=s)ghW\Hh"HM9Y[1Hq!~>endstream
              -endobj
              -1332 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1805 >>
              -stream
              -Gau10D,9IU'Z])UnK#n:H7(+`T%Zrg,T\m$/n;AQQo$/K2GTHu-G>F40DkB'[M.B%ai,Qs5dWJTPJ;V1_8k^Oki!%LIj[%&F!"/\#nRLB&;\eX^qYRRs7"t4i;kCI\mEu->!iAi^>1)&Dhp4"!1[;S_5X5K>;gs'BBjKGpg==4OUplZ+$PD(39(&"pG<08F:+YUrs+>4`N[Vo'R/%9rs,C]&+s/-a!4<)/@XpX1;GR/H9<=`Wh+R[l'0YB"QrB[7=\:5-?O\fDa5(iL`"@ZM-WKNNjBgN(Klpk)KP,STbcBtbH7GFH>/(uO+8QLB:QgoMC28d)a,!;'(5g.jCVXH.f>uO(-IkQJ(kOXM,m1D@F[5R/i-AFE?r'acKYlXS_o[\<>pBeZ46"A_ONIqN9@*2.MXFsTlOjX](=Mf9655%b[ds$E[J_#3_l%kCT"Gu11`VH;g-G(I6M9\+KRG>+MH0`10Oir*g)&1tH<:OHm6J8\*FiA#>KoPlpH7=Zc'O_:]^550rKdseFXJp''A:BF#"D;8I!UqleYAb.5Z#Z>=O9jj%RMKP](p#@dtR7lkGUBQ^0>eDRDYg"Y;p$29]u:_5>HGo]_IgkG:ftA/k3t@Q$]c#k3gq/j13G"eOq`(\Dns(\.u9JV2S_j0+7nAL2D#N#M8oLXiU\eQ!A1s5HXGYMHM'U=Ri)5R#.49Y:+B<,XdDbAr)]^+EYo>0e_$pXnHklN/kT?s5tQ?L+Q[CWdX2Y^fJHWg5ro-1hr>Q7\%)j7GNQR&b.I2G[FmpaYV.%AZ=b?S%MUOn_M]W=ui=o4Ra$!qe(=Z6,b.DTt5E:4$>dD_22n\>U`^DZsUF"kWq3G`DE_[3$!]:uN84i1!"L(Y_r&boO2.i')3+2jQ(g-(>rrX@IJ6`*2RjrbA,K$lrt_/%o$79K"aE_kd.DmOtdDY*rqfS^#6XN>eS.)c&$PNgOpZ20Y!A1W*Dp[51=B0qPjAm+Bk@OhN.Ye["d,9%Lj3\"(\)Fr`&(X2lFf4Fe'3H65(W&#C/ZX").)`K>-O\RMQ&=,IpGB%fjfTu-e0j*PMCc2%.9]_u+6dm2@I'MHI/bVo[gq-;m9.lml.h,ce5K.t&BZeh=h'#Bm-uRIfqKI.bc$`N3XJ#Wr80&YXq>S6/`\Gl\X$Mj3Nf[KTnd\@"/g7@O5$ZfWIfsnlFPsSMpdMaM7hMcom)!^L2(CN0M_WPs/Om_Y39o@7.ur4Z'hDKbLFM8s!j^Hpe9"^>(&c;DV+`j2p^a?J8tl~>endstream
              -endobj
              -1333 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1705 >>
              -stream
              -Gau10d;n5)'Sc'4PBT!m2dnd^JrOW?GCeSoUmn/o@4&\/7>*7&/]RA(+tS0=*m#6cYYu.]8VT3,[XW]d8()nR5T>1mr>El]#%P0UG//*+*/!9WGVHjcYN+)q+/^L3\ud&Z"F[cJ5e#LYE;DjBYLF$Nii3Gol?#+*#7njrICi^rYm6;aDVWf-@L=]MZ=u4pR=rm?rf0]6lR&`@@@2!L;W'8l[E_YgbHl7L'5X-$K+K]1U,iod*IV9/P/XK.VpG3Wj'T1c5P8r3#6Lg&"0R.44&-:s??[LlVnLi9X/Z8+rOPG`2]*nV,lK0#e&_tb=e99L[E(p1#;kRper[S?Uf[o6Oo=0p3j('5O\u=YUj?&p<(Idf'XW+PPj0Qdab_-=61Vr.T]7*ti)P^ZFqfDm`_8COT2oKUO(do&Tbm>&>C)K%RSnFU1O2dYFV-TrJn7kJ4l+,"0SMI4H9_ct)2B7sQ&8'IalF9PT\jW\##gNm<=lu3CBH/k4qO&apY4naZ;ZKDkk2#o9DQ4*&k+d%2&OqX%/"_E?-")(f)g+<Pec7f3c%hj*8Wlcg=rkMQaPO\^8%aOEnm&4Q2-lAFTo(EQdprhd8rA?!,_c4Ejso'7Fsb5DAU0Oe6$<'jYUL&UBPOJd'HQBitO/9kf\j:0@Hde?;MeZoXYAK0gS1K?Ap&>en.@3p+\!Xeo'SQ#N4R.bJ='@3'2P(5?#X'>$n/GmgW:hXBj'DBm[J2mG(N1XU8IGlV8>W6\E'fB4+,#Ra9=F97?-hB96Z(lX_6"K2`KhH$a=*k^gDZdM9B6rEOcl1?\H+7]OMu7\u(ajJ..4`n=Qu_Xt4/[lm<.AgA8Z1(bI6+O=?i$LNm%_:%bU6BAfJ]N5(#f#&_jnJL]HashW3SHBU+]KI&7`/JYH,pH.F7^*g/dK^3i"sE-^WG6ok%>#WAR'I`Wib+7m5aSj>qW4p\3M2qN9=l"kDg"[06H5^mQu6Iei:fl8`AgrQ]as4\8XlN)HsuET;tgJUu:6IfZ9:O3.~>endstream
              -endobj
              -1334 0 obj
              -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1461 >>
              -stream
              -Gb!

              Ar7S'Z])5j?"=a(nqFu/a?q^fF"EgK+;RG(,`OUGn5j%gY-ah.(UGmksplM8>6eqQ;K3DaUjNS5CYeNkD2E3no#fQL+0p-3D:M++:I=)5gISna7KhDA#k&_#,jQs!S*I/:LcXih*5<<e;cq$GOhsChV@VPO+bSb(m06KOTkUfJgNR>DP1E)8B*9c(EV&Ou/]X@aNYAcl2sZo0;tJ;9<<(":[h!u>QUMe`)u2!/>Vkj+$ZZi<7(sjVb9[JIPqJM;EWmg$J>J^13,AO'AJ#`L^`97PUoh$XY/Yp[E*@`7Ao"=4(j>_FK39/L;jfR&1Y>n'Y[U',Mf6eNMM_U@%\Q9/C[=JiR0=.5P=gjZ%BsCc%Fn>K>^[)(CHL&4=99@e78SQ.h!+;SBbNO_Ke$']qt^>Njk/p[qLq6)RfME]K/WG`ibCnK^itE?!$q"?,@TpNY.VB:['d.9.sYl\I+^2IY4@i4=0e@S4d=1uDnBq13Gpm(+Qq*(>4F0!C6ID`U/SR:%?qOt8YJW8ig_>&8.KhN2;DaZ1Qn[6+=o(Y>!O&P,L\gqFEDifIdi+W_]$qP!8;HPUdK91IXPFZ;Fg1H^Dc'8j0<@A/)l361J@I!`Zf,[P&16(F%5Lu=)BEJbDA_XV@mmY./\U&.VJ^3.?HR<:uX0''WBr*`_C`-C0EbI-5:T(lj1>uI2-ZZ]tk=b"tRS]4NkLi&=:)mMusN9.$&=/RjCFLhCZpWXbp#9Rh0XUE_FXL3/d7_!+^qnA/i/]f9j_0^]b3b(f!j'+/%p(M%#5-f?^V/ZF*,qMZRGR-8jE5'pC[d@eqd#Qs52Jp*2bB!BE_d3)LGNG;Y>W")D'rte\.CPs-;X>Hg/Q#3bb!<-!?lFd]G16<23\]8#6:*6?c%NT@up(@iUf!P1m!POF:#MX8h*'(r/Z7S$q(?_+J!aB:*_1Iu4l(Uq`%BtmH=:VQ76#;&TGhVB'#BFg>b9%nU&&O-uHSCibBqpLL)J_*WL/)?DD8=nCF]\I'KaImf0q;W!,q7"VJD'$:5Na47pE@L_R%KmSR\0+AEfb]_E"VVGq:~>endstream -endobj -1335 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1632 >> -stream -GauI8gMYb*&;KWUj;eHMRc.'O<)7qP>U^-V4eZ3d$%iO@[[#D`H7j"G%_FOSnE5!1-V$?6MQ\9P8nBJIU'=n82>\8-tpLDkdjKFV*PK$b>2cdJF(pRA)FZhD2NJ63'@tb7ma@>:S2G?J0j*DQcqA]bq991a]3CRlr/Q\CH;F*[0X_^'D(1c0H`u@^bQoGu7t;u8CF`cS:C,'9?DKQL'3.gHN\9)l?*YOYc5)@,,j&j9h2.uOpIkN\Ot`NJQoAuU$Ar3ehJ,GI2GBEiog:LpO?VXYXl!>3s$@(7$3._^]d>(f)p'C\G^&HcY@Eo#E[L+_5FOc6N:j<@6Ra)A1A0=2W8l%VhSL$q^YB^O)eU@f+2s#%$,PCs6@;drL*GI]3">f9M(R%r6h8gcYA7(n&/I6Z%cO0GX=e/r@1&_01BWU$?PiaS3cBIIJ+ON`la]O'EP]^G\?VEH_Vk`'OPib0m6.,0k#nlOFBY!H"am_<;$"s(EFS8+ZZW:aT2]N4.\\r*K1872E\.#;PCh.re)MWNQ+q:eIHrZnQQiD/Aoc5$?fSuGMc>sEe^-f"@gF2etWIM$nQZo_Y,ACrN@@bcr>761jVd6P&=_04n22'jHBf;DA]f&(3J%P*&f8Utt#*lCo[+UpNS%N;l/Si/aM8PXIH`a-3iF[Gc5SPeT<%CrfD7LFdHP4i9['#n!W=Nq(+\hnQ3'I'Zn3Rcn~>endstream -endobj -1336 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1697 >> -stream -Gb!Sl>BAd^'RnA%rkk/:KQIi:q$(rpcEM/QbtPU12GE_Hf`tpnUW+)oMidYa=-@DSfE;eaSRj`A_8/W&8"[M:7::upUji1q^kXXd7gP1[j!c+kE+&So>`VZVSk`'X+mXH/2m4F,f:lE7HkF\,*EfpNXEUCpWd?aZkLh4heW-1FBn.jUARBMiHOt0EY?PMNIg*u)@pA1rP&Mh!F\Ik*1f$j^8D"(eWsF:GudG."8..YP>=/bXR39_;,3RFhU/!6E^Zce(LI:7;kjq/63UOKP^dSQl.e'W#L(Ub&i;9.mTB:b[Q.s0=l4Hn1Z7>J6T.RR;#neI!Pi=nLVVPNbKbO420JG$MA0iM3QdekhN8#%/&CDg^p/b413A%^+%OCkm#@+3E>*,'Y*:s&Oe_CtDam-O;"M-_r`W#8)9^J`f?CA)b64,84%u[Phf#jc*2(L2d`"5AP6EVP@]qPrhqK*];3_dR-I=*G1Zkl$WSUVmSU^1V@H;,g)$q?:?sEI7DBq?5#5<<')Tt!CK_fAG_d:S&Pr?-F(X+8]hXisi7C\Mp.H2-*+QD*!'/%I,+M%NTiu%ueA'IYhh0rRuQSND8JG4oYCr&Y9'!>r,j1PtV.ZlV6QlDMi\"itPj/bONTOrk31]B!tTq1%[(fDH@8^1'HjrOqqBsn1[c:CFW1DseGiq#AgVeH6J+4;ti375(Tl0[ZbAu_q"G$C=;\Qtj:X(-?0KoGLo"WYf6R6!["Fjbg_ada;h59gJ.;Eh]DaGE?&P%/tj8ehDJ$Tb+0:g:*.C;.rU7M/=)ADf4qdmOsP*aU[Ac>d&e4;QI[_c?Z*7OceC_J)_]=TUN\g6Zu519uk1N6%ak@$WltCR4":L.N%\Z]t;SZK7d$/h?J`9/mFb#@\[p7jb2Y+++YR#V2Ma3T!bDXc5h4K>&tX6YZHJ@+BeIjm,Xh0.EO@7"$e$U0#bHgI,npINIdI*Rc-eLd[K*F87!WP,GQCY]bMo#O)(e_1O&%>bG;=!W7],@#,Bp]e^S^oj[jm*r]>''G2?I$!]s.l!fhRf%gDVQ]T+$bIRB\R@hkf?bd<%e*k&>gY?a0D)7#ZiT,COS(([@F"bXOYe`]UZ0WZ`YD%,kD@C6ZbJnCaeW86tQhTNldT"IOe+#HcNs5]AI44QMAiO+Lf2ZrKgh'@Tt49I/34^!3XjT4r,`t6[3dF\b52+oY\)#SmD2:T+h<->uY+>mI@a(-)5u$/CFR@Y3%n3.G3M^?\6Gi-nN[4.;iGs*b:&8go*k?jN&0dQC(pBTq^7^AuC-hO1\di9=-b"8DeO6t+]D[>Oefp=%sC.R6+^\7endstream -endobj -1337 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1264 >> -stream -Gb!;eD/\,^&H6"8s5DI'kqjN+S,h"rWEY-Y$22djD;)Q3/f=)HQe!m.[pMA?JW`8@L!S#W&(EKcZZA?-]/oOhEO)Kb((OIq5u&7*U/4`/Z6>2)k`0!G/?U'^rt"a/B\d%g?QfIeD1TLI,<1f`nB7eAZ(Wq.jHO4T-r6P6K9_:MVKDi-LB'Yt^,[[IHo@.\[:t-S?`b7=(lbGF"j/!C:bZ2\"hSmnTpC#G6Lb'/Gplr%AV!8LBYB#3$4#1FToqnha@JfL_/1)'gTB`e_8hbQ\B/MJ55;0[F'BIEU9;Go9iB_FYh^pa3RpVOJ[fD_IAt#m%T]sqR.dKb`KsZSlf/;,3go0Wq%,9/d]X)Kcm=XDq27iN>4mQ::B``fChg$;3bE6XCjIOE1'i%(X#d`thI**)_aCY$[.hXX[A"iS,7hInhpG.gU@]+DWG7u`g3B@u:sQda7KeWAj6DK'pN2CXbGSCU6]8WZW*jP_LB%'Gr]=fTQQ'cQ(L1kpP"0c`'C'$`[`4tD6!A\MS;6(A;\`-^$d)n/fMD:o1V.kTU<^&-4CcEq1=3GnFA/AZ5$>d.X.RP#`9PoJ^hlMKRID]TbGk?Y*23#[k2cnI(Ib:&5AdH]T-$J'9U\W)_!37P_E]42[XZ&4ZbRo3N6975Rgibel.tfV1kr_c)P!AG9%$D0f>Hclbm$:u]QigCZU%)V;-c^]#fcG=cfuSi*@`[,bEHjSX/Vi7XE)@-cXO3,N\;u5aE\Q?&!8>o`>)n7B44#+%]TpL;;caJ*=,IUA~>endstream -endobj -1338 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1272 >> -stream -Gb"/&?#Q3''Rc%,s)?MT\?!P[pp+1J=%]r]2VPUmp)PmfJ4PZJ3cZnraq4iN^(i8&tfDl?I\!T;BMFGFSY[.!2)OXj7lQm!C#ES>,8/^MP_)V/)*,708d'O*A8$;%WP^o8Q=N:j7PD7!1^s?Mq8gB]Hc2'?33@*IT*"%/f5EgC@4#m.$(($]KF1<*XLbeDZ'Me4$-N$md.CnF]9mpH/0.H[BkniEdku9K>,V+HT"YZC3(Co"Yn7ZqabZO3'2h)%[=kC8W`!E0u_$/o(=C0U!tGe#NYuulWNu]G\7'MjmP"Mf]Y*U/pONP,"CAdHEm5+`u?,CcWhZG%Z7D(MJmJ\0Ddf+n*V`j^._gG/DWE'0Mu*@3!nUL=1,W2-]dadhenb"#"Jd,r^G&+$ZFM(%/Req4.7bKPl!Vdo-P"9P@rFf)4/MopZ/tENuHe/[_1Z9;\aYjH2Njo.fT,?!\kKt3FVW],IhDTX_>H$b)5ud,=D(W$9fS_57,#MPU.O-UB.&;Y?3orfm0tSP*nH9c--!&)aoZ4Jc5JS(Ztf(7V6)#n-B1GA19@I^"MSl4:#QSDjg3\3L,)E2X7rtl)PfnY\<@0OQAo[O]'cqH"]c9tfnNfHg:r-N^\H76SAmAZ0Ma$DN8_u5S,ke'XZ;"\,S1>>I.Z3.;DY%7@P%'U6Z\]Np*[^8[Mm-lRVANfbQt'Df=:;]cD.esp@%ESK)t!*Vf)f`S$_B0PK#25(567<=L"3JTA#_K*Q_X_\Jt6WH0og&SZg'Gqp\F!og#g\?S=`="MjtlTZQiiendstream -endobj -1339 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1472 >> -stream -Gatn'hf%7-&BEZ1jF=\KW'fU$qIpDVJ>B6n!U7t=6MI_NJWV@=M^2mI*P;:97oF@Ja&5U!65%t68Fak6muDT[@#H,&Y"8q='>r?%!HK=.!-p@2i`gXLT:c(+IYPGBIP;-R-UJ@KBSN6(&j94sda4^:V?meJ*QldJ#m#65l<9;_$cP;Dj\=00SK2LiWW5RdqG##/\41L!j6G2_`8ED%^*6B8Z"*WB!\5_o`9kk56K.G%aJU=3H3f!*^-GCSLBp5nhj=FY-VcdqJu+"uYG.PL5?eE,Nh^So(X2,SuU*OOLh3d=fT[]D?M:1*<[$ZF>X&DoK9IFr03VI"Ir_h-gJtV>^K>)F/5UB'5s#:I\(MVsM7fb5U;+tAC?9%-SA&(Yna6emfYg-sGs+!TYR1C*%2aR!9B**00Y!mru__!2S9mcL05pmM%X],RecCfmWdQ,.:g9c468_Ja\PV0@UWboP2#0gA=gW1sSbb"'R`W\^cD:Eb3j2te@`,BL/7'Lkuj0BgAL!:^Lm)t*:HNKVj:]KZ:S&D6)f$22VRG[eLK:>&T)O\_%@S@[3)\OrUMI\%:n#MpjU;$J&.02TIVV#`cp3YoA5R)JB$qhFn^`*Ft]3J&E:0Y0,A5J(Z\>&XdL+lZZr*!AH>hcLjCM0sCH:=@=PocKSmWcoVJH6q5G_R>/ecjXGsG(9(4-;:79QM"XCF$B-J8=`3FDFbi.]@TDA^m&dmi2drHYU_W#9lI@.)[4ZRI\5mjK%DD3nTt=`,Cb(dJ'%aWopt@2XA9\PdJX=6-+643HbMO#S:;8D8A6^Gq,ibM93n8D3Cu]!`<[`PpddctjZ.%!%A!GFScVn,$F-TABI05)/$nr>=%,F3@\d1O$R!1#I25)1LE.7LFKnmW/~>endstream -endobj -1340 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1497 >> -stream -Gatn(hf%7-&BEZ1jF8MNc:Q0?rh?f*(Ss,\hXPUSR(AEb@gq;Ljg4CdHf#HM@I5j0@XG>jI)MkV*+rm40_47kGB^A<5*KkoF?0FU9,`+V:,L,]T.GZ#Ep_cn()'TYE/K@=M-?M=q9lm%JNM]MI>k%Gn4ncMGrQI!ro'`ACt?>VL.7=S-3XpVb5\PP5[+-`"NlE=2aJ9?J!d;Xd/"ATF1"UI1a5nRIu>1$ZjU[e,,9?j`pPHPpakXN5J#rQNRY]`pt?orT:)%!h1SBe"eIID4ED`;43b\1_CP^>U"2DC*UT&LcFT2\I9I5p*tP#;8Bh)2::]lIF">=%=3Z1:YkP0Jj2/ZrHh=7aV_A*&ln0F8S;SbUnpN%;D7/80WI"f*G#Q;sM?fES(PK+8$Phj-p$d,Hc+KbtS`m+>%iTR+se:*CB9^]*-9]=p'0I6VQ8J^]jDO/3qWfA@[!Sc7(XT9D2+jSbi!5Vjp.h.g+Ybk;RE7>G]sT,]-52E!kR@2aL;BtOs$&4$RO1DWorAg1eHI!m.AMUgW'G0)\!YI]O104:c-=UEQEid6^Yo"+'q'B!Bf3c>qsJ)^_0"tLQBUG)^_?8AZThps=jkpX^V]^S7BB39`11'b<5*&W5Y"q&@VHaR_#Bc01"Q+#k^8cOFg%sjTd^/D+B3bsli#>X&+:+?O[pWG('S:iuAA_$^5m=U+34K`FWoAJ/[$b-J)RcZAbZ_(OZARe(t58^TS1EOpeC8spi8e9&mq]%48&BJq'RS@4\YG$DrW6M-PY0%_X"mDpOpU$`l:_4c"bACcf?@=9I>+mM0@P_aq,iD[O0SAd@0R[?pLM[;$[8TEL<@gi,HH-//s)ibCo*_=]('nEK!-.An8";U>02VA(FYO)1MDY-5PAnMHiT~>endstream -endobj -1341 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1539 >> -stream -Gatn'>Ar7S'Z])5j?"@R-19,>U2IDpD1Ii#k^[d=2IV#9p-;9XbuGB^MJeZ-qN7"iQX\Y_SB-:M=b$FrKffTk,"+%HGOl0]f8Od`oDals)*Im:f7Pu?(;r\)\!26)Kfi8[eEq\$GT3Bh\PB29uNb>R%A($o[LS6<*g?gs%((OOHgD&9F/`tUY4<%-OYXPA9^c7AkN&P-j=>1X,Pr>4[2hf%Pgq89/.4ap\0Qg"Y7"&W'8Q'U#o[ZjIh\lp#0I)jr.c&?;Q`Qj3ZqKNFs`lJeEh_irN8LXZ!5f5=lkTW3q@`/9Q8qB''(OYFGV\bN<3%3J*NPJ.767lZQT+HHS"2fad-3VFBdeB3"<1T`;o"19Za!Z%@&BQ.2.;E?,CYd6c'Po^".9[^M6Aq#lVSg\?&]s$!0Wrphg_GM\rS0pV:fX%*!3=-(9hT*>qL%Y.q;RZTa(Y4$E6rq7<;j,c45Jn([`L<7>ZRSJ=`!lr*rl/X@i7+c30ugqi)QH!fQIR?GGVOD*I-b4MtS_UPa+'n1o>D!npq@7biXM#jVH]mM+\e%VE`atI'd<_//gPLg1)$QVh/h)(-Q*]]G/3S++G>K5R(>CU2Sd6@gGPWO%2N@9uIGO*`pPuf`q=O"6hgOf1^%3!*#hd,c-U/-Mm"Pq^H+*jT[h,\7dMYNK#3=?\E6^WUa/V][4DjFs\c?>I(#C[a@7Yrf>\\Kih6i,[S!NQ-)ZiI](I@;Qs3B@@3hgFZMd(6=#@;MInC[J(8-;2piuAic2B\Q@]_aL_D!7]pmKA]dWOG"\q6/*]qnX(/Z)$i3Sei*>thADMEkm/I]'-MIb22B+ne2jDeJSNI-]V.\u18+9ui[16k1"8U7V_Q28$U"7T%!OG)D=UQ.UpF\*!Gd:ar#LKsJ^W73eBUX,'H0tRNF204^Vu;Y<3uq6'NtuI\S/R_r#[)@WjD-!akG5)>^F9Xg$E9JU_nZmhV5+usiZn)D6T@HB10r>i8H/Y5:)CK'TK;!S_>B'E~>endstream -endobj -1342 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1416 >> -stream -Gb!&SoDN+PjOd'*T[M2T)/iM@dAVW$J5!8!S%thY/&#X6fk9ls&sgEe"Fl>!7FjRYiY;,[O)@1TqUkp6ZXA1aBTYO>@U)MIl]K:.YOBTq5k39dN8ET^0I@&kYD]BdP-[_R:R!E!@8TN%8LIEO+-6jj)X9E.+J\1u[^?@'8*"o"CD^4jD1XWO*!b"U[6BEEub.2j@?0E$Rb`'NfNoW9_f+>Z>II:!t=OuW/ejRl=g$*4!(BDMML[n%,DD_*3B!'IaMs)22rg'f[!16X81EfOkmV5d7#>`r^X@]dPGVpbJMFF2A=?,LedTsfpj9"$SDbGg$!rN(r[aDG_uiJ>6=g'!t_j[1X0Ak[mOi;2E-o"7U5WWDdEBFZXB389CK&.Pcl!k,WVTGWV73QiLL=Y(HR/0,=o2&fe,4=Eo?o.,TlMpST(b?dV3\9o$Kn"6-K!K>GjGnbC_5+%O3U9UWmZlNbQl;4Xdmo`%8HaJOJZ08E;!n;Np9gGtGk7*?+>)=$(]''a;*<"V4:,`J.oXZgVDP+(on>a=!D^9d.4dAAc07Qr>#?JU=cY%IWTA@pIf/q.@)A[H"BH0"%S,aI8Bb/TPS*Yj%b#OQA_($6=\>%L`A?pE6I=t9R?JcJ:@Ij5h-qsFn:Qs6eGlnd:;9Oi^Z==P_g;_XOD81&n7U8&9Q!Q>3KD>&U:JZJjBBH;A=3.!bkUeN7B9kh4r7!n;b/6ns:U,>TeK3/Ynp2RD"\jOJNVM^Clg]+FUDCAABC.6sMlMiM"'cC0j2;D,m@endstream -endobj -1343 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1316 >> -stream -Gatn(?#S1G'Sc'(m6@,Q%E(l0Y;Y0Q',*n=nIZ4l\FC3@0dLa1gpQY;3Hi7t6pdHslBZ&,a'Ltn53KQgJN:H#hPMU770:f=#S7N0'p)f=5]R;ePN/D[a%)pe2iM?Gm)9)C$\(Y*.)me1$$c!4F7<)5n3%k;P>^<+)K-Sq+mR'grMnIgRdK&?,iA*Yh]4dAK/\`IgR=D/P58SW<(hJ>IsQf:A4VLmc9aj`\FWfn"D%M@OB81=^I0A^!AF21<=KbpK/.lGkmL%&#!8Eu*5i10r__$HV':+K-JW.h%1NFikV,?mXH@Xh^\\Ysj7?06a:9RV1n:J]E&B5k`;VV.qcV=uM=J_K;ukuN]?T:MVN=F8cijQdJs0eETBM(.s&Z%mL!rRa''i=\KnC0"0Qn+9[8RXM\b_#C+1`HQJSMZ,7oI;UG\(n<3gYdJcurSrCcV-7XnTlC51>A($lJlg/1S[W]qmZYr9%[(9h#3XD;J6J7)rKmdCN+3(mYBWo(LqI[e3"a/\;ecf_*Nrk;o/+4;`uA.>Pq4^[\!T6BQdC''A.Q/&m1&)-$jS/r(i6=;IUn=seAk;B"G;,e.@cZuT^i:3gm$*;JC=7CHq9C9G06%Qj/NN@o>0oSjYjCIN2`5]db6B3DR4erY]^L$1O^9Q,EdHd>2+cH)On4Cm-B@&4g3Fk8ciecE.pnL8a.V!KYk0+RHhjOW(^r(.$X'mD&RJ,3#&1?e=9E84CRRk3bM$`*ECSNV@-9#Iq4Y2@31/17('*7$mef_hGF&2Ucar:h6he7KQN'VXATu9bA97'C^C,An^qA=2f70X9r-*UM7H?&&H[:q]bgo&um&6aae%kBTX`EW:OXa:J--rlK)6\.,OgP9fG/J-q"8c>W'RFH[(%-=aDgPRL/qh$G;AgtSXhDSGX5mWBkHHH")Q3(KZ[UeonsQ"2e6eJRrMGmIT#mIHBgNpA+'K[beWGZ"*Hp:42f4H-4%0`LqZYN_Z/k7\M][0*aLdEPiBKO+%1NTJH-~>endstream -endobj -1344 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1386 >> -stream -Gatn(bAQ&q&;Ko[nd`!a>I9EhX*o.d:nn3BU)0M9P79+k2G[o3Q0;?7ds"@)N=RSjPURkT(l9ShI@M2#0E`Bn,5RaE!:F=+SJ*+u`(M6PfSB5&hSn)J5Hh7]dl.QQiRFD2La$b2VVr4RWB3)N6a=5:_I:O5aRKI)%1]/EC13nCou&8^q8U8MH$),sR6NJY)CT*]?/NO/%=*h!oumO08uBpjSPJ2])dQ9X&N<#3U#%eMKV*k2GMGLt<%j\mQCHHk'&iJjIQ&D+:.#3]9t#\gFKKeub:X7tO7SU8KXRB-PaH9K%n?,)b0"K'XD0jN,\Q14*%gHp_2I9pRlZj%HDIACg4"DRPcGNgA^08^EXljBW'6oAbg,Lq'!WEc^.j3k41I^Ji_9i.]U[\=M0lT1%klQB=QGNQ?)*i]:%KLInZYTWbo-^)hcj-(=F5H>0%f8+ZeplWJ&si;aj+Phk]`HL!Zrgb2G092J.XYPnd-1[]YglA"OXWIl5<";VFllPuE0^SDQ.p$3VK=FEW4H6uD,O,A3b:pc*,6G^VOcjdb,shBctC\s,3siS*&d)/TloJD1ZI"Eeg&go^3/,5`5:XMh6c:\W1N0&6RA=Hh(V>FTVSrY;F4enZ;bCG>>uq,ZR;4/N,]Hq\j<=j`dbDTl>L'jFTJ2(.6[(B8u8mL/e(FF[i!P6-e9##`b:5V1^#?gZHiCjC,P1S;2X#ki_,h:BlAY8&pJsRgSM!)A5*H#85.4lc^<]#Xc%f0:nc/,XXf"00s0mKi-NtBs+XR,7=UY+kPQE9`AbERhnoDjl#Iq&a#_gjb^KP"A87\$^XlrolCWJ:OiTS]=(/o2*2LN3>,j@fbc]JFLHZKq;tXqDdkkRS-QOJ>XoMG3@*VSJ"1R?4\Mr(PS5[Th`n(CLbP#T?:te!"XD?.?lm?3d+#V?A8-Q'qgk":GrP#"0=(SWZYYIap1A;MP%%qEPH5CPYl)016)t=2+d1g!F4~>endstream -endobj -1345 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1450 >> -stream -Gb!Q=c[6*:"(ubOM9T]EbE76@-lt28KGTLUmIg[]!4,;5:_$/?VW8u1\cJpdG'1YPkh8l1$e+I6^<\2KSgu9KSc'/V^4`h)&\3JlBXR%bAV0QBh7!dlO2tR(U^q;^9QO1KrM#@`Z!i+h))q$.sRl2+[6T/__K%@`0=X+0hGp0D+=sA-i,6ef@,he*h@-PRe@L(fHeFDH7]//g.'DtD80,c;:UXaFdL2LrS_AX:\C*`I!u72l`!:YDTZq\R:_f&\J/*3#OIb*eo\0:cjoka.ZO(o"FN5`U_m`+m[HVliFr*M,"q\8LB:YOo`rjMQsjnZ#p4EoD8ZFIFp=eu.8giDM![EGr##mNXU1?qqI1b\7U&L#smY"'/ieo`TBCh>KGofN3[:4gk.MHRR'YJjihNU=R1tIijBtZBYbj;dh#1a'3GJ]@^4tLSE!s'cLN'cT33W#)$F8rn0UYMTdAVP`1o%[EP"ej'Y?aaik^2GA5"ma[:0>VMDa+Rs0.u-l%G]e%"4RreaWJ_Z\'7BJo&dmH0!g=Rial[rFC&$BUFmoT03H`a;`G"TQ[\m>Xs/B.&F7j.o.ikdF.tbc\:*s6AEP./pEK`U#^d]FnC?::I)@A"f*^n2r#WW>r1b7F*5N+Ipbt86+Udh'\N*pRp`?C\U'^9;NIE[d$/-pM$I7OUHbG;*Dk1D6INMT_BI>G\Xgd/AZiSFYAc'(K/^'8;RAO30;[k/39D7Lj$=ekSS+>o`(++UWb;*[Bg-9(35W2hcIX=Aq4[Kl:l4'=DC@(lXmbL9AUHsW@dJnHC>+Dd9/n:+F7PL?0K?L3MU.%q9:!CjMf9Xg'/hsS`$ei5cfpIPe#eIkh00"UF\E(*@^Wo7X7'>]aI&9928Lt@HqTN+=?9g.U$!B'q-a9&CWp7B45jpDQA?;P:t!_M'E~>endstream -endobj -1346 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1504 >> -stream -Gb!kt>Ar7S'RgRSs)?>O-q!BheA^"C%7o5u$]qLFC()MV4YRLcF.aeFU2nqj+%b.jCeG'L3Erf*L.k6qilCLmGn:D6#FT@l!5+f:aVY&q0UW"5qAr<_i,!FYnE'->/S4mR++uUA0H@ZP'F(8"B`urHPmmB`5!gJOJ4X3VGG/=_!#k&;&'RPf^j0"#:*kiTOUudHPoc=Eu]`oP_Z9`9G\2Z/n_DDbo*7>M[iS7.Dof$#6YXO^(b[Opi&W"XeN&g;(V/g;r@rY>`@eIGYY@o"-Zb?>YHBc>j4;8i\73=:SlHi/G[E0=d=O,V03k>m\+i]QhqHlg2#gS=?DQ6j!lfNNUp^5_%6eHItQNOWp5-5pAmS/`4CA'9u.NcRiRQ0V/D/=XabteZHFL3>!8If:=&kd&A&t"Z=JW4G(oAKM@*4f*`*'Y9b5*,MB"`fj1>_&m0+u!9phsSP"XsTc5N7^U)tZMD$Z"]32K>L/g_Ia%rT=^O5B[dIZ">fZrlDM;ZQ:_>9gpqCib1t*5H7t<=G`VTA:gIC<,adk_J'?-'/unA8X`aN,N%euND?;am&H/Un]:0jRlR%^o/*>DXN&uYSG*JaCN?chGqZ:LFQ=DUVZ6MmPM'Dnhjdai='L5et!'OEYu#C+KNC/n-_d;$dt42Ul'n`+_[;u(\l,RtcaV'UtjHR5b>%^2kYeMC8@C8"?KD>EcF5:Te*pOP5uQI;m"MK@TC,SaJiQ(0?6Ok_6^^L%Yk:=!s6+2!<~>endstream -endobj -1347 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1459 >> -stream -GauI8?#SIU'Sc&Yj?FXV-LT5?,5#A[fES,n7L*HmLBuYRZ3sj5/T.k];KV9tf8la*)+uhuC.2'PZ"T\pO'\"40F0f6&".2o#C)`Rbm4?eOA#ZYr;`!BplJ`eI(?mTlb6fWO('(R(_$=+MPF:%drb(Q#;Nj':ldnh:JU';WT!!==?j-9/#?Y6Kr!gG8H+2$#8?6Do2?T%[J#7?KhshX^rO0(W^t\3DajaMUuQ;k6*HN)s%EB&':FCXH8G-DSU/oW)^XT4coE\RV4o)G;M;r:LsSsUp(^#H]L,-^7M-J/4%6#Fmmfo($;7.[:I2!f*ciqWB*I[,.`?sWR(_N?(H'F\kE]:JfFb5kcm)_nd9V(/%C(9VAO26=C6>9]'2,Mt_aaC0Uo21_;-/ftU@/bjr`kI\m*,!F53@,25'+V>8(d$SCM(1t8"eEO-&44/77ej\BZX'L3dl0h:c+NI-!f[D`8b=AH%tNDDpJC["T$F5?NsXD28.TM:C#71T_Z7fNV:(hVLW^hCCl>YE&GuV]Bn#YrnqJG>+emXhM-"IT&]8`H&HjZlAE60Ub+8pW_\rL6K"+(U6)#>.PN`OUkfQ4D@koCYjgt'sOl&&+U+1IVlremig8h0Mhc])u$+pF&C.kMQg&:*.dk6thWFX^oQn=aCue7bK>VB@68h'4P0LUmU7dqg==?1;Jkb[mbG?GPDMq3#_uV;`$!X7YZd>Z#nuQhjmQG%!S](\8eQ8Ar^/OXs5e`Xld"Z<4TN_=IO*cYu7L=.ab^nLL]N4;2%`#R&NKuV1cbhk7U[&X-D*YdsRt%D[Rq-bbK"59Y3"o%N6@*9BQ^NRJ">.V>S>TlFS,_@bbYcs61B*c(9bTkCTDf6Y[;s@)C5_pM0!?.Tjd/8F4o7(hnhi7[P1L[Bl,eZE9PMY:0)#0rc!/Q+"0b)K)~>endstream -endobj -1348 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1580 >> -stream -Gb!/VWC-.lF*N^gUDSNN!P#dt!8:g7#1.4u@*f'q#NoaGk@_"9la<5L^^_LNFIXZdg4B$r)Bcc,*+O=i%mjX9!/"DP>Z^iB)o.d;iKeeo$#&tXK#Fu4r'4\9KAf6Q@u6keRd%h/DS^;PSJ:UJZ[L4,tni.r05-KUWmXQqX@sXOX;r)]%XGPg(&*EPaTP\?79bG=kOdWC#gbM!U-N,*!K;3Z1X@X2&g=V.>5[*J:907E,r"(N7+.O=nn=;u%%RTmV_h(e4;[l*[C)kaB:-#h^?P>tm/P)<$5qJ0YK&N"^.;k#4%XF)aSs$V>q0c2balbVZ$&"5agh$d$ID_A1"-.#foQ1mRjD4%,Fqn%"TeL=]fQTo%F=T1Le@-YCZ/d'!hY*LHndnU;@Nb"Ilg1d.;1*#h0W(kWUR1a&9^ml%2?+UJd&UmP6moY;oTS"@RBO!*&H:!9k:qJBfb90N?"t5)N,j5!3.CgV`SAqI[f;[R=]'sU%VPEtK+mC3CC(6L^_So*N\[@nl(Yb^-]/hsQTflTFZZQR-U3"O0T"n\@hR%D1r=onLtncGD+oe-SII.S?T`f==r;40W,$^8mqI(k'U.,>L5uUQRf_%hKWf5M&C`fHB_iDQg/ndGXQHd-r)"(36qN)hLO'(!e[P8Io8'[,*LleKTj_e68GDEs*=:7,2.;7J]9+CDJ0`uWZ(m[Wo)*G?n3>2T)1:8q\RLb@EGop5ZRbuCJAfLHYifHW9hVp5)D/U%#m4V_3g(j5:2*Qh+\]G-C,q1O!nqPGWX@mDnqf"E8[=HZA!W5>W8UGhqHQh[rn%Ys4+lrs*JgTG35mHmKB[f3a6d!cXNrcV0nSkp1T9TQIt_#cGjBgVfTWhFLJ1`/fJK88?pMo;OXS/`\\<><$(-7L/QD1AcP?$ph-&We+(*2CVr$mN!s?([lQL/EPn4%^ms?FALG`66s\tI9=B0u!SUr5@T>b47qq*b#XbNV`Fp'S>Wu/;Ipendstream -endobj -1349 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1505 >> -stream -Gb!TWD/\/e&BEZ5aEKTX(uPm`A*VG_[K1)?UDVFV>E!,4qM)FlS"36M'V3n6^(b-?Z:2a^W:\&l^i6*Epuh,6GW[/5WF)Gc-OYI6,<-bh5TYl]J:_Y=UMG*53^*:bH@e&`@FU8@h>fh]qcu%7#&9ql:kQ58C++sfcW=ID$iRSNp##f]arfEf^L@D_NoL7U-2to@Gn:BM6.EI)pWGdfGe.R5^ImtRnWY=BGh%69oqGJ(A!UB%[\J"\"Z5NRgp5*E];U1kUC"(@'0U`YWTA=GR".t0E=-Q<,#UGlEW#PQ_$"a]-lWWQa!b[UU1m.B1@/=260^j$VAr_RM,=5%k.!0&Z-Zh85X[)4&VF"3pn$OQ"[>eQ!Cf*E;`J3%s,mJ&#P[d?k;-Y(0[^[r1'kU'C:k]+?PB<:b3!7Bt=92upOI7602GKr#G%J-t,M8``2Y:kN?-]^:nCNfIDH5BV-@4GlQ#k*j?u63rI92$&'T<=JAjJ5)c-(ec_/M)I-.lCt#lD%*d#=]9S^?_>6,bug;!jO'0W^92Au+dO6R,VtmJ4ki<@.nLQX'*G$Ni)2h,9/4)rS0'DRGeYUjK$INI0>O5M_[j,jjp@spJug'QSS`@\"'?!1J8a>HP_e0Qu,WrH^l]rRc9a0KN0Ik'*]>:+?>D!P(6dEQKg`65h8:k([BMjL8bs=rjn4aLD>bri[=;&^+R3W05)/PV)=Mj\8cJ:fZ)7dasP($X_1K3&TGe(Uri("3&&[cR6+qlqm;dSt7>2@@+#\_3:?^4e$Tk!J;=[AE:en"Z@f[l_qZ3W.cE0UGTKAc-2iN-5D5f?U?:!qCV?WYV0D-D2pl/r23')N$Z5:1M';nKDZ(`nR3]u8@fW/>.0@g'lrjutb%QZc0l;UD%QHL3@A3=jNrCR30iKIjH;\lBgbPsIWZh;5LUp#OS/NH,Pg8rbRaX_-4,!tWqJhPF29$Be@hQ`V'6SlSPV7[56c<(p21\@2"tTllkD>k+oJ.uG.5-&pEC[@SK5Lj@cAod^>uaDZI!bT[,r;d<%qctn"YaaM,Dfu7I'Z_#<3Bt>a+nfqJ&b&$Nendstream -endobj -1350 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1282 >> -stream -Gau1/?$"IS'Sc'l0h]NnmOW2DLK#n9e@3d(?#8t2B,=BksF$4Ki']Ps?^@0#d*im1VtCA:a-4W$E^KsMLSJ##Ndn4N`U'aX@$p>Cnlj;QpR]5=*-KG5HQj/SLMRf[%K>!Y6pUIWq'l2]3:`+gRjuid:X[BLa`0fPs')G,;XSp0Hq#*CDo/[1?DbgVD[;JNjTM573G>"\E+Ifb3F(,Gjmm`cr8"5m)\eiHfAd^sV^rF->U/0)FcJ8)`;<7UOUO8uB)suqIo('OS=0qr#Q_cV&!UQca?a*"KULpIdN+]j-]31!,RYH#t\B)bIN+UPZED0=nV.adQ&PCH;S7"Vi^`XD_OC:JB,VLRhE<^aR^8gi`Rufk&Fq>;9Kq&Oel.ns2Sif2=LlPLe[%0*q[89$BP=O89XhH_2_HVVM'do/r0GNM:D*m#c'Hf5$p nI!H[*F8.O=su2uNdIK#$F9CNU`O>V6ioWKM9'8bE(/6abe2r&ZN)=3Yfg5sFrCdWPBfq9KY7:VR(/j&q"^TSZeC!Rls1mEl[2XjY_CZ'="!cqrlC[q<&k1gPoDTS9LKkR-^:(=c*\&o<3F%rAN04O$D!ZrtDQ.5%e]iD"<_.i$?Aa(tXWJQ*aI3`pYAB.(PbbeSC[Y&.B>dSp4ZbWN:@*[]%p$fR^OQQ.B8G4bLW=D<2IU')t+V>#WIEj-J$4m'%Uo,5"'tp3MJjk@`7"a'6Ze+>9=RA1s>a:0$jBi0U#*ij;,uDiKP4T6M`]p4,![iF#r31*Ba:/?endstream -endobj -1351 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1389 >> -stream -Gb!l`D3*[7&BE\3[,5;6;C1aQKK)ameQ1rV8#pCnT`qiJg[,A9%/B,+1blVHTDff8Q4Q+h(A?U,fq;`mnSeC_[O2*,/RM&^O!B1U+gh(OO9mke-Y3`+rAESr3m#'N"j3#hZUb6jC0C/^+fnF;98uBsC1a^h!7+hB*3$n&,L0paI]=)K3i>oc!+s@PTL&,ib9&]]Nrf'_TWe,8=b=AKU:PqsL+F=pi>!de7!en%Y;ML2"@5oJCdT#.L9OL9,4WuP9X:YgKF&$3G3"CLs'NfN%X!YLBSP@Kq:Eh=uOq'lHj(V41f/]Up3Kc"-hC^&gU^@SY4=P$E1ed4mM#:1?r$"WW@7Hh,"ME`a&KKDuYq%1n>m5^V1n\f0nc"tg\X+kgCDcY&-=`HiN"si8iLYoEA;O/b_OqR4.\W@A!e2u(f4Q)TSBF41E]V_#DO=ih58eJo_.,cV%"&-8Z5#RQQ,[a77@MOM9&inuq/Oi14s8,8#\fgSWR8U]c&b#Oft51[LZB:[kAZDZ+*dT/Ade2$P!1f^W[rgp5e["pe@'efjA:Qc1K/XkF&"nbQK#H+KAc";e(Z1/k,e!fe58:sa5o#Jct-"u=m6fSuOfh+&9S':;7-t\o^?o"8b3h6T%ehbtDN4*>n".!dZaW"(O1W0%nJ-o?/?s:(6d-S*m?0b=uNRKq:k?.H=O=PT6V+Y3a&G&M'TCFgjIPMC<1+Hg;T%k(:p2qoRb1f;_06tGQ:GgLQKUPj(.N3<(RJ&(>,^_tC0dC8e>2OpS`!eBX$eqF9ic02WXdQS>0I#Y.V6.0+I[>KQNlEq'A8[:t\a,_Z#D1/W>?!6t.tb7c_[=:UGV%_38=opt&p?bJ*TM3S?P;n-cDtRe5l:QnJCOr,-l"unG)cA0*oXVS`L4FmAbH6&T_jW51H>2T^N!dho)#`k4[F7Ta/3$C[lN,=DR4`8cHVAIRjS_rVl_.bFmr.K9QS&NS2jWYF(LhZE%Eu0@hg$Y#26`Z(CIm!V]$(F$T7*Z#ZZ2Nh[8^e0jFLN^m=M>8e%CkhoaALA<3HU#a9p30VL&TAG)[&i+[8uSWuTZD=RB4i\bQ80KAcWdbaM1X6Y%:UBC3B3@^4/k4@IPHi8Hdd-Q^ZT>9R-=8\K9q>~>endstream -endobj -1352 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1677 >> -stream -Gb!;egMZ%0&:G(NIj"G2:165YY#`pcaQ?C-Rr5]kJJP3]5YJJd[4F?QQ"9oDLSSjOm$NZ^!_MCiP/cS,R@1s\#t>\XA+_oe+S9Z0/oED\2B#=%G5Em1hP$Ftl,gj-$!t`"Ibt\'&>L@eqDe+7pnSP,PQ7>IT"m++ZZ6Ql>JRNs/?"lBjeA;&alpG5QI9h2r/-4nW,;N35C5?\#M[MWaM9k>V(JgUZ\Cg4Hqbu]2%h^&`f.s&,A@>(V&>(`&1,^475Ra9L.41@"(f-N17(>sA6]D/)fCC_dUkRFJ>[DFfO1i:8[#<;L?3l"X\^A]KF>2WJjqojT[aL$I:LdcoV"f8NCW01.c!Jdn;q7E!pkdr`^rWf_D6E4>:/Qunh.MBYs_6D3bS7D9uJ=9\N&n!I?bGT(nDTaDL%!G\%TM2nGqG4)@i'8A]*u5iLhb^?)kMg>a_E64$TIu9Ep(_'4_O1&8d-KKQ._`3`(tj(VGR"d:NUXK0ak1Z/rT=S0.NC*I!^da5'3Nkj=r')PikoZIe51(:Ws?aWkZh?\e]Fch8S3(%3`^KZ:2%E0f;q\?@I*NWnGe!UZhG4Sf>;\ULa"d529fn6hEIUA6n7\f\m=nkJ)/,=iOpD5'jcYUP:IjG%'RPt(+?bZ\Od&"9Q9c;5&O?oFBNAW_g1;V*adT\0@1Sn8-eT2kZr%&15lm\!X;J!R)m1-5V<`fg_"p1na!f02;l8Mo%khBHs5Oncm(HRITWT9>8coY]BD[5.W`ORnXM9#9oEJpRVD+ug:4OQ$r!(2/l4I("C_lBiAug)Hq@RL`t>de!<_O]M(JMmiUTG&W,\CtIs-XrHdd_(+c2X1IaZi863>\,Y!L=5*6LkQ@mId)[oU*8`h=$o4"9N2BkW#=b$c%`k&#N$8IcQL_\#qj]FNAb)efFcRbs.6?@sS'#;ALWL[,5RMRJL6Y-d0'W-YHl>#aMI*Vh8$#[r*\uEnHK*(6fV)Jk>B+Kq6i%9s+)]rn%2u`D"j!,o.jk)&&@jo=uGkq4)Ah9UIGcN30m>1ouXC(9@[EU@>],rmNLV\=FG\,N)C(K2*ZfAjuJ!_8F*[,B2]YWp%?&a31@K_jk\eL-(Q+GK:VBjpIW6:D36[HOCPQ+Fcr0ICIgaAO$Q8tG`^QVddlXCfWY1RJPD7N^d+f3V2+:/^KPuC,S4?h)%c-^!Z]a(-OZft(:/AS+j63aM~>endstream -endobj -1353 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1557 >> -stream -Gb!Sm>Ar7S(jupVs6qU9lHn1X0"+br"4B4?#.SFaHg&@&%$X38RVC0GkW7D#01ksd9:G*<"(ZD!JOt`SkI[9\7UXCEd]\9P_#$=F3s^oMr?3;ek!?`i\,FL.0:*Jg3S/3!)M&PEBK"Zb$6"J#W@,d+X#Z2Io+>`Z&($s6bB;p#)h;aI@9Ytk#csWUCdOeSdkTWsNh>2oruX8M?-]h66%;QN;WCl=!uliRhomJ^5i[OIoSWX/)WgGa^D*aH<.S$j'/a&cDRkbW",-5Ie)tGd-u9I[EU+NhHGC)IkFKiMB"J+A98nHg878$P#_n9?q+CFg,Z.s:YrE=,-Yj>hq/`&GmM28I$.Q#/?LRY>&(66;HLpX;*HNtInQ1klDJ8oo%@/6]h'*1TU,!s*lmPZ_@;LkLPtb=b>E@@5KRDc$)(1J`bj[MomdUG952kabRSqURmCh#ZX_hsEbCcM]Oake`BjS)NX^C_TRM5qCJrH,GAbkR+UcO`)0Zs1:lS35^l\^niW\@elC11j)VNaIj@QpIGC1m;;pI?.M3B7L_42t3b7-7SZ)!_>UlurK;'ok:Ue*5WDpsr42[_Y*VU,'NFdSg=i"/->8B2]Ye1o%Ms6NW=Oe\UZRP2XkV_KlS/$\;gVM)32YCOtXPV==Kb@lC^[l]'SD3EY[RW^p"9nN;saeE%;+)`[Pj[gh3k4Mq_amYHSbsRYWRnlZN'FtK-6rj[]G_2op[hDo!ffY)k6V<$3`^@la30_P.Y`ecF3^-Et#f5P?/kf3?moG`Ye$:'X<5](Y0hY,RJ"Jh06RY#2oSCZIhEWMCrs>9[PsX3E/bOY&SRANe@mRfT]";dcZ[ao'ht-85`=NCntf;<'mP_h@P]Q)'h_6\CnC-h`t\:NQbiO&&u3a`[O:q0+pVbh3Re5in\b))9)J`=/p.LrIS@h^U^uT)\pk>hY]js4eKb%96U&3.Wk>b%,g,[E-B4m+c:c(3A/k=ef@[\ItgH]Y"I@+L[ki&/$DdKhBrPbG8Ifn6+hu39r=:Rp5=.h-Jq6.]`h<%:7C+=PhH-+]f)nXDP2UlE#A(4\K\#O:#<4>\7;l\23Wo2(G21gt%iZUuY$rKI&H:JUb0pMfX4UG56='D.!dPs"jQ=&ph-D0(]R]/l$nFF>[Dd[lY!Hr~>endstream -endobj -1354 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1736 >> -stream -Gb!SmCN&Jr)#dj@s1pbE<&ta4k5o2JNmprdX$k\uat?1o*t0k\PESh`l".VYYFSJq,fMTVB3hJ0Q+c51^qmoqXEDi_M3HBTjE,$C?Gn5<1mP3$?YV67?>jc:Cslg_:j*HGXp.\rZ&i%.%2=\2o_iNjGn17&X55=hXF_QodBE>#T,aj!/A&DQ=[qKX+5&?E?9'[o$)7p;t1#Ci@;*9*F2MT-_(At'UkD*HVYo9WMctX3IIK)p_1Mp67J.3;O9VS[3,B#W!^gZCYng>nd7^XHfpsBC/idr21N]#e'9;?#f9)I[08q:':du!RhYh1a7.ci7XhW1-MVRmpFHP$cZ\SGrSECp=EkKG@5C_Cpr8Q#I2!#))&F&(atEX-ei1Sg[>g'l]TIMa%gcfm?s4HiN3j<_N9#cI5lWi`q!E#q1!;<#]9Qh'/3,`"e[*QsA5hM`iQIH'i)U\YI8jiZG.:Onr.VAN`"%tZJba;MP49Xu2(danc)MNb8O1o'?PoTL\1t"'HCmIno1$b8duMm,%:NO/YB,e,R?Wn1eZ.YoF[cTIlJMr$TtsKa=CX_m5^*]?-T+pI3QLtd9(<8gXR\Qp*rY9N!9,Gde@LTRcIsmSL''6NIH,_M:Ki]=3l;Vs0+,fW5t[B0%0TYZ3MkKgA6*5]N;K%b$m`M]quq:WM/E\WnrS7`&DdNSC2@d5a>h;A@&A*8hYHN9mQT6BpmOE1-8`9PHQRh$tR%`c()gY)]h3F#81d.je4,a!]9R+Mlu3I1_'YVeItuE=Io6s*jG;s3C+&!#UqOR/OdO0DT&r"[h-99a,S\jYL*=HkDS1=Rtf4Jq$QMt7]673"@O%eL]:gKU^cRCnu27V4?>)4;RT.9)Pgh1=N:@j+tVc&7"it=WCD"d/P!5VO-an*,0`m&2HH9$$8Rp*G:9%`^3K@H)%'bW7:m6"8\aJ\s830XqEUH\l*d#q9)"a(c>T3Yh;W93Q2=Q=\#KmQDAf--;iA0OhMlp_ok\SqH*(t,#+*6Nc<4M'mLBF["7:epaQ%2?rG9tb9rnTACfard?)=5qCm7@._Eo0PC,!nkHCB"3S#q1@JMs(d%CE+d/nCAjV3WTendstream -endobj -1355 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1534 >> -stream -Gb!;dD/\/e&H3^ns5?eiJ2>]\W&Iqs2B\">X[!P1M`+tAqa$>m>FSr(M,)e'qAq*/Q6eVe/#,Ah^p'UJq=(r,kDgg\ieN>.0*Z[a^i2nrB]'"Y%)i50"5Gm!B:mMraP,4P'[,'D!i(m\&DOM\9jrQ*QSt;3R"UFg#<8t*mK3r8!E&[.Wq^+GkYK*P_JSSe$ZQ)6$[lm>^BA18+iYnF;Fm-2!JWN7DBC3_0R%sYd/FUVHNE-0!s!=XA>F!#?PT47K^8d4>t0I6_%rXskRZU&ARR?\"C`3RR@560R&4$QZMe#3iYePC+=^"H&CWack7m\0A/Wk'*MDNl4-97s@NA4g1/J,=rll6#K!=aaQ8=?\'9.Ioga1tJS&rpe^OCN.[k7Aj)#%Wj2tpDke(I/"GU:@'gu"G_!CkA7g-nUK@nZ8b`!but$[R*ijMR=^C)@,W@$oP0>0Fanm^2_!V?1-I1Ur`.CU<^dmL@S!GU\db*s[]#k6(_>/9cl4u#_[p@HlS7ZlOJT3aA-'>:i%hS6baf9+--fdZTAIFGXMTVl0kV:U/m:&1`AS-O0621O19!XD&HD9L1B#_pg!6*@0Q%Gi`#WM[k+^3?Q->5%2Q-9d_ijHs7n0uU:V7f*N^YG-+!+jo"))TJgk*He\]laZ1>g0JL$GD&jPHAAZn$;c-74O(UW&]dP!$pI:82>bHan?<%f5\mcIk73QJg#$m*Hid)][+b3j>\prP,_]7)U]U9)_Q"XE_Y-XH6!`;7?!UJ-f4A?Qg>9H+e,$-4W&qaul[0iq:^'[0V<%3C`/?$Lq>K'L_Aj#p=6(Q@&?%`#nOh(B(%=dO"CfE0LM02M8h/T>eN,dH$@-Dgj!$63'9_D,D^SF_ZBXMgF1ntO?J24U:e"*>XiL]~>endstream -endobj -1356 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1442 >> -stream -Gb!SmD/\\t'`O-2IlQ>S::CetPt]Z&hV0ecl@%?CVHo108;RH*9L9b@bMB@om=Z*C!`"@ph('&DnZgF#kIgR0K>80SUcrEaJ@?1/NY*BA-8?WUi5"CpDC>D>;nn(p=k=U;JJBjZCU*G=VJX!UDg(TUu2GC<.H?W`p2&E86f,SFLb.LTUVl\1];;#0,OjLgtPA'-[C8gLOq1GZ_nC*g[*)/*F;#1OQ(tnNZ-GYp/E"O"^IJ;bc\,2@`:-Qc4sue"oNX!*YIEN'1uUFQR[WS?3tp<_'E7P$^/0+)FIIG*YH*A+QaG?`M;o$]V?o8E$mLk:B_YT'lR?n-i+2]3Or=)!:JhYKKM2>?'kMCjiae4mNohCq%\DK75IjN^kH0frmVV*MqcH$D]X3Le'cM8E3d?#&3mR]kM@CiGqA0%H@SNH+:RFo!^L-$QD=l(!V15)8lC>9?([e>TEt.FX#+(;6:4!;j).F5dW-/s!qDle*U>O:`T'g;%r:Go25nd*f&F;iMC^u?j1`*''fm*et?(4S9QiFlqR^OT-j@'l^_a&FARQ3a'!XN1Up9[X^')Z$,JnH1VL3]h9;?3lM+1BiZn,*1;kYs(/gt?KDr?4eHD,[#)5nYq\_S^J&&4uW_(9#>s&C\i3!kdCe\/]22Pe@ZhkkFsYc;^Lj8r^\5&\A/5lZXPo;,^8gWP>[."(V_g96GN7:Vp89.~>endstream -endobj -1357 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1526 >> -stream -Gb!SlgMZ%0&:G(NIi.NFZpj>;]%JRe!kGD[T]p@K#^pC8#MPmm[Zp"&<3lN#P*-eXQ5%eFGC^GdAAKJ/1M:=F%#Mc#+-^,F$,At4B+kEhJS5P7)gW(O^k_.Kki):BQ"0c#(kbY??o2nZ-k&F"1EW8:DoS`TB]M4W\rDmNFZ8U)*[%7cD!)nF!,EmcORO]Nd3a@ZXjnZS2ai\S=@"5uD89$/U+AGJedt.]lGA*sp[rLhj$9XNPT$7F7?r"m;fT[M8(P@YU3#aP4'FEM/oi'MQ1*mLaHW8/Xls]+'@4Q`;NZ7BFY,'.2^KaM4C-&0!jpSQN7O;U''H3sXgT,!5?g8ESbe[U&CffmXB'^N\l>BnWcW*3!@g8Cac-(tu<<8B:$&]7nXr$`/.[Nck81G'Mnd]K&gd\miOjESCO%CXb;-?ZuH,rt`O%l[SkP">"?Kf8t^046U,qV?Mu]!j,SG!C`EP3PWXL03jIOX'2)Of.BZc1b\q]I/rhqJ92]>3,O[fndC_/L5.g7Xj(=L@SPGK/W.j^WYRP$R4"<4dSNmeliVDMT@5ajg+_jo\>cL$ui+qdVtdlgQeM5%2rV?9P\4teCFRBG)m3R4#VBoum1?`DF>ire?qHq#lak-?:u5C=2^H0'nqs^X*+Dj"!%1iZsHu&p3'c`HP;qdZG05sCe66/7H;T!2%I/("`+T@q4:NenoSWn\J9?p9SRg`NrAuT9_rZO-A-;lpk*bm9=uBK!^@RsOb$_>c>X13+8lS",@hD~>endstream -endobj -1358 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1309 >> -stream -GauI9D/\/e&BEZ5aEKW9c.&Fa6p4ZS[K16/F9>^R>mq.oZ59lAb?QICV._7@V]R3hYqaWk)2&\ZNB(0(s];j&0JnJ+JBakpcVlB:J\]pSrc\$.!FY#:C2tLJP4EN2*IE5?IM1$V^H'nZ8;']0V\j>W.$n,F.qf'"]MR+VSrYY'(h\[-;2TU%(mC.\i!82lZ`WD(9]srIY1olpbd29[bc0f`?#-e=B(BeKB\*7pD#P0YI;YQ>R?AZB#H?A#bF[4tO%?BTV9S(RJ.iG*HtrTQ=t.5i1NItT8t(4S%7(fR@jrG07@E[^bi;lr_!^8PjE:$.=/D$,-P1).CV*&$Xj7k(>-ZDCaX7il(gNu-s.BU_!$'])1'bW9`sWBAGnp$8oJk2=9kBcB4ReDPrD\S^7);h?eXKPb+K.DSP+H#)6.4\Q#[9OF3`eM;35U8Elbk%jtH[]RFM;h1-)rN-`o0GUN$/Lt6o`sj7e)(IX3=rrEs1;%1B[Xh3@Ds]=cW:cVUQup<8YaqTnW0Ngn;JTDF_Mq`nWL,@Wllb)^`L5Gdk>^+uI0?K+R2.inY`4WGQDm7/-R#VH)RV9J6JJt,C3aF-fcYa'>,#`)XkVQ"Xj^5W5%TA"&KeD_1Qh7:T^()d1ig9ARK$=%;fjbWR;MM6?]sgG^$[a2mqK$EnZJ-HS!B,V2?20"jjY*Up"aS6e):/Pr-G_E%HG7X5R3iAQZG4m^&Rou8[Bkk$cBs,(Ys6F#ON]oC"mLflTdJF1*Iq@+dJG+a3i0oCrb+Lf]a@+G]lGF&oBRQI;caHS]cElK)aorC[<##2^YfO1n2?UaT?(%PHZ.?[&3ZPeg@OL\tpn>e[eQJ+U6%EDXW@PRtb?tPi(4#-XH54rVl-3`RWk$>I-9O'6]F`]b5>IY=3*`6F\8OHFGiSt]U8Jtq8:!e0]cI$Rn?lIngkeTK/_E?k1(e0<1sbC=)_%X+-\?hNZ@d*snZR^R8^\&\kB93Eabh-jekb"3hi>#^gVSendstream -endobj -1359 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1447 >> -stream -Gb"/(gMZ%0&:G)IIi.7C9!Pfn?*0i,+@Y9Y!,o/srNtlS-l+,8cm=gQh5"CbMNVfA(=SDPKssJP#8)aPiL/ZK)&\"LILuNa"TZ:j?p$l.'Nhkq[#kQN)-eg!B9.[$<7pKUaKQ?dJSCJrA/Q/P3B35uB^?2Rau*_DL=3AZ$n@n@aGnB@Ccc1-M@+/l:eVj)eRG4mI?9cCob3>P'u^ZmE>3prI!bsQ^H_l"B08&/8J8GEiIgOV&$c);-ECYk#C^)[/hF]ZB1Y8n0j)U,rnl^J%f-_8])u?djH69QMaE(%)8g&P4%/\ECUO1aN"B.oZ0,Y';6oGMTTN;/!;AtbrPi>)I1Ljlo2J\4lZl:R?8#R?hfhpqnDnM'2DQk)@q1GLXj2[D&fNDNGh0K@!G1YCXgbcWn/,De,BS*6]DDWtZ[NSV4k;VcE=KF6$+XCk@+r>(Qk784#7d-:o^ciBMU/`,iO:$m,5\rp8^7-ldlJ,Asio`o_b/US'!>ZDn^e[o@Xt9=LmPdo>$lI>PX`,57*7pE_U=rCIHUt]dQ0a%PbUm+#Vnq2*L.&`Xr#9K!]Dc-=DD4o"?%PV-6SqsNFErS@CB]Y01rAk^HPZAe,/)=]9=a;^5Acq:#6uXSb8)2PMF&95Ak9BFjbG%6+oB5V7R;r`?1iln#:^S^oGq1+^P1o[hV+5pLbI9G;2H.MI2U_'FI8->?7FWpUq.?>a)RSg?G2X"N)a!G^lcg-<]W*tK_6,W%lbj69gkdkJB[@"*On^b'UWu.[MLFfWjdNE&T+CA*m.hgr;e9iT-O"'88g6T6WH.#VL!:k',nj95KI&N"UV0CcIP%b"aqrfHeW*D)e>qODlICCEro32_%)#VP3H#g:>f\u9Md;co8o9PB4HqtpHcQ)9p76^ujoCc5],IWdm``X>oKS)=tSV*endstream -endobj -1360 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1652 >> -stream -Gau10?$"^Z'Sc'4PQ,U!2bA5!.K0J=?-"ocC"$t.0Z-U<,&Dg1N9um!f^,g!,7-sB4!Q!=KLm.7frlHh,O%@7TSGalqAh3iL1C!tkCDU0GQs1XmDJ]"5*!t8r]WPf2Jn*93fMk8JUZLgG+p\-SuMg7hR7EVlbIKEGQ?d#]%dBo3!?-,0AKJjHk)JRF=,p0:M;A:?q(&9`]p]$[qU*_)uN!Cb"2eRf*Ljj;@8iY>d8rgX)?s)Pg[=rVcGGl2<`#Q3do>nqnCYIKB)=aj_ULqXVZ.al"e"`&1tn+31?YH,%EX@P^m6OnfKrOq.i#*%kYq@IPQ"/tB8kW],t%apSW(tir38eTSrSJ@Z<&ZoKgQp[aD7T'h38bK0V.2OPTXB4CiWn!^UR!u4PJ2]7mYtk))NLA4TT2K3QO!sBCd;p:3HIGl[;/o[ui[\0_7Gp^UQI!hJ"ArYiR)0dl4WjoZ<)cY4-;WZ,\5$1s.WftV&>t=Dq%/m,ElXh,k,[PSCbo^'BR3=&Jo4!t4Do%q2>%s"d6uKWDpn>*f=Vj2gi%6Ms'gJqr0b[Lf9$.r"dNU\@2b@]n'kX9ji8*ducgS"j!2#/Q"oJVd877GU968XT[?m<@>q)DM7&4*^JA,gd@ii*F"@K!pPdpQT>V"Wcd0FtoVErk@[Oq?)O!I0"Df&3*]+/F;0=3V`)d;WpNPht^@0uH*CP/AMrJ`(=\gB,ZE.0gN)QhD0Fj!bUEhcte$Cq^2c:)u3QKqIfsNkV8B?dlSVJE]-SJD]>9e.net,5rf][$Y<9Vf.O@!_m+nq.0Njls_pp(CY?8ZMPP6I"=V5dRpGOpl0h9$2.?&.,dmf_8'W,*Tb%@$66`p$Y'$FJF"(SZq"Rn]L?>2+pq\E/uJNWIsRh.u[L8OZ,rB/3F=+#7QD[(8D9>Hsj.S1p(SQ-[`2;k;"`>C8n#3*Y?r9aYXl*a^'M1paeO5VK(hR_2V*fWlr%=0e&Ij75..F:#R@aY(%Y1]0nCRHZd6Vf1ri8i!;3:LB^J;2;%Y3JNFg[<8RjYg[)22=H5=Y'S78t,l;jb#.SDVhMK2"Hf2^IVE>f5YC^f"+J+4_TG*eFVqmS1-!8D#7Jc!3$G-(X9-!mnR1+drnW1mql@WlrWg+DaT"tat%!5i)d`Xj41m!Uqt,H>HA4ioA-V4X>EOL_BX`V:F+S2eUKV%'+/e5gK!=P"b;olG8FAZjp/eC(W.q/]8G-j(KU_jR*ODaq51pV:LbBm'3>Z$KPJM[Yn^+`X^.f*,QPfEl)iP#&sej[@F`HU8[O^\>:3F'@TfiV`%,GVd_$~>endstream -endobj -1361 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1630 >> -stream -Gatn(D/\Dn&BE[0l?=*4S$JrX`d%V\Vj$t]?0tq0l>;Z0de-q6`/ne&_E+RMhP\,nP5kV]%$!S0&1@J'De;,'P^nH@U-=2Y^uZ-QD[6mnL1;?Df7i08Hl=%JrAZtbj]Kjtq?)(0T\"7rADe!f8i6T%Y/]+#f-@)P#;D[JgYLkKI3=igZ)(cS!hF*BZ;c4)iHIEOPc$UX_UnU*`&M:;#U7E*+;iEjA2%K.fee%a+iGggH'SdtLqPMA#"b=?q+X6c"T'XZlFt/CPQ?95pJs(4;DY(G=#3BrU*\t]?3NjPe@@mLPm+d4Eni!LaI;`@)\K.Q_lojGm-hR@E_7aZq;n!h;hq\$o9clRl(b*sgGX34&34[?Dch;c>sSY,`^q@;Qd@\`>;k)VN+F$tQqos2FI'.9D^rNZ(s364e4B4(A''>@Dec/p%)]J4qHa&&U:SB$'2E2&qL.D@oCXVXMtXi\kSbG+_q(!j=pA3hBH-5Q\GQZd$C-gKbePZdj+J/a=(8H@"[OMKd]P3p-L5)\>)_mJ['b6BK%>+Im_ErM>GYPHc"(+$3D?IQkPk>?hn!GYk'REElfa#_R9db,MbmJa;Nc89D^DOArcS(\a\9_,rZ6@GeFVmmNR9sN:mb8Q$bn:UUe`GD6MjODp`\d(>U^J\6mWG=GCe"jIX0iMFf1a8p[)nEdK#=Ss6O/c':Jk.\IK8+'a4speK:*T%@l_g-beq2J@;nk&[Wag4e!srDq!24kn(->.Kl%+]J'7A@XW_HXM^a@5PpDC5!^CbQ(pp[tU:hidh[)gX/9F^CN;5s[Hl[>-UheO@X@\YPW41R=6BZYAnUO?QK>p&`_CRBCb9`4;[P_m6nFOEim@RdWNDqA\^AJe\XjOY"jJmSo^*25,/.jA69[Q.HXCO\EeO(MP-'1HY)"+N4YUCiEdg84empVG\4:V@AFXe=Vbf));?l`H";?8b*$Sq.]ImK<+6fU47]B5b*3k?!i<2gh5WH8N2Ep!UY9-IN4YMj%A$e>7L$m"bU"a,n8+\Nn%fqp7hm!SCpHp".D",iLQ=Ek@8S2^E?Fe.8jGtY@j9(49luF.9-M?W'H);.qW#m4V\jq;feWa.!n%^+`Tq15W]fBKAq[KGrYUD7C1@8iY&PPiGfUA]8fK0ugB6tGl!BE7.#cR`6JK"e.H\7?@Dh].nr0Fe@bcZR+C#XXK32hO0S'ID/(XHRfsS'\p$G4#g8eRHCVR0[*d.dQOQ+#?/R\KG_g%dAS&fProKQlJ*-V~>endstream -endobj -1362 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1646 >> -stream -Gb!;d>Ar7S'RgRSs)?>O3.pUS]%J"1!_M+YXNS2p=B[8&TInmG,)[p>f?&L?%OoSFeP)A8)]UiCF=;V9cM\;nn3cjBBF8]5J?pa-`.c#ELu7l6n.+:bNfQ@G+-D7n&9bt4N8iZI"%R)HsXYsW>95kn/si'1cIh_qmI31.l:)=g#]>^3nI/%)01)M_U*4q88)m:&IG%aU'7,8Nd16LOJFSqgQEi8K,b0PEm2LE+&/(.:Ie+3qd&Mu$+`eaArS&LjdCiqV2f)B>Uc)D6CK?=^15@?4_)HJ.[+YE4%i?Yh+""jjmEq[";lJ9dSp5dNJ!/7HUBbr)gRSMD#iohA)-B?ZXIUH-+,s3kDr9XuLgQKs,tfS*`*rdphr0O),@W6o8%e*hs@L'/6g?,gdi2G2"=.q,#'A5Hr$`FVEMXA&C?M^uqC-6uOAqK.V^3#-6Tdk@RD#CY3iA?G7^A@^=UA#:eaB`i`Dc'@7:(S69!b0?16*3j?Z>B:h92ssk$I@_Ulq!QWe0F*'%s-`02H3<_aAZ6/lpUc]`I8XB;KtDTS/PhWK9Hihe0^NuI=Fo7/;m^+X?Z.!11tqTmR-+H68b7>j2o)$NhLZ'>,jHbjP>W?*BkYJ\G/Kr=2i59E.\gIi?>YU\GqO$`Is/fEd<%l\UT[A9(a3C=(J]dJ')\*9kN9^8RL$f3<0_k@GE@rt'%;4*GE-T*>X8LDbL?D]`b@\^_X\Vm/&L4@6YI@.5R<>)^\<@jpEGS"?IqD(ZSYIk;kp_s!?6p`eG+?*V:0VAUeS:n(0d?3p+f@>meQqB^R7bASTIiT4^Wou6Q%cX?R/V&$*=i?9FQ(1OFt*l7#(?/DpP>JfMbEoc9WsOJN%[s&j@V">:*)X=HE1tCpW9-N0Z99VT+IFGh,6tO.Aqh7@`M=U\tf%@qW05W)K[eM0C^5Q;I'+[3l&hQEoE1SnTB`C-B753+&VfhW%q4fBUVJja'9F2+4m./s:AL2LX\JT?;-7WqQhIM[/#D1u:E#J7n^5)]S+@X~>endstream -endobj -1363 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1389 >> -stream -Gb!Sl?#SIU'R^LRs)?AP\OGnAe<`%/"4F!u*ni27%I>Tl?mOIg-As?Ba3MFQ7EMfF9,1s9"#`+m'^LoEpKScrH\oO9+/HZh'u6:V>hgGe(hRhScGY:e4*WhK5PoPOL.Y\%Rs4rD&GWt&6%KiNOkN&0hUu:\iZ^3Z%kq5Pl/&Cr4[<%3Z)'Zo!Mb]Rn:0XpR/O-ngZ@bK[r;ZFQn1LCaANq^q'0^A<%b-Mo`a$3V"C,bpfbZgaoCPi3.cJaOW^-(U?A#Zd_J*2^IJ"`W/WN-Rm$%q!'mNSt?00dVZ"%`dg,j-@W(9B\+($OE6HL9^B"/t$'u3a-nNf.,(d^5MKf0J]$#r6`\6P/*&UUbul#.=\>rrL#jB&&+u&F%3pD&._,%pGKd"X%`Xcoe@%umA1IRZ3FDTX*%R>j#"r3gXFX)YWuN:bE3ZD:(EKh&%sSG/C#6Phlq0ICm;?2<>Pmf8:^UE7T6(tcGjgkVU`c@/--QO"jVt4uKo[N2a^V>mOBBJWMBS0R&9DE\s*8s>o@ItAC2:7VDB"f_mZ9K%Rd%KL39[@508S=Uds.eTTTjP+XQZjg)r$q_Dfk#Crsdf:Sk1OUj!#AAEl4k%j-7rl,nYlKJo+QrSj#'r3VA#1Y9,A_JVGjKD-2;J^d#M;\Wg!rqmA74=Rai*gB0t#L(:`A6Q#sqVL@3pCI'k(htl+&Q=ilHSfG451Y),8a(b?5Dk6GW=J8\WMnXV]-VuJe?UKu=&C^%`]A;"[(Qjc2&8;A:&c$bYOcNk'8;qm/\RCWcH&!LU[E@O?AH&$-C?DdOgIS"U9GDTXUKsBA.9e@b&>UaQL*H"4%B>i(&o\rHg95*^Bd:_DDRr-IM)d;ebAH))VK?,+.%4;uJgkG*endstream -endobj -1364 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1519 >> -stream -Gau`TgMYb*&:G(NIi.f(lCr8dh/"`f(J$2F(J'[+CLGmc?>,2(\=l?XU(ZYX9@C*t>EV?DBbCZ*A.:PSB?gp@6K"jS1>hU1i9^fq/eB-97MA$Q07_FrHl*kGrAZu-V/7(BU7jM6d-pip1lR0(UbP\u=#OeAlMI0V/k7]Rh5-Q"!/1!_Y5*l&3%:QM<5NDfrNDgij`BT!4qX;$K$6b4c,7qI#0&mi^Ca.mg;%rA019KH/ui;'5jgOtG:=:?4rQs27)m=D*C_K/&h]f,<-PUUmodL8K!&A?;XbXrN\`:+#W'5"@e%.7<.-W+.SdIO>%4S="Cj%s,&G@fiRf#6Kue;m)(ZRZ,C,N3F/n=VouuF^pp&]G5i$KDHE.aPf,MIGYHc?/J/E;],#oNCs=4%Q:53`!t%Y"%==".J#W#<%@B"$,q"5>,dY$1#nsns'$h1A&n#<(^76^_>Y*5qHeFQDkGF-+Q$hR_;d%aNElKm[@R_[_\^5cXl@+"g/SM=Fs(nJ"GmV3DK8/9bCmAhh#[7k;/oHMX?Y_`9=KP8(/a:S[?Ech5I'0(e[N\5DNLb3#`\[/h-^8ci\(d?jeob,(!%cDR%JVdBk&k%lWCQ@&P=e+LFc=VV%Bo-ri$$0adI:GCZ:T^2KkFSWgkKs1Dl6.Oj"j4Ql2H:MDj3a[g8C"ZPB&mL.Y#F0FZ[M\NbN$-Bd11j/l&hNP_0brtS&R:I`>WZ")Yt][3HFU-4,;jo7D@lPPrJq55,n<3\52:&/,;u%NY=@kCI&O;?/BL6XC;;n9T7c^r_ZJ0HbViBddif1;^"``pm.AJdU%OlS0YSOW`gc^=k,uQlZM8M>PG-HNjjEEpc0W/Veo*=Ue*g4MVGWQAntf[;2JB=s@ruKEFb"V(AorLHUCN7clb=42lZ!lLs(\':a/Fqf-+d@#m2ak>d)!sOcJ"%9hUhN?IDsOr.sXTkj;EA?*p[V!\@hr]*a%)$/%Jf.F'R&P?>,[>HX6&c>ebNcq,8[3S+n&VdeiAc&NS54Qke\JWY;"P.ISqKGJeUCI*UofW7P&UR0_`(aHm5udi3,I"_J!bD^eAF!cu`(oi^;$`=bI@r&Lbto3Ccj#[@X@Ltjo4m;m)&MK!t8'@t#.[K~>endstream -endobj -1365 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1546 >> -stream -Gau1/?#QJt'Sc',ofntYAl_WXq+JDiYPhh05UJL*KNr=;p/TB7ht+[@s0Q[mkB$hI$d1-[qtp[eTRkBd-CT@ae[,9IBA`1MjJl3&iO3_'TI,KFuG#0^06HC*X6,=%R-ZDB`9Jf_]4R/^*FP<44p^O*j0F'NP\TtXif_#1[1e(9h3N\TSk6c=gZqHrNk2?;@^"]4#?`M"D&WJ0tG#V9qT"`<_Km(A2N^@u3^)%JV4@EGei/87EXi<>5"bV'4o30*i8C]h+WKhBBl:.t"Q`%q2IU5`]J%qP?K6nZUDBJ`;JG`/:?ca22>\0XE-@-C9B#6#__:C_u[D-_!*)hF_AthNBoaP!n)8(!dXMMaQNR,Ubsn3q*[RkG6-0^1o%K),!N/a^5Z7q[`!Fab;pVmGflaTm+q:6VY&U5@Ue0!g],]j+@4%5Gn.n_Y@5QG&L!3a%ZIhQ&Qp,(a6?&s(__UZ^UlMCR9Fj*g^bW`gTS19^(m>YS_LZ>RB,^o"_pVf`;+2TXP34gQ0%0*kEF4fK0l\!=$5hsc.@BPA__@.1\DG`OaP?h]#V[=PLD'_-;MW[.VH%>X*tjLF:F5L`f8,@+hjHO.DO`m,2%j>R?9mR4;(4mH94p,LeM\$q"$K",bal*=rmu-9o_]_SP+uEj9H/D2)R>`NBendstream -endobj -1366 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1429 >> -stream -Gb!#]D3*[7&H9DlreJmLb#X4USJOiIi-\i(rfK>G2J&E4*Wj$]Qgs!5R#_YqlY];"G;9U8"T$<9*LEs.uZ;R!t/?(j*77MpJ,&I#)'8iS*It*?mLu7$2"IKUi6LtIjN/c5Xl:P_O(W%oCrR0ihQA%EcFqs([Uc7KSK%bR>VHogue/Nj-&P82I$s;p^+r]$Ib(B5pI/i+kFeTpq""?D0kYT0SMB(+GZcpA?o4!K2bIWg>g&cMNn$/]-2QA9r[eXEM&3Cj]D]H6^H$PYW5ZF:TbiQ7c30(R40I#;'"$%@LRJhB5H(Y%"mRf=3cr8+ce\+]kR"b?Jp#oNdpf[TNE(8YPDhmbE1KUG##QO7d>=lPMl8'ohS1VisfVJRgSMY!ZU?2:Fm(K$ImTlkEO6RU4Td1fIBCtJuKC<`FP,N;#8Y)[58#$\?;ME_11#3g]8-e$-@jTGrF1)mBtF^)FSL`?#S0JfAqV!r"Jo6:?[V-d+>Y,YC1S@'3K0T3`J_@//:;H7fUtU9!dtCgM)"?mWtD/0YEC_Qrj1hKR`T#87d-T[u&1g^*hm&5-d/Di`t?diHM&?$(f(,]WBt6;>'Xt06qLGH:63W%HjO5FC;oId""50ab"IISL4IaT]058&$lAhO#[N-nm6BI.c"Km1(8s]XVOPiX79iDOpmgfR:)NBR,FEUSEmA`J$F>l=5c6K?t"/e*48CebfYX>9%?&@gsikrdg3MX&u&1,Uca\-c@WB\dKA"`63%ar[PGCYTm%\7NZO11)'H4&OVZTljG;.9kF#2Q^*QLL3Jh^Z12OM0,[uFmsTVXMX)!W~>endstream -endobj -1367 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1422 >> -stream -Gb!;e?#SIU'R^LRs)=YZB5ggIh\tVX=VhkXg;-,bls\S"/CCmaR<0aT:AX9H;3ENQG"drdef[7p:aGM?kE,EZ+UAMUK>cY\"n9\LhMi*i';fh9[Vj"T'AQBeYJ+7KTmEm%l>Bu6#X$G];;_Y+V3kYH$/+>7MJn-U45]VR&Upa],()TRpNQoq]$-+[VrQ@/r[V[M^KYq2:X%-NeiOOjfi$Ge#YSn7JOb=L1_69/#bCJ_iT7H:*X:%0AK&"jt_Rt8UGL;+EoL?$;nkg-ts#EG9),XEBp1!lem3sbZ[9,f\m@<=ebmXZ.7#=$(IM/0Mlb,^bFZV7)>0`G`9Dj!I[UQFG:;H;?C)?+GO.I=$kjs*amr1slCNNs=EVD.IU^(>=L'WlVXj,AKGg,1i@Nk&m1.PiB;K/)m4?$uiqQsgb>O^*Z@H1"10HUGWU=b.Nr,_n[8(9@T&Z7en"K!Sl1+&od?^Ar7&WIYCI_f]?q8s[,_i^F<5&We],uA`;XWRpda3s(DqDFb;Lo(ejPkk/I6mgX$&W%LsgoFO?jIqNde(:4=5`[BEd^jpU7>VR#UcOG.K,i$?ijqZW6F]b[d5\e\9Q$Du#?'e7S@VTX.D2V%9JFP4?nq%cYjD(3*Os2/s3l5feL1gRO^QTrZ8=h_g9h*k&)jXK)If/?p#,Lnk.@Cf/4oK@;T1JCl^B:\A!W_)cA.t:mMBU[,4/MaVe:Ep;p6lS=N1p?g.Dqdg0?strg^1(prQP5lHj59VG6Q7p/o(@;!NR($_q33t0oK>o_2UZhMd=tn3q@B`!Anch./&ft%P*dis#(!i[.DOJH;:b0'DX_i9?Cg"G\*(L4ZY.u)YEHrN*_gk_bp6;tc'&oadY?3gh0d(ME?X&[UF0E7[eg[L<0.U=Q<%rDpR70tKcDan"eLD;,rc=O?18jL%QPHcE8p#6@unNMoak`&D(mendstream -endobj -1368 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1707 >> -stream -Gb!SlD/\/e&H3^ns5DlHRl`I4W#+2,[K:0sTE14M>PqpF1+]e,gM6@]MMgGD^EY&ZZ7K-P4ESZ++L+B+meGSn_hTFDiX\n9-R$;&&bI[^&.:r`+HGErkScXF:/ATpSrdEagGeu#jUi=1.$WitDlcJ>I0loG'h[.4;m0hca+VWU-YG!2CeAgTnYYIWFbfb5i/QGq3?UmOu^]2i7K(0Wr-WRmBRKO!!"C*5qd,bns;fSLNY2S4u*1q:8q,2u$-h#PN,KK,pa%i8tfD$JZu\g:Od$6edUV+jbhiM-s8LnMl2i+0[kH;#bj.rF/W*d.pi(Z\o"K_Vej!N3A4ahrZH#JKHUcXh-LsGA]F;<5d\m#ap0*"/2:Y2!(CDP16in.FXqi+=H$i^Za!Z;R1&_/61KD*26KW)&h-"Z"\=i\*-3mOua7VjNKQFrR8TI@ob1D[U-O)uQCba(8B)\u37@4Ztq"E]51N:j8cQ-K7UP*LmN;HRC:-9*Iue_C<_?[dZ7+tRYo'\H3;`aa7]6#IlKH`JX$V!)ZpAi%0V5?8AXip&8NRTCdX/PpUl0;h>Vd/hBJePM#a@-0RpVR5]s6p-VC']Y]E)hr)+\gH;[""WMN?E.VpYQeOEYB\[N75b-Tu4qN\](Gqt6_#?.[_iO+*Uq*H_<(O0f(Uhg)4nPICGGBTfkDqI,,oPp3bM0"mD#5?%BT4\]ar['Ec?Ji53Cm[oq]_0_HLYF'97j@W.k1QHAU;Q=.tsKga\Wpk,XS:KK)KC-&r5DAnFc@<=A'8aX,KaeN:&'h%TYfV^OK;"=siV,i*FeKLV#%=#19?kendstream -endobj -1369 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1554 >> -stream -Gb!TWD0+\p&BE[@-Jr7phNW*l@eg>cBfhMO6Ee(ue)olTDOS:9C]S:0`(B(shnHD3?t0Hd]$a5=L@LXr^%uGEqd1Lce-G7,GQdN5#H(i1aG!qBOPfW&G6O>Hj.fDj7qc/Gk^Ans)c49-4=-@4\q'oeN*YO7*T%b,;`oShK,g)Bp1H'"&d:k.8?$Mk8JAT]OACQUL?QLQ@uF)oJj0fNG[Y6#ig@T0Y8qm(^2G:d8X<7T#+5`ZAYpHbaHkkN-J@nH\K;#[F2sOBD:S/sdd&n..4n)\@5^YNdlR+A>GabS#K,ot:u/6VAIA+tRce7^o3"3q.mg[H"eW$[97RADX_D8PlC86Z;Y^MEF?ZSY$JXJhRQKo;4!jkjf6Vqn"BiHesmb==Z5VaMH;b1WKiS8Y5];m.l\q0kC!rC8YGI]"Hj.uU-K+_S1iCRpOhShXWV(705[9f%@\9^QbH_+2$QS1C=Sd@80iL'Psl7$pB=3D\q6EWf'i'k7c?4f-D<(mQ;N>(?:b06'),4)%l$gl#P5[k*Pb)NK#%HOiUidO`)#,X8R^6.@gEc!IZg-(spTD(Ws4Y5)oq'4>IWX^?[q3?TH:b6161hl-A9MekL3L^L,O`Co*`g+Xe:s\a;i:D0%XCQE&hRiK>ir+^=RGlAL%$-^)Q:[aFi)=QW%?2(`<(5#XY-kmWGo2Jr`4[WNZd=I`1-Q>C6j8RJcj-gHD?F@foD-n;Y4Z<4t%V<;'Yb^QD@F*B!jBdp4RH):(6UfFN^WqJgnH;.Q6f!DEAT$qs&Q*LI+B>NrILk=k\?XFq@7P/eIg7ZM)al^j[pV/QBg'+,'ra,jOEaD6-XW<]l:Tg+$2)dc^FdS;N[nkKGZrYZ+r#SKG$*(,Ho5]joZE-TOe]1,G_[/6QYs+Rc#8V*R@soW36V6@:8ckkW)@on1/]K>CAWqLi.0H!_<;3#H35n4nq%Aq=i;,-RXDX#RM@;L0$qNC.R#LWu0\7GGD1/ke?RTV&=<@Wo>tQ%2eu+4[g3:nTn>sqPpQs\B?c_Y(R[=_23epVfD&o.;i5rt1pJOSP,SJk-F=seBp^)k3Yj6KjH*gRN4Y\FYD?DA1`W~>endstream -endobj -1370 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1335 >> -stream -Gb!Sm>B?i'&:XA4s2.U'8>cJ6DPkm+k%%6NFP<6V)l>89kbpZYK4:>Bk$\XFaV@cr'8rWo!m^0$u/14@cB+X1X!hqZJk7IV!)MenKE9g(6,P-h`cJsN(4FC=1'Tacoo0lOb2QLWN<`?CO:91e>Da6\`h0JUeo\hb!^YoL-:#39qJ$23di(Z_g[Ni1^l-eaaO22X+WP,mFF%:Kp#g6rbn[K#f*p.q?7q)/hCS=W.6dD*/A#l/*%l+!;1kk]1">^-+`ne(+GKYroa-0j7*to=U*h^"L/g1H\X8S,=^`0B6"kk]C$tE=l_fcbbjkp/<$APPAV_ftaq=h;\8'1jC29!Q,\=9c+^Ytmq^e/7JnF_BJh1T%V%j(T'3;jL0ZQ+P!K.geii+,4Nn9chZB5#ifeEK6g@Ek2k+ZAH=_7.Q[lh_!/W_-TBab6Yo[co)*.(36!F])6/?9@)m-dh-a?1@G#kJc_WEt;:4C6K9J/a5p-j!!90#1V_5[G(+HSRT%9<^S@_C>H\FCM+T43D,5P&n`C&J9EQ%BG'r\r[Na\k_**K`:=jKo.Zu/mnsdp8K5P2\3:MS_7N@$BKQGdZX1)5'8"m#IrD=,mQ@qCX@AlCO2(&d8WDHMp?cccFaB"Pe+0MOP-sgtBI0Sg1l?KgOPAGf&VX/bV^/,j=cMjIs3ST\!P@Lf'c<+&jBPfFQ)h+#ng9]YsG`L\FF=n+fF>W/jn)?lUolGq\q]'O:En=H_SaH9H_:Dt3-@Ys7R[,,m@drg)$6r<4.qUV2+!F-+oRG(^l[@imkoYO12L![s,Au3?fq=94p@7YiA(eChEsH/(9+%p_KX<4l6L7gSA;!@/B-)%*/qWKI[O]Ni4p9Ka27fJ*2^Jjj,d3FD]Uj2[=ZOhSAjoDYcjkj][T.lb7e\87)YGjc=eK\bb6("r'#t+nq$Q4>N;k'iE:F@tJ"9k`UEA)V[aRf4P5MMU83Wg5oe/?Bg0oVVd_%])$`Q!gAA8R&r9lbSn_Ze(72RKHhL]endstream -endobj -1371 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1337 >> -stream -Gb!Sl9lK&M&A9%PIi.7B'PgpK4tIFcJ[?A+&%fVpUI,ie*`SPNfZK@EdBVM7?](!jad-Gj9S-l=^knn]B''QcELm`/iWmTOBE@U5JRcPE8qttp6VtA]WQlueTJCZ.7G9%5__(`fFm,B1^6To1nICIp4U-5PE$)mZJ?D:$*"`X+V-%`G+tjRV$*/QB(:c-\UHc_mn]rdD&_PA;\[Pj-I$sS_r3VU/%Z#nY]pC8Eipe,4@HLI<"5s@,uc*)4B>f_QNP35*7O'0sVo.5=40p3Y$`Vh1NZbuS=Q-3!Mron!o2OE2QueW1R_O824!DUWqEK#Z-[cNP_fHsGmhDa_g;jPspmQs^Yb_W2la+HpqJbetR;<]f'%IC,Pn:T9tQiLIP6%\[KI[e>[]Yg^SQif*@u>&nS7%?bZrp8HmOM'!#$;0]?]T$`&^c2B#H6S5tKE4lir>a\d5j^t-aBX/H,G2LHDb\CcP&K(W&nGFtb9Gm]qn4#M0SHaMCc-AW``0<^R_WMHV(%n^7.d3gRBWlsKX7d%EnJiAZsP\QgRa%fqeDQ9gWu^ACMmmI4rjmqrd<3M64Pk10ue,u'2-]d(J0Q[/P/WF'(H8SnPld3k&J5<@Y6cP;1&O9gf1ZW/<:h&Pi%>f00f(3RVJfE=$m^pHD2S'eE(7:H1NoNH1*-P6!5pObL<'V]!agHoI^f_6U^\Tc0hE_?M`_EJRMY#gml$gqK;K4\#VBmAn.lR0S@FT0T!&Hi#R;(Ggj_ghSt4G:s:`oR$T=)7Y7,~>endstream -endobj -1372 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1322 >> -stream -Gb!;d>Ar7S'RgRSs)?>O.E/BE(J32^%HuMlHYCk<(,hi1*YaO@2<^3$FHcFMQ_NPC(H\?BUKca10ZA+SNuu^DGYA7+Hm/0n8-",1iGsYQ@ITV6W(FgT"0_[pZVTasW3WfOe+'Yt^ibKj4NEYWb!8"+D6Rm2#YjCsn.R\7)`b,)a=7D&e;LNGpcAi%q?$SEAM:$/NM"!n1UnsH+BsGZNL[t(+^c1m3&Ho6s'4OZ;uQ/R-bgZe-PqMBK&qZ.F;,:$U0Fs;[2(iKWnW'hJ[9cDD/f2_'6+do?U3@l!cM5'D`CBl.Q!8d3gSA^>0-$JQE(qA/9]&hq`0HkC_'T2]@S>8fjdVMWrTDsUQ@'[9e;sU=]%&0,KFT^`cfo;d,ItJ]U[[0N)Ni`i<BPK#j='OI@:.3:(-G\)(;c5IM,`6>'^)XOLgW*>/^NKLgm7IP9.(sE;?k5.OX*UPe"bFI])o#>*OVTmP2PBt=0mCfS(!br&a"qNUPBLf$DJ5M=qeiEnOQjo$/Wo``WfWL'V$upqupU[RtQnTN,ffi5n)if1f%6=9ohM%?=p1`Y/f`?%BF\DVqrlfR]@uMF'0osFJ2I'>pUCO=E34n9'Qcqn_W[]*K/c,Rc5QnY;8%$53'ZWB`f!(n4O]29']/n)o/30Bq6Wh'ZF[3aS,P8lDpaJc(9u(,=""nnBR$&hj_o1#%[1haXRG,=mX(C<$q6eVt@<%VSYJ\:JharS03V^42W"/jQUJR8l@P)))Oi@,FopB.bV"C$V6OrW`HAk`$8a=a/Jm=T!8H)XU>?nInAK07UVVUG`ZCfY#<4;12q]pKJlB_SP?Tg'LqL+n,lT'5/HB)5^KfZ0q@[?7N'QT^MZ.?2uF>_JZoJmTHI?fHpBok"SddT$PO@NZGVC3R=Nu*Kd6La2N,BRJt*PT_G]hg8G3VK1j/lAMs9utoL]C-rDi2V@?IKc]/DL:tWQj,Q=!q(Y,oiG!CQs>F/DGF3M:$iMq(Uendstream -endobj -1373 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1214 >> -stream -Gb!;eD/\,^&H6"8s5DI'F;d!Eo/^`Peobeo\onb_2YJ9t".;JB*OE3OolHYmP!Fl';7?ga+M#F7cTV#mF!*0T$d$`2']@c%ZRu<4_&i\54!s`(nB!mY\iW)BKrnp1C_(ju*/AWtB7&W1Bco$7fO1ai+lnM6i(rJ%Y/H<:5Xop,6b_1i>$!NtL@P$Qr*SGG.F,EZJ3T_]8n&9-DUFRnr[[6WGPU+\P(cL\/QO>]Q[K4EcFVRN;!D?QdmGg[75S"LMO71.07ZD"_5&'a;acD,dD(qs[8P/Z,#nAJ"V&DdPeL?C7.T9X(E37L4<+Lko->72gd^8YS=W\59uB2bQQeAt>HNC@YQ%o`?t?GB/cdIOA#tcn&B4^E$kh6d871G3ZXCT5&4S4=_C1@VmPkon=n&H1K5l5RN9OsjbU29kmBC;(jjrbqW`BhR<#k4rmYi3V7`R;ZDefVJflpEgI1?,sh_)K)bA#[4EsM?W5NS=P^H=Z*fkr%u<<-.E/?]Z(Z>EN/0AAH&9N/a<-C=rP4i%?A**_973?9'ffgFmn=lt'q"(/F%N6-sj`>228ftHJLk:F9:F4K\f)fBN3UNMTQe=\S'dm[Fc!qPD5V=Off(8H*FOO7M:'WT`$pe$0\cKLK.P#:PSjk74lJmQRfN=E]F)7(;Y(W9e[E=cf"kC;5==f)D"pY.<'\=V&o[BLrOCA0knY;'2$BM`3]@&`&WTLO#Ndrk>pdkuR3>pf8'C7-tc;VQM^Cn,pF67VBeJr[,NAK<69mYfj.s+)PZhM6J4&`4:\>GU`LqNXXVY11IL4DFGgT("c^hloaR;)Y\Q/'?Hi^Xj2\M[0q"@6C=rOGkY\g0?erU(T.in1KUUPh+[WkqVH0[91R+>q8rC)^WI67p)K8-M-H*&%@O2tpoE_6>f%KNnGS*Fmg@J:SbROJjEfFA*O`HHS7ukoXlV^n$o8-gl'T!>\MVP/K3oqE:/EM3#NLMY+XIrKFhGtl>)gPUSTLj0RR8o2LWf^LMhGLRu1e'_P)&;s?+c)%c%qAc/_dkII*p=>3**FpS&OJm4+s[?[.2>nU!c-,+l3')u?'uMZ4;cdnSmfJnOms\=>tY9fMhH!RAhXOe9X/&"!J013@&kbS?/nN6Pc'B91"oBoa%1@LlY7ZO>&=A:R=Jt@rU0j!X*bP!#R*u0=VM3o(Wc"''c\=o"fb+):&~>endstream -endobj -1374 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1510 >> -stream -Gb!;d>Ar7S'RgRSs)=&IB:']:e90CJUeLq"8Cq`;0OXJnBShSQaJ)=)FkpChMXj3AUkk&Z!eCeJU6!6Rhmjg3LAW1e)_;$Hbi%b%!A\),&'12A0Y;s]Zh(M!k@\HYCHE3M2gkh3M^QSiI/0QNO:UejjJ0f8-C1")V0^sgI'Eh\'e_JpLHiRFO@;L6@ZsWuK\:iQ#&e'B@o2K+H1ljlnV?tL6?,g<'[rZ+#^Q!8$H3$Ve=k(n.$Zq1'I>R3$"abQKbZ?H<^]>@S,lcpP*gtHQs??sV]l!?$/)Of9JhlA^P7+@W-3pT=+\2u[W.\=uj7VWdMplR]$\]J@`a\Z;fjLa,uo2J@/11)s/i@j9eW`+gl[Cfb3`5X^R03VRj)WBuLTmV>:L*-HF-t@jsT6ifo%+bV,SN[V6Tmhm3/\lp`!P3X/kurL]-0\,Y$ee(D!rF2p(ZN,ia#<[n"$W`Wj+8Cr1!F^4[FcO^u75/E(ph2/!AY4CG2PBEBZBKE;+iTE;j[1GH,j?hI@*RblEC.Y^gaDm_]MM%X[H(?Z9_KA'ESHGb*OGTf^J:"[-[)^aMM8]Xe090:XE*OC;o13:k":=@;#(KTHrlYAC39tACEF[O$.R4KZ3sZTs$K@K(4rn;s;/jFgNcl/%/otG_se%]*AYRr-_OPg.a5Z1I8HQNS#/8GnZicmf!X4gKGZXg6(.bp#Q]MC$Xj9^cE5,QB5E3Fd&TtCqREj_C;R'6[H%N0"JGU=pXMI&pg?q`L`d.8%K]0c'i*Cm>8kA?>nIdGdY`@_FMlLht>r3^UFA]nd!u[E8,h@s#-L.\*Zr>&7L`h">p`jWK]$noE_%Jmf'$9agfkJ/;hoKCo&FjDhOqtU!2,Sk$VL"erP#>j`0h6Pk&CkILk+f[?B-6o(PkHqG#Ja*L)s@C\ef)endstream -endobj -1375 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1327 >> -stream -Gb!#\?#SIU'R^LRs)?@5FdO23e;#nt"1k@YC=[8\Y_Qg$[)>@9A]^dIB'HKP8L^oT9.jMl8^X2-U+>g(n6Y\@K>VS>7Z3G929UXr,0/q8K\`VccqHV[&UAon2PPmp"<,](OUe[GJS!'`/lu`X)\DS,,#(B.Bp,a#+[kZ--1*$Ne(8l6o+&q8h[P\jG:6U8M52lf*`WOrKGnTh012bP?oCc/NBidglco)I1[>$H/Z(FOOpT-haXtgH`Za]3(@`p#l$WeN$hgQ1R7qp`F.VODYV\MP2t)eQ:k8_.Y(K.Y6_rR;NP8DgX.2\=+%)r9&#F?2Dt6ebEO:#$[hqg7H`t8-Vd>T%K%@OPkBF-__mmNg&a*^D_+LQcB#>gS".?HNd,5!ZcbuGtc+:2X?KiY;:m>cFfCE=DCBk42YP>[7J#R&Tr34\UJJj+2sP_F+CAZ_>PF`>V_Nq4l,!P9$1TW_OTIN2^Rgm63J%!DU*J1QO:6\PIa0T3gq@`dSQ5Xja!7_eQn?*Sp;sV9TTp[GZ42b:]/&`2"'`GTpCl0cM7HS;\PIdDdKT'/[][/U`99@2FM4AB/&PRA*uq)[>+i1I&g/1%ZROR&5_(X"NcpODaT(c/ErL!(_tN4T5WnU28nEUT>*5_Ae#4"PZ_j#9<'pasaGuQH>hl,\gi]f_Z;;flVJ]`jcPA:HXOUXqMNB2)os-86Cl%OESaetX_8:S1j+01BebQ2(#==12n8XBlJqiU\P8XtM*j!:M1ELKh=GEI)Gej;d0n(nS^A_puC1g]ac.qc&jE)&7O]$&M[ZB8L2Q5?ql`R@6)10E-EmDDHZ#,J+^CBrdLALiP3'[9IeQ/\M~>endstream -endobj -1376 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1385 >> -stream -Gb"/'9lK&M&A8=iIi.Oo.;E):Q`Zu6YYF+U[_$Abls\?F/^Y0B[-1=c]]lUQ8NDoL9/[f;'=8#X"HGM'4MH(\%L7Q[IZX@EcN&D56[sah\M0TVnp9f9B>1FtqK6pEN.4Z>^m\-ViOZcQAaGpC/iL?g=F?)ME452??`s)C4\o0GmO;d:^5hZKpKI)l1S=8!0B@j>E],JXM8jD;^;,$j?3pJ53G/lY\fe%,B'"cam#?n1qF;cD,p.1,C&_W@SR`4+P_-0H]mdS"mq`g.C$bBA=ckB*)S%Ch%[Z`SRuIA[nWIakk.B,*F17pZSWQVSEm^Ga!8ic>LthWbQU_L7-8CZ+hT^7r&n7K(Ze*Fd?s4<7nk3];eb'!V+TPEpa>.=mjB7Uer7#(-cF0lX`@@($+Ca^[X"H8+g@m44!IHf,32n[t2dcq,Bt8IU>ekCnu^b#&1,X.$5'B;cM\N&k8>5]C$81*`3o6ki+-LtnX>+>cKe=q3JdiO(rS#1E@9q?_8b(0mV7d?uFUYQPX4I#EeeYhtR$r)b8L!lUQ65qC+mc0.C*;o4g_D)5U/s@%q3mT;r#^/S*&!(ET+9GU@p\1X`'gF_,-nQ:Tf^j'eMJ'GAbh>4S4*c8XP46%uISmqmtRceY`"eq]H7FHj$^8ZJALQ!o[0NH`lHk@6tFM@WsR*A=2qYS0-kU!%A!2J9JRTP/POpsr;(d.:I3mB*/Weku=Y*Ao\Cs%=B?s%>QcXn.&lfpf4VMbMqd$k=[s(WYg6%K0\-/ht,E8$8QE^c%#Lg^aG$E!ldT=U(BNZnoE`]1@2n:s'QY\WEq%qSic;F~>endstream -endobj -1377 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1500 >> -stream -GauI8D/\/e&BEZ5aEKW9:"5k[6p4_knu-`)ChnA3,Ka#66tnHS+pq7'Z!?jDdb5$4/d/-,('6igZ0L&&LC[[H%(IY@Nc^m`VXbopBo(]Pdc]Hh;E:$4`39u"ld>%KTA.6@r?d[7`UES!#D0OH8-qm=D5D+G;YThMKnK&DDhdkJrVgjGFO4+s6e86Ro=q7Zh3Td9:%pWH*6I\Vs@)SJ-gI\_FPXa.-%L:kfdI'5M"j:lYdZ'tfX!-4ND/M@$4,?uT<-E&,%u#MUHeJaS,<4@2Z6>@qH5TK80Ad_'+))G)+/:K/691%#qCgk,BUdmDHl3`eKp6iiC%h=FK[XEV]e=ZSi[Y-5?gB:]`^lQUA"j@o>Vn,S]:0_$M-I3<6m:_>DltR^^D_/%j5n0/%9Wuk4]9,ue%UE2)DI`X@asu@$r^oAo@E`J:am4gfS43`b7sokkj,=SG2%TkX5g,B@<(JTtN._N)]6mm^_S_f,nMdX-0F1SLUsDpa@S7UoFtL=a0T+H'N%KBY`CLBL,)3o'^?5cQ%g<2Ls:;cn`5&l11%7lE/(GC]D;fcN)m1S^\?KF%o"3MdL=s1Gn3rPHPU0.#kcSF,,cT8um:mNYbHHs`+]n-j$B+&D\BqP;=3*7F2\n=W\b3Ijfa*n)CV!d6HeZN:QRH%U=2]^+@Rif9*/qPPq-.6N]>Z2MrCqDR$oN5@mCTuNG;NOk%$$B/4ooiF['J<\TRDiVlCoK#4aj7Zbp"=q,k`n.im4]aA@oOLl72TF01bld\uk]"U4_m9-n8P,Z.[uuG?"JiTT(+i0745J$G4":ME0A](D],q+ZQ`6i<7Q"P_Z9`P*Y)>@enO:Ll&mMS-p5m-]%b#`QYG?X$:endstream -endobj -1378 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1374 >> -stream -GauHL9lJcG&A8=iIi.fe[7G+2?^;Jp!_HU+%k5l](u)r?&%"d[gra(ud>bKI^*MfY9,;(FL(d^PAi+G_b_VuBL%>]-AdT&(.7OWLgP.*#OTP/i^f\]6Dg973cGUW$o+)jTKsrjjSCEkb)19=KX9>PkP4]U])te9W+.CJ=nNr.P2]^u\b[EZ:nWkE)-c25BFm4T:b?r*5m59DB^!/;h$93#KP*e-EBIC$JiM(5-N)m4F0Y$WD3_X+;u[P(%&^k*)!`#BBkWp/[7%/L%Rc0`mR^Qe.n\SA;=\7G?HV4E$PL@1ZalOWHnDXE6@+8lj^\Z[^"l8`bNI!iAGod!#$.c89aRK^l0ZUR*RF.CSei,R@.-HQLX:5Lnt3+X#6,_\B.rBRk3[S:[n$E5c)l`L)gH,+2TSZ>SV/_:aF(3D"oJ,.Cp6aRQl+66Y(Oh;Du5*]5.gO:Gpe2]0]S]P+ZgZDs(pmUW!1b-XWuh3>@mia"g<^2AbF%\(m(O@XO]*g*:\_H9/g?jq+.%2j43e4udH^mWq1D>K\QG(R,3_WitF)`[63[F&+\PWb0O$^-O,69.RR2OmUq05^]WoI4aPd1p^>X8?"o5FY3qD+^V\Jc1:4]#`TM_7<>*,ad$STFaC!WL,];_d0OE1QY#17@J(-1hG&-RPOZ%Aos9!!qu%"9*e;;O>p,%:ma$4GE1aOZu7`Ef5//D2[=a81kV1UQdh*LVf+L/4:g0uIs&9:YEUk52SRp:p(3pdD+0r6Dp"E)/gki_e@:k*AK*9'a)9\TIkXXtB;rZQaB]!A1WiSt[A/Xi=;qrTs(ActY+gWJ2I/(;j2iZRcuCpG1I@uqE>Dc-d$-,P:((Em2-+ANQ+"1OrnPlMng4*\Xn)P3oeKpFGMtg0C"qio2K'n#CR1;"C&$)?M2"em%mXc^Y\++8uKUlnU%]t4K2fDT34X;Cg#[A_1M[9-)f"8Uj!0>hi.HQ[T%JgPesCe>>6Cr1Q]@VD9H^na<55Y]%2&II_SSY9m=e2"N'i^05#u[56~>endstream -endobj -1379 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1445 >> -stream -GauI8>Ap9+'Z])UjZ=IL9A""H0O.?&`P2B[T0_ODq)?DV/?N@CO(AK\1n"65#4[2Vq%C"LDEco273SN_"L_3"4#4X-am5sGOPL_u@N_Ss4$?i6c3XuG"EU(Qm8D6JktA-d3PEH8E-'f0pK$C!/%$?D7i+7!WhaHT(fF^3`8VP12`N5:3DORk\-j=Xe)QMM,pftjHB`11]HA@8cEEZ!W(s[h.Tb8[_StJiXoXGuJ`0+JcB.&jg#4i!:0R'j&C#Z\KZ+X5^EJD[9UWjM*TX7m!)$l#c`rQjGqCbR1&NE\7Y*(f*JuZs:9tXTSk@GG.<1fq#:K$>W\BBh&nJZAb3%'l\!B1+?@k]+KL(4<&sq3l2&REKCDK_g++0'rTSb$`W-5*%J>K7d!6;Km>AL*Ld%Fe62FBnk"JY@+!l_42"u9d7phgkrScDpeRq6V]iAn]kdShm0FfrM0_]@(*]:([S2!5H,?p*`9G_'p9kXP#IiIM\RT!Y?I.A]//A;WuUmp=soWT6(W.p+(5P&K<+OlCQWS)d]9OY6G%IAn=,A^V_XJE3XVV7]:E>O2'bM`G?3gj?c,XmB@gY=Dc'b0-]Rk)4c[^WG-V0;6L4Wh?^3=ZpP^kJN!mZ-;kR5Oc,2*OS#.A()V6cT*g68aq\#J+KJh.[rer%Ys[3E@^=%+@5-d/-P!XqF_ma?6!/-Vb\B>:g7H/boWc8h3s7*mXt[dWUVlp>*WI:DY9WmF;H34CCXq?o4]OoL`HHh>!o1IDfkWJA"76p"a-2T;MSD53&qqb,L[j^R1iN04sI0(UNbsMcooB,YQJ(n%3s)lgV&E[>NW5]97bqpK77j6oe4Y5`eHE#LXHaa5eu:$_tUF_$`APt-8'(0fnlU9KYR1-7:Hhp-@9:i,.mOf=&P,R@;m!g\ENpZ~>endstream -endobj -1380 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1445 >> -stream -Gb!2/$lfO;_#*WnjNHco>*!g>JJ[5E_/O&u:uDNJPBqbU#OqQRM4=d8Ae(/JM_k62_2d84f+g\tl;Z,]]D9,4#eEKRESl-Lq.>gI1e)#W0scOWN$P!Q#"o#>NBR+QOWt8ri=NOMiRg(dd4j>M3V.P$G>HnI!\9l\6\+D(F4/P*D9f'2+J)<28k07Q;]KMKsd1NM1KfRHN0?I7"\FNb\HC2)-f2$bDJdL1H2mcH3O&amSD[S>K5b-q=RgL*#Wj[Dq*#4p;1[Y$/_6]h^K`d6]lp>9OY8Tuh3uMY!p-!9`_==QnrN:EDB^1Hb$*sE)V;YgBu@Q+^@Ne:]B@rZI)_/#L";R3+1WMj@YBH>a8/<=3_1WM"X)[D7dbm7^H'4UVleAR-M.jGJfB!bDkq>2e*Yti_ZfOrthXQ&%u#CRdk4r(M@L@8duIRFrNJY5`V$RQ]3!t0hYjlgc8W`RY.egZd/LT?G!Y/4bEFu'nDc[!.5T-as*:NnS5I5Cj+*@Fm4R[,bNtkUP(dlrQDCId0&co^=s+nK^`cVqCAiJDO9]@(TNA(MP:p,0)fA5't/q;M[SpG/r:CC6X2T6q%q[`SLO~>endstream -endobj -1381 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1314 >> -stream -GauI8?#SIU'Sc&Yj?IUs;MNj:ojrL&#,H$n#&$(/(!q-I/ng*I3D6)>dC$;f?V7V/q.o\iF,U5s?l_k#%aTJi^7rP(5IC9G1.#<%jE='#F\%l2l?,6&^*370p!r6k/%Uc6K5NA^#*eb+DO1ibJJhSoR))LU)+o7Yit?F-X?,/VF(1J4]0('RUF*p,kH2M*VToVWs)(8*@tuPP\G5_%oS^Ubi:J;0,8+UCiTbYR5<.O&,AXdS3gtsj:::)lR>ofi&7Ah75dHoo`pSa'Ubrd]0%.3E`kSM$>fQ&UbLt8@e0ecEYNfCF,c1G6Rjf&.iuGAs'YR3hh.0P=NXddeEd6t8`,6O@fq`#m6JfJ'fe=Z%D#3NI].Jnd$EZ)BPhSZXbQ#5T,3c2-_SehNpOqRRd`:,*jE?]:`b1/>KhO&am8YZnKmlYic^SjRRBU"n9MP;?S[7Zfb'M=]<$&U"p`Q.#6)lb*4Q?(UORJ3_Df4]6$MMC3;KdB#D#;t7D:M)JU>PrN#Wo6cD;tOJ("C$[VQ@.6OleAiPfu\H[.XBT018rmSWl:ZL$ksW[m=.]e3chmKq%9%#ursVh&VlRfg1(6)k?>J\'!m[dAu55qie=.c/X)I^&C$Tlo;C":!`<4Rb[-I-YJjU2uM!Yg"CoUHR!O>)p'VLQ3C]mi0q`?,`QqAA5;c]PDJ=-=@&6>:IT0\-K5EZM;f0loBr%@krtlih.a"0GbNH#FjtD+[Q<-F-8UL#>6ZZlW]JQ\I_'FkMLSq<`T+uXZ5_UCD`K<`MJ%o3IN"[/a.U[Pg8D;R[j;UPC%l-#=".-#o)8AKd[+_tE#_mlr&]:DZfQ]kTM4I;[ItSP8l-]VGehZ]i*;Z(CsH>a"ERY@pXb'E~>endstream -endobj -1382 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1507 >> -stream -Gb!;e?#SIU'R^LRs)?AP\3o;4qQ_tp"5L7Q+0r"9N9t',""i!1(.iTs]!;.u7oHWEfhtM3_LTKFOi9u`nF5;XHPcmOGTl`#-33K^E&U7:Cm`EI\U>8@&+FRZIJ)^u$5L"@htI475VO$7I2)I-kc"tYkFIV"of[t_iW:H`HJF-tYReg<&%9uG/YMi>1ulcg0_neW3^miQ8!kh6]Z;FmF5Z&u.`NXr/&TI>$IBm[>mj;128Bh\63G7D,F)]JJ5@!3P!k3SLBB6\hReJK$-q+\,UDK??sMDQu66]8iokrn#-fjD1gr)%fZ+O2t"hAo)X,.L8V?Hn$E7P\)bb6.5Um0,u'QX?/2WH'63G#3:j-4CjRPO^rpYIqJPZeU.sV8IGEak'pD=4.*k)hMRHlhB2HeomHOF<%FnB5r%(!%rBAR5S"KG!OLk#fKuofoX6kb/'[F6+E@auN2i@46l4J)FVm'.&Z;o:n/l3h?!PVj)9QhPZOKF`=gbe8Bj/W[F&PaZ53a-fM_.iK06@baIC!*lSdl1%LLRr;HH/pn-$3WJpW[n]9:]^b`/)*YflDV3Fk$<2ledFjo-l4S)H:A:jTJ`aUa+W>=QC9dJl?^fV^.%=,gU6n7I%$+7Vb?q.@I@;[dc`m$Q;bT/UQHqO]kKsWnTUsnT!jTjW2o`8^K&S$&i_q?:1Z6j9lQB#I42$;A$)P+VhIhE_LFS-p)A33iU05"1!K;M=[P:;LW#ZM8%3:+Wjct;Z!g^-sa7S[B_&c!fjm(%OREtR\lXiKWEl!cSjK#U&h7iOue%GXOV</_?OHp5B=@:\nCijq@1qL4M:VR2Eo`Q^cQgBor48cj8TAuI9>[(/#m>K8QTIOeC-`SYl/Bspaq*]r(2u,78%N+V;aVkCEhhA./qT;SC^.&)\fp?PD79tT$#&H&gXB&Ph8gMhBe50b;t=bR`VsH'`[AWq.#YgePiETKfFa6(BZ&5'7F8!Pd9R^7=9["8.a6IcTtje.rCIie_Xh;<%uT,GKa,Q^&#Y>qDSpBiL*PSXq2HYWH?O=ZU5icKbJW5g*4a(@Db;s`1gJVT^%-Gp.$)a*JU7#6^Jf9GWZ1M%h8F)(2nP!MC'#a``M;AjYq*MI/7Z@ABks]Y`=0\?aj[^7C,&Obo[)oU]$='h#/`o,(D*PB&&ucuoMHD-NnYY9_=c?./76:l~>endstream -endobj -1383 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1455 >> -stream -Gb!$Ghf%7-&BEZ1jF9/]-0ii:VLI2J[K0+S?j3(/98)sa0=4.%>U@d]kh,3.5E_0S4-F(,'[X^Jm8umKHQO8hG=4,!0;RI"'];$*WuD2_L2[@<*OlYUi'Va8u<9GR0;J(C3r^]8=&&%qmA04B/M3%bB=K:K'!,(,-CH8N]he_I&PQ^XQVk>4J^^X`+u6**^Y!X4@H-p=5%76_)I/LK^Z4Yq@1F)m1X.Fo/sT.VVC"q/CI^(QLX6Kd.[oHAX:nlDJu2$1^dSS.JL'Ss&0uORe%/.CFcjll52?Rm6,g?>"UWG0/i7cc]I6q&5N.j6&/4>C2V1o;G6YYPU(g3b8nfY!Ku0i40lR=iTo:L6O#U9Vj$K[T>kdl;)m5ql35b;1XpPU9hI;1W"t'3(L4ho!a@QY8lk%gKTBC)##V[`8HI3?k;_HHYK#ecoK$b2?(C5p;Ocim/d,II#BSV()h;RF(-T6V;S;6Gqg57tqK3D+iXJU`ktC8*X\;JWjp%BAO=mggm!A`pNf@iQ5F%TPfB:P;I,gZ%VL`qoZtQYX(5t^4a$*TAKrCsG`>c;ueMUZQ-GP]pQ6.Q8j+LZ"][i>7)0Z(dh1/CI44,?).&SV[FfrZ_d[f#pl^BbA//K0;F-6-91*a=^FN:mmGbbM6->hN(2.L*"aY]:8`kB7HV331CG;)\Z>V+iPEf7!a2oW&MY7#/[ga4:W`kUHAYO0mIN15NX:^!&Z_r]"Gda$!CPjX@nYqA=TADBB01;WU>co:A7mSqInQ(`6^.#=I742KUU:P=aJp1cosbC3nTd@>2e*2HACoaUOT2;VZ,C2ug^E'!ajeb&DCRZiQV7oF"qkT!?uHSCs1(eDLl=%UN,:0=p_%^tc)f`JQ&XNqd[SDUWBkdEY\)+endstream -endobj -1384 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1426 >> -stream -Gb!SmgMZ%0&:G(NIi.O9;f$8I=)62!82p';d^66/!c@d!96@7)QElaf)u&ZbUu^`W;3hb9$O;\:%E64@LVl+^!en=LG^$Us^H!uP+@%D9CI%_q#Nlk?SFa'?k@Z3$29`%6X#:#P\#7;*D)P8pYec)32AB;_We"o:ZPCfuAP]`7.K%;FGgT$K!*k'G?T*pOpf[MX$1NfTiaX-t7c/Z?]nXJ5&*QA8L/d7cu6>,*9adAk1O!U!kkkS0[@bA:$A0j[G*@bJX9V$)XQkR+eK4SKu]lm1LVbQYC-(2&@!-_NKPo!b\QlT#b9QQY[dGWsG/!_B$J_Nfkt#'1kSQC."d8;Zi^R.dPZeD7QK."9MJDs*Ol\6U:"0DZV];:Vs913Kd+!WXi[#"$!kDV/qO@%DG\5a'n9$Y3&hK5RS!/HI4Wa;cD5%]AobXl76qT4Pkd:T/cG^k(oMq&[r-kJZiN\H_B$[#(0J-R8^_^]gUD9d(?00E>n2.BjiM>(\L^Ok1CVM2$$<)8PIbY%hT@BnX35:Nni#d6CceDmh>2!Uf0ua0VC,Yt]%.39"ib]c9/iSRlj$c5OZmnq4i4ZeTr%g>uT*(n'2%aQXdFJe.7D(l_dt],tSTe*!8An?j0h"Dq9a*jfFG":bUXbeX"akR`RReWSKpc,4!g0u)$gQTAYNUA5O.C/YXDN9SM),n3/BflE<+&cb8A"m95Oo+4tendstream -endobj -1385 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1561 >> -stream -GauI8>Ar7S'Z])5j?"@B-0ii:U9=3o%7o%S.$+no@dI[Z""hp/LK0Z:1AR?p-f4;T&oJ1:I'^'=t[r>]\s#S7C+9-DNuJb^P'T3koP^:YS2>M#?h1M]Iqp[&9TGr*h])jo8#?X6uo@7Y%lGp5_#Ro(atVXaWn9f=^VhSB%rR/_]#r.2&H;q]aI<1O>K8g;!X_=HYTeaU$Y4qJC*X$qU0'2E*Qr2Z3.bo!YPJ&.184%Lq-!'WO/]:h65P5TV%(m*1!rOdPLnDRA@o+emkDn=.jrY0cBCi0L"6"A3Sn6`L]b7@e>/A0[MH/#s(K8&)%Vf6r(,jf1cG4lm"`b[SYcY-"V^Un^GXg@>E=q8lq>^0!Gc9bXq=TZdFh?0P,WS7Z]mUR#o[&][`Ia(JKacj5Pd#;_PXh#?hPVSUi^\Rr#c`u,)d5"o2]0j`kPA+_E\X>_Ybt@6H+eC)$LY/sEu`r'7B8:TU4Q^_MJI)bBM[OgLFb/&S1-<_e?31bqesoE61>mE&:3EHi6:e&sjSQ8]Lk+"4o`KWO6@fhTFr9mmGXtjNNE4_-G^iL^5$9f,%Bure^&(PT_[C/;W0IHJeooSo)J8kk=k,.`-J>)%9=m7[9K\l]PI_S7fs2n>or_:ka+SRKiAaQDBDblof&3,G`/Rik>K6oEVSpNjMDg"g3@^6:)"3m%JG9[^:^e!*5_Jp+LoPa=HHdRb.-0p=F_30GAK=/eQp[4@WZ=O*[l`i$Vd2!nJVF^V/o7>!i=mFk#NDspi!^!=S_m8M/b@Z:(sS(^lfU\qA"Q,-L)O3MR-f0o.QQ3DFp'.H`?gr+jjTOcdtS(%r/=%@g'(H21WnuC_P1LV6RBHiq'7?&>@]C'e4`:nm4o#7U9\3qMIP1YJNDLbeJ@?SR>TYN"]Yff=da"A5,)=[[J9aQ9LVYB!j#%@5c,G&I#80GWB6-RNf^6?IjH0O1rs.Pbu>Fs_3kW_0E)(8#@Pd~>endstream -endobj -1386 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1457 >> -stream -GauI7gMZ%0&;KWUj;mA8:6@N1::AlN_!Ye:'QAS><^dDG]oZgJ<[3H]6oWjaI8@R>o>i?4F;;Z-?1L;Ol3%f7C=5:ln"`c1[&!4`YRJGc)OnH;%rQPVmt@3<`*]RD&?/(._(\,fbUsAoKn,\';%k8`KIRP=p8UNu_=nKo0f23OaagZ94qC1P(Ohk5U)7Y1omIbj-TImk1/FMmgb`%kHEJtmV?mCLS[*F'F=6ttB>M2uIcphI"h&r1+pFrM@#Ei!eMp/Cl&KaJmMWl@8@opZ-n&B8IABNFLir@\*mN-ss&OsuYn;4A$;:e`0FXknTG2Cp+4XI;H5>F,3DHALHY247sj-Ompj10'?o0Qq?3(2,6VN=C\p4semoW-X8!G.S:GN5Lq#I8ro->ZK/>r1C&^Lj+Q-0;/BNTO(*qg8;SU!\Spg(F0YN&72Kq>HNPg&kl@>H-_ca5(a%pU*$eS&5gO;*B$p&5Htq%X?_!o?Jmpb)k%48L^5uYC0i?^9U7t>1?PKh>NWM#eL\pG21n`c)![fE>bW#<-=YnPVF;'NDhpfh+26mZP0nV8&BB>$;-UIjuapY#Ecn6&W7Rf7[ILr?A$'3I8&ophSud@7Y'!bb>-#nWMgi6W)o6^nqLbs4TP;tAJUDX=QH?^89V&@]EM'm9P3@IEI!8$Ps'#j#!!/%\A`"O-8h[PN7li`C=HfQ,F"A>*]@/51rAr`8:$Ji<36ZA/hd2+!Cn88~>endstream -endobj -1387 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1565 >> -stream -Gb"/ghf%d<'Z])]om\sd9@N,lj88tUD%^]([>3VqD<7HmlQ/`/^fuW*NbRbWqUm3HJ'0N;U8C([W6hM+\Ycr"i3Ig"u.>V0#b/Rra1c_,/o.U/N!c!>D+t1g!eb$V*`OFg)?^S[=pS>JmbA;-&c"hj;[XUO`6[@;aD5aQ=XqA'8::3$7b,T-GpEu#tkkJ@o1eZ*%;IH[ZPS`Xfq6%hla+*@I\A511?"fl:7uTD(0(U[pg'E)SP"]ag?qO8;4nrPeu6!.&YluWnsSjoBWX90""gEDE7,i;,1Rd+%^?1Tmt^9GC]H'+@lN90@cN.!`-q:Ln-[q'nYNSQ>E)skAs*Vo1t=/LGMTZaF?:MO"2b=g*-lVr]rrG>@l;7*Xlm,q'S=j,H>RM?hDBnMc/QM)NHQ#+BuZRPFjd@kp:=Ek*Ta.HZuK^Y%b`Za)d`<-C!]QAD_?[$pt`T%C9\/ZR;2tR;"[[0qAn;SI*3bMb;akK:]i,(!_eMW#KUaX'>>9IYTD%\)Z@,;0',U]pC(Vi4leF##4X#(B#B96Z="QP/)aW3D=++.%$,In?c,3E?1Q\9OL.hQ?W-eh;9D@P`P4-1a>o6JQVXJ[lXkI61*.2]=S^0Iu;D.s!d^$^W]^3RBq/RK(+-ZIujU'O8_Cjs0mg``l#H#nE5DnkM!.IO';j;s8N]&W,Il)FM)a>&a1fhP?eI[Cc&(;0l:`3oSR2#hbAj.3.:o;8iglJ>X9EB,b%FkYG+o'B&.6,dF0.oicQL-7fh>1'OZYGUKu%U:55H8^t9>,/H-j:7R[?P>18s@FZ1l+%+V*/Yj8g,L>1'5q\M;$N=k9GCtSb[dRPKpN&qh,:%lSD3ZS4^O_$EaHulT6_`!Io.?=G5CTlN;L+A_1%3C__>X^V9q@DQ0W0%~>endstream -endobj -1388 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1497 >> -stream -Gb!TXD0+\p&BE[@-Jr5ZYFJ>fbE"X3Fsbgo\XOpi>gLkl>P^Yk!o3;J-]qASC#D_e)-m@"Han.Ccb?!CU!2)p\sB*O#]*`6,0+_K94>UTYAJM_AF#Zo]V@`6GL&@Z!NDf'@7=h%r-/P95G7Wc=g@VFT>d;sK,F9Vpo,:g2"S!&X?RjokYHu]C=K;W9C(-7Nms'FO`Ip?'TX-"^m%:h9Kf#D_Ekj-#$0;G@q`h&6p=]$&TW1"K7hE3Td3sY$,_R-k!bu>UU>P7@N-7saXC4hiVGS<;W47Ia%-UUr91]OP:,?W1)I`qaab25#hYXIkM)8kRcPB582AAODA]/*QR.tE3LFYB"tM/U,47Nl?Mrh3A0b]*^6"%7ETO)/7LCGKQQ@H:d3WU5G@9@VR,',(>n6CQ1a/#\YfpBOd*/YL:`kt_^oG?A09mu^Z$6^ql8fbP6%HjEb^G>YK.5cNNbPKkQ$CH,]Ip.+Eq.]FS:"U8sEW9B^FgQ1;DG;I/0")3,"4ZZ?"Ce_Sq\3Mf%KS`DH#lj.KlU;R+]XY#AgY2Q)FP?'f9>XdC;Bq`:CZf=;jb-Ze\kmV=q*,Ng>tg^$L$'um:+D6:+X`!03r^qa$QSZN%P@$3NlR_"lZu^J4H5~>endstream -endobj -1389 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1634 >> -stream -Gau10D,]IQ&BEZa_fsbT)giZhZi$&`drm'W7schpf9.$J5[PqJ''iB\<)s:sdoV_(CmuiX$VW6djo+MSd]PJo@*.eI^Tp+@$DFa+1g_#K'd@3'9G&kPP`?D>g+@oUS0tDV+9KIaFE+[=PFhpuM?H4pGjeGrV'bF]V@]e2+3-A4/[D#!lQ`"qen6"O[E@9H]9K(S,b(quXd>[/45':T4UA*?i;W'lcG[[6IJ_6:%58B'@V7FrYD1OhafFF^/mM\(lb1\?1/@2LGSsT!u@FWS)(%)`q.r!A%@P.p/3(>(70Vrke,%:*/:1$:`>*KKd-.l&;%9nU')EC_3n]l#`7j6gIX\VSr'*`DI94kC6d($s&+ofVuIMSJ_Zt]b1LjZ9(\)[%\HpOm)f>2r8&L-cjXg^Lp5D:W$MClNW+D5(buMeh/Q*SE&(ijDLK-??jcur5/pVjJ`S.4%I5+\Ksf]`BAXcU)F8k:20Q9hY!r%2*UQiN)r-X_E%^o_-9&b\-qFJNSk^#)Op`r(?%FA?7MG?\V4tl*CbK@(Qh^n[fg+I98Bm0-GP[o_09pJEl:1Z^[po?gk79M$(Lsc2o*t%mf;(%+S\-YtP3$Nq#!p4kf&?CM>6UscNGG/8hAFCVL"6ZQj^ZB1.Vg`U*)APc`NZ!Z]=9m/+6=/S,!DTEU&nlIlB6-hF,S>cOI(Ku28l%H-9e0._=3+?]?ElU2TBk(I`s@^db%cU$;n3!(l.tK:b1Xae:1DI?,n"jEfLco/c$/*0!1JRW*g'.*/?4s(jZlbAp>KWC+OdUjPXH-h'3O(>jW6.s3Ymf-_LeXVOmi#i+^??s\hRBrIVLd(G@[.bh6(*$+BS)JOC1nq9hYlmVO-/=#k`S*@d"!'o-3:a\W$>a`Ba9W4ILVF^+.%F#)k;^Z\:X52NHF#>tV02'VT<^VbC>J%ep4Z?H^;,FmJ=Y`+>KSpZTe`f;\=l(jl("6;XNU%#DC:?=*^?ITCb3HIIDlCUVhhjbm9)#9jk;C[kh)`ab6S`,^KjTBOdendstream -endobj -1390 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1684 >> -stream -Gb!TXrD2H3(rq+jM>tE,d@6fIH##31PG!GZ%M#p:@a^WsS%)0^;Wf$d*rl0[3sg=,E]'XSh'Ps&&j-*ho=XlJ(`DgqeSC6jFQT?^98p*3r$fL+ha[T&]'p4oHo^tPbH[)^GA7$RHTr`>U1gNJZRHOV8+o!KfMl3VZ>K%8iZ/?CGWooY=PhHTA!q[6\1V.k@\n>hTe8Fnm"aDQ-&adE;qEn7(p1WIbH7SJ>.!F2J^PF^d5$T3W6t"J.?ams/>GVb"l5la+,msu0OEi;#\8/+)AV`7_EqNa=C*EE(j*=oR$2RZs*1!*MSi1!q74\qIo_4-ti<#/G%nKG+O3f'6/cU(jW2Y!nlLqe'IF*mQJfA/u%M7.j,%@F1F's+/8a#%m'29IeJnnFga(][F>tu4-&4n0j5beU*,.?hS#O#'^Z-^05KZGs":/m[$GRF*fcajV,]!25s')m(ii?[cW%.7pJb<$slTBFmsLR_s-"!^X!e'W+USZohfU,V5&?PRAs*X5-A$@E`F.ib)QeD=VE6%O\V@'qV(UI;IG$8/4L-hnr+PfB0J5^Y)"$XQ0g)2`E"jP(XGu6a$nIZ'/\H395!SB]Z`'LgRXUEtOh?Y]rKF5IS=21TUfslARUpR4<>-eqN`@.ZS8IJ)/VrQ1T(#h(11l$fQ*>YZ=IK#C)=FsHA,]PImFg6<*,^+d&31#rXjDK764/\0p+L6RoeQgH=ea,K%@HW+(>R@C)rk(cL!#GXLP0TnZ6b\)2N]i$0"1]jnYR;:9T.,6jN,r/WQ\SFDT'g4CN>HG*=JF]+^;>Ol/R%;_\7?`"_l(0b.B)T^@`VH#GI"-=6I,"!5t.@S8An267X*!&[VZ)fO*SgN2eE`A"cWLu,.*A2-]7c1OhY>Mm9W>TVi/r*$kJ)6`'rj?I+g7$namX>Bo)0(t9)oA4fF:P9fJ,WpW-i>9@mAo(CDk+hSFgBZ)=emc#f(N8c':Q>]`,!&$QSHM<%6<%obdjWj\:b>+EOMr0ek*`1VrG!of#L/@rE4W_QlM`"c%BWra6rBa#@!a(Gt;APdYG^lVd547R_qA^DWgYXha$(o>I1U%I]oL0WRJ]1q%af_W0cstA$V::8h0K_@7q>pik-il2G\VE.dpN8@IV:FGQ0bF=TeZ`VJ$^n^'s79]JE4@i=D9OdD:Tf!"%m)a8~>endstream -endobj -1391 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1570 >> -stream -Gb!SmgMZ%0&:G(NIi.NFS78UV](f11"gXW-#a!kZ)aAFApOSI*Qj"cr'Xb4Cp#X/:9/0u]"^8k6Kc4q@cOA-='EkT:6i&rLRH7?ETE0^b(W+3T'-n6WSkspWe(4FP\>\kCEe2AmR9Zp3.;(/%cl&%XpmfCcJNT8EM[8AMN*))DBF%\7hXZuXUr0#/G?u3d=upKEr%JQYguqQb*XoP7GJCMSHgZq&[OSZ59!A`#LjP]n'1$=3'NJNmejjKr$:V3#\U>h56m\>UN_(n:Pnl\#28Ol&R])$;(O'OQ-DPNk^/na1AG6W=*BT%(VBd&3B5om(hFWV8)$uG2:DpGDOf'j)17>;]ZbQf1>K+13kNQ-8I1dE$Rs_$-uO@-mJrk<\BjE')8HY.JD-1aoi.*tfaHrI/\PSN%F_Dk#/Tisin7Db[/t4oK6[CUHH6Bb4%-E!#A/kr1Y3I\>[94eUk'?[B.Bl)mf-0V"4q6X\H/PaYeCSDpCg<)8tM7C`jbZW4A37QuS=SfEE_NqkG)U"GqK@<)]ERG8%VDO`Vd`_dNKe`jW2C"UDP.,WZ317EVSr(cQ,o->@85[L#/F`kN)knL,$4nUReKcL,EYXAW'^H[\%@`D6,>"bDfToFMp;l'[dKfVm'r?o![9*C8itPf7XB0Wu'^@f[Ut(c"\+WMON(%fjrq[BUU-\0YBh77La8Kq0$Q;T^1u7XRPEu-?Id;1-pq%\,V8[9:0Ds+a^0^,3F@i+@F@b7?Prs&Rd5bWhU+J:]V-N"XG#+;s9G1Sc0tFZf0kfC)/nq,HV.H)oo5Jp%\R:"r]S?kIfS/^f>i`B^4I;;hj$d9HAn>$`DP+a$,'S]Oj7L^'BAr<(>Z?=a~>endstream -endobj -1392 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1514 >> -stream -Gb!06qMhG[K/tRC^&70>Ds?PZ59l9>?kksTr>KSV]SLPnUmWjZKqXP"'^k3ih&HlO`s4OWXglBi>gcb$tiWIO9aepTV*7>p_r"LO,r^iO&464fC/E'h?^r*i-3SI5>mfEJMLQ?;5S$bHbR'2cctdYeVaMp8AEe7+#*jFPupS%%HDrgA&!9TFPr>.-T&Z&nc\_%hBe?/LcC+3R+%/\>IVmLHCnV3:/9bYOtfG%^5=>1o-DbN!Xlg\0u6`d+:\!^84CV@amElml1d=r]&1b^jV[lnDN%o*gI#YQ0%S(q#NTc_n]$OX,A%fr%Fhb)^5$]%+QSq/T7@p$K5T>L<#5])BAeo7MA`qOpFTD??@,/bhF_l,9dSjMAW.q^'_'p!UEfo_eZHKgC#Un'aF*%0("hU);FVSatf9u[5,-g3+ImuiJPZ=JXDRVk;_V^[aXQ4,f&2cudLWNt9\7KpQDYL\"UX%K?-]eVE5pBtC?7+)Y$$*9>8VZK#rg9Pe*KStYb8Hi(1H<+hY/LZ3(;DZoWn0ZFoa-Q.:hP3'^&[Ser2Gt7HrWuZ%ek;5&T]@naD.Ms!"SaqD6dRe$?G/60`33cH2^;Tu;.k-erT43t6'H&ob8Do1Nf2VaGP'Xpd#@Ki/%%&c*Lr>OSQ=Yd-^@!T2BhrOSY^QIS!/.8cG`e`:Vj@isA:(8&F-0rNIW!K5IIXmZB(Rp1-B3JG'P@[%"MJ5n:B[lkKWs#5]g6KH1e!c>C>sKX^_WG7j_4ndB0iFXO8Q@/0TsQip"@g2W9)LY=pI$Do(]UBIRj[$;cDlI;M)[6b>XZERD9@c.@nYCSfF:/qF0W*KLM@L,k4J?Zl#(@Fm)#l-\?Ba,9r!)LEjB+l0,tK6klXncD\oQn_u3_&L#\s.!Hmel\G~>endstream -endobj -1393 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1711 >> -stream -Gb!X$L.8(XbO#(uWXUcE@d%)oa[!DV'U4&DiG.O1lYWU"n5j]DfSe+R&Kg/fOKeH)fSW3j8!a`e>:MJhL-Cls&-9,:O&sG`I&'*RA-,8[4>!5&adURW0&#$^".-g='=_0bbU`Rm7[X,;PkBe&l$)C`TRt6Z>P^&!t6;i'(@Lep($PE^V9Ri"&1^1m58<^48#$gmKJA+aT07qZX?Nd9k;\,'_Sc9O!jL%FEMSC?5"7gKXBL%gQqp(%?Lu8Z/St*[>!co>M,Usl8iCm&8?Q2VG)T0[]pIIlYLV8M2J8@k=o74e79-D$%KT[oY%FP$#^Fe.WirSt@E)qVc%:^!dM4p5AA&O`i]2DftM5c+(1a`U*7%A""*%)nlrY\.f>p:ssoUcZb9Af'CKbr3k`liU#K.iu'%VQKh7'ui/A&+Ip]Zu1];?j\=H=tI2!)kB--^"0O6p)+(>0'X%rQsuA7O]!DN\[_fp`Ycn6+EU.e//t@!&HVR@+mju2bB>*KQ%sS>.dOn'3Uphm*X;r]tp?n^'IM*1aX^r@jo?>21-\Eg'RH\l8OHP.DVVi"A08:P,])"^C(c6W>5^o).`t@Do^B)]Une*phj6gN)1B/9(El&iY_`]W()X\$/k'4$H`u$.=u-.V@;;#L@&B'UB&nHl`5hM;grn"6p-*o(=^]""qfFXLBA]j:H>'t,^M+)T&B]?9B1WjTuKRH'Veu1k3nT9Xi?_f["`s-JfJK""K6>`EEUs4Z+2"mceXPPu`>!S,`[YP!XIU8>RaObqoZU7=(OSetc;<^cYl2_jf:CMl(YE3mWV1p*7QJ(s-J6j2PN2ZPN_*fmpEY&-1@*oT2:&VPeLY!/o"9@bnoOLdN*dun--+M2FKMYmmQAh'^j4)E8ce-T!q9Om[G\?QQ)SK;=U[*T\%S>TE`bhK8)WlQK)+LJF4')hZl>p@O@,oPOj:Wf#MZE3*OtO1T>9ku-7Rotc>nM1VJ[P)4CXm!&'21X8=+10lpJ(G;pJi>(.(^C'WY1_i7#[$c%hd4&?";N,g[2D&?*QFUrhiiGWs+Pi%t3@u+5(P,[DgOfA99Wc#o25D%QX`N9tC]BQ_EZ16/M^oWuECG)oB$cW-"r-.b7oRQn>f)&gMg4Asc^A#9>]D>VZX*a;R^L(*FKh]lP;I,o35G)KhCV=OD55H42XPWm~>endstream -endobj -1394 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1496 >> -stream -Gau10?Z4[W'ZJr3j?)/+\3oDGqIaS^BibfI&tk_J()RAe[)CU%,Vl4[3o-\UH"G%i/8\@b,!dF*Z?Z$54lea?JVj1Gpc#AVhI^^_-U7aS*e6Z=#dQO:T3YcN\\'&sF5pf$Ud7U\3Xs+T9iCRS4CNghW7C!`\I:L0E`SU/`que@p6qa\XVG2\1ooM!p(q7(i%Vq)DsLfnk]j>,+cK/O%>3"IRZX')hom;f`/_<."f&96k0&ng%X9c?G:/>uKXXjFN!`'$;:MEfLrV4n1NRN:,QTY\""#j+%-TLN@E\<^BN[[<2!&:3G*Et?#D./86:mq4fmTACao_I@6e#*mcb/QNCOY6SM(:,'ZVEXRo""GFG0X_F@@o_SZnoJr:rXJbqn+_Ac_+BnX4QX;j04.kBE+=q)!?]l8&s8;Jq7=tBEi54QM6\*!b[)6GiTtV.5Xg3dc66eSckb0SLVm@%<"t=A*Qc:,?l3qQA8/ceF)q&eUR#Vl%=0ck%!ooE8"Eo#G0TXOkt5rg#Lk@,4LTA>QoR_CD8'(8M7i:n=_*lZu-jd<*Ph>>f?r#Gst_.C[9#\n!SUXh522o/:pqMF;PZoh$S;XkKG0%c#)W3MfJMmfdo2pO,Mc8:@+aD$FON6^mG17WZgRp(;Wh2QZgQFubakL#PDM#M:gXAQ>/NQrD71L97fL_q7'NQmjCqIkW0sdn^g,Vk:NM!`hubp8OIo7UV+2Q!N.fd]aCRng8GPX38:?qc$hiC/`f6K#JDJ\QB=#p5*tr\o38\%L29q[27lk(80U*5Bc!j1;.6WBD-!oK@Dskn]+Na1*$kdFq;qsU("GnGUPm>hMNp\QD2N8hJE+>9TA_:P2pMddRJK-pZ/_8JgCmuS*GG.^a@@bZK3i+n.oVrdHGB(-A,hZZrf:9F(Oc#<'m^+NrK?[m]Lo2)?FYgkUD>r`6F/%8?5*@:/-s'akmDZ)ABk/R=%hPMDh]jn/09CB>7!n;jMd70N](p91rK0B::f\kQP8jWcg"_Gf.E'rHGedc+bX2D(5/3jtn4bZi>*d:&8,J_hV,^eJd0"o&:_oP'Wc~>endstream -endobj -1395 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1720 >> -stream -Gb!;eD/\/e&H3^ns5D8t)_--r;mB"RATBI#`FFkX;(t+/6N*+i&@F:+lnb$i4?U:=FcC&)R$k&&'#)ONc9m2qsqc&a4?'-Loe2Nmn7mG\LZu9p^qo?9ga)e+I\>2NX5n\>;E!!f^D&9c2[V=YtF4rQf.eB/Ybrhf]&&`Zjt@b`O!fG6*SM:_hq[LrP?QbiQuZh^l>e9NiT%tgJ@B;`PF5f%MbMeKDI)u4#R3K4H+nSUR`HrI0ds\"#Q0GC".-8/R53@e]!&s&4$J^3K[i[$'j!Si/B5I>h4(%YJnsJ+0bmM/uIDG1?Hs]`f]?Pd4lW[3(,+Y.cM%=s)eBD(BZ99&!-/9)WJ4uUSBTTTQX..5h*Nf>elFk&K=>,RT*a`OOmt:L)1lMas$+tV6Nmg1W8?IT,5Fd+&?@9h1b3+`W;Dk--W:dE;J!=lZT]=C'eZk-gDY[E-gb$FbnmJj8FRaEPN4)V/$=?J9/RKWe.H$knX@X#HsHQrO/j3fhg!Ur;f#&B3E*E>oM2\OB1l.W28Yuoa!t72!'<['2?Jb-3Oa\sO5pNaZJ8WuYi(@H/uQO`1YofcUV6Q!9AO&*uSXcXYG(Xe^'Oe3b7E:LpN]%`EHa9B"akUqWY7Q.u)`QHh^#?B6Dr+e!PBY7%RcUnKrT2'*aK])JY2WojJH&nmTB>@q=(&+e5JRo!#D/*dgAQC7CtXh.HsV%jdGB8h/4cJD7a8efK&]_deP!:]kl5Y@[t%*^*2-qR4m46o]a7?[0&q\b[OYWCWY?B!YmEjI7>%ER;"oghH(B5>S*l*S'l3F1l&)rm5X"0A-)GNrce:)1s&QmoAbct9X#u%GS05<8b<6Mj:B;G7ERO)Sb:Bf1B`m<+7>6P40!RZ&U1YC0)UUh._h,6@8.I=/U=b[/W%l!DIG$g0;T7oM065pmcr!0[keGT~>endstream -endobj -1396 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1571 >> -stream -Gau10?Z4[W'ZJr;j?)/+UdLH9qIaS^l.-7^&tk/B()RAeZp\,7,giIP-LI_gjgF,.[Brc-$4!i/:tF%?4M:DB$qC#$oK0)RhTXoE.g@PTf`G8t&]*fPhTel&I6Mqq[U\@Y,"[EO_0?r+YV\rA8fE3r5E6'0MjUaU*l+kOO1WCB:4S>j#ES)FQZ2Y)2KE+2pd<7&29\8CTQ!!VlrWsYL`24YMfZrs^B[[C=Q2k"AM"g&-r$W7K5<1(lIerYp2BeAQ&J3RP4<8>3"5TmK\<(5.S/!O$Pu1:qTS(Q=+mpR@5Q3Uc:HuR:Pfu2UjBhUYE]`VfW=3SaC!/V;-YTK@;GUDb<&8mP4ERol6NEScEn_c1\sa"$<[R@H:sQ=.(!='KMFQG?W8r"scGY?$%op9EL1>#i3!in*'W0a'kLp7EWsCVH%O#`8)s`rI`)6Q@M)t?Ff@^t#]d(f4h`KA1,I@Om,phFDAe1OLeOf;:#+k#+86,90&q&!SQ!s#"FES(j)/lY.4o4\&oZfIDr('XS(R^PYAff8,:;4aQS=YH4$t"7iFtUjEi14rQI^jiR!ZZIjR`??;h?rP@=4u.3-RX`TG\7KnOW/mQO3lH"LDXaX#1ds!]93A!].7.>7Ga0E>2i^:#2/KTTm,RjXCh.4pfc1jm4Pgf<*I]Hq_<9+`g%M7c5Ka$X]uXZJ/`c(%0B%O?6lF?p6"Pce5B"M%s4G.X=rsX4Z?Tbj%_&+eG_c`@(!B0[3-Q.3Ea1&=RQ2G)%FUM7cc;kq\cf9I6P<^2#EPkem`uV-,um`[?/2GX8`2"eendstream -endobj -1397 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 621 >> -stream -Gatm8hf$st&:Uh4s5C>_$uK_(8Ws>Z&r9NnXf)mF08p."3NX[L/r@'&ruT3Tf)/tr&oqO9\^/"Y^:Q1QB*R'MblL!R0O#_DJKt=+g]3L1\4EK\?df>4fQl\80o6L:aEK?K@rp'"bi&ank3a4/@2=scp:)fRtk0&cc#Q`s@HlkGUe"7p;qo@j1t9GNX=.9W[]g]60:d^@H_Q0!1#^JT_tobW?03/i5oI'jgrJCnFXCD^(Tf;aKK57;MW@Duo*=0S2drB`t>nGb=$S@I]R%WtFQ%!K#n$sZk\TeoRT%pPWC5qAm#Z^-)/Q2@1(L/X!Ak^MIar6n^u>BAAGEb=1t3=.f,%YAqi^=VJ+IGV*-I:%J/rYQuZj7BL*l/W?b!`@V~>endstream -endobj -xref -0 1398 -0000000000 65535 f -0000000075 00000 n -0000000176 00000 n -0000000286 00000 n -0000000499 00000 n -0000000614 00000 n -0000000726 00000 n -0000000939 00000 n -0000001050 00000 n -0000001263 00000 n -0000001476 00000 n -0000001594 00000 n -0000001708 00000 n -0000001817 00000 n -0000002069 00000 n -0000002333 00000 n -0000002597 00000 n -0000002861 00000 n -0000003108 00000 n -0000003367 00000 n -0000003626 00000 n -0000003885 00000 n -0000004135 00000 n -0000004397 00000 n -0000004659 00000 n -0000004921 00000 n -0000005235 00000 n -0000005388 00000 n -0000005540 00000 n -0000005693 00000 n -0000005847 00000 n -0000005999 00000 n -0000006153 00000 n -0000006421 00000 n -0000006671 00000 n -0000006933 00000 n -0000007195 00000 n -0000007457 00000 n -0000007711 00000 n -0000007864 00000 n -0000008016 00000 n -0000008169 00000 n -0000008323 00000 n -0000008475 00000 n -0000008629 00000 n -0000008881 00000 n -0000009145 00000 n -0000009409 00000 n -0000009673 00000 n -0000009969 00000 n -0000010183 00000 n -0000010432 00000 n -0000010693 00000 n -0000010954 00000 n -0000011215 00000 n -0000011464 00000 n -0000011725 00000 n -0000011986 00000 n -0000012247 00000 n -0000012529 00000 n -0000012786 00000 n -0000013055 00000 n -0000013324 00000 n -0000013593 00000 n -0000013850 00000 n -0000014119 00000 n -0000014388 00000 n -0000014657 00000 n -0000014939 00000 n -0000015092 00000 n -0000015325 00000 n -0000015477 00000 n -0000015734 00000 n -0000016003 00000 n -0000016272 00000 n -0000016541 00000 n -0000016798 00000 n -0000017067 00000 n -0000017336 00000 n -0000017605 00000 n -0000017894 00000 n -0000018151 00000 n -0000018420 00000 n -0000018689 00000 n -0000018958 00000 n -0000019215 00000 n -0000019484 00000 n -0000019753 00000 n -0000020022 00000 n -0000020279 00000 n -0000020548 00000 n -0000020817 00000 n -0000021086 00000 n -0000021400 00000 n -0000021657 00000 n -0000021926 00000 n -0000022195 00000 n -0000022464 00000 n -0000022721 00000 n -0000022990 00000 n -0000023259 00000 n -0000023529 00000 n -0000023787 00000 n -0000024057 00000 n -0000024327 00000 n -0000024597 00000 n -0000024855 00000 n -0000025125 00000 n -0000025395 00000 n -0000025665 00000 n -0000026017 00000 n -0000026275 00000 n -0000026545 00000 n -0000026815 00000 n -0000027085 00000 n -0000027240 00000 n -0000027394 00000 n -0000027548 00000 n -0000027803 00000 n -0000028070 00000 n -0000028337 00000 n -0000028604 00000 n -0000028757 00000 n -0000028910 00000 n -0000029064 00000 n -0000029407 00000 n -0000029560 00000 n -0000029714 00000 n -0000029868 00000 n -0000030021 00000 n -0000030175 00000 n -0000030328 00000 n -0000030482 00000 n -0000030635 00000 n -0000030789 00000 n -0000030943 00000 n -0000031097 00000 n -0000031355 00000 n -0000031625 00000 n -0000031895 00000 n -0000032165 00000 n -0000032423 00000 n -0000032693 00000 n -0000032963 00000 n -0000033233 00000 n -0000033491 00000 n -0000033761 00000 n -0000034031 00000 n -0000034301 00000 n -0000034720 00000 n -0000034978 00000 n -0000035248 00000 n -0000035518 00000 n -0000035788 00000 n -0000036047 00000 n -0000036298 00000 n -0000036561 00000 n -0000036824 00000 n -0000037087 00000 n -0000037338 00000 n -0000037601 00000 n -0000037864 00000 n -0000038127 00000 n -0000038389 00000 n -0000038663 00000 n -0000038937 00000 n -0000039211 00000 n -0000039538 00000 n -0000039692 00000 n -0000039846 00000 n -0000040097 00000 n -0000040360 00000 n -0000040623 00000 n -0000040886 00000 n -0000041161 00000 n -0000041315 00000 n -0000041566 00000 n -0000041829 00000 n -0000042092 00000 n -0000042355 00000 n -0000042604 00000 n -0000042865 00000 n -0000043126 00000 n -0000043387 00000 n -0000043686 00000 n -0000043940 00000 n -0000044206 00000 n -0000044472 00000 n -0000044738 00000 n -0000044992 00000 n -0000045258 00000 n -0000045524 00000 n -0000045790 00000 n -0000046038 00000 n -0000046298 00000 n -0000046558 00000 n -0000046818 00000 n -0000047074 00000 n -0000047342 00000 n -0000047610 00000 n -0000047878 00000 n -0000048237 00000 n -0000048483 00000 n -0000048741 00000 n -0000048999 00000 n -0000049257 00000 n -0000049509 00000 n -0000049773 00000 n -0000050037 00000 n -0000050301 00000 n -0000050550 00000 n -0000050811 00000 n -0000051072 00000 n -0000051333 00000 n -0000051660 00000 n -0000051907 00000 n -0000052166 00000 n -0000052425 00000 n -0000052684 00000 n -0000052838 00000 n -0000053089 00000 n -0000053352 00000 n -0000053615 00000 n -0000053878 00000 n -0000054032 00000 n -0000054283 00000 n -0000054546 00000 n -0000054809 00000 n -0000055072 00000 n -0000055226 00000 n -0000055577 00000 n -0000055828 00000 n -0000056091 00000 n -0000056354 00000 n -0000056617 00000 n -0000056863 00000 n -0000057121 00000 n -0000057379 00000 n -0000057637 00000 n -0000057883 00000 n -0000058141 00000 n -0000058399 00000 n -0000058657 00000 n -0000058903 00000 n -0000059161 00000 n -0000059419 00000 n -0000059677 00000 n -0000059923 00000 n -0000060181 00000 n -0000060439 00000 n -0000060697 00000 n -0000060943 00000 n -0000061201 00000 n -0000061459 00000 n -0000061717 00000 n -0000062144 00000 n -0000062390 00000 n -0000062648 00000 n -0000062906 00000 n -0000063164 00000 n -0000063410 00000 n -0000063668 00000 n -0000063926 00000 n -0000064184 00000 n -0000064430 00000 n -0000064688 00000 n -0000064946 00000 n -0000065204 00000 n -0000065531 00000 n -0000065685 00000 n -0000065839 00000 n -0000065993 00000 n -0000066147 00000 n -0000066301 00000 n -0000066455 00000 n -0000066609 00000 n -0000066762 00000 n -0000066916 00000 n -0000067070 00000 n -0000067224 00000 n -0000067489 00000 n -0000067766 00000 n -0000068043 00000 n -0000068320 00000 n -0000068573 00000 n -0000068838 00000 n -0000069103 00000 n -0000069368 00000 n -0000069751 00000 n -0000070008 00000 n -0000070277 00000 n -0000070546 00000 n -0000070815 00000 n -0000070969 00000 n -0000071123 00000 n -0000071277 00000 n -0000071431 00000 n -0000071585 00000 n -0000071739 00000 n -0000072002 00000 n -0000072277 00000 n -0000072552 00000 n -0000072827 00000 n -0000073170 00000 n -0000073427 00000 n -0000073696 00000 n -0000073965 00000 n -0000074234 00000 n -0000074497 00000 n -0000074772 00000 n -0000075047 00000 n -0000075322 00000 n -0000075582 00000 n -0000075854 00000 n -0000076126 00000 n -0000076398 00000 n -0000076659 00000 n -0000076932 00000 n -0000077205 00000 n -0000077478 00000 n -0000077837 00000 n -0000078095 00000 n -0000078365 00000 n -0000078635 00000 n -0000078905 00000 n -0000079158 00000 n -0000079423 00000 n -0000079688 00000 n -0000079953 00000 n -0000080203 00000 n -0000080465 00000 n -0000080727 00000 n -0000080989 00000 n -0000081316 00000 n -0000081562 00000 n -0000081820 00000 n -0000082078 00000 n -0000082336 00000 n -0000082583 00000 n -0000082842 00000 n -0000083101 00000 n -0000083360 00000 n -0000083612 00000 n -0000083876 00000 n -0000084140 00000 n -0000084404 00000 n -0000084731 00000 n -0000084994 00000 n -0000085269 00000 n -0000085544 00000 n -0000085819 00000 n -0000086076 00000 n -0000086345 00000 n -0000086614 00000 n -0000086883 00000 n -0000087130 00000 n -0000087389 00000 n -0000087648 00000 n -0000087907 00000 n -0000088234 00000 n -0000088449 00000 n -0000088696 00000 n -0000088955 00000 n -0000089214 00000 n -0000089473 00000 n -0000089732 00000 n -0000089979 00000 n -0000090238 00000 n -0000090497 00000 n -0000090756 00000 n -0000091015 00000 n -0000091262 00000 n -0000091521 00000 n -0000091780 00000 n -0000092039 00000 n -0000092298 00000 n -0000092513 00000 n -0000092760 00000 n -0000093019 00000 n -0000093278 00000 n -0000093537 00000 n -0000093796 00000 n -0000094043 00000 n -0000094302 00000 n -0000094561 00000 n -0000094820 00000 n -0000095079 00000 n -0000095294 00000 n -0000095541 00000 n -0000095800 00000 n -0000096059 00000 n -0000096318 00000 n -0000096563 00000 n -0000096820 00000 n -0000097077 00000 n -0000097334 00000 n -0000097589 00000 n -0000097856 00000 n -0000098123 00000 n -0000098390 00000 n -0000098717 00000 n -0000098965 00000 n -0000099225 00000 n -0000099485 00000 n -0000099745 00000 n -0000100004 00000 n -0000100264 00000 n -0000100536 00000 n -0000100808 00000 n -0000101080 00000 n -0000101344 00000 n -0000101620 00000 n -0000101896 00000 n -0000102172 00000 n -0000102418 00000 n -0000102676 00000 n -0000102934 00000 n -0000103192 00000 n -0000103438 00000 n -0000103696 00000 n -0000103954 00000 n -0000104212 00000 n -0000104458 00000 n -0000104716 00000 n -0000104974 00000 n -0000105232 00000 n -0000105490 00000 n -0000105760 00000 n -0000106030 00000 n -0000106300 00000 n -0000106727 00000 n -0000106976 00000 n -0000107237 00000 n -0000107498 00000 n -0000107759 00000 n -0000108005 00000 n -0000108263 00000 n -0000108521 00000 n -0000108779 00000 n -0000108933 00000 n -0000109086 00000 n -0000109240 00000 n -0000109488 00000 n -0000109748 00000 n -0000110008 00000 n -0000110268 00000 n -0000110619 00000 n -0000110873 00000 n -0000111139 00000 n -0000111405 00000 n -0000111671 00000 n -0000111930 00000 n -0000112185 00000 n -0000112452 00000 n -0000112719 00000 n -0000112986 00000 n -0000113245 00000 n -0000113499 00000 n -0000113765 00000 n -0000114031 00000 n -0000114297 00000 n -0000114556 00000 n -0000114807 00000 n -0000115070 00000 n -0000115333 00000 n -0000115596 00000 n -0000115855 00000 n -0000116109 00000 n -0000116375 00000 n -0000116641 00000 n -0000116907 00000 n -0000117160 00000 n -0000117425 00000 n -0000117690 00000 n -0000117955 00000 n -0000118246 00000 n -0000118461 00000 n -0000118676 00000 n -0000118830 00000 n -0000119081 00000 n -0000119344 00000 n -0000119607 00000 n -0000119870 00000 n -0000120024 00000 n -0000120277 00000 n -0000120542 00000 n -0000120807 00000 n -0000121072 00000 n -0000121379 00000 n -0000121630 00000 n -0000121893 00000 n -0000122156 00000 n -0000122419 00000 n -0000122670 00000 n -0000122933 00000 n -0000123196 00000 n -0000123459 00000 n -0000123750 00000 n -0000124001 00000 n -0000124264 00000 n -0000124527 00000 n -0000124790 00000 n -0000125049 00000 n -0000125203 00000 n -0000125454 00000 n -0000125717 00000 n -0000125980 00000 n -0000126243 00000 n -0000126494 00000 n -0000126757 00000 n -0000127020 00000 n -0000127283 00000 n -0000127582 00000 n -0000127736 00000 n -0000127890 00000 n -0000128045 00000 n -0000128200 00000 n -0000128354 00000 n -0000128509 00000 n -0000128784 00000 n -0000129035 00000 n -0000129298 00000 n -0000129561 00000 n -0000129824 00000 n -0000130083 00000 n -0000130237 00000 n -0000130391 00000 n -0000130546 00000 n -0000130701 00000 n -0000130855 00000 n -0000131010 00000 n -0000131263 00000 n -0000131528 00000 n -0000131793 00000 n -0000132058 00000 n -0000132365 00000 n -0000132620 00000 n -0000132887 00000 n -0000133154 00000 n -0000133421 00000 n -0000133669 00000 n -0000133929 00000 n -0000134189 00000 n -0000134449 00000 n -0000134740 00000 n -0000134894 00000 n -0000135145 00000 n -0000135408 00000 n -0000135671 00000 n -0000135934 00000 n -0000136185 00000 n -0000136448 00000 n -0000136711 00000 n -0000136974 00000 n -0000137225 00000 n -0000137488 00000 n -0000137751 00000 n -0000138014 00000 n -0000138349 00000 n -0000138600 00000 n -0000138863 00000 n -0000139126 00000 n -0000139389 00000 n -0000139640 00000 n -0000139903 00000 n -0000140166 00000 n -0000140429 00000 n -0000140675 00000 n -0000140933 00000 n -0000141191 00000 n -0000141449 00000 n -0000141776 00000 n -0000142022 00000 n -0000142280 00000 n -0000142538 00000 n -0000142796 00000 n -0000143043 00000 n -0000143302 00000 n -0000143561 00000 n -0000143820 00000 n -0000144071 00000 n -0000144334 00000 n -0000144597 00000 n -0000144860 00000 n -0000145187 00000 n -0000145434 00000 n -0000145693 00000 n -0000145952 00000 n -0000146211 00000 n -0000146463 00000 n -0000146727 00000 n -0000146991 00000 n -0000147255 00000 n -0000147506 00000 n -0000147769 00000 n -0000148032 00000 n -0000148295 00000 n -0000148622 00000 n -0000148776 00000 n -0000149027 00000 n -0000149290 00000 n -0000149553 00000 n -0000149816 00000 n -0000150070 00000 n -0000150336 00000 n -0000150602 00000 n -0000150868 00000 n -0000151121 00000 n -0000151386 00000 n -0000151651 00000 n -0000151916 00000 n -0000152169 00000 n -0000152434 00000 n -0000152699 00000 n -0000152964 00000 n -0000153331 00000 n -0000153485 00000 n -0000153639 00000 n -0000153793 00000 n -0000153947 00000 n -0000154101 00000 n -0000154255 00000 n -0000154409 00000 n -0000154563 00000 n -0000154717 00000 n -0000154871 00000 n -0000155025 00000 n -0000155179 00000 n -0000155333 00000 n -0000155487 00000 n -0000155641 00000 n -0000155796 00000 n -0000155950 00000 n -0000156104 00000 n -0000156258 00000 n -0000156412 00000 n -0000156566 00000 n -0000156720 00000 n -0000156875 00000 n -0000157029 00000 n -0000157183 00000 n -0000157338 00000 n -0000157492 00000 n -0000157645 00000 n -0000157800 00000 n -0000157954 00000 n -0000158108 00000 n -0000158261 00000 n -0000158414 00000 n -0000158568 00000 n -0000158722 00000 n -0000158876 00000 n -0000159030 00000 n -0000159184 00000 n -0000159338 00000 n -0000159492 00000 n -0000159745 00000 n -0000160010 00000 n -0000160275 00000 n -0000160540 00000 n -0000161135 00000 n -0000161390 00000 n -0000161657 00000 n -0000161924 00000 n -0000162191 00000 n -0000162444 00000 n -0000162709 00000 n -0000162974 00000 n -0000163239 00000 n -0000163490 00000 n -0000163753 00000 n -0000164016 00000 n -0000164279 00000 n -0000164433 00000 n -0000164587 00000 n -0000164741 00000 n -0000165004 00000 n -0000165279 00000 n -0000165554 00000 n -0000165829 00000 n -0000166086 00000 n -0000166355 00000 n -0000166624 00000 n -0000166893 00000 n -0000167312 00000 n -0000167527 00000 n -0000167774 00000 n -0000168033 00000 n -0000168292 00000 n -0000168551 00000 n -0000168810 00000 n -0000169062 00000 n -0000169326 00000 n -0000169590 00000 n -0000169854 00000 n -0000170111 00000 n -0000170380 00000 n -0000170649 00000 n -0000170918 00000 n -0000171209 00000 n -0000171363 00000 n -0000171517 00000 n -0000171671 00000 n -0000171918 00000 n -0000172177 00000 n -0000172436 00000 n -0000172695 00000 n -0000172942 00000 n -0000173201 00000 n -0000173460 00000 n -0000173719 00000 n -0000174038 00000 n -0000174192 00000 n -0000174346 00000 n -0000174500 00000 n -0000174655 00000 n -0000174914 00000 n -0000175165 00000 n -0000175428 00000 n -0000175691 00000 n -0000175954 00000 n -0000176213 00000 n -0000176367 00000 n -0000176522 00000 n -0000176775 00000 n -0000177040 00000 n -0000177305 00000 n -0000177570 00000 n -0000177818 00000 n -0000178078 00000 n -0000178338 00000 n -0000178598 00000 n -0000178905 00000 n -0000179162 00000 n -0000179431 00000 n -0000179700 00000 n -0000179969 00000 n -0000180225 00000 n -0000180493 00000 n -0000180761 00000 n -0000181029 00000 n -0000181320 00000 n -0000181571 00000 n -0000181834 00000 n -0000182097 00000 n -0000182360 00000 n -0000182607 00000 n -0000182866 00000 n -0000183125 00000 n -0000183384 00000 n -0000183630 00000 n -0000183888 00000 n -0000184146 00000 n -0000184404 00000 n -0000184731 00000 n -0000184982 00000 n -0000185245 00000 n -0000185508 00000 n -0000185771 00000 n -0000186029 00000 n -0000186299 00000 n -0000186569 00000 n -0000186839 00000 n -0000187097 00000 n -0000187367 00000 n -0000187637 00000 n -0000187907 00000 n -0000188234 00000 n -0000188494 00000 n -0000188766 00000 n -0000189038 00000 n -0000189310 00000 n -0000189567 00000 n -0000189836 00000 n -0000190105 00000 n -0000190374 00000 n -0000190631 00000 n -0000190900 00000 n -0000191169 00000 n -0000191438 00000 n -0000191698 00000 n -0000191970 00000 n -0000192242 00000 n -0000192514 00000 n -0000192873 00000 n -0000193138 00000 n -0000193415 00000 n -0000193692 00000 n -0000193969 00000 n -0000194218 00000 n -0000194479 00000 n -0000194740 00000 n -0000195001 00000 n -0000195266 00000 n -0000195543 00000 n -0000195820 00000 n -0000196097 00000 n -0000196345 00000 n -0000196605 00000 n -0000196865 00000 n -0000197125 00000 n -0000197484 00000 n -0000197638 00000 n -0000197892 00000 n -0000198158 00000 n -0000198424 00000 n -0000198690 00000 n -0000198941 00000 n -0000199204 00000 n -0000199467 00000 n -0000199730 00000 n -0000199981 00000 n -0000200244 00000 n -0000200507 00000 n -0000200770 00000 n -0000201105 00000 n -0000201360 00000 n -0000201627 00000 n -0000201894 00000 n -0000202161 00000 n -0000202411 00000 n -0000202673 00000 n -0000202935 00000 n -0000203197 00000 n -0000203451 00000 n -0000203717 00000 n -0000203983 00000 n -0000204249 00000 n -0000204504 00000 n -0000204771 00000 n -0000205038 00000 n -0000205305 00000 n -0000205563 00000 n -0000205833 00000 n -0000206103 00000 n -0000206373 00000 n -0000206764 00000 n -0000207012 00000 n -0000207272 00000 n -0000207532 00000 n -0000207792 00000 n -0000208039 00000 n -0000208298 00000 n -0000208557 00000 n -0000208816 00000 n -0000208970 00000 n -0000209124 00000 n -0000209375 00000 n -0000209638 00000 n -0000209901 00000 n -0000210164 00000 n -0000210507 00000 n -0000210760 00000 n -0000211025 00000 n -0000211290 00000 n -0000211555 00000 n -0000211709 00000 n -0000211976 00000 n -0000212229 00000 n -0000212494 00000 n -0000212759 00000 n -0000213024 00000 n -0000213178 00000 n -0000213429 00000 n -0000213692 00000 n -0000213955 00000 n -0000214218 00000 n -0000214517 00000 n -0000214766 00000 n -0000215027 00000 n -0000215288 00000 n -0000215549 00000 n -0000215703 00000 n -0000215857 00000 n -0000216011 00000 n -0000216165 00000 n -0000216319 00000 n -0000216473 00000 n -0000216628 00000 n -0000216947 00000 n -0000217201 00000 n -0000217467 00000 n -0000217733 00000 n -0000217999 00000 n -0000218258 00000 n -0000218412 00000 n -0000218666 00000 n -0000218932 00000 n -0000219198 00000 n -0000219464 00000 n -0000219731 00000 n -0000219885 00000 n -0000220139 00000 n -0000220405 00000 n -0000220671 00000 n -0000220937 00000 n -0000221185 00000 n -0000221445 00000 n -0000221705 00000 n -0000221965 00000 n -0000222119 00000 n -0000222273 00000 n -0000222427 00000 n -0000222582 00000 n -0000222736 00000 n -0000222890 00000 n -0000223043 00000 n -0000223197 00000 n -0000223352 00000 n -0000223506 00000 n -0000223889 00000 n -0000224043 00000 n -0000224197 00000 n -0000224351 00000 n -0000224505 00000 n -0000224659 00000 n -0000224813 00000 n -0000224967 00000 n -0000225121 00000 n -0000225275 00000 n -0000225429 00000 n -0000225583 00000 n -0000225737 00000 n -0000225891 00000 n -0000226045 00000 n -0000226199 00000 n -0000226353 00000 n -0000226507 00000 n -0000226661 00000 n -0000226815 00000 n -0000226969 00000 n -0000227123 00000 n -0000227277 00000 n -0000227431 00000 n -0000227585 00000 n -0000227739 00000 n -0000227893 00000 n -0000228047 00000 n -0000228201 00000 n -0000228355 00000 n -0000228510 00000 n -0000228664 00000 n -0000228818 00000 n -0000228972 00000 n -0000229126 00000 n -0000229280 00000 n -0000229434 00000 n -0000229588 00000 n -0000229742 00000 n -0000229896 00000 n -0000230051 00000 n -0000230205 00000 n -0000230359 00000 n -0000230611 00000 n -0000230875 00000 n -0000231139 00000 n -0000231403 00000 n -0000232014 00000 n -0000232267 00000 n -0000232532 00000 n -0000232797 00000 n -0000233062 00000 n -0000233316 00000 n -0000233582 00000 n -0000233848 00000 n -0000234114 00000 n -0000234405 00000 n -0000234559 00000 n -0000234794 00000 n -0000235048 00000 n -0000235314 00000 n -0000235580 00000 n -0000235846 00000 n -0000236000 00000 n -0000236254 00000 n -0000236520 00000 n -0000236786 00000 n -0000237052 00000 n -0000237301 00000 n -0000237562 00000 n -0000237823 00000 n -0000238084 00000 n -0000238238 00000 n -0000238392 00000 n -0000238546 00000 n -0000238700 00000 n -0000239067 00000 n -0000239319 00000 n -0000239583 00000 n -0000239847 00000 n -0000240111 00000 n -0000240370 00000 n -0000240625 00000 n -0000240892 00000 n -0000241159 00000 n -0000241426 00000 n -0000241685 00000 n -0000241839 00000 n -0000242102 00000 n -0000242377 00000 n -0000242652 00000 n -0000242928 00000 n -0000243186 00000 n -0000243456 00000 n -0000243726 00000 n -0000243996 00000 n -0000244301 00000 n -0000244553 00000 n -0000244817 00000 n -0000245081 00000 n -0000245345 00000 n -0000245500 00000 n -0000245758 00000 n -0000246028 00000 n -0000246298 00000 n -0000246568 00000 n -0000246821 00000 n -0000247086 00000 n -0000247351 00000 n -0000247616 00000 n -0000247869 00000 n -0000248134 00000 n -0000248399 00000 n -0000248664 00000 n -0000249049 00000 n -0000249205 00000 n -0000249457 00000 n -0000249721 00000 n -0000249985 00000 n -0000250249 00000 n -0000250522 00000 n -0000250770 00000 n -0000251030 00000 n -0000251290 00000 n -0000251550 00000 n -0000251803 00000 n -0000252068 00000 n -0000252333 00000 n -0000252598 00000 n -0000252753 00000 n -0000253009 00000 n -0000253277 00000 n -0000253545 00000 n -0000253813 00000 n -0000254162 00000 n -0000254415 00000 n -0000254680 00000 n -0000254945 00000 n -0000255210 00000 n -0000255463 00000 n -0000255728 00000 n -0000255993 00000 n -0000256258 00000 n -0000256558 00000 n -0000256713 00000 n -0000256965 00000 n -0000257229 00000 n -0000257493 00000 n -0000257757 00000 n -0000258030 00000 n -0000258282 00000 n -0000258546 00000 n -0000258810 00000 n -0000259074 00000 n -0000259321 00000 n -0000259580 00000 n -0000259839 00000 n -0000260098 00000 n -0000260398 00000 n -0000260614 00000 n -0000260866 00000 n -0000261130 00000 n -0000261394 00000 n -0000261658 00000 n -0000261906 00000 n -0000262166 00000 n -0000262426 00000 n -0000262686 00000 n -0000262986 00000 n -0000263202 00000 n -0000263454 00000 n -0000263718 00000 n -0000263982 00000 n -0000264246 00000 n -0000264510 00000 n -0000264606 00000 n -0000264845 00000 n -0000264930 00000 n -0000265080 00000 n -0000265177 00000 n -0000265300 00000 n -0000265411 00000 n -0000265521 00000 n -0000265637 00000 n -0000265746 00000 n -0000265869 00000 n -0000265979 00000 n -0000266089 00000 n -0000266201 00000 n -0000266321 00000 n -0000266437 00000 n -0000266549 00000 n -0000266662 00000 n -0000266780 00000 n -0000266893 00000 n -0000267004 00000 n -0000267120 00000 n -0000267230 00000 n -0000267341 00000 n -0000267450 00000 n -0000267566 00000 n -0000267679 00000 n -0000267796 00000 n -0000267917 00000 n -0000268017 00000 n -0000268164 00000 n -0000268265 00000 n -0000268376 00000 n -0000268485 00000 n -0000268599 00000 n -0000268715 00000 n -0000268828 00000 n -0000268949 00000 n -0000269064 00000 n -0000269174 00000 n -0000269294 00000 n -0000269415 00000 n -0000269539 00000 n -0000269663 00000 n -0000269778 00000 n -0000269896 00000 n -0000270019 00000 n -0000270143 00000 n -0000270268 00000 n -0000270384 00000 n -0000270501 00000 n -0000270623 00000 n -0000270744 00000 n -0000270866 00000 n -0000270984 00000 n -0000271099 00000 n -0000271214 00000 n -0000271333 00000 n -0000271448 00000 n -0000271566 00000 n -0000271685 00000 n -0000271805 00000 n -0000271918 00000 n -0000272036 00000 n -0000272148 00000 n -0000272268 00000 n -0000272383 00000 n -0000272499 00000 n -0000272612 00000 n -0000272727 00000 n -0000272841 00000 n -0000272952 00000 n -0000273063 00000 n -0000273174 00000 n -0000273286 00000 n -0000273402 00000 n -0000273516 00000 n -0000273630 00000 n -0000273742 00000 n -0000273856 00000 n -0000273971 00000 n -0000274085 00000 n -0000274200 00000 n -0000274324 00000 n -0000274449 00000 n -0000274571 00000 n -0000274688 00000 n -0000274802 00000 n -0000274914 00000 n -0000275025 00000 n -0000275141 00000 n -0000275253 00000 n -0000275364 00000 n -0000275473 00000 n -0000275582 00000 n -0000275691 00000 n -0000275800 00000 n -0000275909 00000 n -0000276018 00000 n -0000276127 00000 n -0000276246 00000 n -0000276358 00000 n -0000276482 00000 n -0000276592 00000 n -0000276714 00000 n -0000276827 00000 n -0000276938 00000 n -0000277055 00000 n -0000277173 00000 n -0000277292 00000 n -0000277404 00000 n -0000277516 00000 n -0000277628 00000 n -0000277740 00000 n -0000277852 00000 n -0000277965 00000 n -0000278078 00000 n -0000278187 00000 n -0000278296 00000 n -0000278407 00000 n -0000278524 00000 n -0000278639 00000 n -0000278754 00000 n -0000278871 00000 n -0000278987 00000 n -0000279099 00000 n -0000279211 00000 n -0000279322 00000 n -0000279438 00000 n -0000279548 00000 n -0000279664 00000 n -0000279780 00000 n -0000279893 00000 n -0000280004 00000 n -0000280115 00000 n -0000280233 00000 n -0000280349 00000 n -0000280464 00000 n -0000280573 00000 n -0000280686 00000 n -0000280803 00000 n -0000280921 00000 n -0000281040 00000 n -0000281155 00000 n -0000281274 00000 n -0000281385 00000 n -0000281501 00000 n -0000281613 00000 n -0000281724 00000 n -0000281839 00000 n -0000281956 00000 n -0000282068 00000 n -0000282189 00000 n -0000282309 00000 n -0000282423 00000 n -0000282533 00000 n -0000282643 00000 n -0000282754 00000 n -0000282876 00000 n -0000282995 00000 n -0000283120 00000 n -0000283241 00000 n -0000283365 00000 n -0000283484 00000 n -0000283597 00000 n -0000283713 00000 n -0000283825 00000 n -0000283943 00000 n -0000284056 00000 n -0000284169 00000 n -0000284283 00000 n -0000284401 00000 n -0000284520 00000 n -0000284642 00000 n -0000284758 00000 n -0000284869 00000 n -0000284981 00000 n -0000285093 00000 n -0000285206 00000 n -0000285319 00000 n -0000285432 00000 n -0000285550 00000 n -0000285662 00000 n -0000285780 00000 n -0000285893 00000 n -0000286010 00000 n -0000286122 00000 n -0000286239 00000 n -0000286352 00000 n -0000286471 00000 n -0000286585 00000 n -0000286698 00000 n -0000286815 00000 n -0000286924 00000 n -0000287039 00000 n -0000287151 00000 n -0000287273 00000 n -0000287390 00000 n -0000287503 00000 n -0000287616 00000 n -0000287726 00000 n -0000287843 00000 n -0000287960 00000 n -0000288070 00000 n -0000288187 00000 n -0000288302 00000 n -0000288420 00000 n -0000288532 00000 n -0000288635 00000 n -0000289561 00000 n -0000289849 00000 n -0000290669 00000 n -0000292388 00000 n -0000293621 00000 n -0000295119 00000 n -0000296663 00000 n -0000298237 00000 n -0000299888 00000 n -0000301729 00000 n -0000303493 00000 n -0000305543 00000 n -0000307014 00000 n -0000308630 00000 n -0000310146 00000 n -0000311511 00000 n -0000313174 00000 n -0000314639 00000 n -0000316283 00000 n -0000317887 00000 n -0000319632 00000 n -0000321377 00000 n -0000322960 00000 n -0000324600 00000 n -0000325759 00000 n -0000327177 00000 n -0000328885 00000 n -0000330660 00000 n -0000332331 00000 n -0000333676 00000 n -0000335081 00000 n -0000336507 00000 n -0000338180 00000 n -0000339984 00000 n -0000341664 00000 n -0000343582 00000 n -0000345475 00000 n -0000347146 00000 n -0000348976 00000 n -0000350880 00000 n -0000352684 00000 n -0000354244 00000 n -0000355975 00000 n -0000357771 00000 n -0000359134 00000 n -0000360505 00000 n -0000362076 00000 n -0000363672 00000 n -0000365310 00000 n -0000366825 00000 n -0000368240 00000 n -0000369725 00000 n -0000371274 00000 n -0000372877 00000 n -0000374435 00000 n -0000376114 00000 n -0000377718 00000 n -0000379099 00000 n -0000380587 00000 n -0000382363 00000 n -0000384019 00000 n -0000385854 00000 n -0000387487 00000 n -0000389028 00000 n -0000390653 00000 n -0000392061 00000 n -0000393607 00000 n -0000395358 00000 n -0000397087 00000 n -0000398832 00000 n -0000400320 00000 n -0000401938 00000 n -0000403583 00000 n -0000405111 00000 n -0000406632 00000 n -0000408438 00000 n -0000410091 00000 n -0000411525 00000 n -0000412961 00000 n -0000414382 00000 n -0000415695 00000 n -0000417304 00000 n -0000418730 00000 n -0000420214 00000 n -0000421813 00000 n -0000423286 00000 n -0000424830 00000 n -0000426374 00000 n -0000427787 00000 n -0000429393 00000 n -0000430947 00000 n -0000432472 00000 n -0000434132 00000 n -0000435688 00000 n -0000437352 00000 n -0000438948 00000 n -0000440681 00000 n -0000442464 00000 n -0000444133 00000 n -0000445746 00000 n -0000447556 00000 n -0000449151 00000 n -0000450970 00000 n -0000452640 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(s\250\177/\236\324\354\262\020\375E\321yaVq) (s\250\177/\236\324\354\262\020\375E\321yaVq)] - /Info 1085 0 R /Root 1084 0 R /Size 1398 >> -startxref -453359 -%%EOF diff --git a/z3c/rml/rml.dtd b/z3c/rml/rml.dtd deleted file mode 100644 index d3846fb6..00000000 --- a/z3c/rml/rml.dtd +++ /dev/null @@ -1,2236 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/z3c/rml/rml2pdf.py b/z3c/rml/rml2pdf.py deleted file mode 100644 index 6add767f..00000000 --- a/z3c/rml/rml2pdf.py +++ /dev/null @@ -1,70 +0,0 @@ -############################################################################## -# -# Copyright (c) 2007 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""RML to PDF Converter -""" -import cStringIO -import os -import sys -import zope.interface -from lxml import etree -from z3c.rml import document, interfaces - -zope.interface.moduleProvides(interfaces.IRML2PDF) - - -def parseString(xml, removeEncodingLine=True, filename=None): - if isinstance(xml, unicode) and removeEncodingLine: - # RML is a unicode string, but oftentimes documents declare their - # encoding using . Unfortuantely, I cannot tell lxml to - # ignore that directive. Thus we remove it. - if xml.startswith('> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 455 >> -stream -GasJL:N%0q&B4+(r#OYAWR;6[eEc7_.*fr$Wgp*&ONi$:L'8CGrlM&kXQ)iG;FQP+R!J;uc#Bn7pj@91E34)!bJ=A3*aD_YC58op/q,>fr(5WK1iefAF-b)(cn?3GQTs6d`\C[(n4g/#U)7n,<1c,8>ZUT$.>eF\O0.aG]lEusFugKGIKoHcl2s6LUG!t\2ed2PKZX+c]V&:ZGsbMfh*;!uI]$3PH&6CRTP"R>f@Ej2T((4lL:WLk=^!9UhoJp"E,sI)inA^l:8Z&g6[b9iMmiWVP1Z_3@5Ok&AG$7gU_99G'9`%')"a2$8fq'0uhKV",3E[g17PRNI>9Hp^9%kX!@~>endstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000559 00000 n -0000000836 00000 n -0000000970 00000 n -0000001239 00000 n -0000001344 00000 n -0000001941 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -1992 -%%EOF diff --git a/z3c/rml/tests/expected/encoding-test-utf8.pdf b/z3c/rml/tests/expected/encoding-test-utf8.pdf deleted file mode 100644 index 9683a046..00000000 --- a/z3c/rml/tests/expected/encoding-test-utf8.pdf +++ /dev/null @@ -1,107 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 454 >> -stream -GasJL5u/FS&;BS8nfQ^CX^JEIDA'Ie+usX/FY@D]Asr"SHL5*e.HT15hN1>]+QSY2cb+Q&AiNmVI(J&5pni#=jkp2T#;.M5FbPgDcQ;4)rh<[)XQ2FcV_"=CTpsAK0E5gS)i&5U^t6OtLgn:+YN5L7Qdm)lMIM1p@H1O@B3]Y3+)6/6rWI?Sobj\-W!gN9'`X>cs>#q*j'WX)](5f2OV6)CrYE-U`JI`iRZac*=:V5>(/JJkB3Ja+2Dpm-LIXi0R6l5*#cZS-&j@^4U!6[8rXDQ!h4^H:D1NE;bQ@9_P>Edoh+(QBrM6jOKhdDkbq.n2>)!X9S[V<[[)pU0".PPR>c@Nn3#]u9Ll8&f=!o2L@U?P(gWq&pn!(Tl?Ym_ZSQHjYUdReTNR;40m:DN..i5?-C[GBlkB!D+5],Z*<~>endstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000559 00000 n -0000000836 00000 n -0000000970 00000 n -0000001239 00000 n -0000001344 00000 n -0000001940 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -1991 -%%EOF diff --git a/z3c/rml/tests/expected/printScaling.pdf b/z3c/rml/tests/expected/printScaling.pdf deleted file mode 100644 index 056c9a88..00000000 --- a/z3c/rml/tests/expected/printScaling.pdf +++ /dev/null @@ -1,102 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog - /ViewerPreferences 9 0 R >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20130305225909+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 194 >> -stream -GappW5mkI_&4Q>Egu0p:7Es>jR'!#32o8fB2Q_rqU<+H1-LcnE$OFhptO_6!)8u(,(9NTt(IO7<+@(]#B2=rgtQiC5hZK<7lJibp-%X%9cD8t'7TsqOm/fl@:SqH8^\Q=FT'=MULkiX8e$=9PqV\D\l#"6E_ao~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -% 'R9': class ViewerPreferencesPDFDictionary -9 0 obj -<< /PrintScaling /None >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000810 00000 n -0000001079 00000 n -0000001184 00000 n -0000001520 00000 n -0000001618 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\266\223\013\225\230\266Y\231\206\3278`\331\265G&) (\266\223\013\225\230\266Y\231\206\3278`\331\265G&)] - - /Info 5 0 R - /Root 4 0 R - /Size 10 >> -startxref -1662 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-000-simple.pdf b/z3c/rml/tests/expected/rml-examples-000-simple.pdf deleted file mode 100644 index 61e5b97c..00000000 --- a/z3c/rml/tests/expected/rml-examples-000-simple.pdf +++ /dev/null @@ -1,127 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page2': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 2 - /Kids [ 3 0 R - 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 139 >> -stream -GapQh0E=F,0U\H3T\pNYT^QKk?tc>IP,;W#U1^23ihPEM_TN+I0SHG`19f970NBe]1tON^#g$)nn4:gGa]Abo0?Ql6;fKo2.P=R(85)fZE%+C1ccf&6endstream -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 141 >> -stream -GapQh0E=F,0U\H3T\pNYT^QKk?tc>IP,;W#U1^23ihPEM_TN+I0SHG`1pYUe1p^"42DN`<;[CKFd-sTNaiRTicS*F4d8Lendstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000926 00000 n -0000001061 00000 n -0000001343 00000 n -0000001456 00000 n -0000001735 00000 n -0000002019 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 6 0 R - /Root 5 0 R - /Size 11 >> -startxref -2071 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-001-cmbox.pdf b/z3c/rml/tests/expected/rml-examples-001-cmbox.pdf deleted file mode 100644 index 30af30ca..00000000 --- a/z3c/rml/tests/expected/rml-examples-001-cmbox.pdf +++ /dev/null @@ -1,150 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Oblique -<< /BaseFont /Helvetica-Oblique - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.0086924a45e007495af99df70126eb1b': class PDFImageXObject -5 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 197 - /Length 6121 - /Subtype /Image - /Type /XObject - /Width 309 >> -stream -Gb"/l^Q0\[&]ap8-\i2ucj=5N-F&B2*&rS,^lh8#OU4]pO9j*&8&-nb>+sIunDF=o/>mXT=rr[$BDR%WJ%V4up&1g&Nh&*l4]U%geQ"JnQNZ=Gr;>]n!F(J*G^*p#HHF]L]j@1dnK,0gdo5Qk9Wg(ia2d_)R_X]?tNb24efmBAbN\7?-qgiM?9+l[j9FF.,f.0h,>aJ4T!e!f,pt&fi'8;(*m1jGCFE+ba:p/WDDLQ#8>d_(GFJ\b#3L@5S@_XgeOYG<"LZBEN]52BJs0"[=2T^ATc;!pi#Y_)&U5_n)bcW'Ypt2WsBA[kJ1/7hnHh[okpVZ%6'1+LiGmhO'&U(Aq:iq=]S]>I&TX4;1+ecDtDqI\,X=(=*+\eaf`p=>RcFTS,"6`R&Jf4:T+YbehB)d`n8'gNj$IG<"LZaMQg!6S1u!E(`dM3Dp,Bpe4%o$]AX9!iCu=?ak97=kJIZK29DK(/Qs#rFl9lps.>"get3:*6A1&I-[@:)d#5O&286kk?2\2nOuuCgcd,6bpNNnP$ErGbuY._BruaKl%)TpiP9%"aA^)pN-oHZ`ojPi"f-J\c$4C3;?07n-P"c)T"%AP(m,lL4Fp&l7m0b(:GC1_Bs!4qMj;0["-+O8K&Aj2!!N@&Q1lCcA(kq0>;`.`V5JfqR`A%GP:;&l6`u)A<_RlI'WOl25L34n+?PD@.?ogLaX:BSta@rSn/_tiRA!Wu'H>9A6-h:WLWrkgr3h>G7\r`4KOYJ34*9u0eUm$Tf)q=>%5;Yd<_rj2k?kMs#RlLOS*msu,EVn^O2.0i%j4E(&/n9lq;6r.I0hIc:O.qCO=V.e/\VlU_ZBk1P"pQLL"fl_,&1F]Z7X\^Utk%s#65I^q^7?pdd;5NRC.8ACV1Xo65@9]F/Ufhn"`K&c_pl6Ia6d*)C(M7+=;(e(-,42XJhV@YMWK?Kdp`NS6Vae68g>)Ds/=r8"\P2"@1qD4uT2()BO.@/VcbB1OWHp0H*W=K>`A@)cAMS7iJ1o>_*bb^?`=1S2UMX$F.#Va#;(e'B^q>/9DjQN^@`RGTpmr\Ac"AQC/F5K4-L4l=YHBSsOO+6!af2%g]lDfd46S.`"q497efY+daX[@8,$g]00c&G7\_@o"Kc,46qqsR"._!U0BrYm6l?T3TQV$!&.rr&@8(.MD5#jEA@5qMjrMH0sqTrr1*]T=Fp-TD+iQMu:3bhi$%":EcI!GVrJQ^*Pn[KCS@>/1%:g#^BB$(pDaCpA#NFj^3-$^l_idh2_Vjlp<-eP<-#!ep#K%9]_r?8j5A:,e!u4a]Le5e:nGV4kUgoH7G8s;M^W%rStJ.G``4R]P-fT*X\pFq5&lHZW*f=W"c7-N3l4f)3EO2O$1aE,:<7HNr^J2,&(bSo9Md5E9dWfdl`IVrT/#^$AAC\W1JGV&0;@A#]-2Rko+E<7XU.d/1*toY((kdfMAFZ20Xq3CQ:'HCDE[`YT.18mh\psIZ?piQ'CGnrn_cc^`Z/i9H$ZTN:K!o?M6iAg)G*VN%hCl!)3Hg,(Ss6=M&.(;SD^uhR'uV]F2cbjB45L]S9-<#dN#XdAfUF_b!=p\)B+bqo_l0V8eeV8Tb"%GJal;]0f]FA.6e:1:He*NYdHbS@4M]aENCqRKd+iH.>i6N?bjT<9r9DQ",ZE=b/eC9#u.C.!N+^u>(jV'PXhPUA3Y?TPnl;^Fuojs[DBDV$p1I:*NRl#0tY6oT+":IoD0h-<(2qkf[h9aY]T,7?U&oH-V>NK!U2p:$cr;gVpKtW*iaOncsP1V34C:Z;/UHQ$7"P3t._eul7^ZG6f435R$T2@M'TWZBAcW]S'A*Z$NDc;=_a_9)[q<(FQD)THN>"?!FgU_-`+kKI(b3n2'1BKdm2T>ueR_-><7!Yc/_'/\%So?(PU9X:T$;N4.+>]fbsea[!]p0OTW'_UiDV@Tg_teOP.85=DiPTCecsWUOrUiHJl!I,JIdGS>."hN(`cgW`o8q/pU3$4hrI0q6SHl!r&gLbAk?seYiV#ZV'a]0UrZ\(a[]7Z8\n\lgp)52-#5=DE>5')se\0@.F74$stC#^!-q2>X/**U0gi=Zf$\!XFW/1DtGc^-njf<+q)#Y9Am4_C6uF`E6HoP.,6[#*jaG<7b`@8ASR#d)&lkQiF*&kAOE&<"WjhuaL0G#-Sft"P6PAJ:RtRQ*#t#k)r%kq-.W8We>(J+*XgB_hc7WOna8!;Xduhq2Tc'`lWA%E8Ji;@'(lApkQ`:$GZRm6nF2cNm^<;d#-METQV(d*PhTb[ZZ&k,7)2]aW8AYBi:Au;"6OO;KkH.A!U6Sqn8JLVGIL@?nQ6+T[`cV9]AFB'Uja&+6jlO71pTr4nKbMXggi?&p4][JK5aC9?Hh"W-=-hAgKQ$bjt+.mF_&`(AI2E"'uH4C^hZBk^C^Mg:\C2$6?8bX8Mbgh4#h-!X39#-8p+Z)AYklfHcAuslfo.AZ/YgaK`mfYV;YS3ULC`A=&h>.>UHA=JJI'bpL\X=Z-1eR[*HN08.iRVl]8\.ctFmo\m:JGiJDM[)g,iPLEkOHjl9.T)(t#B-)9CVQDmuNMM'gDkqmg^$]?S&^(dPUVt7cD(.i^9MkeUt18.G0?G["L[kqH*;akRCI;Z@GD-QO!pOBWZZBSlOPtOtGJr`OXVh.0;XA>_E=&hk&9soY]\#;(Si;35/^6..cr66]of]b;5LDH1+:UbRqhE"8V+M&l(djjg.ieX`)#Ue,th5G3SVlNgA3m=(gLSTJ:iI&./:5qW[;E4h>bg;\qC6NY@bJrt.Gk>t*Lp'g<9Hs&*WsQnMi;5)TSuLO]O"NO%'7@@N3hBZ?BIAR,WY:Zsa*H'.QX2%&LsO)q80Ii1-7aFr27#iN.c,SVrfCTGK[\t/Um73ZhgcpgN3A/P=M0`PF-'9NO)KHaq$#Q$87Ab+8>YEC%tas\Q\E;dfQg#pf_,5K"E2a=tRcINl>,CBk6Be$lZ-l;ZbjhHn*MbkC-oS&/^oq/_SEAIA>;EAPRj<(3GpsNqqK[37#Jna96/;%JgN.qjaLV&JBWApQX=WW&,8U\9E%JW9<^@Z#rj!%HSb.,TE-e&bS7L4gj],Z(Y$T'gY*,;q`.MN$E7;/%S5E-QUu[k12@fb`PAlcJn-)lu-5Doepn;9uST1[CVFiXXACO3Z^qmdq\?PBM0`[.\j7]ASi8B*,l]uZhM%-A\VkA?VqbnMSnEIB($^_4Dm8",*_3[BmmO>CAoGl^ue4Kh1Kh^":^'7P4l^mMfi8A\4iff:Y$W&dmrM^8jpsqSS2W/IWDL\Yg%fULjb"b\4lShG"^U3Fq^&`u[ES]Ui0G0],T,'*gS#!mV[Z"Ch%QO7-_KHNh>?ktXlF8*s#:d+'OXU[>c>dq3HXP_+d:CFtSVdXZTW12TAZiD(nVBP^;YM[E>#?6I]fH^p4YRP"V2G&P5D&K`Z*H:M9L>WhZ@2f7X51:(u_W$uuaeo,*K8ddo%a=M/"0FQVHAmpl[/=pP]3;?07E!s"V%06^+BaATbnOu<;Kh^"RDHlFumNGsR2U`5m!pV,-Y1b>54#d^a,)Vf0[Mq\uG$FoV:)M20oE&\r/JMe+2T&"nX\\H_NGO?o>"j_]\D*=oW\Ft!/U6eZ2QOhKCq&>*fPFTJk?2\rgNNRUBaAT2QT_dZNG/Y^_!UD\M))d6@Ab08/AeQ-~>endstream -endobj -% 'FormXob.c8ba08e347e6847214d84c863a661d07': class PDFImageXObject -6 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 45 - /Length 6345 - /Subtype /Image - /Type /XObject - /Width 2008 >> -stream -Gb"/l^M@+F(_PS==SM+pNL-W1X)>0#dm+i=er1NUi)1\Y4hpS?,j08h(22fF0%]DBg`B,1jTzzzzzzzzzzzzzzzzzzzk[`]qf;lL_m>oGng:FS8q+e=j5Q,n@fi@?+-A+3PQIl2qd,\3IgA4:UZTq_3I9s6/A#Wsz!!!#BkN:Sj=)L,OXrS7I$B5_fZ<8ig+dHJ+9kj2/3Ne[D!p+'>nlY+sGBg?G;Y=\fqz!!'CG[qcS:l^Q"Dl"Fu(&Su=.'X_gHq!U=o5#p^be'WQfLgI9pjZ^&.RS*Ehg!s=6[/J,WX\1@Y[\('9>6t90z!!"h&C.5;;=gWc3nW;=i>\,.,a](-iK\#;S4FXH@lQemrC@=,Q2dX";0-nYP5;&W%LY1.R.%LFRi,.nmE)Ql&%I=I?S2(*R,[U3.ai"33V=4:"]Bp3T+Q2*e`$2l5&Q4=99/M6o4YuHM-p`bO#N>=1!aAG*q?4TYgU>CrBk9oeSd9J@2-6HbDIa\0).-Nn(K1Q3G<+ZUpd!J2]c#?iftl4@TAOtlq;;0XlG]aOq\Lp-20L-4,(8i*Aopo(3>8QLPV@UR@BrBq91>,:(SEoW_CHAL3NMWPOmeHRm&/q&Jdp2W:/;Q:3cV;Wz!!'fSAW.;'\I(:a4rQPMd-s;r8qRmUoMR"B,LgHiBLZ^N^YZN7rM42mKF`CA1+gb)%#=JpT[f8"QlUHVrJK1?269.AT[0^>&^?'4*XSh]*dkV\jr;TPp9\,[R&`jU=`ZI4(KW*l=1>4'HRZMR.*%]2g-B>TO@\]cDOGGqUh)IObZh@9\nr&6hIf8X7t8pu\GUH9n3Og;oPn$&nNKK7As182V32QWiEB?B];9.=<4a]hQWO(kdM*"k:"o#XH4nML"onW'!!!!YBllGAj.3t:B[_b=IH1:Pj^Q+El%mfKN44GFLujWuK0A>daqc31U8[!W)%N@;N`Q`\f!`f,@J=2fI?&&4o36Y%q8S1gaD$NY*B`MDTbnl&!LmK!^7<_;8SS^_DH0*&`%mS`*9ZYF)D,&n"/+<#N(@C;MQ7>%"D)A<]?P>mdUe@P33sKris!,"D(10X8E+J7P.h%g1B6PR[Kdb+)%!`]WhM!;8\OY#XBQ(K2QW+A\bl;`2KY*(V(^%KL^X+b6M'H^h\a^q=rKFgHU+bUCnBH:[)L&-FW(T+I$3>KQ!)4.PK?skHiYpj54+gQHZ^O_72tK>0<'1P3M&l@8GJN'n:fP]-fAYA4=[.)mmbI.4t-U]EOL9@5sBF/cG]E9Wl?V8Xp>Y#U+j463s9]bP8]`.B&I$r4DMN)s*'Y26g=a*:NPqdB7KBptHBZY8nWLd,NIYiVpdae(pLf^f$DYt89-==Js'B^AtHKFgHU+bUCnCEtLVqk,H;^#![J)YQo7XdnIUmlhh"CO!8!7Y[2^3F84]W];bEC2V9".V#obh:hAJ[VB#l/82/(9+/p&FE2d#4]NN(F#Ed+VrTl#J008b)=+m+b\(3d::/JOS!G(A%q1\k3f%GcMTo8>@dhA@K`+g!9c"R.n#TNlpEXc9[tKA/u;hXUFlC`XV3r<7ic63n`f&4.aC>+0Zia3^nY^D#hQi%^VjfqUa[=DN/h]8W]3GYP[=WVLI-YH0i-e=X1Da]35QW@P@NhUo34h'/tr9#J*4q-#XJ$e4\*Wo:.Q+QkcIJ04e7XkK&jV5d\Ll"lbt>9WS&l*JK[GU"M3ofV,^iJ.q5J<*h@g:c3:G/1r2S[I<=MjEo:g"ekL1*C9\T,J^bb7;fGknp;J=4goL.Z"g*#U+j463naA>ZK7c8,U)I^i+7.7RV!;9G.MAD_u-@G#6_Ap$>_$4.i+N0+CjhN%iij/=WN%Bip'11ojI-1"!!UGj\uX6edjr]s[[]Lu45N4e4:U*:Pb5K;3`oR<9\-O`=lQNjV\-*@p"q;pLC3:]'$jbrS$SA;WtmUjH[@)ihMcX"oI,OAEXJOd0hQFD)s?9=$\GGYXE,#U+j463n`f&6cY]F27S"^)@XN:F>OP!jt8.m25im(j8a/(*h@NCeO)6[h38>qMe4!g'XtRX3o`t(uAQ\!uh?)^6,*pPJmM@o=9f\m:a4GTP9gV[)uqL\&RM!K`7"""+H[KP42O&!)-)4[>E0j%=`Hj$b=8P+HTbW>'oXb&>MmhLU`c)Rm`":#s5KlT&-'g7n%RS+&?biT^[K6nH8=,H*oB'CS2Vn""`7/Z!2]XtD(DEZZ1E^bb"iT9)mfJ9p>XNo"k(n#nr9b5A]HPT9q7"#)^5P2KFgHU+b\3'b-n:?5.kadCt+X#ps2q[P8gsbM";^YV^XDq[.`5!VdUdG?)j;HAaj5/_LG?;4fP55D"H>Tb_@u%T"i(HSup8Pn$>8XoA$dLD5AuYo?@:`cA=U41rr]lhr8B;924HoMc6O[YkaF1eX2#RY6ADt/=^/63BG_O7SU5QkaruPf,]$pN5oMBAJo?LCI02a4lO+qhEf4[J'?tVQiI*dz`s*dQ8lSJ8i'5iAn06#i^5WE9_2@mh_iOPtZ?T4kBn5SuC?[gc0(g:sC04'h[sJ_tGO0F1cXU2aa,\q6WU;*T1uD5kXR^djXR\g5baE/T3,q^C'I/gMX_`cnHZ?IagIE@[q=&l]q,LUYF2,_onh)lg>4=WU[#28Od>C.SjPTZ(3el'_hgGTsnGNgsz!!$+Y4Rp#1(=TQ&PU<;j*P,D`4%6Tu6>8cmK;;2%F'*aaL@]$/`-H*kFpW`=*1[GXh)<5&5ka(R&r+B"6W7@.qo%[2CrDuB9OeV"g+z!!!",Q20C:?U+I!4#8V:SA-@7Oe5.u3TRV#CW?A(MQG5gU/$`IEe+^PCZA2&McSo%h1`t=sq)8k+5O;H:FsugiHj7cU9Vr[W(n.$0aMHQ*LA;]stY!]smb5p!9ui=atndmJVs0WXaDARtQEW%n^?&>rqdb#YtKGJsKi.3M>2WSR\HQHj-,b@?#'a82!OD#=g7C7XI?jIP/CSJHl/TzJE=)KJ!_;@B)&;FBQ8lsYHmcp3@Dto6or%&)_5D^]*b@3/l%nsI.d$%,/"?]q;(cu[i\!i]/g\hkfiBmd+'58OpRa'BfY"M21:q_5QLibzJ)@BDpR~>endstream -endobj -% 'Page1': class PDFPage -7 0 obj -% Page dictionary -<< /Contents 11 0 R - /MediaBox [ 0 - 0 - 616 - 862 ] - /Parent 10 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 5 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 6 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R8': class PDFCatalog -8 0 obj -% Document Root -<< /Outlines 12 0 R - /PageMode /UseNone - /Pages 10 0 R - /Type /Catalog >> -endobj -% 'R9': class PDFInfo -9 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20000101000000+00'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R10': class PDFPages -10 0 obj -% page tree -<< /Count 1 - /Kids [ 7 0 R ] - /Type /Pages >> -endobj -% 'R11': class PDFStream -11 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1149 >> -stream -Gat$u968iG&ADpLs']hg1,057I.lbNmUMc$lu8gbj8tL;Ll*Gp&@ANghd''CA4mr@6P9Cn^#/70"2fo+[:fSY1Ut!U^jX9Ri.2\0Fq:4Njl6/X_49$8YKI*)m;gV5:4sC%$_^]U+r7_=g)U238Jk598`\2Q'@!'p+sVXSF`8QCc6krsUHOGBq+cV:^!&kgTfqr3Eq/'SjnlEpZWsktk]69G-^:+H]kG\#)7.10KK*+#f##ttBB277[VmGd5Jo-kY+OT;p((^&B<@Z8eRb[ghq8B(04fUT+\36%K@E>1F/Mb0\'@.VOsou*&VQ<%jG'C$e$=iKpEQ*t*'WXJT?n+H!4`n9@1Z8*m%q*6aTY>u.YqZ#"L6:*1'rg`>)=Ze-&YR#nO"H]G7%8:0^unLQk4Wf%_;p4+O=K=p:M&POWECN0g**\`%7HFT:3d$?_GU_C@,`9q1P?Wr7fbsm'X+f=d[Id_nG9bUKG]Xmm%=9na8jFdf=^K6*o`@V%!jH/6'#Uh&:)]61hi)7Wa=e?%JB$GL[Y_=]n(PH66O!X.griL$kP.+U550I//!lq9BirX_O*VJS?(<0.ZLu%3@.acfb3>)ANa3cpH%jobIV$p>uYW.sRiY%2Ad!,)TMT#76(Fi7`C*U"7sb+OS?+maUtCBqd,OP/<4`IgE`qm%b5Zd!HBpl#?^8l]I%^l*2<^W>n/;fFaquXASdaQu/+jendstream -endobj -% 'R12': class PDFOutlines -12 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 13 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000573 00000 n -0000000795 00000 n -0000007195 00000 n -0000013776 00000 n -0000014160 00000 n -0000014296 00000 n -0000014566 00000 n -0000014673 00000 n -0000015967 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\223\367y\354\321\362\222Ju\262\315V\3448<\372) (\223\367y\354\321\362\222Ju\262\315V\3448<\372)] - - /Info 9 0 R - /Root 8 0 R - /Size 13 >> -startxref -16019 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-001-hello.pdf b/z3c/rml/tests/expected/rml-examples-001-hello.pdf deleted file mode 100644 index 8be6cb81..00000000 --- a/z3c/rml/tests/expected/rml-examples-001-hello.pdf +++ /dev/null @@ -1,136 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 5 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Annot.NUMBER1': class TextAnnotation -4 0 obj -<< /Contents (\376\377\000X\000:\000:\000P\000D\000F\000 -\000P\000X\000(\000S\000)\000 -\000M\000T\000(\000P\000I\000N\000K\000)) - /F 3 - /Rect [ 0 - , - 0 - , - 1 - , - 1 ] - /Subtype /Text - /Type /Annot >> -endobj -% 'F3': class PDFType1Font -5 0 obj -% Font ZapfDingbats -<< /BaseFont /ZapfDingbats - /Encoding /ZapfDingbatsEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -6 0 obj -% Page dictionary -<< /Annots [ 4 0 R ] - /Contents 10 0 R - /MediaBox [ 0 - 0 - 612 - 792 ] - /Parent 9 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R7': class PDFCatalog -7 0 obj -% Document Root -<< /Outlines 11 0 R - /PageMode /UseNone - /Pages 9 0 R - /Type /Catalog >> -endobj -% 'R8': class PDFInfo -8 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20000101000000+00'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R9': class PDFPages -9 0 obj -% page tree -<< /Count 1 - /Kids [ 6 0 R ] - /Type /Pages >> -endobj -% 'R10': class PDFStream -10 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 674 >> -stream -Gb"/$?#Q2d'Rc%,s)=i,'<(B_!b@L-&<,E/G_1e8+Y;R,Ip_u[?fq\tV=CeLRXIU!$fOPQiEa2G0_XlBL;XN&N2C*/1kB+\W%jdSk/8S\'b)%djZ`5eQmKFJe+YC^Y9#0IF2d]Tihob$llsYu"Z%T\FuS2UmHhdI=\#2F/>\L9DaSVs*DBjUH4./j9VboIVRT0@auk2cLs\cb-\e"X3]36*Pu^kjPXk--VA7EV`Lh7l`FB#>MH290bFE:859;IpY9RnUh(@u0_@mT/V7&^5,$K$)ic)'g6?'o&N2_(P=YN7L-qlRobc!,A9NCja,<5/l9`<<4ZI[[iI'?K:>0W)[Cm1FW(]W:Xfu+uHZ:UhE:;aHF3a6A*WACC])8nSqCk8nrNY^'Slh@eZ#04.*/_+W9R9\i.Ib]UtW+e2Ek2J%77Uo)a.VZi:"VN,8L.kFJGK0su-du!#2;Y6,mrV5&hllM8m'F#oF>j!/Im:.e\c~>endstream -endobj -% 'R11': class PDFOutlines -11 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 12 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000600 00000 n -0000000856 00000 n -0000001030 00000 n -0000001318 00000 n -0000001453 00000 n -0000001722 00000 n -0000001828 00000 n -0000002646 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\223\367y\354\321\362\222Ju\262\315V\3448<\372) (\223\367y\354\321\362\222Ju\262\315V\3448<\372)] - - /Info 8 0 R - /Root 7 0 R - /Size 12 >> -startxref -2698 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-002-paras.pdf b/z3c/rml/tests/expected/rml-examples-002-paras.pdf deleted file mode 100644 index ddada1f9..00000000 --- a/z3c/rml/tests/expected/rml-examples-002-paras.pdf +++ /dev/null @@ -1,322 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 5 0 R - /F4 6 0 R - /F5 7 0 R - /F6 9 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 18 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'F3': class PDFType1Font -5 0 obj -% Font Courier -<< /BaseFont /Courier - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F4': class PDFType1Font -6 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F5': class PDFType1Font -7 0 obj -% Font ZapfDingbats -<< /BaseFont /ZapfDingbats - /Encoding /ZapfDingbatsEncoding - /Name /F5 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page2': class PDFPage -8 0 obj -% Page dictionary -<< /Contents 19 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'F6': class PDFType1Font -9 0 obj -% Font Courier-Oblique -<< /BaseFont /Courier-Oblique - /Encoding /WinAnsiEncoding - /Name /F6 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page3': class PDFPage -10 0 obj -% Page dictionary -<< /Contents 20 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page4': class PDFPage -11 0 obj -% Page dictionary -<< /Contents 21 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page5': class PDFPage -12 0 obj -% Page dictionary -<< /Contents 22 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'FormXob.ce52f900887bbd9ff9881c236099059a': class PDFImageXObject -13 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 86 - /Length 3441 - /Subtype /Image - /Type /XObject - /Width 130 >> -stream -Gb"/kc\l$s&BFP1_2Dt)$d:1-71_WG5t""8d$&bf&I]R7/-[n]Ci0j46p]$_"a0tHAPLlrJ9CjJP]Q3:qi]L#Fa-T"Ac's+Mn;AA&B6[X-o?:8=&#D:N"#.Sd_Jd&9nAMZ$Rc?Cq]/Y@kGCugmI;S1MEQ=hE#?fu]AM8aaT1Fe#Q@"WD]Ve6J*7aNZ3-FN9]5r]/8)?iJrSUU\&9qs,l-cZ%,@Ga:aj1tI*.E%7]"0q@K7*%X`Af\njiWkC+51"lqO*V0*PI'PBJf1OT02\,Erh63ZEf)S^]!jfHpmVVo1#\nh"B/Yc3VT5AJc=Ij'4BjV:+2kk67ig(ZqPk)\b0r:qcXj)4V):BjW1aG9sr[">($q&@&2IVjUXKB`Q6S_#QPVQ<*!=7!gZ)uuaUP>9uEFQc49!Pn$gdSY2"9^dV)^&'O6ZPLEmUUKj=0GrtOFg]EA_)rZ&;rVG*uIo`F7LH(Ktl%Gc6>hI=B"D!/K;VVAbkh_dMaT?"DMF),S/hm>a3)l7K"=C+Ak"]sJfAU=.%EUKQU+N.i;Q//H.6[FEoi_BsN%kVaghJClIbg7+JB.Che#fJj1ZLr,IdH\qC])p?cEfgQim'seq:@jhddafm@3jBfh:gMK;$:u_Tu`Ef5+:,^BULR&2*)B/@nCjXR21K+c_NWo*aNDp9X1"d!$,2'E=2JJn8C4$[G>uV@nc,FbWK.kk;5bN[lL.ac+H'4?u]gpgIb!9C[Nt'diDUboZDk3Q6bqekZfLKir0p'T.OkEb0"GQhe^7P5tiPEKg9`>*6*8=eoGBkm.`S8P!!VW:p8uuM*7C(XQ669?@q5$Q4JD5R:NNg&#\*=Lcs_Ys-4ti8M=plM2=X[jDgXP`d5!5=A/'/D7IZWLoh%R/5#uJD-R#!Ct4c/.JK\;hPKdHbZ*&omX+;2N/bA=BSmAO_!:.d7kKp`k(#fe%"%)Bc>TQpKJ^XW)gN/-g9n9KpU)/\f1$QU>slYX%2rG"CReW\5cHb`#!.+i12ka"f!N[]nrqE:aVl=hB+OEDSh8`2^pdo%QR65*#mk%-#X[",Ofs=\_!N!>3!HV)troQI\?^9^#=7,?QpZadoGqfh>,"Q3`/l#;<4!6LL(3mqm;>D2;-DSjMNd2a'#ggd(q3&M5_iUbYsb]ja""]dcA\fuB?iiO&!^PLOi35WqkHR'-KR*aWf^n:jJn&Tb3('.eah]JEM[&j5^)dgEdO)BF`>l**+9SmWp06Tn\hjj8O#guco7C$_cFSN8udG_'JXgj(:e9P*nnOK[6iK?kn>.LPi?]flJeri[+^]1DMBV`UbNOnV1U'HA3WA`_,Z[[YiY\F\l."XWK>CNV82<:lUW2MZ6]R1"(Qr"9LlJ0]N3]b>>DbL9h[9,de1[W?HDg'Ht=lel/IrgDER(cMeqYC#aZQTG"aM>=r:+og:N9?@rW_D09;hA-aAd$\gEY138bbi'P@0Q6YOP7nqSA49.ffNT8-`cPF!35;&.X&;Js0qoSkiQG5a9P8WsU9K*A$nP[U&kMU"o>YqIs9[^M%D9[uVM0$DR/kl(\cZXB55OdZGEad#;2dKHA#SogbAU\HC\3:Ss4hN7P.K,`5-`og&N[dDq)aI.f@Q[uXZq(#J"84k7RM9GI6Eu=ob5#K["qZi86D#mOt?F/UJLHEq@EFtnV[YYJGC0N2k#UGs_O)`e)0)d_`U4<:#BZoVfh*cco3&^>XC>$l0:NDf3PVCPLkT+K[Gj[;*Mi.`B:GfhIC(l@kjVkHl1:7`XP[)fE9FEV_$!\TETGUITa(dFf,"t3A+]Y"B=CIq/8;/4FH0h2\_-'@F`\hoa*j-]Y^3`L_r8h1=p=Yqo:=/;_DBHiBuE=[u4d*$B&Ie"+Raq&W57a\Ba#YK`!"66+NaMM5$&r>Bgbs;^cVM_sYUWoa3HQEjJX@)NI.r?q0!VETqhE@j3RfpT"pBK,="rZ_6UM,J9AsiZ&.PVuI"=kH,W`(^\H^L/0Pl;f($GEt/HKdKa-Z[#mb4Qck:NdTka@p4=AMKW!n2kO%iX4a+%PsVJqh'Mg+P*jW\U+Mhj#iUt8&bn)#YWO)\+6#NT0,TqCkQIFZS_tQfq9j]iEWVSG/#.HH;1Ks+:^BgHYq798DlD2M\)Jj:bFB^hgC\o;H:%"`HcWs\CTB1n`h!$E@9Mgk%VV"54r_tmMGA@":V56%)>K12KnD(SlW7A\OSmlGX,:m0V8WqK![YP?b0[4SD:rC-*s.&GJA78Y!'=J*A3?!5Hnp!m]cU73i^-fm[`,^NS554-[-=Z5\`Bk;o;Z;nQGDC::$=t0T\E-1Y=kP3K%I"HS5IogSDcLLBO3hleVhS@CWc(mO8<;,DEi0!5GO>7RPopn9ZYXJ#O"H@C(tsj/.PI+-Y"pJ@=gj.uGFR3Z+[*^=BVXt$Cc*W1/+-B5+alZI1hBZo-/BldS`68Ql\;k-:(?g%7u7$pCe%rKe94K)B.N>\f_[4(&VtcnFh/?.eBk5GO<,P\GA;#]]3$>VTQBYBGrpH')5Y:[OJ_i^9Kd5i5KbtHR>X\kU)%s5S\FmonqYG2qrh)*9t?/cqb!YMa/8Ub@.B+9K".)ZAlu_*NdqGMqYu*bendstream -endobj -% 'Page6': class PDFPage -14 0 obj -% Page dictionary -<< /Contents 23 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.ce52f900887bbd9ff9881c236099059a 13 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R15': class PDFCatalog -15 0 obj -% Document Root -<< /Outlines 24 0 R - /PageMode /UseNone - /Pages 17 0 R - /Type /Catalog >> -endobj -% 'R16': class PDFInfo -16 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121218153938+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R17': class PDFPages -17 0 obj -% page tree -<< /Count 6 - /Kids [ 4 0 R - 8 0 R - 10 0 R - 11 0 R - 12 0 R - 14 0 R ] - /Type /Pages >> -endobj -% 'R18': class PDFStream -18 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 171 >> -stream -GapXM_$\%5&4Gu#=PbgI>b/J`4EipaMI%g&jFUVBujA4-2FQ2E7Wm%r3q1:n/De$\(&8qKY%g=%PgP*nk+L3Au9=f?j..dCsO/6Ld2H?:"&,F]P$7),Tm/fod"7W(IjMSdDMVYiZ#fQR#Z~>endstream -endobj -% 'R19': class PDFStream -19 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1381 >> -stream -Gau`SD/\/e&H3^ns5Dl:RlWB`8A/-rQ2s]A!sPtRXn?DL(WrU+/[D0Ee;E\GmmpTeXXKh\(FpI.2L0Mmh=DWD#[$jFlMl/8E#Z[eOoV0e`]tNmJaa.u%kfS"?!aHi$H/9PPaGc9LD+2?LO-ZP3'R,'"lTrMO+5s4qfb[=GqEFSUk6Kaqr7qX$GsP$r)naKE-[S`SB=(:-)T^Q(X,V"LPiuATm$djaDp=kHInu^qC7:G@:f:ZR&gb8P0$nm;f0>VPI-'e_Uji+`'jh\b".O@(YtG\ESIUm_33uNrD'Vh5\l[p7ko=7McCdjSVfe]u6'YZ[S]$RX??8*iNS<"+i^!iIM-/CE8f+arGApPdk$\SZ7Pej.97e>HopaZ@Fl2d0M!!aXPo/l[ZZ/3<;-X"#0r5RNMWWo#na@6qq_jWg2a[%LN#f_\tUeDd]G3aioG4!pZRpZ403,k#GABQ9>]O)JUm8^pca2V3j7Y>`*1LiJCb\Y]G:Jnj5T@A=J?UPG8Q%[Bec&Z#/5YZX;nthWGiL$b56%d"5GP*Ye"?f>;]7mU>kGneE@s@hF'ZOiLEINHRang+(#,#?6bP5kG4N+",=baTNun(9VSF`3\ed[BP!05,R(&.u*B6VkAJp/aTH?<&/e0YK@("ki35ATLKl'9+85P^n6fHj_u!>.bU9./]Z=/]8o#&2eh3ss%Ebh;])tWk"Udpl9K44Rf`H2FE&\m_IVpM=ZW#gWR:n4pn;pk_qmOT'5mop[)/m%?(1B`2Prq:a9:RD@9h.N!ZFU^E:X^1]U=&hI$a0L+E5MfRV>tr15X+prlY8Ug=&"+-V3//g+5?/6_j6R."hFC\89;G=7U1?'49s0_abZ%,6kpf@`"aqb)<.&2_fY=pZT`)Z/FG.9$!0Wo]Mou1<_*.&4f[!^l(f3U?0endstream -endobj -% 'R20': class PDFStream -20 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1515 >> -stream -Gb!#\D/\/e&H3^ns5DmaLc[GPpnAQDka/@Ycljpf7_jP&;f(,f/'F>,cc^e9Nhe)HNb$7pgC?+]6mSD:kFOd+6ja]YW;<&9!H*=q\YDD-pbSRp#k7:p'1FJi;]l$5$_J?i%k*C2C1\?1NJ?4_)d6>A_gIMPAE*5=W4b__1G7Z2g714dRiPoV*=3*$km2LRPW9i=*(%#im6\3LNo,EKDlR>rZ[#n9cSp+UsZq#6n'%#?:@GO)E-3Dq)PcWY6`55eIZ]r0lWR1T[WZF+C6@8Lnc5KC^"Mi_IBp,jX/9IC\:X?9l]%TlPP_0)T$R"%d**8Gu;\-(nb,2K%Of2&r3\[bi%q$-35;b@A'3<"-S;]MD%16QKL@`l*>78i"NIces*B5"as5_81dcEU![H7Q.NRSKp)?[<-AAW=Ka!iIcsn:ju-P0mlNh@?Mem>OB[&4!._=kBJ,m:h&XN/A$?C#*=U*\*PcRj;2,n-WF_Z9b4)RTMDF[O=bB3;p?2d/ertJm@@(7^b\h*XaeM-:h-,QM4U8mV]LoX*Z5q=55[JFBEd1l0$N0&3a]AorPJI!EJ]gt;0.LuTHZ&jSI;d;h)t%`V_e=E,;._\;WK%!NVPc.Yr-uN+Cl)jA`UVg)p_Jt=iPp[e>stL/[]&XlUkXZM:s"AnLBhc+,.;oYLi%8a7_Pm72>0"_/,.\[\$"FP\2\a1C^nb&i(E.9n=X\\93)4,F0a:B#j$_\DDsBTPVmRdUMD4A3Wdr'f`FN\+3q0>$5-\^mUqpUIeZ^ijK.i?Hd84jF$SCCf&<_/K'Epj`^#n'(i[*lCCmXqKR((IZp6&B"C08393Gu`75S-iHB@)'EYZO?4B^eO\O7__`HVYfXFBs*ZMX40Y[A6[424tBfh-!O-=",Od6MY1jDRQ[SC,.4uknZ"PNNqRVO7H.TU"qI$,'TsX8IADJC1FsF6Io`("m,om(WqU*I]#J=I5RT3fUrS(H>'`Y=?UGtXCE"#CI9TTEJ3HG("O=JWa0@bD9Q'3.u=,8mA-dB-sYf2,lp$BYUJSX]'=u&qnaiPP,]i#!t*LWQmPlP9^qBX,am]sSlW?n*Ut!kbSQ8NZc@l@>gZbZ6EA(Z5@ieo/)@4SFb\(trrDp[r\+~>endstream -endobj -% 'R21': class PDFStream -21 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1634 >> -stream -GauHLD/\Dn&H6"8s'_/h:jQliZ1CF7h3YkD9'kCeV:+2!?OSY7gQ8Xr;i^bJ2g4&.Q47,"!(&EKa3Vsl1S0/LM/TE/-Zag]&U_*b5T,NX5]'uJBE0udj.d^:7s^0rmAi6:M-JC1B$_KN;%raMYB@!uQq7^8Xl5#Xuu4nDVs$%dSNrEZ%Rr&a5K3MOp+Inf0W\RE^W"80fb(BG)Kh/k$9#N^hM)O/#jPfDP_>..m]n_=\,ukokiG2Y3uqBCqW`9HHSOq,P+g>P%*-4]rs;\*124nYm\&md.T5M,*.m)`*t2^gY`LGBGT0O)HC^-V@a\,M^LfelDbf07lN-*o,,7/&ul%o6E8_q&h)/EQ/l"([@CiYmDMWIYu^3,D>f17KlZ?@Hni<(/]V,Y#.4!rd=6K!WIOi1"I]@Necmo>D4>hU$k$-TO@;k_SX-Ln"'EFo["P;"I]E0`N3c.&*0u]q0cXE,.r>PSiZ?JuMNYsj;MclUQXe#Po,O`k-FIO9GWb@M!OE82#*iS5'rf$]nq&o7-$15\k]ghZE_bF+e1Orc^41+50XnI?(3A8tbZRRORQA'J6i1aIo*lBpB9[PnaE%j:-]]tTrcI_`)q\+:ig*?2hdG/P.H_7VG`tkOCe_=V-LW7M8u;6SPQ*.LU8H[^,BekG]u_Tj9UGDm:DXZ4aJZ=!fnW7DU!o:=*V0iQH]paKGnaUhQRrF7?S\RZ^=p/6-](Im]Yg"HHi@>/frjXDjEPhf6_(#LW//LrV3cj\MY6j5U^P*VUl_C>Bd^4%V(8Y!"I>!]VoG,`=7fTgGW!#]-0?X-ZS\(menMR&&^*L:r*0d(kG9J,f"'mI^k8do75s4_",/@'J6K1rO'4non9QrPq,E#1r-b5"7`Z'_6sF@+N/CW1f$)![KDB"]&;oo4K,`or^t>dS/Y^`6jrOHO3pl=bbT\?Cen>:RgiAKaS)O,@u+D$#'ScDuP?$*Z$"JUba3nitB[YkV#BCJ7J@4@<%t_@DlfhDP#R,\\_m;d(?N,9LE6X=GD%"UUOM+&C5pE_ICF1Vt6h7IE3O^G%k^>KZ@Wk$VC`"kFuOA9009kW6u;/qg+loW?BGcfl=AoisBgS34@'Kj0)o6>3Ke1at9)MrJ+,Y4o^L'^^^JX:8OF=[B]kc$cM2HA1_O#+VEJ592Y&5j%5r>,>'b7'^<+eo96gZU3'D'g."ungC+%endstream -endobj -% 'R22': class PDFStream -22 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 462 >> -stream -Gasaj>>N*i(k!dbIlPhDVpVc815<7CUJ"97&a?&DgF-R;)r'lVgD5ZO9JgORIHRup3Su9:.mKd&3!UKb\cDi*i%kr,0^o[G\^ahd*R.Fm?ZD;iT&Cq\2LVOe4%&/JG?s\XpA=03^-)YXU1l>bV6.Q+\i?N&i1Jqo]#E=e'GsZS=J%R3_&Ek(cUTQ@dHX1e*U7Dic8FQqU/(E0W*S\4"(l/=b,mg5Q#0\M#`C-"'8Mi(%Xa4rjEeK[\NLPAPfgR]2s>h&9$92Gc0&enGV7uEK3;>%bVHPHJZTV\LOH`qOjqQr0`1!r*Krj;%>683OXl5Y+f`p[UGKA>43gr3S4OE##VS2HS6kTl1$@q,mm5qH'l]t9k:8$*QAK72@+*'bpBC5Kd_D<&m"07gkWAS~>endstream -endobj -% 'R23': class PDFStream -23 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1991 >> -stream -GauHKgMYb8&:HLqIi+gh;$pMCF]Vc]8D4D&i1rpq+FV>SP$CnSOBcCABh/!qSlppegN$g@BOG%"GB[q;B$Mq0)W<(5T2AAUE^LZ/J:]Lm&dkMR.;^^%O3Qq2kL1*Z2l:!)HfJKnDt^CIm.H>#bMd3IUuc8XS"']O?R]dLEq3$]4.rW,+0NkLT2SQC9jn7cChHl38Odr"JXL61MdGZdBZZ38hNL%aV(riU%=Y5t+1nMo]X4:ml'(ig0p>=^^_nO>14VP58PMQY558!%sHJ1VBAl&[q6C!I.^*qu`VJeki8P;gSFJIWW8n!Cd'E:5mo>RME)HT9FZAtA_H'?5VXTlL?0b`7Q1&#E\J8Ll3HQlPgip5>Im]ZA4Y$N"["L2>BNJ?:$5jg#dYi5c&a<%j_F:`[F>DaTuJ:P=670ALZ21a=9OWjL'R(A$o*\alu:9*K!FP5U?aO"XZ,S'`.r1B3r-(W/t4nJoZHiDMr[0jo$oN,f<**.`'9k1\`Rdj_1&.jE_NAV\='o/)gCB;>Lu$8N+R1gL9oXF028Lj*:A\E1RJ1B5')OU(=ua28`G*eWNi%qT6u&*6gQbOfRKR)Kr(#>__?hFYNZ\7-.IA?DWT)""BTaAa!@_f;cO6^0(L1c0bKS4q><4kX(JPXtH7N[ki,\8P6\7TD(e87j>Q"kRr?*)E(^m6m'fSHr68ClfL)KBs;5W%F[>%g+gc>O2P9#-4$anGL1F-IQ[@r&dMMLg-=Rc"VR-Q8,#kbF^hANLc"UNrcu/dbY)_=I]*$JT.F$'eb:9t.13bYp$=b=>6j*H77`[U(J^r5it^Z8d[W,%Oc3hUkV$0_p%[Q<$1W8E1_;EPB_')8("BQ`lg4CgoUlH+aj>X^a]DZkj:IO`\nB_BG;mmd>nd=-e=].f9_g&S2qc!=f4&a:fG:aujWGK-N=6p5PD2Y%jnL:,9"fIK-Xh.+*$:*u1X5t2gd$*>B#NmRdBSOo>qQbQn?YsE%Ul@47GAiuI,*]>'ua5?#X&36blIO,O>U09bjLNUBR60:LGVEO0udLTendstream -endobj -% 'R24': class PDFOutlines -24 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 25 -0000000000 65535 f -0000000113 00000 n -0000000269 00000 n -0000000434 00000 n -0000000621 00000 n -0000000902 00000 n -0000001063 00000 n -0000001234 00000 n -0000001408 00000 n -0000001689 00000 n -0000001864 00000 n -0000002144 00000 n -0000002424 00000 n -0000002747 00000 n -0000006424 00000 n -0000006771 00000 n -0000006909 00000 n -0000007180 00000 n -0000007331 00000 n -0000007644 00000 n -0000009168 00000 n -0000010826 00000 n -0000012603 00000 n -0000013207 00000 n -0000015343 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\\\235j\236!`\255\002\350\332z\003\317\346\3325) (\\\235j\236!`\255\002\350\332z\003\317\346\3325)] - - /Info 16 0 R - /Root 15 0 R - /Size 25 >> -startxref -15395 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-003-frames.pdf b/z3c/rml/tests/expected/rml-examples-003-frames.pdf deleted file mode 100644 index 64514238..00000000 --- a/z3c/rml/tests/expected/rml-examples-003-frames.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 875 >> -stream -Gb"/&@?6jB&H-M+J!aKUfI!H]Z6Fa7>*C;bUt=W;:qJ3ZJqZ)5J)=fL7"jBiV&)kMEL/I;oA85ip$G)]Q9Re9SSnMbqs\JmJ5G_O5a]O+ItWm^E:@X&:b`Hd.GZOG?L!6!IWC8s!=9WLU8=!mTjKG%%a:qQ7;sYpG,C^H*+J2(8CcINFLo3;!4%<&+m@;<"U8YBk'i`pqa[*u_V]]G>\brZ="Di6s&T62_f9$h(7c2+*]+,;^8+PW=g4E*%Jor!LI)Y85$_4LjiJA;)LPYsGZOH:'7'M>mSB1&BS0WJ7ed#>ZejtrX0+tPp_FXWtME!Uq$GLMbk<,au`G)$u13JV^0k*[PQFDl2Zq`f]_F9t/,I=$l>)LP1AFl8]/l4$u]>ub#Pbft#F=8NM=LOeYB6g%YT1D$U9%dcef-W?`(>nE3)/L)'^)guccF+=.D'uB?^p,8T]d!scR+\+r;lt0_l0cRk=2nU+ofnj/7I>T0O0s=tU@u>&V(?K2UdJkcLmQY.@]RQ(]\fe/j(kbF[CP9YI62L%j(7U8oLOngBbrXPIs-ODVG"WZZ*R7;IU@TR\@AP""@72)qM*:@bhP0m]3T:1_:e`9iVL`QK/3WD:0HAH997P4$(il[[qr3+hi-1bd-bp3o.%bH&G.7Ehe/RfGfmnO:)`ZoaeOG.7jUXDLh2Kk^%.Q^2LL]1?W,9n[PGJ[NDF#2Gp22`5!.E/gF:_K=R0QhCHt_&p0ACBX~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000587 00000 n -0000000760 00000 n -0000001037 00000 n -0000001172 00000 n -0000001441 00000 n -0000001546 00000 n -0000002564 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -2616 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-004-fpt-templates.pdf b/z3c/rml/tests/expected/rml-examples-004-fpt-templates.pdf deleted file mode 100644 index 8164ce45..00000000 --- a/z3c/rml/tests/expected/rml-examples-004-fpt-templates.pdf +++ /dev/null @@ -1,149 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 10 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 9 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page2': class PDFPage -6 0 obj -% Page dictionary -<< /Contents 11 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 9 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R7': class PDFCatalog -7 0 obj -% Document Root -<< /Outlines 12 0 R - /PageMode /UseNone - /Pages 9 0 R - /Type /Catalog >> -endobj -% 'R8': class PDFInfo -8 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R9': class PDFPages -9 0 obj -% page tree -<< /Count 2 - /Kids [ 5 0 R - 6 0 R ] - /Type /Pages >> -endobj -% 'R10': class PDFStream -10 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 774 >> -stream -GauHG9lo#B'YH6>J(UG2dV2rZ[__%U:6JAMBg*FWEtLlL\$e^W;3HE9l!Zpb):GlZ#D6me^"q6(M8?YC7_`XDHqa&/S:PZ*;m=UVO^-fql#qN!4+qUXfO::qK,1cnCO#Usp-rJLf_:Mmk^WJU_66Y\O[s>.]?#uMn`o41G_G->P.*#sisl9R3t+7N$od2k08qlF;+01KbmCO;Hof0qjk1,P@$_GQ8qu,Z>=ouDjKm6aXmbq!HP+ZP$O8D\?pm?J1%@uI;dmc''h6ERr':n*>:jhf3OL]P+rL.d8kT55!hP5$n%bp4j`B=I%4KkXP3!VURZ!T@FiTm#U9m]lbhVPuY3bN,jGg$2Lbp",BH!5tBQqS>JFC*4J6d*$=KorM3^6.NiY^^=;SL,'RnW7V(Uc<"hrG$]>7A9.Y.J&SKRPerBE5[f5=cgtp#s-+_6=PA;+%qPR5hFZqap%8KVH]+^8I*B:'*j\N->6"f2DKRaH9ONdnbJW,jKWcVM6NLH;I;X0S4;;1d,SY[4e(6G7M:0!u'[@EmnP[djka*J;,A[QP[BG8k;.V2LO/=KX=\7HnBY@Q*#Y?EHieW?\bm%4aa%W^00VBendstream -endobj -% 'R11': class PDFStream -11 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 937 >> -stream -Gb"/$9lJ`N&A9=Y+.h\MUc'u,]Jgk&mrXKV";h,Ap(+b&F#0S_@"ID(YqRtebSrOCb^56j6V:SB_jM?'2H>c)<`)JgJTo]ZBWa1KenojY<"u5u[TV6>iBm$%+]f0'AYf]Z2U]\@TUC3k6OoUHD8N9q;af\1=qj'pfD.7aVr,9R267;K;"QLo3AhA/^ns)us7Pe-Jj9l2;eDh8\3l)Bl]B;q+u7pdg:$gqUClg&Tecc`0UrH5prBu-$gqJM)#LQFliN88?m6lBL:NsNAP,C:M-?2T;WG+;j=VQ99"7Y`\sP?2N;7q4^#YI4bFiiElendstream -endobj -% 'R12': class PDFOutlines -12 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 13 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000587 00000 n -0000000760 00000 n -0000001038 00000 n -0000001316 00000 n -0000001451 00000 n -0000001720 00000 n -0000001834 00000 n -0000002750 00000 n -0000003831 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 8 0 R - /Root 7 0 R - /Size 13 >> -startxref -3883 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-004-templates.pdf b/z3c/rml/tests/expected/rml-examples-004-templates.pdf deleted file mode 100644 index 8164ce45..00000000 --- a/z3c/rml/tests/expected/rml-examples-004-templates.pdf +++ /dev/null @@ -1,149 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 10 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 9 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page2': class PDFPage -6 0 obj -% Page dictionary -<< /Contents 11 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 9 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R7': class PDFCatalog -7 0 obj -% Document Root -<< /Outlines 12 0 R - /PageMode /UseNone - /Pages 9 0 R - /Type /Catalog >> -endobj -% 'R8': class PDFInfo -8 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R9': class PDFPages -9 0 obj -% page tree -<< /Count 2 - /Kids [ 5 0 R - 6 0 R ] - /Type /Pages >> -endobj -% 'R10': class PDFStream -10 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 774 >> -stream -GauHG9lo#B'YH6>J(UG2dV2rZ[__%U:6JAMBg*FWEtLlL\$e^W;3HE9l!Zpb):GlZ#D6me^"q6(M8?YC7_`XDHqa&/S:PZ*;m=UVO^-fql#qN!4+qUXfO::qK,1cnCO#Usp-rJLf_:Mmk^WJU_66Y\O[s>.]?#uMn`o41G_G->P.*#sisl9R3t+7N$od2k08qlF;+01KbmCO;Hof0qjk1,P@$_GQ8qu,Z>=ouDjKm6aXmbq!HP+ZP$O8D\?pm?J1%@uI;dmc''h6ERr':n*>:jhf3OL]P+rL.d8kT55!hP5$n%bp4j`B=I%4KkXP3!VURZ!T@FiTm#U9m]lbhVPuY3bN,jGg$2Lbp",BH!5tBQqS>JFC*4J6d*$=KorM3^6.NiY^^=;SL,'RnW7V(Uc<"hrG$]>7A9.Y.J&SKRPerBE5[f5=cgtp#s-+_6=PA;+%qPR5hFZqap%8KVH]+^8I*B:'*j\N->6"f2DKRaH9ONdnbJW,jKWcVM6NLH;I;X0S4;;1d,SY[4e(6G7M:0!u'[@EmnP[djka*J;,A[QP[BG8k;.V2LO/=KX=\7HnBY@Q*#Y?EHieW?\bm%4aa%W^00VBendstream -endobj -% 'R11': class PDFStream -11 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 937 >> -stream -Gb"/$9lJ`N&A9=Y+.h\MUc'u,]Jgk&mrXKV";h,Ap(+b&F#0S_@"ID(YqRtebSrOCb^56j6V:SB_jM?'2H>c)<`)JgJTo]ZBWa1KenojY<"u5u[TV6>iBm$%+]f0'AYf]Z2U]\@TUC3k6OoUHD8N9q;af\1=qj'pfD.7aVr,9R267;K;"QLo3AhA/^ns)us7Pe-Jj9l2;eDh8\3l)Bl]B;q+u7pdg:$gqUClg&Tecc`0UrH5prBu-$gqJM)#LQFliN88?m6lBL:NsNAP,C:M-?2T;WG+;j=VQ99"7Y`\sP?2N;7q4^#YI4bFiiElendstream -endobj -% 'R12': class PDFOutlines -12 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 13 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000587 00000 n -0000000760 00000 n -0000001038 00000 n -0000001316 00000 n -0000001451 00000 n -0000001720 00000 n -0000001834 00000 n -0000002750 00000 n -0000003831 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 8 0 R - /Root 7 0 R - /Size 13 >> -startxref -3883 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-005-fonts.pdf b/z3c/rml/tests/expected/rml-examples-005-fonts.pdf deleted file mode 100644 index f5cc79d6..00000000 Binary files a/z3c/rml/tests/expected/rml-examples-005-fonts.pdf and /dev/null differ diff --git a/z3c/rml/tests/expected/rml-examples-006-barcodes.pdf b/z3c/rml/tests/expected/rml-examples-006-barcodes.pdf deleted file mode 100644 index 34879209..00000000 --- a/z3c/rml/tests/expected/rml-examples-006-barcodes.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Times-Roman -<< /BaseFont /Times-Roman - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Oblique -<< /BaseFont /Helvetica-Oblique - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20130304200123+00'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1716 >> -stream -Gb!TYcYm#H%*.f;niu?jot]c=-!a_3",[,s2dj_B$JLBj=7dh>UGp8s2Ne_$$*>4Sed=+AFQbI]E3o4G_I]Xq?`c$X<02Y6h-qV'a']d<:9ApM'pcYlO)/0F36ApNoX\%"10?d7r"Z0d0_OqD77V:]?D]mbMd;_60mEi!I1$^J[,jt"s^Lc\,X+nD4@A]0'7W;$X48jKW%8[KDQ[>BF&18V&>YX=jj!6j9nD7<=+fu&]?5\4Mpp5PK1b=832-E+s+M6WEWp*uVHDrY,&3MBS@RQY$2B?iVH]>ZP#S:66YoSth;p/fOnghgG"/ZmWaKQDZYDDM]j9Q,#;BnHPj.'%0?_t17S/2`+ArV=["frLO:<8rl73&&[3_gSV_FC3k*69?%Q`t0Kr/'LH#*6R0C[?hL@h:tQde`.B03'OP.:D]lpa)X!rDP$;R?,PIBe<\o+-b1:<'8PJJ9"`%W!H../ZsSXM]WRCmZUb#RZk0LU7C$3=dRsC#;mjT_=!TFVKPo`dIoj#pDou7=l)<>R*'e&!]II_C0(54>[mbkQ_uC(mGpJglE)t:1Pi&]0L(^E)qmkVc:?%Ic;oT#:]@V8Tctf/@Y`"J8O1tf/b(j'Ti./OZ5Wmi4M:?;[/q4h*D]h+s43'\J<7`;NQ%86M!eDa'3("#Q_I==V1Hb\QV;2\cIee;@-!TeP?@!E\,ekO*%`pW4_"W4n@Q7Q5$d\ZeH^(4?F'DM"Q9@fq_*!Y:et,\"DiQh>-HorVYYunIQHXJm`Qb]HM[C(b!o=ml)%h6@nO5k.G:jX.M=#`<533*prT%Fc4<6;]_ce10n863DcUe&tQOr):>Xl..)50;GSuM%B3Fm8f(*T8$.1+2[?]7d-]F6AH7,1Z_ph+:WNH,+7aLm9IVXiSY8=l77b:-ih6]VV?3'+%[#*9fNg"7qdh=T]MpR>6W7,;R#L^4<%o)-+VU"HU[T_1'*Q]*R4n^DOP4?[_PEGMP`ZG`8VIK7!VTV6CHL)!>/X*:0'C[SR*p\)Yq22hcXLW"g80W5jcRd#qE4?-#d`EtO./_g8@%t7&kYBiV@37krO1P,+&R%XZ[MbPIIP#M5G$6\I2]<_XJW2M1]Mq`5.YW,:]:LtiZZ_~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000567 00000 n -0000000746 00000 n -0000001023 00000 n -0000001158 00000 n -0000001427 00000 n -0000001532 00000 n -0000003392 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\275\375"\226\004\012\247\311\024I9\2513L\031\365) (\275\375"\226\004\012\247\311\024I9\2513L\031\365)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -3444 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-008-tables.pdf b/z3c/rml/tests/expected/rml-examples-008-tables.pdf deleted file mode 100644 index afd88675..00000000 --- a/z3c/rml/tests/expected/rml-examples-008-tables.pdf +++ /dev/null @@ -1,549 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 8 0 R - /F4 10 0 R - /F5 11 0 R - /F6 16 0 R - /F7 20 0 R - /F8 21 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Oblique -<< /BaseFont /Helvetica-Oblique - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Annot.NUMBER1': class PDFDictionary -4 0 obj -<< /A << /S /URI - /Type /Action - /URI (mailto:robin@reportlab.com) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 0 - 0 - 595.2756 - 841.8898 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER2': class LinkAnnotation -5 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 25 0 R - /XYZ - 72 - 695.68 - 0 ] - /Rect [ 155.9877 - 643.68 - 297.72 - 661.68 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER3': class PDFDictionary -6 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://www.reportlab.com/) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 297.72 - 643.68 - 439.4523 - 661.68 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Page1': class PDFPage -7 0 obj -% Page dictionary -<< /Annots [ 4 0 R - 5 0 R - 6 0 R ] - /Contents 29 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 28 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'F3': class PDFType1Font -8 0 obj -% Font Times-Bold -<< /BaseFont /Times-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page2': class PDFPage -9 0 obj -% Page dictionary -<< /Contents 30 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 28 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'F4': class PDFType1Font -10 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F5': class PDFType1Font -11 0 obj -% Font Courier -<< /BaseFont /Courier - /Encoding /WinAnsiEncoding - /Name /F5 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Annot.NUMBER4': class LinkAnnotation -12 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 25 0 R - /XYZ - 72 - 695.68 - 0 ] - /Rect [ 155.9877 - 607.68 - 297.72 - 625.68 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER5': class PDFDictionary -13 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://www.reportlab.com/) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 297.72 - 607.68 - 439.4523 - 625.68 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Page3': class PDFPage -14 0 obj -% Page dictionary -<< /Annots [ 12 0 R - 13 0 R ] - /Contents 31 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 28 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page4': class PDFPage -15 0 obj -% Page dictionary -<< /Contents 32 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 28 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'F6': class PDFType1Font -16 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F6 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Annot.NUMBER6': class LinkAnnotation -17 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 25 0 R - /XYZ - 72 - 695.68 - 0 ] - /Rect [ 155.9877 - 679.68 - 297.72 - 697.68 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER7': class PDFDictionary -18 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://www.reportlab.com/) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 297.72 - 679.68 - 439.4523 - 697.68 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Page5': class PDFPage -19 0 obj -% Page dictionary -<< /Annots [ 17 0 R - 18 0 R ] - /Contents 33 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 28 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'F7': class PDFType1Font -20 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F7 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F8': class PDFType1Font -21 0 obj -% Font Times-Roman -<< /BaseFont /Times-Roman - /Encoding /WinAnsiEncoding - /Name /F8 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page6': class PDFPage -22 0 obj -% Page dictionary -<< /Contents 34 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 28 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page7': class PDFPage -23 0 obj -% Page dictionary -<< /Contents 35 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 28 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page8': class PDFPage -24 0 obj -% Page dictionary -<< /Contents 36 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 28 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page9': class PDFPage -25 0 obj -% Page dictionary -<< /Contents 37 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 28 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R26': class PDFCatalog -26 0 obj -% Document Root -<< /Outlines 38 0 R - /PageMode /UseNone - /Pages 28 0 R - /Type /Catalog >> -endobj -% 'R27': class PDFInfo -27 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20130304200123+00'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R28': class PDFPages -28 0 obj -% page tree -<< /Count 9 - /Kids [ 7 0 R - 9 0 R - 14 0 R - 15 0 R - 19 0 R - 22 0 R - 23 0 R - 24 0 R - 25 0 R ] - /Type /Pages >> -endobj -% 'R29': class PDFStream -29 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 2127 >> -stream -GauHLgQ(#X%"2Jjs++8pfM.GURYu(N99U]:;\T7q)TYQXA:&,CX,B'&fC@ab1Qk3D9.SOeK5B,>i=X0T3TM%kYjig_^K1`WlNOqK7t=ERI_5$:N42g+ugq^7$+/FG%Y-7i=^*8g`"_(/^=@o>__t-G(_o.1-rB5%`3BKLde-O@I"fNq\GMLBU\$I"YLsPGW'IJEXXlme\_)Zm/;,c'!6so**7?MQ(;);cU3='OR2qp;;8==kH8QF-+X(Zi&n)j?;PAM?T"nZEHQe;5?H>tp/JW`F>O.H;Mj6LI7OrpmGp>!%hR4-WFho3aSFAbqTi%fRZk5*JDT0!/->4IY$=foQ(klE.]p$R*tQ/l)M6k;$;u_`ljN#?S\?q["dWIeS(L>,)RBfD\U]^=E>[oUC.hRc6l,o"_/*FbNcs>6;FKDRY]Zb_RV6[jCf[,buY.7RB'`\#XV>LKZ)(;9f]C>aLD>>a.7"1Yk5$+).?E[pqJVS>tlpG66*,Sg=GKQu91tjSLX=i'UPDXq__`F_t]set#@^dT0rbr"Fu3_55q/1Mfq@_2aqr=+*u[G(VcUV%YcE)m/.5Lc04p%])Jq3USZp6Mp$i7o$]+bZ*i1;T/c=)G0Jld,\X5,/L6HjfbK$B!"B;h9%DBd.`HCGdolN7%&foMW-c%LC5Pf;>i2+1*!D:OF$:&452K)b%*':rhD[A[k3Aga^ai3NX`,2^9?g!oj4!(#RJCAE4G5d3okeLXPZgTrq'B:np?$<_k$Q1E9sB@3,BUGiJPL7*7VPHFV`?!l(imUr%g9=HC^p;>c:F%*##9[bep3e5S$'K9<3`GdZ^\SQ!ZHq%/S`qB65?AUW?GM=$(E%LbARWB=H4PYkMP.'kod55/"ed@jb(PWpUc9\CtRXq"s;V*r=1a8!Td#.+G9QY@09.7([YVa#4jJ'a1njps0mEDHr)Tan9r&%J/?FO@<\q\-^/_BBQq!(N"`g/hTn,"/9cYu$pefNERB.+"_#mna)N-Q7/&LXO!EoU98Fp=P#LI(Et[=/_m20ZhF]l-#F2GQ+_nBUZ,pV'gY?48uE$TY50Lqf+gDn%5giVMg]gT`o=~>endstream -endobj -% 'R30': class PDFStream -30 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1251 >> -stream -GasaogQ(#X%"1(mIphkGVm$olAYBn_8a@M<2VHn'kt>>p-/+eu1ui=?lhKql)9K1t=Oi*YYXBNR%XCT*!2!SKq^uW62f!ZG$6TU_]n%="@T_O'+7&/Z65J:!S-3.<6^hXo\qC:Hdrb0,F;"4cXAbQl;c-=E)?1-+(05\.^HT+P)jLi9j=I%,`V?Hj6tl\]K)Q.j]rWY'E397r3.-)%-l>M*o:AAOZ6_]Aqq&)J6RYuXblL)JKK.\n!eYK;P+^6LQJ"&,"6@Jpql5JaF=L#G+E+Lncjr^LqX$;5@@&;s%*HT,m%l"CRlML[/t%8B8u+6T"5E3"'gVb3Lkq3V#2-89;'E@d\-.2tk2?#cDbbZp*aB'%a)X`"enkM9KN_N!"m&%URMTrCf?N(t,H26[XWOcM;!A`Rl@R;be&bl7>$2\;?/_]Fm?H1lH85`*$tr!r/fn]%[^bZtA\j=oK\qao+-aV0W-c^$C[fD598-5rONLBkUg`&H#+f=GMi(8:O?=L)H&ti?IAE$aP&IlkH"cK1$]hT`"'MRN<[t+JLbgo9>FAZ/P*6&bfQ0t#Urp]4L6UpCn(EQ.HVXTDo_`M.+jEq*6kJO6a&2_O:gU8uIO)K:Ymb::PGMTKqb-KO1HS+5\#S+1X*T#m24d50";dqlQ`"gai*P$8Q0*qtBc`lm-Zkk?oSS,G-2fbI/W_O.Q3/J$LJ^00dVK>RVd:44!PDu-i_#%qJb-Dq0amcdfq?h#X7eC0:SYrEh7(dYj>*;'^2H6r,h/`p`q>A6"+8+G(BVVoZG6i8bL"/^JZg-'GG`:S_.Y0@igao6Qik!4\f(rLHT//hoRJn@%@M?"GYcL_#V8YBFhDS@%NBI+M]QG9A>AnO],%g1!-Sa2ng%Ksh_=j8510K\)n*<(?#VFrP?pU0MMS9fJ!gJfg^hF.0pM:nrpnjlIuY\+\.c_@V91q;id+Anp]6NL^b<#F%d0W:lLS-DL;\CsQ_aX3\$/fM9$l#_<&@.HEW,]ZL<'#^nF5_EooA\2-n<`AM-\e,e7BHY!ue[LRTiXJ/gB1W]#HeLmu!_,UGGPG7a&X"K7!>\rScPfmFFMhf@T9*9Dfo./c>D0rgbq6mJe)^\FcJL./(=saV&eHm/Iu:9>_,V?(PlU9A#Zo_Jm*$\1fI[9D>64l/Z3L[:j7~>endstream -endobj -% 'R31': class PDFStream -31 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1320 >> -stream -Gau0CgMZ%0&:G(NJ!e8uO]=4P77p!G@(0fq5u=p-s+"q-N]+3(b&S9]f.V(%`JuMHTs.u&E+[B8Nb0gL+Vl_1T;sQZk63t1+s;HU)N[E&(/OGciqB5Q:?7nA(f:Vkk7Pn1YMf6Mk24o41d&X-AZ7Mg[`T]udH9A=DQCjNFIH=/M:JZa^tg)L=hiMKTkNA^+(4URmY4VhrsV9"fu*;W%']$NTr;2J*CTc&d+>D(XGRe)\#So_Z4_$iXLk@o^'P_mKCE"bL2-`5.(4n$$G"B.[h_qm(#/"[XY2m%Q08"Yl5o#i?b3-#n"H_<;D?37lf%<,e=a!(0+JHIcMh-n_pE6jBXsJKl?1R"LUOjNU8^*=4hQ3khbDp-T.;(0nPZPsgM4Ltej^Ai(HY.PGobVTo6T7.X%MDJ92V-&B!pbUCOF?B]I^D+*qPRDa:Y[^notm3VU[kr8S=(3lnXBeSas_n'W((Ct5t7M^qDkbRH')RS'9W?QOg;b1N#9lS,/Q+Xj"uN>O"k9l&tZCQ_oIm=oDA#J9[WLnb(=nKbogSsS812\IUuN,H7g6ffD.oTEW,aFl;(OE<)A$M"^\(Cd/73-Dq.[fMQ:l]h!1"$,k&Za(W[.(:U4M4Vam7MO7\&%Yq?.,CB`'IYl`Fjq?6"@ek+:E['*(d."3g?,i\'1,4.4TaFl186ZksIU2+N3"4Iunk=S?FIYQt6Sa*$DIb'_Hh&s?'=sZ;G8lD0aj.>=umU4OqAAV89A`GYP\)8^deGQ#"+W+"]dc=lg;6(!`WOBi^/r5!DQuFC26j]\Bk+#O0PF'YEbg;dqE]hC&Q=NCo\.d*AjVfAhBI0NJ=-/l,F%XCl8r]s&^7+/S0.`Rc]8eh1kObK_5^2^e,98"PFo+3oCFXH1mF^R,F,p:m6>f^RFZu@m29p5gVAW)5Sn6-PLrTh0cE!rc:6#=71WsD[8X`(&;X:B9J4ZbmK:/Y#B[L1@gHo,1!<02[s?-HM9cl`t>Yk"t6t5NTr;nb2b>2[R70PO$ej>pX=J1L[=h\&Q<:=h"0BN9=g);\mA,haU1F'@>D<%;Z),>Kd/fIX1,luS7^BRt"qnpbboIdVmDS*q!f&2j~>endstream -endobj -% 'R32': class PDFStream -32 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 330 >> -stream -Gatm6b=]],'\s#b%qhkn0fMgjG3OMai^V0fB&d!/LH_pVkP%^!G3gWP)eg42EZVn68s'%G\8N9nj`#36+9hKHdR(k-iQ?/k_Q'h^8j[<\g^97=0C['94(gD3:n!8(ZPHU(6*P&_PEG0(c=4?dadB6nCk"VF%CCh)E,pC7[tQp@.7hl8ppdE+Z9>3cafdFpXg!Wu9tKM*(qSjCgA&e$C5Z(hGItUV7sSI,Do5HkHb'[@G&HF#-GWpN2o*GJ7\UBp[SU*N[*^35Hgo"t6Xk%RN]JRm1*0-uBc:Upc97Pcl@25Qdlr7endstream -endobj -% 'R33': class PDFStream -33 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1210 >> -stream -Gaua?hf%4&&BE[jp`KFT.Q-lZ[Za82UodfZ:"?VQ]M3_Y&0Pg\3XFQK^OEW_bD&gu9AK^PNj!m*3W!ia!5d^rl?0g,khQqYh#IM.VFq'AUM+t3hG;1e*!J_o.0GW/`1t-.+ke:,DERbU*^T0`%Ur&!Dj2@a65r::h'h0i<>7!Z@.i0Tct'^_GGpI5=b=SIr@Z>rkS9QCMo!%I4F+'CR/DEg-Io"Qc&fs&Ul8A:'Q8nX^-Ld@61Z9RPJ#\E@]A^2\ltG6*=I.!AG]*h.1al8Q0;2=O#RWf.]qe.@Dm/A8EbDb;iWIr/`6+cc2b6R[Sd!PJV"^5`('rTB4qrA*e`#Zdm=s\(*P?J&90\"%T1k?rI;e'l9a%JeIALe[jiK1;d*mT`$-OdCU+YDrAi^[qNe/WltF,IO#3fpZcI&7f8+oQ_d0ZMmO$Q)I[_\=j$F[&/dgfFFr84?0IQRT8bSC5kra-b(L,Y@hkbg_km7\%^pCf_5'2Gnj_TJP3e5qFS>_!"@Z-T_p2uK47_qA`d#1N3$$D^gN`g]l#X$=+j&L_,iaK;(DjKdS_0hJKbEjOF6N"@cD0k<55I]mA>?@!^Z6"[iUq?=FE4:Fl"AWOXM[nqj1/D_c`kndbYKe@.Qt?GKmagFc$U^]\@AmDV-N2arK-=41Pf;ZZ'LH,<>tA6T_bl5"]i\?iE3)lJ79LCqTenE&0Vn,!kL!-(6>KNoQruP$=K/(1'udGs4Jqq,"U=7\)%Hb/23Z._[JqW$,cY'C/10FY(rqf%4k7PLGF;kZNpUC1rp618MJFJ$S3]KsNd7Xmg-D=2grk?!Lc,<9W)%=B=cHiuFR5na)/q*Rd/bhu"CT?Irhj-qKEf=,EW!k]8JdUtKG_0f3<^)P`$6bYIc?TaA'S^rT0;SVBiSXKbT6b`cY:JIt\HXl`-n4DAtBBZ-*HVfb>[lq?p'0H>W~>endstream -endobj -% 'R34': class PDFStream -34 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 2462 >> -stream -GatU4>Ari;&Uk7Ps"MO3DU'HR9!U$AkQTU[g%H,XQgG**6.6'BU24Zp8r'/#ptp:MUguQqXLL`YfHNQ*Hnubf$l+;RIt@EfQ2p@qi5_Gl#XWdW+ddRSGk_?4*j2[lbX;5#B7W"46Bo^--jIZLlh/f;l`7hC+V5i:.P8nuD^O!)q?fXr]f)*ZU8A3=(elaL\UE@m-htb>K:[a6!2Le8lp1k3>["gT_j.T4?D@3H6,5dQ1&E"=tSo+tHYplqhZ"P.S--2<'L*5rhe$At"*j-c0s(P7#'93^XI/qF=;FKUK*dRks[C9[fj^q]mH"dmMAX]SjBZB4_+R2OPTf;I<-!F2abP+0"FQPCuF/(q:@MbEN3Q/=WN#cO/+N'qO403J&Rr#%YMlSp_d#7i>f382IBH8UCm1hR\gjY+"idXm:PMDHJYh8,t'+_;93::1Nk=Rnn5$''@ddX!N?c-mk,2aPGP;<%!mZQjb37Fo97D8pYJ$4Y"SA]Z"N)01Br%p/$R#`4C)o#Gru#,b'*el`LK6ASt4!_n*K)qENrBW+C=3#82N(7iQ*H>c%2`cVui'VXm(.Pb,2B6#dldnZVnbF5I9aeGOZ6nC&$&-a4?rq,[nn0V^(mO#t.PUR\%4IM6D%]2`6s#!;*[gMl>f\qhnmnGd7gInD3_%R"J/2K>OL:6/X2WbI/r04sVhB]Lgbl_dGYV0q9*%qZ;iVGOW=MS>PN.iT.eT-asZC@#7sRM':$H",6>0\gEI:7/q_L^@GlbO@6IOqt9\Jd+"LV-qa#>^oHHCk*Mb+8]-DR7e&u5)"c/qAC-)-fiY7C-7ai,>N4oas4nPS2V:@ED2^au_P=Fhc"=GK^Vp0:Fb=>D?aGk,^fg;&#g.DDcab52='Y*`ZI-%;q\]61o#+O$0OERIie@.Jr13"o$:Zd1Afh_,^Z_qKLeBN:ElHUFW.X%N;E'$n"h]5k17P`%9PRA,VfB\a.eXH:!7=LtM,2-Em^@u!n6dH]CeCO:Vd^b^Co,o;%cq#jZMqLH=l=H3,L.b]ho[P2iu3Tb`gM-7DFV&(H)>+.\a)?VU&`hg]G>Y3!dq7R!T_H^6i9@N7g]eUgiEj#^tT`Uuj9H.8J+,QfU"!7itTHquoB_3;^X0"tsi!-anWh/E+XLR>1l@0/oX4u2.]/aE&fc1q6)0sdk%7eSZii\LMC7Nu@Pi/n\s<-4!+lK$`,=OK+SY\h6bh$;Su=b=&I3oXXtVEo>P4#;;1bO!>*/a<@R`T31(:rY1f"Z#%)]W13Y0JU:s6d5_YL%2=TK9OR9]Y@a?rV_U:rWYRZS*]k#1nf.<2g?@:hKt2e31CGb$if\ZqbRS[;!B='G&4FWggX'&>)B\Pbo!W,SdiYI(nH])chdMC:N=M@,(naf]PZA0J]CVCgqD4!lY']/cTOrC%'MJ(:+D,VBi?a0r4!SB8S^qVD;O#nkFO"MlDLWO[)(8U%Edr')L[`m*FmAR#=4+?Nd>"/VQqLo\fUb]pQGrT.7r[=KYbm6^26$.CC4AArK08c>Dj!fa#2a9c(C.8pNo9Rh7??\&d+D_IH-n1]mN\D!!Vm8\A\l37,h_1@EHiIn"ck!C_5FWGi8OSbpb>DPDAp?)Yga$`iR>g3n!9:99LmtZf^?L1;FTc,iMcP?Q<<5HL,J-d69SS#K="oQ^%7ZpE[,*Ed[='pS%$d>o9(4%fY^hk-?H*:l&.]d$lpK'a6KI6VW&CQ]i!Urb8,ImXFZ:&Pp\]mbem8G7mB545;N2gT&#V\V"8)gdr>omVp(fUY/eo*W-!$:;SE#LDshhMp>f"i"n(k&k89NgbA?ar%-t?IK=L;@?e=?%5XWpB/+W"$^a!^UWa`rR!G'h`SA9_@.#;!13^5Abl..#q\M'_hoORp@3,Pa0mE*pQobVLbT6,)cd-\.`?'N(_[fo=^&PAY%__K)B)PB+^qANEh%2aBn#g?@h]:uY7p#WO^GqhXS`CQ;%m+^Di;2_gA#@S(~>endstream -endobj -% 'R35': class PDFStream -35 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 526 >> -stream -GatUra\K`-'LhbYndfXFPo=JZ6bKO#O:W?R?U..0AUlV6Hp2`M!b-,.'uc%]qrHo'DJTZu4EPfa28CDkX(r',6,!EC'+XgY/Fti95VY@1TF'd([7Xs6>mZR3oGU46Eu<:rWm/9+G/(!9.*8ELR5CDnXBXFA!nr$qA0M20\[GYAff@jc4TlQ`#Z#"C::!0(1:1GOTuRS;X\k&uR`2NZ$!@U\%2URb'0Tu]n4UiHOO&B=>U3L&ilh(_ZIs0R8uN4oZ%:rDh`t%UbGO/Y![ptoJW0u#&/Q`m"-20l5tOm8a;j^Vk*Y'a8'Ys(7?BOh'?i2ICQ=q>>f\%/`$^p^K%Cu&[lIMUk(lee`rrS+Ec1J*$Sk5"JiP0&c&m(:1EC"dp]PY3nendstream -endobj -% 'R36': class PDFStream -36 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 3185 >> -stream -Gb!#`;0/MR&UrUes+e]p]N8b5bQ%`-DK<4cgIcL/=heP>J7U9O-\3Hbqu#n=0\m"=JtDZ]WNG!^Jc6M#JPYm^Zl:G;m6B/$>],8je#iE78I;64m=S7*+r7Y;'gLP]]rOT%]DllF(3(m!Sh<\`p8.P)p$U^=mhE.XJ`3I$XMZXT1-"7W`n1@Me04TDX6c1;q8$>]AAlcGGs1:lqV,A<82F:5&Lji.-ndu;E6Sg;XBl#YqE*-\ikki_RA&S@_"+X^V(Gm^P^e7`-&=i*r!YE=YpZKIU>3;okK&oY,f>0s$rX.11+Qa#nn9ERGCY4B#O#m>t8[W;P"8]-MD+"DX.gPi?t!2J8'H538JHbHaXk@XEJaOfrhp9Yns/0n0o!Idm/do)_&a^>]r`Mrh4#KnO"4'XPWMq!<1K6gBjP$ks?]Lct%E'[8YEtZI#;m5OZem1[Klmfc9NUor%*A7clX5b'9LA^jl91B@U6MQ==p:QYRuJjeaNnp-<^->#8*0SH@`o"O(t[@LdO2#>g0kB^,SfVJ\+.l6^g-F_CcX\(_l5@U#r!j0fn-QKr"lZ[5W6`I>_X1"gIF:A6hF=oAPL^a"IIkXPimC$JR8U(6YmlHfT,*IuVgFj?]kn,Vb#!_j\c1Xm_3\dYGgIAokk]&J^N.X5K(^*B\Q7TSB])Eb2!%]^C8eUIMh\bknI)YQDp@]'?cGT*G=gVMY3cDI'eWj3kfPo3[5Y(Q&[J6-Xs!(h&-9;icPU\SKSQ4;8DT.!B^$:"mjMG:h.(O7/+Z;_S]7-CTJ`hS"gptH&`bDWF4pp$]]qgmN\++:#D6;V^0th\U(KV(gl[)L`WW02?&7;W!9tP;'X0l.bCl;qG=,Q%3]GI(.E*+Y,?f02Tqj#Tf-r36oB"mm9c88G00T"\oh`gM3b=7C/]1KfEY2*D/p5)1<&K^*`*SKTPF.u+!1TtjnDP;$00sT%bg9)/bi\%%>:.R-eOdOai84kD^rZ(fG,-STo`UP.u>^,POe@`9pS:q6mA*+ONZ@A)=S6:YY`]Zlur*7`M_m<$RIq&V1.dn_)qn.F&%emGA5<7S9HS^C,J)!a"mADhiVZrckE-Z%7*#O,g:3B!@klcURbnMj4A)PDfC'nW`V]Z6B;XUE4=YdQK5;/qcI$$8!\fC/,c/TL5GFsrTk58%.VgsVGdW<4YVCc-KRTMqkR-U'%9+e'`"P7M$Di:XPg'PX/!9o=o#`o6O!IDtkSH*As'-N8:!Ko\^+:SGSdQe?d%taF)%5MqTBHDb69;Jn.5X?7*5@n6,&BKGtJ8D0Y4"r`>F.Eaj"c/0tM@cSAsKr%&uqa'\#Ii:&09k412h,I_r-"IYT/#+MNXP,eQCouSo?*^sB6`T>MDbu$#MrJ/UndG4FDlEW*lcu"eP\aD[XI1Wh_;9["$;;<3]UZ<,Cm84SG149kF8's06hSA:;M7VJ9J,e)JOub4,'9bDNZ\_M6@/>b6LJB.$2Y"t.;mgIBY=.tam_u>2Pm;:Rg1D^iqHhr7D;/m=;M,eGr'_7HGbd1@`LQ(WAm9FY%L5je[^b(Vim@3V3)W1@X69*0*6!>)s03=)imAe[X*o-j]f7jC?'iWU=7"Zo.;JBY5FR?[M"In:nu6Qrl[.5Qh2"d*G:3FIh$+8CMQ1!=gGQ3[W:l"T^O!B$.I>?g=B/#!CmtVe!]e&FlkLqi3`@C28Q;$6i!At_fFroCU^T(L.r6RX^5!Ln$5(U!:$do;SOIZQrF,D.?kl23I?V3]'_A=a@ND_R-t:(.NZOCjY,_XG''F7R73'+(L8e'Oek%#=c4N^?AsO'-!?30lm5eoP;CC%o!d62!./O6A<4O:=s@9A%cTk.B4U!=fOn/X:6b:+EY'>2T$0VIH`AVE8pPP>L_!pdP3FQ+T2Lq7Ol=jQ+?kIl+VQ6=hG@dE;%iEO-Z:Vb*8!Ul1j]5JY`E98HbbE@LF-^.!1[I>,s:mO%q,uCd-Lcm_d;rI(@`R7[AVV#E/)'cGqJ#CfIKb$7GnT$an/aSm^:KpCF*9ab,p+%p0)9aA<4Mdp<3Tj4P4GS#nQ`of4sI&"ZkT7!b>*A?NBH7pBrhL"Toe7L&nTX?SMQSj=:Ggn@Vf:r?[)I^%(_u"O=5IG[?='&GCsYf-50gIE_:d`.tRX4hVV^1[H?Xf-3D3IH9Y##b5>,H!ZF(&GFi,CCrPD?LbZDnKI7aVq3,3mVNE1f?/'9Q+gQTl$#k30:RWAXn;9i8\T)*1Z(.5K=r%i+P@uYL4.)5>/Z3#cTJlVJMZXkT%>/MKRN.M[0W:2Dg5THp^m/=dq]OT_`m%)/`K.M-_=Y&^_ui#cYF+7_ER\c=p3-TO*Fuhp^m.]Vq3,3L:u_p/`K.MCJV-&i8!XP4Kh2$#^b[t[0W:4cgt>Y#I4$q=p3-TQV=TJiEe$_]iJ$;S+E^>%sH[^dqEgFB/?.(B#-*hH(&P=H#1X0fJM5h;br$?.=X3;HSrY-C-9bk:u9@mP(b16=VFS@rJ&$5!WOq@qhNjCk?ARR^C5E8MSG]88Jq$"^1gVgh9'!2L9Fd/(TlaLJ2moAT*+j`!N:@j]B-kQh"-8mZR-'e]CNecX8Pon\f?$endstream -endobj -% 'R37': class PDFStream -37 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 557 >> -stream -GatUq:JZTs(l.Q*I#%Hp9?,]6^K5P6)DsbI"j-n4[fur10"3b%;Vn(iVc&(^smdL8>/tpbLE@p=OT/dg+NrE^P3m@9+[#_c8#FN,V:34I`oXnPSs6WP1DoYLfJ<#p;HeZqlCMp3D_uF\X#6ofd2;PQQ7d.hF%*[LYfl,R2PRMUpSPL(Ja`O;)OJK?~>endstream -endobj -% 'R38': class PDFOutlines -38 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 39 -0000000000 65535 f -0000000113 00000 n -0000000298 00000 n -0000000463 00000 n -0000000656 00000 n -0000000887 00000 n -0000001113 00000 n -0000001336 00000 n -0000001653 00000 n -0000001818 00000 n -0000002099 00000 n -0000002271 00000 n -0000002446 00000 n -0000002673 00000 n -0000002897 00000 n -0000003207 00000 n -0000003489 00000 n -0000003678 00000 n -0000003905 00000 n -0000004129 00000 n -0000004441 00000 n -0000004631 00000 n -0000004799 00000 n -0000005079 00000 n -0000005359 00000 n -0000005639 00000 n -0000005920 00000 n -0000006058 00000 n -0000006329 00000 n -0000006507 00000 n -0000008777 00000 n -0000010171 00000 n -0000011634 00000 n -0000012106 00000 n -0000013459 00000 n -0000016064 00000 n -0000016732 00000 n -0000020060 00000 n -0000020761 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\275\375"\226\004\012\247\311\024I9\2513L\031\365) (\275\375"\226\004\012\247\311\024I9\2513L\031\365)] - - /Info 27 0 R - /Root 26 0 R - /Size 39 >> -startxref -20813 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-009-splitting.pdf b/z3c/rml/tests/expected/rml-examples-009-splitting.pdf deleted file mode 100644 index cbfea3bf..00000000 --- a/z3c/rml/tests/expected/rml-examples-009-splitting.pdf +++ /dev/null @@ -1,222 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R - /F4 7 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Courier -<< /BaseFont /Courier - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 13 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 12 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page2': class PDFPage -6 0 obj -% Page dictionary -<< /Contents 14 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 12 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'F4': class PDFType1Font -7 0 obj -% Font Helvetica-Oblique -<< /BaseFont /Helvetica-Oblique - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page3': class PDFPage -8 0 obj -% Page dictionary -<< /Contents 15 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 12 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page4': class PDFPage -9 0 obj -% Page dictionary -<< /Contents 16 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 12 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R10': class PDFCatalog -10 0 obj -% Document Root -<< /Outlines 17 0 R - /PageMode /UseNone - /Pages 12 0 R - /Type /Catalog >> -endobj -% 'R11': class PDFInfo -11 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R12': class PDFPages -12 0 obj -% page tree -<< /Count 4 - /Kids [ 5 0 R - 6 0 R - 8 0 R - 9 0 R ] - /Type /Pages >> -endobj -% 'R13': class PDFStream -13 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 399 >> -stream -Gat=%h+kg@(qj:^G;tEqTS]Ks"j82]d0iWeoED+X0`tpg-,d:%/T(m=#U)pS/>qD$.g'pPL%B^%gai"D%#dP*^]Y6G;`q'>qMM%uEA6W3cH*60*5I#Kpe[-9OH>\nXjKjLVL8(kJ^VPI^endstream -endobj -% 'R14': class PDFStream -14 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 500 >> -stream -Gat$s>u/os)8T\6mHcTFcJtN?qaCp2"APO.YZ-_2VT_OhqOG-PlOFf/nrVEkFQ`uK%M^8s">&DK&`Y"5UcC=KLH<^LCOiI[kR:g"\B_(8X(b[$]m@Z:"#uZ;P\:@5!e5fVFRu90"BC8rV+0"1hVTWefjf=plVJa%tbMX'TC%/b.u:n`#*0V6:phJpr*M?`KDW]jc%;UM8423jgn]eZ0dt+A675oZI\YQfNe?\`8*#Np/M@qna76ZeZYj(Q8@2H(Z[oXgV3)u/tIV]09b$(?2[-fFg&_SM)sO]fojfqf50HG;60!"lL\W\'9;VIE*9Xnh`iaCEm,g\M0?JENV)-)Iui:MFo4JYXn:@8>'YT'K.j*u2.6~>endstream -endobj -% 'R15': class PDFStream -15 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 517 >> -stream -Gat$sbA-)l&A/t[%g@=5%BQ:AagQ:#GsFnC&)BP^:=e*d?mjX4Qi):Xq(Y'l%DcFc=\Ihj](b+D^r4KYUig\D<\>nq8s*rd'ptZ`Nln>kM\>.^92GN%)0JlF21iu2RCToPG[5^V^*k,i`om@!o8S:cc),iq.,pD://n>Khkn$]'LF97pXDreYZXCGK=$l%.T,Rub-I=$G0b>S5Su9To^bHh>0>Tme$V\@W%.B6Z$HXD#CP-AY@ZO#jr(>9l*i5+G:l\Ybb!L3#Sb<)s_GSr1364Lcq9O&*`NhsQI5Y-"'P)5m9,Xsk"%f"8r%J(]m/gU1gW.8;%tI,;QGMe$#t76Ze8q.3VceIl"6+`f`!kG^'mM_c29E_=R`PGJnfNF$"A,:e0d<5+r[4hd/:fOI4PPfLZjg+*]3BZ0c^+\fZN6,E:n~>endstream -endobj -% 'R16': class PDFStream -16 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 351 >> -stream -Gb"/a;+ne\'SYEPr=9-$R%c=G`1"As%Nd#sQTn;'Xd-BZ+7M%%_,ZrW5?4a.uPUSMV$Arog#,D(M.HOVEBX;ZF/Sf!+b5(\6<5)prWd\Ohc5n[g&6CnQ3,tKIeK3:=N59dUJ`jkXMa,OjQ;6M#&es)_B$KoWC?J$GrGVn.>>LS&CctuJ%@r_q07TbWho6pc8<%m0BJU,jJE9>E=ZsD^A]Zc^Bh6LHr+8;i$Nr+QZgE6\-_Z2.?Q]T>o$11GsRrendstream -endobj -% 'R17': class PDFOutlines -17 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 18 -0000000000 65535 f -0000000113 00000 n -0000000245 00000 n -0000000410 00000 n -0000000599 00000 n -0000000758 00000 n -0000001037 00000 n -0000001318 00000 n -0000001497 00000 n -0000001776 00000 n -0000002056 00000 n -0000002194 00000 n -0000002465 00000 n -0000002596 00000 n -0000003137 00000 n -0000003779 00000 n -0000004438 00000 n -0000004933 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 11 0 R - /Root 10 0 R - /Size 18 >> -startxref -4985 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-010-linkURL.pdf b/z3c/rml/tests/expected/rml-examples-010-linkURL.pdf deleted file mode 100644 index d635b594..00000000 --- a/z3c/rml/tests/expected/rml-examples-010-linkURL.pdf +++ /dev/null @@ -1,124 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Oblique -<< /BaseFont /Helvetica-Oblique - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Annot.NUMBER1': class PDFDictionary -4 0 obj -<< /A << /S /URI - /Type /Action - /URI (mailto:robin@reportlab.com) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 0 - 0 - 595.2756 - 841.8898 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Annots [ 4 0 R ] - /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20130304200123+00'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 416 >> -stream -GauHFd8#PM!Tb3?Q4MW%C63>EmPaj_$&slR-QH)6#g'P5pc`U9JMr%>JNlKI"h[q3^cR[Zo/DM*72ERJX+6MS(0G&VoUlB7f!.N)]'Te&q,iMiXak=8@`U)fp<(A(La/TPZVU=Pd!PEu_AD%G4\rh4iU84WkYmO$';[3MU-bRYTOq7o8+e/Y,!>_b'i7&J%fn0_begFLg'~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000579 00000 n -0000000795 00000 n -0000001092 00000 n -0000001227 00000 n -0000001496 00000 n -0000001601 00000 n -0000002160 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\275\375"\226\004\012\247\311\024I9\2513L\031\365) (\275\375"\226\004\012\247\311\024I9\2513L\031\365)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -2212 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-011-keepwithnext.pdf b/z3c/rml/tests/expected/rml-examples-011-keepwithnext.pdf deleted file mode 100644 index 583aa983..00000000 --- a/z3c/rml/tests/expected/rml-examples-011-keepwithnext.pdf +++ /dev/null @@ -1,318 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 9 0 R - /F4 11 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Oblique -<< /BaseFont /Helvetica-Oblique - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Annot.NUMBER1': class PDFDictionary -4 0 obj -<< /A << /S /URI - /Type /Action - /URI (mailto:robin@reportlab.com) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 0 - 0 - 595.2756 - 841.8898 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Annots [ 4 0 R ] - /Contents 17 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 16 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page2': class PDFPage -6 0 obj -% Page dictionary -<< /Contents 18 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 16 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Annot.NUMBER2': class PDFDictionary -7 0 obj -<< /A << /S /URI - /Type /Action - /URI (mailto:robin@reportlab.com) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 0 - 0 - 595.2756 - 841.8898 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Page3': class PDFPage -8 0 obj -% Page dictionary -<< /Annots [ 7 0 R ] - /Contents 19 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 16 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'F3': class PDFType1Font -9 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page4': class PDFPage -10 0 obj -% Page dictionary -<< /Contents 20 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 16 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'F4': class PDFType1Font -11 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page5': class PDFPage -12 0 obj -% Page dictionary -<< /Contents 21 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 16 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page6': class PDFPage -13 0 obj -% Page dictionary -<< /Contents 22 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 16 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R14': class PDFCatalog -14 0 obj -% Document Root -<< /Outlines 23 0 R - /PageMode /UseNone - /Pages 16 0 R - /Type /Catalog >> -endobj -% 'R15': class PDFInfo -15 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20130304200123+00'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R16': class PDFPages -16 0 obj -% page tree -<< /Count 6 - /Kids [ 5 0 R - 6 0 R - 8 0 R - 10 0 R - 12 0 R - 13 0 R ] - /Type /Pages >> -endobj -% 'R17': class PDFStream -17 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 509 >> -stream -GauHGb>,r/&A1NU5O>XS_IRN(N]A8YJqO\597A!8l&.Yr&tkkXmC'"Cf:`E`/(&[`1ZP`m&EjAdH]eIn`c1[*J/$ul+=A/g&L1P"!Ol_Q@G3XjE,54]l6$O^P_QMKSH`)+^V.*%mf`*0O@pc8AM&(e-]@="=>M.)e>O??$5_gdd8C26WoGcCRe"0J)@oiZ.]Xmh`ai!0(N7W^mdT.T@!H_g\i[6)YE.M0$8s`a4#+F9f5dcJH8amRrnR,DadY%As(Gi7:+,8N#;4L,S`=1DGC$jUpB&b,l#PNGNgi0LijNNWl$r,1'0,dD+5lJm!<~>endstream -endobj -% 'R18': class PDFStream -18 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 202 >> -stream -Gaqcob79+h$q9oSbWjmZ\j2,TaOWa\DN+Mp^^;eY'J].L*NC8;D7[:&3L:Bm)9S%7UZ8>+\(^+Je*nJ]!1Hi\qQ)t7a#")s]8(2;Gr:Xn5eJ(`L"kVajcanT`(DMH@@pV!D^;F%\3dHdrkERU72t0FtSTOl^CpLU'cX>!&1kmcE~>endstream -endobj -% 'R19': class PDFStream -19 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 475 >> -stream -GauHGgJ5X?%"5>/J+2Kc7#9;s)P.Mg5XG`jUHd+bNc"F*\cM\UP&0O6?$P!(C6[<>nZdM4,#Im(gF!0?I0)><#fn-V!cl.$H%nTt"sk[0(DfV%#H8H#1"7)RL;>VRE6#k`,dE.^."a=+8J)0VqMC-AFnStglT?2O8QD9#aP"5DK?Ji*jRHf*B!^/1=*$u9@Db/^4kX]"j;U6co4L;^@R#-Rk4U/O*Rs]-mQ's6*p=SF`-B=8be9([NmF(S+*-01A;ONc-"d21`E$p`K3o%mld,~>endstream -endobj -% 'R20': class PDFStream -20 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 172 >> -stream -GapY8_$\%5&-U@,+TF.R7>8bJ]%67K[&47GpCAO$KaMSnIqr!f#)3@MLgqk-\Hb$I784nZ>sK#*emN.Ih7_"?"R3so6M\)&kkDukL.W-u,HSrXZu>`DX^UHSTRC+$K]5'?eI:$Fk5"$#h$n.SE""4X'a52R.NSnuGOY#0-G^s_~>endstream -endobj -% 'R21': class PDFStream -21 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1297 >> -stream -GasIe_/e9g&A7.."\.*K&HkbW,Y4h-oUd7c1,JE2k]%0A?db#Z6jDaB5ch+T#RA;OFT^4#nPjg;g1Sj(>Xkk>OWhr^.VBi@sEb#Ym[UCWjCPK2.9FETtG>0`FZG',d^6,([O]NSr,X#7!q$ef\ZqrdF[jek=]Bu;+BQU+-=?cO8WDU)qe05Z/0.6aAq=LqheC:VF:.p?6@fkNt!opS"lQW3r\!`<$c98P.1FKe:@^3Klm5o30[E.3^%X+Y^LG\7Q2rDt#oO8Kthfnt+;)lLFu%hl!sjEZe@Pp@>H2B[cO*I".DJg_lt4E()/iL;%m&*>JpY#OWg"JW,iD$6rL73UrCeko+1q9R4&%3j[p5[;gUJ'q@^u(\\lokUWm6SmSH-^DqHg4t!5FinZ1/foR>mq9Yi$\d#\NiX7d(7%mWG/BfP`>gQ4]?"cLNh^ue]nUFQu0`)A9e&[84iCsq]G/&!a>T.fN6t\HBQl$3l^RR>JraiG(+l8PJ[-1^Lg!b(eZq?>A1!h4PL2l*i!b=m;HG7l=Qbm8V$It^>TJ1/(Mlt#.GRh@ndAGsN^lpGY0hI)*hj`KBi$G)K9R\'03+=jdXs@**gG):>6>6OF:UGISn05!6,8u(h>UD.QCgh"rS8D3Q0;QkV8L<[MAOQKddSl#$YLVqjs&`Z<*moSdbljQjUK68m<3a6#Xl0'\9AOSHl#_Pt8qBSKL!3"Z=,3`7d!C"9:feMK's[\q6;m6&uFLg!QQg"ND_T!3agW!mkB`gl!^'<&:s,in>lG`&4]FfS.D;gaH,]lGa>=GPSd+6]`58.%`A]Ho+9'4H+-4Z>>R/)VI]&`'priTHTmUH_YoG>#_OV-VF<19Ni;G8I2m]@Z0;0CfC-MYXI/0TkmVteCJ7+67:f.*-CBu`eLTXP9rm*9,?XV]><7th05rZ:/CikN,4al~>endstream -endobj -% 'R22': class PDFStream -22 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1071 >> -stream -Gasam9lJfF&A9%PIi':E]5X""/8oa97C+@#9c=&Cpd.QY&mL6X8]n=7lhcFjO/+Mq@c:Tc*6u3Bn'0q#_C&.:bs:no7IPC[jTSY2b0-l^lCQj6QPY^L([::Pnr9.SH+#o.i?1AG.Fsu)>Ae,\>#@0(eK;Q^(E\._;8j^,k=J1@\')[Ym57mn;Y=]2NXOD"E[ara8!C40/S<&:>&6oh)4/=;=if2m0qMTXsU1=4ST-Gf>d\shD]Gc,(UX:f2gX4b#[];>Up+Mr.IR!uf?:C'](GocB':PrQJYF3Q@a>bJCm]M`kW>#Kns3MVICICu6J*/qc,P1.d(@E,GT^j!^a3?0,I3a9X"E,/\$*8;^;ssPi/GHSqR5s1L!*s(5IcnT09PFrl+oe%g$?D@'H)]ckn%u)L7d,Fr=.Zj5W7CcmAr'T##3LWG%s9Wj(nk=P;9LX"fD+6@*;"M3el.GkJp/@*nWf??:Cm-Z:uua6$hkdef"02,3N#5V\^CX2e\+7B\U&eSD3F^[W02upmJu]eBVUs_#ZOQ!+)F)'G@K+9/XhF,%uLGFm0A8^]hWKE(_(l+e55f?9kLg*do-SjekQdP`,)VAI7q'RYJk]C(:3h[.eI2^![rqot'JRiJOro_p%"-=QnkCG'[/(UuI-cf%P_+gq>RK@-o&HJ[oeVbac?,93UcjPK(m-%:\H%I%KJm$W1!mkB`4I@Z>?*gm^k'BoPREI0sbouX#2ej)Q^@@E'?%-\8'Vr`?b%D/2BCnXDLX\5RcXM2-2p^fNJs5M"C2t7DKendstream -endobj -% 'R23': class PDFOutlines -23 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 24 -0000000000 65535 f -0000000113 00000 n -0000000246 00000 n -0000000411 00000 n -0000000604 00000 n -0000000820 00000 n -0000001119 00000 n -0000001412 00000 n -0000001628 00000 n -0000001929 00000 n -0000002116 00000 n -0000002398 00000 n -0000002572 00000 n -0000002852 00000 n -0000003133 00000 n -0000003271 00000 n -0000003542 00000 n -0000003692 00000 n -0000004343 00000 n -0000004687 00000 n -0000005304 00000 n -0000005618 00000 n -0000007058 00000 n -0000008274 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\275\375"\226\004\012\247\311\024I9\2513L\031\365) (\275\375"\226\004\012\247\311\024I9\2513L\031\365)] - - /Info 15 0 R - /Root 14 0 R - /Size 24 >> -startxref -8326 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-017-outlines.pdf b/z3c/rml/tests/expected/rml-examples-017-outlines.pdf deleted file mode 100644 index 9a8ca317..00000000 --- a/z3c/rml/tests/expected/rml-examples-017-outlines.pdf +++ /dev/null @@ -1,263 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 18 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page2': class PDFPage -6 0 obj -% Page dictionary -<< /Contents 19 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page3': class PDFPage -7 0 obj -% Page dictionary -<< /Contents 20 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page4': class PDFPage -8 0 obj -% Page dictionary -<< /Contents 21 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R9': class PDFCatalog -9 0 obj -% Document Root -<< /Outlines 11 0 R - /PageMode /UseNone - /Pages 17 0 R - /Type /Catalog >> -endobj -% 'R10': class PDFInfo -10 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R11': class PDFOutlines -11 0 obj -<< /Count 7 - /First 12 0 R - /Last 12 0 R - /Type /Outlines >> -endobj -% 'Outline.0': class OutlineEntryObject -12 0 obj -<< /Count 4 - /Dest [ 5 0 R - /Fit ] - /First 13 0 R - /Last 16 0 R - /Parent 11 0 R - /Title (TOP Level) >> -endobj -% 'Outline.6.0': class OutlineEntryObject -13 0 obj -<< /Count 1 - /Dest [ 6 0 R - /Fit ] - /First 14 0 R - /Last 14 0 R - /Next 15 0 R - /Parent 12 0 R - /Title (Level 1) >> -endobj -% 'Outline.7.0': class OutlineEntryObject -14 0 obj -<< /Dest [ 7 0 R - /Fit ] - /Parent 13 0 R - /Title (Level 2) >> -endobj -% 'Outline.6.1': class OutlineEntryObject -15 0 obj -<< /Dest [ 8 0 R - /Fit ] - /Next 16 0 R - /Parent 12 0 R - /Prev 13 0 R - /Title (Level 1 Again) >> -endobj -% 'Outline.6.2': class OutlineEntryObject -16 0 obj -<< /Dest [ 8 0 R - /Fit ] - /Parent 12 0 R - /Prev 15 0 R - /Title (\376\377\000A\000m\000p\000e\000r\000s\000a\000n\000d\000 \000\(\000&\000\)\000 \000a\000n\000d\000 \000J\000a\000p\000a\000n\000e\000s\000e\000 \000\(0~0_0o0T^\014g\0330n0\3330\3060\3530\222\00010d\220xb\2360W0f0O0`0U0D\000\)\000 \000T\000e\000s\000t) >> -endobj -% 'R17': class PDFPages -17 0 obj -% page tree -<< /Count 4 - /Kids [ 5 0 R - 6 0 R - 7 0 R - 8 0 R ] - /Type /Pages >> -endobj -% 'R18': class PDFStream -18 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 172 >> -stream -GarWr9aUqV$jGR;Tm(`SF\sNk[,Y36eURq9JQ,KYr'NW^R:';l68fpu(IFlaG4u*C'$N9;@`SQa6\KP`Mg'C6bS\ii`Y;=YSM>Pf1*`].8?E*qZ^@dB1^9#9V:4lNXW=cb;9O3cR`P/VY.RDgmH`Gt/nGAM6Y>ut?$Q)E3m]B+~>endstream -endobj -% 'R19': class PDFStream -19 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 170 >> -stream -GarWr_$\%5$jPX:U$qImVh_k%da"mI:BM4"##[nC"@[`fZX>pf67sAXIgE.dff`*G!$HO\sDkkeI:PF7eQ`G3F6T7!P(O_o`\WGpAre-.OP~>endstream -endobj -% 'R20': class PDFStream -20 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 170 >> -stream -GarWr_$\%5$jPX:U$qImVh_k%da"mI:BM4"##[nC"@[`fZX>pf67sAXIgE.dff`*G!$HO\sDkkeI:PF7POP>kBOP&"lp"nee`Geh$;I7.OY~>endstream -endobj -% 'R21': class PDFStream -21 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 282 >> -stream -Garo<4`A1k'Lhaeq%%\L6ALY8U'*qh_8LrdOi:$(KRD?*8H&:**Z.b>b0om#jEp;N+`W9^((Ka[0jPG`5jgpPS3h+tP%!hp#0[3`4u,EDk1Q%Th4eq@4BobWg]]lOC$qAk#m58,FLmfYg;_6H?7&-A[*][q42*hUZCO7P+CBPJ-Q`-!K316Xpgk59RFoP%Oc4bH'%-SR(DZ:6=Z80:dq^bendstream -endobj -xref -0 22 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000587 00000 n -0000000760 00000 n -0000001039 00000 n -0000001318 00000 n -0000001597 00000 n -0000001876 00000 n -0000002013 00000 n -0000002287 00000 n -0000002412 00000 n -0000002584 00000 n -0000002769 00000 n -0000002897 00000 n -0000003061 00000 n -0000003430 00000 n -0000003561 00000 n -0000003875 00000 n -0000004187 00000 n -0000004499 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 10 0 R - /Root 9 0 R - /Size 22 >> -startxref -4896 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-022-paras-oas.pdf b/z3c/rml/tests/expected/rml-examples-022-paras-oas.pdf deleted file mode 100644 index 9446da03..00000000 --- a/z3c/rml/tests/expected/rml-examples-022-paras-oas.pdf +++ /dev/null @@ -1,244 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R - /F4 5 0 R - /F5 6 0 R - /F6 8 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F4': class PDFType1Font -5 0 obj -% Font Courier -<< /BaseFont /Courier - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F5': class PDFType1Font -6 0 obj -% Font ZapfDingbats -<< /BaseFont /ZapfDingbats - /Encoding /ZapfDingbatsEncoding - /Name /F5 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -7 0 obj -% Page dictionary -<< /Contents 15 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 14 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'F6': class PDFType1Font -8 0 obj -% Font Courier-Oblique -<< /BaseFont /Courier-Oblique - /Encoding /WinAnsiEncoding - /Name /F6 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page2': class PDFPage -9 0 obj -% Page dictionary -<< /Contents 16 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 14 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page3': class PDFPage -10 0 obj -% Page dictionary -<< /Contents 17 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 14 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page4': class PDFPage -11 0 obj -% Page dictionary -<< /Contents 18 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 14 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R12': class PDFCatalog -12 0 obj -% Document Root -<< /Outlines 19 0 R - /PageMode /UseNone - /Pages 14 0 R - /Type /Catalog >> -endobj -% 'R13': class PDFInfo -13 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121218153938+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R14': class PDFPages -14 0 obj -% page tree -<< /Count 4 - /Kids [ 7 0 R - 9 0 R - 10 0 R - 11 0 R ] - /Type /Pages >> -endobj -% 'R15': class PDFStream -15 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1376 >> -stream -Gb!#[;/`4!&:T\)s"JS&S>tG]Z='o$LJ+h::.j9rRAVMfCO7f.0Y">lFT(m'>n"/uI7rq*=!b._n'$1:bVq=/2H]`eld*Ngi')hKW=:b>0ER^U#2o[^)I?eLI=7s<.+l6pUGhY21H_nNEN&2eJ:VWA&?]I:l*goopjNRD-md*;6jad]?[egC#/\+tr(2\=G^YjnR&YYug4V3MJhceC-j7aNH@qlL>^`t]lN9d%'WVeLJ'UaUZ&P42q)k0.@Nd'rqCYu(q]GPe&IR2/P)/IKJR:fhLdC:%tskb1HdfiT(M+LYoC(WsQ@gV%ndU:_$a<9AIZH"6PTahbRc9q1X\TV^d7fA%P6l;8Kfa%.dr$4Eq\Z5-=PV=N>/1jBsn@E]oP@.Zcogd[ZT&TT^[>-&7uS*Ar+dY04:#$Dk6ZW(W>9_H4269NH*FBZ<`9ToPH6kASN;=?4Q1_#%#d)Vu&4lQW%:^5nL*21"GfrofkG16h'=#Jb"U.D2M@[]g+bOu?f:AEUYYDU5XPXe%["#Eu!ljuW>]b$,MGSB#Y,[6]+m(i(@kIDW'gb\,.gmtLGg`ngQCXW)"Kh\.LGXn;4q(+oF)d4oIUoHOoe's_Q\4jETE)"=lglS1&TZ#3.@*Y\nh1pDg@@h+H,O"$bT]n4,BC3G6GPhbN+D6@C.BC0cc,R")p0!7tg?Y`!NEY(!A)]qs4;F;=QRmDdsBfJ"B:/U+f15m`IZGO1k.Q-3%X#f;sbfSZW11W#50Z[b^,)?!E1l_dR2Wa1l&1rM-oq9TQLJS6hFf"paauF/lY%XqL<*P\g1Z;eh[ifOemSm^Mendstream -endobj -% 'R16': class PDFStream -16 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1469 >> -stream -Gb!#\9lJcU&A9%PIi,,>W.hY,W^V7%d>`+b;;'M:8Y[PH'jkKOlc--Yl_87k*IQjn7Xoioq6\-uuk!0(^&DY-@_<&YnQPXCr!VPLlUVnm&\3LEAAp_H4i)pfu.iX5I'>_@Ch4,THfkTbkV%tViYZ]J#=MQ25[l4AeV6hquG5S_-dl\id/0fDl-:sH>I%BC2BCK!t1k-UFMhc7i6Pf\@aUL/lVtYFcHpNfl@U#B+/PV=r?u(@M5c(c.]CGpCWENn4:LT3f<6g1lD>&XmG(oI^I@^g;8!5&NO3H=+p0S?Wjh$qBtcYsW83uCuX4+c;b]aQQs;p0Qg-,VehE`*&^0l,:8hXTt8lIeGmNL2gc]o#ZOG%/GTtWO2j259A5ki95cn*/B4Q6do2<.NuEfV):Pl:H7N\a$;mmf0nOmQtVrpi&T)L(lI']SekU-pnjjZA%i2qf=[:uZYO*t3]S=!oB:/EGsT[\OC03T$B2LN3AoHR+&G/&+X(Ul5h^!ST\UiSnGKWFfOS=O@'JMlL("8f3jE8mk*>Sp4WS"s7nH$.,N?:!hVOj!6E:=R:iUqk%>0Ff<`/SVeD5]A?Rmll=4tENI0o!6+]5q-!X-uuIHOJceE\3gdEDF%"?Ur8JC_k-[FuP^K+dO0)9s7h:rhPts!,>GWP75=h]gTrN$0Sc]+^@V@lQ0?V-Hi9R28bLB3%jQM@[7;i?;)8EZ*]Z7Y9@$6n:V-gaola=_Z4*pi2/S@?,QQRkT[8l)M87--GFG"aW,#kp)i2]fTT;+?qC_R7hR=[r[iX^?D@o^VP:cC8$#SlusKZoiL0fK+4h7W;FVY)67uKS9:o2HWt0_B+[X9c;8#aBs66e66(&oZa58)hp8u`'mkXMLftFQ'BH!OHi'fbr)PaWJQH+4Tm+K_.mQ(s)#0,M1Rp\gCg(*2)/M*Sh5blgdD%.lM>j9_4&#LMHbPTmak:/]b&+=a[Nt.Ng3^,RibL<^]P_'\!\Q/*")Z3#;#~>endstream -endobj -% 'R17': class PDFStream -17 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1407 >> -stream -Gaua?D/\-!&BEZub'+]uhU#2?GLqmTlC0W+3JmI``&ZYEnn,]G\2?0WYEO"!rasbX5iR-,ZH1oXaoj6kGuANi=.J?&T)(Vn`QJ3q)l97d_$APSS+,!YXPJ@Aqac'Qn;.%-(*bRJ7;Dk_aS\l57!/IA[An?u)R3i$e20Oj5aesCnqTik;jFWu`UF(s.4IHn88p/S,ekQOglDHj(lC>?kZk`jZ&fgcMEh9+m]q",G8h%fL^(M:cF)*:#S*]nnJ$2t`DMip#42!qE/4a:Cu-ts's7?[D4Ub\boTJZEbOsk=^/&\%ZZ+NX@1Ps;&a+N=/W%8PJn0oK..<6;#=%:dTgEk2G`87<1A0/]SS]MX1raU8s4$R=6o+W7O1msc&=l?sPONosZ"#*qPj&96#YcPS#]RefWJVA;^S/,6;j&Pae'[rUF-oItsXKt5B]W'Yd&I5.NTd&/O!1Qq<3"SWI[#UnYuD\Cq+o:hnddVpY4)L$I?cFpLFX,;G;$bJOtcSlB^)\?m0dC[Q]/dUU[bT`%oR_*h%(*2O/-FS+*T%1)tPueJYGBfRtWPX(&h[S1*[N%'G>7_S(OS2pKXf8T!5S/;J]+NA0AEjdWm@NW'7cTB3kPY[,%+"39ChG%pJ>.;\/O3+O*7CFE3`<4hVM]<;QASZ<3HF+02IPcOl$6.Pdo:B]sKH?4,K1C<=<&P%0*g3+3$M1@Zm98hJNm3`*h,?]rc[VL">(HfW+a5&6ZY!7m1MfH*ud?KDp,bm3TET?Y!*_E'%T'6k<&Cr%)r(PRU;+3!jY'-DT%!-"1G`8E$_?;`+l8pCd5c<6OP^7C.<,r8>ku9&:6)T[8g),f>6eNA#q6$\+:/Cik?ots#~>endstream -endobj -% 'R18': class PDFStream -18 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 462 >> -stream -Gasaj>>N*i(k#bss)=]h:8;=d$4Lh`7S-9-&a?&DgF-R;)r'lVgD5ZO9JgORIHRup3Su9:-U4@"3!UKb3^Ws8_.On7A`+dqF5'mPQKBSdTK#R!T&Cq\2LT6tE!Hf&kCMf8hHreFm:chYRMM)eg'V)gMc35$^d#XgFc3MA($JT(=I6OVTf;2I]`>IU7&q71Ff;@?37ih]M)s>]Tlt.C1\ApC<4R.kX0PHX"CX$=B]?7Z`IX*?Odtn/aR+fqVGu-[4$s53.4sQc%\KX.ijjj]%;'120[%hg"fekBdO5c28jB&\_3m4?KR%]uHW+4iCEc]:l7cP#[R"#RD(\[k/k#6QPd%9.bc/(_~>endstream -endobj -% 'R19': class PDFOutlines -19 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 20 -0000000000 65535 f -0000000113 00000 n -0000000269 00000 n -0000000434 00000 n -0000000623 00000 n -0000000794 00000 n -0000000955 00000 n -0000001129 00000 n -0000001410 00000 n -0000001585 00000 n -0000001864 00000 n -0000002144 00000 n -0000002425 00000 n -0000002563 00000 n -0000002834 00000 n -0000002967 00000 n -0000004486 00000 n -0000006098 00000 n -0000007648 00000 n -0000008254 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\\\235j\236!`\255\002\350\332z\003\317\346\3325) (\\\235j\236!`\255\002\350\332z\003\317\346\3325)] - - /Info 13 0 R - /Root 12 0 R - /Size 20 >> -startxref -8306 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-029-keepinframe.pdf b/z3c/rml/tests/expected/rml-examples-029-keepinframe.pdf deleted file mode 100644 index 2c712ec6..00000000 --- a/z3c/rml/tests/expected/rml-examples-029-keepinframe.pdf +++ /dev/null @@ -1,90 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -1 0 obj -<< /F1 2 0 R /F2 3 0 R /F3 4 0 R >> -endobj -2 0 obj -<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font >> -endobj -3 0 obj -<< /BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font >> -endobj -4 0 obj -<< /BaseFont /Times-Bold /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font >> -endobj -5 0 obj -<< /Contents 12 0 R /MediaBox [ 0 0 595 842 ] /Parent 11 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> - /Type /Page >> -endobj -6 0 obj -<< /Contents 13 0 R /MediaBox [ 0 0 595 842 ] /Parent 11 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> - /Type /Page >> -endobj -7 0 obj -<< /Contents 14 0 R /MediaBox [ 0 0 595 842 ] /Parent 11 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> - /Type /Page >> -endobj -8 0 obj -<< /Contents 15 0 R /MediaBox [ 0 0 595 842 ] /Parent 11 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> - /Type /Page >> -endobj -9 0 obj -<< /Outlines 16 0 R /PageMode /UseNone /Pages 11 0 R /Type /Catalog >> -endobj -10 0 obj -<< /Author (\(anonymous\)) /CreationDate (D:20140724022809+05'00') /Creator (\(unspecified\)) /Keywords () /Producer (ReportLab PDF Library - www.reportlab.com) /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -11 0 obj -<< /Count 4 /Kids [ 5 0 R 6 0 R 7 0 R 8 0 R ] /Type /Pages >> -endobj -12 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 3047 >> -stream -Gb!#^gQL=$&Uekgs.QLaOE#$:'ec;[7m$7:SFUQ@f2IqN^H`JY_59aA,],&=T@4oOJeCLmZsHg]'no-;T[B+Ti&ER6Do_bp*Je#ddSCA`3A*I4amj"-4hd[MO3aGHIf@QM\`AE+juTj,1kl%/f&M#C/.;UfkAtr3d,".T^N4o'`reKI]V,"q.O;^/*r[p==7f),ltuiesUn-'6(1PGCn9K$l4Wb)94@mn)RLZ8bR%GU""(olG!t1@[6:PPntpE=FQAe]t:0DgM&q816te2dKC,BUln'BRkg-GMUJ;^hhk;3\J.K3)tVp'A?69n%5^ZO_rjp3H&tUKB,o0"M^7"d?*]bf;N.KXe=qK]Y6l*Z1OYH.<.YF>ngMa.Ct[#E^i7A(q2Ot*@@bCo1.+gCh-X(HX+JmUi#\ADe-9l:8,!3dUQS[]'Ps*HXg/3rm,1#3!G*HMA=`mflp;NC/Z`I_kCkN52@!%=08u40"$DHO0eXBZ#jt(iR;A'FX]5fL[Q6f`]=NY5hNC`4@uk"J1-Z*cmTJ@>6r:8Ke?O=`"qq?sa\bQAo;>Z3\17&%pa;]BU1E@qVo6Ut)Fco0OLCk$$iu;AiuIr"d7_c>-EMh+"jNV@Xh*qMunc&4EUrfGq0/9WA3!`@Iu,-\inA%$<'#aIUCm2?[JSi;=L=@ok3s!g9*'cdb(BD"UbGn.fsd6BgFLVJO-_?>DIB=;3*S!q,-Ya@D6Z:*r*CRu9Z],50O?U%&quX=%#9b2BggfdcX-TusSF="^eCW=8I_G1sg(H(MX\X:2g%QCn-4_I-AogA)#j(UGLP8-FPo2t1J*Ej5n=bj-/QSb:=p_-,:taEL[^hMPG&P(Vk%B9H[/CNQD.-0NHCH3<`T9'RSQkjl%n.XIq^?En`79%?uaMt]LPO5?GX%RjJ1/K3M(dN!P'^"cWcT?#PC"he-+IO`\KLS8:jJ(Q3l)'Q,kC^RQ2$l(X#iD#`'JU0k^5=PP6Su,R^1BWg;C7ECjA^Jg36]NFKg,S2qm0YbOcDD##M>l9)(:E7@H67lcg;[\-*B>&@t..U=FK9):#hKr+CK"P4Ob*F!nS0()p\ecUcO829o^0-mspG/PDfNQUcp;h`,CS131lidX.`lLXKE"P7T/oTa\.fE$jg\t`YnP&;=Mjs*"J/ZfV6BLdGs`4&5VHc30Ygs?tuLN[3:O"BW0&;YK4&']nD=sNslNWbY+IV;56Hc36\C`>@B%;Z^1(9e7pmQYgh-l?+[agW)VmH$DSelLqhDs+Q:,BBd&@[bPQ6M'0!Ba0Lk$JE3Kc2)KC/Y%O<@,^`3c'mcXQ"drVe'hNSo:GM9d`SKCG1D/`IV`:C%/R.M-?o15l0.M8ms8VBK,oB8_sZmU#p$_0Vk&&(<=@^9ZW!c'[p#tdSt-(3p!+RCe$IL6m+(@57rL%hY4q52f:uQJHI8eBKH@gp?h`hBX[ab>2n.!kd\G8VDr/$83Ub@0;K(EjBWbjBo]FZsjL0Z@]fBBeakQWX]fCN(St,e>?mmo!MK?j`L&BfuUQ*JBXg/kCfYEfc<#$mo)s'k&qZ/=>-N"9Z]^OWpCuK[!@,dNKeu:ZJ/U)e@Z6Ke0)6&Y[gqG.qJ8pojKi)F:FtN$j81_c5i5\u7I&AM,%@pEJdSCMPapcl#\l[:No,E$!mpM4@CHhKP7-=VolXL/Y]-b7/Zr2HGS'``ILlXf#fg$Et&8P3^)nDAq!$#>Ik>"\'k@)'551[-dR"t@jqK.,Q9uNe_ElG7,L`q0<>&$OZb$siBD8iuZb%5?QhRn+$Q/Gj'/8:+gg=BI_1(C-e1^PMQ.1<.mBQroa9W3f0;Z(cANeY+N3nNOF^Xt,Uq;1:WmAqsE/A;#\*.7#:,mW/4F`V_La3F6Z'epD2o6X*?lt:ch,NGPU9^ejjVkFgt`qh-7%\XkKalLG_p>tuITZqFI8[tiV+/k0`BkB/(/A&r<^EE1r@7J3LZ&q`"V_*_^AhOso(CBoYdI*ubf/^S?'Y2:CI=3eKi=jXRYg%m2o+h1skKj,4Wl54L~>endstream -endobj -13 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1190 >> -stream -Gb"/$9lJcU&A9%PIi+st3H,gaa>.o%V.]uGE8.0#OGbbZE_(&Qgnf4]MO@i/fqh)/:"oA=TI=4#Q=0-"p:WD'AeKpq-OHDV$h2U\?>gHI;V9Q^/>FM-n)2Iao&AX!,+PKkjSg])U=Jdm&!B;O,YOmp?U5aRY\dh=a00^OgRgF/-0sK;0-%g/nXgo_F:Fju\mNt,?qXS*rS44pCUPS'3aH'it:e?Kg%VG!CFU?RDie6(LHS0#1h%_?noV#Mm\@.Kgo2!SZqTd8-oIeE)5u.B8*2W7*qWITPM=LP',Ief74X4-J'.$3'PD$R6$*a$f/4h=^d#*qqXKs^ol:\.SW)>-9O01u"6Kia(5XeSX9FBQmY)&d,?5REK3IZtu$A5A6nbp8T..-/D[3UBb.[HAT.%^\nh$V+S&D0m)F':4OPe-6-4b=^.6H]YOBen*89f'QSQ!'$5Vbj4g(m\fZ4_""A1*iaaCH*f=lfjC`^"+AT7B+@3#"O4G?sU*BB=t?&I2QSS9KmC9AqN%bOueAPOMVIU$anA6e0kak]bAX#mM?Qp&V$q7G^jjc"\usA(bb]D8/)6Ze=K.mQ&gs8rOYg/\qXCX'@PHW3=gcTCgU9OQ@5MHadH`FX:90Jp#RR=6c9e#V0VQOjWn>)*@\0;1e.5>Z@H4NB\3Ue`%T,ljRNB(GXhs1al&Pe0/fJlo!fIA]_KcXK8g>FPD#nWnb!/J_h*fi#nW*NZL.?-!rZb&OV*"!Y4R0Kt#dLVSOrm>PL*CnM-l_L%N`_E&C[%b=L(lG`lW;sPaQ7?=;3XhSX$rM/;"R6c_sJeV[bnpjZf>]hjA6;h_>Z!%JoQ,eCfeNU/s:_A+[OGBt/puaU3\q;kIusj<$nd$nH`=XT*Oo9Q7=_I0TFkd6'(Nk=,!TB`;(kL4A1Qi_MF.$X!~>endstream -endobj -14 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 1117 >> -stream -Gasan;/_pp&:T\)s"MU/paVU3`Y_?cV,k:n/EN[#b=`p90GlEeQePg*jPP/nf7kWl9k,UVcbOqc2rDhK&CMqHs,.o5k8`>a7hEY$kR>E^C',0)8efk+aA4W*"RPuZL7KMkUp.NJ/K"B7@K7>RV(2<^8o'GkZKZN-Z^[RM`W;3k>$SU0?9jaNKiB_a4\HriJt[HN-[CFBmp>=omX^3`U<,JZ;aJko^-#*sJPj?82+AGXKR>Y)$*;Zg*4WfRMRZ^X@'6nQ(HPa6$O02BE[:0R2i`<0C5a$9D_4!$$.lD*9Aj4*X_tTK!8!Bq$b<=B5kK,_ra$ou,"al9$VQLP@)%)?m"UJeJkD(d`FKMhd$6_a$WjWh/#5Uc.^clqXZ%Gu*(80+241Y"."iD<[S!%$tMJ7D&ue-0^[i3Rb11E:p71;)5-NWAEd:QZG-!8=if+Xe"g&kes8B2jDXj7Uq6Bd"Q1QcP);i8['+hVAYprdmTC2'L]][%(tN_#eCak_!AIaDq$&k4he?#d~>endstream -endobj -15 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 3689 >> -stream -Gau`VD3*G]&cNgos'_"LRu&C?UpM*(f6;u!$Y@Melj_Bi8\?RB*6p\ePON8f2O'HNj'Z$!Sp7V!$7d*#)/27+1,_R0)Oi_qg(WiSi^=%?SP0^=,D+e:%cd=*"*oC>@CqB*_[A1CRA2]lZ]?8In)nnQ1B!]UZgdl;ZHrfX;Z)>^,2J'?qDln*]%.59#*5LQHFC_F$TgkWIKZ'0`Z'9pJ9]E@MPap]^Mi16uJ$W)./LF-$]rclX,On$3Hf2Ca1-d*FPpY$sW@'FK!4I`GQ1s"7GP=r+i]L&$I']P8>9ob&YGP:2Dgn@=D3`WCJU/)XYAe#7ObJ&IIm&[Pn&J>>JssOobE4M55;@04K_>XHsQ6[Z>U$*Op+E+ZO1P^nLtF$4$mUn2gtDZ/'H>SJ[c31(:Q#PXl6Q[OfK^\At!*G"A2eX9Nr#d4Q2Nr7I#>rBB,PFjq=bJ]mes-[8!(Z)I)?3;5*N(;[KE*E*6?XI`.?gbAA2:;s"#CK\i?F>MS2b!nJeAQL6N_%,XL=/RE>nAN3$R5#aC%0i!MZ0b"1kDM:X)i!J5l&tf`\<-CJ.dUKA/q>p*+NME&n:GUgk2$ggb'Mpae2+B*o?#"9AD9Ug!Gn;Bu%h@W\A@?Y7BF;7lIaL4H3HNJn'rh;n;!lB20FW)=B0Q-f]n>7Wgb`2e;8k2.)B`pe3u[XHM[.8:/32YJP)KiC&:*adF!4U[S\JL%KLV;>\qG-KN%:X9b=ORk==S3Tguc*Yas6Nk=%XBfC\R9qgpYR436E/=aZ!eZ;s(L`%N1+?2!'&g\.2"d6$:_J-Q6.pc=nOoN)s0hg,.7>%"jki;G:b_Rc]pS6CDb2A[\;MOII0OMZ@j\5BN#OP[sf[UN0]6S0XX;ac`#kf642!MG&bMi>opO?X)YM(X08:95GciCpc7M;L6h>(n+>$c5(rZ_3kXU+Xp@=qVcq;'Q6(+6'$Y$eO4D"3J6`H$<596$VXejQG0Yu;Jj]]^qU(NY%dID:5j]go/ehRGW#.0Q%k\[]kOef2d7o8c#o.;NoVE=m]`NET,\#TUD\iJ.(im``!UY-'A@W'U!e(L)PP9FqOCP0Y9-`=`)LM>ao=WDT:+s5lHsgquaF>;\J?83R=8ZaZ_=4X\%OG@*_C0@1Ic3Jp5.idBhALDeTI.LMo^G`99/@K1^8*OL6q*/r1$f4F1$5`qN!*M>^(8$$EJOkSf^YbiLV+%?"*2O9t=DVu[!K)D@(6hYB>do^BQ3C#='H7ij(YE+A#/,!00=TaPWN;]C8jV[d9,H(gSVFK!ifP[%eGYO5Pbl2C9CC,M')fW.ZRPIW';qketmh2_;jcBC!;PT[N5)>1lc$ZJV[S[^87Z3sm[?g&e_X7B6eaXpG^::hc+k0%Bp3;hI824:YFbNj%ucDO<^TlTS^H5*Hg.8dOI;4Sf0QL.O.iJQ3')lk&Zf(Y8![=oX,l(`+5PBda<`thU-ZK^.U"UOklhE7Q4:$dCJKb?2SDA63pU1/Q+c*(mJIA)oE*A3QA7012f#]bfGPg@6Tkp(!_']#tcGl9]82e\iD)[gDdd!):r$/*c8%FClM\9E""eHO5t'c1r!6ti0`T\n!4e2M-m9J&2=?#>QrS[%gbUNrOhlt>p\Q1$='d:@]id$V9924eeS[bu/_hY;S9;7BBp,2'-Qj-XpnK3E/e/LPZ\^[$nmiu!6JiRk.*)Pt5a^[jko]n9Hr)(48#kZF32ig_MmKtf9:L?6P!K8]K#cTGmL1p,SLct;m\*B"`%nf3(&%%Abb*LsRnV*99Ne)PPQgDcqQ7(D%'>X$Q0DNCm\[B27Rpji6Z:T]H.and#g\i[B\GGK-Ci7>\_gQ-1OWS\/8c?B?(bM>F[C21IrWghbgEm?tKGL^OYUrFTQc7US_o:;>!G@8]SO./,e1iIiuRHOS5Q(mRZSU9OFAtJ;UoAULX;[7&DFQrmsW<97P#%#%=+0sU;@/~>endstream -endobj -16 0 obj -<< /Count 0 /Type /Outlines >> -endobj -xref -0 17 -0000000000 65535 f -0000000075 00000 n -0000000129 00000 n -0000000239 00000 n -0000000361 00000 n -0000000472 00000 n -0000000671 00000 n -0000000870 00000 n -0000001069 00000 n -0000001268 00000 n -0000001357 00000 n -0000001594 00000 n -0000001675 00000 n -0000004819 00000 n -0000006106 00000 n -0000007320 00000 n -0000011106 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\276\204\202o> -startxref -11156 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-031-japanese.pdf b/z3c/rml/tests/expected/rml-examples-031-japanese.pdf deleted file mode 100644 index a15aebb1..00000000 --- a/z3c/rml/tests/expected/rml-examples-031-japanese.pdf +++ /dev/null @@ -1,408 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R - /F4 5 0 R - /F5 7 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFDictionary -4 0 obj -<< /BaseFont /HeiseiMin-W3 - /DescendantFonts [ << /BaseFont /HeiseiMin-W3 - /CIDSystemInfo << /Ordering (Japan1) - /Registry (Adobe) - /Supplement 2 >> - /DW 1000 - /FontDescriptor << /Ascent 723 - /CapHeight 709 - /Descent -241 - /Flags 6 - /FontBBox [ -123 - -257 - 1001 - 910 ] - /FontName /HeiseiMin-W3 - /ItalicAngle 0 - /StemV 69 - /Type /FontDescriptor - /XHeight 450 >> - /Subtype /CIDFontType0 - /Type /Font - /W [ 1 - [ 250 - 333 - 408 - 500 ] - 5 - [ 500 - 833 - 778 - 180 - 333 ] - 10 - [ 333 - 500 - 564 - 250 - 333 - 250 - 278 - 500 ] - 18 - 26 - 500 - 27 - 28 - 278 - 29 - 31 - 564 - 32 - [ 444 - 921 - 722 - 667 ] - 36 - [ 667 - 722 - 611 - 556 - 722 ] - 41 - [ 722 - 333 - 389 - 722 - 611 - 889 - 722 ] - 48 - [ 722 - 556 - 722 - 667 - 556 - 611 - 722 ] - 55 - [ 722 - 944 - 722 ] - 58 - [ 722 - 611 - 333 - 500 - 333 - 469 - 500 - 333 - 444 - 500 - 444 - 500 - 444 - 333 - 500 ] - 73 - [ 500 - 278 ] - 75 - [ 278 - 500 - 278 - 778 - 500 ] - 80 - 82 - 500 - 83 - [ 333 - 389 - 278 - 500 ] - 87 - [ 500 - 722 - 500 ] - 90 - [ 500 - 444 - 480 - 200 - 480 - 333 ] - 97 - [ 278 ] - 99 - [ 200 ] - 101 - [ 333 - 500 ] - 103 - [ 500 - 167 ] - 107 - [ 500 ] - 109 - [ 500 - 333 ] - 111 - [ 333 - 556 ] - 113 - [ 556 - 500 ] - 117 - [ 250 ] - 119 - [ 350 - 333 - 444 ] - 123 - [ 500 ] - 126 - [ 444 - 333 ] - 128 - 137 - 333 - 138 - [ 1000 - 889 - 276 - 611 - 722 - 889 - 310 - 667 - 278 ] - 147 - [ 278 - 500 - 722 - 500 - 564 - 760 - 564 - 760 ] - 157 - 158 - 300 - 159 - [ 500 - 300 - 750 ] - 162 - 163 - 750 - 164 - 169 - 722 - 170 - [ 667 - 611 ] - 172 - 174 - 611 - 175 - 178 - 333 - 179 - 185 - 722 - 187 - 191 - 722 - 192 - [ 556 - 444 ] - 194 - 203 - 444 - 204 - 207 - 278 - 208 - 214 - 500 - 216 - 222 - 500 - 223 - [ 556 - 722 - 611 - 500 - 389 - 980 - 444 ] - 231 - [ 500 ] - 323 - [ 500 ] - 325 - [ 500 ] - 327 - 389 - 500 ] >> ] - /Encoding /UniJIS-UCS2-H - /Name /F3 - /Subtype /Type0 - /Type /Font >> -endobj -% 'F4': class PDFType1Font -5 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -6 0 obj -% Page dictionary -<< /Contents 12 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 11 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'F5': class PDFType1Font -7 0 obj -% Font Times-Bold -<< /BaseFont /Times-Bold - /Encoding /WinAnsiEncoding - /Name /F5 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page2': class PDFPage -8 0 obj -% Page dictionary -<< /Contents 13 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 11 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R9': class PDFCatalog -9 0 obj -% Document Root -<< /Outlines 14 0 R - /PageMode /UseNone - /Pages 11 0 R - /Type /Catalog >> -endobj -% 'R10': class PDFInfo -10 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20000101000000+00'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R11': class PDFPages -11 0 obj -% page tree -<< /Count 2 - /Kids [ 6 0 R - 8 0 R ] - /Type /Pages >> -endobj -% 'R12': class PDFStream -12 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 2195 >> -stream -Gb!#\lZ:NE&HC$LreE(Q^nHU+GBu:A98BCkVBM$h'KXbQ*1VgIF4Wr8F+<-NMJ?3-``"$h/qemB-ot$2j)W4SZGX5d(LP4^&N3ldfj]^ahV(@bjCh6]Wtk-dXl'Gp6Q:4U5?V"^K:26Gat*_`f&qdkI&tKNGKh3\,BirrE%^Rbbf$CV(RE\_oJO`m)1;)-F<\m0/*"5ZfX;JIjHZ=mR_%@M/Kq9`iN0!lk#@i3SsZ.I>(&[`7@1^/UtpGo#NJ7qlUe0HHfqs5G/XUN@^/U/`a[1SQS;Zt.)Imgco;bDCm?Y0A=*Gt@!T+u,4583oWU8^0HVb`*&JrV=r^!>\d(+E8qXS0;mSki6A"*4npHVrup+XtPa:>*6?mY&E66PtoT<#n^mYfr,/hO,2iGT:@PfTT[i;@Cnp@Ja!?aCsf<%fci%TH(rhI*XR5-uk9,0k<.C+'>CeskhL!cWS8FRuJ4gt%B\HG1UkJIc)6OT/]-;mr\FI"CYHJ*$faEVjW*)jMOrCBAN"H7A4mZQI7:FdA!YoOAnLYa0Sid4HQDI]Ks"4DdK;DE4(=77L\)s%(1%u)0G8[_]#"_dIt#Z!i+?l5+^Q<%X>^AF\?_>cS`](#iA>#ioS3)VCFceuDqKUi7Pt\t63g(XpYQXkTFB/*rB]3uag/:hF/1E]hq=>\ZSD()T*XWgq@l\_ZdIYEI>QTi4FqeiJl3tWl00sr$dUWffr8e=p*g(%Z?LlHV@gb&gTQ_M+WI^sJg-ZVW*rMCEC_"E&!C]gU6_YiNZQm(76-`[\J#WSj:JTV"H`sA$<;H!raBFIc..nOp+k#+t\_=dU;s$oI`3IQ2G7[(7t@GSX7?O9-(0`,CJ+&bcaXYmV"[tQp&2O+_SR>Q'>R9s[-WCln$Bskq\6^:ZNY,]qE@??1a9&F235T)>@r?Af/>=ks,\\Gd-kYRj-'(TFs&o&"b@^XXN8V4@_^SQ;qKij=fJ<&h[IQb5@8[W7iQYR"3JL@sl8Qh\*cn9H`;R4h>Flh!()HbY2Oc`]]"Qio-.FW&_emEXF[3!_L6YB>Dd-9K*<8J:PH'PA_2qG?O4fW4A)=*/sU5hpYaA!"5ep<,VhUpn8NI641R&>\d,#d_5@\hK'$eCjBC$@j?oL`Ve[-'+BHb1_.d;A".0PRVBr&dl925HjR4nH"^8eoY=kf'SO$Kql5&?$au>fH'Gr-G5n"59;>""*lQ(.0:/-Pds+!@EN@aco\KEeZq;14jL>24,r="l_dt140dpeToli,lD,@llC2(DC:?+5A7:R52*H`9EBdgES`S[cG\77n29ndN5C##PYBZ,B"SHeFCp^bCm(Nf~>endstream -endobj -% 'R13': class PDFStream -13 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 620 >> -stream -Gat=(?#SIO%"("ls$351fs%u^,YRjc2KTg5FQc4OF9DH((/C/J:9qgSp@BZSNT6h"#7NL#%Op7s#DE'gcRMPB`-)35b2e("/HNOh/E=EO5inpf14BSac,/hWtK'UVD*08lb~>endstream -endobj -% 'R14': class PDFOutlines -14 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 15 -0000000000 65535 f -0000000113 00000 n -0000000257 00000 n -0000000422 00000 n -0000000612 00000 n -0000002586 00000 n -0000002759 00000 n -0000003040 00000 n -0000003205 00000 n -0000003484 00000 n -0000003621 00000 n -0000003892 00000 n -0000004007 00000 n -0000006345 00000 n -0000007109 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\223\367y\354\321\362\222Ju\262\315V\3448<\372) (\223\367y\354\321\362\222Ju\262\315V\3448<\372)] - - /Info 10 0 R - /Root 9 0 R - /Size 15 >> -startxref -7161 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-032-images.pdf b/z3c/rml/tests/expected/rml-examples-032-images.pdf deleted file mode 100644 index 0faede06..00000000 --- a/z3c/rml/tests/expected/rml-examples-032-images.pdf +++ /dev/null @@ -1,86 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -1 0 obj -<< /F1 2 0 R /F2 3 0 R /F3 4 0 R >> -endobj -2 0 obj -<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font >> -endobj -3 0 obj -<< /BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font >> -endobj -4 0 obj -<< /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font >> -endobj -5 0 obj -<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 178 /Length 1411 /Subtype /Image - /Type /XObject /Width 223 >> -stream -Gb"0UiGP,='S'';s.qeOeY4UF"6S=OQud^VCBG(GAs5(Mq#LHqz!.Yq2geZEKZVI8P>SL,u4;@s+9g9d8,SQLhc2(:J-sJNFI])PZFEUl#\jFZ:_%H@=C9X?_UKa0Wj?1:5?HkVFOtls/RGXnij1t?P*/Ms#N@/']`,Yeu3e8.XqB`H,Ve?\nNbgF'Z7f6#n!CFcKDIh]1_dM6hN!kFaiXko%U^3tRG\g]Z3$MB`,9i9XrJGoM]17i_6L/21+5lbA=lt\JOF7T$&q7)X"q&hVu(.c*@+:TS>IP#9BnDU+gN\NplSpJ`F1^nLSn&\FF46C1_\d(SG&c6YTAs6tb48Et&uPp)JSl't/>"A@SB?5\b]2@Z+"hE#Z6WkK(/00gMc5qSUl&*=]Lrm8Xdld-EQXG=A)jq(;D9e"=]..-:1`urrsp('auQElasfuDlP?B%PI(+%la!$[Z@Uk?!n.[+b1a8*kUSFgeTcFpETSKi-WQdE0N]"d@!d0$qgEh&V#fJW\D=c#0LZkN>O?uDI#X*c4!iNG'U@X['uSQj@U6hm=r&Bk'2*H^TIOS2>9"'6+X;lF10\,Z\:oiZq?:)r`,2M\!1NPNs,5+\o1Rq?]E,;QY'JihT>)%)g7jh*0'O_oA4pF7u`+*7Y"lT>\h`6RLWtc<$cQgr`4)fKWm^-[USDZu)AAYm]^k0[>+t_m!i&chrZaGGuq@[a)'%>PYJaT>D,g4cnF_r-P'>^5hLE[XS-*Ut'd[XsDEkSl;e[[@<2I-;%eS]G5h^+#Lk]K.1:2/C,akYki+br+a3&??\%:R>h=7N5qB,B`qc;*\32R-FM$Z;ZU[*EXuqO=6"EDC5.El9u7\pM)rVeCL+EDEV"r&-^D/0Em29BO*"!tWpkK\T>P]00eV3:JLHSuGsl[F%d.B9=0JM3G3(Zc5Ua8da&gqCMPI/8">2geZEKZVI8P>QRz!!(@;#AOfr/H~>endstream -endobj -6 0 obj -<< /Contents 12 0 R /MediaBox [ 0 0 595 842 ] /Parent 11 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /FormXob.0ebb4782cae50a6fa41cca1aeba0254e 5 0 R >> >> /Rotate 0 /Trans << >> - /Type /Page >> -endobj -7 0 obj -<< /Contents 13 0 R /MediaBox [ 0 0 595 842 ] /Parent 11 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /FormXob.0ebb4782cae50a6fa41cca1aeba0254e 5 0 R >> >> /Rotate 0 /Trans << >> - /Type /Page >> -endobj -8 0 obj -<< /Contents 14 0 R /MediaBox [ 0 0 595 842 ] /Parent 11 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> - /Type /Page >> -endobj -9 0 obj -<< /Outlines 15 0 R /PageMode /UseNone /Pages 11 0 R /Type /Catalog >> -endobj -10 0 obj -<< /Author (\(anonymous\)) /CreationDate (D:20000101000000+00'00') /Creator (\(unspecified\)) /Keywords () /Producer (ReportLab PDF Library - www.reportlab.com) /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -11 0 obj -<< /Count 3 /Kids [ 6 0 R 7 0 R 8 0 R ] /Type /Pages >> -endobj -12 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 945 >> -stream -GatU09i'M/&A:TVIi,/?L+5&eJ&S@a+r[EnPm[<5".,!18X=8,_7M$gIskt\Fo[)X$3YD9SWEMWBANn"kth(e\H+ZCi,gS:6r5F#,XDLN-%%5_U\jT&gEI1hgEI5?K8g;6cQg;0E$c\<6RXiH\c-RdrOeLbJ_%Y3WuT!33.fKGI3Vf!oWSm8'CbKAr*@GVpPm0T5]j+oa+8Tg?3Y1^5A6AU-VDrFtIkS(0;Q+XBbAF<3g9.uHLQa`6sR(Jn7X"=i]0p^[5`738I2.grLWBYh%cXP"`G\:Z)"f/A#f"N>J!E0N]ehpmV.pF,YJ\,f7!#trtnlPNTiLI\#sr7,g0Z#1qd!OkPK^m6*9l,kkAb$mfsg.ifiUm%A@m0T#_L'9oep:HWf7B><*g^K^J2ETQ\Fs&uRCX_PU/0[n'\km.9dhGY@Che&7b7ZDW>FO8pJ\T3@a9JrQ36asqI44X?K;?n@^s\VtJ7=LG)RWI"'aH9BMRk41Zg82eVUS'FKr/-,P[/o`i62rbDXFs-Cu_6MMVm1BQ;UXmVFIR`eLRR:\Z;,1fag>?CF[#[4I,!J2,iep8N7/t:QE^jRcV7t0+:Ej\7\h3.;MP;6k>`DU:>9:jo$YGO&"l8g&*U`+N25CRH79p0b%^&P_ge].3pNV(o7PUKc*/)DHcn/2eAtD%-\FS9X[1R?Jh-]$g-X$loeW2bmjrCIChY>-o7138Q8Em3=r;XA"I#[J/(!K2CDjQaQH3u=[kGD>@:B.[[4;JDdM4F%&pZKFor'hGelo3>>jnSdiO3!t3)PefrUp;n.ULQZ#E-73/_1Y`O[^'_0Vi4Cab!U^.lrCSkT>'2m$d~>endstream -endobj -13 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 725 >> -stream -Gb!Sj9on!^&A9=Y+%GOL9O6IqB33X*6S<:=fGlp.I@5K,FK9T9T/!rJI^#S!fkE'KFi,N*b%;uB)p[G^kCCTl`?+A>4C0S:0>KEE[IhsjOV[X`bJ?Ae.Q%FAnI4L;Tl>2R$,>"1&'l]uiUQ0MS>0cI>Jpc32%rr2FK,jhi_08@i>D:Hi*YC@HQfMjnneXr:4B8*dgGC6h%s[8YYncBP`Cj@YL1lf^M(J;Z<@=Ms):/@R2uga>6_:GUA3F6]%$DFnA5dM1,("`8O*pB5trH=G,*8,W^i^N)Ue`X+B:&SiYnKX$Nqio[6]^b['n&4_7,5%JJ;E2cXn_-p,//qLY's:)%6`i.+,k6&I*(p#"I_gL>gsXD5R%M"XoXp/dcplsQ?S@E(AGB.')BDZka`h@%3L1r+?#_u,"HDP_sLj>W\\`7P~>endstream -endobj -14 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 722 >> -stream -GasJOd;RJf&BH\kuiJC)a-rkI^3[q2uo_:DTR&#@&!g\&j`n-lQX>A;T:MT8MmoqfEHl3O3eKj]Sm8c>b$ip;tb+jF)c*R\K""qf7%IhgO:Q+Qr8K85FK:aDlds:@&7U6!%A2/X5m_EtmM.]T!s#V\>'54FEK#^KRdK#nKnQo-hndek9$aUM5\@h&gB0jK"pu>"YQd4G]SGUh)j/Hg5nfDpU"3&VPmt_T#VW/R%+"86B5fI=eZ@OWT8!P42F<+BTSZDfJFX'N\n-mEE'3lsr#a5q"_gPL,G2K;Irq7,M4O>bpV5ad@B![sd.n,Pg`V$HUf6UE9C9k,8AV/FWgS"spR!!@G>;8J@E)_@1__`oK2,QhpU6Q4KW,nYW2"i["$iKrfPS`S6-nj/T;Z:K%N!+&0^CdfX8;o8,Y_Zftr_ohJi*%q8)N)HXbi$keCLsL)Gt!^RPY+hcS>50C.;[09NnBA/Ll7$0Um15ZXS=9^keK%!$\PppCX&?f)'p5jT;k4PNR[#ulqD@1P<@glamr?%77CIulT)tY,s`J05;Z*=i+*j%DpOL.V:0'@EgM*-"8N'APV_n2C.H)_B^`(MA-Vc`Xu(d6"`k*h)Jcp/c$+=%lTO6m,%3i+iD16OJjII)lpgIu>/LN=34s:jQqj4Q$&(.X~>endstream -endobj -15 0 obj -<< /Count 0 /Type /Outlines >> -endobj -xref -0 16 -0000000000 65535 f -0000000075 00000 n -0000000129 00000 n -0000000239 00000 n -0000000361 00000 n -0000000476 00000 n -0000002084 00000 n -0000002346 00000 n -0000002608 00000 n -0000002807 00000 n -0000002896 00000 n -0000003133 00000 n -0000003208 00000 n -0000004249 00000 n -0000005070 00000 n -0000005888 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\223\367y\354\321\362\222Ju\262\315V\3448<\372) (\223\367y\354\321\362\222Ju\262\315V\3448<\372)] - /Info 10 0 R /Root 9 0 R /Size 16 >> -startxref -5938 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-034-cmyk.pdf b/z3c/rml/tests/expected/rml-examples-034-cmyk.pdf deleted file mode 100644 index 5e97ee8c..00000000 --- a/z3c/rml/tests/expected/rml-examples-034-cmyk.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20000101000000+00'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 637 >> -stream -Gatm8d;GF-'Rc%,IlNL'1bieT,S,7d[VF5oBjHju8UYT78[:=C)7-Jq5MHl$?")u\#TK1YO6q"LO!+er6i9%'!LF\\?4da+X8lZ06["HMfm*.14RtK>135HJJu$TC"F4/u@S&7LB:+ArZ5k9!Dm&>k%p-h?D/e*CN4;.H"521"ChJISN^kCOSW_VHqkaNLVrLXpbp-mdU;_@Fe;jlE">eeHMdh+5>F.p\/M$p\8\g]8g?bB6^8oUI(j0<`B_W:t5#WU-Fk(gb6a%bX>"u5M5UZ:-4(,_F-PRBodPm%^"JVm*&L(h.ialoNkr/rbNsSKTli$Pa9LF,\&Sp17Fi4U0]GN'%'/I=2QF)TLWUte53@J-)&MRW#us=k4$<=^e4ilYp#[EIXX,ET>u\aCIlp*A#9PmqcuD&L,=nqpp'<>2E^7O@m'Si^Ljgf~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000587 00000 n -0000000760 00000 n -0000001037 00000 n -0000001172 00000 n -0000001441 00000 n -0000001546 00000 n -0000002326 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\223\367y\354\321\362\222Ju\262\315V\3448<\372) (\223\367y\354\321\362\222Ju\262\315V\3448<\372)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -2378 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-035-numbering.pdf b/z3c/rml/tests/expected/rml-examples-035-numbering.pdf deleted file mode 100644 index 16e5bfe8..00000000 --- a/z3c/rml/tests/expected/rml-examples-035-numbering.pdf +++ /dev/null @@ -1,150 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 6 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.0086924a45e007495af99df70126eb1b': class PDFImageXObject -4 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 197 - /Length 6121 - /Subtype /Image - /Type /XObject - /Width 309 >> -stream -Gb"/l^Q0\[&]ap8-\i2ucj=5N-F&B2*&rS,^lh8#OU4]pO9j*&8&-nb>+sIunDF=o/>mXT=rr[$BDR%WJ%V4up&1g&Nh&*l4]U%geQ"JnQNZ=Gr;>]n!F(J*G^*p#HHF]L]j@1dnK,0gdo5Qk9Wg(ia2d_)R_X]?tNb24efmBAbN\7?-qgiM?9+l[j9FF.,f.0h,>aJ4T!e!f,pt&fi'8;(*m1jGCFE+ba:p/WDDLQ#8>d_(GFJ\b#3L@5S@_XgeOYG<"LZBEN]52BJs0"[=2T^ATc;!pi#Y_)&U5_n)bcW'Ypt2WsBA[kJ1/7hnHh[okpVZ%6'1+LiGmhO'&U(Aq:iq=]S]>I&TX4;1+ecDtDqI\,X=(=*+\eaf`p=>RcFTS,"6`R&Jf4:T+YbehB)d`n8'gNj$IG<"LZaMQg!6S1u!E(`dM3Dp,Bpe4%o$]AX9!iCu=?ak97=kJIZK29DK(/Qs#rFl9lps.>"get3:*6A1&I-[@:)d#5O&286kk?2\2nOuuCgcd,6bpNNnP$ErGbuY._BruaKl%)TpiP9%"aA^)pN-oHZ`ojPi"f-J\c$4C3;?07n-P"c)T"%AP(m,lL4Fp&l7m0b(:GC1_Bs!4qMj;0["-+O8K&Aj2!!N@&Q1lCcA(kq0>;`.`V5JfqR`A%GP:;&l6`u)A<_RlI'WOl25L34n+?PD@.?ogLaX:BSta@rSn/_tiRA!Wu'H>9A6-h:WLWrkgr3h>G7\r`4KOYJ34*9u0eUm$Tf)q=>%5;Yd<_rj2k?kMs#RlLOS*msu,EVn^O2.0i%j4E(&/n9lq;6r.I0hIc:O.qCO=V.e/\VlU_ZBk1P"pQLL"fl_,&1F]Z7X\^Utk%s#65I^q^7?pdd;5NRC.8ACV1Xo65@9]F/Ufhn"`K&c_pl6Ia6d*)C(M7+=;(e(-,42XJhV@YMWK?Kdp`NS6Vae68g>)Ds/=r8"\P2"@1qD4uT2()BO.@/VcbB1OWHp0H*W=K>`A@)cAMS7iJ1o>_*bb^?`=1S2UMX$F.#Va#;(e'B^q>/9DjQN^@`RGTpmr\Ac"AQC/F5K4-L4l=YHBSsOO+6!af2%g]lDfd46S.`"q497efY+daX[@8,$g]00c&G7\_@o"Kc,46qqsR"._!U0BrYm6l?T3TQV$!&.rr&@8(.MD5#jEA@5qMjrMH0sqTrr1*]T=Fp-TD+iQMu:3bhi$%":EcI!GVrJQ^*Pn[KCS@>/1%:g#^BB$(pDaCpA#NFj^3-$^l_idh2_Vjlp<-eP<-#!ep#K%9]_r?8j5A:,e!u4a]Le5e:nGV4kUgoH7G8s;M^W%rStJ.G``4R]P-fT*X\pFq5&lHZW*f=W"c7-N3l4f)3EO2O$1aE,:<7HNr^J2,&(bSo9Md5E9dWfdl`IVrT/#^$AAC\W1JGV&0;@A#]-2Rko+E<7XU.d/1*toY((kdfMAFZ20Xq3CQ:'HCDE[`YT.18mh\psIZ?piQ'CGnrn_cc^`Z/i9H$ZTN:K!o?M6iAg)G*VN%hCl!)3Hg,(Ss6=M&.(;SD^uhR'uV]F2cbjB45L]S9-<#dN#XdAfUF_b!=p\)B+bqo_l0V8eeV8Tb"%GJal;]0f]FA.6e:1:He*NYdHbS@4M]aENCqRKd+iH.>i6N?bjT<9r9DQ",ZE=b/eC9#u.C.!N+^u>(jV'PXhPUA3Y?TPnl;^Fuojs[DBDV$p1I:*NRl#0tY6oT+":IoD0h-<(2qkf[h9aY]T,7?U&oH-V>NK!U2p:$cr;gVpKtW*iaOncsP1V34C:Z;/UHQ$7"P3t._eul7^ZG6f435R$T2@M'TWZBAcW]S'A*Z$NDc;=_a_9)[q<(FQD)THN>"?!FgU_-`+kKI(b3n2'1BKdm2T>ueR_-><7!Yc/_'/\%So?(PU9X:T$;N4.+>]fbsea[!]p0OTW'_UiDV@Tg_teOP.85=DiPTCecsWUOrUiHJl!I,JIdGS>."hN(`cgW`o8q/pU3$4hrI0q6SHl!r&gLbAk?seYiV#ZV'a]0UrZ\(a[]7Z8\n\lgp)52-#5=DE>5')se\0@.F74$stC#^!-q2>X/**U0gi=Zf$\!XFW/1DtGc^-njf<+q)#Y9Am4_C6uF`E6HoP.,6[#*jaG<7b`@8ASR#d)&lkQiF*&kAOE&<"WjhuaL0G#-Sft"P6PAJ:RtRQ*#t#k)r%kq-.W8We>(J+*XgB_hc7WOna8!;Xduhq2Tc'`lWA%E8Ji;@'(lApkQ`:$GZRm6nF2cNm^<;d#-METQV(d*PhTb[ZZ&k,7)2]aW8AYBi:Au;"6OO;KkH.A!U6Sqn8JLVGIL@?nQ6+T[`cV9]AFB'Uja&+6jlO71pTr4nKbMXggi?&p4][JK5aC9?Hh"W-=-hAgKQ$bjt+.mF_&`(AI2E"'uH4C^hZBk^C^Mg:\C2$6?8bX8Mbgh4#h-!X39#-8p+Z)AYklfHcAuslfo.AZ/YgaK`mfYV;YS3ULC`A=&h>.>UHA=JJI'bpL\X=Z-1eR[*HN08.iRVl]8\.ctFmo\m:JGiJDM[)g,iPLEkOHjl9.T)(t#B-)9CVQDmuNMM'gDkqmg^$]?S&^(dPUVt7cD(.i^9MkeUt18.G0?G["L[kqH*;akRCI;Z@GD-QO!pOBWZZBSlOPtOtGJr`OXVh.0;XA>_E=&hk&9soY]\#;(Si;35/^6..cr66]of]b;5LDH1+:UbRqhE"8V+M&l(djjg.ieX`)#Ue,th5G3SVlNgA3m=(gLSTJ:iI&./:5qW[;E4h>bg;\qC6NY@bJrt.Gk>t*Lp'g<9Hs&*WsQnMi;5)TSuLO]O"NO%'7@@N3hBZ?BIAR,WY:Zsa*H'.QX2%&LsO)q80Ii1-7aFr27#iN.c,SVrfCTGK[\t/Um73ZhgcpgN3A/P=M0`PF-'9NO)KHaq$#Q$87Ab+8>YEC%tas\Q\E;dfQg#pf_,5K"E2a=tRcINl>,CBk6Be$lZ-l;ZbjhHn*MbkC-oS&/^oq/_SEAIA>;EAPRj<(3GpsNqqK[37#Jna96/;%JgN.qjaLV&JBWApQX=WW&,8U\9E%JW9<^@Z#rj!%HSb.,TE-e&bS7L4gj],Z(Y$T'gY*,;q`.MN$E7;/%S5E-QUu[k12@fb`PAlcJn-)lu-5Doepn;9uST1[CVFiXXACO3Z^qmdq\?PBM0`[.\j7]ASi8B*,l]uZhM%-A\VkA?VqbnMSnEIB($^_4Dm8",*_3[BmmO>CAoGl^ue4Kh1Kh^":^'7P4l^mMfi8A\4iff:Y$W&dmrM^8jpsqSS2W/IWDL\Yg%fULjb"b\4lShG"^U3Fq^&`u[ES]Ui0G0],T,'*gS#!mV[Z"Ch%QO7-_KHNh>?ktXlF8*s#:d+'OXU[>c>dq3HXP_+d:CFtSVdXZTW12TAZiD(nVBP^;YM[E>#?6I]fH^p4YRP"V2G&P5D&K`Z*H:M9L>WhZ@2f7X51:(u_W$uuaeo,*K8ddo%a=M/"0FQVHAmpl[/=pP]3;?07E!s"V%06^+BaATbnOu<;Kh^"RDHlFumNGsR2U`5m!pV,-Y1b>54#d^a,)Vf0[Mq\uG$FoV:)M20oE&\r/JMe+2T&"nX\\H_NGO?o>"j_]\D*=oW\Ft!/U6eZ2QOhKCq&>*fPFTJk?2\rgNNRUBaAT2QT_dZNG/Y^_!UD\M))d6@Ab08/AeQ-~>endstream -endobj -% 'FormXob.c8ba08e347e6847214d84c863a661d07': class PDFImageXObject -5 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 45 - /Length 6345 - /Subtype /Image - /Type /XObject - /Width 2008 >> -stream -Gb"/l^M@+F(_PS==SM+pNL-W1X)>0#dm+i=er1NUi)1\Y4hpS?,j08h(22fF0%]DBg`B,1jTzzzzzzzzzzzzzzzzzzzk[`]qf;lL_m>oGng:FS8q+e=j5Q,n@fi@?+-A+3PQIl2qd,\3IgA4:UZTq_3I9s6/A#Wsz!!!#BkN:Sj=)L,OXrS7I$B5_fZ<8ig+dHJ+9kj2/3Ne[D!p+'>nlY+sGBg?G;Y=\fqz!!'CG[qcS:l^Q"Dl"Fu(&Su=.'X_gHq!U=o5#p^be'WQfLgI9pjZ^&.RS*Ehg!s=6[/J,WX\1@Y[\('9>6t90z!!"h&C.5;;=gWc3nW;=i>\,.,a](-iK\#;S4FXH@lQemrC@=,Q2dX";0-nYP5;&W%LY1.R.%LFRi,.nmE)Ql&%I=I?S2(*R,[U3.ai"33V=4:"]Bp3T+Q2*e`$2l5&Q4=99/M6o4YuHM-p`bO#N>=1!aAG*q?4TYgU>CrBk9oeSd9J@2-6HbDIa\0).-Nn(K1Q3G<+ZUpd!J2]c#?iftl4@TAOtlq;;0XlG]aOq\Lp-20L-4,(8i*Aopo(3>8QLPV@UR@BrBq91>,:(SEoW_CHAL3NMWPOmeHRm&/q&Jdp2W:/;Q:3cV;Wz!!'fSAW.;'\I(:a4rQPMd-s;r8qRmUoMR"B,LgHiBLZ^N^YZN7rM42mKF`CA1+gb)%#=JpT[f8"QlUHVrJK1?269.AT[0^>&^?'4*XSh]*dkV\jr;TPp9\,[R&`jU=`ZI4(KW*l=1>4'HRZMR.*%]2g-B>TO@\]cDOGGqUh)IObZh@9\nr&6hIf8X7t8pu\GUH9n3Og;oPn$&nNKK7As182V32QWiEB?B];9.=<4a]hQWO(kdM*"k:"o#XH4nML"onW'!!!!YBllGAj.3t:B[_b=IH1:Pj^Q+El%mfKN44GFLujWuK0A>daqc31U8[!W)%N@;N`Q`\f!`f,@J=2fI?&&4o36Y%q8S1gaD$NY*B`MDTbnl&!LmK!^7<_;8SS^_DH0*&`%mS`*9ZYF)D,&n"/+<#N(@C;MQ7>%"D)A<]?P>mdUe@P33sKris!,"D(10X8E+J7P.h%g1B6PR[Kdb+)%!`]WhM!;8\OY#XBQ(K2QW+A\bl;`2KY*(V(^%KL^X+b6M'H^h\a^q=rKFgHU+bUCnBH:[)L&-FW(T+I$3>KQ!)4.PK?skHiYpj54+gQHZ^O_72tK>0<'1P3M&l@8GJN'n:fP]-fAYA4=[.)mmbI.4t-U]EOL9@5sBF/cG]E9Wl?V8Xp>Y#U+j463s9]bP8]`.B&I$r4DMN)s*'Y26g=a*:NPqdB7KBptHBZY8nWLd,NIYiVpdae(pLf^f$DYt89-==Js'B^AtHKFgHU+bUCnCEtLVqk,H;^#![J)YQo7XdnIUmlhh"CO!8!7Y[2^3F84]W];bEC2V9".V#obh:hAJ[VB#l/82/(9+/p&FE2d#4]NN(F#Ed+VrTl#J008b)=+m+b\(3d::/JOS!G(A%q1\k3f%GcMTo8>@dhA@K`+g!9c"R.n#TNlpEXc9[tKA/u;hXUFlC`XV3r<7ic63n`f&4.aC>+0Zia3^nY^D#hQi%^VjfqUa[=DN/h]8W]3GYP[=WVLI-YH0i-e=X1Da]35QW@P@NhUo34h'/tr9#J*4q-#XJ$e4\*Wo:.Q+QkcIJ04e7XkK&jV5d\Ll"lbt>9WS&l*JK[GU"M3ofV,^iJ.q5J<*h@g:c3:G/1r2S[I<=MjEo:g"ekL1*C9\T,J^bb7;fGknp;J=4goL.Z"g*#U+j463naA>ZK7c8,U)I^i+7.7RV!;9G.MAD_u-@G#6_Ap$>_$4.i+N0+CjhN%iij/=WN%Bip'11ojI-1"!!UGj\uX6edjr]s[[]Lu45N4e4:U*:Pb5K;3`oR<9\-O`=lQNjV\-*@p"q;pLC3:]'$jbrS$SA;WtmUjH[@)ihMcX"oI,OAEXJOd0hQFD)s?9=$\GGYXE,#U+j463n`f&6cY]F27S"^)@XN:F>OP!jt8.m25im(j8a/(*h@NCeO)6[h38>qMe4!g'XtRX3o`t(uAQ\!uh?)^6,*pPJmM@o=9f\m:a4GTP9gV[)uqL\&RM!K`7"""+H[KP42O&!)-)4[>E0j%=`Hj$b=8P+HTbW>'oXb&>MmhLU`c)Rm`":#s5KlT&-'g7n%RS+&?biT^[K6nH8=,H*oB'CS2Vn""`7/Z!2]XtD(DEZZ1E^bb"iT9)mfJ9p>XNo"k(n#nr9b5A]HPT9q7"#)^5P2KFgHU+b\3'b-n:?5.kadCt+X#ps2q[P8gsbM";^YV^XDq[.`5!VdUdG?)j;HAaj5/_LG?;4fP55D"H>Tb_@u%T"i(HSup8Pn$>8XoA$dLD5AuYo?@:`cA=U41rr]lhr8B;924HoMc6O[YkaF1eX2#RY6ADt/=^/63BG_O7SU5QkaruPf,]$pN5oMBAJo?LCI02a4lO+qhEf4[J'?tVQiI*dz`s*dQ8lSJ8i'5iAn06#i^5WE9_2@mh_iOPtZ?T4kBn5SuC?[gc0(g:sC04'h[sJ_tGO0F1cXU2aa,\q6WU;*T1uD5kXR^djXR\g5baE/T3,q^C'I/gMX_`cnHZ?IagIE@[q=&l]q,LUYF2,_onh)lg>4=WU[#28Od>C.SjPTZ(3el'_hgGTsnGNgsz!!$+Y4Rp#1(=TQ&PU<;j*P,D`4%6Tu6>8cmK;;2%F'*aaL@]$/`-H*kFpW`=*1[GXh)<5&5ka(R&r+B"6W7@.qo%[2CrDuB9OeV"g+z!!!",Q20C:?U+I!4#8V:SA-@7Oe5.u3TRV#CW?A(MQG5gU/$`IEe+^PCZA2&McSo%h1`t=sq)8k+5O;H:FsugiHj7cU9Vr[W(n.$0aMHQ*LA;]stY!]smb5p!9ui=atndmJVs0WXaDARtQEW%n^?&>rqdb#YtKGJsKi.3M>2WSR\HQHj-,b@?#'a82!OD#=g7C7XI?jIP/CSJHl/TzJE=)KJ!_;@B)&;FBQ8lsYHmcp3@Dto6or%&)_5D^]*b@3/l%nsI.d$%,/"?]q;(cu[i\!i]/g\hkfiBmd+'58OpRa'BfY"M21:q_5QLibzJ)@BDpR~>endstream -endobj -% 'F3': class PDFType1Font -6 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -7 0 obj -% Page dictionary -<< /Contents 11 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 10 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R8': class PDFCatalog -8 0 obj -% Document Root -<< /Outlines 12 0 R - /PageMode /UseNone - /Pages 10 0 R - /Type /Catalog >> -endobj -% 'R9': class PDFInfo -9 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20000101000000+00'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R10': class PDFPages -10 0 obj -% page tree -<< /Count 1 - /Kids [ 7 0 R ] - /Type /Pages >> -endobj -% 'R11': class PDFStream -11 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1897 >> -stream -Gb!#[D/\/e&H3^ns5Dlhoa44>$h^s2"4j=)>,9'iq83OR(hec7fLVf18TF^tG=P5bS[c'hCgEMWQH8+Vm^_L%dN5pnj4V1M"n6UDO.L^Vq(Q0-`uGP^FoBelQ6[$J'Z2pqHh:R4l;,*4>W7L;T5bVRf>ZF)0@Mab`ieJp@c8os;P0Sp[f/TXm"=hu3!pOuR,!+.=gHt'+p&O<-t0CLYrlGt&d:CT]\JK:Dtm\eEY\_%%9"(%J3WBY3uLQ`9E&;USVZ)c%30NXW*/M]j]\=X?-%EqeRJ8jqF8ug[.&sBl`PsmY#ZQMM0Ij.CnRE4ien$Nkd?"_R"_@pd*s8'b7.niD'=G][GZe?9RpFN+7YuS=H-AB:uf,)X:(F2j>tcT7MqT0Baqga5)7+s3pKmOb'!la.fDD83kLZ)I5$.hbWgY99td>eo^h2]_Nl`'?p9")"RI9b;%t';d:W\]S/7n35Zfq1L(,tn?=t5_>EKXmIcta0WuRFW\"1>O6>n070YA_(DRbh?CS9M53/QSXY3oIsZ3?@8,BDJE7P6a=Cb=C..PrsfA5rr"8R_;`Q@ki80c":mhVPQh/WKfFMHkcCcO?%$4^G4#>,N`N\JH/^".EjuApRX4#"<4ep#]!kP"WEQoYYF#B&.j?sTX?m*R1ap,;^4DATh691H1KkAkh2SIG3/7NX"H'j0mZ4,Mfe2iN>5$t4&"O8o@*OMHb*oMSYWb1[,sK$%oIn.i39$[^EhXh6($N@7(5P-@=KLYe?&HXR$`L!eAudab1%`gDUffRHf@[c`V./&UZSE\/4&TS8!T+GJqt"3jUGFX:8lBm8s"YKX9B6C5o,f59eg$7M3dl0*3a-++nC?lOQ\^YDYHV;.P92k:,%9d3.c>KWRk1,ljgSO#TTjAT=VD6Cd^pC#[=o=lg"aIGqHi"@#liHoCN8L0Z@N$9TXc_\M-fe@T2mp%/k$FIDWh];8;D:_:r)!c]t-!hEE$.[:@De(foON6WC`EE8ktaZeDm8N(/'emS_$=7htJf4O\ZAr[N.VEcoFJJLc_6"'IQgKohUB?k@$%KG"7We\X\H7>t%a/ZQ`6UsHuF+mY*'\t_WnK'r@,b3TFtMWnMJ?F+C_h=NA4*HG`+k">bPo,K%IZ/UBC[qCReL8b>B'omHIC/c7i3AO%/7GjBe&V*$#2PPaf]OmEDGEgNL2E:013$ls\lH'%uR1`:FJI@!.OdD"^bt\jnQ*g#3_sqVjsG>_o\].uA(Tn@krendstream -endobj -% 'R12': class PDFOutlines -12 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 13 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000614 00000 n -0000007014 00000 n -0000013597 00000 n -0000013784 00000 n -0000014178 00000 n -0000014314 00000 n -0000014584 00000 n -0000014691 00000 n -0000016733 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\223\367y\354\321\362\222Ju\262\315V\3448<\372) (\223\367y\354\321\362\222Ju\262\315V\3448<\372)] - - /Info 9 0 R - /Root 8 0 R - /Size 13 >> -startxref -16785 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-036-numbering-contd.pdf b/z3c/rml/tests/expected/rml-examples-036-numbering-contd.pdf deleted file mode 100644 index d55a910d..00000000 --- a/z3c/rml/tests/expected/rml-examples-036-numbering-contd.pdf +++ /dev/null @@ -1,150 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 6 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.0086924a45e007495af99df70126eb1b': class PDFImageXObject -4 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 197 - /Length 6121 - /Subtype /Image - /Type /XObject - /Width 309 >> -stream -Gb"/l^Q0\[&]ap8-\i2ucj=5N-F&B2*&rS,^lh8#OU4]pO9j*&8&-nb>+sIunDF=o/>mXT=rr[$BDR%WJ%V4up&1g&Nh&*l4]U%geQ"JnQNZ=Gr;>]n!F(J*G^*p#HHF]L]j@1dnK,0gdo5Qk9Wg(ia2d_)R_X]?tNb24efmBAbN\7?-qgiM?9+l[j9FF.,f.0h,>aJ4T!e!f,pt&fi'8;(*m1jGCFE+ba:p/WDDLQ#8>d_(GFJ\b#3L@5S@_XgeOYG<"LZBEN]52BJs0"[=2T^ATc;!pi#Y_)&U5_n)bcW'Ypt2WsBA[kJ1/7hnHh[okpVZ%6'1+LiGmhO'&U(Aq:iq=]S]>I&TX4;1+ecDtDqI\,X=(=*+\eaf`p=>RcFTS,"6`R&Jf4:T+YbehB)d`n8'gNj$IG<"LZaMQg!6S1u!E(`dM3Dp,Bpe4%o$]AX9!iCu=?ak97=kJIZK29DK(/Qs#rFl9lps.>"get3:*6A1&I-[@:)d#5O&286kk?2\2nOuuCgcd,6bpNNnP$ErGbuY._BruaKl%)TpiP9%"aA^)pN-oHZ`ojPi"f-J\c$4C3;?07n-P"c)T"%AP(m,lL4Fp&l7m0b(:GC1_Bs!4qMj;0["-+O8K&Aj2!!N@&Q1lCcA(kq0>;`.`V5JfqR`A%GP:;&l6`u)A<_RlI'WOl25L34n+?PD@.?ogLaX:BSta@rSn/_tiRA!Wu'H>9A6-h:WLWrkgr3h>G7\r`4KOYJ34*9u0eUm$Tf)q=>%5;Yd<_rj2k?kMs#RlLOS*msu,EVn^O2.0i%j4E(&/n9lq;6r.I0hIc:O.qCO=V.e/\VlU_ZBk1P"pQLL"fl_,&1F]Z7X\^Utk%s#65I^q^7?pdd;5NRC.8ACV1Xo65@9]F/Ufhn"`K&c_pl6Ia6d*)C(M7+=;(e(-,42XJhV@YMWK?Kdp`NS6Vae68g>)Ds/=r8"\P2"@1qD4uT2()BO.@/VcbB1OWHp0H*W=K>`A@)cAMS7iJ1o>_*bb^?`=1S2UMX$F.#Va#;(e'B^q>/9DjQN^@`RGTpmr\Ac"AQC/F5K4-L4l=YHBSsOO+6!af2%g]lDfd46S.`"q497efY+daX[@8,$g]00c&G7\_@o"Kc,46qqsR"._!U0BrYm6l?T3TQV$!&.rr&@8(.MD5#jEA@5qMjrMH0sqTrr1*]T=Fp-TD+iQMu:3bhi$%":EcI!GVrJQ^*Pn[KCS@>/1%:g#^BB$(pDaCpA#NFj^3-$^l_idh2_Vjlp<-eP<-#!ep#K%9]_r?8j5A:,e!u4a]Le5e:nGV4kUgoH7G8s;M^W%rStJ.G``4R]P-fT*X\pFq5&lHZW*f=W"c7-N3l4f)3EO2O$1aE,:<7HNr^J2,&(bSo9Md5E9dWfdl`IVrT/#^$AAC\W1JGV&0;@A#]-2Rko+E<7XU.d/1*toY((kdfMAFZ20Xq3CQ:'HCDE[`YT.18mh\psIZ?piQ'CGnrn_cc^`Z/i9H$ZTN:K!o?M6iAg)G*VN%hCl!)3Hg,(Ss6=M&.(;SD^uhR'uV]F2cbjB45L]S9-<#dN#XdAfUF_b!=p\)B+bqo_l0V8eeV8Tb"%GJal;]0f]FA.6e:1:He*NYdHbS@4M]aENCqRKd+iH.>i6N?bjT<9r9DQ",ZE=b/eC9#u.C.!N+^u>(jV'PXhPUA3Y?TPnl;^Fuojs[DBDV$p1I:*NRl#0tY6oT+":IoD0h-<(2qkf[h9aY]T,7?U&oH-V>NK!U2p:$cr;gVpKtW*iaOncsP1V34C:Z;/UHQ$7"P3t._eul7^ZG6f435R$T2@M'TWZBAcW]S'A*Z$NDc;=_a_9)[q<(FQD)THN>"?!FgU_-`+kKI(b3n2'1BKdm2T>ueR_-><7!Yc/_'/\%So?(PU9X:T$;N4.+>]fbsea[!]p0OTW'_UiDV@Tg_teOP.85=DiPTCecsWUOrUiHJl!I,JIdGS>."hN(`cgW`o8q/pU3$4hrI0q6SHl!r&gLbAk?seYiV#ZV'a]0UrZ\(a[]7Z8\n\lgp)52-#5=DE>5')se\0@.F74$stC#^!-q2>X/**U0gi=Zf$\!XFW/1DtGc^-njf<+q)#Y9Am4_C6uF`E6HoP.,6[#*jaG<7b`@8ASR#d)&lkQiF*&kAOE&<"WjhuaL0G#-Sft"P6PAJ:RtRQ*#t#k)r%kq-.W8We>(J+*XgB_hc7WOna8!;Xduhq2Tc'`lWA%E8Ji;@'(lApkQ`:$GZRm6nF2cNm^<;d#-METQV(d*PhTb[ZZ&k,7)2]aW8AYBi:Au;"6OO;KkH.A!U6Sqn8JLVGIL@?nQ6+T[`cV9]AFB'Uja&+6jlO71pTr4nKbMXggi?&p4][JK5aC9?Hh"W-=-hAgKQ$bjt+.mF_&`(AI2E"'uH4C^hZBk^C^Mg:\C2$6?8bX8Mbgh4#h-!X39#-8p+Z)AYklfHcAuslfo.AZ/YgaK`mfYV;YS3ULC`A=&h>.>UHA=JJI'bpL\X=Z-1eR[*HN08.iRVl]8\.ctFmo\m:JGiJDM[)g,iPLEkOHjl9.T)(t#B-)9CVQDmuNMM'gDkqmg^$]?S&^(dPUVt7cD(.i^9MkeUt18.G0?G["L[kqH*;akRCI;Z@GD-QO!pOBWZZBSlOPtOtGJr`OXVh.0;XA>_E=&hk&9soY]\#;(Si;35/^6..cr66]of]b;5LDH1+:UbRqhE"8V+M&l(djjg.ieX`)#Ue,th5G3SVlNgA3m=(gLSTJ:iI&./:5qW[;E4h>bg;\qC6NY@bJrt.Gk>t*Lp'g<9Hs&*WsQnMi;5)TSuLO]O"NO%'7@@N3hBZ?BIAR,WY:Zsa*H'.QX2%&LsO)q80Ii1-7aFr27#iN.c,SVrfCTGK[\t/Um73ZhgcpgN3A/P=M0`PF-'9NO)KHaq$#Q$87Ab+8>YEC%tas\Q\E;dfQg#pf_,5K"E2a=tRcINl>,CBk6Be$lZ-l;ZbjhHn*MbkC-oS&/^oq/_SEAIA>;EAPRj<(3GpsNqqK[37#Jna96/;%JgN.qjaLV&JBWApQX=WW&,8U\9E%JW9<^@Z#rj!%HSb.,TE-e&bS7L4gj],Z(Y$T'gY*,;q`.MN$E7;/%S5E-QUu[k12@fb`PAlcJn-)lu-5Doepn;9uST1[CVFiXXACO3Z^qmdq\?PBM0`[.\j7]ASi8B*,l]uZhM%-A\VkA?VqbnMSnEIB($^_4Dm8",*_3[BmmO>CAoGl^ue4Kh1Kh^":^'7P4l^mMfi8A\4iff:Y$W&dmrM^8jpsqSS2W/IWDL\Yg%fULjb"b\4lShG"^U3Fq^&`u[ES]Ui0G0],T,'*gS#!mV[Z"Ch%QO7-_KHNh>?ktXlF8*s#:d+'OXU[>c>dq3HXP_+d:CFtSVdXZTW12TAZiD(nVBP^;YM[E>#?6I]fH^p4YRP"V2G&P5D&K`Z*H:M9L>WhZ@2f7X51:(u_W$uuaeo,*K8ddo%a=M/"0FQVHAmpl[/=pP]3;?07E!s"V%06^+BaATbnOu<;Kh^"RDHlFumNGsR2U`5m!pV,-Y1b>54#d^a,)Vf0[Mq\uG$FoV:)M20oE&\r/JMe+2T&"nX\\H_NGO?o>"j_]\D*=oW\Ft!/U6eZ2QOhKCq&>*fPFTJk?2\rgNNRUBaAT2QT_dZNG/Y^_!UD\M))d6@Ab08/AeQ-~>endstream -endobj -% 'FormXob.c8ba08e347e6847214d84c863a661d07': class PDFImageXObject -5 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 45 - /Length 6345 - /Subtype /Image - /Type /XObject - /Width 2008 >> -stream -Gb"/l^M@+F(_PS==SM+pNL-W1X)>0#dm+i=er1NUi)1\Y4hpS?,j08h(22fF0%]DBg`B,1jTzzzzzzzzzzzzzzzzzzzk[`]qf;lL_m>oGng:FS8q+e=j5Q,n@fi@?+-A+3PQIl2qd,\3IgA4:UZTq_3I9s6/A#Wsz!!!#BkN:Sj=)L,OXrS7I$B5_fZ<8ig+dHJ+9kj2/3Ne[D!p+'>nlY+sGBg?G;Y=\fqz!!'CG[qcS:l^Q"Dl"Fu(&Su=.'X_gHq!U=o5#p^be'WQfLgI9pjZ^&.RS*Ehg!s=6[/J,WX\1@Y[\('9>6t90z!!"h&C.5;;=gWc3nW;=i>\,.,a](-iK\#;S4FXH@lQemrC@=,Q2dX";0-nYP5;&W%LY1.R.%LFRi,.nmE)Ql&%I=I?S2(*R,[U3.ai"33V=4:"]Bp3T+Q2*e`$2l5&Q4=99/M6o4YuHM-p`bO#N>=1!aAG*q?4TYgU>CrBk9oeSd9J@2-6HbDIa\0).-Nn(K1Q3G<+ZUpd!J2]c#?iftl4@TAOtlq;;0XlG]aOq\Lp-20L-4,(8i*Aopo(3>8QLPV@UR@BrBq91>,:(SEoW_CHAL3NMWPOmeHRm&/q&Jdp2W:/;Q:3cV;Wz!!'fSAW.;'\I(:a4rQPMd-s;r8qRmUoMR"B,LgHiBLZ^N^YZN7rM42mKF`CA1+gb)%#=JpT[f8"QlUHVrJK1?269.AT[0^>&^?'4*XSh]*dkV\jr;TPp9\,[R&`jU=`ZI4(KW*l=1>4'HRZMR.*%]2g-B>TO@\]cDOGGqUh)IObZh@9\nr&6hIf8X7t8pu\GUH9n3Og;oPn$&nNKK7As182V32QWiEB?B];9.=<4a]hQWO(kdM*"k:"o#XH4nML"onW'!!!!YBllGAj.3t:B[_b=IH1:Pj^Q+El%mfKN44GFLujWuK0A>daqc31U8[!W)%N@;N`Q`\f!`f,@J=2fI?&&4o36Y%q8S1gaD$NY*B`MDTbnl&!LmK!^7<_;8SS^_DH0*&`%mS`*9ZYF)D,&n"/+<#N(@C;MQ7>%"D)A<]?P>mdUe@P33sKris!,"D(10X8E+J7P.h%g1B6PR[Kdb+)%!`]WhM!;8\OY#XBQ(K2QW+A\bl;`2KY*(V(^%KL^X+b6M'H^h\a^q=rKFgHU+bUCnBH:[)L&-FW(T+I$3>KQ!)4.PK?skHiYpj54+gQHZ^O_72tK>0<'1P3M&l@8GJN'n:fP]-fAYA4=[.)mmbI.4t-U]EOL9@5sBF/cG]E9Wl?V8Xp>Y#U+j463s9]bP8]`.B&I$r4DMN)s*'Y26g=a*:NPqdB7KBptHBZY8nWLd,NIYiVpdae(pLf^f$DYt89-==Js'B^AtHKFgHU+bUCnCEtLVqk,H;^#![J)YQo7XdnIUmlhh"CO!8!7Y[2^3F84]W];bEC2V9".V#obh:hAJ[VB#l/82/(9+/p&FE2d#4]NN(F#Ed+VrTl#J008b)=+m+b\(3d::/JOS!G(A%q1\k3f%GcMTo8>@dhA@K`+g!9c"R.n#TNlpEXc9[tKA/u;hXUFlC`XV3r<7ic63n`f&4.aC>+0Zia3^nY^D#hQi%^VjfqUa[=DN/h]8W]3GYP[=WVLI-YH0i-e=X1Da]35QW@P@NhUo34h'/tr9#J*4q-#XJ$e4\*Wo:.Q+QkcIJ04e7XkK&jV5d\Ll"lbt>9WS&l*JK[GU"M3ofV,^iJ.q5J<*h@g:c3:G/1r2S[I<=MjEo:g"ekL1*C9\T,J^bb7;fGknp;J=4goL.Z"g*#U+j463naA>ZK7c8,U)I^i+7.7RV!;9G.MAD_u-@G#6_Ap$>_$4.i+N0+CjhN%iij/=WN%Bip'11ojI-1"!!UGj\uX6edjr]s[[]Lu45N4e4:U*:Pb5K;3`oR<9\-O`=lQNjV\-*@p"q;pLC3:]'$jbrS$SA;WtmUjH[@)ihMcX"oI,OAEXJOd0hQFD)s?9=$\GGYXE,#U+j463n`f&6cY]F27S"^)@XN:F>OP!jt8.m25im(j8a/(*h@NCeO)6[h38>qMe4!g'XtRX3o`t(uAQ\!uh?)^6,*pPJmM@o=9f\m:a4GTP9gV[)uqL\&RM!K`7"""+H[KP42O&!)-)4[>E0j%=`Hj$b=8P+HTbW>'oXb&>MmhLU`c)Rm`":#s5KlT&-'g7n%RS+&?biT^[K6nH8=,H*oB'CS2Vn""`7/Z!2]XtD(DEZZ1E^bb"iT9)mfJ9p>XNo"k(n#nr9b5A]HPT9q7"#)^5P2KFgHU+b\3'b-n:?5.kadCt+X#ps2q[P8gsbM";^YV^XDq[.`5!VdUdG?)j;HAaj5/_LG?;4fP55D"H>Tb_@u%T"i(HSup8Pn$>8XoA$dLD5AuYo?@:`cA=U41rr]lhr8B;924HoMc6O[YkaF1eX2#RY6ADt/=^/63BG_O7SU5QkaruPf,]$pN5oMBAJo?LCI02a4lO+qhEf4[J'?tVQiI*dz`s*dQ8lSJ8i'5iAn06#i^5WE9_2@mh_iOPtZ?T4kBn5SuC?[gc0(g:sC04'h[sJ_tGO0F1cXU2aa,\q6WU;*T1uD5kXR^djXR\g5baE/T3,q^C'I/gMX_`cnHZ?IagIE@[q=&l]q,LUYF2,_onh)lg>4=WU[#28Od>C.SjPTZ(3el'_hgGTsnGNgsz!!$+Y4Rp#1(=TQ&PU<;j*P,D`4%6Tu6>8cmK;;2%F'*aaL@]$/`-H*kFpW`=*1[GXh)<5&5ka(R&r+B"6W7@.qo%[2CrDuB9OeV"g+z!!!",Q20C:?U+I!4#8V:SA-@7Oe5.u3TRV#CW?A(MQG5gU/$`IEe+^PCZA2&McSo%h1`t=sq)8k+5O;H:FsugiHj7cU9Vr[W(n.$0aMHQ*LA;]stY!]smb5p!9ui=atndmJVs0WXaDARtQEW%n^?&>rqdb#YtKGJsKi.3M>2WSR\HQHj-,b@?#'a82!OD#=g7C7XI?jIP/CSJHl/TzJE=)KJ!_;@B)&;FBQ8lsYHmcp3@Dto6or%&)_5D^]*b@3/l%nsI.d$%,/"?]q;(cu[i\!i]/g\hkfiBmd+'58OpRa'BfY"M21:q_5QLibzJ)@BDpR~>endstream -endobj -% 'F3': class PDFType1Font -6 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -7 0 obj -% Page dictionary -<< /Contents 11 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 10 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R8': class PDFCatalog -8 0 obj -% Document Root -<< /Outlines 12 0 R - /PageMode /UseNone - /Pages 10 0 R - /Type /Catalog >> -endobj -% 'R9': class PDFInfo -9 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20000101000000+00'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R10': class PDFPages -10 0 obj -% page tree -<< /Count 1 - /Kids [ 7 0 R ] - /Type /Pages >> -endobj -% 'R11': class PDFStream -11 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1749 >> -stream -Gb!#[D3*.8&H7.,rJ+7a&5^[IAc5Y%V4n&!3iYOALR%+G(L:b,_1.Ldl4I,qO,r0,p8"nJNs#m'1T"`qcp2)\.A0A0RkbpO*tepKhgq0WRgeC2P@M'n;p,uG%/5N!j8!-l_nRrBhMB6CROOZ%-_$KhjDR1.'KHIN"qR.MiLG3\t[B!nb"#JQG?1.ma'=8OkGLJLFdADOtgg'R_>]I10YkYtn(O9oSh[/fa-_.<+3S+Vc#g5\;WPuclmn5898+EPsF5;C<`&TcC45_*UL'P9!KHg-3WT@eMMq?<1G?.dpt5#g*ek77?5R5tb7#BnFj?qmMom*RJ$%Q\k%DBEi"Q(34HbLP`a0XB(r2[2KDXi,Ri]2EK5m>UJ>l8ZCBmoD^a`QX\_0FYmV6S.LJE8kt\B1mUOXGAe)%oM)f`M,&<"]N`.Z,:2]RtX^^qM4"JR#4$i#HkEG29;Z^CW)sAIOMI5CXG-V[Y:(Y+taU2^J-])4^!Y[@c>IV@h:gTri3FJP88**D@,jiKA5/D]#UCWB"S&8W/p*)'&(:ZU*g=JTUp^W^*\>_oqBh1\qNa_hqdX#].h42K.J'>2LA5Se_fd;E&<&^E%ldHKDF/1064oH^5tGVl`'I\^RXbW_.1ltn1Zq@F?qb%LLUDi38>P\0hB#"@rQ1A^FP<90i3!c#E@&<>Y7LZi@"`gYlA1\6bbQg6r[e.M_nP!-P*`htK_UD$9p4V11m0p:2jTN&sZ-RSgaO``m14m>Z(6d'H.OfSU7+B'*mBgP;u]h"L]4GBsF&p7a[GEQ<80,`ERa/=kjn+9'"C@Smm+"jC3XngDR!>a,.hHQ;s)-;6hW$04@W8*NUbRoT%GO%F1Nk+Q!OKit;.$dO(/;4^uC(HHhet^MbR0_#&[;q`dTp?MXb6%XsG*nP@Pp,K%E2lE^G7B!>52kn>&4WR,c`LT#&DVt\\N;$P-D.X2qL(f%(j6lqq90Y>@P)to9UIG*Z\"o;Rm%Cd*P73dZUB(2Lt)rQs##ffM5.Q,(pLBP"IgNpcZ)#YnZfZc%HOX#[sD\KX;=S+fm"Iu+_$\[&)g]~>endstream -endobj -% 'R12': class PDFOutlines -12 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 13 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000614 00000 n -0000007014 00000 n -0000013597 00000 n -0000013784 00000 n -0000014178 00000 n -0000014314 00000 n -0000014584 00000 n -0000014691 00000 n -0000016585 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\223\367y\354\321\362\222Ju\262\315V\3448<\372) (\223\367y\354\321\362\222Ju\262\315V\3448<\372)] - - /Info 9 0 R - /Root 8 0 R - /Size 13 >> -startxref -16637 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-037-plugingraphic.pdf b/z3c/rml/tests/expected/rml-examples-037-plugingraphic.pdf deleted file mode 100644 index 4dcf2ab5..00000000 --- a/z3c/rml/tests/expected/rml-examples-037-plugingraphic.pdf +++ /dev/null @@ -1,150 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 6 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.0086924a45e007495af99df70126eb1b': class PDFImageXObject -4 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 197 - /Length 6121 - /Subtype /Image - /Type /XObject - /Width 309 >> -stream -Gb"/l^Q0\[&]ap8-\i2ucj=5N-F&B2*&rS,^lh8#OU4]pO9j*&8&-nb>+sIunDF=o/>mXT=rr[$BDR%WJ%V4up&1g&Nh&*l4]U%geQ"JnQNZ=Gr;>]n!F(J*G^*p#HHF]L]j@1dnK,0gdo5Qk9Wg(ia2d_)R_X]?tNb24efmBAbN\7?-qgiM?9+l[j9FF.,f.0h,>aJ4T!e!f,pt&fi'8;(*m1jGCFE+ba:p/WDDLQ#8>d_(GFJ\b#3L@5S@_XgeOYG<"LZBEN]52BJs0"[=2T^ATc;!pi#Y_)&U5_n)bcW'Ypt2WsBA[kJ1/7hnHh[okpVZ%6'1+LiGmhO'&U(Aq:iq=]S]>I&TX4;1+ecDtDqI\,X=(=*+\eaf`p=>RcFTS,"6`R&Jf4:T+YbehB)d`n8'gNj$IG<"LZaMQg!6S1u!E(`dM3Dp,Bpe4%o$]AX9!iCu=?ak97=kJIZK29DK(/Qs#rFl9lps.>"get3:*6A1&I-[@:)d#5O&286kk?2\2nOuuCgcd,6bpNNnP$ErGbuY._BruaKl%)TpiP9%"aA^)pN-oHZ`ojPi"f-J\c$4C3;?07n-P"c)T"%AP(m,lL4Fp&l7m0b(:GC1_Bs!4qMj;0["-+O8K&Aj2!!N@&Q1lCcA(kq0>;`.`V5JfqR`A%GP:;&l6`u)A<_RlI'WOl25L34n+?PD@.?ogLaX:BSta@rSn/_tiRA!Wu'H>9A6-h:WLWrkgr3h>G7\r`4KOYJ34*9u0eUm$Tf)q=>%5;Yd<_rj2k?kMs#RlLOS*msu,EVn^O2.0i%j4E(&/n9lq;6r.I0hIc:O.qCO=V.e/\VlU_ZBk1P"pQLL"fl_,&1F]Z7X\^Utk%s#65I^q^7?pdd;5NRC.8ACV1Xo65@9]F/Ufhn"`K&c_pl6Ia6d*)C(M7+=;(e(-,42XJhV@YMWK?Kdp`NS6Vae68g>)Ds/=r8"\P2"@1qD4uT2()BO.@/VcbB1OWHp0H*W=K>`A@)cAMS7iJ1o>_*bb^?`=1S2UMX$F.#Va#;(e'B^q>/9DjQN^@`RGTpmr\Ac"AQC/F5K4-L4l=YHBSsOO+6!af2%g]lDfd46S.`"q497efY+daX[@8,$g]00c&G7\_@o"Kc,46qqsR"._!U0BrYm6l?T3TQV$!&.rr&@8(.MD5#jEA@5qMjrMH0sqTrr1*]T=Fp-TD+iQMu:3bhi$%":EcI!GVrJQ^*Pn[KCS@>/1%:g#^BB$(pDaCpA#NFj^3-$^l_idh2_Vjlp<-eP<-#!ep#K%9]_r?8j5A:,e!u4a]Le5e:nGV4kUgoH7G8s;M^W%rStJ.G``4R]P-fT*X\pFq5&lHZW*f=W"c7-N3l4f)3EO2O$1aE,:<7HNr^J2,&(bSo9Md5E9dWfdl`IVrT/#^$AAC\W1JGV&0;@A#]-2Rko+E<7XU.d/1*toY((kdfMAFZ20Xq3CQ:'HCDE[`YT.18mh\psIZ?piQ'CGnrn_cc^`Z/i9H$ZTN:K!o?M6iAg)G*VN%hCl!)3Hg,(Ss6=M&.(;SD^uhR'uV]F2cbjB45L]S9-<#dN#XdAfUF_b!=p\)B+bqo_l0V8eeV8Tb"%GJal;]0f]FA.6e:1:He*NYdHbS@4M]aENCqRKd+iH.>i6N?bjT<9r9DQ",ZE=b/eC9#u.C.!N+^u>(jV'PXhPUA3Y?TPnl;^Fuojs[DBDV$p1I:*NRl#0tY6oT+":IoD0h-<(2qkf[h9aY]T,7?U&oH-V>NK!U2p:$cr;gVpKtW*iaOncsP1V34C:Z;/UHQ$7"P3t._eul7^ZG6f435R$T2@M'TWZBAcW]S'A*Z$NDc;=_a_9)[q<(FQD)THN>"?!FgU_-`+kKI(b3n2'1BKdm2T>ueR_-><7!Yc/_'/\%So?(PU9X:T$;N4.+>]fbsea[!]p0OTW'_UiDV@Tg_teOP.85=DiPTCecsWUOrUiHJl!I,JIdGS>."hN(`cgW`o8q/pU3$4hrI0q6SHl!r&gLbAk?seYiV#ZV'a]0UrZ\(a[]7Z8\n\lgp)52-#5=DE>5')se\0@.F74$stC#^!-q2>X/**U0gi=Zf$\!XFW/1DtGc^-njf<+q)#Y9Am4_C6uF`E6HoP.,6[#*jaG<7b`@8ASR#d)&lkQiF*&kAOE&<"WjhuaL0G#-Sft"P6PAJ:RtRQ*#t#k)r%kq-.W8We>(J+*XgB_hc7WOna8!;Xduhq2Tc'`lWA%E8Ji;@'(lApkQ`:$GZRm6nF2cNm^<;d#-METQV(d*PhTb[ZZ&k,7)2]aW8AYBi:Au;"6OO;KkH.A!U6Sqn8JLVGIL@?nQ6+T[`cV9]AFB'Uja&+6jlO71pTr4nKbMXggi?&p4][JK5aC9?Hh"W-=-hAgKQ$bjt+.mF_&`(AI2E"'uH4C^hZBk^C^Mg:\C2$6?8bX8Mbgh4#h-!X39#-8p+Z)AYklfHcAuslfo.AZ/YgaK`mfYV;YS3ULC`A=&h>.>UHA=JJI'bpL\X=Z-1eR[*HN08.iRVl]8\.ctFmo\m:JGiJDM[)g,iPLEkOHjl9.T)(t#B-)9CVQDmuNMM'gDkqmg^$]?S&^(dPUVt7cD(.i^9MkeUt18.G0?G["L[kqH*;akRCI;Z@GD-QO!pOBWZZBSlOPtOtGJr`OXVh.0;XA>_E=&hk&9soY]\#;(Si;35/^6..cr66]of]b;5LDH1+:UbRqhE"8V+M&l(djjg.ieX`)#Ue,th5G3SVlNgA3m=(gLSTJ:iI&./:5qW[;E4h>bg;\qC6NY@bJrt.Gk>t*Lp'g<9Hs&*WsQnMi;5)TSuLO]O"NO%'7@@N3hBZ?BIAR,WY:Zsa*H'.QX2%&LsO)q80Ii1-7aFr27#iN.c,SVrfCTGK[\t/Um73ZhgcpgN3A/P=M0`PF-'9NO)KHaq$#Q$87Ab+8>YEC%tas\Q\E;dfQg#pf_,5K"E2a=tRcINl>,CBk6Be$lZ-l;ZbjhHn*MbkC-oS&/^oq/_SEAIA>;EAPRj<(3GpsNqqK[37#Jna96/;%JgN.qjaLV&JBWApQX=WW&,8U\9E%JW9<^@Z#rj!%HSb.,TE-e&bS7L4gj],Z(Y$T'gY*,;q`.MN$E7;/%S5E-QUu[k12@fb`PAlcJn-)lu-5Doepn;9uST1[CVFiXXACO3Z^qmdq\?PBM0`[.\j7]ASi8B*,l]uZhM%-A\VkA?VqbnMSnEIB($^_4Dm8",*_3[BmmO>CAoGl^ue4Kh1Kh^":^'7P4l^mMfi8A\4iff:Y$W&dmrM^8jpsqSS2W/IWDL\Yg%fULjb"b\4lShG"^U3Fq^&`u[ES]Ui0G0],T,'*gS#!mV[Z"Ch%QO7-_KHNh>?ktXlF8*s#:d+'OXU[>c>dq3HXP_+d:CFtSVdXZTW12TAZiD(nVBP^;YM[E>#?6I]fH^p4YRP"V2G&P5D&K`Z*H:M9L>WhZ@2f7X51:(u_W$uuaeo,*K8ddo%a=M/"0FQVHAmpl[/=pP]3;?07E!s"V%06^+BaATbnOu<;Kh^"RDHlFumNGsR2U`5m!pV,-Y1b>54#d^a,)Vf0[Mq\uG$FoV:)M20oE&\r/JMe+2T&"nX\\H_NGO?o>"j_]\D*=oW\Ft!/U6eZ2QOhKCq&>*fPFTJk?2\rgNNRUBaAT2QT_dZNG/Y^_!UD\M))d6@Ab08/AeQ-~>endstream -endobj -% 'FormXob.c8ba08e347e6847214d84c863a661d07': class PDFImageXObject -5 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 45 - /Length 6345 - /Subtype /Image - /Type /XObject - /Width 2008 >> -stream -Gb"/l^M@+F(_PS==SM+pNL-W1X)>0#dm+i=er1NUi)1\Y4hpS?,j08h(22fF0%]DBg`B,1jTzzzzzzzzzzzzzzzzzzzk[`]qf;lL_m>oGng:FS8q+e=j5Q,n@fi@?+-A+3PQIl2qd,\3IgA4:UZTq_3I9s6/A#Wsz!!!#BkN:Sj=)L,OXrS7I$B5_fZ<8ig+dHJ+9kj2/3Ne[D!p+'>nlY+sGBg?G;Y=\fqz!!'CG[qcS:l^Q"Dl"Fu(&Su=.'X_gHq!U=o5#p^be'WQfLgI9pjZ^&.RS*Ehg!s=6[/J,WX\1@Y[\('9>6t90z!!"h&C.5;;=gWc3nW;=i>\,.,a](-iK\#;S4FXH@lQemrC@=,Q2dX";0-nYP5;&W%LY1.R.%LFRi,.nmE)Ql&%I=I?S2(*R,[U3.ai"33V=4:"]Bp3T+Q2*e`$2l5&Q4=99/M6o4YuHM-p`bO#N>=1!aAG*q?4TYgU>CrBk9oeSd9J@2-6HbDIa\0).-Nn(K1Q3G<+ZUpd!J2]c#?iftl4@TAOtlq;;0XlG]aOq\Lp-20L-4,(8i*Aopo(3>8QLPV@UR@BrBq91>,:(SEoW_CHAL3NMWPOmeHRm&/q&Jdp2W:/;Q:3cV;Wz!!'fSAW.;'\I(:a4rQPMd-s;r8qRmUoMR"B,LgHiBLZ^N^YZN7rM42mKF`CA1+gb)%#=JpT[f8"QlUHVrJK1?269.AT[0^>&^?'4*XSh]*dkV\jr;TPp9\,[R&`jU=`ZI4(KW*l=1>4'HRZMR.*%]2g-B>TO@\]cDOGGqUh)IObZh@9\nr&6hIf8X7t8pu\GUH9n3Og;oPn$&nNKK7As182V32QWiEB?B];9.=<4a]hQWO(kdM*"k:"o#XH4nML"onW'!!!!YBllGAj.3t:B[_b=IH1:Pj^Q+El%mfKN44GFLujWuK0A>daqc31U8[!W)%N@;N`Q`\f!`f,@J=2fI?&&4o36Y%q8S1gaD$NY*B`MDTbnl&!LmK!^7<_;8SS^_DH0*&`%mS`*9ZYF)D,&n"/+<#N(@C;MQ7>%"D)A<]?P>mdUe@P33sKris!,"D(10X8E+J7P.h%g1B6PR[Kdb+)%!`]WhM!;8\OY#XBQ(K2QW+A\bl;`2KY*(V(^%KL^X+b6M'H^h\a^q=rKFgHU+bUCnBH:[)L&-FW(T+I$3>KQ!)4.PK?skHiYpj54+gQHZ^O_72tK>0<'1P3M&l@8GJN'n:fP]-fAYA4=[.)mmbI.4t-U]EOL9@5sBF/cG]E9Wl?V8Xp>Y#U+j463s9]bP8]`.B&I$r4DMN)s*'Y26g=a*:NPqdB7KBptHBZY8nWLd,NIYiVpdae(pLf^f$DYt89-==Js'B^AtHKFgHU+bUCnCEtLVqk,H;^#![J)YQo7XdnIUmlhh"CO!8!7Y[2^3F84]W];bEC2V9".V#obh:hAJ[VB#l/82/(9+/p&FE2d#4]NN(F#Ed+VrTl#J008b)=+m+b\(3d::/JOS!G(A%q1\k3f%GcMTo8>@dhA@K`+g!9c"R.n#TNlpEXc9[tKA/u;hXUFlC`XV3r<7ic63n`f&4.aC>+0Zia3^nY^D#hQi%^VjfqUa[=DN/h]8W]3GYP[=WVLI-YH0i-e=X1Da]35QW@P@NhUo34h'/tr9#J*4q-#XJ$e4\*Wo:.Q+QkcIJ04e7XkK&jV5d\Ll"lbt>9WS&l*JK[GU"M3ofV,^iJ.q5J<*h@g:c3:G/1r2S[I<=MjEo:g"ekL1*C9\T,J^bb7;fGknp;J=4goL.Z"g*#U+j463naA>ZK7c8,U)I^i+7.7RV!;9G.MAD_u-@G#6_Ap$>_$4.i+N0+CjhN%iij/=WN%Bip'11ojI-1"!!UGj\uX6edjr]s[[]Lu45N4e4:U*:Pb5K;3`oR<9\-O`=lQNjV\-*@p"q;pLC3:]'$jbrS$SA;WtmUjH[@)ihMcX"oI,OAEXJOd0hQFD)s?9=$\GGYXE,#U+j463n`f&6cY]F27S"^)@XN:F>OP!jt8.m25im(j8a/(*h@NCeO)6[h38>qMe4!g'XtRX3o`t(uAQ\!uh?)^6,*pPJmM@o=9f\m:a4GTP9gV[)uqL\&RM!K`7"""+H[KP42O&!)-)4[>E0j%=`Hj$b=8P+HTbW>'oXb&>MmhLU`c)Rm`":#s5KlT&-'g7n%RS+&?biT^[K6nH8=,H*oB'CS2Vn""`7/Z!2]XtD(DEZZ1E^bb"iT9)mfJ9p>XNo"k(n#nr9b5A]HPT9q7"#)^5P2KFgHU+b\3'b-n:?5.kadCt+X#ps2q[P8gsbM";^YV^XDq[.`5!VdUdG?)j;HAaj5/_LG?;4fP55D"H>Tb_@u%T"i(HSup8Pn$>8XoA$dLD5AuYo?@:`cA=U41rr]lhr8B;924HoMc6O[YkaF1eX2#RY6ADt/=^/63BG_O7SU5QkaruPf,]$pN5oMBAJo?LCI02a4lO+qhEf4[J'?tVQiI*dz`s*dQ8lSJ8i'5iAn06#i^5WE9_2@mh_iOPtZ?T4kBn5SuC?[gc0(g:sC04'h[sJ_tGO0F1cXU2aa,\q6WU;*T1uD5kXR^djXR\g5baE/T3,q^C'I/gMX_`cnHZ?IagIE@[q=&l]q,LUYF2,_onh)lg>4=WU[#28Od>C.SjPTZ(3el'_hgGTsnGNgsz!!$+Y4Rp#1(=TQ&PU<;j*P,D`4%6Tu6>8cmK;;2%F'*aaL@]$/`-H*kFpW`=*1[GXh)<5&5ka(R&r+B"6W7@.qo%[2CrDuB9OeV"g+z!!!",Q20C:?U+I!4#8V:SA-@7Oe5.u3TRV#CW?A(MQG5gU/$`IEe+^PCZA2&McSo%h1`t=sq)8k+5O;H:FsugiHj7cU9Vr[W(n.$0aMHQ*LA;]stY!]smb5p!9ui=atndmJVs0WXaDARtQEW%n^?&>rqdb#YtKGJsKi.3M>2WSR\HQHj-,b@?#'a82!OD#=g7C7XI?jIP/CSJHl/TzJE=)KJ!_;@B)&;FBQ8lsYHmcp3@Dto6or%&)_5D^]*b@3/l%nsI.d$%,/"?]q;(cu[i\!i]/g\hkfiBmd+'58OpRa'BfY"M21:q_5QLibzJ)@BDpR~>endstream -endobj -% 'F3': class PDFType1Font -6 0 obj -% Font Times-Roman -<< /BaseFont /Times-Roman - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -7 0 obj -% Page dictionary -<< /Contents 11 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 10 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R8': class PDFCatalog -8 0 obj -% Document Root -<< /Outlines 12 0 R - /PageMode /UseNone - /Pages 10 0 R - /Type /Catalog >> -endobj -% 'R9': class PDFInfo -9 0 obj -<< /Author (anonymous) - /CreationDate (D:20121220112830+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R10': class PDFPages -10 0 obj -% page tree -<< /Count 1 - /Kids [ 7 0 R ] - /Type /Pages >> -endobj -% 'R11': class PDFStream -11 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 784 >> -stream -Gb"/g9kt_'%#43Yq]BorF&4DjZK3-#RmLh_%=9Lf*qhB3lm?G>Zp2=22[M:)VH6-?>o*=&okHr,Air]tr'TjqI/nN*JC?:U@T_uI"9fP_i9au;CB4XF)IUE=#ge2q<6,h`EI\kg+$KI9H+;UI+keIA[/Y,cF`VQ;]Xtg[^P'Q`/5BCFp\?@]b88,1\.FH6A1;sjo@`B]mJZ"em0Z4b<*5H\gCQKIb?ZQd>n4ee]:p%Q\Xh&12a:k:?4^O?.T3H#N8<'n=pE_NakL?hR:Kg5[M5&Wd3dq*)iZo.Up&[']Qr^4":D86r7DU5TCZ3!$0UdV1^J(!f@4<]rC%a?s&XJ4Xd*R]F+(EgoFZTDp0k50;Fln"W&k=G\ND`G;VrCZTfgZ\cM-9FH]C[G@1^Hn75s%Ub*$+!oe*cE+LJ5=T-QN)%N['Kmp^%-feU;s6[B4nil9$I,;Q8Ko"YF`f]-_)7nfttA.k'[YEQs*XP+%[jWJ<>k3)k1t3Mdm[;\D4;$h98!`)?J5Q^Q1DuH16U&~>endstream -endobj -% 'R12': class PDFOutlines -12 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 13 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000614 00000 n -0000007014 00000 n -0000013597 00000 n -0000013764 00000 n -0000014158 00000 n -0000014294 00000 n -0000014577 00000 n -0000014684 00000 n -0000015612 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\030\177\214\252\252\311\2772\3356RC\232g.?) (\030\177\214\252\252\311\2772\3356RC\232g.?)] - - /Info 9 0 R - /Root 8 0 R - /Size 13 >> -startxref -15664 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-038-rect-href.pdf b/z3c/rml/tests/expected/rml-examples-038-rect-href.pdf deleted file mode 100644 index eac21290..00000000 --- a/z3c/rml/tests/expected/rml-examples-038-rect-href.pdf +++ /dev/null @@ -1,375 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 8 0 R - /F4 11 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.0086924a45e007495af99df70126eb1b': class PDFImageXObject -4 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 197 - /Length 6121 - /Subtype /Image - /Type /XObject - /Width 309 >> -stream -Gb"/l^Q0\[&]ap8-\i2ucj=5N-F&B2*&rS,^lh8#OU4]pO9j*&8&-nb>+sIunDF=o/>mXT=rr[$BDR%WJ%V4up&1g&Nh&*l4]U%geQ"JnQNZ=Gr;>]n!F(J*G^*p#HHF]L]j@1dnK,0gdo5Qk9Wg(ia2d_)R_X]?tNb24efmBAbN\7?-qgiM?9+l[j9FF.,f.0h,>aJ4T!e!f,pt&fi'8;(*m1jGCFE+ba:p/WDDLQ#8>d_(GFJ\b#3L@5S@_XgeOYG<"LZBEN]52BJs0"[=2T^ATc;!pi#Y_)&U5_n)bcW'Ypt2WsBA[kJ1/7hnHh[okpVZ%6'1+LiGmhO'&U(Aq:iq=]S]>I&TX4;1+ecDtDqI\,X=(=*+\eaf`p=>RcFTS,"6`R&Jf4:T+YbehB)d`n8'gNj$IG<"LZaMQg!6S1u!E(`dM3Dp,Bpe4%o$]AX9!iCu=?ak97=kJIZK29DK(/Qs#rFl9lps.>"get3:*6A1&I-[@:)d#5O&286kk?2\2nOuuCgcd,6bpNNnP$ErGbuY._BruaKl%)TpiP9%"aA^)pN-oHZ`ojPi"f-J\c$4C3;?07n-P"c)T"%AP(m,lL4Fp&l7m0b(:GC1_Bs!4qMj;0["-+O8K&Aj2!!N@&Q1lCcA(kq0>;`.`V5JfqR`A%GP:;&l6`u)A<_RlI'WOl25L34n+?PD@.?ogLaX:BSta@rSn/_tiRA!Wu'H>9A6-h:WLWrkgr3h>G7\r`4KOYJ34*9u0eUm$Tf)q=>%5;Yd<_rj2k?kMs#RlLOS*msu,EVn^O2.0i%j4E(&/n9lq;6r.I0hIc:O.qCO=V.e/\VlU_ZBk1P"pQLL"fl_,&1F]Z7X\^Utk%s#65I^q^7?pdd;5NRC.8ACV1Xo65@9]F/Ufhn"`K&c_pl6Ia6d*)C(M7+=;(e(-,42XJhV@YMWK?Kdp`NS6Vae68g>)Ds/=r8"\P2"@1qD4uT2()BO.@/VcbB1OWHp0H*W=K>`A@)cAMS7iJ1o>_*bb^?`=1S2UMX$F.#Va#;(e'B^q>/9DjQN^@`RGTpmr\Ac"AQC/F5K4-L4l=YHBSsOO+6!af2%g]lDfd46S.`"q497efY+daX[@8,$g]00c&G7\_@o"Kc,46qqsR"._!U0BrYm6l?T3TQV$!&.rr&@8(.MD5#jEA@5qMjrMH0sqTrr1*]T=Fp-TD+iQMu:3bhi$%":EcI!GVrJQ^*Pn[KCS@>/1%:g#^BB$(pDaCpA#NFj^3-$^l_idh2_Vjlp<-eP<-#!ep#K%9]_r?8j5A:,e!u4a]Le5e:nGV4kUgoH7G8s;M^W%rStJ.G``4R]P-fT*X\pFq5&lHZW*f=W"c7-N3l4f)3EO2O$1aE,:<7HNr^J2,&(bSo9Md5E9dWfdl`IVrT/#^$AAC\W1JGV&0;@A#]-2Rko+E<7XU.d/1*toY((kdfMAFZ20Xq3CQ:'HCDE[`YT.18mh\psIZ?piQ'CGnrn_cc^`Z/i9H$ZTN:K!o?M6iAg)G*VN%hCl!)3Hg,(Ss6=M&.(;SD^uhR'uV]F2cbjB45L]S9-<#dN#XdAfUF_b!=p\)B+bqo_l0V8eeV8Tb"%GJal;]0f]FA.6e:1:He*NYdHbS@4M]aENCqRKd+iH.>i6N?bjT<9r9DQ",ZE=b/eC9#u.C.!N+^u>(jV'PXhPUA3Y?TPnl;^Fuojs[DBDV$p1I:*NRl#0tY6oT+":IoD0h-<(2qkf[h9aY]T,7?U&oH-V>NK!U2p:$cr;gVpKtW*iaOncsP1V34C:Z;/UHQ$7"P3t._eul7^ZG6f435R$T2@M'TWZBAcW]S'A*Z$NDc;=_a_9)[q<(FQD)THN>"?!FgU_-`+kKI(b3n2'1BKdm2T>ueR_-><7!Yc/_'/\%So?(PU9X:T$;N4.+>]fbsea[!]p0OTW'_UiDV@Tg_teOP.85=DiPTCecsWUOrUiHJl!I,JIdGS>."hN(`cgW`o8q/pU3$4hrI0q6SHl!r&gLbAk?seYiV#ZV'a]0UrZ\(a[]7Z8\n\lgp)52-#5=DE>5')se\0@.F74$stC#^!-q2>X/**U0gi=Zf$\!XFW/1DtGc^-njf<+q)#Y9Am4_C6uF`E6HoP.,6[#*jaG<7b`@8ASR#d)&lkQiF*&kAOE&<"WjhuaL0G#-Sft"P6PAJ:RtRQ*#t#k)r%kq-.W8We>(J+*XgB_hc7WOna8!;Xduhq2Tc'`lWA%E8Ji;@'(lApkQ`:$GZRm6nF2cNm^<;d#-METQV(d*PhTb[ZZ&k,7)2]aW8AYBi:Au;"6OO;KkH.A!U6Sqn8JLVGIL@?nQ6+T[`cV9]AFB'Uja&+6jlO71pTr4nKbMXggi?&p4][JK5aC9?Hh"W-=-hAgKQ$bjt+.mF_&`(AI2E"'uH4C^hZBk^C^Mg:\C2$6?8bX8Mbgh4#h-!X39#-8p+Z)AYklfHcAuslfo.AZ/YgaK`mfYV;YS3ULC`A=&h>.>UHA=JJI'bpL\X=Z-1eR[*HN08.iRVl]8\.ctFmo\m:JGiJDM[)g,iPLEkOHjl9.T)(t#B-)9CVQDmuNMM'gDkqmg^$]?S&^(dPUVt7cD(.i^9MkeUt18.G0?G["L[kqH*;akRCI;Z@GD-QO!pOBWZZBSlOPtOtGJr`OXVh.0;XA>_E=&hk&9soY]\#;(Si;35/^6..cr66]of]b;5LDH1+:UbRqhE"8V+M&l(djjg.ieX`)#Ue,th5G3SVlNgA3m=(gLSTJ:iI&./:5qW[;E4h>bg;\qC6NY@bJrt.Gk>t*Lp'g<9Hs&*WsQnMi;5)TSuLO]O"NO%'7@@N3hBZ?BIAR,WY:Zsa*H'.QX2%&LsO)q80Ii1-7aFr27#iN.c,SVrfCTGK[\t/Um73ZhgcpgN3A/P=M0`PF-'9NO)KHaq$#Q$87Ab+8>YEC%tas\Q\E;dfQg#pf_,5K"E2a=tRcINl>,CBk6Be$lZ-l;ZbjhHn*MbkC-oS&/^oq/_SEAIA>;EAPRj<(3GpsNqqK[37#Jna96/;%JgN.qjaLV&JBWApQX=WW&,8U\9E%JW9<^@Z#rj!%HSb.,TE-e&bS7L4gj],Z(Y$T'gY*,;q`.MN$E7;/%S5E-QUu[k12@fb`PAlcJn-)lu-5Doepn;9uST1[CVFiXXACO3Z^qmdq\?PBM0`[.\j7]ASi8B*,l]uZhM%-A\VkA?VqbnMSnEIB($^_4Dm8",*_3[BmmO>CAoGl^ue4Kh1Kh^":^'7P4l^mMfi8A\4iff:Y$W&dmrM^8jpsqSS2W/IWDL\Yg%fULjb"b\4lShG"^U3Fq^&`u[ES]Ui0G0],T,'*gS#!mV[Z"Ch%QO7-_KHNh>?ktXlF8*s#:d+'OXU[>c>dq3HXP_+d:CFtSVdXZTW12TAZiD(nVBP^;YM[E>#?6I]fH^p4YRP"V2G&P5D&K`Z*H:M9L>WhZ@2f7X51:(u_W$uuaeo,*K8ddo%a=M/"0FQVHAmpl[/=pP]3;?07E!s"V%06^+BaATbnOu<;Kh^"RDHlFumNGsR2U`5m!pV,-Y1b>54#d^a,)Vf0[Mq\uG$FoV:)M20oE&\r/JMe+2T&"nX\\H_NGO?o>"j_]\D*=oW\Ft!/U6eZ2QOhKCq&>*fPFTJk?2\rgNNRUBaAT2QT_dZNG/Y^_!UD\M))d6@Ab08/AeQ-~>endstream -endobj -% 'FormXob.c8ba08e347e6847214d84c863a661d07': class PDFImageXObject -5 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 45 - /Length 6345 - /Subtype /Image - /Type /XObject - /Width 2008 >> -stream -Gb"/l^M@+F(_PS==SM+pNL-W1X)>0#dm+i=er1NUi)1\Y4hpS?,j08h(22fF0%]DBg`B,1jTzzzzzzzzzzzzzzzzzzzk[`]qf;lL_m>oGng:FS8q+e=j5Q,n@fi@?+-A+3PQIl2qd,\3IgA4:UZTq_3I9s6/A#Wsz!!!#BkN:Sj=)L,OXrS7I$B5_fZ<8ig+dHJ+9kj2/3Ne[D!p+'>nlY+sGBg?G;Y=\fqz!!'CG[qcS:l^Q"Dl"Fu(&Su=.'X_gHq!U=o5#p^be'WQfLgI9pjZ^&.RS*Ehg!s=6[/J,WX\1@Y[\('9>6t90z!!"h&C.5;;=gWc3nW;=i>\,.,a](-iK\#;S4FXH@lQemrC@=,Q2dX";0-nYP5;&W%LY1.R.%LFRi,.nmE)Ql&%I=I?S2(*R,[U3.ai"33V=4:"]Bp3T+Q2*e`$2l5&Q4=99/M6o4YuHM-p`bO#N>=1!aAG*q?4TYgU>CrBk9oeSd9J@2-6HbDIa\0).-Nn(K1Q3G<+ZUpd!J2]c#?iftl4@TAOtlq;;0XlG]aOq\Lp-20L-4,(8i*Aopo(3>8QLPV@UR@BrBq91>,:(SEoW_CHAL3NMWPOmeHRm&/q&Jdp2W:/;Q:3cV;Wz!!'fSAW.;'\I(:a4rQPMd-s;r8qRmUoMR"B,LgHiBLZ^N^YZN7rM42mKF`CA1+gb)%#=JpT[f8"QlUHVrJK1?269.AT[0^>&^?'4*XSh]*dkV\jr;TPp9\,[R&`jU=`ZI4(KW*l=1>4'HRZMR.*%]2g-B>TO@\]cDOGGqUh)IObZh@9\nr&6hIf8X7t8pu\GUH9n3Og;oPn$&nNKK7As182V32QWiEB?B];9.=<4a]hQWO(kdM*"k:"o#XH4nML"onW'!!!!YBllGAj.3t:B[_b=IH1:Pj^Q+El%mfKN44GFLujWuK0A>daqc31U8[!W)%N@;N`Q`\f!`f,@J=2fI?&&4o36Y%q8S1gaD$NY*B`MDTbnl&!LmK!^7<_;8SS^_DH0*&`%mS`*9ZYF)D,&n"/+<#N(@C;MQ7>%"D)A<]?P>mdUe@P33sKris!,"D(10X8E+J7P.h%g1B6PR[Kdb+)%!`]WhM!;8\OY#XBQ(K2QW+A\bl;`2KY*(V(^%KL^X+b6M'H^h\a^q=rKFgHU+bUCnBH:[)L&-FW(T+I$3>KQ!)4.PK?skHiYpj54+gQHZ^O_72tK>0<'1P3M&l@8GJN'n:fP]-fAYA4=[.)mmbI.4t-U]EOL9@5sBF/cG]E9Wl?V8Xp>Y#U+j463s9]bP8]`.B&I$r4DMN)s*'Y26g=a*:NPqdB7KBptHBZY8nWLd,NIYiVpdae(pLf^f$DYt89-==Js'B^AtHKFgHU+bUCnCEtLVqk,H;^#![J)YQo7XdnIUmlhh"CO!8!7Y[2^3F84]W];bEC2V9".V#obh:hAJ[VB#l/82/(9+/p&FE2d#4]NN(F#Ed+VrTl#J008b)=+m+b\(3d::/JOS!G(A%q1\k3f%GcMTo8>@dhA@K`+g!9c"R.n#TNlpEXc9[tKA/u;hXUFlC`XV3r<7ic63n`f&4.aC>+0Zia3^nY^D#hQi%^VjfqUa[=DN/h]8W]3GYP[=WVLI-YH0i-e=X1Da]35QW@P@NhUo34h'/tr9#J*4q-#XJ$e4\*Wo:.Q+QkcIJ04e7XkK&jV5d\Ll"lbt>9WS&l*JK[GU"M3ofV,^iJ.q5J<*h@g:c3:G/1r2S[I<=MjEo:g"ekL1*C9\T,J^bb7;fGknp;J=4goL.Z"g*#U+j463naA>ZK7c8,U)I^i+7.7RV!;9G.MAD_u-@G#6_Ap$>_$4.i+N0+CjhN%iij/=WN%Bip'11ojI-1"!!UGj\uX6edjr]s[[]Lu45N4e4:U*:Pb5K;3`oR<9\-O`=lQNjV\-*@p"q;pLC3:]'$jbrS$SA;WtmUjH[@)ihMcX"oI,OAEXJOd0hQFD)s?9=$\GGYXE,#U+j463n`f&6cY]F27S"^)@XN:F>OP!jt8.m25im(j8a/(*h@NCeO)6[h38>qMe4!g'XtRX3o`t(uAQ\!uh?)^6,*pPJmM@o=9f\m:a4GTP9gV[)uqL\&RM!K`7"""+H[KP42O&!)-)4[>E0j%=`Hj$b=8P+HTbW>'oXb&>MmhLU`c)Rm`":#s5KlT&-'g7n%RS+&?biT^[K6nH8=,H*oB'CS2Vn""`7/Z!2]XtD(DEZZ1E^bb"iT9)mfJ9p>XNo"k(n#nr9b5A]HPT9q7"#)^5P2KFgHU+b\3'b-n:?5.kadCt+X#ps2q[P8gsbM";^YV^XDq[.`5!VdUdG?)j;HAaj5/_LG?;4fP55D"H>Tb_@u%T"i(HSup8Pn$>8XoA$dLD5AuYo?@:`cA=U41rr]lhr8B;924HoMc6O[YkaF1eX2#RY6ADt/=^/63BG_O7SU5QkaruPf,]$pN5oMBAJo?LCI02a4lO+qhEf4[J'?tVQiI*dz`s*dQ8lSJ8i'5iAn06#i^5WE9_2@mh_iOPtZ?T4kBn5SuC?[gc0(g:sC04'h[sJ_tGO0F1cXU2aa,\q6WU;*T1uD5kXR^djXR\g5baE/T3,q^C'I/gMX_`cnHZ?IagIE@[q=&l]q,LUYF2,_onh)lg>4=WU[#28Od>C.SjPTZ(3el'_hgGTsnGNgsz!!$+Y4Rp#1(=TQ&PU<;j*P,D`4%6Tu6>8cmK;;2%F'*aaL@]$/`-H*kFpW`=*1[GXh)<5&5ka(R&r+B"6W7@.qo%[2CrDuB9OeV"g+z!!!",Q20C:?U+I!4#8V:SA-@7Oe5.u3TRV#CW?A(MQG5gU/$`IEe+^PCZA2&McSo%h1`t=sq)8k+5O;H:FsugiHj7cU9Vr[W(n.$0aMHQ*LA;]stY!]smb5p!9ui=atndmJVs0WXaDARtQEW%n^?&>rqdb#YtKGJsKi.3M>2WSR\HQHj-,b@?#'a82!OD#=g7C7XI?jIP/CSJHl/TzJE=)KJ!_;@B)&;FBQ8lsYHmcp3@Dto6or%&)_5D^]*b@3/l%nsI.d$%,/"?]q;(cu[i\!i]/g\hkfiBmd+'58OpRa'BfY"M21:q_5QLibzJ)@BDpR~>endstream -endobj -% 'Annot.NUMBER1': class PDFDictionary -6 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://www.google.com) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 0 - 800 - 50 - 842 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER2': class LinkAnnotation -7 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 18 0 R - /XYZ - 35 - 718 - 0 ] - /Rect [ 50 - 800 - 100 - 842 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'F3': class PDFType1Font -8 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Annot.NUMBER3': class PDFDictionary -9 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://www.yahoo.com/) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 50 - 25 - 100 - 75 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER4': class LinkAnnotation -10 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 18 0 R - /XYZ - 35 - 718 - 0 ] - /Rect [ 135 - 476 - 185 - 526 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'F4': class PDFType1Font -11 0 obj -% Font Helvetica-Oblique -<< /BaseFont /Helvetica-Oblique - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -12 0 obj -% Page dictionary -<< /Annots [ 6 0 R - 7 0 R - 9 0 R - 10 0 R ] - /Contents 22 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 21 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Annot.NUMBER5': class PDFDictionary -13 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://www.google.com) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 0 - 800 - 50 - 842 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER6': class LinkAnnotation -14 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 18 0 R - /XYZ - 35 - 718 - 0 ] - /Rect [ 50 - 800 - 100 - 842 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Page2': class PDFPage -15 0 obj -% Page dictionary -<< /Annots [ 13 0 R - 14 0 R ] - /Contents 23 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 21 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Annot.NUMBER7': class PDFDictionary -16 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://www.google.com) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 0 - 800 - 50 - 842 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER8': class LinkAnnotation -17 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 18 0 R - /XYZ - 35 - 718 - 0 ] - /Rect [ 50 - 800 - 100 - 842 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Page3': class PDFPage -18 0 obj -% Page dictionary -<< /Annots [ 16 0 R - 17 0 R ] - /Contents 24 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 21 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R19': class PDFCatalog -19 0 obj -% Document Root -<< /Outlines 25 0 R - /PageMode /UseNone - /Pages 21 0 R - /Type /Catalog >> -endobj -% 'R20': class PDFInfo -20 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121220124728+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R21': class PDFPages -21 0 obj -% page tree -<< /Count 3 - /Kids [ 12 0 R - 15 0 R - 18 0 R ] - /Type /Pages >> -endobj -% 'R22': class PDFStream -22 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1271 >> -stream -GasIg9ol&/&A:TVJ#M+4>2@+Dk%g!PR9jUX,Am2;Y_S?A##&Dl0PsM4q=e*)P)r@M'LdQ2Q-312?J4;QnAj?JgAu\-_t&olpL.>-(S60M'7=05B'449B.)lf-A%J6c/(j'=$0%KOJhP7:0;2EF#S>!HHdQ'mJ#iHH7@\ZmmSqlF"ZNZH8e:de3lPLqSd_P`_9aH]t>TI0XrQ,)G=E^?mLH3KY^e&UDo0;l)Ws2H7,d)Dj9AjDLkhQR[\hKR?0/$-X)Ng3+f&pb^%;Y2Y()p#,@B74bb]2M.S'"qsH#_O6L\66Ql\cX8o(dS"CN$Ju,+q)r0,NIn1_^5,bMo3sm3V(+9CCFLOdOU741Q:HE&'3itkSi4YBK6T?BlcV-&je!^J0FWR%XW-5DVKj#4WUe2(hSUK!h.GmsOOOh*c#u96*mOIed)BNGCko,hGlI@4/pStiLldf(E-+5:MFLff/,*^Ze?^AlD(qbjZ(q,4:?]G.uHeD*g5bm0f9r[J)ld:u_>6TB0'C);uh%Y,Ggof/l'gftZ4)X=D;BAKjedY7q/bP9Be:FG_0eQK'ojAs4r1ZErb?YSit(;#*d6*E*mP\a*g]W!:dttnEMi#Im#XtP-*FH\o@a/s!Fd\~>endstream -endobj -% 'R23': class PDFStream -23 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 420 >> -stream -GarW5btc/1&;9M7nd]^l4f#OH^Mp9I-TJJ$JfA_CV[4VCS#.ZrO6ohE,\5*(r+TfaZP:>0)U>VnQ8o^2$HeI^TKM2STCA5gd34MOA"_O37MC&Y%aZ;g<'][^H&pY@g!MJ%mlQFa]>qpWdsEn)q@<<+o(c9dYu&V4OqF!WE35gYk3U%6@Ps,CgJB/KBULSm\?LWG.SQCEM?@=&s(=)!.%FV3\*CP#atVeLl=i[rJcr2baR21WhCT/E\)'?S)38CCaZo0&TGq/Ne:b/oLi5M0aN(91'=+D_`VH50tu"''@&Yo!;DUh/Gj>FrdI"U)M0QDg)l?mF5N+'h*Ic0FaDnVo@nVH5Ot?XH)8a("DWrFP*(b)pmtKemTe`^&\[FIin~>endstream -endobj -% 'R24': class PDFStream -24 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 415 >> -stream -GarW5]l(\@'SZ9PH&"1RL1!+B91RJe[0+oG\&q8^THX[fWRStlD46>SaHgE5dlmI#>RKI,NG$cCCP1/lJhi\tP\1uu"j\Mi/nkq9"4_rWR`UtC5_!os!Msk)(5q"LVr+pGT,dF]&Na&g+,@Zi%ksV0b?7lN=Na-6&6;VHXeC!umA.j=dgthm?Y4t)=YOa(E.iHcCf;$jUBkGZQ*eJ.T-i>*ZaOG@1Lendstream -endobj -% 'R25': class PDFOutlines -25 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 26 -0000000000 65535 f -0000000113 00000 n -0000000246 00000 n -0000000411 00000 n -0000000627 00000 n -0000007027 00000 n -0000013622 00000 n -0000013839 00000 n -0000014035 00000 n -0000014236 00000 n -0000014453 00000 n -0000014651 00000 n -0000014831 00000 n -0000015285 00000 n -0000015503 00000 n -0000015698 00000 n -0000016137 00000 n -0000016355 00000 n -0000016550 00000 n -0000016976 00000 n -0000017114 00000 n -0000017385 00000 n -0000017511 00000 n -0000018925 00000 n -0000019487 00000 n -0000020046 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\027\300\231\011\304\006\274\370:\264\351\031\346RC\304) (\027\300\231\011\304\006\274\370:\264\351\031\346RC\304)] - - /Info 20 0 R - /Root 19 0 R - /Size 26 >> -startxref -20098 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-039-doc-programming.pdf b/z3c/rml/tests/expected/rml-examples-039-doc-programming.pdf deleted file mode 100644 index 2d8a4964..00000000 --- a/z3c/rml/tests/expected/rml-examples-039-doc-programming.pdf +++ /dev/null @@ -1,359 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 6 0 R - /F4 7 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.0086924a45e007495af99df70126eb1b': class PDFImageXObject -4 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 197 - /Length 6121 - /Subtype /Image - /Type /XObject - /Width 309 >> -stream -Gb"/l^Q0\[&]ap8-\i2ucj=5N-F&B2*&rS,^lh8#OU4]pO9j*&8&-nb>+sIunDF=o/>mXT=rr[$BDR%WJ%V4up&1g&Nh&*l4]U%geQ"JnQNZ=Gr;>]n!F(J*G^*p#HHF]L]j@1dnK,0gdo5Qk9Wg(ia2d_)R_X]?tNb24efmBAbN\7?-qgiM?9+l[j9FF.,f.0h,>aJ4T!e!f,pt&fi'8;(*m1jGCFE+ba:p/WDDLQ#8>d_(GFJ\b#3L@5S@_XgeOYG<"LZBEN]52BJs0"[=2T^ATc;!pi#Y_)&U5_n)bcW'Ypt2WsBA[kJ1/7hnHh[okpVZ%6'1+LiGmhO'&U(Aq:iq=]S]>I&TX4;1+ecDtDqI\,X=(=*+\eaf`p=>RcFTS,"6`R&Jf4:T+YbehB)d`n8'gNj$IG<"LZaMQg!6S1u!E(`dM3Dp,Bpe4%o$]AX9!iCu=?ak97=kJIZK29DK(/Qs#rFl9lps.>"get3:*6A1&I-[@:)d#5O&286kk?2\2nOuuCgcd,6bpNNnP$ErGbuY._BruaKl%)TpiP9%"aA^)pN-oHZ`ojPi"f-J\c$4C3;?07n-P"c)T"%AP(m,lL4Fp&l7m0b(:GC1_Bs!4qMj;0["-+O8K&Aj2!!N@&Q1lCcA(kq0>;`.`V5JfqR`A%GP:;&l6`u)A<_RlI'WOl25L34n+?PD@.?ogLaX:BSta@rSn/_tiRA!Wu'H>9A6-h:WLWrkgr3h>G7\r`4KOYJ34*9u0eUm$Tf)q=>%5;Yd<_rj2k?kMs#RlLOS*msu,EVn^O2.0i%j4E(&/n9lq;6r.I0hIc:O.qCO=V.e/\VlU_ZBk1P"pQLL"fl_,&1F]Z7X\^Utk%s#65I^q^7?pdd;5NRC.8ACV1Xo65@9]F/Ufhn"`K&c_pl6Ia6d*)C(M7+=;(e(-,42XJhV@YMWK?Kdp`NS6Vae68g>)Ds/=r8"\P2"@1qD4uT2()BO.@/VcbB1OWHp0H*W=K>`A@)cAMS7iJ1o>_*bb^?`=1S2UMX$F.#Va#;(e'B^q>/9DjQN^@`RGTpmr\Ac"AQC/F5K4-L4l=YHBSsOO+6!af2%g]lDfd46S.`"q497efY+daX[@8,$g]00c&G7\_@o"Kc,46qqsR"._!U0BrYm6l?T3TQV$!&.rr&@8(.MD5#jEA@5qMjrMH0sqTrr1*]T=Fp-TD+iQMu:3bhi$%":EcI!GVrJQ^*Pn[KCS@>/1%:g#^BB$(pDaCpA#NFj^3-$^l_idh2_Vjlp<-eP<-#!ep#K%9]_r?8j5A:,e!u4a]Le5e:nGV4kUgoH7G8s;M^W%rStJ.G``4R]P-fT*X\pFq5&lHZW*f=W"c7-N3l4f)3EO2O$1aE,:<7HNr^J2,&(bSo9Md5E9dWfdl`IVrT/#^$AAC\W1JGV&0;@A#]-2Rko+E<7XU.d/1*toY((kdfMAFZ20Xq3CQ:'HCDE[`YT.18mh\psIZ?piQ'CGnrn_cc^`Z/i9H$ZTN:K!o?M6iAg)G*VN%hCl!)3Hg,(Ss6=M&.(;SD^uhR'uV]F2cbjB45L]S9-<#dN#XdAfUF_b!=p\)B+bqo_l0V8eeV8Tb"%GJal;]0f]FA.6e:1:He*NYdHbS@4M]aENCqRKd+iH.>i6N?bjT<9r9DQ",ZE=b/eC9#u.C.!N+^u>(jV'PXhPUA3Y?TPnl;^Fuojs[DBDV$p1I:*NRl#0tY6oT+":IoD0h-<(2qkf[h9aY]T,7?U&oH-V>NK!U2p:$cr;gVpKtW*iaOncsP1V34C:Z;/UHQ$7"P3t._eul7^ZG6f435R$T2@M'TWZBAcW]S'A*Z$NDc;=_a_9)[q<(FQD)THN>"?!FgU_-`+kKI(b3n2'1BKdm2T>ueR_-><7!Yc/_'/\%So?(PU9X:T$;N4.+>]fbsea[!]p0OTW'_UiDV@Tg_teOP.85=DiPTCecsWUOrUiHJl!I,JIdGS>."hN(`cgW`o8q/pU3$4hrI0q6SHl!r&gLbAk?seYiV#ZV'a]0UrZ\(a[]7Z8\n\lgp)52-#5=DE>5')se\0@.F74$stC#^!-q2>X/**U0gi=Zf$\!XFW/1DtGc^-njf<+q)#Y9Am4_C6uF`E6HoP.,6[#*jaG<7b`@8ASR#d)&lkQiF*&kAOE&<"WjhuaL0G#-Sft"P6PAJ:RtRQ*#t#k)r%kq-.W8We>(J+*XgB_hc7WOna8!;Xduhq2Tc'`lWA%E8Ji;@'(lApkQ`:$GZRm6nF2cNm^<;d#-METQV(d*PhTb[ZZ&k,7)2]aW8AYBi:Au;"6OO;KkH.A!U6Sqn8JLVGIL@?nQ6+T[`cV9]AFB'Uja&+6jlO71pTr4nKbMXggi?&p4][JK5aC9?Hh"W-=-hAgKQ$bjt+.mF_&`(AI2E"'uH4C^hZBk^C^Mg:\C2$6?8bX8Mbgh4#h-!X39#-8p+Z)AYklfHcAuslfo.AZ/YgaK`mfYV;YS3ULC`A=&h>.>UHA=JJI'bpL\X=Z-1eR[*HN08.iRVl]8\.ctFmo\m:JGiJDM[)g,iPLEkOHjl9.T)(t#B-)9CVQDmuNMM'gDkqmg^$]?S&^(dPUVt7cD(.i^9MkeUt18.G0?G["L[kqH*;akRCI;Z@GD-QO!pOBWZZBSlOPtOtGJr`OXVh.0;XA>_E=&hk&9soY]\#;(Si;35/^6..cr66]of]b;5LDH1+:UbRqhE"8V+M&l(djjg.ieX`)#Ue,th5G3SVlNgA3m=(gLSTJ:iI&./:5qW[;E4h>bg;\qC6NY@bJrt.Gk>t*Lp'g<9Hs&*WsQnMi;5)TSuLO]O"NO%'7@@N3hBZ?BIAR,WY:Zsa*H'.QX2%&LsO)q80Ii1-7aFr27#iN.c,SVrfCTGK[\t/Um73ZhgcpgN3A/P=M0`PF-'9NO)KHaq$#Q$87Ab+8>YEC%tas\Q\E;dfQg#pf_,5K"E2a=tRcINl>,CBk6Be$lZ-l;ZbjhHn*MbkC-oS&/^oq/_SEAIA>;EAPRj<(3GpsNqqK[37#Jna96/;%JgN.qjaLV&JBWApQX=WW&,8U\9E%JW9<^@Z#rj!%HSb.,TE-e&bS7L4gj],Z(Y$T'gY*,;q`.MN$E7;/%S5E-QUu[k12@fb`PAlcJn-)lu-5Doepn;9uST1[CVFiXXACO3Z^qmdq\?PBM0`[.\j7]ASi8B*,l]uZhM%-A\VkA?VqbnMSnEIB($^_4Dm8",*_3[BmmO>CAoGl^ue4Kh1Kh^":^'7P4l^mMfi8A\4iff:Y$W&dmrM^8jpsqSS2W/IWDL\Yg%fULjb"b\4lShG"^U3Fq^&`u[ES]Ui0G0],T,'*gS#!mV[Z"Ch%QO7-_KHNh>?ktXlF8*s#:d+'OXU[>c>dq3HXP_+d:CFtSVdXZTW12TAZiD(nVBP^;YM[E>#?6I]fH^p4YRP"V2G&P5D&K`Z*H:M9L>WhZ@2f7X51:(u_W$uuaeo,*K8ddo%a=M/"0FQVHAmpl[/=pP]3;?07E!s"V%06^+BaATbnOu<;Kh^"RDHlFumNGsR2U`5m!pV,-Y1b>54#d^a,)Vf0[Mq\uG$FoV:)M20oE&\r/JMe+2T&"nX\\H_NGO?o>"j_]\D*=oW\Ft!/U6eZ2QOhKCq&>*fPFTJk?2\rgNNRUBaAT2QT_dZNG/Y^_!UD\M))d6@Ab08/AeQ-~>endstream -endobj -% 'FormXob.c8ba08e347e6847214d84c863a661d07': class PDFImageXObject -5 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 45 - /Length 6345 - /Subtype /Image - /Type /XObject - /Width 2008 >> -stream -Gb"/l^M@+F(_PS==SM+pNL-W1X)>0#dm+i=er1NUi)1\Y4hpS?,j08h(22fF0%]DBg`B,1jTzzzzzzzzzzzzzzzzzzzk[`]qf;lL_m>oGng:FS8q+e=j5Q,n@fi@?+-A+3PQIl2qd,\3IgA4:UZTq_3I9s6/A#Wsz!!!#BkN:Sj=)L,OXrS7I$B5_fZ<8ig+dHJ+9kj2/3Ne[D!p+'>nlY+sGBg?G;Y=\fqz!!'CG[qcS:l^Q"Dl"Fu(&Su=.'X_gHq!U=o5#p^be'WQfLgI9pjZ^&.RS*Ehg!s=6[/J,WX\1@Y[\('9>6t90z!!"h&C.5;;=gWc3nW;=i>\,.,a](-iK\#;S4FXH@lQemrC@=,Q2dX";0-nYP5;&W%LY1.R.%LFRi,.nmE)Ql&%I=I?S2(*R,[U3.ai"33V=4:"]Bp3T+Q2*e`$2l5&Q4=99/M6o4YuHM-p`bO#N>=1!aAG*q?4TYgU>CrBk9oeSd9J@2-6HbDIa\0).-Nn(K1Q3G<+ZUpd!J2]c#?iftl4@TAOtlq;;0XlG]aOq\Lp-20L-4,(8i*Aopo(3>8QLPV@UR@BrBq91>,:(SEoW_CHAL3NMWPOmeHRm&/q&Jdp2W:/;Q:3cV;Wz!!'fSAW.;'\I(:a4rQPMd-s;r8qRmUoMR"B,LgHiBLZ^N^YZN7rM42mKF`CA1+gb)%#=JpT[f8"QlUHVrJK1?269.AT[0^>&^?'4*XSh]*dkV\jr;TPp9\,[R&`jU=`ZI4(KW*l=1>4'HRZMR.*%]2g-B>TO@\]cDOGGqUh)IObZh@9\nr&6hIf8X7t8pu\GUH9n3Og;oPn$&nNKK7As182V32QWiEB?B];9.=<4a]hQWO(kdM*"k:"o#XH4nML"onW'!!!!YBllGAj.3t:B[_b=IH1:Pj^Q+El%mfKN44GFLujWuK0A>daqc31U8[!W)%N@;N`Q`\f!`f,@J=2fI?&&4o36Y%q8S1gaD$NY*B`MDTbnl&!LmK!^7<_;8SS^_DH0*&`%mS`*9ZYF)D,&n"/+<#N(@C;MQ7>%"D)A<]?P>mdUe@P33sKris!,"D(10X8E+J7P.h%g1B6PR[Kdb+)%!`]WhM!;8\OY#XBQ(K2QW+A\bl;`2KY*(V(^%KL^X+b6M'H^h\a^q=rKFgHU+bUCnBH:[)L&-FW(T+I$3>KQ!)4.PK?skHiYpj54+gQHZ^O_72tK>0<'1P3M&l@8GJN'n:fP]-fAYA4=[.)mmbI.4t-U]EOL9@5sBF/cG]E9Wl?V8Xp>Y#U+j463s9]bP8]`.B&I$r4DMN)s*'Y26g=a*:NPqdB7KBptHBZY8nWLd,NIYiVpdae(pLf^f$DYt89-==Js'B^AtHKFgHU+bUCnCEtLVqk,H;^#![J)YQo7XdnIUmlhh"CO!8!7Y[2^3F84]W];bEC2V9".V#obh:hAJ[VB#l/82/(9+/p&FE2d#4]NN(F#Ed+VrTl#J008b)=+m+b\(3d::/JOS!G(A%q1\k3f%GcMTo8>@dhA@K`+g!9c"R.n#TNlpEXc9[tKA/u;hXUFlC`XV3r<7ic63n`f&4.aC>+0Zia3^nY^D#hQi%^VjfqUa[=DN/h]8W]3GYP[=WVLI-YH0i-e=X1Da]35QW@P@NhUo34h'/tr9#J*4q-#XJ$e4\*Wo:.Q+QkcIJ04e7XkK&jV5d\Ll"lbt>9WS&l*JK[GU"M3ofV,^iJ.q5J<*h@g:c3:G/1r2S[I<=MjEo:g"ekL1*C9\T,J^bb7;fGknp;J=4goL.Z"g*#U+j463naA>ZK7c8,U)I^i+7.7RV!;9G.MAD_u-@G#6_Ap$>_$4.i+N0+CjhN%iij/=WN%Bip'11ojI-1"!!UGj\uX6edjr]s[[]Lu45N4e4:U*:Pb5K;3`oR<9\-O`=lQNjV\-*@p"q;pLC3:]'$jbrS$SA;WtmUjH[@)ihMcX"oI,OAEXJOd0hQFD)s?9=$\GGYXE,#U+j463n`f&6cY]F27S"^)@XN:F>OP!jt8.m25im(j8a/(*h@NCeO)6[h38>qMe4!g'XtRX3o`t(uAQ\!uh?)^6,*pPJmM@o=9f\m:a4GTP9gV[)uqL\&RM!K`7"""+H[KP42O&!)-)4[>E0j%=`Hj$b=8P+HTbW>'oXb&>MmhLU`c)Rm`":#s5KlT&-'g7n%RS+&?biT^[K6nH8=,H*oB'CS2Vn""`7/Z!2]XtD(DEZZ1E^bb"iT9)mfJ9p>XNo"k(n#nr9b5A]HPT9q7"#)^5P2KFgHU+b\3'b-n:?5.kadCt+X#ps2q[P8gsbM";^YV^XDq[.`5!VdUdG?)j;HAaj5/_LG?;4fP55D"H>Tb_@u%T"i(HSup8Pn$>8XoA$dLD5AuYo?@:`cA=U41rr]lhr8B;924HoMc6O[YkaF1eX2#RY6ADt/=^/63BG_O7SU5QkaruPf,]$pN5oMBAJo?LCI02a4lO+qhEf4[J'?tVQiI*dz`s*dQ8lSJ8i'5iAn06#i^5WE9_2@mh_iOPtZ?T4kBn5SuC?[gc0(g:sC04'h[sJ_tGO0F1cXU2aa,\q6WU;*T1uD5kXR^djXR\g5baE/T3,q^C'I/gMX_`cnHZ?IagIE@[q=&l]q,LUYF2,_onh)lg>4=WU[#28Od>C.SjPTZ(3el'_hgGTsnGNgsz!!$+Y4Rp#1(=TQ&PU<;j*P,D`4%6Tu6>8cmK;;2%F'*aaL@]$/`-H*kFpW`=*1[GXh)<5&5ka(R&r+B"6W7@.qo%[2CrDuB9OeV"g+z!!!",Q20C:?U+I!4#8V:SA-@7Oe5.u3TRV#CW?A(MQG5gU/$`IEe+^PCZA2&McSo%h1`t=sq)8k+5O;H:FsugiHj7cU9Vr[W(n.$0aMHQ*LA;]stY!]smb5p!9ui=atndmJVs0WXaDARtQEW%n^?&>rqdb#YtKGJsKi.3M>2WSR\HQHj-,b@?#'a82!OD#=g7C7XI?jIP/CSJHl/TzJE=)KJ!_;@B)&;FBQ8lsYHmcp3@Dto6or%&)_5D^]*b@3/l%nsI.d$%,/"?]q;(cu[i\!i]/g\hkfiBmd+'58OpRa'BfY"M21:q_5QLibzJ)@BDpR~>endstream -endobj -% 'F3': class PDFType1Font -6 0 obj -% Font ZapfDingbats -<< /BaseFont /ZapfDingbats - /Encoding /ZapfDingbatsEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F4': class PDFType1Font -7 0 obj -% Font Courier -<< /BaseFont /Courier - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -8 0 obj -% Page dictionary -<< /Contents 18 0 R - /MediaBox [ 0 - 0 - 612 - 792 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page2': class PDFPage -9 0 obj -% Page dictionary -<< /Contents 19 0 R - /MediaBox [ 0 - 0 - 612 - 792 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page3': class PDFPage -10 0 obj -% Page dictionary -<< /Contents 20 0 R - /MediaBox [ 0 - 0 - 612 - 792 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page4': class PDFPage -11 0 obj -% Page dictionary -<< /Contents 21 0 R - /MediaBox [ 0 - 0 - 612 - 792 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page5': class PDFPage -12 0 obj -% Page dictionary -<< /Contents 22 0 R - /MediaBox [ 0 - 0 - 612 - 792 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page6': class PDFPage -13 0 obj -% Page dictionary -<< /Contents 23 0 R - /MediaBox [ 0 - 0 - 612 - 792 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page7': class PDFPage -14 0 obj -% Page dictionary -<< /Contents 24 0 R - /MediaBox [ 0 - 0 - 612 - 792 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R15': class PDFCatalog -15 0 obj -% Document Root -<< /Outlines 25 0 R - /PageMode /UseNone - /Pages 17 0 R - /Type /Catalog >> -endobj -% 'R16': class PDFInfo -16 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20000101000000+00'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R17': class PDFPages -17 0 obj -% page tree -<< /Count 7 - /Kids [ 8 0 R - 9 0 R - 10 0 R - 11 0 R - 12 0 R - 13 0 R - 14 0 R ] - /Type /Pages >> -endobj -% 'R18': class PDFStream -18 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1500 >> -stream -Gb"/'=`<%a&:QRrs"H`ied3gppX,]g7cG\IF4_5S4p397jAKM_Ep;]6ZMo8bQD?'7Z=uBmJJNqb*]p\ahgRWl.18iI=S`l$!%1])5./23@@Df0)D4_0i6Co`i9KesbA=CLP1c/[%l+i$]cG.G^c,\*_U6=-PhrXM/i^B':[hQ+J(@NA,qI0OR_OO??SHmc(_:G"_=`c.Zm,t60SI4b:ko:rVa?]!Lm_\?Tc_r?F$4E0JK&kcNM7[-9[!/*baP5d_h3#Ica1:pP%=d1kIQ?5NjUj:0f.mN)fS#`"5@j[d#CEM@D6Y+Ah[?)Dai,\&'1aeR34NfVVS>UgW(Dh5JJ]SbX`+\eC:76^;65:kq:SE[u";5i0U2H?43aj"-]'g%;2c2[qs@)]S*qK:3OWh5;XJu'bn=q;B_a5H(:d*j;M";J^lVjP#X4AOTHKs5H8:$.@reao6u?]QH'l2N^\*8,mdC!i:H85Qn>_>f1eVe)3Yt3N/h=[)NNd*.4'A(c]\u+\2EDZoBJQiK)%J,;B2sE2iY\^/83'VN`#E0(c7:N8,5/1-bXL9:>1P)injH]kMPdIGA/GnMhC+f<>2j@\X":GN;'M-6a^q!K!\'-_Bm1EJif+!@d2;A-+ls!0/J=FjBR#X@^Su3/R1aPNiM]V,PSKqPUW!&DI7ot?7JI6eG);`Qh?4-7.8sK"=m/MroB]<2;libKIIodS"*'Z1'?fb7nM2k)9HL^7)hBmbOg7DgeEh;Hg0@?+[?[,`Ol`=Pk`#01#c#:oC)Lp`X0mY!/_BTb@C[=siTojqU-V;)8^T6q&KJLE73UT5+cF9hBnimR?Nq72$,'u7@Ekf."&92hJL92V9n*-<;`Af6DanJc%Wa'7.\jf=\EW:]GSje)1Q<;#3t+:3J42B@[p4k6Da#j20PUr1q-Bq#eK7c$`M.gN*=0/oZ!Y`39D*.25mNgb[=&^G!GO$6^hsYse!oP*>a]'l2;0#q^7(%%VB,GKjij+.(p#+5A2j+%pr6iR:nYsu-DdV8!Ib#aVo)F^9^Y[$Q)lN]O5rdF4n&og5mfu:^?`J-=.;Y+@*[^(&,ZVi6^m?E]PcWa=[NKg$3S]A.Y?K`B7tKoQD@=+^(YL0U`1,lq%/%?,+tsK'6+i3g7bAl-63!ttdeuqZNrV/LgR$!h%!QXbm8endstream -endobj -% 'R19': class PDFStream -19 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 394 >> -stream -Gat=%4&NM[K"-KIV6/q';Rg,.$623=m-\%1=%N%*"DqtEK>8U-rDuk+kS/?g*KEmuZms13Q!Sg(:E2Egj!;sc68C.^[2DBH+$L"C'%W`6NcP*IFf%V-"3,+?Z\n[.\PQaU@Z7[8QF8WTgLP\scmX0kDLPcoc&k-FLCpg5^)IJU"b)dC/fsp3Y./0n%<),R.DgNZoS8^MQ,endstream -endobj -% 'R20': class PDFStream -20 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 430 >> -stream -Gat=e4&u5C]_`dQNht?)=mH351PeauOE6Q-%liN[iJpkRiNMDOol8/NZJgP`:HE@qWO&%7!'n\(mG^4&S:KQsB*lRJ#Wf"8k>qKhnQL!r/#50)2[Pug4F!-l]9Oo,R%!3D\ib1N1ugpuSEF`Y*)/LZ.HEE#:UH9QJaCU_0Y(]5Vkh!]U]m[,Tu*bX.E1IDpMQnrO\.BG@+]CY@PSk>qL+"L@GU_-[bA4FO@p2e7i@0;A(L1@Ib7GcdgMlJl6*H6elD%t*uY=q.(Xu7DI=ZIA7/L)4keAd4T&g[-a%@4\1Y+T\gjcT:VusHaG$9B\gmZh3o]A.?WDm+*4\SI`Qg%udRt:md21QgV5s~>endstream -endobj -% 'R21': class PDFStream -21 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 390 >> -stream -GasJM92EGZ&;9M7nfR!r32F!pIY8qtScGbJ"#o9dmK4b08Q2TQ+5=0$+>hqEM7d!X,rHVMrZ7>r'KCsQodU!g>Jl?0X2JVB=iXO@L[u9q]A[o"Wd>,`skcrgY*QJ*#+%L[X?+(OJDdt[s6mQ=h#*5+hGWE,beHctk/6.JUO'm\VRs)]tDFC#o`3)K,Ibc+"#*h]nKu5iQmFp,Ms5>R/@L3,,lk;`gK)Y~>endstream -endobj -% 'R22': class PDFStream -22 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 387 >> -stream -Garo=92EGZ&;9M7nfR!r32F!pIY8qtT&n.V\cYklF[hdFQ#8aU;E2j3;!Va#RhTI*Y!o,%qn4K7Y..A=NR=nTLG/32'0rgj`f_$<(DK$EGfA.9EUDns4G'*uc#((bRf-3;endstream -endobj -% 'R23': class PDFStream -23 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 396 >> -stream -GasJM92EGZ&;9M7nfR#HEX9,6=#_Df$'5KXE2\G[`-n;S/nlg.k@9ts'dSHKq62*iI(N$;_P-42HJmB4H:C127H%$1edIt2tJWh&.q;uNQpsidLI^<K\RLf4RQ"E9<_D'YF`tB102RBB],P$hb`31&4mZVL:[U32;sglun:)C`\NiQG>$u;o8W9!'$WE%(Th84*=T&LP8?lkf,jg?*kt`'.[[endstream -endobj -% 'R24': class PDFStream -24 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 365 >> -stream -GarW4b>,r/&4Q>UndfqI=JTG>r!5pu?,<8n"ZtcjmK;QJdN\5W3/1$/+^89sQ-[Yo!K'CC\*8HJLZM,n8@T*3(C^%gH^AC6H'U2l@HU=A6D(S$L`]Bk?o5^m=?Jado[EPi/qE0jG@U5jR)\OSqgLbGYMe9qY0V&3'7j.\OfS]<>*s=O.aOE]EU$oN\fe;iP3cW5jDZ&^%e,eS0O&Lkgr$eo-]:IQq'E>G'OFVgf,:B3u3ECi'~>endstream -endobj -% 'R25': class PDFOutlines -25 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 26 -0000000000 65535 f -0000000113 00000 n -0000000245 00000 n -0000000410 00000 n -0000000626 00000 n -0000007026 00000 n -0000013609 00000 n -0000013785 00000 n -0000013944 00000 n -0000014328 00000 n -0000014712 00000 n -0000015097 00000 n -0000015482 00000 n -0000015867 00000 n -0000016252 00000 n -0000016638 00000 n -0000016776 00000 n -0000017047 00000 n -0000017207 00000 n -0000018850 00000 n -0000019386 00000 n -0000019958 00000 n -0000020490 00000 n -0000021019 00000 n -0000021557 00000 n -0000022066 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\223\367y\354\321\362\222Ju\262\315V\3448<\372) (\223\367y\354\321\362\222Ju\262\315V\3448<\372)] - - /Info 16 0 R - /Root 15 0 R - /Size 26 >> -startxref -22118 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-040-colors.pdf b/z3c/rml/tests/expected/rml-examples-040-colors.pdf deleted file mode 100644 index fe90b4b7..00000000 --- a/z3c/rml/tests/expected/rml-examples-040-colors.pdf +++ /dev/null @@ -1,139 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.0086924a45e007495af99df70126eb1b': class PDFImageXObject -4 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 197 - /Length 6121 - /Subtype /Image - /Type /XObject - /Width 309 >> -stream -Gb"/l^Q0\[&]ap8-\i2ucj=5N-F&B2*&rS,^lh8#OU4]pO9j*&8&-nb>+sIunDF=o/>mXT=rr[$BDR%WJ%V4up&1g&Nh&*l4]U%geQ"JnQNZ=Gr;>]n!F(J*G^*p#HHF]L]j@1dnK,0gdo5Qk9Wg(ia2d_)R_X]?tNb24efmBAbN\7?-qgiM?9+l[j9FF.,f.0h,>aJ4T!e!f,pt&fi'8;(*m1jGCFE+ba:p/WDDLQ#8>d_(GFJ\b#3L@5S@_XgeOYG<"LZBEN]52BJs0"[=2T^ATc;!pi#Y_)&U5_n)bcW'Ypt2WsBA[kJ1/7hnHh[okpVZ%6'1+LiGmhO'&U(Aq:iq=]S]>I&TX4;1+ecDtDqI\,X=(=*+\eaf`p=>RcFTS,"6`R&Jf4:T+YbehB)d`n8'gNj$IG<"LZaMQg!6S1u!E(`dM3Dp,Bpe4%o$]AX9!iCu=?ak97=kJIZK29DK(/Qs#rFl9lps.>"get3:*6A1&I-[@:)d#5O&286kk?2\2nOuuCgcd,6bpNNnP$ErGbuY._BruaKl%)TpiP9%"aA^)pN-oHZ`ojPi"f-J\c$4C3;?07n-P"c)T"%AP(m,lL4Fp&l7m0b(:GC1_Bs!4qMj;0["-+O8K&Aj2!!N@&Q1lCcA(kq0>;`.`V5JfqR`A%GP:;&l6`u)A<_RlI'WOl25L34n+?PD@.?ogLaX:BSta@rSn/_tiRA!Wu'H>9A6-h:WLWrkgr3h>G7\r`4KOYJ34*9u0eUm$Tf)q=>%5;Yd<_rj2k?kMs#RlLOS*msu,EVn^O2.0i%j4E(&/n9lq;6r.I0hIc:O.qCO=V.e/\VlU_ZBk1P"pQLL"fl_,&1F]Z7X\^Utk%s#65I^q^7?pdd;5NRC.8ACV1Xo65@9]F/Ufhn"`K&c_pl6Ia6d*)C(M7+=;(e(-,42XJhV@YMWK?Kdp`NS6Vae68g>)Ds/=r8"\P2"@1qD4uT2()BO.@/VcbB1OWHp0H*W=K>`A@)cAMS7iJ1o>_*bb^?`=1S2UMX$F.#Va#;(e'B^q>/9DjQN^@`RGTpmr\Ac"AQC/F5K4-L4l=YHBSsOO+6!af2%g]lDfd46S.`"q497efY+daX[@8,$g]00c&G7\_@o"Kc,46qqsR"._!U0BrYm6l?T3TQV$!&.rr&@8(.MD5#jEA@5qMjrMH0sqTrr1*]T=Fp-TD+iQMu:3bhi$%":EcI!GVrJQ^*Pn[KCS@>/1%:g#^BB$(pDaCpA#NFj^3-$^l_idh2_Vjlp<-eP<-#!ep#K%9]_r?8j5A:,e!u4a]Le5e:nGV4kUgoH7G8s;M^W%rStJ.G``4R]P-fT*X\pFq5&lHZW*f=W"c7-N3l4f)3EO2O$1aE,:<7HNr^J2,&(bSo9Md5E9dWfdl`IVrT/#^$AAC\W1JGV&0;@A#]-2Rko+E<7XU.d/1*toY((kdfMAFZ20Xq3CQ:'HCDE[`YT.18mh\psIZ?piQ'CGnrn_cc^`Z/i9H$ZTN:K!o?M6iAg)G*VN%hCl!)3Hg,(Ss6=M&.(;SD^uhR'uV]F2cbjB45L]S9-<#dN#XdAfUF_b!=p\)B+bqo_l0V8eeV8Tb"%GJal;]0f]FA.6e:1:He*NYdHbS@4M]aENCqRKd+iH.>i6N?bjT<9r9DQ",ZE=b/eC9#u.C.!N+^u>(jV'PXhPUA3Y?TPnl;^Fuojs[DBDV$p1I:*NRl#0tY6oT+":IoD0h-<(2qkf[h9aY]T,7?U&oH-V>NK!U2p:$cr;gVpKtW*iaOncsP1V34C:Z;/UHQ$7"P3t._eul7^ZG6f435R$T2@M'TWZBAcW]S'A*Z$NDc;=_a_9)[q<(FQD)THN>"?!FgU_-`+kKI(b3n2'1BKdm2T>ueR_-><7!Yc/_'/\%So?(PU9X:T$;N4.+>]fbsea[!]p0OTW'_UiDV@Tg_teOP.85=DiPTCecsWUOrUiHJl!I,JIdGS>."hN(`cgW`o8q/pU3$4hrI0q6SHl!r&gLbAk?seYiV#ZV'a]0UrZ\(a[]7Z8\n\lgp)52-#5=DE>5')se\0@.F74$stC#^!-q2>X/**U0gi=Zf$\!XFW/1DtGc^-njf<+q)#Y9Am4_C6uF`E6HoP.,6[#*jaG<7b`@8ASR#d)&lkQiF*&kAOE&<"WjhuaL0G#-Sft"P6PAJ:RtRQ*#t#k)r%kq-.W8We>(J+*XgB_hc7WOna8!;Xduhq2Tc'`lWA%E8Ji;@'(lApkQ`:$GZRm6nF2cNm^<;d#-METQV(d*PhTb[ZZ&k,7)2]aW8AYBi:Au;"6OO;KkH.A!U6Sqn8JLVGIL@?nQ6+T[`cV9]AFB'Uja&+6jlO71pTr4nKbMXggi?&p4][JK5aC9?Hh"W-=-hAgKQ$bjt+.mF_&`(AI2E"'uH4C^hZBk^C^Mg:\C2$6?8bX8Mbgh4#h-!X39#-8p+Z)AYklfHcAuslfo.AZ/YgaK`mfYV;YS3ULC`A=&h>.>UHA=JJI'bpL\X=Z-1eR[*HN08.iRVl]8\.ctFmo\m:JGiJDM[)g,iPLEkOHjl9.T)(t#B-)9CVQDmuNMM'gDkqmg^$]?S&^(dPUVt7cD(.i^9MkeUt18.G0?G["L[kqH*;akRCI;Z@GD-QO!pOBWZZBSlOPtOtGJr`OXVh.0;XA>_E=&hk&9soY]\#;(Si;35/^6..cr66]of]b;5LDH1+:UbRqhE"8V+M&l(djjg.ieX`)#Ue,th5G3SVlNgA3m=(gLSTJ:iI&./:5qW[;E4h>bg;\qC6NY@bJrt.Gk>t*Lp'g<9Hs&*WsQnMi;5)TSuLO]O"NO%'7@@N3hBZ?BIAR,WY:Zsa*H'.QX2%&LsO)q80Ii1-7aFr27#iN.c,SVrfCTGK[\t/Um73ZhgcpgN3A/P=M0`PF-'9NO)KHaq$#Q$87Ab+8>YEC%tas\Q\E;dfQg#pf_,5K"E2a=tRcINl>,CBk6Be$lZ-l;ZbjhHn*MbkC-oS&/^oq/_SEAIA>;EAPRj<(3GpsNqqK[37#Jna96/;%JgN.qjaLV&JBWApQX=WW&,8U\9E%JW9<^@Z#rj!%HSb.,TE-e&bS7L4gj],Z(Y$T'gY*,;q`.MN$E7;/%S5E-QUu[k12@fb`PAlcJn-)lu-5Doepn;9uST1[CVFiXXACO3Z^qmdq\?PBM0`[.\j7]ASi8B*,l]uZhM%-A\VkA?VqbnMSnEIB($^_4Dm8",*_3[BmmO>CAoGl^ue4Kh1Kh^":^'7P4l^mMfi8A\4iff:Y$W&dmrM^8jpsqSS2W/IWDL\Yg%fULjb"b\4lShG"^U3Fq^&`u[ES]Ui0G0],T,'*gS#!mV[Z"Ch%QO7-_KHNh>?ktXlF8*s#:d+'OXU[>c>dq3HXP_+d:CFtSVdXZTW12TAZiD(nVBP^;YM[E>#?6I]fH^p4YRP"V2G&P5D&K`Z*H:M9L>WhZ@2f7X51:(u_W$uuaeo,*K8ddo%a=M/"0FQVHAmpl[/=pP]3;?07E!s"V%06^+BaATbnOu<;Kh^"RDHlFumNGsR2U`5m!pV,-Y1b>54#d^a,)Vf0[Mq\uG$FoV:)M20oE&\r/JMe+2T&"nX\\H_NGO?o>"j_]\D*=oW\Ft!/U6eZ2QOhKCq&>*fPFTJk?2\rgNNRUBaAT2QT_dZNG/Y^_!UD\M))d6@Ab08/AeQ-~>endstream -endobj -% 'FormXob.c8ba08e347e6847214d84c863a661d07': class PDFImageXObject -5 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 45 - /Length 6345 - /Subtype /Image - /Type /XObject - /Width 2008 >> -stream -Gb"/l^M@+F(_PS==SM+pNL-W1X)>0#dm+i=er1NUi)1\Y4hpS?,j08h(22fF0%]DBg`B,1jTzzzzzzzzzzzzzzzzzzzk[`]qf;lL_m>oGng:FS8q+e=j5Q,n@fi@?+-A+3PQIl2qd,\3IgA4:UZTq_3I9s6/A#Wsz!!!#BkN:Sj=)L,OXrS7I$B5_fZ<8ig+dHJ+9kj2/3Ne[D!p+'>nlY+sGBg?G;Y=\fqz!!'CG[qcS:l^Q"Dl"Fu(&Su=.'X_gHq!U=o5#p^be'WQfLgI9pjZ^&.RS*Ehg!s=6[/J,WX\1@Y[\('9>6t90z!!"h&C.5;;=gWc3nW;=i>\,.,a](-iK\#;S4FXH@lQemrC@=,Q2dX";0-nYP5;&W%LY1.R.%LFRi,.nmE)Ql&%I=I?S2(*R,[U3.ai"33V=4:"]Bp3T+Q2*e`$2l5&Q4=99/M6o4YuHM-p`bO#N>=1!aAG*q?4TYgU>CrBk9oeSd9J@2-6HbDIa\0).-Nn(K1Q3G<+ZUpd!J2]c#?iftl4@TAOtlq;;0XlG]aOq\Lp-20L-4,(8i*Aopo(3>8QLPV@UR@BrBq91>,:(SEoW_CHAL3NMWPOmeHRm&/q&Jdp2W:/;Q:3cV;Wz!!'fSAW.;'\I(:a4rQPMd-s;r8qRmUoMR"B,LgHiBLZ^N^YZN7rM42mKF`CA1+gb)%#=JpT[f8"QlUHVrJK1?269.AT[0^>&^?'4*XSh]*dkV\jr;TPp9\,[R&`jU=`ZI4(KW*l=1>4'HRZMR.*%]2g-B>TO@\]cDOGGqUh)IObZh@9\nr&6hIf8X7t8pu\GUH9n3Og;oPn$&nNKK7As182V32QWiEB?B];9.=<4a]hQWO(kdM*"k:"o#XH4nML"onW'!!!!YBllGAj.3t:B[_b=IH1:Pj^Q+El%mfKN44GFLujWuK0A>daqc31U8[!W)%N@;N`Q`\f!`f,@J=2fI?&&4o36Y%q8S1gaD$NY*B`MDTbnl&!LmK!^7<_;8SS^_DH0*&`%mS`*9ZYF)D,&n"/+<#N(@C;MQ7>%"D)A<]?P>mdUe@P33sKris!,"D(10X8E+J7P.h%g1B6PR[Kdb+)%!`]WhM!;8\OY#XBQ(K2QW+A\bl;`2KY*(V(^%KL^X+b6M'H^h\a^q=rKFgHU+bUCnBH:[)L&-FW(T+I$3>KQ!)4.PK?skHiYpj54+gQHZ^O_72tK>0<'1P3M&l@8GJN'n:fP]-fAYA4=[.)mmbI.4t-U]EOL9@5sBF/cG]E9Wl?V8Xp>Y#U+j463s9]bP8]`.B&I$r4DMN)s*'Y26g=a*:NPqdB7KBptHBZY8nWLd,NIYiVpdae(pLf^f$DYt89-==Js'B^AtHKFgHU+bUCnCEtLVqk,H;^#![J)YQo7XdnIUmlhh"CO!8!7Y[2^3F84]W];bEC2V9".V#obh:hAJ[VB#l/82/(9+/p&FE2d#4]NN(F#Ed+VrTl#J008b)=+m+b\(3d::/JOS!G(A%q1\k3f%GcMTo8>@dhA@K`+g!9c"R.n#TNlpEXc9[tKA/u;hXUFlC`XV3r<7ic63n`f&4.aC>+0Zia3^nY^D#hQi%^VjfqUa[=DN/h]8W]3GYP[=WVLI-YH0i-e=X1Da]35QW@P@NhUo34h'/tr9#J*4q-#XJ$e4\*Wo:.Q+QkcIJ04e7XkK&jV5d\Ll"lbt>9WS&l*JK[GU"M3ofV,^iJ.q5J<*h@g:c3:G/1r2S[I<=MjEo:g"ekL1*C9\T,J^bb7;fGknp;J=4goL.Z"g*#U+j463naA>ZK7c8,U)I^i+7.7RV!;9G.MAD_u-@G#6_Ap$>_$4.i+N0+CjhN%iij/=WN%Bip'11ojI-1"!!UGj\uX6edjr]s[[]Lu45N4e4:U*:Pb5K;3`oR<9\-O`=lQNjV\-*@p"q;pLC3:]'$jbrS$SA;WtmUjH[@)ihMcX"oI,OAEXJOd0hQFD)s?9=$\GGYXE,#U+j463n`f&6cY]F27S"^)@XN:F>OP!jt8.m25im(j8a/(*h@NCeO)6[h38>qMe4!g'XtRX3o`t(uAQ\!uh?)^6,*pPJmM@o=9f\m:a4GTP9gV[)uqL\&RM!K`7"""+H[KP42O&!)-)4[>E0j%=`Hj$b=8P+HTbW>'oXb&>MmhLU`c)Rm`":#s5KlT&-'g7n%RS+&?biT^[K6nH8=,H*oB'CS2Vn""`7/Z!2]XtD(DEZZ1E^bb"iT9)mfJ9p>XNo"k(n#nr9b5A]HPT9q7"#)^5P2KFgHU+b\3'b-n:?5.kadCt+X#ps2q[P8gsbM";^YV^XDq[.`5!VdUdG?)j;HAaj5/_LG?;4fP55D"H>Tb_@u%T"i(HSup8Pn$>8XoA$dLD5AuYo?@:`cA=U41rr]lhr8B;924HoMc6O[YkaF1eX2#RY6ADt/=^/63BG_O7SU5QkaruPf,]$pN5oMBAJo?LCI02a4lO+qhEf4[J'?tVQiI*dz`s*dQ8lSJ8i'5iAn06#i^5WE9_2@mh_iOPtZ?T4kBn5SuC?[gc0(g:sC04'h[sJ_tGO0F1cXU2aa,\q6WU;*T1uD5kXR^djXR\g5baE/T3,q^C'I/gMX_`cnHZ?IagIE@[q=&l]q,LUYF2,_onh)lg>4=WU[#28Od>C.SjPTZ(3el'_hgGTsnGNgsz!!$+Y4Rp#1(=TQ&PU<;j*P,D`4%6Tu6>8cmK;;2%F'*aaL@]$/`-H*kFpW`=*1[GXh)<5&5ka(R&r+B"6W7@.qo%[2CrDuB9OeV"g+z!!!",Q20C:?U+I!4#8V:SA-@7Oe5.u3TRV#CW?A(MQG5gU/$`IEe+^PCZA2&McSo%h1`t=sq)8k+5O;H:FsugiHj7cU9Vr[W(n.$0aMHQ*LA;]stY!]smb5p!9ui=atndmJVs0WXaDARtQEW%n^?&>rqdb#YtKGJsKi.3M>2WSR\HQHj-,b@?#'a82!OD#=g7C7XI?jIP/CSJHl/TzJE=)KJ!_;@B)&;FBQ8lsYHmcp3@Dto6or%&)_5D^]*b@3/l%nsI.d$%,/"?]q;(cu[i\!i]/g\hkfiBmd+'58OpRa'BfY"M21:q_5QLibzJ)@BDpR~>endstream -endobj -% 'Page1': class PDFPage -6 0 obj -% Page dictionary -<< /Contents 10 0 R - /MediaBox [ 0 - 0 - 612 - 792 ] - /Parent 9 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R7': class PDFCatalog -7 0 obj -% Document Root -<< /Outlines 11 0 R - /PageMode /UseNone - /Pages 9 0 R - /Type /Catalog >> -endobj -% 'R8': class PDFInfo -8 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20000101000000+00'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R9': class PDFPages -9 0 obj -% page tree -<< /Count 1 - /Kids [ 6 0 R ] - /Type /Pages >> -endobj -% 'R10': class PDFStream -10 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1002 >> -stream -Gatm89on$e&A9%PIi+u:H@oLWPc:i/m@d645d:@$>9A1D$RLdKFX9nYW-J:04%%\-DmG'9+HRmHHo&Z!O,oSLk`YpJZiIkCi6AY4)8`BTW<*7()u-Y+cT]Zf*Xb92N.j$C%i>=f?Y:6B&dqgLYdjQukbE%m#!pA?n@NCn*A1am&$0(ZC*oWM<)Ja60U&0X'Tsb`REs_p)r(@/nj&!fc9e@-KL-q6Mfb4qAX*N=`gFphhOF?-f%5hsBOW0<,`\*u6=3_CdTh\EQR]g2]"FF?nDWP_#]:MfbU#'*>Y-Ir]JW!mRjES]@#%3X1-(YX`gf&(N!qD%cDLnJL$g)qpBE+;++-=.-n_&3ZhM2D='6(7tHtZCg488XW*G5Gi7E*."3.-l?a>1=?_B)6hNk6Kd>!=CX%i[_AU*r_62gbL\NfTgbIm>`ZX=G`sGT(1FU;I(/\Jb1*)$`f`;reW[@rY0R^.Q5s\8nnt9L\[F6t>4J@2mqgf-cQ,gMXM`kE)H)`&!%-h+L\*/TqVE>@Z4M]Lg0[A;VsW3?*IKGCKE^//kes3MZ(nATU8k?g%/N*Y6,sZmIP(j:3d.q)NhE-Q_eNa^^.GaWXGOQ[>$F0>]f30.K=@HIfjD,4*i:qs-9);3q/Wk#40nX=[oUrS2l8U8inAhu(sa#P7,+%`t1P^RtN(63Q;2D]+B.MuRYsk-KOendstream -endobj -% 'R11': class PDFOutlines -11 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 12 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000602 00000 n -0000007002 00000 n -0000013583 00000 n -0000013966 00000 n -0000014101 00000 n -0000014370 00000 n -0000014476 00000 n -0000015623 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\223\367y\354\321\362\222Ju\262\315V\3448<\372) (\223\367y\354\321\362\222Ju\262\315V\3448<\372)] - - /Info 8 0 R - /Root 7 0 R - /Size 12 >> -startxref -15675 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-041-masking.pdf b/z3c/rml/tests/expected/rml-examples-041-masking.pdf deleted file mode 100644 index b37591f2..00000000 --- a/z3c/rml/tests/expected/rml-examples-041-masking.pdf +++ /dev/null @@ -1,155 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.0086924a45e007495af99df70126eb1b': class PDFImageXObject -4 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 197 - /Length 6121 - /Subtype /Image - /Type /XObject - /Width 309 >> -stream -Gb"/l^Q0\[&]ap8-\i2ucj=5N-F&B2*&rS,^lh8#OU4]pO9j*&8&-nb>+sIunDF=o/>mXT=rr[$BDR%WJ%V4up&1g&Nh&*l4]U%geQ"JnQNZ=Gr;>]n!F(J*G^*p#HHF]L]j@1dnK,0gdo5Qk9Wg(ia2d_)R_X]?tNb24efmBAbN\7?-qgiM?9+l[j9FF.,f.0h,>aJ4T!e!f,pt&fi'8;(*m1jGCFE+ba:p/WDDLQ#8>d_(GFJ\b#3L@5S@_XgeOYG<"LZBEN]52BJs0"[=2T^ATc;!pi#Y_)&U5_n)bcW'Ypt2WsBA[kJ1/7hnHh[okpVZ%6'1+LiGmhO'&U(Aq:iq=]S]>I&TX4;1+ecDtDqI\,X=(=*+\eaf`p=>RcFTS,"6`R&Jf4:T+YbehB)d`n8'gNj$IG<"LZaMQg!6S1u!E(`dM3Dp,Bpe4%o$]AX9!iCu=?ak97=kJIZK29DK(/Qs#rFl9lps.>"get3:*6A1&I-[@:)d#5O&286kk?2\2nOuuCgcd,6bpNNnP$ErGbuY._BruaKl%)TpiP9%"aA^)pN-oHZ`ojPi"f-J\c$4C3;?07n-P"c)T"%AP(m,lL4Fp&l7m0b(:GC1_Bs!4qMj;0["-+O8K&Aj2!!N@&Q1lCcA(kq0>;`.`V5JfqR`A%GP:;&l6`u)A<_RlI'WOl25L34n+?PD@.?ogLaX:BSta@rSn/_tiRA!Wu'H>9A6-h:WLWrkgr3h>G7\r`4KOYJ34*9u0eUm$Tf)q=>%5;Yd<_rj2k?kMs#RlLOS*msu,EVn^O2.0i%j4E(&/n9lq;6r.I0hIc:O.qCO=V.e/\VlU_ZBk1P"pQLL"fl_,&1F]Z7X\^Utk%s#65I^q^7?pdd;5NRC.8ACV1Xo65@9]F/Ufhn"`K&c_pl6Ia6d*)C(M7+=;(e(-,42XJhV@YMWK?Kdp`NS6Vae68g>)Ds/=r8"\P2"@1qD4uT2()BO.@/VcbB1OWHp0H*W=K>`A@)cAMS7iJ1o>_*bb^?`=1S2UMX$F.#Va#;(e'B^q>/9DjQN^@`RGTpmr\Ac"AQC/F5K4-L4l=YHBSsOO+6!af2%g]lDfd46S.`"q497efY+daX[@8,$g]00c&G7\_@o"Kc,46qqsR"._!U0BrYm6l?T3TQV$!&.rr&@8(.MD5#jEA@5qMjrMH0sqTrr1*]T=Fp-TD+iQMu:3bhi$%":EcI!GVrJQ^*Pn[KCS@>/1%:g#^BB$(pDaCpA#NFj^3-$^l_idh2_Vjlp<-eP<-#!ep#K%9]_r?8j5A:,e!u4a]Le5e:nGV4kUgoH7G8s;M^W%rStJ.G``4R]P-fT*X\pFq5&lHZW*f=W"c7-N3l4f)3EO2O$1aE,:<7HNr^J2,&(bSo9Md5E9dWfdl`IVrT/#^$AAC\W1JGV&0;@A#]-2Rko+E<7XU.d/1*toY((kdfMAFZ20Xq3CQ:'HCDE[`YT.18mh\psIZ?piQ'CGnrn_cc^`Z/i9H$ZTN:K!o?M6iAg)G*VN%hCl!)3Hg,(Ss6=M&.(;SD^uhR'uV]F2cbjB45L]S9-<#dN#XdAfUF_b!=p\)B+bqo_l0V8eeV8Tb"%GJal;]0f]FA.6e:1:He*NYdHbS@4M]aENCqRKd+iH.>i6N?bjT<9r9DQ",ZE=b/eC9#u.C.!N+^u>(jV'PXhPUA3Y?TPnl;^Fuojs[DBDV$p1I:*NRl#0tY6oT+":IoD0h-<(2qkf[h9aY]T,7?U&oH-V>NK!U2p:$cr;gVpKtW*iaOncsP1V34C:Z;/UHQ$7"P3t._eul7^ZG6f435R$T2@M'TWZBAcW]S'A*Z$NDc;=_a_9)[q<(FQD)THN>"?!FgU_-`+kKI(b3n2'1BKdm2T>ueR_-><7!Yc/_'/\%So?(PU9X:T$;N4.+>]fbsea[!]p0OTW'_UiDV@Tg_teOP.85=DiPTCecsWUOrUiHJl!I,JIdGS>."hN(`cgW`o8q/pU3$4hrI0q6SHl!r&gLbAk?seYiV#ZV'a]0UrZ\(a[]7Z8\n\lgp)52-#5=DE>5')se\0@.F74$stC#^!-q2>X/**U0gi=Zf$\!XFW/1DtGc^-njf<+q)#Y9Am4_C6uF`E6HoP.,6[#*jaG<7b`@8ASR#d)&lkQiF*&kAOE&<"WjhuaL0G#-Sft"P6PAJ:RtRQ*#t#k)r%kq-.W8We>(J+*XgB_hc7WOna8!;Xduhq2Tc'`lWA%E8Ji;@'(lApkQ`:$GZRm6nF2cNm^<;d#-METQV(d*PhTb[ZZ&k,7)2]aW8AYBi:Au;"6OO;KkH.A!U6Sqn8JLVGIL@?nQ6+T[`cV9]AFB'Uja&+6jlO71pTr4nKbMXggi?&p4][JK5aC9?Hh"W-=-hAgKQ$bjt+.mF_&`(AI2E"'uH4C^hZBk^C^Mg:\C2$6?8bX8Mbgh4#h-!X39#-8p+Z)AYklfHcAuslfo.AZ/YgaK`mfYV;YS3ULC`A=&h>.>UHA=JJI'bpL\X=Z-1eR[*HN08.iRVl]8\.ctFmo\m:JGiJDM[)g,iPLEkOHjl9.T)(t#B-)9CVQDmuNMM'gDkqmg^$]?S&^(dPUVt7cD(.i^9MkeUt18.G0?G["L[kqH*;akRCI;Z@GD-QO!pOBWZZBSlOPtOtGJr`OXVh.0;XA>_E=&hk&9soY]\#;(Si;35/^6..cr66]of]b;5LDH1+:UbRqhE"8V+M&l(djjg.ieX`)#Ue,th5G3SVlNgA3m=(gLSTJ:iI&./:5qW[;E4h>bg;\qC6NY@bJrt.Gk>t*Lp'g<9Hs&*WsQnMi;5)TSuLO]O"NO%'7@@N3hBZ?BIAR,WY:Zsa*H'.QX2%&LsO)q80Ii1-7aFr27#iN.c,SVrfCTGK[\t/Um73ZhgcpgN3A/P=M0`PF-'9NO)KHaq$#Q$87Ab+8>YEC%tas\Q\E;dfQg#pf_,5K"E2a=tRcINl>,CBk6Be$lZ-l;ZbjhHn*MbkC-oS&/^oq/_SEAIA>;EAPRj<(3GpsNqqK[37#Jna96/;%JgN.qjaLV&JBWApQX=WW&,8U\9E%JW9<^@Z#rj!%HSb.,TE-e&bS7L4gj],Z(Y$T'gY*,;q`.MN$E7;/%S5E-QUu[k12@fb`PAlcJn-)lu-5Doepn;9uST1[CVFiXXACO3Z^qmdq\?PBM0`[.\j7]ASi8B*,l]uZhM%-A\VkA?VqbnMSnEIB($^_4Dm8",*_3[BmmO>CAoGl^ue4Kh1Kh^":^'7P4l^mMfi8A\4iff:Y$W&dmrM^8jpsqSS2W/IWDL\Yg%fULjb"b\4lShG"^U3Fq^&`u[ES]Ui0G0],T,'*gS#!mV[Z"Ch%QO7-_KHNh>?ktXlF8*s#:d+'OXU[>c>dq3HXP_+d:CFtSVdXZTW12TAZiD(nVBP^;YM[E>#?6I]fH^p4YRP"V2G&P5D&K`Z*H:M9L>WhZ@2f7X51:(u_W$uuaeo,*K8ddo%a=M/"0FQVHAmpl[/=pP]3;?07E!s"V%06^+BaATbnOu<;Kh^"RDHlFumNGsR2U`5m!pV,-Y1b>54#d^a,)Vf0[Mq\uG$FoV:)M20oE&\r/JMe+2T&"nX\\H_NGO?o>"j_]\D*=oW\Ft!/U6eZ2QOhKCq&>*fPFTJk?2\rgNNRUBaAT2QT_dZNG/Y^_!UD\M))d6@Ab08/AeQ-~>endstream -endobj -% 'FormXob.c8ba08e347e6847214d84c863a661d07': class PDFImageXObject -5 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 45 - /Length 6345 - /Subtype /Image - /Type /XObject - /Width 2008 >> -stream -Gb"/l^M@+F(_PS==SM+pNL-W1X)>0#dm+i=er1NUi)1\Y4hpS?,j08h(22fF0%]DBg`B,1jTzzzzzzzzzzzzzzzzzzzk[`]qf;lL_m>oGng:FS8q+e=j5Q,n@fi@?+-A+3PQIl2qd,\3IgA4:UZTq_3I9s6/A#Wsz!!!#BkN:Sj=)L,OXrS7I$B5_fZ<8ig+dHJ+9kj2/3Ne[D!p+'>nlY+sGBg?G;Y=\fqz!!'CG[qcS:l^Q"Dl"Fu(&Su=.'X_gHq!U=o5#p^be'WQfLgI9pjZ^&.RS*Ehg!s=6[/J,WX\1@Y[\('9>6t90z!!"h&C.5;;=gWc3nW;=i>\,.,a](-iK\#;S4FXH@lQemrC@=,Q2dX";0-nYP5;&W%LY1.R.%LFRi,.nmE)Ql&%I=I?S2(*R,[U3.ai"33V=4:"]Bp3T+Q2*e`$2l5&Q4=99/M6o4YuHM-p`bO#N>=1!aAG*q?4TYgU>CrBk9oeSd9J@2-6HbDIa\0).-Nn(K1Q3G<+ZUpd!J2]c#?iftl4@TAOtlq;;0XlG]aOq\Lp-20L-4,(8i*Aopo(3>8QLPV@UR@BrBq91>,:(SEoW_CHAL3NMWPOmeHRm&/q&Jdp2W:/;Q:3cV;Wz!!'fSAW.;'\I(:a4rQPMd-s;r8qRmUoMR"B,LgHiBLZ^N^YZN7rM42mKF`CA1+gb)%#=JpT[f8"QlUHVrJK1?269.AT[0^>&^?'4*XSh]*dkV\jr;TPp9\,[R&`jU=`ZI4(KW*l=1>4'HRZMR.*%]2g-B>TO@\]cDOGGqUh)IObZh@9\nr&6hIf8X7t8pu\GUH9n3Og;oPn$&nNKK7As182V32QWiEB?B];9.=<4a]hQWO(kdM*"k:"o#XH4nML"onW'!!!!YBllGAj.3t:B[_b=IH1:Pj^Q+El%mfKN44GFLujWuK0A>daqc31U8[!W)%N@;N`Q`\f!`f,@J=2fI?&&4o36Y%q8S1gaD$NY*B`MDTbnl&!LmK!^7<_;8SS^_DH0*&`%mS`*9ZYF)D,&n"/+<#N(@C;MQ7>%"D)A<]?P>mdUe@P33sKris!,"D(10X8E+J7P.h%g1B6PR[Kdb+)%!`]WhM!;8\OY#XBQ(K2QW+A\bl;`2KY*(V(^%KL^X+b6M'H^h\a^q=rKFgHU+bUCnBH:[)L&-FW(T+I$3>KQ!)4.PK?skHiYpj54+gQHZ^O_72tK>0<'1P3M&l@8GJN'n:fP]-fAYA4=[.)mmbI.4t-U]EOL9@5sBF/cG]E9Wl?V8Xp>Y#U+j463s9]bP8]`.B&I$r4DMN)s*'Y26g=a*:NPqdB7KBptHBZY8nWLd,NIYiVpdae(pLf^f$DYt89-==Js'B^AtHKFgHU+bUCnCEtLVqk,H;^#![J)YQo7XdnIUmlhh"CO!8!7Y[2^3F84]W];bEC2V9".V#obh:hAJ[VB#l/82/(9+/p&FE2d#4]NN(F#Ed+VrTl#J008b)=+m+b\(3d::/JOS!G(A%q1\k3f%GcMTo8>@dhA@K`+g!9c"R.n#TNlpEXc9[tKA/u;hXUFlC`XV3r<7ic63n`f&4.aC>+0Zia3^nY^D#hQi%^VjfqUa[=DN/h]8W]3GYP[=WVLI-YH0i-e=X1Da]35QW@P@NhUo34h'/tr9#J*4q-#XJ$e4\*Wo:.Q+QkcIJ04e7XkK&jV5d\Ll"lbt>9WS&l*JK[GU"M3ofV,^iJ.q5J<*h@g:c3:G/1r2S[I<=MjEo:g"ekL1*C9\T,J^bb7;fGknp;J=4goL.Z"g*#U+j463naA>ZK7c8,U)I^i+7.7RV!;9G.MAD_u-@G#6_Ap$>_$4.i+N0+CjhN%iij/=WN%Bip'11ojI-1"!!UGj\uX6edjr]s[[]Lu45N4e4:U*:Pb5K;3`oR<9\-O`=lQNjV\-*@p"q;pLC3:]'$jbrS$SA;WtmUjH[@)ihMcX"oI,OAEXJOd0hQFD)s?9=$\GGYXE,#U+j463n`f&6cY]F27S"^)@XN:F>OP!jt8.m25im(j8a/(*h@NCeO)6[h38>qMe4!g'XtRX3o`t(uAQ\!uh?)^6,*pPJmM@o=9f\m:a4GTP9gV[)uqL\&RM!K`7"""+H[KP42O&!)-)4[>E0j%=`Hj$b=8P+HTbW>'oXb&>MmhLU`c)Rm`":#s5KlT&-'g7n%RS+&?biT^[K6nH8=,H*oB'CS2Vn""`7/Z!2]XtD(DEZZ1E^bb"iT9)mfJ9p>XNo"k(n#nr9b5A]HPT9q7"#)^5P2KFgHU+b\3'b-n:?5.kadCt+X#ps2q[P8gsbM";^YV^XDq[.`5!VdUdG?)j;HAaj5/_LG?;4fP55D"H>Tb_@u%T"i(HSup8Pn$>8XoA$dLD5AuYo?@:`cA=U41rr]lhr8B;924HoMc6O[YkaF1eX2#RY6ADt/=^/63BG_O7SU5QkaruPf,]$pN5oMBAJo?LCI02a4lO+qhEf4[J'?tVQiI*dz`s*dQ8lSJ8i'5iAn06#i^5WE9_2@mh_iOPtZ?T4kBn5SuC?[gc0(g:sC04'h[sJ_tGO0F1cXU2aa,\q6WU;*T1uD5kXR^djXR\g5baE/T3,q^C'I/gMX_`cnHZ?IagIE@[q=&l]q,LUYF2,_onh)lg>4=WU[#28Od>C.SjPTZ(3el'_hgGTsnGNgsz!!$+Y4Rp#1(=TQ&PU<;j*P,D`4%6Tu6>8cmK;;2%F'*aaL@]$/`-H*kFpW`=*1[GXh)<5&5ka(R&r+B"6W7@.qo%[2CrDuB9OeV"g+z!!!",Q20C:?U+I!4#8V:SA-@7Oe5.u3TRV#CW?A(MQG5gU/$`IEe+^PCZA2&McSo%h1`t=sq)8k+5O;H:FsugiHj7cU9Vr[W(n.$0aMHQ*LA;]stY!]smb5p!9ui=atndmJVs0WXaDARtQEW%n^?&>rqdb#YtKGJsKi.3M>2WSR\HQHj-,b@?#'a82!OD#=g7C7XI?jIP/CSJHl/TzJE=)KJ!_;@B)&;FBQ8lsYHmcp3@Dto6or%&)_5D^]*b@3/l%nsI.d$%,/"?]q;(cu[i\!i]/g\hkfiBmd+'58OpRa'BfY"M21:q_5QLibzJ)@BDpR~>endstream -endobj -% 'FormXob.d3978b56135cb5caeed35afa6997b17c': class PDFImageXObject -6 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 200 - /Length 2893 - /Subtype /Image - /Type /XObject - /Width 400 >> -stream -Gb"0WCQB`@)$&T2F\cAAX$PAZmcVEJ44Po%+#=p4k1e)mh0qTTIaulpW9!@5Ft!/WN+;<0P[D,2'M?*smr-XX@\[*0S>*RReT^lg/)'AHP9bg?F'GdFhHJHkK(.]+\%=Eo_B)M%YkqQpnt1=(0H(?e`(/95KWURe8QIG@1t2ghs,gY[jb^8NHS/#Wg?F9=g\F9u?1>aa6&:2H,RNiIS[[eAonZ\RKkeW.PJc>a@Q.n840R1\2@gKXimkf!_olQYBPcGTDU/SkHf>ajI;u:PXuL]L6(Fa^.$ia4bHoF$eA@SVn/KSZnaP#UCj4%#kbhV(DLQ4t$iKMTQYWr;JX=(6G5H$)JAEm+JnE8$b(%uuqTD^@\`lV*`H.6d.3>!XB6M]++OmAMc]/I%.\#Gse(X?Mls5KEZXMPuedg/HY8RoUT8liPB?(=WrIpZBCjtVKnZXqeb3PRr:6UYB@0+o;=1?0jcE8E!?(/O)l1+ODg]N2FTjI39G'i4$`M_BGps(,kOX,$tK#@Qd=]P(\X8,^p[M?:cAj@.`*J6r6Z@DQ+PdmIj35ZN!4R]Y;qm=Jp4al2.lWr8hJM(kRJoEkH]\9eW+1EQ,rcb1S/*@gF!]YjlI>34pqg@*V?,>C*tQ#(r392-K[oYH>=9oYJNoIlSB,L7hsr`N(=Ap`,0>Otc%pkM!*ES9Cls)0mQpbgiFBEXY7OC7`t1))k0;b1#+r*^o1Mm/H[i8)T(SaGD_M)Rc?kUeY+nE!aYVn.ceu-mG?r'W6gT+U:5Q_>C&QSh-=kVm?[j$IN@qg6tILf18l&6s"A$jX,Fm8;mH!<+f*(/)?3k*,MOiB3PXMg.G450(g,frs`q8&,qrVYT\-Cc%c_a#dFA;3\H_53ub.dLg080%1_0GoJI&dCZuY.`>_dki$ur91?[aCo`pSh]d=aV2U9Oen4$>iS%hA_rit$?a(VAZS#K_Hp$WHgn_Rr4q$)oK!fo8(Y[s7\->;A)mrZ-]%.6qiCYCl$rZa$[B'KhO2LnFY_6Q:X:V@9AYZu#ku;B1@utaGMM`IE*#0@?#a>d:/[Z3d^F86^B%]S,"?$iHY:0jKhO&P4DTO#,]MF9qEKb$dD_oqH*]ce@QQE9igCrW2rfCK>W]uFaA>(?cSYtr;;SeUi>q.ek=.A7\1`JK%M]]J]Ws"c/(!`]NWRpDY0:=bBM"Zot"2iAH&>b8U8=s'/[rckE6\4XNWb)=eSU1RI"Xmc79:om?u=jH:+_JNn]TgD_]\k8]ihYStPYbMWOC3Yu(EZ)!kH'L39qYJ*1/hFBpBfc;[iC^RjCI;qJb=7T`=F.J^E'3A0SR@0:P,'ec@VjGR?"K*F_A:D)R7H03WX)E+$QGul5_6j?c&Cr1I)]D_IB.m*h4zzzzzzzzzzzzzzzzzzzzzzzzzzR+Hfgk?fib~>endstream -endobj -% 'Page1': class PDFPage -7 0 obj -% Page dictionary -<< /Contents 11 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 10 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R - /FormXob.d3978b56135cb5caeed35afa6997b17c 6 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R8': class PDFCatalog -8 0 obj -% Document Root -<< /Outlines 12 0 R - /PageMode /UseNone - /Pages 10 0 R - /Type /Catalog >> -endobj -% 'R9': class PDFInfo -9 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20000101000000+00'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R10': class PDFPages -10 0 obj -% page tree -<< /Count 1 - /Kids [ 7 0 R ] - /Type /Pages >> -endobj -% 'R11': class PDFStream -11 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1299 >> -stream -Gat$u95iQE&AACjJ!euf_4'IY,dk[cbs%4uS('^tcjM/IQI`@;;Gug3b`DkE%u\b]$ZNG*\$lb_LZJl1,SHDen:#Y.nb)Gsl8UI2FIWq#lVPFk3$JB?">%$$p$`!ihs@eP*D$/KI'ERHC=[<2q(F;&B2HjJVbBWRH-/Aj"'VRhbiQgugX^QD6o8RR@T&?rfHQH4kTg1`p$!.o;NO:C!C@IF&d+(*VDn\&Ls]J$X#@n`<'_QL.nQZP:a8/$Bo;7-9e]"*&J0p5JoCj))@[.i,pS"M*l'L^%LtTE;Ae960?'+gBK4$eH9Fq:q@T[gClU$�K:;OORql"F!XcaO_rhVs1FO"XD`NN',RDpi2*q'1A'-@JVbLM72>!LqEqp!d0SScrQ?+Vb.T^#t6h:_.]*njm%oj/$,ejJ?*]NRJW._nkAY[-Fn[nZ:`?%JQuj/V]N1UmKIo_TAHAX/S_3cCKXkCWid/UVqi$e\G])Mb>qL*uKFRWl`.*&$%Eg%sB,^O]Zer=pC4'.1>JQJ9J2`G,*h*_#J\rB?-ESn2nE]&#a2ZB'2t%t3.!Ef7fNj^hA=*DpF8<$HVTfSr7;3KRoo,)WBBI$K\BZX#GQcRW3E`VCj&a!-i8#7*on"Q!@Y*0V<,!\t"oX&n5nFkBAL[/T;8:d9V,D;@,oMh,nINijEcQ.YNjUI&=Q/*UJ/:?Eao@4nEkLsnZ-FNd)T=+@`kDW,[&l[lpX`7`27Ka'2gfJ@HthKC2rS(a/>8S8:k5'AGV#XK0?$+-tutbh!0SI&J+(MI;uBeM_rY@L'BFnh]fK8p8c%Mm,^@3P\Kq76>+h)f34`+&&3Nmre-AnLP!-XpLEtmVZ*7o^<#L?bkuuL!,DS!;[C>.f~>endstream -endobj -% 'R12': class PDFOutlines -12 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 13 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000602 00000 n -0000007002 00000 n -0000013626 00000 n -0000016755 00000 n -0000017199 00000 n -0000017335 00000 n -0000017605 00000 n -0000017712 00000 n -0000019156 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\223\367y\354\321\362\222Ju\262\315V\3448<\372) (\223\367y\354\321\362\222Ju\262\315V\3448<\372)] - - /Info 9 0 R - /Root 8 0 R - /Size 13 >> -startxref -19208 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-042-longdoc.pdf b/z3c/rml/tests/expected/rml-examples-042-longdoc.pdf deleted file mode 100644 index 6a156eb7..00000000 --- a/z3c/rml/tests/expected/rml-examples-042-longdoc.pdf +++ /dev/null @@ -1,445 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 6 0 R - /F4 8 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.0086924a45e007495af99df70126eb1b': class PDFImageXObject -4 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 197 - /Length 6121 - /Subtype /Image - /Type /XObject - /Width 309 >> -stream -Gb"/l^Q0\[&]ap8-\i2ucj=5N-F&B2*&rS,^lh8#OU4]pO9j*&8&-nb>+sIunDF=o/>mXT=rr[$BDR%WJ%V4up&1g&Nh&*l4]U%geQ"JnQNZ=Gr;>]n!F(J*G^*p#HHF]L]j@1dnK,0gdo5Qk9Wg(ia2d_)R_X]?tNb24efmBAbN\7?-qgiM?9+l[j9FF.,f.0h,>aJ4T!e!f,pt&fi'8;(*m1jGCFE+ba:p/WDDLQ#8>d_(GFJ\b#3L@5S@_XgeOYG<"LZBEN]52BJs0"[=2T^ATc;!pi#Y_)&U5_n)bcW'Ypt2WsBA[kJ1/7hnHh[okpVZ%6'1+LiGmhO'&U(Aq:iq=]S]>I&TX4;1+ecDtDqI\,X=(=*+\eaf`p=>RcFTS,"6`R&Jf4:T+YbehB)d`n8'gNj$IG<"LZaMQg!6S1u!E(`dM3Dp,Bpe4%o$]AX9!iCu=?ak97=kJIZK29DK(/Qs#rFl9lps.>"get3:*6A1&I-[@:)d#5O&286kk?2\2nOuuCgcd,6bpNNnP$ErGbuY._BruaKl%)TpiP9%"aA^)pN-oHZ`ojPi"f-J\c$4C3;?07n-P"c)T"%AP(m,lL4Fp&l7m0b(:GC1_Bs!4qMj;0["-+O8K&Aj2!!N@&Q1lCcA(kq0>;`.`V5JfqR`A%GP:;&l6`u)A<_RlI'WOl25L34n+?PD@.?ogLaX:BSta@rSn/_tiRA!Wu'H>9A6-h:WLWrkgr3h>G7\r`4KOYJ34*9u0eUm$Tf)q=>%5;Yd<_rj2k?kMs#RlLOS*msu,EVn^O2.0i%j4E(&/n9lq;6r.I0hIc:O.qCO=V.e/\VlU_ZBk1P"pQLL"fl_,&1F]Z7X\^Utk%s#65I^q^7?pdd;5NRC.8ACV1Xo65@9]F/Ufhn"`K&c_pl6Ia6d*)C(M7+=;(e(-,42XJhV@YMWK?Kdp`NS6Vae68g>)Ds/=r8"\P2"@1qD4uT2()BO.@/VcbB1OWHp0H*W=K>`A@)cAMS7iJ1o>_*bb^?`=1S2UMX$F.#Va#;(e'B^q>/9DjQN^@`RGTpmr\Ac"AQC/F5K4-L4l=YHBSsOO+6!af2%g]lDfd46S.`"q497efY+daX[@8,$g]00c&G7\_@o"Kc,46qqsR"._!U0BrYm6l?T3TQV$!&.rr&@8(.MD5#jEA@5qMjrMH0sqTrr1*]T=Fp-TD+iQMu:3bhi$%":EcI!GVrJQ^*Pn[KCS@>/1%:g#^BB$(pDaCpA#NFj^3-$^l_idh2_Vjlp<-eP<-#!ep#K%9]_r?8j5A:,e!u4a]Le5e:nGV4kUgoH7G8s;M^W%rStJ.G``4R]P-fT*X\pFq5&lHZW*f=W"c7-N3l4f)3EO2O$1aE,:<7HNr^J2,&(bSo9Md5E9dWfdl`IVrT/#^$AAC\W1JGV&0;@A#]-2Rko+E<7XU.d/1*toY((kdfMAFZ20Xq3CQ:'HCDE[`YT.18mh\psIZ?piQ'CGnrn_cc^`Z/i9H$ZTN:K!o?M6iAg)G*VN%hCl!)3Hg,(Ss6=M&.(;SD^uhR'uV]F2cbjB45L]S9-<#dN#XdAfUF_b!=p\)B+bqo_l0V8eeV8Tb"%GJal;]0f]FA.6e:1:He*NYdHbS@4M]aENCqRKd+iH.>i6N?bjT<9r9DQ",ZE=b/eC9#u.C.!N+^u>(jV'PXhPUA3Y?TPnl;^Fuojs[DBDV$p1I:*NRl#0tY6oT+":IoD0h-<(2qkf[h9aY]T,7?U&oH-V>NK!U2p:$cr;gVpKtW*iaOncsP1V34C:Z;/UHQ$7"P3t._eul7^ZG6f435R$T2@M'TWZBAcW]S'A*Z$NDc;=_a_9)[q<(FQD)THN>"?!FgU_-`+kKI(b3n2'1BKdm2T>ueR_-><7!Yc/_'/\%So?(PU9X:T$;N4.+>]fbsea[!]p0OTW'_UiDV@Tg_teOP.85=DiPTCecsWUOrUiHJl!I,JIdGS>."hN(`cgW`o8q/pU3$4hrI0q6SHl!r&gLbAk?seYiV#ZV'a]0UrZ\(a[]7Z8\n\lgp)52-#5=DE>5')se\0@.F74$stC#^!-q2>X/**U0gi=Zf$\!XFW/1DtGc^-njf<+q)#Y9Am4_C6uF`E6HoP.,6[#*jaG<7b`@8ASR#d)&lkQiF*&kAOE&<"WjhuaL0G#-Sft"P6PAJ:RtRQ*#t#k)r%kq-.W8We>(J+*XgB_hc7WOna8!;Xduhq2Tc'`lWA%E8Ji;@'(lApkQ`:$GZRm6nF2cNm^<;d#-METQV(d*PhTb[ZZ&k,7)2]aW8AYBi:Au;"6OO;KkH.A!U6Sqn8JLVGIL@?nQ6+T[`cV9]AFB'Uja&+6jlO71pTr4nKbMXggi?&p4][JK5aC9?Hh"W-=-hAgKQ$bjt+.mF_&`(AI2E"'uH4C^hZBk^C^Mg:\C2$6?8bX8Mbgh4#h-!X39#-8p+Z)AYklfHcAuslfo.AZ/YgaK`mfYV;YS3ULC`A=&h>.>UHA=JJI'bpL\X=Z-1eR[*HN08.iRVl]8\.ctFmo\m:JGiJDM[)g,iPLEkOHjl9.T)(t#B-)9CVQDmuNMM'gDkqmg^$]?S&^(dPUVt7cD(.i^9MkeUt18.G0?G["L[kqH*;akRCI;Z@GD-QO!pOBWZZBSlOPtOtGJr`OXVh.0;XA>_E=&hk&9soY]\#;(Si;35/^6..cr66]of]b;5LDH1+:UbRqhE"8V+M&l(djjg.ieX`)#Ue,th5G3SVlNgA3m=(gLSTJ:iI&./:5qW[;E4h>bg;\qC6NY@bJrt.Gk>t*Lp'g<9Hs&*WsQnMi;5)TSuLO]O"NO%'7@@N3hBZ?BIAR,WY:Zsa*H'.QX2%&LsO)q80Ii1-7aFr27#iN.c,SVrfCTGK[\t/Um73ZhgcpgN3A/P=M0`PF-'9NO)KHaq$#Q$87Ab+8>YEC%tas\Q\E;dfQg#pf_,5K"E2a=tRcINl>,CBk6Be$lZ-l;ZbjhHn*MbkC-oS&/^oq/_SEAIA>;EAPRj<(3GpsNqqK[37#Jna96/;%JgN.qjaLV&JBWApQX=WW&,8U\9E%JW9<^@Z#rj!%HSb.,TE-e&bS7L4gj],Z(Y$T'gY*,;q`.MN$E7;/%S5E-QUu[k12@fb`PAlcJn-)lu-5Doepn;9uST1[CVFiXXACO3Z^qmdq\?PBM0`[.\j7]ASi8B*,l]uZhM%-A\VkA?VqbnMSnEIB($^_4Dm8",*_3[BmmO>CAoGl^ue4Kh1Kh^":^'7P4l^mMfi8A\4iff:Y$W&dmrM^8jpsqSS2W/IWDL\Yg%fULjb"b\4lShG"^U3Fq^&`u[ES]Ui0G0],T,'*gS#!mV[Z"Ch%QO7-_KHNh>?ktXlF8*s#:d+'OXU[>c>dq3HXP_+d:CFtSVdXZTW12TAZiD(nVBP^;YM[E>#?6I]fH^p4YRP"V2G&P5D&K`Z*H:M9L>WhZ@2f7X51:(u_W$uuaeo,*K8ddo%a=M/"0FQVHAmpl[/=pP]3;?07E!s"V%06^+BaATbnOu<;Kh^"RDHlFumNGsR2U`5m!pV,-Y1b>54#d^a,)Vf0[Mq\uG$FoV:)M20oE&\r/JMe+2T&"nX\\H_NGO?o>"j_]\D*=oW\Ft!/U6eZ2QOhKCq&>*fPFTJk?2\rgNNRUBaAT2QT_dZNG/Y^_!UD\M))d6@Ab08/AeQ-~>endstream -endobj -% 'FormXob.c8ba08e347e6847214d84c863a661d07': class PDFImageXObject -5 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 45 - /Length 6345 - /Subtype /Image - /Type /XObject - /Width 2008 >> -stream -Gb"/l^M@+F(_PS==SM+pNL-W1X)>0#dm+i=er1NUi)1\Y4hpS?,j08h(22fF0%]DBg`B,1jTzzzzzzzzzzzzzzzzzzzk[`]qf;lL_m>oGng:FS8q+e=j5Q,n@fi@?+-A+3PQIl2qd,\3IgA4:UZTq_3I9s6/A#Wsz!!!#BkN:Sj=)L,OXrS7I$B5_fZ<8ig+dHJ+9kj2/3Ne[D!p+'>nlY+sGBg?G;Y=\fqz!!'CG[qcS:l^Q"Dl"Fu(&Su=.'X_gHq!U=o5#p^be'WQfLgI9pjZ^&.RS*Ehg!s=6[/J,WX\1@Y[\('9>6t90z!!"h&C.5;;=gWc3nW;=i>\,.,a](-iK\#;S4FXH@lQemrC@=,Q2dX";0-nYP5;&W%LY1.R.%LFRi,.nmE)Ql&%I=I?S2(*R,[U3.ai"33V=4:"]Bp3T+Q2*e`$2l5&Q4=99/M6o4YuHM-p`bO#N>=1!aAG*q?4TYgU>CrBk9oeSd9J@2-6HbDIa\0).-Nn(K1Q3G<+ZUpd!J2]c#?iftl4@TAOtlq;;0XlG]aOq\Lp-20L-4,(8i*Aopo(3>8QLPV@UR@BrBq91>,:(SEoW_CHAL3NMWPOmeHRm&/q&Jdp2W:/;Q:3cV;Wz!!'fSAW.;'\I(:a4rQPMd-s;r8qRmUoMR"B,LgHiBLZ^N^YZN7rM42mKF`CA1+gb)%#=JpT[f8"QlUHVrJK1?269.AT[0^>&^?'4*XSh]*dkV\jr;TPp9\,[R&`jU=`ZI4(KW*l=1>4'HRZMR.*%]2g-B>TO@\]cDOGGqUh)IObZh@9\nr&6hIf8X7t8pu\GUH9n3Og;oPn$&nNKK7As182V32QWiEB?B];9.=<4a]hQWO(kdM*"k:"o#XH4nML"onW'!!!!YBllGAj.3t:B[_b=IH1:Pj^Q+El%mfKN44GFLujWuK0A>daqc31U8[!W)%N@;N`Q`\f!`f,@J=2fI?&&4o36Y%q8S1gaD$NY*B`MDTbnl&!LmK!^7<_;8SS^_DH0*&`%mS`*9ZYF)D,&n"/+<#N(@C;MQ7>%"D)A<]?P>mdUe@P33sKris!,"D(10X8E+J7P.h%g1B6PR[Kdb+)%!`]WhM!;8\OY#XBQ(K2QW+A\bl;`2KY*(V(^%KL^X+b6M'H^h\a^q=rKFgHU+bUCnBH:[)L&-FW(T+I$3>KQ!)4.PK?skHiYpj54+gQHZ^O_72tK>0<'1P3M&l@8GJN'n:fP]-fAYA4=[.)mmbI.4t-U]EOL9@5sBF/cG]E9Wl?V8Xp>Y#U+j463s9]bP8]`.B&I$r4DMN)s*'Y26g=a*:NPqdB7KBptHBZY8nWLd,NIYiVpdae(pLf^f$DYt89-==Js'B^AtHKFgHU+bUCnCEtLVqk,H;^#![J)YQo7XdnIUmlhh"CO!8!7Y[2^3F84]W];bEC2V9".V#obh:hAJ[VB#l/82/(9+/p&FE2d#4]NN(F#Ed+VrTl#J008b)=+m+b\(3d::/JOS!G(A%q1\k3f%GcMTo8>@dhA@K`+g!9c"R.n#TNlpEXc9[tKA/u;hXUFlC`XV3r<7ic63n`f&4.aC>+0Zia3^nY^D#hQi%^VjfqUa[=DN/h]8W]3GYP[=WVLI-YH0i-e=X1Da]35QW@P@NhUo34h'/tr9#J*4q-#XJ$e4\*Wo:.Q+QkcIJ04e7XkK&jV5d\Ll"lbt>9WS&l*JK[GU"M3ofV,^iJ.q5J<*h@g:c3:G/1r2S[I<=MjEo:g"ekL1*C9\T,J^bb7;fGknp;J=4goL.Z"g*#U+j463naA>ZK7c8,U)I^i+7.7RV!;9G.MAD_u-@G#6_Ap$>_$4.i+N0+CjhN%iij/=WN%Bip'11ojI-1"!!UGj\uX6edjr]s[[]Lu45N4e4:U*:Pb5K;3`oR<9\-O`=lQNjV\-*@p"q;pLC3:]'$jbrS$SA;WtmUjH[@)ihMcX"oI,OAEXJOd0hQFD)s?9=$\GGYXE,#U+j463n`f&6cY]F27S"^)@XN:F>OP!jt8.m25im(j8a/(*h@NCeO)6[h38>qMe4!g'XtRX3o`t(uAQ\!uh?)^6,*pPJmM@o=9f\m:a4GTP9gV[)uqL\&RM!K`7"""+H[KP42O&!)-)4[>E0j%=`Hj$b=8P+HTbW>'oXb&>MmhLU`c)Rm`":#s5KlT&-'g7n%RS+&?biT^[K6nH8=,H*oB'CS2Vn""`7/Z!2]XtD(DEZZ1E^bb"iT9)mfJ9p>XNo"k(n#nr9b5A]HPT9q7"#)^5P2KFgHU+b\3'b-n:?5.kadCt+X#ps2q[P8gsbM";^YV^XDq[.`5!VdUdG?)j;HAaj5/_LG?;4fP55D"H>Tb_@u%T"i(HSup8Pn$>8XoA$dLD5AuYo?@:`cA=U41rr]lhr8B;924HoMc6O[YkaF1eX2#RY6ADt/=^/63BG_O7SU5QkaruPf,]$pN5oMBAJo?LCI02a4lO+qhEf4[J'?tVQiI*dz`s*dQ8lSJ8i'5iAn06#i^5WE9_2@mh_iOPtZ?T4kBn5SuC?[gc0(g:sC04'h[sJ_tGO0F1cXU2aa,\q6WU;*T1uD5kXR^djXR\g5baE/T3,q^C'I/gMX_`cnHZ?IagIE@[q=&l]q,LUYF2,_onh)lg>4=WU[#28Od>C.SjPTZ(3el'_hgGTsnGNgsz!!$+Y4Rp#1(=TQ&PU<;j*P,D`4%6Tu6>8cmK;;2%F'*aaL@]$/`-H*kFpW`=*1[GXh)<5&5ka(R&r+B"6W7@.qo%[2CrDuB9OeV"g+z!!!",Q20C:?U+I!4#8V:SA-@7Oe5.u3TRV#CW?A(MQG5gU/$`IEe+^PCZA2&McSo%h1`t=sq)8k+5O;H:FsugiHj7cU9Vr[W(n.$0aMHQ*LA;]stY!]smb5p!9ui=atndmJVs0WXaDARtQEW%n^?&>rqdb#YtKGJsKi.3M>2WSR\HQHj-,b@?#'a82!OD#=g7C7XI?jIP/CSJHl/TzJE=)KJ!_;@B)&;FBQ8lsYHmcp3@Dto6or%&)_5D^]*b@3/l%nsI.d$%,/"?]q;(cu[i\!i]/g\hkfiBmd+'58OpRa'BfY"M21:q_5QLibzJ)@BDpR~>endstream -endobj -% 'F3': class PDFType1Font -6 0 obj -% Font Times-Bold -<< /BaseFont /Times-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -7 0 obj -% Page dictionary -<< /Contents 21 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 20 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'F4': class PDFType1Font -8 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page2': class PDFPage -9 0 obj -% Page dictionary -<< /Contents 22 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 20 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page3': class PDFPage -10 0 obj -% Page dictionary -<< /Contents 23 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 20 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page4': class PDFPage -11 0 obj -% Page dictionary -<< /Contents 24 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 20 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page5': class PDFPage -12 0 obj -% Page dictionary -<< /Contents 25 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 20 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page6': class PDFPage -13 0 obj -% Page dictionary -<< /Contents 26 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 20 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page7': class PDFPage -14 0 obj -% Page dictionary -<< /Contents 27 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 20 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page8': class PDFPage -15 0 obj -% Page dictionary -<< /Contents 28 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 20 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Annot.NUMBER1': class LinkAnnotation -16 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 11 0 R - /XYZ - 360.41 - 771.68 - 0 ] - /Rect [ 107.1756 - 725.68 - 113.2916 - 737.68 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Page9': class PDFPage -17 0 obj -% Page dictionary -<< /Annots [ 16 0 R ] - /Contents 29 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 20 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R18': class PDFCatalog -18 0 obj -% Document Root -<< /Outlines 30 0 R - /PageMode /UseNone - /Pages 20 0 R - /Type /Catalog >> -endobj -% 'R19': class PDFInfo -19 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121219165715+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R20': class PDFPages -20 0 obj -% page tree -<< /Count 9 - /Kids [ 7 0 R - 9 0 R - 10 0 R - 11 0 R - 12 0 R - 13 0 R - 14 0 R - 15 0 R - 17 0 R ] - /Type /Pages >> -endobj -% 'R21': class PDFStream -21 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 906 >> -stream -GasId>Ar4L'RiR35Ff3jeOXQ;h"E_8SM[b&f(#u"^,V-?]I%X`32QQM*BQMp6`M>^nN$UD0#nY34uBo`$h/9Bf67oWK2i)>7iYS(E4_Rb?KSRj@mDhW@l-gO2([)pc8(,2>JdCoMoQ((^59::'_(3#\2W6T2"D8[IpdE,#>J>\al=cs/>p:i$rWZARJH4GcIhj".3_*a,\LBO=:p/8=B'QP<[j^n;$AQ0`lr'["('42M$f6j,j*l<,,]*0.g3uDP,BeOGfhEf1G6"E.?]@M,i,4!]h;`YkiHI,;U-IQ+n7._Gc,]b;aH%N!Tf?Dl5Wbq\C%>8=T$*]%u!1iPsFuKi#O,-+1Ot\Y$I[H+0)O7g9J`qG,XQZJN!l\Kh7;m>3&BCsZdrX:^!o\I:[oD!/dlU#4lSGDUXI[ru#P5#+qIE#o)>h*Rci4U+Rq$sgc8:d7*ah#qS,OUDk4N&5p>H:M%iOjN@_J1k:i3rS@*G4Y.kDpTV'NRN!#A806HI"M'e[iXfMak.WZ;QSb/XF^H*J%=-E8X:r&_m`#*(c,a$&*ss2&3(!*lA];f^6d&%F-aE31oJ'j-,/0>8H<\IT!71UZ]@0JHiO]b42]P_D7!YQA+5q.PC33L5k""OOFqM:bq_(168perV*WY"N]@W;u_iJ;\-%Qi;a04dW>$$c#,7em.uja`"Um?N;Mm2kl2H\B-5s9pB_uj';CNhn\\]abS-o2U&,%hhG:pq6@>`/CUQ2PA*:$$#\_8ul%Q3-n!&OC)HgQ'cH@@n.3'\D4qep[B7BqK0mQF~>endstream -endobj -% 'R22': class PDFStream -22 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 429 >> -stream -GasJM4&N"M\g0f(,^qp@LQ_cCaHC-%G\?3G,q(@5pSJ1uC96hKUdEm'Z=)2V\?3s6XXpcT+Pfmn;OEZ6"SqF`BinH1mW%smOOVV'mro@K?/g;Q2XT.eUOGX[EAFpOGHr!UPa>e@@+hG3A[/fcVuCsH$R05rikRSf,uo`GqmNgVQ&0:e`m%U$O4d;Z4\(XO)U3Y'6pKKG[gqJ.`ASXT<_70L2pPC=(tk'8\Rf+HLY#SD>6goO6eC(KX5+rYH5lQ"EE^dCg9ahrHNg"QeFM=@A(m0d!(5*;Cc/$)'[^36="Vh'nr/&:OIk!;.u_[8DmLs*f0p+"3mQ&9:AMr\OYK_G]ON$A&_lf80]4XlZ$R?tMe:b(LFLd%ECRkXqC%X4O+4)'7mgF,!BqorDu~>endstream -endobj -% 'R23': class PDFStream -23 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 456 >> -stream -Gat=f92Fk-'SQ4CnfMJa6c^6/a"Nakd[2V(ApL+PihB.El*kJpd^$0l0QVgD@CngU1Vc%[MMm;\nQ*rNLV7)aWPDq8YXUEENTd-Al^C'kendstream -endobj -% 'R24': class PDFStream -24 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 442 >> -stream -GasJMb>,r/&4Q>UndfqG?t%(#pr/EJW[pDAYg((Z7C7WQQ2#`sUlbul.SI3,GNR0jNs):(a1L1.[fP*A&lKm[O=V5WM2.1*?[4PE$ITBPP/>FH''.HP,aF4OXDm(Yg%4F*Q(CI-_A^Z]9LQYOC0-\]@_jr@a&YcL*7rIMV(o8!41gKbI"p66iLPQt1dZst`(Ooc[jjW:Ys3q*WR=ZNmhL'simY7`Vglmr/IXoaYgng>I7/F)N*;r?iJE#$OFG_p.uYFh^OA$fW1iO]ioRO`)?B$S(DfkQo%`UCD2\'&qaAp]U3\!r#cmV.]2a(MBMc[4d_tUM+4AnRO\uts,LB-Vr;UkO2!!=#Sendstream -endobj -% 'R25': class PDFStream -25 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 442 >> -stream -GatUn3D[OX'SLg+rX[It#]8G$hd2P;%29p$Ztk#PJM[1r\ES%@*9j=6_HpN%h2mk,0Z50$rQXJuafahZbCi\!JbGVc]7*^%rJTW4V<#qjm2cE@IR97Q<=)FNl,X8F'[YbdMB]cQ3I(0-Y9Dj6_^J.(jZMP2MfFHoH!'gG42a:Ldo$M@'mMg;%mSh:URUAu$AP2_fP3s0/n0.<41.K6Njnr`JDjh:[_fPm^):3jkB]sWTZ6o:E_7i`,@nZY-&h[J`ku^tL&XqL+,A`!oF\:up2/3Mg;T\XHL&u)6\"`cpWu'YC(\G21endstream -endobj -% 'R26': class PDFStream -26 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 414 >> -stream -GasJM]hcO"&B4B7q&eHq3k/hcr5H`I=kWn@JMg/m(.=Kn%S)(M)Dih^YT3k9oMOgi&-flZ,3EZ!'Qo%qsgTH!B2hK*gYIIs\LjE&;Q1s%UP#NcEj9?-3RQO))Xn3H!$>VKiOGJ@tQ#9N^$Q7],**X_7laV$`.u]TpZ5:!kb?&ot$#^YM;2!6h!Dcu,%IWu0i=rjPm\EWO-+m=;Z->t7NVhp_C!sd.ZiOA?C![#_o5iFpr@*g*QN@'">&At5Oo78Ldb/aUK:mtpETIm9Xp2u#]'W3V:L@+U[g&`OC)aW56!kDMMendstream -endobj -% 'R27': class PDFStream -27 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 441 >> -stream -GatUn4&:)a?3j\ohp=.n@,q#5G55JlPo*Po]Tk3_cGC$QFs:FK"_VH0Nbf#!XA''pShqk6]Tc#26Qo?^Nia;M0@Y`;,(Wl)^NAmn7\'.[5EWm.l^jJS97W^pQXAf_o=GIQ:+JQsbY7cW,Nac5?7R3EIm)mVQ7`63Z"g-U&M?kapNEYWT!hF:bQ_Fku_IG2@h/X>g3JYss/Ir%0n/bA>\lXNW`r'r=P\s`cN/=8I.I'9X]AK=is.?5R%Z_n-&T=^n]5CG>l"?s'4o/1BO5B@I]#RXLUH%Ul4So6qKV6`~>endstream -endobj -% 'R28': class PDFStream -28 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 407 >> -stream -GasJM5B"Cm&B4B7q$q>=%-HoHs)k+h'+@hX\gG7E<^7c2W?8m3dn"2>b*E:I]BAq[8Plm,4KB."bct8A8;4^2AAQ@=GfeFqRO1m1OKR3"'P>iU62pXi)V/K@:RJh53q]O5?&erU4_!6;pUd;K5lQ=^5+5Xi4';qeb"Js[YjAtUBsLhumHL`%"d(TIEPX[IFfI'/mru/cWD"^OMKjR.gpA@@iLA:X!I-R=3b?10lfd-FGmg0&$O62[gkl)K[()/bMtbDktkW&Tq0V,g9ahrHNbJ%gpCmrB_Q4]L*:44[MmSe%B/GS\!H7(omf7jd!_tFof1?C&lJIX9V`8\H1X7mQBDQncf/;F2\91JVcVt?I@[_HZ2q$b+le[7O~>endstream -endobj -% 'R29': class PDFStream -29 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 485 >> -stream -GasJNb>,r/&4Q>Undfqu$3K7-`\3W?\nW%8/D-hZ$UU(C"VRGgj"tUVMGU*.RE(`+Sfu2M:jOcq^ibLW0nC%]-&;`"SD^QoZ]@4A4p>u/:Q[?E003da.5\+V:p)L`T189n[VX&:9[iMH)JFq0gdCaRI\a3Ar'fZ]&6c?R;ClQBd2l>#R3]sNre$$2Qq[`PjYib>7$<_->fRG3b_5&K9@Q#r^-)iS:-Lhk$=B8XhKWho)s8MC+=f+u5-#GYfB>s8Ku^O?@A4BM!D@6IRO8COAfpBo\eq-dAAZ$sj%2])j<^fH'recEt#NR^XH@.*+M"lcrD[Ukf$b@GIPrHr1FY8U*$[[Y&n--ZqDasQ`#!H&]=Xd2AQ*ITabC7?6[da;eu?YjYk"Bhk_Y=aL>[JITk3X>G`Wu!,N;V\V^g&AquWAcEt^cPr%@W^$=&*[cd(]/_GNSOj1lj&8o[$U~>endstream -endobj -% 'R30': class PDFOutlines -30 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 31 -0000000000 65535 f -0000000113 00000 n -0000000245 00000 n -0000000410 00000 n -0000000626 00000 n -0000007026 00000 n -0000013609 00000 n -0000013774 00000 n -0000014170 00000 n -0000014357 00000 n -0000014751 00000 n -0000015146 00000 n -0000015541 00000 n -0000015936 00000 n -0000016331 00000 n -0000016726 00000 n -0000017136 00000 n -0000017355 00000 n -0000017772 00000 n -0000017910 00000 n -0000018181 00000 n -0000018359 00000 n -0000019407 00000 n -0000019978 00000 n -0000020576 00000 n -0000021160 00000 n -0000021744 00000 n -0000022300 00000 n -0000022883 00000 n -0000023432 00000 n -0000024061 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(#\313\273@\256\310\034b\033\034v\302q\222\240\200) (#\313\273@\256\310\034b\033\034v\302q\222\240\200)] - - /Info 19 0 R - /Root 18 0 R - /Size 31 >> -startxref -24113 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-043-headings.pdf b/z3c/rml/tests/expected/rml-examples-043-headings.pdf deleted file mode 100644 index 49d097b5..00000000 --- a/z3c/rml/tests/expected/rml-examples-043-headings.pdf +++ /dev/null @@ -1,161 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 6 0 R - /F4 7 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.0086924a45e007495af99df70126eb1b': class PDFImageXObject -4 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 197 - /Length 6121 - /Subtype /Image - /Type /XObject - /Width 309 >> -stream -Gb"/l^Q0\[&]ap8-\i2ucj=5N-F&B2*&rS,^lh8#OU4]pO9j*&8&-nb>+sIunDF=o/>mXT=rr[$BDR%WJ%V4up&1g&Nh&*l4]U%geQ"JnQNZ=Gr;>]n!F(J*G^*p#HHF]L]j@1dnK,0gdo5Qk9Wg(ia2d_)R_X]?tNb24efmBAbN\7?-qgiM?9+l[j9FF.,f.0h,>aJ4T!e!f,pt&fi'8;(*m1jGCFE+ba:p/WDDLQ#8>d_(GFJ\b#3L@5S@_XgeOYG<"LZBEN]52BJs0"[=2T^ATc;!pi#Y_)&U5_n)bcW'Ypt2WsBA[kJ1/7hnHh[okpVZ%6'1+LiGmhO'&U(Aq:iq=]S]>I&TX4;1+ecDtDqI\,X=(=*+\eaf`p=>RcFTS,"6`R&Jf4:T+YbehB)d`n8'gNj$IG<"LZaMQg!6S1u!E(`dM3Dp,Bpe4%o$]AX9!iCu=?ak97=kJIZK29DK(/Qs#rFl9lps.>"get3:*6A1&I-[@:)d#5O&286kk?2\2nOuuCgcd,6bpNNnP$ErGbuY._BruaKl%)TpiP9%"aA^)pN-oHZ`ojPi"f-J\c$4C3;?07n-P"c)T"%AP(m,lL4Fp&l7m0b(:GC1_Bs!4qMj;0["-+O8K&Aj2!!N@&Q1lCcA(kq0>;`.`V5JfqR`A%GP:;&l6`u)A<_RlI'WOl25L34n+?PD@.?ogLaX:BSta@rSn/_tiRA!Wu'H>9A6-h:WLWrkgr3h>G7\r`4KOYJ34*9u0eUm$Tf)q=>%5;Yd<_rj2k?kMs#RlLOS*msu,EVn^O2.0i%j4E(&/n9lq;6r.I0hIc:O.qCO=V.e/\VlU_ZBk1P"pQLL"fl_,&1F]Z7X\^Utk%s#65I^q^7?pdd;5NRC.8ACV1Xo65@9]F/Ufhn"`K&c_pl6Ia6d*)C(M7+=;(e(-,42XJhV@YMWK?Kdp`NS6Vae68g>)Ds/=r8"\P2"@1qD4uT2()BO.@/VcbB1OWHp0H*W=K>`A@)cAMS7iJ1o>_*bb^?`=1S2UMX$F.#Va#;(e'B^q>/9DjQN^@`RGTpmr\Ac"AQC/F5K4-L4l=YHBSsOO+6!af2%g]lDfd46S.`"q497efY+daX[@8,$g]00c&G7\_@o"Kc,46qqsR"._!U0BrYm6l?T3TQV$!&.rr&@8(.MD5#jEA@5qMjrMH0sqTrr1*]T=Fp-TD+iQMu:3bhi$%":EcI!GVrJQ^*Pn[KCS@>/1%:g#^BB$(pDaCpA#NFj^3-$^l_idh2_Vjlp<-eP<-#!ep#K%9]_r?8j5A:,e!u4a]Le5e:nGV4kUgoH7G8s;M^W%rStJ.G``4R]P-fT*X\pFq5&lHZW*f=W"c7-N3l4f)3EO2O$1aE,:<7HNr^J2,&(bSo9Md5E9dWfdl`IVrT/#^$AAC\W1JGV&0;@A#]-2Rko+E<7XU.d/1*toY((kdfMAFZ20Xq3CQ:'HCDE[`YT.18mh\psIZ?piQ'CGnrn_cc^`Z/i9H$ZTN:K!o?M6iAg)G*VN%hCl!)3Hg,(Ss6=M&.(;SD^uhR'uV]F2cbjB45L]S9-<#dN#XdAfUF_b!=p\)B+bqo_l0V8eeV8Tb"%GJal;]0f]FA.6e:1:He*NYdHbS@4M]aENCqRKd+iH.>i6N?bjT<9r9DQ",ZE=b/eC9#u.C.!N+^u>(jV'PXhPUA3Y?TPnl;^Fuojs[DBDV$p1I:*NRl#0tY6oT+":IoD0h-<(2qkf[h9aY]T,7?U&oH-V>NK!U2p:$cr;gVpKtW*iaOncsP1V34C:Z;/UHQ$7"P3t._eul7^ZG6f435R$T2@M'TWZBAcW]S'A*Z$NDc;=_a_9)[q<(FQD)THN>"?!FgU_-`+kKI(b3n2'1BKdm2T>ueR_-><7!Yc/_'/\%So?(PU9X:T$;N4.+>]fbsea[!]p0OTW'_UiDV@Tg_teOP.85=DiPTCecsWUOrUiHJl!I,JIdGS>."hN(`cgW`o8q/pU3$4hrI0q6SHl!r&gLbAk?seYiV#ZV'a]0UrZ\(a[]7Z8\n\lgp)52-#5=DE>5')se\0@.F74$stC#^!-q2>X/**U0gi=Zf$\!XFW/1DtGc^-njf<+q)#Y9Am4_C6uF`E6HoP.,6[#*jaG<7b`@8ASR#d)&lkQiF*&kAOE&<"WjhuaL0G#-Sft"P6PAJ:RtRQ*#t#k)r%kq-.W8We>(J+*XgB_hc7WOna8!;Xduhq2Tc'`lWA%E8Ji;@'(lApkQ`:$GZRm6nF2cNm^<;d#-METQV(d*PhTb[ZZ&k,7)2]aW8AYBi:Au;"6OO;KkH.A!U6Sqn8JLVGIL@?nQ6+T[`cV9]AFB'Uja&+6jlO71pTr4nKbMXggi?&p4][JK5aC9?Hh"W-=-hAgKQ$bjt+.mF_&`(AI2E"'uH4C^hZBk^C^Mg:\C2$6?8bX8Mbgh4#h-!X39#-8p+Z)AYklfHcAuslfo.AZ/YgaK`mfYV;YS3ULC`A=&h>.>UHA=JJI'bpL\X=Z-1eR[*HN08.iRVl]8\.ctFmo\m:JGiJDM[)g,iPLEkOHjl9.T)(t#B-)9CVQDmuNMM'gDkqmg^$]?S&^(dPUVt7cD(.i^9MkeUt18.G0?G["L[kqH*;akRCI;Z@GD-QO!pOBWZZBSlOPtOtGJr`OXVh.0;XA>_E=&hk&9soY]\#;(Si;35/^6..cr66]of]b;5LDH1+:UbRqhE"8V+M&l(djjg.ieX`)#Ue,th5G3SVlNgA3m=(gLSTJ:iI&./:5qW[;E4h>bg;\qC6NY@bJrt.Gk>t*Lp'g<9Hs&*WsQnMi;5)TSuLO]O"NO%'7@@N3hBZ?BIAR,WY:Zsa*H'.QX2%&LsO)q80Ii1-7aFr27#iN.c,SVrfCTGK[\t/Um73ZhgcpgN3A/P=M0`PF-'9NO)KHaq$#Q$87Ab+8>YEC%tas\Q\E;dfQg#pf_,5K"E2a=tRcINl>,CBk6Be$lZ-l;ZbjhHn*MbkC-oS&/^oq/_SEAIA>;EAPRj<(3GpsNqqK[37#Jna96/;%JgN.qjaLV&JBWApQX=WW&,8U\9E%JW9<^@Z#rj!%HSb.,TE-e&bS7L4gj],Z(Y$T'gY*,;q`.MN$E7;/%S5E-QUu[k12@fb`PAlcJn-)lu-5Doepn;9uST1[CVFiXXACO3Z^qmdq\?PBM0`[.\j7]ASi8B*,l]uZhM%-A\VkA?VqbnMSnEIB($^_4Dm8",*_3[BmmO>CAoGl^ue4Kh1Kh^":^'7P4l^mMfi8A\4iff:Y$W&dmrM^8jpsqSS2W/IWDL\Yg%fULjb"b\4lShG"^U3Fq^&`u[ES]Ui0G0],T,'*gS#!mV[Z"Ch%QO7-_KHNh>?ktXlF8*s#:d+'OXU[>c>dq3HXP_+d:CFtSVdXZTW12TAZiD(nVBP^;YM[E>#?6I]fH^p4YRP"V2G&P5D&K`Z*H:M9L>WhZ@2f7X51:(u_W$uuaeo,*K8ddo%a=M/"0FQVHAmpl[/=pP]3;?07E!s"V%06^+BaATbnOu<;Kh^"RDHlFumNGsR2U`5m!pV,-Y1b>54#d^a,)Vf0[Mq\uG$FoV:)M20oE&\r/JMe+2T&"nX\\H_NGO?o>"j_]\D*=oW\Ft!/U6eZ2QOhKCq&>*fPFTJk?2\rgNNRUBaAT2QT_dZNG/Y^_!UD\M))d6@Ab08/AeQ-~>endstream -endobj -% 'FormXob.c8ba08e347e6847214d84c863a661d07': class PDFImageXObject -5 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 45 - /Length 6345 - /Subtype /Image - /Type /XObject - /Width 2008 >> -stream -Gb"/l^M@+F(_PS==SM+pNL-W1X)>0#dm+i=er1NUi)1\Y4hpS?,j08h(22fF0%]DBg`B,1jTzzzzzzzzzzzzzzzzzzzk[`]qf;lL_m>oGng:FS8q+e=j5Q,n@fi@?+-A+3PQIl2qd,\3IgA4:UZTq_3I9s6/A#Wsz!!!#BkN:Sj=)L,OXrS7I$B5_fZ<8ig+dHJ+9kj2/3Ne[D!p+'>nlY+sGBg?G;Y=\fqz!!'CG[qcS:l^Q"Dl"Fu(&Su=.'X_gHq!U=o5#p^be'WQfLgI9pjZ^&.RS*Ehg!s=6[/J,WX\1@Y[\('9>6t90z!!"h&C.5;;=gWc3nW;=i>\,.,a](-iK\#;S4FXH@lQemrC@=,Q2dX";0-nYP5;&W%LY1.R.%LFRi,.nmE)Ql&%I=I?S2(*R,[U3.ai"33V=4:"]Bp3T+Q2*e`$2l5&Q4=99/M6o4YuHM-p`bO#N>=1!aAG*q?4TYgU>CrBk9oeSd9J@2-6HbDIa\0).-Nn(K1Q3G<+ZUpd!J2]c#?iftl4@TAOtlq;;0XlG]aOq\Lp-20L-4,(8i*Aopo(3>8QLPV@UR@BrBq91>,:(SEoW_CHAL3NMWPOmeHRm&/q&Jdp2W:/;Q:3cV;Wz!!'fSAW.;'\I(:a4rQPMd-s;r8qRmUoMR"B,LgHiBLZ^N^YZN7rM42mKF`CA1+gb)%#=JpT[f8"QlUHVrJK1?269.AT[0^>&^?'4*XSh]*dkV\jr;TPp9\,[R&`jU=`ZI4(KW*l=1>4'HRZMR.*%]2g-B>TO@\]cDOGGqUh)IObZh@9\nr&6hIf8X7t8pu\GUH9n3Og;oPn$&nNKK7As182V32QWiEB?B];9.=<4a]hQWO(kdM*"k:"o#XH4nML"onW'!!!!YBllGAj.3t:B[_b=IH1:Pj^Q+El%mfKN44GFLujWuK0A>daqc31U8[!W)%N@;N`Q`\f!`f,@J=2fI?&&4o36Y%q8S1gaD$NY*B`MDTbnl&!LmK!^7<_;8SS^_DH0*&`%mS`*9ZYF)D,&n"/+<#N(@C;MQ7>%"D)A<]?P>mdUe@P33sKris!,"D(10X8E+J7P.h%g1B6PR[Kdb+)%!`]WhM!;8\OY#XBQ(K2QW+A\bl;`2KY*(V(^%KL^X+b6M'H^h\a^q=rKFgHU+bUCnBH:[)L&-FW(T+I$3>KQ!)4.PK?skHiYpj54+gQHZ^O_72tK>0<'1P3M&l@8GJN'n:fP]-fAYA4=[.)mmbI.4t-U]EOL9@5sBF/cG]E9Wl?V8Xp>Y#U+j463s9]bP8]`.B&I$r4DMN)s*'Y26g=a*:NPqdB7KBptHBZY8nWLd,NIYiVpdae(pLf^f$DYt89-==Js'B^AtHKFgHU+bUCnCEtLVqk,H;^#![J)YQo7XdnIUmlhh"CO!8!7Y[2^3F84]W];bEC2V9".V#obh:hAJ[VB#l/82/(9+/p&FE2d#4]NN(F#Ed+VrTl#J008b)=+m+b\(3d::/JOS!G(A%q1\k3f%GcMTo8>@dhA@K`+g!9c"R.n#TNlpEXc9[tKA/u;hXUFlC`XV3r<7ic63n`f&4.aC>+0Zia3^nY^D#hQi%^VjfqUa[=DN/h]8W]3GYP[=WVLI-YH0i-e=X1Da]35QW@P@NhUo34h'/tr9#J*4q-#XJ$e4\*Wo:.Q+QkcIJ04e7XkK&jV5d\Ll"lbt>9WS&l*JK[GU"M3ofV,^iJ.q5J<*h@g:c3:G/1r2S[I<=MjEo:g"ekL1*C9\T,J^bb7;fGknp;J=4goL.Z"g*#U+j463naA>ZK7c8,U)I^i+7.7RV!;9G.MAD_u-@G#6_Ap$>_$4.i+N0+CjhN%iij/=WN%Bip'11ojI-1"!!UGj\uX6edjr]s[[]Lu45N4e4:U*:Pb5K;3`oR<9\-O`=lQNjV\-*@p"q;pLC3:]'$jbrS$SA;WtmUjH[@)ihMcX"oI,OAEXJOd0hQFD)s?9=$\GGYXE,#U+j463n`f&6cY]F27S"^)@XN:F>OP!jt8.m25im(j8a/(*h@NCeO)6[h38>qMe4!g'XtRX3o`t(uAQ\!uh?)^6,*pPJmM@o=9f\m:a4GTP9gV[)uqL\&RM!K`7"""+H[KP42O&!)-)4[>E0j%=`Hj$b=8P+HTbW>'oXb&>MmhLU`c)Rm`":#s5KlT&-'g7n%RS+&?biT^[K6nH8=,H*oB'CS2Vn""`7/Z!2]XtD(DEZZ1E^bb"iT9)mfJ9p>XNo"k(n#nr9b5A]HPT9q7"#)^5P2KFgHU+b\3'b-n:?5.kadCt+X#ps2q[P8gsbM";^YV^XDq[.`5!VdUdG?)j;HAaj5/_LG?;4fP55D"H>Tb_@u%T"i(HSup8Pn$>8XoA$dLD5AuYo?@:`cA=U41rr]lhr8B;924HoMc6O[YkaF1eX2#RY6ADt/=^/63BG_O7SU5QkaruPf,]$pN5oMBAJo?LCI02a4lO+qhEf4[J'?tVQiI*dz`s*dQ8lSJ8i'5iAn06#i^5WE9_2@mh_iOPtZ?T4kBn5SuC?[gc0(g:sC04'h[sJ_tGO0F1cXU2aa,\q6WU;*T1uD5kXR^djXR\g5baE/T3,q^C'I/gMX_`cnHZ?IagIE@[q=&l]q,LUYF2,_onh)lg>4=WU[#28Od>C.SjPTZ(3el'_hgGTsnGNgsz!!$+Y4Rp#1(=TQ&PU<;j*P,D`4%6Tu6>8cmK;;2%F'*aaL@]$/`-H*kFpW`=*1[GXh)<5&5ka(R&r+B"6W7@.qo%[2CrDuB9OeV"g+z!!!",Q20C:?U+I!4#8V:SA-@7Oe5.u3TRV#CW?A(MQG5gU/$`IEe+^PCZA2&McSo%h1`t=sq)8k+5O;H:FsugiHj7cU9Vr[W(n.$0aMHQ*LA;]stY!]smb5p!9ui=atndmJVs0WXaDARtQEW%n^?&>rqdb#YtKGJsKi.3M>2WSR\HQHj-,b@?#'a82!OD#=g7C7XI?jIP/CSJHl/TzJE=)KJ!_;@B)&;FBQ8lsYHmcp3@Dto6or%&)_5D^]*b@3/l%nsI.d$%,/"?]q;(cu[i\!i]/g\hkfiBmd+'58OpRa'BfY"M21:q_5QLibzJ)@BDpR~>endstream -endobj -% 'F3': class PDFType1Font -6 0 obj -% Font Courier -<< /BaseFont /Courier - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F4': class PDFType1Font -7 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -8 0 obj -% Page dictionary -<< /Contents 12 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 11 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R9': class PDFCatalog -9 0 obj -% Document Root -<< /Outlines 13 0 R - /PageMode /UseNone - /Pages 11 0 R - /Type /Catalog >> -endobj -% 'R10': class PDFInfo -10 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121219101332+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R11': class PDFPages -11 0 obj -% page tree -<< /Count 1 - /Kids [ 8 0 R ] - /Type /Pages >> -endobj -% 'R12': class PDFStream -12 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1261 >> -stream -GatU2gN)%,&:N/hraEi#$"ns8cB_B:nMNUt)..cP`0&^(nSc!?aH-GTb:ab`qc8?ng*%_YeJqVS6Jb2;N0ZoT@a._r/hkpbe`b9e9K@G9rlU]nN!n%b%=^l!nqFDB2'J0g&AQh5Adc];SX=Mi<#GLRt)K&!Sm_i:XIK`jV^$SiOIqkY1P`QDV=B,]s>/o61Mm>[=8e?+sKb@rJTj!!aQ(HMU.pJE,NU)%J9q'&#%NSX4=/iP-bnYVRG6?$j$.Q@cT!_d!7F(1/jW)kZ,M8k,@![U?7?(Si066l(:aG1[l.G@C2O+<["1DP188uqHqch1!>p:EeF$G@gs)$bDm'S^1FPSnXPa+Bbb(Kh5LS0r)"Iq06YKW257ZpHc\?8t6i24q=6f1:BCA]/XL>%0f[7g6Zgdi3P"_(LThfeArgO\gB;4If1X[)d+=FnQ@`Gc7(X["FZR-cAI_GS%g?kMS7I\%:6]"$7E[OYCOd6d$/L;",@%IIO>qBE'TWUY^9F1;5?*mLaF`lHicH?Qj5\#8_Sdjq8M>O@Q40fmXA]e@e(gm?Dt(MU,f>3r5q3.2YrpED3`KU2L7=tFt;/Uift5G?&g8rEm,UZGdWjdjchSk=pRYiYhA[/:S@rhHi.3r&uaqD5;~>endstream -endobj -% 'R13': class PDFOutlines -13 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 14 -0000000000 65535 f -0000000113 00000 n -0000000245 00000 n -0000000410 00000 n -0000000626 00000 n -0000007026 00000 n -0000013609 00000 n -0000013770 00000 n -0000013957 00000 n -0000014351 00000 n -0000014488 00000 n -0000014759 00000 n -0000014866 00000 n -0000016272 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\003\303\215\220\222\315\255\352r+\263[\331i\)\317) (\003\303\215\220\222\315\255\352r+\263[\331i\)\317)] - - /Info 10 0 R - /Root 9 0 R - /Size 14 >> -startxref -16324 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-044-codesnippets.pdf b/z3c/rml/tests/expected/rml-examples-044-codesnippets.pdf deleted file mode 100644 index 6eb3acf3..00000000 --- a/z3c/rml/tests/expected/rml-examples-044-codesnippets.pdf +++ /dev/null @@ -1,150 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 6 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.0086924a45e007495af99df70126eb1b': class PDFImageXObject -4 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 197 - /Length 6121 - /Subtype /Image - /Type /XObject - /Width 309 >> -stream -Gb"/l^Q0\[&]ap8-\i2ucj=5N-F&B2*&rS,^lh8#OU4]pO9j*&8&-nb>+sIunDF=o/>mXT=rr[$BDR%WJ%V4up&1g&Nh&*l4]U%geQ"JnQNZ=Gr;>]n!F(J*G^*p#HHF]L]j@1dnK,0gdo5Qk9Wg(ia2d_)R_X]?tNb24efmBAbN\7?-qgiM?9+l[j9FF.,f.0h,>aJ4T!e!f,pt&fi'8;(*m1jGCFE+ba:p/WDDLQ#8>d_(GFJ\b#3L@5S@_XgeOYG<"LZBEN]52BJs0"[=2T^ATc;!pi#Y_)&U5_n)bcW'Ypt2WsBA[kJ1/7hnHh[okpVZ%6'1+LiGmhO'&U(Aq:iq=]S]>I&TX4;1+ecDtDqI\,X=(=*+\eaf`p=>RcFTS,"6`R&Jf4:T+YbehB)d`n8'gNj$IG<"LZaMQg!6S1u!E(`dM3Dp,Bpe4%o$]AX9!iCu=?ak97=kJIZK29DK(/Qs#rFl9lps.>"get3:*6A1&I-[@:)d#5O&286kk?2\2nOuuCgcd,6bpNNnP$ErGbuY._BruaKl%)TpiP9%"aA^)pN-oHZ`ojPi"f-J\c$4C3;?07n-P"c)T"%AP(m,lL4Fp&l7m0b(:GC1_Bs!4qMj;0["-+O8K&Aj2!!N@&Q1lCcA(kq0>;`.`V5JfqR`A%GP:;&l6`u)A<_RlI'WOl25L34n+?PD@.?ogLaX:BSta@rSn/_tiRA!Wu'H>9A6-h:WLWrkgr3h>G7\r`4KOYJ34*9u0eUm$Tf)q=>%5;Yd<_rj2k?kMs#RlLOS*msu,EVn^O2.0i%j4E(&/n9lq;6r.I0hIc:O.qCO=V.e/\VlU_ZBk1P"pQLL"fl_,&1F]Z7X\^Utk%s#65I^q^7?pdd;5NRC.8ACV1Xo65@9]F/Ufhn"`K&c_pl6Ia6d*)C(M7+=;(e(-,42XJhV@YMWK?Kdp`NS6Vae68g>)Ds/=r8"\P2"@1qD4uT2()BO.@/VcbB1OWHp0H*W=K>`A@)cAMS7iJ1o>_*bb^?`=1S2UMX$F.#Va#;(e'B^q>/9DjQN^@`RGTpmr\Ac"AQC/F5K4-L4l=YHBSsOO+6!af2%g]lDfd46S.`"q497efY+daX[@8,$g]00c&G7\_@o"Kc,46qqsR"._!U0BrYm6l?T3TQV$!&.rr&@8(.MD5#jEA@5qMjrMH0sqTrr1*]T=Fp-TD+iQMu:3bhi$%":EcI!GVrJQ^*Pn[KCS@>/1%:g#^BB$(pDaCpA#NFj^3-$^l_idh2_Vjlp<-eP<-#!ep#K%9]_r?8j5A:,e!u4a]Le5e:nGV4kUgoH7G8s;M^W%rStJ.G``4R]P-fT*X\pFq5&lHZW*f=W"c7-N3l4f)3EO2O$1aE,:<7HNr^J2,&(bSo9Md5E9dWfdl`IVrT/#^$AAC\W1JGV&0;@A#]-2Rko+E<7XU.d/1*toY((kdfMAFZ20Xq3CQ:'HCDE[`YT.18mh\psIZ?piQ'CGnrn_cc^`Z/i9H$ZTN:K!o?M6iAg)G*VN%hCl!)3Hg,(Ss6=M&.(;SD^uhR'uV]F2cbjB45L]S9-<#dN#XdAfUF_b!=p\)B+bqo_l0V8eeV8Tb"%GJal;]0f]FA.6e:1:He*NYdHbS@4M]aENCqRKd+iH.>i6N?bjT<9r9DQ",ZE=b/eC9#u.C.!N+^u>(jV'PXhPUA3Y?TPnl;^Fuojs[DBDV$p1I:*NRl#0tY6oT+":IoD0h-<(2qkf[h9aY]T,7?U&oH-V>NK!U2p:$cr;gVpKtW*iaOncsP1V34C:Z;/UHQ$7"P3t._eul7^ZG6f435R$T2@M'TWZBAcW]S'A*Z$NDc;=_a_9)[q<(FQD)THN>"?!FgU_-`+kKI(b3n2'1BKdm2T>ueR_-><7!Yc/_'/\%So?(PU9X:T$;N4.+>]fbsea[!]p0OTW'_UiDV@Tg_teOP.85=DiPTCecsWUOrUiHJl!I,JIdGS>."hN(`cgW`o8q/pU3$4hrI0q6SHl!r&gLbAk?seYiV#ZV'a]0UrZ\(a[]7Z8\n\lgp)52-#5=DE>5')se\0@.F74$stC#^!-q2>X/**U0gi=Zf$\!XFW/1DtGc^-njf<+q)#Y9Am4_C6uF`E6HoP.,6[#*jaG<7b`@8ASR#d)&lkQiF*&kAOE&<"WjhuaL0G#-Sft"P6PAJ:RtRQ*#t#k)r%kq-.W8We>(J+*XgB_hc7WOna8!;Xduhq2Tc'`lWA%E8Ji;@'(lApkQ`:$GZRm6nF2cNm^<;d#-METQV(d*PhTb[ZZ&k,7)2]aW8AYBi:Au;"6OO;KkH.A!U6Sqn8JLVGIL@?nQ6+T[`cV9]AFB'Uja&+6jlO71pTr4nKbMXggi?&p4][JK5aC9?Hh"W-=-hAgKQ$bjt+.mF_&`(AI2E"'uH4C^hZBk^C^Mg:\C2$6?8bX8Mbgh4#h-!X39#-8p+Z)AYklfHcAuslfo.AZ/YgaK`mfYV;YS3ULC`A=&h>.>UHA=JJI'bpL\X=Z-1eR[*HN08.iRVl]8\.ctFmo\m:JGiJDM[)g,iPLEkOHjl9.T)(t#B-)9CVQDmuNMM'gDkqmg^$]?S&^(dPUVt7cD(.i^9MkeUt18.G0?G["L[kqH*;akRCI;Z@GD-QO!pOBWZZBSlOPtOtGJr`OXVh.0;XA>_E=&hk&9soY]\#;(Si;35/^6..cr66]of]b;5LDH1+:UbRqhE"8V+M&l(djjg.ieX`)#Ue,th5G3SVlNgA3m=(gLSTJ:iI&./:5qW[;E4h>bg;\qC6NY@bJrt.Gk>t*Lp'g<9Hs&*WsQnMi;5)TSuLO]O"NO%'7@@N3hBZ?BIAR,WY:Zsa*H'.QX2%&LsO)q80Ii1-7aFr27#iN.c,SVrfCTGK[\t/Um73ZhgcpgN3A/P=M0`PF-'9NO)KHaq$#Q$87Ab+8>YEC%tas\Q\E;dfQg#pf_,5K"E2a=tRcINl>,CBk6Be$lZ-l;ZbjhHn*MbkC-oS&/^oq/_SEAIA>;EAPRj<(3GpsNqqK[37#Jna96/;%JgN.qjaLV&JBWApQX=WW&,8U\9E%JW9<^@Z#rj!%HSb.,TE-e&bS7L4gj],Z(Y$T'gY*,;q`.MN$E7;/%S5E-QUu[k12@fb`PAlcJn-)lu-5Doepn;9uST1[CVFiXXACO3Z^qmdq\?PBM0`[.\j7]ASi8B*,l]uZhM%-A\VkA?VqbnMSnEIB($^_4Dm8",*_3[BmmO>CAoGl^ue4Kh1Kh^":^'7P4l^mMfi8A\4iff:Y$W&dmrM^8jpsqSS2W/IWDL\Yg%fULjb"b\4lShG"^U3Fq^&`u[ES]Ui0G0],T,'*gS#!mV[Z"Ch%QO7-_KHNh>?ktXlF8*s#:d+'OXU[>c>dq3HXP_+d:CFtSVdXZTW12TAZiD(nVBP^;YM[E>#?6I]fH^p4YRP"V2G&P5D&K`Z*H:M9L>WhZ@2f7X51:(u_W$uuaeo,*K8ddo%a=M/"0FQVHAmpl[/=pP]3;?07E!s"V%06^+BaATbnOu<;Kh^"RDHlFumNGsR2U`5m!pV,-Y1b>54#d^a,)Vf0[Mq\uG$FoV:)M20oE&\r/JMe+2T&"nX\\H_NGO?o>"j_]\D*=oW\Ft!/U6eZ2QOhKCq&>*fPFTJk?2\rgNNRUBaAT2QT_dZNG/Y^_!UD\M))d6@Ab08/AeQ-~>endstream -endobj -% 'FormXob.c8ba08e347e6847214d84c863a661d07': class PDFImageXObject -5 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 45 - /Length 6345 - /Subtype /Image - /Type /XObject - /Width 2008 >> -stream -Gb"/l^M@+F(_PS==SM+pNL-W1X)>0#dm+i=er1NUi)1\Y4hpS?,j08h(22fF0%]DBg`B,1jTzzzzzzzzzzzzzzzzzzzk[`]qf;lL_m>oGng:FS8q+e=j5Q,n@fi@?+-A+3PQIl2qd,\3IgA4:UZTq_3I9s6/A#Wsz!!!#BkN:Sj=)L,OXrS7I$B5_fZ<8ig+dHJ+9kj2/3Ne[D!p+'>nlY+sGBg?G;Y=\fqz!!'CG[qcS:l^Q"Dl"Fu(&Su=.'X_gHq!U=o5#p^be'WQfLgI9pjZ^&.RS*Ehg!s=6[/J,WX\1@Y[\('9>6t90z!!"h&C.5;;=gWc3nW;=i>\,.,a](-iK\#;S4FXH@lQemrC@=,Q2dX";0-nYP5;&W%LY1.R.%LFRi,.nmE)Ql&%I=I?S2(*R,[U3.ai"33V=4:"]Bp3T+Q2*e`$2l5&Q4=99/M6o4YuHM-p`bO#N>=1!aAG*q?4TYgU>CrBk9oeSd9J@2-6HbDIa\0).-Nn(K1Q3G<+ZUpd!J2]c#?iftl4@TAOtlq;;0XlG]aOq\Lp-20L-4,(8i*Aopo(3>8QLPV@UR@BrBq91>,:(SEoW_CHAL3NMWPOmeHRm&/q&Jdp2W:/;Q:3cV;Wz!!'fSAW.;'\I(:a4rQPMd-s;r8qRmUoMR"B,LgHiBLZ^N^YZN7rM42mKF`CA1+gb)%#=JpT[f8"QlUHVrJK1?269.AT[0^>&^?'4*XSh]*dkV\jr;TPp9\,[R&`jU=`ZI4(KW*l=1>4'HRZMR.*%]2g-B>TO@\]cDOGGqUh)IObZh@9\nr&6hIf8X7t8pu\GUH9n3Og;oPn$&nNKK7As182V32QWiEB?B];9.=<4a]hQWO(kdM*"k:"o#XH4nML"onW'!!!!YBllGAj.3t:B[_b=IH1:Pj^Q+El%mfKN44GFLujWuK0A>daqc31U8[!W)%N@;N`Q`\f!`f,@J=2fI?&&4o36Y%q8S1gaD$NY*B`MDTbnl&!LmK!^7<_;8SS^_DH0*&`%mS`*9ZYF)D,&n"/+<#N(@C;MQ7>%"D)A<]?P>mdUe@P33sKris!,"D(10X8E+J7P.h%g1B6PR[Kdb+)%!`]WhM!;8\OY#XBQ(K2QW+A\bl;`2KY*(V(^%KL^X+b6M'H^h\a^q=rKFgHU+bUCnBH:[)L&-FW(T+I$3>KQ!)4.PK?skHiYpj54+gQHZ^O_72tK>0<'1P3M&l@8GJN'n:fP]-fAYA4=[.)mmbI.4t-U]EOL9@5sBF/cG]E9Wl?V8Xp>Y#U+j463s9]bP8]`.B&I$r4DMN)s*'Y26g=a*:NPqdB7KBptHBZY8nWLd,NIYiVpdae(pLf^f$DYt89-==Js'B^AtHKFgHU+bUCnCEtLVqk,H;^#![J)YQo7XdnIUmlhh"CO!8!7Y[2^3F84]W];bEC2V9".V#obh:hAJ[VB#l/82/(9+/p&FE2d#4]NN(F#Ed+VrTl#J008b)=+m+b\(3d::/JOS!G(A%q1\k3f%GcMTo8>@dhA@K`+g!9c"R.n#TNlpEXc9[tKA/u;hXUFlC`XV3r<7ic63n`f&4.aC>+0Zia3^nY^D#hQi%^VjfqUa[=DN/h]8W]3GYP[=WVLI-YH0i-e=X1Da]35QW@P@NhUo34h'/tr9#J*4q-#XJ$e4\*Wo:.Q+QkcIJ04e7XkK&jV5d\Ll"lbt>9WS&l*JK[GU"M3ofV,^iJ.q5J<*h@g:c3:G/1r2S[I<=MjEo:g"ekL1*C9\T,J^bb7;fGknp;J=4goL.Z"g*#U+j463naA>ZK7c8,U)I^i+7.7RV!;9G.MAD_u-@G#6_Ap$>_$4.i+N0+CjhN%iij/=WN%Bip'11ojI-1"!!UGj\uX6edjr]s[[]Lu45N4e4:U*:Pb5K;3`oR<9\-O`=lQNjV\-*@p"q;pLC3:]'$jbrS$SA;WtmUjH[@)ihMcX"oI,OAEXJOd0hQFD)s?9=$\GGYXE,#U+j463n`f&6cY]F27S"^)@XN:F>OP!jt8.m25im(j8a/(*h@NCeO)6[h38>qMe4!g'XtRX3o`t(uAQ\!uh?)^6,*pPJmM@o=9f\m:a4GTP9gV[)uqL\&RM!K`7"""+H[KP42O&!)-)4[>E0j%=`Hj$b=8P+HTbW>'oXb&>MmhLU`c)Rm`":#s5KlT&-'g7n%RS+&?biT^[K6nH8=,H*oB'CS2Vn""`7/Z!2]XtD(DEZZ1E^bb"iT9)mfJ9p>XNo"k(n#nr9b5A]HPT9q7"#)^5P2KFgHU+b\3'b-n:?5.kadCt+X#ps2q[P8gsbM";^YV^XDq[.`5!VdUdG?)j;HAaj5/_LG?;4fP55D"H>Tb_@u%T"i(HSup8Pn$>8XoA$dLD5AuYo?@:`cA=U41rr]lhr8B;924HoMc6O[YkaF1eX2#RY6ADt/=^/63BG_O7SU5QkaruPf,]$pN5oMBAJo?LCI02a4lO+qhEf4[J'?tVQiI*dz`s*dQ8lSJ8i'5iAn06#i^5WE9_2@mh_iOPtZ?T4kBn5SuC?[gc0(g:sC04'h[sJ_tGO0F1cXU2aa,\q6WU;*T1uD5kXR^djXR\g5baE/T3,q^C'I/gMX_`cnHZ?IagIE@[q=&l]q,LUYF2,_onh)lg>4=WU[#28Od>C.SjPTZ(3el'_hgGTsnGNgsz!!$+Y4Rp#1(=TQ&PU<;j*P,D`4%6Tu6>8cmK;;2%F'*aaL@]$/`-H*kFpW`=*1[GXh)<5&5ka(R&r+B"6W7@.qo%[2CrDuB9OeV"g+z!!!",Q20C:?U+I!4#8V:SA-@7Oe5.u3TRV#CW?A(MQG5gU/$`IEe+^PCZA2&McSo%h1`t=sq)8k+5O;H:FsugiHj7cU9Vr[W(n.$0aMHQ*LA;]stY!]smb5p!9ui=atndmJVs0WXaDARtQEW%n^?&>rqdb#YtKGJsKi.3M>2WSR\HQHj-,b@?#'a82!OD#=g7C7XI?jIP/CSJHl/TzJE=)KJ!_;@B)&;FBQ8lsYHmcp3@Dto6or%&)_5D^]*b@3/l%nsI.d$%,/"?]q;(cu[i\!i]/g\hkfiBmd+'58OpRa'BfY"M21:q_5QLibzJ)@BDpR~>endstream -endobj -% 'F3': class PDFType1Font -6 0 obj -% Font Courier -<< /BaseFont /Courier - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -7 0 obj -% Page dictionary -<< /Contents 11 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 10 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R8': class PDFCatalog -8 0 obj -% Document Root -<< /Outlines 12 0 R - /PageMode /UseNone - /Pages 10 0 R - /Type /Catalog >> -endobj -% 'R9': class PDFInfo -9 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121219110901+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R10': class PDFPages -10 0 obj -% page tree -<< /Count 1 - /Kids [ 7 0 R ] - /Type /Pages >> -endobj -% 'R11': class PDFStream -11 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 2604 >> -stream -Gb!;eD/\Gm')ipps'`M5+\puEP-!9jmXFB-\b<73CpuU$5^cb]&nS,+7$XM+k^NI>8]d8jf8D=VF!0/j(h9j'i9h17p7Z#i'$$0FU@M-Z)Yp'0!6A"5h"SPj])J#;aAo3+^l@jP"'06Ur<\ZRK>d*#q&/0JL*QBUaIHa$UJ8NESM6dlSMdnd\?I(ccU@!o63+(-lK#Frm2HN2PAt+V76U@JiOoAMD1K)/Q:a0Y7?R0qJ>#7tI7.69-PgpM)VF2V[a6KrGEl]"a_CmLDNcZk=LHW!rHP+QTJ#S].h/:sgfpqGcHd'#AfKR&CWq;j+D;ScmpAllBV+(uj:?g&ke:q/-b:>l',KDDQEN\?6jNn'Y9Tcr&;Fp'X:BLMeYAoAa\$39V]n)]OAA)+nL6?BJ1Xi4ZZA?n*Ufe4iQ\g)DW>j[V28T#e@[mJaQ'd-&T[Ag].*23;[R;?gS6Q4X]KZT!=XB>R>1_#$`'@WFn\lrbA<[QI%:-ip-Y,`)X.]8!!XpjN3V9c"BRR`[kGR=n\dCb@^N%)on(f10kUS[UR4gdp?i28tg[rrCk_i/H>9Js3>>3;89;FncEWkSVQ@=48>F>k^S$A&AB0B"I;Z7/_I<%BdB?VQ+AXTFAG:9:&BhToA=-CXt3m+0e:XY%5?"R#UDZ7\Q$_kO/()&OmF8^U5^-b&bSK4S<;Roj1/#I(N)iDdI.f?bJmn?JkHYhO[^9:u69\;uSb:+)2p.gq&3E@enS)=Y9.C*7QNh>cF,S_qO4_LX&!j"KnH21b]!uVDALbQQ!#@Kq?ikC6XiQ="6<3L$a(Wo5ma9@p)LTK?8IpR7'/<74Q^-hY5Z^me2S%,VO81b?N_?7!XmLdI>A1,r4U?XEh'GD>(bo50o$PoB7^9ns,M`FkR?)?th>LJpf`(8U4nZ(&V_R*QH"9p#

              'is5Katt@*-O>*5+4,m`PT+McfY8=B^T`XgViJ`$"^Q]1kM!4NHS"CEiTr32nT"YU*GH2QFPgM\nUNCIS0prnZ2KY!%.1rV=a-UZ$1AZG/*UlinNW$(p0_-e;tuci9gJp%WVfR^,0Ds$*f503mh*e&T\0#'(mS;#B#O\:\NT#hgCpnj6ZBEfX"$@-RDkdt:6+3DfYD*D>TrLB`9GXc'Oe4=/,$Y!nfGa9>[s`(R2gHJu)\?^p^K\OeQ5MFro+;G"lY/=]>$32G2VZMOki[4F,\ALSs>h[DJ'KA?]'$fT3"AR6,O$+mP%RqAkPd>u?G/QgP*hm)CKE<&TqW[UfR.d8=L]:36,"0uG2*.V-R9Tha#;Dg$t\W\Q8KPH854'iQRI$FBB5,27uhA34*oFHN#,MUR8b,:,t;bCs)MN`&il3&G\b;>@kC(eRP<]'5<>>F"HUe9[r4_?2Q:?+DCmsIi0?(sE?g14.8M=5TPp=,_WFWlG/2[S#=O',FT,G*%%#FD64Vp\P,AP&VOR'Z@BDNX&SN+B]=l)sTd$;:DJ@>)A^3[#>kBD[^ig2S8jqc&D58NsO/5Gn3q]n]F(.V`:[QrI-BgBF*Pkn]G'WlgHU!%or("':=&Rf~>endstream -endobj -% 'R12': class PDFOutlines -12 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 13 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000614 00000 n -0000007014 00000 n -0000013597 00000 n -0000013756 00000 n -0000014150 00000 n -0000014286 00000 n -0000014556 00000 n -0000014663 00000 n -0000017412 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\031O\245\250\001T\211\323\254\270\(\301\300\004\235J) (\031O\245\250\001T\211\323\254\270\(\301\300\004\235J)] - - /Info 9 0 R - /Root 8 0 R - /Size 13 >> -startxref -17464 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-045-cmyk.pdf b/z3c/rml/tests/expected/rml-examples-045-cmyk.pdf deleted file mode 100644 index 0fbf2fe1..00000000 --- a/z3c/rml/tests/expected/rml-examples-045-cmyk.pdf +++ /dev/null @@ -1,150 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 6 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.0086924a45e007495af99df70126eb1b': class PDFImageXObject -4 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 197 - /Length 6121 - /Subtype /Image - /Type /XObject - /Width 309 >> -stream -Gb"/l^Q0\[&]ap8-\i2ucj=5N-F&B2*&rS,^lh8#OU4]pO9j*&8&-nb>+sIunDF=o/>mXT=rr[$BDR%WJ%V4up&1g&Nh&*l4]U%geQ"JnQNZ=Gr;>]n!F(J*G^*p#HHF]L]j@1dnK,0gdo5Qk9Wg(ia2d_)R_X]?tNb24efmBAbN\7?-qgiM?9+l[j9FF.,f.0h,>aJ4T!e!f,pt&fi'8;(*m1jGCFE+ba:p/WDDLQ#8>d_(GFJ\b#3L@5S@_XgeOYG<"LZBEN]52BJs0"[=2T^ATc;!pi#Y_)&U5_n)bcW'Ypt2WsBA[kJ1/7hnHh[okpVZ%6'1+LiGmhO'&U(Aq:iq=]S]>I&TX4;1+ecDtDqI\,X=(=*+\eaf`p=>RcFTS,"6`R&Jf4:T+YbehB)d`n8'gNj$IG<"LZaMQg!6S1u!E(`dM3Dp,Bpe4%o$]AX9!iCu=?ak97=kJIZK29DK(/Qs#rFl9lps.>"get3:*6A1&I-[@:)d#5O&286kk?2\2nOuuCgcd,6bpNNnP$ErGbuY._BruaKl%)TpiP9%"aA^)pN-oHZ`ojPi"f-J\c$4C3;?07n-P"c)T"%AP(m,lL4Fp&l7m0b(:GC1_Bs!4qMj;0["-+O8K&Aj2!!N@&Q1lCcA(kq0>;`.`V5JfqR`A%GP:;&l6`u)A<_RlI'WOl25L34n+?PD@.?ogLaX:BSta@rSn/_tiRA!Wu'H>9A6-h:WLWrkgr3h>G7\r`4KOYJ34*9u0eUm$Tf)q=>%5;Yd<_rj2k?kMs#RlLOS*msu,EVn^O2.0i%j4E(&/n9lq;6r.I0hIc:O.qCO=V.e/\VlU_ZBk1P"pQLL"fl_,&1F]Z7X\^Utk%s#65I^q^7?pdd;5NRC.8ACV1Xo65@9]F/Ufhn"`K&c_pl6Ia6d*)C(M7+=;(e(-,42XJhV@YMWK?Kdp`NS6Vae68g>)Ds/=r8"\P2"@1qD4uT2()BO.@/VcbB1OWHp0H*W=K>`A@)cAMS7iJ1o>_*bb^?`=1S2UMX$F.#Va#;(e'B^q>/9DjQN^@`RGTpmr\Ac"AQC/F5K4-L4l=YHBSsOO+6!af2%g]lDfd46S.`"q497efY+daX[@8,$g]00c&G7\_@o"Kc,46qqsR"._!U0BrYm6l?T3TQV$!&.rr&@8(.MD5#jEA@5qMjrMH0sqTrr1*]T=Fp-TD+iQMu:3bhi$%":EcI!GVrJQ^*Pn[KCS@>/1%:g#^BB$(pDaCpA#NFj^3-$^l_idh2_Vjlp<-eP<-#!ep#K%9]_r?8j5A:,e!u4a]Le5e:nGV4kUgoH7G8s;M^W%rStJ.G``4R]P-fT*X\pFq5&lHZW*f=W"c7-N3l4f)3EO2O$1aE,:<7HNr^J2,&(bSo9Md5E9dWfdl`IVrT/#^$AAC\W1JGV&0;@A#]-2Rko+E<7XU.d/1*toY((kdfMAFZ20Xq3CQ:'HCDE[`YT.18mh\psIZ?piQ'CGnrn_cc^`Z/i9H$ZTN:K!o?M6iAg)G*VN%hCl!)3Hg,(Ss6=M&.(;SD^uhR'uV]F2cbjB45L]S9-<#dN#XdAfUF_b!=p\)B+bqo_l0V8eeV8Tb"%GJal;]0f]FA.6e:1:He*NYdHbS@4M]aENCqRKd+iH.>i6N?bjT<9r9DQ",ZE=b/eC9#u.C.!N+^u>(jV'PXhPUA3Y?TPnl;^Fuojs[DBDV$p1I:*NRl#0tY6oT+":IoD0h-<(2qkf[h9aY]T,7?U&oH-V>NK!U2p:$cr;gVpKtW*iaOncsP1V34C:Z;/UHQ$7"P3t._eul7^ZG6f435R$T2@M'TWZBAcW]S'A*Z$NDc;=_a_9)[q<(FQD)THN>"?!FgU_-`+kKI(b3n2'1BKdm2T>ueR_-><7!Yc/_'/\%So?(PU9X:T$;N4.+>]fbsea[!]p0OTW'_UiDV@Tg_teOP.85=DiPTCecsWUOrUiHJl!I,JIdGS>."hN(`cgW`o8q/pU3$4hrI0q6SHl!r&gLbAk?seYiV#ZV'a]0UrZ\(a[]7Z8\n\lgp)52-#5=DE>5')se\0@.F74$stC#^!-q2>X/**U0gi=Zf$\!XFW/1DtGc^-njf<+q)#Y9Am4_C6uF`E6HoP.,6[#*jaG<7b`@8ASR#d)&lkQiF*&kAOE&<"WjhuaL0G#-Sft"P6PAJ:RtRQ*#t#k)r%kq-.W8We>(J+*XgB_hc7WOna8!;Xduhq2Tc'`lWA%E8Ji;@'(lApkQ`:$GZRm6nF2cNm^<;d#-METQV(d*PhTb[ZZ&k,7)2]aW8AYBi:Au;"6OO;KkH.A!U6Sqn8JLVGIL@?nQ6+T[`cV9]AFB'Uja&+6jlO71pTr4nKbMXggi?&p4][JK5aC9?Hh"W-=-hAgKQ$bjt+.mF_&`(AI2E"'uH4C^hZBk^C^Mg:\C2$6?8bX8Mbgh4#h-!X39#-8p+Z)AYklfHcAuslfo.AZ/YgaK`mfYV;YS3ULC`A=&h>.>UHA=JJI'bpL\X=Z-1eR[*HN08.iRVl]8\.ctFmo\m:JGiJDM[)g,iPLEkOHjl9.T)(t#B-)9CVQDmuNMM'gDkqmg^$]?S&^(dPUVt7cD(.i^9MkeUt18.G0?G["L[kqH*;akRCI;Z@GD-QO!pOBWZZBSlOPtOtGJr`OXVh.0;XA>_E=&hk&9soY]\#;(Si;35/^6..cr66]of]b;5LDH1+:UbRqhE"8V+M&l(djjg.ieX`)#Ue,th5G3SVlNgA3m=(gLSTJ:iI&./:5qW[;E4h>bg;\qC6NY@bJrt.Gk>t*Lp'g<9Hs&*WsQnMi;5)TSuLO]O"NO%'7@@N3hBZ?BIAR,WY:Zsa*H'.QX2%&LsO)q80Ii1-7aFr27#iN.c,SVrfCTGK[\t/Um73ZhgcpgN3A/P=M0`PF-'9NO)KHaq$#Q$87Ab+8>YEC%tas\Q\E;dfQg#pf_,5K"E2a=tRcINl>,CBk6Be$lZ-l;ZbjhHn*MbkC-oS&/^oq/_SEAIA>;EAPRj<(3GpsNqqK[37#Jna96/;%JgN.qjaLV&JBWApQX=WW&,8U\9E%JW9<^@Z#rj!%HSb.,TE-e&bS7L4gj],Z(Y$T'gY*,;q`.MN$E7;/%S5E-QUu[k12@fb`PAlcJn-)lu-5Doepn;9uST1[CVFiXXACO3Z^qmdq\?PBM0`[.\j7]ASi8B*,l]uZhM%-A\VkA?VqbnMSnEIB($^_4Dm8",*_3[BmmO>CAoGl^ue4Kh1Kh^":^'7P4l^mMfi8A\4iff:Y$W&dmrM^8jpsqSS2W/IWDL\Yg%fULjb"b\4lShG"^U3Fq^&`u[ES]Ui0G0],T,'*gS#!mV[Z"Ch%QO7-_KHNh>?ktXlF8*s#:d+'OXU[>c>dq3HXP_+d:CFtSVdXZTW12TAZiD(nVBP^;YM[E>#?6I]fH^p4YRP"V2G&P5D&K`Z*H:M9L>WhZ@2f7X51:(u_W$uuaeo,*K8ddo%a=M/"0FQVHAmpl[/=pP]3;?07E!s"V%06^+BaATbnOu<;Kh^"RDHlFumNGsR2U`5m!pV,-Y1b>54#d^a,)Vf0[Mq\uG$FoV:)M20oE&\r/JMe+2T&"nX\\H_NGO?o>"j_]\D*=oW\Ft!/U6eZ2QOhKCq&>*fPFTJk?2\rgNNRUBaAT2QT_dZNG/Y^_!UD\M))d6@Ab08/AeQ-~>endstream -endobj -% 'FormXob.c8ba08e347e6847214d84c863a661d07': class PDFImageXObject -5 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 45 - /Length 6345 - /Subtype /Image - /Type /XObject - /Width 2008 >> -stream -Gb"/l^M@+F(_PS==SM+pNL-W1X)>0#dm+i=er1NUi)1\Y4hpS?,j08h(22fF0%]DBg`B,1jTzzzzzzzzzzzzzzzzzzzk[`]qf;lL_m>oGng:FS8q+e=j5Q,n@fi@?+-A+3PQIl2qd,\3IgA4:UZTq_3I9s6/A#Wsz!!!#BkN:Sj=)L,OXrS7I$B5_fZ<8ig+dHJ+9kj2/3Ne[D!p+'>nlY+sGBg?G;Y=\fqz!!'CG[qcS:l^Q"Dl"Fu(&Su=.'X_gHq!U=o5#p^be'WQfLgI9pjZ^&.RS*Ehg!s=6[/J,WX\1@Y[\('9>6t90z!!"h&C.5;;=gWc3nW;=i>\,.,a](-iK\#;S4FXH@lQemrC@=,Q2dX";0-nYP5;&W%LY1.R.%LFRi,.nmE)Ql&%I=I?S2(*R,[U3.ai"33V=4:"]Bp3T+Q2*e`$2l5&Q4=99/M6o4YuHM-p`bO#N>=1!aAG*q?4TYgU>CrBk9oeSd9J@2-6HbDIa\0).-Nn(K1Q3G<+ZUpd!J2]c#?iftl4@TAOtlq;;0XlG]aOq\Lp-20L-4,(8i*Aopo(3>8QLPV@UR@BrBq91>,:(SEoW_CHAL3NMWPOmeHRm&/q&Jdp2W:/;Q:3cV;Wz!!'fSAW.;'\I(:a4rQPMd-s;r8qRmUoMR"B,LgHiBLZ^N^YZN7rM42mKF`CA1+gb)%#=JpT[f8"QlUHVrJK1?269.AT[0^>&^?'4*XSh]*dkV\jr;TPp9\,[R&`jU=`ZI4(KW*l=1>4'HRZMR.*%]2g-B>TO@\]cDOGGqUh)IObZh@9\nr&6hIf8X7t8pu\GUH9n3Og;oPn$&nNKK7As182V32QWiEB?B];9.=<4a]hQWO(kdM*"k:"o#XH4nML"onW'!!!!YBllGAj.3t:B[_b=IH1:Pj^Q+El%mfKN44GFLujWuK0A>daqc31U8[!W)%N@;N`Q`\f!`f,@J=2fI?&&4o36Y%q8S1gaD$NY*B`MDTbnl&!LmK!^7<_;8SS^_DH0*&`%mS`*9ZYF)D,&n"/+<#N(@C;MQ7>%"D)A<]?P>mdUe@P33sKris!,"D(10X8E+J7P.h%g1B6PR[Kdb+)%!`]WhM!;8\OY#XBQ(K2QW+A\bl;`2KY*(V(^%KL^X+b6M'H^h\a^q=rKFgHU+bUCnBH:[)L&-FW(T+I$3>KQ!)4.PK?skHiYpj54+gQHZ^O_72tK>0<'1P3M&l@8GJN'n:fP]-fAYA4=[.)mmbI.4t-U]EOL9@5sBF/cG]E9Wl?V8Xp>Y#U+j463s9]bP8]`.B&I$r4DMN)s*'Y26g=a*:NPqdB7KBptHBZY8nWLd,NIYiVpdae(pLf^f$DYt89-==Js'B^AtHKFgHU+bUCnCEtLVqk,H;^#![J)YQo7XdnIUmlhh"CO!8!7Y[2^3F84]W];bEC2V9".V#obh:hAJ[VB#l/82/(9+/p&FE2d#4]NN(F#Ed+VrTl#J008b)=+m+b\(3d::/JOS!G(A%q1\k3f%GcMTo8>@dhA@K`+g!9c"R.n#TNlpEXc9[tKA/u;hXUFlC`XV3r<7ic63n`f&4.aC>+0Zia3^nY^D#hQi%^VjfqUa[=DN/h]8W]3GYP[=WVLI-YH0i-e=X1Da]35QW@P@NhUo34h'/tr9#J*4q-#XJ$e4\*Wo:.Q+QkcIJ04e7XkK&jV5d\Ll"lbt>9WS&l*JK[GU"M3ofV,^iJ.q5J<*h@g:c3:G/1r2S[I<=MjEo:g"ekL1*C9\T,J^bb7;fGknp;J=4goL.Z"g*#U+j463naA>ZK7c8,U)I^i+7.7RV!;9G.MAD_u-@G#6_Ap$>_$4.i+N0+CjhN%iij/=WN%Bip'11ojI-1"!!UGj\uX6edjr]s[[]Lu45N4e4:U*:Pb5K;3`oR<9\-O`=lQNjV\-*@p"q;pLC3:]'$jbrS$SA;WtmUjH[@)ihMcX"oI,OAEXJOd0hQFD)s?9=$\GGYXE,#U+j463n`f&6cY]F27S"^)@XN:F>OP!jt8.m25im(j8a/(*h@NCeO)6[h38>qMe4!g'XtRX3o`t(uAQ\!uh?)^6,*pPJmM@o=9f\m:a4GTP9gV[)uqL\&RM!K`7"""+H[KP42O&!)-)4[>E0j%=`Hj$b=8P+HTbW>'oXb&>MmhLU`c)Rm`":#s5KlT&-'g7n%RS+&?biT^[K6nH8=,H*oB'CS2Vn""`7/Z!2]XtD(DEZZ1E^bb"iT9)mfJ9p>XNo"k(n#nr9b5A]HPT9q7"#)^5P2KFgHU+b\3'b-n:?5.kadCt+X#ps2q[P8gsbM";^YV^XDq[.`5!VdUdG?)j;HAaj5/_LG?;4fP55D"H>Tb_@u%T"i(HSup8Pn$>8XoA$dLD5AuYo?@:`cA=U41rr]lhr8B;924HoMc6O[YkaF1eX2#RY6ADt/=^/63BG_O7SU5QkaruPf,]$pN5oMBAJo?LCI02a4lO+qhEf4[J'?tVQiI*dz`s*dQ8lSJ8i'5iAn06#i^5WE9_2@mh_iOPtZ?T4kBn5SuC?[gc0(g:sC04'h[sJ_tGO0F1cXU2aa,\q6WU;*T1uD5kXR^djXR\g5baE/T3,q^C'I/gMX_`cnHZ?IagIE@[q=&l]q,LUYF2,_onh)lg>4=WU[#28Od>C.SjPTZ(3el'_hgGTsnGNgsz!!$+Y4Rp#1(=TQ&PU<;j*P,D`4%6Tu6>8cmK;;2%F'*aaL@]$/`-H*kFpW`=*1[GXh)<5&5ka(R&r+B"6W7@.qo%[2CrDuB9OeV"g+z!!!",Q20C:?U+I!4#8V:SA-@7Oe5.u3TRV#CW?A(MQG5gU/$`IEe+^PCZA2&McSo%h1`t=sq)8k+5O;H:FsugiHj7cU9Vr[W(n.$0aMHQ*LA;]stY!]smb5p!9ui=atndmJVs0WXaDARtQEW%n^?&>rqdb#YtKGJsKi.3M>2WSR\HQHj-,b@?#'a82!OD#=g7C7XI?jIP/CSJHl/TzJE=)KJ!_;@B)&;FBQ8lsYHmcp3@Dto6or%&)_5D^]*b@3/l%nsI.d$%,/"?]q;(cu[i\!i]/g\hkfiBmd+'58OpRa'BfY"M21:q_5QLibzJ)@BDpR~>endstream -endobj -% 'F3': class PDFType1Font -6 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -7 0 obj -% Page dictionary -<< /Contents 11 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 10 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R8': class PDFCatalog -8 0 obj -% Document Root -<< /Outlines 12 0 R - /PageMode /UseNone - /Pages 10 0 R - /Type /Catalog >> -endobj -% 'R9': class PDFInfo -9 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20000101000000+00'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R10': class PDFPages -10 0 obj -% page tree -<< /Count 1 - /Kids [ 7 0 R ] - /Type /Pages >> -endobj -% 'R11': class PDFStream -11 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1634 >> -stream -Gau0CD/\/e&H3^ns5C[+9oDCSWE8QCqDNG2\$e)s%HnU#VCXTfW/+DXs81W7Q7Y2@]FGbugGJAD3^3;n9,RI!@eMTr!+%;:`ENP*_m07XH6Fis_jfcL`SKX0Q#U1\aZ/nO;2,.\ZP,`gU]E"c\GH+(V;F\ieIoao#C+d8DkFl:.kIpi&og0B4Z5`A6@Fa_dY\Uk=;?,NP@nrc]0WkF`^#uI_]j6O19D69MJ<-;c\co3iN/aEK![gn$>N9[lB&(61p't%f<=lA>-+!C.j$[aCF(@caE"su3$UM5FMmp2C*eW3q;e7\YD^N5].O1=VQ5#*T^*ZHAB0kKnce>Yl<&Z.Yd)GQ9i9BF_doH;'(aX]0]Lql`$6gMB2\[n;L_$]hceBP04fJ>>;\OFCNMi0M3la`*61o^MNoDpF7,,IQnE!;\e_G9C/S[(mRMhNXHaXleA5bI?EALaeIt"lFYCe4"Ca'b_$B.tr\mXolM]?I+*>[.L/e-`Ye^7sNJcnoe4V!TX(^uWNL^.B+4];Eb)DHCkJK`/Y0>1GR/kbV@5(kUe4e]e@oFLYU$,M:!!`Xl0S^Tfq[([Oq\JVikfHt.b]RNrsqO!bL7DR)7DVA+X7$`Qdq,O,eAiA=)jHTmq!*aS@/<[Z@4%,B+50;g+/L5(mJ+f?^VcOEAUbTb8/O!DIb3\`*Z`"%UJ*7k'$^`9n/lq.a/bq(rpJum^=.eFMP#u"8r2kAr]PNo#QV.`5/7RS1r\drkO1A7WA#*10V'3,1CB?B*o$lf0\ddnZCN]J15h&X@q/[S;EGeK+m.(d9PA-+.U>%U5$2G79=5cpU7tCH_qJ]s!9(upXRpendstream -endobj -% 'R12': class PDFOutlines -12 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 13 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000614 00000 n -0000007014 00000 n -0000013597 00000 n -0000013784 00000 n -0000014178 00000 n -0000014314 00000 n -0000014584 00000 n -0000014691 00000 n -0000016470 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\223\367y\354\321\362\222Ju\262\315V\3448<\372) (\223\367y\354\321\362\222Ju\262\315V\3448<\372)] - - /Info 9 0 R - /Root 8 0 R - /Size 13 >> -startxref -16522 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-046-lists.pdf b/z3c/rml/tests/expected/rml-examples-046-lists.pdf deleted file mode 100644 index 6317fcd8..00000000 --- a/z3c/rml/tests/expected/rml-examples-046-lists.pdf +++ /dev/null @@ -1,82 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -1 0 obj -<< /F1 2 0 R /F2 3 0 R /F3 6 0 R >> -endobj -2 0 obj -<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font >> -endobj -3 0 obj -<< /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font >> -endobj -4 0 obj -<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 197 /Length 6121 /Subtype /Image - /Type /XObject /Width 309 >> -stream -Gb"/l^Q0\[&]ap8-\i2ucj=5N-F&B2*&rS,^lh8#OU4]pO9j*&8&-nb>+sIunDF=o/>mXT=rr[$BDR%WJ%V4up&1g&Nh&*l4]U%geQ"JnQNZ=Gr;>]n!F(J*G^*p#HHF]L]j@1dnK,0gdo5Qk9Wg(ia2d_)R_X]?tNb24efmBAbN\7?-qgiM?9+l[j9FF.,f.0h,>aJ4T!e!f,pt&fi'8;(*m1jGCFE+ba:p/WDDLQ#8>d_(GFJ\b#3L@5S@_XgeOYG<"LZBEN]52BJs0"[=2T^ATc;!pi#Y_)&U5_n)bcW'Ypt2WsBA[kJ1/7hnHh[okpVZ%6'1+LiGmhO'&U(Aq:iq=]S]>I&TX4;1+ecDtDqI\,X=(=*+\eaf`p=>RcFTS,"6`R&Jf4:T+YbehB)d`n8'gNj$IG<"LZaMQg!6S1u!E(`dM3Dp,Bpe4%o$]AX9!iCu=?ak97=kJIZK29DK(/Qs#rFl9lps.>"get3:*6A1&I-[@:)d#5O&286kk?2\2nOuuCgcd,6bpNNnP$ErGbuY._BruaKl%)TpiP9%"aA^)pN-oHZ`ojPi"f-J\c$4C3;?07n-P"c)T"%AP(m,lL4Fp&l7m0b(:GC1_Bs!4qMj;0["-+O8K&Aj2!!N@&Q1lCcA(kq0>;`.`V5JfqR`A%GP:;&l6`u)A<_RlI'WOl25L34n+?PD@.?ogLaX:BSta@rSn/_tiRA!Wu'H>9A6-h:WLWrkgr3h>G7\r`4KOYJ34*9u0eUm$Tf)q=>%5;Yd<_rj2k?kMs#RlLOS*msu,EVn^O2.0i%j4E(&/n9lq;6r.I0hIc:O.qCO=V.e/\VlU_ZBk1P"pQLL"fl_,&1F]Z7X\^Utk%s#65I^q^7?pdd;5NRC.8ACV1Xo65@9]F/Ufhn"`K&c_pl6Ia6d*)C(M7+=;(e(-,42XJhV@YMWK?Kdp`NS6Vae68g>)Ds/=r8"\P2"@1qD4uT2()BO.@/VcbB1OWHp0H*W=K>`A@)cAMS7iJ1o>_*bb^?`=1S2UMX$F.#Va#;(e'B^q>/9DjQN^@`RGTpmr\Ac"AQC/F5K4-L4l=YHBSsOO+6!af2%g]lDfd46S.`"q497efY+daX[@8,$g]00c&G7\_@o"Kc,46qqsR"._!U0BrYm6l?T3TQV$!&.rr&@8(.MD5#jEA@5qMjrMH0sqTrr1*]T=Fp-TD+iQMu:3bhi$%":EcI!GVrJQ^*Pn[KCS@>/1%:g#^BB$(pDaCpA#NFj^3-$^l_idh2_Vjlp<-eP<-#!ep#K%9]_r?8j5A:,e!u4a]Le5e:nGV4kUgoH7G8s;M^W%rStJ.G``4R]P-fT*X\pFq5&lHZW*f=W"c7-N3l4f)3EO2O$1aE,:<7HNr^J2,&(bSo9Md5E9dWfdl`IVrT/#^$AAC\W1JGV&0;@A#]-2Rko+E<7XU.d/1*toY((kdfMAFZ20Xq3CQ:'HCDE[`YT.18mh\psIZ?piQ'CGnrn_cc^`Z/i9H$ZTN:K!o?M6iAg)G*VN%hCl!)3Hg,(Ss6=M&.(;SD^uhR'uV]F2cbjB45L]S9-<#dN#XdAfUF_b!=p\)B+bqo_l0V8eeV8Tb"%GJal;]0f]FA.6e:1:He*NYdHbS@4M]aENCqRKd+iH.>i6N?bjT<9r9DQ",ZE=b/eC9#u.C.!N+^u>(jV'PXhPUA3Y?TPnl;^Fuojs[DBDV$p1I:*NRl#0tY6oT+":IoD0h-<(2qkf[h9aY]T,7?U&oH-V>NK!U2p:$cr;gVpKtW*iaOncsP1V34C:Z;/UHQ$7"P3t._eul7^ZG6f435R$T2@M'TWZBAcW]S'A*Z$NDc;=_a_9)[q<(FQD)THN>"?!FgU_-`+kKI(b3n2'1BKdm2T>ueR_-><7!Yc/_'/\%So?(PU9X:T$;N4.+>]fbsea[!]p0OTW'_UiDV@Tg_teOP.85=DiPTCecsWUOrUiHJl!I,JIdGS>."hN(`cgW`o8q/pU3$4hrI0q6SHl!r&gLbAk?seYiV#ZV'a]0UrZ\(a[]7Z8\n\lgp)52-#5=DE>5')se\0@.F74$stC#^!-q2>X/**U0gi=Zf$\!XFW/1DtGc^-njf<+q)#Y9Am4_C6uF`E6HoP.,6[#*jaG<7b`@8ASR#d)&lkQiF*&kAOE&<"WjhuaL0G#-Sft"P6PAJ:RtRQ*#t#k)r%kq-.W8We>(J+*XgB_hc7WOna8!;Xduhq2Tc'`lWA%E8Ji;@'(lApkQ`:$GZRm6nF2cNm^<;d#-METQV(d*PhTb[ZZ&k,7)2]aW8AYBi:Au;"6OO;KkH.A!U6Sqn8JLVGIL@?nQ6+T[`cV9]AFB'Uja&+6jlO71pTr4nKbMXggi?&p4][JK5aC9?Hh"W-=-hAgKQ$bjt+.mF_&`(AI2E"'uH4C^hZBk^C^Mg:\C2$6?8bX8Mbgh4#h-!X39#-8p+Z)AYklfHcAuslfo.AZ/YgaK`mfYV;YS3ULC`A=&h>.>UHA=JJI'bpL\X=Z-1eR[*HN08.iRVl]8\.ctFmo\m:JGiJDM[)g,iPLEkOHjl9.T)(t#B-)9CVQDmuNMM'gDkqmg^$]?S&^(dPUVt7cD(.i^9MkeUt18.G0?G["L[kqH*;akRCI;Z@GD-QO!pOBWZZBSlOPtOtGJr`OXVh.0;XA>_E=&hk&9soY]\#;(Si;35/^6..cr66]of]b;5LDH1+:UbRqhE"8V+M&l(djjg.ieX`)#Ue,th5G3SVlNgA3m=(gLSTJ:iI&./:5qW[;E4h>bg;\qC6NY@bJrt.Gk>t*Lp'g<9Hs&*WsQnMi;5)TSuLO]O"NO%'7@@N3hBZ?BIAR,WY:Zsa*H'.QX2%&LsO)q80Ii1-7aFr27#iN.c,SVrfCTGK[\t/Um73ZhgcpgN3A/P=M0`PF-'9NO)KHaq$#Q$87Ab+8>YEC%tas\Q\E;dfQg#pf_,5K"E2a=tRcINl>,CBk6Be$lZ-l;ZbjhHn*MbkC-oS&/^oq/_SEAIA>;EAPRj<(3GpsNqqK[37#Jna96/;%JgN.qjaLV&JBWApQX=WW&,8U\9E%JW9<^@Z#rj!%HSb.,TE-e&bS7L4gj],Z(Y$T'gY*,;q`.MN$E7;/%S5E-QUu[k12@fb`PAlcJn-)lu-5Doepn;9uST1[CVFiXXACO3Z^qmdq\?PBM0`[.\j7]ASi8B*,l]uZhM%-A\VkA?VqbnMSnEIB($^_4Dm8",*_3[BmmO>CAoGl^ue4Kh1Kh^":^'7P4l^mMfi8A\4iff:Y$W&dmrM^8jpsqSS2W/IWDL\Yg%fULjb"b\4lShG"^U3Fq^&`u[ES]Ui0G0],T,'*gS#!mV[Z"Ch%QO7-_KHNh>?ktXlF8*s#:d+'OXU[>c>dq3HXP_+d:CFtSVdXZTW12TAZiD(nVBP^;YM[E>#?6I]fH^p4YRP"V2G&P5D&K`Z*H:M9L>WhZ@2f7X51:(u_W$uuaeo,*K8ddo%a=M/"0FQVHAmpl[/=pP]3;?07E!s"V%06^+BaATbnOu<;Kh^"RDHlFumNGsR2U`5m!pV,-Y1b>54#d^a,)Vf0[Mq\uG$FoV:)M20oE&\r/JMe+2T&"nX\\H_NGO?o>"j_]\D*=oW\Ft!/U6eZ2QOhKCq&>*fPFTJk?2\rgNNRUBaAT2QT_dZNG/Y^_!UD\M))d6@Ab08/AeQ-~>endstream -endobj -5 0 obj -<< /BitsPerComponent 8 /ColorSpace /DeviceRGB /Filter [ /ASCII85Decode /FlateDecode ] /Height 45 /Length 6345 /Subtype /Image - /Type /XObject /Width 2008 >> -stream -Gb"/l^M@+F(_PS==SM+pNL-W1X)>0#dm+i=er1NUi)1\Y4hpS?,j08h(22fF0%]DBg`B,1jTzzzzzzzzzzzzzzzzzzzk[`]qf;lL_m>oGng:FS8q+e=j5Q,n@fi@?+-A+3PQIl2qd,\3IgA4:UZTq_3I9s6/A#Wsz!!!#BkN:Sj=)L,OXrS7I$B5_fZ<8ig+dHJ+9kj2/3Ne[D!p+'>nlY+sGBg?G;Y=\fqz!!'CG[qcS:l^Q"Dl"Fu(&Su=.'X_gHq!U=o5#p^be'WQfLgI9pjZ^&.RS*Ehg!s=6[/J,WX\1@Y[\('9>6t90z!!"h&C.5;;=gWc3nW;=i>\,.,a](-iK\#;S4FXH@lQemrC@=,Q2dX";0-nYP5;&W%LY1.R.%LFRi,.nmE)Ql&%I=I?S2(*R,[U3.ai"33V=4:"]Bp3T+Q2*e`$2l5&Q4=99/M6o4YuHM-p`bO#N>=1!aAG*q?4TYgU>CrBk9oeSd9J@2-6HbDIa\0).-Nn(K1Q3G<+ZUpd!J2]c#?iftl4@TAOtlq;;0XlG]aOq\Lp-20L-4,(8i*Aopo(3>8QLPV@UR@BrBq91>,:(SEoW_CHAL3NMWPOmeHRm&/q&Jdp2W:/;Q:3cV;Wz!!'fSAW.;'\I(:a4rQPMd-s;r8qRmUoMR"B,LgHiBLZ^N^YZN7rM42mKF`CA1+gb)%#=JpT[f8"QlUHVrJK1?269.AT[0^>&^?'4*XSh]*dkV\jr;TPp9\,[R&`jU=`ZI4(KW*l=1>4'HRZMR.*%]2g-B>TO@\]cDOGGqUh)IObZh@9\nr&6hIf8X7t8pu\GUH9n3Og;oPn$&nNKK7As182V32QWiEB?B];9.=<4a]hQWO(kdM*"k:"o#XH4nML"onW'!!!!YBllGAj.3t:B[_b=IH1:Pj^Q+El%mfKN44GFLujWuK0A>daqc31U8[!W)%N@;N`Q`\f!`f,@J=2fI?&&4o36Y%q8S1gaD$NY*B`MDTbnl&!LmK!^7<_;8SS^_DH0*&`%mS`*9ZYF)D,&n"/+<#N(@C;MQ7>%"D)A<]?P>mdUe@P33sKris!,"D(10X8E+J7P.h%g1B6PR[Kdb+)%!`]WhM!;8\OY#XBQ(K2QW+A\bl;`2KY*(V(^%KL^X+b6M'H^h\a^q=rKFgHU+bUCnBH:[)L&-FW(T+I$3>KQ!)4.PK?skHiYpj54+gQHZ^O_72tK>0<'1P3M&l@8GJN'n:fP]-fAYA4=[.)mmbI.4t-U]EOL9@5sBF/cG]E9Wl?V8Xp>Y#U+j463s9]bP8]`.B&I$r4DMN)s*'Y26g=a*:NPqdB7KBptHBZY8nWLd,NIYiVpdae(pLf^f$DYt89-==Js'B^AtHKFgHU+bUCnCEtLVqk,H;^#![J)YQo7XdnIUmlhh"CO!8!7Y[2^3F84]W];bEC2V9".V#obh:hAJ[VB#l/82/(9+/p&FE2d#4]NN(F#Ed+VrTl#J008b)=+m+b\(3d::/JOS!G(A%q1\k3f%GcMTo8>@dhA@K`+g!9c"R.n#TNlpEXc9[tKA/u;hXUFlC`XV3r<7ic63n`f&4.aC>+0Zia3^nY^D#hQi%^VjfqUa[=DN/h]8W]3GYP[=WVLI-YH0i-e=X1Da]35QW@P@NhUo34h'/tr9#J*4q-#XJ$e4\*Wo:.Q+QkcIJ04e7XkK&jV5d\Ll"lbt>9WS&l*JK[GU"M3ofV,^iJ.q5J<*h@g:c3:G/1r2S[I<=MjEo:g"ekL1*C9\T,J^bb7;fGknp;J=4goL.Z"g*#U+j463naA>ZK7c8,U)I^i+7.7RV!;9G.MAD_u-@G#6_Ap$>_$4.i+N0+CjhN%iij/=WN%Bip'11ojI-1"!!UGj\uX6edjr]s[[]Lu45N4e4:U*:Pb5K;3`oR<9\-O`=lQNjV\-*@p"q;pLC3:]'$jbrS$SA;WtmUjH[@)ihMcX"oI,OAEXJOd0hQFD)s?9=$\GGYXE,#U+j463n`f&6cY]F27S"^)@XN:F>OP!jt8.m25im(j8a/(*h@NCeO)6[h38>qMe4!g'XtRX3o`t(uAQ\!uh?)^6,*pPJmM@o=9f\m:a4GTP9gV[)uqL\&RM!K`7"""+H[KP42O&!)-)4[>E0j%=`Hj$b=8P+HTbW>'oXb&>MmhLU`c)Rm`":#s5KlT&-'g7n%RS+&?biT^[K6nH8=,H*oB'CS2Vn""`7/Z!2]XtD(DEZZ1E^bb"iT9)mfJ9p>XNo"k(n#nr9b5A]HPT9q7"#)^5P2KFgHU+b\3'b-n:?5.kadCt+X#ps2q[P8gsbM";^YV^XDq[.`5!VdUdG?)j;HAaj5/_LG?;4fP55D"H>Tb_@u%T"i(HSup8Pn$>8XoA$dLD5AuYo?@:`cA=U41rr]lhr8B;924HoMc6O[YkaF1eX2#RY6ADt/=^/63BG_O7SU5QkaruPf,]$pN5oMBAJo?LCI02a4lO+qhEf4[J'?tVQiI*dz`s*dQ8lSJ8i'5iAn06#i^5WE9_2@mh_iOPtZ?T4kBn5SuC?[gc0(g:sC04'h[sJ_tGO0F1cXU2aa,\q6WU;*T1uD5kXR^djXR\g5baE/T3,q^C'I/gMX_`cnHZ?IagIE@[q=&l]q,LUYF2,_onh)lg>4=WU[#28Od>C.SjPTZ(3el'_hgGTsnGNgsz!!$+Y4Rp#1(=TQ&PU<;j*P,D`4%6Tu6>8cmK;;2%F'*aaL@]$/`-H*kFpW`=*1[GXh)<5&5ka(R&r+B"6W7@.qo%[2CrDuB9OeV"g+z!!!",Q20C:?U+I!4#8V:SA-@7Oe5.u3TRV#CW?A(MQG5gU/$`IEe+^PCZA2&McSo%h1`t=sq)8k+5O;H:FsugiHj7cU9Vr[W(n.$0aMHQ*LA;]stY!]smb5p!9ui=atndmJVs0WXaDARtQEW%n^?&>rqdb#YtKGJsKi.3M>2WSR\HQHj-,b@?#'a82!OD#=g7C7XI?jIP/CSJHl/TzJE=)KJ!_;@B)&;FBQ8lsYHmcp3@Dto6or%&)_5D^]*b@3/l%nsI.d$%,/"?]q;(cu[i\!i]/g\hkfiBmd+'58OpRa'BfY"M21:q_5QLibzJ)@BDpR~>endstream -endobj -6 0 obj -<< /BaseFont /ZapfDingbats /Encoding /ZapfDingbatsEncoding /Name /F3 /Subtype /Type1 /Type /Font >> -endobj -7 0 obj -<< /Contents 12 0 R /MediaBox [ 0 0 595 842 ] /Parent 11 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> /Rotate 0 /Trans << >> - /Type /Page >> -endobj -8 0 obj -<< /Contents 13 0 R /MediaBox [ 0 0 595 842 ] /Parent 11 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> /Rotate 0 /Trans << >> - /Type /Page >> -endobj -9 0 obj -<< /Outlines 14 0 R /PageMode /UseNone /Pages 11 0 R /Type /Catalog >> -endobj -10 0 obj -<< /Author (\(anonymous\)) /CreationDate (D:20140910122904+05'00') /Creator (\(unspecified\)) /Keywords () /Producer (ReportLab PDF Library - www.reportlab.com) /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -11 0 obj -<< /Count 2 /Kids [ 7 0 R 8 0 R ] /Type /Pages >> -endobj -12 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 2852 >> -stream -Gau0F968iI'#(9ds.OAs9Kr?uu"X5+H#tZfnBj(&n[i6G=l9S%>m':2dGVo84!8Uua@US.*dsn,$i6qdUr60]En?<&XcEB/S=lh_%uNu]Qs7,QKQqm;2!3V^?<)'O0pVm$5VD(K]C@3+1QB]\T-OsJa[R8B+m&n6`;-cW!)W8@^qp/*kK[^8M,J$-/5g?=U,?UZ,<"i#'M]e84NcW;u2M9#@PP[NdjnAX9WOII6Iq6!9!l=`0FN"k?cV0+,N1cQ`I2$+r]O>GrgN6js7m]7\?hM:Nq5P51;<<.WR4rq"3cW^5ICoHW+oS7n0rf_.k/Mh?_qO`pZ:J())mu.uupS8NGetNjD[Oh+J/YQFm9uO<@'%&a9IahK>o,*dF=1,m]ZJJ476Lfr7pV^&UlOp47JX'n2=Vl3L>rj3N>S/^Y$'d&VZIpS(ek(l2'cJjNKSgD6U5>Z61cl[gM6[1\U7B''*)2GceS,F"!Mr>R+J&t29O:;uh&E;o85l,&>b![an(Tpfc,(#VF0,8!2Q(^?cp/Ic1KQf"V2oOlWlp0LD6%W.r\5S#p\AJ*I%tL2/jhm\&;R=?"gQ/`2cZ3M#N!e^lCeSs-_`)(N?cT1S>L4A^&sSsqTuH';X["-(2>`kcJ<[ZeHRk)=NV@6Qoa;Vsmpifs=MHPLl?^$o.]I>Qg.P0KVk7nq4)94"EAI4T^UQ-2!6B,HnT/fG.lJd[*''McI%!d(kZ"7@j(RnZCs$,DDg4+NZjoJB*WA.#NWGgSXf!m1PB5Iq-u9udF`@\HRQ.2XiJckMU0$H\=++*:1o__dW!'_NE5lJo&2btT?FFG6=@']MJ]L_S&Ii^6e'4Ok/*6W;VGZo8J1$aDZT:%$b*9q7*]HkC1Y.B&s`,67>c+j'J]"51-n9Bk:Tu\qhkEX?0d:Xa\Vee1):ElWjQ/Yr$.;QlN>a-OHnTU5j@r@`:l1PTr;$iL63Td6,b&bd#V-Rf8.fU=?!/VEYIZLr'H-Fm7l2%%R.QMUHhL"GnY[\"-N"(CU"q_Y68K1%U!BKl"g+='8W%@\UCk^)Tf3r]ia'CX5(7YbHJGBDZsusc0#N$idg#[n$KJ@sc>OLj#*7QB6Ys8-X3&Pp:;]ap\B[MAnCM$?J)?-U`:Y%;cUB[%KR6Et/DDb`^McM@H4Wli]Ss.dU_naSJ(LV@s"@t3]7t`Wd[$J4-a0N*W==1)e$7A#&e&X%r.WG;5.eT4s5`h0S(JH'AQ30p2LuqP?(L4NNF>lM(k_(_4\b$m:>-e."8;Nhc:$,ZU`qQ;=iZ#NJT2]=N'J^fMks!=N=_n-AiK4Lg\10lAktRf!8rX-TOg_@$G,n8#F)$im%\`D-71iWLtk$+c%CL,!9@0[ZDr#XDV-thT/B0F;c;W!A2DThF._Ea9jJ\B[#CYF&B_G@iF]\2aHoEToQ)njFZS-OTs;YacL?_OiYX^65<*lg^&6MTn*#Ta-lQ/;J?E_=k6"kTg:B*J&>tGV+@])<_*j[\J[C8@Z"qV:",f!.Hr+$G95"?MI&shmAR!q)9KbNA0"@c%/thH30WL]$`tPCRush9q"kLme3F48-_L@-(i[t5hXFmKteoE)'p/'Od2h4!*caH;,X"quu&4p6Xdd+SB.9AA0K$8:2,B:!W0SUkK8b0T++fU[1OP2MMj?-s]'Ef=Gdae6K>BcMa]mIofF_r2`Y)!l$Y`UWiT!nbNK23hK/G6-3P]SnaO)u`Zu(TT?D'B@F]:b<;%+`_SZsN5j]Q4,j:T>`K=oBD2/XuA,/Z;8mXG(\%'Qu(%`^OqE6\4#mJT"tM.\&g&5HV`Rs4l;INVU,~>endstream -endobj -13 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 450 >> -stream -Gau`N4&a!]&FM?>K`'C8keL^gB^e@E]N+:29h(7@$+2QURF-mPpq]>+Yq8)l;R.aZAL!!YQH*$!Y;K&$ZtsRm(n2'aZ3nX?&0Q+S/&"Jgk*JB''a.1`.]?!bMB:Ml-,DED#'8$>`n,N[TR\-dGLo@203?nR=i8tFITH@=]V@VN&.1Kb*JM450:eELS\4;_oTiADR-N-e-g4n:gn5f5cu80Uj*seTlLAM>b#$\hShopb2\GB-6N)s"p"~>endstream -endobj -14 0 obj -<< /Count 0 /Type /Outlines >> -endobj -xref -0 15 -0000000000 65535 f -0000000075 00000 n -0000000129 00000 n -0000000239 00000 n -0000000354 00000 n -0000006672 00000 n -0000013214 00000 n -0000013332 00000 n -0000013642 00000 n -0000013952 00000 n -0000014041 00000 n -0000014278 00000 n -0000014347 00000 n -0000017296 00000 n -0000017842 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(6\032\015\272N\274\277\306\245\037\317%\026\)\232\030) (6\032\015\272N\274\277\306\245\037\317%\026\)\232\030)] - /Info 10 0 R /Root 9 0 R /Size 15 >> -startxref -17892 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-047-condPageBreak.pdf b/z3c/rml/tests/expected/rml-examples-047-condPageBreak.pdf deleted file mode 100644 index 009629a3..00000000 --- a/z3c/rml/tests/expected/rml-examples-047-condPageBreak.pdf +++ /dev/null @@ -1,502 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 6 0 R - /F4 7 0 R - /F5 10 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.0086924a45e007495af99df70126eb1b': class PDFImageXObject -4 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 197 - /Length 6121 - /Subtype /Image - /Type /XObject - /Width 309 >> -stream -Gb"/l^Q0\[&]ap8-\i2ucj=5N-F&B2*&rS,^lh8#OU4]pO9j*&8&-nb>+sIunDF=o/>mXT=rr[$BDR%WJ%V4up&1g&Nh&*l4]U%geQ"JnQNZ=Gr;>]n!F(J*G^*p#HHF]L]j@1dnK,0gdo5Qk9Wg(ia2d_)R_X]?tNb24efmBAbN\7?-qgiM?9+l[j9FF.,f.0h,>aJ4T!e!f,pt&fi'8;(*m1jGCFE+ba:p/WDDLQ#8>d_(GFJ\b#3L@5S@_XgeOYG<"LZBEN]52BJs0"[=2T^ATc;!pi#Y_)&U5_n)bcW'Ypt2WsBA[kJ1/7hnHh[okpVZ%6'1+LiGmhO'&U(Aq:iq=]S]>I&TX4;1+ecDtDqI\,X=(=*+\eaf`p=>RcFTS,"6`R&Jf4:T+YbehB)d`n8'gNj$IG<"LZaMQg!6S1u!E(`dM3Dp,Bpe4%o$]AX9!iCu=?ak97=kJIZK29DK(/Qs#rFl9lps.>"get3:*6A1&I-[@:)d#5O&286kk?2\2nOuuCgcd,6bpNNnP$ErGbuY._BruaKl%)TpiP9%"aA^)pN-oHZ`ojPi"f-J\c$4C3;?07n-P"c)T"%AP(m,lL4Fp&l7m0b(:GC1_Bs!4qMj;0["-+O8K&Aj2!!N@&Q1lCcA(kq0>;`.`V5JfqR`A%GP:;&l6`u)A<_RlI'WOl25L34n+?PD@.?ogLaX:BSta@rSn/_tiRA!Wu'H>9A6-h:WLWrkgr3h>G7\r`4KOYJ34*9u0eUm$Tf)q=>%5;Yd<_rj2k?kMs#RlLOS*msu,EVn^O2.0i%j4E(&/n9lq;6r.I0hIc:O.qCO=V.e/\VlU_ZBk1P"pQLL"fl_,&1F]Z7X\^Utk%s#65I^q^7?pdd;5NRC.8ACV1Xo65@9]F/Ufhn"`K&c_pl6Ia6d*)C(M7+=;(e(-,42XJhV@YMWK?Kdp`NS6Vae68g>)Ds/=r8"\P2"@1qD4uT2()BO.@/VcbB1OWHp0H*W=K>`A@)cAMS7iJ1o>_*bb^?`=1S2UMX$F.#Va#;(e'B^q>/9DjQN^@`RGTpmr\Ac"AQC/F5K4-L4l=YHBSsOO+6!af2%g]lDfd46S.`"q497efY+daX[@8,$g]00c&G7\_@o"Kc,46qqsR"._!U0BrYm6l?T3TQV$!&.rr&@8(.MD5#jEA@5qMjrMH0sqTrr1*]T=Fp-TD+iQMu:3bhi$%":EcI!GVrJQ^*Pn[KCS@>/1%:g#^BB$(pDaCpA#NFj^3-$^l_idh2_Vjlp<-eP<-#!ep#K%9]_r?8j5A:,e!u4a]Le5e:nGV4kUgoH7G8s;M^W%rStJ.G``4R]P-fT*X\pFq5&lHZW*f=W"c7-N3l4f)3EO2O$1aE,:<7HNr^J2,&(bSo9Md5E9dWfdl`IVrT/#^$AAC\W1JGV&0;@A#]-2Rko+E<7XU.d/1*toY((kdfMAFZ20Xq3CQ:'HCDE[`YT.18mh\psIZ?piQ'CGnrn_cc^`Z/i9H$ZTN:K!o?M6iAg)G*VN%hCl!)3Hg,(Ss6=M&.(;SD^uhR'uV]F2cbjB45L]S9-<#dN#XdAfUF_b!=p\)B+bqo_l0V8eeV8Tb"%GJal;]0f]FA.6e:1:He*NYdHbS@4M]aENCqRKd+iH.>i6N?bjT<9r9DQ",ZE=b/eC9#u.C.!N+^u>(jV'PXhPUA3Y?TPnl;^Fuojs[DBDV$p1I:*NRl#0tY6oT+":IoD0h-<(2qkf[h9aY]T,7?U&oH-V>NK!U2p:$cr;gVpKtW*iaOncsP1V34C:Z;/UHQ$7"P3t._eul7^ZG6f435R$T2@M'TWZBAcW]S'A*Z$NDc;=_a_9)[q<(FQD)THN>"?!FgU_-`+kKI(b3n2'1BKdm2T>ueR_-><7!Yc/_'/\%So?(PU9X:T$;N4.+>]fbsea[!]p0OTW'_UiDV@Tg_teOP.85=DiPTCecsWUOrUiHJl!I,JIdGS>."hN(`cgW`o8q/pU3$4hrI0q6SHl!r&gLbAk?seYiV#ZV'a]0UrZ\(a[]7Z8\n\lgp)52-#5=DE>5')se\0@.F74$stC#^!-q2>X/**U0gi=Zf$\!XFW/1DtGc^-njf<+q)#Y9Am4_C6uF`E6HoP.,6[#*jaG<7b`@8ASR#d)&lkQiF*&kAOE&<"WjhuaL0G#-Sft"P6PAJ:RtRQ*#t#k)r%kq-.W8We>(J+*XgB_hc7WOna8!;Xduhq2Tc'`lWA%E8Ji;@'(lApkQ`:$GZRm6nF2cNm^<;d#-METQV(d*PhTb[ZZ&k,7)2]aW8AYBi:Au;"6OO;KkH.A!U6Sqn8JLVGIL@?nQ6+T[`cV9]AFB'Uja&+6jlO71pTr4nKbMXggi?&p4][JK5aC9?Hh"W-=-hAgKQ$bjt+.mF_&`(AI2E"'uH4C^hZBk^C^Mg:\C2$6?8bX8Mbgh4#h-!X39#-8p+Z)AYklfHcAuslfo.AZ/YgaK`mfYV;YS3ULC`A=&h>.>UHA=JJI'bpL\X=Z-1eR[*HN08.iRVl]8\.ctFmo\m:JGiJDM[)g,iPLEkOHjl9.T)(t#B-)9CVQDmuNMM'gDkqmg^$]?S&^(dPUVt7cD(.i^9MkeUt18.G0?G["L[kqH*;akRCI;Z@GD-QO!pOBWZZBSlOPtOtGJr`OXVh.0;XA>_E=&hk&9soY]\#;(Si;35/^6..cr66]of]b;5LDH1+:UbRqhE"8V+M&l(djjg.ieX`)#Ue,th5G3SVlNgA3m=(gLSTJ:iI&./:5qW[;E4h>bg;\qC6NY@bJrt.Gk>t*Lp'g<9Hs&*WsQnMi;5)TSuLO]O"NO%'7@@N3hBZ?BIAR,WY:Zsa*H'.QX2%&LsO)q80Ii1-7aFr27#iN.c,SVrfCTGK[\t/Um73ZhgcpgN3A/P=M0`PF-'9NO)KHaq$#Q$87Ab+8>YEC%tas\Q\E;dfQg#pf_,5K"E2a=tRcINl>,CBk6Be$lZ-l;ZbjhHn*MbkC-oS&/^oq/_SEAIA>;EAPRj<(3GpsNqqK[37#Jna96/;%JgN.qjaLV&JBWApQX=WW&,8U\9E%JW9<^@Z#rj!%HSb.,TE-e&bS7L4gj],Z(Y$T'gY*,;q`.MN$E7;/%S5E-QUu[k12@fb`PAlcJn-)lu-5Doepn;9uST1[CVFiXXACO3Z^qmdq\?PBM0`[.\j7]ASi8B*,l]uZhM%-A\VkA?VqbnMSnEIB($^_4Dm8",*_3[BmmO>CAoGl^ue4Kh1Kh^":^'7P4l^mMfi8A\4iff:Y$W&dmrM^8jpsqSS2W/IWDL\Yg%fULjb"b\4lShG"^U3Fq^&`u[ES]Ui0G0],T,'*gS#!mV[Z"Ch%QO7-_KHNh>?ktXlF8*s#:d+'OXU[>c>dq3HXP_+d:CFtSVdXZTW12TAZiD(nVBP^;YM[E>#?6I]fH^p4YRP"V2G&P5D&K`Z*H:M9L>WhZ@2f7X51:(u_W$uuaeo,*K8ddo%a=M/"0FQVHAmpl[/=pP]3;?07E!s"V%06^+BaATbnOu<;Kh^"RDHlFumNGsR2U`5m!pV,-Y1b>54#d^a,)Vf0[Mq\uG$FoV:)M20oE&\r/JMe+2T&"nX\\H_NGO?o>"j_]\D*=oW\Ft!/U6eZ2QOhKCq&>*fPFTJk?2\rgNNRUBaAT2QT_dZNG/Y^_!UD\M))d6@Ab08/AeQ-~>endstream -endobj -% 'FormXob.c8ba08e347e6847214d84c863a661d07': class PDFImageXObject -5 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 45 - /Length 6345 - /Subtype /Image - /Type /XObject - /Width 2008 >> -stream -Gb"/l^M@+F(_PS==SM+pNL-W1X)>0#dm+i=er1NUi)1\Y4hpS?,j08h(22fF0%]DBg`B,1jTzzzzzzzzzzzzzzzzzzzk[`]qf;lL_m>oGng:FS8q+e=j5Q,n@fi@?+-A+3PQIl2qd,\3IgA4:UZTq_3I9s6/A#Wsz!!!#BkN:Sj=)L,OXrS7I$B5_fZ<8ig+dHJ+9kj2/3Ne[D!p+'>nlY+sGBg?G;Y=\fqz!!'CG[qcS:l^Q"Dl"Fu(&Su=.'X_gHq!U=o5#p^be'WQfLgI9pjZ^&.RS*Ehg!s=6[/J,WX\1@Y[\('9>6t90z!!"h&C.5;;=gWc3nW;=i>\,.,a](-iK\#;S4FXH@lQemrC@=,Q2dX";0-nYP5;&W%LY1.R.%LFRi,.nmE)Ql&%I=I?S2(*R,[U3.ai"33V=4:"]Bp3T+Q2*e`$2l5&Q4=99/M6o4YuHM-p`bO#N>=1!aAG*q?4TYgU>CrBk9oeSd9J@2-6HbDIa\0).-Nn(K1Q3G<+ZUpd!J2]c#?iftl4@TAOtlq;;0XlG]aOq\Lp-20L-4,(8i*Aopo(3>8QLPV@UR@BrBq91>,:(SEoW_CHAL3NMWPOmeHRm&/q&Jdp2W:/;Q:3cV;Wz!!'fSAW.;'\I(:a4rQPMd-s;r8qRmUoMR"B,LgHiBLZ^N^YZN7rM42mKF`CA1+gb)%#=JpT[f8"QlUHVrJK1?269.AT[0^>&^?'4*XSh]*dkV\jr;TPp9\,[R&`jU=`ZI4(KW*l=1>4'HRZMR.*%]2g-B>TO@\]cDOGGqUh)IObZh@9\nr&6hIf8X7t8pu\GUH9n3Og;oPn$&nNKK7As182V32QWiEB?B];9.=<4a]hQWO(kdM*"k:"o#XH4nML"onW'!!!!YBllGAj.3t:B[_b=IH1:Pj^Q+El%mfKN44GFLujWuK0A>daqc31U8[!W)%N@;N`Q`\f!`f,@J=2fI?&&4o36Y%q8S1gaD$NY*B`MDTbnl&!LmK!^7<_;8SS^_DH0*&`%mS`*9ZYF)D,&n"/+<#N(@C;MQ7>%"D)A<]?P>mdUe@P33sKris!,"D(10X8E+J7P.h%g1B6PR[Kdb+)%!`]WhM!;8\OY#XBQ(K2QW+A\bl;`2KY*(V(^%KL^X+b6M'H^h\a^q=rKFgHU+bUCnBH:[)L&-FW(T+I$3>KQ!)4.PK?skHiYpj54+gQHZ^O_72tK>0<'1P3M&l@8GJN'n:fP]-fAYA4=[.)mmbI.4t-U]EOL9@5sBF/cG]E9Wl?V8Xp>Y#U+j463s9]bP8]`.B&I$r4DMN)s*'Y26g=a*:NPqdB7KBptHBZY8nWLd,NIYiVpdae(pLf^f$DYt89-==Js'B^AtHKFgHU+bUCnCEtLVqk,H;^#![J)YQo7XdnIUmlhh"CO!8!7Y[2^3F84]W];bEC2V9".V#obh:hAJ[VB#l/82/(9+/p&FE2d#4]NN(F#Ed+VrTl#J008b)=+m+b\(3d::/JOS!G(A%q1\k3f%GcMTo8>@dhA@K`+g!9c"R.n#TNlpEXc9[tKA/u;hXUFlC`XV3r<7ic63n`f&4.aC>+0Zia3^nY^D#hQi%^VjfqUa[=DN/h]8W]3GYP[=WVLI-YH0i-e=X1Da]35QW@P@NhUo34h'/tr9#J*4q-#XJ$e4\*Wo:.Q+QkcIJ04e7XkK&jV5d\Ll"lbt>9WS&l*JK[GU"M3ofV,^iJ.q5J<*h@g:c3:G/1r2S[I<=MjEo:g"ekL1*C9\T,J^bb7;fGknp;J=4goL.Z"g*#U+j463naA>ZK7c8,U)I^i+7.7RV!;9G.MAD_u-@G#6_Ap$>_$4.i+N0+CjhN%iij/=WN%Bip'11ojI-1"!!UGj\uX6edjr]s[[]Lu45N4e4:U*:Pb5K;3`oR<9\-O`=lQNjV\-*@p"q;pLC3:]'$jbrS$SA;WtmUjH[@)ihMcX"oI,OAEXJOd0hQFD)s?9=$\GGYXE,#U+j463n`f&6cY]F27S"^)@XN:F>OP!jt8.m25im(j8a/(*h@NCeO)6[h38>qMe4!g'XtRX3o`t(uAQ\!uh?)^6,*pPJmM@o=9f\m:a4GTP9gV[)uqL\&RM!K`7"""+H[KP42O&!)-)4[>E0j%=`Hj$b=8P+HTbW>'oXb&>MmhLU`c)Rm`":#s5KlT&-'g7n%RS+&?biT^[K6nH8=,H*oB'CS2Vn""`7/Z!2]XtD(DEZZ1E^bb"iT9)mfJ9p>XNo"k(n#nr9b5A]HPT9q7"#)^5P2KFgHU+b\3'b-n:?5.kadCt+X#ps2q[P8gsbM";^YV^XDq[.`5!VdUdG?)j;HAaj5/_LG?;4fP55D"H>Tb_@u%T"i(HSup8Pn$>8XoA$dLD5AuYo?@:`cA=U41rr]lhr8B;924HoMc6O[YkaF1eX2#RY6ADt/=^/63BG_O7SU5QkaruPf,]$pN5oMBAJo?LCI02a4lO+qhEf4[J'?tVQiI*dz`s*dQ8lSJ8i'5iAn06#i^5WE9_2@mh_iOPtZ?T4kBn5SuC?[gc0(g:sC04'h[sJ_tGO0F1cXU2aa,\q6WU;*T1uD5kXR^djXR\g5baE/T3,q^C'I/gMX_`cnHZ?IagIE@[q=&l]q,LUYF2,_onh)lg>4=WU[#28Od>C.SjPTZ(3el'_hgGTsnGNgsz!!$+Y4Rp#1(=TQ&PU<;j*P,D`4%6Tu6>8cmK;;2%F'*aaL@]$/`-H*kFpW`=*1[GXh)<5&5ka(R&r+B"6W7@.qo%[2CrDuB9OeV"g+z!!!",Q20C:?U+I!4#8V:SA-@7Oe5.u3TRV#CW?A(MQG5gU/$`IEe+^PCZA2&McSo%h1`t=sq)8k+5O;H:FsugiHj7cU9Vr[W(n.$0aMHQ*LA;]stY!]smb5p!9ui=atndmJVs0WXaDARtQEW%n^?&>rqdb#YtKGJsKi.3M>2WSR\HQHj-,b@?#'a82!OD#=g7C7XI?jIP/CSJHl/TzJE=)KJ!_;@B)&;FBQ8lsYHmcp3@Dto6or%&)_5D^]*b@3/l%nsI.d$%,/"?]q;(cu[i\!i]/g\hkfiBmd+'58OpRa'BfY"M21:q_5QLibzJ)@BDpR~>endstream -endobj -% 'F3': class PDFType1Font -6 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F4': class PDFType1Font -7 0 obj -% Font Courier -<< /BaseFont /Courier - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -8 0 obj -% Page dictionary -<< /Contents 23 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 22 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page2': class PDFPage -9 0 obj -% Page dictionary -<< /Contents 24 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 22 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'F5': class PDFType1Font -10 0 obj -% Font Times-Roman -<< /BaseFont /Times-Roman - /Encoding /WinAnsiEncoding - /Name /F5 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page3': class PDFPage -11 0 obj -% Page dictionary -<< /Contents 25 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 22 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page4': class PDFPage -12 0 obj -% Page dictionary -<< /Contents 26 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 22 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page5': class PDFPage -13 0 obj -% Page dictionary -<< /Contents 27 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 22 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page6': class PDFPage -14 0 obj -% Page dictionary -<< /Contents 28 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 22 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page7': class PDFPage -15 0 obj -% Page dictionary -<< /Contents 29 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 22 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page8': class PDFPage -16 0 obj -% Page dictionary -<< /Contents 30 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 22 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page9': class PDFPage -17 0 obj -% Page dictionary -<< /Contents 31 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 22 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page10': class PDFPage -18 0 obj -% Page dictionary -<< /Contents 32 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 22 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page11': class PDFPage -19 0 obj -% Page dictionary -<< /Contents 33 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 22 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 4 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R20': class PDFCatalog -20 0 obj -% Document Root -<< /Outlines 34 0 R - /PageMode /UseNone - /Pages 22 0 R - /Type /Catalog >> -endobj -% 'R21': class PDFInfo -21 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121219133156+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R22': class PDFPages -22 0 obj -% page tree -<< /Count 11 - /Kids [ 8 0 R - 9 0 R - 11 0 R - 12 0 R - 13 0 R - 14 0 R - 15 0 R - 16 0 R - 17 0 R - 18 0 R - 19 0 R ] - /Type /Pages >> -endobj -% 'R23': class PDFStream -23 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1450 >> -stream -Gb!#Zhf%7-&:P.Os5B'+\](;)2"dnO#BX`;?qZD)'sKjnKpF,[ZRi'gIYm"FQ3.p7V8/oP+hE;MdH/?6b6r)!^]UkKmWbK9%=EsfGJOgP&?TC7n/e]mC0_Vo>Sg__Y>q"?C8i#/l]?JO:[Y&O8s\Dqq=Pa!#S7Z2nQ@Y(+D?[I@r"d_e'j1q-7cf5?'a(P_.@:i7OH8,)0L&A.\oIL$dR!T7XnNaSc)@`J$U>O+7E[s>LePA*j9X];.==@8@*)G?UN9jSa/!:A^*YfZGqUX4!\IanlFcs4E-\$rTog-D4NMqi-B=Vmf-;We?g8*]8Ir;g`UoK3#ukM\?$QTWkB"^MK;p/i$TF3gL-jA?Vd9XboGbLU^BKf5tiZ,/f%j/gJ>F?$/?"B)?qfAHb)\(%6lPTf\5W[=p\(F_>C1%Rc#08Fk=gq4]+X2S$s#&fhnoEkU$uS>u]7N`WSL$=i>O!%$#Rn4k.fQrI-4YgCb^+pIpIj(9c>2;?5>XeAEg;3gu/n=D$$Og[uTd3^ck\p?"9AWJ`-Xh^&tQ!li$?3FgIbOb^mBQL:@jj;$+'g[''GINVf@jc%tc[B\e;G_OUE38^AhS(joT!959WIB3W)G^f$Iq6=\l<[:"'c\Wqee[Q;KJ1laA)apd@;m);./.l[f2A,h$6gHn,oD%qk\/rJ5'3;G-FVekVS,744?"'Sfn-\8BjnDfMlRhgCk#bendstream -endobj -% 'R24': class PDFStream -24 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1002 >> -stream -GatU0?#SIU'R_pus)?@5DeKlKU:uA!5gqRBcu_epD;?]ohaj7`b+\$rrq@]fbDmR]_b^WuKC/uj3VQcU+SMN.//j&^*%nBC:^6_Y:`aSsDr?%-T0:D25/r,M0#hQ9%l##rq`\Ek8K'qP^uE\$2YpE1Ri3H-i$Wd$WmsS'\C;qX5=#3$j?F-f'BU8'.*)\;..B'IKP)(LI!0MclK4^^)%_tN)<6<=8;N6pi]bOdpBdNE`[+p-]/<)>1R&GrS.n)ilO+LZ;gmftQ87FMcr-,9T`niZDICiiN:;X8+/<"odqJCVESLX:[C`D;Ys&C4:Fs?gZl@UI>0.Kbfd:#1O"]h*r*W@B3G-'adm10`#mK50Q>TGDG)I%7q0lER/X]kM=fVBd3e>,kO`b;p<)@Xp^*Z/#YHNjSb'/%L+3GRC]F+OF^\BgWlib,sB1B&@$hLn%F&860=^pCi05@;7$YY04VQgjS1'#$@Q]JOlQaYQjtXq<\_BC!QM*raiB(h:5B^\nM;L,Pd5Ro%_`ZsOANj@*&=J;:k31"k0..[Mg)aVOM\U@+[8Qg8E;b9oSaI5B<7daSKGi=ZU9mb?@lLI-J/'BU)F]R02DlD:8db(P4/G"T0URhSBHM9[t5B?G'\*39\k%/*^0:V(,o-?_fQrrrM<3Y&jZQgKJ]7q%C!JmdB#H18m-8G'FA:N_c"?MVW:9>,Z>f\r-VL.X6qV>8tZP<2"5U[OQ27\.oc1][__l)>O1!d8`\p_0kqc,fV&#~>endstream -endobj -% 'R25': class PDFStream -25 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1752 >> -stream -GauHL>?BQK&:Wd^rklNEdlo1C/c!gR%&"sm.DZMYlWP4])bX@I[0"RUmmsm@XLgmT")!S#X.=/]4#7r_kk&B'de3Yf1O+CdJC0#&!Xr!`@J1!kbYCr_St0kP"LG`6hp?2'"(lnGHoAJI'B3K^qhSr!g/GL5dVM3?#`\*##3uPPl`Y*3R6Eak-;MX(Uf2);9%;R:ZRq5TkBe@q/IPL3"WdEeaMWQ>JZ$#="*%i!TL;fR#5bU!k-:(!!8XbD^.AR&>6X>T:fXHJifr5?H!SA_2fL*/f4>*$0?eCfmTk'FW)aN59Hf9Z2=ii)L1J98q-mSaF34d(+kbe;7H9uN._VMYO'&=?^F3r[=p3`?)iPnq32^K>H,Z_bs%bg4qDCD_ne$LL*-uqSE%8`YHa1XCQIti%g64XiLpfsfrB]J33ir]5VAKlD"*6QO='VSpUJ!FFVb(Ie.QP*Xf3r`p3-o<-Us2L[.M#.m%6C6'\ZIcV\GI2@7":U68)bcq7.8D;0!q%K8:^(^c?Qj;p\ma):^2Q;4o;[[FQ>>S?#HLZM(N%80$5/[?hR'BZK=U>o]5NS=Alu)uLI?i:/mM/o;j_A5.Yq<+/OLR!)GotsDX2nUW9SJ)'pe7bQGV6?rKYmjNhRAl3Sc6U0;q%`i(Q7u"#WCEKp).3s+L=^ngK7U'-W]AEZS?pV)A!0b"FtAW91W>KEG$Bg)^?B.$lb!D%j=7F9W\Q6Oup`qG4.2:a>[:90q2sYJfmh\mm92*`*`7-9Js6fm]Y'U9!U96[u_1TdLgt_fY3+;Ks't=,\K*!*m#dXI/GZ^uk8T6&:^%$t_".]BIi_MYa"k.3g@;U1K)=YIOtl)BVbjEg`JJGLNa<4T3Q+#W@Bs7qIbZ&5`ai\HG(hOt@UlFe2)Xo2$I<5P%D-),_4OELKR1hTp(s^(>4&MRm0^;!W?*%,j>JmtPH/R=XYf\r8jE)-`b^HOjR,]>=!1L=dMKL'\Ml=TU.2fdTcu\QJKqm0k)N]O\>hFFLl(EB>VYQ.phM[G=HI$0\7/*eWBsk@MVE*h7bWb\@f')nsuDp&mSD&i(gnEdq*le=rF7nbY^DHmc7El?BAeqtt9[lM\FoCTUE=)m,+`DK"^om]oZ4YD$jV^MKEM?D2*~>endstream -endobj -% 'R26': class PDFStream -26 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 401 >> -stream -Gar>B]2HO#&F;R?J(QMQ30L?j-')#%"B8mMuIfLZZ&dJQn'*L4V25*gB_Gp(7hD/3_6$@glE@'@o3MIciA.RTSsi*&Kf'/c&oH5#H22)H$k=rPC$(S6_E$J-6GonlQmI7"t/LU,QE5/G0/&Zq93S0qb+2d<=%8$oJ1nksPJ..9!2[B,p`Zm4k[G2Y&'X,N1>ATl-J9uNZ&l4U4rk#)l:*\U[@`H7n9RG.WB[)tY8P$FQ%^NpQte22*!jR'0.s-;CN8&T?SQG#d%Q6hIqIEp9NE?(k,V_m[YnW%$QWJbeP.>f,$0FcL6qVrn,b2O?Ls*nA~>endstream -endobj -% 'R27': class PDFStream -27 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 845 >> -stream -Gau0@_/e!Y'YJ'*s00sN@#?2NP&)qiTg2BF;!J-afp3:=@L'qfbMOPdYZ`f]BHD`[U[>#6;MiUS\HGt<2_QDMD?B?8Y+6;T:5$*b2EXRH:B`IUu:#@,KFJCS1,*:O@NKo4CXNk1!a>I.Of't,*-o?c7fWh6m@jjTf<`p12@^ETd7Vt#ppKmNGD&)".6SPat+(09&+0n4PGE1Z/G4B#V''qR.].B:666YQ*&d($Z"^T/fV-LWXI.*Ys8_3f'%`;TCIXLT/)LO]L*;8etf4R%lkhsT)TC]!fcTS_g%hdB3$HfK6QS0O&\UrEAqEZO\FVSQZ5YqL(6d%uWsV$02'ENu*UWm<;%^J]:ipDdd3/>I@b1CTqVOe`PI/U"4E.*<%tjNNQ-DpOsr3p8W;gFk(eth,`Y"[%jhAZ%)YHSN1s7@oq4VK9iODj'f),XH]3cLV)g7:1C!4]g&9)V`HQ'r!$*_roX~>endstream -endobj -% 'R28': class PDFStream -28 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 425 >> -stream -Gar'%4\rsL(khWSq%#Cg#1n%r'ugeY\QAU4?M]YXDop-29q"M=qK>O;bC_%_KI?a?@mKHh0AFN&eB4,qIXhR?VfO,h8+QWhC#bo1I+K/;-ks_A"Z7*4QY7*2,)iH:_QH\Wjm"7H:if>?!C<'X"!)Of\MY(sd#3jb7p/6:bV]SQM=A%t[o%[4ZMM,o^[6)HSak>R84pZEWWDK=LRNB<[(LBHi2R2ujO59[nc^W^,JB>7upM/3~>endstream -endobj -% 'R29': class PDFStream -29 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 467 >> -stream -Gar'%btd:Q'SZ:Dnd\0k$::`Zpb,1Eks-O?=MSH%>:4EZbVXNEN,go*(RS$p?-MbV''3opoap1;e!G:TF>B>ato(K!I&+D]VJ-K(oUat7Pf>\b`o"A`a;hE!n!G#_"fQ3H<'$VO#eKkZI>Bbd=8g58q@F_UC\H%LmJ,FU&13+%W,n$H8"L1m&tAYnOH;;PtmCRH+jBg^C,G*Xa?bDJV1QSG0p%hVQsb:=b$o!m0PhVqUYF5EGf?>R9%",@nZ2"ph("@udHLK3%#'+W$OSMu<6Tl;4b7f.q:V]"o8%/i$9#4?WRgf_#@$l8dYMnOJD*kpNS1MZ*n:q64tQt_S>lVj>(e;na^3DZ%)O"e;n9Sh\SbJ0RLQ5c<)OrN.:Dgu$=MuVKC5,?:JiTlhb~>endstream -endobj -% 'R30': class PDFStream -30 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1081 >> -stream -Gat=j>AqtE'S,'kofjGi'[W0"8Xp.i,WaLj;C;[.J-TE9`biV`3&p=Yr-B>Al&m[b(i&/)5.Bu#+!2:$dN<;V70YH+@5PfN*Jg&44kkU6$>8mJn9[,K1'_c#aW,-oND'_!mDgLaKJ(1\=C3_hoT!MeB0Za8Ki=*]"^SCDAG#^U`4mFDe+aCmj1lm_KU`=#(PWKGO_,LA7M?rO+(B+4'`*sP;3*Da[$8pK'ICp&@E3#%4GQ^A3;?t\&Vk1ZYT]jKu3&1(F9jGKP*.q0)RY5jL6C`Qp3>]0^dmVuW%Dg/=\:u_#/dgqpq*Ri`%ahSNX$]6N7C-PZXaqt!"s'dic+m/7-=/9?"#_pIP:7g,q*qW!=:,@Lc'fVU%c3U:X.YX$e32]h=OcBDi+^J%/4$O&FUTRsN"eom.7MhMYp:ib;/CU1*gG>dH"'.+IDV:l_q!'!L@Pd0ah=K&BaNGKCT+,.Lj-)"SB1"Z3p4&;dkUN^k.p8/WfoT]r;HsD4XTO$O<'3Q&<;,HqnJ3gh/UiNi>]]eZ8Lcd%J0!Cq_I!bWg6rXMtG=;g8=s+qsfouDT;qpo-.70/h$2]o@UA>r-:3Kd$#<0Zn+2Mhs*tcHujK[+=ncif<mX/k*))oYfQ'osDO_`f"tCfDT/ZHQ/Tr+*Ua':%d=LklFV\nj!?dendstream -endobj -% 'R31': class PDFStream -31 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1096 >> -stream -Gat=)gMYb*&:HLqJ!eKEGEKtr>q3&hlSL$l3(VI']7$M%>2i!q4.!#Tq$Qn;1MPR$s>:E$KIY[,oM#QVBIB*Bf>U(LpBS$m#i&`*&RSN"S;AER"arhu!6Hc'_b6UD59@mU>XF4P]*a>$_paE&(VZtJTgasc"n3,BCC1:_0('c?^!bOMXo)ctA9IC.:3:LbLH"KD@%W*j[A7gLg#I`5P)"%W[RK>/OgEW(*%kQ<6`Se;#dfH,s,?l3r#KURW6e6NiDC\!;/TE6[3ojc1YN<(_A@V,LaK)IfZ,^S%EONr&#-6_Qr3ST!WfN1[XQ89RdkM;ffU$);rJ^i;cT@hgMJ583o3]ZZq;HUZUi.JKGZEnugK&O?`TI,`6\lJZZJY?Xg^(FQZ'*YH9!b61g+6ebiK3J1Jn)jY$]*ei*k_PsX&`?p,Bi_HjhUT:mMMVroi;7X3>X.*][G>e%$mtGR?E1%O1+n]j>TS[%^]2^4FT>R,us^]=l(+[<2:HQJCRHE>hn+^hWr'F@Mi#gAe-1$T9b*`N]5*6ouOph2dljA`&Ht,1J8,:bP,Y0EJaIN`8+??W,`9@BA+_WQcGts>k6rf>oE[a,8?eN7h5j?sB3RCTe9-O^kK/8*b8AP<^UVfi.W^#'u_Y^+MD?7fD@Fu%Obb$]#chBdX8st9u"\\X0IG+UKnQ^,pRgendstream -endobj -% 'R32': class PDFStream -32 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 961 >> -stream -Gb"/e>Ar4L'Z]*np^Uq!Yt5=Hi]'N+4cC/V8lVW5RegcNJZR.n%]l!m5:7_@JBLBNp+TKA\_jsb6H"p^lP.:GHIsm/4p'NgP.LD:Z=sgApc-iHh\$K:[l+uYoU.V5]">*VMB`4/i^dJ9[-&)T?-4[)&ijle2%CU2Fg;@D)V("aj`W/UjS-AE02sr[m`F6Zr]ZJE2ZK%%Yj8r!dDkMb:V^ml4V.UAE&cfV&#g?:QSLDgK:$2;T&*"Y\::.N&Fb2VT.QT7\m%O_6cpu*(C*-'g^M%>(Jfe67\ZjAmY8KC(!jEAlN#U#&Si2AtX#W"#$^D9VDIMoLV'Vc%JWZDIbe@EV?Mg>$HNdgG"pd$CG+OH:l>;6-%aEgL]Xb\\dEBd>B_T+=T9XbS?>H9+ll2*$a@1I2/gF]^Zgs_B-\#rOY^9TbSfT1Niqk_mhmhD?nq"ntDdqVr?qle'.lbhnS?]IUbX*o."'c)).bDZg4#L^);&-FPhjFR&,DJXQC#0Gko!*+U!s>o1th`>fL_'"u=;,Z3?;p[Eft`-*U*i*8oE;UC2Mn3rT5[DepTgXk3HTVhZj2D;)\FFMmTg\G#I=LRkK>5#!^=iB!AX"oE&r49&W]$SKkQ=I/l"<(?3Ir9nE^LkR%3B->'-OmT,Ub0uTu,S#kp;5`"DD2;/C73XZM:9J$JU_47lerG@$Z_`iPlt"=XYBRHq"D`_M>\`&3;BB0TC=u'_5PqmnS5NDU,i\`_P(rf4m3J`_8%+W!_PD)t)Sa2WjCB",lc\B$Nbp.Z-d=CDBI=nhA5>:endstream -endobj -% 'R33': class PDFStream -33 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 629 >> -stream -Gatm8c#T:-(qb48n$&">gR2IJ9D$l65.-0Q*-)c`(fCbpi1uE@+WCYJoq_sKN94?O]AH54K(tgipNd3p:9[u#:kg5#'p1cP%:>=pm.YlC0Eu7rN6t1UQj;i;LJ)EN9euL`Y4rh(b\!3+h(uF@bZ'$iap(aS9'HF_(h^LS)E.1`jYh%ppWVg2>1m#]<"Yb7t8I@2[]/1ue\(A6??&]5.7\e@n'h7i1odP02u2q&7V#oQ')E%0d6O"T#CFgF3EOoj,4QU9A"XEI%=Y;-gcaWVUdaIB2ET$)G4ZH']Ib:4A&6(Jqg4eHOtk]4Q~>endstream -endobj -% 'R34': class PDFOutlines -34 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 35 -0000000000 65535 f -0000000113 00000 n -0000000258 00000 n -0000000423 00000 n -0000000639 00000 n -0000007039 00000 n -0000013622 00000 n -0000013793 00000 n -0000013952 00000 n -0000014346 00000 n -0000014742 00000 n -0000014910 00000 n -0000015305 00000 n -0000015700 00000 n -0000016095 00000 n -0000016490 00000 n -0000016885 00000 n -0000017280 00000 n -0000017676 00000 n -0000018072 00000 n -0000018468 00000 n -0000018606 00000 n -0000018877 00000 n -0000019074 00000 n -0000020667 00000 n -0000021812 00000 n -0000023707 00000 n -0000024250 00000 n -0000025237 00000 n -0000025804 00000 n -0000026413 00000 n -0000027637 00000 n -0000028876 00000 n -0000029979 00000 n -0000030752 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(6!\022\3430\262\017\242q\204\266\231\352C\217\204) (6!\022\3430\262\017\242q\204\266\231\352C\217\204)] - - /Info 21 0 R - /Root 20 0 R - /Size 35 >> -startxref -30804 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-048-paragraph-flow-controls.pdf b/z3c/rml/tests/expected/rml-examples-048-paragraph-flow-controls.pdf deleted file mode 100644 index 6e9a55f7..00000000 --- a/z3c/rml/tests/expected/rml-examples-048-paragraph-flow-controls.pdf +++ /dev/null @@ -1,359 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R - /F4 7 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Oblique -<< /BaseFont /Helvetica-Oblique - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.0086924a45e007495af99df70126eb1b': class PDFImageXObject -5 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 197 - /Length 6121 - /Subtype /Image - /Type /XObject - /Width 309 >> -stream -Gb"/l^Q0\[&]ap8-\i2ucj=5N-F&B2*&rS,^lh8#OU4]pO9j*&8&-nb>+sIunDF=o/>mXT=rr[$BDR%WJ%V4up&1g&Nh&*l4]U%geQ"JnQNZ=Gr;>]n!F(J*G^*p#HHF]L]j@1dnK,0gdo5Qk9Wg(ia2d_)R_X]?tNb24efmBAbN\7?-qgiM?9+l[j9FF.,f.0h,>aJ4T!e!f,pt&fi'8;(*m1jGCFE+ba:p/WDDLQ#8>d_(GFJ\b#3L@5S@_XgeOYG<"LZBEN]52BJs0"[=2T^ATc;!pi#Y_)&U5_n)bcW'Ypt2WsBA[kJ1/7hnHh[okpVZ%6'1+LiGmhO'&U(Aq:iq=]S]>I&TX4;1+ecDtDqI\,X=(=*+\eaf`p=>RcFTS,"6`R&Jf4:T+YbehB)d`n8'gNj$IG<"LZaMQg!6S1u!E(`dM3Dp,Bpe4%o$]AX9!iCu=?ak97=kJIZK29DK(/Qs#rFl9lps.>"get3:*6A1&I-[@:)d#5O&286kk?2\2nOuuCgcd,6bpNNnP$ErGbuY._BruaKl%)TpiP9%"aA^)pN-oHZ`ojPi"f-J\c$4C3;?07n-P"c)T"%AP(m,lL4Fp&l7m0b(:GC1_Bs!4qMj;0["-+O8K&Aj2!!N@&Q1lCcA(kq0>;`.`V5JfqR`A%GP:;&l6`u)A<_RlI'WOl25L34n+?PD@.?ogLaX:BSta@rSn/_tiRA!Wu'H>9A6-h:WLWrkgr3h>G7\r`4KOYJ34*9u0eUm$Tf)q=>%5;Yd<_rj2k?kMs#RlLOS*msu,EVn^O2.0i%j4E(&/n9lq;6r.I0hIc:O.qCO=V.e/\VlU_ZBk1P"pQLL"fl_,&1F]Z7X\^Utk%s#65I^q^7?pdd;5NRC.8ACV1Xo65@9]F/Ufhn"`K&c_pl6Ia6d*)C(M7+=;(e(-,42XJhV@YMWK?Kdp`NS6Vae68g>)Ds/=r8"\P2"@1qD4uT2()BO.@/VcbB1OWHp0H*W=K>`A@)cAMS7iJ1o>_*bb^?`=1S2UMX$F.#Va#;(e'B^q>/9DjQN^@`RGTpmr\Ac"AQC/F5K4-L4l=YHBSsOO+6!af2%g]lDfd46S.`"q497efY+daX[@8,$g]00c&G7\_@o"Kc,46qqsR"._!U0BrYm6l?T3TQV$!&.rr&@8(.MD5#jEA@5qMjrMH0sqTrr1*]T=Fp-TD+iQMu:3bhi$%":EcI!GVrJQ^*Pn[KCS@>/1%:g#^BB$(pDaCpA#NFj^3-$^l_idh2_Vjlp<-eP<-#!ep#K%9]_r?8j5A:,e!u4a]Le5e:nGV4kUgoH7G8s;M^W%rStJ.G``4R]P-fT*X\pFq5&lHZW*f=W"c7-N3l4f)3EO2O$1aE,:<7HNr^J2,&(bSo9Md5E9dWfdl`IVrT/#^$AAC\W1JGV&0;@A#]-2Rko+E<7XU.d/1*toY((kdfMAFZ20Xq3CQ:'HCDE[`YT.18mh\psIZ?piQ'CGnrn_cc^`Z/i9H$ZTN:K!o?M6iAg)G*VN%hCl!)3Hg,(Ss6=M&.(;SD^uhR'uV]F2cbjB45L]S9-<#dN#XdAfUF_b!=p\)B+bqo_l0V8eeV8Tb"%GJal;]0f]FA.6e:1:He*NYdHbS@4M]aENCqRKd+iH.>i6N?bjT<9r9DQ",ZE=b/eC9#u.C.!N+^u>(jV'PXhPUA3Y?TPnl;^Fuojs[DBDV$p1I:*NRl#0tY6oT+":IoD0h-<(2qkf[h9aY]T,7?U&oH-V>NK!U2p:$cr;gVpKtW*iaOncsP1V34C:Z;/UHQ$7"P3t._eul7^ZG6f435R$T2@M'TWZBAcW]S'A*Z$NDc;=_a_9)[q<(FQD)THN>"?!FgU_-`+kKI(b3n2'1BKdm2T>ueR_-><7!Yc/_'/\%So?(PU9X:T$;N4.+>]fbsea[!]p0OTW'_UiDV@Tg_teOP.85=DiPTCecsWUOrUiHJl!I,JIdGS>."hN(`cgW`o8q/pU3$4hrI0q6SHl!r&gLbAk?seYiV#ZV'a]0UrZ\(a[]7Z8\n\lgp)52-#5=DE>5')se\0@.F74$stC#^!-q2>X/**U0gi=Zf$\!XFW/1DtGc^-njf<+q)#Y9Am4_C6uF`E6HoP.,6[#*jaG<7b`@8ASR#d)&lkQiF*&kAOE&<"WjhuaL0G#-Sft"P6PAJ:RtRQ*#t#k)r%kq-.W8We>(J+*XgB_hc7WOna8!;Xduhq2Tc'`lWA%E8Ji;@'(lApkQ`:$GZRm6nF2cNm^<;d#-METQV(d*PhTb[ZZ&k,7)2]aW8AYBi:Au;"6OO;KkH.A!U6Sqn8JLVGIL@?nQ6+T[`cV9]AFB'Uja&+6jlO71pTr4nKbMXggi?&p4][JK5aC9?Hh"W-=-hAgKQ$bjt+.mF_&`(AI2E"'uH4C^hZBk^C^Mg:\C2$6?8bX8Mbgh4#h-!X39#-8p+Z)AYklfHcAuslfo.AZ/YgaK`mfYV;YS3ULC`A=&h>.>UHA=JJI'bpL\X=Z-1eR[*HN08.iRVl]8\.ctFmo\m:JGiJDM[)g,iPLEkOHjl9.T)(t#B-)9CVQDmuNMM'gDkqmg^$]?S&^(dPUVt7cD(.i^9MkeUt18.G0?G["L[kqH*;akRCI;Z@GD-QO!pOBWZZBSlOPtOtGJr`OXVh.0;XA>_E=&hk&9soY]\#;(Si;35/^6..cr66]of]b;5LDH1+:UbRqhE"8V+M&l(djjg.ieX`)#Ue,th5G3SVlNgA3m=(gLSTJ:iI&./:5qW[;E4h>bg;\qC6NY@bJrt.Gk>t*Lp'g<9Hs&*WsQnMi;5)TSuLO]O"NO%'7@@N3hBZ?BIAR,WY:Zsa*H'.QX2%&LsO)q80Ii1-7aFr27#iN.c,SVrfCTGK[\t/Um73ZhgcpgN3A/P=M0`PF-'9NO)KHaq$#Q$87Ab+8>YEC%tas\Q\E;dfQg#pf_,5K"E2a=tRcINl>,CBk6Be$lZ-l;ZbjhHn*MbkC-oS&/^oq/_SEAIA>;EAPRj<(3GpsNqqK[37#Jna96/;%JgN.qjaLV&JBWApQX=WW&,8U\9E%JW9<^@Z#rj!%HSb.,TE-e&bS7L4gj],Z(Y$T'gY*,;q`.MN$E7;/%S5E-QUu[k12@fb`PAlcJn-)lu-5Doepn;9uST1[CVFiXXACO3Z^qmdq\?PBM0`[.\j7]ASi8B*,l]uZhM%-A\VkA?VqbnMSnEIB($^_4Dm8",*_3[BmmO>CAoGl^ue4Kh1Kh^":^'7P4l^mMfi8A\4iff:Y$W&dmrM^8jpsqSS2W/IWDL\Yg%fULjb"b\4lShG"^U3Fq^&`u[ES]Ui0G0],T,'*gS#!mV[Z"Ch%QO7-_KHNh>?ktXlF8*s#:d+'OXU[>c>dq3HXP_+d:CFtSVdXZTW12TAZiD(nVBP^;YM[E>#?6I]fH^p4YRP"V2G&P5D&K`Z*H:M9L>WhZ@2f7X51:(u_W$uuaeo,*K8ddo%a=M/"0FQVHAmpl[/=pP]3;?07E!s"V%06^+BaATbnOu<;Kh^"RDHlFumNGsR2U`5m!pV,-Y1b>54#d^a,)Vf0[Mq\uG$FoV:)M20oE&\r/JMe+2T&"nX\\H_NGO?o>"j_]\D*=oW\Ft!/U6eZ2QOhKCq&>*fPFTJk?2\rgNNRUBaAT2QT_dZNG/Y^_!UD\M))d6@Ab08/AeQ-~>endstream -endobj -% 'FormXob.c8ba08e347e6847214d84c863a661d07': class PDFImageXObject -6 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 45 - /Length 6345 - /Subtype /Image - /Type /XObject - /Width 2008 >> -stream -Gb"/l^M@+F(_PS==SM+pNL-W1X)>0#dm+i=er1NUi)1\Y4hpS?,j08h(22fF0%]DBg`B,1jTzzzzzzzzzzzzzzzzzzzk[`]qf;lL_m>oGng:FS8q+e=j5Q,n@fi@?+-A+3PQIl2qd,\3IgA4:UZTq_3I9s6/A#Wsz!!!#BkN:Sj=)L,OXrS7I$B5_fZ<8ig+dHJ+9kj2/3Ne[D!p+'>nlY+sGBg?G;Y=\fqz!!'CG[qcS:l^Q"Dl"Fu(&Su=.'X_gHq!U=o5#p^be'WQfLgI9pjZ^&.RS*Ehg!s=6[/J,WX\1@Y[\('9>6t90z!!"h&C.5;;=gWc3nW;=i>\,.,a](-iK\#;S4FXH@lQemrC@=,Q2dX";0-nYP5;&W%LY1.R.%LFRi,.nmE)Ql&%I=I?S2(*R,[U3.ai"33V=4:"]Bp3T+Q2*e`$2l5&Q4=99/M6o4YuHM-p`bO#N>=1!aAG*q?4TYgU>CrBk9oeSd9J@2-6HbDIa\0).-Nn(K1Q3G<+ZUpd!J2]c#?iftl4@TAOtlq;;0XlG]aOq\Lp-20L-4,(8i*Aopo(3>8QLPV@UR@BrBq91>,:(SEoW_CHAL3NMWPOmeHRm&/q&Jdp2W:/;Q:3cV;Wz!!'fSAW.;'\I(:a4rQPMd-s;r8qRmUoMR"B,LgHiBLZ^N^YZN7rM42mKF`CA1+gb)%#=JpT[f8"QlUHVrJK1?269.AT[0^>&^?'4*XSh]*dkV\jr;TPp9\,[R&`jU=`ZI4(KW*l=1>4'HRZMR.*%]2g-B>TO@\]cDOGGqUh)IObZh@9\nr&6hIf8X7t8pu\GUH9n3Og;oPn$&nNKK7As182V32QWiEB?B];9.=<4a]hQWO(kdM*"k:"o#XH4nML"onW'!!!!YBllGAj.3t:B[_b=IH1:Pj^Q+El%mfKN44GFLujWuK0A>daqc31U8[!W)%N@;N`Q`\f!`f,@J=2fI?&&4o36Y%q8S1gaD$NY*B`MDTbnl&!LmK!^7<_;8SS^_DH0*&`%mS`*9ZYF)D,&n"/+<#N(@C;MQ7>%"D)A<]?P>mdUe@P33sKris!,"D(10X8E+J7P.h%g1B6PR[Kdb+)%!`]WhM!;8\OY#XBQ(K2QW+A\bl;`2KY*(V(^%KL^X+b6M'H^h\a^q=rKFgHU+bUCnBH:[)L&-FW(T+I$3>KQ!)4.PK?skHiYpj54+gQHZ^O_72tK>0<'1P3M&l@8GJN'n:fP]-fAYA4=[.)mmbI.4t-U]EOL9@5sBF/cG]E9Wl?V8Xp>Y#U+j463s9]bP8]`.B&I$r4DMN)s*'Y26g=a*:NPqdB7KBptHBZY8nWLd,NIYiVpdae(pLf^f$DYt89-==Js'B^AtHKFgHU+bUCnCEtLVqk,H;^#![J)YQo7XdnIUmlhh"CO!8!7Y[2^3F84]W];bEC2V9".V#obh:hAJ[VB#l/82/(9+/p&FE2d#4]NN(F#Ed+VrTl#J008b)=+m+b\(3d::/JOS!G(A%q1\k3f%GcMTo8>@dhA@K`+g!9c"R.n#TNlpEXc9[tKA/u;hXUFlC`XV3r<7ic63n`f&4.aC>+0Zia3^nY^D#hQi%^VjfqUa[=DN/h]8W]3GYP[=WVLI-YH0i-e=X1Da]35QW@P@NhUo34h'/tr9#J*4q-#XJ$e4\*Wo:.Q+QkcIJ04e7XkK&jV5d\Ll"lbt>9WS&l*JK[GU"M3ofV,^iJ.q5J<*h@g:c3:G/1r2S[I<=MjEo:g"ekL1*C9\T,J^bb7;fGknp;J=4goL.Z"g*#U+j463naA>ZK7c8,U)I^i+7.7RV!;9G.MAD_u-@G#6_Ap$>_$4.i+N0+CjhN%iij/=WN%Bip'11ojI-1"!!UGj\uX6edjr]s[[]Lu45N4e4:U*:Pb5K;3`oR<9\-O`=lQNjV\-*@p"q;pLC3:]'$jbrS$SA;WtmUjH[@)ihMcX"oI,OAEXJOd0hQFD)s?9=$\GGYXE,#U+j463n`f&6cY]F27S"^)@XN:F>OP!jt8.m25im(j8a/(*h@NCeO)6[h38>qMe4!g'XtRX3o`t(uAQ\!uh?)^6,*pPJmM@o=9f\m:a4GTP9gV[)uqL\&RM!K`7"""+H[KP42O&!)-)4[>E0j%=`Hj$b=8P+HTbW>'oXb&>MmhLU`c)Rm`":#s5KlT&-'g7n%RS+&?biT^[K6nH8=,H*oB'CS2Vn""`7/Z!2]XtD(DEZZ1E^bb"iT9)mfJ9p>XNo"k(n#nr9b5A]HPT9q7"#)^5P2KFgHU+b\3'b-n:?5.kadCt+X#ps2q[P8gsbM";^YV^XDq[.`5!VdUdG?)j;HAaj5/_LG?;4fP55D"H>Tb_@u%T"i(HSup8Pn$>8XoA$dLD5AuYo?@:`cA=U41rr]lhr8B;924HoMc6O[YkaF1eX2#RY6ADt/=^/63BG_O7SU5QkaruPf,]$pN5oMBAJo?LCI02a4lO+qhEf4[J'?tVQiI*dz`s*dQ8lSJ8i'5iAn06#i^5WE9_2@mh_iOPtZ?T4kBn5SuC?[gc0(g:sC04'h[sJ_tGO0F1cXU2aa,\q6WU;*T1uD5kXR^djXR\g5baE/T3,q^C'I/gMX_`cnHZ?IagIE@[q=&l]q,LUYF2,_onh)lg>4=WU[#28Od>C.SjPTZ(3el'_hgGTsnGNgsz!!$+Y4Rp#1(=TQ&PU<;j*P,D`4%6Tu6>8cmK;;2%F'*aaL@]$/`-H*kFpW`=*1[GXh)<5&5ka(R&r+B"6W7@.qo%[2CrDuB9OeV"g+z!!!",Q20C:?U+I!4#8V:SA-@7Oe5.u3TRV#CW?A(MQG5gU/$`IEe+^PCZA2&McSo%h1`t=sq)8k+5O;H:FsugiHj7cU9Vr[W(n.$0aMHQ*LA;]stY!]smb5p!9ui=atndmJVs0WXaDARtQEW%n^?&>rqdb#YtKGJsKi.3M>2WSR\HQHj-,b@?#'a82!OD#=g7C7XI?jIP/CSJHl/TzJE=)KJ!_;@B)&;FBQ8lsYHmcp3@Dto6or%&)_5D^]*b@3/l%nsI.d$%,/"?]q;(cu[i\!i]/g\hkfiBmd+'58OpRa'BfY"M21:q_5QLibzJ)@BDpR~>endstream -endobj -% 'F4': class PDFType1Font -7 0 obj -% Font Courier -<< /BaseFont /Courier - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -8 0 obj -% Page dictionary -<< /Contents 18 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 5 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 6 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page2': class PDFPage -9 0 obj -% Page dictionary -<< /Contents 19 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 5 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 6 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page3': class PDFPage -10 0 obj -% Page dictionary -<< /Contents 20 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 5 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 6 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page4': class PDFPage -11 0 obj -% Page dictionary -<< /Contents 21 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 5 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 6 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page5': class PDFPage -12 0 obj -% Page dictionary -<< /Contents 22 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 5 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 6 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page6': class PDFPage -13 0 obj -% Page dictionary -<< /Contents 23 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 5 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 6 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page7': class PDFPage -14 0 obj -% Page dictionary -<< /Contents 24 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 5 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 6 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R15': class PDFCatalog -15 0 obj -% Document Root -<< /Outlines 25 0 R - /PageMode /UseNone - /Pages 17 0 R - /Type /Catalog >> -endobj -% 'R16': class PDFInfo -16 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121219123141+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R17': class PDFPages -17 0 obj -% page tree -<< /Count 7 - /Kids [ 8 0 R - 9 0 R - 10 0 R - 11 0 R - 12 0 R - 13 0 R - 14 0 R ] - /Type /Pages >> -endobj -% 'R18': class PDFStream -18 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 2049 >> -stream -Gb"/';01JM&q9S6s22RAg9G@TU+!!^F#320^:'64:87CKTe@Mp8Z542!FItU@"TWUqjG`C^6m?KTul'@Y^R9\>>**ShpJ"!@Uhj=V0-Wu<#Y/*WOm(^o`qV5*?emH1<6VS#*GTk9QMZZRk.dj/:bV73UZES7Zi10=#klACVkS(\q%kGuDWQ_&NAf?CoDN@^jHg7TRsL&Ea=e*5Z*Q-`G#cP3082.74b&rdF?<[`1@S/aU/hl'9U70/iCqDb,$#gKo`r+!$c?VL!0W[B\5hZ;g-[V)RJDP!n%s'M4XSbaQIHR7V1ZG-[hXl`Op1%_]bGu:8borl6;f2s29Cn2MCG(#O&#h"N\_EXdIJjXH(L%X7E[!+kHNbEF.RRbJ/Wjib\-i<^1UX'V&[OCmZ7iQljh/mst+kM'q^hZ+h,al[bA-M[,7?]MoG5YtFkE)=tk>M*a=b"tq41WTS_[HQkN$dHT`+'RX2q_G>YZ8MoiTa9u7[6r@dPk&c0\DhKXQ]8raFPk*+3dQTZ*+507035@:SCtWNSC3!KuPc4;JQ^g2!>Eb]^@)?mh@8j8Hi#%#Ceb7/N>n.MY9af/Z2WoJ&XVUAARi'5O0RqrD6U;X/1N[lT]6Z<6:CH@U)K3j.Supl_#O@Ip#E7EhM:d9S+6[+3YJS/`ndIkV/G8BApOcW)>3*GCca[:'/2Jrrn&_\n/&e./NB3!Q8f#!abh2Z4Rb*abHmKFYSjj=+/@uDu\5"$:9pGM"QlWMs+_:7>L!ZV0K\"Z^W-a,Fn18KJAR"Q-G<0c'QXG1OpBd:3q#1[C8rLgO%#B/hCg2MNjTO\3@d.'^g5_OdPn>::qmr=*W%0eg=/3(oc2D!,>#4e2#H:'A=CQdT0k\9:SL#7j8n`S:S5Vq"cfCAI#Tqd"Jm'Bd/nZpn^M]5m+1A566gaPi";6ilb;QpQ&h8GNai.-hd%Zmq_khR9HMKbn6$Z'Kj6OL-F>`p;7mG6nN2.,Z@F6pKoCcb06M;fNphn#:_g]e$ksfTh>83'M:Y([;N(MiLrSU6B>5,0=KASGkrpl\o`<5W*o?QiGhpu=rpZI76g#H;%i%:H*^fW9*&cEX*H%L.9M^Oe;DXjbdJq.E]-mD&k_&QD$Bf1Un=0D?i$afC&Jg#^!.Kr!hY2DKL0oJ'('7?N~>endstream -endobj -% 'R19': class PDFStream -19 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1590 >> -stream -Gb"/&9lo&I&A)9E^(GCdAQ-g;*\JD)q),_\9Bo2AOnidTMaU+[[SN3I(0Yh3iB9&)MG3-ln?<>[BeOKHuGp/]c*E/JAd:o"samGaLKJXaD-Ve"TiCTX4Eh1:^3^MC/\UP<^S\2Up2"6Urf(FYq-@:/QVe*Z18!qRd\)6$4#.gU89rWk%4s+dSWj6`gm=8XU!/[0\tI@]8gca@F.)Pq:(f-0uXAtQB956+PRi$RMI^'g$XD@OW(;Tqub@>c>"ffF'=T%q@b0t!/FN?BTL6O[M9[1mBEeBTulrJLF(GUST3ZUgM:0r':t)%Z-i+6>F%fk_@RYuQ%h7b;C7F\^+nmrp7JF/WX$dY-.&I6boU,=Ct/1KMiTGdF5_CKj@Y(S#PJGQ6*[_M&(lR8eRRZ8Q'SFF]jT(m\W(lECji>:R+o1@jW1e?WpdJc;_rt!Ku*1H7.1#="^6_kfMS_)N/#4,[u@,IOGn\=1Q*Vp5LP"R[)"@\GH>$"\c?(ZO9!Gh&Z-6CMkgq%uf.A[mp!-\o0_Mu@d=Z]U^rC]kWE/K7m4u_c!U=3IEVui;%rr?qfAZ>~>endstream -endobj -% 'R20': class PDFStream -20 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 601 >> -stream -GasIc9omaW&A;01J!a_3956Q6(H3hB2umE3F5Z=/P9uCF_+En^mhr`32nLQ>ng2QP]_CP_3&%qRJ!YM49b-J@#;..&J]g;FrWPLIbJir3_IEXll7g&,GesaEB:^f/,RkpS_s622ThfF\G6fsP&)WXP40/2^lHUBC1jZO+)r1`%QHVTMuh/2]*qSG3pC$0K/!(*,Sn"7KcZ-/$!l5Ctc1GA(u-VRS"k`pet#!A!?:[E>m)rY0aV'kGd95JpIj`&RAUnWcCpemLM@e@q,un*GgLD'>_p9U0Ci0QR0jspjl4\LM[Tm~>endstream -endobj -% 'R21': class PDFStream -21 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 582 >> -stream -GatUo995Pr'SZ9Pr.hW&F?s_Q^l59cNS:=h[[QHbR)NkM(dcCj"\+oPhhqeUU/[+/,@85'TC:QF_nkQpp7=.W-Gb#O_$,u'>^@%)=+!bJkI9d0RK-Df9lMajC/j+]*BufbHmB/%5JC"f75t+t5cS&Dl!B^ihX=:jh#U[1NdXt>2b8BAH++']\,O/,Og#*/GVKjd-V9"_`oPirf%[?G*kTp39SKa5=pB^9WWp%jj1L0b(SOEGMGKf/gfqHW"LDb/7:@>#A=]9lALc5().,i[<&,(kk"958oQ;#AS4/>SSaA6si,k*_TP&34?ob.,:imA$7[Y:abHp]84!eN,Sg+eF!37bBk>baG:lRPMlud$(p.#'Cc0g$pli\0Fnd84;5[&/N!rRkJC8tJ3d,Wb[l18S]CKe+H77W!VA(TqLb#%`A3I2Q*4;do'/Z#@\m#IrA6h>3!3fVdmUA96B]1S4Elge_1C?pDQ2=i$E^,K!F)afH!$td/*gJ&h*qsUDDoXhbI;`q1^(?<]52)"!+m-3Y9&2K%Xk[jWIi,8mZ/Zdf5h:4p)UJ87i?U$fB\n\oO-sYpG;UG^:~>endstream -endobj -% 'R22': class PDFStream -22 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1411 >> -stream -Gb"/&gMYb8&:HLqIi.5mDP>K(7GS"Z7G9"PJ/E5D2=9^k>YuH%]C]F*q!WQqPXmfSX#=YK%,2E:fpt-EcHM<::lM$Bq^`Y[T@\2`-D;]]onJV\b%Ua6?EZ"8mOg.R>>!!mf[;%6+)N\W#=$ZT/XB==2g"`Y%BQ24Bkp#fncdjTiQ?,OV+n)d<+tBPY3gG?r^?)@O,gC#9HT>08@oGd/6^$W.Y5bh/[?*f?X@!PdAH_,k><3PkGpH"CaS-YeerC,X)bP&PB8GJ,c=`?o&>)\DjJ[pbXo1/ca#)eNurZuQ8uuY1!LJC^<@@,P*O4l=O*g,T-n3_3-rKG$JT2"rno]R[h88+Mf[#LW!`Xq2"$s(l2c/brK%6K3gR+4K/>9$ot)bF`_HheJ'@%#b'XenM3;J!PX4Jr.$b^sX]-$GX/-GpoS/n2ltF/!`Kp-kQqfoGS0k][Uk3Sr\.K=dUiqjQ]),Z)Nc;23`i_MFKF1bE,E?^G0@/WjE(AWH_M%g;Ln.?rD5Dr!h9_JB<[aVuk^sGb-Xh#r^I+5,A/>WQcp#BpEK7>-3Zff/AoY,F-]\k+U^)':MViXP)!GnYAe;JK*5oo#>>Ke0oX6eYQtXY:@C)@[lp?gje"1O,Zmf@io3-_[,?b%k%SFHGq9Mr@F2LjjE`^;@bf#oa$BoLK9T8]DJJfh'43\rKEGnuZm(QRTVr8eg?%B4QS1C:I0#&2gVlAMRJl$BS^c8Mt9.&6*pT:og]77Ki,%?la"i/8@Nk!F-4bPWNaa[p2HM)(V3%=!O]l[BND`^h(Enp0;d7OZ*'YJqj?q@p"um)D[;Q)YPMR/V_igl?,O"1bHR_+fl8F\e.8"Wac#G->4d2g5$F$#^7>ODmsOO?"8YQq3I[s/(#D"2A4??@j?@I!Leq/nTKg3Fc]IP-_Vc2Ws6;b'0?NIOS_?)UE*U4]:;9Dcm!:KU-dK)U.D3a$AOEWnK.Tt",Im3KhuRfI67'?(ikC*TWsZg*ij4\J=D,5St;&:Uq8d'9V8t?qH1f@r(c2op)():njpR2pYCCPHc4'PF>JG?kklZT"mWW,Hi3,mZbg<$S+LA8%CFhLd9b0H<3j"LrCQIDGVLmiP[(A@[sl7:2[oh.03Gn_[*]%0&,RR9@GK3^%`F>4k":#r$endstream -endobj -% 'R23': class PDFStream -23 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1507 >> -stream -Gb"/f>Ar7S'Z])5j?&m@AV6mOZ>@^4bLQe5cu*R`'mldQA"+K-.MV+mhgU't(HGV:\(rh+_+\c7dib$.&JPF7G#D6Kb_jqk/uIWBsb39[GTI"'?u!Y$9Gp?5-96rFt0dp1l]su!g,K;Z72k=4ZU84[f4/Y;&ncZBpslp`,Ua`OdJqBeU.uWl'RC)T\&>ujBX-OP`F"DB)O]sTGY/7]A\J6tloXe/p:Sq?!RG2mMk(2V>+\YgS:DM30=,qs:[dKXhEC(g-f'^!-`.CU_/sq%0'feY,>>ECGhRR+_ki)*Ri-7dh)i_,&VU5\;&aW$<6Cb]dT`O#p/G4pJX3P?/XtR0"j0390u*M=X)m@Z-WP%'V=#ZOBic1!_UN8-&gps>\!EOXaU[Z>)t=;;=4SJRpG&lp]I(L>,8R(*%pW+2ank.tjmo<=<_tgUsT/ZZTN8Irtkd9*EhOQ**%h37SUk%0P)tW7JTt35RTbPHRi@X;"]K=Y)r"2\H;%&m"!4eHE+r4Udis"13:aDb:"M9WYmG5jCG"0+Z>d?gD!PT9U)MHnc'?""rE7Bb;GmLoq;2nM(sGLXY\A@JjgtLhu1tNS)4CtXT0(Ind_@=l1gp65])B49)IFFk?h(.?*[roa@`W]">=X\`Ad)\'CU968qO'Ul"4(k@7r9QEg99Oe1B,t4/$b*?7ea1NKdV5Vk=1M(mX`NfkUN"qd[MeitK]rlcp=n4-&Z3HVqa1*?D*>XCa&1Yqf%KqApB)n,%G`W_*cFg>f=MJA*38s#p8FTocX0o)lp&%hUri/\nul>'P4X!93?Bl7f9ZH]Sq!tPito56nEoE-//Rb.^Z)tJ]WN6daZ!I+kk*phCg.kk~>endstream -endobj -% 'R24': class PDFStream -24 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 735 >> -stream -Gau0@997OU&AD62J!f8JWiVaP09-;f+gFpr#]Y!NC$V$oVg]>/53)",m7Jl0#F$R;4o$/j9i;I[%R+11!T8A6pDXT)LNX25A-1K2n?H7O:HBh8=U<"7=2k2:3W'j"UQ](a#Fi+a%b8@;'-5TPoa;@nb\Smpc?SS.=\Do[G@$cd)'46k<:S)i4Q%]dk3d]!"eN:lf>`/s4>#[KuI4`%A>g'G64f`0QqNqC=31WI,e$h^>2X0!B;i5T.TNqb)_0AnUW]RkLOAT42^aTRJ-'>)Fm^1]AZOh'mXb.jehP!jkKCA(VLZm]U)GX->i,MkM\_']=g>).2aNV0B!$(@0hb&_u-0G7L,!=X,X)Xr7eU(0q@$;&_\,_59I^%)!DRpA]M8F4\oT:VX\e67-Tj/E^YW#Mr!Cip.2EQp^'G`^=PRs7i_X(aRt+-B%c(k&'C[a$@D[D,3E\7f4q$)t)P;:oCD-)>&uaM0#0J!'*:`;`FHrg`>o_^c%3kuK'$Iu6c7'0&$/2.SCXa^.gESMGu$UT6sY&;FmgBe"jR"Ce#:fd.Q*%jc[Q''BrRGW@61g$N.fe*@:_`G]O7J&;~>endstream -endobj -% 'R25': class PDFOutlines -25 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 26 -0000000000 65535 f -0000000113 00000 n -0000000245 00000 n -0000000410 00000 n -0000000585 00000 n -0000000807 00000 n -0000007207 00000 n -0000013790 00000 n -0000013949 00000 n -0000014343 00000 n -0000014737 00000 n -0000015132 00000 n -0000015527 00000 n -0000015922 00000 n -0000016317 00000 n -0000016713 00000 n -0000016851 00000 n -0000017122 00000 n -0000017282 00000 n -0000019474 00000 n -0000021207 00000 n -0000021950 00000 n -0000022674 00000 n -0000024228 00000 n -0000025878 00000 n -0000026757 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(P3\2724\251R\311s_\335+\214\\\035K6) (P3\2724\251R\311s_\335+\214\\\035K6)] - - /Info 16 0 R - /Root 15 0 R - /Size 26 >> -startxref -26809 -%%EOF diff --git a/z3c/rml/tests/expected/rml-examples-049-pre.pdf b/z3c/rml/tests/expected/rml-examples-049-pre.pdf deleted file mode 100644 index df7853ec..00000000 --- a/z3c/rml/tests/expected/rml-examples-049-pre.pdf +++ /dev/null @@ -1,172 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R - /F4 7 0 R - /F5 8 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Oblique -<< /BaseFont /Helvetica-Oblique - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.0086924a45e007495af99df70126eb1b': class PDFImageXObject -5 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 197 - /Length 6121 - /Subtype /Image - /Type /XObject - /Width 309 >> -stream -Gb"/l^Q0\[&]ap8-\i2ucj=5N-F&B2*&rS,^lh8#OU4]pO9j*&8&-nb>+sIunDF=o/>mXT=rr[$BDR%WJ%V4up&1g&Nh&*l4]U%geQ"JnQNZ=Gr;>]n!F(J*G^*p#HHF]L]j@1dnK,0gdo5Qk9Wg(ia2d_)R_X]?tNb24efmBAbN\7?-qgiM?9+l[j9FF.,f.0h,>aJ4T!e!f,pt&fi'8;(*m1jGCFE+ba:p/WDDLQ#8>d_(GFJ\b#3L@5S@_XgeOYG<"LZBEN]52BJs0"[=2T^ATc;!pi#Y_)&U5_n)bcW'Ypt2WsBA[kJ1/7hnHh[okpVZ%6'1+LiGmhO'&U(Aq:iq=]S]>I&TX4;1+ecDtDqI\,X=(=*+\eaf`p=>RcFTS,"6`R&Jf4:T+YbehB)d`n8'gNj$IG<"LZaMQg!6S1u!E(`dM3Dp,Bpe4%o$]AX9!iCu=?ak97=kJIZK29DK(/Qs#rFl9lps.>"get3:*6A1&I-[@:)d#5O&286kk?2\2nOuuCgcd,6bpNNnP$ErGbuY._BruaKl%)TpiP9%"aA^)pN-oHZ`ojPi"f-J\c$4C3;?07n-P"c)T"%AP(m,lL4Fp&l7m0b(:GC1_Bs!4qMj;0["-+O8K&Aj2!!N@&Q1lCcA(kq0>;`.`V5JfqR`A%GP:;&l6`u)A<_RlI'WOl25L34n+?PD@.?ogLaX:BSta@rSn/_tiRA!Wu'H>9A6-h:WLWrkgr3h>G7\r`4KOYJ34*9u0eUm$Tf)q=>%5;Yd<_rj2k?kMs#RlLOS*msu,EVn^O2.0i%j4E(&/n9lq;6r.I0hIc:O.qCO=V.e/\VlU_ZBk1P"pQLL"fl_,&1F]Z7X\^Utk%s#65I^q^7?pdd;5NRC.8ACV1Xo65@9]F/Ufhn"`K&c_pl6Ia6d*)C(M7+=;(e(-,42XJhV@YMWK?Kdp`NS6Vae68g>)Ds/=r8"\P2"@1qD4uT2()BO.@/VcbB1OWHp0H*W=K>`A@)cAMS7iJ1o>_*bb^?`=1S2UMX$F.#Va#;(e'B^q>/9DjQN^@`RGTpmr\Ac"AQC/F5K4-L4l=YHBSsOO+6!af2%g]lDfd46S.`"q497efY+daX[@8,$g]00c&G7\_@o"Kc,46qqsR"._!U0BrYm6l?T3TQV$!&.rr&@8(.MD5#jEA@5qMjrMH0sqTrr1*]T=Fp-TD+iQMu:3bhi$%":EcI!GVrJQ^*Pn[KCS@>/1%:g#^BB$(pDaCpA#NFj^3-$^l_idh2_Vjlp<-eP<-#!ep#K%9]_r?8j5A:,e!u4a]Le5e:nGV4kUgoH7G8s;M^W%rStJ.G``4R]P-fT*X\pFq5&lHZW*f=W"c7-N3l4f)3EO2O$1aE,:<7HNr^J2,&(bSo9Md5E9dWfdl`IVrT/#^$AAC\W1JGV&0;@A#]-2Rko+E<7XU.d/1*toY((kdfMAFZ20Xq3CQ:'HCDE[`YT.18mh\psIZ?piQ'CGnrn_cc^`Z/i9H$ZTN:K!o?M6iAg)G*VN%hCl!)3Hg,(Ss6=M&.(;SD^uhR'uV]F2cbjB45L]S9-<#dN#XdAfUF_b!=p\)B+bqo_l0V8eeV8Tb"%GJal;]0f]FA.6e:1:He*NYdHbS@4M]aENCqRKd+iH.>i6N?bjT<9r9DQ",ZE=b/eC9#u.C.!N+^u>(jV'PXhPUA3Y?TPnl;^Fuojs[DBDV$p1I:*NRl#0tY6oT+":IoD0h-<(2qkf[h9aY]T,7?U&oH-V>NK!U2p:$cr;gVpKtW*iaOncsP1V34C:Z;/UHQ$7"P3t._eul7^ZG6f435R$T2@M'TWZBAcW]S'A*Z$NDc;=_a_9)[q<(FQD)THN>"?!FgU_-`+kKI(b3n2'1BKdm2T>ueR_-><7!Yc/_'/\%So?(PU9X:T$;N4.+>]fbsea[!]p0OTW'_UiDV@Tg_teOP.85=DiPTCecsWUOrUiHJl!I,JIdGS>."hN(`cgW`o8q/pU3$4hrI0q6SHl!r&gLbAk?seYiV#ZV'a]0UrZ\(a[]7Z8\n\lgp)52-#5=DE>5')se\0@.F74$stC#^!-q2>X/**U0gi=Zf$\!XFW/1DtGc^-njf<+q)#Y9Am4_C6uF`E6HoP.,6[#*jaG<7b`@8ASR#d)&lkQiF*&kAOE&<"WjhuaL0G#-Sft"P6PAJ:RtRQ*#t#k)r%kq-.W8We>(J+*XgB_hc7WOna8!;Xduhq2Tc'`lWA%E8Ji;@'(lApkQ`:$GZRm6nF2cNm^<;d#-METQV(d*PhTb[ZZ&k,7)2]aW8AYBi:Au;"6OO;KkH.A!U6Sqn8JLVGIL@?nQ6+T[`cV9]AFB'Uja&+6jlO71pTr4nKbMXggi?&p4][JK5aC9?Hh"W-=-hAgKQ$bjt+.mF_&`(AI2E"'uH4C^hZBk^C^Mg:\C2$6?8bX8Mbgh4#h-!X39#-8p+Z)AYklfHcAuslfo.AZ/YgaK`mfYV;YS3ULC`A=&h>.>UHA=JJI'bpL\X=Z-1eR[*HN08.iRVl]8\.ctFmo\m:JGiJDM[)g,iPLEkOHjl9.T)(t#B-)9CVQDmuNMM'gDkqmg^$]?S&^(dPUVt7cD(.i^9MkeUt18.G0?G["L[kqH*;akRCI;Z@GD-QO!pOBWZZBSlOPtOtGJr`OXVh.0;XA>_E=&hk&9soY]\#;(Si;35/^6..cr66]of]b;5LDH1+:UbRqhE"8V+M&l(djjg.ieX`)#Ue,th5G3SVlNgA3m=(gLSTJ:iI&./:5qW[;E4h>bg;\qC6NY@bJrt.Gk>t*Lp'g<9Hs&*WsQnMi;5)TSuLO]O"NO%'7@@N3hBZ?BIAR,WY:Zsa*H'.QX2%&LsO)q80Ii1-7aFr27#iN.c,SVrfCTGK[\t/Um73ZhgcpgN3A/P=M0`PF-'9NO)KHaq$#Q$87Ab+8>YEC%tas\Q\E;dfQg#pf_,5K"E2a=tRcINl>,CBk6Be$lZ-l;ZbjhHn*MbkC-oS&/^oq/_SEAIA>;EAPRj<(3GpsNqqK[37#Jna96/;%JgN.qjaLV&JBWApQX=WW&,8U\9E%JW9<^@Z#rj!%HSb.,TE-e&bS7L4gj],Z(Y$T'gY*,;q`.MN$E7;/%S5E-QUu[k12@fb`PAlcJn-)lu-5Doepn;9uST1[CVFiXXACO3Z^qmdq\?PBM0`[.\j7]ASi8B*,l]uZhM%-A\VkA?VqbnMSnEIB($^_4Dm8",*_3[BmmO>CAoGl^ue4Kh1Kh^":^'7P4l^mMfi8A\4iff:Y$W&dmrM^8jpsqSS2W/IWDL\Yg%fULjb"b\4lShG"^U3Fq^&`u[ES]Ui0G0],T,'*gS#!mV[Z"Ch%QO7-_KHNh>?ktXlF8*s#:d+'OXU[>c>dq3HXP_+d:CFtSVdXZTW12TAZiD(nVBP^;YM[E>#?6I]fH^p4YRP"V2G&P5D&K`Z*H:M9L>WhZ@2f7X51:(u_W$uuaeo,*K8ddo%a=M/"0FQVHAmpl[/=pP]3;?07E!s"V%06^+BaATbnOu<;Kh^"RDHlFumNGsR2U`5m!pV,-Y1b>54#d^a,)Vf0[Mq\uG$FoV:)M20oE&\r/JMe+2T&"nX\\H_NGO?o>"j_]\D*=oW\Ft!/U6eZ2QOhKCq&>*fPFTJk?2\rgNNRUBaAT2QT_dZNG/Y^_!UD\M))d6@Ab08/AeQ-~>endstream -endobj -% 'FormXob.c8ba08e347e6847214d84c863a661d07': class PDFImageXObject -6 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 45 - /Length 6345 - /Subtype /Image - /Type /XObject - /Width 2008 >> -stream -Gb"/l^M@+F(_PS==SM+pNL-W1X)>0#dm+i=er1NUi)1\Y4hpS?,j08h(22fF0%]DBg`B,1jTzzzzzzzzzzzzzzzzzzzk[`]qf;lL_m>oGng:FS8q+e=j5Q,n@fi@?+-A+3PQIl2qd,\3IgA4:UZTq_3I9s6/A#Wsz!!!#BkN:Sj=)L,OXrS7I$B5_fZ<8ig+dHJ+9kj2/3Ne[D!p+'>nlY+sGBg?G;Y=\fqz!!'CG[qcS:l^Q"Dl"Fu(&Su=.'X_gHq!U=o5#p^be'WQfLgI9pjZ^&.RS*Ehg!s=6[/J,WX\1@Y[\('9>6t90z!!"h&C.5;;=gWc3nW;=i>\,.,a](-iK\#;S4FXH@lQemrC@=,Q2dX";0-nYP5;&W%LY1.R.%LFRi,.nmE)Ql&%I=I?S2(*R,[U3.ai"33V=4:"]Bp3T+Q2*e`$2l5&Q4=99/M6o4YuHM-p`bO#N>=1!aAG*q?4TYgU>CrBk9oeSd9J@2-6HbDIa\0).-Nn(K1Q3G<+ZUpd!J2]c#?iftl4@TAOtlq;;0XlG]aOq\Lp-20L-4,(8i*Aopo(3>8QLPV@UR@BrBq91>,:(SEoW_CHAL3NMWPOmeHRm&/q&Jdp2W:/;Q:3cV;Wz!!'fSAW.;'\I(:a4rQPMd-s;r8qRmUoMR"B,LgHiBLZ^N^YZN7rM42mKF`CA1+gb)%#=JpT[f8"QlUHVrJK1?269.AT[0^>&^?'4*XSh]*dkV\jr;TPp9\,[R&`jU=`ZI4(KW*l=1>4'HRZMR.*%]2g-B>TO@\]cDOGGqUh)IObZh@9\nr&6hIf8X7t8pu\GUH9n3Og;oPn$&nNKK7As182V32QWiEB?B];9.=<4a]hQWO(kdM*"k:"o#XH4nML"onW'!!!!YBllGAj.3t:B[_b=IH1:Pj^Q+El%mfKN44GFLujWuK0A>daqc31U8[!W)%N@;N`Q`\f!`f,@J=2fI?&&4o36Y%q8S1gaD$NY*B`MDTbnl&!LmK!^7<_;8SS^_DH0*&`%mS`*9ZYF)D,&n"/+<#N(@C;MQ7>%"D)A<]?P>mdUe@P33sKris!,"D(10X8E+J7P.h%g1B6PR[Kdb+)%!`]WhM!;8\OY#XBQ(K2QW+A\bl;`2KY*(V(^%KL^X+b6M'H^h\a^q=rKFgHU+bUCnBH:[)L&-FW(T+I$3>KQ!)4.PK?skHiYpj54+gQHZ^O_72tK>0<'1P3M&l@8GJN'n:fP]-fAYA4=[.)mmbI.4t-U]EOL9@5sBF/cG]E9Wl?V8Xp>Y#U+j463s9]bP8]`.B&I$r4DMN)s*'Y26g=a*:NPqdB7KBptHBZY8nWLd,NIYiVpdae(pLf^f$DYt89-==Js'B^AtHKFgHU+bUCnCEtLVqk,H;^#![J)YQo7XdnIUmlhh"CO!8!7Y[2^3F84]W];bEC2V9".V#obh:hAJ[VB#l/82/(9+/p&FE2d#4]NN(F#Ed+VrTl#J008b)=+m+b\(3d::/JOS!G(A%q1\k3f%GcMTo8>@dhA@K`+g!9c"R.n#TNlpEXc9[tKA/u;hXUFlC`XV3r<7ic63n`f&4.aC>+0Zia3^nY^D#hQi%^VjfqUa[=DN/h]8W]3GYP[=WVLI-YH0i-e=X1Da]35QW@P@NhUo34h'/tr9#J*4q-#XJ$e4\*Wo:.Q+QkcIJ04e7XkK&jV5d\Ll"lbt>9WS&l*JK[GU"M3ofV,^iJ.q5J<*h@g:c3:G/1r2S[I<=MjEo:g"ekL1*C9\T,J^bb7;fGknp;J=4goL.Z"g*#U+j463naA>ZK7c8,U)I^i+7.7RV!;9G.MAD_u-@G#6_Ap$>_$4.i+N0+CjhN%iij/=WN%Bip'11ojI-1"!!UGj\uX6edjr]s[[]Lu45N4e4:U*:Pb5K;3`oR<9\-O`=lQNjV\-*@p"q;pLC3:]'$jbrS$SA;WtmUjH[@)ihMcX"oI,OAEXJOd0hQFD)s?9=$\GGYXE,#U+j463n`f&6cY]F27S"^)@XN:F>OP!jt8.m25im(j8a/(*h@NCeO)6[h38>qMe4!g'XtRX3o`t(uAQ\!uh?)^6,*pPJmM@o=9f\m:a4GTP9gV[)uqL\&RM!K`7"""+H[KP42O&!)-)4[>E0j%=`Hj$b=8P+HTbW>'oXb&>MmhLU`c)Rm`":#s5KlT&-'g7n%RS+&?biT^[K6nH8=,H*oB'CS2Vn""`7/Z!2]XtD(DEZZ1E^bb"iT9)mfJ9p>XNo"k(n#nr9b5A]HPT9q7"#)^5P2KFgHU+b\3'b-n:?5.kadCt+X#ps2q[P8gsbM";^YV^XDq[.`5!VdUdG?)j;HAaj5/_LG?;4fP55D"H>Tb_@u%T"i(HSup8Pn$>8XoA$dLD5AuYo?@:`cA=U41rr]lhr8B;924HoMc6O[YkaF1eX2#RY6ADt/=^/63BG_O7SU5QkaruPf,]$pN5oMBAJo?LCI02a4lO+qhEf4[J'?tVQiI*dz`s*dQ8lSJ8i'5iAn06#i^5WE9_2@mh_iOPtZ?T4kBn5SuC?[gc0(g:sC04'h[sJ_tGO0F1cXU2aa,\q6WU;*T1uD5kXR^djXR\g5baE/T3,q^C'I/gMX_`cnHZ?IagIE@[q=&l]q,LUYF2,_onh)lg>4=WU[#28Od>C.SjPTZ(3el'_hgGTsnGNgsz!!$+Y4Rp#1(=TQ&PU<;j*P,D`4%6Tu6>8cmK;;2%F'*aaL@]$/`-H*kFpW`=*1[GXh)<5&5ka(R&r+B"6W7@.qo%[2CrDuB9OeV"g+z!!!",Q20C:?U+I!4#8V:SA-@7Oe5.u3TRV#CW?A(MQG5gU/$`IEe+^PCZA2&McSo%h1`t=sq)8k+5O;H:FsugiHj7cU9Vr[W(n.$0aMHQ*LA;]stY!]smb5p!9ui=atndmJVs0WXaDARtQEW%n^?&>rqdb#YtKGJsKi.3M>2WSR\HQHj-,b@?#'a82!OD#=g7C7XI?jIP/CSJHl/TzJE=)KJ!_;@B)&;FBQ8lsYHmcp3@Dto6or%&)_5D^]*b@3/l%nsI.d$%,/"?]q;(cu[i\!i]/g\hkfiBmd+'58OpRa'BfY"M21:q_5QLibzJ)@BDpR~>endstream -endobj -% 'F4': class PDFType1Font -7 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F5': class PDFType1Font -8 0 obj -% Font Courier -<< /BaseFont /Courier - /Encoding /WinAnsiEncoding - /Name /F5 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -9 0 obj -% Page dictionary -<< /Contents 13 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 12 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.0086924a45e007495af99df70126eb1b 5 0 R - /FormXob.c8ba08e347e6847214d84c863a661d07 6 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R10': class PDFCatalog -10 0 obj -% Document Root -<< /Outlines 14 0 R - /PageMode /UseNone - /Pages 12 0 R - /Type /Catalog >> -endobj -% 'R11': class PDFInfo -11 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121219133528+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R12': class PDFPages -12 0 obj -% page tree -<< /Count 1 - /Kids [ 9 0 R ] - /Type /Pages >> -endobj -% 'R13': class PDFStream -13 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1936 >> -stream -Gat=*@;jmY&H*Xms5B&JYYusMUr]iHTEVb^ffCBqQ?lYg\eo+;[^\l&8lBZa?b\ZpQK?&%ZIuH6M8sgan*V7aK84C&IO><7cVo(;mXlUsF9-jSL+p;kZg$GbQbrp;(4[LU>2[$?AdoRS(?]cBj7j=c"UqRfEV5>,s1n9[#3,ISl$gD-^k.=dGN&c>+2U!lEB(dZ%hG8(,NM?TG-:,_i&beCm*O3RoOtObG+%1MEcf'jG4S[alNIk"@Xm_:F;&E3XhC_tEc^>U@drVbgi;=VhaP;W2ATMeg$kG3;AluTlDC`BJsFNJ/c"`MKSF++K$=N=jJmmG>m2c'k_^`sYnlF69ZDW`'k`Dh#m\!@[`N)_.8a!N/)9='.MGBCd"s;l\Y974Q>lNZ*9M#E<#^r-ZNaFj6'X(XH`ZSUhr!K:_hsb/UG$q#s)N?\>0?uaJ:;S7YTG0K7ZXbjKR6jlAmBC"0"((f%6B]RK],;9PH5I*C4+%D'Gd4,>2]pq\)\i:bRf-19F4j;0^B&^OZZcJ[@o/mM+hn[Kf2QICZ9.V9I<@g<(LOsE0U]p,K7b64MdH-gWPEmipad-mfY3&KT(?U7E`[TYJ"h+B2K;!NKEc*U&euq0oRGS1s<,Yc[(F389ZnI+6elq5rs:u%H9kp:e^.09k!f^!,\Pj9V:YgIuAN6X7$:6)L&=;';+61CmPJjafm)b7S1j$CQ*oBd>fYuUD?n4kIF9(Cc<[rjY"2'J?=_SD_qnX7ZH6DD-rWWQ&Cf@a53pdSjOq9IPB)1?Z2DNP:e?/=Md\8$J%rK')JeP`DI*b&<#\U-rY+9dMfaO@KT>TOV4lSQO`9`8I219ERuD$/#sX?Od_4qVOL!9F]%Q`2nCD'e[TDBfT7Gj0[1;%dAi.e-2PM5Rk`B2!X61L79s/+$l?Q]R`n(R6[=!KU"1NE/%qX,9Y..3ZQZjMD2H9V;n6>(32hpYpS!e*6nA^$9Q;tMda7^O=H;*filh:!^p[n)$JX.aF:\l<8OM@%C"TgjY*$`8`0)M&Hr!##$+iKP8dR&R(0:#?6hP2p;!p$];/ocbS9(\HV:(LTQ?\G?"9o1($OkQ;Dn*$'Pi;oPG/Nea%#>=D8%DN0;t5Rc&Xds4n/g[?L]b+(U`]J4H%h*(A$GHm%YBNV28_9Q46<^dgYkbFVDY$H-Cc2j_b4%D_rdO2^Zb4kI!teMlKfEqi^s#iIC6=d+rf3q=isU;DcpC&_e2?bCkq/]A-JR!3YdKkTYa(Gn.Mq/5881ShVXau0'S)Mb];ElY3gBkOk"b9S/jgJeRjfjUE_TYW\?IMK4/n?51%0o"+-Qk%c,BsrqhEpn<&Dbg)%q\-f+2dmAA3V\"l-9MWqe!F)Ij31,%T,*b8%UGe[JqJE33J+fGehr[#?UO8ichjfPk\*pK;n*c20>p0FrJ]e&s"#K!_[gJs)mMhdnqLJ8"[%%4W3.Sd2jQPGjmAJ&34M~>endstream -endobj -% 'R14': class PDFOutlines -14 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 15 -0000000000 65535 f -0000000113 00000 n -0000000257 00000 n -0000000422 00000 n -0000000597 00000 n -0000000819 00000 n -0000007219 00000 n -0000013802 00000 n -0000013991 00000 n -0000014150 00000 n -0000014545 00000 n -0000014683 00000 n -0000014954 00000 n -0000015061 00000 n -0000017142 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\344l\301\320j\307\346\376\210=\215\256\246l\2546) (\344l\301\320j\307\346\376\210=\215\256\246l\2546)] - - /Info 11 0 R - /Root 10 0 R - /Size 15 >> -startxref -17194 -%%EOF diff --git a/z3c/rml/tests/expected/rml-guide-example-01.pdf b/z3c/rml/tests/expected/rml-guide-example-01.pdf deleted file mode 100644 index f56cbde2..00000000 --- a/z3c/rml/tests/expected/rml-guide-example-01.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 115 >> -stream -GapQh0E=F,0U\H3T\pNYT^QKk?tc>IP,;W#U1^23ihPEM_TN+I0SHG`1,I?72-)Cc1tON^#g$)nn4:gGa]Abo0?Ql6do6Up;@(YOlVZU%!W]l;'T)~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001427 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1478 -%%EOF diff --git a/z3c/rml/tests/expected/rml-guide-example-02.pdf b/z3c/rml/tests/expected/rml-guide-example-02.pdf deleted file mode 100644 index f09f993f..00000000 --- a/z3c/rml/tests/expected/rml-guide-example-02.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 276 >> -stream -Gat=b5tf-M&;BS,reF!=lClsslL%g-"^sPBq#dmiD(9C#P:=*ChD?`,i^knYR5]%*T1#6Ab^VPPpBmCBKP[;VODWN7*O/[WnQ$FrbI_Vq^"ju];9^#$VIPPr"Nca)#fcskJng+n!8eMj5!TUSGa)9oYISX*d'uM\qYNb]#g14\ULflGQ2-#?ps=IdGT^DXrDd7K>Bi!81gL*J_44RepZQPi$C>kM9_r+?1gM02ZCOKZM4R7HXUC~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001052 00000 n -0000001157 00000 n -0000001575 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1626 -%%EOF diff --git a/z3c/rml/tests/expected/rml-guide-example-03.pdf b/z3c/rml/tests/expected/rml-guide-example-03.pdf deleted file mode 100644 index 05544756..00000000 --- a/z3c/rml/tests/expected/rml-guide-example-03.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1150 >> -stream -Gat=+b>K96&A5Wts"MKH,)Y72]ojREaH;I\[s*S7!f;CVI86+/B+t(<3VCgt1TaBg_\XM$S(>&,X_r!E^9L7K&<_%\ajo&KYn&bgoXpF-QL[L,DEg33k,PlR;t%eu?/[k-5.XGN`kM4'hb::.5#ECaD)^cfZW"A^hSO":p[c@ul&1EkRj21CR$ibT+.&6.%BBA3[qcbG](^o_[UDNoa_GQl7/5RDeQWL*=lC*%32bebm&>#^H"+g]cJd9o96K@3M&R\d;AeXZi$-W)A\O*t=q3*-lVc8p*c4_XgPUg+);X#`p8MkBT-ST-[k?4>erW^ja)tO3A0%31R/LUO9dXbTEJ6f40T8hUH"(B^POl*UU'GF;B4%A&JS'#0`utbmY(H[5cf_Tg*7)r6G+lq"\o7D^`FWqB#`*oBn%oUl.8tTDrK8o+'$s9(_:>1;<8%CB@KQ[_U>S?#GdXW'JL,mF@pr2YslL'J>/',P*!L)<]qEEIJD`$Tbpdb@WWWJd7l#,k"l>'-lEdR9LMA7'FogBE%9Qf6X=#la.0+a/@cX6@f&2$gGc*BQr>0HWFT,40G,2!;`GMT^o:GlUdDaW;!B;AJgH\@=JDrsWLQj9HcL^)L%Xt19>rX!HQ]-8gT7#KGHVqpl6'^jh8/m/EI:=?l$qItg%Xc%OhqoBSendstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001052 00000 n -0000001157 00000 n -0000002450 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -2501 -%%EOF diff --git a/z3c/rml/tests/expected/rml-guide-example-04.pdf b/z3c/rml/tests/expected/rml-guide-example-04.pdf deleted file mode 100644 index e50ad8e3..00000000 --- a/z3c/rml/tests/expected/rml-guide-example-04.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1054 >> -stream -GatUs9lJKG&;KY9nfRQ2-o/F#rUQWu,WJcj!QY^i#YbZ*P*Dgqr-``Nn$nCk7V\trmAmMJH$9+eiu"WaO(j)Nm?ROP<:<$hAZT'A/)r+WQ5AiHE^%+)chOU%chRu^=\!,X<$aOT+#*JNf"0!`VioVG\Q<]%[YN,@g)eb1bDYYf>2H4>]Cm/+]"d"m_lklFkOROd8V=j*.ps!2d0'K6LggV?T8M3R^A_Xa)NAT+kYVR:N@!^r*^:Q97'Y7Of"Obm%i;VDEcpkk5*S,2[M#8OTi$lSUUU<7.ROHbWB9\(egRnb2LW*g(,tO;co=HiT!k[K%Qc;(Rj^A1F);?5[:gIFoMu@h]:bEeV,g+@)(1=o^u8MC"KJ`QH.ZJb!=BB=$?`Z?3])X5fb*3g?9IMV/WGSZ"mf7A!n[N_ul6R@UpFC)^MV;U+a=3'rlh:JC`;-nEd0cV&7@YsF`La@*3M>0KAqKY@)CK#["#`[/>`JPc3m0+<\r+BJg4?_)ZQ:/Y(,dMl$Jj_4,QXF='@QdfoBeZrJ*fH;W;@dY?5(Z6lF0>V$N<.6NZirrK.UIth]6L2*?PL,9oOQkC*&1##;&LVaba[Bm&]RBf]a#KfJ.)d=Gn?ZkMDO*UZcPXdW^H>J==g`!F4TF;#~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001052 00000 n -0000001157 00000 n -0000002354 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -2405 -%%EOF diff --git a/z3c/rml/tests/expected/rml-guide-example-05.pdf b/z3c/rml/tests/expected/rml-guide-example-05.pdf deleted file mode 100644 index b559af8d..00000000 --- a/z3c/rml/tests/expected/rml-guide-example-05.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Oblique -<< /BaseFont /Helvetica-Oblique - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (Reportlab Inc \(Documentation Team\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (Example 5 - templates and pageTemplates) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1281 >> -stream -GauHJ9lJcG&A9%PIi.h=>sO:H0?\\kco)7G]1!?#5kdlD[%rEh[3QL=rUh1&[M1*p9fLaZ%9aNZ3:B!?B842A5GVTF!oQEK=+:i*%Rb(TT'\i92dAl%ahQ`S)>ITjB)"nS;aAM/.[mYVs5l7r^-VBQ=GQ;RVn3b8p(%XQCk!<\DrrtJ(]F_9MZpBKNZ5?qmZ,qm7_R&dhHj"4CMAP5m9,\8$Lmpin@C%,VIY$K",YEuY(%#T+I(?.l?$kRI,5"]_]!"LN'T!ebt>*G/L7]s>DTE%/FGc[*N3DMR;Ic.0p9Q@UtP4n+eO26:b1,59\>fb>_CI/b_cU?73tYSXYNg'K`!lq:BGOs)V$;SLg%^@?gl7V#3!EE/Fc3i7N',!/B%fBF"T?X<.dHq71]W/N:.[l!6+f1R:U&iJgiS`UjrjC!1R5+pf++amSEcl6OrP4KS(5(EqmFa#-2>bKVWj=mIQ4#EE5p3Yks>Oc_5j[A3o=8]$+ZaF&XDskl20t&"GcVeT%aGIB+7&/ea-s_4mfo6jK8a8BM(-IpeL/;IPt8@PbeOCU6*p:BCB9qB2?KR)"_kkJoLtK$?L9Hhno>YkgjjUl48F_jjU&Cn[dq53RcW7YVm3!lYsa*B8-YM8(";H"80c!eFRg*Lf=md~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000573 00000 n -0000000752 00000 n -0000001029 00000 n -0000001164 00000 n -0000001482 00000 n -0000001587 00000 n -0000003012 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\375\011\352\002\224\227v=\274\333;F\316\275\372\251) (\375\011\352\002\224\227v=\274\333;F\316\275\372\251)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -3064 -%%EOF diff --git a/z3c/rml/tests/expected/rml-guide-example-06.pdf b/z3c/rml/tests/expected/rml-guide-example-06.pdf deleted file mode 100644 index dab20e86..00000000 --- a/z3c/rml/tests/expected/rml-guide-example-06.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 807 >> -stream -Gb!#[?#SFN'R`L25@!_62PE$PS.DW:&(O]pdaVu8VEJSQL8KQi->'4VI^VVB3cLW,QmPWB-]ZN`k8mt_"?cK'qD_[\>UOK96\&!(EZj_#61PmW-H![;E'UjQ,75$@j`Gq&ds%kgE$4$a]B/+39=Y`?'!%iW<==e%I"7poH((\L#L(Zi69n^dCA86R'X&[jLZFF!rMmV^62Osrr="c;5b_\/"J13^ah`5ALF-L9s:7o:hb-i7dTl=T]#mI77)1o6R.oQ&&R)7GK&FMJNEp&6879/^V'>K?2('n34KSTnM^F%tbue]hdD2=Cgki!c'OUlIg\J=gQ#KET#isLE.(*-cu4LY(/Lrd&V6lSfp9U4bG%#PJF&eJRfJpj!)K0-WuHY@a#@RWka[!(T7dE@'sfS10gM8P[a/r`?\3qpendstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000573 00000 n -0000000760 00000 n -0000001037 00000 n -0000001172 00000 n -0000001441 00000 n -0000001546 00000 n -0000002496 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -2548 -%%EOF diff --git a/z3c/rml/tests/expected/rml-guide-example-07.pdf b/z3c/rml/tests/expected/rml-guide-example-07.pdf deleted file mode 100644 index ea3d429a..00000000 --- a/z3c/rml/tests/expected/rml-guide-example-07.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 204 >> -stream -Garo<4V#=_%#&mu^;HEX!'=oNY*FNk"dBs*!eqHsmQZdor3QQ`jF"8*T:H7rq2!(?"M092?6G,IJ])\!3b"GC*_]#q]J=>pc3L4.1`B%B3_6+kpWZ:#F@!_lr1TjC$^,H$8&_Vh<+Q(deFFJ]23m'APAT#)DABih9ptcW"=ZJsJejsZ2l:K3FIG?rVHIN[+*dl\0,ED,W;~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001052 00000 n -0000001157 00000 n -0000001503 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1554 -%%EOF diff --git a/z3c/rml/tests/expected/rml-guide-example-08.pdf b/z3c/rml/tests/expected/rml-guide-example-08.pdf deleted file mode 100644 index c60c78f8..00000000 --- a/z3c/rml/tests/expected/rml-guide-example-08.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 186 >> -stream -Garp%3tB+]&-UA:db\DI$HTB"8K.tLW/tq*#q-DnmU*p!nk4Nbfh_KtO3K:lu0F!nU5T']:,([IK.,<'M]J_U;>7lOQ~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001498 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1549 -%%EOF diff --git a/z3c/rml/tests/expected/rml-guide-example-09.pdf b/z3c/rml/tests/expected/rml-guide-example-09.pdf deleted file mode 100644 index 0ddbe6b5..00000000 --- a/z3c/rml/tests/expected/rml-guide-example-09.pdf +++ /dev/null @@ -1,151 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R - /F4 5 0 R - /F5 6 0 R - /F6 7 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Courier-BoldOblique -<< /BaseFont /Courier-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F4': class PDFType1Font -5 0 obj -% Font Symbol -<< /BaseFont /Symbol - /Encoding /SymbolEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F5': class PDFType1Font -6 0 obj -% Font Times-Roman -<< /BaseFont /Times-Roman - /Encoding /WinAnsiEncoding - /Name /F5 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F6': class PDFType1Font -7 0 obj -% Font Helvetica-Oblique -<< /BaseFont /Helvetica-Oblique - /Encoding /WinAnsiEncoding - /Name /F6 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -8 0 obj -% Page dictionary -<< /Contents 12 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 11 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R9': class PDFCatalog -9 0 obj -% Document Root -<< /Outlines 13 0 R - /PageMode /UseNone - /Pages 11 0 R - /Type /Catalog >> -endobj -% 'R10': class PDFInfo -10 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121219133528+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R11': class PDFPages -11 0 obj -% page tree -<< /Count 1 - /Kids [ 8 0 R ] - /Type /Pages >> -endobj -% 'R12': class PDFStream -12 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1219 >> -stream -Gat=j95iiK&:j3Mr#b(b/dt2`+-MMULBTS%JH^ohg-^q.bh-Z@aXbJQoC"c:8=F;QGT5:sWStnV4@rIBn3cTLg&l^TiV&959qcq;apEjo.src^2r>E1mG]J;$0.1A#_W)$.&8+W>#8lJ2aS-k`t9/!0pi?3Y_$F@(h>?l.3gA[Gmjo1%-3X`/7gWab@30M)0tV.PKfYokNgVgaX)!MS*m*'N@+.!$_n;8C="K07l+M]M#:_A?63(LVU;S$WpL/E7q>*XdB`%tbm)`;<;R*HlQ/>n71Jeb@PY5_=T+6euY-#sE,^=_Tan(6*RiW-Wr,oOnHrfQRdHcajYQ:HRBJ]ATJgCJ,`h).;er*=c9GjN!F>/TEY)/>nhuR(f31^RSeV>;\nZd=&4ke'DE]]=m6b?`NdBj()K:njbj)`H;\njJ=f\3ca(qo"jZ-q1fF(N.]=2qq.?n8..b`Vt@<506#S6(/aPcR@&-GQ&'K)&s:O-ddZS./JDNKaYjX=FP-qPBbm/rJ2"3KFuI3K6qY5JjI+BM8:e"@aHQ5aTD-o7/.l=iEX?e)iiS7Lbr\SR4.kZGT;UjrpPNssn'oZ^#>e3lN^uAM85G5]T'S&=7J?iK`+M?~>endstream -endobj -% 'R13': class PDFOutlines -13 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 14 -0000000000 65535 f -0000000113 00000 n -0000000269 00000 n -0000000434 00000 n -0000000605 00000 n -0000000790 00000 n -0000000948 00000 n -0000001117 00000 n -0000001296 00000 n -0000001575 00000 n -0000001712 00000 n -0000001983 00000 n -0000002090 00000 n -0000003454 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\344l\301\320j\307\346\376\210=\215\256\246l\2546) (\344l\301\320j\307\346\376\210=\215\256\246l\2546)] - - /Info 10 0 R - /Root 9 0 R - /Size 14 >> -startxref -3506 -%%EOF diff --git a/z3c/rml/tests/expected/rml-guide-example-10.pdf b/z3c/rml/tests/expected/rml-guide-example-10.pdf deleted file mode 100644 index b24f76fc..00000000 --- a/z3c/rml/tests/expected/rml-guide-example-10.pdf +++ /dev/null @@ -1,129 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R - /F4 5 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F4': class PDFType1Font -5 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -6 0 obj -% Page dictionary -<< /Contents 10 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 9 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R7': class PDFCatalog -7 0 obj -% Document Root -<< /Outlines 11 0 R - /PageMode /UseNone - /Pages 9 0 R - /Type /Catalog >> -endobj -% 'R8': class PDFInfo -8 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R9': class PDFPages -9 0 obj -% page tree -<< /Count 1 - /Kids [ 6 0 R ] - /Type /Pages >> -endobj -% 'R10': class PDFStream -10 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 622 >> -stream -Gat%ac#28i%"RdInd[d*`M/0aI]k>ldk1h%!a2!$)k:G5HJ%7RZ4kOkXY,;.gQ;'Tr$6k`d-8F8riuWNBOJA;5_!l%ZVL\hWOP]HEnlL$8+cQ"3X.a[,-hq@H\,tr"6UEAMlr4_m9k.X@Fl)cPMLeI1b<^j*Z&MMrV:]+n*'51`h;bAL6%@FOS\83d)#LL/#ceLkof5[$WXp-$)bYu[W$nt5b2f;=AP//p'S8(me]PrKYJ]=AbmrSC7u<.e+*Kp/<8ph<+icRPD;i+9V8r0NE'#`.p3YF9A&/7)rqu]69;i+9W$AbaE",H'"2%m:*$VDBb?5JhcQ2$T:KX_@L.!hl)h5k:fJu^C:*S(,7V.c^ElF4s/'BZX9"lZKl~>endstream -endobj -% 'R11': class PDFOutlines -11 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 12 -0000000000 65535 f -0000000113 00000 n -0000000245 00000 n -0000000410 00000 n -0000000585 00000 n -0000000774 00000 n -0000000943 00000 n -0000001221 00000 n -0000001356 00000 n -0000001625 00000 n -0000001731 00000 n -0000002497 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 8 0 R - /Root 7 0 R - /Size 12 >> -startxref -2549 -%%EOF diff --git a/z3c/rml/tests/expected/rml-guide-example-11.pdf b/z3c/rml/tests/expected/rml-guide-example-11.pdf deleted file mode 100644 index d6317a23..00000000 --- a/z3c/rml/tests/expected/rml-guide-example-11.pdf +++ /dev/null @@ -1,140 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R - /F4 5 0 R - /F5 6 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F4': class PDFType1Font -5 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F5': class PDFType1Font -6 0 obj -% Font Helvetica-Oblique -<< /BaseFont /Helvetica-Oblique - /Encoding /WinAnsiEncoding - /Name /F5 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -7 0 obj -% Page dictionary -<< /Contents 11 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 10 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R8': class PDFCatalog -8 0 obj -% Document Root -<< /Outlines 12 0 R - /PageMode /UseNone - /Pages 10 0 R - /Type /Catalog >> -endobj -% 'R9': class PDFInfo -9 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20130304200123+00'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R10': class PDFPages -10 0 obj -% page tree -<< /Count 1 - /Kids [ 7 0 R ] - /Type /Pages >> -endobj -% 'R11': class PDFStream -11 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 932 >> -stream -Gat=*9i'M/&A:TVIi*/4DPZbD%X;:`(9/fNY\DOnU*Aj(5Igqe]Dh%mJGnIPh\sJ)%iC]AqD'B6Uio=Fpm]QnIE-eUX'\P][n)Z.#tq$XrAr:TH;Uek+k+jX+3c$F_$E7KMN+\^VY`:;&nIEL4akgn30ntVC3\.R%Xd/8B=Q3#itK8n'uD39$Jr'\g;6A$SQWLr"JqDA<#H&lk3`4V'dH\6<@Fa8aqCJl=?rRWq3d1<+]b;l?0lcZN%/<<,uq3o,#j@5W5-Pf,.oaF!j/O#9X5X<^,/^'F+t#TFd-*@VPuE*#IA!-@@;J?\giCjhB:c?j),q3J6dK9A)$*ITB[qbgR4DFX%\R25OZf5YqrFe:Uqh09)eB"g"]ofFhY!5lW;TC?,t~>endstream -endobj -% 'R12': class PDFOutlines -12 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 13 -0000000000 65535 f -0000000113 00000 n -0000000257 00000 n -0000000422 00000 n -0000000597 00000 n -0000000786 00000 n -0000000957 00000 n -0000001136 00000 n -0000001415 00000 n -0000001551 00000 n -0000001821 00000 n -0000001928 00000 n -0000003004 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\275\375"\226\004\012\247\311\024I9\2513L\031\365) (\275\375"\226\004\012\247\311\024I9\2513L\031\365)] - - /Info 9 0 R - /Root 8 0 R - /Size 13 >> -startxref -3056 -%%EOF diff --git a/z3c/rml/tests/expected/rml-guide-example-12.pdf b/z3c/rml/tests/expected/rml-guide-example-12.pdf deleted file mode 100644 index 834cdbb1..00000000 --- a/z3c/rml/tests/expected/rml-guide-example-12.pdf +++ /dev/null @@ -1,134 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.a9475650de663a97fd49920ba129d955': class PDFImageXObject -5 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 86 - /Length 3441 - /Subtype /Image - /Type /XObject - /Width 130 >> -stream -Gb"/kc\l$s&BFP1_2Dt)$d:1-71_WG5t""8d$&bf&I]R7/-[n]Ci0j46p]$_"a0tHAPLlrJ9CjJP]Q3:qi]L#Fa-T"Ac's+Mn;AA&B6[X-o?:8=&#D:N"#.Sd_Jd&9nAMZ$Rc?Cq]/Y@kGCugmI;S1MEQ=hE#?fu]AM8aaT1Fe#Q@"WD]Ve6J*7aNZ3-FN9]5r]/8)?iJrSUU\&9qs,l-cZ%,@Ga:aj1tI*.E%7]"0q@K7*%X`Af\njiWkC+51"lqO*V0*PI'PBJf1OT02\,Erh63ZEf)S^]!jfHpmVVo1#\nh"B/Yc3VT5AJc=Ij'4BjV:+2kk67ig(ZqPk)\b0r:qcXj)4V):BjW1aG9sr[">($q&@&2IVjUXKB`Q6S_#QPVQ<*!=7!gZ)uuaUP>9uEFQc49!Pn$gdSY2"9^dV)^&'O6ZPLEmUUKj=0GrtOFg]EA_)rZ&;rVG*uIo`F7LH(Ktl%Gc6>hI=B"D!/K;VVAbkh_dMaT?"DMF),S/hm>a3)l7K"=C+Ak"]sJfAU=.%EUKQU+N.i;Q//H.6[FEoi_BsN%kVaghJClIbg7+JB.Che#fJj1ZLr,IdH\qC])p?cEfgQim'seq:@jhddafm@3jBfh:gMK;$:u_Tu`Ef5+:,^BULR&2*)B/@nCjXR21K+c_NWo*aNDp9X1"d!$,2'E=2JJn8C4$[G>uV@nc,FbWK.kk;5bN[lL.ac+H'4?u]gpgIb!9C[Nt'diDUboZDk3Q6bqekZfLKir0p'T.OkEb0"GQhe^7P5tiPEKg9`>*6*8=eoGBkm.`S8P!!VW:p8uuM*7C(XQ669?@q5$Q4JD5R:NNg&#\*=Lcs_Ys-4ti8M=plM2=X[jDgXP`d5!5=A/'/D7IZWLoh%R/5#uJD-R#!Ct4c/.JK\;hPKdHbZ*&omX+;2N/bA=BSmAO_!:.d7kKp`k(#fe%"%)Bc>TQpKJ^XW)gN/-g9n9KpU)/\f1$QU>slYX%2rG"CReW\5cHb`#!.+i12ka"f!N[]nrqE:aVl=hB+OEDSh8`2^pdo%QR65*#mk%-#X[",Ofs=\_!N!>3!HV)troQI\?^9^#=7,?QpZadoGqfh>,"Q3`/l#;<4!6LL(3mqm;>D2;-DSjMNd2a'#ggd(q3&M5_iUbYsb]ja""]dcA\fuB?iiO&!^PLOi35WqkHR'-KR*aWf^n:jJn&Tb3('.eah]JEM[&j5^)dgEdO)BF`>l**+9SmWp06Tn\hjj8O#guco7C$_cFSN8udG_'JXgj(:e9P*nnOK[6iK?kn>.LPi?]flJeri[+^]1DMBV`UbNOnV1U'HA3WA`_,Z[[YiY\F\l."XWK>CNV82<:lUW2MZ6]R1"(Qr"9LlJ0]N3]b>>DbL9h[9,de1[W?HDg'Ht=lel/IrgDER(cMeqYC#aZQTG"aM>=r:+og:N9?@rW_D09;hA-aAd$\gEY138bbi'P@0Q6YOP7nqSA49.ffNT8-`cPF!35;&.X&;Js0qoSkiQG5a9P8WsU9K*A$nP[U&kMU"o>YqIs9[^M%D9[uVM0$DR/kl(\cZXB55OdZGEad#;2dKHA#SogbAU\HC\3:Ss4hN7P.K,`5-`og&N[dDq)aI.f@Q[uXZq(#J"84k7RM9GI6Eu=ob5#K["qZi86D#mOt?F/UJLHEq@EFtnV[YYJGC0N2k#UGs_O)`e)0)d_`U4<:#BZoVfh*cco3&^>XC>$l0:NDf3PVCPLkT+K[Gj[;*Mi.`B:GfhIC(l@kjVkHl1:7`XP[)fE9FEV_$!\TETGUITa(dFf,"t3A+]Y"B=CIq/8;/4FH0h2\_-'@F`\hoa*j-]Y^3`L_r8h1=p=Yqo:=/;_DBHiBuE=[u4d*$B&Ie"+Raq&W57a\Ba#YK`!"66+NaMM5$&r>Bgbs;^cVM_sYUWoa3HQEjJX@)NI.r?q0!VETqhE@j3RfpT"pBK,="rZ_6UM,J9AsiZ&.PVuI"=kH,W`(^\H^L/0Pl;f($GEt/HKdKa-Z[#mb4Qck:NdTka@p4=AMKW!n2kO%iX4a+%PsVJqh'Mg+P*jW\U+Mhj#iUt8&bn)#YWO)\+6#NT0,TqCkQIFZS_tQfq9j]iEWVSG/#.HH;1Ks+:^BgHYq798DlD2M\)Jj:bFB^hgC\o;H:%"`HcWs\CTB1n`h!$E@9Mgk%VV"54r_tmMGA@":V56%)>K12KnD(SlW7A\OSmlGX,:m0V8WqK![YP?b0[4SD:rC-*s.&GJA78Y!'=J*A3?!5Hnp!m]cU73i^-fm[`,^NS554-[-=Z5\`Bk;o;Z;nQGDC::$=t0T\E-1Y=kP3K%I"HS5IogSDcLLBO3hleVhS@CWc(mO8<;,DEi0!5GO>7RPopn9ZYXJ#O"H@C(tsj/.PI+-Y"pJ@=gj.uGFR3Z+[*^=BVXt$Cc*W1/+-B5+alZI1hBZo-/BldS`68Ql\;k-:(?g%7u7$pCe%rKe94K)B.N>\f_[4(&VtcnFh/?.eBk5GO<,P\GA;#]]3$>VTQBYBGrpH')5Y:[OJ_i^9Kd5i5KbtHR>X\kU)%s5S\FmonqYG2qrh)*9t?/cqb!YMa/8Ub@.B+9K".)ZAlu_*NdqGMqYu*bendstream -endobj -% 'Page1': class PDFPage -6 0 obj -% Page dictionary -<< /Contents 10 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 9 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.a9475650de663a97fd49920ba129d955 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R7': class PDFCatalog -7 0 obj -% Document Root -<< /Outlines 11 0 R - /PageMode /UseNone - /Pages 9 0 R - /Type /Catalog >> -endobj -% 'R8': class PDFInfo -8 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20130304200123+00'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R9': class PDFPages -9 0 obj -% page tree -<< /Count 1 - /Kids [ 6 0 R ] - /Type /Pages >> -endobj -% 'R10': class PDFStream -10 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 879 >> -stream -Gb!;c9i'M/&A:TVJ!a`'`+EZU_qlmn<2qnln:@WmP7SYQ1o-j1^\cutS]H?`U6685hRq[tR2s%fp)n>O6[ud"!RoV1'*\(-H!7OC_X?Hfem\OdQj1ktcV7l#cq$GKR?M/mr"Bt.^i>^m]R"?bFH6Y%JG#OCS&!2`&@K6Rjppt,PXl/<:&3:nF$;FlMPSV)[PU4*4XP3'AZ$]f&?/%PMd2PBn[V@q7%\9n^W%7@9H-OQgmnd3B;d`[o1ZM.)KC;p48K_.EZi91o"SntFZ1psG`BE"h@]JDjU5^`,]_KU3L#lJ(&.bgJmeA/6?$EtJWX5b8NCk9/E]=iFJ&3_D:^Gg+&%?*f,!KukO8,~>endstream -endobj -% 'R11': class PDFOutlines -11 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 12 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000573 00000 n -0000000803 00000 n -0000004479 00000 n -0000004822 00000 n -0000004957 00000 n -0000005226 00000 n -0000005332 00000 n -0000006355 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\275\375"\226\004\012\247\311\024I9\2513L\031\365) (\275\375"\226\004\012\247\311\024I9\2513L\031\365)] - - /Info 8 0 R - /Root 7 0 R - /Size 12 >> -startxref -6407 -%%EOF diff --git a/z3c/rml/tests/expected/sample-shipment-chinese.pdf b/z3c/rml/tests/expected/sample-shipment-chinese.pdf deleted file mode 100644 index 65b66994..00000000 --- a/z3c/rml/tests/expected/sample-shipment-chinese.pdf +++ /dev/null @@ -1,891 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2+0 10 0 R - /F3+0 14 0 R - /F4 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.727fd0cdaeb8d46ce9aa0763629135e9': class PDFImageXObject -3 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 219 - /Length 7013 - /Subtype /Image - /Type /XObject - /Width 729 >> -stream -Gb"0Wl#,T@&jYE)s-NFei'GA&gJmPJFhYV==fd=?(nd(?HiO-Hzz!!'fYJ%k-l"TSP8aIcg]k61hc0)+*HKF8(d!(\EHKQ&(8!!':22\7Se!!"-po+Joo"98GS"C=F)O8o7\\YMk((D6]JE)poaiBdSG!<-#H$/n2P!!#2??:)BkD?Bk=W7HCopd'*s!!#9_:m^<,r!3bhF7"F\@!WW4YmMeQumWJX3!3,Bj6_a#"!W[b7m[HP*mPY.IJFC'f#7\7K%KHM.X8>B5XLnE2!5)D-/RX\.;#gUc0&9n6\[j-j!5R^-5P7*[:C.#O$[$sUpZ\7d!!&ALrhT#64ZrcF(@1sYhkPO]!!"S!rTV$ppJ_.n=J5P4ID>1V!rt#SpF#fC\u,u;^`_I*jnJ&349,B+\j+1/YO5VXihZHn!!&+Zq_JVZmZR\P5d9ZP.kJ8-%7]8<5_YO2#-.N9,"qY:6F6EVMS#o>_^bncKRF4_5ketZS+dn]ZKa(1i?qq\QpCFh_`HU$$Ots64DIL#\:J##jNM!Yq-+5RFe:FRHHFhgX7"sgIe/;(K5'DE%X7,#E@CC@;c-TUopu$G%4;AoaA3_We9q=ZmL=rFm**5M5cFQV_s$+%(**4trmYcVFiTI?`'t-\\Y()oj*_,^U[A3o[9I9IE7u7BZm`?@WPP>JJcbX5%k)QBFsu-,c%:#nL_fq@UaO74I6d:"h$5#G,H+K7\T`Cfp7K*e/A$KAi+2KV+OQ%N3Bm6KQC6CpfCt/E"]i"_r13PC=E*aB(@dBL7gq"hf^c[B_qf8]F!D@Q"BCA_\MifZSQ%,R^/Ia>]"LR!(b*JU'.cL^u*]Gdm,(ms\jHcPX,UVIX++g@F@fD@!_Xje$'POtW^o9>JNXT>d;MF?X3cLC!I<_G'kf$eLiZ+g:4P*)s]A@dXG:\d&^=eGWY/WM&EGK0HB%#8H<^SZjR]o3R41o%uA]oDpl+UB[U]IR`XFGIj!?3PYNl2O&A)k(1[aORFBPp+<0&`tN-U!3PYq".OBsY8+Wqge?Ij_k3t*X,Yag!/('h1!5L]WH,O;e/"QN]r6bLa3S1&pV%Vk;Z=_CR[nAo$4*YT=\aJZGgaFc6r*bh9U2#m-9lpq2eCr@G7BgmC"?slk5[J5(t%I!<:LGHnTPJHSZ/^9_1=c^.VE30,J^1!BfRpf%7F5[i9Dfa,2=qA2pg_4/gFAJ.UP_r;r,dDX$H[P;*#-9/?/&3P5Yka_(i$6h`ZM1eI#AoQ0\6(nS:6[isF:a+#9"li?,2INJtEC"eG>N]doiXXBq@)f9N6,o]V0sFr`RHi'`X81#Ip!^R^UE@r&q@?u#mak,QGom5K8i=c2ED)I2CoO4iIftNm(e"7JHt.%XJ;q-I3U'K`(t^$^r\[\4DJ`/8OJHi\7nYf'/*K*GRCZ`iM6sZ$m#NsuRM#grY/eriQC`&h9mn+l88UG=/\5:X.C:D)mS)Y[kFATnF+2D,\GVE\mg0eR!_1BAGN4>m1OL!>ImG!fJ.k,\O5k]57iObhqlY[hL10%YSFC!BO2C2.8)rcNk19)[KL,TnmidIYAMjNT(`)PZ#qmY*X@QA,-Z>Z[o_P\D]:U>G(sVm:pb![!PJZ-8iK`J2$K8kEjD>=E?Ej*`]6i*m/G5RtIm]&FROEY@7=`W.JQH@+1M4n6S7!M*n;[[>t>9pBP%[*ScVf?9n1+n:\q7_5oBGZ!DZ<&*H'/b9^R+];#P)_;.*0fsG)kB=,<32\6b+:N-_"3$W8m`#RZVYW.EUJ76,POC]+Jd3"l,(NStY)-^?+r0cZ=]N_XmW$?(S;AZ8$q=aIfc[$C[0c`S6W:ZMj:2-94A%UV:aq*55s"UY^Xc?U4LQbuE&[Ub,oLEfLgY:Mc3]]"2EcQT9kOlQNrf'fpgFm3=Mf6$&3tG`V\E:,kT&$n(,_gRN2Vk%J'R9OM&]hLM2)_!l^\<7%/2/RDo'"<.l7+h\1B[.M:uTdj&`"F1mfH[%JQI=](!/BE3WF%0kk;%N\A9LrYg2mg-Ko(3'Ik;0?1(Sf(gfK7$'bkF#.NqW5=jKD%"!p:OQdnjW;aj:ntSlfCG32or%^@/J^!17Ml;d3G@^Q*ScVsQQk"n1;a(5*N7>2K=R8F%b7Un*UGDHEjmqkh'JM1HhGGF,8eL'[^b$e$`^Z?]dfap7kiK1`l7Un*UGDHEjmqkgpZ#=%-V^!M`$&r\lQ`'Z-aZ6g!B5WM6Pp*8i4cT+Q>PBjaL^"$NmqkgXaliTNZj1b@]=OjTdV\6mg`)XpY_@eROG4"3`YOQ9q\V+WK7_>A2Q,Em6iPW7a*'eil3E['@HlDW.]mM-IPdkfr^5>=Z#q-uL1jDFq;16J)gf5I2!;+QaWskWRAtS>j4EY`M$C(*SbF,=#o[%B0kQ4G"e"gr:794:qd@KTlVAa08=>We$b".54fN.?P]pSlUp2ZFhFt9`1>giV)VOTQ<2VBJAXOr)A<\q^cBcOu1XR\$Td=Q\e/`K#p)2!WX).U>C-'(t,umR:pRT!<?07(P!:Za,0C$2,2Fd,WV#IN>`teXTO!-1AN>IQ;kF)\d111Yu^Bl&`5T?6&u-.J4UKIntS>9,mY?keXq9nl=q09(sRlSCPK[T)NJTBIOg*5THZgDGI0I)SC$U9lG*BYU3-b[PGrP@Tbk3Y%QOM^V;fGM.YPJ_HS:mq-@/Md)_*&=:Jd6B88mLkePX`/d6$&-RgXbe-hV_I).30KYl:$&ul?qB7%Bl&`5SB9f4-WH`6O=`6_qs99'G74rh%D,#>jXf1#\[QPRf(JRVZAjhjM(I=]')rk;$I;@TA)td+cHh)1=6=S4aP_!H-\CMD4N;RLs11X,=(WY%;R?s3:$-N*aP`SHD/+f*"\T9c"K(fqY7@V?^Gf,#=E;LJ:nsq'D'muTr:(4.%.-1kAp_374ip?,A)sph*ZpU4kGY&/F2k$8+,s]DL*_RS22R$_FK!otC1-!Y_C`&LEQ5I>f<4u;pT^j1^lZ"cV6Maq=XK3UaS@je(LGJ+3Fbs4m(A*^;d68!]*'bVs#>Cm`klSG>@_C+N,N%*>56j5"8d%m+e?_J@q4T*9I*ESiDK0t?I6SM@o@Sg]8(Q":U]g9)rcW(0itJ_4003,/1MrAfWqo1j^2UjBCaL'(qD12ahkrjjKH7iLNCJ2o%8*rm>dcSjZbZA%p";,%<)Hd:2@BjeW;I6C09b)kcHV6McGZqP;^TJggu_So_in98(U_6]nOX^RRG-&:R+lDr!.U(naIOL)(;n<+mfod'>_6^j4*`l?*K19iupg;ngO(N5GPhed35c]5$5L0[]D*0N7]YJRrj>AE^EZ-CChqRj!Za]BA.S;`(tWNgRfjWF-1%MWQIZpb1KX0iO%40$jMG"Gt[8D^G^$JQ23SaNR7@NLg\'n4fePN8bQBhl[aW79J2&$@,4>@d64=rY;aUM?o>Qdd>DWjS]=Ie[o-2eVDPM2iBlV&P&MO%O#5]\PS2T4Jo/+`04R4g_^r[&R.fJ_9_$JZh?M';k,hl\H995IW.[`[/R:Hm&\!isC8ni^[3"j2SpgLFgO]ccpC-f!Ti6Nk;G".'j>M-?W*i>eYo$LO"li'/hnFjH/14Hk`chh"62oia38!bF_]4M8,Y$Sl(8_Ym3;78V7\Fr1:e$="3GbEg"F-(fZ<=^oJJ]MOd>3DSMHg*@3bGUJr$J]],SSp+VMJqT>raPcNk/]-Oqjg85/Z3jjrXk'aG=5i!sT=.8tCYg8C"+_,5-^o+-as!2qaiA&u#q'SP_;A[BKZ=Zt(ugT^U,B97e<5=:+sWstMpr4>:@Offc39)\BRVGWTaJ)"g*20a]q,Lj,J*8C\2T:+l76DsG])Z6I]c6413E9mog=[a8..39KEK#/]VmL11;o9(;W'#+!8p:oJ]=`]8._pJ!:XU5W%YB!Lg3@K!5,6`Y]kn.70!>#W%YB!Lg3@K!5,6`Y]kn.70!>#W%YB!Lg3@K!5,6`Y]kn.70!>#W%YB!Lg3@K!5,6`Y]kn.70!>#W%YB!Lg3@K!5,6`Y]kn.70!>#W%YB!Lg3@K!5,6`Y]kn.70!>#W%YB!Lg3@K!5,6`Y]kn.70!>#W%YB!Lg3@K!.TONk^M4c!'f]H2un*4T/H\b&%Xt85b7>@%05mMmZ.HHVu(01zzzzzG5hS%PiLX~>endstream - -endobj -% 'F4': class PDFType1Font -4 0 obj -% Font Times-Roman -<< /BaseFont /Times-Roman - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 18 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.727fd0cdaeb8d46ce9aa0763629135e9 3 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page2': class PDFPage -6 0 obj -% Page dictionary -<< /Contents 19 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 17 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.727fd0cdaeb8d46ce9aa0763629135e9 3 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'toUnicodeCMap:AAAAAA+SimSun-0': class PDFStream -7 0 obj -<< /Filter [ /FlateDecode ] - /Length 886 >> -stream -xœmÖÛŠêHÆñ{Ÿ"—3l­Ãª•‚F°µ…¾˜ã~·¦{„m”´}Ño?þëköÀfå uÈ/e²*óõóæy<ݺù_Óå°nÝËi> -stream -xœì¼y”\Õy/º÷9ûœ}æ©ÎTsUW×Ðcõ\j©E—$$$ÀV›Q eÉ̃ZBˆÉ $6“%f´ã@ Î B³„%–Œ:±, K¹쫇^â$fÝôíûíSÕR ã¼·Ö]ëýó^u×™«jïoü}Ã9#„tt7âÑÄÊó«+ÿ冷àÈ!x_t埙´®¶ „‡à}Þ•7äh!î~xÿšÉko<û/þô=„„åì[®ýÜíרÿý_€ýUÝD®»ú3Wýíwõ!tóåp~ä:8Àa<ûÁ~ûu7n¸mÉRñØßßôsk¯üÌöº¡[þ öÑŸ¹m’;‡_‹ÐFØG¹›>sãÕpÉBø¾ß…ßß0¹öæ 3Ç‘†Ðí}ìüäú«'…C+÷Ã>üÚ_q7Þ„ؾþ²Zë»á3‹à°ˆxÌ^pŒ— tòué%K— :ÊͼƒÍB툽 Â'/À­m ‰xY´õçè÷…\ 0^Q$!)H…_БL»C.ò¢8J $J¡4Ê ,Ê¡þÏþ|í¾¡ûæ?0þXðH×W»©>2ôÈØ×ÆŸ‰=<5ôŒï޽àïúîxìÅ®½5ï—óŽŽ c]Σö 8¹sR½[åTaNïìó6yOz¼r{`_cÚ:Ô\ۣРïÛ¿zßø,m'mô÷¡n…á9Bí¹þàp‰í׆½èP!: ¢^ðüHî†Ø^¹ìúÁ°(.•íEA4•”˜²éQQDY±½¸.™ª–S5Ù®-Èbô’Îõ<É 8lj©²D€é”¨‹Œ„xœ¤;JL^(™ò§ƒGæANï9UÁóÀ›¢¬Ÿ{,õnîݾcýä ð=˜:˜{sð]ü®ð•6öÝÛÿµÁg÷ ¾ÔÿÊàëX¬Öú—÷=x±qÉà5Æ5ýÒ ܈ ƒÅ… »¨¸HÁ!³#°ô Â;‰Ãm{{pOþ»p°ŒÔë­ìÃ}ý+ñ`m >°y`ïp€*8þ V·oêÄŽÌö5À6êÖ×À¸'E|8t–/7Þ˜j ññã‡Ól9Í—½jmÙ#ª³ôv@òÙSµ9ÇË´\ˈ’,P*8š©™–ª™C¢Ô<¤ºj±#Þrñ¬g-?n:¾ã–dèùaü:Û¹qÃöÜxÜõã‰Ïþ5ÿ×LÞ?t4ò ¬Ö/¾Ø¾Ø¿(ñhù•3^:çMëòÁ¡ƒÃ?;f;[êê=³ûÌÞó»Ïï½²wÒ¹¹÷–ÉÚçn8ç¾Þû¾X»÷œ‡jUÛÓæ®’pùœÁqÒƒìÌoˆyyé÷€¤=@cŠ€îu£.OÈkäIùnyJz8”Qß’ ò{€ðŒðjøno]«b•é\cÝúæïFü«ùs&¤F¿+À^£ÙÜh\G²™ûm¼áFô ÀàõB gptA° l–ÿX€»g$R[ñzmS« KwáOm©å;`µ#ÖW›„cñjÄÈš QµQm€ 1_‡ÖÕhà·li¹øî)³Z£'%¨Vž•¡ (ŸB.¥'ÝÿÕmm:y^$YŠE.VÊòöEµ­*p†òÑ‘À¸¬ëõº.ˆ¼Äñ|ª“°äß™âa×Ä `°£³„¿Î°BgŠp"!B©€ºnC_‡um æUðÿ[$QÙ…ÏØ"ð”9- )9©OZ#MJOJ›ÁUû ¾ì‡ð”ÔSax¡<0 \1:*ÃôýÆÌ™l™ ·­ä1(Lœ+–ÿR.ýß’K "¤[!&âQì”8;ãyUa<ÓͱHk/‘›¿mû!ÍÂö)ñˆÈTd lŸ’Èœ¼ ¾: v{ºq:üˉ2ø3YÆ‹H¥èûdˆ‹7¢—à·u}d™iåx„a2‡PµÊ"(׋^Ccä »«Áûæ–»¶>ô-áºovÑá ?¦?VåêŠØŠà‚ؽܽä~é›XÂCº@]Š— -+(E‹4°«ØUÖXN¯ò€úÌ “3A-Þ>“oy¹>‡Î™U݈ŠӶ,?“ütú™®öRgg©½ëéÞÎr_oGGµ1§!^¾"}-ÜYðü¥>o7g18n ¶)fA5ÆúNÉéÓ&5N8½ox -vö@4’ˆÆ0JË΂Ý\¡ÈÊ -Y‘Á‘5“ly¬‰­o»)E<Öá÷'fôp½òž»¬öØ Üç¹/qßàþ\xÜúî)ûy{§û·ö?ÙGl3,µ9¿§I¤z>[0“Ùd59ž\™\\›¼+ù`ò‰äsÉ$µ™$N¦Ú˜mK^! ÌØâ@$­ºb&Í‚Uè+ððàÙt5ÊdcÝè¡ñãûÙ›jœ´ùÞÇÍäü›à - Œ€^7,K³)˜tš±Ã@ÕÒY~¬q¢Ø‚˜mÝãÄtE$P ü·£…jª F—.§bv&â…EpÏ£ôÇõÒðÜÒ÷=›ÞÖwÐÿÉð/Ü_v+½¤·'Wý\ìs™›¹ÏgèPàh]Î…8 {ùJö@—^Ì  [<ÿP"1õQ?À"c ‹/`ulYÛ-±ô„ÁÌãŒÂ" -bÛã³D8}î'®ÐDO ߟLÅ„DÀP™2`Ä„3-j5"4a»¡iùÖ@,íê |<¸Oãø4f•$ÖL”ÌXÜ0=AJ4cöày€!Bµ¹òV®E†©L‡/—¨¼X•è’J2iÎ(ó²4/l¸Y\sé¥'éü*¡?­çÅOc®SºÁ¿!±¯¾ì9ñõÄw;ñ[þ¯|­Ð¾ KÛ³Ù\&›Ü…u{-Ë[‰Ä'WàOpá8…r˜%²< ¹ˆ…­¹l>d˜žß”}2ËeÍ]ŒÔr! è¾PÚÚפrc]Då½{!šÞÛ¢õÀG)yŠÜ[ÊLâèÈÈÒXO8)˜cªe›¦jQY8_N”Øút˜Ìy¦(K#0ËðÚªšö : ×[nŸË¹,è…ÁfÙ ¦dÿ,`:9ÊZ‹…ë¼8†AQ»8 êÀ£K¿Ý¶($¦"‰TŽÍ[b¸Üƒñ‰ELÇê“;s/^çÞåÈ×¥ÇõÇí‡ã§¿-=•~:·#-ß'ß«|Iÿ’ýÅøÓ÷tJ*7ws7JWtoà>OîPîtoiû|I*¦Æ¥mçøçs éj޾%èæ¾Ù³KÞÖó÷ò›òÁž÷åc=’'÷䉙,x™lñÔ„Ø)™²gsÏÞž©ž#=BÖùš|Xþ@æeO Û_¤˜šh[4§“퀎B0[uúœ ‡g!TÓÐ2+3Ú€Ec4bw+‚Åë"V7N1÷É ê£ |{VÌCM_• -¼Œmf"ð –eÙ1+ð4­Çr]S)Ôb‰„m‡2õtøŒ­y’žmx®ªz’è0Ãh¾¾¥߯êéÊN²³²Ox©r¿¥ˆMu¼‹ßSÿ¹C»=¸­ã+úýö_©ü¹þxåòm÷˜ª^Å]¥\û\å.ý.{]Œvéóƒù• ¸K¥ ”U1Úéð̈h›´)íˆÆ3Í‘©-Ÿ•©1ŽÈœ•™ßÅt¨žœH>™ÜœÜ :„˜UMx3BÈ@Óé¦5™nšl§¥7§«Mð[ -mûA3Å”­›¾åØVÒ a<•Oë10À„ÃXàŸÜ;ü ¥…éä9ñT˜«”:kšB/c\©jV3Õús.º3Â@ ¶æ?à9˜sm‡<åñ82¤ˆ€Óvá‘â„óÃ9 q³(c¢8†Ð>NÉaûÜÙlÜìûÆÖæU­5Œapæ}tvØtCŽ Ð˜¯[¦ªÂ¸@žfN¿'HÜ@|jß-nŸù q8)ò"dlm±Tc±@£j=6ývc]>YÙLUº¢(Á}2é7í֢홲uȇÈ8‡9Þbµ±ŸÅRñêØþC!|M- µ.Ï?_¼"õü°y‹ù¡Åë†i‘¬·Ú;ìñ‡=¼Ò{¶f<âIU°ëØÌ„cãû€¼U°*÷½Ó{÷ -{i¶ÆVXW âI|[3áŸÜ+— tðS=2„ø|‘'".›%^¾‹ˆ<—Å^ç™%YeyÜÇ…?‡¥Hé=ç£(N"üüxæv°Óß©wÕŒ/$ïë{ܼôLiO釯OŒƒ±ƒÉwŒc±cIÃO✱6±.àž\Ð`{.§¢ŠÂ‚  P +óñd«ã Eb˜( -nÁÌû¼Í­™ =àÅô-‚®Ë«žðfaJ8!ðBˆòk–f±5Ö5¡ARN11d»‘ ®kÔN +[(€ÉZ¹)‹&Š,TcòæÁµD Îç‡ ¬TÈÛ1× ÒçZªKDB$€]á4a¹€ c¾w!¿ï˜„œáDù.Š7Òè®zê>ïiÿMó=“¢?à øW8·s o†’a3±–¿%o—$ÿT~GeMü({QÚB¨›šn#ç'ñD¦.ພåWóÜ$¿‰ßÙÂõQÆë@ü¨äñãc{A?¢„‘¾ÑÒéÚ·4•/d¨!“Eѵ¼À ¬â®$×ÙS8¾›‹¹½mÅÎ Æ{Éȶ -YÐ@OâaíKø Ú½ÁKêëî¡t'w§úU÷«á·¼'×<ÊÛQ~=|WX^ÅÁº#fÎû¸Ï?ìÏø¼O§³I§Éé,žÊâÍÙ©ì‰,Ÿmqú8¨Át‹Å§Å×ÍÉ”ç0¸™@¾*P* -~f%°³'[l/tQ\ÖUˆØ—ß,¬töv‰ÍzËGtÌ«í®k¹‡¹‡ ßä¾YØÁí(¼È½X8èYÍÙ9§«ºÕÜ}9Ñþ.nC,ááⶺž‹×ãq>Çí-Òá0aigEØÎ£v˜¶ —Ju;ÆÇ·á¾¶Ãm3m|[‡–`³ï@ílö®Õ1Ñ1ÕÁOuàM›aëDé8MÚG÷U§Y%H±¯)î£Ó¿ne:‡#Ï -ó0KYŸó¦œJ´HW¨‚ä¨)"¤–ÈRÒI˜ž(¨×ˆL žÛ8“‰´¢ˆ ˆªˆÛWnÊD31²™Ï¡ô­ºñˆñ”±ÃxÑ8h¼cˆiFœfž‹ˆS¬'Š|±¨s1€ná¶-léùEæ®â€:i¸VÑÎ6qŸ9ÑE/`ŒN èCužÑÇ·è¢üÅ›è“t3lŸ =I¡_G$Š(ÄÔ˜K!–k:-Íô_Ðj¤Fvà:M|H”o’(/ElY€vβ©ËŠ0ŸhÚŠM(èÈ ûU´©Þq/~Hàz¸¹¡ösrKÛ/Ë]Ô~gþQáÑö§…§Ûwý¡Ê¶Ê¾ -oŒ(¦YÌ"V&¬ôt™ˆGɼ,¶uuû†Ì ¼½ÚÂç|žY5Û¶„ˆßÔ†Ûš6`ßô>«eöíÛ9e Ål!ã¤îÏ©gx^dè_¢ã.ýŠÜ$Ø·GrBÄϤ„ÕìAyFŠj›Â'ÃÙ> -1œpÖ8“Î&g³#@4ö÷C­ oußtKðæRî·²}l¬+ˆž!å™eµ1dK·þ¢9Ö?ö㈇pÖæÚžAÜUÏöÞ)ý~¼0Þ¾²¸²´²|mõM° -¥ñ·‹bæ^êvoô€ø¸øŒ¸[|S|d•ÍV«½´Wêé­J=—µÝÐö¥¶¯µ=Û¶§íÕ¶ŸµýªMn‹Úz.Ë)ÿl~Oþ­ü/óbž‹IRO^¢½U±­G²â©Rgr[A cä-¶‹…¤ž¥½==•J¥*¡YÁmÉ®›‰M2ÙÍÔ·¸V‚É®5áâ)?énv§Ü.qOÙ·±“ßuëY2¤jÚ,ùÜaX0ðM­é†o*±K¨%L7$Øeøyͤ¿S°öž-uÒ=ÞÙšNÚ,ˆ½‘c€x˜PÒÅ Šëâ)¨¼(ÑÁèi"¾b r¨Ý—‹B³.Óô±Iô{u½$n•÷Éåwe!p£, ‰Kk°â0©ÇVK‡%î°„£ÿ‰“LÐ -¥LOa”Š[æ„9eòS&†ÿIs“¹vO˜‚YeTb4‹\ºõM—ÙDµñ†³¨$i¸‚ _ÛôU)ð)Ï×ÒY/üÌ¥çê}U£jV­¾r½,äŠÕÊuöõå¬/—³+¿l¼b½Z~Ãz³üžõ~ù7Æ¿›v© "´Õ(–*°ÞQC¹Äò^@­ž´m˶ôb©\¡šSÇÅ•âjq­xБMÌàvÔÑ'`Í¿¼‚ôÑfôbEA²²QZ1“ ûÂz8® 'AEÙ',mÏ´Çq<’13ƒû28cë¥2)$: Mñ-‚ø`…Ì#Y†ÈÃÅ„5â4e,1̬)Òé£ ëÐúuÖv$} zÖôÞû¬iÉú›…j§™TZè/œ] kMLÝ»ÀhqmbäŠÏð‘EM§¹lî”5ýŸüñݧ„íÞ{Å–=c|ù}àKý¢>ÜmåŠgXÅèÖⷭבTGˆ»=‚žB;ÐÐOÑQD°·Ÿ±wÛ?¶fÿʦ_ë[ [CÎöë@vÑ2ìÐï11–ÌàêjÏø°1cpFf–Î[2í‘+3•9‘á3;6Id±ðýH¼Ì`íÌë[Æ)G$ž¥1Þ£ ¼õG§¶ˆû!þ!ÒkYÖÓü÷;H{5G©"4Ÿ …­H²ÓÝ·4 ø‡ï;EÉÙÞ°Û[õÈ›êù—üW®Ä qóÉ|iHYî^âÞîßï?Ê=Í=­ì´t¹¥½'ó½, Y7,mB›Òø)í„Æi,q_7³>ÝY¬`¿þTYò#¹Ç9®"åY¶Ëþ¹0Ègã‰Ì¥]åbO{w¥ÒQí«”ûaÌÌ'lÞÇû׃{SdJ}-s0u,ùï)zGòŽì‡!_d)BÍ5CXqªZ™†az«!.á >™¢h³ÒEVËÜ¢Ù´‰Õg'ˆ7i›56O¢ŽD×­Ÿž—¶¦øqÏÓ‚Ò•}mÐñdÚÍ æD¸`ñ)^ÅcA(:¾#ä,§K3ÇÁ¾2¾¥Ñ(z®¾ð娫ÁK…—Kd5>Ϻ4{yá¢âÖíÒ§éSþëâÁĹ×+¯wšÃþ‚ŽOâ%Ö¹Ùs KŠTãùL»ÇŠ¥íoíë’Ùv¢QwSç“?éüE'IŠÈ¬uŠùr¿³+âvy¢Ö¾ øtð”è®ó 'ðb*œ‚ £Aülßt˜J„û\Ÿ;›ðâEËO‰²»À‰Ù±– Ÿ­_õ ×Gî!”|Œ{˜|-ùX÷3©Ý=/op? ßçÞ ßïþMhÊ^Âã†Â³ñeøê`ƒ³!¼½ã’°` ¬ -Òb”e‘?”ÿTæd œ(Fvä+¹oä¸\±f U%H¸¨‹×ô³ºX:ÔÉ&V'¸‰>’˜Ip ¾Ðî²K–~nu³8‹©øúãÙ&#KB탠–‹1üe‰Æôl*ªô±©˜“mAÍ -Ÿß2cI7(á°ÝrÌŒz:ôâ¡be‰$Ò¸eÛ±‹4'f&)O:8Ïô4Uו¸í¤À÷sñ˜Sb's,g“F+ëæû.9#Î2‡wt@Q‹¬Èf#8ÉEËS ¨8f·?`ìmeyiˆ¡÷OÝß²fÖY×~JšÊÙ‰ERrÉ nœª$Ê«%A’ üÌRh$qŠK%쩜üåßI”7g¾ûÏê….ow÷÷¬ý¬·ÇÞãýØ;Ƚéý§ÙœgsIå“?ˆÔ$Å´ÇA]„íUy˜Ì4ZeqµuØâ[þŸƒÍ‹·ré¾4—fW`’)¸Êœò1ò-ÿ5Ê?á >¨ -8ÝSæ}Y÷Ïx³Õ­oÔ>Š™›~êôCþ"Ó¹oS’´$DaÝÚŠknhJý7pý–¾Å5P+N¾=ÂÇ߮ǖ+«”ÛäÇä—å—ãoÈïÉ’°ÈC–<ÿõðÝ x”¨ø <Êൺ®(²â…ÔDÎäváúÖ K¬¡OžÂÀ‘ºišØTLˆ÷…÷'î+ý}Hùý¦²‡nWäkÄëÕÛèFåÖpcéz¯"u -9¹­ÔÛ1"_\;h‡:JGÕ‘Ò2eYéBñBåâÒUòµÊmôVå6ucé”=äôåçuõœ•¿¸mMÛdÛýùÇz¿Ý»«g:§Îá0Î0º„„ã;’T–•2ƒë[ÅR¹ƒQ^ÄJ™eî¨ ÆYß!%’I_Ø&þMSç ¿'|Ix\xF€8©S˜/|d £´4yaòêäÍI²,yQrc’O¢\°QÚjC¸ÑGët‚®¡Ò'èsTªRü=L9šË!»àë@ûÄlõ=>GJŸ:©>©nwc÷ÉÍ–Z¢aV¦ãAåÉ™gƒ×ð 3srÉÌö•Ñë•ûÑcx—ðŠðrâ8þe™Î¯H\š¸ -]­^Q¾}'þBüÕøÏâj3ŽÖŠ%ÄRU5Gë ý™D"þ¦ŠE¤1[.iqñ{xø6 Q/«{n„Âì|©פŒ›'”ÏD¡Œ (]Ï*$rzs©||ºéÝ#JÏ*Ó€if›=ãs²(§!¦ÓÍäj,P®Ì ŸÇÈÜe' -\·DLr߈ÐèÊùMÙZõ}‹g7{• ºèeB¤3Ôn.3/£š·Óæ#ÂãúS³úa·þ#áÇúáMݺâ/Ò‡è7é6º G)’b1Ã0ï51Ÿ2w˜/šÍc&5Yõ~U¥Ì»ê˜ÅfÔ Fê¶I Ñ ÚJqBœa% öÚ×l<¾þÇLæ@ù#GÉr,³ÍKt¹Euͪ‚îI¢vÙ*Ŷqù[¦Éµ}+’ˆ_nB¯‚t}x„‚ƒ%Åóêq,˜|–gí•üj~-OY‹È `±ÝXFb•«Y:”Y`nXOßðMc¯Êû埳ïŽÍ¼ƒ6 =0(¥Ó.Ôöü”õ9Ào~bîo¢¨o‚ýf€x‹Ïä«óüžNñGø<»IÞ‚:ÎòJÑoÀÓaxb ~4?Ê~3ƒ¶ Ï ×`éïð˜ñß…çmÁ¼P¿ývˆÆß~»éDÊné8×ã²9Î-ɹ.—dý‚3o£»f~c¶v³>æ-°U­"ö{¬eÝU#[ç¡íh9üAÖóŸxó¬Ù™5^ÃW×|<À½æ“€oÆ3*|Ï)w AôL½w‚L„W‘5áÆÜdþ ðÓ®w…wº”ÜŽs}á'qÔÃ˰T|d‰ŠÕ,sý}ýõþ‰þ'û…þ~ä+,vñ1¿ãnˆö¸|úû@AVñê‰ -½Â–²Øðy{"—Oð:ÓÑêÄúvxÉñì~ŒiëСC™ì9b÷Ç4#Ãæ½KQ55ZµÌZ+7àÏI#·z Oö´ª¢Øï¸Ù^Ù² p1×eñ‚À‰S켪ɎҖàmÕ MÑUÀÖ‚ [¦±XâeÉPAýhV6)­’XD;h·íD! Ôûë=+ðÙí—âKÛ¯Î\—»7sîQòð-²ƒÀ¿ÀÆíêíI.O†É$™”HÛU ÑV€km‹T y€ŸaÔh½² “JVÄkq(¾€ |³ VÄŠ -€Óh|<êº?~ ‰ÂOÝÈæO §Ú¨Ok-¾âyIW±E™Åd2€ÓtLÝб¡êéT*ME¹TBþTµâñ0n8'û^7Büû‡õ¶/¹9Ï:‡¥ƒÊÒQ….¥қܻÜуá»ôX(eÅ=Q™—ß9eâ»kj{šà¼žaIÊ€~¯ò?㊔ÊF°¼!t‹Õ·v˜>¶|Ìàw³¤½·ñv”+h¬ƒÅláwädÈÇw‘\„1V4Ós<#Ìöca*Ú1vãÍ% oDM‡~ÒÑ8ÓˤâyG¡©&Œívà­†zÑŸÔ?î¡ÜgÈUÒ]Æ]ÎAAÈ%ÙÌ ÜØÚíëü"#ò|Tà-E]K2LTV&±·ÅïÖûJ,¸XÇÙ<^›"ÿZžÏG…+kMXœiY0sëX°à<š3°yì×,Þ8ð.׿VïO¶ì§3»ér - ú— –dÚ–©š$ï$R1ɆùK*ðP¹HT‘ìOK4„a´§S‰,¥#Ì=“?Ø&1Ye4iö´n¹O {ê¹?vJ/J¥£’Ð//–Ï—¯”o–Ÿ¶Þ%ïøR\ÑuPrb9Jí j¸0¿­OǺò= Í$eðëz6'p_'\‘y£–‹áß­6Ö7%}ýñ¨AŒƒÈ§ F‹ûÇþ5Ø6̘gë€Ï Òi/–Z ¡Ž'&SåÔˆã‰\tTot Kvðn—‹—#Žú¨‚¹“ð¬€ŸÊØ¤n¼¦Ö>ÐxM,úa&Áî7ê¨äŠÕýûǦá ¬!…ãûXB…™¬ÚǶG7œބ>Ø“€pžY(,ªšÙÙ)pð+›½Çó4):A0LÇ/o‚ËÅfoŽ1óstðGEg¡‹Ð»õU­7Ýw­÷]òÆò÷²ÇÚŽU~µàýåï_D_<÷ʼn—/ü)þ©ð}K}}™´›îVwœ»c‚Ýdò*}U•úõ¶…ó—èçë;ð†Ë—jÎx¦i¼)ýdzszoz*}$}"MÓA4Ÿ02Sf„"DT†ù$QÞÊçò}y²9¿7?•?’?‘ò¨àÀakëCxzMÙØÛê$B|ŽÅœHd÷ôð€çû dìoX¢ê»ÝdvÞsoMn&*çð¼ØÇH Ö;':×tòìãnµˆÍb¶¸¹È—ÔN,\³_ø\* y 5KVœÁ®R7-ÁÖ’Ü’¾%ü’“rÓ` çhcïôÑÆºCëGl53s¬Ei4²AQÀxÊÈÿ7¦ö¿‡AÅÜÿÞì×õfûŽÿoy3Ž—¨ ƒ7s{Ö›)Š ö¤éÍ.Rp| (ŽÓêûZ¢éšÚôf¨uo݆ÇèöúàîÍ>·‘l”nWn6î´„wð/Õ£ú³ÿÏØñ@¼»¢’«”Ÿ²[‹ô²{;P¼(u%ãfº†œíÊ6ê`î9–7žµb‰È+Eœ‹*:ë¦[]µãѼÁvÃ&ƒ±6d|ÓA˜Zå™vÌ3 ,žo ýöö O†‰d’͂ۜ.§?_}±ãK];Žu+Ÿíž 'S¤‡%ìÜx0ÆÉºdc`K¹è¦4Œ#uƒŠQz !a·==ø„–„ëÞ$m–8‰qqß>ˆ“öYo·\s“Œ,T ->ΆÎÅ‚À¸²?'4:¥Ì˜HmÅ…ˆI5ÙcMLÅpMSvh¸&l$B“Ét*C!¤&£ŠO„¡ª5ù¨ nC·?Ëèëí׫×'þH¸—> >xƒ¼ž{¼›S® WHw¤ïÈCL/¦ø¨]¸ŒÚ€$,‚L!fsâÖXQ Y iƒ(+Y¯ÕŸÐ9½Cf±™Ï®ÌòVöƒ,—!!„Ü{ Yª;~ê–äÓÚ¿çJóœ*¨ ^F ˜³­«61XdX´5;‘±US”É¥²¦ãž¢ -L…¢$¥SÉŒ$곺~ èzº¢®þÈú©õŽÅ£¸lÂ$›ùŽÐa>pÍÖ^×O†V™Å"–)Äû2›2\¦éWÆöŸŠ¯ŒßßìðŸ›÷¨ý.qP 4EH0P™þÙ.ãxL¢1¿Ð²å(OÍ×i*èù ˜pÍünÝD/ÔýÿG’“1M†\ë¸2®.÷–…ËVy…«Þèy£ú^Ï{Um›øBnŸøjî€ø³ÜQñW9ÉízIZT£:›ÌHQ—sw7¹b¡²§©;{û»PàÚQ ZSZ¬Là' B¶Ù·=HoÝ6¡ÍHŒ4U×5öM` -q<ÊHG©Ø±ý½Àùý{Yy¿Ù*´®þVõùw !‚ÿx`É» -lXLÓM*SO–TÏÕuŠ"ï:†)%”eébÀñŸÇº©È’ÌÁy¢K¦-ð\[–¢P™#à`44{¯Ûèë(>]Ï<è<á<çüÀyÍ9ì|àЪz†ú õRõsêç51a2WøCjb”¢_µ}eÇ©÷–X•kÏ›zuÿ4⇢|ÑøþV>*Îæ †[Åè®ï1EQ4NàlÃ43’f‚á©TÚ E×8ÃqbËDÓ’Ê"jÕ'xÐë;P/º¿ôf˜Ö­Î¾ÔóÓž£=4‘î2ºJRq‘±¶±T_ëf‡xdÛdpL ~”Ò«Y›æ¸¹Ò‚ÇO¡gð´¿„^ÆÇÐûøW¶A‘„GŒkÑõæ­è6“&Mœ3ËÌ%Ö’äeøŒ³ I×ÐIÚ¼yà¥´ÚøÏõëÓÿÙXUsÞŠcÏ-x7kšMM‚ËkSíž…ç‹Ä6 V1º«*äBÈ×QÏ_Ñ™.[ʪ^”FO²äçn@Ýøûõ/äJ_’9VÓ¾MÚ¨lT7†·•ï—ïS“K|[þvâi»²+aå‹Ëãg•Vů¡Âžà¸2-)Åb¹4BG”Zq]¦\Ø~½|]üºâ­¡ñ°÷¨ÿhŸ‡†œ¡Ü™¹ rWånÎíB3h&«˜(‹jÎYÎÅεÎá, ŠúBã;” | «l*rB’•ÒCeÌ`ÚZ,=TÁQÏ*Œ¿Ù³*±žÕír"!±Ò·•¾µú5MÏLœ'ž—¸*qsâË≯C ¹GœÿGB—Ÿx»È'ŠrEpVÔ| 4Õ¦ì2uiBZ#=(=!ÍH8} œœÝ‡×à»0£B÷¦f¡{¨UèÞ. ¬Ô ßV*WDÕRc™|7×,t£,Nn›"QVè>¶Ðݬr7‹Ü£ë؉Snkìx³´·^‚77F¥“›Í÷úæÝ絓M¿ÕñÛrÒhíâBщ‰”ܰ›œÉçÓÆ³mlcÐÔ @åOŸ{îå,EÅEcìi3°^Æ -¦³õ¿ hßU¿!,á‰Koé‡o•…¤î—¹Âq»À[š\:xaòÂÁÇÊ»Ë/ü¬òúÀ{Ü{á±”F4˜|-×׻ܭ÷®r'zÅëÝkzow7öô¤6h \4•xR+Wâ¸äFJß¡%“ÞLuK¥èÐVíÔþ KîU*ñ8[Æ Û¯¯ƒ{´-•ýÚÞÊ!mªòßµ#éKÚ=•G*ÏjY„JPá*ƒX#´g·±½ôc㇥·ŒŸ”~iü¢$Ý[z´ô¬ñÍ‘ \JÆ Ë÷,³ò8Ÿ¢Ù6c‡c\Œ}˜”ºÛª‚Äw7£ø`ÖsšEôÊLÕ\'HÀúûÂ&ó­UT2Ÿ¦³=·ì½õázV>úoAÐ:0µßn™?URÿõô%©X8‘K¦xð‹Ý¢ˆ9/ÄàjË"QøD‹‚ÐÅ ·"ɪ嘯ôFÏý"m!*Ÿ—;¹h¿éŸÔ™#èÖÈ–„õÏ|/‡)Kx hy,¿[ß•{Éx%÷ÿºñz÷1ãݸ¶*w?¾ßx,ÿ”ñ]N|ÔxÔ|±»·våÌ¿dH+r—áUú5èþœ@ )ËÍ£Ëé*z½ -i„‚kŠØó9®ÕÀŽYBw[îWݸ›1»žÏç®ÓoœJ€IRÉí+ÕK¥5¥É’0UÂV —J=+¥µÒ]/åÖ»9±˜Ë¥\P¬ˆ2_ŒB)r¤ $²²¹õ&×FÙ½ÍZ<ãܺ»Iy]³ß8Y‹oŒE&»Õ…Vû4;ýÑ;žFFNãÐbÎg^²S$×&˜eQžñ/†@®e€;!4ƹ%QM^¸pŽÀ‹”ãSZÅ,½ ´î£'è&à‹ž¬÷þ;{ɰ~YM>K®Ñï$·ê?Äð1üä7ºþeòuò²›¼BÞ$ïÊžhV—¬íÐ_ÔêÇt¢Ã‘€Æ4"†Ìmåu[ßÓ¼…®]ã÷jX;Œ0{ÞŒ<Åc €&ÄûHìkÌVêÑh1·ZϬ‡ÙZ½=¤è&zÑÒ¢¬ø;oYI7IWY¸Z·p­Åê‚#3¿ ÷÷àIÖ×ã;ñ.}WòEü²þrò§øMÿü¾¯¤4•Ýð·UUc˜m¥jçÕã€mH–TÉ8Y ì_Kèaò™d “ݦ†ÔU«c,Òa“ý­¹ŠÍy 4ç9ÜwÃÍ´Dp6›%àVY‚ÈͶíljl†¦ÞoœfÁ’ÍÝТxFAÏ–}Æ?¯nn ¿çri”à-=¦ø1–Iˆ»`D‘Wó®ÁòH+œÖ’]*ÕI”^L™(QÄÕ³û²À+?$Sãb'ð+£qŽ ¶OmٲߠC¯±G‰Õ`‚…`dp•µ£Em_#Éê?øö'W{Ö|嵘ó¬ÄûöÏZ=AFòÌ»ðy–æ.¡n4€FЙè<´ -}¾¯P#]dÔcÙ³ûÖæ¢VŽ<8œ…0h¤T¦Ñ2`gËà{ƒæµ#5ZfŸ†³¢_*´.‹–ß=Ÿ®¼QÖ¥K1ÑÒ®ËR-¾ÛRm^Ò•Ohr$±CV4ÅådQ—œáKå æ{¼gqžs‡­]& -}$©‚£Ó4-ÄX,rª¢ò”ÓdM¸¨ïjÁ ‚bÒÀ±ÔaKíuE‡§¤,S©™)ËÖªÃTg àÜœ­©r_jc޵C2Úã—ñzZqóFÊd1˜´úwô(Z¸ èÃhRnQºÌlbDZö=¶öÄ6:Ò$ÎHD.¶£KDÖuJk#l«ôûp‹½ŠZ¨9Ê…’|f¨áqIîÅúWº}Ãuß”%]NƒUõ9Z–eWÖõ¤Ù™Qµ¬l¸˜H†œçèYJÌljï AJâ/=?#‡ž.·Ÿ!êrÜ„p´$ñDK¤W”ÎhÙ öÌ/п¢—@Ö-˜ ZМH¸Õ\Â ÜæÑˆÇ-&7Ͻ@1WyämÓ½¼¥©d”³5Ý>WŽó“pð|:؇JWÅÌEàj ±¼‰ËCà$ñogM7ÁDzq³,©‹Ú%>Wш\®¸f©Î· È*Yè?…R¨€Ñ:láùŒÃÃ'Åž ¯©ìÁÓll0ü{‚“E&šž[kŽ´uåÖJÑ<û.C§,Ü}8¤^¥:K½¿äX¬Îä ªåBÓÔä“\`ûr:à¬\LqŒ³M ŒXa`ýlx!B-9V³Ô”sn -Â<ÞNð†Y—ît j*™Nƒ˜öYÞ?Ùí./§ñR‘j46 2u‡ÆÒB6š·ó>Žþ‰u—!æÞ‰ú`ìEão ŸÉZÍfÓ´&›šb4¶)‹La”}Þm»¾¿_×ûujÒÞ¸*j87ðM0ç:úÙ`&e-ÅÇŠ·$¡+ç<®ñd›7/006þÄ®wÔV -V‰ª|…j¦NPâ°¶âåAŠ7}N4CÍUo!‚¡8wˆšr†š–ã×–…‡6LÝ™Fï£)L¢6àï0Ç_(°h-Ëî,çjÀY6+æÑfs@ïüh¶-Ô"Al‘(¶±##‘&þP2¥L ÁÃMð>×(UqqÐã5-¨xbyàb·¨šrÊ‚‰ ª’³xQy¼!Øì‰6tˆ[¨vðÔˆá€7ª˜Ê`U¨ßéR«¿?&:…°+TqÛ“bä… W½j€èØ– A1ºÁ`¹RÃõÎ’»@*@î¦ã<‘4ÑîLµÙ« Î»üÑ󉚼frD“nñ0br“•'u²Öbié’Ëá5ŠÁÔ˜r¡®þç¬d)ÕË`&cnwÈ’ؼܹ½]h«Ñ *½U4UÛõ,Åæ4;”øR‡A¬ø[ž_”£[Ns0®_£W`\´Õ¬Åð ø¶‘Úp‰<S©­hr±±BäR[êTu^‰¿Læ-+4{;gþtìPõ³ùÍä)Uöéiã>5Ÿ¿l—CÜûšc¶×=»ëÛU•å¸Òek†ÇO}ç>Y5´?x×\3ΑՄP•øËEâêÁXek£Tµa<¹™ÑRt9XB0#"à%–##þÛÆ1{v^Q\E­ÈjL–‘ˆÌ™èøD+zbg -ìfÿG “¯e>Ø»å à4‚(ú#åÁ%x˜Êê‹1+,YuiôJ)$fòé(ߦxžÊ=ýÓúœìVª+B‰ý´2¾#ÃÅ]U‹%8ÝŽpi;ÈÎ?£ý`ÉG2j¹^kÅ%ˆêP´÷ã3¹ãð¦ýPôkCÕ ¾iUbî%ð#µ‚†¬º.“Ii-¼*vAó#œÁ¨H"m…ÌÐi°+`GçØÇ³N…¦ÈN1v.ˆ®Ü$ôKNŒ Ö%Kì‡àÁÏqf{*¦+–Ò+òН¥yÛ¬L'NXØ4ð³½½¼ìcK—+ÜQ± ºÒ±dÒnæ*í¯C¬àœ»`tj–k¨<Ï…ñت%}°÷˜×îE­g©3ßÙ0NUoœØÔ¶ˆ:j©U´º¨&S«'.(×3ûe]N@œe@$Ð;×ožœkP›ï¤oû¦SÙ ¸åJfN¯2ñú«®ºM1ÕKŒ{ýo%y”À0åË¥ ˆÓœe{¨¦Hnh¯*êýCPS-:ºÄ›1äy²J4€O$Mû1ÅJÓÿ«²kë¨Â3÷ýœûÞ÷®¯½ñzã]¯×v×nÇv^nãDq”„ÔqC[×qR7‰]œµ¨*‘ÚJUQ«A D%”Jª ˆü¨PáTU%ÚüB¡‚ ¤ -5üB5gæÎ®·¢üà®Î½3çÎ}Ì™ï|gt÷ž œm˜hA¯+3˜à`raÙÖ­Ý…¹’lÐ?ŸZ»ÃKió(ŒsUÝ“9WÊgüjð`‘¸Ñ<< úê9ô…¿@_¸…jè ´†6x­“Vg,›ÕQeØô€Tj¢2ÑR˜…ê ÖºYã­úÑÁ„ö¥£é„îhùÀ3‰ÞÒ¬Øõ-¢%ƒ’æÕë³Ý±Ù‚Þ79lYÏõ¸¦Ôc›–ÂÚ¤å§aUU‘­ftE¯bW8è™ÃãŽQ¬ÌJ6}ÕÚ¹øóI§àP{¹‡Òig€[îlu ;jqC¨54pšqCÞÎLOËŸˆãZ,µ8¾×>Èp´¤†¸ÇƯَœõpN°©×5†`íæ·§§§å™™™²’‰ä´~ˆB¿dD%Ýs6œ%k[Ó¹1*eª¢oAð‚]RßNæC,‰¯•Ôƒ~NizíJR›4¯ «YâÃMwÝPIo1%ðÏ"ŽÁ\À#¥,Bi%“vôdÝRCuyqÑ -Ã8Šz3™lé–rQìOáE‚U[_ 88ª¦ |ÂÆvhEVFýµaîÀ»ÂP Œ¼fhqÚSLsl<Ó£zŠv½w-ßÍŒíüAì948“ë£9§v[’d[wL±v§òÊÔ˜2TW*C -.ùz$‘åb¯dÅCØS•m81¦$k’íÓx3›C›¿O¨Æ¢ÍLPÞ™8 cILŠõŒvžãTíÁ·w;ÅÎdtØ´$U•± ï·¦óßì`rrrnjjŽ­¿£÷íëS‘PÕd7[ °Ù°Õð _Y53}õz]n4t¬À¥ÿ6±my·É8o³ù6ÎÖX°Yƒt«= %Ð8p[·žžU4mýÞ*ÎeU+RÓ>GðƒssÙª!kÙ:ìò°hjy"L—õ¬–ŠÅ‘eAÓÄQ5ÓÊ)^ ¸»§áæEÛqÞz*¢‰éà\æm1‰?µù'ÀŒßbìãxÑž]ÛšPÚ2xÌÞ%ÓN b$“Sí©j˾ùˆk9×lHtNIiizY’&4½òDÛÛ1Ι')¯`ùÖé€N,SKY°:YìáÓ®™ -@ò`d¢Ø­.Ä0Xp#yD÷sBh…ƒª–MKdèH –ݲR¶Øœ†±ùgh›­qÖ„Þ3õYËÀP£Ü¶ÍmkÍkÞöyÛl,VæùÒÛãa¨ù¾oǦkW¥3¾=+È!Ƨ@;íÓ@ÌÀŒöiZùjFNÓß—ÔÌ£êN«®‘ÇšâjT’H 9’×kyåZ}›ÿ@¡wj4BãÄ8ww·hôÏת©¨ íÉe`YoTVmGt ¸T說)hª%À%|Ñ%NFLG¦fHz6¶mÝ3¾åÂpù.)­[‘nç}×¢°Zr±SÒlßôò²•Ëy®¦úKbª?,êÄ;¤Ű_W‰møà¼¼ýš-ŠˆÅˆšï›úã#Îä?ÙwGayýã$àãÏÖgžBhóC´‰~‡{÷® %q'yÀÉͮȓÉr‘)®0ñAtEòL„€L€˜|ŸÉu/§³8˜WP„Fu¸Îáz—C¥ 2Æuíãé1ˆ"q½ ¢‚(|Kõ~^…—¸të4~ö1/Ó>-; -ðk—xÝ#~œÂïÛá÷H¸Ðãó !¿F–?×QåõÐø¹Ü®ëá®çF¯92ÉïÖ›6ŠÉ>¦Aÿ©Ëó$äiZÁçy£KG¿o@[×Âôe*ƒEù àŽKì=ƒÅþìãm}}÷á¿ -¯Š¯ˆ7ÄßKéºô[É)yJ^,ßUžR5µ®¾¡MjWôûôÛFÁ8e½±zöñKñâó‡ï?y Þ~eùÒÆúÚê2ìlÄ#;v´Ž­^8vyíèÊÙËç—6N¬l\\]_‹ÇͱãK§W.,mœ‹×ÏüÔã=+«O¬®EU´ Ï/ŽJc¾> ¾ã*‹{ t‹è4ƒ¯r€ü~tØß2ìÛ€ÒkPr™Ù€íÚ¿:ú °¾ %ŽBù³:–à˜£1eWÙÑ1 Tj í‹D{•;ûÖÑ™ÿóêÚ{iÛUØwö¡¯ÍC"‡ä¿# }β;ܬwxUìð-ýËÿ,lmž'Ï$úŸÌVà›xó…—QñÍуGÞ¼R> -endobj -% 'F2+0': class PDFTrueTypeFont -10 0 obj -% Font simsun subset 0 -<< /BaseFont /AAAAAA+SimSun-0 - /FirstChar 0 - /FontDescriptor 9 0 R - /LastChar 157 - /Name /F2+0 - /Subtype /TrueType - /ToUnicode 7 0 R - /Type /Font - /Widths [ 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 ] >> -endobj -% 'toUnicodeCMap:AAAAAA+SimHei': class PDFStream -11 0 obj -<< /Filter [ /FlateDecode ] - /Length 1254 >> -stream -xœeÖÍnë6ཟÂË]8ü’@@$%ô.úƒæ¾@®£¤ÇpœEÞ¾>ç·hk ÁØ¢¤O£á»þe|9.ÛÝïç×ýýzÙ>Žçõíõý¼_·ßÖçÃqãüöñ°¿|~ãÿýËÃi³»ž|ÿñvY_¾Ÿ^7··ÛÝ׃o—óÇö‡‰ŸŸî/?¯‡7»ßÎëùp|þÿ‘û÷Óé¯õe=^¶7›»»íãút½ô/§_^Öíî_Ãÿ9øõã´n=¿;Éö¯ëÛéa¿žŽÏëæöææn{;ÛÝf=>þ瘟ç|{Úÿùpþ{sýÜ]c§Ø!öŠ=â 8 ŽŠ#â¤8!6ņ8+Έ‹â‚¸*®ˆ'Å⦸!îŠ;â¡x žψÅË5vò;øü~'¿ƒßÉïàwò;øü~'¿ƒßÉïàwò;øü~'¿ƒßÉïàwò;øü~'¿ƒßÉïà÷ò{ø½ü~/¿‡ßËïá÷ò{ø½ü~/¿‡ßËïá÷ò{ø½ü~/¿‡ßËïá÷ò{ø½ü~/¿‡ßËïáòøƒüþ €?Èàòøƒüþ €?Èàòøƒüþ €?Èàòøƒüþ €?ÈàòGø£üþ(„?ÊáòGø£üþ(„?ÊáòGø£üþ(„?ÊáòGø£üþ(„?ÊáOò'ø“ü þ$‚?ÉŸàOò'ø“ü þ$‚?ÉŸàOò'ø“ü þ$‚?ÉŸàOò'ø“ü þ$‚?ÉŸà7ù ~“ßà7ù ~“ßà7ù ~“ßà7ù ~“ßà7ù ~“ßà7ù ~“ßà7ù ~“ßà7ù ~“ßàÏògø³üþ,†?ËŸáÏògø³üþ,†?ËŸáÏògø³üþ,†?ËŸáÏògø³üþ,†?ËŸá/ð§Ê^QàÏm‚¿ÀŸZƒ§ÀŸÖU?ÎìÛþ4/Œá·Ì:,ð—Qð\¥p ב -ƒ×™8F÷…ßf®#¥s k²À_ Íe¦gâušòYé\#*üËž\==ׯôGÖg…¿j«ôgö®jŒÙ*ý~ð\ú3×¾Ziž‘· -Z¸VúßW¥ßfzŸeáïŸ~އ¿,ÌÃDÿÂþ?Áožµ7Á_4O'úûÿNì™ü¥ Ük2ÆÌÏ”ù¾¸–Mð[š9¾2'\w&úûÕÔ˜ÃNüf\g'øóÜ9þ\:鯶¿öÛæ˜«gcþçEƒ¿ºŽû6ÖÏžÖk‰ùiÆ1ÌIË|ï•cèì­êyñ,þ™sª1ÿ©a^´Î\éwú=ûp›•szè\G:ý¾b~õÏüãÜN¿Ö”èl¨«¿uî1ºêŸµÔYÿ}»g>#Ÿ½ÓŸÞKgþý‚ÜöIó¶Îüæ¿wþ>«>xÖv‡¿ßWgý;®Gã†ï‚׎5S0fpþzîÇF`~¸¶ÖOaªÖäÐüåº?Xÿ ßõ(Ì!{æàü ïÅü{ÎÑ8ï¸gðͯ¿5æs¨þ Çhþ²/Í7ªO\gfþ×…Ùë:¸×8ž¹š•ÿïkNìWì3çoÚuÝõ~în±ÿÅ~ýûžzÿ~>_·ÛÜÔs3môá¸~ß÷Ÿ^O8 1{šÚendstream - -endobj -% 'fontFile:c:\\windows\\fonts\\simhei.ttf(AAAAAA+SimHei)': class PDFStream -12 0 obj -<< /Filter [ /FlateDecode ] - /Length 26731 - /Length1 42632 >> -stream -xœì½{˜×u/¸÷®]»j×û]çݧût÷éÐM?ihèƒ@@-$ÔI€xH¦A€„P"lcéÊ$±±l;_Eº -q@€Ð["‰"G±tMæÓç‰'häû%ÎsÝ7Êþ“/Ó—Y»êôCHž™;óçÌiªNÓçTíõú­ßZ{Wƒ0BÈD‘„FW®«gõ?ìø_àK°ÝrÏýwW¿Õö „plsϾ=e6*=‹”Aˆüå–ñ{ï_ù»_ý;„äÅYî½oÿ–¿¾|¹!/¿Ù¶uó]›þ¨6ñB¿Óo l…7Æ›áõFxݼõþ=ýàZí»ðúœïÄ};ï¹ë:Rù{„~·®÷Õûïzhœt’ÿ€Ðw_†Ï—?×ý›ßz²Ç‚× Ÿß3¾ó=—'Ðï]/~?¾{óøï,9¼^ßßÏ"Œâ#H†ß„„œúóAøÎR8fHÂâïaÎ;õX¿îêe¨†Ê—Š.]¾„š‘ØèÌïáÌ8y6Ùýgôÿö+P/C -RGÒá -&² cw‘‡| E(F”E9”GTD%Ԁʨ5¡ -Œ³µ¢*jCí¨u¢9h.š‡ºP7šzP/êCýh ¢h-D‹Ð0ZŒ– v)º --CËÑÕèt-º­@+Ñ*t=º݈V£Qtº}­AkÑ-èVtZ‡Ö£ÛÑh ݉6 è.t7ºmB›Ñt/ÚŠ¶¡íhºÝ>v¢q´ íF =h/Ú‡D¡ýèat=‚~ ý:zlòôEô%t}=†Gÿ=¾‚£ß@¿‰~ =‰Ž ßF_E_CGÑ×ÑSèè›èiô-t }}ý:ŽN ßEßEÿ=ƒ~=‹žCÿ=~D€¾‡þB§Ñ è :‹Î¡Ñyôz½‚^E¯¡×ÑèMôº€þý1úô6úSôúþåÿÿñÿéxŸ%ˆ^þï—?‚× "Rƒh´ =ˆÂ"0ÑW‚¨š‘öéßç>ýY8Ï'?s5Diº~úª¹_9žK—?„¨»¡!Ù¾ -1ü0Œð>ˆ­2üäàlb b Pð©ïgîN·ÍYuómW/Ï76®›+P‡Àõ)Dø)ÀÍI/ct…-Õ°#àða_@¼–»&>˜D#ÓÃÿëðÈðün<¨Tªq¥¿÷Fæ°lÚµëd”ž×„èÜÞOλ¤æ]‹¯•oÅ·Ê÷â{eF˜¤ ×’³bl!Œ¾/¸˜…X×Ï?˜t.Áu (®1¬À¶»âeØÞƒçA#o×Úè-ù3úgê;Þ;ÑdùÁ܃¥Çs—(Á¹l¾ŒÍšI -~HL.=W¼Ó¬ê†í8J±• Ï$»Ô“t™bIµUÅqƒPr@)ç$F$åeLkQ9èH •n‡8 -ˆÂ3Èä]׆]oh¨ëí1ø‡Fâaø—¼§ûÇeç<&ÅîÂ㳎…œc»1“­¿7Ùz•d +Jo¶ý%Ðs#lAÄ -³[YcÏÚvlÞ÷:éaûpñð¼cEúäœãsNZ§æÐ9–i:ÑDšX¥Ty—Îæ‚¹&<ŸãL–ØXF!.A† -0>7§!–èËØ¨q³)d¹ùÄ­r¨ö‰cŽZ±ý¢ãv»Äí›ø`âCp1Pèk2_ûéÈðÎû“ÃbêKv‰¾ÆÐØ`À*a¥¿©µ¿7ˆzû[[ûûû{Þ(¬ôµVÂ(ªö7±0ˆâ¾Öj80ðùœe¹ÙØ’3VèZn鲓`:ëÔTfôå2Ùl¡˜5—š¡åÅÄ÷óm.P3mݺ®˜WëÂŒ\o%Å^€h´Áÿª[/Õ®À‹äEÊ€>à. -ÅùkÉ -y…rµv­·"\_›_KÖÉ딵ÚZo]¸.^›ßB¶Ê[•-Úok¸5Þ’/·,uq¬Ö{ÌĆ­޳h>ì}Ю‰åZk—1b¬66Ô([ÝV͵¨õVátÓ[m§çý°p¡é‡mæ©ó„{óîèbô“HŠÚàÕK†5â`‡àøüúDhz›sŽM:Ž ÁÁÄXü ‘‘‰K“É.‰AÐs“PnoO4¨TãY¯« èDǽ=ñ¬ã!WU]±Í¿A½!šz±šÊ2ÛÈÔÁ¡¢ãa3ÿ@úƒ/Öx†áÁ¶¬þœø²ÐùÐy °™ÅèãÚágš~„ÿKGÑÑÜ3ÙôÉÞã½G[LŸxlááÅ´©ÒÝLNÑó•w*҉܉ü‰Ê‰fz¤p¤ëDáD#7{ÍÁ¹Ïë F®7¯ö®–åj…eÍkÛr·Ö4ßÔuOvSaså®ù›‡öæöWvuwï*ôÐB…–•r¹+Ûoʾ‚½^‘j‡#ãšaöwe{h¥ –†—±}¶Œ´Ö·â"4‹$°ÛHD;—„ÓÇChdrdxâ}qØ%vó»¸ù˜ðõ1ÀÁÖÖ*«ë}°µ®ý0`JÅâhÚðVœ|!µÆθ¬zFPt ™…¶é…¦bk dYÒç)ŒiU-Åô˜ªx†¢eÊd•g²NÈõˆ{ëø±j„šrIݧ¨WlNÝ»­ŒÁlݶYÂd#`usÁN ÝR lÒ@ºÈ¡‘ —‰D •¼Ïîñ9I$–—±Vs’#ä‘FÉF2Ÿ"è‘€º&†±±’¼3|il×üîÁ"çšš¦ÅÇJ¥(eЋ.ÿbòû{Ux³I(§fÀ“þ ÿ“üˆÿÈüþ7&Ý*m•÷Kûå縌_Å‹Ál j®*J„2Pez} ž¦rí¦˜,ÁU‹FRÔÙµ+VR ‰å>¤gá¡ÇqÌõL_cc_VºJ¥®dL -Œiy2¦›kÍòNtYçy9Ïé¿ÉÿÆÉås²o1÷á}æó\–Äxt¤*­KÛ©I4€œW°”®+ÇQ©TÁò€mƒQ´<D ÃYר—ÑC1ˆHÏŠò +±ó-¨#Î×î»]«Ü‹6áíd»¼‰Ý«lã›ôMÖ6çAô bmA[Bá°Ê0¦ªÃ-]Síg`š¡BƒÅ>¦x”§'¨D7ØxÊ}àÜÙ1ŸVŸW‰Ê4…Ä’u rƒ}ŽvǺÆÀ~Cðp>Ocõ'Ô5ö!Ȳx¨kØq‡àC°‡‡°x‚÷ð‘Œ@¸" À§Ú« ÆÊ­¤]ëìœ:¸ÆËõöæ¼(òrÝÝð r3¨ŠöCÕ £¶3–_ÆÅU!ˆ#Yé–°×|orøàâ ¼Kdp/H#½ûç»óáßšùóùó߆|:2˜ðmgÚ·OgÂ^ÆÎph` ÿgŽ Ÿ:;’úÕlçžüðS¾Móùºo3¨½‚úJB×¼µkWÍtp “QüþKp¥%µ2‚:nI?î+Žž„Êèºß]7`øÒØ%Ð4Û5)¤ìï}h÷î5Nzþ¸ÔKB¹7 .†wæ#… -¹k X_ý;sâ˜ÖÇ$_þß@·¯Áw6ÕnÚ„wH{ð‰.Ç«¤5øv‰6ãN©/’(ÂÎKÒ‡Ò„ôK<)Qà-x«ô Þ/=ŽŸžÅÏKïK:áGÉqòùˆPÒ5öÞ¥K¨«+¥FðÆß¿]Ûþâì„cª°=˜äà­­µŸ|_#Õ`¡5à  £kÈ -ºB½F»…¬£ëÔ[´}ÁãÁ³Î³.5¢Á ½–’4k`NèÁRá%!ëH’õ>‘ö”Y©íÁ\±˜Ï‹¹ pGñ°×7÷õ57÷ö6—››Ëå–¡Ÿl­_€qÎ{®—?CU嵴߀éEž±‘(ø½ÉÄ F†/¥z®ô÷ öÞ—¼@2è— ËJunÀ9wÃ9 è µ®Et‘Lz²;Üñ=™î¸Ð?ŒfŽø¿ŸˆOdþ}öê<ç㌌=[9ÊâÓÙ -Ó3rH -ªpÛXðT3íƒù#ùy)ßM°0Á˜`ãˆHµüðq8¿rÐÕþÁ„f*Sùˆ1¥w÷Еmê†fÇ8G™Èñ,¶š:NÞ5#Ó„ôVlÈÇ~Ár=•M‡‘íÙZÑcµÊçøç2÷ðíú=™=üaý€·'slørÓ—[4|­Énv\W„°ãH¥\,$+d -pÊÄ´/6;b‘h39gˉy€5çÅn6 -Eˆ ›‰pI‚x—RñºÄ³XOobs!eO]XeFØ(ÚUŒ¢bl›¦eûŽ­†‰#’ £ XÍé‹óù‚ï:®å¸ŽcX®²žëËR”ú0M|Xƒ ±«–ýÈøƒ´šÆ -å€ò yXyÌ|Ê|ÖäÆk —’”Îr1@Lé¼ÉRÊ« 7H|ÎT5À†çU¢!Þ‡ …3œ°fÈ  Â+Ev&©“¸7€j -uƒ€t•~åÁ0^¶,çÌíž3ÇÿüçW®œ¶É)¨t¿V+¯áëõ5Þf°Êv{³w€ìåô‡í½ÞoÒßÌ}'ggÞ^ù±P[/a -TOÅs…‚f–ê Dþ?e& ¨§ÆË^q@5Û:o½í@=X&1Rb`b™˜1PuÆ@Â2ƒ¢^J̳«˜ ó8¶L‘›,`·,£Ì2üÌU¥¦BÆö¢8ðUí6cÅ´nµ`ñ%*æ/ÕÚª«Ôå·€l£Ûìmùm•‡í}îþüþÊÈWì/ÄO‘§íß·}`Ô¥š5Dï2vÄp–uliªc È Á›Åîù Î} „î´¨“ûNjk@žKI‰Ó•šh6%% H8p%íÎd2…bÞ‡ÜÏm+Žîg2†nÚ¶É­%…rÛÜöùWsʦVÊyA`E/9Qäïû2´¬æG¸wÓn¹FkP©«% Kzä±PÆòYx‹v}˜BÖ¤(k'/L—êý½;»âî¾õÔ7ý„· ztC.îBß© =­?m>å>åÓCø1÷1ÿ±ˆ–ŸPŸÐŸ0é¶ÖÍm›çl›·?"?¢<¢?bîq÷ø{b#äÕÆ*¸ÒK#¸±Q²óo€D}47Uð¹¼(#bÜCÍIÀ—^KTÞñ —š5‘ÂÙĈ8èJ2ðPÊ©fÿ -‚ý«Šœ - zÇ2Ì‚ïLÃrò–®[¶¦ÙÔ¶,Û1M§?›ËeÍP–=+Êå"Ë“åpÄh€_ÀÁ­÷LRü¾w¤Ö{’žÔÉ1zL?æ éazØ=Jýd9Y•¿…Üb­‰×V¶@(nŽ÷òýúÞâÞFËnÈ›š¤¨Ì0ÓÞ¬»^ž#ŒÏš(+ì ó³à|焦^èúÄí€: &~øÞX‚…ŸTLjƒì³óâ®)'´‰ì 'åd…ê†iß‘:aS£nr¹r[Enìú^"{/øáJ´/©òÚ—àd€&O EÒ‚zË]bIT'$€`½+ïÝíŽÒsGKÏ¥¡[^KN'º&7È]òˆLOÉ—e"ó7’ )œ_5v„`Ò(ÛÈÆ™1ÑVØ¢6!*àhSL(L®p5¸|ÂÖ0â—ÿ;`ú‹À¹¯©uµJxTú†ôœ$)r(>Oß¡?¢KIåïR¼œ®¡»éW)”£iʽ$¸ý0ʽ$¸¯+ ½Êƒ|ó&m=×o¿C»¥ý¯à„_JtVxU„Kb@[ª’EC -Ae?1£&à{»w?àÜPç|3ã¼®6¿ʱQùòs²$ƒâ(~…¾KLFÿ•Êߣx½þýŒSênIÐ'G:viz¤ÕÁ7óõëµu·ë£7k ¦RôyðkѧÛQk9JÀ¡3Ò!rH:œ9éÒù¤[ZN–K;õ»ý=d\ÚãóÈ­¥¬¤–^ÁB*¶€1DH!ìÝ3E -"ÝáHxîÐd0(0ÑÄð/õÙÁ„Š„ yß§hŠêø¼¡iªÇu•º,¥DÙÖ(zÌŒTÕ‘»šb+@UüB>óõL]ç8ï à¯5|uí¡‹Õ‹m?©þ¤¬l;Ø.WÇÛÆÛ¥ÕmÛ¥ÑêhÛh»T«ÖÚjíRwµ»­»]ú«nüì‚wÞéùq>‘}:û|áÙ2íîÙÒp¨áP…654Uu/ïù\Ï~íkÿ\ÕëC5§V®Ik?©}\“N×.ÔH jÓóa„™ /£ZŒó5Mêâ˜óNÛ|Y¼ ü²m»s~ó›8‹:!†JXt’pÍ=ÌZ0l Æ„ E¯ÈŸj+í45˜h^^T0ÎE«h­FÐ[`ÊFxóÅ ó.Î#óÌHñ“¾çDš©Ç h†Òƒ‰!³Ëó&Á[ê­Î¤y—>ê9|¢Äƒ½ -›Éè)´ˆb{sfýbhÈ*‘5Y³ -¦L%Y·0¥:ý°\ -U€[æëÙæÖl¦Ð©¬zŠÌÞÖR`ðp|aêõŒå3¥¦öŽŽ&ÎU¯Î;¯ÍgJK kš°9…ŸGÀî -d³jËWðk4ò.{G!Ïò?ÔÈ·”çÙ³Šô°òå›èyDW¢ |ƒvÚ®ìä;5å8?®â§4ú(T{’?©Q®,¸š Bºh’:çd&«ºpH\“$œW4ž)Ð;Y4ž …uC…GÐj€CQ5‹CÉ´‹†ëiøÂ…úSÚ;Jt L½*Úʽ1<=’±æX™ž@qˆCûû¿·yñb@#á¡§ VcTFךŸUŸÑÉSêQý¨)Ä_Té‡Lz_Ýx\Ý­í¶˜‘}ß0”˜—°ì ”¤ -*Z»ìžE4(ŠÊÂ'§£tœ¡2”¾€¨—ÂSO“³0Äæì¼[ ëI79x°œíéËf]nø[/u‡†f.öüÁbt2çy®$ùæÑo.vÌÅ–À9­Þ«Í¢µ–§´gÜgBé1í1(HH[Ýw \ßo&›µ½Ú^8±ójJÞjz-;š=˜=’¥Ùè­+ˆœsþ: gö!…ÖôQ†k@2DâèÛ=qIP Á[Ç`«£Ñlÿ­Ìòìþ‡p)Ì45æ¢"Ž€ø¾­{×µ–«]óKQÔXm.†%¸’°Ñ>°‘Š\tK-{X?ì9ph§Þé,Ñ—8W+¿®ÿº£˜K-a„­‰#‘8)ˆ#H†–Ц,A“ÖV2¡“dSUÔGtªp%êja#TÂÀ/MÇ  âiè%S…5åð±ÚRðÝŸê!<Øm‰èK”^TU™iìMŒêæ Yç,’U)©ÇäQ`K0ÄçCA½Ä™2T¢¼°ÆÅðŽŽž¼îº”_ôÁuV%s‹Ñ›‰Kà´§„p×dÒņ^Çôdúy«^kºÀ›‚-ú6s¯¾ßÄô•x%_‡ïà;ø~|€jkÒÏÁ×U.ÜÏ%º&iPCéTf\S¤Î!$êp®iX'´“êâR†Ò ”Må©Èˆ…·Ögã¡döp’&¯Öóè.QÄW•Ä -6äæ9`†|?]ÖN®\¹ ÕcFÄ©Œ:–r0pÒûI ‚§®ii@Ž'!9ñ¡ˆzöîÝßDO~Õc"=Gµ{.Ì‹ÆE“~CÚ"ËõUiÖ;­>}‘ÉW·júj‹þ“þo¹ ÿк¨dÑïê'­õW,:ªo°é‡-ZÖ»¬:$wë#ÖUúÖ&}‡µG?`Æi›/cë<ÕÓ¶àèDÍ·ô· ¼~ [ oÚŒA¾— “IT4>^Æ6€1”´G®¢ˆ×Mãü4'ü¢t‘‘-Ò3Òié‚tÉÌ0%Ê5¨Ö$@&t^•!ÕÊ`::KçA“àLR‘_8“cçc*á)2³k×®¤Òi¶šÄDÜ;Ø»/ 'C‚†ˆD ôaxœÜµkª×5ƒc絬U ý¬¢¨ª2ÇEP4å5ŒVO_"*À—øk‰ãKàø]à0"2'/ÕgÒÐzÜ™|Ü™HÀàôp D³ƒ8}ä‘“<ò©êÖÚœ~§?Xž4N—kkÈzº^]£m&Ûévu³¶ìW÷iÏçóÁ/­Ð~½Þáª?*aéÕ´“Zã«“7ïžÝ •¨¡h!ïª÷Ue[µ˜Ë•J¹\1㙦·¾«½½««­­«#—ëèÈçë=š”«hÈG7׌íævoÿÿ—E|ŽR¦Ø" ) :ÖÔ˜1G°¬š¬Ìº“\ÍXh“IJpëÅn’ÃOfÁ ÙbÜ—-ÄžÃv SXv²ñ­«f©—ÿ[¢CU°^;UdsÙb&}Äþ‘Eì$;Q>Ñx¢ém™­b;Øv°ñ;Òx¤IÙØ¸±i¼q¼‰ /‚ yš•;i» ׿Ê䔩§ØÉ¦sÒéåŸÑŸÉü8=.gÇšèMOOEOåhYÁž”—•åÆrÔŸh\¡­°–:wjwZŸsvÊ;JÊ”ÎçìýÚ~kŸó.¥Û´mÖçém(˷ô‚’ž0\â¥Fˆ%ÀBOèK߈Ƒ :eD½µ3™ÉÙêâÔ„åd:S‰ë|^ÄJY'0¸X©þŠ^˜ÈxÞáÔP>axàóŽe²>Ó¨Ù.0ºÙN ‘7¯9i¿Î¨¯1Q„ײ‹¡"O:O†Çã!Ýáìwñ]:%)2›È$ÂC|_fÞ«)eæ×gMM²DlCÁ^§ìNö¥”½Ö±y\–ëè<6Qo•V$vbhº66w)œò£ý™æ\Ü“)¦æúQÁðèÊ•'ã\Is-g‘‰¦¹Ç^ð§*z¶Öût€+wfŸÉÒÃæaÿ±øp‰¶6÷UW8×kµõÁçZ×TïѶÁû½=ÑxÎjy—kš×?^‹”iqšIçUqèùÔäÙaáͤ#ÞûP¤Ó³ù‰É€—a:¢HJRXCe=‘tÄaß{/åiCS'Àà™ÞÐtžík­NwÏ*S¥ZE{‹YB†c{n&,¹8Æ–iXzeúâ|!T˜í¸†æ*<²Ã\ƒ§{¢oËyÍæ- -jzËoÕKÁÄrNçYêzoò’ˆåá™Y¼Úâ¶{¿ýͤ™œƒ = Ǹºnq”£t‹¶Åz?*SGù ŽÁA%ÝÓä~Še¤ÂšbìÉæóÙX4þâL¡Ù¿ßuw?\[JÖ/ˆñÿV­xT>ÊN˧­ÉP8È£lŸ¼±oЧ¼*‰·",'¥K¡ªð:Á;m7¬ÅºO#òŸ!%DL?RIb-×L(òØ®ÉÉÉ:‘˜¼ðxÝW‘XYP©Š„u 'èÉTHåÔ÷¾÷¥/M­J%P÷ŠœoÔŽ<ÍjGLiµ´š”RZ– ”ºébþ¤ô$=¿;Å¿«}×4¦~qB;a²d“|˜bb¹±!<“jÇÅ4‚#æ‘w½}iìƒÞ£xüÂ… ŽXc6ñ¸zA½ _pÄS’Þ€.Vaä@÷gšš2]™b1ÓA¯¹fýMK–ÜTŸÛ…1?œÔY¿QÓïVîQŸUžU©’(Z «î¡bBS4QŒß–eÊ¡ì4ET8¯âHô^ÏÖd1ïÕœ'a°Î˜qÝWëÑ;RçZ‚iMN$ÓbSUÎä -°]g’ §« ª­?ÜwÅ\9uç 7ܹbÅ?Ý›ŒùKµ¹¯IçTrL:ªž”žQéizX:¤Ò.©]iUIƒêµêzéu›´EMÔ_§^ÎY±Då­éÉ5eË5_v‰D%x”Œ“#ð1p”·/Õ?9<2)Æ«8Ó óJÚ%îÝ»ã¦Uwß´†ú_öý/Ã8{/ÿ=ÚÞ¨¼™tmEÕU¸î hR¬È‚é’hr B׫áÝ##óæE9o¥µÒåŸÂ9^H@à€ËYã¼xQp}8÷õé¹ëK¸˜pü"p!(ʰyF66|ibÖ¹H^§‰œ·œäÜ6zôû¢¿\Ë,"+Éz²Ÿ|…|‹0"S&KKJn;a¡6¢0ØI$8'ó¦¨îb½;½RÉkÎ<“Ͷ'çE—?D^þŒÙµ{þ AßGSyôÑG+†ø\#:ŽîHÖŽfjúÃx!5r ¨ëCÔ•{?WwâÞ;ÜŽÒñy ˜¾•Ñ\ôD­ôZå•¿ªü— -íËm}¦Uêàz%¿¯àë8kIfêLj*¹‘øTLb_ð€–Î ÜùjBå3Ôid•´HøùHŒã6¡|ƒ†m­[#šèñ|06é\JVŽŒL|àÃYóvI19pz¹ÖÀÇ.ªð[ejyÖž !J ;QZ!· D$ xB3L7mE²dÛžDDõÂUǼA¦•±®DS ÈœžGÚ qà ÚW+Æx¼ÎXï¯Ïo—ïóïËï—÷ûûóšÎ$KãK-0L‚[X=¤=.üž"WP°‡ªÇIelPqÜj7”+àü»'‡šL&ë…÷P}b9mê&eé§§+ ( æèA!²mÃu Û.UnŸ\Éy©èG‘ï‡átfÊ¢»kÑZwmx·»)|8–Ì'Íãæ)0d½Y'ÕÌÑìxÒ¬;‘•?£]wNˆâ‹OJ’¤G79Õ£»². Á|3]–ŠQT.GQ.0‚À0ù@Pòù†Ø18 Õ·ìD÷b¼;뺿·VZ+­5׆k³›¥Íææpsv´'Ü“}B1ˆ¬;öR£®{½®{1Ï…“Õ!–‹ÅÊ)1æXŒ¹KÅjÒmÏÖw ý³»çý½³•½3Us]åBÑBáÔæj±X,q¾ò)e'ã×ëúöQí­9k­-ÖŽpGv\L{JSL1—ŸËI÷b§¼ 1‘žÔGœÔJ2!RAbE£] G]1Ñ‘âè«õ ú¸~Zg:¤KBδ&™LÓ¿(‡7èêUÑX$ñ„Œåy Žñéu(ûŽüvmÞNþ(ÿˆK¯aü4~ŸäopÚŽâš~³NGU¼QW/ªÒSê3êéd‰Š}VO𝢀Á i¢Qf«¢#;mÄjð.I47kfM×9ÁT,X»f~ äOvdQô‹f,xi†`Ãè:“‚î©SDUuÙwíÆõ ·éžì¾¸LÛ“­ÒÅQõäý=­BÞd½ƒèW^@ø L“ÕBöù§‹w¥Î“reГÓÜüh« «5žÎ)“ƒ¹/–ä¾Z¦åòür­|SySyO™"?+[¢¿Ó P‚"?Àä¼§q8ÐÑ‹·Å:R\ÃxŸÆP é-GÃ5 j§Á‰#W¼eúxµ¿ÁÒ?î¿(C›è¹ŠÉ»'§Ô2YgIW`¶Ÿ_éðqêöÊ#Ý™ªNdS5 zSmcyº·UÎU•›šŽO‘Ÿî¨e“ølv‡•ùî5îç\¹¡ºüƬ%ç@^I{5iyÿÊÿŸéx˜iš÷÷Áè£^[ón7ow×økâûÍûÝMþ¦Xµ—ò”¦$÷LjiÔS£h³½8ÎŽ¤ ”:5Y£_Ñ&ÝWNÉH9 - ÁEŒ`8W.çĤú=Xç»aL‚‹p7û¼Ÿw4$Ñ4®î¯CC]ð3Õ ¬Óé+`f í¬Î`ßLgpgÖÏä@‹’ƒØ£ LÍr—ó*Žë{†ÊY“$×2|Ïæ@•P7Õ­šÈ| "ïöZønôãèg‘ôDôtô|$uÈC2qT¾"”E›ãÄ)ÄaËŠ™™À›¾¿Å ל¤0~O€B²¸qâRÊ÷fÍßOݼ/å¦;eS÷¢¦¦ ½]ê)+D -¼a§Zu«:$Yb^shq}-÷”ñ¬Aæ²…ÊB{¥²^‘“SÀc1pס,±† Ì¡y¾Ä߄Ẵ˜M¥×ƒmâ’Èññp½«Ï×uölgŠU)nѪV§¸5ÝgÞ? -úZÇ9ù5ö¶üFEcòmùmFɇÒåry9»I¾™í’w1&š“öTsÒNš“L&I¿QdV(Ó1}i¦]×—ßÅ/ÚÒ¸D$péÉéɪxXLVÍ4#Ó+SÝÈ=QGØ@öìÞ}ë­3½È=Íëk‡/ò‹ÚEó¢EOK§)9ÍOk§ÍÓVÒu$ݼ[ë6»­¤AYÖÊ&m—Úi›Ö©—x•t ]‡·ámú&ÃxE;o’¿Ò?0È+è¼òŠ~Þ OëOÏëÏô |X?dHû±èIŠ[˜è\RË´lÉÀg?1þÚøgC,º6_Ñ’†¤]ðÅ\S¹¡ã×õ÷ôŸëÿ»Nuñ*Ó¤Si×;•V­ô(~²nC²´Júh¦kùCq‡¡,>’g!ÒDÛ2mW‚Òþ%Øœ“ ýAyÖŒ%ð†ÆDûrle?÷>£7j_ÙµgõFÉLoÔ™ê"&Ö·Ú5öö¥ÿûÑ´k7ÓÝ#ú¢í­™\.ÓJ;;‡;:Óu“¡½I<«us_óÈ*´Ü^î¬òéíÖF²Ý:f´äåîrï{È£eµÓZ‰v¹»<Ùó“à˜v„TͶ ¤GdÚÕö¨=n±©ízĶ,ÏŵIöXÌÒŠÕ4ÒðÈä¥ú}ÅCé-‚`î÷ã¡®OFQ‚W -›EÁƒîGC攪’ʤ9Q7ìÙoY˜„È|Ïm·¡)Ž5òqôëµÂQé˜JKǤ“Ò¤KªÜ¤.Wר÷¨¨2X¦xVQES¸(V­Œ©Š$KK5@1±þˆÀ)Ô¤)Z¨&0pEAÔ!Ý€xuÓˆ5l±°¥ dvu÷L uü®åµÛ–¯ Î¨ãŒŠ1.¼ü÷€ùï^v6ÇÅ‚‹üYUu›ÞÄyøõb +y(dœuQTþ¢§é…Ä#DAŸ4WG&¦«×8Îú "=¼ ò—,A½ºÞÞŽa0\ÃpTÆÄ}«Œ©‘iÕ˜b1e© 5&[¬Y5µa–Þ9pùCàø—žEX*×ÕBqcÖÆ$ÈåÓÀ¦.¢Ÿ€¶:Õ hÿ“û´vMŠû´†Å*–8¥þ•Ëõõú ÷Õ‰Ü#gÝ&Ô$äF(Ç…Ü*ȃç,^p•<Ÿ3sjhŠ•ÀýI™S“å^‰Ð¢6:Hg-…ÐW1OÄ7ꂸ …ݬ°še‚´Ãç–¶˜1Ã2—*¬î;ÏClü%ÄFáNÞpFò™x2‘Öu uM¼ýáÄÛpñÄ7EO§š°Bá¡{™­)9®¨Tc&×ó -5¤?·üœnè–ŸMî†óƒü?G Fq/ð‰HÜ…Ù;0ÂÈ#xÄLimMn|¨l…Ó Vš”¼õclXYà…¡7H¬|%Ô;ùŠêDÅPÑâæœû"û0ÆåŒN°Öâbâ¨\̪Üâa¦äúù82tMÍ”[|1i„ÜË?E£ÿ)©Íshº †½ý -lÕ1FÄÉ:©¾jo«’¼ gÞ•öˆÁ'¯Vêƒ/ã©÷fÞêŸ]}×]ÛWhšJnÇØÿžñÝÒÐc?ðÆÞvw†H²®措èAFVÆ~2K²§*šj˜T3Ú¢úÖ× ‚G‰0ô²yÃÓµv`³^zº•“—¸[±‹u]¢†k¸ŠÊÌF‹RÆ]O–kiŒšY›JŠ<Ý¿üŸÑ?¢÷Ñ -tBÕ)‘Z?ã,ÓÑ•h R¿“Yš²äŽg%J>ÜóÚ|‚r¿¯(ó A癊Ò:G£²]7ƶC¾ô<«&n ÏrM1U½üLwÏe4%JQ(ÎûTvC'ì6Œƒß 1Þ@¥ØËA¿vÅTä(+kŠžç2ã׸ê &üFjrh›²¬É¥¬®^K(Ó\Å“ íÏ%‰¶o–[쬡‹;úÁoÿÄ{õ^РeJÐÄÈ3ª·¯üøü¦7…$ðy±î/užGUÍ¢áãšfk\†èª¦ú†¹VÕdƒXƒßqUçŒSÏP¸FÍŒC(žþ­Q’ó¼Í•%Þ˜u$Ù --ßá˜g3Å•PoÛªù’ fÔfO‘ܹ53þ–Í$]ÇT}æOó·›þìþÔ:hP µnÕ©çÔÒý};bÜï{3p£øö·íÀw†Þqì) Àø¸`¼é—ŽþýZQµ -=("¾·O(þ%§‘”L]Þ蟺PòTßϼ7›Q/DSâgÑÀ SX‚©¢€ š:Áþn¯€}Üm(HpÕ4ÚJ¾ãø%x3c{®è÷¼¼/î=ö ÞH¥R9´KùF™3»¹{  ây‹ªYÝ´l,®1Ù,…F¦l@ù辎MÎM#·ŠŒöüèPHqàbñ–ŸlØ÷›|¿ «#Õ2À®Œ% jH@'pZŒÀÄ̈òìѪƒÓº™_þèñ?¢f`—B‡`ƒÄ•RÕ%%2À¬TLÂ/Lt:ýËT³¾¿Ï1ÚqH(3¬Hb®æ4ÆŠæwXyÙ«ªL“5ª2ˆ!Û:ÇÜõ¼¾a»®ýŽ@}~‚=bƒ³SÞÚ9/ghÇ TæžFÃå£a+ì‚^ÜÙ¨Ý2Ü L‘vù¿ _$ó…%ÔŠîJñwP$ëT´ÁÁÊ'†Ÿbð@D×l'I„Ju2{EÂ;š¦¼c` 4sl0’J|—€TX*2ËR4 ˆ2`M<†ñ^Ç­2xDäºÈ¦À¢Ì­s®u´ø `µ’nÈ«çÍû¼a6Apéå-…¼­0½èbßéϱ­¹_/ʰ¹žã×a›+zf:æàz¡J†¼Oˆ•ÚÝþˆ0'E@™FÛð -8I ]‡•j3÷›ŒÃ ¥-™ì#q.÷^‡Ã0_ïÅÄ€•+û3™w)5*[ŽÝ&Ïïñ b˜DÒ–Þ”ñýÌM›Ý¸5öšp2&çòß¡‚ü½ "¥7 þ½³Q{4œ² ˜p&ÂW¦äzÀ0•­«ÇVËÊ%4ÝN_¥ÅVÇïÌP-ßá¸†Ï 5ÐotšŰ ZV º¦Sî0ÍWútÅ25Õ|OÆz(Bζ3UKS±f2SÓEשɃv?VƒR®ÙTUži/A¢åJ6`2óÍ’®0Çbª›ü7Ƀ?„Ú(‹*`ƒ[\œÎ_"»Ïp”Tlw‚Ñ(‰1¦”†š8 zWÇ€¨— bõ-ú*ÆÑ½!^CäaµQâ…æïf²×œaRXyD7T`„Û\eAË’³&[QŒÆŒÝ ËDÓ™ÎD)S'w«Uò»æ¹%‡`38²f`Õ»9‡ŒìÌús.1gÐu›U3f´FV÷×Jû\7h­‰£j‰Y -çòß&øÃƒîA÷¢©G¦Öž‘]I„L-ÿ©ÌqÅsš -frŒÒWfùoâÜÕ:Ú 20Z5,+Tt™êV\öAï|‘å ˆ‚åž[ŠƒÀq‚À+8NÞŒ(Ò‹>/µñàFÈOû°vë7ÞxNç)Œ«ÞU\QLYèb¾Â´9! ·AhB@8É“ ›©C”ŠÃ3ÜT»ÍóæZg/ÖÔ»]·AÜ­^÷—¿Hî˜úÑZœbYµîãƒÂãSþøù.¡DðI¥.³øæWŽ ´ÝØÁtÖƒñõË"Ë—XKRÇËVr®è;úûûý÷æów2áÀÌuäȰ¯³²0þÓl€§¬[ Â]”Ëuäó¹J|\ƒÜòOè-ä¢.tºm†×Ç6åÚ}Õxʪ3†©çœŠpìÙ”îSŒ°Õ4Xz§=åfײÜf¢j -WU ¯&”åLø–AdU ó ðáaã‘ ÒÍ •uN’º%6%{ $©PgŒ‡o‚–ÏqÙlœ3PyRã40Á¸Æz3°í&ÐY%ZûNYßjú÷ltnp­º™ç9ˆ¨ØšÁÄÍW›ÕðEò ?‰áŸ!?õ¢…h º 4$T0Ãÿ«ÓX7˜BÝ,º? ‰{[[Sêr ®ü°÷nðM%OµænËÈ™9×7®q#¦ù%(âdõÝ̹-œ¸k½²ýD©4t÷\JÖÁ÷žƒïÝE‰ÞÍu×,7²"¦K\3¨8d„ªåx®*ëe—QªÙ‘ËtbèRA5dR餯˜¶U(rÏ1¹ø+–ð¶_ÆW JÛ:òŸÅtë Y ß÷¯ºî(WPÈ_õ3¨˜Ô…TJÖ`º‘Ó”¢lPpƒQ%,ª’6‹SçµBÎáØð/ï9Žwƒo•Å[ŽÛÀ$UãìÏae­¥×* á­ç5x\5Ô+Ä/ôû%)rØê "»Ü5Ãyz>l#°ÕŸæg¸Dò•úüÌߢ¿Jâ}A=Χ4%v³]d:ùÕ™é¬|8pû}Û]Q¥qÝ;7=ï ‰i’n -9d†Ã Ï\Ãc[vÍÈ1Gzz¾ª@ÍÂì\¾hÛíŽƶ;Ÿi³AÖ9”[ -<£`S‡qVŒµ|ù_ÑÕPÏÉ€MPÓµ2`Í}­ŒE˰ ÌÔ÷ $_×íês_OÖ’/ûoÿªIæû$m ë6Í/§øÙàT™0Ûþi]ÿ|t`Ð laÛól…3KÕe^rx”Ï]ç×€C‰qѶL« À@eY¥¹X‚OYù*ô´§qVðIvM2åYª˜Á‚r.Ïdר4ba¾’¥³ H|—"’Ë´ël/Òokl Qj,¦˜È/ÿ ðÑ÷ ×5ì7¡½³*—’9mÝ&%{úÅoû?I~*Ól»¯Ú“Ö=á”BªÂfÓ×ÞÙ¤u`0}ÝiˆÒè9^êà =ÀžÞmn˜£Éa£¦U²…ͼÂñ¢¤sÓ7 jù=È‘nY:”†o¦øÃ&ºÇ°Ýñ"ÖMS¨EqÄ ðx¨3ëÅAçýº¦•ó %CS”lNhÍt4¶.ȪŸÃÀ&å«à°7 ñ´˜ŒS3©ùÄúEÁgFkgxk²O„«ëï -4I$UÅ€2‹ì‚Φ ¼”-Á‡¶«š¡ê*­Yw˶ÕK†{éÙ\'ˆ‹JlŽãÌ#UÏ[ì|[ƒÐ49G4ʸz}sÑÕŠqþ”ʾC˜Y /ƒr‹ -ìXƒÇ4·1ö ®h :Îê°«IÎ…»±ï-ˆ0bÕµÁ·\~}Ê‘Ëÿˆþýüç?±& ÙôØg`qýÝôõ¬ƒ©$;ÄÖt]AïÒ#;À~§E™ë‰‰da¤{:§’aÃ1`g5ãÀʧږ(B-@‡lŒÑX‘R¡[5 I^+êÇ5ƒ2n¢€I4ã‚Ëø’Òì;j”-+j  "„šEï奮áé‹dù¦j<ì;S;ôò/€Sü*C•Pï$|:f'þ>eJ7 }å³À#ØB¹á|¥¹†îÚØÈ'Î[¢Üe¶ª0Õ(aÂÝ™ñM;³ã;žï{- ÏÖÔOï‹nªÝVMSr³ˆ ×¶]Á‹n¤¢h'uÍûHÌ•ÆÉ_:XZû¬DÏbfõÄlX˜!ué@šöSPñ?ydÑ¢EÞðððy×mÄé‡ÁVDªªà ?À®;nY×;¶ëÙî*77÷¶´ô&ûGq`šAh$]Çn(Û¢G§¢"pÍ¿CœÜÏžŽYtYnU'^1ÖÁOVŒ Ñž" W2rÁº«WÈþ;Œ©@‘•ëËå²[ƒg4ÎÇ“e¿Á)»ÏÏvd4šî7Ÿ{(÷œ‡Ÿ—€YK²:è8¥©‹à{Îb]:†™Q,–íU–àØÜ08.œ:eÅÑ®R ’wnO¶yè—è"jNþj/ Ê] cWO" ›é* Aâ”—Ô‰×%ëýd•:ÕPf³mx0Ò€r0ð€_qÞ0MCïh‘MY5YïàBCWäk•ж‹Bì&“q/g1jŠª™¿1ZQU_…ÐÁd‰jr§ŸH›Ô•wóNlã6úÛmmÔö!õÚ;;;¿ˆª»[Wu ¨¯j:8]õ5×`Ô†b¹f¡»$7xÈúÔ‰FA/Ÿ]l}&‹[§»Ÿ€áO¤ºeYÇÉöµ omk‰â8Ú»nÜVÊxn¶Ô ‘u¹­àÏKh©L̆ŒÜágZqVZ ïµxwÛæa˦M×lýenRê¶æLE4ÎLSsÄß™ª‚ÍŠþ+Ø\Ab Ã(ºAmrÿŒב3 -g*ΩüR´TO+ƒWvàÓvEòùjÂØáP¿ê,*ԙ爩ì¯QÈ5 ³Z\ÕT©ÑËT¶àµ¡Ç"=;±ëE‹1­eDÒuBõ9X2 "YIn.@nþkô& Æ<Ôƒ®J{‰SXϘ¿ÎDX”(!iSTDñöY°°Ú²ýÀ÷›,‹p¨$8‡¿Ð C%s3 "ÊÍÎãg¿äöx€ GÀf7çR¯è° ö©œ·™ÐûúsÏÙÙ¸Ÿ·lq›¸evÚ û“¤¶n¯³íé6`ïìK;b`Í„€­¼ÿ _Çøë¸Õ ¾áÙ¶·‹½’¤¸mËûLÚ+7ðÎ67;v‹c¶®¹Âtí¨ÁÅaâÅa§}¯‚ëÿ0výl½ÁÅzzë=qapºÿ‹b§i†~zF¤×soÕßèã6³ÛcÈ/ꚹˮïûN{Môj¿*vG*‘çÅMVS(Q/kh®7ÌMJïÀ8üýã»éãBîš@Å ä9ƒó`,0:Ÿ¦Eñ”lª(¼–H¶cz¾Áˆ Õ×:ÿ¸ð»ÀeZP-©…„Sx ¦Ž»’¶Mó¶âö?sª÷Vïôƒ¤Án¢iº®é{ø¨€ -ì²)4¡$»öêPÆíƒ­q슞5Ìà]—1©°xµ×pU©BXjè*1"K[’µìûý® -NobàìØ\ñÕI*GùèûÙ¯F7¤zŸå0Â_+Åѧ«—tR²Z/{Ĭ§¦^ D¶=—à~Ò'Q)`)4I„{cǾÞ]»>1]b+„ºÃ‹mi–ŒŒfpb›¹–‰¹’} »^s¦;P%n`e¸ÜÜŒ—à?“ñÉŽJYs³ÐTZ„MPOÕFñ6¦”9/|Ô»ü3ðÑwQ+ºm¦b™ª' ]*³æ -¦ì!&õj½Ý¥íö©ò¬2®‰Žš”ÀŠpH4ÛÖlCRÙážuW1´ïôü•~¾pX€Ä¥1T ¾’Ï{ŠCÅÓŠªå‹R R½U|ÿ(nˆC]­Œª@A¯3”~D†T©JÚ\ÃŽœÏ¨ñM>— Æ¡Æúþ¶ÈT-S™SivÕèOöqS˜Ìçꀿ„8¥à¯íh.@ãIÎè¯T§ „‰g8u¢’ÁY3KÓ}ÍÔÔÓÐ2å õB6ÝOMO‹Ðžnå ôèAC‹a,0,‹µÉ†*Ó›<̘­ñ–†††ù’!sfR¹êg\× -0.šŽcæXs¤À -\ =É`ºg©Ä¡on•1› mxP ç%bRB"Q?{DcÌ‘ž$¤©i~µºŒ0n«”jÊtGt.›m‘}Ûe¦3«’[<Ê ó¬ obØÓXñÁþ+pá¥h%Z#ú3“™IÇ>iå)ÓSé ç¾Uïó÷$©wº8Ó2nXÛ"k…ŽS­ŒÑÛšif„Có倫zÑ2€mæ*~,±H[6ÂIL"9eÞïJe®ë[Us¨L/A…fä_SK°,ÉT ¹%l5ë„ȶÌxÎTW0Yä©ÔÔ$­C2%ŽCˆÎó6!ÚÁ÷ †J©<ÞfFHFmPÇý#Ôqå„yÎAÝõ^xCu -°ëó™‚s&¥Yõ -ÚýWÐYâã8À«0^e÷Úòï€ãx ,(©Rhà¸)çîrs–Q°ÖyyÓFuKå q>fk_¦¹yÀIÂÅ}(ã^êRä‚5K±øu‰8jJ7µ6ˆAp;G,IqÌ`“å­†eåó¿‘Õoã‘ÑÂd96l»d0Y¡™)žÅT±vŒ¡|éïÑ…¤=¨x?Y Ôƒ¦:ífyÚ÷ì{ã'°70²`É{>>5ožëÍuÝy[“?_ï,)¹ž·ÊqWØ–ç­L®ßyñ?¡·_Ö‘‹ÑàŒG'ÏûŒ)é"E‰ê«õ©Žj_OSSÓUxð{×Áš||÷–*„^ åu^!¿×ѱpÞ¼åmm ¸¯W—Ñò(t+™ÜhTô2$ÝÀ’>·»ªÈ•5m1Œ‰'=¡wa\¨ Ô×Ý )3 ´š>´’vÊàg–„½ºÉÓqtµÙªxó6²¬§é!—˜žkŽÚClÏqÉ3M[€dk ¼¦wÿʾH®³:óþ÷õßÿ}ß·ŸÓÝÓ3Ó3Óš‡æÑ£·mi$dÉ2¶%Ëòû!É2~!Ûb® aM -ˆY ,KEv ¡¼^’ʓڰÄ@€$µ•ÊR[[» qH`)/*•B{þÛ·{zFv6ÛÒûßg÷½÷üç|ßùÏ9ƒÒ”!ÇÛZ&hH=š–³¹gaÇ£ˆ¹äÖüà9V‹³*{·o¯¯ß²±qËúz.ÿìàOŒoå#Ñ;Ý]ܟ•ϯhÓ+°EòW²!‡p˜\ô_g€Ã}dÀ@ÎJ  >èî %(ÇRs‘ …“ÀtÖ  9óH KdnÌJ(L¡#Á ‚˜'  ªËTjXHå·‹d"¶MžÄ‰m¦K÷96›¨ºVÜÞOªg¦rà¢ìÆr×qŸo»Ik™xdN¹iPÖY¶ë›pº(6ÇW*GdƒÆ;U­÷yÜ÷Œ¿7^¹Ø›ëÎx«û}ˆa¡4yTæ¦Ú¼*PÒÞh(à -ž@iæa½AÊc…€-(Ÿ&0.6J ª„øoù8¢®$@œÀIÇò¸ÇD”Ø¢ÑÄtlRÙ§=Džú~Û÷lZŒfajÃ-q*¢Xz@ݽérz[f!¶3¤~H%‰±]¡é™ÕCæ±Fk¹¯CÅp\Kcº7ä÷ãŸ3´•£ì*Wâö€—«=‰=35#Œ#GucÏH#×±-ƒ0¸“>Ý»ã.>Š#êÛÁ˜òëe›¤L5OeáEàõûô"“‚ëG_³\é;N@ïJ9OOWêûzˆ¹U߯>Üé|ر°L&8!ˆrGP& §9Šø©°£ºOñ*NüýpOø•ÿä£e3n0Ηúy{ŒÆVÆÚk9{Wgu´Z8Ó7Uâ°SÎqîIW»ä»GCи¿)îÄÁõ€_Zv&1+ -ÂI¥Â=L¥†Ï"jîÖAuhþj*;‹ˆ ŠjöjD y©J,Äš%qÓ L»jb†ñp N+Ǻ  ‡SäñõÐðr¨ù$ôQ2V ÷œ3þ…ñ+[ǵòË8?:éÖAÂÞHì]¦ITo­/<ËÛÃC‡ÞÊ‘°ª×’°ˆÁ^ù‹ƒjÈÁî ŽçéPQî¨Ýê·á¶¶”jéð½LÚd,:.±;Øít˜ËêÙ$,-Ú^·\ ]ê§QÙz DZç^cä)Z¡ÒlÓÌaQ“í1-ÂxLl;"ÿ‘e aÛ*rl[Û»m7¶uQ=IêÚ¨€f¥ÆÐ z‘D¶e“JæXðƒqɧ.˜å%°·÷Ç”­äpEQ%< Ü×Á)O»Ã÷¦ÚTìñK+‰ŽL‚>ýC_«Yƒ'u Ø¿›G0çì™,÷–ûRݟí_Êú^º|Þ[ÙŠU{Sð´Š0õqü++++O¯®®n|Â47æuèÁü!]&ê7ü TëK°,—6PøôÓO¿öø0ûråé,ŽÓg*å[•ªHYÉÿNòVà#i†H€ü¢Ð”È÷[AÍ÷;~-Mkûô+N%ÒYÃàç²^Ì=¸WE‚릶„瞉\ô¶(¶w3Â1eÎ^_œ ‰n“Š2z‚˜â¤Ïl)Æ#L‚ eB²%ùfÁ±~=†Ò1S?S$MOç Cÿ«šÎΦm©nÛ6ÝÅ•<Úu?€-Üyºáõ;+B¸â@Ágÿ&ïW:t*ŸH³-ý¡—è ìÛ_»ùû׊ßÿ|„-s|;ÝFsÜáñJ+5Í­qnЦ+∰Ž1@”:TŒÓ1m{ODh¹·w úÊ7ÁAý˜ëef7V¨]ÿ„m±ÎÛ+¾_¹'’–ë9—QW^…ûÿçÀ@ŽåQ@i† ×`gT’’r_%W…yX\ݵá‰è  â‰½É lÑZˆˆ•E1ÏÆƒ8 -Çcn;VcI<‡Q´Ð’q,Æ›Q¤€p7Zc¢bŠ*õc„R yÖŸ–ò«‰Í€À…¦ö®­+ Óz…¯é1:S—fóܤIâ²Bȯ?k; (bäX—\ùŸ¹¿!46ŒÆ£Æ3Æ» -iÛ–q•Ä£¹›¡Bk£Q YßͶ-Tlîìl °"·}œšö,—öG,Y.õ±fIâ¨lÈEx \f'DÄÆØ¯ÃMq0åÄíØ -¬¯JÜÎjqèµ] nBÙö4ì߃{3á àuÕ*ñÒ²0¥ãRåÃM -¾jš@y|/(±ˆ°†í€vM¹Mõ‹²ô@z8i,'ó"®q¡ßǦM­ëòêùzý|nw´s$ 伈ï¹7VóJ5âÍÉ©XfÖß^( -`äc`úÈ_çþ=6:íÀózü¡ ¹ÃQªmhwdÄzô® 4ÃU¦xè›X¹ÎuUèºQDZ“е|À±DÕ aã&øý‹`O ·L’HÌâ•Mˆ‡E;¬I=vbzмà€Ýp<~Äó%ŸÂN6Ç=›/<ˆ£að–·¦þ!?0=>9®¨#[³‹:n*7ú8ó¯—Q,Ž“>ûíP{Lúq–ã6ý¿–ûÀ®3nÍ3u¶Ž8lõ…i3•'Å£Hýò£ÜÛ?q3t‹ç­z€ b ¯Š˜g9<Y¾8è ™’¢ºTÒ¯šX."Ì Óˆcs!˜jIFaªvha¡a®ûK?:f¼[‚²å‰Qq ÚÂÄkWžé–3NíšbãÝ…Õ´:Ýok¿8Ü û:tÁvpd;|0F¦Ç8¾j´ÿ-ŽR \×6ÜÀ]’õÿº“±zÄOâ`æ@†ÉКǤï«?îå/ ôÔ„†€êÕWõϹӢ.©º˜/µÜRÉr+mתÔ\;ëO+cO„}lÊîhß7Ç–¶Œ?ôVßÏÀêžNƒ(ú`¦Dù¬y§¥}R ‡©åµKåÀA%"Ÿ¶ìXY¶šïë¹8楽‰§G@ÕáF·Ä¡›•&›ß㫹,ùy”î¶û«æí£@[*† îâÝH -¡Áý„Fœsþn(™: @SïT³-åŒMúp3M6^wU¹#dø>—3gpŸêžãÖZh B¾îd­M)&[7°0&·4çÊÌ•³ ýÞò<ãïjŒ÷-æh@Z»päŒø´öRiïí$‰|=Š y»pOùÊù€;×”Zƒïëd{Ê¥ëÊ‹À°âù•}¹}þ[°u_†û3eÌçþ漟äãÄùøW¬0ê@Å»bHlì´”ÛqØÑÅãùHàƒáax2yȱºóóODñSa¸Ë Y7q|BhþûLãÙXÛ$a€¡…ÑÌÊDšÕÿP?\ôìÚ®™XÓµþÓf©mßvä¼ûñ:J<î|›ó>¥Õ.;Pq8CŽU†1íg| $ô¬€=¿+uÕ˜‡É:޵³ÒGë#Žþe·Ô~ lL®²xÐìséM ¼4jÃkÞŒæáÙ;_Òq{¨ÏáB®7Mâ›.ûÂ)W=…¢‡"Äó.ßa-¯Hu#O'ާk5ИçDÕßãvÀÜ6Ì(–ˆ0‘#uu%^áAb›Kdgm¦æWQ¶]]Á\ÖC͆~É6ÉX¨,ʼÄw™çc -ðÞ(r>t\ûË ë:žmÅ–ß’åôµ'NÜ¥sûž”å×(îõÊŽ-«©R)J"ž`äfV˜@&J¿ÇlulW ˆë”é“ -#3ìõ8³ñ,ܧf–Œë`«ƒ±Î^L£©(ëB÷e¨Àîz ü{ÆÎÇ,OæÑr¿^üö¦gtúè®P ¼^ÞÊÀãž½>’ ,0À"îa•G¾é³¦C“ÝÝjQf¡)d"™±‡…KgB²ðB‡Ð-9…lÅH$¦+釟Q𠝦MSË>î;:‰Ñ}&ÔtÐäääÀ•ð­û¢C ØZs6ñl55¦ƒÌN‹.c "'§ü$_ñ£ß¹ ŒB|PçzhÌýxn­<~`ï–XŸ«J?Ûez5µ¾Gd‘qݲz¦™œ€g9g£4Uc'Nœx“À¤ĸ6J_Òš†¼|<‹¢X•Oˆr£]33{fg?äÙ¤ýLµT©œI€·–¹i:'eÆØiì6÷}jm[(çk ÐÔÕ™‰K¨K²&°}7ÓÊL¡# EL÷ ùü*OÓì×6ëK}æ5:pæ• –—G—¯fd‡u© -)\ÏŸpô;hî4Õ¸é-­IÏOÛïû FÍ0ŒÂr9|¨ ¼Yª¸&™X@L‡aßµFèTá)Ô·•Þ•ÿ øMçsu@WŒh´Üq3òŠ1­ÓðòÚÕúì>‘ 9gèu–唨LnMá‹T…B‡ä\•;½g½kM ˆ°dû÷´ZëycûÎÀ[õ:rë­;ŽÓyºæ«Ú%€nþ}S°™?‚¾ZÉã×úN¥B^¦úºmàÔ¸*E`0ƒk-‡éŠk£”7½Ñ lÉPXn$-I\æLDèN`ñ à)L¤uß—a½¦e>ºCË}”v&S_ª?ŒvаR‰µ[B&eØý'éÛ*Љž&î0E-é+?Kw[è¶|£ÑÕûÈË—ÀÎÌmaê:ˆ(—öxgµæ˜¥Ýwe T9VïÖ y\ “1\é–Ф}ÓcvÕ2Å.Ñ0`rõ6}ËÏù5×j£ì;§)®Þ†nÉ]µ9N¨€Ìþ÷<mððãÚßçHxu“×dÍQ›½Çtòƒé™zÔf±Š_”\rý6̽A.«û‡tÞe6Žï`ç1ü'‹NŒ›ØVx"ËÇŠç3𤵼5nTÅ­®¼X»­Ÿ˜3<ø ù¶Rí†NWÌs¤+ QªpQnIÕŒ9ß_ûü‚ªÏ13#äô •Š”ËŒsÇÔÎ<à¶ßaÚ?醊áOf('!ëZ*I̧cêÃ(ˆ‹f6œ&³ìš¢&Eš—ª.‡Ž¥ÇdhUY.#| ±ÇtÉŠ7ð\‡ÈÜð'Æ îÝ}34/¢ÎF8Q·cô7¬ëó¤ÉâŠÄÌ/EÔL™LïÕoJªøޤ‰o`Üõ“2\HP®îgÔRiE0/(©èL6^ -=†]WuZ“ ‡ãÜ·#>æ:n¹>&¨ËJ“eÓõjlc%Jq»ÿÛ_ɱҤ±`ßZµ`‹ãzª³ep žjœÖõUÈP± Ô!h—_Lò®8 ¥és>(Û/‰RÍåÍ2å¶²ëW-W—vñbûw³îøŒîkŽEJD§"-'B9ŽÄ¨øÔU¿(Œ­øPWd©¶šXñõîÃRqÿßj§Ò4wt*ÂQiäqß¼¯kiÌz«q»q·ÆƒyOÞÕUfj±WŸ•´GiúòöTfܵ q\«îr™,¹—¢pž¸Þ,XÆj€Ü´8‚îÙò«:ÄŒqa#4OÜŽy$ -1cÙ8;âo¨V«~ëµ×Ny®è¶ú ÙÕR fý$šHÔ~jW«QbÑV¯'!`úrs?X~QÆVÔŠË -2Lîçäýõz·ZíÖëý8Öÿeü ôAf44GÜ2ŠÚëõ•@0;ä¦gcÓ—ü3ß©T=ÚŒ°*W}+/@eª±_bØ‹)–ŠlÆŒÑòJV5Dpavy!ô°š[ZœLÝÚµ²ó_»XeVDmÂÎ蘼`ŸWcðìð×9vؽ¥ºËvðþZ%F|I¤®1Kæn¿”]±ZadªC…¾Ð©²º¼© : ›;D×~~â¡.O³° تºÚ½Úú=Ì0»{nw•âxß”ÙÇЗçÆé€9cµ¨B3âýÙ^bf{ÍolKçÜL ¸)˜‡žÑóÕ|;)ǘ%-9Üçá@+Íñâ:Ãê3„S—S»âóÅOwlkv×T)S:b×çê#¨T‹4T>§ÁöÞ°;œm¢¸óÌÁü¨ã†Û‹ßaZµÙÎá\)™Žgcé Š;ú9œ¯äñŸóytH.ÿÛès¼-†\ǘü ªcC?Ô›ÎâÍ5LV©´tE*$ ‡Ð˜[n0^Ò¯=ü¾ªîK& ë%¯±À3}«»{YLsŒ6àþ¿1¾ RÐÏŸèwm¹TÁm·P”¹ålWãw ”ý¢Y>çs l•o7Q½õbRý2 -á%ê`ÉD¬ŽjˆPã -s±¯À­:'ó»ÆË9ËÈ3þ†Á¶¯Õ6ùÍ(†§“Iÿ‰Á¯÷›hu³ì U"@Z#Ÿ˜¶*c€ƒJî„ôw¸Ê øø˜®iM@6¶ËÈçBƵ© Vu kÅJQÝ@mÁiNæLD·õÝÕŽ‡3k„ã ‹.¶Í¼PÛþu‘nÄRÆ'¢® -?–zŽ`¦úpÒ¯X»òÀ6{ Þ·Á= µ[³÷ EÜ´¼2’™•}›êŽû)Ø…X xviOûÅjÚßËÊÙrØå1WNá£û{Àà_È#+_/mp[–®~-=£Cv»`ýî®8M£EBD.(ŸÅ]‘ü‚†û`:Ùg§ÁÃÓA}=ý]«o! ‹Ãýº€ÛÊcŒ†7Œ@ŠÓAj‚vYŒf­Œã_6Ý3:ß,AèvÛ¦»ýp·ÐØúÓ~ô^Ýœ–ej -]«p”†š 1-׸UÕ7½Df¬Ñ%LðhŽ˜Ëúï‚ÜÄ3c6îh6]ÇÔÃI¥ZÈkŸ~0ýlž71èä¯Q!®OûIý¢yΠâH°xáÎHù^*lך³a -'õÐeªI£’¯ëÄDu‰£ÓÌJ o¯rßçÕ,±[>@ ¯4õvËà¶åVÄØîÌã˜P"Ê\Ó\ÅYgRWèšÉÆ”çÅ3Ù\9ŽØ˜æAGc$Ú×ÀÊw܈˜}ùÒ¹G?ݰ6*71ÞNk†É„[£s‹6ïÇwd¾ŸÍ›×‡Ê÷»²Eµs,ZK+ÕëÏ%Ò-q‘Í™ÕØÿ²îEã:íFÑÀæTétg¦0—fãS:8®•çÉ|LôkÆtî'^MrÇkùB_Ç·³V¸9uPñvïßëE'<ÑÅß”b`V˜ t1¤½=âþóGÁÁ»~nê"´È¸íˆjÓbÕº4ló–ð^þŠ%gJ³É9Óó¨ínøXç…!¾ëj‡Þ2꩚RµZm¿P%>â%&L$Á 2:Qylöp¨kï9çl_ù9\ýšá{@­Ç§¦z½Xkø4vTì#ƒ] âˆú‘Â+<£<͹b?îÛ¹­‰(—ð‚ùmIŠŠ} -p[HÈH±œÂ§ÀãÌ¿wnn.\XX¸“IÇs¡õ([¬ySó•ú̯Âz4ŽØ^mgHPÀY|™Ü“¦Sƒÿ/º¶Í°ßÄAœZ”+Š¥J†¦N+ÌO”"6må1 ÑpLZÇV´òœÀm¨e$ªb€`þ_qdÞE%‰ë×A;‡ØÕÐíÚ¦é×£XØFïŽJ•0 -ƒ4 ÃRV©¤G+¾ª•uMÂH†Qü× ö¢U—HGÔÁÙÅc.½)R¦-#6¢U˜ŽôÍÊ‘|qÃò·ù3Ó×Xù_‡§ÿäÕÔ⺦†‘Là ¥~ˆÓ¦/n€\–Ö:K£5OG]W­Êoч ÇóìCÔ³ȳ#[:ÂͯÞNД ýNUS›Îõ0•vé€U•Ïa¤îp…Í„fùÕ·‹VEUTe‘fyÔ¼(ªéF:C®=AƒJ×rJ¾éø²Â*²ø© ÷¨`îS á”tÚ·A+–ÑšM(Çrk1úz!¯• -Ï‘mnÛ®éR©Ê— [¼ê;öòÒ…ylÃ+ G -¶kïëÄG-š½˜A’åfÍ…¾|œJ'/çôé¡{Ì}¡zˆTƒkum£kQ92­ˆ¢c!˜­ã& Õq?|Ù4KLnk<ö¥Ø|×—DW(Š1Ä`óŽN¸Ðú:n@ÿVã·ïú°y·Ú÷“üµ7ðùä3ã?¬¼ðSøòãŠñ_a±l˜ýõùqßõýýa{Ñ~žËW<›OK0 ˜\˜$L¸˜R˜öm§Øžó¤XçÁT†‰ÃÄŠeVœÇ/ÚúÜËÅDŠãI±›¿+²<-æª8f°¼RìËGÖ¾KóÑãõdÁd¿Ñ)¶-û‹â;ôµ·¶wpîÁõèýVa*×Ó+ΧŠ}ÇUa -Šß2ØfsR¬ÛSï¾ßzÅP00E05`òab0˜h±Íß6¬ç0 ˜š#Lj‘õúÜõb[TÌk#çÒË LáÈ>ÓE;†;°®.ÈY8É£s¬ãF¤«<Àï'ÐÖÛì[‚5>ü a~µmE¿Ö ¶ñ| -G¤°­m ÿt=BšokÃÑ5øççkBØÖοªÓÆ]ÆÐGÍ3Ö¬uÁú¬õcûqûÃö_8¶3æÜå¼àü¥{Ä} ûø9Ï𖼯uòù4ùoäçt‰~˜ý·ùeþ_Ę8+Þ#þAÎË#ò]òU•ª?€Ÿ{ÎÿDpOðrx&|KøbäGŸ‹y|!þýø;ñ+ MzÉñä¾äûéé§2/{4ûýÒs¥?+ýCy½ü忪œ­|²òÃê™ê端Ôî«}®öóú™±æØG´qGã…Æ_6§›gáßoµf[ŸŸ¿aüÕö}íNìšxariò+SÍ©Ïuf;_šŽ§ç§?=³1óòìñÙOÎþc÷òsÇÃséÜ“sŸŸ_œÿµwá¹ÅÙżó®ŸYºqéñ¥Ÿ-¿yùÅwå-«ñêGz½Ï®½sí§»îØõâçÍ{ݽ7íýèÞŸíÛ±ï£û—öpÿ÷œ9ð̯_C¯ùÔ5ÿxíó×Ù×í¹î? ^8øCc‡Þµ¾²þ¯›‡ßwøY:ò™£½£ýÙF¼1½q߯WŽ­{þxz|åøG¯—׿t".ôÊWÑ c§Ñ0ÑŸý:Rt®x^%45Ô5ÅÛ'ó¿.,¡â(OÖo[#ëí‘¶Ð+ÚîÈz òpŽB¶2¿Éx´hëwνT´õ{Ê¿^´­‘õöHÛ‰ý«¢íŽ¬ÇÆYãUÝöìÍóC6:^´‡ç÷ô›66×Û#íáù=}U›ëóóOß?Ó<ôØão½|éâƒO6ÏmœºáèmÇš‡>ÿ“—{ôÒý°q¾¹s÷îÕ›/=²qþÒMç/>õð½—Ïœ¿üÄ¥Çm.Ï/.ÝrùÞÎ?rïå76»ð:'ØÑº wð˰ªË°ý¼ŒÞï°í1ãÂÿç/Ø­ƒù·>Ó£ÆÅ}ûÔÍúM¬¹‰û¾Á×ø\w-¡Æœ1v¢E8Ã4ZDux>Óh¬˜×Q3Ÿ7aYoŸE3ùò šÎçÓ Ó«0ïó)¤òõú—z.ažÂ<‚¹>>,æÌõþ -ùŸ››~^¿Šñ· iÞˆ¾ˆ®üò{Qý³K×ßtö³ÏÖo3¾ˆÜßöú‘­[¶n9yëð=ÐÒ‹æpÑÔ‹–^4õ¢¥áVC/"½hèEÔ^GOt7?F13Œÿ ïK"8endstream - -endobj -% 'fontDescriptor:AAAAAA+SimHei': class PDFDictionary -13 0 obj -<< /Ascent 859 - /CapHeight 859 - /Descent -141 - /Flags 4 - /FontBBox [ 0 - -141 - 996 - 855 ] - /FontFile2 12 0 R - /FontName /AAAAAA+SimHei - /ItalicAngle 0 - /StemV 87 - /Type /FontDescriptor >> -endobj -% 'F3+0': class PDFTrueTypeFont -14 0 obj -% Font simhei subset 0 -<< /BaseFont /AAAAAA+SimHei - /FirstChar 0 - /FontDescriptor 13 0 R - /LastChar 230 - /Name /F3+0 - /Subtype /TrueType - /ToUnicode 11 0 R - /Type /Font - /Widths [ 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 500 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 - 1000 ] >> -endobj -% 'R15': class PDFCatalog -15 0 obj -% Document Root -<< /Outlines 20 0 R - /PageMode /UseNone - /Pages 17 0 R - /Type /Catalog >> -endobj -% 'R16': class PDFInfo -16 0 obj -<< /Author (anonymous) - /CreationDate (20070609222450) - /Producer (ReportLab http://www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R17': class PDFPages -17 0 obj -% page tree -<< /Count 2 - /Kids [ 5 0 R - 6 0 R ] - /Type /Pages >> -endobj -% 'R18': class PDFStream -18 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 3269 >> -stream -GauHPhfIR2%Y"/2rs(\63JAd[rle<=e#"plHb#^iDPjrL2g2@Ke8aKFPCNTt -m7JQ]K#hVLSRe;M!r)m2+$gO&%%ZOq0`60mR"4:asEfqDbt6K!.U(p`#ll=b9+bH -rs"&9^iI.ma$3]/=9DY-=9DZX9doR^XFq"6XFdO*(*FKh98:NFPb9R7&W+q[ -`)=GQm$VJWk@Ds')#PLe(c&;+]nj93d3(XAY2=HT08An,I>+B$i0DlbmA8*k -*SpbooB21,I-'q"3X1R=7_gd`GXH*%/RmIK9%ou#hgIia&;*rW]TrV#sI -m^I.NgtTGcF/-DnLCqVa`U8M:bDUiZs3`4e4e)T#^pc2uG:p]?93CDBXZkW@+o4^Jf>k%giIPCeZM-(OokpF1jt#@aT1PK9:M9-QHc -j=+6(S0RbTjTd[uCgpen:m!iRmNb%m -KlEK`"a-:'UJ"doW0`$o:<)23hTM;djtBnkBp@I>1"9#`MEXf]3;+IOoCeXBjXMbSN/$ReC\R -S(;.dJG6+7>^?(^LQn/1p"bOZOoA*Z4F!8p(pu=(H=NX1r-u$$-F4r1N,H;] -KPml,5tABnSOp8#=/&XCS'ZGqg4F4ON=8\-aH57:1)N=[3ne/I.QY"s4!1R` -q$sZ@gqbZ8[Yes+p^XM;4Y2ej"F&%OY;0^X$8ZjkSq9r`>bWSA/5O*DVs#7! -V,OI<6Ks?QE4d[)bpj>JSXdFR+6dk+:-a1 -Jtj=c2mU+S4Wu6rCV3f&TH:)T)]:np..bHu1Z]!\N:dbmHs<\c -MF4Hc8/&?Ze=ntehH7tuBJInqOchlSI0)-I?qBkfj,,2V>)a! -qA9GqKpnaCAi@nKff\I^38H9hAI.-NoYsiH!uX?mGqgGV4b'Vig/Sk+\T!4W -gUQ1Co+I[@t<^Ai,KTQP74nMTEgW,]dU:CURe%hR@[-4OtNANW3 -_eh67ddbL=V$,3$],jYh68(\;Vj2lRf8ElF!E=@B/@e%/3XLJ>66d;,n8K<_ -N3puMj+:s)d%_%B4OhV\&0XgR+F/&Z@(=?S1958Q''#+g,e -!HGI'6lXN95Yj*_OD:RID+"Y9DgDc@%AXE*U(M+WHot=7J]@!80ck.g2+D;X -h,I+1c+WSR!sR,JQrC(t#dC02nQF-dehY%W@TCG%eOFk3_6I+fI:S -a$&r^".`OBDISW>*c,bs;7]r2Q6F%2&%\2UA,rH-Qp^%H%^p0&RF>9S7!^?F -m&SZ-@bdEPeZq?KhKZ6&Soe!U9^f[5]pUo*J3pe5JT.b!"]T9)crc`!`lDqQ -"N6cG9l(BcanHslpE4?4`e&@CU.PX;rnuc>)'GNOL66BLehl+%E/]jIE^P-o -rKu@_gIKT]g)\sW=NV(g&<,Qn3_a^X!S6[L61k`OAi_c709>X2e'&&He.tA/ --gD]a?_fUOAI.JrK-qEM6S7#m891ZRq/1@Wl^+qII0\/%l\+P=+K$QHPnNM2 -X`GbJBHABoE'C\ZPCs5#@VEJM!8lk@78pj>h#*RF>7Z"ak(ITG[MP -k(r.&^"/uiLl",9"T$bdWbst2J:km!$Kd$5&Z8eSSMf]NBrn-popn#2/l`R% -6u*%@F8k)mf+Mje"D_kXTissOn$9'38_gj+lHiZ04MlYD;>*nmR9H=9>4]1b -40HMS`"Zbp!BIi>b+cR)ne2Yd]+USh6[Bl`e[S?6-9g>h4c.K`cd+A))m-;ZHjd[s -@/!8ZHEBj9nQ,ae[ug%@(D'JcHKdZ-H^)^`Gp(SH6(tfIM.$(=[1=a.F&kkn -pSM:gYud?_R7ctkHeq*UN=!iKmdh'6^?%YHuf+'1[TM\Cj -_n!2(aCj5ceC)=S)ATJ&ZY2(;kXCtH6L?BYrX[NVN3W~>endstream - -endobj -% 'R19': class PDFStream -19 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1953 >> -stream -GauHM95bb.&AAP!J)E%Qf/.,p:S3N=9nB%*VE,EIMo)a\VEknDNXPmc%ei[h -Zb)L]`1^5]b^:[K4q8YBb4$M&T@Z0t_a^33"pLq`[gK4FC@eM&BsV,o=g(p3 -X`e[;.?'^s[pEopCkU[`'sgog4r_2F6t<_,(Z[nf//Q@GEs\0=/-hJ^CPk>Z -"'>Y-"'>Y-K2!caK9_NaOB%BBciIZEo[sdYOYW0](6L$F7P#je_-Rs:In:EX -8MS^]L*:o;=qM8gTga@.2BUH2W.^5Fr$?Z4EDPmO$E-6Tcl -lGpO0lF6V>DPA.[+%Sn!3t/h-27<)Un+GrZ5LDeBNYp7`,^$k%\$%PVrp-s' -a',asdTj6keGce`1\RbQM%7q*KFU2+m)TIr'Mh(dZN*-/=.06cAq==UEMj=> -,;r&i"*eH=<%XGn\I;<\GA=\TGilLuf6C=V0?ag2QDqq`P=Rep]fG8:4<^6q -7:`o09Y`)*c^jWKhTR`n"Xou'g/+.X+'?ei?L!N0SG+F+GK+9K0LcoAb@kY\ -OA)UNe!I>ZW&5q%W"i7?Jo*#hr?#F'7p3lb?Oes5*B]kd#Wtq8-hXa$E-3_K -9nVIcgRqJ?1h`$PaB:?UJMBW(bcqo-_,h>0-4jZ[g)B-$+Cp7uPk#LY63r%eT?2n6PWXG5)^[[c/)dk,eMjP`X]3+U>JToSLb`O'1 -QoWSiBjcr,^`.6\3CqJ]8&E,F5G8=[/K3hJ>;T033nU/ia2uc$[u]ne-4jY* -:72R!B[8:G6_3B;I!Ug/b;JF'6sRa$oW@g*?&C>a3k[(5LurA#52,9IKmcK( -+p:<8b^pNP!phLU"`O>1nKoj>R-.1I`Z+r;Gn\,h/YS/;D6\+6l6L7D]4<^M -0ZP'Y>]/7OAS"?lh1E!Cl@[Rd*';D,CtpKu+eHuPFfB&27QYV%DH_N`=O4NU -1mOQle#]pV?]m-KUu;gHmkj3"YmJgC`jKGjamq!ZUf3HC;g6TZZCa9+Mu0'n -[Rb"O\SReYClK;oDs&VpT.agA4(C%a`H#s'4I:"Y]R_2UV@L\$Fhfo]>4*:h -A9hj[a>Op>]H]V]-e>c-5a8DeWXu-RnOfqXRfoD_iAU4mp$++2r5f4'\c/;7 -q0V`)HDQ7?*%l2S_`_G2IT4&mf=#0,=8-6;CeuN$a$aku[;2&$3iETfIAu&& -%+UJ4$p'(&3gIE?W*%*T,tG)[;!h4#&nPEtWk[rT1$t%@L`RriAtdh8/S&,R -Abd6k,g4_(k$oRpl6)j"7Um;O^!,#5Q3pJ-8UM]O,De",B#c,H#A+JkDMs#U -?5Z2AM"aGM#]LCD6)0LE.>$A)J9D%PO7a0Q9EudThFuYiP=0lI_W)\D[!ZT" -Km>-YFFB(9j1qLs'Dk(mo7*_.p%LQWj -5M%i1(Gs>ZRV:A5ft;)\B6E;%SDX565*MC8pPt&VQXB2=0+7Q%ITPIuQB8kn -`h$jSa10&IQK=Dem#_^+Cd`*5pC5\U1\5s3p:nkMT'A41fqeb_R -pQ)B]"0J5c!R\=R(f@73D)V2IF(AYXpd?R=A>`mi_5T5^aZH9+V9R7A>;L1K -a56[ZZbI"MF`';l5mOTnp$+cAZX4p~>endstream - -endobj -% 'R20': class PDFOutlines -20 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 21 -0000000000 65535 f -0000000113 00000 n -0000000251 00000 n -0000000457 00000 n -0000007710 00000 n -0000007877 00000 n -0000008221 00000 n -0000008591 00000 n -0000009641 00000 n -0000030468 00000 n -0000030720 00000 n -0000031992 00000 n -0000033410 00000 n -0000060301 00000 n -0000060553 00000 n -0000062313 00000 n -0000062451 00000 n -0000062649 00000 n -0000062764 00000 n -0000066178 00000 n -0000068278 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\365\337\325\241\240\200\255\256\273\015\031\260g\230\355') (\365\337\325\241\240\200\255\256\273\015\031\260g\230\355')] - - /Info 16 0 R - /Root 15 0 R - /Size 21 >> -startxref -68330 -%%EOF diff --git a/z3c/rml/tests/expected/simple-layout.pdf b/z3c/rml/tests/expected/simple-layout.pdf deleted file mode 100644 index 67ee6de5..00000000 --- a/z3c/rml/tests/expected/simple-layout.pdf +++ /dev/null @@ -1,107 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 822.0472 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 180 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (Stephan Richter) - /CreationDate (D:20130304205054+00'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (Test Template Document) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 207 >> -stream -Gaqcp9a\a&%#+EXF,/q]$B@jCVk'r_\EHBjGQ;RaBeB&X$\tDk8jX:H?h+grR=]I-%)>_Z3"q)k*QT*'BlF]e5&b=#`=NWV@H%8_V-t;[JZT7&Qs/:PqJ&Ijen(XLBPh$G*Z7L,ZoIM)CJ#O_"W=UePAdDu?gVHMHD.jUI6V0KGpeDL:iRSTr].I=o>N'"ZHL!fF$coLN?0o.~>endstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000559 00000 n -0000000838 00000 n -0000000972 00000 n -0000001252 00000 n -0000001357 00000 n -0000001706 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(1\301\(\211\016s\276^\256\005jv\035\353\227i) (1\301\(\211\016s\276^\256\005jv\035\353\227i)] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -1757 -%%EOF diff --git a/z3c/rml/tests/expected/special-text.pdf b/z3c/rml/tests/expected/special-text.pdf deleted file mode 100644 index 20f08638..00000000 --- a/z3c/rml/tests/expected/special-text.pdf +++ /dev/null @@ -1,127 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page2': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20130305225909+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 2 - /Kids [ 3 0 R - 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 545 >> -stream -Gatn#h+lua&;BR'oc9(&lEXD.Vb,TA>pPMTY>>C;?GOK+n_uSUG!PrufIkOcXf,E6abe"^TC7`Z-4&u]IP)DO9od%3!YQZ+"GqaJq(7'Yh9L)NA(SeKH5m(pajLTmE#bZ&Z"XU<=@6HYV@fh]WJ#TG'AUuu6a_gWhFp32aD4-hQ8WIoUHYguis_e;\Z&iVn-AO!a=k6h]pIR(9SZc4V;oJqmrF,<*/VSJ>oOjK/d7.6-ooDkC_md23I7)&fZAfZqaR)DjR1a6_d%h+N3VH_HZI5[Uk8:4-E2%2&oFLtf/NNimY@4A1H%@^bj3+q*bi2Vj;`LG6YLL@kL<.3_8r.W;DZ!7n="IT`X,(4E/"Ij"ps5R`tqf'1@>F'G-@Fnr6:a&,iZg]0GGS!c?IjcdQ4M@*]:d%&9PAG>qIO-ffJ#'2'crJmok!#t=8ro1"gMU'(Sh%XRk,9"WM%khCNmo*Z:UdH26PuuNd7$gPGGmr#Wl8VX'KJVC:sSQhhO:oB_6n\G5&[+BK%]>+rj1-\gF#G!o*.F/8#l~>endstream -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 262 >> -stream -GasbS_2a+$'LhaAr52g7R:'7($9Lt(2%,EB!CeQ3Jk/Q4rHUN]bfj\IVTF0JaZW]ld#n6t)IR&/gIXp>F,!BJ"QgA%'*aLOTKi7l',<02W`(If.b7c9efZI=r-@p_h3RP1h-OBAI9p*a6h=md%-drWmdhAYg,bhW7:?T!HYImc,09uM!]/r^"3:D_eFPLlokHe0$j[(6nqWoh)P+Bsi%f&K&t,bCTR.QH8'WFqO)AnOL5rq6C\MlKAb-ue@Lrb$P4MUX~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000926 00000 n -0000001061 00000 n -0000001330 00000 n -0000001443 00000 n -0000002128 00000 n -0000002533 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\266\223\013\225\230\266Y\231\206\3278`\331\265G&) (\266\223\013\225\230\266Y\231\206\3278`\331\265G&)] - - /Info 6 0 R - /Root 5 0 R - /Size 11 >> -startxref -2585 -%%EOF diff --git a/z3c/rml/tests/expected/symbols-set.pdf b/z3c/rml/tests/expected/symbols-set.pdf deleted file mode 100644 index 35d51741..00000000 --- a/z3c/rml/tests/expected/symbols-set.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font ZapfDingbats -<< /BaseFont /ZapfDingbats - /Encoding /StandardEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 2097 >> -stream -GatV"lZ3b/'ZIhb.f[E]_LSrVgG;"KX_"IoiX8UoIGt$)a9.Ml#XQG]hsTk!FE]KadsX!\T_O[kc^qbmbheTL3\3&C=oLRLFHOm-WiauuU6TkERIj1sjgJp7XU_t79&GUH4)p/f[Vii>$nje@eUBi,9">4TNmt%b3\A&Bo'lW=ddFMY4'B:E>IDbkF;.aXh=aUWk'rR"W^@nH:jRc8Xs2HmLqW/?OT?nIa:/IWNUJLPEe@7\6fFoaQVJ/g7YWa.95[Q5=];hAnthP'gET):@7tK7$JE,l11It>Jo(3-70?H?O;el8C9PK+P:rCNjAc57>T@)$O-_%oeR'OJh_[naI"n@-D:jsiPX7:B^ID=j%RNYDn0s6L1gs$p:^X1MJ";sSb9Z'93JrR@@7tK7$EB5?o80*`+-JpRM3.-a\+a)G#)jE[heIgHp>:.GJ)&Z8)%CnbJTF9piP:r?&)gV!pp71@[:'jGJ2W$2cGNm5kaG=\8ENM\"1t,eUDE:duT%24fD#@lX_*L9rG;5+)lOSOo>M;B=G!VuuGN'CMK9Qeg4]JS>BD0I`K"4K0c8P/]naQqH2B.5bfKoEgSc*pR`IOHMCg]/V#D8)3cm$a0?EW_]1[KY;!L"BmHQ&ign[4T2&.(g]LX5!\%X)5S8P45?5XE"E1XP/%X-/jlKXE"E)XP/%N"kcCDWlbcYU1t'X/IF_.&QM")j&B6UCJjk`PbrI'(oH#7b9Z&E;O5H7@$GEt/X(j[8Pprr!)]c@[nMn>P+kon!2ELtTPIF"\I>>*E>YP+!aU`$gJX9Y%:GE8o.?/Z?V"$D2h4c*bI:.XIOR^bg]0aA0&JEMG"7Ef\H.Xe?/b,`KjVqu.NaFCW[lH(.(h'!WS@JCW@m'`8NoRAg3PPAfQN(^@:6kT_hSW;Y`G4;17[Ge*DGq@T5OP@T6]JQ_=4YaAD[p"AjO*95.&H0/A&=X4[-f*d3gD?,;HO+ObE;R".M@'E*--#:+jZGm>=Z:50gCO8sd`XQ=_7LE^Bq_GV"a'lDG$AE7#;Rj^U@(8Z5V/$U,;pa1YoQCR)`Ia7)\E;-IZm)VD?*$^,*]ArPu0G'%T>80'XKrd@Q&*(@l>NqZOME#lGB'N)o.u'#R,(kV4`eeJ=ql-,AeeQ'1UEi%:IURKVGmk1=X=a@FRc"ZF8YeXGn17XGmL>D1>)b)`N:U)ekPFr@+R[g]4-eUbUZu;Ms5=!K,W&K=pS)&T6XX-uC1dg\qfU2Em2m2UW^eqc='YpcJ]780c(?58eH&1ELO?[CPfl5m=Oj~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000573 00000 n -0000000743 00000 n -0000001020 00000 n -0000001155 00000 n -0000001424 00000 n -0000001529 00000 n -0000003770 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -3822 -%%EOF diff --git a/z3c/rml/tests/expected/tag-addMapping.pdf b/z3c/rml/tests/expected/tag-addMapping.pdf deleted file mode 100644 index 2d54cb49..00000000 --- a/z3c/rml/tests/expected/tag-addMapping.pdf +++ /dev/null @@ -1,107 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 350 >> -stream -GatUl_+oY;'LhaAr57>FRL.EZ0ZN3"]$c;;d<1-Je,Voc63#fMc57qS@M7.eMt^ORmjUV5(\;:e!BYk53sN\J.^1JL+RX5"_VdQcfRB,na(^iP3OYHskpB'j9g=a7J[#[eMd\h\DBYRko#+rsGL4n.'.$Y!DTs(4V(UnjH@nYo/`qmt)FC9;,r2Kq.9^4q<7*s*Y&sd8#'#Kb+46@Ufu@P/e/&f@g+N5shkpVJ/cUUAM_Y_c=dBS=(fXj4=9tH;I.C@pQ8\`p\SQTp(k")"NZUF5.&.VTg*(2d*mrGl6*#=C3R]>0S7V:D_iJA^q`a`kVFJli]6,;X6M:*gnS\tl_&"miOcf~>endstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000559 00000 n -0000000836 00000 n -0000000970 00000 n -0000001239 00000 n -0000001344 00000 n -0000001836 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -1887 -%%EOF diff --git a/z3c/rml/tests/expected/tag-alias.pdf b/z3c/rml/tests/expected/tag-alias.pdf deleted file mode 100644 index 427cf3a7..00000000 --- a/z3c/rml/tests/expected/tag-alias.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 221 >> -stream -GarW2h$Sa!&;BQVhr.gX60_.,"q_Oq?$$b($S6"$,`tC=hmiYR&[Uij%VO)_#a#n5qcj5-6'r7?+W!rp`/l5;id23nUL'EDOuQIPS*C3;-7Z3ANIo-4od`%i>DFnB:tg4bY*ou821]"@m&dS>m^\)<@5dSn7Vmoe;;^27VO2dW[p1;)Icra0k_?TsS=c;]dMrU`(QAc.Q,R@rdbIV2I.%M_L-XM~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000569 00000 n -0000000742 00000 n -0000001019 00000 n -0000001154 00000 n -0000001423 00000 n -0000001528 00000 n -0000001892 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -1944 -%%EOF diff --git a/z3c/rml/tests/expected/tag-barChart.pdf b/z3c/rml/tests/expected/tag-barChart.pdf deleted file mode 100644 index c406ed00..00000000 --- a/z3c/rml/tests/expected/tag-barChart.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Times-Roman -<< /BaseFont /Times-Roman - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1089 >> -stream -Gb!;d95i<6&AG?Ts'^paW@$Y,ltad36g2#mK^8X9UbS[$o5Nk>8G5rEuGju[Q3GcD28g\!<%UO#'.mLiN[@a[^[jEelE$:XJ,h1Dimbld;eK-?X?1%+>jj!5]3Gc..3V/o9lW""[Pb9#[HKU&JI3]J9q3!/0lp4C(at*mRQRG(D"R&K0NPtgKi[4WY!\r:3kIro*VOp=7,GIaoPN>+f[s$:cM`k7hr/'O@PluQE_W8I$WJl(?!@ZTaoj8#;`b0/l[YmV$GLp4:;M.fbf4/'@4&j>\"#ap67ObcDE3?s9L]6D/S@=JN2JQ*r7M*]6kZR84,/N2\3T+VBfZj0'+pSVD>K+CQ!HVF<.Rcq=f]Q);7c,IC-@2`S4>Jifqfe2-8;]eVuN#[p)hA&+&;1n]XN#gQ`%!gZhe43X7P_HF'$JZ;GA>iZC%Je3/nsSHC!RT1j7q1>)L8IfQ"csp@6>lpt20[9bh^V]#*]'.IsrQ+ebQUY+C"b$]isDh;.]K'D]8CQqG_Z7pdU*-]h2Se5!C==/u)^/30H;:"qM"3$NF)7.l*42f8.ancKVEEg*?\#>3dkbN@=+9UhhB<9-M5>tf]hOULL*+#[seYl~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000573 00000 n -0000000740 00000 n -0000001017 00000 n -0000001152 00000 n -0000001434 00000 n -0000001539 00000 n -0000002772 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -2824 -%%EOF diff --git a/z3c/rml/tests/expected/tag-barChart3d.pdf b/z3c/rml/tests/expected/tag-barChart3d.pdf deleted file mode 100644 index 73aa7508..00000000 --- a/z3c/rml/tests/expected/tag-barChart3d.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Times-Roman -<< /BaseFont /Times-Roman - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 2040 >> -stream -Gb!;e9<[,-']+m-s1q@,FH)@AkI)rb+Z>&-+VkfWd0,9Wp-VshaZVrJru^^6t/K;BRd!""=jENksHpNJZ^0;aNVjQ5,do'4-Ia3Wi>]CVpRalt$1]a0@B*Y6p8KHQEakj(Gd55#i^@t.TE')crHJV[HHB71s0:6g?TJBl6&c2>4"+/HQSE>TG&58q),m(%+UDT76qZaj(B]MCpgSr<[O2-/UA@m6]=`^Agc^+^I&,7s+VDDXCdZ.-,Yr10/OO+)V-;1CW'sCMJQ[_Qb_fO3_9eR=aO%br11HPTbUj^lYj4DN/>A&?2)^,r>D?0=.'#K\j"WX2-CXlcA"[M$AhX6tBi;h8A6;)or=JQqDu+#^nki;+KgbQR[Ub1=^*FS_U%O!ADLMOf?Wrre?SG'?6p?Y<;p$*i"i#m(4Us(ik1R`0;IUAdQ&;#"oF\7HLB7.LOY\Y,OM2_pUmi)i?#ioa1n-oGCt*P33G))m7DujbRsmApKTtP&Tb4u>9gR&Z59Um[j9.d&B$+sNnU)]?2@HgLq:f.(GVZYk2M/:CQP/oVj),2:7:)mdV@e60lg\E!h1F_3^J?ZMgOZDi,CguZ1<)bF5dUQ?HU/ED>XclLbFbMbCX=Z`4R%KJYo"H!/=CUQR:@b;qpW#S-.D#$jI#XI2Elh.8BIT9\>YCs09XOHtRuJ.Y`bP=S[Uear(6#jI$1q;6h=^M^,DJWPs''O^Gd*Y.C/G@W-hM2q7o+g3N.jFkt)=>6[lV$ct(:7fUT06XbKT).JRm'a_O)si=GL/+JI"(.s%/UB@%H%l7_s,2'iC&'uqkEjeC/mGe]pW2N;A^4!oh&G2?n8s\uL12A95f3$r6U5%B6S*T&#*HDj82_^G6)8Pe1^V8G$mF0Cc?S)@\=k5Nq:4I-'b@d+8PS4X0en9[";VNWK,I*H"9Y$iaN9=[gYi,XjU"_%atm?d*l&HB].e06s@AJeq?!MuQB;Y!:g_M0eUCqR*&4.IC+I`JHJ4D579KC_aWF2(LG:;(#Bs[(`0UNjcVWY8'',.u8?D^qUe&b_3gKgIF%i"pBZ8*`plT#Yo`K<=;?BR;a"Ll%@ZedtjZ*+K@,b8n1T#^.^d>gB0"sqn'jZ'fh1de&jR3]cdUdRPK)6dc.lZ*S=KtL&0(5p.@Z%Nc0p-cee7ao>!_LAaXf1gW*`JPq$!P/cOe3.KM?8)h/CS3Xe9GhqP3F!]1\O=S3-PM0]VsF,hf0,01AeU8uZ:[eF5hLIk0VfR#CQ1RU2"51pnK?%=>2]["Kc?hQGiCbDKFfcB]W(K4[7&UKT5(e'c2TF4Mj%?+B!ci&a+[QliB->/JB_Y2.i;@JHUOo]nenj6Br<$C^-cD6SC-B47R:)K&`O`4TN''toZoKHZJL+"lgU`JHogJB-b<&D\,m8^/2_m"@?SbWdIjeejZ4(+Kn)uTI(e_%OKTEgEG=(?rsol@.,_VIZPg0!P;N8GFs*^A5bBK1Jo5Lqc--?q.-SoL5HY*T"/40N@pbO8&leMVm-[4T.9]CtOG=O$EkOmA42p!kS-LDLFZ",KA&<=-$DaDSb8+?F[^Eg^f9%RAhrM7p0,PKS>,qSoC,DNfFp2g0%1Qedg3;.VM4CYpK3l.tR8pMJ"An.-3J=u6~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000573 00000 n -0000000740 00000 n -0000001017 00000 n -0000001152 00000 n -0000001434 00000 n -0000001539 00000 n -0000003723 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -3775 -%%EOF diff --git a/z3c/rml/tests/expected/tag-barCodeFlowable.pdf b/z3c/rml/tests/expected/tag-barCodeFlowable.pdf deleted file mode 100644 index a79cfc54..00000000 --- a/z3c/rml/tests/expected/tag-barCodeFlowable.pdf +++ /dev/null @@ -1,149 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Times-Roman -<< /BaseFont /Times-Roman - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 10 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 9 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page2': class PDFPage -6 0 obj -% Page dictionary -<< /Contents 11 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 9 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R7': class PDFCatalog -7 0 obj -% Document Root -<< /Outlines 12 0 R - /PageMode /UseNone - /Pages 9 0 R - /Type /Catalog >> -endobj -% 'R8': class PDFInfo -8 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20130629002536+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R9': class PDFPages -9 0 obj -% page tree -<< /Count 2 - /Kids [ 5 0 R - 6 0 R ] - /Type /Pages >> -endobj -% 'R10': class PDFStream -10 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 4894 >> -stream -Gb"/,95bfj&\\Y"Ii.tA(f7d#O$aDcC]t+X^ki@#8<S7DXJjFS3eFZ^a=+0biPN)UarV,269[i/@e#+kkUs4#Oc(lAjl/L%<2SjnA5-sjsT'W.'4n#([@cUN8]81@sGdRs2BK&Wm#ke_G4;%SmEJ8Vk7Ufs7V3g\b;$*?X=bD\pI:3rTQIWk1PN>206^:VY]=[FW.IL\E#'&&,>jEH9K%+4A"r8D,9"_jVdtA@Mrm$^\ME`j@mDZn&[Z5FJHr;@(N3$.egc8jp0>UoL(#+Me=fA,_(/V83,VueklPchg.m!=?RTP")mWBC#nY%+,g5.hm)McjS8i13A+24B!^PAP3WSQ+Fh&5'EH8H/:#%tcuts'*CTKTH0!$TL.hXO0CY5;/7.i,&'OA>cbV-;4?;r'?b8d116sZC>CHAD]6F:CI_,O9p"R[YV`4X(pYD=j5Mb_,%lTR#IZ6dg=njRU484'Mo=^Pc5d#I[DedE8ZuY3mpI.>#YH^TQYM^B93hIL[V:u8i^5/gd#+&.iQM5#16n=GgS#u/b'$D!6-sG?/S=3m0n&VjZreEZ_tFcpLp$1?&Ze"1g?,>>i&o[i@U%@/H?-5ZQOQWJYLX[_I0!@^[1/lh!Gd\BN;&)q.lN\)NtEl93Z"o)Ni/gb'?NrnA"$OLICt?:9"oigX-+b],#B$\k%O>$Ct!2ul#[IC$N3.$:61K&CY=r8cfSHg+>=5)n\Atal7=XFQ\c!$Ulgp8&9^-&:f8"Jn-'4o[h\_Pp>Bi%9m_"CZ*]9dbgE8k)ZscW!:7d],"8B5`aploM\Z6,@7QXDE%C@$=:34>hD;mSl*f-j67=Z(pXc;1[aVQJ`t/o3r8'gV[OhWS,WDu]D'UrlS$:'o&dKT#D'T16/&@Z!.ME'GafSU)!enM\[e&72p#=Un%->A):)C;HR%@J@1^HlMV(Ps8^ka'&73.)[ml3Im6^Z1o^Q>U(da3Q-9KOr(dk06b]#^,B'TVs`DDNH;[-&sE-;\\L24STK!cEN]H<"[EXo`(1:bpTD1TomG9DEfZ$6M82i4X"Jo?eX'[O`[!.7eT'HQE/EGXe[aG"l+*eFM%f*DnZI]mU9rmaKYNSutZ(8K(B>=`V6,ok)Ln0f<)=A^tD>'8T`*-Pi[c+_'M2FSd4Z\A;rqJCQ$N7`-6<7;b.P*JSrXjp@#U_J]6+T<0AB=j#V5Ha&=P%WT^aKSrJ%p:2^/@L>sc.E,0l[V+_q]fiMcc#Qle5^$QE'G1pb]*UO;AoF$ch4t>26-45)>Y`+X@pVpH0=[L966b>,UeHSJT+r&BP;O%VP:^Lee"'d*iY=+qp:Y@"S3j#"o6P.87'eVKWCGV=h&*p/#J?Y>kaO3.\imI,CmkP-d+t8s?-$U_hY_PG:KAhe(g15:1&GDAMKU7eI6-!)'020n?&SfS4@b%<19F[#n)gYJ?*kadmTk4=&/upu"_E@P[K2of2FB98$m-o'._'nOc@"nclB>b(3R)Geok8+4lgGi(SBE=h^C0.ABk7/hLsEce8+*s!(#X]$C%=D)p]Hq0qa;aGJ%_,TSV';pEHXM2!]4e6;q9X!.WmXQKXg'o!W!S)%CitD!n"/2tAPOMFa^8%m-FsmkI)EG68K+<[1h2YdDDTWn!haQ:b.N=K+lP_!db?GLcd?!ZXXs&tqc[RN\i*$Fl\I,skU[)O4j-SHL-V?pWY+]41h;]kL^daEH(WdhIg[kZ<3EM/iJM?<3b:$cr*UAQqZfg<[m[b5l:Lq66`k#T:8_[tj"FHU^r6=-esi)dFBTXi:8\;Ki+-$Bs+#60V1!>MT(RXH+21hP*C-QWG/-c,UGH:=4X2&H@k%V3e$7uaJG!>6G)4;gden*.>-:*8:s\ol)?tkM/9*,afAs'H.5490u+(Y'"Bh:;AP/ht8-1qRIJ9D1>k9l.C8%00J6i;e;:DMBc!,Qr=leR:`W82rV=i,an]pUC=b6,\U\-sHMBoI\s>;=5Kj9i:=+\EZ0b6WhXG+/WdCT/L4?5AE=965)BiVZB)++K3W[F/r9)1lt"ASk*.Kg+@(FrBgPHH`h7RXc%iF)UHYckuC]Pq!cQUc8SSfX[&/Z^8ZKL83PEWJ7biFo+LIp:S,,*"I#d[Mf06]sSEB;fgO@3pK(\c8%M$Ga,fp^fdftNPkGu:I3l:]/7lF%8a?N+N3%Rb[/^1l^f#d0!lI&j_^D8`I.-JP>sl?81pdC%8NGikY_jF;!1RBI,>qoBM`uq!9?&)P@/39CjO!ap$82;`JMMo31'!%]WV5eUd%<04qQl0t[E"b>/gGmQQ>F]KZQaWAX(A,ejZMT9FKoqu(g[7Xg(P)m6s*]#Wd@0>]VQ\+Rp\!L@.$.UVXLduYLEo_>=B@ep"OgOK7FiNE6*t`O>/onYhOmD5&8&NRI)k3*e9]8E1hr!\0?pEOrR_5AZ3Hg^endstream -endobj -% 'R11': class PDFStream -11 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 5089 >> -stream -Gb!T\gQ!8_&Vf`XkT0NJ0jpI5_lWnf8D"Ra%u[S+EinS*nqHi%i14`5A3A`nTiQ[\[65>V7Oo,GtlMK<&W8TD?9]$lSsjH-R:I/iN4Ol]tkG&c+FPFKT4E/EuFmsb--p>a?r]mT_%J$pHuqpTaR]`(dj-TMkSC\<%l9>m*@ud10nX8EfMq9?W7iUlP0XiK53hFUUl%Xg[VTE]+L"OjBU^2#^c.9uWQkkaO^g89GtpX-5aIk-YRPO%bZKBME>^/m^Kic3G"tWW@1E4r`+d44CjA2Z)&>\4.\M(%`UM9tlV+K,t0WTi`=h/BHbD1G1PLbsepGRX#F<,u[2)-sAF+Pa4![Wk%,gncAN6,%#:@2[Cpr-eO*`b@4Yu'h$6p\ojnUH"g%7#W=Zhi2@G9^N?-b'lP!j`t^D?'$1er:7r.r._.kU'ni?J4AbDJ_aSWAcQF4\E3KLV-I%\_(Q5"bYuYUr#g[GBK\3U-+R;oGf3YKM]6LeuIfIGi$e94tB.2@*P1dNMSRO53qC520D-k8M0oA_g&n.4FX3E\4DeoVeoS+?8[i("A",`[53[u7mf^04O3DCR8I&%7'&m:4Ki@][&B?GgDh;*:Nrm-#uO7hnd*d>[gN\eC4k[G(.K(6*i0Gg+QmuG<2F51Km+Y%KNOM@<)hB[+c-'!;PO=T[0SYn6d?gbAAW9-O+qRC0(DWu/%_DS>h@:SmCdr5hLHGA;k_f2R[C`&.H,6u.E.O?UfpSh<%&I%b1B-8?qnH$R>W\?3R<].o)0:+OI(pFR0n)`(7DD+MKPjq,$WNdIiNX2SkH9>l?k2\aH,N7mM3!6S1>$"e&Qp0TXd[f-8Ei)I%X&-?&@QGnFKP5>(f.:0t=Od;D5sDO#bQ2>T)#@bCj7C[4HYln_NE'X2!*7"bgF#F4G]mY6t=pLRZgW\Sp2XlMi&lI0XQj=/jQ0h5t)`G2E^j?_Yk0))r?9c1qKq?j/G_[9[1?fm:I?`^X-bq%Ci'j?;%-+h#TmlAM"X,_pepU]X-<%=_gXohHJBGoq]-Y-S)^9E$d6/!eoh&kUPYEpHP9h;cWIV5QCEE:XAKQCEU?QZ_uV.=%XT!`4C680=h42FSiPBMEgaAr5e$hF6[GJpY4icCnK#ak!5P*k3>s"Au`%lHZ7s7dcrN:WopCnKt\IjZ=4*(BNrhXUSk-1l>D5pE-;Iph?RA]]\%A?\ZC1M!l);;A3qma!S9c$kA9^/aWM\.bdlmlaI8CS]Z>r!Y1J7Ofr@PHV5*A`;90Xm1[?=OXJR"04"h*R0`aY[b16SJ-XIRScpV\MY1DS'PW_tua9#eGG4W*8_c%U3.F^P/6a.#_Hm*j%'8DiMl%QW/Uhu:'7YC>3TOnQdb6(>`?r4%`lrkm/I`8i+fBn62i[&5C2=+H;Ji+[7_##J!q%lS.Y\k=;3gmE5*f,Z_miR5-1Zs,aM)ObCj.;N.k\d_F_-/DPocQM+Xkk)dS=Y-UR[(cS7sJAC_Z%RIe)PX">pm?ngb>@]<&=[01;m#Z)Qm6SMo`r#h6CTeambYj(q.!ZXqFQ[Kj=G00"2Zg3?6AZ\^?Q%q#sDdLo?4]O!#ls:###UT/i:keb+:f=7;`ngc'&LZ:Je5Nc9M%oJ'PZ7I?>9!7=^)"-:.J7g;?Zq/9]De8taR/c]SU4YDi2kTf^:CK`GJ8QM,/sP1_raEKOkNE7C/+;h"-$k%NVWW#PC,'Ni/gXt4_m]n6(*DsJ[.%o=cH(fiW1h3VVBRV87nRj&Ms'i-VNi7s$.QeRAm`S-m4]u*AT*aU`5MJN-%&AN-%<37lhW27QMZU,9;e)_\.ti6O8dq+U#jH&->7?#QZ\@K]&4RKE0i!6c`hFOV%_NS,ibJjS/aCcL:j%E_V02EpS<"BB[,S3HDos*&qn*NZ0r'LCG)@7LblCO.a=I2*g=j1.Ua91>./-9QhO(F*J7Xaef2O:0SV="u+*/3KcD.)N`'T%ETT8%ETUUk!8)$G9E+J*QO]LNakh6#;XuiJ^!*85j$-S8E@k08ENI]5UN[S,+0F6=-t?Y9!lt/ua4H;G>-]lI/'??X%'?B1!8K`*.&s14D$-/Pj"N]X@Jn*(C!b?<[=l>cc<59+TaCO021:[eo1:[eo1-)uLR3TBiOi'&=bi,!`b]>ls?ogV0g#R-H:.Ii%]+L&`f$f^Op.QHi]a0F)MoRP4)'Q,'oYfce+e8moA06CH3>1;4SBlaWc5AV&.-GP?p)b,kRQ:p=b,to6cES$rl9H\o$R@NsBIWs*RJ^T7aB2N=h74g^&`VDM2P\Ad`=ED">6Y!ds?"jsZLFb`OlHaAFDfRG;U%R3NRMRI!@%jKqZgba,dUi8W#O+"?XJ9a&B%Bhj9Kh\a?)XN@PV,na3Z92Rg03c,Y_4XXgH%ll.;p5\b;?`Y;.]u;W6;"paF,W[D+1[^/l_5dc*mc%9r]J>$;/:6^R&:Bmk(0?)Y$*p!P..U$eB','P>dNm_KBCt_"bKJ(bedq7l&FI?a13mK:MbB2OhEFoA[W9pIB1J?pe]f0N-Ym)i0JCBf'9B\]J3-FdoC[PV,.o)Y(G*T&VWG)NAW$J8NmjmTgFZJi8p_(/7ED@Mu=3uXNFQt9_JhC$";b+*hO^MN+9O";FTaMV%[&)Cf\kprFW36Df^7DR"=Tb")hJ!).@WUF,"k0@!20>6ESi3^RU!**!PcM-+i%ba)Xf!e&bB3Ea8Tg$#MmW3-Nk,9EdbiO)V^p[\9g3^>>6,Q)oP&_q!F)GWV_(T/qTusdRF[4\d"NBf8*Me:5@q-)!Z*P0VB$^Ce$e^qN]SCSgL^h#QYC6MddQY?i-m;WGDKrTj\(q'Q";_h<"eKo=*\tM#K/qM1[&%.,gROBCZ6.GbZ)S/T[;Xf!eFb7kYue]&65:fUB[9=nq[g3R-5?)Y<4XTt0=KfY1X.'nLXdq7,'1e[%!]gck'=lN(0%7dh(Y+Q/F*S$amJhGQ!eG@T+\4lp"]0sanB:24'W%:,i"WHP.E/O?ed/>:7O.[=^d%:#c:WGR:>ct/*#>#/E)(TL_T(TuB:A]gA)`3b1M;o@*;>VDcY'f+;oC^"+AR].mpf?e)$RbB*8$!jL4WNEendstream -endobj -% 'R12': class PDFOutlines -12 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 13 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000573 00000 n -0000000740 00000 n -0000001018 00000 n -0000001296 00000 n -0000001431 00000 n -0000001700 00000 n -0000001814 00000 n -0000006851 00000 n -0000012085 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(s\346+.\016\300\311\003VW\370<\302\257+#) (s\346+.\016\300\311\003VW\370<\302\257+#)] - - /Info 8 0 R - /Root 7 0 R - /Size 13 >> -startxref -12137 -%%EOF diff --git a/z3c/rml/tests/expected/tag-barcode.pdf b/z3c/rml/tests/expected/tag-barcode.pdf deleted file mode 100644 index c854ec63..00000000 --- a/z3c/rml/tests/expected/tag-barcode.pdf +++ /dev/null @@ -1,107 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Times-Roman -<< /BaseFont /Times-Roman - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1221 >> -stream -Gb!;f9lC_#%)&jOrujlt_ShJ*O"6h8iW>PfikS&gWDZ%S_V`D%R;KEH>NidDKY$HW46u(Jo4%Sk_BJadcbD\OK^a'j:L8'L$.ETr,n8=mn7(*hquX(Z'if"g23_&g`mV_G&KZ>rGkp^\Q]j+O4:BJ20"sIWds7<%c,SYMS"28a;b<-=Y)s?dH_%@Ts596Yb^Q.rPe_8[JF)'4pp&Yn)<9PRCU@[*rQ=rb6VPgWeIlB(:2cMskFk[r?-B>$'b58,'9+<2:b#kqVnKUm;&Yj/-JL81hqU)6"oB;o39@Y/Ej_ac.ch!t.2CTgW&s8HV:]N$;:q8u@3iP#;TXA)7Ft;Fr?:92HD'M)%t%W_mLr!,Ea4Q>s$%@N^=UOs-*d#pl[91o6"-P%IZ9%^b4@7RG`uO@mAE\sNIgaAF?1[D[Cm3p;(nF\'WB#@E@TJcAfo[B?Khd[-QcJ]QqDOLAS2Z"KssU?rZ;'eTq-k7(S\,smOG7A2?YBKT<.,+X9869um!CN;fPQG["hrNtXj>tsEbP/ZmY=EVej>Q#@4XA;l[aU1?d=7`N0gn1gJ'`Oo7NJG+!g`K9Bh9MR>/anJ"s4aHYLGM/lgqc+drH?tM_n2fd"0b\d[hEKUS<3\4I:^htlP^-4Yi@Cj-,6M~>endstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000553 00000 n -0000000830 00000 n -0000000964 00000 n -0000001246 00000 n -0000001351 00000 n -0000002715 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -2766 -%%EOF diff --git a/z3c/rml/tests/expected/tag-blockTable-1.pdf b/z3c/rml/tests/expected/tag-blockTable-1.pdf deleted file mode 100644 index 2aa72743..00000000 --- a/z3c/rml/tests/expected/tag-blockTable-1.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 266 >> -stream -Gas2Dh$V"Q%#+-TH\ZZ&"hUVu\d@AMkcVQ1ncDbQrt+l%_(IckJs+QFnDtpnKZ",;]rHVi,;'7t_&JJ9(-KWr_r).3oOKb;biTt5WpcUILrX:mmrLk`;dMiW7NjB@-uUpUML/>+X$?,F?SPouP182_N=\,Ne+@;lI7@9h1~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000569 00000 n -0000000742 00000 n -0000001019 00000 n -0000001154 00000 n -0000001423 00000 n -0000001528 00000 n -0000001937 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -1989 -%%EOF diff --git a/z3c/rml/tests/expected/tag-blockTable-10.pdf b/z3c/rml/tests/expected/tag-blockTable-10.pdf deleted file mode 100644 index 9c744f53..00000000 --- a/z3c/rml/tests/expected/tag-blockTable-10.pdf +++ /dev/null @@ -1,183 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 12 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 11 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Annot.NUMBER1': class PDFDictionary -6 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://google.com) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 72 - 741.6535 - 297.5 - 770 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER2': class LinkAnnotation -7 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 5 0 R - /Fit ] - /Rect [ 297.5 - 741.6535 - 523 - 770 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Page2': class PDFPage -8 0 obj -% Page dictionary -<< /Annots [ 6 0 R - 7 0 R ] - /Contents 13 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 11 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R9': class PDFCatalog -9 0 obj -% Document Root -<< /Outlines 14 0 R - /PageMode /UseNone - /Pages 11 0 R - /Type /Catalog >> -endobj -% 'R10': class PDFInfo -10 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121220121136+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R11': class PDFPages -11 0 obj -% page tree -<< /Count 2 - /Kids [ 5 0 R - 8 0 R ] - /Type /Pages >> -endobj -% 'R12': class PDFStream -12 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 252 >> -stream -Gar?,b79+X&4Q==r52g7M*MF\(<2&*e/U`B6%84$DM7$lr&_ck;M-Wk*=AJHM*X^:fAHodBKG$(!ifW(gd^$H-FAR!tm6?=]l?5a[T]REEuPQ"p6mUTb#qCs3"1]/1Ers!hT(`$D8^//LnUW5C:Ps$jM3+*Y#G-=SJ~>endstream -endobj -% 'R13': class PDFStream -13 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 159 >> -stream -Gar'"_$YfK&4Gspq[[bT4f$buke3Wq$>j5OTN"2kdJlEJJcUuSjtOFQ/$SOhokt&+MFT0.#ON\kGj#Np19F5jYdHjc`DiN>d:'=phZfrogLRq_`]:XG!d$oZ/^#jHDpT)B^I#(;'+RjrT/.5>pniRU#NV="Vu~>endstream -endobj -% 'R14': class PDFOutlines -14 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 15 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000569 00000 n -0000000742 00000 n -0000001035 00000 n -0000001257 00000 n -0000001443 00000 n -0000001750 00000 n -0000001887 00000 n -0000002158 00000 n -0000002273 00000 n -0000002667 00000 n -0000002970 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(-> -startxref -3022 -%%EOF diff --git a/z3c/rml/tests/expected/tag-blockTable-2.pdf b/z3c/rml/tests/expected/tag-blockTable-2.pdf deleted file mode 100644 index 0a52ab6e..00000000 --- a/z3c/rml/tests/expected/tag-blockTable-2.pdf +++ /dev/null @@ -1,140 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R - /F4 5 0 R - /F5 6 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F4': class PDFType1Font -5 0 obj -% Font Helvetica-Oblique -<< /BaseFont /Helvetica-Oblique - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F5': class PDFType1Font -6 0 obj -% Font Symbol -<< /BaseFont /Symbol - /Encoding /SymbolEncoding - /Name /F5 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -7 0 obj -% Page dictionary -<< /Contents 11 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 10 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R8': class PDFCatalog -8 0 obj -% Document Root -<< /Outlines 12 0 R - /PageMode /UseNone - /Pages 10 0 R - /Type /Catalog >> -endobj -% 'R9': class PDFInfo -9 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R10': class PDFPages -10 0 obj -% page tree -<< /Count 1 - /Kids [ 7 0 R ] - /Type /Pages >> -endobj -% 'R11': class PDFStream -11 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 386 >> -stream -Gatn!b>*^E(kq]0]YdmHM1r_35Y6nBUTE7"_l`XG2rCAR2W73&1?%rVAC+GsKJt$;(T6&)ocBWI'uGo^<*(l]j*3h.Gm=5+TW$W97H[*Fp%p8l29a"#&a9.CS#U2i\N\'QU-U0phThNW;NdFrN]81O6DRYalYT'pbfF8a%EKAQ0e#MTCk>P\3l&9u':aN!HA@paN5gST9m`r]acm[-D=^q4T7&\YFf[YHUH;BVk%\`(;p'dIWW.QPMO'a+B/#P7T4Jq)SZp)hX?:[XW^tY0mV$U\-]NG:M1':(d4bn@^J"Ic=3~>endstream -endobj -% 'R12': class PDFOutlines -12 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 13 -0000000000 65535 f -0000000113 00000 n -0000000257 00000 n -0000000422 00000 n -0000000593 00000 n -0000000768 00000 n -0000000949 00000 n -0000001105 00000 n -0000001384 00000 n -0000001520 00000 n -0000001790 00000 n -0000001897 00000 n -0000002427 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 9 0 R - /Root 8 0 R - /Size 13 >> -startxref -2479 -%%EOF diff --git a/z3c/rml/tests/expected/tag-blockTable-3.pdf b/z3c/rml/tests/expected/tag-blockTable-3.pdf deleted file mode 100644 index 0a52ab6e..00000000 --- a/z3c/rml/tests/expected/tag-blockTable-3.pdf +++ /dev/null @@ -1,140 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R - /F4 5 0 R - /F5 6 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F4': class PDFType1Font -5 0 obj -% Font Helvetica-Oblique -<< /BaseFont /Helvetica-Oblique - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F5': class PDFType1Font -6 0 obj -% Font Symbol -<< /BaseFont /Symbol - /Encoding /SymbolEncoding - /Name /F5 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -7 0 obj -% Page dictionary -<< /Contents 11 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 10 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R8': class PDFCatalog -8 0 obj -% Document Root -<< /Outlines 12 0 R - /PageMode /UseNone - /Pages 10 0 R - /Type /Catalog >> -endobj -% 'R9': class PDFInfo -9 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R10': class PDFPages -10 0 obj -% page tree -<< /Count 1 - /Kids [ 7 0 R ] - /Type /Pages >> -endobj -% 'R11': class PDFStream -11 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 386 >> -stream -Gatn!b>*^E(kq]0]YdmHM1r_35Y6nBUTE7"_l`XG2rCAR2W73&1?%rVAC+GsKJt$;(T6&)ocBWI'uGo^<*(l]j*3h.Gm=5+TW$W97H[*Fp%p8l29a"#&a9.CS#U2i\N\'QU-U0phThNW;NdFrN]81O6DRYalYT'pbfF8a%EKAQ0e#MTCk>P\3l&9u':aN!HA@paN5gST9m`r]acm[-D=^q4T7&\YFf[YHUH;BVk%\`(;p'dIWW.QPMO'a+B/#P7T4Jq)SZp)hX?:[XW^tY0mV$U\-]NG:M1':(d4bn@^J"Ic=3~>endstream -endobj -% 'R12': class PDFOutlines -12 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 13 -0000000000 65535 f -0000000113 00000 n -0000000257 00000 n -0000000422 00000 n -0000000593 00000 n -0000000768 00000 n -0000000949 00000 n -0000001105 00000 n -0000001384 00000 n -0000001520 00000 n -0000001790 00000 n -0000001897 00000 n -0000002427 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 9 0 R - /Root 8 0 R - /Size 13 >> -startxref -2479 -%%EOF diff --git a/z3c/rml/tests/expected/tag-blockTable-4.pdf b/z3c/rml/tests/expected/tag-blockTable-4.pdf deleted file mode 100644 index db28e361..00000000 --- a/z3c/rml/tests/expected/tag-blockTable-4.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 399 >> -stream -GasbWbAP0N&4Q>Undfr4,%3SIa2([(7Fe^/VNQFZ7mLg_#l]U<endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000569 00000 n -0000000742 00000 n -0000001019 00000 n -0000001154 00000 n -0000001423 00000 n -0000001528 00000 n -0000002070 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -2122 -%%EOF diff --git a/z3c/rml/tests/expected/tag-blockTable-5.pdf b/z3c/rml/tests/expected/tag-blockTable-5.pdf deleted file mode 100644 index 371177f1..00000000 --- a/z3c/rml/tests/expected/tag-blockTable-5.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 520 >> -stream -GasbX9i&Y\%#459qB()987[RHVMg*e+;baN!p#(qm#+GF@tG)<+"+&bL"]:m`,F^+JYYeis7Hu^f"l0r5U!WJ:g.OO:N5dNj?$(8`Kge+SeE/ER\B"8#XOLEeHTVJf?,BTS"(0i)ppE`4gkl_<.79@tqq6[4K0:+=+e*7m0Mkki,*S2ao)tE9@F5EcK6c#0>?$.TF\Ufp<>Hcsp[P^9qdO$N3&*)ap9`u7$RjMK!/2[.FTb,5!#C)4`mE[PA[7hZ,b7mu4k2*VD9T80bW\W:Q[ltJ#-=a-dkVFr.1)@PVT8?F/OZqppgTmn\fbJ'+A"^S%]VZfGrW'Q/'d<~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000569 00000 n -0000000742 00000 n -0000001019 00000 n -0000001154 00000 n -0000001423 00000 n -0000001528 00000 n -0000002191 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -2243 -%%EOF diff --git a/z3c/rml/tests/expected/tag-blockTable-6.pdf b/z3c/rml/tests/expected/tag-blockTable-6.pdf deleted file mode 100644 index eeddd825..00000000 --- a/z3c/rml/tests/expected/tag-blockTable-6.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20130304200123+00'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 665 >> -stream -Gau1,cYhJk%*%`?r!ki$"fb,!/6bBe_m#t&d7ZF35hi+=\n&d+g$=\C:&.S"j]!L])=f0?dq?c\T^cOUpZVtQ28XNL^fZE=@%;6Kn)/PoX1rdg#.Ckb\K5b5iWta;+FXHGj*\*+2uWko;hsbcK'?309qV.rfN`iUp^3M2_qWZ/q!`O\oD`U!lZUkg,<#)N"hsAbDj6;!E&jC1M7]\S7&"OMlG.V4<#SS=CP,:3i-!Z3r,qZ;8R.-i'X%/8naO8JkDQoL6(?epc.?8\3#doe]QL.4OS#^)D4pPJep1gI+E>8U$Y1=sY/tW5G#)B9J1]1"NRm+)K!9e_%?t"h>+="IAQPh5gVa.8$1feup#,V_t@jTdg>,lNe'qL?3A;t#1nj?"DE>;_&a]r"AVG_:cRt!2.foW;odV')nO%++KNoC4?M*i`^5"TOpZb*mB8l$EXguUE"Fe7a%p(;6;PFM,o;5^TBf!T67^YYWdrWA/6KZ3~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000569 00000 n -0000000742 00000 n -0000001019 00000 n -0000001154 00000 n -0000001423 00000 n -0000001528 00000 n -0000002336 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\275\375"\226\004\012\247\311\024I9\2513L\031\365) (\275\375"\226\004\012\247\311\024I9\2513L\031\365)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -2388 -%%EOF diff --git a/z3c/rml/tests/expected/tag-blockTable-7.pdf b/z3c/rml/tests/expected/tag-blockTable-7.pdf deleted file mode 100644 index 177bda1c..00000000 --- a/z3c/rml/tests/expected/tag-blockTable-7.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 552 >> -stream -Gas2H9i&Y\%#459qB())PEmM/RPkf<0Yrjt/r\QsLOF8uYu6r9nb9;PVX'UQ[;$]EM>bFc.Y-P(gilZtbUcHN!e^]g"/2(`]7:,*7mCu=)E*e@W>op@`>PBZJp7G#k@l0GCUYE47@;@HLn%pppDcgCh;3\<_e=Is2kP9$4qt_\#HjWCP@hhUY"H2WWnR:9(a^%*8DLOu3tc+6=9^hH:*iPmk#i2Y/04\LXB_-1"T'6^giN7^i:+bIU"o2^+)gGNrU78K(Le3%fQV/1&Dh8pVnL1YgJFWPOOQ1,5:R:r=.QeX'.nAi`9L*^Ud"71PP!<$%uHjW\cqX?N3?C:L8R>^hq+I>uc\9bkI/gUt7iI$;p?9tZ9pm@"!&*3R>;*a5ndZFclN$p%UoGG%ZOMOe$Z7e*2dZ3X\Qrl,DOF=<.##.U'7:-*n^]_2O29Rak7Js'^q'C"$q($o!HI`:nGendstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000569 00000 n -0000000742 00000 n -0000001019 00000 n -0000001154 00000 n -0000001423 00000 n -0000001528 00000 n -0000002223 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -2275 -%%EOF diff --git a/z3c/rml/tests/expected/tag-blockTable-8.pdf b/z3c/rml/tests/expected/tag-blockTable-8.pdf deleted file mode 100644 index 0a9de449..00000000 --- a/z3c/rml/tests/expected/tag-blockTable-8.pdf +++ /dev/null @@ -1,129 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R - /F4 5 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F4': class PDFType1Font -5 0 obj -% Font Courier -<< /BaseFont /Courier - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -6 0 obj -% Page dictionary -<< /Contents 10 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 9 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R7': class PDFCatalog -7 0 obj -% Document Root -<< /Outlines 11 0 R - /PageMode /UseNone - /Pages 9 0 R - /Type /Catalog >> -endobj -% 'R8': class PDFInfo -8 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R9': class PDFPages -9 0 obj -% page tree -<< /Count 1 - /Kids [ 6 0 R ] - /Type /Pages >> -endobj -% 'R10': class PDFStream -10 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 591 >> -stream -GasJPh2[sY&;BS8G_`i*/$7hrN01,H<,F*b]kQdK+<*5`2T_tM[d)Uk4F".Jk$4Gf#Hjk;o/'h2C8GWWG.]R-ZdpVKRQ!B25^bEPo!eh9'GUN:sD)\m,#"LhP(Y:%j[lR3G`)i)$&SMeg$Cl+a+oCUau6GH:AWWd^7/^Uh?M4Sk]oHagflgRKQ^n+L5kXi0MSn'eendstream -endobj -% 'R11': class PDFOutlines -11 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 12 -0000000000 65535 f -0000000113 00000 n -0000000245 00000 n -0000000410 00000 n -0000000581 00000 n -0000000756 00000 n -0000000915 00000 n -0000001193 00000 n -0000001328 00000 n -0000001597 00000 n -0000001703 00000 n -0000002438 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 8 0 R - /Root 7 0 R - /Size 12 >> -startxref -2490 -%%EOF diff --git a/z3c/rml/tests/expected/tag-blockTable-9.pdf b/z3c/rml/tests/expected/tag-blockTable-9.pdf deleted file mode 100644 index e3864aa8..00000000 --- a/z3c/rml/tests/expected/tag-blockTable-9.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 605 >> -stream -Gb"/c9i&Y\%#459qB())87Z_S\k7b\Jfu9i5]2A[*s2g-&7##-3(]Z`Cs=;HSNh&@U=n-Wg7`FmEl6TA9F5VRC&Im&]^\"WoTaQO8KDq?0*h2^PJAi)kh?/n<'>2n[aD#IY)$*D+@9pd:u\d$m_f!+hEl-<"Z0C95e*0BrSP:[@[VV33D:p?E=tq$.lt'JY&UI7>F*N/7.m?7Kml)&V#!_o'0=l3ni>c`6>3;nk:!+Ns^a9(CpRJ*7VeMipVD+q47!"g60!06ZE0*lC;Vnq1ekercZJsTbb>:dXZI5c"^edT7=4X5i'q@SKXL<-:D46endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000569 00000 n -0000000742 00000 n -0000001019 00000 n -0000001154 00000 n -0000001423 00000 n -0000001528 00000 n -0000002276 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -2328 -%%EOF diff --git a/z3c/rml/tests/expected/tag-blockTable-bulkData.pdf b/z3c/rml/tests/expected/tag-blockTable-bulkData.pdf deleted file mode 100644 index 83d0627e..00000000 --- a/z3c/rml/tests/expected/tag-blockTable-bulkData.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 357 >> -stream -GasJN_.nWW'LhbJs6s(.(96LC)MQUn9O2egdQlEE3nDSY4-';ij"hIKTHt4B3'"Mc_SFcUd@<,qM#o>A^_"urQuE5-B6[=_Fg`l6=G\.hUiG,=-ePUjj,H5B\0=DU[5#Et;9ZNYZRf>nN!,jOd/C\)&h?T+/R`c+oo`'h8i7J3:sTNnS@"=$6]e6gbQ1j->\1cR8$C.(ff;YM!;JY_+?)\%gT^$h2imBb8bfh!HmU7LK1!OhY'XMpk#~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000569 00000 n -0000000742 00000 n -0000001019 00000 n -0000001154 00000 n -0000001423 00000 n -0000001528 00000 n -0000002028 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -2080 -%%EOF diff --git a/z3c/rml/tests/expected/tag-blockTableStyle-2.pdf b/z3c/rml/tests/expected/tag-blockTableStyle-2.pdf deleted file mode 100644 index f4201912..00000000 --- a/z3c/rml/tests/expected/tag-blockTableStyle-2.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20130304200123+00'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 742 >> -stream -Gat%agQ'`:'Lgn0ocMIh5f/M!\O_M]"@YYi_"\/_2U$863b=HdipZE6-V6,%*RlQ]S7R'9kaYocWW#_@h7!A+'l:;m-j0,UW#u/k2u'K*X5E4X]s'ML>SJ*cZ[)cq2UQaW78C.OkrX"f`lnXV/H]1D/Q;Ol^5(eJ)c2TWm$ajN03.D.qQBkQe8FgZf\ar>?^<"<\qa((qdem?>Bi(i`9@)9^GD-;7?r,c9J82JXl7bJ[V?KKE9uMU:P8Mn]fameoFFq4(%asCF@I\FWtXi7W6XSg=+&Cr=W[rrY#Gd$.U5Y7T0Bo/cOJO7:fH4""In5:l+Vj^+<7i9jIXcrQJqa.H(&!D^fH4""In5:l+m&I=\0ZCP+&ZNs8;7!c(&!D^fH4"BqQtd/Pc'-Xe`i_tEB5LGRgt=?VLu%AfhhN[/ruAe5JEN>5O6ikhioRs5^>Y;Rd+kpGA_jb4e#.ngd&O+K+:D>Fo&p>kcZ;&E^sZ:GnXd/2]>I?RB^\%\C'AR.Z%Bi7S?_:q@C]HIWprJS(+b]k9\59b'X?k0?Prm'T$k+(.CM7b)ojA"l:XLg*@WRW5dLXDt=\">Tjr*\-$Y[781'Ug-t~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000569 00000 n -0000000742 00000 n -0000001019 00000 n -0000001154 00000 n -0000001423 00000 n -0000001528 00000 n -0000002413 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\275\375"\226\004\012\247\311\024I9\2513L\031\365) (\275\375"\226\004\012\247\311\024I9\2513L\031\365)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -2465 -%%EOF diff --git a/z3c/rml/tests/expected/tag-blockTableStyle-3.pdf b/z3c/rml/tests/expected/tag-blockTableStyle-3.pdf deleted file mode 100644 index c4021285..00000000 --- a/z3c/rml/tests/expected/tag-blockTableStyle-3.pdf +++ /dev/null @@ -1,107 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20131210083347-01'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 212 >> -stream -Gat=c_$U5e'LhbJs)8d\W#"OE2niuF'Ei7Sru`cs>SR-$WQ\0I%7MZtoQ]6+"Ig4Xo9b&N`,\KnLNj$.@Dk;e;6-0ee?c;6Sc]3g-\g:Nr)5+M?gef5Wl#toKbu`co(?Ar+=ZT/g$WiP1e52&0#h"_WE-+5k_>&('6F5@@D1-endstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000559 00000 n -0000000836 00000 n -0000000970 00000 n -0000001239 00000 n -0000001344 00000 n -0000001698 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\017\212\277/\017g\252Q\023\(\202\353\200\374\037]) (\017\212\277/\017g\252Q\023\(\202\353\200\374\037])] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -1749 -%%EOF diff --git a/z3c/rml/tests/expected/tag-blockTableStyle.pdf b/z3c/rml/tests/expected/tag-blockTableStyle.pdf deleted file mode 100644 index c074fde7..00000000 --- a/z3c/rml/tests/expected/tag-blockTableStyle.pdf +++ /dev/null @@ -1,129 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R - /F4 5 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F4': class PDFType1Font -5 0 obj -% Font Courier -<< /BaseFont /Courier - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -6 0 obj -% Page dictionary -<< /Contents 10 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 9 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R7': class PDFCatalog -7 0 obj -% Document Root -<< /Outlines 11 0 R - /PageMode /UseNone - /Pages 9 0 R - /Type /Catalog >> -endobj -% 'R8': class PDFInfo -8 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R9': class PDFPages -9 0 obj -% page tree -<< /Count 1 - /Kids [ 6 0 R ] - /Type /Pages >> -endobj -% 'R10': class PDFStream -10 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 891 >> -stream -Gb"/ebAJ7R$q9mpr"!&D!MYD")^r9G>-GLd3^8_%:4P55,j;+T?V26i@s]I]n[>[\a7p'cF`ke/61P-,lg5q4k5ha:#Y6Z)!G\<:p]b)\jl0j^^l`aB:4("0$11)hH^X$UG/c4s4P_?-mQTjETp3"*YQXG.]L(UtMI&P:nO_b[C%h.H2?j$%p&_CK=?!*?h=UjgU#gLAsi,023()/d\\b-s!t&k*,+eb^s9tJIeS4@4:R.fVCo4AGS4V!Nh'5"m"MTAN++PR\O15014DfY>.YM*A`YXh>`54!`F5^rinocpg.>@$L$_0#+`=ng=Gn4h&V[7HKk$d!/(W,]]\l#`L!g]nm;_NmR?\SgXh7JIjb7G"0@Z]d:=E>_-Y7GEjUDs)]qId#2cQaLL'gpF$I^%i=h'lf8k6HS'.:ukN16pF%C8N..4f56c5O[.Adc7_P)^FHo[p[SE(XIOWcf4h;XpQYid=Z(LL__WMF0_]\_3'(@=U<_>MpVLeF*6TW&8LXg`fa2oG4G&ik$'q8_o'edaaF`OG;PB2!"@>*9Hl\gn1Vu[l[PbR&IaR.8fNdI1im5Bp*q#q!Pn5P1n.]bJc\lQj@(~>endstream -endobj -% 'R11': class PDFOutlines -11 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 12 -0000000000 65535 f -0000000113 00000 n -0000000245 00000 n -0000000410 00000 n -0000000581 00000 n -0000000756 00000 n -0000000915 00000 n -0000001193 00000 n -0000001328 00000 n -0000001597 00000 n -0000001703 00000 n -0000002738 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 8 0 R - /Root 7 0 R - /Size 12 >> -startxref -2790 -%%EOF diff --git a/z3c/rml/tests/expected/tag-bookmark.pdf b/z3c/rml/tests/expected/tag-bookmark.pdf deleted file mode 100644 index e4774d51..00000000 --- a/z3c/rml/tests/expected/tag-bookmark.pdf +++ /dev/null @@ -1,240 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Annot.NUMBER1': class LinkAnnotation -5 0 obj -<< /Border [ 0 - 0 - 1 - [ 1 - 2 ] ] - /C [ 1 - 0 - 0 ] - /Contents () - /Dest [ 11 0 R - /FitV - 56.69291 ] - /Rect [ 72 - 730 - 523 - 742 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Page1': class PDFPage -6 0 obj -% Page dictionary -<< /Annots [ 5 0 R ] - /Contents 15 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 14 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'FormXob.ce52f900887bbd9ff9881c236099059a': class PDFImageXObject -7 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 86 - /Length 3441 - /Subtype /Image - /Type /XObject - /Width 130 >> -stream -Gb"/kc\l$s&BFP1_2Dt)$d:1-71_WG5t""8d$&bf&I]R7/-[n]Ci0j46p]$_"a0tHAPLlrJ9CjJP]Q3:qi]L#Fa-T"Ac's+Mn;AA&B6[X-o?:8=&#D:N"#.Sd_Jd&9nAMZ$Rc?Cq]/Y@kGCugmI;S1MEQ=hE#?fu]AM8aaT1Fe#Q@"WD]Ve6J*7aNZ3-FN9]5r]/8)?iJrSUU\&9qs,l-cZ%,@Ga:aj1tI*.E%7]"0q@K7*%X`Af\njiWkC+51"lqO*V0*PI'PBJf1OT02\,Erh63ZEf)S^]!jfHpmVVo1#\nh"B/Yc3VT5AJc=Ij'4BjV:+2kk67ig(ZqPk)\b0r:qcXj)4V):BjW1aG9sr[">($q&@&2IVjUXKB`Q6S_#QPVQ<*!=7!gZ)uuaUP>9uEFQc49!Pn$gdSY2"9^dV)^&'O6ZPLEmUUKj=0GrtOFg]EA_)rZ&;rVG*uIo`F7LH(Ktl%Gc6>hI=B"D!/K;VVAbkh_dMaT?"DMF),S/hm>a3)l7K"=C+Ak"]sJfAU=.%EUKQU+N.i;Q//H.6[FEoi_BsN%kVaghJClIbg7+JB.Che#fJj1ZLr,IdH\qC])p?cEfgQim'seq:@jhddafm@3jBfh:gMK;$:u_Tu`Ef5+:,^BULR&2*)B/@nCjXR21K+c_NWo*aNDp9X1"d!$,2'E=2JJn8C4$[G>uV@nc,FbWK.kk;5bN[lL.ac+H'4?u]gpgIb!9C[Nt'diDUboZDk3Q6bqekZfLKir0p'T.OkEb0"GQhe^7P5tiPEKg9`>*6*8=eoGBkm.`S8P!!VW:p8uuM*7C(XQ669?@q5$Q4JD5R:NNg&#\*=Lcs_Ys-4ti8M=plM2=X[jDgXP`d5!5=A/'/D7IZWLoh%R/5#uJD-R#!Ct4c/.JK\;hPKdHbZ*&omX+;2N/bA=BSmAO_!:.d7kKp`k(#fe%"%)Bc>TQpKJ^XW)gN/-g9n9KpU)/\f1$QU>slYX%2rG"CReW\5cHb`#!.+i12ka"f!N[]nrqE:aVl=hB+OEDSh8`2^pdo%QR65*#mk%-#X[",Ofs=\_!N!>3!HV)troQI\?^9^#=7,?QpZadoGqfh>,"Q3`/l#;<4!6LL(3mqm;>D2;-DSjMNd2a'#ggd(q3&M5_iUbYsb]ja""]dcA\fuB?iiO&!^PLOi35WqkHR'-KR*aWf^n:jJn&Tb3('.eah]JEM[&j5^)dgEdO)BF`>l**+9SmWp06Tn\hjj8O#guco7C$_cFSN8udG_'JXgj(:e9P*nnOK[6iK?kn>.LPi?]flJeri[+^]1DMBV`UbNOnV1U'HA3WA`_,Z[[YiY\F\l."XWK>CNV82<:lUW2MZ6]R1"(Qr"9LlJ0]N3]b>>DbL9h[9,de1[W?HDg'Ht=lel/IrgDER(cMeqYC#aZQTG"aM>=r:+og:N9?@rW_D09;hA-aAd$\gEY138bbi'P@0Q6YOP7nqSA49.ffNT8-`cPF!35;&.X&;Js0qoSkiQG5a9P8WsU9K*A$nP[U&kMU"o>YqIs9[^M%D9[uVM0$DR/kl(\cZXB55OdZGEad#;2dKHA#SogbAU\HC\3:Ss4hN7P.K,`5-`og&N[dDq)aI.f@Q[uXZq(#J"84k7RM9GI6Eu=ob5#K["qZi86D#mOt?F/UJLHEq@EFtnV[YYJGC0N2k#UGs_O)`e)0)d_`U4<:#BZoVfh*cco3&^>XC>$l0:NDf3PVCPLkT+K[Gj[;*Mi.`B:GfhIC(l@kjVkHl1:7`XP[)fE9FEV_$!\TETGUITa(dFf,"t3A+]Y"B=CIq/8;/4FH0h2\_-'@F`\hoa*j-]Y^3`L_r8h1=p=Yqo:=/;_DBHiBuE=[u4d*$B&Ie"+Raq&W57a\Ba#YK`!"66+NaMM5$&r>Bgbs;^cVM_sYUWoa3HQEjJX@)NI.r?q0!VETqhE@j3RfpT"pBK,="rZ_6UM,J9AsiZ&.PVuI"=kH,W`(^\H^L/0Pl;f($GEt/HKdKa-Z[#mb4Qck:NdTka@p4=AMKW!n2kO%iX4a+%PsVJqh'Mg+P*jW\U+Mhj#iUt8&bn)#YWO)\+6#NT0,TqCkQIFZS_tQfq9j]iEWVSG/#.HH;1Ks+:^BgHYq798DlD2M\)Jj:bFB^hgC\o;H:%"`HcWs\CTB1n`h!$E@9Mgk%VV"54r_tmMGA@":V56%)>K12KnD(SlW7A\OSmlGX,:m0V8WqK![YP?b0[4SD:rC-*s.&GJA78Y!'=J*A3?!5Hnp!m]cU73i^-fm[`,^NS554-[-=Z5\`Bk;o;Z;nQGDC::$=t0T\E-1Y=kP3K%I"HS5IogSDcLLBO3hleVhS@CWc(mO8<;,DEi0!5GO>7RPopn9ZYXJ#O"H@C(tsj/.PI+-Y"pJ@=gj.uGFR3Z+[*^=BVXt$Cc*W1/+-B5+alZI1hBZo-/BldS`68Ql\;k-:(?g%7u7$pCe%rKe94K)B.N>\f_[4(&VtcnFh/?.eBk5GO<,P\GA;#]]3$>VTQBYBGrpH')5Y:[OJ_i^9Kd5i5KbtHR>X\kU)%s5S\FmonqYG2qrh)*9t?/cqb!YMa/8Ub@.B+9K".)ZAlu_*NdqGMqYu*bendstream -endobj -% 'Annot.NUMBER2': class LinkAnnotation -8 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 6 0 R - /Fit ] - /Rect [ 72 - 653 - 523 - 742 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER3': class LinkAnnotation -9 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 11 0 R - /FitV - 56.69291 ] - /Rect [ 72 - 641 - 523 - 653 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER4': class PDFDictionary -10 0 obj -<< /A << /S /URI - /Type /Action - /URI (http://www.reportlab.org) >> - /Border [ 0 - 0 - 0 ] - /Rect [ 72 - 629 - 523 - 641 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Page2': class PDFPage -11 0 obj -% Page dictionary -<< /Annots [ 8 0 R - 9 0 R - 10 0 R ] - /Contents 16 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 14 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.ce52f900887bbd9ff9881c236099059a 7 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R12': class PDFCatalog -12 0 obj -% Document Root -<< /Outlines 17 0 R - /PageMode /UseNone - /Pages 14 0 R - /Type /Catalog >> -endobj -% 'R13': class PDFInfo -13 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R14': class PDFPages -14 0 obj -% page tree -<< /Count 2 - /Kids [ 6 0 R - 11 0 R ] - /Type /Pages >> -endobj -% 'R15': class PDFStream -15 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 254 >> -stream -Garo<_$YcZ&;KY*n*kP-+E^`,%AH4S?+L19!gY0E\g9YGh`A:_7Ei'\bl72ih[i*f`:ptM((*?"+9?Tb`I86'_+M8`eTIhB-3?aiNL[&HK3flo?=Pb`8P52G*("`O5q5.*ZOAkJ'&IF1Fb7*O\uN*FH=h6f)l-?7pTc-T2="[Tcc>0dS'">SMct1-NA1>OWoMe'q5+cup%o>T(=rV8JVt#.2])&I(u&81gb^Wd=Vt#2mfPYsHNL_&"5DO-Yl~>endstream -endobj -% 'R16': class PDFStream -16 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 296 >> -stream -GatUl]2$9u&4Lq=reF\Z7FpK]Cps\9-I%,gB]J#%!J6Z"rtg^%ck'n'aL)(cUZ8M?:hj>"D"hF9kVS*$Oh0SEZZq_K3Uu)?)*(76$n5i+R=4?b&F7^04X`CII>5F+jP:0?.]Y32jU4U\7g[I!gFs*J_.B`%AS6\C=ul=j]$=t`Xir;(N$qDQX0?VOM@qBT-TpJL&[N*!X2X*G@#EK1YPtms62t?j2CWA>"KD:-QPjl1%q2OYLO8K/f2$0ci9V+U"a[Z~>endstream -endobj -% 'R17': class PDFOutlines -17 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 18 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000569 00000 n -0000000757 00000 n -0000000979 00000 n -0000001321 00000 n -0000005012 00000 n -0000005205 00000 n -0000005410 00000 n -0000005618 00000 n -0000006001 00000 n -0000006139 00000 n -0000006410 00000 n -0000006526 00000 n -0000006922 00000 n -0000007362 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 13 0 R - /Root 12 0 R - /Size 18 >> -startxref -7414 -%%EOF diff --git a/z3c/rml/tests/expected/tag-buttonField.pdf b/z3c/rml/tests/expected/tag-buttonField.pdf deleted file mode 100644 index b11008a9..00000000 --- a/z3c/rml/tests/expected/tag-buttonField.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 162 >> -stream -Gar&u]afWZ&;5BChI/aI(+X`U]5X'(W@[cIr'@+:Uquel>V(i%A=E>VA(4.2pE]j2@G^%r#4bT!6JS6Bj=endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001474 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1525 -%%EOF diff --git a/z3c/rml/tests/expected/tag-circle.pdf b/z3c/rml/tests/expected/tag-circle.pdf deleted file mode 100644 index 46a04a7e..00000000 --- a/z3c/rml/tests/expected/tag-circle.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 389 >> -stream -Gar?-_.pnB$q0Q8r.E9XW0(r=p2sejlE0l7KtV@'s&`j3`sNt$`1WOG_a9iBo):j[7(8^N^P!l[rZiptB`Ft,^+R1dP0:k>tV9G6'\E.(RlrY0&aI12LMsQmt9b,U6Up@PY66DH5%WPf=U99#aI"%UE92_'nr<-KW=>qendstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001701 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1752 -%%EOF diff --git a/z3c/rml/tests/expected/tag-codesnippet.pdf b/z3c/rml/tests/expected/tag-codesnippet.pdf deleted file mode 100644 index cd9507b3..00000000 --- a/z3c/rml/tests/expected/tag-codesnippet.pdf +++ /dev/null @@ -1,107 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier -<< /BaseFont /Courier - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121219114053+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 499 >> -stream -Gau1)a_l_b&;KXE]YcRm/5dL)N%n>e6_l>i>Z)aP*?C@?mDd+.,NDZY3?&hWn>$cn!C.+V7l5640'\Zhl6981%a%$;Wq7-I"Em"8Y:A=uBn!Mt6BgWqYg.+\d_HR0ul8rb"bji5XCR"#Qma"009S)X\q%Dh4cjFgnL\gl2j"/GD.Df\kF,>#bRJ(3kiUg`]3a$'naU2kM(WW['HN~>endstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000545 00000 n -0000000822 00000 n -0000000956 00000 n -0000001225 00000 n -0000001330 00000 n -0000001971 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\331J\232\223D\317\240C\021\302\367\361\310\024\3035) (\331J\232\223D\317\240C\021\302\367\361\310\024\3035)] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -2022 -%%EOF diff --git a/z3c/rml/tests/expected/tag-color.pdf b/z3c/rml/tests/expected/tag-color.pdf deleted file mode 100644 index f0790a92..00000000 --- a/z3c/rml/tests/expected/tag-color.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121220235908+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 202 >> -stream -Gat=a]aDV1'SZ9HhVkuD?u191lRM,Z,2crGeH`Ysb(Y(b/\Nm"-C=2KNpLllWH9GJ\:\0ajRePjM1Ci5&K&(K^sLSih$nn0%6'@7%B:#]I$0>1ZF%t4/4^223,M[s+HFt^W*p4K\!8Ph`X~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001052 00000 n -0000001157 00000 n -0000001501 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(.q\250Z\230\301\305<~\027\177\015\311!\235\367) (.q\250Z\230\301\305<~\027\177\015\311!\235\367)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1552 -%%EOF diff --git a/z3c/rml/tests/expected/tag-condPageBreak.pdf b/z3c/rml/tests/expected/tag-condPageBreak.pdf deleted file mode 100644 index 8a66bd84..00000000 --- a/z3c/rml/tests/expected/tag-condPageBreak.pdf +++ /dev/null @@ -1,138 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page2': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 10 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 11 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 2 - /Kids [ 4 0 R - 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 171 >> -stream -GarW1]aDVQ%#+E`pDqPXK%K/*[^2Wj+@9C"U_\V!'aGi<1l*cIOQClc%\`He\Eqp_A6!mN;Zs1c*,V7jR`X-%4;G~>endstream -endobj -% 'R10': class PDFStream -10 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 182 >> -stream -GatUj]*\U*$q:&Eq1i1Si4+(!UDC3L7*#mpX:)lt.MdKIfg2uB)bESCEpb4f5*YN0#F:+`RQq9CJi"omK9aDpM1M6L2bCC)$FNKh;T1jV:h8M<`S_Y\RGH9&PsNZ.AKIBUC[X29k1C/'n%0>tKq2VX*4O,g0i[F^kVn7=5E!YP@YitDMMOJD~>endstream -endobj -% 'R11': class PDFOutlines -11 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 12 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000559 00000 n -0000000836 00000 n -0000001114 00000 n -0000001249 00000 n -0000001518 00000 n -0000001631 00000 n -0000001943 00000 n -0000002269 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 7 0 R - /Root 6 0 R - /Size 12 >> -startxref -2321 -%%EOF diff --git a/z3c/rml/tests/expected/tag-cropMarks.pdf b/z3c/rml/tests/expected/tag-cropMarks.pdf deleted file mode 100644 index 733258f8..00000000 --- a/z3c/rml/tests/expected/tag-cropMarks.pdf +++ /dev/null @@ -1,107 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 655.2756 - 901.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121221005038+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 289 >> -stream -Gaqcrbt\Bb&;9MCn.'S?'9R/LL:R/-dDIFeYjl@iendstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000559 00000 n -0000000836 00000 n -0000000970 00000 n -0000001239 00000 n -0000001344 00000 n -0000001775 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [("\350\375\356\320\215Z\210\207b\033\340\354\253\247\324) ("\350\375\356\320\215Z\210\207b\033\340\354\253\247\324)] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -1826 -%%EOF diff --git a/z3c/rml/tests/expected/tag-curves.pdf b/z3c/rml/tests/expected/tag-curves.pdf deleted file mode 100644 index 4788e7e5..00000000 --- a/z3c/rml/tests/expected/tag-curves.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 122 >> -stream -Gaq3[3spKl&4HC\mP$$8C^`&+TTu'pK7I7?Iq`MWaF52S)aW[4p1jag`I%q:6>oD`'(j,FhE=sc\+MS;Minqj("_'3BL<_3Z!,1TUMN;]9+DYhe_o6kg,'k9~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001434 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1485 -%%EOF diff --git a/z3c/rml/tests/expected/tag-doc.pdf b/z3c/rml/tests/expected/tag-doc.pdf deleted file mode 100644 index 91860aea..00000000 --- a/z3c/rml/tests/expected/tag-doc.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Courier -<< /BaseFont /Courier - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121221005926+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 387 >> -stream -Gau1+?#,'H'Sc&[s203:%@3DXj6c&R29#jr"4C?,j#QRL&u8(R7K%:+"#gG9G8-:XCdA4:0_`(7EV(/>oUBE\E1qqO.QHBbE;-16&eD?\*4[is\$E&3];c9=pJi*sCJr,CRS*#)RqJhRG([idQ>Ks[endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000573 00000 n -0000000732 00000 n -0000001009 00000 n -0000001144 00000 n -0000001413 00000 n -0000001518 00000 n -0000002048 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(`xD\310\325\334\023j\225\317TA\023\222\270_) (`xD\310\325\334\023j\225\317TA\023\222\270_)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -2100 -%%EOF diff --git a/z3c/rml/tests/expected/tag-docinit-viewer-options.pdf b/z3c/rml/tests/expected/tag-docinit-viewer-options.pdf deleted file mode 100644 index 60c6ea05..00000000 --- a/z3c/rml/tests/expected/tag-docinit-viewer-options.pdf +++ /dev/null @@ -1,125 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog - /ViewerPreferences 10 0 R >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20130307102340+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 161 >> -stream -GapqA5mkIo$jG#V^tdn\X"MC='5Q3OihB^,\Ud^G>/Z``h_[kqaQidA6>8f9*s6I[ln8KNkS#45TFK0b_`%erB=Uc?.]IBOSFStO2*Fc^@!oq$%'?fQK;f9Z(R98#Megr=+5GTTo@/cKAda#SGQ-skM\pp,,p9Y~>endstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -% 'R10': class ViewerPreferencesPDFDictionary -10 0 obj -<< /CenterWindow true - /Direction /L2R - /DisplayDocTitle true - /FitWindow true - /HideMenubar true - /HideToolbar true - /HideWindowUI true - /NonFullScreenPageMode /UseOutlines - /PrintArea /MediaBox - /PrintClip /MediaBox - /PrintScaling /None - /ViewArea /MediaBox - /ViewClip /MediaBox >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000559 00000 n -0000000836 00000 n -0000000998 00000 n -0000001267 00000 n -0000001372 00000 n -0000001675 00000 n -0000001774 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\273\347\273\247iL=\316\215\321\350\365\273\267\302\023) (\273\347\273\247iL=\316\215\321\350\365\273\267\302\023)] - - /Info 6 0 R - /Root 5 0 R - /Size 11 >> -startxref -2089 -%%EOF diff --git a/z3c/rml/tests/expected/tag-document-annotations.pdf b/z3c/rml/tests/expected/tag-document-annotations.pdf deleted file mode 100644 index 7373c25a..00000000 --- a/z3c/rml/tests/expected/tag-document-annotations.pdf +++ /dev/null @@ -1,107 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (Stephan Richter) - /CreationDate (D:20130903113003+05'00') - /Creator (Stephan Richter) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (Testing/Documentation) - /Title (Sample Document) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 185 >> -stream -Gaqcob6e;*$q9oErki$A@%FZmLKdVW/emm^@hj\Y>0$ZP/L!a&h;m?Y#ZVcmf`tn2=DS:S+_M?*L?u,VXe&_DQaNB(gi.n3ST-O!e1QhIA_@n)3XZp2P?P3*uR,9Hc@9%.es4Irm(HXZhHA.Q%~>endstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000559 00000 n -0000000836 00000 n -0000000970 00000 n -0000001249 00000 n -0000001354 00000 n -0000001681 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(lJ\314G\022\361\242y\035\020|\220t\277\256\264) (lJ\314G\022\361\242y\035\020|\220t\277\256\264)] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -1732 -%%EOF diff --git a/z3c/rml/tests/expected/tag-document-pageDrawing.pdf b/z3c/rml/tests/expected/tag-document-pageDrawing.pdf deleted file mode 100644 index 94df184d..00000000 --- a/z3c/rml/tests/expected/tag-document-pageDrawing.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 111 >> -stream -GapQh0E=F,0U\H3T\pNYT^QKk?tc>IP,;W#U1^23ihPEM_TN+I0SHG`Z8C)f;D9se;[CKFd-sTNaiRTicS*F4;:JPNa\iDl!c(WjjT5F95SNS~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001423 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1474 -%%EOF diff --git a/z3c/rml/tests/expected/tag-document-story.pdf b/z3c/rml/tests/expected/tag-document-story.pdf deleted file mode 100644 index e12ffbc0..00000000 --- a/z3c/rml/tests/expected/tag-document-story.pdf +++ /dev/null @@ -1,107 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 174 >> -stream -Gaqco5mdZJ$q9oEhVl(F_:k]iNa"ehiC4)t!(R4W0KAf6Qkg8ZiG\;d,D9_t/T1`q=0.Gc@d!n>6(hj1e@W26oOYQ@8[;lC-&&^gABb=s##%h]9LD%N3endstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000559 00000 n -0000000836 00000 n -0000000970 00000 n -0000001239 00000 n -0000001344 00000 n -0000001660 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -1711 -%%EOF diff --git a/z3c/rml/tests/expected/tag-drawAlignedString.pdf b/z3c/rml/tests/expected/tag-drawAlignedString.pdf deleted file mode 100644 index c8643460..00000000 --- a/z3c/rml/tests/expected/tag-drawAlignedString.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 422 >> -stream -GasbW4\l/7%#4LKr=9qd>%l_O+&4S56%Xs```pRl"A!+_s%E,jpT=diTTeeu4SRKWP7T^!kk#pV!;@N#*XTnTpBhTh6MCTnh/XYHUo_lPWBbV5)7h&oDLfSB\e""BJ$Ck=$N:B%2H^gH(#V^J04I]do1Yo8g!!Q]YiAg0\`KAa[&7E",U+r>0r^@\>FXc3`gA;88bKl\Qo$bmRpb9VSoJ;IN@ZW;3bAi(Q<)0bMe)NX`a_k2GRZ9OF1NhQLmEoFZ)*EjZ.6gH@q'LP6nP?!KDd:RkXDO'k0gI5f#CTFhuAM9B[a#U`LJbmhqEu+L%ipPmH(CFAuGOR]VRDF*)3K(YgH'GB01WX't!NH\d/6DG@4dUL`qZ1"eG,_>6mt'KTCQiNdPl&;KTkVD"#t;hl8C1["f_,@(H%::>H>%~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001734 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1785 -%%EOF diff --git a/z3c/rml/tests/expected/tag-drawCenteredString.pdf b/z3c/rml/tests/expected/tag-drawCenteredString.pdf deleted file mode 100644 index f56cbde2..00000000 --- a/z3c/rml/tests/expected/tag-drawCenteredString.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 115 >> -stream -GapQh0E=F,0U\H3T\pNYT^QKk?tc>IP,;W#U1^23ihPEM_TN+I0SHG`1,I?72-)Cc1tON^#g$)nn4:gGa]Abo0?Ql6do6Up;@(YOlVZU%!W]l;'T)~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001427 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1478 -%%EOF diff --git a/z3c/rml/tests/expected/tag-drawRightString.pdf b/z3c/rml/tests/expected/tag-drawRightString.pdf deleted file mode 100644 index 10864891..00000000 --- a/z3c/rml/tests/expected/tag-drawRightString.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 115 >> -stream -GapQh0E=F,0U\H3T\pNYT^QKk?tc>IP,;W#U1^23ihPEM_TN+I0SHG`1:#E90N0Y[1tON^#g$)nn4:gGa]Abo0?Ql6do6Up;@(YOlVZU%!W]pN'U&~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001427 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1478 -%%EOF diff --git a/z3c/rml/tests/expected/tag-drawString.pdf b/z3c/rml/tests/expected/tag-drawString.pdf deleted file mode 100644 index 6327dd44..00000000 --- a/z3c/rml/tests/expected/tag-drawString.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 114 >> -stream -GapQh0E=F,0U\H3T\pNYT^QKk?tc>IP,;W#U1^23ihPEM_TN+I0SHG`Z8C)f;D9g^f/$>2a]6^W8Bo8uendstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001426 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1477 -%%EOF diff --git a/z3c/rml/tests/expected/tag-ellipse.pdf b/z3c/rml/tests/expected/tag-ellipse.pdf deleted file mode 100644 index c463c502..00000000 --- a/z3c/rml/tests/expected/tag-ellipse.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 425 >> -stream -Gar?-4)Vtj$jCt[^'![8MC0K.hKa9^#L_UaVTo>6<`k(C`Jj!89tghX3#I3r5/mn`OT?L'#`AhW^IXUIN(H1c]]-Fla1!J5q'_RB+Z0X.^'\r7Aj#r;g8eal<~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001737 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1788 -%%EOF diff --git a/z3c/rml/tests/expected/tag-fill.pdf b/z3c/rml/tests/expected/tag-fill.pdf deleted file mode 100644 index c52f238a..00000000 --- a/z3c/rml/tests/expected/tag-fill.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 180 >> -stream -GaqKg]ahn5%#"@GH&%k,%$'_P=Y%>,QoCrH;]0i[Jc$XkZ=Me1h`5<(>4LhR!GiM&#D3]T$`p/&:Y]^o'D]@Ppr":JV?H!S$P'Y38JX1>.$ZE,/Ib7iqK1paL1Eb'k0kU=m,*iJ*?J7%VR8oV.r)eDl3@.#o4;7ig%3GthC^N*L*)Nm0C8~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001492 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1543 -%%EOF diff --git a/z3c/rml/tests/expected/tag-fixedSize.pdf b/z3c/rml/tests/expected/tag-fixedSize.pdf deleted file mode 100644 index 088ddef0..00000000 --- a/z3c/rml/tests/expected/tag-fixedSize.pdf +++ /dev/null @@ -1,57 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -1 0 obj -<< /F1 2 0 R /F2 3 0 R /F3 4 0 R >> -endobj -2 0 obj -<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font >> -endobj -3 0 obj -<< /BaseFont /Courier-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font >> -endobj -4 0 obj -<< /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font >> -endobj -5 0 obj -<< /Contents 9 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 8 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> - /Type /Page >> -endobj -6 0 obj -<< /Outlines 10 0 R /PageMode /UseNone /Pages 8 0 R /Type /Catalog >> -endobj -7 0 obj -<< /Author (\(anonymous\)) /CreationDate (D:20140724012716+05'00') /Creator (\(unspecified\)) /Keywords () /Producer (ReportLab PDF Library - www.reportlab.com) /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -8 0 obj -<< /Count 1 /Kids [ 5 0 R ] /Type /Pages >> -endobj -9 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 522 >> -stream -Gb!koCMVZY'`B)oIlQ?N'rL3R=<i),3L3\_#o+jg0Ve+h)r5HS5%QBp`NJ?Mh6\bP%6%^%*nl.aq"[R.GQ9$?_3$u:H$irk;"[mfU[2J\5o71g(8k;7>Ie]N(=$m([PE&%Qc<3@EI!;W`n[+DZjY*ZR+7<#sEFVi\LHFFZXeh>E;Am;Z&p#2S0@h/2^@.#K+KtX-%pTUo"j)'t3RN@c8.FapT_gaj]>^]Kg;luFYl?l.QUR0-bT1b4oWUp-kGl4iHX`'1dbIs.o-5k-%DJ(9b4p9_lIj:B'Io?HQIl$Nsq2d;q(lrP8Y>``+~>endstream -endobj -10 0 obj -<< /Count 0 /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000075 00000 n -0000000129 00000 n -0000000239 00000 n -0000000352 00000 n -0000000467 00000 n -0000000674 00000 n -0000000762 00000 n -0000000998 00000 n -0000001060 00000 n -0000001677 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\334?\375\340"/G\207\257^I\030j>.A) (\334?\375\340"/G\207\257^I\030j>.A)] - /Info 7 0 R /Root 6 0 R /Size 11 >> -startxref -1727 -%%EOF diff --git a/z3c/rml/tests/expected/tag-grid.pdf b/z3c/rml/tests/expected/tag-grid.pdf deleted file mode 100644 index 435fa6fa..00000000 --- a/z3c/rml/tests/expected/tag-grid.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 172 >> -stream -GaqdZ0abfP%#*Zri&eRbW0XR.SdXf4/\XND;q(W)9k:dG"QJTK,XshLD/VN*kdWbnSC-5%+[LTdkqRQqW#>=TfPsA\Ht$Iq2lhLte^;OE[>AN*/=IQ\#"k;-X9R76*Tb;#rbCh,1:?AtmSYK0[rth"SSmh$p%l]I"(M$+3ZpK,~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001484 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1535 -%%EOF diff --git a/z3c/rml/tests/expected/tag-hr.pdf b/z3c/rml/tests/expected/tag-hr.pdf deleted file mode 100644 index 89aecb06..00000000 --- a/z3c/rml/tests/expected/tag-hr.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 231 >> -stream -GatUk]*\To&4QI]ro'/X&MoW:N4foA.HloU>T)k/6T-X@%'5;P.A0V43_0i;oHZq-BW4$i\RBY^ALL@k[p!q5O79iY=ep>,jfDS=N0.9;+_+cHe?%15Q;]6`Ubn%YS%.-CEDDGmCUD6TCQKpF^.;RiGkbpH:f]er6&Ia&4\:V~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001052 00000 n -0000001157 00000 n -0000001530 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1581 -%%EOF diff --git a/z3c/rml/tests/expected/tag-illustration.pdf b/z3c/rml/tests/expected/tag-illustration.pdf deleted file mode 100644 index 20298c6b..00000000 --- a/z3c/rml/tests/expected/tag-illustration.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 509 >> -stream -Gat$tbAQ&g&A/tO5KqM()O`m\=sgR(b@jp*H5@p]k(RkjW7).M=NaBQHR8=El$VC3Cb][5`]U"?qDWj4"r-TTm-jd)Oql##-"+J&(@;#3?M!XYDJ!hcIO7p4RfZI':$=4_Ibq#<_4q7D/POgTqNF]cZe@?rGA!jB2)->s?o#qk\;IdHg)Pbg@#f1%#d3^A?Zm]?3AXh.c29n.*2iN8%?=f4]#W.ic7ghoP$QDpC*eM99Kig9W/^?+>e%TgFSUB#%:Y\geT>"W(g195m@rB8i%%`-u$:-!endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000569 00000 n -0000000742 00000 n -0000001019 00000 n -0000001154 00000 n -0000001423 00000 n -0000001528 00000 n -0000002180 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -2232 -%%EOF diff --git a/z3c/rml/tests/expected/tag-image-1.pdf b/z3c/rml/tests/expected/tag-image-1.pdf deleted file mode 100644 index 27c39239..00000000 --- a/z3c/rml/tests/expected/tag-image-1.pdf +++ /dev/null @@ -1,112 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.5b6bc7d162ec057a9a7579a9e03fadfe': class PDFImageXObject -3 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 42 - /Length 2262 - /Subtype /Image - /Type /XObject - /Width 145 >> -stream -Gb"/iqed-;*63>W5!g?bO5M8T&c)c]KYDu6-H:_;Z"da\"Obd-(^_=WXT^/\gpCd/as@U``"FdQo#L9aIc[&=B6SNBpU%n]^R:U^bKT>>mlTFaA^1d@4aQbadA+`Z`7$rBDeqWtIHB$-B.k;*k+^V.k:SEh?N5$:mZXQp%XX0url+9:O$4LfH2"B2iooFAeSd+uUd6*+?X-_1i:QU;Vj@,b2PKf_bEn!tjJ.Y1^]&tDhH:]2(K/u"s7k:=^Z'-M[.WpT`G7]-\Eud^%XtfK`8\*fnK=G((/rqYRB_nLu&!_a%bnFcMQ3VgQ'^K\MrMQAHa?9Pj3%ZbLTj@b<(_ae?g0Pc&0YVnX-rC1iJTGd`)J;#pX/A`29;t,B)Je[X5*.o"r/(,&Y8][Zr=bAJa-Wn:c`u8E%C?g=CY]&1Ifbk2&]=Y["S.i6H(D9)<34dJg=M[/&D)_^()di1Zpo*TR,&D8*_ZB<8\Cm6Fi`$,QD"k1l.CXoAh'r)DN\rn0bQcQbDWhL9PH%ND/'pj/R[=,7?Hm]8HR]$eiec')G-]W7N-!`pitc;(=U-1UW*"g!"Pg3cg:"7JsVQn9H&ggq`M5D6^YpB%UH=g@nu_.h(33QWEN`p<=HE1:pm:NOMkh?R5pk#HB#9RIn52L$]R+ob4(D'VjiF&^q^kF9)a-a4&mHJFJNsjXh?HE!,O>'%Q-UH&K+^oEbbh$p\8/".pI9n>(,B!N=LDKnfq^SR%r];Yn@Xdop-QZc,#(=/&IoM(U/:1([kAp'nCM1&P5j;],dM_$RRU`)b4W+Jb.K7kZ:7J).b;n(,A\\\GZCo&OX[S,-V,^`$>I.T6WRs#/E\Q=E='Np8R&'k]a/[&/nDBp1tgP$ILCQr#N)BKON&6bj)]p:E$m1>W@HgN5f4128U%C$s=WOsuhXJ+Qp9c8B=e'WR-WV#f,10Zj"@[/Aof?(7"o3jhKDu)\1RPLcGa"l)@N[gg@$GQnn9Z16$!_/c1F?HlZfMd1^E7j@L@Z@leHJ`1c$-LVZ_c'@ON`,PU4UUs,n`Zn;mM<7PR:C&,sGOE?d$_F7;2.h8,U@8MWcQrYQaCYZuo)C6=+YS3BL0%IjlNr26`+&*lJbTRJj%V3IYP[unPf8qc.YIK^5FF8t@lAW"Am'dI.ofUOJ+L5p8`k8UHMUD86s>H1]r=/0p`MTONeFR"L=Fpfq)Sml(Coo'Qj7[3^2,bHhESM$5?U`Y1DKRIThe$(O,a)lq>HHa/IrDjOP)T4P;Z4)pB&ntG83QA>,6d#%>\5jOZ;'oOj,fP)"&[bYW+nsoCW0_VT5@RV%Kn^3JZhd.I;[#(Z+/Me6,p6VP66Id9R]"Cb:AS>^W_'QR=UCUE%8rfMOS0To=7lg7OTO%j&Bo([UI7hMkMgH>/Y93ZbZB#RHXoIEiRS?"/I-N%q8;XN6'"L.R'Pghs1oE57VAP;q+l>/(a2F:9EBST(.u-TIj.?0NP*B/\Apc6qo_ci8\9$?_LWuiZp$G:0ldhjTECmAendstream -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.5b6bc7d162ec057a9a7579a9e03fadfe 3 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 210 >> -stream -Gat=b0b2)D$q5@cmbe`i$jMKpC,:"3b0ZD!A4r][r^.!oEWBY'MuS;,,Npmbn$E.$,'3ng)MebD.=uf">En+l"d5oI1?Cm=k-.D(%GSV2[SaT_Nt]k'9qJ`P'G>A==VImg^HS*N@2GrjZ#@f75UNBGa]>E-?\,*CRt9/j$S"1F*o"U8.DB,g>*/~>endstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000415 00000 n -0000002912 00000 n -0000003254 00000 n -0000003388 00000 n -0000003670 00000 n -0000003775 00000 n -0000004127 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -4178 -%%EOF diff --git a/z3c/rml/tests/expected/tag-image-svg.pdf b/z3c/rml/tests/expected/tag-image-svg.pdf deleted file mode 100644 index 96a50214..00000000 --- a/z3c/rml/tests/expected/tag-image-svg.pdf +++ /dev/null @@ -1,208 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.585f847c2171f7da65c88d2a28a02c7a': class PDFImageXObject -3 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 225 - /Length 9077 - /Subtype /Image - /Type /XObject - /Width 307 >> -stream -Gb"0WG?bj6g'@,'7PK^-_h&%L.Tb_`W)tYj$[1n(6a$0`M"ql"1tXDdQDh?N";T93f,eE+Q4?Q+$L33W;0it=,/"e,H(QVU96aSVG'8(Q[QNG3nql`"fsA<^Rrb1S.=_8H(m()N(Y2$"GW>FQ/hSbnD/H$9)aZ='`l@02j2Xrf4q.i+)ErPYZ*?%X1/!rdK`sm%2hY^B>[1OSs-T4BBkqKC2)TM\TWkXs:/7t4^`nGFjmDH;XK7q[RE>DhSXnSLT7&V0ba?u4RnnF46/^]OfOFFCN+*np^.ZNuC]6psF6(X^XXSI\_"<%M:an?Xb&h;(;Er5`8a&OIBS)P;$>p\/=3?O4c\n`.Z2#Lh;VQg&rB,h%JV)8[E\V'/6mEKaf&<^b]g=fY=+s_%[QjANl$mn;M#_Rtq(rBZ),_e"?#`0]5-:2/IK8G[,_I+Q5L+nu#0rVXn\[oA`Unm)MqtJdsfkG/7M2@)ZnaYo0lJ04gET>()f<=/\jQ,CGbfnktgqpopG]#l9"4Q]@+gG'S?Cma[ro1m)%hB0U#DXg2Y*b]J+$+LWgU:r<2f@-qe^`1!S2temMMd:cU*=gR">OT:TM_IR9pdVCk005S3]\cmY2$[8oD\^cc-4DGs8Mn&Iee[?Lu@4L2fIPaE]68VqeQ:4s:$^]O^MpMKT76b8N?(*(mbG?W[VRsEjG:4O22fG"rqnc_-NQdMQtJa6GN$Dmp$:3_=KnIi;ERh`!kW:%1(t=b4*U,*I/+D`6;2n,#lUa0[.NeB]*8HD0KEZ).nkP/JA/bsZ"(gn4@K[1Fmm/!#E'BOL<1LcR1MGP8kPtXV?mP89Rf]+[Ql*.NZ?15l7W0]mbEYGOH=,m)&Y0=WXg(/E:Df%b0%jV.OsJuNViYFcafA[2/8AUW[^+l@`/O@77@@`"U9a)k\=jI.aq`CP&e>8nr'a'=NK"1M%f'tS\'(4=t!6B9MDOhXKGmCHN3tmB4kk,J,^<&%eeMMmC6EcR>,P@)"L'cJ"Ul08#uDneStI/3?p'.6Np3,el;3*fhG))Gk5+$Nq3EE6.BLKCDRb<[n`WMp3D+KDL(Ue-c9/6N&?r:f)us6Hl'"pYB#gaXg)L!h8NO8N^-CWjuIj`!0^6!V0RrReAb>ISM3Df;t;LPJ^;KFg'Z]_Yk8jlPS_CtN-5D@S0QXO;4JZ]_:To%q-2*u5W(@q2iT`suFuD$p^Z]"&jVEPp/M&>lG>b]mQ^:1'?LN2rtYi['uITO*6gi3$@t:7j]ZF2EriB2VZ,X/i9)lr%(n>kf[#G_Q/>-qFMX(=H8d=I>JCki:]EkK]VSB?h>3)6I)MC>-%/!s]=sitK4tl6?)o*D@)"ge=(h5sn"Lq=eVug=f_4XJ)>]Y-+q)V?Zl'fn;j=>Yl\XA7WIh?b_'go&\&VO:X=>%9nPl%j'BVfj2=>).q]$4;o%RXBiG]iPL;TB$D5PCm]2!,A`^6rp#S%UEc/3@+hhs9Rh1URUIoGZ[2:ZVS>/;bqPO__-eHjobPc-Lkn]j0!/?eDU>%B,$sHOKUeR&QBp*Y'.41t%CmS"?m8eI(2hbf<=)MM%fRSoSech*?6%Y*):p1IE*`)q!hk^jY<-Ye"bJnDPs'[ObOb@/TfiidY.SfWeq!c'l%TeZ-<0pRXBdk16Y=IXZafaiPfp.)B:8dH`BO?[hgIXfZGdH90R\X/i9W1GbXfJ*u@W"3J5rj+`hao1""J!oBb/:gUD)KfiEoA0]>Cjo("Ok14i49FOJmsRctk:5/EZuUD5FLIO&AiT3$H''^rd+%i]a#&hKNoTZEWjB,W"ZrEp00=/ZX_%9R@9S]+5nCHhZs1>IQrATX='a=T@rY^VFMHAB5;o]Ff,IdNtd*\,V'6)(P&lI=n$o"9`ft!&Z);q!_^8Ce5bO:j>>&cY0KoY@(ZA=V/h-/a3ra'd#P__"9SZ-TaE%DEWZ`6.Z:5idgNASe)%2)P#eZQK7+;(q(^R$F(cZe`Go9Q]$c[RJrr[+".f0['VkUWM?6;mA)k#+j;?PhRj0p+!2SC@q3DQ:Q[nG>$@L[H"(/hTWG6=?jagW9Y:fD%>07aBKZ`g5;5CroCIS@Weu\VB:h(&=]nn_MuEYPmuo(mK)VB%E<:VTO`[h(Ke`5V]mET8/RH)W^QTEZOfGE2PceZESFQ=H-9ok/6'*i<(RL)>N/iCng$F1dqEY+.>e%2LFm@JU0PEeP0#Bdr&Lf7^$j[-C\$nSFm+CIFRpgoe^#q\5FIY;$EokHG>IRd==Zq0-0I.o3+tg-cR@+A\m'b;lCm$pBp?gW*o((buiA>`fM$qsXVkp5DKnV[9o]YSjX6/R,7Rfl5f<8PeABF2kZXNL"oK0#`6T9&Ha=k=+EoFlhX&lM(qWk=ngkQ6a_83t:dk`I'.Q9;Qktd=8rr2nEr)a&.dt.`2ki`P?>]"=pjlPTcKc]]nE;]M$CY,^p\T.k*F8l+5ZY.Tf>$>*3=I_L!o(;1qOE?ji_MAC,?+=k4`uff3,\]koJdJi\Za2I;Q2EdnqXj#ZI.7A6i.]o9,Y]Zje'H@$Ua[/f-;6^2>[.F-V5CDu%`_10N`%P=$49=mP(d;\VC=PeRd"-$l%_,CO%N&<$%``>>pg1-7k'hdVeJeD0KC+J?sk,+]g+=UCJ8bC9hd/S.m#h^l&Hn>67J:YM2p\LW,:$j)`p?QLHb5?":MahudiC_0MGc-$91qjFP+#dEP`u^^6/ND\&F'q[R,,Q)%h9(]\edog;$nZGW=Y46bf7Xl(5qkRh)hJqJe6M#s!oBA`QcX:p[]L^5q/2^=-8cp@(*PRZe=]T\2^?IK$^-#]Z0m=i<)@WK&:Yh+lSUG?p`a;6:.(-"[YAF'MS)`m7:&-)]BWbS=Cl!RL)OMal(I:jQ'iqGPB\>dEu.OlVJU8FfBl&Hn92bLo>Fdo0UE=QSK6pt-Z(t6/`Lf[J]A(K8`4#o=_jlJ5O%>6.''MS)(/]9?1M2@'1*ZcN8].QFe-*9$OK[IudlcknXN4_2.a\Lml-lPTj&[Lk,dbRmXf[;.P5JW9#Y?X@_'D7I=Cf6qoB)%!QP])Q5uLC^C.no.LPH-1"lU&V!YQ3k]Y$?S-`;]R#%9BFOP$9A9_(8Od2L6Ud*RT)#ba)/OSBLhSNeth2$?4,T*gI;PbAf8]"0qcVW\:tI!iT9[s*1G]-*(U,]Uc2`b]L/Fa&%*:/9s?km0j;9#6IHN[AI4Lr%<[c#n&IC2@_Ij1,Fe!AUZ16UF+G]Qca8=U7S49#2dfEfT(oXKJ]Q#i`aW&(KG<6;g=$Cj+==b6UkjXK&9E#bn,j7'Q)(,b6=eZb3r@Uab/Q)&jO\lg'K+GnB8#Lhk5#Q53P'fc5"oXk9ZU_)?>k2!Xnae+7ui^S,G*??0bkr;#XN)D@OpY.BNmh1;LLA2b,NY(JD.@B1I`F'l8/4-Em-VTnX_*ggB-j?rd;j]dur93M6XJVkL_*ggB"KsO91,<*>>ah.OE@Qm.YYYZRpGM8EEnbkn/e"VqWMuk*\dPHLI+O`sARu!1<)ch=rWRp'EH^d*3H*ceT76Wnr7ViUoI'mLoBIE[OceG.9>Fq-S/j\7FFI/0kKa%r`ud)n1R[YFqCej+B#f@l*]L;?9Sq4UR%:Ul[=@u1LQ%1ND@?=b&K3`S/GE4ep$1'K(UgTRZ*^lKZe7K*3c<_4m\\nkFES`46s!HVq^_!>GOJkN()'Vk+#/1lII6Fh8XdL.;r[F/@VTUk?+P+a:M+5T0>T1g.3StkZEfY2iK,mM_3?obK*ch9I/.f/H90NG6N>SK0HlB@5s`.?Ku'!5&Bm.Uk!2@lGn`1__/*k$@^0&(hS&5[R(VFo?qQrhW[amXJ9odN0N1nKh;$dh>$AKim)R&(CCu^q4U0BT`[3;jNdG1C-:4HS@k`6[.f$^=%m:q'8=JLodKk[Q;-m<>+iGVFn+MGHl3;"C0k85m*mCeMP&Sh4TqTB=lW_1Mu$SI#W1P*_N]cH^%58(+B@YgCeFZ*q*,q]SSJbg"BYGngabFFa$P?XNj2q=B)`\tuBhP*2]>-MJi-#q.nu4=i%b[n!^C7,6K\iVn4?V?Og;k)J)A=:AJ1u:qHG4h)QC!:S"gbeOR\VA@-:5Dfcd.C2CL(3dO3;$mM%JL7I7!0IP_'bm*)+cp"r!\J@#0JeZCmk@l4^GB7#30d:3q22osp]m7i4pQKFYl_iSfodR)jIZP_'ba&4"YX"qr0Lrr%0k-`?h;H9iIcSNdAd;-6q&G^-aVm8+-:q9E:T-B_rJ[C)$TNeN1@6>6mE9SULnsL5#o+[nJ6'h39jo`<9F2.;V/Q%H)A=9oWiN0,K)"io"+;gg.@B0TCVsO(=n):\CGqYVpGo6U@j8jdf%*k\2n,$9'G7tnV-kVq,`jj:_*h0P-RX\g@ZfOlWMt`j5#;S5Cdpsa_I+Q:&/5hsiGb1P"kK%HrNFAd8qJ2,pMbuu"qr-k',0EllcXB'r^83&c-=KY9jo`<,_EGXe^]r_E)Y0%SNfZ2AS#F54$.riplXg$F@RdIj=.uS,0:H/&.f]sa`K1^L,C<@5nt+L"@89;Pqh*W?;V&A8P'4[;]&1R&RN.sjmVZaF>*K@2("J,c-=Kc/hS"Z),,7MDj5iFIV!4%-5'sQ7n=s%0+6bACJ5u]@.$X9NCRtU.@=g`Bd?D]0Td2%.k;hMU8"B6l&JSm2("Jq;,L3O2r#!LP_)JURm.<.&g&2[IWTaVcH=:=\g)U>)A>]7o^m53g<]B2Vu*&NT9GG$+F6=>6141/.Olp\#88Eg,`VO89RD-`R$\^=:(%F;iRR1<>6t2Lf@MrB3h#;>r'*V=7F3?:gWc3HXfSVtmG#*]bEettQd2$WC[B]YEcQ3U_i,=dcq?+Y:Vo]ZG_%cf?gHj>l5?C\Y2ZVRguJBc/i%3%u89s7p=*ZQ/)0sP*#IPe2#gj0>Tq%8AR"g]`S*9PS>Df0G&o6,FDE[44S;c?t-?-+aG,@"$:5)!E3"KORBqJ&^_RQ5Gd\$rin5C"Ldg=tA1I!fC5@n$*K&:\2"@hGp*>tIXB402Sk#4#)g;d1_h4UIItG1.=PtA'q#>:qgp&nBZU`1Ft(.2`J3Ma$N*ZHL*>%].u/ua,_=gh:/5lP>kO^LCP=slVq+n>?_M36:Wk`JKm-6=MulXm-H:E.QVV281cDF(ds=AN3'+^m-X1K_\*Ll&/,]ZeT#_SFgm_'nGn2:T7?i#/F^-`r=-1MHhQfWWV)rPLCP@f\8U7gpuhMHles!E2)SL;[hcOr?r0p+Q^*gN'bpm.O@P?Qg"=rI5(+?&1iaqN>jfOn.TZs>@=ej>IJA4F!_=o(Wo7!`"RpD&`nH_DS2$t@/BN[)`DO-m^qq*h7D_2kEh^/bXYj=XfVbb+B_fSf#hJ]+G8qCl%+D:%LruH:7ZtjcBp>=pW?H<=deOo7hUK;48X+'K=)h)J2J3VUpF^[?G1YB%'6[f6gc!ZI-Bn^$RIT&#)\:q\qSbdeQ(hNAHs&/4+?mWckR?5Vkp4Y7Rf^?If8q@R&p;Q?iN0+i4upHl_#Y\Bt8b@LM"i%aj;u$A3s9rQ*>9p6=*t>nuJXbVP0]WUSG//d38kDJ,ob*eUIPtrJ(h$#47Hi22\9\G68d.VS>/;bsW4=l%?f?[)-5A#D7kHeQX`Bpu2YnYNk*R-K0%.bi/O_"r#Ca[pV*N1rRGThnFNnaN-nV>8rGZRM-erjQ,Bp&Dk0O^TFVT<)chp.(JRUu%1E[;o^m6IFO\giGX%:E%Z6.$'.6Q)eCpXL]>6kS!]SYhr2s]VbWdCEs@qc!=k]Jj2R(*p[8"ZqsWt@mN''4^4#nPh7ImJ4hDU.M8;S(7^?)r5s\r.VG/s,2DDkP[C(k*Ddd'_U4:Q#0UP@i/Mf.;ZEUQ`=f%UW)b_TbZEe4[C'`X=O!lX0\'ET9M=.k?2o3#iFgkHH1!(!Pks1,=H6K5]VZH2da;Dnc$:?XFmUm.',VMfWK#NZ:'-qXgUWQgW_DqrlG&5QCYfPESpM>TERAWtCL)e^`3laiPQIf6)1W]QNP+[C,[q1M9BU9aqO@[r:0<@Ddg7.on3)Zq*h_93khOb*4=g-;57>HM$^c_hS^Bg>gC[5s[e6;,KnV8OZ':4J,J=KhgYIiace)*?G(O]qXoUS+*r0V4FdA.mG#+(KnVJf+s[G2D/J]KP2F:_+[e6t-:2/IK8G[,_I+Q5L+nu#M'39S6=L4QM3&Rk?m6kN0UN-&+Uf\a@L.UCO;PiB+s_msQjANl$mn;M#_Rtq(rBZ),_e"?#`0]5-3F2LQj]nC~>endstream -endobj -% 'FormXob.1ed611e83a1b7667015d6c97b4dcca71': class PDFImageXObject -4 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 225 - /Length 14077 - /Subtype /Image - /Type /XObject - /Width 591 >> -stream -Gb"0WG?bjFg'6I`(2R*WJKbk/m,c0GMIOPbrRe>>`.hR&"Vi>87`@iu0e*rT-q/INdR:Z'78S=!ORG3tM'lXqKUpeeh;uBMaH+-\mPD2]mlc^fqp(g`!_AQ-Jcb*RAS#G$pHd6Ud^F&L.YMO;!!)d**$!b3:EMAK1C"-iQbWIpl`X2n*&qo1Unm(`&$fs#WZQ]biPg]k67$>*IIq*&$Fn+H[3B=WgX]SJ!117nJ+0'DOi'Cdh!WW3c%4WhW*,FX#lM@W*p%A!Y9fg_4ET<.B&7KG^!!!#bhS+EmUe-bgKcM$c@RPKe3S.gD!!)MFqS=mr`mg)l4JtuIk.4Fj!!#3NR$`7[kt(F.c!t6n\LnWt!.Z0%\[e,8]R'7NC<#r1d3J69`Pof$(CL3C^kendB@X4b;GuMc/cYkOefa;Z!'oNeli7#NiZ[Xg!'oNeli7#NiZ[Xg!'oNeli7#NiZ[Xg!'oNeli7#NiZ[Xg!'lL-Q'E("(?XcAAn5GJVPY[f-\(p\+Yb]+/hSb'-71K'1-@Z]1c.$K3&i<7-nm>/+<]V8ldn(5go)-7?+Y:QoCMSJpSS1.0j9rFTbZItH1UasgPCZAkih6_f\#uoq"O77J,K*3e#-"6N7ln;q>'h4,pcgb#ljt`;K6\2KgJ*m6,V2;ObZ_aM[_hSb@hRn-udNrC5j($,i*B8"Ga,V/Z2f@-pe6KS,l.igjB?Z_tC!rf^A&nTDj,\fs%I2]WDti\UjlGLV[r:08FmJ27Rl>6?\8#Dk91hfK>$ALKbEd#"[dDG8K7\\AY?np=p[:=gkg32%7ST7(@EOf`F6:\L\8^Da'e;1YfW]MaeieBR*'&&Xd*V:Kfs=b_>e,4Um^$QPm-O($4?P$,.:,5grg]19_t@dN!)W,`<)c]g6pn5m]tLteq:2NINJrfEXYt%M[!_]?fs>=lW2L+B18IF$*Y_9W)`HbX,WKjp#[LN`Uc-FVsqHX:*+?]Jqq/>-&0f(UIHM$FDPq+4XSueTX5iX-A6T#-SUIL4I%NIHLk"K&dh2<(&g=k9?(4H6+8`%109*b:9Q7Z$9<^s7.hapI6X/`2fhnS((gcR__Sa3a7!'m)D7Rf"5ZD;!NNa**n+*Zbt.'-A^?;a[aT:_aHSXl(4QCOKCrr)`HfN@F6_ns8s^OGS3jlPjqChmh`il):HF7XbQmbPBmj7;r0hRn,4VG%j`B$B2LK;f\J3B>5t;2A2o45.f(ll6!*iJPa%Erk\*RaMGD;g3YJrEl&pUK_=$-k2f.-NB[J"]2)RFJ&DZBQ#7hm:H8bg(HkWnVr!dNXBB.!kRm2E%`f1q:iA*8J[C3N@r8N-aMsJVs9"`$DY5\DhaLcZbSj%Rk16E&;<)lq`Q'M/l5HJ"oL?m(c!;InT_i@QS5i]V:M@)3Ne@6A6)-sq%p$'r'Y-+p9@:>cmJ#5Mslg<_rUkW/mDJjiL]YD4rNK"CdgtB#Hp[@"CWMqmf`f-TYLUM-YT'nT?_@?Q6R?*C>hr@pX:`srMhOOjKl5CEh=Klu9g0M=6rVZ95B?m$@AA!El5,GBNRp0Q>kdu'-;GpC\AEGBl_sK*V.dmVb#d3LiT;&'So^qdo`'cYhnFcHsE,_JfN8(g[?at(6jN3U4p[6SZd94223MkBldA*[JleK$lP9s!,pHm>8id-pk!.7^98;Q1.5e_Z[=J^NIrkjL%+#e)-R[Vssfs;JJ?G(%'.W'%imG#,!G^el'U#X1S;b)-$gpnq:Y2$O,K=[=B7h!s/NPN''3bS=Q5cbg"^qW9,4<'OpFS5uKnY4@3]c-0GONbD1OJlae^W)J='$J$C/hBC]iqm_/bi0\psH]63EtE8\MdA&_332N@9CmFntZ]"/+W*i+FM)`MXsIJVI8aXJntnAC"lbeMiYTgOU8AK^=>5fD3#JVphA[$mH;mbPL)qs?<\0PRm.oXnLaKnX5TBp>sR2Z!7F\[]0%f\"Pic'pQ\il-hq`l?&[+$X`&^ogtT[Vjp$Xf]9Kc'mb;QYU8JbaptElI;dITOZ$&*BA0$Y[PEt!gJt8WRIY&OI)<3>`b59j\=@^U.#ID3YnW/DUbW4f.!SrZ2H`&FP![$Hh?MfJ_n.krujaar9I_i)EiE=q!mCDZ'mCW`k6TgQ7Q1EEokI:ldtIdk\T.j>u+8baH7^%L5+m:SMN,\]m]eOUIUAO]Qdk'DsuiN().Gs*?@jkF`qr:TO/(QHtr:Y?!XE<9$bVC-e%L`G2!UPI&j3EGk^X^bEjlAN/Y2^gW'-s'*,%4f;gW?\>+&5`][$j9`kJ")?ufuJ*u@W'-A;Lf&*haqkCI)[%sLn\@B&IW9EPklR6Ln?aum2V-b!d6-IW@<;XQ5KO$1W4,6">%j!j[f@OB@FQq`"KB\2M[h%`u#>#.C3&*-B/C"YT,9oQm'QeuR8t>nZq^X'C#li>G)`MYR^#qe>]=U/&H.8gs8?G(+-Z5"ljXBN#(;c@c9qXrRrg)DtgUbQWUk07,=CtZCB.s4+g]"6Y*Ds'jO7EIl%.fD%!P5[iWcsj@9rCKLLLI,XkL(.qMY,,`r*d7AMj\(mj=h&Do4WPQh:S0hA_J$f>$'a[!7Z?8r8aP'4+#R*io()2&\#4DZC"&qamm[4QrR@rjr>$.`77BZ;hPfPF;s?H/Q^@H-8+?6GVK\U!(P`J@ZEpn7H@gZ+Gocj4p[6k_cHa;`2?8SADf8G=Q(S@OO>(cEn`7e*Y2?l9a25\[<`ZY`rRS,W4*,K7Dllb>%tb)tVSslWSG8.0KnY5gCtUR!1/b=q!$LN(;Gtf34\HkOC-@5-?@nQ<5+6e"C-&)aUUbikMQ"\?8nu0H%2r45%\,@idYA>TC4:j&m-LE5LXO&HT>1B2TV,]N^k$*0AcaS,TRNS1QApl`Z*Eiqp$3u!Qr(tI&0PEBjlOOB)b9@Je#,u'3B=d$qj-P,VFZW%M0\XN`QOT$WB2U`00aXH=JJ?F^@'2l9q%S5FfLaon'[>2c^m:6X^?SVQ1l4l:!KeE[gKEg!;I(^^[U`3>?fitf<-,SE^WPn93khOq!d6!*jYHU2%[J+%2s?QdUhq+_6[e#f%/D9HLrW!^=8N<7RlAM_-5"(b-J=YU6q\da?T[bmdAr6>;t9^IJ`_drVCZ-*gWP,;lp!/QYmMMgceD#2d^1A^e@f\+qT3:^ZOTlHG<`a-3"D;;X@eZ)V+5#7Y+D8Lr4,=[V/1h_u6OqKVp1k7N'hH[?"ZUp?-1qq?\4cOC0%La41AG#*5P:'/'c>2[mV0)X>H1U13HhSRGIb`;sd+$S;hS"7O()BY?:4@Y@&J5WFnaSHIErA$l\2S?_:rZXB>Nb/2$Mq<)4aSM%-0=@S.-N#[!"i1.;F9D;H?qVpPVg$OP7eK@ipZ?NA]pC>nY)\OEpM:.l8PnO\O*91@UaBOm+Kjc:K+o(?5OLrkj.R7qurqaiPUE]*BJ<3i'BCBf@/4']mD[q7/Q`IVk<34oR$Eb/ON1Z>"=VpV9knoQ6+3$f_F'*Im&;\4?^[FbEqJX.)blHfi,;M5(39(cj'^X;<#X7`4UU"rmRc@e79:.'QC`mTdKCe]mTX=@ZK;c6@7-LM\a^P<+o&4!+LL'XD58H?G2f.H=":2>$U8#N\h46=HaiUNh[$9ls!!'`oorqpc.2KcqPXS&2;T;jC>2nEJ!C4@Kr;TAP0qf?$N!.[>=*d2F=DG9=]fEk8`AYkHK%qV9E]fgkS(]XOI(H?&/&&lN,nSXckq=A7%CB4DH#1g\PiFR?A42K%\al,s=&fM\2FY*Rn6A9K('!Js\gssr?1=!kXV6$bWlZ)t*3.S5s@,^)'P]9`)h9#W^a7RLY,%kH8Nd>@k0h]+GdgA+M2C3&('">sJ.#=%"s%;83&jaSH$O\oSo+N.J&clfd7DHV*eYOU!WiEOj(R$Z'GPLl$NP]*_Ds^JQ'@NOS+))[i49[(!0P9IfJ1$?28\dnW-tGS6lAK(*S7\!!/LlMZP+.?Q'GZ^?BfF>%LroN!WiA#DcdN3L@#2^Y,[kV(uBon$n'^4!3!AGc;%n]B4kFO=]*CsKnXMP$NP^%@m0/k&e^S]K\n=s:Dr?Uj+@Y6!!!.Zornf2$=Zn/I0_oaIt,U#>?fk!_EtD@!]=X9f>-Qj-='cnD;P]9Gn:8Oe`>aGNm:p7,FG)hTC9^7ajY`"BrU5ZFc[*6V4i49[(!;I(pZXZX?AgR[$`EZqa,hKF(!5SVeY[aW=[+*4>M)*B4h7]PWK'RFW!2(73LRk!,*Ktff.-uPmgW4e-$Sde5]+5$L\o:$tfSE!!&^$4m_b2o9n)QZ=-g6<+Kc[9,ZpUkJq]s!!#hS3+l=!b0!=`?XLr84$1(6iaT(5!!!!G=:[KCIt&g+A=b-(EOXCS+%[R.naj-!WW3?@Qj'e@q1qV,IF[J:J^001,UC*L@kcV!!&-Zhp0o?Pa"-g3`n9Y(;L0](M3OOs5ENZIIoJ;\D"98FY-[+\>hS+D2)+WLf:/2:_-NX9uqEnN)/i>MO2rP(\)-R"?TH7Q*lknUOXkL#FeZ5%G[l5Wr!<<-!M#.?*!!!#V`Hp0^H$M-DkK]V[#Wi"d@$c\>Zcg\@V\NROG]EQMAV;'(!3hCSYl"(W;sbC(W2T4XoV@FeFEB&c/c?@_N!TIa!l3>H]BJHlhCV[Te'n?rH\!3hLVYR:sPYMl[QR@+b.'QXiu&_/LaYQNffA7Qt;,li`LiLI5).k>[aG,C4>GB^6hW2O-IKH1'MjQ5K-[r+?Hgpiu*qT6[o`6$+-;oJh-YT@ufB\>^=67ClqXfZYcF)/*C_@D*7'R!J@5+O`W;H$NCe^_?Vm@(MnG:c%9!"qadkNkB\qS\lm,U">):+IOT!;KT3f_n0i"qA.fmlkOh77SS-n)$mW2PHkZiQ6o>$>*057VcTaPWaq=BOeOl07O"T0%7W\iDqq_8*jZC->0]9)R3A:p7s_b'l;9WfiO.RQ#/VR@+q1!=9BtQ-QP,#@RkQ2[[/tX]g]&2/<*dok2UB[Csq'`Do.^^bflLtcpkf0DZp+@W2lB)/j2@g2rR>MFEB)V&7GeD!2?@EYZnYYV5'e1AXnO28'M^=<5n>BWsCce!+9*?@Ag!"QCjeq8Nd>@!!$CIlSGKL\@=5l#@Ri;!:20d/C`8%AiK'qc40gS6pYBqV73r.M\e&5mHm]?3lQ!hIJ7d,RN_"tKHN<:qYKmN8,dQ+p?fN*4So$JkKeFgTc\No!>%c+Z*CqJ:VP]\K<(KNILF"&5\TTC^FpfV6Q\%"D/J.+AJ["+<*!$0%M%X41]W!cjQ'EG=]*DVIJ`^[IptS-(k,-iFo]CDR$]jVlra+K/R5e^;cD/\^n@hH?itAN]Y*%MeWho8`PmO[Y'(]Agq:&g&9\%?7YAVNl-nmLVPpFqf6_N=E%GOK:W$I7<*e6?X$Br\25NupUcqS11qb4LPFZ""%,D$M8@hNeW]%[:s>?=%cF^kDBb92&%?HegmuFoXi@+!7\iY:h1J[:[Z%qO.*$N/W^&Iee]lU$LF?X/W(46pq0UAHMd25X5<\*!J_r5llIrJ9,l6oi'sZWr6MZ562&ILCYJ5I$'YX`:0I&%m.p@-M8MJ!!);pr;:rb!m8$g^d,=L'Be]^!'h5t<`XNmH;_aC3&n-kesQ-7bK7k7;@gVS!2.&_M2C1cG`nYi/tf,X3BI3@i'^UH(2q'RnF1B_58WWo8*q[fH4Y6"!0XIcXN]ANR53(4c0\^KT!/^fli7#N38V;n6Q'NRD4R/c/**TtfDtu&5^iM$M)XD8f.V7R+7!?JCMV+h*eYO6J7L&\0"/*mUQ"g;p#Z*eS%(]e!!([5kN>>Q8%h\q;%_Efr"n[-Q_0nrU`P10!.^G/9MFMAG`n5Q_K@I1KQD;:!5M!/?Cm.9%:u%XhtEE0YbUWO8Nd>@!!'9#;,Q0:tJhgoil!!#hCOcbcjEL)oVR@0IJf2>hSLE4:CW=a:R!2:ne,D-&X@P0,[MX+I2%-QsW!2'OmV56p^:6]`>*Zc%2'jR*C-e?0f3]`^$4U=+L!"fe_*)%5_@q1^hQcF5#9];K^!!)q&EcNr()[)"SM-SZL)V2eY1c1Fg4U=+L!)=4D(>@Kr;TAP0qf?$Nqf'gj!2)NVXK;'anY(oJ\$n"C0'9_b6")qCdaHR2e:Xt-!"b1#\2`=s;a5d2b]PK=LN@V=!;/rZ:6)`i28pQQZVKM6orrL]G@sea_@?Q2&B`2>h;$d6j'5hob0%l:/k=Q5c40h>ZA"'h;oVsC=_2/UEErrb=:[KJ#7Ll"!!$&qV5<^"R2Q_P_f[Qd_`9dY!(g'd;W?Wm5T/bHji.$I;agr.%KJaL"9\j(`mH2<:f+rM/L#uCY[_pQ#D=)t5b0/H-1Nl3rf6m<*!&^io39BkN_>9?=(p"3F\'BY^?9@/X(JlFoY@bKnb=[``ZMMkN(]C?&RdZ3BI3@;=ODQBAS:hEH,u'f-5cJ&%ed=-mnU0li<\b.5!6]\$r8ooC;@eKI;A(F*7N`SFH:IVi7si[4Np\jLQ,Ka*QBdr:lCG4U=+LODOCC^ZS=9P+8&dFY37lcIi3u#XNog4q3R;EBulV>h:/[BWn;1VC!W:7RTXtKS31.m-3d!m-IFEo#m@QT0.C>s8MuO[r5WcG"k=kKAEd'p%;loH*q)4]mFsEF)q]s$i2AjKpS.Xldr=-6URWDUM1ZG;Go8+1\:2.Qom#%J07fj<-WY4:rYLV3\m3d=Rm.A(=E1()&Z#^@:s6Iq!mBK[r.V$R%--U6;LBqbEa`\4F6Y`_1N!embPKJQS.[Z[?HoBXr8'u-#2W0C8jLO"ta&fm+ARQNugFg$lC[-`/'6`-`X5J03Y`=[R`nYB@j:lLCYIjF6:^>ldm4AH:60LmHko8*hJU\KWG:VG""hg;8uaB>%V;UE*\C+;8cBt6@BV,.5]m")B/&!\T@`GolK9>;,L3ThnO[(cCGn5DTk5F(h+,$$u[`6,j^n6gU=5IP1%^N6e0]9k\t"k`f135*&'-'\o[$E-"C=j+SEo;2?SIJA7fFO^erGoSSMaNU&.faN>l)W/3@]l2]9Z"(h78WtJM.OrkSaRsf%'U,brZsp=*76g-Rd'-qG3iZ>e@);j@qp!@/0TdA@I1R#(_OL$_,0tuh-R\6El-5e_>=qMFlQMRB@X?soAAD+8"-Vg2Qb0&^YQND[[UnjgU^-RjBOMGuj!YH+\6ld9!K;`1[>.'6gh()oBpNPoflJ^^\>jYVn?q!piOe&$`AXoBbT*1dsYct>CUK1,n>$=s-[WCWWh7@`-;Guf;^]2ZS6V!.VWM6+BH1L#61M4k%4*U2P_,XQQd%E\^^3s(c>e+Y%Y&idO=]nmQG^)VF7FgOh,"G/D3pk@cS=J6a=C5EB>?fiTQS'jq]!Q38X]i-$0O_i^dA)I+)b+&ZX&gqX"bhsW419%_R^Q(PrnY)(j2U^GiV2.5!1]`fULB$8N]t=EG?gIZ=D;J`D;2K6g;#*],==ip^juS8:7O:bk01f&(U%&P:01Nki5(&\r:5c&M91_r2t#Sf0H$O[,8P.n"iSNGJeB.^[`uigZ*^4sR7n746OsR-.Wmjmhkg6#3_hQCELlP@9]f?).:i:0R[C%m2*$%7b?&Pr7kf;T=7d3CUc`'j@W!3(nnY9c(Q"jf=_gE:;OB]23EP6_uK3l(^n)%>O=Qo):c^d/,7>hrZD%<\noqh`)2c70V-9N_-/*"2VDHsesNNLU?9:%75"q6kQ@=j5gL:4PaJHH-*8T3IuqneCN#?`n'8h)&W`o>6'16dHjAVM2&rDSN=#5imgMN"q>*RA@csOg94ku;56TTR50K9hDK*"Ctc71c^m;L+;c%:?bUp`p?gUq+$[3>ZD+#ap@\t+%ZZF(8k_oP9himUbH&n(ab'g/KXkB9\9-t5eZroTF*3rfh3eV5(RB`D0c2`EZP1t9[jb1+q*GN4<);l0sC33[i.p>UFr$%D[8Q3W$I&"Yh)._Vp=%NYE5\)2"Odp?bMTU?Gi.;GThT8^VEW<`U8)H8N;HoQ"d$ZK:8AJ%fm\_YsB+WH4u(m,Q-IFo='$_@?Ra;70iaY$F+T4BH-,Ao_p4<)f*s^V>trPD+_0SND$J?bU>mCeXZGS,$gLW`9rU)UkT[=&Dg43HA[1rr%39kTM<$f;;93VG3Ne4sECK['VZ,12V9^Sipd8d&n3MIQV2m_M&ACpF+q4HT*5en!b5>n(sn3l0Rd7qXs1H%_Yr5GO-Rj`c!c'h'cn:!`SU'53b>*r?a'e+7g60P$+!@`H\_#M>a9iO"c*uZ%i)j6;E5T<.]`ph"3!lCF?Ksln;(h!XL@],Mn@lA&LAD"+p'S$#Sml**]V$*Ua9lTKP8>0#B\cgt`:J[lif%/E<%MC2.knP:'HLuFMMh/)7!"m9@Ws9>j]mB>i2f@EfKaXmMdF[!J61WEu7uiUi]Mh/9`Pl)#,5bMK?=%)M@Sfl4]fJr\4LoFi!d2$&\nYnlW2QZem+ITko;W'X!"a-=77GCc/Rsrfhpnf21O49Arr)_T*BR;-?!UB-F47!\qtBD50JG180tDGm((IphHhu*V)&jOll-h!uQFX\a+>l,SWd+4%'o+)`7=-@C4.?^*U8"A1\_PuqXKATH5(%VRqXnpmc5euiD"mAR>$>+ZPYIc6SbfX@rV@rk-j]%2=aG(ec'S3p@0(l]aNr3$eubDa7RDiC+Q_FW[;Xs:6\Z#CELV0Y3U0"5XB;`Nm91MNSaG1@n(kVMnDV8!SOQ(!.\Y"`PqiUraobSa,V1pY[PGVC")qOldqq('g-(/2&[>qJ?B9+D,A`f;(_Rhgt&i>+"KE#f3nUKtKT*BJ<+h7NFNiPR$UgJ+i5sPESpQ?snA04<9r2rJgjXJH*a;cVI80V=FB+RlC?GrbcUke9>"s=?Liti7>#7=0>dgIJPehU4#0f]j86nD:u3`>?cI!RPcqU03GGdcC?nZTi7g^Ta7;:*BA0$Y[PER%NJ%<-:L;JSimf''bqDsjQ5JbFm@JjI="Qq)&\iCX]i,KfojdlH1U1KcGN4jOgMK;ZY%Hq!EtEtVH%HC]4B$HPq,p60rPNVCOcN~>endstream -endobj -% 'FormXob.370f73ee3d4c2f0bdd5f20285497f12a': class PDFImageXObject -5 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 591 - /Length 15691 - /Subtype /Image - /Type /XObject - /Width 307 >> -stream -Gb"0WH!F8Bt0sQ/u^F#7_+bPRV"$&29D\"kcmQtM&B>kG*)b>6r4R06kDdf6$?jphhgU<6d3bck0C[7S@SCcrhJ)dbaeR$g\o>VBC8f!",n]]/Yu_S!&PB,(eD7A!+cHC$#us-o?TW[I*J*;CT=D7Uot4mZ/"-i\p!I%VH2m*Sbr-JC\X?d1M#e1fO7N!#.%2,_VtS9J[-M,&&?!O_L]b<<4N'Z=V4.o%0ElCSghnS(0s,kDMNTpM.W4KROIJ`_\]qJ&pWrHmE@U`Usa^gT)JH/:V&J7li7nJ>#msKM1l@MSSRktHT:nj4*=4Z8+13`0AqTlab]@R4M9K"3#%R?_B$lRKe6\ji>Fmn18nDM.UT65:!D,Ln4Emgs$5Z'FXhRpFk++F!Yrj.e9:Tbd51?G<3-NMX61h]_a@$2rdm>:n.DZ9S0%Ls!AKDEG!:W12id&maAd0:(#fYdcMrrJeYWMc=S0EG;)X&gqW'7_sr]6?b!!E`9Epj.@aJ2ITZ!.thV!!XU6!";1J!>pJt!\anr"CMdm$,@Yd'7`@S-3/Z09E58?QiIO]0EE#D?ii"f_$"-WJdK48";?;O#UTP(&53'.+d`6<68/EWKO=j8#f-XO&:t5(+9W@.5mSe;K+L]V"sK?6$plWK(kc8u0F5Jt?k@nr^`WanJ3aGf!.thV!!XU6!#!Jsabc":p$qS*[r:/Y%3&PW>i'bhS_%1pm=c?_(cZJBc^m;3FQqfCi*[DG2Jq/1o[#t]\oiArl)0:G)`DTh\B0p^c^?TPb:gWcZ"(h:,=fVf_@dIoF?1H0NsNP.b0%l5B?tmKGV!"'AE(Oa!sT0IeuY9Jie1lUB@inKO3s^m03l$6c->XoM%c;FRC(QK!)4_qJ,]9,p?gV4:S6LI?U(eOBYL?oa*DV[@ZjZ>LadZ0u'aFJR8r:u*Y+3r'QUV6X,KN),YHM$DudPJ=If8b%"XQ&=%ZuP-G['V[DCD;:`X]FcRlg*p(9Ep9Z,:0Q1?[Qk4MA:i!Ks]GdJ-F*=b;X:le@p?Xg&Vg&q8.FKbr:\*5>HQR"#M2Z2>-qBhf$o:Khr_T7m'$8puC`-Cjo"^&.7*R?[r#sM`0ChT75M5`Pp$DX15[lq?"Ss,Yt>e?+=jic-;4VUg(6AAc;r$e>\XmO,rr;!:W?&ES\3K1M9o<6enA&LMkhQ.4$9/fG^PGf*Km9:\u0t=+mt\(I`^DmH?a[*;[b)0_M&@lD1kWQ2I4"B[76pRX;D_ua%T9)+#IYmWHI4ak]m!uD(4cO"\ME\Za[D&\ck:njHEZJ>`lN;(4o+WY-d[.mC0_O5Wh2Mn[Rl>7\);XRW.M](K=:=9-K*RC=U(&&"cmf?40-MLTkZ1bk?;@OHeq3_@0>A?073@$W0s-U(p6(T%N,EbPcgJ9-@(Nq\dOGQ60/kiAkZ7HF\)5U`M7$aZfsA`_.b_.;#Ha.Sp.YG[j65]OmbBfP,r$-.NCNN`1X?nD7;'r2U=-+@q&n\Ih'Y81`B_.hfmt+[r'm.r'!2o$)00i9^\N:%!D!nR7or.*BTRLO[8k#)+VPglI79]D,uVPkmtT5G*iVKEcU`hM%f]%Zt-$lC!n7^Ab5ZjVjPr5W[cG^n(tbT_[etREcU/`>6j_QZZu"L_nRF`+=^=+XK8KKc^m7EEkm2+4LXGL8G=rQbSW*Q>e>1H_1Mt;+sO0r]diB_d@?_s`5G'O>.o@]Fr(s]='pB`=0Gr]QgO)'>#A.*oN56!'1Be[baR7X7nCZjL4<6AkD%^"Dr7HgT9il1Bu5N0n%A6%l.8t;=Ku;PLst,_o&7V[']f;7kd5Tjp+hg]"7aRJHN*jrjqd;TgY7c+0k07eQ'X+/ir5_Z-:j2A0^I6E&7kY0klT_D:CJM-6\Z$FkbF3O]Y)HQ3Wd,#kuf+P##\Au8Pcp6fs5VX`c^\&nTu-m$2-ktqbaD*]jAH3e,X&580,K%VOT';UCk2Tg2qH1U1C\@=NP<<+*l#P6HE;m]3mMi@r4`/,.u3cuo'/>QPWnA0-!l!>[>Nm.`+VpfM:[&IcgVB\QhTNqrpA1EtuY$If.)M6($Bkci(l-o;oY$8AqFud@%WF5/M]9d\T#c>She'mX?m5-jbRW_-8PGqqRp=Nji'bth+@jIE\2Jb'P5M`qq:JOZ^?.qMrL5%nacpMpjG3mjYeDi/H<#c_7)ErO.XaA[b21",7"Hnq2>.&*VFT'Rt[u4,Omd:NZ`1&Z%)XX97.TonWVG=9>j.`'6*81Qoj6,T+)>IJ@YDr3b4"\S1]rVJ3"0)##4VH+'L_een?3c*G&_t*0\lu(Xj7CtUb(AZPKfs@TUNKADQ\`YSO]L]Y..;6-CT76Wn9HcFI`lsi,Bp\Y)\)2YhBSHE^pSV:8#U;2a[<:fd**XZ`&q8l#2u`aH:YM(kV7O6abEa^j5568@8g&HQl:(PJg;X&.p[6j,M^1Y4g80@._Sa:9\^o?YTgSSChd98Z6G$R?'G_Ie?bbHfcec9Xn%,R_Yok>=`FtfnJV!Y6`5]eXf@mTG'D^gZ1M=ehYJ:(*C=Q]HdNNZ*Rrt/XD)u7N'U;9:hHlJ'L^9,Hefu3mY$JYo%j,]7kAA*$:LT!!OB/JeeQk.'In+;[#7#\=3h:08TL"$UIT/rE5&T5i3HF1O1UgA4675R#]P#P3o'J#F-"?ef68m>tYcs*+2qHjuDiWMWBCi_jM:`Rr>hG_!='g0KrX7N:grT9'm[p\tr]9J$D54IAmHW6&H/)?Vn])`D2/CdgSNG/g4(nM(/6"<]Mi59^]ta@%MjIarM8rUTabL3/#SX]b>-qrtGjsX8hgLi=@gk\(J;O/5L9NZC3IqtF*.NfK-qDe8kAR=^$B#%+'*Y$@t+!qO$8B4lGI_M+H49/+V]4-rjA+=&`.*'\m7mqo[#Z?_Pgk?bT2@;leG5rqPO*?[ob&d@pp\-4C_FJ4)tj;TZDjr;#rPqONC/n(tbD.dtc[LZ&Vep$-\hi'HoV3B;B`qXmb<#GSbOldi^ooD%,qb9ANB[X@"a#hZ76>^,VkR58JN?2\ISKE84\iT7Z^/=;A'iZ%2q'Z@[%!]L9-Rc9d7J;1ARZX;Y_FkG;=Fh`TqH%mGQoAn(p4FQQ8;>S;]MMK+C0@TWG4gnhNLG2fIR.[r:02C"#+dlps3Kjs!`0-RYfLCY"Rb0&o1_1od^.I,g2Fa@@1,C6[,4?+Y9>4KG*886?ldJW,`bmbKsSrqpE#H%tAKD^sJJC%Lo=07WfZQUd&U@H"48JflSVmQqTTmdB.GRegG_X4=Xrh:g3$O8RmtYWuSk8P)KqFS,S2qj/j:o$U/ap#sdjnCu-,Gi4,XqY0GCCY#S*^\q38<[T4@dU"#iW'?icEodZ(i+LB-2>,t&6\hgL\WZmZOJF_;)<=FP,pgOoD2()nk[;fOr(+iL>FIEbB)%UGLPN"uj02E\<)cn!Je7oRah?9,>q*@dh#4=;9^DNOqt&PYq8O@l#[Rq\K13Tb%hIi:8t!L@OX.d(nOCr./m>VQn9R>@/.*^_AHn>,@eh$$R$Eqj$Q"=B#c9Hd$49*d6MS6\]^a(*,Jr"6Z@QCe_pd(upTHODmdBW8n\WiZZ@QESG3d^2IeP&6n+hD+h05jUo)b;5@.Iq%HnKK!*'&&bS2nKB%i;YqO;!P(g#*J\%4E]nfI3)tsp?ftj=h]9oYU+jj?p>u&]Xu@Ug'`tog"EWRD_b]-K#toa$Pu]>;gH-+s8Mt$[VQP[*fqHHP6Ym79)s#UR$Jqg-p'M[Fql-@#c:%43h8m>U0RrD+*NuQ,VUpVW2PMq'd.u3VYR6lWk?$YBib=mJ7+hlf@LhZl@:]&9J_ruPd#N_,ENcGdnFMag=EHQ$T>qt@,APAPG9QE#;\:tQhr%J!+B;[M)fNC!D!X8C_Ra7S3(qTFqpZ$#\KjY?%V\[9Q!G0BNG4lK4&^eG6q5N'[4/#+W)N?@%KT45!;'"FqpZS[L,HY=dr?rg6+q"jj8Xo]:H]1WS.q"RfhLqEQb3tP(KFI0cW"I"XuM93ucUg4/>s588uSPJA4kt/JoJ:GB&P0hS&r;:rr<<2rL_Lni8B[gcSm4&)S;Ksn;-fQ2>"&P]P@$[.Gqtp9>XocBE,mVoBbH&4cRW]DG7T^AKN/S1*VJIcMKnY5s_83LZ!&.0Qq_:5s4`re+m4&*p;e@_iZEg4!U1dU/@$39tM$*6tE=*+d8kR7FM\g)/!Ph-T_*iJRlr2X+P5+hIldr>hXob7.8dcuW9<\_[$7>RRGOF7[>m3LRPS6`\h?>f*3Pc+2$G(HM*pkEWb[OF'Y?nobd1jd?XK&;kp@b@h"b=,tZFe'$c`b!oS9>VIk#+N"91qn[!Wm%:!FPpS"B2F'CGZs`<<-,dp;+trb6n[cUK[hNV(;s#pI2.8$mpu_!*^`;h'EpV)/%9eV-!]t5Oo:2\kB8)1(NHsX&gr[\jU>u!7m6O0[X0Xm?26=@q0"egpfX]d/_b(.%!"T3?1aJ'hi_9@+/Ys+7o-he(ih(!0!+K0XY)d8u7\qT`Drm?SG9H3`TEi/Fc%-KI*s4<`W8tq"RCj6i\rD'[3kg16/56#UW+haek:q";$3UG*e:&//cK#[Q"9Wa=3K+PtJ+-9"$\Zn]3&E3B9*t:S3qb=TDop9e^QT!Q^*[JpHCrNS)lc#o3Xd%?#h+St=6T'ZFIS]*+Oa_1'VOQS3De?t&9SQbd^/USU:UP2ZKYbOKn\XMjb_SQ!%eriPP][g&dM@1dAYT1OW"ItbBEViP&H2?OqNlq#GB70K3;MemcWa\7`tc_YgHj)H[Ago.HJG1bUF2'AXr_KFJ+Vil-g).4ITk#/E!PK#rF<*O16RmLkc%s:P!4Ip@?Y+3W*[hnqq_=:uP7nTCH+X_S*nUlJ\k>jZ#(md0(RLGRB'Ho-jFk?WU:UP9m:Gsd;$'=Q&()7SS=>YQPYS57'b"<`t+!/T/O<8Xtl0IY>;,P/>\H)3<820Mi^OPh88KJ6CO8@Au2)UYo.J&00&.hZ9;BjHH)_+[Nr9MS=u\on),OsZR[/cdM4;(uqE]#E']WF/1c7ruEW!#cDqG=b1jKVt`G34/k0QIs#qGBY\g-kN;"!8.uHR%$!N&uT[K3>4KA_83tI'Fl6ue1Y/8!/<$3k5G2O3LW8g!JJ>2h7`l^4p2OL5mSe;K+L]V#$DX6mOQ*tQiKIhmLfL(+d`6<68/EW,[`=_%9++l^._l=*K%])Yl3O93EHZMCeZ+mf=I/.g]B+[h,6\7o/+#RohFN9C^Ztk5Bi#PM/gQQUNc/n0PsR;?kUA4&&3Jc0($6#:G>S:5+Rn$A,(6Ne)hJOP9?@5eZ2bcQ_nkj#*V_J<%=0\V[uOk@l0Q@a,V1^f.ZOV'[>'6Sih;HeFhH+9UfNAQpciJ/Iijd>lVbj5XIrdDVhg=S'`%9^2i&@Ff(VmeubEM;d6_K's2Y`eu2H@9EgWa\$sD*P89(&9TmQ@b">T,TuXN#*'Io7$>09*-mX7R`a"lJn];k#BT.XV)VMA*TdLRkQ,p_&58QlGBV*2?+Xe%!rpV\0J?_CAEEnr#c>ii_/.r=[C7Y>DeG?KQ+g7ZEC(S!3!%5UZmb!.thV!!XU6!"?.]R%^4I*).TD!(*s]NmdSDQiKH=0EE#D?ii"f_$".BY?nod&*AQR(H@jM0EHi9oVOt-?(tk2Y$>tLp!m,N`PofY#9SEi+ml"gV6mTD_$!+5(G7!5muAGPWmtk+QjS$RP*fFT[V.)4%De9gM\e%0s*)ME+"*+VGi8gs:.Mo?"j,*:%h/ueO[!7'UQ7UMCtZ,eVl(p<-:BQ(W-S!sN>OD0f3a$H4l<)(^'S:Y@VRIL?,@Ua"B/&**BM]_H#jTo>^KLDFk9^8IS;H\mbPKuG'4NG9V>[IJm?!8p!T[0qSrjgQniX=^u`b+e#l#'lJIU)_$!\A>[1T_nO;/3-q.BGgl373lMcWJJgmn:p6qbO@nB5um6VM\_;2^S$>+C%1e5^pVOWm:Q7c:D^u!r)hqt&L/b0\i&O@c:p&BX"-")t0T:_1*O->ckX/dc<>%CC/eJ]K5Kj]L0T76WNEH1O3T79%4^]<)raP38?'/t!qYH@k)ZCbn"@FH"A:r8omb+r0e>ZC2eg"8jn)$?Tnta[2/.-!*Cb3V)&57?l>Kc&f5OROj;H%p[VPBnroB+;;`2jeT.[=&82>S$\@mU9.7_*feILUIe!(a3=m]m&5"H_3fZY)'L1)bQYJdEPGF1TO5";=$e@:q*iC";?;Q5X9kqQ\3)&9E5B`Q^@UFq3h8/";=$%hVR*)?(i(N";'>$HhW,DJh23UJdEPXrU!-,HAb5.4E]p'7oK[?J>#&KmR0N6>5Bld3Kt_>e>0=hg5r/!0Qd=/o*!HAkGZ&7oK[?5b4jPW3!'OhJ^G`9E;onF?32n:MX-!0ED:m*#r3c=D1D:#UY)+WiN26]Y(=^"Mk3PQG:1a=]q/XN?FSg![:5;5:1nW$47,,6:(fh$GciV$BNZJ9L1?5"EEbYXm"t^Tisf;!M$7>K^U_-9sXQ8I'`5G%E)oV.W!:'sG?.L-c!*6^NiBh9oWj$=aQiL/"]Xt720EJ7B[d`YMCr)T00EHFIC:,OV8rT&f$7>M<(D'8:R_Z_SU7rhd>/l"b!.LrJWk?$Y7;Pf=.KK6DVU59E6-TZn/Y1J-/'ef^=[jp;P/ccs_"CiK_-5bl7Z]uq)m';/2M:S,4Ks1X^jZm_=9mbQo:$GcjJWi2lcp%=SpU"EWP^s0p?VlHahie8SD!$$lRM?3k^V-bj,$,Aj';JEOBl'I<9!go.ASPE6Q]<":P!=V@d8)Ln#Mf&t>"gbkSS>.M9'4aA+ds67cd]NY`9*"r7,UB1YTR_2##U[@eBJ^V\0/)$Zqusn>W'e#_daD%Ijf9RR/^EFqkc."pYC^Y2Xr8*ts1oo^pYtFL8+D*s<6".k<,".Z/Bas+"JY:d4s+&:t2qQ]dMPn`!!kFC&%X;!k1-M63LW8g_,aN8'i+?]Kb"";@#sUnf7Y+FnVMNBf0`C"-n*7\cY_73`@;:mAW*]WeUog/Ts>_$!28p5";)/.*`uRA:*80J4Rpj6YI*[&Ykgp1&\pfLg?jK4':?>e+n:o&\'%X"Y?A#mt*.h.7%I$-Eeu)pYMa:M]nH1A!N=E5!D0;X5F)r";rG`,h\u!"WnK`P<3=]-8:.4@*(BoFqm,J5:4I:8u9sN[C!!m$,HaI\pO0h6pq1F.el@b6'c?TLk5gB9TYkc2f?RR`mV$,.M`2Oqcl#^',Y0Dh.7%=Q[nF-\o`f+3ib.>_$$0g6$HIa@"Q%QfiCR3#43lCJ7*u!Y^AMFM]eB0)kit!q>'inX5H@GeODtr*Be_uc-=MP`FZo>$-equ2a<\mcCO!/gh8BScCF^jO$oYG>TdZGbEDV20:/hTnsdttDo5dn>=]rS05BNO^gA6^,p*'A`Mr!+GSp6`P,]esAb\%hO[44gZC(OW?:9r!%8??ph,S"#nBUEbgo\o$31UIL5H]Qist!s`:F@iOd1OR)rLZJ>'7cgTPnLO?Q>*&umOajM1O*BSEi_qgkFG:"[bF#Qk[aIhb_C9eOtGP*UMJeYGM_<+51mHFW2SI[DbIiM1:6)u+GUIL0$#n+faMJ`J:N/Y_hN07$8PJdAeAElF?1G-e%;olZeMs-De_B#g9iHq-&('Jb'5W5%Ndn4a75%e1.;'-\)4&VRF8N\g\OS@o[?SfqHbX$.O)dsqCQgRdUgh#70*DiK&:H[o]X\WX(^"];8Oph(o13571)AVN;a)S`c!'W:!DGLh.R$]Zu=in%%^7c3lNh&-;U0pH1JZChJ:ZAQ)Sr$U8!=CR<4ID952eJKs42Nf&Z#WLPCQ3>5I0nK8jd*+pG<_\@>hVG,@$k7g?H_`f432Ct\[XlcD\EgU:tbeu^/alQJWM1jWgrH&^`>P;3O_jQPeUpk"#FFAM?L&Wec8279'C4']EY3&l_6N3T^qZf/4DZtUc[Jq+l0R@,ca0bb"7F`fRQOc+N]0c(WB0nO]7clp4u]lre3d=^;fG3pdSZ@EtFYHL^`F@J4[%NRTLhp]UaA;%15okFM'^2Df?q2lml"L%Fnp$4beoJ!kp!L"K6D1hEC;OSd[^"4&]7Vd;7LAKmX!lMe)kerV,d<0DGsHbcb*L=M`ge^\mZG_CcOq^.*b.V"UMcqtBCjmu/Xm6,H9]/iE7[Hi<9=<^O,OpbDVZf97H?3Z1Aq+L2f..9q<+B2+$\W8fm1`).16qE>deJ%cCI&=coO6M>E%ZE<)er4+/;=7,+'K9o7O#4L7KS:deo7Zbur/T04/mFFa`JILFcU>#UYAMdU:Yje#1Nlrpn5cM\e#f11Wq^B$Dn*7.&^9>I%driSP5@&='5&QB[VMgU=63j'"H&3]`FTiiH:h2K.IMqsV9I,UA1o_b,nXPE_?G1[B^3tbI+!sjBLkrQcn`%f_2fITfSWf79=BJ+KSR`X0^)tGVgtZ0*GOfQZ@U`kYjG=NtNZ:'"i4soOCY+%)_$?/N9d1JAeubE<7CI*ig==_2.k=9-M@`IC*d9=285H^Cqf\,OTsf>\4o!rfRl5+uE4.WU$.:UWR!&E+o?Wg\B:?CGM=%UX\">d.ZDgbg&PS:X7D[KSWiGXapODYFpFP.p`u6^cShX`pn`.[#O'"k*6$bYF=\#OCSj.^RoB+bsm[274+pFcC?W\a!_'(Uh.!LK++>?gU@kG(+IF97Ob.;smG#+f_o%NU4194nc;goG/Qf5bil$\K7uqh6Er+D&rq5cu&!QOfWI*]g>a&e^Fm@JW=0H8/IJ2RurqD'P'B[Q/pVdqUm+AT'pYUH2%1US'a:RAU/I3[o:Wd(6Nspt=:If.M.4Lrp8I^7X1p@ikVBD6K4Tr)g#UW*'j^.#"@%_2R^b0%kchTDAPgpqJm63?NU.6D_>R*hCjO?_U7H'9L1Y_1L\+@`aK^H?Jk1J,m[u+C\hj#7VS^C5"W,3*a"77ETpAZ,V_?_i[YKV:r1aLY*DteY='W1:)H(h06D*le\pYM_rBQOND,'hRtqX`[8+&RGPGnUY*%BTG>\HUnh_RVDW[llPVKjLiGI6J17sGhsT7.0DB)3V"PG_1M=uA%1O%dqij(-,pal7p?d5"eQ3^gi5Frb^Fmboa8kMKaiQ:;#$?pMqWKpYu7/B2uG6@*d^&)#P^#eD=G37!dIf51T_'F[#CY,^03crHneb+V4?EiYJVTtDT;srGO_dhp2@]6H4rpIDe9^UgrdpnG%7](*>eu[Q>It)EVE*?FKUN89K_9C6OO,].tjd0=4D;$gnp?WqiL,d[U9[>B$c)&+*!Vdl[ka=5>55k-&SiqGK:)/8SIiLOnm#E)J"SjbiJ19*R?iT)?+.Smm4*BgV4)0a";c+ni-WaC$'.6OGGlTMu74BZ7^]+)qil-gGN#3`)Y;+VlhS&gIaceZ$g_^kFaN.?n!,0dEFK)7=?=$rReuY8qB?lDg^A-oeO'8npT*I,4*B8#ro]ah1>[.aY3"Qf>`T+[Z!(oW,R[fmqqXj#^a,YTJrV*?nXa:$GpIUBOIJ),fUIG\00]7d8SoAdn1eaG=5$ra7oGKQ'fXPq]hKnLi"Uc*-oPN9ejl!t-!npJt!\anr"CMdm$,@Yd'7`@S-3/Z09E58?QiIO]0EE#D?ii"f_$"-WJdK48";?;O#UTP(&53'.+d`6<68/EWKO=j8#f-XO&:t5(+9W@.5mSe;K+L]V"sK?6$plWK(kc8u0F5Jt?k@nr^`WanJ3aGf!.thV!!XU6!";1J!>pJt!\anr"CMdm$,@Yd'7`@S-3/Z09E58?QiIO]0EE#D?ii"f_$"-WJdK48";?;O#UTP(&53'.+d`6<68/EWKO=j8B^jrrFp8LOV>3?q/Xo`~>endstream -endobj -% 'FormXob.7760dec5e599f8562ed284f6f7b05ffc': class PDFImageXObject -6 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 433 - /Length 19322 - /Subtype /Image - /Type /XObject - /Width 591 >> -stream -Gb"0WG?e'Zq`jT0"C-B)ii7?@X(&3^/S`gNh6u`7X0$O!C9=nhW`AB)XgNldfgFF:H\3FHb*4'j7Q.'WX6'*NjcQ*TOuk]"]`72r`8ou?-cu4#Q7S/&R/d3eZAXa'p@@c(InNq6VPBoMOH<;.-((-i^@s:<4:4:JPR.+d[^L?Z&'W5?X8!\^^<$KX!+f)6>l8HHG3mjYeROSuN@R^aI$4j:!.n(uGF2qi$<\/N!!'f+2;_i.TdXGW,6.]D-UpQpeKeGR2jkA9XNL_H!0H#g"Uh=@4+*4u!!"L.>.1;&S(8F"pa-XS!*!$ZhdMhE5f>UL!!&[d2Jq0tp0Xq*[AoU6p$:4Jqd0jU5%IqM!!!!HDJj>,_lcLj*j"Z/!!(pd_@?PG":noG!!%V+YQFk*_*ciU!.`uNli7#Nn.9aC!$HLl3rf6l4G4^T!!jX_%KHJ3%q,\C!.p!1!rr>;6eDD>JD_U;!!#:R&9\$R+F"/R!!!QmKH1$m#Tghm!!!-4@0Zc4JqpQ4!!'i&fDtu&i$%Fe!'p#bFoVLbGR-A2!"_8G*<6)<[/Bk"m-O)G['ZX)Uq!qEaN2H,YcoKNScf6%qYU0eqYL'`pftLY[:7d:pu."rmd?[\F>lEK^OUibTV.sU:S1*E6psO8-R9t5UnhO3AE;n8()7Rh?;U\&:e;?F'IY+J+YGB"%j!ip80lfj?U&Vobb7CZG44;$ET>&MbEgDB2t)YX^)/eHgot5)"q2?qX&lKb*BU]Ih7?1A-4LkMW#/r`eZ`K"(+i^sD;2L7f<5)Kp&!g6:I^<^p%ddCc^6HIl`\'0ZY%J5X]tPegNWSjnOo3$h7\0eeC7**#q_G5.t[ZVD2T#:lE/9FGH=4^.85&rFaHJ]kc6&HhZr^KS5SUQEkri!<=O1S=CQt;c=S[VbEN,^3t@Z_`%":i_NWWpR?*83Ih%@YHKUb%fk*UAnL1n1M7IV?JMYe2qF`ZT,KY+goOYbQ7Z<=6V>2NTgOTq*BSH4gptiEDqM:&p[6jO$ZtX]V,O9e++Eu.h4Gb`_$;'hB[K.N>FY&Rpf3Ch>*lL(a8Z#.caL9j,pak=hgb\,nfj>k/M/QhqsM(&]m?q)HN+4];kH7%W!sV#B$Ac(;s2K!^Lk`Z/R,ZJc/HE^n`%f_2[p0(bfn:ETQYRi5:/1c2?k"U/JH?+%H6:+"`G^*V(TSJ;XUSFTl[C)-ZdG;EYY?nngmbG@*#7m+@0sPibdb1s>:RjCafW\f_qXpV^e^DlDr._<\m1Rchf%8N7Mi6W[bln*_?;OJFeu`/U@8Z*A9!&5=e>0=d_Wc9_;F-73]];H,==1A/!T!$.MTop8P,VLU$h@:<`W81Dr7GSHLK_(ldi25A/mIA<:A\W.JG\V1_fX%eZ2bir:ofkDV`IWa\h,r!!(rD]tHQd:%B5TgU1fUDVVaIoB'oH]_U3b@s@@rZ*Ud3[Yn%BorA$&AI,nO.PhpZg:e9DhX3M50bE5l&*>or;THQ?>p28WtJuZX@Zg*YT4)H4BWsm'*OHif>!CI=;(EX&o&]f<;@1[se-senY6c:n=DXUn0_ren.1rf%0icX04-]\eGbi,5=q3:aIJ:Vs;=-s8;%E#7__mGBXjN^m1h[@96cQDXN2d(T'or?Y36F6Ci^E8^j]7.BSMFEI/8s-c0%IbF`@4*HR*>mcaeT5S:P7=Et,JHK]ZhOo&\l-lQ3Ws/R&;XMB)4AAPpM%_6X4aPVr`$@)nP4_Ggf7O;==I1.S77BZ5md:lE?@]s+OWh32+,D7';.(MsfY''']4*Kt(gU=4nL<;:$%(:*3Ic/"m1f,i1\8_'%bm+b#]Q3+k6mAnBZh*_WH1Bl_>$@BCAg6\aF*$C%j$Q.">[1OXc-:1^\8gf`W?6WfEQsq01M=uQ0k*P3*^*]6BVEN!W.+^AN>a[SGWWbP!0g`b@7N'HpV1'e4a?I(bEa`.qt?>Y3naB@!0E7us6'GOG>#lhBi'1H%.gqB%kHjQ5JlU[ds=cX4D6R@Ke;St>rDbo8ZkVcltrP*_N%Q'FeOC1:X]>[1N9=I?k<^RL^^]tM+5K`u&^mG#*'?bZHY++G7iE.E*]eurGqGk'c21M5k8km\LcUj):aD;)?ojAkJ[UoC=RIJWSOf<-DF,ZM>_KWkOY-!*gnQ'\&49d-fYfs4eQ85iMFCtMQg>FX&>7n8=YVHpfW*BJ<;nA>buFm@JQ9:'PP\omJuSQ<:&Y?o^Jd@X^VG4"(qF2s:]l#,"+dY=J$[VXX&=gM_")`MBB2LM5/DZ';"'ZU[n%csnZNj&Tcm^iCW9P?(#Wi#_75BPP47_t5*^+gkp?^JWRlAN)Z6/T(m;uLbBb?9B@:PE'FmH@0Ze48022@Q%XgDZ5N52:S6LSF6DQ%MoUl#hks8Bk09C=J&iG3qXs/Q6VWCqF6:[U)`IWjl`\pC?*giB$4RFrs)T,4&9\&HMA-qOe]?"[NJ`Vao(')n[(L\Uk4.KP.1K@[=>=UBXAP`^p$^eQIJ``lg=l,D%HX=XU!^/WbO42u%iI-5il$[\IJ)-f9q-V-jd->k/k@6#-RYgROHAPaADS!%)@/D):dmthG-t:Q>+1\?'G_HR*MSOQNKK@NX]r9[SND&VaH8W4p3cVjGEe0[kKj2!b:b5:QnW!f#[L_Al5Vm0m]<1YU\G.Ze8T,:C/S54gXW&hO,lO)Gj*MJA&jV#11^fHpqh^mf<8PrIJ\0pYMXj0rQ:BUp[6kDYcoN;<['Rc=ud+*8([im.T3CQj$cgB&N,^h)&XkP.1$:e'Isb-&_&!.#7&`/#RC_*oCMSHp%A%Pp@S!Q<-<>+F`DD@F*$sBn=UWhnaW<&p%S1k$k/ptSfUG])]9M2(DfS-S6/1ca&C!&bbYBh<%#WobbQBo+m\aA+YX&#?OAXi4F++@U''S'RkFk$R'%?2f8VH@&,ZS%>&K\]ir5!E.R=pR2BEcZ,A!h;goYq)`FdrW/,S=!.n52-%lNW%1S<2IJ^0N[Hd&-X'T+=l>qM:@4Nl[Uf[0I`J[BU0(%Q2J*l,(n,7T&ZZjp?a2$RacfPd=1,F2fDf"%A612F*#+qqJ4c=]6?)Jf^Rp^5Fsr\mZ0U3Gk:&l7n:UuW$q$.ZU-7uoB4G65NK\8$er+,RlPO:%Bt4c*-TDb+UJG]XB/8Ucs+3WkBb\.e-l`oA6gs@3jQ#qC"KL.0>l^0BQWXkWRL(YUT"LR]mKMLoB2*mNBKEfj5T&4H"ohe,UOkD/tlmr`PjK:]Pr"9Pt30u:7^+MFmH\co7d_q9!>+^/pa\$X6]0?c$I'gd@E@CC:Of"SNBpCiUkN2g9dj1^Y6&/ZY.UU[mul7-RZ*%[uP@(k4.BGK8Nqd!!.+`G$_RkPp0#:XJ;OHE8\OX5Q?,YU.*shs8AWYL\194.1KQf>\M_J.4L,4=/3uPA*2k5;"s&6k@\RGHgfh)ZY.V`r:A5R2f>EdI*@s4]mB?deuY:V?7?e,QS2_6iShUrRjbh$$Q%C(-)nkdlW7L$n30Q@Ub)Ug+=;GpD%@q3Eo_^W=5]Y)B^A:=@Km0a^_r:\l`5Q16'Q7Z=lY$F,5mbA*^-@GC+-f)CYDr&!I]mB?RDtngps8MnR(G?P^`S&qt*4LY`TQa])cCM#hSf`FV@;9Ol2+q&dIQcMHhX0derp\ma)*`B$?p]mb+pZ;so&+eQ8M9O']%u!JUNcH1U1BR58X0/@kr>NUBINR5AW@St=f;;58jT)lB[:qp@nUp$UYJCY,^GR^HkYVKqdq%3%39^$7AIet1HQ\nlS7G>(&tX2g8C=*;"RhlDR8U8#doC\IJqj_q%UjOUG;j]OPCr1g'``6Zcur;#qkJ,M6co,L"5d-*N(d%Jpi=&ZG^JE)GhYZ7`)IJ@Ak(q_/`=C3:]6a/8FmIV<>1?iiG29`PbL=oR1M1opQBij1M]lDJj?'\"#R+Enn0EnuNi3C9+##+X*"5dmV&le8c4`/,/ZY?ueWpi.N',8s*oF)tL!=TlghbDU\X[spSkrk/1$Tp@97`l5pIIVI9/:T$]WSN=1Fcb=i)hRdumkDB:j5L_GV77B3t3o7Mpo>#nZldi25L19Z1_=F'4YD/uSU]$(D6\isS1#on7^8"N"rdpR?jZg7B(^^WY%1NasSjet%o5@t\',-Qj/X'MTp\mel\$WN<@=a0sSND%u=Ku>hZtV@7;a9jPqsUj!&7n/0=dq7,5P,^T,HmI.c#koHJ2.\5@u,Nu^F>Jae0kmWdaB@6L=SUs@:MB3`FYqXM;56S_"q2>'@`7?LPKUtN9q+'.hS&gUiPXj(Sbr$)5:nE;BMUfO310Otbk>+Y%j!k&naWU@%dE6B[.BTUT.es9htsmne(3*iFbBeR/IK=OiA,?.4N^:]J-#cR]Y2!a?!X"kS8<%ZWLYk#0qn68I(=\&2RSk#.p]c1mE1\EQS2^C8A0!$!pu*Ln])`961k2!MnZq)eZ2cT?b]?[VMEs?He6'K^rXTQip#F>LCOe('N1NoSpl-;oQ8EO5GpSBXCq%\_5t*Zn:2ElO[qlCST%ZdIeCE*GpWS9s'4b;K!!lK!@CL(+178s"nXsnp5_P[Nd4Pmq0.Gh9BQ&db1LdUk!RCoLWe0uLF*)Nb;@gW>GR=cb$k3Xj,9mrpFRJSbD;)?G/1acEdfFtki'$Ed6J)T5Ye+QWO9.AYHP,RT/7oCVcg?<;,L2JHr9r@IL&#sLQn#;O[t_)RAk`"U:0URbElf?^LbTSl-lO\i(3r7[34gdGOFneG'8$9Hb'4[#1/j8A&jU:J,ONgqXpIEIB'NL"oqYSfpKRMJq=&\6kUL\XfuFh.4KOhX`Fp\%7:'*(uA_@F)>8u7i>QN$m_X:#%/W#WYa3(cq@(5YF^=]qg6!FS#Ls1g#r+:p`EX)W:hdRt?!:DMQ[03db!RYDR[]cO"U2.`"9pjKL6>!.Y:[4/hB5j2[3%4^q\#!!$pKG#2L_DD!egDm+j%!$D]_LL":q+I@BcFpnNZ#Fh-LQ'R`A/d)0)B:+YbKE@0Cm`CY?X:#%/O:-^^`5fn;(`9o2o7hB2!!)SAYZ#V(*^+OeG%P"`!.]Ie*d4fnZ!?Q[fI76:En&G^,UBTH"9:^T0H3qR"U,'tS"!n?$37"2KUo]JJ29&?%1*>L>mLF\iZRU;b0-,)`F?Y3>/d_To4*V:JjQ'i(ocWU3;c6M&Cht(,(<3os!!$S`fpDgP',)UQ8FlBD=Vh,>TVN-BWm9JXhVI"YFVOlV8e#4,\hZ&t73W>amu7>Je,f#HkMbC9V&k:q/c#5<=]nm9/d_SDD.#9!aseqq2DR%6p?W[_63%!b#/X-C6q'O9,a*b2!nN&*!2pN`SI2X0[H7080`Z`Mi]ZX;@q3(!Km14YqSI&B\LK!UO@UWo;,OD&!<>r3#Wqj-p?\30O\p+<1$_.+!7W%+:*-3/WKia6T:[4k63%#D*sasb,pt'u7&%oL9\+mt!5SVifpM\XF*"[s[qAtM!!)p-KH4FjoCF7@8PDedlTtROi*?UM?A+#d)&jN]Pa&C)"98EOJ["0*.[=1@=p>*4YV$%Y!33tafJtuREiDR:_X>sT=!EbT4$/pS+TML=*R)NfRB*A=a(,DT!6%4UaWN5i:Fm:%`l>;:"98F:"^tJ6:S0g.0epLL'EA+J_L'pTquKHY_bM\H>$+l0"pV@c"98Ge#.$%".5$B)0f`;)'0:7`%.1/$j1UAH)SgaAZ!<>A+&9\d7,U=3D(qb.c7ZgIR!!)SBY^;/s^D-B`!!&Yl]SBd%@Nq.b(ks'=En&ITa2]^g\GuUpOY@`\b`aDMbfn9b(Bje(O:ZRLE2KM0_83tYHO9`Q?q\b^mcDWY"pP:B\[c`a4obR2"5^pJ/1c`Q4c0Y0-RYh4NuuPTaT)=6<7GtIAkl)2209i$dJs8tW_gU;$OR4r2`I'qV*$@D!!&7O>(p6R8Vr:\aj[.`H!)$c!2p7]__+&6S4c$9$bNpY33cSUQ^>a@;#gTh>1@(@VPBo]X/da('`nAcaq9$RAS5Y67&$KQ,T_jH!!(Onm'$j'#dCP;^g%QR!&_fDfYthKEN+_sYU_.O0fCp"%1VDs$ig85K-4f:`l,fO`T$gnHnLZa!.\G_0C8&mmG6RQ\C:KY!!4C@Yfk23&rB#uaiRcp!!!#XiB?N/!Wom],BMN5qtjT#=^`oi!!#tDJD$=/`Poj:`m:5>;co.^!2*Lp4m\o-7&#p1'J@]8!!$b#'k_%QqYFB">B>'*!!#hGWYK]r`Pk;97N=(_!!!#a7YS]31,@;)d'0aYON[1q!'h"`*d/O,Uf1:Gg"P/+H?sU71&qTltgNUlhZ^[_EpUW_\Xt4r/Im7!<>@pR*Wd2LkrQjs*dgB;;%QI3rf9=*S[fFnDJkYO&,RU&9\$R^cPS*p\OPuO[t_.T)R%&#Wi"di#S#coCV[VlDHdu*<6*/Nq]caZ*C:j?OI2J$k3Z@U8"[!"2YO5B$&0:X@iOi;MmU/+?VdAaN1D@etGHdiPUGC3cuo12O8J;!6R_b@4.=4XfSW%r;:;W35Q.jB'n?^0Dih(BP;eefk9sANerU$>nhfe:dE[0Unif7U1J:Pa[2C>8l6mAVrrZo>j5\AQ"?2;th11\J2A&la;=TkBEj:lcG@:@0q`mrC(W>*2Z5\@D1]6?GA7un^>rqq%!bBs:4#]&%pXnWKq0O]RW$ad@N5&fGqq=Ec\Hha:%LFUm(UIPi_lN'g(X]i-4;qSd[X/gU.aH>)X?Rm[o!>LLMcL05`=-Rf0=]mN3K?arlAp*M-b4P&Ro>_r&o_8)m>s=M47q8P;_:;@gVS5\:bKY'9?k5Q13f1(HS3YY.S\&rB$0g"H;SKg"W_]bIF4<+P%8.-k"_FcGdcAdEtf4ocWT$A>Z9&[r:0<-Vp>)#KH1$mn?,Mp(D7?iC2-pU>$B/P3R2/)fDtsPmqN_`'QE3sk-b!k!4+B\!'o5e-L;?X&e#0WEcQ28ZTs0a!!"F:)T2"5j2[3%4f\G^&U"-STPUV7]A21HC?X[;j6O(fQS2]dWK?_WaWh51n%gY5s!8q.Z@Ag$$7q'H6*eYO6!:[/>YZnJJ&Z^3hFoVNX45R/?rp8;o0(g@R!!%On]S@M>@fcX\Z9d+D!._;=QBn[Y\Ir#(DeG7MiSoBMVmb#!'lX9S=Ehh>lL&,f9dO$li7`M5%o7gHCFjkD;)AXjCGiMrVH3ZVjY.N/kg?0K5%s&-irDmj=]nlOOf8+*<T0Ih>A]pCajd;F&YcSS39Q>'WOc`LcGdtsj5hH);J23%?MNULU"U,'7(4ram!!&j,CMW7piPBq&]SBeGQ%NV%YQFk*P*(kM&rBr0Ia-'a0H1Z*!0iJ(Nt9;"$/^<_;,gM:s8MtQL^8GGMm*9`!%%0p`=#%#6[>3>L\J%53+3#"#6:EgCi!q#]Y*=4E6Q<)!!'IUdaCN-&]\sU<"ECB!!!FQH[F5_0CNO>fDtsP'8;-op[@!hn`#6(Sr/"H!!#8m;H$L_,#NZ4\q6Oj@0Zc4MW*gaaml8]R3Cns!'oBJ$O[CQ%3m)B=V\`!f\,!4EiB:P#65l#iSi`b7Rd`SMc(uDH2mpFnmcNRmHa)]\dF*2!!()/8kOt3,g+3L?sUi<&9\$R^cN&;%m)j7elDVihSUs!098ah#Wi"dPu^^X+H]3hUSCs.ninfI'*&%-o'G$c@q4QYiaUJm]F/-Q!!(eGV,Afo.mH6_eqI'5@0Zc4*$ls[MaX;@X=VqV3!6?KO5@5Us`5KTu/u3(b3rf8B6"jr1Z*A:?8I=]LC'A#N!!%-cPtEV[/HZ%U=;Oj?]SBd-C+>Qr&9\$Rat+tj8L+p[B4nP'Ui%k*'*&#IajnqldF")!'s^*W!<>BEo()@i@W>XX*:#q%KWkOYJEf:GqUEI%6riBDI//qJ+ai94lo<;@6.c2<0GGKHChd]g>$B([&>!;g-3+#W$90gtZR8P?YV&5fa:#ip!'ndhs,2"7o#5t.KnkG)WFsKNupSu>m1=tN3JBB;n/iGI?HM6\ClU"PT_@?Q2[7!GP8L0INJcaMWW"Ob(!.YE]Za98mn6fOUlJXnm3*n$?@0Zd/WJlcEO\#-@okW-4W$KU,"9;8I^:q>4f%-q':gjVk!!$S2<)dC=A/$(+cFOS;L9La[:g0!DObSUFKnY5^$W22^LE4DO"^qW9:r^Mp`m`D#FVOt/fpDa>asK87>pL&ZVP^XO6oYa$!!#X1gY84X5RJ5Lli7$M6r?h/rVQ>]5C^ti&-:cRlmT!Ge:Xt-!;/_t7nJKH-uspmQiI-1dEq(DmEN3L+[al_!&0Y+ROSr,daHQG(F!f(3rf7]]Y(mnCi!3TTb\2_!!%mX=BK6MB_^T+$eC$1$f8eHcH_GC4U=+L&A3gTM#6r8(DR[i/jt]WciX7J7A<)ra2`sX'l!t^#6:D6Y@#$[M*r4!)6=3C7gM0V!!Vl]n?B=.AR1#di]ZXKF*"nAKZS2ZYcEuMc'rqCensWtTi7jaV%q[lD;10t8$6+-@VflIm-G])&jffc98*?GeY?R"hVOiH'hXH(PNU8a4$#FZ^4#n*TgS.tYGVtZnDM,D3]apL==kuVCeW]nB[MET%jk)D]R'6cC4!-j]h2i@#7"a20E?'ST:[d!8>;lS=Vmf#8kM^-JqEFG\T@Q8@2a1Zo^k1gmTcr%4Tu8e2%k;h"/QLNnQM`*IOiSia#ed)9*6s*QYZ*?$CmAp\(M,p5eLHkh:F3Bk$e?!fYer9l6[\J.+e2ckFeYl=ilE;!W?;,\m[+c?8)p;e5!C1%g;Q6LhV8'c0lTuG]Fas,Og!-!Ff<8OGDVR2tC"[6X9A$q,rL1oQ;pMVJ84uTkil$\#p?XLh1@r,stCMW7uk-f^8p52L>[]lMT\TdM6^:sTgP:-+nhnO$_[^Bo&/m,>cg9bR(`f/g4fU#!-rj8@^0$0IalH[aOn(HCPNB?'JkV]BP?VnkR8:^@+(iB99q-^Z=V4qK*O&7\6r]P5fr-Nk8,-Z?.[@g8-bEHPa%u>UkFJW5(U>U"l?lTjE)uY[NcQMYsIGrV,26E8X!1I_NHR)?;2'.3A>h7ICMVXesh)`;B;Dr3``\-bJ)BXKAVLI2Jc]m+8Guil-h"mFk"PV!dTgM\c`WB*a'e#1Oiq=@CQ3^q:sG^-_RSB@VTYZn\\WQY`Ll*.3fIX]#?\+d"/\#@\\Y[Bc/G3rge"-BWh[k_2#!8t`5`Pos@M00O?69G*f)VdAtmS)kgk0+^s9$.]^'ic/q9q+&SET;dihn07Klmg0&c*b!g5'H;FPUTP<['],jQFM&$''o)hTPis<0,BK+io4&VU*-G7WLB9E23)8jI.4u3`J\Zk]GVe5car2+3BB3Ms'Mg.Y:b<21296*9q&G=s*bm=@q&n^\\QqVZb5YkChIDDj2[3VQnY630;7jLs8K<8b>+Qe+i?&MK:;a/NujiTHZn,MBsi551i(Z9*PMUV&<)^4&5uM+jm6%/jPn.:eI5o(gU>qNGr'S^.XL*&GB\77KkaYmET>'VLC[auB$J&#m=[C#>U\*r+_F,qA*qXs1+ZY.T:?+PFYiJ2:(Zt\'j'pjX'(-[0C2!^-##Pn2kZtn1&FmDY$BC4E\X:#/])C-RR(`4+&H1Qc5+Um_o]t:;lGg;g>L5(F43k[X<4If%W.?(;!GD1a),*?R$baDJ5aLC&UbIU.CW/e3jo:ng:=BE-hh#Oc`LYDD(6al\9Rj3-KIc7@i9)j2Y;@U`.T$TNEaO[;&^ZL(11jSJsM*YV$[kWY?EmS=H+n\dFb%EGO%#9l1*tHM-Q_)Du9]Y$KP9W(QQmGk#8=o&\#;8l#m*NENT".ID?A'QBA(Q90:B?f/J>DqS/#@0Zd)N`lkZ_g'4^*>^;27.%e?X&kj_SWf5"=KbaO;GpCd9hg-4iJ3O?7k3X@bM(\(]"5K1IJ;RR]6@gJIXu^"M2AThEokFYWp5Kq^>S<&W!GHb:ia4%>t#2@1sj_#Rm2E%Y$JXl?G'r_AJGgjU/WKOVX/ADEOg2Uda(/X]R'6c)YpA9l-u\2>u-qZ%3n;2p[6ib9UN&+l-eD"G>ji=CMQQ`-,W).o()@'K7ba,/C'kP:HK`+B?qV]GVHfZnp%:o6eDEidZ[V^5s]Y2#7gt\hOEclNto()AGpST!Vp?WYSY`pT$X9ltJ6eRi9"EoFlh]mKLV>e+nGjN/Knr,F<YeXP9sSHFSYRX:T$sY\pX>EmG#)l5(&_enpC-!4a?J3_o%*N-94(hV%3R-?;XSIX&lLA_STttXf\`*qWfeMdAC$SC`0XQ6\Z$6gpqKcdj*tJJ,fMgNZJ#TK+BI2'>b4ZP[(%n8,_&ss'FFAaH7]Wa,ZGBf3^;^eC83H?Bf2"TkSUXj&;`f3'(melnDT8t$VHKNEhI=;&UGO?:d)HpT3k]&=SsiK+8V1=Ujo+#d,!p2oFQZ]H9)EA$].8lqtBF#QS28l<"]p8j\_-j:e>Q662Jp$OodVhse^(9^fE$LPWb^6e'H%d6n(t`&7ujZQZ%Cu=Wm`>IP0hV(TkIZ_lf`.U*;Z\40_n8q!d6bldee!1oY]fhMiF2P5dcWs/0ks`dRaXSMFd!qXs08*^)!88A)UJ\=`+%@0Ze48022@Q'dpU?XI/]F7[SA0E:tAcYM+5R6#JjY-)Z//mXj:hF&++7\`[:GjsWE^\j7<.e`>gYHP-J@:A-Xk9n#SfF`9,TSaF$G1D[HVVRrfEHQD`Lks-naADAAa%LgpiIJ@c>1X'U4e/:ED<(%(/;%"q9_M[r;$/h'k28[;4Bo<@c3+/M/Q7B8UTRTE-Wt(=g!=CK`8@]LS#(oL'BnoVD-/;ui1L`DB-q2Jq0QA&l<3ql&$9kKi&"I@H+l1sg!*,hP@E1Ip.n`K,MMd8u$4=q9Vp!3(ai_cKbficX(]=mC8N4@Hrf6D?%oL_i\9!5*!ru>SYcEoWG?]rXYQFl*KWqM>Wa&>)0bAL.TSa;(2+#r\LTgj\+6%]@l=0>4g8RYnq;K-f&AmL!$WV$$Q#Wi#_En+F@Y$SefM\[mjo]VDUc8gQ8]Y(mXXB8?aiVs0F!)R^D\Tk0`[eBRjlYUHS$4@5Ef*_pSYIK4;_rf454*KsmbrZ&:#67@K1GeXS?[o14n&j.`?iR11^,gZ:YbRt'IXXKHg-I?3F*!nBS.6Mu0O_g$/M4*Y]J2<^gfX)U5QCf,B$[&3[EQ7l1c.#n%2uTcc'f"V0"AF$jQ5L.?3rfLL5&J#Y:mWbU?mB\Y$K5^0"IXFEcZ=!j,ZEj044_+7j#il8sq\\k-/.u!.\8KmC1t4SrL9RQS(,YmG,8DlIDr\cH]!Q8Z^N8Fu8tq>eqIEHEaQ1#;9Gu['mEof@U'%qsQcLr::C=3cKAl#t6,n3WMu"NugH!hnD7oTs$TD&O-*YZ[)0)D;W)+gpqLgk2nrq6#YVm@D/Bm;t[AY8u8^t^%1^`0fCqeh3]cu[S3;W]jJO'%3%4dnb);#XW-@KlZE@2W3bLCinLq\J+V,Y4:[2_2/h?aDr88B-;7OQFQr5L]DqZd%mr]OC'MSn_pd)`=`8qBW'o8a-RT-(#M[tdhRR^jq!mD![V]6YE8gT^j/L=Mp$0Zl($sGLe#ci`0MN>`<1U4rn+Y^hYG7j;f.jU01f1Ysf5ABS!L/Of6[&L25,,4bEtM9[uNpH9he@5__Z6u:$(m'_`)DaE954W5d?Q4`NZ:(MK+C.R4aob`g9ti[C!re'99u)1H.(F#3[Q0X;b[5lA5c``nT7;7Vj!PW?9g*GONP2)](,33+^6scT_5b`c`@C*>qUdV(+;Y1n$@AhPjGO!dag=i!aRT3'@V3%O'C>?>(QBiTiA5!'p#bFoVLbGR-A2!"_8G*<6'F*l8Be!!Eg@#64aULTgj\!5V%T!<@Z.+m]1/5k#>.!!"-d#Wi"d&3PUd!!!9G_@?PG":noG!!%V+YQFk*_*ciU!.`uNli7#Nn.9aC!$HLl3rf6l4G4^T!!jX_%KHJ3%q,\C!.p!1!rr>;6eDD>JD_U;!!#:R&9\$R+F"/R!!!QmKH1$m#Tghm!!!-4@0Zc4JqpQ4!!'i&fDtu&i$%Fe!'p#bFoVLbGR-A2!"_8G*<6'F*eg.S"[.5+A6fuOE:s52go54%~>endstream -endobj -% 'FormXob.9702a690f73de6bf3ad5d39d0b3bfe0d': class PDFImageXObject -7 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 591 - /Length 27485 - /Subtype /Image - /Type /XObject - /Width 805 >> -stream -Gb"-VGC3?^rqQ"V=TSZ1"N?);<"K5dTM,MW7?id*!3L]=3e.]0#Bi'#pUN6?+.!A3FQDMHnTt2n6V;[q:3+F$V)eM8?iL1XEk?f!]'L"/!!%u2Y[PH!C:3CW!!!"pEHcX,[VY[(fi-ae7n#lFiueK?XK:u1=n>C_L7b*12MMA8!&-NVkK^KAZ[;?1CY#T7PZ"Ve[6d5J/$NU04,FmIkKg@(U]:Ap"t;`"5!(k'TeE!$IC`UiC78&S]6A24[f#9WDr/gBQX4uppCdQ-!&W-QdpI@YL!#pk,t(3lro8LuINealJ=orDLC>%uR8^ON1r&PT+Pols!!!QgD;'+3Pc_0oYR5=3_06N;57mkq5f:poYBom,'jbJ;^5.T$J!@n'f2mmZ!WW3;Q90>oN!/=qXo&UV-/`'8+!!"FBo"LbN7?LdS!!%m#[f?C.'Lcm?!!"F)g]@HU:_^GD!!&Z?EXMjI5Z-SX!!%PDa=RAl!(E#S!!!"V,.@OP!#.k>!<<*JMVJ75!)OB?"TSOq-uo[q!'jEB('">bU<"nd!!#HM>6"X'MB]M0!!!^%D?0_;.#Qd]!!#h0\HMs5TI=gg!!#8]j;%^qJ>1+:!!!!fO]qec!/_u0!!!!57;`,+!%<`[!WW3I-o3Y83B9)L.Om,+nB@:VDJj@cp@]u$lHl4l]6Q6NB$FMeC=T:^Vf(>%iptDXo1[&V%3%6Dr9Uc9MQJaShY`X??>7rieJiG>dBR3%/mZ'\m+M"/pYR&LB[G,"6U1PAdubkFNZUK7lI;f>B@$S?5QA9'`JX?Sf5KEPD=?>pJ,]8AQ'IVuPEVoBVn]ur:f'tn>[1H9RV4q=pH8KV0JGpa7Hs($Z*CP7!NbR@1!>d>.,C[HlPSl[T!<7(H$\2!Nb5^KnR$q3EU:%NdlNB4pDpm2ZrXQC+&,Q'EZm5m@;h9$,/q\:"+XYHREbj2VZM3$9D[rquR*-;=4(_[ehOlL`4LYLK[Y=*D6DKIU!%1hkC6diOlDc-lDq*Pp!cpG.g+lUP,qNU7d\s>s58M?-;U3aH>M39?$:C7!71gsUIUB&LLBT-]fUH+gp1M7\om>)/R,Yk_1GgrAke[KA^$MrT76X9BU(c0qRl^n]5PFZk,Y]"g9bSCa/qj?&BrABg9bQMEob,m=)Zs.q;B)A,#L`HM/KkCiIXUneC7H'/jH0sbFFGncH+'t8kRM_39KJiBl@oCibd#54W?=tr8EDQB$Qo,HLtm5C0eDmC"94`P9s#(3+:f(S/ToSS5!!"M;n%\l<#NDr%rjlU[NcL2\2/Ccjn\l=%H063q!9;+\T0Ii)qXs.b*&qp8pi1e5s-T/jd8$D[AD^gld@]3o(boZ4@\P:$P:'/+<3#??[kD+&>_Ldd&L0^![Vad-ET>&NAnF*\0chUCrVcKJhlpNVBP=?9mgK0r>e5#K`/HZr&J,]@5LCX.VqO583XNH7P.MoKrIJNGFB4pBJ4*H#Ijd0F0e]M+Ni\e\6hgBM6hEBQ$%ffuMrr2f`n`.Ykk/c)aFmCbl`baA9aj&)tk09C$Dih[X[jnAUW9E6[MargL?+=k4`ufe9R3-p8n(k3VKBsN[!&/Eo!A])DO#?aad=Za2GP]IGRT9=p(>Mo3HMp[@!(Fm@J"mFkRuX`2[(XPP*Kp2"M[CHag^>KACe&MGQN$\Zfr4-ueR[Vt%UHX6]&Z$H66[nAaRR$j?O(bjmo5Q@M[[#Wqi]nhK#`JYPIpu74.m.62T2(C"&O?G#m^o0),g9eeN:6d;/-;BqNj2MP]!u`b39:"Ss@LER%;GO?]Gk#8";Ge.=-!0^#bo`9V#7_`84WOO2m,N89iPL9VZ=a:?(mR:5qNQ$U&Sfmu3F]p_j2[50?.q_bku^h]de`Y&gU1fuq@;DsI='Y2!W\2(Vk8EAqU+K?`f1peq;ms`NZG`QkDno.NBpE=OnJa`CtZ,ks'Jl1.!mf2TiS4HJqDRU>M#oWYHmNUAnGY+JUt,)"ooL0ZKKee&ZS*64fE,GWZ=-BQp,rpiPUGGUSCtS]4/j`9$5H)5'?/?:I"e7CtPs=9q#%+IguemP'p7/!(NoM\b2'\p$;A;eSEa;=aTo2p%.e81o)lN\&q-=rO$Fm*#osLY$F,0jN'5rg5,+Iapq*_!!_M!'tef?bk`5fnG0eq(ohh=`q8Wc/f?773M#S.GiG';`RFmJu$o0<*8UK4L#C$R-J&#rR+:5KAVP$7nd-'Xd$qtBF+r9^n-f2etTd@s&;XWR!Q+qCTU^A;U%^3qA)T"JggW^$LX_qj-S*-q?38E3WR>b%%C'G(g`@:A]lYJ5sr)DP\hVbWd$2f>^Lh/)#bJ`c+W\[f6sXt!4b!_OT&J;9ZbE`Z&pn1Zi>"TkM+&\k'NRqK`X`s6jUIL632fIQmN>mou3TB2`((q6(NnWLF/`hFK.IQ'+)]K`CmbBgLHi&F#&$B0JnuJt.)EN!(gMaj_ZtWGbIUlWnQX>2e`f(eD[^I%k)>An3[f?Ch;o[V(YHY8#`/,.#Q7V:RZY-[\eW`9t5$>RFogFj`n)"$'O$B3sFmAPZb;X:l["&+)CMR]]:X@tWi2]q_M?#@#pF@btW2SqBc'qR-;80cYcHa_UNZHlbF6ATKrqP;nhi/L0B#&otDnYhpo?TY)`-ZtK:q(>ucThG7`46_p`1',3!<@5=]Xd^.r;?JCJ:MLk[Z)1_Wg"%leItr_<,'^P_5jcRg8S#KpYUK#P>=@[2f@EpR5=m=c[W*(]m@kf/Y^V9c-;fLS5,\?*?#h7*?C]4OH>coQCXR`1oZe-QRBrI`f1pWEH)dJ?M+!dp[I[VZa9Q#cTcX@g9kA,L1SPoc'^A#b*4>"7ueQOG]<-.^#+(p%1uIFCY+mN!'W]nRPh^"lS`\<4:;OT`5KSAhA,)e!'k0HP?SR.FmIVX;l<$3M1]s6cCK+X[\KR3e>Q6ZIf3m'R^HhVU2AYnn%A6ec^m;sp?hb9LE@!F2JgZA8_L;=K[gNs&=M/nKo&\'HXBDlIh7E:Ff8H$L\8gO^^\f;(:>ALWrqbr@*BQ[Mm+J^XkK]VBp@dq1qqH&(mG>N\r,MW-mG\1O[r1$7H1Rn-S&@8br:A6!rUeRm[;/jG>.&J:;Gi9lkK]VUCY&.BdjIkY,goNmP'Ag=%NRTDclg`"?+Y:Id%NhMQ7ZHkn\rM-)qV&f8,)K3.8!"$\FULh>^5o)d7]fYQ$:2QEXMl?1Kr#)LT&bgW2M*p.k=I&?[hf^[r1"or*;#7M9O2f?@2(I_1N!=R57>9WjB$QIXZ_lpJ5f;!2)-jj]75de'lX64*UJhiIqXUNZL?pHhZsS4nkJ/rR;"9;6=$0eu`/+nA,@9B@#GEEML4\I:Qla&t^C?D?0`Z7`W&>U4RuKf[s;MGPD(5pFfg`<+OYYn%[b[<@^3m'd$U,!kVUAB(*D(c6o63o$',NCtPu._SX1Ih`iD57;&O?O]qecS^E5J.Rdr]AlM`oVl/_*UIR7\gc0NGgs84br4Vj]CY,^pP9s"_l,R8QFBeb7T,"M8Iei*NSND>nd77-49G&#QCY(1#41g#nJ>B!:U7rjbHPX-q!72`Lc`PWpe`sNK["sMDDf9PE/$%LdqV,r'*B.lkd%NgRo]X]2D;/[IRd%rB"Jo&bK5%\`1h$@Zoj<"+Q+,Y"]5QT@T7-Fde>ZC0c^uj_q!d7[:/4QYVQO7=C(R#&8T"P/FN0tpX6akIEirca0#HuAfsA_[+$Xr8f\X;gJ,/2mPq,og=Kl30o]]l*N#=Nif_b-Phl0PP@5@Rr?$o]mKL)!sa^,RQ,_o(O4q=@[j>e,:[[a?X^nLnnj!2)\+P$8YJ!oraas1WXA<`2gnCi!oi=I?k<^R(:RMi3LYQ'Ftg\UU/=0GrDCtZ*_M\aR,2c%q]BXt=\qJ,a,_6&G4b"G,=ddlieoHZN#49sq!_.U7Z#/P1sb?WIkJG`r[8+mgph@`_I%cfjePJ3VG*C5D;$hO[BI@EqRc41qu6K]J,%uX'e<=d?+Y9tL(.@qCtZ@?VeAWK84S^^[C!:Tmc3=P&jg^&eZ2bihRo8=O\tr3kq`h1('$U4a=Wc+EXMl?1ZTH:i/Q9CRK3H=&3lk)o$\RjtK+sML4l)/FT\s\tSh1#QWrUj7FEreN4\od3-kX"CrVk:\BiI^FD9F/2*HfUJ9.Olo/IJWSf"UeXdrUiZ&^1"p6):R#Q!/ubZD><>$ej'/?Ie]EnF)KmL/UKaH5]5gg5s[fSL(26V6ZMSO4W>?0M%_6pDVVb?k:<6OoB,<%l*;Z?JCeX4;cPJ]j?2CY,^pl2/"NXLl!PaI_#5Q$?2-l,83)HYNO/9i4bb:/4Q>%NW^eZrXA:4],m>p?]>9or@B3J^W>cGL,!sqYT`r(HZIOGAhJKkD(<\BMQ^=5C\-=-Y8RGB@!0'KnZgN!<>5b>$>)5T&n\7D*)as7$1fLTqUK!;YH(MrY6ForRYD+c($dmm$q(U<%6Gu>cUmW%hB3(\%o@]B4jI!Uo`!%B[G\k[;3'd#69ugIX_:kn`).nN$m,V=gMJMI]HMOZEgcnM2C3cK:j.i#mn&K[`asg)a&B7Zd1g>i>oF>bE`_P&[H>7C!"QACXf:[Kc`&ZCMR_=[fZWQ9cS.6Fm;rJ-bt60k6D/r\oa>uD;+^NgWuHSS!K?eqj,&8Uo(#8H$Sf2[;4?p=ag2@D:54OjnI;[%3$?LFGM$b9&\^d:u39\5%s*&RBg`3!*#JhX6ZEEK.;?nHVf>!%D$`M3aomY2/CcF=BJh>JoC;@54b>M9H$Ku6&LU>DfXGeV%mTtGIf+Gq92t%j_'c6aYMQd/j8AlSA`%V-Rn0D(rl4/sC=T=aqX=$e\[fED`Z+Y*hmd[d9:%7oHEi'RJe94sL^Q%TekGutj=CQ:'%tpi/7#jZ_<3GIM50H"n%:GmfWZ5LAuo=PHN4!CcHa]O/mLq=8MSAQ.#`N//b+oK-RT-&"Z\S'M2-,jMA7p[c5\leB`%MjT6]Q:SaBD$RlCBDl`\95/HS`A?%W)"rb7_n8!h!hp=g6>.mgC-M\_c)%idRuE>P*'Dk=IhGa?hDD$#6F91hf;E8\OpT7=#eUZ=eB<2nD3tEApGiHYuhgb\)L(,(3*BN9FkihL(*u>`[Q'EZmIO[:obq5&UBk_:DOca;%S?]K0'fECJrV?[*(/1/RC!`M=*BJ9Rj]n4;F"6FRVk3bCK+GD-gW##!lab902jaJO*AM"k))l>BAYo2)]<\Kq_HGOOB'>oaLhiTKAO##hL#HhQe<&[c<"U)>b!N#FQG"AH:Bh;3D:NQV9)R1cN$Y:`_#e##h?!DntcCH_.J,fIU_hO-l4aP88.C3X2qYpB\7B6=Ydna2WDA@m$qsV:(=BIOB3-][mS3;3W0JN"5KaZkuiN]YmnaZ.kaiS72Bqe_th7H`b:f,.nYe7MH=BI!>o?>G&o^m6&N!TdsQS2^+N/S/Q$Tik;r4-n3:7XH-m-JP*D12'?dJ`t:Dr89Wj2R(Z=0GrCGk%:aF$qmB:*)TH\2_9Hn(ta+qtB%"IH/>,TD284qFRKjLhcGsg"Y8>:b;YG$b^NXqXl68fXtCqC>p=@\Mj?JT7:UipU/UZHZV-pC"&r9=(cp5+ojtU8jb]embYX(k007L\ok&W[AreQ>l@[9HM(ILC=T:^7hf8-qXqf.V.%8rU2?KMp=Z<;Rm-T%F3U15(]P^dZbQ(R.keX3UA1MYUA.?E-;>C9C=JnB"7][VHc6c=G&#O*+o;I8-LSZU]m%]@RU+em6s#`IUIn]X')d+fMt-6o[U`fOFH!ad'mrNMS2*aF6??03pYbMoLn..cdG*D[CUXEHoM8@_P)kZbGeLY2mFl:'V@=M)YZ7`)>$kJ?qQG54qd]^Pa,m`f1qCpJC(*X/g#$5f!=_hRe!8FmIV>mNdc22bm+CY1Qb8jQ,*'>3*M"kdu$*g87R`:6GiiR`'3scd0qW`b*8O*C'Jk_o.BF#7VUDk*p9ICtMRn'`bA8;Pf71hKA&/5s1B=Iefgb=N,o.Df6^1'#J?=-L:BmgFAI\r:cng#6b8ooVT1OIiKIL.s#"^eudD;lCE.UdIbu.M\j>S[qs_qREYe`;(=1NNf/fWGOCulS__#.qnuFsgpqLHN>j5TibuU1p'WOd^o:%+e>l[>eQ6,Fd\Y-K+[\Xlc'pY1_hJW4G3sV-DM&J,N3lK\5U^D6XlK0._U3HHZqFa*<2'mlolCX15Ni[`o7pYAbD4a$)AX\*IK!)-=+C?j?M=+c-X4Zts1Xf_?dhnO0k`[+9DI/W`iUIUCEnA>dKG4#.G)fIQOhYdB%0-9fQZd6AVat%DDp""KY^%]VrT1kb7;&o.-Y$AM[ldit/%u]69p@\t($bLld3q(%\>k7LXXfSV,>e*bTAON0bldnq=.uID+>$78:d@s'u%JK#5,<%Qj@Ddi[a,dG%AcVmCEUVbtRl>9*`l-1a[#m^_LeHKh8l/R+)U4*Bi"=-F=BC;?G+p'd<-j-r'M,NK$(Ag8lAQM.&*W3IQBMN=thF=PEV1D&e_?R]c%\'GPUgkR$a8>W2ReYaRJ]gM\e%$L5'$EE+-eI*Ttb@%h&jT$47+H#n^MYnIlKH+YG2r0>:),Y@o)a*H;K[8P-I@qfZ"@ljW\#MR$"auK(Suttjb.\e,6H%'5C=T=urX&N!l`Y>a!K)boNO3Ve3o]ah.hkgUg"^,;D@Vfjs*rVHm\Pt&Df`-AJI:Woj!;Jc>b:Vh;>L5O@>4(>/&el$*H]Sm4ldr=-LCUVf!!)p5\HS4!>$@@eV96m#O?H,@ioB("<2m0Ek>']_!!*"Vg]GX;f@SWl_aF,3O7gaVhpeW(LRfLeoEr,4PYl=9Y,.t+I!iTn62jA@6Gi[3OG]'YY$&*n\)2WbG9d1(6c^jP/>Al5Ci+%^lE'cTU8%D>Ip_R-N>jgJ2Jq0VD;4@+X&m&bI6J8a!;)8rE_@CS[(]6DEXRb&X49s?:*Cc(Z3PYW=BO4N]=jc+Sac?8jI7pO)saE3DWFHfi++^0em\%Zt]!CqsJ[cIE-\j!2-gB/`9L:\[`Ik('t9RZ3LC1(^"ddGXu@UUn+&^;,NJB5l^mSK%pFq;leH/NfFo.>`_)S!5PP;&-SYGoB&c48sP[,-$p1'J?^9,!5Z^rkL?J0ZDR[&(aj>3-8$Yna25\;0elQ!+92D:7;fr+KnkHA\$rj5.0'>pK\V1D&A*V+\Tr49ZKsjW!2bJ*Jr.!Zl-f+^a,>k6AIehB0KJ20N1NQk&R#u(?BdSY!5M!b>;0s:aiW]-k$f^#4U;&'FQk?cP`$W($]j?8m="j'C"ZDb!)+F!DS[`4B4m^'RpWpZ?1oB@!0CD=6=F;2%Lru='b:;k'BBpfM+B1EHi*=%E7ojD!:X@V(5t^l@\SR1"ck_F5i:cV\'iaS[D#?EEXRJcQ^6uG;_SNM2Gf@O*t'EA,4MU$68\bI>WN)E,7L.\:791tI3#QOji`Bk-_6c$UTcHa_*'b:9u%ceDt8mu/%NK$YSFL:C#!!(@aEXVa(lIDr$QBlfAH*RYU!'m$p/a*LbGBZ895M8s8!2+c$(8SQhpT@,b;XST2!!&*RB=X:pR&K[pC62X(mJQeOb,%&t!;_4g[ie=06%QGOF_klqlp1UO:_pSF.BZpd@V',9T:[c`&-)\E7rCWegt^Zd!Wln.!<@Y1OB^).gUD+%<%@EFfn08)TKD3MF=&[qd+-ZHp(RK,kSagp5R6lOo<#-s042FEHOp/W,TsRh1f7DM[0d6JA.J_AJ/mVc'I=gp^q`4g;ZHe?'=e:#gq%W$V,H-[F%>pH!!#PZDF"U.rr-eQDR-/?!'i4$/@V@KUU@g1%<>+FjQG]1=]r__`Q9/(!!%G`64hM$Aqda3,M,!!'^P64g)_kic\!)k4^]6J6tk!2/f%/X2T*X`el2%Lru74U;#fL4S,H\YQ+"W`6!WN""Bl!!$C\a=WY4\T?q/SieHK$31&7%(V(taN_u;['[Jhm@*B-!!"]83m4Y4Zo"n';hNk'>%D0>XfZG;;3C32!!"]DXLj0aW7>W1-`7=g0$#(:!!!*jDW,S5;GpIDNAGM2@(p#6=h?8E_V6`'IYogXI@TZm[+B_TpGeZf1uccls6WJ;.70G&VC+%1SRc#QOkEL>7B"j2MOLF7\bbCtXF@!+:K$/Y"hB`llOup(RK,(bKdOP_m#ngtY"@.7s4U!!!ilEm&!!\oc'NhS-M0=S$QUn4:)\l9BPC!f<8PJ4U;#f-AUA3"W&gu4F[2fB>jrQ+9f;egdGW)gY6)HF@l0K!!&B=S`Q0J\RgH"Za7p$c#;CI+aXb#!:XpfQB;I_%#n[i8u5-O8Wc.A!!%6pEm&E-\8]:+abd@`!N+A5EpMf.PNU5^P8TR=g4K+K"Bm-O)_=n)Il(a&.(!WW4"((3FlTt>O;W`6"*Zo$Hg!!!!N+Lgu;:f*73Mi6pN!!%Q#OB_RVTV0*?`[3#Z7eRr)!'m$p/Nj[^(M@;jQ(O[%HOp/WTOm2M5&bRaoCr!G4Ttfc:^"P$.+b"OG>p'BX]r8F%fu_2Pet"9&d8ID.X/?%!!#/JDFm]%:ge-WIJNGFfn08)!6(()\p*8Y("$3T'b::pM'09Lbgk6$0JH>s'EA+uGBB-TB?m$pqDL2>-+@dL^9(;4`.)>/!WW4BMM30p,9S,Ec-8uV'EA+u!cgqJq>'he<`W;)>`h/T!!&+5geq*fCok%PF[8QE_`,aEW5l]\MF3c!9qQV-)@H:X&Q+2GONZm!!!#_&"Vf_A7VLe\#H'>\`N#;kO.ajjf/=]J0&1U/M5,gbHnR_]R'7NNis6!!9c4Z93Yk7@Vfjs$4@5aH)1K@5lZsNQ)@Z`SXl=(K7e;fFT;EWY`N(SPa7W4;Q2E,13@J@!!'eGkq';K?!XkP9aurijm25Zo&NB=Y6=n+(c3"[W0lAq>Y@`5q"T*qXo\S'(^G)^!huE`Ci+#L.inZjPQeTt/o%fJaiPtW,Xgs&"onYCMVK\nP`ulI8sPg4WSPf#!!)%KDO&W&ZY)Ea4ghdc!!$CNFI$-NEH,1>VM:[OJ%l@!<<*u_n''KMiR?,(jEgtY"R4'Ur0!<@Xa1@a-\IJU=[\$lj%"98EKb@GZeI$_CSH#dr2cK560!2`>#\YWQ`<$8Y&?+P.Upi4T:#64`b?tp'8Lr9q"-#uYP@/p9-*b&$XQ(4@\DJlVZO0/Ze!%86(aXqFLmk\V%-o;#+!5RW^6>g@IB:GB[?b_%qT`G,n!(p\l\J5kqk2>15=n)Il5SfpPQ?);I4ta=_2;6g>LPLX8FM.YS!+fTWlYc[skFXap3O5Ob!!&nALi\L35Qh&eqLI?&!!#h0\HMs5TI?Ams@8u5-O8`@o^!!&\<$oGF[6:.34SCDj;%^qctMi6`!p_&]n!!#9Vl#U_W()GWVfYk_HP^Y?-$NL1j1S*W.<`W83/q>'%@,]MTX;F]qeD^)W`5tGX]r8AIei*Z[;3('!am_S,e"*f$EUA3@q0"!Y[qh_JCd:T?b0SD;fTsW2!(qSp[iXn=GMdgm_hJV%Y?mJW-3-3*ZeS/J:+l)&DJj=m!IUbE-`-r!)S47sr;:pm.k<4NYasPNTX5'hepSQ#G$MY&m1V]2"+X7sEGf'rI+d6-\tG]]Mq]Md!%=u?\TM87%NX-%=VDMb,;[4?%?""$[ggsV]-*u>afYB#([Fh*T;7ie2E!IIKnYs[P$7np=1N?E;d#SKDs$Ym!GEmG>:qN\5s[dIIYHPY@(=@hWdOR/h7%4R6=g1BLt6Vt/M0\n;Vf$5pS"d+hGR;S\HP64V13*OVQpgJ'4m425Yl)Q\,?1%4?Pa545gj8>6'o]BPr[LlHuBIeu`/U/-&JAXk_(BbHnR_Pk(m"j;%`lh9RZ/1UEZ9H]#s<8kP70'EEcZQ/%7WNjc@']mj(qNfdNGPh*U!Io0A'[V_eF!)u30F%`W94$,NZKS1a7AEh/e!(tGWb*"mh!!?8ige(:8;pKW<2ii^q;!$2$NL0oVR#:6fs>5P4B`lg('*R6VG3QJ5g#hGZ2f@Dqg]bbN!76^0[r+'=ekGZ!nEM9)"NfK-rT*_0sh"(.2ebV0]a=RCHil$ZeOrh7ZY%J9[;/9&8'@J05XcqD,Zn/NjQ,Bdjhg'o!9fSjEc0X?Xla>4e>Q6M`rT!KVbWdDHhM:/02HHdJ<$0\F%5aXAS,Q:jlIe8*!#)^R@1$PWDZVlb4T'$('*RNUe-bbeuYirVL&("QSUBPA5?G"[\ohf5;q?fk5Q9$]I=6P40756%,@rb5NsZ@,G'8&[er(Yk$NQFRio3kDC=TIm]9`6$h7Im_4DU@QRCTrAlZb;f%k0%\['?m`mLmH!b:QSJ>2Q1]\HP6:jlY]Cg9g+DVk2>de1\T7P+J7os)2i5^:eaZhHI=%h1+Dss1`R6`c%5L2i0[3eaPuW9^^(.<(Kcg?qJ>mO0F&VMUS0(1;!<<,KETbUfPtH2beh(06.CfT^!),dg@%aR$X7!0Xg]@HU7^&JX^tRN=o&\%mY+=>L!!(#5<0h2L;-^C2crk7?LPKYnRi:?'!!%6`='+"h^d,FdYjN8,!&.$SDV\3i<-RccOZ`u\"TSO]:d@9rrd=Vl\HMs5N(JJI^6Os`>[3fc62let!WW3i,;qG\mTK'+dTLIu]=Vj,Ri:?'!!!R8>[5RH5;.A@'!MoM!!"]pl07F^Q0Ren]4(\C*#oqLH]YP]=`,\_Toe=N!!&l@2)SC1;IsBLa<%,s=Eb,Q!#Q&M?f.%p:Wf9'grM&I!20@4F)rob/[&Hl-@:i3+L_=NJ=_[VMR'Xt/Li654\,a=>6"XgDlM9%-RYgRO:^)t!!)Xi8kOt5V97$+PW_QKkq'<.>8DkH!W^%2S3;5Me'h7h'\^C7>6"XgYN4d*=BJZN,UCGP6u0jq!!&ZV+sJ5tm-G/TXS6"Xg+/m_)7n:VHcqrDJBHObg!!&h,ET;ea\Tr@A[d69oTsNNH9MEt42DrQ-!!!FrO,o?gQ^@%f'Z<-@6:E+h%FOJ1b-BIbif7>TCIh&#)/H('"?]RFA'0H[C+_SjM%NQ6"XgBbrF/4F[4<.@_,[,'"%k!%:>_Q3aTcQS-B$6mcp^!!"Dm.4NBogmfTE\HMs5Pi1rrIHJ`kfi.):^P9YDcI7.rR!.[[&Fm>3PO,rWVoG>%A!!"K".k=8h;Vf!2;t_>[9kV"Zqt=m/Dc;;D!WYKC$PtET3]_:^r"H@'('"=_YG.a84$1'qa@P!:(^>!g!!&8,[;4AF/1bg_F(Gkk0ZYgG!)Rj1St>,jSWc3jJK_K&!'j[tAnJ&B.cii@`e`k1[k]]o[(]6DEXMjIV1jSU3&s!=9nF5r?op%[o0d*q*!5LrW1,;fYoB2D9>rLK9ZeSIHF2Q*O!!(0BTV0*SgA:C%bH_@-#qQ2[!._&ZEoi1DPuW9^^?e-Z"h=d:J4Xa'FU\T^O?J;3+h%FO0G1d4hc?^UikMc(0fe;1!!&l=+<\JMeQ);W-ApR[!5Q,+kN?&P=^ARY7J7k$94tdM+!7]ZD/,/:!!#,VCi$2\[<4c$Ja>Zr)XD8A!+;m'S2bNfr-?soJD:2+^^/c-F\AQ/h77Ssp)s,hEXMjI,NJ7]n*]TrHOBZe\HMt`dE'MSZa-mJHM+<)61@+[/H>d06VL14NK$Y@@A3$Rn1YW0!!'g]WRY`"(RLef+PDC?AE4L+!!Y#,/PW'>ARo>m*X%NmD?0`F\9r^Q4Zki;:Osl9[f?C^7!X''QBmiZXWe6,,.@OP0K;p,;7bZ_RXaN4?Yi=:P"BG[f?ETF1Jil()@Yl#mmmB5m*nVbbL-!YVa*('">,'8J&YF7\_LYKIsiEfaK*!%9"5)^Q;Y"!*!9%;3@E?>sq)6lp7;*a=RAl.OcMa_8=&5-RVFX+OF'J('"?"iT]U+gaB!bJ#Lo_eCIF*UIL5XeuW"`W$md4kKfdPqDL2PQWkIkFQhPmpQ-Oc7ZA<4mX]ZTk,haj@ah2Kimo,3G0Ie=6/5a35s[4[0fO"*aNi)nX`a\0\R];aW`6!_PSDf'T]1ieMf7Le*?,s`n*_nRlH#)4gU:r4_(]ZU/C@4F"qBkQ\TY[^NVA;,OV(_1.=0]l`M%S"#m,,-P7^ElsUq!s]7*)@1MbUFh;H,%B@!0_D;-s=7n<+/-pKq'TmHtDTNrp@T(M^KPs'h8\T6eh3*^@TZt\gTWBGV%Cs\i+m";k".$7`VI?oEbjjrJ!C"$\@TL!Y^cJ?*VYIL?P7hPgoNHf&9WDmSGBsIsuEnT.!,%u2hhE>AgN,II_eYuJ;p*!U*`j$).6#52]C&e22kKfcMjN*JQnF30H,2%/r!19qIi*^21B?lB96?.!b=BO54]mD,$RaeokCY=L#-`^=P?AfRNhKe:T5(389))C920>`'!M_B8?fMN?7.&\">Ah7)jjHj5&3HXK3n`.ZhS&g,++O4V]C3b"*BRr]TMD%=^&7HEqXYrVqXs08(boL?NZFgeTuu2r!+=fh?G.hK#^L]@Z3N)sigr8Wn=Vail2Gr(o[?UFCtZ*iT0=JiNYD`mp$:3O5()#5eQ!U`Y@#&IK:cA2>NI&8js29#L4k5i]=\+9f3d:ADqFnj70!8b>ISKUUIG]HpQlLTqs:XrIei*1A&m$He$XXO!Pi6&kBT9V5M8sPK:=f.$D8mQ>@?ZlM5OS2kX;1G_u'D:/K+9+NILWo9"A6>Fq"fePC8o#5d//G`E?>HZ0l][X^&EB!llk^/`L.s@D[]R]6B$`KG51;b.\nM7rIQUZ/[i*3c+F=HJp[,HIQL!2QW`?*<^A15]`d#6=^Cqt=ll8p0IN/_Pan]L.GaQ/tP9[;+586\]F7^>1d*+tU>=F6fZh??1(,ddAk)-Vp>`imo/]C:X#1Lkpj=>IJqWn],5=iU*L:Rq.Qg!;[ln0[SA#\Btrpo0oZ3N)s7ueQ.6orbufe&!+,6f8UdT`h##$OpN`E*$-.bA]g5BZhYagWb'K^!&BDR'!5^Pk6pOuj3HAY;PhO^5Q<9]3dm-QOYLCfON/B4+'$"#os`e(CZNR!,'XS;3,mlqM6O3<-/SD4rt]'Q@_B@dNZC4Tb:gVdI-T+S8%D\"n(G%F+g0*fH-+1MK*Mo>nNIgME1lR^!'hH(=4b7'5hT'QS!c'F541\KDr3b3e*.5F#D]Si9IWBJ^A-]G*BJ<+h7NEc@Dg*G+$XPlX@8$_/RQ6i`ufe9^OEjeVI+iOFjHXBgUD+Y]Qs+'%3%^>X^&DWn`%N/k0+Dp2152gIf9+clI;e%M\b#MId5k-K?P+J`Poq?`5moW2suNXk%`GHIIY8mU:YGeF(NZJg$RP'^]+)q)Du8C077lAC=T=oa,Wkh:6p;ulAg*9Z*Ud+5C\,"+17c7+P@tAJF<@6pYR=jMs@V'\T?r5Vk,C8_7Ej[DQ?g?o(2H'.OpTE]/7LG`FmJd=g2;M>Aq2TM>#>fk09AkRl8O=dEt?GImH2>":#23o[?V)^%Yk+lIF(#?]eOm!$sbq=0tS$Y?nmC!sU;`^>.Dpfp%gQb0%jfET2XBd")9(^@8uI't>WV+MtWYNufJN/M/Of&e\a48\1"ORHa/-ro9&(MZ((o_hJo?lc:XXJ.b'Eo[Cr)hcmR-4aHVZ/R,ZR4F'g=M!WkA9jV.4E,bT?\otDgU:sE5>A$A6rq"tlDqUEp%m[+0BUKHZ[`#S1M>"#aP%-umbRL.p>3N3qp_TDgUD*.aUbDcO5'd:-p]AoooS@.HgZLs5$5=6Th;-oa"KS_G?kH2Mi/f(,5hE6"XLPaG\/qH:X_,/E&^n%Gp=qFY:Q]tJi9F>W1C4\544lk/lDfJ,!c^+?:)bEa_9B?okqYMT^@]V+($;J]'lmBb,&qrhCL>6"XLPaGZZ[r1$.B2A9ih6l*F%j(:0K6?M29cWpD/QsF&cGdaK+sQ%']mI'R''MZ"DQ]pU2`J3oqt;UEZ=Mb#EBS[B'P4-)C)\0TFqb[XP*.!n..Kfe..Uf<5,Oqj7%9]IK[b_hN*Dq<">9K-j<],S%aSGODiG[Is._91VV3;k+7e@:=C)]P9erU'm#"TZo;1?R/?daHP`*#t7q=jjcthl!)q>59CU\Q,\2X_H7]U<:&ilSa"Wi3?e4cC-V+l-cECr:8&1rVJ/t/6lFbcC?n9iPL:!=0A?rVODb'M09MmBj=o5kgd"Pc^m+9_U?m'^juTW2fE$:I(%J*BLPtNuk$jSpTlc?2ge/ltY(NeZ2cTJ,]&3,-c%@\FILA9l9t3FJ],MocUYG/Y_A$hgZFIjZ\+he>ZA:q;\J!W`5tgbVRSXnA5R-.,K74S_h&,%iR:gP>=@[4aQb]acjL8k*lM^(+`[uCu)[F>IJA$ZY.UX6\g[C4Y!bUcHa_WaiWAph93u7Zq=_6TX[A+_o#toA)lV0',)%CPEWu55:%UEFBs3=qX*%Hn(taIOcbckQ$)QP4cqdNH$P`0?P`Ydr[>LJR@,KV+>+un/1O2@JjcCI$EY#JZ6Za7!O]tG9FfWeqA%j1f<\)4W3h>5Sr5D`M=rql.QC/10PA^$Mrij&L@K+GoZBEG4""?hIt9/J^3-%dlPlXU&\iOS9aV^6!%.>o)?3$\HMu[R7cVmUI5_S3]`-L))Z/.a,V1@."(o_[jNZm^o#OGIkDu?b:JUlYC'n>6"Yo;*)0Y<)ch]R$d*tj)akVdC!cAIeD5m!s]6"YoOciqF84cAZ#mkTlEY:10>.&+bN#BNf%I;NCdrWhua8;&"YJ'goM6_R13'Im"cj"4p;A33MTid+[Aqu4-q6aa0*X+M2oq49I)P1L`/e&">\k,j066Ji[ZNAV^%@XPP8.i\2l,$.'=XfM42"B.0A*_m`OW"#+kCE:Z'XIu5Z[;4B3h7E93%mDBn/JV9,-WdWI7;`,+bf8(Olh3A#3Z8qVNuU0cB@!0?4*N"u-H='Frq5CUnd>O!1N(u-PtL0(lPg`\WmtikJ,OMB_,+*1<)HN?d*Qb2r-:rL:E$bI!&0nYQ!=:2A27H)I(?A]9e?%(Q'M7@n,Mmp&(B"V71$oO`J')&LP1>:2OcjV[[WbUZa6uLhT/"qp@e2T:/998:%S)P?Edg':f*6CUNuCK(Un56P*VE"PEYU[-_GeZeQ9eO*W,*!T=VVF#5cFpO]qecZPd5_2#ng>]">T/gY5q:>O1V@%j*u_i4snlqt:a?(1q2l)[qIcPa%u>,e[O!If9,NCY)$F7YZVN"U>8c>IMc%cgQ]e"b;d\UD\TqS.l&J8g0XO69SRl5-;\ok(+"gK:]G7"ZaN(.;[=ddpen%S\%V5<;/\T8rk#CANA!4`750H5&US8R/oe_AjUqsV:,^OH.8[;/jI?G1C@MMOD-4Q;8`Do3kBE:`3d5.=]FEXMkT2WPX.-ZTRp?oI']L*q!L!+7_GQ6j%[iI]KF(jF+3*0>:8/#f@._"TU4qEm#)W>NSFn!ugp.(DQMHYI!!'>K[k%QjAU`\U!5NFIc)l-SegWbbiJ$&B5B7,3?oD=t?@Q=(XK8MOdaEGgH^,Z.E7*4dV=Y=R*HDMf?oGa5^40L3qRF,Jk2tg_\8an#0`q*4a^ckS0-V#VU#0s^K5_p6c#TlQ]+D/:8_$keTX3d`Qo62c^n-_li;R0WOK?7!UG'8%'9o[4#V0C"TO^!$$oMosRF$W)XI!iS1XgY^J+7RbpU8+KOYlFdq\:4Cf?EYG2Eoc&X>^`]TXJS^]()@[OR[RtJ)Gck_EV&&;fOB_b,N>jgFR[T+lMj'U!OV1QIss68"1Q/4_*^p);:e$FK"G"5'CHa91?8Hd],acdMo?5sn'RurhQi4sp(a,^bc$h)3>Ij1asF)uCo8Vrf[EH,t!!!G%HdB=iY=+"'4$1cX2c$3rkk4eRXK7$Z%uSoGZa3Tp"!ADjp$8fr2Dd7TQBo8^m^nrIDiTX0:oi-1-;BX^fn9q^7RT[6AS,OpXq^qE;0mP7%NRU+e*1D5A@RWHUIVr.]DMF"M1mo4+X&'TA+/9f7un]SF6:[XBTaO2>9_ZP?G%]/q8e[C]6E^=:JZK%Puf.S,8Vq8jPf'+D/F.8\KlW7&@8=F\@B/_>Nl4l!5Q?/J,Xgr<`X0YY`4X%3L@q(ZaI3311eUu3HG6'!`lF,[;k6HPa%Efgt\'UP3V>tQBmhsNXe_]:$&%n/M[$mJ,[!`Z*CU?dV(JOpYL78^A2AgI(W"=jia":SitiYe^_gbb03fDs,7gO-87,Mb_j!C3mM:;!!X[3ajf%u\nfp#R$a72++d4I;Sa,KTEL]H3*B\T9o?TYY[r7le`r,c4S=CQ28E0EZrV"u-G3han9M@uJd-5XfeuX^aL^4@r$OdI9oCI>,n]/>U]\M?!?!LXSNZG1q$)kHpIJWSKT7'c,[5c[NrUu`/rso)00V;RYDM_s:iN[+G-F).JS2o&-:OcfWYd(J'nF."H,/Dpdg:mLUbKS2Sp$:6,qtk_dH4GM4/!+2hW)5%0.OZ]99GN2r:f^WJg=j]i)Z]pm!2@<`gY8d0X,DjmP*;*;>-5k"Z-M(VfdXVm_]0X9*+mKd)&O2-',.]^a,Yb'JuYiNZY.T^?qXj#j^\tU:Ua.lX2^Kb]j2R(Z?d.15@10aWR^8K.oo&.8*fjE['[3Q]Y)\@dbZ=[%84^h]`J`p)SND8roZ<:EMaAAkf94h?fhIhf_:@*/O[gI\5C`\'ji^`.>l"$Y2p/tBq?b<5c29hi%'[3@:7*BLQWs8LidGN\&Jm+f-M"Igg$c'pZ4a2c6=`4YTV$^$R6)N?(#1c.0O=G4hk7>oZ1oja%Gk3_R'l07I#mf)^n%uZTjEH-9fTnashRe5Nj%lud6MnJ;`HpmXe+$X*0X-8a2GbfSsGae5#k?soWua(Luhk.0ZH>J5@U\om=\3aG'=6=OD5EcQ1i7`P>o^FsnIn(t`(,pa9@'h=<+rVl]_>?Y4USNB>$!<@YDb!Kue$31&[<0:Ab!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oZ>6"X';NY/`!!#oRgp62U\HMuBpBOSQ"W@~>endstream -endobj -% 'FormXob.824ec7aa15f7c4aa534f68f3ad7cd2e1': class PDFImageXObject -8 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 173 - /Length 6541 - /Subtype /Image - /Type /XObject - /Width 236 >> -stream -Gb"/lGu,2Vf>_/_N>b_B;%&#]n;V,"I4:FZE'ml_W);%iC*E^V,-Fd?&eVNV+@%Ud0#XTNI1ZSo=Ytk%Q67T6Ck[6'H,=c!E?-UX=J,%uXp0VBAA=Pi3=t%DsJgICqW@]\RAS#GJ7ZGR9c>NZI[C,\/=gNd%N$-d%gt]PUd3:4s09PY^`f3nt<\?!W(;q_T@*eB'a3DiPn=d.nZ>F)tHMW-jJ\h^[cA@RA<``@Pq!_]q>+2RqD;4d%LC^k/=@YkO5kbQDSKJ,sqB%.8.G.O#=;W)#5&AlUfYEcV!eK@R#($ge`rY_=o--p"/46I?qc'8d96Qr%lq_h=aO)C?.=dP.BYOG4'1LGV]G-S6o%jlPSa3B;)!EKQBG!h'Ec#io8t]k\)n62`j+5mG#*[n=2FUhWLM\rpe#N.k)o%Ppms)(0X,Y-cTcDr2^*L5Zs(@bS2']"5HW"pXDEXkU3sPF7ilp?gU=0:M.klSC&O*BWu9OX$upi(t'J;%%MT!Hqi[2IRKs\T66Ldo5Ij-TGW.kgAaHqE]`<5uAR[DFBe$CMW8'm2[5hSs#9-il):kbt3DG")X`#[#:73j@5/[!Mi8Bui(hOZ6E#5:%=JB0;IZ#!qhQpjUO,m(7;GqLSEGTHm]=Y\g^&fUu_@Ck;`*/T0Bqr_1H",HMs<:6+ZpSbEnPK?iK;fT4eQg[nNDXS\98;NZ:'/rqt$12]k"ui;EEB&J5V3M2>$#5&G%LWi2l;c-;6/O2#c!%`\!RfoO*]%DeQBp*r7>k3K>.&(nVQF(36C*q'QIaX<-Vp>PJ9g;$)/!UFZY.UU4*M/I`IWQcf](uQA7oP11+8"MW.hfB=C;BbFEDV4)>9a)Bq/.";;&R*n)MHLH0Enn]K@1u,-tB)?+RsAe(kJ'fB1;F,F*Wk%?1*FF=]a3Ok\c#J,ONU=*O,i`=\Q-RYoE4*Zh#KTfi,![4*a^T/:8F:l=6M2)Vd3Numi?YlOk+D=)(OBY8fm\og*S%:m_cMqK.9IN6`I5Q5bA)B'M*=Q3jCTXnZ.c^m:Lr:.fc+j$0SY?iC$gph>KRRVIgOH@ig>CV-P%*S>:oqtQUil@[/!lbI`Df:<(6\c-d>&g&5rI"G&QbgMS2)R8(p#KJ0rIl$7T4h2&;mZE@poQA32ien:%]QMMX*+aYWNE;9G3p4?4Ep3uSG7cK+!CXe#7b"KE8cft45bU7H90CNf%AX=lg*:hD9U/F&pl>Bq44+K*fmIHGOR,YV58m!KXeP%5hJ%bUApp(PCnr-,5:WtR4r%N;g$gJg5#`1X]gE7qhc+=$k*R:p%@hkTaJGd($SFTtMRZ#TF5^['VLl1&9F?77@C.\+9*1TcG:e$QBO62)QPJ(TAhG)NKl>^NJk.cs@92d.LiSS2-2?d=(!A!uh[oWFrBi-_D<3F<`YNiY:l_j"<.fbH1Qc9X%QP(hn44j0enf_[Knl`iF7W[04#cLA);8M\h,Jrr%MVU5r9Q#)]KP.-IX:IKgS`*e)<:Wo(%+tjGAi^'8d1@3Bt_h`UTqda,_;eIA>EE&Ro1D@>LhUU-bY"58qQ#'-&"9I#o8mZesK71b>,rtF`g74o(2IL2aqfnj=Q\=aN3lBo:r/X#kkKmo>@(rcFJ[l^'+ZD0c.,Nh769!DPFjl++4+r*,fE)]e9A7VLS]0LIZ=O-^S=d&MtN\k!F>O1P<0Tki8De=?\<3;Obgg#2h&63qXVDWgH['d7=''IQ(IWJ%NJkKZn?<9g2i$LbT8\^;Obt/m(]uFG?b(S6'%+\V4I/7rMZB-m2hEtjY4IjCQ6oL,XG1B4R`4#c_?lqOQLXJCqtEN/MUer)Tcnog'?!,Vao#S!O;O:)I[CE[BpatqjR%4RK'4a:kPU.kVeBg[1,:U/%28;_"<&m@..Hm$['?kZ%28:tB4He>aN2qVF&4F(3Mr[Na,V18AaMPebFG`6W!H"=GB[tpr'MCb*$$&jeo%!3@D^Ee7issE/5dUQ&;R^&2H,K6<`UE`gt^]OmHkQ"'&'e\fs?H:ERCLLr4:d^Qo&N?8:QXA5Mk,J\nuGJkCbheo^nMKFEDV@.tE3Fm+J`.c^u#QLpJ//il[N:q/sGFTr"U9^,(-/lEt0E&tBX"SRihjE@d6ET9&URIE:tc1W:!Tcl,PB](f,T?+NGPAP!+F%M')2NfO+JMPO\+Z*:H_FD8"Tc6?<,cHa^+hqHr7gtB6)"MlHp28""ncBac^[PF#jJL:_PTK,5iU;QPid,O%oOc#rC6;F165D5c;@)7G=C7(2B;M`WHgt[;9_M'!lG#VIAg"P0.bFuk;R$]jUlI:#m(nFf6>:WU<1s?'pp%=cBReQ7+F*)L\,k',)#e$O`XKOX!1[6eai`8_;PSRI'9VN&HLR&5gf+1SD%ZdbW`m]Y(oU7[EKuLl70)YsoYoJLag)UnjgE4F$,=-!+/LU"p/m<^rOKNq1?.X.$c":S=H+>[e*9F/D"+Lbfgd#8/`h"i7>#7naZ,iQXRGM:[9fYm3)oP18U_>!pL['^9]*(&qh5;(Ddl+)To?>b;he`V55@N8]-345hq:](GRW@.Wh;CO<:d6Z@%%I3dXegja3+r]m:u&OYfaN91VSZo9II7@(FS/gUD)i.[#MmY'BKr"k'lH04.=PSRMml=RP(]J,AqVBe6KYo>>s`4_^:F&tIaj]Y'guGp9(*]!b'66=si,YHMkSA#&[n=O-_N#2>q^68D_J>(VBZ3IEB3NJ;4`C/Rr-6n4@S#mkkUr&N1ak%-/ZTNHg(NL6*#Ycoh,c*El2_jpEi)CF)=#pF`?bKH*'EOrSJaI8'H$pQs@:=;)+Y`'m^04!*8Bpa,mOA/PJ:f:2S9Ntr#@2qQ=`C28>L5Cp>/M0Ef<`N-Gl\6gR+Cmc[FEBo="@$b.*/BsJ3Ko1(Z..@UH?slmDsYUV2B#%a_jh3,)CCiIVl0Fhq_pAin_#>0&d0RiTY#4(7WNN)s%TiInCtEjR90)Q_aGFi,pc+>KR+".h5;Kn"R#!ia@H=P?odD*3CAEU9[qSA+FPag-kOr=Q?.MBE=Q]mS!0;0HN!^5k2p9L*MHSekVUY'?sk*u.\fhEbitKJ_Bo_9:Pt$e4?Pa+X/gM]Z*CR=Ycof)+X&g)q"!OiG'8%pQBka`Cg"/\e`+Q+F`_a%p[A,W%CtB[RAQjYTqS0LRi.OoI(h)JD9^uU8#NA_IC<2!M$*EM8ZZPoR-N"V\l-i[8[_]4.ofVQaut"1t:./)]9O869OYoEuYsRZEgd(R@3DR9bV>.jFI"+;$;Y4+f,/;pV4"4:)bN,-4&G6Za3l6^>lDQS8r[l[r:.VCH"_A(a8G'08,QT!3umt2K%:uCY=Mo@'tLarl>O5q;`1u%?2MuL4&dTLQ^bUP-K<(B$S#Nka:Z#C(.jG77E_NY,SDbeZ5#>14\Fbut+JH"Rci7S69F?soXdm_7fGkHk3Qhgb\)Pq,qif[qGr-F30>['Xr;baFX9XHdMKVKI:I+rWaVGk0oe!s8WRPJ(O1$j_Mgo()?^RS@:F8#@M^\kic31r`s[#H-^tHhTitkK]Xip@\t&$&OOso(2H?Zljp2&I&[_jQPe5ZY.UU72'>?c(Ruk%0n/"*\^s-9.2EK8>TCV_BF$)'3qhO_Zle<`A\(bL$j)892&&SL"6sqOG:@aUgZU;&Zak:9:"f-l]3#GP(/%&"e8r.CtZ('a-^4rL:\:322knWoeiBO%1SG^O_;t05r!0q5CS!pIf3e1^s2tI-;9d,pY_jRZSNS=Hg8AIXGg;R1u-(F[obsc70TG@`\DsmIutPh2)R7&AnFM#7!O!&3B9)?4Eti"[Vb?^YQ*U?0BUKH1NDEmiPUE])DpZ1%mH(ERA^T?)B'MJ#dZ4F-Hs`Zd2X&ndr6E[.uQE='3gW_Oq&QtChRMWd75:@L:]S>k07D2.#`:)B$C&DgMa3qX=dhl(`XNcSt=5>RP'?5lK[YlMMdR[P(J:;egoV1g"C(RBsFqJpjdk!&RV43MP2`I=,FV>r>LGh9MEZq.p(YoOc^6O5'lkbGO>iQ\;Od2CYS(sZ5q*1b!UpoKtR*NoJ#]A<8YB9pQ6[j*#or'?!Z:Agb=\BKS8:]*ZZ7A+!2RC)N*"WMi5chs+/MQhVQAranRbD.LIJ!hTsLYF`FYEg+ejH">oK(i?<<0'AQMg=L`bSEhW.PF0r<]&ebq4mVG4E+L0Y.CDS1!Ts_lpWiE'(%NI`E/p%=3r)$^(N5Wc\b\Z_&\aR6+T$SDB1rqMO:7\t=lW/\QbW",bh2nY:W^$LXj4q1dQBmioI.If#XeDG^U7rj=<<)tJfr.cCB$QpWDV_o&qtI_4\:fQiV5:!ph-kuR:gI@d;(a1B-87.Co&\%)%Ls'GcCI%VNK)Pm?)t04YH+]cA&aJtj2[3%4aP&&&aJZH@[BmTh7L.bRbFuS_bat3fWgVf:IZqc?+P,,ltkOkH2$a_LCP?1\$s+qm2A_2dF$@0R@,mmSIboO-RYdG=0Gp^ZsNsP(=Fn1k`CN*7>E]n-p"/46I?qc'8d96Qr%lq_h=aO)C?.=dP.BYOG4'1LGV[Q3i$20j8T)e+47_~>endstream -endobj -% 'FormXob.87ac314dbace5e45c60fa73890c6d412': class PDFImageXObject -9 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 173 - /Length 6536 - /Subtype /Image - /Type /XObject - /Width 236 >> -stream -Gb"/lGu,2Vf>_/cN>b_B;%&#]n;V,"'t%"5_$tAnU./"DW/1dJM7?#D8OV'KJH3M/\.G!)p-fN\AC250=b<:tZ3c,!$7I)@CVJs>ohs<3"IkgNmMS"!5H(:=hK)KMH2@4ph7%>&rAW+9EH,tgNZ<%]FYu*:s5A_Tg4,BMO`C6iBqZLk#aV9`VREk=Pa.Mn*^)PG41kGmf%/EYB$Ct20nNe/F*$rI7>ngk]L92h+$[J0Nul9Z`I`>'&F;E+r4&/_)*V##X=*a>qYqd;!E2%j*u/91uV![;FZIq!d6C%I<6A#j<_:P`7h:C2V):/4Ra@Bb(NC8(SM#e#hL#t9V+9IMrt@7&?b%24U/Bp__=8Ag+T6Q.9c*RZX8k`CN*q4sj`V7aH'-RU8o/hSn71*@^tlIDruc_#E#E&`=E\>?%`^4#m%mFnsbgGWncD5N%Pqs6+;;cA(%1+8"MW.hge!'@ChS$3=uBE`5Z]t8rl;I!HH*?FP0k%87=[se-s%%d(Qc27G1cThF(@jNEIVD;]cg-U^2(TkR[GQNBQ[oIL$j2;1YggB\^Es^If5!2*BJ6%aD',#l0@OP(`9>Y[r0Zl9kJ!LgUD*>]kF:HYKs:0DVV`H7ujr_JjW+o7kN5E"k\A`fS!hgkK6e#:J[ZGT&>P^A&bbQkm%_?$q5$g\.Ml,Xf\_7[s*(AGY1TNM\e$K2CJGd%^^p*d4SUX&+B`$^ao3"IRgh_fcj:3&b8Jj1d#HuTW(kfDV21%kK]VV2E"lJ?=@8NaiVZNT0Ht6lTn,PUD:.i(==a-o.I8s9I&T'j3oB+;%[VXXN[;3PSm^oT*\!ieUn(kVMi5(&$%j/6cZEgpIrqY`L9h\6@*^,D,fSI<;(1g;Tj\ZD.@0(OZ%5qW4p:54/@Yq7@Z*?#b_GDB=hFCYaeC7H261KqtP*42*:2gMRQr%nCC03nnKc_o:d#-J!L$j)89>kRI;c>J+0JFn'kgZS1.p&mD4F(tnSio*c;QjE?34B2YVbEK[TAb'7E,\KE%'p@V\;Sa#/CD4^s2Bm4n(G%fa2]PV.B0he3&W\Gh;-oDhLGb2gc<`W.7ZEj$J,\TTRh$JuE;oe2Lkpl*`5JQLT/JPaVKI.QLFhgb[^`l84$>*f(+i^tC=T1US$m4j$<^P9>$>-7T0.B3"6Q"-B:PN`c^m:HmbBfn'F+\'@uHP7PF\6bb+L$&UDE.S@"B>#e'ZQoA_;bBUiB:8=aBJm]oO7"k+Q;Vo($aqMp,YDFQjDK9m8O8?CN``N`>RL1be(`d'3ki6uIL(rUndE?erDB(Ir.RC+;DoG^+mrL@X7uf;?3nI+"f^67Ie)<)lp?4aP%B`s)YL['cs;Y5\:jldkG?2ioo+/nTJ.pi/\lr:naKBkV0F@#:)TJEi:T]mBAJn])a+KHt>>]m>B+F5t9"BH#Q86:+$9DuKY50eCr.f:P*HMB@>Z#oFbs]tG#<%N@<"BZ4rqo^h12?Np`?f@8=>ertU^obUe"J"fdL%?:'si4%.igcU&`GbhJdYM(-ZUpd`*g9k_CoA$ltET.YsIY7h4)Dl-d_M('pm"#-#l01>)>@V0i:=?`>HOL8/CA1V#tPUXS0(GE3MK0\tCK*NS8*?6&d'u0V1/,ie?LmKc%,(3u$0M=f%`40gIrqu@`R.OpO7F)uE9]tNYJs/l\J%DRAjRMcYdMM=Jc6f[1cK_C"Z+`'!jdaGuP`8k:C'bqHShoa-cKm&-2/Sm9!eC9.n?DODI.QLF`5G&mg*5StKo76`]Qf#"NHrj(kdI^co>?MI"jq:*Ci!3UQqWtl'FmRB:P[uObKK4nP:&,k:FIhHkPR#@(!!5,+$Y45oSm0Y7u2kYL*<.GM@,K'r+Hq&:N18,o-k<(BLAA$M6aEBUi3GC^#IBcdIgm-%Po3$PdQ7@USG`E_n!'BFCA9X>@Tjb/isNoe^YgkbKnM$hA"?XOLJ=9,9t+Pc]=CS,M9nSc4=tg3Th;MqA'bZ`*CB8+?DtemaIGeQ6Lb;D4sUs/&?7cP_TbkMH&Y5_bj9.Ocbb=mfLn]@6*L@A4bXm3RVk`D69_6kL6>)V;)HQ4!S,aOd;A,CR1Dj$n'0108fgFD(B`[T6X+.uNYo92kCDLi,#q(O0=N88Qn)"q\-s"6?L5,W::([FJ-hE*"6=O'Bq-bU`UgZSbOLOE;#bnZ0SF[tGT;&,9pFMbsAT;kEq^,*]nP(ej\pV/9ACsU*;#=h;,b]ndfH%F*)MG>.[X1;\NVP^&o[D&;R^&2H,K6<`UE`gt^]OmHkQ"'&'e\fs?H:ERCLLr4:d^Qo&N?8:OC)3:Z4[UH(=pXVuX`LdOs6O"!Lf8&r%>(jOAu4a[2+H'*t$.$t`NY$B)PqcsO\/Zn`;ft2Is,tjQ^S4N*"l^3]BM>[:!Ui5HaQM6gsQB6jP=9?piO)jL5-'BlR3m_hjG^+=PoY4BO%Zp5\:\cFkJ/4qXjSSND&(['[3*O_bLi61>!$q&pFmQHt4"(Di!/,RkE-!mUNa'V,C8(;*S`S?.i>FI)(OjpMtXm+ASs*iQ9Gf?hmSGOM,uUSH2Ma;p8"NP<-@R@0HW9?9,S*^/f?Y9-XTTcK7KEcZ<8]tJEEs35l8%s+9udP*n1H?u$IQrmHm#jmEf&K2SArW,g+[O0=2B4k_]5qIeIJejjWQ'IX&mdB2ujm>"4I$[-(>b$U-dP)2:\T/uB,mEJJ9:%9A]"/79Nkcnc,_Ui(0XnAn?\5h'"DO7]%AX(i5!I1,bdBdB"7M\@B&qcqp$^=jHgl/M.^:8/`gc!TIER^MT#CZ@VGm&b8:ieo&WNdW`(H7#g<2DpM\s'/WBq"F+0L[[O2Lt;M(+EQ^='2CNIn22*qj01GaH-I2a+EV)QA6c4;_`-4LWOdF-GU*$!2]@ju4N>Z4RbP*."eOYfa&_"6a8OhNP'F%HJQ&d3-k`5I=_KlM!rjd[FTZo?De_&c,Ql!%J#Sh,iL[5C;%A7T6Gq>##n^57PT/CAq2W`D[.`&iNdJqAT;P*0A0$6'H7#XTpl;NWe0FA-C_.FP]*W[_.17'Qk<$_jDk,9e?,BoD(4bZrJ^1e`_%[^Oc9e!#&e=*Cgq0VTKJF?%]&_'D0,h;@,)WMta#7OaWG2us-;N>jg>PEYf\RZ3'Z^4"2;Z:>f[g*eC!62DqX>8ZQf*?c^g7n6$<$KqK53Bt_*)Pgf9VPXR^>?N.8Aj8ReC<"6f<7+l2[f!Y`=bS:JSkPl".<(*Kn$>gsZ=VRdn%/LHgoqoo56FZE88'Ln*]#DZEmn<<>?GllfdPWo]X]1CY*<:CTFJ8.Ocf$Q1dt?pGeOAXi5%bA!E7D7uS9>HhQfKldf3A=^A^e2(9u2q8>*5LENe@nGDS*1X7Qs-?43P?FXt5PUTNVcmhZt@k\^%[J4Zs1b9C^AJuI*L5(G#DJlgT[!_H.dA)5B!,g8pMM_`K$]BQ<#BHO_-5+?3ddu_$T43WEe5A_gm!ruI?KUP%dSO:XDe*B($h:TZcZ*&<4aQ`S1Gb6NXD*7qL`?sj+H#+(-A;$Ks8H)Cb%\c3_uuc\G'8&pe9Cg*O]-.8me6&&AaRLYOWu/Yqh:+E#XB0!h8YEnAM"i5&?H?Y0EAZB-_Gd\Y-'s1kg0i)r(s[];)1%JhTU7(&fjnV?&dgPW2PMnb;D.7]mKL>5R*=?MMfRKl-nhAT>,!_ROqaP=B\n^g"EpI\pAXI@E;`eGd4usrpo0oe^W(o;qd,O360"Wjhuuh#hP&qNE<2`TqeB8i=sG$b]9=>IHp+_3:BQ#hag=1#n.6,dG;;0r-\3&rVQ&u^N/F.)]P9b`'cN_Pa7W\S2jM'RC+eeg9cm$>XTf-$r]K,ksQ@J9'@ZY0CLTfFreVW!&9c3*3EFpZ+k&ZPCp;`KHuFb37ECtKl;T_J`-][4>eE/CQnWR.*n)q&[AK/?7M3astZAB>I4IJm$<7e&,cY(6,eQ7Y1Alko=EdVp!iXG692\%W'RTqNVb1@iYW1FS!;'.-E:hnQqm"kYind_ptUi?"M2G'8VXD,:+sQ'F)IPD6[drt\6U.k>*d`]3,Lmk=5U\Yc7$bfn:eL^5Xe0./-FK*Mp)gU:ttqXn3Cn\q"YF#5a37uS9>GjsW%557A]AYM5EW2lu:+O%\^RP6ZZ7rr>X9uDO`X=WK::2EKo8ih@pYb@cL7j!.I)Xd1?Rl?CfU+k0CQndXUDni]cZFY;N@W6:*H?qWABt>,oX/i9O.On%_8dYn4>-E0`B4n-=V8^HoiWK2!7XTmk.#,Si?R>FBokPO>0ekCaY$?NZ7Rfk/qNs!IhRP;8i@]keX_jtkaEI4>d::h5@?@siSfYm7N9\$!mlkdQLkC>4X/i:jRi@+POH:$DhkQsAj5]/e6UPk)GB%U_pHS0#gY4eM3>p^D77Emqb5;#1Te6fjH[C*AgV85&/?`3_VKGqGR[RF;^3qImJj5-NMime%R@2ZBUDV^2sQhfb^U)R!1E]NDu:]'*7<7~>endstream -endobj -% 'Page1': class PDFPage -10 0 obj -% Page dictionary -<< /Contents 14 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 13 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.1ed611e83a1b7667015d6c97b4dcca71 4 0 R - /FormXob.370f73ee3d4c2f0bdd5f20285497f12a 5 0 R - /FormXob.585f847c2171f7da65c88d2a28a02c7a 3 0 R - /FormXob.7760dec5e599f8562ed284f6f7b05ffc 6 0 R - /FormXob.824ec7aa15f7c4aa534f68f3ad7cd2e1 8 0 R - /FormXob.87ac314dbace5e45c60fa73890c6d412 9 0 R - /FormXob.9702a690f73de6bf3ad5d39d0b3bfe0d 7 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R11': class PDFCatalog -11 0 obj -% Document Root -<< /Outlines 15 0 R - /PageMode /UseNone - /Pages 13 0 R - /Type /Catalog >> -endobj -% 'R12': class PDFInfo -12 0 obj -<< /Author (anonymous) - /CreationDate (D:20130305225909+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R13': class PDFPages -13 0 obj -% page tree -<< /Count 1 - /Kids [ 10 0 R ] - /Type /Pages >> -endobj -% 'R14': class PDFStream -14 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 397 >> -stream -GasK9]kSNA&A[gb@Ga@H+OBdQD+Ip.$!`TndR`26,k#)Nmr79/YS..+`U]M5cshT:iFHFBJnr9=fLF?S;6LA)A.$nK!`=.[e8o?4Z)-Dbn]gT@`P@T!dc3ie,TtGr3uI8l2;2J;1Q*q6k5!*\%M/BAsTLq&_H=0Z7,(@3dYQ1kUZ:>M_Zt)J?g*#%de,?d3VfMJrIY5gATm&i$LADP=m(TQ=HRioI.OHN89ii)P]efBi8168FVBCT,F3[&/5hQhqUA5nj:a$YdUq2*$n;L@U]"D(nTS2Ps6s@Bc2AWA#mapa9GHZu<\ZZq-l#~>endstream -endobj -% 'R15': class PDFOutlines -15 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 16 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000415 00000 n -0000009771 00000 n -0000024128 00000 n -0000040099 00000 n -0000059701 00000 n -0000087466 00000 n -0000094286 00000 n -0000101058 00000 n -0000101704 00000 n -0000101842 00000 n -0000102126 00000 n -0000102234 00000 n -0000102775 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\334\216I\216'\001\317\332\363\365\210\362E\234\335\254) (\334\216I\216'\001\317\332\363\365\210\362E\234\335\254)] - - /Info 12 0 R - /Root 11 0 R - /Size 16 >> -startxref -102827 -%%EOF diff --git a/z3c/rml/tests/expected/tag-image.pdf b/z3c/rml/tests/expected/tag-image.pdf deleted file mode 100644 index 945c2c87..00000000 --- a/z3c/rml/tests/expected/tag-image.pdf +++ /dev/null @@ -1,112 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.5b6bc7d162ec057a9a7579a9e03fadfe': class PDFImageXObject -3 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 42 - /Length 2262 - /Subtype /Image - /Type /XObject - /Width 145 >> -stream -Gb"/iqed-;*63>W5!g?bO5M8T&c)c]KYDu6-H:_;Z"da\"Obd-(^_=WXT^/\gpCd/as@U``"FdQo#L9aIc[&=B6SNBpU%n]^R:U^bKT>>mlTFaA^1d@4aQbadA+`Z`7$rBDeqWtIHB$-B.k;*k+^V.k:SEh?N5$:mZXQp%XX0url+9:O$4LfH2"B2iooFAeSd+uUd6*+?X-_1i:QU;Vj@,b2PKf_bEn!tjJ.Y1^]&tDhH:]2(K/u"s7k:=^Z'-M[.WpT`G7]-\Eud^%XtfK`8\*fnK=G((/rqYRB_nLu&!_a%bnFcMQ3VgQ'^K\MrMQAHa?9Pj3%ZbLTj@b<(_ae?g0Pc&0YVnX-rC1iJTGd`)J;#pX/A`29;t,B)Je[X5*.o"r/(,&Y8][Zr=bAJa-Wn:c`u8E%C?g=CY]&1Ifbk2&]=Y["S.i6H(D9)<34dJg=M[/&D)_^()di1Zpo*TR,&D8*_ZB<8\Cm6Fi`$,QD"k1l.CXoAh'r)DN\rn0bQcQbDWhL9PH%ND/'pj/R[=,7?Hm]8HR]$eiec')G-]W7N-!`pitc;(=U-1UW*"g!"Pg3cg:"7JsVQn9H&ggq`M5D6^YpB%UH=g@nu_.h(33QWEN`p<=HE1:pm:NOMkh?R5pk#HB#9RIn52L$]R+ob4(D'VjiF&^q^kF9)a-a4&mHJFJNsjXh?HE!,O>'%Q-UH&K+^oEbbh$p\8/".pI9n>(,B!N=LDKnfq^SR%r];Yn@Xdop-QZc,#(=/&IoM(U/:1([kAp'nCM1&P5j;],dM_$RRU`)b4W+Jb.K7kZ:7J).b;n(,A\\\GZCo&OX[S,-V,^`$>I.T6WRs#/E\Q=E='Np8R&'k]a/[&/nDBp1tgP$ILCQr#N)BKON&6bj)]p:E$m1>W@HgN5f4128U%C$s=WOsuhXJ+Qp9c8B=e'WR-WV#f,10Zj"@[/Aof?(7"o3jhKDu)\1RPLcGa"l)@N[gg@$GQnn9Z16$!_/c1F?HlZfMd1^E7j@L@Z@leHJ`1c$-LVZ_c'@ON`,PU4UUs,n`Zn;mM<7PR:C&,sGOE?d$_F7;2.h8,U@8MWcQrYQaCYZuo)C6=+YS3BL0%IjlNr26`+&*lJbTRJj%V3IYP[unPf8qc.YIK^5FF8t@lAW"Am'dI.ofUOJ+L5p8`k8UHMUD86s>H1]r=/0p`MTONeFR"L=Fpfq)Sml(Coo'Qj7[3^2,bHhESM$5?U`Y1DKRIThe$(O,a)lq>HHa/IrDjOP)T4P;Z4)pB&ntG83QA>,6d#%>\5jOZ;'oOj,fP)"&[bYW+nsoCW0_VT5@RV%Kn^3JZhd.I;[#(Z+/Me6,p6VP66Id9R]"Cb:AS>^W_'QR=UCUE%8rfMOS0To=7lg7OTO%j&Bo([UI7hMkMgH>/Y93ZbZB#RHXoIEiRS?"/I-N%q8;XN6'"L.R'Pghs1oE57VAP;q+l>/(a2F:9EBST(.u-TIj.?0NP*B/\Apc6qo_ci8\9$?_LWuiZp$G:0ldhjTECmAendstream -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.5b6bc7d162ec057a9a7579a9e03fadfe 3 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 179 >> -stream -GatVU4UT(\$jGSFi&eRb,aRG^GV*d0/d2bkD("1l8ael#0bi>!77`?4O%3#n;4Dh7/cko=+@[b%h._O(DF'.S$IYg-C#1ceNfOu*qPh3[B2+pg2J"h2jWuG;U6!SZ+8qpg''HRY>,?I#C9Zum1WUjDgLqO\,~>endstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000415 00000 n -0000002912 00000 n -0000003254 00000 n -0000003388 00000 n -0000003670 00000 n -0000003775 00000 n -0000004096 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -4147 -%%EOF diff --git a/z3c/rml/tests/expected/tag-imageAndFlowables-svg.pdf b/z3c/rml/tests/expected/tag-imageAndFlowables-svg.pdf deleted file mode 100644 index 1a4ae3c1..00000000 --- a/z3c/rml/tests/expected/tag-imageAndFlowables-svg.pdf +++ /dev/null @@ -1,140 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.8b633a33a5d03629ef74293c0eb01587': class PDFImageXObject -5 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 225 - /Length 9077 - /Mask [ 1 - 1 - 1 - 1 - 1 - 1 ] - /Subtype /Image - /Type /XObject - /Width 307 >> -stream -Gb"0WG?bj6g'@,'7PK^-_h&%L.Tb_`W)tYj$[1n(6a$0`M"ql"1tXDdQDh?N";T93f,eE+Q4?Q+$L33W;0it=,/"e,H(QVU96aSVG'8(Q[QNG3nql`"fsA<^Rrb1S.=_8H(m()N(Y2$"GW>FQ/hSbnD/H$9)aZ='`l@02j2Xrf4q.i+)ErPYZ*?%X1/!rdK`sm%2hY^B>[1OSs-T4BBkqKC2)TM\TWkXs:/7t4^`nGFjmDH;XK7q[RE>DhSXnSLT7&V0ba?u4RnnF46/^]OfOFFCN+*np^.ZNuC]6psF6(X^XXSI\_"<%M:an?Xb&h;(;Er5`8a&OIBS)P;$>p\/=3?O4c\n`.Z2#Lh;VQg&rB,h%JV)8[E\V'/6mEKaf&<^b]g=fY=+s_%[QjANl$mn;M#_Rtq(rBZ),_e"?#`0]5-:2/IK8G[,_I+Q5L+nu#0rVXn\[oA`Unm)MqtJdsfkG/7M2@)ZnaYo0lJ04gET>()f<=/\jQ,CGbfnktgqpopG]#l9"4Q]@+gG'S?Cma[ro1m)%hB0U#DXg2Y*b]J+$+LWgU:r<2f@-qe^`1!S2temMMd:cU*=gR">OT:TM_IR9pdVCk005S3]\cmY2$[8oD\^cc-4DGs8Mn&Iee[?Lu@4L2fIPaE]68VqeQ:4s:$^]O^MpMKT76b8N?(*(mbG?W[VRsEjG:4O22fG"rqnc_-NQdMQtJa6GN$Dmp$:3_=KnIi;ERh`!kW:%1(t=b4*U,*I/+D`6;2n,#lUa0[.NeB]*8HD0KEZ).nkP/JA/bsZ"(gn4@K[1Fmm/!#E'BOL<1LcR1MGP8kPtXV?mP89Rf]+[Ql*.NZ?15l7W0]mbEYGOH=,m)&Y0=WXg(/E:Df%b0%jV.OsJuNViYFcafA[2/8AUW[^+l@`/O@77@@`"U9a)k\=jI.aq`CP&e>8nr'a'=NK"1M%f'tS\'(4=t!6B9MDOhXKGmCHN3tmB4kk,J,^<&%eeMMmC6EcR>,P@)"L'cJ"Ul08#uDneStI/3?p'.6Np3,el;3*fhG))Gk5+$Nq3EE6.BLKCDRb<[n`WMp3D+KDL(Ue-c9/6N&?r:f)us6Hl'"pYB#gaXg)L!h8NO8N^-CWjuIj`!0^6!V0RrReAb>ISM3Df;t;LPJ^;KFg'Z]_Yk8jlPS_CtN-5D@S0QXO;4JZ]_:To%q-2*u5W(@q2iT`suFuD$p^Z]"&jVEPp/M&>lG>b]mQ^:1'?LN2rtYi['uITO*6gi3$@t:7j]ZF2EriB2VZ,X/i9)lr%(n>kf[#G_Q/>-qFMX(=H8d=I>JCki:]EkK]VSB?h>3)6I)MC>-%/!s]=sitK4tl6?)o*D@)"ge=(h5sn"Lq=eVug=f_4XJ)>]Y-+q)V?Zl'fn;j=>Yl\XA7WIh?b_'go&\&VO:X=>%9nPl%j'BVfj2=>).q]$4;o%RXBiG]iPL;TB$D5PCm]2!,A`^6rp#S%UEc/3@+hhs9Rh1URUIoGZ[2:ZVS>/;bqPO__-eHjobPc-Lkn]j0!/?eDU>%B,$sHOKUeR&QBp*Y'.41t%CmS"?m8eI(2hbf<=)MM%fRSoSech*?6%Y*):p1IE*`)q!hk^jY<-Ye"bJnDPs'[ObOb@/TfiidY.SfWeq!c'l%TeZ-<0pRXBdk16Y=IXZafaiPfp.)B:8dH`BO?[hgIXfZGdH90R\X/i9W1GbXfJ*u@W"3J5rj+`hao1""J!oBb/:gUD)KfiEoA0]>Cjo("Ok14i49FOJmsRctk:5/EZuUD5FLIO&AiT3$H''^rd+%i]a#&hKNoTZEWjB,W"ZrEp00=/ZX_%9R@9S]+5nCHhZs1>IQrATX='a=T@rY^VFMHAB5;o]Ff,IdNtd*\,V'6)(P&lI=n$o"9`ft!&Z);q!_^8Ce5bO:j>>&cY0KoY@(ZA=V/h-/a3ra'd#P__"9SZ-TaE%DEWZ`6.Z:5idgNASe)%2)P#eZQK7+;(q(^R$F(cZe`Go9Q]$c[RJrr[+".f0['VkUWM?6;mA)k#+j;?PhRj0p+!2SC@q3DQ:Q[nG>$@L[H"(/hTWG6=?jagW9Y:fD%>07aBKZ`g5;5CroCIS@Weu\VB:h(&=]nn_MuEYPmuo(mK)VB%E<:VTO`[h(Ke`5V]mET8/RH)W^QTEZOfGE2PceZESFQ=H-9ok/6'*i<(RL)>N/iCng$F1dqEY+.>e%2LFm@JU0PEeP0#Bdr&Lf7^$j[-C\$nSFm+CIFRpgoe^#q\5FIY;$EokHG>IRd==Zq0-0I.o3+tg-cR@+A\m'b;lCm$pBp?gW*o((buiA>`fM$qsXVkp5DKnV[9o]YSjX6/R,7Rfl5f<8PeABF2kZXNL"oK0#`6T9&Ha=k=+EoFlhX&lM(qWk=ngkQ6a_83t:dk`I'.Q9;Qktd=8rr2nEr)a&.dt.`2ki`P?>]"=pjlPTcKc]]nE;]M$CY,^p\T.k*F8l+5ZY.Tf>$>*3=I_L!o(;1qOE?ji_MAC,?+=k4`uff3,\]koJdJi\Za2I;Q2EdnqXj#ZI.7A6i.]o9,Y]Zje'H@$Ua[/f-;6^2>[.F-V5CDu%`_10N`%P=$49=mP(d;\VC=PeRd"-$l%_,CO%N&<$%``>>pg1-7k'hdVeJeD0KC+J?sk,+]g+=UCJ8bC9hd/S.m#h^l&Hn>67J:YM2p\LW,:$j)`p?QLHb5?":MahudiC_0MGc-$91qjFP+#dEP`u^^6/ND\&F'q[R,,Q)%h9(]\edog;$nZGW=Y46bf7Xl(5qkRh)hJqJe6M#s!oBA`QcX:p[]L^5q/2^=-8cp@(*PRZe=]T\2^?IK$^-#]Z0m=i<)@WK&:Yh+lSUG?p`a;6:.(-"[YAF'MS)`m7:&-)]BWbS=Cl!RL)OMal(I:jQ'iqGPB\>dEu.OlVJU8FfBl&Hn92bLo>Fdo0UE=QSK6pt-Z(t6/`Lf[J]A(K8`4#o=_jlJ5O%>6.''MS)(/]9?1M2@'1*ZcN8].QFe-*9$OK[IudlcknXN4_2.a\Lml-lPTj&[Lk,dbRmXf[;.P5JW9#Y?X@_'D7I=Cf6qoB)%!QP])Q5uLC^C.no.LPH-1"lU&V!YQ3k]Y$?S-`;]R#%9BFOP$9A9_(8Od2L6Ud*RT)#ba)/OSBLhSNeth2$?4,T*gI;PbAf8]"0qcVW\:tI!iT9[s*1G]-*(U,]Uc2`b]L/Fa&%*:/9s?km0j;9#6IHN[AI4Lr%<[c#n&IC2@_Ij1,Fe!AUZ16UF+G]Qca8=U7S49#2dfEfT(oXKJ]Q#i`aW&(KG<6;g=$Cj+==b6UkjXK&9E#bn,j7'Q)(,b6=eZb3r@Uab/Q)&jO\lg'K+GnB8#Lhk5#Q53P'fc5"oXk9ZU_)?>k2!Xnae+7ui^S,G*??0bkr;#XN)D@OpY.BNmh1;LLA2b,NY(JD.@B1I`F'l8/4-Em-VTnX_*ggB-j?rd;j]dur93M6XJVkL_*ggB"KsO91,<*>>ah.OE@Qm.YYYZRpGM8EEnbkn/e"VqWMuk*\dPHLI+O`sARu!1<)ch=rWRp'EH^d*3H*ceT76Wnr7ViUoI'mLoBIE[OceG.9>Fq-S/j\7FFI/0kKa%r`ud)n1R[YFqCej+B#f@l*]L;?9Sq4UR%:Ul[=@u1LQ%1ND@?=b&K3`S/GE4ep$1'K(UgTRZ*^lKZe7K*3c<_4m\\nkFES`46s!HVq^_!>GOJkN()'Vk+#/1lII6Fh8XdL.;r[F/@VTUk?+P+a:M+5T0>T1g.3StkZEfY2iK,mM_3?obK*ch9I/.f/H90NG6N>SK0HlB@5s`.?Ku'!5&Bm.Uk!2@lGn`1__/*k$@^0&(hS&5[R(VFo?qQrhW[amXJ9odN0N1nKh;$dh>$AKim)R&(CCu^q4U0BT`[3;jNdG1C-:4HS@k`6[.f$^=%m:q'8=JLodKk[Q;-m<>+iGVFn+MGHl3;"C0k85m*mCeMP&Sh4TqTB=lW_1Mu$SI#W1P*_N]cH^%58(+B@YgCeFZ*q*,q]SSJbg"BYGngabFFa$P?XNj2q=B)`\tuBhP*2]>-MJi-#q.nu4=i%b[n!^C7,6K\iVn4?V?Og;k)J)A=:AJ1u:qHG4h)QC!:S"gbeOR\VA@-:5Dfcd.C2CL(3dO3;$mM%JL7I7!0IP_'bm*)+cp"r!\J@#0JeZCmk@l4^GB7#30d:3q22osp]m7i4pQKFYl_iSfodR)jIZP_'ba&4"YX"qr0Lrr%0k-`?h;H9iIcSNdAd;-6q&G^-aVm8+-:q9E:T-B_rJ[C)$TNeN1@6>6mE9SULnsL5#o+[nJ6'h39jo`<9F2.;V/Q%H)A=9oWiN0,K)"io"+;gg.@B0TCVsO(=n):\CGqYVpGo6U@j8jdf%*k\2n,$9'G7tnV-kVq,`jj:_*h0P-RX\g@ZfOlWMt`j5#;S5Cdpsa_I+Q:&/5hsiGb1P"kK%HrNFAd8qJ2,pMbuu"qr-k',0EllcXB'r^83&c-=KY9jo`<,_EGXe^]r_E)Y0%SNfZ2AS#F54$.riplXg$F@RdIj=.uS,0:H/&.f]sa`K1^L,C<@5nt+L"@89;Pqh*W?;V&A8P'4[;]&1R&RN.sjmVZaF>*K@2("J,c-=Kc/hS"Z),,7MDj5iFIV!4%-5'sQ7n=s%0+6bACJ5u]@.$X9NCRtU.@=g`Bd?D]0Td2%.k;hMU8"B6l&JSm2("Jq;,L3O2r#!LP_)JURm.<.&g&2[IWTaVcH=:=\g)U>)A>]7o^m53g<]B2Vu*&NT9GG$+F6=>6141/.Olp\#88Eg,`VO89RD-`R$\^=:(%F;iRR1<>6t2Lf@MrB3h#;>r'*V=7F3?:gWc3HXfSVtmG#*]bEettQd2$WC[B]YEcQ3U_i,=dcq?+Y:Vo]ZG_%cf?gHj>l5?C\Y2ZVRguJBc/i%3%u89s7p=*ZQ/)0sP*#IPe2#gj0>Tq%8AR"g]`S*9PS>Df0G&o6,FDE[44S;c?t-?-+aG,@"$:5)!E3"KORBqJ&^_RQ5Gd\$rin5C"Ldg=tA1I!fC5@n$*K&:\2"@hGp*>tIXB402Sk#4#)g;d1_h4UIItG1.=PtA'q#>:qgp&nBZU`1Ft(.2`J3Ma$N*ZHL*>%].u/ua,_=gh:/5lP>kO^LCP=slVq+n>?_M36:Wk`JKm-6=MulXm-H:E.QVV281cDF(ds=AN3'+^m-X1K_\*Ll&/,]ZeT#_SFgm_'nGn2:T7?i#/F^-`r=-1MHhQfWWV)rPLCP@f\8U7gpuhMHles!E2)SL;[hcOr?r0p+Q^*gN'bpm.O@P?Qg"=rI5(+?&1iaqN>jfOn.TZs>@=ej>IJA4F!_=o(Wo7!`"RpD&`nH_DS2$t@/BN[)`DO-m^qq*h7D_2kEh^/bXYj=XfVbb+B_fSf#hJ]+G8qCl%+D:%LruH:7ZtjcBp>=pW?H<=deOo7hUK;48X+'K=)h)J2J3VUpF^[?G1YB%'6[f6gc!ZI-Bn^$RIT&#)\:q\qSbdeQ(hNAHs&/4+?mWckR?5Vkp4Y7Rf^?If8q@R&p;Q?iN0+i4upHl_#Y\Bt8b@LM"i%aj;u$A3s9rQ*>9p6=*t>nuJXbVP0]WUSG//d38kDJ,ob*eUIPtrJ(h$#47Hi22\9\G68d.VS>/;bsW4=l%?f?[)-5A#D7kHeQX`Bpu2YnYNk*R-K0%.bi/O_"r#Ca[pV*N1rRGThnFNnaN-nV>8rGZRM-erjQ,Bp&Dk0O^TFVT<)chp.(JRUu%1E[;o^m6IFO\giGX%:E%Z6.$'.6Q)eCpXL]>6kS!]SYhr2s]VbWdCEs@qc!=k]Jj2R(*p[8"ZqsWt@mN''4^4#nPh7ImJ4hDU.M8;S(7^?)r5s\r.VG/s,2DDkP[C(k*Ddd'_U4:Q#0UP@i/Mf.;ZEUQ`=f%UW)b_TbZEe4[C'`X=O!lX0\'ET9M=.k?2o3#iFgkHH1!(!Pks1,=H6K5]VZH2da;Dnc$:?XFmUm.',VMfWK#NZ:'-qXgUWQgW_DqrlG&5QCYfPESpM>TERAWtCL)e^`3laiPQIf6)1W]QNP+[C,[q1M9BU9aqO@[r:0<@Ddg7.on3)Zq*h_93khOb*4=g-;57>HM$^c_hS^Bg>gC[5s[e6;,KnV8OZ':4J,J=KhgYIiace)*?G(O]qXoUS+*r0V4FdA.mG#+(KnVJf+s[G2D/J]KP2F:_+[e6t-:2/IK8G[,_I+Q5L+nu#M'39S6=L4QM3&Rk?m6kN0UN-&+Uf\a@L.UCO;PiB+s_msQjANl$mn;M#_Rtq(rBZ),_e"?#`0]5-3F2LQj]nC~>endstream -endobj -% 'Page1': class PDFPage -6 0 obj -% Page dictionary -<< /Contents 10 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 9 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.8b633a33a5d03629ef74293c0eb01587 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R7': class PDFCatalog -7 0 obj -% Document Root -<< /Outlines 11 0 R - /PageMode /UseNone - /Pages 9 0 R - /Type /Catalog >> -endobj -% 'R8': class PDFInfo -8 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20130305225909+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R9': class PDFPages -9 0 obj -% page tree -<< /Count 1 - /Kids [ 6 0 R ] - /Type /Pages >> -endobj -% 'R10': class PDFStream -10 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 587 >> -stream -Gb!Sh9lHOU&A>9Ss5=u4V6[Q*>cEUF.cJlM-)C1u"YW[Q:2EFirqdT9gF,ZZg?trGKjd*8H10!c$=X6_c_:NUjk+,YPT`8CL44sV47;_-k%VH$PAe="KW0*<F'8q(Htea")/aQWYh7r6Pd6RW%-8>o$*=]pr06':j7=r%l(":,=$jiT;)LoSdk:r!"luO<%un3'4o^?8ieBVUWIrn@jPXC>X!#Ob,+Z4R$/Q@5rril9\eDYuN1]BlXVEHGe7NqB5\0^^]q\tAQOVh[5;\=HJgJsbrE0aZMs.#9ho)Pmc.j?)=7AE3.='m1mDk9>rBi&t2%-Lhj#\/`Uo"kc3C#N^%ZTA(!V^I_]?>WnE"FSV^$Z4=H7/'Y*r\gFA0&j@r'3qpg?"0Y?/OT/R;EGJDWH^Vf_Xkc4giS$O5bBTH?CYXQ,cJ09TfeXCLlS;m?KIC.'dJiMgEB3$d$=endstream -endobj -% 'R11': class PDFOutlines -11 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 12 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000569 00000 n -0000000785 00000 n -0000010132 00000 n -0000010475 00000 n -0000010610 00000 n -0000010879 00000 n -0000010985 00000 n -0000011716 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\266\223\013\225\230\266Y\231\206\3278`\331\265G&) (\266\223\013\225\230\266Y\231\206\3278`\331\265G&)] - - /Info 8 0 R - /Root 7 0 R - /Size 12 >> -startxref -11768 -%%EOF diff --git a/z3c/rml/tests/expected/tag-imageAndFlowables.pdf b/z3c/rml/tests/expected/tag-imageAndFlowables.pdf deleted file mode 100644 index 25f55bf2..00000000 --- a/z3c/rml/tests/expected/tag-imageAndFlowables.pdf +++ /dev/null @@ -1,140 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.2936907bfdf77cbc498f016927101147': class PDFImageXObject -5 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 86 - /Length 3441 - /Mask [ 1 - 1 - 1 - 1 - 1 - 1 ] - /Subtype /Image - /Type /XObject - /Width 130 >> -stream -Gb"/kc\l$s&BFP1_2Dt)$d:1-71_WG5t""8d$&bf&I]R7/-[n]Ci0j46p]$_"a0tHAPLlrJ9CjJP]Q3:qi]L#Fa-T"Ac's+Mn;AA&B6[X-o?:8=&#D:N"#.Sd_Jd&9nAMZ$Rc?Cq]/Y@kGCugmI;S1MEQ=hE#?fu]AM8aaT1Fe#Q@"WD]Ve6J*7aNZ3-FN9]5r]/8)?iJrSUU\&9qs,l-cZ%,@Ga:aj1tI*.E%7]"0q@K7*%X`Af\njiWkC+51"lqO*V0*PI'PBJf1OT02\,Erh63ZEf)S^]!jfHpmVVo1#\nh"B/Yc3VT5AJc=Ij'4BjV:+2kk67ig(ZqPk)\b0r:qcXj)4V):BjW1aG9sr[">($q&@&2IVjUXKB`Q6S_#QPVQ<*!=7!gZ)uuaUP>9uEFQc49!Pn$gdSY2"9^dV)^&'O6ZPLEmUUKj=0GrtOFg]EA_)rZ&;rVG*uIo`F7LH(Ktl%Gc6>hI=B"D!/K;VVAbkh_dMaT?"DMF),S/hm>a3)l7K"=C+Ak"]sJfAU=.%EUKQU+N.i;Q//H.6[FEoi_BsN%kVaghJClIbg7+JB.Che#fJj1ZLr,IdH\qC])p?cEfgQim'seq:@jhddafm@3jBfh:gMK;$:u_Tu`Ef5+:,^BULR&2*)B/@nCjXR21K+c_NWo*aNDp9X1"d!$,2'E=2JJn8C4$[G>uV@nc,FbWK.kk;5bN[lL.ac+H'4?u]gpgIb!9C[Nt'diDUboZDk3Q6bqekZfLKir0p'T.OkEb0"GQhe^7P5tiPEKg9`>*6*8=eoGBkm.`S8P!!VW:p8uuM*7C(XQ669?@q5$Q4JD5R:NNg&#\*=Lcs_Ys-4ti8M=plM2=X[jDgXP`d5!5=A/'/D7IZWLoh%R/5#uJD-R#!Ct4c/.JK\;hPKdHbZ*&omX+;2N/bA=BSmAO_!:.d7kKp`k(#fe%"%)Bc>TQpKJ^XW)gN/-g9n9KpU)/\f1$QU>slYX%2rG"CReW\5cHb`#!.+i12ka"f!N[]nrqE:aVl=hB+OEDSh8`2^pdo%QR65*#mk%-#X[",Ofs=\_!N!>3!HV)troQI\?^9^#=7,?QpZadoGqfh>,"Q3`/l#;<4!6LL(3mqm;>D2;-DSjMNd2a'#ggd(q3&M5_iUbYsb]ja""]dcA\fuB?iiO&!^PLOi35WqkHR'-KR*aWf^n:jJn&Tb3('.eah]JEM[&j5^)dgEdO)BF`>l**+9SmWp06Tn\hjj8O#guco7C$_cFSN8udG_'JXgj(:e9P*nnOK[6iK?kn>.LPi?]flJeri[+^]1DMBV`UbNOnV1U'HA3WA`_,Z[[YiY\F\l."XWK>CNV82<:lUW2MZ6]R1"(Qr"9LlJ0]N3]b>>DbL9h[9,de1[W?HDg'Ht=lel/IrgDER(cMeqYC#aZQTG"aM>=r:+og:N9?@rW_D09;hA-aAd$\gEY138bbi'P@0Q6YOP7nqSA49.ffNT8-`cPF!35;&.X&;Js0qoSkiQG5a9P8WsU9K*A$nP[U&kMU"o>YqIs9[^M%D9[uVM0$DR/kl(\cZXB55OdZGEad#;2dKHA#SogbAU\HC\3:Ss4hN7P.K,`5-`og&N[dDq)aI.f@Q[uXZq(#J"84k7RM9GI6Eu=ob5#K["qZi86D#mOt?F/UJLHEq@EFtnV[YYJGC0N2k#UGs_O)`e)0)d_`U4<:#BZoVfh*cco3&^>XC>$l0:NDf3PVCPLkT+K[Gj[;*Mi.`B:GfhIC(l@kjVkHl1:7`XP[)fE9FEV_$!\TETGUITa(dFf,"t3A+]Y"B=CIq/8;/4FH0h2\_-'@F`\hoa*j-]Y^3`L_r8h1=p=Yqo:=/;_DBHiBuE=[u4d*$B&Ie"+Raq&W57a\Ba#YK`!"66+NaMM5$&r>Bgbs;^cVM_sYUWoa3HQEjJX@)NI.r?q0!VETqhE@j3RfpT"pBK,="rZ_6UM,J9AsiZ&.PVuI"=kH,W`(^\H^L/0Pl;f($GEt/HKdKa-Z[#mb4Qck:NdTka@p4=AMKW!n2kO%iX4a+%PsVJqh'Mg+P*jW\U+Mhj#iUt8&bn)#YWO)\+6#NT0,TqCkQIFZS_tQfq9j]iEWVSG/#.HH;1Ks+:^BgHYq798DlD2M\)Jj:bFB^hgC\o;H:%"`HcWs\CTB1n`h!$E@9Mgk%VV"54r_tmMGA@":V56%)>K12KnD(SlW7A\OSmlGX,:m0V8WqK![YP?b0[4SD:rC-*s.&GJA78Y!'=J*A3?!5Hnp!m]cU73i^-fm[`,^NS554-[-=Z5\`Bk;o;Z;nQGDC::$=t0T\E-1Y=kP3K%I"HS5IogSDcLLBO3hleVhS@CWc(mO8<;,DEi0!5GO>7RPopn9ZYXJ#O"H@C(tsj/.PI+-Y"pJ@=gj.uGFR3Z+[*^=BVXt$Cc*W1/+-B5+alZI1hBZo-/BldS`68Ql\;k-:(?g%7u7$pCe%rKe94K)B.N>\f_[4(&VtcnFh/?.eBk5GO<,P\GA;#]]3$>VTQBYBGrpH')5Y:[OJ_i^9Kd5i5KbtHR>X\kU)%s5S\FmonqYG2qrh)*9t?/cqb!YMa/8Ub@.B+9K".)ZAlu_*NdqGMqYu*bendstream -endobj -% 'Page1': class PDFPage -6 0 obj -% Page dictionary -<< /Contents 10 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 9 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.2936907bfdf77cbc498f016927101147 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R7': class PDFCatalog -7 0 obj -% Document Root -<< /Outlines 11 0 R - /PageMode /UseNone - /Pages 9 0 R - /Type /Catalog >> -endobj -% 'R8': class PDFInfo -8 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R9': class PDFPages -9 0 obj -% page tree -<< /Count 1 - /Kids [ 6 0 R ] - /Type /Pages >> -endobj -% 'R10': class PDFStream -10 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 597 >> -stream -Gb!kq995Pr&ACZWJ,#&2;@,5aK2bk)COD:DOH\VWmr_*U)DL![K\ia]fR@bDF?c&FC57`T8(-3ltE@Y4,j6:o<\:tk+a7>W':Dlage,arrdgPjD,n8jIL0.6n44Bp7Qa!=L0M48h`&ft38C`^FEa25jZ5AF`h_"q<=K^rD2jX[9Q75=YN/'7j89_C%`&Wsh*[+hHQ2a/Zq0*ZNRV#C['u\@9"7taRW$*m.Eg7_i%E8U2S8=Q0MAYbR-BPT=KRQe#_^QrNjII1'@6-]8!U9NrJA4)N1lrGO`P^#5d3u3-b$O~>endstream -endobj -% 'R11': class PDFOutlines -11 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 12 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000569 00000 n -0000000785 00000 n -0000004495 00000 n -0000004838 00000 n -0000004973 00000 n -0000005242 00000 n -0000005348 00000 n -0000006089 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 8 0 R - /Root 7 0 R - /Size 12 >> -startxref -6141 -%%EOF diff --git a/z3c/rml/tests/expected/tag-img.pdf b/z3c/rml/tests/expected/tag-img.pdf deleted file mode 100644 index 44fa58a9..00000000 --- a/z3c/rml/tests/expected/tag-img.pdf +++ /dev/null @@ -1,134 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'FormXob.ce52f900887bbd9ff9881c236099059a': class PDFImageXObject -5 0 obj -<< /BitsPerComponent 8 - /ColorSpace /DeviceRGB - /Filter [ /ASCII85Decode - /FlateDecode ] - /Height 86 - /Length 3441 - /Subtype /Image - /Type /XObject - /Width 130 >> -stream -Gb"/kc\l$s&BFP1_2Dt)$d:1-71_WG5t""8d$&bf&I]R7/-[n]Ci0j46p]$_"a0tHAPLlrJ9CjJP]Q3:qi]L#Fa-T"Ac's+Mn;AA&B6[X-o?:8=&#D:N"#.Sd_Jd&9nAMZ$Rc?Cq]/Y@kGCugmI;S1MEQ=hE#?fu]AM8aaT1Fe#Q@"WD]Ve6J*7aNZ3-FN9]5r]/8)?iJrSUU\&9qs,l-cZ%,@Ga:aj1tI*.E%7]"0q@K7*%X`Af\njiWkC+51"lqO*V0*PI'PBJf1OT02\,Erh63ZEf)S^]!jfHpmVVo1#\nh"B/Yc3VT5AJc=Ij'4BjV:+2kk67ig(ZqPk)\b0r:qcXj)4V):BjW1aG9sr[">($q&@&2IVjUXKB`Q6S_#QPVQ<*!=7!gZ)uuaUP>9uEFQc49!Pn$gdSY2"9^dV)^&'O6ZPLEmUUKj=0GrtOFg]EA_)rZ&;rVG*uIo`F7LH(Ktl%Gc6>hI=B"D!/K;VVAbkh_dMaT?"DMF),S/hm>a3)l7K"=C+Ak"]sJfAU=.%EUKQU+N.i;Q//H.6[FEoi_BsN%kVaghJClIbg7+JB.Che#fJj1ZLr,IdH\qC])p?cEfgQim'seq:@jhddafm@3jBfh:gMK;$:u_Tu`Ef5+:,^BULR&2*)B/@nCjXR21K+c_NWo*aNDp9X1"d!$,2'E=2JJn8C4$[G>uV@nc,FbWK.kk;5bN[lL.ac+H'4?u]gpgIb!9C[Nt'diDUboZDk3Q6bqekZfLKir0p'T.OkEb0"GQhe^7P5tiPEKg9`>*6*8=eoGBkm.`S8P!!VW:p8uuM*7C(XQ669?@q5$Q4JD5R:NNg&#\*=Lcs_Ys-4ti8M=plM2=X[jDgXP`d5!5=A/'/D7IZWLoh%R/5#uJD-R#!Ct4c/.JK\;hPKdHbZ*&omX+;2N/bA=BSmAO_!:.d7kKp`k(#fe%"%)Bc>TQpKJ^XW)gN/-g9n9KpU)/\f1$QU>slYX%2rG"CReW\5cHb`#!.+i12ka"f!N[]nrqE:aVl=hB+OEDSh8`2^pdo%QR65*#mk%-#X[",Ofs=\_!N!>3!HV)troQI\?^9^#=7,?QpZadoGqfh>,"Q3`/l#;<4!6LL(3mqm;>D2;-DSjMNd2a'#ggd(q3&M5_iUbYsb]ja""]dcA\fuB?iiO&!^PLOi35WqkHR'-KR*aWf^n:jJn&Tb3('.eah]JEM[&j5^)dgEdO)BF`>l**+9SmWp06Tn\hjj8O#guco7C$_cFSN8udG_'JXgj(:e9P*nnOK[6iK?kn>.LPi?]flJeri[+^]1DMBV`UbNOnV1U'HA3WA`_,Z[[YiY\F\l."XWK>CNV82<:lUW2MZ6]R1"(Qr"9LlJ0]N3]b>>DbL9h[9,de1[W?HDg'Ht=lel/IrgDER(cMeqYC#aZQTG"aM>=r:+og:N9?@rW_D09;hA-aAd$\gEY138bbi'P@0Q6YOP7nqSA49.ffNT8-`cPF!35;&.X&;Js0qoSkiQG5a9P8WsU9K*A$nP[U&kMU"o>YqIs9[^M%D9[uVM0$DR/kl(\cZXB55OdZGEad#;2dKHA#SogbAU\HC\3:Ss4hN7P.K,`5-`og&N[dDq)aI.f@Q[uXZq(#J"84k7RM9GI6Eu=ob5#K["qZi86D#mOt?F/UJLHEq@EFtnV[YYJGC0N2k#UGs_O)`e)0)d_`U4<:#BZoVfh*cco3&^>XC>$l0:NDf3PVCPLkT+K[Gj[;*Mi.`B:GfhIC(l@kjVkHl1:7`XP[)fE9FEV_$!\TETGUITa(dFf,"t3A+]Y"B=CIq/8;/4FH0h2\_-'@F`\hoa*j-]Y^3`L_r8h1=p=Yqo:=/;_DBHiBuE=[u4d*$B&Ie"+Raq&W57a\Ba#YK`!"66+NaMM5$&r>Bgbs;^cVM_sYUWoa3HQEjJX@)NI.r?q0!VETqhE@j3RfpT"pBK,="rZ_6UM,J9AsiZ&.PVuI"=kH,W`(^\H^L/0Pl;f($GEt/HKdKa-Z[#mb4Qck:NdTka@p4=AMKW!n2kO%iX4a+%PsVJqh'Mg+P*jW\U+Mhj#iUt8&bn)#YWO)\+6#NT0,TqCkQIFZS_tQfq9j]iEWVSG/#.HH;1Ks+:^BgHYq798DlD2M\)Jj:bFB^hgC\o;H:%"`HcWs\CTB1n`h!$E@9Mgk%VV"54r_tmMGA@":V56%)>K12KnD(SlW7A\OSmlGX,:m0V8WqK![YP?b0[4SD:rC-*s.&GJA78Y!'=J*A3?!5Hnp!m]cU73i^-fm[`,^NS554-[-=Z5\`Bk;o;Z;nQGDC::$=t0T\E-1Y=kP3K%I"HS5IogSDcLLBO3hleVhS@CWc(mO8<;,DEi0!5GO>7RPopn9ZYXJ#O"H@C(tsj/.PI+-Y"pJ@=gj.uGFR3Z+[*^=BVXt$Cc*W1/+-B5+alZI1hBZo-/BldS`68Ql\;k-:(?g%7u7$pCe%rKe94K)B.N>\f_[4(&VtcnFh/?.eBk5GO<,P\GA;#]]3$>VTQBYBGrpH')5Y:[OJ_i^9Kd5i5KbtHR>X\kU)%s5S\FmonqYG2qrh)*9t?/cqb!YMa/8Ub@.B+9K".)ZAlu_*NdqGMqYu*bendstream -endobj -% 'Page1': class PDFPage -6 0 obj -% Page dictionary -<< /Contents 10 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 9 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] - /XObject << /FormXob.ce52f900887bbd9ff9881c236099059a 5 0 R >> >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R7': class PDFCatalog -7 0 obj -% Document Root -<< /Outlines 11 0 R - /PageMode /UseNone - /Pages 9 0 R - /Type /Catalog >> -endobj -% 'R8': class PDFInfo -8 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20130806140729+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R9': class PDFPages -9 0 obj -% page tree -<< /Count 1 - /Kids [ 6 0 R ] - /Type /Pages >> -endobj -% 'R10': class PDFStream -10 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 524 >> -stream -Gau1*9lJc?%#43OnfN*M#?6ha%nf/b?pg:0%ND(YY-KY6C@+!g]kfo_ZLWQY.u%M(+bQ'eMWFAt@R/s_aVGo4-O]5L",:26@"JZg?f87r/tSC;G)XZW18/3&o#;@0S0Wi5^a'P$0Rh^g&EaJf%0G"":7Ba1_s6Xolm&Su=!'?pOP]:45DH>BX5Um=IIc,'E-m^mmcn#&?M)627O0C]:@02f<7L3S\6Q*orQou]F&I7>Q(_1C/C-sf9%'MG;IT7'%J:L6IWsQCC4a/$[s+NgH0\no\\aODlDnm/ZBY2kaeVc57J:lnUEB1Ngplsp"G<11%mRt]6rQQ:]0d<\q/8Yh724nh7/YTVosl"g(s+c.'PBDI'][dJ(P5uC],#hT6etFS`Fjoendstream -endobj -% 'R11': class PDFOutlines -11 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 12 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000569 00000 n -0000000785 00000 n -0000004461 00000 n -0000004804 00000 n -0000004939 00000 n -0000005208 00000 n -0000005314 00000 n -0000005982 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\233\274&9\011T\034\204#\313yW"J\351t) (\233\274&9\011T\034\204#\313yW"J\351t)] - - /Info 8 0 R - /Root 7 0 R - /Size 12 >> -startxref -6034 -%%EOF diff --git a/z3c/rml/tests/expected/tag-includePdfPages.pdf b/z3c/rml/tests/expected/tag-includePdfPages.pdf deleted file mode 100644 index c0ac505e..00000000 Binary files a/z3c/rml/tests/expected/tag-includePdfPages.pdf and /dev/null differ diff --git a/z3c/rml/tests/expected/tag-indent.pdf b/z3c/rml/tests/expected/tag-indent.pdf deleted file mode 100644 index d0c5d452..00000000 --- a/z3c/rml/tests/expected/tag-indent.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 634 >> -stream -GatU0_2d5''YG[\%s+Ps'!RReUoJ`C[A]@:WKbRI]tkj@:0\dFPeXD=!b,"6#S[Y614D%Nh?8G0]nl^4CZ%4jA55B"=Lc+]:QT&u$a2i_(=8<"T@j:1\dFW]"\DtDWPA'1KkUlmBMBV4&dAk3l".nm[C'-s^m3i2%@sQ`WSao@+dqTaKjqUKd9QEaEDlY`u"miO->j9E&@QIBU]P``1ZYrb`KtKnVuQR*Lj4(n'7,'&LbDVq:o?0!`jY3Yj+;7B,V*XXpd`VGG7kD&J8b"4JWG?8*As"#l*i!W~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000569 00000 n -0000000742 00000 n -0000001019 00000 n -0000001154 00000 n -0000001423 00000 n -0000001528 00000 n -0000002305 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -2357 -%%EOF diff --git a/z3c/rml/tests/expected/tag-index.pdf b/z3c/rml/tests/expected/tag-index.pdf deleted file mode 100644 index 4cc2a0b2..00000000 --- a/z3c/rml/tests/expected/tag-index.pdf +++ /dev/null @@ -1,260 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 14 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 13 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page2': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 15 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 13 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page3': class PDFPage -6 0 obj -% Page dictionary -<< /Contents 16 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 13 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Annot.NUMBER1': class LinkAnnotation -7 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 4 0 R - /XYZ - 68.91646 - 739.3543 - 0 ] - /Rect [ 548.5811 - 693.3543 - 554.6971 - 705.3543 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER2': class LinkAnnotation -8 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 6 0 R - /XYZ - 68.91646 - 767.3543 - 0 ] - /Rect [ 560.8131 - 693.3543 - 566.9291 - 705.3543 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Annot.NUMBER3': class LinkAnnotation -9 0 obj -<< /Border [ 0 - 0 - 0 ] - /Contents () - /Dest [ 5 0 R - /XYZ - 155.0465 - 767.3543 - 0 ] - /Rect [ 560.8131 - 645.3543 - 566.9291 - 657.3543 ] - /Subtype /Link - /Type /Annot >> -endobj -% 'Page4': class PDFPage -10 0 obj -% Page dictionary -<< /Annots [ 7 0 R - 8 0 R - 9 0 R ] - /Contents 17 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 13 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R11': class PDFCatalog -11 0 obj -% Document Root -<< /Outlines 18 0 R - /PageMode /UseNone - /Pages 13 0 R - /Type /Catalog >> -endobj -% 'R12': class PDFInfo -12 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121221014824+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R13': class PDFPages -13 0 obj -% page tree -<< /Count 4 - /Kids [ 4 0 R - 5 0 R - 6 0 R - 10 0 R ] - /Type /Pages >> -endobj -% 'R14': class PDFStream -14 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 264 >> -stream -Gat%\9a\`k&;Bk1GBh:\(c+b[[hTX2/ei=,dF_Ku74[Tl9qkXgDIeJU@:nBj&d#O.rnLJg6t8>,OFZ2='Nendstream -endobj -% 'R15': class PDFStream -15 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 196 >> -stream -Gat=ab6l*O$q9oErki$AMfCM?[WX/L0"OlH+"0/cKOM)jq"r)+5dum]JL'CiX9<6%-=@jug_.[OS3c"VKFXJJ(0=4VS]ca+FptgVU:+t$=V'Sc5"L5M7%Ed6c6b,l*Lg=L!f2I(P,8%"7b6n^FZ'To[p[lg6/"4dGJ;&4@n8NJ$~>endstream -endobj -% 'R16': class PDFStream -16 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 196 >> -stream -Gat=bbmM$QW4tLjpoa,l_4)\Q6>!q<_58EIRi[q'-49l8a;3irLX_\aSt3:R,u5=,feM-J5ZOnK=TuoC+(TuqMQ3:Fqg_kP98d8iDB&'NZA4ArAG,Ao-oX$MUQ6f*)\/J>M3;.g`R*BEBO$\.irLNU_#/Y34M(^=l8du~>endstream -endobj -% 'R17': class PDFStream -17 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 377 >> -stream -Gb!TRhb1j@&BEZ5q]G72MIsES-#Hrl#JqN%"FLth#JrBh"8CuJ-LLY>d>@W@2PIKlmeaQ,Di,\9^i4d,"5Gl'bn3d'HNn#si"g:tVN]UcZ.\Q[?quT0UsNe7otb'hO2n#k(Kh!B722#pW!m1FK'`JV<<6HWHNA=.+Nns%:oY)FL(33;Ji$DaC5#,RY+`24!\A)V$M`t*;c\ZP%AO2l9ZP(<0Hf0c#%^o8]+7@u/$4\??D>+BU.#>Q4R6P@5&mh_I2U^i],J)_(VT~>endstream -endobj -% 'R18': class PDFOutlines -18 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 19 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000559 00000 n -0000000838 00000 n -0000001117 00000 n -0000001411 00000 n -0000001651 00000 n -0000001891 00000 n -0000002116 00000 n -0000002433 00000 n -0000002571 00000 n -0000002842 00000 n -0000002974 00000 n -0000003380 00000 n -0000003718 00000 n -0000004056 00000 n -0000004577 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\246/a\363\344i\271\352\(5\363\277Y%\015\342) (\246/a\363\344i\271\352\(5\363\277Y%\015\342)] - - /Info 12 0 R - /Root 11 0 R - /Size 19 >> -startxref -4629 -%%EOF diff --git a/z3c/rml/tests/expected/tag-keepInFrame.pdf b/z3c/rml/tests/expected/tag-keepInFrame.pdf deleted file mode 100644 index 83534c3a..00000000 --- a/z3c/rml/tests/expected/tag-keepInFrame.pdf +++ /dev/null @@ -1,68 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -1 0 obj -<< /F1 2 0 R /F2 3 0 R /F3 4 0 R >> -endobj -2 0 obj -<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font >> -endobj -3 0 obj -<< /BaseFont /Courier-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font >> -endobj -4 0 obj -<< /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font >> -endobj -5 0 obj -<< /Contents 10 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 9 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> - /Type /Page >> -endobj -6 0 obj -<< /Contents 11 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 9 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> - /Type /Page >> -endobj -7 0 obj -<< /Outlines 12 0 R /PageMode /UseNone /Pages 9 0 R /Type /Catalog >> -endobj -8 0 obj -<< /Author (\(anonymous\)) /CreationDate (D:20140724022446+05'00') /Creator (\(unspecified\)) /Keywords () /Producer (ReportLab PDF Library - www.reportlab.com) /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -9 0 obj -<< /Count 2 /Kids [ 5 0 R 6 0 R ] /Type /Pages >> -endobj -10 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 461 >> -stream -Gb!lZhb(d?'ZTSHH\_(8.P/cXVC@<;U'4sa6=->>d]L*hF"QV9RqD!+Uc=(%LeVQPe!tK.4XVt3B1rPN=uf!g\B9ZblY`S--R$SB5?*0A[4l8]/ABZ5KAW5\HF6bi6E+'\!nn,N`3<`O+-d(oC*$q"8IDl>BF3VlHA+j"1-3e1bO3f>#ha`>1gK09@UC9Pp(52FLnb8o$UZRBkF2)tI50J#/1~>endstream -endobj -12 0 obj -<< /Count 0 /Type /Outlines >> -endobj -xref -0 13 -0000000000 65535 f -0000000075 00000 n -0000000129 00000 n -0000000239 00000 n -0000000352 00000 n -0000000467 00000 n -0000000675 00000 n -0000000883 00000 n -0000000971 00000 n -0000001207 00000 n -0000001275 00000 n -0000001832 00000 n -0000002135 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\310\374\260\303\022\211;\356w\375^i\025\237G;) (\310\374\260\303\022\211;\356w\375^i\025\237G;)] - /Info 8 0 R /Root 7 0 R /Size 13 >> -startxref -2185 -%%EOF diff --git a/z3c/rml/tests/expected/tag-keepTogether.pdf b/z3c/rml/tests/expected/tag-keepTogether.pdf deleted file mode 100644 index 2d1cc08d..00000000 --- a/z3c/rml/tests/expected/tag-keepTogether.pdf +++ /dev/null @@ -1,158 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page2': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 10 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page3': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 11 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 12 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 3 - /Kids [ 3 0 R - 4 0 R - 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 516 >> -stream -Gasak_2d7m'YHrY5Kkja,&1pAfgr/,<9d).\"1+i.Q6R*\&_V0YA98i5g<+Z*-[UF+mE9*'?aAJsWQ,obCi6oh$BW?q%UZpWH.EioEoU=I'tf0SGeclK*7':e9*Oi%b1X,f%B!gXgJMn56BK6GTXnN)bcIZlPu>=]Q!6"uYqg"o8B7\HlkEho4ZdqH*qP*Y)!%M_]JDmE[YM6k0tVg%6[C9gm-X1s[;,T:j`$?:KPhnOakGPN=HgeIc0P4/Uo72U)*S!/_%6#U5''E*e446uX?l.kh8S3[:Lcgi1PsiC0c8QL8*W$Pb4En5csR1T?na4dQ:Gq*apUHQ/'uKSk566=QBS(gedo;Y9,LR;Tig=7i,^n`0P_K4uBZp$+K1$fI0~>endstream -endobj -% 'R10': class PDFStream -10 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 395 >> -stream -Gb"/c]2$6t'Sc?QH&$kX$mr^LdM3(c/uX5MW&PT,/gNpJnSns_?$6gVE\IpW=N#t2:@':c#mnL[KjJ3JHS<*'5Mr$aLiL9V_+fdj9G!c#))HOq`dM^q=ZGQ!G4c"?=]PVuku*'B)I:p,7A"]Kg)U"tnd4k*JM&a<]u%K%9'@&:8p08IPj.Lj`@SK4CPAX&#%\-F^$1[)X5+8hh8*k66^MX)_=r\PRMp1q0Hj(\A&AF$-CKSpqTYh>:SS@0[SG(MXMPJ_`]5\+9VaIcOUJ79r-.,G]"lN#,`\i`k5nF2_G7[-UY+B+hB0@[T?%SfoN01\,u~>endstream -endobj -% 'R11': class PDFStream -11 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 220 >> -stream -Gar'#bmM!0$D&Um)KHP?R!e$"ni.iUO\F['ng0;k(JA\Uk@GWV,Np;Kjmni.V"u]3C\pYOp<;mH[#1\H-Xo?.o2!+%h^\QmnF0=""`@V%sT.2]HZV:DR."8m*!6endstream -endobj -% 'R12': class PDFOutlines -12 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 13 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000927 00000 n -0000001205 00000 n -0000001340 00000 n -0000001609 00000 n -0000001730 00000 n -0000002387 00000 n -0000002924 00000 n -0000003288 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 7 0 R - /Root 6 0 R - /Size 13 >> -startxref -3340 -%%EOF diff --git a/z3c/rml/tests/expected/tag-lineMode.pdf b/z3c/rml/tests/expected/tag-lineMode.pdf deleted file mode 100644 index 7cea40be..00000000 --- a/z3c/rml/tests/expected/tag-lineMode.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 186 >> -stream -GaqK'0b2&S%,k)=K([0=_J"aVMU:l[21^B8nT:6cPsN$g/)p^E\MBEhendstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001498 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1549 -%%EOF diff --git a/z3c/rml/tests/expected/tag-linePlot.pdf b/z3c/rml/tests/expected/tag-linePlot.pdf deleted file mode 100644 index 80b7e03b..00000000 --- a/z3c/rml/tests/expected/tag-linePlot.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Times-Roman -<< /BaseFont /Times-Roman - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1505 >> -stream -Gb"/(991#N%)*\MJ'bG0Y_oBgNX:ja./)#C%k3AWRdIQ*_G8G_d/Nr8U86b,a7dg4"/itC]q,f^P+P:&P"]7-r^$OtgG/DB_k)>]$maU*`^"Ui2Ri&GB"c>-P(CjuJP4Dl7>Op/#O@ccZ$47&\:+D9Spe6Lpc!PB^\ddPgH;^bZcr'^H<$@uCM&6[g,&Q&T-O$\U/*KT=^TV^m%A4hZ9mK2B*39WD#?QldaG%,jQkm[1)OZ>TQ1S`@Fpk8I9ofH%k?"eAg$mP'=\I1[.Ao8l<&UbQ:=,`f1A.K,qB.i"Z<-Rm#>fu/*jWutM;Qc$1a68sb\N[%+7-@gtc+`bhXb!AqV<#V=-+R\(0lb;CV?HY5JO]XiROZ;YO)-SER+@]U-:j`X.hpH9;oO8d>YB!49P[?<@l0P"*^rb>9buaumqgHV;oPP?aV#X02(cC68%Z]K1#0^kUE>VfBfO??i-9jNJN+XVdi#Z,hK*1oYugGmaa+Ul..A_3Ct7'8s!:-k7)Ki.kb-i$,i/m,[mkEGB(.N(.&/ZLc/'1fP7C"]ugHq\99c*Up3SMa`$W>IKe(-cohDU+TLQ0-X$SYjWo]M)F\WX@Us8F*;#-M&;Zp/O:5q,['8VCoa:&4S).ECdlp/V?c/Ib,1('k((-E_,k4p"%,Wn\4.Kj$&4@#-El.W\4[5K-U^G&^'I/MAc!S@HA`F\,>;HtTfOq:;Bubs]"/OTWo>5O'^jR"$=a9=:%%66URYdnn]/R:gOdOaGk6?1PcN]ao(c<7^Z3mZFG.6)V3:/3_$4SEM!cu7;LRmW&HXgrdFe_]D^jYrH?\+fsJhK"r8&n@XWtTJKpI&:LRDkBM0B5P_5;`g/:FFl=`g2D5j9^FgS!*[a`]j3nbrb7ftB2_>g@-[Zo:-P1if3>=rZ1kE=Os`)qm6m.2`:m!mZ6ocN/r0M_~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000573 00000 n -0000000740 00000 n -0000001017 00000 n -0000001152 00000 n -0000001434 00000 n -0000001539 00000 n -0000003188 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -3240 -%%EOF diff --git a/z3c/rml/tests/expected/tag-linePlot3D.pdf b/z3c/rml/tests/expected/tag-linePlot3D.pdf deleted file mode 100644 index 43ecef07..00000000 --- a/z3c/rml/tests/expected/tag-linePlot3D.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Times-Roman -<< /BaseFont /Times-Roman - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 32582 >> -stream -Gauad9sMTs#9fEj1kNXO+7,c\0'#rq!7tZ_o8hSj0/LTj1kTZTDp1On3:0D?aMJ9q1\,^nKECi>^r!X^SN%Pfg#H4s7"?!rqeqZj8\`2^\VU>O8o$:^]+2P?iQB2oUl-\Vf@fVnOGVa?X;Uiq0uiFJ*Y\o5MRF640Rdqr4da\dijMGO8nV5,\fMloCo_Ll;@T5s+,[uG;g2Td@6gqV;(qBX5RO)Iukc:8'(Jo+$]bLTE"OJaT!%%GPq5/3`#M'J]5fpr1@=['K6TDikN6UYic5u#NNS6IW2E80`Um6%p%(Xr6)opeUKm_f,YfKbOhUDJR8rGjdl4*s!hhJrg)H/j8+p$XO4ZO]<:OMHL60*J(M[<:G:RsNo,!LnFMS(e+L=**e/M+rcJ.BMl5aW5C3Y7O[0:tEShnZWZ8eKar`jbnPrM-;3*qkqUO&*pVhp`VPcG(qUO%Os+SW$4jEfOYF`c0n.gArHCFH'?Tq2A?_6rSV\q_tnnDk8H>.I"oW+n+_]iagkc$S7me"A>]I`:tn]2A.(n7^idr.#"k6(AL62XF]r-XU?5/P(VJ=dA%f8'Ab)=[76qYJqD-3K2-HST!AE50MFr1*k5?[pP4bHH2l1!Y1.&N"mC56(Z[q=A1EWW%fc(Oh&7nC7R^=i4>)"'CKZ.i0,.E^ZK7r#u(SN/q`pq`gLb^R>Bh21dLV$:=`@r]D,3h,j#^8rQ=?.s=F*)SoO8V8TDHd=3/W],c+$Uho`.g)Sr[o/VZ1=6RLr\gcc(etjXUVVa2X.A.J$q;V@'4UN(%s#E&EB2boL"ek/!'O'jCJqEX`Hu/3&RPGCsA?'Se_cT'^iig?iTH?IZ!hAPpJ;Sb;pC(KRbM9?KBMOf?33$tHF7jK?KjX-i*0-A@r'+cQ'p9eWPW?X@jQigY/]t9X^c.h4P5dqJie30)VBW4.!ZdbMD@;*A]XfuXC0*"P^0JX;h`\f<&be^SD%[MA-!EKe)eE*9F]dn1XT;F0YXGT&)o>e4u@Cq9pV1d=UL[b0Z:<7FtnZ2.uLEB1@l]R^,suke.Su`II9s*8rZR'@p@")1mt;)`W*;uU#o:b)A614L"8)+&0k*RGOTZQNi'NIp`?ZXE`>5g`Tu0F-o3lh,WJLiHs)esFu=u79H@?djhZpM%=!-nEn(D&4;cWjY(Z(g`Nc7LCUuX\Of?33$tJD?\Qt3R@p@")P^0JX;[%C7gp;\9N5P&8_\M(ug)!dDI65Z$TZi$/R4=`H,lG,b_JC&&nINUiP^0JX;[)?/eogKKJS/=5VPAnsr^]0Aj'u$.es(Ha,?'*EX.PaD&lhZk/!'O'i&6U@n75%V_O;Km+@IV:Ng9Li-=ODKFuPESBlXXaq)U-Z%=!#;Wc)]C__[Zq;@@@*VF.U*ud;MW6EJGC_[pc4Y[sgN!IBaP\Ir.f[@#nAS-*rX"]K@/>jg$UXL&D[WZIiR6*L9Y=":Gs$?g5gR6*L9<>`_d<\b]0>`D=V@)j%JRG!_)K&c)C^K3O+pT5J]=t'mMOg.93]$/sNetAML:lImr(K:+Mgn@/:->I&ui->7CF&?>UeiX#!%#b_!*EuKSU.2![_\C+*E'7(J9hDEl`th[C\WO"Fiu'8b4Utt^d^(+PQk'YshqFEb%f#Gl$+_"9f3i[7;_Z&0I8S>#]'F7^`B9'ZMnTKm^:^O0'F,<+R7DV?Do,>=ZecC-G,F'EM4b0!>N/:M+,f0MKT9h';]:[3`)(*EuKS,"JL5Np"<_+m.mKY`21"3;H/a41(s/b`$?A\g\&A(4'R`:#R[\N=a)%mutIqMn7.!aAu^dP9U>1kt"lc&hDV>2.[iqaB$.K$]jB.q<_93iWl^Z)tU'b%sDKa0T=+mhFUX6_jCQKT>&L2IA4s0NbfFm:H((V8B.Y;@49TT6Mos91aAu^d_cYrE9tVC.,!JtTQRM`)R6*L9]Hg@q3QFQ+=4G>D6KZ:)rcd)R%0MZ)M5kb094n_.i7QPa7:g(SA?.DC@4\sX_poSf[WH=_R@,)K.X:s%G6qBn3KtSd,[_A1XqY)>AnFQA$H!_#g:g4U,"MdZ;ha]jSF!uf2G,oR)B>TCf-Ug*SDnrf'jur2%5LV9[Xq84uRP";43gmfd[D?(lQ@IZ=k)ma6&Da.J$q;[L0ho4eI6>f>N\)_:ZQi\.J2LmXFN`9q&Uj88'j,#N);:b-b`6KSL+sRlR'0Rqps>tdZ7^?=A8;`Q+msqil0)Or.`n6/a"7_%B<,WbA4eOL@49/-YEn[/26L#65FIY95_qt)Pue]j"tgYC=Y7+ab!_7`$&0l4R>H/G,U%ZB6'I]Qg&+4sYpVU.f#&_Akoi\#`lCQ'2J@-o7Mc#4#U@a;ShTGan8Z!KMlP"FaAsFVX8XSYAg),%Eco]aAu^d;]J!uQ^]^WD!]fK1,D"t<<(/stU4@KG)Yj*Wa[ufP^AS-*rX"]K@/@F7H7bnnF[WH=_R@,)K.Kl>h+u#,IVGY+VnjGV@CKOIKh>2?(#*SDp\"&htjFNO\ql-Tj!69(-6`HTKB51*s(7^`NWPi=^o00NO8VXT_I6]7sSU"4U=?#3H8%&beB:em1%'6fk_NY7`O)5;B:hF<0[L0nh``d&E-lU*9Pnic5/!T1Ei2C8"Po6XQOQG\&ud1)AEqO9.!K96d`7N3fV6r/'WpugBmKg"8!^Gem/.tq-N.@E_$&Halqk0E%rE=ke7>:C[K;ShSQIcXN(:h;6^8(]Z$6U-W\SW?>D$?WiTiPVF$ncLbkcHu;4!+Zfc!8++n5J2`34_a!d<92@bfl)`'i:-SAXU>+lKL^.S-!J.4EPt[K]*SUAp.^c0T9GA2W&FO2^YH+ULT5)bj"s6/]/6"&$01gO^%:%nmk8!$H&6/39lQf(d!`!XC0*"P^0JX>6W%A=a%Ik9M=:fC?M(6^J3"WGQ)im,?ok19L0Aa6F[rOa6&C6.PnCU>6S_4E[8KD&R:ro+2Ad1'89qEHM:f;[L0nh`bJ1!>`Hk,@)j%JRG!_)!XbHZ4$-LOWA+k7\Z0=GR@,)K.L]eo^=hW_Y/Y""gWf&T5G%5_<[$ui1l!2UXBM80;?#3H8%&b<'i8?ON(:q>A!R0)4X`q(lX-_8m)W49(fQl^62kUmXtj$p:hF<0[L+EF^d8*%A7e=9!65)#iJJfUq#gbAlVm)W49(fP^_;k*Kn(rg*X'6S+gR@,)K.cB?[5D!8tPgI=7-l=%q'jFXLAk09:_\gBk4nM\;0SYW?*EuKTAk09:R10NV^K)Xqp_!]KWu%+fRG!_)_D$_LHeN`OJ$1*molN`(*;k?.&0i]$/sNetAL1h,hZ\FAY^+^m*G4FZkPC8KWfd'Vf'LEraNYSNtW_Aj+#&G`fsnR))TjmUcYFf62PHSnX94(d;7CLIoZHlh_MQE9s:-89E6WsP_Tn_]f)M$c1.A5GagRags&LQj1=P&8$=p[9$GI%nK;&/g__"?9[DIt*jda4ueG(%.%%@ZB;=VI[4V:pmrTSc>5g=a]>jk`c\"aFrmN%(=,n#H#iB%lQ7#70'$D>oVd)I<0XNpoX=`n\7mDK<1MlW9&/I@-bJo9ZU\$l*(.rN6&La8&*/_H2:laBP&`\7Y'A8PO#%g:BqZghh[@['d\Z-1-p3\81YoL-I$X&^WugJL^_F@6K&_N6#I6n1I6EFZbe2YK5*@1:EkOH!S976guHQg^'$.=\Z]_&#Uol'9I7fisY=7aC@A:O[0jjAWp0%O/K8(>NA!dM*Fqt6AQ&mC'$NYkmGB4GgS[gnBQh@f'&>J0m)iW>/3IeotYO@65Ek;2Y(X]1W8DHYphASOeJ1UC&1T71K*5j"n.HJA4Z]Qrf%4%>h&sH/sk`'2N.W[-=jCC+AG)TN*qJQW`W90-SE'9Tp_lb)@P_'B8B2jFkn*GGU#NZNM"bT2T:Ao6=`nn'C^4D?P!mt'mPWiS/@C-)VKN>c6.uD"NTkc$R\DSYne!n]*(\Z!FL/^pqf*91+6Y=0rYA%NCb1P0%Tl;nV)0RA5H;?EkOk3@R;Q6ikgNa=fa,sOlH`D2*/iSE+MsQ3&)V8[?uL*iT3g6*4%"F]FuKAEfG<+d3#2TC3YBRL9U/BKFFl,Bll^&opJ7(MKj"/VPnHC65Ec[!@=2tj\skE(#Fe/6'[!NiUUb,:@bjS9i9l-$r&SOdQ(Um,IoXS6e^N+-RNB/KfB'="#*F1^Y9D::5m8'/LDTZ]%hidrS$si_AaXR-qfmP=YFe*^ffN[\1&o?'-`(7RXd'5jV=rYXU1Jk_MJk-XO6hKnagMr`c-LB)Y\Kn4!V%5M[9g)66qqK*?+Zs_AaXR-o6B4,[L]7.W82:'G]I2O[3,E5^1lP5)9MY+hPc.hAMHpRO:g4\!GS1=5B0bRJiZ_=`!3JZ:OY2#G_IpStPRAL*iAA"[f$Gf7;Z;Xmqli_E/>bW2^0WJ%=1mPM6W^:/&`>W%VA`LIF1d_%lO4b0[:5m8'/LI-4o5Z3hf8i'LiLLMtP^,@sZLc7T8Ff[DdPf'tG=#h:)p9ZUZn-D8WBH23gd`.W=YA5I,H``=\oZ'Mtd9ekUb$r&SOdMsdPU*I3*s7)\JE+2-LgEmYOjY?g/NEb6R'2FM-@P&q"[-eR)b!*%V@_t2M1+5(5@`t)==:aE'j//2_@RM!t-Ilqs1'"*+%:T2V:O$M?(2GXUJ`Cbu.ZW0q'Aa%X6+L]4>Ik6];YGjYf_9X-)^-sbWsL4]VBfV;%%C_CM%LW,4UMX0,D[D;"anO!NsR0\A?aTW@gVQL53:D:Di+j.AEZc%5?*K)?UL$A]1FNP/Y;H$KUu/T#q9u:/=2EH6VN:WP1P;7O8b9nJpr2W_9sL=IiPSV&Lg.VXFTclRK?qfFJhK,1QjsC1<^;$Y0i\oApT*9TO1Il03$;J2^/]S^WQoW_5`)_DT,=OH7JCFqg"&87k(]:fG'i=*\K2i6=n<-2V7S/6mcuB&]5cEFj@SX&eQE45.'G]b>.NEkXceFpoKh:7#ijJ1fO0CM]3hFBR=h?7'E2>\j&DGBb(KgGR?#QEM5fsi\3]2Ej$T@kZi%eZ^M2_72o&uLOAXa+kLU$"]WjC2fEpfDRAV!>`o9hobgLIMGA'j))_H@K#EY'?H21,?3pWXKC*l=aD*SgV6'1.l;B;0Z!uO3*FDP*<$Scs*pBQR0Ds9-DBl;*B4rBF(*+hSKZ=SgbeiWgQq?MbGgcMsC`f1m"aTKoWDbm8WT-liqnU@@TSIq:6rDCr3?8ITfl4u)+*=NeUOr[b-j$J`sjLpet@tWC^D':T'n#SZiCM#s]F("*K7B?,c(htm8piOlf75\u4kXci2oKasVr9`l-")]3r*nU"=Hjq)67b&e0]_D.OkH+gPe!L_RKYE)+^1+[lFOO_*e0U)#[soV;s>bKb0qS62'Dl1R*@R1Yk2^$JGXV&-=R7J?mMXp,`c#s,Mr`e>J_lJOA4]Zb_SsT0I(,pUr+fLB2o5,$3A$cXW:VDA"lEsH!,BP*J?oI:;5tpWpjOc2IgP+>J,'`79G_k$FUP6PhmGcq;WW]:7a2!XuJ\*EuM%7Z@iIBQ#/5Fj=tH)5[8Y,)ads\2,=u\I2aSo,B6Bk2A2j"BkfF@;G5^Z5ONoA<;#@(=lgo&Qp^Op3]o2c:5hH*+i??oiI;LgU?20.4Nru1KLcK(>;e11$"og4+M=\kW?5S`bk8!P<<"RaZ#9%mN6Q2Ao7fD'm)b'"jph^JTNf1-mcG$j>o?"48dXgQpeK>[+RbCdlDp7krNKjqp6,g9N3UQF#Yc+PV4R3i"+Xfk="8?F$7@Eo#ikK=i]E\Jr[Mhi,sRr[N9`K,1gDY^,ACM99n$TuXRa34`GQ;Mmo9RuigeZG@+Rb2rR!C]sXA*@d3O+tag!$_#F,mj'j`1a?*O&h(DGRCHJCf:2FN12KMsIJQd7MMCl6-9(Thp?/F"iBB)I@%.Xn=UeC#&fFYLafm5CtS%4_Xj[D3`pj0kr8Hjk;#!<,mr\uu:,D3Xm3Ze#QPc1l8jc0`C1XU:Rf7``*fS0Pc=Wk'qf\XA?64sB,1qH7G[;JimaT<#n"j7*V2PCKFtrmLj1l^paCal!7^Da9&+LKn`?C+:]bu*1ibF#Gu1r57bp##/^pR)p9C1NG#8XFM4Hs"l%T::5\b_U)tCdr)@gX$N'I>QmIhnWbY6)im!0(ej=8F=F,M9g>gYofQ,1mJ?Js8Y+0GN-oe1mZN_b]gnc*JM4hLM.'reU0pLmmeAhjVa^l9O-s%\Q4dRH<^/'>pdC+0&_YAGX4Xf#3UH]G7RlhXlp1,_I9jl]N=>BlC,_`N'9iD8S*DDnN6#VVB#H+pJ)Q_WgWR#4L13@)tXEp"b*FC1NG#a="Am[HR0nWhh1R#g_3"EcpJ):o8E9`NX"&_WuL@=QAEDSoaPZ6a->Y_AH3$E9%2CFgAWL(.LEn$L.Y*jg?k+&.E.8D?WO4d<=ufL,TcJ_Fg$igq_g%qF#4^V>RP:0X_M3T/k8rgZ?plno2C#ZQ6T?hLBo%lTP+=8W[C?kpK6klR#0qD/398Nub+EBf,=EmG_"S$J:X3H3Wg7rT/I:L#?i"Zlps6=WF]*Zd&)'u=NX#Ai!tO!^1d7IiN9^X#(A6#J*grS-UL)oQ-/"^leBMIg1!a:7+8O,-&.5^$9HRT:B]^7UItP)V^#[[,D!M%g#WF)@ndY@q`MaMO+13="L2=_e]#-Ta18outV7qA:hB!hLgJp9(?plno`paQE:i0Vd'7i+o@U1X1]@.sVG_f_W#iHG%<8pB*%,sQsJnQgH-$r)IWgJ#b,+EjKZHRtVIU'5Jfs;e4Wc.J!qOWN\):W)J!;2UIP[0OIHu6HeNK!0,h6uftq$N'pD-)S2X=0LJ1K8D4(lfB=3H[EP@#1Kk>Lqe#N""u;[\r=NPtg!#*8P2SnFM@>Md46#\OWG'">W7p1G"Z2j0WFr0*&Hm^%UtFZY&-H5XW-0+d)lUU^WI0q]gcO-48:k9(]moGr5.Y_BIfCTRR/Zs,R)LBK-86d[-60mp4E>#]Oob[;\,4m.Ea*.,ahA@\IIW\2HVX;Pl,+X2jF3.!Y'_E`V?C^m[%.3Hq@X13Y6740_iD\^%rPon&?s%Sb,8)p$U]7F:GC;L.^lG%SK6B5`'`9U3!9Lbrs;o*=To:P)bNF=grS&s:!'sSI>6Vu3PDH)eL1.4%H5)jN_Bae$9CSbJ?=*F)Q!f&Z.S]\*Q:7ljj&j%%3i5lD4:!SY)O]2&e*m)m^n_"B=cmOOf\[(K8pP(Vl?@ScA/cl5[^!<][5-laLYo(g8VpY$qZcHCN`3/3Zsg[D*t2p+YhZZ,,3r,7.o$>q//k;%/%)e/ZLS4,?k=07_1JXX6!$%$09M*@Qh3li't-ZBTRD1IZLbnUmP=A0tjHf\aKm,5L\^`N_Bag:k9VKE;:=W+;#5Vf"<.DqqsrP#&HuY5s9M7>"ZiUP96rfe;uqo[rWL[QAHNJ!lV&)'cc@;^5_K@Zsc3J(B'!Xp2NF)0?b7O*4R,<16!gs&_-@BRbX-l\X./BhNudXjdfjJHn9B.g^!3oJF45Ai>NbfHW5Wecm'6"(1HVmB5c6G$b7q![QI,W3K4GI'9%u(q7Ff':R%:#Of\[pZ>e^knEbGOdk_N?^`T7L<,>^*4$0`J80$.0W#o)gO4P;9_V-u?lmc_.M?q7X4a\0FrPPUH&OCP_HP^Tb[RsjjUGrlO!d;*eq[R?Ft,Bh1X]e/D8N?6U&La#u.'ZoJkZ;XIR^R8C(GA@dT;.O9-2LBQ+P9oW/JW%i;k9*FV&OAk)Q5-s:,?okTE"7/"'W\f!E\U"(^Y$-X]*.^Qb094nG-p=8:fjqOD,orNe)ME&$n[Wn9RWQDk#ClF^f1TG,pp5``oU8FZC-7+tCRG!_)!b8eQSDSNn1o845JoQGs7Bo9mAp.^cJ@=C!GXbCXs.\Zt]I'EDA](^tl5o<5<["aP1G_+uip*3Yh1_5OZi-2SkFFcFFQ3bTlgl,Xn@7%51Aa\p+<["_\OK:*UpSL'mW1gNi"a0tnOmd;l:DWJm'!5"jrr\n5LXs6H#1agL2/SunqIW-N9K,j`6@K*);Z)]UjY*`!_ieA)1`sKl%0Oq\!(D:HN;oI\,X;;N:k_K"rRd=7AnOXTC1+HoID2F=ed54.[Z2.sYQM4cW[L1Y:6'grU.]8bl?p=h2AB2.Om8KVCaAr=Y<$_\fH9#WaeS&,GCPln[13[nPX,p7ecHB';D-.s'f9hN/^fP`CO:FA^4ENqHlq4?NC7[7(hsDEXM'=`/ZMF)VFj4^)>#q]DkgJ*_[/+rKPF3HE.cdd7jGDWJm'+JV7Eq-SN&8nm?uZm6TKldL&$a_/3?\WNups&3!u(67HZo\C?ic&0#4Ysi0b'9[cP[-bg[ab&nBC?Z$1=\jo?F%:HKLX9ShOFeSUWT_tbDUfLSbXRSS@Z.fkjN*R9:!lD)"U/6291nN.9/?pkf!g0VE[+cj`gW]QnMMk3.pW:CRM*Vqbd_(N2mX`5L#VqAc@RZ]=tZ5(^="g4(#!j8UE:oU?q7X4CeQj8i]\E',`/lb)_:N@n*6E-;!,TSC_^?:XQh?&M`A='Jmi"L`Kle"ZQi\.iq3[%'%BF/,;5h2fn#p1o\HF&c]kuH,?k=07[JE:'LM!2NR8K7)4u!AqTSAI6F&8gQnGctp]RF#;qQP)P*qFlqX3t+-b!fURd=71]sT.(*Uu!Uf-k4fX0f-hs4FPNlZ#7s0?dO^P\Wtj`+sQP(/q9/Z&Ckpf9blggOsGNR.MJK?$qcP#pl.cdW)J[r+%dkOTnBK%P#K8oQ/idT"6j_rb^sbe!BCWT>Hb>"0`N!A:%0ZVX*KN?&U+\dJn1A,u4#oFUO'`%k-OETo1iu@]$B)$._e,9]BkVPl,Fc`P-)BQ=?Ua4+10JoSFJF@Ur/ul&b5>9InB2iLchsI]JM&pkYAFV=YKYGrW$%8+.p:5Rt4l?u:AkllX01A)?!Gb822C#fb'JIi,Ro\j4;fpoZ<8ta,\7n?p38Pt/"?@eqJFEg:R&@#UBbXPPTrDP()tmu8,g*ek]Zf16T/^:dZtRrlKFBMGnmGl7_N+(mPEZH9&-A-6,$$k-2G'*tC%2&t8Y;S]W"DaQ?e>rVhdP0e)@i/\1O`@B@=DCfuf,2)<7rB%V^riF&.f?.dtFMhdi`Oj1S64UaLXl-0*f/BS/#mVKsR>c"]4ok3.sUa[Sar4_XB#7?u+BP(CQDg[-)Ej:U7KGFY[LM^;Ik7r1rAC.GRh[sZecom5LpBV^NmdQt^:1SD^S"sAG,DXi>goj_eHu*[>5!)NpaPpR'\R+[Z`/BhgkhH+$T-uG#+e(>r>$G7),Z4;N66)n'[O>GZG5nGcPSh&Hk)=_HTLm)V4"d-^]T,)Ok^s>tXD@#o/JoEW;mD%U-Lq!=lZ59fim*N7r`+9eebG"$Z-aL:Xe[hR>:hnh/Lubs]29J\YlT(Pn)d3*>HrdNI(>'8!4ue\L*_C%PG%K[;#+iYjWpF5;>2=A]0@UGt@)n(GA/lm;1+bnb2@4+ZX'#u%hP'fXIB?VTdf(B[fXM/ZRY]e$r7"K06T1JiN-4VcA/GlCL!._23!rN+q#MPXoR3ECN9o8KKdfD7Z@iIr(jsfY\&-I6f5&T-Vf)/,+Eq#]rOHeKtqG\Q?.(o+5;N]bnE%Apbup'hHlZcBP^h44]1Nt'A;0G8[RQmn51gX&Q!9%,g(&cG<7s9VT4B/)<@9RpSYQ'%-Q[l6aXJC_`g&Bc+Wr0_#W?r[G\Ul?7h#ARN&9@-Y?noDpfB6q6)TYQ35\_fU3/9Pd(geA@sZ5>)-O>Q:<2PaSp(jr?jY==OG?[J!0OP]]-CCmhE2XhVhf`Crg4JNOU7cKs-.]N9FS@+Z\OHg4g?Z'0!5l2sCG$?<]<1\s._p9DnYE6oK8UeZ@ZN?ZC4QUWSVbr-)%Ld)O(9:aWn#\#AaofFtgP$'@NaV;;=T(!B>K@+Ni.%8kg6^?Z""M%Y#5A2/#NMn>fefI!`3CYTT04ue\LS^#O3p,S]P_"_$60gq<"Ng47$C1NFH?I;?+1MY,0?DTe>l[ol(gfs#Ym-t+^\ImG/E?WoB[ga(o'0!5l2sHCZ?@-HeBlRG-SuD=uM/;V4c9Ur.)9ph1P?N8U?U>B9_]C1LC1NEE28\"A62lTd@qJ(dCW:HB4_(=J3)V:$Y`/OmmQR9,E1o]2db)$3IQ@S?.^)k/'=H+raJ@Tp?`K-dk]i&B?H_t;4WQI\)rHL76+o.(?g8N8eY_e7fb:\U30DrOU5S[afu+,79ISqT5C2CC.\gCpnW30D<'R'-<=*+t$bid._Xj&k2o%HHZC)El1Ei:dJt)7=a8a,p8PiEm[saQ+D&crYQMQ>7L\]p?J\Cu"Vf2?"tLgprQ`+,4;1qVEo#l71Pt]A\.3`6YCTi?M/YP!_i)=1dd'As;VUeDC3dgcmM;^.,Z+C2fhr)XB^/Yf.KrIuWdiOb[)T;Z`S7Si;Y#1Ns_pe>NLnT=6hY7FB=EXt\.Mks:qh:GK3e8*u=p&47rdSKMFF!H<%%)KRIg:sOWO^niHin"D_1:[X+\L.]fd`[J)R+*$6'O6D&lQu#LkXf+)8:mB%RoW/PUU;CsI;gBoHT5bI(laU-O@5;BPfkOI^;N@UM`a8t+Ob?s?-.IqS?IpbW/jQQX;uT%0o9IFSUi65=N(g6Oj]]kL&\4bAj-4\6e4*?=R+-qMTYa7@gUOO%Z37dlD0W&@;P];%#'cbW1pQ,52!i:AE0j4f7Z>+GfkQP1\AIB8$Ypgai%G:59I:p`98ppo'45=bN26"EQ4B]u)miOdnc-HjppjC,C^SLICT,kuThP$.r?To1Mp!G/&^O._A#TSg'rqaGnJfT7dpr`oCkUQSni"$k2rp/lKlKg7e$/8sIkHU2LppUg=70(+3QU?g:u].Ru>C4'>mT<@'onbCRkpS[V,?2Uf8gHWb"EYnHZEidFRMm*%uRAo6Ao;>qYbpE)_b:V0A[F8Bd#Cj;G$@_A!BEfD59?F(lJ,89U]V>8;gg^%c4O#BCs2uu8s0^=#fD0gde=9d?3`%LlN(U3rL^EF@bDQI>V="Iet,2^LqHdXStJJNX0HO_&.&&](*l;EFj"MG3_Gc0itK1s;&A.#OgOKbIZhjM?jM'i&8C_-s:j8E_lWKG.Qgk/!'O'rq0%+hIM;$9th<>sRus`Su`V.J$q;V@'4U6/!QlE&Atq'3eDt_2_2(:r4:fO-#?,9E8#?Vq$!pdIXMlXuoOZtsYaeI)``KD/o*ObjdLoS_uQ;VTaZ5fd[\PFN\j$5Dqa:I0dP0$\j\s*EuJ)_2`=HL+uP_C8I'CBacnRkh)=Z%sDKa!2#[2?qGZNb.Of\\23p2+]lrQ9=1nq+WA*?qLYr-)6m)W49(k^(5UZ@S5>='4SRP#+gA89I$FOkF;BRKF"AkP1><;A""TJ]_]C1IW)$t1Ccl(C0*^`N#S]o2N8(0T]q*hKS:-LBa@)Vb<#OL%^ZuClR`=4]ZB/p--YJL%5H^:K'^C3L)km9b]mN2R`sj6P2J/#qqXn`4fAiU20-5R`OZ1/&=HsjhZsN'i&8c$gGaC?&]0``7C/uYTm'MP^kT>_1C.d8%@9XgeMZ[R0Pf/E#g,FCQ,gIo,JkYr-)6m)W/b1^5PQ99j&8BaeIMN\)^OA4O'8QjuamA,\N:QG3%:%EtBqOtogVA?.DC_(Nj?8[@P:#(+%*Ce^<&40hlEBd_4f,I$C;m-BAn%Z7e1>>s\#NbfGb1$Gg+RO!edA)_K;CW\clOf^s8/\M7jH5,W-05G8)F!nDnb_$qh.L]f2(A@&@A#D&[6V?6R[J#/,%sDKa!7uogm`;[+9ch]868>a(&+.J2l[pr(%Aq9lBqZ&ZH#P!,K@?'@<.L<7d:itHk3:Ne/i,Mn,]HkfMAC3qS!I8#!u2+E=VKm_N(a7I9@12nkpFKhPitnV9p:DP=o@(f^>)R@TTV1,`9q+]8OV+&2,.[hAC<[o60J1k8:'JV"oVpm[\h0jN@Y7gJb<(RBip^^eo]\/>\t*K%;\b(#;n7_(q)hC!J7,%:0S9(F_jd;#8:aZ8#?Wk0bMNXFJPrlfIa(49?KBMd2Nh)Meqmdn&O])"?X@S0.QR(7rMAj`h<39eh%q=@q%R*7:g(SoL9"UG9U#&(C_0Im9Ut1=DD6%b0959N=+L/Lh&dEnS1aV-aottb`:PY_"1<[N9CFiK[WX%*Iu*E;sa[\@#1X?[]%EoNo$_]NCcYF'O?YYN/?f;(6t<@Ofa5Q-Cd1/8)qOV>j2?a@#1X?[]%EoNbfGb0hJf!3Ps;`Cr"T+7:g(SA?4XYPSi=/QnPG'4qJ(@;r`E\.PnCU>D6JoqFeDg_pt-A:M`mrR2ss1302?G8\P_t*(h:Y"Y8]Q(6t<@OfcJS#!7S[c24Ork]Yde7:g(SA?4WbpuU82:.5CS_9R@mAS#IsA?.DC8Ve6foiGW7;KZeQR@,)K._)G7s!i3B-n4nA:b_6>f!.YTAp.^c0T9Ek[3POK0o2nl[]%EoNbfFICFJn>rB7/"ap<_2X#d\fbfl)`'o"GF@p3/6(3O*u>]jjcR6*L9^EU#/C0^S)TYr-)6m-'E9h&,KOPJ)0A@q%U+7:g(SoL9!*Tb.I'P:9#ZWOiGTNY>VrAnFPO<9V=IU^):\g(N.j(3Q%Ud2NO*1Vs,C*_2+D5q$oHfV0u33O0spVP#k>$o^i+c6TPoKg2!Q)[4TMc^.]ZS.:+-*@J:ob!_8+$+_PlM1M->fI(Wn-8R<\q0U]:7u',7='^Z2n5IQ%fV0^:DIi8ZL7epWf*s`86dfs`MlP"FaB$*O?BZHL`_u=MoRTdmG@HK1bjD6KZ6:)fMH8Pos<6#c>RG!_)K'0*\!eZBl6IGTm!%R,,Cf-Ug*SDnN@hKCUrTh`_#4Y[kpA5D1%&40R-0a9E5uFn+@V`P;f[1WQ\hOMJJ?"I#@8%"U[]%EoNo$^2i"A/P^qu4tl`NOYG[cTRbj=PQ$Jh)&6pT3hd4co$'3eFJAk-c=i0bt,)`*daENZnX`Su_+.PnE+2_&oZ&eY4>'1Kg+'M`IAR@,)/;5'ZeZLf4X2_GGh0^@DJpCgP=B(SOn2+6/?+.=G>Q=)FoLDDbX1F%g+3,kXg8S0M2o[-GWKMZ6niqYlu9_-(4m(;DNVM9gOfINb-Mi(3Xa:ob)hlfCXWk#Q%mKlkAJ/1#1R?=Ve0I?<2j%3Xig4C>Q41;*17#jqIcl006s!m'\5u4_kg4*7lR2aft$tD%ZJ$2G;@8'9@[]%BnNbfH7&0-T`YsVeXNn+Fu_9`1d@uJLRm)W49(mC'^nkf.-Y!E'2)@o>=l7:g(SoL9#&eq`mtbss`cG7fF8hr0SI.PnE+2_&oZ1(6^B,T=[uEajsLbj=PQ$N,6]c-GuKl66?mf+fkf1UEi8.Wf0B0*+c[%:`:!Ysi59G4\6-SqCXhA(ZI07UN`b&58P``q@%f:NlA"Kl.l?RG!_)6=e!<&*UPV;$TG,gkdU41UA<1KjdYEkEMaOX"jE0Yr-)6m-'E9G^b7GRW2?9?^K($;.>=^Xm,E77W1+[;_m((\8\\u]7DMKE[+%3r@G"sJYf.+$6:0%(%Wf]XN?_FRI%O/3U?V*@RkSD>#]%p7;qtmj>3\@XL=upr&brKk"fejPDL:4&p.&-&d&%!mZqBJTLDjmB(SOnSp4`4J6doaT`t?r/gFIXYshY>Eb%hi9u2ju+_\/pR"Cm\3ju!1b`1Imct$]9Y[!7CpPnH?33bnXAp3f9Kl0RR1*C89BGcs3M(L309hMXLg=SkF@@%QW/fX\"-0."Y8F6;RnSEQ//I/S[8%SGC<>.!E?b6VX"EiDRb=b5`O@9oPN6#J!4C01IbbAU]A7W]@M[J7mON!S?cXTO.mt'V/^:s]@YeO#.#LVV;lO*P`DegtDYr%pkaDd\aB'8f>N=n[W6)RCueOnWgd_an&><[rCM_jReTK&n]U.DNrd?qPV\Cip,=1+:fS0TL`dM[a#`6B$aQ-Hq=-?A*;KE'n)*jolbS5Ar/u_GiNtkY$k2#$r;krZq=Gr!jCs[AU#l?,c)\T$>X)VDV*[tPEd@#Fq,//&W[G*prl0[d`jp#+G)eV.,EOk>io)4RA?m92pg*g#*:rbB.mI(n7YiVEN-)>UrcoYEfiM$c1.A5Ou8%pkbY&B6r%C4)bmSIq9kAbuobNRPl/YQiZlI6#>P,bHG.oYKH3*hra`hCM"Q`2R7s)r^NAkl&u/B'D/.^gQ?&oeT'eq!*^oPXM'%*S2-H$N.?;#jS8OJ^;gVu`M%*UH&Ro2DIuQ_GagHjtESSKg/Cn83?hWc/PH6n%j5Fm/aInJ_>7burq7RcT-_@p`,(m1i!8i"j"C;Sl'@T[7aC:\b]V,hMm>#Mn]?L2uJh3dH=aj%N?FQU\InqUSB[D_YG.eHRn/?D<+Dt*tGGRP8JpR6W?PhSg?"mb5(/+#L+9d,T#Quf6>tF[6\\X!f*9FJ.]QNbR8QL(QnSi[bAC8WW#H#\c&*2@WceSni76,QVG]C;[3;2/AdnPeBA6n+%?=T"^IS3m-h8G%A`j2uAjaFgc=PD`uY#OUVZueP-)KI+&KJhmr]\JbZ4c,Km"0YJ/aP,lA1#0^%9ZC)Gi+j#nC'jdEDt.c[,;ND'on$8[S'Z:c:Fp];6l+m]5-PR7*e1oLr'l8hR]ZJ&MkcQHV/2%R:+gYO=:SVkGRjc;hQeN#Ri%7+OtWG4pUJYPANc?k;P492Ec`Du)KI+&<:ZnGDU>$q3PB5iDN;.r^Z7O4gr+dqVT#MNI#U0@'`Fg$Gdog[Z<3"kl+$Op3G)&A26UaKC?fqe3SNc]*rTIE"aHO=Vpa_=21e_$Z>KRG=#h;Y2'?ZbK0/6TKVi#SIeqgC\NGtV[FcW9ekJBLeQCJG5F-$7I8+%-_?g[ONCTcD83`%`#_$f@_"!(H4k)[#J8I$B;?!3h8ObfP&&nR>obM?frUZP\<@0Rq&uLXIJD,c-tt-_SiCUs5o*BR+o9[>b3n0QZ.tlU)-![&ri]QhJ/3_'MGe+7tH4[3mqn^l\;gK&.SiH.1KcWYTo's4M?/8A%:CK1e+cC=Ll31N>:t8IJ4`T8qLb.+d6>/0Gu.nJG0dnPeB@U7q0qRCX?<,=^hRokck[#/A70/nD%g@rO+K*L/RBaInT$pdB:$JQ67>q+-a?rCA,]'tGSg?9Q%/*3pZ.cn[QQgX@Y>,u3C6&L@0>@\4"K"j;"XKM$RCl<2Cq=6ZlC^MGkkG%.)MS=/`iEmYN4lO=H8pV^BO,1*Q$ON[!ncXQ`'3eJr8rYCmofiA.I08ni%D?2pF0]c+&%A4`ZBt8F6:KRFHd<6cOWg37_a])T[aPVpG*aTgp1IH?;2#B,H;\Y4=aBonq"X'If9u[3)XTfZo,8C`8*n?8c,u0JYH0)&mHD1jh%L0LrQRF2aSnM`*gE,s6Lcft-QT#Vbl)00A5YmF,.\a:c$ZQGjgcFKaC^E(e]N(?HVV&F57gsPlqQ<@74%LVh_ifIeM-NVJWnbSr$^h)M%VT`Z<9!7RaW6YM7SfQ\d]$jSCjhS=))9-DdG?$4NHY0qcN9+9f!`o=eeUfE3b,BOd\1O5U!aIm_fm+\.GD?mH1T5Xltap;(S?%8ZU)VW0jX0BSTW/K)Rp=IeJo%lSaIqDLmFuu)qhbhp11X;&#/A!tVPqo<3bD'CKbI\?U"rF>EGbh8^m(b\Y@4h%H$WbLVu^Pq_>4MT$654IHaF7=)H\Z8pV_-qT?oQ76moVNn^4/4L%m4VM_i1H"lgG)Q@9QSNUE)K+5M&NSYV&YE,3c3_hEr,2'4i,qd."8K0IB'`5E-FRWIX;@aQ8L+Nqf`QKlq#Vh&KK&MW.a&WolZtLdkD?\BLHe;BhrEqp0fTr^CKC%A0Yjk&P[KqUC_N$2ti,=n<1Mp:jEN)BnBh\B%jSff=AiB:9Fo=?TGJX+draF"r"QNp<@&ln)WKBW`@c>@C[$I97p3b5uSr91AP+(1LH5i8FCg1B@OHSHkN_hCM[Kc,TThf/5j'r>&Wl1/@=lcFBibPo]Z=VW/7l@WH2lq9CkCU.6<,Xt29;uk3pDa6Vn1l:2L8]U+4;5)2*bbV)7RXFbS$'f24O*s,51kr%TNB-bT6:&[]%,u(sTEr_S,>fc6RRUH?cY;PI6`/c_K)udolQ?UVEC.rkqj&\5K(LH/CheSYNT945JqqAi=2*AeVmFNj@83G"t8YZ8Yi9SCjPK(Lf5ML'^F9W*./TfnQKh:5Z$9`Y8mJ@CPC.:1q/TJX?b`?@)_tQCD!kWW)!gs;oa#EYX+2@khm#TrlF$Z>6sE@[OaB#6RF^F>9rD<1UAHhG&b2FOjW0dJ1Z&h`bgMV&0q5u;IFO"V3U1c4XXV91%W#!n$Se)a_ha*F,+[>!l`f9$uAq!.l"?.QQO3@&R.;N/dF%*(A*>52BPBF."4m+M6>/B"QNts[\uG=7HC:dd_.aZf7j?a*@J:q^qEk*+>6@i?_b!X1i75/:H%j"Fo@184biN/9N`-]_5/[E:2Eda$SctU``/h2b=LHIC:?1$-Q@BL)SRCg05_kmk.CLkbb*Of&m&gYO`/io6^ZHk=t"MT(HnrICDHGP[#R1XD$aO?;UQN+OaG4_9m\U8O5$=033cI0Y11N8mgf/.HB-R^b$gL'RbB8oASEGI>+U+e$.cF)*6`,m;%28JVD&"eSG1$E:?,l3)6e8.(AS+:fCW8sp6*M+tl]qgr`ratg`0D5YjB[j1fhY[L0l1]I<&5K!=Z`4r`KD(U07BJ>.>H.6$n\B&DT(a)gL8UCF:7B?M+r+#:GuaiAuqhl)%6<+W$R$=A]2q*-*Gb=+O@r*NSRSl$t1(pe]`V][Ou;(^,rQ7PtPUN"UlL"%_(J$kbRE3eOcgoFE(5Ra3Q?0K;Pu;EBSM]>_a38BANAIOai[YCoL_:EWT\LV_N0gjQO[R$3&%A5kq!g46bP/&#%dLlbhQY:4TiDNOfX%L%is+R*[&Clr(-P6!6??kkg*\_HWYHRcaJR0?"VjJo^fE9DFk>G(5Hn-.Y/JDU/mC$D7VFGd"?VLCDs*kXPq[i(rJS53*]B5f4=-d^;KE8#oa-X!M"bE=e=k6_u=ES2Z42*sr^I$8'OF!6`cqhhZS*tHSkPVH`H%&(.>M^ht&d?Cm.cG+b(f."q@qLg48Z<@&l(1T&`"S/h&is&m5[@'A+`!WI]hk.a-F;R89Xe]/oufVW?C,m,ais7PVJ)?LhpQBF%=1\!QXl8>:3lj;"njDcfB5(bRKSHAjJ=Zca29PMI8$G5$q0C%rLXUnkMf!,O,<;b6N?]/$r$9#nIYZ;IufX`^@,NQ9As+(DT$s^fL87RS!@o-j$o8TU-aotkb_p<:N(Gf-a*6t8ab2\tf:bW%Ao;-pi)qo'mA#NaUNGBBQm>4`moI_`VTXr=R1c_Qdb=aueb&nrV.4CNMn7-faO\.:_t[%Ri]:JG)C&A-"'Uq#-:bKMN(LV`LM=4uqsg@#nf:o"j[P5G"[#D"?.Ltl[l0b(hr#C!E];AN2_l+u.;291*.#0m1#(tq(tb9.%rV#/"75m:1dhbTSR**LS,bqBUW\91]hoqGP6/ccqYi1\Nl6r/)KJ%_R?u.O+97M)$m?E:fJNlGuHoHF@@oXY4@nEY!3_7YIeBqAjZ?B+G@>?l1dqSfZ\NN<\aPO9Pm>>TGF9&6?ua\mYe#F!Fn?V@3>C-6PSR30Q1(2q.)t'!fU.O.mf93UCk3YdkNec79*rCA?-93Y(V!YT_@k3&*t.cZ8-WIA?3McU_\kr23n(`=X*gdo!U,"MdZ;m"[K0Dq7+h;uHD8lFgQBf"e,?k=07TR_p3:Q!72l:)6@#N%K-RAT+N61(%@/N8!fA//GYf5?R925+3#ngAg8UIu&PC7R]@:7:$gt@gl!ZNB1Z@fd+aK3C'/.?>lR@,)K.POo^["24F[VALV_S?qPRG!_)!kLp3I6%2JYBZkuI:gOZ^m:7rZQiZX2CA;@,Ztk')Y9DX`ITTj1UA<1"ib)d\`;Z%[DR,s'][$7@uJLRm)W3N,bC5jc!<>h<7iaUfUobD_R7^3\T9!"".4\jkJ1VN?aiHX5.4s:`]R!eD_@Q%+h.n^I]E)4ppFLcn'Zqj"1-Edh[eD*g'L`!/DY:qG,0[@lZ2/XD`#PH^<,nYR'^"J3)dYM3c_?kt$Wbn[SHCU)R>e''T`r^YMlGf?kA&lA#Dpp6p]t#F?S>;`RGaa9Rc;HA2W93Q[7Xh5YSK5C@U$5`nFpts28<)l$)q^l?1HToX6GmH\/4mj6?bL?9@]2RiCf-Ug*SDp\6e=N6JBdeJi@[4S#I^_XSK6B57,5bY+!,\G4Q\JX@AQ]tY5[]"AS-*rX2(+(Km*AZ*?gDF9uk,d(6t<@Of^t2]-s(SLZsferj"m]LR*(nF!FlkR"E<)^aaZ4FB]Fe"'[To4sASqNaA%Y4+<^j&Vmj\=<,uQ9q%:no7!nm?II11XT_toVKD/AfV0uS2mP;+1L$q%FqM(/3bC:-ag?.W-0Kn$fd]C;X[(\&ZLg3B`cTE6Cg!/f40hl%[ZX`mm._@eco`;G@[NLJ%JdU@40hl%Y$[=nG"CI0@t)l]5HmRfAp.^c&;.,@"ss^(e/6.Y5trI,.ij1*)E.ITI$J0bW+1apBpP4S>CpJ'P*AH3C-I#(VIO%BCW\cld2Ng`Y/PNsjQtZhh^B8o^t+`qYbO-,nG"A&C&+@W`r)]DEF?u4gtC'o'sb!iFc`_>jpJ_^.lnf:W$uAa\pKN=)ekG(ir!qJK!IikQ=pRG#t,'i80haX"TkWJpY4@dHcM[]%EoNo$_]qC:-Rra3B]@lbA1[]I]D*SDnfI`WlHN*;18N%'HiW7a/E>@d;m13[nPX-!1,>Rpe4AU&46n.3JRQ'peS3ju!/b`6KS(m>K;p_J(L4Q\F?3sN-lbfl)`'iO6g4404\s.VSJ`S`B`>?9n3NbfH_L*Sce`l^#J&KNnn[&D0lNGK&%k\EAeEPg*q[m`%Lqn*N_Bc3'O@,p:unH[;V74o\UgmIo&)uU1uLVjd_?hF.-$]J--?2HPO]=+>c)">@#N1Om-'E9\M'aP<=:h!0oC[9/LiQ_UGjY:r;m8+V)Y=c*=DsRJiF^kBG=_m\kX].J]30l)De"IhH[R>FaC:bPr__G7W&Kf8kLe1jBr46EBtcO"orn6Aq;J@h6]#p]Xrum@,qcRg5s!2dog$Ofga$+Xj,b:N/3Wfjbr[-RKg[E)k8un[JR:,G73CFST)Fce2f<0rQ_sa7CRa7"KoW`Q8"55<-aL9=-=:D9e`;HdKKt*:t8fWql'SWZoL8QH$uV5%O7sRp>?WH^1AcmRn6]26WM`BVBr"kmpkXo$h\`K/<7aQALg"si4G31`[]n?!]m#.CJNN>`\q+Ueo'9O;&%qq-N>DWQICQ/hj5A_o>-4=n8;T1EaYh%M08UCNl?Q$C2kCd:YJP"Q#aO3YW0;]Q5K81LMYg`JXr!V5B\`-p==o)%BZ6^-3E$Cc5%$4^1MNRC$*S;)oIC!C@HJGH]6,#=(Dm21=bI_jl]-SMHE$Cc5/J&nE#OWKk!RLba(eAVF)\Ell7;H/sA`.\si8/JJu9^()o=)'mFpL$9FgVSTTA?\m8eF]4^L3LmWQ%?%e0PJj%=LQ6-J%rk*g)]RH3:t%?CrRcM*Kn.bRcEha3i9=,)eKdCC1NDZRb,H,?65qig+BSnK+lqn$_"4BLP8?1m3s?6]B6Nd^_ZUQF!HTmd3%--:?:lQ`1[]*AFhEFds*:c8ML\SWYh$P`UDC1I%\HD(d2SKAe119:N?k>]-RZ0n=_eRo2h#)&jQM]kd%VG&An841dB)Q/LE8mNI=o=H%;nSTVCT:2HEE+jbI't[QljtT#(mR`>W'.6ru#fZ$/O;&M+\pakRD$T,$q=f8diPWG0CJ5.5K)D>L^C<&(%jkgCAunU*$e7SGHh@kWWQTM1E'D\-,XiAPb\F/-Kk3t`m$=bU^d@((tK@S%HHT9(d2SKY-4]Y)QS=3g+BSnK+GZSNCqX#eX[UX2_Mb:X,d=\c;qJ&%NZ5U?eh%Q,=f[(Sg=AjpE(/!&`$[7R4EZJ?5iQdB5p?dq`ceqLsIS3'idijos_lOZbXMj_G:kkV0QljtT&f4aD+PeltLZ`f)PVbMjQAG1LLMYfVc)38k6#gsQ;HWP+_SB3[\8`aO^MI`IC3tYJP38lc:Mfmc6oK8Umj:UX'K68&3/:5d'FP"IeDj#X%.[-aI+\,Xj]T18h%H>D30DIVYpT:KKFdHqpt:\HJM$/,k=-5:/0&BE.mU/pA[]OS%mFOqDF)0`<6Vn7LO2sY4\j$5[C?dC#OSBk^XL6H9D!\?E9!\\Ia&i3N-&3gn'Wt%o8A^j\S7@?f?W:QJ`"VeOInP9O"Q>aZL$_=qFu/g@`+kDR1s,KbO>JXh]L`lYkZnJ,lqtYbYslZB.*M*$YfNf%r88C97>CFf5g(YZ#_3]]`.nkrd4B\s7k9DHPDZM^:B,"b,8a`rdMLjro]ui>h\#kZ2)gtrf]H560F(eiXLFqo"`1mPjfD;hq0"ooY'&T0g#F62u`F//%`f5S=i!Pk6^dYEIL):!-EcER@ff:E*lu85Q?`7%g--f&8rqPe+s#P-1nHk4aSOhd.'Ts@r09QEPu@:rpVlE3Hg;AET-I)mWnqY4hhsZ#S/,1WVnf;59FQDiVYtOkVc]F,2Z1YVec4jElb;)I53i=m]9s\@*EoZnM4FC%0Yr_kk,b_I_SXO5@3cL,3RcFcZ%`h>iY[.S5rno_V\+.kHQ5Q\^>48(f(:XiijRV2W>B[cI#O5L)`GU%0o9IFSUi65=N(g6Oj^HTg(MCNq3\"obtmD)T.Ha?e"s%l?>S8'Gc;F1e?usU5AXY9lS3s9Yg$V)?gmXMTjY,'\'^9oQ3CFIN$Lk.mEWUHuKY(LK1h-AO\$DXbcJg.ko7'"(r29Q:([b7_~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000573 00000 n -0000000740 00000 n -0000001017 00000 n -0000001152 00000 n -0000001434 00000 n -0000001539 00000 n -0000034266 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -34318 -%%EOF diff --git a/z3c/rml/tests/expected/tag-lines.pdf b/z3c/rml/tests/expected/tag-lines.pdf deleted file mode 100644 index c675bfd9..00000000 --- a/z3c/rml/tests/expected/tag-lines.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 111 >> -stream -GapA,YmQ"8$j=p?OFObncmFa[Z_3MOq#eITqZ!=aarSOm"=YOCcNYq\E>+/F08L&Ahm#5k__`m@A8&4F]t7K$kr5a;2jG!k-Q7"ZJa!>^0,-S~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001423 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1474 -%%EOF diff --git a/z3c/rml/tests/expected/tag-log.pdf b/z3c/rml/tests/expected/tag-log.pdf deleted file mode 100644 index 4606eb12..00000000 --- a/z3c/rml/tests/expected/tag-log.pdf +++ /dev/null @@ -1,107 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121220232518+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 234 >> -stream -Gb!endstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000559 00000 n -0000000836 00000 n -0000000970 00000 n -0000001239 00000 n -0000001344 00000 n -0000001720 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\322\013\316\213\253\363\234\225\322\007\025*\276w\3376) (\322\013\316\213\253\363\234\225\322\007\025*\276w\3376)] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -1771 -%%EOF diff --git a/z3c/rml/tests/expected/tag-mergePage.pdf b/z3c/rml/tests/expected/tag-mergePage.pdf deleted file mode 100644 index 09b54dd2..00000000 --- a/z3c/rml/tests/expected/tag-mergePage.pdf +++ /dev/null @@ -1,1334 +0,0 @@ -%PDF-1.3 -1 0 obj -<< -/Kids [ 4 0 R ] -/Type /Pages -/Count 1 ->> -endobj -2 0 obj -<< -/Producer (Python PDF Library \055 http\072\057\057pybrary\056net\057pyPdf\057) ->> -endobj -3 0 obj -<< -/Type /Catalog -/Pages 1 0 R ->> -endobj -4 0 obj -<< -/Parent 1 0 R -/Contents 5 0 R -/Resources << -/ColorSpace << -/CS1 6 0 R -/CS0 8 0 R ->> -/ExtGState << -/GS0 10 0 R ->> -/Font << -/T1_6 11 0 R -/T1_4 15 0 R -/T1_5 18 0 R -/T1_2 23 0 R -/T1_3 26 0 R -/T1_0 29 0 R -/T1_1 32 0 R -/F2 35 0 R -/F1 36 0 R ->> -/ProcSet [ /ImageC /Text /PDF /ImageI /ImageB ] ->> -/Rotate 0 -/CropBox [ 18 20.59200 630 812.60000 ] -/LastModified (D\07220070112140310\05505\047) -/MediaBox [ 18 20.59200 630 812.60000 ] -/Type /Page ->> -endobj -5 0 obj -<< -/Length 11617 ->> -stream -q -/CS0 cs -0.30000 scn -1 i -/GS0 gs -470.19100 519.34600 m -470.19100 519.34600 122.40000 12.08000 re -f* -/CS0 CS -1 SCN -0.49800 w -10 M -0 j -0 J -[ ] 0 d -469.94200 519.34600 m -470.19100 519.34600 l -592.59100 519.34600 l -592.83900 519.34600 l -592.59100 519.34600 m -592.59100 531.42500 l -592.83900 531.42500 m -592.59100 531.42500 l -470.19100 531.42500 l -469.94200 531.42500 l -470.19100 531.42500 m -470.19100 519.34600 l -297.39100 471.34600 m -297.39100 519.34600 l -376.59100 471.34600 m -376.59100 519.34600 l -462.99100 471.34600 m -462.99100 519.34600 l -542.19100 471.34600 m -542.19100 519.34600 l -592.59100 471.34600 m -592.59100 519.34600 l -S -0.79700 w -52.50100 771.33600 m -592.59100 771.33600 l -S -0.49800 w -117.30100 747.33600 m -117.30100 771.33600 l -S -1 scn -BT -/T1_0 1 Tf -0.00020 Tc -0.05180 Tw -0 Ts -100 Tz -0 Tr -6.97100 0 0 6.97100 451.56820 447.35570 Tm -(For Privacy Act and Paperwork Reduction) Tj -0.05570 Tw -4.76000 -1.14300 Td -(Act Notice\054 see back of Copy D\056) Tj -0 Tc -0 Tw --18.61400 43.02900 Td -(1) Tj -/T1_1 1 Tf -0.00020 Tc -0.05950 Tw --24.83900 3.44100 Td -(Employee\222s social security number) Tj -ET -0.79700 w -52.50100 471.34600 m -52.50100 771.29600 l -592.59100 471.34600 m -592.59100 771.33600 l -S -0.49800 w -52.50100 747.34600 m -592.59100 747.34600 l -S -BT -/T1_1 1 Tf -0.00090 Tc -0 Tw -4.97920 0 0 4.97920 398.19060 597.75900 Tm -(Retirement) Tj -0 -1 TD -(plan) Tj -0.00080 Tc -7.27000 1 Td -(Third\055party) Tj --0.00050 Tc -0.06980 Tw -T* -(sick pay) Tj -0.00070 Tc -0 Tw --14.56200 1 Td -(Statutory) Tj -0.00080 Tc -T* -(employee) Tj -/T1_0 1 Tf -0 Tc -6.97100 0 0 6.97100 477.39060 691.33900 Tm -(6) Tj -0 6.88600 TD -(2) Tj -/T1_1 1 Tf -0.00020 Tc -0.06110 Tw --58.87300 -3.44400 Td -(Employer\222s name\054 address\054 and ZIP code) Tj -ET -52.50100 723.33600 m -592.59100 723.33600 l -470.19100 519.34600 m -470.19100 747.34600 l -S -BT -/T1_1 1 Tf -0.06490 Tw -6.97100 0 0 6.97100 488.49430 667.33900 Tm -(Allocated tips) Tj -/T1_0 1 Tf -0 Tc -0 Tw --19.15100 0 Td -(7) Tj -/T1_1 1 Tf -0.00020 Tc -0.06970 Tw -1.59300 -3.44300 Td -(Advance EIC payment) Tj -/T1_0 1 Tf -0 Tc -0 Tw -15.96600 3.44300 Td -(8) Tj -ET -347.79100 699.34600 m -592.59100 699.34600 l -S -BT -/T1_0 1 Tf -0.00780 Tc -6.97100 0 0 6.97100 473.48680 643.33900 Tm -(10) Tj -0 Tc --16.99900 0 Td -(9) Tj -/T1_1 1 Tf --0.00040 Tc -0.06290 Tw -6.18420 0 0 6.97100 366.09440 739.33900 Tm -(Wages\054 tips\054 other compensation) Tj -0.00020 Tc -0.05970 Tw -6.97100 0 0 6.97100 488.49430 739.33900 Tm -(Federal income tax withheld) Tj -ET -347.79100 675.34600 m -592.59100 675.34600 l -S -BT -/T1_1 1 Tf -0.07090 Tw -6.97100 0 0 6.97100 488.49430 715.32900 Tm -(Social security tax withheld) Tj -0.06730 Tw --17.55900 0 Td -(Social security wages) Tj -/T1_0 1 Tf -0.00190 Tc -0 Tw -15.40600 -13.77000 Td -(12a) Tj -0.00780 Tc --17.55900 0 Td -(11) Tj -/T1_1 1 Tf -0.00020 Tc -0.06180 Tw --37.18700 -15.49400 Td -(Employer\222s state ID number) Tj -/T1_0 1 Tf -0 Tc -0 Tw -55.30600 29.26400 Td -(4) Tj --17.55900 0 Td -(3) Tj -/T1_1 1 Tf -0.00020 Tc -0.05790 Tw --41.31400 3.44400 Td -(Employer identification number \050EIN\051) Tj -ET -52.50100 651.34600 m -592.59100 651.34600 l -S -BT -/T1_1 1 Tf -0.06430 Tw -6.97100 0 0 6.97100 366.09440 691.33900 Tm -(Medicare wages and tips) Tj -0.06550 Tw -0 -3.44300 TD -(Social security tips) Tj -/T1_0 1 Tf -0.00780 Tc -0 Tw --2.15300 -10.18700 Td -(13) Tj -0 Tc -0.56000 13.63000 Td -(5) Tj -/T1_1 1 Tf -0.00020 Tc -0.05700 Tw --41.31400 -6.88600 Td -(Control number) Tj -ET -52.50100 627.34600 m -592.59100 627.34600 l -S -BT -/T1_1 1 Tf -0.06350 Tw -6.97100 0 0 6.97100 66.99080 619.33900 Tm -[ (Employee\222s first name and initial) -28197 (Nonqualified plans) ] TJ -0.07230 Tw -60.46600 10.32900 Td -(Medicare tax withheld) Tj -/T1_0 1 Tf -0.00780 Tc -0 Tw --62.30100 -25.82300 Td -(15) Tj -42.59000 8.60700 Td -(14) Tj -ET -347.79100 603.34600 m -592.59100 603.34600 l -S -BT -/T1_0 1 Tf -6.97100 0 0 6.97100 300.67700 511.32920 Tm -(17) Tj --12.39300 0 Td -(16) Tj -/T1_1 1 Tf -0.00220 Tc -21.77700 8.60700 Td -(Other) Tj -/T1_0 1 Tf -0.00780 Tc -1.97700 -8.60700 Td -(18) Tj -/T1_1 1 Tf -0.00020 Tc -0.05990 Tw --44.88400 1.57900 Td -(Employee\222s address and ZIP code) Tj -ET -52.50100 519.34600 m -592.59100 519.34600 l -S -BT -/T1_1 1 Tf --0.00040 Tc -0.07880 Tw -6.87140 0 0 6.97100 311.47200 511.32920 Tm -(State income tax) Tj -/T1_2 1 Tf --0.00010 Tc -0 Tw -5.97510 0 0 5.97510 66.99080 511.32920 Tm -(State) Tj -/T1_1 1 Tf --0.00020 Tc -0.07630 Tw -6.27390 0 0 6.97100 225.08200 511.32920 Tm -(State wages\054 tips\054 etc\056) Tj -0 Tc -0.07610 Tw -5.67630 0 0 6.97100 555.59470 511.32920 Tm -(Locality name) Tj -ET -210.99100 471.34600 m -210.99100 519.34600 l -S -0.79700 w -52.50100 471.34600 m -592.59100 471.34600 l -S -BT -/T1_0 1 Tf --0.00010 Tc -0.05920 Tw -7.96680 0 0 7.96680 52.50120 435.14660 Tm -[ (Copy ) -7 (A) -500 (For Social Security Administration) -500 (\227) ] TJ -/T1_1 1 Tf -0.07590 Tw -22.42000 0 Td -(Send this) Tj -0.06740 Tw --22.42000 -1.12500 Td -(entire page with Form W\0553 to the Social Security) Tj -0.06440 Tw -0 -1.12500 TD -(Administration\073 photocopies are ) Tj -/T1_0 1 Tf -0 Tw -14.73000 0 Td -(not ) Tj -/T1_1 1 Tf -0.00170 Tc -1.89000 0 Td -(acceptable\056) Tj -0.00020 Tc -0.06790 Tw -6.97100 0 0 6.97100 420.19890 459.34580 Tm -[ (Department of the Treasury\227Internal) -354 (Revenue ) -19 (Service) ] TJ -/T1_3 1 Tf --0.00020 Tc -0.03880 Tw -10.45640 0 0 10.95440 88.18250 404.83290 Tm -[ (Do Not Cut\054 Fold\054 or Staple For) -10 (ms on This Page) -377 (\227) -340 (Do) -340 (Not Cut\054 Fold\054 or Staple For) -10 (ms on This Page) ] TJ -/T1_0 1 Tf -0.00030 Tc -0 Tw -6.97100 0 0 6.97100 52.50120 447.14660 Tm -(Form) Tj -ET -0.49800 w -2 J -[ 0.99600 2.49000 ] 0 d -55.98700 603.34600 m -369.30100 603.34600 l -55.98700 495.34600 m -590.26000 495.34600 l -S -BT -/T1_1 1 Tf -0.00020 Tc -0.07610 Tw -6.97100 0 0 6.97100 488.49430 643.33900 Tm -(Dependent care benefits) Tj -0.06640 Tw -0 -3.44300 TD -(See instructions for box 12) Tj -0.07070 Tw --25.02900 -28.99400 Td -(Cat\056 No\056 10134D) Tj -ET -0 J -[ ] 0 d -81.39100 495.34600 m -81.39100 507.29600 l -S -BT -/T1_0 1 Tf -0 Tc -0 Tw -6.97100 0 0 6.97100 172.94930 763.32900 Tm -(a) Tj --16.47600 -3.44100 Td -(b) Tj -0 -3.44400 TD -(c) Tj -0 -10.32700 TD -(d) Tj -0 -3.44300 TD -(e) Tj -0 -13.91600 TD -(f) Tj -ET -297.30100 747.33600 m -297.30100 771.33600 l -S -BT -/T1_1 1 Tf -6.97100 0 0 6.97100 129.08210 756.82600 Tm -(Void) Tj -/T1_4 1 Tf --0.00050 Tc -23.90040 0 0 23.90040 74.87800 447.14660 Tm -(W\0552) Tj -/T1_3 1 Tf -0.00010 Tc -0.03950 Tw -10.95440 0 0 10.95440 122.81820 459.09680 Tm -[ (W) 40 (age and T) 70 (ax) ] TJ -0 Tc -0 Tw -0 -1.09100 TD -(Statement) Tj -/CS1 cs -1 scn -/T1_5 1 Tf -23.90040 0 0 23.90040 307.37910 447.14660 Tm -(2) Tj -ET -81.39100 471.35600 m -81.39100 483.30600 l -S -BT -/T1_5 1 Tf --0.00010 Tc -9.95850 0 0 9.95850 65.17840 756.34810 Tm -(22222) Tj -0 Tc -23.90040 0 0 23.90040 339.80400 447.14660 Tm -(0) Tj -0.65750 Tc --0.67800 0 Td -(07) Tj -ET -0.99600 w -150.20400 754.36600 m -160.16300 754.36600 l -160.16300 754.36600 m -160.16300 764.32500 l -160.16300 764.32500 m -150.20400 764.32500 l -150.20400 764.32500 m -150.20400 754.36600 l -S -/CS1 CS -1 SCN -1.99200 w -2 J -594.08400 469.95200 m -594.08400 491.55200 l -594.08400 469.95200 m -572.48400 469.95200 l -51.10700 469.95200 m -51.10700 491.55200 l -51.10700 469.95200 m -72.70700 469.95200 l -51.18700 772.73000 m -51.18700 751.13000 l -51.18700 772.73000 m -72.78700 772.73000 l -S -/CS0 cs -1 scn -BT -/T1_0 1 Tf -0.00020 Tc -0.06050 Tw -6.97100 0 0 6.97100 305.07870 751.32900 Tm -(OMB No\056 1545\0550008) Tj -0.06210 Tw -0 1.57700 TD -(For Official Use Only) Tj -/T1_6 1 Tf -0 Tc -0 Tw -4.97920 0 0 4.97920 378.65210 763.31910 Tm -<02> Tj -ET -/CS0 CS -1 SCN -0.49800 w -0 J -189.39100 603.34600 m -189.39100 627.34600 l -S -BT -/T1_1 1 Tf -0.00020 Tc -0.07930 Tw -6.97100 0 0 6.97100 194.37000 619.33900 Tm -(Last name) Tj -ET -347.79100 579.34600 m -592.59100 579.34600 l -470.19100 555.34600 m -592.59100 555.34600 l -506.19100 617.34700 m -506.19100 603.34600 l -506.19100 593.34700 m -506.19100 579.34600 l -506.19100 569.34700 m -506.19100 555.34600 l -S -BT -/T1_1 1 Tf -0 Tc -0 Tw -3.98340 0 0 3.98340 473.48680 615.13660 Tm -(C) Tj -0 -0.87500 TD -(o) Tj -T* -(d) Tj -0 -0.87500 TD -(e) Tj -/T1_0 1 Tf -0.00340 Tc -6.97100 0 0 6.97100 473.48680 595.32910 Tm -(12b) Tj -/T1_1 1 Tf -0 Tc -3.98340 0 0 3.98340 473.48680 591.12660 Tm -(C) Tj -0 -0.87500 TD -(o) Tj -T* -(d) Tj -0 -0.87500 TD -(e) Tj -/T1_0 1 Tf -0.00190 Tc -6.97100 0 0 6.97100 473.48680 571.35900 Tm -(12c) Tj -/T1_1 1 Tf -0 Tc -3.98340 0 0 3.98340 473.48680 567.15650 Tm -(C) Tj -0 -0.87500 TD -(o) Tj -T* -(d) Tj -0 -0.87500 TD -(e) Tj -ET -347.70100 747.34600 m -347.70100 519.34600 l -S -BT -/T1_0 1 Tf -0.00780 Tc -6.97100 0 0 6.97100 466.27690 511.32920 Tm -(19) Tj -/T1_1 1 Tf --0.00020 Tc -0.07130 Tw -6.27390 0 0 6.97100 390.10430 511.32920 Tm -(Local wages\054 tips\054 etc\056) Tj -/T1_0 1 Tf -0.00780 Tc -0 Tw -6.97100 0 0 6.97100 545.47680 511.32920 Tm -(20) Tj -/T1_1 1 Tf --0.00030 Tc -0.07120 Tw -6.47300 0 0 6.97100 477.39060 511.32920 Tm -(Local income tax) Tj -ET -2 J -362.30000 580.36100 m -372.25900 580.36100 l -372.25900 580.36100 m -372.25900 590.32000 l -372.25900 590.32000 m -362.30000 590.32000 l -362.30000 590.32000 m -362.30000 580.36100 l -398.19100 580.36100 m -408.14900 580.36100 l -408.14900 580.36100 m -408.14900 590.32000 l -408.14900 590.32000 m -398.19100 590.32000 l -398.19100 590.32000 m -398.19100 580.36100 l -434.49900 580.36100 m -444.45800 580.36100 l -444.45800 580.36100 m -444.45800 590.32000 l -444.45800 590.32000 m -434.49900 590.32000 l -434.49900 590.32000 m -434.49900 580.36100 l -S -0 J -167.70100 747.33600 m -167.70100 771.33600 l -470.19100 531.34600 m -592.59100 531.34600 l -506.19100 545.34700 m -506.19100 531.34600 l -S -BT -/T1_0 1 Tf -0.00340 Tc -0 Tw -6.97100 0 0 6.97100 473.48680 547.32910 Tm -(12d) Tj -/T1_1 1 Tf -0 Tc -3.98340 0 0 3.98340 473.48680 543.12660 Tm -(C) Tj -0 -0.87500 TD -(o) Tj -T* -(d) Tj -0 -0.87500 TD -(e) Tj -ET -/CS1 CS -1 SCN -1.99200 w -2 J -594.09400 772.72000 m -572.49400 772.73000 l -594.09400 772.72000 m -594.08400 751.13000 l -S -/CS0 CS -1 SCN -0.49800 w -0 J -326.10100 602.92700 m -326.10100 626.92700 l -S -BT -/T1_1 1 Tf -6.97100 0 0 6.97100 331.08030 618.92080 Tm -(Suff\056) Tj -ET -1.99200 w -166.52600 747.34600 m -167.52200 747.34600 l -297.36100 747.34600 l -298.35700 747.34600 l -297.36100 747.34600 m -297.36100 771.33600 l -298.35700 771.33600 m -297.36100 771.33600 l -167.52200 771.33600 l -166.52600 771.33600 l -167.52200 771.33600 m -167.52200 747.34600 l -S -Q -q -1 0 0 1 0 0 cm -BT -/F1 12 Tf -14.40000 TL -ET -BT -/F2 12 Tf -14.40000 TL -ET -BT -1 0 0 1 175.74800 751.18110 Tm -(555\05555\0555555) Tj -T* -ET -BT -1 0 0 1 68.03150 727.08660 Tm -(MA 123\0559424\05590) Tj -T* -ET -q -1 0 0 1 68.03150 696.66140 cm -q -0 0 0 rg -BT -1 0 0 1 0 0 Tm -/F1 12 Tf -12 TL -(Future Corporation) Tj -T* -ET -Q -Q -q -1 0 0 1 68.03150 684.66140 cm -q -0 0 0 rg -BT -1 0 0 1 0 0 Tm -/F1 12 Tf -12 TL -(1 Belltower Place) Tj -T* -ET -Q -Q -q -1 0 0 1 68.03150 672.66140 cm -q -0 0 0 rg -BT -1 0 0 1 0 0 Tm -/F1 12 Tf -12 TL -(Maynard\054 MA 01754) Tj -T* -ET -Q -Q -q -1 0 0 1 68.03150 660.66140 cm -q -0 0 0 rg -BT -1 0 0 1 0 0 Tm -/F1 12 Tf -12 TL -(USA) Tj -T* -ET -Q -Q -BT -1 0 0 1 68.03150 632.12600 Tm -(CTRL\055FC\0552982) Tj -T* -ET -BT -1 0 0 1 68.03150 608.03150 Tm -(Jonathan) Tj -T* -ET -BT -1 0 0 1 194.17320 608.03150 Tm -(Duddley) Tj -T* -ET -q -1 0 0 1 68.03150 580.44090 cm -q -0 0 0 rg -BT -1 0 0 1 0 0 Tm -/F1 12 Tf -12 TL -(10 Main Street) Tj -T* -ET -Q -Q -q -1 0 0 1 68.03150 568.44090 cm -q -0 0 0 rg -BT -1 0 0 1 0 0 Tm -/F1 12 Tf -12 TL -(Maynard\054 MA 01754) Tj -T* -ET -Q -Q -q -1 0 0 1 68.03150 556.44090 cm -q -0 0 0 rg -BT -1 0 0 1 0 0 Tm -/F1 12 Tf -12 TL -(USA) Tj -T* -ET -Q -Q -BT -1 0 0 1 423.37800 727.08660 Tm -(78\054000) Tj -T* -ET -BT -1 0 0 1 542.43310 727.08660 Tm -(13\054260) Tj -T* -ET -BT -1 0 0 1 56.69291 497.48030 Tm -(MA) Tj -T* -ET -BT -1 0 0 1 91.84252 497.48030 Tm -(MA\055FC\05523410) Tj -T* -ET -BT -1 0 0 1 254.14960 497.48030 Tm -(78\054000) Tj -T* -ET -BT -1 0 0 1 335.83460 497.48030 Tm -(6\054240) Tj -T* -ET -Q - -endstream -endobj -6 0 obj -[ /Separation /FCP_700 /DeviceCMYK 7 0 R ] -endobj -7 0 obj -<< -/Filter /FlateDecode -/Length 397 -/Size [ 255 ] -/Encode [ 0 254 ] -/FunctionType 0 -/BitsPerSample 8 -/Domain [ 0 1 ] -/Range [ 0 1 0 1 0 1 0 1 ] -/Decode [ 0 1 0 1 0 1 0 1 ] ->> -stream -H‰ÃÀË®ÏÆ¶íúl۶ɶmÛ¶mÛ¶];íÌüÈÀ1¨Á nCÊІ1¬á oÿ1¢‘Œl£ÍèÆ0¦±ŒmãÏø&ð_ÿ3¡‰Ll“šÌä¦0¥©LmÓšÎôf0£™Ìl³šÍìæ0§¹ÌmóšÏü° ÿ[ȱ¨Å,n KZÊÒ–±¬å,o+ZÉÊV±ªÕ¬n kZËÚÖ±®õ¬oÚÈÆ6±©Íln [ÚÊÖ¶±­ílo;ÚÉÎv±«Ýìn{ÚËÞö±¯ýìï:ÈÁq¨ÃîG:ÊÑŽq¬ãï':ÉÉNqªÓœî g:ËÙÎq®óœïºÈÅ.q©Ë\î -WºÊÕ®q­ë\ï7ºÉÍnq«ÛÜîwºËÝîq¯ûÜïzÈÃñ¨Ç<î OzÊÓžñ¬ç<ï/zÉË^ñª×¼î ozËÛÞñ®÷¼ïúÈÇ>ñ©Ï|î _úÊ×¾ñ­ï|ï?úÉÏ~ñ«ßüîúË߽ - -endstream -endobj -8 0 obj -[ /Separation /FCP_1 /DeviceCMYK 9 0 R ] -endobj -9 0 obj -<< -/Filter /FlateDecode -/Length 674 -/Size [ 255 ] -/Encode [ 0 254 ] -/FunctionType 0 -/BitsPerSample 8 -/Domain [ 0 1 ] -/Range [ 0 1 0 1 0 1 0 1 ] -/Decode [ 0 1 0 1 0 1 0 1 ] ->> -stream -H‰ Á  nÛ¶mÛ¶mÛÜmÛ¶mÛ¶mÛ(þ €€ ˆÀ „ A ŒàÁ ‚! ŠÐ¡ †°a Žðቈ‰‰È‘‰…¨Q‰èщƒ˜1‰‹Ø±‰‡¸q‰øñI€„ I”ˆÄ‰I’„¤II–ŒäÉI‘‚”)I•ŠÔ©I“†´iI—ŽôéɌɔ‰Ì™É’…¬YÉ–ìÙÉ‘ƒœ9É•‹Ü¹É“‡¼yÉ—üù)P€‚)TˆÂ…)R„¢E)VŒâÅ)Q‚’%)UŠÒ¥)S†²e)WŽòå©PŠ©T‰Ê•©R…ªU©VêÕ©Qƒš5©U‹Úµ©S‡ºu©WúõiЀ† iÔˆÆiÒ„¦MiÖŒæÍiÑ‚–-iÕŠÖ­iÓ†¶mi׎öíéÐŽéÔ‰ÎéÒ…®]éÖîÝéуž=éÕ‹Þ½éÓ‡¾}é×þý0€4ˆÁƒ2„¡C6ŒáÃ1‚‘#5ŠÑ£3†±c7Žñã™0‰™4‰É“™2…©S™6éÓ™1ƒ™3™5‹Ù³™3‡¹s™7ùóY°€… Y´ˆÅ‹Y²„¥KY¶ŒåËY±‚•+YµŠÕ«Y³†µkY·Žõëٰٴ‰Í›Ù²…­[Ù¶íÛÙ±ƒ;Ùµ‹Ý»Ù³‡½{Ù·ýû9p€ƒ9tˆÃ‡9r„£G9vŒãÇ9q‚“'9uŠÓ§9s†³g9wŽóç¹p‹¹t‰Ë—¹r…«W¹vë×¹qƒ›7¹u‹Û·¹s‡»w¹wû÷yð€‡yôˆÇyò„§OyöŒçÏyñ‚—/yõŠ×¯yó†·oy÷Ž÷ïùðùô‰ÏŸùò…¯_ùöïßùñƒŸ?ùõ‹ß¿ùó‡¿ý`ô©þ - -endstream -endobj -10 0 obj -<< -/BG2 /Default -/OPM 1 -/UCR2 /Default -/HT /Default -/Type /ExtGState -/SM 0.02000 -/OP true -/SA false -/op true ->> -endobj -11 0 obj -<< -/FirstChar 2 -/Widths [ 1000 ] -/Encoding 12 0 R -/Type /Font -/BaseFont /KFECDJ+Universal-NewswithCommPi -/LastChar 2 -/FontDescriptor 13 0 R -/Subtype /Type1 ->> -endobj -12 0 obj -<< -/Type /Encoding -/Differences [ 2 /H17075 ] ->> -endobj -13 0 obj -<< -/FontBBox [ -7 -227 989 764 ] -/StemV 0 -/FontFile3 14 0 R -/Flags 4 -/Descent 0 -/Ascent 0 -/FontName /KFECDJ+Universal-NewswithCommPi -/Type /FontDescriptor -/ItalicAngle 0 -/CharSet (\057space\057H17075) -/CapHeight 0 ->> -endobj -14 0 obj -<< -/Length 226 -/Filter /FlateDecode -/Subtype /Type1C ->> -stream -H‰bd`ad`ddTðvsuvñÒÍË,K-*NÌÑõK-/.Ï,ÉpÎÏÍ È©Qù!ÃøCœå‡,XËïò_…?'°ÊDäò~÷çÿ"ð=Bpê÷:!fFFvïdCssSçü‚Ê¢ÌôŒdMCK Ç”ü¤T…àÊâ’ÔÜbϼäü¢‚ü¢Ä’Ô=Çœ… úb… ÔâÔ¢2 (N#c;“ÂJ,ì -ß×ðѯšßE¿R§ÿJaþUð}žè¿”5¬ÿRØùº»vv³ý.ïf0«þU– - -endstream -endobj -15 0 obj -<< -/FirstChar 45 -/Widths [ 333 0 0 0 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 778 ] -/Encoding /WinAnsiEncoding -/Type /Font -/BaseFont /KFECBJ+Helvetica-Condensed-Black -/LastChar 87 -/FontDescriptor 16 0 R -/Subtype /Type1 ->> -endobj -16 0 obj -<< -/FontBBox [ -168 -250 1113 1000 ] -/StemV 159 -/FontFile3 17 0 R -/XHeight 560 -/Flags 262176 -/Descent -189 -/Ascent 750 -/StemH 115 -/FontName /KFECBJ+Helvetica-Condensed-Black -/Type /FontDescriptor -/ItalicAngle 0 -/CharSet (\057space\057W\057hyphen\057two) -/CapHeight 750 ->> -endobj -17 0 obj -<< -/Length 469 -/Filter /FlateDecode -/Subtype /Type1C ->> -stream -H‰bd`ab`ddTôvsuvòÒöHÍ)K-ÉLNÔuÎÏKIÍ+NMÑuÊILÎ)Rù!ÍøC˜å‡ Øo›ß}¿Þþªa•e`XPÍû}!ÿ÷U‚s -1012ÎÙêœ_PY”™žQ¢ ‘¬©`hiaª"ÍA¤¥!˜4VpLÉOJU®,.IÍ-VðÌKÎ/*È/J,IMÑSPpÌÉQ™P¬”ZœZT…;N!³X!Q¡¤(1%57±([!?MÁ'3/¿¤² U¨(GÁÑ]!1/E?¿H!h@qiRqfJfbQfj±n#ƒ0ƒ+## »|õþï}| ôð{ãw-Æmß{˜¿oÿÞ(ú]ëwÏo-v¾ÝߥÔ}d\üÝø;ïwkæïÞ?ŠE׳oœpá@ŸÜÎþ9É©R!õÙéÉröÖ¬ÖÆv -¿¤Š~„~—þ=}ÊÖS§–-=sJâô¹•_J}—·<÷[ú·¶ùo ¹v¾Ÿó”ýl*gœú³‹ùGÁÏ&Ñßvl.vv†ýXÌ -dúÛÄú=œíè%¬½lÿ,aýÅö]ðgëok¶?‹X;Ùø*çþlšû;e6Ûwv®ïÆÜ=<|’ÜÃ| - -endstream -endobj -18 0 obj -<< -/FirstChar 48 -/Widths [ 720 720 720 720 720 720 720 720 ] -/Encoding 19 0 R -/Type /Font -/BaseFont /KFECCE+OCRA -/LastChar 55 -/Subtype /Type1 -/FontDescriptor 20 0 R -/ToUnicode 22 0 R ->> -endobj -19 0 obj -<< -/Type /Encoding -/Differences [ 48 /zero 50 /two 55 /seven ] ->> -endobj -20 0 obj -<< -/FontBBox [ -720 -239 1440 813 ] -/StemV 0 -/FontFile3 21 0 R -/XHeight 539 -/Flags 4 -/Descent -203 -/Ascent 737 -/FontName /KFECCE+OCRA -/Type /FontDescriptor -/ItalicAngle 0 -/CharSet (\057space\057two\057zero\057seven) -/CapHeight 778 ->> -endobj -21 0 obj -<< -/Length 418 -/Filter /FlateDecode -/Subtype /Type1C ->> -stream -H‰DMMKAÝÑvçP}Xa2;Ð¥‚nå¥D ªCat±],ûØÜÕÀC' ¢Íê*e”¶y°Ü›…·>~ƒ‡NÝ‚ˆö8³LAڥǻ¼Çû\“´ÌLú}>ÿЬ/àmè~ÚhOu·tÿDXÚÍ_Z¼{:ÙJÄ62Ð~F;8þ)Ÿ¼“RÖ£k <Ä#c££Ø‘W%<ŸRÒ–Š§¶Ã²²#++ )2Œ±wsy$URvëîßi€kç:¹^ŽÀf?·ͤ5Þ$UÓNÖ­ g0 -Šß58_YzA¤*¼TîŸEZƒO¡‡ bÕ“ÖHµ¨wIºÁÿ:yw’²p›?Í_‹EýøÆp‘hÜÈ:Ê+‰ÓX{âê^4ZØÓEòÉÒìN˜¤ ‘½Ò9¨²†¡fã"û—»–çoùËü0íôÄò8‚K™£Ø6bˆ5óJòð æbûp#›2Œl®„È,g2zLZùbáð¤ì"•ï9¸‘’“â"LæäR)W¼BM³.4–Ö¶¬A+Òõ+Àž¹© - -endstream -endobj -22 0 obj -<< -/Length 229 -/Filter /FlateDecode ->> -stream -H‰TP=oà Ýù7&êv¤z±XUòÐ´Š“îÎ.R èŒÿû€m%êÀñîãݽ;~lN³ø7yÝb„Î:C8ú‰4Â{ë (ÁX7o±zPx"·óqh\ç¡®¿¤äi†ÝÇû›Øÿ"ƒd]»kqûIv -átH ;ÆŸ*œÕ€À3í»Î¡\übì ŽAi$åz„ú d2•tæŽVÆ½Ó¿ŠØZ)Dú.W\f\­¸’,õتs·¼âS˜žˆ’æå‹´,Ê:|ž*ø5äÇ hlõ - -endstream -endobj -23 0 obj -<< -/FirstChar 32 -/Widths [ 250 0 0 0 0 0 0 0 0 0 0 0 0 333 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 611 556 500 0 0 0 0 0 0 0 0 0 0 0 0 444 0 444 500 444 0 0 500 222 0 444 222 778 500 500 500 0 333 444 278 500 0 0 0 444 ] -/Encoding /WinAnsiEncoding -/Type /Font -/BaseFont /KFECAD+Helvetica-Condensed -/LastChar 121 -/FontDescriptor 24 0 R -/Subtype /Type1 ->> -endobj -24 0 obj -<< -/FontBBox [ -174 -250 1071 990 ] -/StemV 79 -/FontFile3 25 0 R -/XHeight 556 -/Flags 32 -/Descent -189 -/Ascent 750 -/StemH 67 -/FontName /KFECAD+Helvetica-Condensed -/Type /FontDescriptor -/ItalicAngle 0 -/CharSet (\057space\057S\057t\057a\057e\057R\057i\057r\057m\057n\057p\057l\057T\057h\057d\057hyphen\057y\057s\057c\057k\057u\057o) -/CapHeight 750 ->> -endobj -25 0 obj -<< -/Length 1731 -/Filter /FlateDecode -/Subtype /Type1C ->> -stream -H‰„TkTSW¾—$7±ÕTs{a†«÷FJµBÕ¡WH@xT-PŠˆtt"  ‰&!¥ê`y„& R_ˆèˆ|´ 2­ -7*FÐ"Iý -š¯>µadÛe¶uï•“÷Œ¨EDøË¿U ¶?ƒ ž‰%ùµNH–õ|m£!rÒÿÜ݇"YғߤmÊo’ä²v „ß<~æù¯e¬©d¤gl…_ÐT¸é‰ÂPÀ&÷L!(weý€ÅÀ~Àû`.ÙE߆PøÈnè%³ÞZœúö•¡Žu_mf®¾ÞüáY i€PTE¨Ý_{ N²·ÑyúD8ŒŠŸ)‘03‰ë™â‹Ú#£ôíVKšÑY²gKvÿî j¶–Jâô5«máK:ÒA0Øß}£…q¤µ1þ\¥«®ÁÙàhpH‚´¸Í.Ùuüf,ÙMNÃ~ÎA¹O¦¿î`LjoÙHH£¸‹¢ÈVq,ù Ìïzôï:6X[}P½Š^RÔ]–œöVB<ˆi¹+g€…µ¥²¿‚b/y¦ÀH¥Y#•«æB|ÏÀðc'ZÏ@¡ÐN|\ oͤÑÓÙˆBŠv‹ómd‡$Úué÷×Xžtyâ½@…Jd ¦/@å’õø ÷fŒä`LRÃuÎGèÕ‘¯Õ±äwõ(šJ;dK‰§‘à8Dºí,v–€Ðê#‡ÖÑh©%¡9ÈêNùއ9C¼ŠåŸsYãw½ëÀ‹œ„êªïèhgNŸi;ÚNßnÑndg¢½œZ<•}=vÃvSÞÆª'^BŠh>°ˆ‡²QoD‡rƒª™A1ù+o€¡æbUKyþ?†ì,Åïðø/„Âñ-/°è‚èRàHƒh92Ñ1‘ËåÄ T”â£|Ft(oÓ -±”SÎ’-/•ÝóBNp>»¼+ƒŒ?ÃX"þ¯–óGÏ;$_6¦Ïî/_v~¾£“yßXx\G§ä2µì 9ïr½1OûænÖN7Fâg½béOΚCzÈ^ˆâ©8þŒ“¤çÿ¥cì„t¶Öð~ìó ¸làÿ¥*ý1Z„¥/F*ôŽ7‰¯ ©g*¥™BaÖ—–¯4OB¨®Ü¾ï¿”ŠTÌ,Ä@Ž‹·vúÈ^‡n -Eí^¥DxDy¼NXòít#z.‘A;ÑÊIlmë0 ÑÕÆ{ûÛ!-f·Öl-1çHxužÏ㟔óê,¼¼½w^uËî{É«äˆáµuÃßòêô­Ûʘ¿ˆc¿iؙȧýômz܉>Hö¤ûf;Í|.š™ڇBèèu¯GGõÇ‹Xrò3ËWï¨Â×jv§ª­×¾¬c½ sÓ®¹µç†CDíØðãð­>½ú -Cz²Ïf¼7~³ãý!W«a} #U½ëâ^qáãüûÇr¨5(:ng&‚P\>ø‘ƒ™pm"¶nma¹g¸Vˆyƒ Á“y¼°ÑKö’oÁT¨—/E ÈÞ¢*]™‰)*)Ü££³ÊÏ}ÄrɪµxYÿ6ÿ'ý?;Ï7éÊtV—⇸X¼¶z£Äþ†š~«¤¾±ŒMW¶´Ô´Ð7»Î ´³'ÛÎÝ?Ò J®íJQ36‘@ 8›HIHËN*š®‰p=å}š«yÔž{ð - -endstream -endobj -26 0 obj -<< -/FirstChar 32 -/Widths [ 300 0 0 0 0 0 0 0 0 0 0 0 300 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 660 660 0 540 0 0 0 0 0 0 0 660 0 620 0 0 600 540 0 0 900 0 0 0 0 0 0 0 0 0 540 0 0 540 540 0 560 540 260 0 0 260 820 540 540 540 0 340 500 380 540 0 0 540 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000 ] -/Encoding /WinAnsiEncoding -/Type /Font -/BaseFont /KFECAO+FranklinGothic-Demi -/LastChar 151 -/FontDescriptor 27 0 R -/Subtype /Type1 ->> -endobj -27 0 obj -<< -/FontBBox [ -199 -250 1014 934 ] -/StemV 147 -/FontFile3 28 0 R -/XHeight 508 -/Flags 32 -/Descent -174 -/Ascent 686 -/StemH 147 -/FontName /KFECAO+FranklinGothic-Demi -/Type /FontDescriptor -/ItalicAngle 0 -/CharSet (\057space\057D\057o\057N\057t\057C\057u\057comma\057F\057l\057d\057r\057S\057a\057p\057e\057m\057s\057n\057T\057h\057i\057P\057g\057emdash\057W\057x) -/CapHeight 686 ->> -endobj -28 0 obj -<< -/Length 2241 -/Filter /FlateDecode -/Subtype /Type1C ->> -stream -H‰lU{T׿Ã23`a&ƒqg¶F»ˆMD ÑØ&"`Ä*ˆÞ³ÿç„Ë)g–•Ž„‡•„ЏÆNÊ(caÁ=¶­³$Û*ïË­I3 -wlÌË• iÉ%I¢6›Sb æ˜:˜¡Rº•~£›Ò]ÄEK7ëbäØDSÄBû€ËzP›¤îm7óÃ…ð°Ü•!QÖ+›$ì­§±ÐÎÀ‹¯[zå“G;Ξ.迊8$ÅuÖEÔ:­­^R; œ_äè‚Hæ c7´>±R z‚Ö^¤bÈq7@Á~£ys¿ãÅÝê'Pv ØÇrýƒ…7þyÃüÉ - ï{½b+îªi’šjlõÍb{Ó¶ä]revQÌ&áõö%öxõ¾Kú«!¶!ô{Ú’tyØ k çÇÚß‹.þ&û?  “ÖÑÂï@Ëu¼¥mf;ÊZë[%îêþÚ&BsmÇì(7“óloÉÙ´ÃÒQC|}œ8G—²À`ÇôýŽU›‚ïQ6RýŸ‚Ÿ -ö*õ<žö!f±7Ö~‹Ç>õy,LŸa ö—K}øM[>¯•ë’ÊâÖa;µ3g”‚ÛÐPåƒo$5žÝ®¿ÀÕ_ˆ“C a‰ûÃÜu2Õóm%íõ6‰[gµ45´Š×*&FEbÕìôô†}›åÜ–òž[I üË?ƒ›ÊØ„½½Y"x÷‚î_Œ$Ÿ’9Ÿ!}\Û> -endobj -30 0 obj -<< -/FontBBox [ -166 -218 1078 975 ] -/StemV 142 -/FontFile3 31 0 R -/XHeight 517 -/Flags 262176 -/Descent -182 -/Ascent 714 -/StemH 107 -/FontName /KFEBNJ+HelveticaNeue-Bold -/Type /FontDescriptor -/ItalicAngle 0 -/CharSet (\057space\057F\057o\057r\057P\057i\057v\057a\057c\057y\057A\057t\057n\057d\057p\057e\057w\057k\057R\057u\057N\057comma\057s\057b\057f\057C\057D\057period\057one\057six\057two\057seven\057eight\057zero\057nine\057four\057three\057five\057S\057l\057m\057emdash\057g\057W\057hyphen\057parenleft\057B\057parenright\057T\057h\057M\057U\057colon\057O\057L\057x\057E\057quoteright\057exclam\057I\057Y\057G\057H\057J\057K\057V\057Q\057Z) -/CapHeight 714 ->> -endobj -31 0 obj -<< -/Length 4180 -/Filter /FlateDecode -/Subtype /Type1C ->> -stream -H‰lUkTSWN€{"Ü×Dš@rÁX ¨5Õêð~ÈÃ*(DI¥€ÑŽ«.×ÄX×<\vðAg*ŽÕú,u´¨ø¨…A–ƒ]ę̂c×´Õ:KÙw~ÌZ™ÎŸœÜsöÞçûö·÷>r™—L.—ëæ¦$'dgLN³–×Zkl¥ÅÙÖ5Ö¨„Êr‹çtœ¤—Kc|¤`?-¾‰Ï®<+å‚×÷ûÃ58,l ”yÉåÛÿ”XYµÖn[YV#F”NMæ3"é×#Æ[*K¬âµÕ5Öw«ÅôŠÒJ{U¥½¸Æj‰ÅøòrqÇ«Z\`­¶Úki÷%ÑV-‹vëJùÚ­±Æ^l±¾[l_%V®3m•5k«¬b|ªX\a™Rim¦zMIµÍb+¶Û¬ÕÑÿ‡“LN´dJ/™¿—,@% ÓÊޔ˔²LN¶P!k’É’)+2/™·l¶l•l¯ìÙ•O–7È?–?ñZíµß[齯û°OºO»ÏmNËmàú˜Àf3 »Ê$¯HVÔ+~­øF©R–(Û|ßu¾TjÕ\U­êŠJ5yÔ¾Qè—à×â÷˜ÿvÿ~7oæsøãüµYÝ¢þËèôÑ›F;G? HØp-àÏ7Côe©±¹.Ð &Œ‚ሶáBŸ #0—E'A8NN؆‘îÝ´&ˆFã¥Àhˆì…0a¹ÐÚ+]¤Ó¶t}Y^ƒ!]q{{Woã=%Da˜‚ÇqZí³ uò³æ ™Ã•š8Š0'é0æ4ÆÞÂ`¨X<Œ·A,Äê`Ê!0 @¨á•çc§fhîBà ÈI:ˆÉ‡X3„PÅpÂg‹±:œR†¦x nr¢åíÔö3GQùòâMÊDÅßv\s>Ðy¨÷¡ xy'œóî„2 œϱ¿ËäwYûŠlÜ{à+m_y+„A!i…§<ª80€ª»pö¢ê.ŠHhâp¯´כa0P6㜄YôƒJd´uÓÀǵÖJK‡ÀX'‡­L -ž§AŽ­cl¥Iî¥@Y‹k^z‡ `(÷ð—5m¿ã8>:ÇýÊzÖ¿ùhgŸþì)Û<£03nCö¶Ú0i&ÞÝ ÷†n-]>ý[ð–Ì(0¼èŽäP  -ðõÁLéð·õyöa÷Ðå_=ùj¤|¹õ,Å=–ƒ1ìè¾}»Îèoüy~BrAF|ÖÛ_tm2bÃpð¿€`=„6Â(ð†ñ:ûÖr‹Ö[¬†&Ç>ˆã ýEøC2DòFB•ç†=ÒN ¨×™úÐ_Ëæà’/ù"fQÅL|Œ;ßðÕŠ/Œ'J³÷åèSójr-Æ&7øaèÿ¥ï8\Zð[ã4i®–žžiÉHM*îîvqÞ0ŽHß A”n>T\ÒG6v ‚¿2| §N÷×a©"™〜o ÂaŒ’`AÃ?K>‡ùCAr !4T7Ô'!†*Xèê?ÌÕs®0-yɲTƒp2uá©~£0•L®jR-ì­74)„ýæºüLj”É06•Ò¯… ë~wÙÕ» [[dÛóÇÃ\ºÞðÃù3ä30Ð(,Í/5]§]¼»3{eNÁªù ò?uF… ÁŽýQ‘Þ!Mƒê–ûIேe7` µBòÈÂ2œŽËÝ9ÿÈrcÑqgåe}ï™?œ?ft4qo}P…úñú¥+ŸÚh| &M‚­§çʱîÞ¾öŒŒ”ÙsŒžî„š:ÔÙB«óU‹ -ËéÏgn™h*QË~NÅGÅ–Q'ß4œã½I qì‚Gñ=ìÒòÃ=Ã…Ncƒ˜¤q°ûø{³™šò†`& 䢘¿HTÓeO ú40‡}}²"!~Q]–g1ºŒ×ÀCFR¨»`½¢¯§~bê»ö긦ƒ×¦œ ¹†÷Œ˜…³ gßKÍ)±ç1Žñß7@TAò£4l†³¤ - ˜ë1èšô¸µh¦\•­°AM“$¥Åˆ‘,jâôÉz ] ~TÖ´„ö.Jú‘ÿ¾™B.¦à}Ö¥'ƒŠ§”´Rx DÂíô -Ò€ƒ˜ÓSp<ÆN]cD‘ñRºŒ‡¨çA(€t ‚ÜÚ|Hãå!DIþôý)ãó(¿_’¥ù¥%Ýù%œ%«³´ùYmf<(ˆeT-|L-fƒ @â*ɨ`;‹ôƒö‘¤ÅNô…X&ìŒØ8/wÂÿиT2k—^g0½ ÷qâÏ2ãêoë;OÄ Œ“ ·ÕPoÿ Ú‘*e¸„jÃvhó s|ÜZ;\X÷µç”¦€GŽïêäÔZ@'Ò:zÑä®eùÍi3âN» 0,K1 Ì „¶Oàõ~ð¿cA»ÿX…ä3¼$%ÑÃpˆÃ<†°ƒƒÏ»“çQéæO>’ƒ¦ÁÒMhi†j,¬•¶‚…e„K•.Päp©ÉÁ„ƒènâÀŸA¢´•s¸·B8¡_Í0Ö½kb8SÚÀѧ'ÏQ…C„{øÛ N»íÜápw5™Ÿ‘ª9Œ¡{uÿQ‹Rá:J½ô²úVÓ0C ”Ñl6“/40€IûB(íü7ÛUÅ™ÅAè·ChFÉ´vëH [µ©ü1Õóuß÷®ß{¿÷°?¾‰ÎÑôÚDY(£°F‡±¸ReèñRœoP!u‡0à0LÁƾ4øŸ®%{{‡'ORPø3ݺ×}¦×Ä]ù¾²ý¥îJý®ôõº=_—Ÿ{qXyÚë3¸m[²×ý_}jOÜ4wÍ -%èÇ¢I³‡E}Éo¢äIɯöh}„êÊ]S܄ϕÝQ™aûbhx*§%£*ýÇõ!_:!®»{äèÕØ=@7Ùªí3jód|Øäeñ¡ -Nà…]IÄì9$¤œ¸éäö>ÅŸÄå°M‹S2aä;0N‚è—0üÑ·r^¡"ÆàÔ¯Wå_Ö]©-½ØøÏõ~»d¢ 2ð5…Z”Cq8ê,Kºeñ@g¢esˆn’!yŽaâ ³,ÄóÜ%7‚‘|F2ˆ–q”¦÷‰zâúê%@CO“› ½ 0‹ºbq»h¼ó³¬Îbo4 öž0fÿ/˜+ ©½xû¤[g×íÊŽùSÓ`ÍbôQ³8ZBÊ¿c9¥xVgÃF\ºAM‚„ñ¯CĘ×ÙO­[éŒXŠ‚º•Ã<ºX“Ø%œšÄQ‚@$»Ä‡gZœÿB_ð[Ö+ò™eù,T_ñP¢¾Ëádž&‹c8ž%a({­Ó¸ž"Ǫ$º€‹k™úT¼Q6@}JŽÌ‹CTQåÄ àb­#·ti¬¢5–BSÍAM oÙìz„ -D,•°µ?,ÔŠVo÷A»EK -«ÿqjϹùÜî‹9å¥8£Sûí®cûk¤‹gÒfDíðݬølñIDGÝПt\m(>_%‹sr’v&íJv~siúùó:دt)ó fÑy)¾õ Å-ÕâùZ,at­!ÙÛ˜ìêœxñBC®&ªâêºÛÒK°k†(ˆD»fˆˆ£W*™PHMú†u¡Öoy°Á°üî/¿ž¸ÛÒr"ØW&{,t#eµ:gà7-¸§¡ýw(H<ѽ:±õƒÌ0¸DÁÁü»iË>˜.Kxpëöáö‡u'VG(ÿ§sKz[Æ“nTbôX˜Éçð—âfœ!ᘧ¢ˆ•8ì6RëÞP[þm¥œËgB´Ö?1ðo>Ë[›ZÜ{Ô~x¼¡W¿mÐÏbkb*ž†uZðùÌFâ ÇA'ôBßçhpl%Ê9¥à›ü‡i‹VFIÁ?ݶ]i³?•{ðf›t£bÙäBEÀïüAæ6‹m+Ý×:ôjP‡yTvïÞ“%ÅY™År—&çã5;ÖJè5Ý[Yê?¦U#ÄaŒ,pù‘§…¨K[AŸ¨ß¨EZj‹Å¦°LÍ•UóʦJøv -¨C}õÓ^õõk*”Ü©üÄœsƒ¥ù‹Kª7+8”G§|p~ÿ…i‡Á£UÁ‚ZßĦ[wŽÝ¼×nš`˜¸4,Ha¼ª¨EmY´‘¾l=”ó•gï4øÀ_Æ*Zÿ ·e­8:ú½ÄÈrì§h ÖtºÈøŒzûZЬe†ÑÑ›NÌgÝ‘žè–6†fC2.g{!Þèzâ¶Q¬ºÎä„ñ—«©»Læ¨fa<Ü£Ö-Šc­ÎTœÁ©"›æ˜–o$ÂŽ‰`Á¦ÄÞÃ4ïöL6„÷þ܉MlT\Ÿ_r¨m{ØLÏÒ›Óšk{î5åE…Éø5­Ÿj@| ûMž»$6^®OŒ,—¦Í]½\¡’°ð&ê4½ÎéÑçñNŸsĪ?wÏÌ^÷ðâ¬QÒ0Äöv’ö'ás-t¢ Í%†N°Ôƒ Ð_6ÈÆ¸fSóã'¦€€À„€¿ŽNh¾OI#)ÓE 5}¸RC³)ýÏÊåcŽÖ}T/ÁèÛÔÊŠ8FL‚è1{íœU2Ù²ºT"k°ÖëÃ{-´¡åp󣇕þ²¸Ú?Þ“¦ÞÝdè0p"4¹3 â3S)7¾*.ÍÌ(”Á]³#mKî6),46| sÒ¬ÇÌÆ!©f³«‰†º7èÐzºÑD-&Öâàb– }ãó/éΜÏ;réLÊœl†që°“ÈIh‡ü*t÷¾Ÿp“"x±¾.e±nþ¼ä%³ç¨Ï"m«>%ÀÞ0Û¶³us·¯–`æå7æ¬å=n=T‘³³\;MFJjVŠôþ–/¾Q à•y4ìGu¨ãÿºQ=ÎÒK,¦ú¸Å!Óמi•¡ŠÞü A·“þ0úJý¡Úãò^œ6È^té½í.5ßNý‚¦T³Å.F¶ÐÅá(B­Eµ™„dC¾½žÑ?£k^÷Y1¦û;3œƒ/{ÈÇ^r(ó~øŠ–cà‡Ô€° Fð¿Á3"žv|ÆÁp^’ Ôo€CŽüŒ®ÙêQq¡XšmÏXʆÊa‰bÃÙ´)Ò‹‰îcQò©‡C0“¨s -§Q…zÂOÕCvê~¦‘‡fƒ#X8êû!ܺiï’ä˜éo%f%îü(×5&S¦Iê¸p´¹B@¥P°Í~b+í_§€ðŸ^H*îŽ-Ƹ"x'›‡â‚Ö;EëœÓ_€ -·nwíÔש¸ - -endstream -endobj -32 0 obj -<< -/FirstChar 32 -/Widths [ 278 0 0 0 556 1000 0 0 259 259 0 0 278 389 278 333 556 556 556 556 556 556 556 556 556 556 278 278 0 0 0 556 0 648 685 722 704 611 574 759 722 259 519 667 556 871 722 760 648 760 685 648 574 722 611 926 611 648 611 0 0 0 0 0 0 537 593 537 593 537 296 574 556 222 222 519 222 853 556 574 593 593 333 500 315 556 500 758 518 500 480 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 278 426 426 0 0 1000 ] -/Encoding /WinAnsiEncoding -/Type /Font -/BaseFont /KFEBOO+HelveticaNeue-Roman -/LastChar 151 -/FontDescriptor 33 0 R -/Subtype /Type1 ->> -endobj -33 0 obj -<< -/FontBBox [ -166 -214 1076 952 ] -/StemV 85 -/FontFile3 34 0 R -/XHeight 517 -/Flags 32 -/Descent -198 -/Ascent 714 -/StemH 75 -/FontName /KFEBOO+HelveticaNeue-Roman -/Type /FontDescriptor -/ItalicAngle 0 -/CharSet (\057space\057E\057m\057p\057l\057o\057y\057e\057quoteright\057s\057c\057i\057a\057u\057r\057t\057n\057b\057R\057T\057h\057d\057hyphen\057k\057S\057comma\057Z\057I\057P\057A\057v\057C\057W\057g\057F\057x\057w\057D\057f\057parenleft\057N\057parenright\057M\057q\057O\057period\057L\057three\057semicolon\057emdash\057one\057two\057zero\057four\057V\057question\057K\057colon\057z\057B\057five\057eight\057Y\057nine\057seven\057dollar\057j\057six\057slash\057H\057G\057quotedblleft\057quotedblright\057U\057percent\057Q\057X\057J) -/CapHeight 714 ->> -endobj -34 0 obj -<< -/Length 4678 -/Filter /FlateDecode -/Subtype /Type1C ->> -stream -H‰”UmTמaØÙE`WvÔ]Ü ˆ| -" ¨È‡(ø•@¥À -‹® èòü† ‚@´IµXµÑ$êáDª@Ò-$jE\ƒ‹¸DWr6F¬¡ç|·=µimÚþé™{î;÷¹ó<Ï}ÞwHÂÞŽ IR™°liLR’oœ6¯D[¤ËÒ¬Òký×lÕäÛ^Ïä•$?ÝžwsrÅÌyùÕËD‘Û®gx_.§ÝØ«rÂŽ$4Äl+Óë6m.âfgysAáóçû sx ]°QË­-+,Òn-äVägè·è5EÚ쎋ÎËãÖØP…Üm¡V_"¬þ‹ §+ä4œ^»I'`õÚl®H¯ÉÖnÕès¹‚.Q—_PT¶MËE/ç4ùÙs -ôœN8¦°xc¡.[§Ñë´…ÿKA -!" ‰á,#8‚pŸNÄL'tQJÕ‘$øBØbâ(éE®'ëÈnr”´ÚÉí|íŠí~i7B­£Þ£†ììwÚ£h³èCÑuڗΠ¿³âÕâbña1/QI‚$ɯ%ç%cÓr&q“*'M8NqLt,v¼âˆN³œœ®9{8oqî–ª¤k¥}2‘ÌK¶Qv\v~²xòâÉ{'?tYà²Åå–Ëßäáòò¹… `60 LqÄ1©0vy“Qþ©)Á â.`ÍÌäCظ6œêWÜ»ÔtãUšÙ’+Û+BÖoŠÚ«bžb#Ìa êaL}GÞõ@ ÌáÑA` C¢#¥^•tLÄ={š³êã%&z;ˆo#Q/¹¹n…˜ùÅ•Aáè¬@‡xC§Âbæä‚úÕ¬z,‘òŽå]p¢+ß6ÉG õã`.3\ÌŽÐ|ãÄ.Q(Í|‚œõ‹ÄçAà ’¶§?¹é NFY¶/§2Ô±=õ#w ‡C’W–‡-Žªø¦[ŤY{¡ÿÿAñi©p) äÃ@1˜äa~Œu"®Ò?'%]•*þú\ß}5PH‰¥V;\Zò2¤”ü™‚Sø3ÖüsÀ * ôx[ÀGO{¢Û:\„ -Œý -g~‡>ª×8š©.÷gpë‚E¨€ØU0Ó÷΂þÐ *04½ýl8«ŠhQîWéºÜ]©é»$£Sçz Šç6F¸*Œd´RPÁB«[éŸÀœ lä…Õöƒ%{JÉ2^D•í`høÃÄQ --7ð}²Õ ífªž³x3Aú£ ´2Qúݘ‰A*s-;^ qà žµçþÆŒCOô<qQIO–ð‡úHøÄD?‘ÊÆÓÜÛÁÛ}”Ë!ÑzÈ$–Öø+²ÍgûX>5Uµ>y¦4\K‰ô^•NÑj¯•¡I»q¡„Ï2X úø£oÛwJu=¼. -˜æ}G¸KŸP=>P ¬átì0ÈLKMPoN23/ Fغc'j+ÞL›²$e¾OÊÑ*u(³ª,¡à¡„é@Ýw“¦/ä7ê:1“×ùi[ç5L ¸Š2tõGå>•‰®méÿVy§3+:21;¶¼¼¦öµ " $Œ)>L·œÆ{V(n`„"¾3øŠ±ßöÀ˜¨Çl¾ÂÌ1¿5Áe3Åo™XÉâ z…Õ~`¿¨å\û™N¥åOqþ(Z¶."4¹k`Ÿæ”÷Ç¢@¦„ða€„z ¡|Û;7ç©«ëš Sͯî7À2ƒ¼é9œ5-53ãÐÌ»°O¿ˆ K‰™°þö£Ç—û-j¦tàÅ‚øÝ˜^tPbz2®Ä·Ð»×AŽZ@-ïå ˜ñ Ý"“ -Ⳅoˆ€<ø1ÌO%3ûf›&áC›lþ¯FÜ-ÿ A‚5c/¡Ñç¢ vb¥ÄB× q‘@=ÌwÉ«›1lm€Bƒ¼Åo†ýæ•ff\!}ÐÛùÐØ»:raRrhpâe“Š™ClBKòÕBÓ°° =>LžãKÀ ¦þpf<Úx-ôŒŠ™Û}º¥ûºÂœôç$g' ƒšyÓ\Åö_iê»Õ¡]›ª‰[ºöüà«d,³9$o4G™àâ3ÎûóylØÚعá«ï ~Ó4ôÜr)jžŠ9‡VìdQzÄ´ -•uf@5œDª§ öà _œœÑ¦aÛms|9;z }À¢ìoψ9¤>¡ÍΖ0yYY©éáŠ4S³¸¯­ùâ窶ÖÖ/(€ ÂÍ…xàŒ:s¬åìëÆð±ë\#VJVNøR•®ßÓFÈA=ˆ¹¢q?›H¹Ó!l Ž8"Â}´´§ÆÂ(5Ê-`±Ä[VÑ`da+m4lXôVj¸+h¿,|Oƒ»alüцÞà¶Š{»÷LË—÷·s.¥UΜ_“¨Ä_ÑaçúÁíݳ£2²‘PãZúôÕß‹¼h¡&Âøý,ø£ÌˆÞJ܆“„›…Ù@à|!zq‚–PûÑ8©"6]”¸8VÈPxß"Ÿ ¥ÌúH-½_cä/ÉA /„yЪi¨%¼;Pv¸MÕ¯˜Ì£!öºFâ1Œ-‹Wã\ZºûŸŠ¸€å+VO¨áÅF«Jyw£õ]Zš"8i|½ÇF2âÐßù®¨&Î,,Æù·4¬'î&îDjDE@D,> - -AêëPDÄGÑ®v}T-Qê.—jQìY]E‹¨X\ëYŸ­´Å·VŠ hxDêøˆbjW­wân÷NÀ³ëÙSO8$3ÉýÿïÞÿû¾{‡¾ÿCÇô`ÊvÌÊ‚*T8 _º”…²P%dº{Ï+>x) -–3a7„Y±¿ÆR!¨ ú§›iØ¥Ôâbµ[!fÌBFÞ›‰É ` Ì»îÜk?mÑ·w@8oÓ²ôéDA«;\îŒ@<¯úÀù@F ©,ËaójuéZÚ7Lï—íp[l^;\°‚„>Þ!ª¥lÄâ©áÁ|ûƒôÀ<šìÑäŸáÇï·Kú/ -á:µUˆÂbံÓ:bÅ&ü™†—”Qp -ŽpèËðߨp Rp¸õ¶Î".p¨z·žv‡‚B`ÁYÊð)´N¥Â)¤;ŒNåNöÁRõwÁRåW¤Þqº3ÐÈ0KmÇ”vŽ>kikù49•ß;uMW_Ä”îj=÷Ø1DmÌgªÒÈùÓFæRt)«\ºƒà1xŒ½xbR -¤ ½£^tS$—¬Wèb æ - ­1ôƒ11tÓ*yôSé€íÔI ž’WÂB¢}A“~GkT ¾&á%µ’ÙÓªéié}ÖZ0¹ÐŒ,·ŸÃà$T -ËÝ©ùbk¨ßÿ¼Lÿ‡G(~ùòÙ’Š¯%!¼Â8¡7C¦Ø’ÄýeÁ{ysÍð^„>ôý°ÉS,œþ<>ç€"€;Gz¬ˆ"A.ûàÛ±}G/ µàWª(ºà¬dBõÝmb7Z¶Ä®õÙBïŸØ;Uë›?ªÏ«Ï®ŽÜêMº^vc×Áïo˜€E^A“„·ÉX:¦ÏÎ7]àt’G\R•f¥H„!¡®ýÍhD1‘æ‡^À϶Ä"”Ó`ÙMÖÀÅC±Kÿà# aÄoóHjJFX ÐÙad»%!ùÝÈ6ß2µ9ö8î×Îè·IÒ4èÖS»Êsé ¸­§I­‚U?Ñ(~Õ¥ô$Kéí¡x:CCBú aL$%nñ8 ¼" â¹ ^Òÿ¹ƒ\Ê3⦨ g«¿pù g*¿pVÅ?gpÐ…ÎòT!ø ÈRÚ‹ÿþÌ$¤>ó×¶a؜τ2 %[†{®±]0H¤0Nl&“¦¶ÓÕ·uë -ŒO¤Qßp@Ýw½¢ó ~ “ñsŒƒÏ9d rð!§ñQ‹ƒ½”¤‰vÇ. ç`·69{Ô×9¬$Žòš©i†¸C¹¨ÛaT.:ÔiLyK9Î9ÔÒ(%˜W'¨Ç9} ˆf»a¿“æ¬5²Ð¦ô„x1}z,v{{Úö35ßl?³Q:»ñÂÚ}»¼AÂiâšÜ¿ä™~zØ¥<¼ê_ì9ªØsµEfëOîh0ŸªÎ‰NŒÚ´Â"ì Ë_‚ÝMÖ¦Y÷jÊO-M®Xzô³Òâ¿•Hú÷rìI5´?Œ·.ËP몔wa«èŸ9½±ûô{ÿj?zt=@RP­¸U”™PUWÄ'l´4Ch3ø‚?ø†MX2i‘%¶G°ÎļöÓlVEðÍ :­ÍI‘Q¨ÇÁ|»B([ì`(µ„³‘¹iÓ†›±ËÌ{®'ÛÁ·¾rθ͖îwB-yº²“Ê¥ù¬zÎèí)f Iý×ý[Ðaß_*?[a!_+óÂ>Õ -Ÿˆ?z@T÷¯‚úÌHÆÞuê=òX£ìà¯a„cs8DŠñ+ÓæÅš‘Ku8×Y”^ zO†Ñ˜hF¿~9˜ºUq3™ÌàÝú°Õ¬bˆ“—o›¯W{}=M-­4Ô%ÛÁh÷z ëe%ù¡½«ÜµùHɧù«K¤«|ñ‡ËÖ}hž:c˜eTø7y}*έ…ÞvE¬IêdáÊëDì6ïqÛƒ£·Áëéá €YVìf^ƒUÊ1Š -ÑùüZvöO÷Œ3ã›oá ª®_¾ -Ák÷ÖP%æ1ôž…:IX=9zÇwk´9˜+†n™ífÖtFxfÐ4­Â^dØ$ë.e¨dmÇê]<<;IÂG2´ñ ›ÕŒ½ÇǼ?~‘”»é€Õþ·ÅÜcCÜ«ŽÒÜBÏ•!2L¥ñ'¢¯¬ýÓìîžÏÁÊ1B½ÄRrWÌÍÉ-,Ê‘bøKJ -¶˜íU‡ïZ„wY·ÎP¿B8Š;=ë/°Q°°\¨¤- •9®B,îÔC+Ì‚ š81³8%*‚÷ÀÒZ'ë(ÀAHa¹–¡VXJ0GûëÙ[¨ÒÒ´³CÚ~l,›/á]ºä'O´þ°-5Q»T|ù§q_Z’çOù£T“5±<ÉEy¤æ"Ñá#æÆB‹|Z¹]Ì~§¨[|¬|èF)xÜ”ÖÂ&‰ƒ‚ÜÉÜLUÑ ÁÃÀµ–?bZ࣒Ñi¥N·¬a”õ‹%o5U½¹ª˜·7ÈS«á™pîÍÖÎÛ.ÎC‡q»±¬5îRâÈ…®k¸§ˆç¢Dc¢¤ ùNEöpîœØRw$ëŒI—hüöQ„ ~‚c¥¬îÛ"r£¯µÞ®[8Yi‡6&ý¿fT‹t£dÆèoµ9þŠÇ´w¢«Ï†qóüή£Õ@úÍÌÓQî˜f¿ý›Lýö'~üÔ¬†´¾ø–)[¼DrY~HçQ‹F¬¿ Z‚ð, - -endstream -endobj -35 0 obj -<< -/Encoding /WinAnsiEncoding -/Type /Font -/Name /F2 -/BaseFont /Times-Roman -/Subtype /Type1 ->> -endobj -36 0 obj -<< -/Encoding /WinAnsiEncoding -/Type /Font -/Name /F1 -/BaseFont /Helvetica -/Subtype /Type1 ->> -endobj -xref -0 37 -0000000000 65535 f -0000000009 00000 n -0000000068 00000 n -0000000169 00000 n -0000000218 00000 n -0000000675 00000 n -0000012345 00000 n -0000012403 00000 n -0000013008 00000 n -0000013064 00000 n -0000013946 00000 n -0000014074 00000 n -0000014249 00000 n -0000014314 00000 n -0000014547 00000 n -0000014863 00000 n -0000015138 00000 n -0000015426 00000 n -0000015985 00000 n -0000016187 00000 n -0000016269 00000 n -0000016519 00000 n -0000017027 00000 n -0000017329 00000 n -0000017731 00000 n -0000018094 00000 n -0000019916 00000 n -0000020389 00000 n -0000020783 00000 n -0000023115 00000 n -0000023669 00000 n -0000024346 00000 n -0000028617 00000 n -0000029193 00000 n -0000029963 00000 n -0000034732 00000 n -0000034842 00000 n -trailer -<< -/Size 37 -/Root 3 0 R -/Info 2 0 R ->> -startxref -34950 -%%EOF diff --git a/z3c/rml/tests/expected/tag-name.pdf b/z3c/rml/tests/expected/tag-name.pdf deleted file mode 100644 index 8b9a2e2e..00000000 --- a/z3c/rml/tests/expected/tag-name.pdf +++ /dev/null @@ -1,107 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121219165653+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 215 >> -stream -Gat=bb6l*?&4Q>Er52g?@*I]ZF=le#NAuF7eebb`WW-lT`)oY\'t[">\mKa=.ANA'7b4UnA66Eb/P=1'D6Tp!1S#"R#tNcVd.?IEg/:8#l[P^"&M,8\%nGf/EVLM&BYMCtdlK=%rq6G5#_]^4@)&Nlf#sOP\;-)ht(9LA_)%?E4W,e]4\'RrU95F>1X#MDm:%:h9~>endstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000559 00000 n -0000000836 00000 n -0000000970 00000 n -0000001239 00000 n -0000001344 00000 n -0000001701 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\317_\373z<\377\333\214\316s\340[t\024a\312) (\317_\373z<\377\333\214\316s\340[t\024a\312)] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -1752 -%%EOF diff --git a/z3c/rml/tests/expected/tag-nextFrame.pdf b/z3c/rml/tests/expected/tag-nextFrame.pdf deleted file mode 100644 index 960783b3..00000000 --- a/z3c/rml/tests/expected/tag-nextFrame.pdf +++ /dev/null @@ -1,107 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 184 >> -stream -Gatmr]*\U*$q:&Eq1i1Si4-m`m+;Y_AL$7@`"r\Xm/DKCAe76>Ca:1K]f@'!kendstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000559 00000 n -0000000836 00000 n -0000000970 00000 n -0000001239 00000 n -0000001344 00000 n -0000001670 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -1721 -%%EOF diff --git a/z3c/rml/tests/expected/tag-nextPage.pdf b/z3c/rml/tests/expected/tag-nextPage.pdf deleted file mode 100644 index bd77c804..00000000 --- a/z3c/rml/tests/expected/tag-nextPage.pdf +++ /dev/null @@ -1,138 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page2': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 10 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 11 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 2 - /Kids [ 4 0 R - 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 174 >> -stream -Gaqcob6e;*$q9oErki$A346lXfX9Y=>U\Y<"s3pL>r_l!R'_Yl$/n3G%O"4jC@b;QZf3YMLnS``$42$t7D8SC7phR'k`[9CA-jHEm'6Ys!R'PpC$91f7klNHEj[Z(-c['!8*Olo:Maq/oE+D7/7YrhL!J$c\ppeFEc2EUendstream -endobj -% 'R10': class PDFStream -10 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 174 >> -stream -Gaqco5mdZJ$q9oEhVg+fZo4>@kur%,/ei>W6,s#"$g7MI8W*k;n2GXm&ONjuQB)*;'utkj%"3\)8C/k>lJ9KBqQcVYQQuk_9+[e-bm))j/@0PtTqC!X`N0Kje]M-f*+S2.db.ouf\FJl!q.ipA!oSdkSq+Ni?,+]gtT]X'rB;(MZ~>endstream -endobj -% 'R11': class PDFOutlines -11 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 12 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000559 00000 n -0000000836 00000 n -0000001114 00000 n -0000001249 00000 n -0000001518 00000 n -0000001631 00000 n -0000001946 00000 n -0000002264 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 7 0 R - /Root 6 0 R - /Size 12 >> -startxref -2316 -%%EOF diff --git a/z3c/rml/tests/expected/tag-outlineAdd.pdf b/z3c/rml/tests/expected/tag-outlineAdd.pdf deleted file mode 100644 index 9b077e96..00000000 --- a/z3c/rml/tests/expected/tag-outlineAdd.pdf +++ /dev/null @@ -1,138 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 12 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 11 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 6 0 R - /PageMode /UseNone - /Pages 11 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R6': class PDFOutlines -6 0 obj -<< /Count 6 - /First 7 0 R - /Last 7 0 R - /Type /Outlines >> -endobj -% 'Outline.0': class OutlineEntryObject -7 0 obj -<< /Count 3 - /Dest [ 3 0 R - /Fit ] - /First 8 0 R - /Last 10 0 R - /Parent 6 0 R - /Title (Top Level) >> -endobj -% 'Outline.5.0': class OutlineEntryObject -8 0 obj -<< /Count 1 - /Dest [ 3 0 R - /Fit ] - /First 9 0 R - /Last 9 0 R - /Next 10 0 R - /Parent 7 0 R - /Title (Item 1-1) >> -endobj -% 'Outline.6.0': class OutlineEntryObject -9 0 obj -<< /Dest [ 3 0 R - /Fit ] - /Parent 8 0 R - /Title (Item 2-1) >> -endobj -% 'Outline.5.1': class OutlineEntryObject -10 0 obj -<< /Dest [ 3 0 R - /Fit ] - /Parent 7 0 R - /Prev 8 0 R - /Title (Item 1-2) >> -endobj -% 'R11': class PDFPages -11 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R12': class PDFStream -12 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 99 >> -stream -GapQh0E=F,0U\H3T\pNYT^QKk?tc>IP,;W#U1^23ihPEM_TPs#b@LrZCLj,OCgq!cVI4:RWb6-_@LUc.b8!QT2%%!$!#OcA[K~>endstream -endobj -xref -0 13 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000651 00000 n -0000000786 00000 n -0000001058 00000 n -0000001180 00000 n -0000001349 00000 n -0000001531 00000 n -0000001658 00000 n -0000001782 00000 n -0000001889 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 5 0 R - /Root 4 0 R - /Size 13 >> -startxref -2102 -%%EOF diff --git a/z3c/rml/tests/expected/tag-pageGraphics.pdf b/z3c/rml/tests/expected/tag-pageGraphics.pdf deleted file mode 100644 index 932e106c..00000000 --- a/z3c/rml/tests/expected/tag-pageGraphics.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-BoldOblique -<< /BaseFont /Helvetica-BoldOblique - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 220 >> -stream -Gar?*_%)&N&4Gt4r50N%`6rL<$We#3_St.L0NnJj7&q.(hU92jR,.,jc-?`KLS8rG4g;96.fp%0)b;[e>@VU#jHV'S#uE?35toTU!1J:'_5,LO_j$<%c@`PqG4=[-gKdX"&%@/(_li%[1&CnLd["ljb0VODGSKpbOi3q_n%=g),;JncZ=$-@)7[@(4+.>575MG4>3?oqdl0qU<$j0Ej9JAi3j\~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000587 00000 n -0000000760 00000 n -0000001037 00000 n -0000001172 00000 n -0000001441 00000 n -0000001546 00000 n -0000001909 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -1961 -%%EOF diff --git a/z3c/rml/tests/expected/tag-pageInfo-2.pdf b/z3c/rml/tests/expected/tag-pageInfo-2.pdf deleted file mode 100644 index 1fedf4c1..00000000 --- a/z3c/rml/tests/expected/tag-pageInfo-2.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 612 - 1008 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 121 >> -stream -Gap@D0b-H6'Eri?4%tJ4?T&B:U!i`H+=n\%!fbYBOdA`to7Zb,I-_jf8l>tYTd+#UK@Z:PH`rOG'k><17ianM:tqsR3Tf'+%"!Ia]:Eqt/njl_n\#0[,T#2~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000640 00000 n -0000000774 00000 n -0000001056 00000 n -0000001161 00000 n -0000001424 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1475 -%%EOF diff --git a/z3c/rml/tests/expected/tag-pageInfo.pdf b/z3c/rml/tests/expected/tag-pageInfo.pdf deleted file mode 100644 index 6cc04f41..00000000 --- a/z3c/rml/tests/expected/tag-pageInfo.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 288 - 432 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 109 >> -stream -GapQh0E=F,0U\H3T\pNYT^QKk?tc>IP,;W#U1^23ihPEM_TN+I0SHG`1bhi]1,Mo8a]6^W8Bo8uendstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000639 00000 n -0000000773 00000 n -0000001055 00000 n -0000001160 00000 n -0000001411 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1462 -%%EOF diff --git a/z3c/rml/tests/expected/tag-para-border.pdf b/z3c/rml/tests/expected/tag-para-border.pdf deleted file mode 100644 index 05f64ff0..00000000 --- a/z3c/rml/tests/expected/tag-para-border.pdf +++ /dev/null @@ -1,107 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 347 >> -stream -Gas2Dbtc/1&;9M%speCQk0F)U2cUl^S?FQgbJ\$%#=4SF2pYj[O=)1n%Af+q))#Am,MWL7oJ]HMu.=?eB(<]OSS8utg8mqVTNcJDK(=oR[GV"7:+;ulH.PnIY"$m66>2tf,endstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000559 00000 n -0000000836 00000 n -0000000970 00000 n -0000001239 00000 n -0000001344 00000 n -0000001833 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -1884 -%%EOF diff --git a/z3c/rml/tests/expected/tag-para-wordWrap.pdf b/z3c/rml/tests/expected/tag-para-wordWrap.pdf deleted file mode 100644 index 80f22ff2..00000000 --- a/z3c/rml/tests/expected/tag-para-wordWrap.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 644 >> -stream -GauI295g:b'SZ:Ir#^s)+fus*X4XE$72rXmUmnAT=^R@Id,5d&F,AY$hdK1Y]=@7.!hh=ghg=eO$PD#AFO,=>I)p:*.7>!rgEK>h"PIF8ba&WnB^Ni3R\\D"m(:.b?MQmk\q(Xl\m0Vi0#Bg?TM8HGIf(OLD&+K)S3Rn6KhWEp/tt0k[WAB&Z!HLgf7u;/Li3]^8S09^:)"jm"RGX_D].J)IYE&=od*>BSr*YTeD:GmOFQ0[rk3]q6AY4F?L<6(Q>";=#r=+f5q9Oendstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001052 00000 n -0000001157 00000 n -0000001943 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1994 -%%EOF diff --git a/z3c/rml/tests/expected/tag-para.pdf b/z3c/rml/tests/expected/tag-para.pdf deleted file mode 100644 index 354f23a8..00000000 --- a/z3c/rml/tests/expected/tag-para.pdf +++ /dev/null @@ -1,65 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -1 0 obj -<< /F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 5 0 R /F5 6 0 R >> -endobj -2 0 obj -<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font >> -endobj -3 0 obj -<< /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font >> -endobj -4 0 obj -<< /BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font >> -endobj -5 0 obj -<< /BaseFont /Courier /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font >> -endobj -6 0 obj -<< /BaseFont /Helvetica-Oblique /Encoding /WinAnsiEncoding /Name /F5 /Subtype /Type1 /Type /Font >> -endobj -7 0 obj -<< /Contents 11 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 10 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> - /Type /Page >> -endobj -8 0 obj -<< /Outlines 12 0 R /PageMode /UseNone /Pages 10 0 R /Type /Catalog >> -endobj -9 0 obj -<< /Author (\(anonymous\)) /CreationDate (D:20140724025525+05'00') /Creator (\(unspecified\)) /Keywords () /Producer (ReportLab PDF Library - www.reportlab.com) /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -10 0 obj -<< /Count 1 /Kids [ 7 0 R ] /Type /Pages >> -endobj -11 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 716 >> -stream -Gat=igMWKG&;KX*q&SUp&ri@Q*ap'X\YrK:(K'9p]YN7&%g`H,Cm=Y\]-dkdNe/K0B%WOIL4=AL!n\R4?e5O5Y;sfB":0^/",%m/q)s,KVis@E,gkG.OGm$@$mS(#l.cJi#9-IMPW$Y"Vn*C1YtKuQd;0t/WiZKr)=e$RY<:lIHhL98,0!QQ6H0mPK!Q6C-9?]u#G!Fp&F"/`j/KgBP8U^eGl^LN2l1E.f>GGV3mJL,`.s7AIV;aFk1hJZ6`'??'_abSI2!]Y'([h+)GmN)*dn_AM.5.L-pMFe5X7LG73iN7UBm$bKQGJVBV;%98],^GN1kA'b8a6NJVr\OR$cngYc&``Wjl#fg,A6+)p+9([:>hpNS`105oHF*Qfnl:9;.W9K+'CO<:)&`gXVkBJ'I@sFU*%hr^/%ZSZO7[:=b=e3IU\GhX&#[B+#;WPCmTkT9&MVRij_nl`JUj?*CWnnGE*)6K,nO,Uueg-N^Fg#4!WR6UK5FgSM5TQS-pBaZ)gIPbl%m5eu*!8)#M"p.ZF\@kpfP"5/#;l2GN*7F]=t='?$L0%ns$ej7Gt'C`ik=6?^;CM-jjeOn8*L6[drn*L*p-AGhT=OiC8"fa&REE#B3YI6`D-bfWV:L32,ce@S%3:0_[dqu%U;kQ#f]f&Yogd(hF2uC1endstream -endobj -12 0 obj -<< /Count 0 /Type /Outlines >> -endobj -xref -0 13 -0000000000 65535 f -0000000075 00000 n -0000000149 00000 n -0000000259 00000 n -0000000374 00000 n -0000000496 00000 n -0000000604 00000 n -0000000722 00000 n -0000000931 00000 n -0000001020 00000 n -0000001256 00000 n -0000001319 00000 n -0000002131 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(ur4P\224\251\005\271\002\0331\('\224\207o) (ur4P\224\251\005\271\002\0331\('\224\207o)] - /Info 9 0 R /Root 8 0 R /Size 13 >> -startxref -2181 -%%EOF diff --git a/z3c/rml/tests/expected/tag-path.pdf b/z3c/rml/tests/expected/tag-path.pdf deleted file mode 100644 index c07d1fd2..00000000 --- a/z3c/rml/tests/expected/tag-path.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 292 >> -stream -GarW44\ip\$qC+b\V"Z)1Ub=ge#ifg*P"H]7$2HgP%<8=%'UXaMC8;ST*`[1kk_JE^h&)[T?E,#!7n_/0<[$#0_hijBtU4/G*=5*h=$4JG2*8/-Uh!]E;6hHmK'Z.9G(6gbdEML,r[[\4KC4Ec&5Z3l9="OF@@k16MD9?V~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001604 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1655 -%%EOF diff --git a/z3c/rml/tests/expected/tag-pieChart.pdf b/z3c/rml/tests/expected/tag-pieChart.pdf deleted file mode 100644 index df543393..00000000 --- a/z3c/rml/tests/expected/tag-pieChart.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Times-Roman -<< /BaseFont /Times-Roman - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1507 >> -stream -Gb!;cac7T7&A;<=5NEDGEfdQe&kE?-EsA9NQ3DBboU1J>u4p,RQlr?%*bbK&e\5#(>RC&MWps*Mr6o!/ap$(fOJS;5I0QVcc0JEci2Sh+q(i3=!WX.[[o-7DcHm/8us]@Vsph,n\,4[@AcVc^^i-'kL&-5d6n?Z*:&5d[(;aXh>k,jL/]/Z9j!S]XcfBu5Z+\joN&@CYr4%`:_j$f[boib^buJ6I0Js+ci53t2Q1='F_80fp(>ZN1igZj)e'a@5Q#`[YDPR2C=b`iO/Jk6A+8J!i&3DNC/Mk.(;kd-]qB_gbK0S'5:OGs/H3af$o/LQlRU9J@^#^i#94=DWbdJcr6l``7tpR`,J,D%26R-qj:bQ3FouFMsU?k*ErRZGW_;63V#tm4k.L:gsjkdUO[[$j8H3.#\Ls)g8Ig^D^K)CUNIC\**_$n$^HZlL/Qi(qhff[+Et@i>/SVFF/*O>hpnk[G/@^i7Lj>hK;?-O:PQ5]+-mI_j*-oYj]&h_468u;oT5L0r%DU00J#/fI13=U;.V2SsG;,%V8OL3\=PJH3NQYkeSFoT>,kL]]+=?g8DKQd1;'O3V!I$kZ!IX2l<dgkiB,8j@q"ao:(1')"W8BQ`N<`Rc+ELF#nuC*/d#&5L$O;6Xj`k+KPE^-kZQ@/[TTG3B);$LN;Z_nZjlQ]9&P[*)<^@*h&jp-4X^QZ!AeA_ocU:P`jdU09qbr1B=1fU3PtBbU7_8)hhHokJP'j(*ccL$uN#k:endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000573 00000 n -0000000740 00000 n -0000001017 00000 n -0000001152 00000 n -0000001434 00000 n -0000001539 00000 n -0000003190 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -3242 -%%EOF diff --git a/z3c/rml/tests/expected/tag-pieChart3d.pdf b/z3c/rml/tests/expected/tag-pieChart3d.pdf deleted file mode 100644 index 8a6ed9d2..00000000 --- a/z3c/rml/tests/expected/tag-pieChart3d.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Times-Roman -<< /BaseFont /Times-Roman - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 17737 >> -stream -Gb!T\9B8D+Q[r&3N+=neP54SM?jP&qL3F2C9mOH?/Em&[Ys/\_nbfG$!A:>g$^T@J8q]?l?J+L:m^\[^#Oiud/J+q%OfcIp*:QL#"]ANTWIjg@?oSGeit%3#;;_BLnXojE+!1IU+9(DprpSmNs7!r+rg/]'rSup^J#3&AcYn;Sm`V^qH>5><_>io;)u@&6b501NYIn2/+91f=^Ic$0^]'#?6i7>ebQ(^SqKm\ia*0m1GCMDj#5RULS7c-M0j;8cMF+2l*9!6LG96mUMs/&t98.aQIh6+$I0W<]*jgf.^RS!eOP!Ac,5;K#I$TYsW,hj%ag%s>\o%:B7XCHRZ^$;ARB#s\Q1rAW3,eN2NLT@6hT4GNehgI!'kUq=(+[AI[0VeR`Mf@PaY7[hNAXjoI*k?j_WnVuUQOn>!\lo'Q/[fDkVU,R6]Z#LVAWR!be$>unIT4uqUf@QJ+23ESY0>dK<%:>gQn(>u/Lu*?!fsqFTfuUs@^"PYf/$Qa/?mW35b\#5,q&Ib6Yhhu[7X8"d9W8E+`sf_![_;i9-#L\G>h5NaqOO\,e(Sl0js+#M##qL]@qU9l2$.[pX?BGkXN[!<3%;gZg"_lK*34DjQ=obW1qN1Ck3'h7YI!=pJY`t)bIqTLfOjD_Do\0gQSZV:]3eW3m=Eg$ST7>pc90^"[2R[m/$Q=VZVMeLNQ$@lRYkUgc+rn/n#3;aHYiq,CVbsV%P78o%(c7G2T>"t6.=_!;d>*-7GGQ/KfL2<\mDs[cNnjYi?RSMc+ls?J^&FTH&`nPB#HD+Z^DRc9(nBXUP\Aj)_F8)-5k5E2Oji-pXn-YhW:,]osKqnH)B9sX#VMFZD#%C4R+f.\c^)jq^Z:I>+a$;RSV(r/jg%?4k@i#UXggIY1YD2^&8]%#]t9!/!kn=iCgG#mMGEQ$/ZIuq[C[a3Gsi"WdXWP[JS)bQ;^Vq)Y"R(C#A"cYbk30c:7^fm[Yj5el#2k>&eKOh'k`E`V*3_djLVaJ3.-sbSfV-5NZ!`>r%qUA6b!$aE/3`([';2[-c@,hQrH.Eg_p6!.p*\M&0]0oYB-50;#7=TYi2h7lBYmW/'tr*R9!k1t^d6LQ`[#EUq$;_%+LMOo[*Z_^.SW3tgV;1gii%*/OfA,gqf[L0]u.83!guiJo/d4-K)(bar/S1ZU#^aOMM_%6D?b6o;ssd79?=G"M69pcq@-+2%[@kQOJ+0^R40Nh-8poSfQ+(j>-g7rJDiHHX]S$k"TIk>IkhdaFrp8ft^\nR`Sch^JI,oB1b"J/r1,>)')IHh`hD[];+afLdSf?/'Ve%'2&LU]h`kC1tZM\$=CraaTH..H6;)Q"#qf"7l`^Pjf3G&>5290Nu&!gfLc>?WFcYi!Z$F9tQ`M]hUQ&]IGG]'Y'0OBu5G-3qJ=sf5NX0Jqg$T[u=(:(`#I4l(7a;LA%&%uEhj_$#)2U54-$\hg7?(Z\t/:OeU5;3Odq<7s+Qk7?eGg&S@rjfo^X_M$5\f-h@1MaPCL8_o3qcJN3qCcLVB9?6jMgFs7Y?dTF^GF:$A/@V?&tb?(H)L^k:KBuFknc;U*e4?]fT!Ao;[R*P2jmG]ku\eoDP0Ztfa[ZVEI%+/>9fTJN,K]O(0PPs=pC)!tS>?`FQorZIe1J=8\-M#`7DYDO!mSiIuSmgf-f6[t=hL!7TfJUD<%"k_/3+(FhlYFhBoQ3gMR6-&(\N=kKfJU^S'J*06`O01Kj/gn@Y_J^&4mR%5[JkqVg4%GkTdRb?O6OroMs_('qN/i]3]??!j$W9i?1`U>79eBX\Fr^&fD`>SR:4]248[F0CHnD=CY6%5ci,ihg>@YrfQ:JJi:)X_?i8pQPr;usjmX@XlL:F`VV4.KlJcEaaG66j>gKX4lQ,D,fYnjA(H(R=U5.JAG&c9SQ!8`Xjhnb@]=@UonqLFTr^[.//no:#L1-Fu37=Y2QZP5caKQnCNj*9c<>i@lo?74-HetQfL4@d]cA2*_C,!,tX092=-L97l%CYO(:Ee]Tnfd5Eam-9@=oATTtj5E&<>N?CJdZ0Nu1IN(Xg=lt@T0`a[SsYoM!mDK7S'UB)5J?JhC2_u,q6pR/Mdqo82,:\%$MZ+H7$Ytp!U7fWH3W1il'f'Qsn@&A+jj#]`\h?=j#+MKD%"?(7")R`A`++^P/C:PorWg\4+NMU0IZ%[@0gJiO;b&V:I/3M[:;n"[Fff:`rCVjn4\HQ$YKWV7u(_Mf"%_JJuN+u73a#-u.D.SgVo^rRG'"Z:6;&fkcAjb0-UVn)'`:u77Gih3acL'6:j3kJUohiQfSgC%Hg]M5V1Fn2SgChkOgX@le!*,+8O'E1%Cf#kSA_C^(2TH]:L&!-5gFh0H43XF/V:dmJ2HD:(@!h*_b8u'!Xb]fkG3qRGL1-JfWMWPh).'A`+?,VL^7]1a(hB,Ik.nR5(GOkcjUA[e;B)r*Q1N_D:"4+Jr)q?]m3roh"h,(UVB4CXq3lnDKARD*p6n)WQlE+PB6(l#;7p>FeoHKmT?,%HT?]hVZTNbaG^+lZbnr:D1NYp],_iG`:'G&>W\>V=HX@WhMG9=Df(05YUD9kpG.rH-gU.79?HRQ4DGZ&7mX.lc0l8$hDT`3C/^3;R]\Y>:,;@@8lo"0W)+-?!gQ9^9D)T-`./W/YkX7R19\U@o*7(9mDtV;n@;Gd_DYN2KELY1CgM$>#F6DB>V:R((j$$X?Wr8YdI?i$X;"YXmlO*k5nc3"Om.]PHQt3u.-s]a10\+=.!c&L@./1hP;aL3JbippcZO(12@0T[IaP2S',\@G^?O\hgt02SF35Vtl,))k@($RVVTfUjDSPcGYT$LPmuSc%>a$?QK>V*KCD2UBJ`087Yq2QQY4WBB"7,nK$^=G]lpKE7Q!hT^cP4/lJRGI$`X<"6]ea?rYh$^b`Q':7?]87f*c0'l3/Ig3IY^)(#8m$l/nVE'qFHKMr2T[@RUd2$$*>upagS9Jp.O6c"5S$gcFoC+=g)a6hFXSr+]Rp9(C]8LQdKhKYB@dqA2tLDr%@QVDDGS!6.QMrd3!T09RR?P$>h`j50hUPNmU;0e[AWs_bM#i1$52?@b1\KI-ef=44REZQ(Um,`&3``f51,JIE-nKS!pTt6EmffJ'fo4YU&tdMc0oMNc`Mnj2EKe@;,?ZH0Qc->saRd)M2p3>AT't[r[Rf9PXsDZM%I`g]Pq["%/;\i-31_^1Wo*F]@tB>!`D(b8"2lb6En>?'bYOjTA]Q:6(Y#Q[A[8j)RsWp*/))O/'Q.0n_]9`15`_0mQG0isi\9?S#"1`U99iF%kpSQ<-m;]3Fu\,K]fU&uV?J#QGZ,@gbIm)(LU#]8ceuMr"nf+`RiZnnq+]ZSDLYTBO%=M0c:;d-o]m`,DJJqY5rWZZ#ca@l+4BMQq&b`C1D#RS]\*leHJZl*,@bXmacXM#j5nAJRuMKbqTTX6ZN"Mj*=^t>,.Q/lQ$V9@Bcfbs*'+h_tbofh9HUmAAVM9^0!.8kC'tYh:.tDHNmWrP#jU"#VkE4hb=pZPcUQB3<9Hlbf)2Ei^M\aIgpU[&&#GE"dP,O=0ACaF0ki$*7m-8U=1MbAb]]`'$i=k(C/[6bKYQ>6M3LqcYE*ssFQu>#6gj[,IW$ra+F@j.#&gj\UMd:)eD&K9C1EXQ^>WC01oRSCp3)E7:\Z'sA71Q^2o,='m5\QqD\!bZasXoHn8E;"\d:9n_D($@/uH'41`)"_`hcu$;B@=P[H%QR!ja]^:-*@f'sm-`r?+nAEK.4PH;Thsd:GsYfLf^9VHCgT(:`u[H7Fb2=fu/]6YFDO$&Pe)2"hYe:T!f3=NdqrIC5'Mq;"UHB%Ee_-$Fpo$o9DtB.D!<:!$kG]KK?.A63mUF_@*8L)%+0G2i^')m[,@0$>CRL/&l6[1noZ55/ee4@qW5Z^VPG&@$:21PN8)Xd;18sjYYbZffcK_M('1cCAtlWW^h,@hA"$(@,mi,dMq'WH=33_NqESbI.Lt@[akeJ%lr@?(nH!Xh9pf]@8pHC+\BPlnA/g_+qR_>)!PMs`+^+T[-X)VK'>=;fkDJd4m`=3`imI?p%TG=oZ74UZ%HbDs"-uZ:*jW+E1rHAP>OKh(f)$dS+[:Ni\A*[J`4#d40HZ4Ln;o"TK;dB5'b<#DiE#icWMsCLi&r/R(.Ce$U2_Gm$:?Lj#G/4n&HZ@$_T%K3]HQFetiHVkK0OsIcM]"V"[]:mW*"c[>;gWI@[e*jbou+PS"Va=QYbF\2g0t[m2og\bcK&uG,q%p7r:hE[8.T!KT;MV=2[%`Z6Kog".RTE=&1FqPm:X'\Y_/5L/d[;BdZnh9/-\Kc:*:e&QK`r;s#a&+ZD!X0h-N'I1AY_lr\=E>]n=;_T.YuC#sRFN9?Cpi]aLR/'m8VLpoh,Y&2]5rF2l\+0M+uA-elMfFq"C=5dkXk[i)45Y8rNBi#JlL3pc-X0`u/99GEIC^G"d=Z:Zp(R92^G.D$1%hFOF"^!,*<4A97M/+l+ghX:"PWd)g=<YZP*nn0ZhYSK"N$rG9FPDb>G'mg>0q'-FF>oE&+(R(8/";XZj#I#MDH'cTB+^E]q[>H,"e'+EkdRC%UT%SR^mTB#r!3G"uBS^2)Bt3'bfJ(QaU@.#tiI@dk%clga&G-WRrf7.V`56kSTT8=I[!q\!$0c#^/dL?ZHV;Q^Ea:8nOGQYV]U4ilF7,%GZA9Hn%%H`oi)EU]DjI0)41d%ZY3^5\L64I5Q9%'/IKg"-_a,mbc?=DUP<.ddi8UkW<$O>b\N"d5.?E<:&B>lnVlEfQR@>Pq1NO;hU-C>aLmL1553]X1d#86iTLuVX6rYagm0'Km$.h<%-*7#s$VX4DgV1^>1AWR[n-&7V`*Sk,=;MJ.%j#:`c3K_RTP`(>m;Xiff2J\L0$t&^qNg\6oM1\;"=:4uN7;B\/el'Nh%rYaS\4Q'-8ae?%=FP\I$;FrPPIdV:b1dUmmB(_P\tpgBNbO^$65jJpC#sJ)mLL)ah7CEjBPLpDUdiLZfa`$D8q*[T@D9Y3L0"N2"L;=LHM+PQB27otflIab9bkSLcmnY:^3ki@r#CXX)>8A_]G<&)HU`c94JOuF!Hrl[I'&Wgoi,B."@u"h>mQtIOE0nIq0UdS"*F;2$/pPpcdrr]*"l3;E6,pgM*N+WH5J8H?810PQO/!C?bZ:ofq?0r&"=rpHJ&--"tW^ZK-N-p\O=H"/;/k@A2t99f1Q0NP)<@a8?,=W&`l1hm79Dbk""t_#t_)o8B<#IAT!8K4VH@ghBR"nac'@BP51:!L0YGIjZJ:tOn2'^0^R3lNn.UjV)97S@a@]X3',-PQO\'#.X3F0=1NDk*#_>F3P(8[QgSp:,hmss\uNm8C`(cIGEr<$X9&;*&V&d%#/:16fsc1YEDTW;\.gDGoTcG/7MQgm6OMFDrok#Ck'6a@Tlft%=nR1r)B?N\HdQ),L0rWDK(Reu.7uLm[s+4LqSqXpKO%nYEq]9JPFU0Qga)'g"b,">,8$VHaCA#Nf:.e;g;N`1(f)*.rkcG5O7Y1(C4!9k;`5B>.d`j-K4^Q5^"NDIhMU^`He1Z2*Aq#"2"(P@5CS`='cJr/;LM6I.kd34rVi./Qg)\*Q=^;=e?spQrTu9/0&dVC&A$V(&qAkGJ+uIhAX$WiTrAGuL*j,#]-"`O8,rH`h`ar(I_C1,Nb3PXs$sSNI+_-nPX4tqEFeDn!aI3$F`X+@F=3#>A@"0cq\g3e/+1%kFWk+/6Y=!K2XP^KYEJ+JE`&oY&$6LX<\GOWY%Hi2Ht5VcWPYdT/>\D7p%A$,?eHcLVk6GQ0'_4ZL'"5Ko1V?bu5Hm_#/+$1_[`&<&a%@m%JfS&^6&-%Rk2edG;W:B\KB$Ij1#m9C.NC&#T]h?I]-NZKMSOT6o>ArmS&lhcWgg&QfsYmsV6og77(]+[[AHT*O*V1l2:';8]4?0#_2&g,f%%,KFpRJip.A+./Wimat)uRSoQX&GDC,[AY)8o)($"BWLG%+kq+8-7.AVJb>O/Xd=J2(,g1rKi>FSrf3E48OFseUqp)lMSa0KW;Cqd)YWJ>6l6QhSla2LR96M8*^f!.OoMNN!OH-)8%JJ=AN5TCatd.m8]aCG\c*,c:$V"h"h$Q%7l=%jCN5t%2Y<+&$u@MF*4oW@PH!)2C%.7//WRum:/e#9kMa8am+r2G"B/O)6bErU@.G4<+IA^r0Q$CS_2OrqQJ1i3kg>iO_5H:"dA+#Lle]*8Y:k*NP*;)V-jNLWflLj)\l%8?8_S\%#JaM-%@HE1rb3U_?\ht:);!,T*&e<3VISHl@SV5e*8]ur)!"6Ic9D]8gUIlePK@i`=U%Q]nW2euEUrBjP@/3k0nf@M_Bfoe"6t5<$-)U"'NW8rI;E(kZ+T!hFC6ld-nIefU\%4"C>C8TfF2Me!2JrtCpMEc#L'oq#<0%:f`%X6_Zu\u`NdpE@oE`aoSbr-/2f63#^'6V:?aA&e@>n)soV*PTX&k^[*oso!KIXefZp;*36CnheJoK>'WU?E(J90stI@kC('Z4c@u+/Y(TOW>ZK=-_ZW<3/oYGchs\WW5h^p5JimOm=LGb>r_blC:0[cY07._*j`63Y;-l'04A'j$hTWme%b4@;Ee3$;IUfB;np]S3$0T"V)`E[_STtAY\t;gDlV<0^:rr+'ES[@2)V4.unZHR$B7+kh'u'Mp1=`:0Yt1["UcPgsDgYlKVG^GgR'\@Oi([a+K7\>cK0`YLp-gX*Sgl1]YJp8T"#.X9Ac9.ciT8YLl)T<2r%5<"Y-XCKes`di1jC>>t`'gX/.LHq&$aYSjIMam5[Whh3&A;j'^B!#KHsi8/\a)$WHbbLIiJ74E)u0iOl*m=X\3q'V&@,qtK?RUaNFaqa2HW3jH71Z"u`&*cLW%N9o/OM\D%8J(X7l?EP.Wi1!0C'W_FCiXr\dGeT*54^$G,g$_3^dBVD;F5*G;j(2gp[/LWJ6I&LkR=Hs>17>LXu(;N4_8nuE+?;D:XV;$pHbMURu_&VY:0_uUgZNOc3*U#WK@t,k,upq;JKI&jdrL,&d6P3e+R?u<7modB2n>Dd\h6/6ppWdd8l*299H--X[=-5p-rXk1L)B$Qd20ubQS%bq/f56hOeb=Rq-:;MU-8h(4Bu,umMugI6Vb[;P6.U`?UD8r8Bs8K;*b+jXCYl^QX/M%H'gS.KAK+iUEC&(r3.o*P[5cm?2dOh_fEkNab10.G@4ngjeEji%b[5Y-V^?b!46f.56YokWO2F'#3:ejJ*3Z[!+"lT+P[Z075c_?e'40EDu*j)DsbW[.32`0K>6pZF?@6-U4?3feYp3gP8^rH#YpWXs=:qp0EMSiNV`?I,**'FsXl&_2(c?O&Vjc?XEM3eY/p.gkf@g/EWZJ/lB]?qjQ\g\UTNNFoS3;WUS,EL!A_fX>'u#!*MJ.7j'!i_Bk(A5dEOG=VcU_G"Upk7o6-5VaW3?5V3F7!6L3[gl.^JAI52cU\bka/@KnWtSOHn>:so>$.]l7ZNX\7]`J0L=n>Y1ZX8%fs'0$REj?qG'K;DdR@L1PW@/&Te)XmJZY6`5W8NI/j46&^Y6ae,ta14Mu?."d^F[(XT'P3e1\-kHleX9Ldj%=hm"m.RNXicCcf)['NFf!3-VW[jm-o#-GM0[b8arJmMV>127fUWe7=99k0o18U:;=`pN[l:Z[lr\`kg_o7RQMpcS0"nSN"cY@NA-:P&Y/\[h3'J[!pht;^AHUe%$q[)J(F]Or?E%YaRb_ZHhL.1d%FY%CAPg3U5@9oA_+rZ"1U*"Sk^8YC@7=r`1\2#$.G:'AoP:GTW*YtMG<3p7e?BJ-.lAg-^n-Ro3\G5*+("?H*NWip?1FHQL3JJGAY?R>)i`bpg](1IJ",Xp8^&Ptk2L-Nsqi/G1H0f<(9B-^c\NKF'9a*B7@$g>/mSWC!p>b(fhq#Xo)juuE[po]a,:ItABgi@OB1)hWAIq]\to![#+-U^lc<=+^h.;iJ(jQHj"5LksX82Z$ouWIfBOkCbbg4A0JjPlBIjbbKX:f%g]!`,8Z!aH_5L>ljY,2/g**lnI=o(npfP>h)?Xl(nKR7F6+(3jsE_<'Vsqd;jkY]"F;<$fS\Era(G2onYbV6NB-DXn8k\\60.Dc:[#dKbBbN;'d4!6j@F.L8'Q6m#0TYPNLOCq+VCJ?7Ci%MYqe?"?`GL:I>jbg*M'Xe6jRFGbfIo0bI4e4q-+eEBgdoeW4YW[>Qddtc:pS\HaaA-[>cCb.ic$mT;G3Pl)]%u#Z\9&GgDRtSe5S/:s,<6d]5;CgtQ$JEiOfeY;H#^cM)JhuAp2h2Rb-bJ2cdLjV6`$U3!aG^+1G\6Y=N`aiHN[r%q>%beCbjU-9-m'?Z`/E4tU\go+$3!^!]]6qn)UGo84+62ba@/4F>j;"@Y77=7s'R%E"cEMQE*d4)>e<#s\!K8Y_YQQOT']fRQHVe+P#L7O\%OZpL^""=*MVb%8e0n^'BFK%fsEpks-Vs'+PREIN]:7h2a;,i:l+uC3.e!Nt11a3.YSnXQlW(>c9'asTuqHV_s,TEWEq)PG6S&4N'IdcuogoC4epqEQHK$[;1mXNT4b6E)t`_67kRj-jB*)'G?#P"dr-&<)?h'Dd+Op8\$nU2Xoq`0j+5:1jYT^76P\WAN1'd??=h%Ad'l5\*!'mc@gUHH+IX-s\BC%R3Yjq2_j6DKpA%(qD$.oX_Op@\St#jY#5<$q,r0l_is6O37.6AZmBQ0])_91S?=-CDfh9f?VP\k]@YWO98,S4j3taIA+i@C+u2+h1-rl_$MpK56l[Sc0`uSQ!):LhJ5cKsEXBL;&)EqX&GU?VTqYmA&l%gIDM&7MnF^l%fi]!V)@>kk:i?Tnj91HpS2Ml6U4(Hi5gApPE[[A@:@il\=R=;-tN.o+sh)$Mlj++PW[8KErKAs$]ZTg`_gMJe9cjTO-eW\'(-Y/Abcmi(fX%J%'l(-*k<*fB[m-dO.*?jG]:MWqD)&5&_76&.'#C[Qbip(L-Z$DT@eWD+`\T9%B<)cqGHAfR'^LCjk=/QpNl+HS]Be/WPk)Qo_TV8XClUH)L[%HiXVp*n!.Sn\;`Wom4.6,u$)DI/@hC-Qj(P1niI;e>j*(Z]Lfj\SNWl#)I42VMe_=cKF2KURrOai1JD--o>+"ck>&(C60pI7\+/k\R13"cd[IZ#IJsuLQHKi0[lWlGW_q5'0E&8KKMa94H65<3pW.iEJGUKf5+W(EJ(:Lf^SJ*_;Su<1T3,^;:AXc8<<.O`ho3Jg5'7.d:^7,O#FK@.c9+D(4-_O?+1%J35M.!oC/\jkPGuGNp:KZ:o;,j=&B`XAJ`j8\<8Y'RaX!p4iU*D9Vt<')fHue(fOk:Y'cX`Z+Oha6q7W2P.+Pg]o*R'nd[:NhCbATh.cWsS2P@,2I'XEqd.t17]O^oJEan\'a8Dgfj52E:MaqZQ-7.q6Tjj#i('mbf.1N,JO->_'0h>@\t22+8YGN')puL6oD;Ff@XFc:8$V***_3<4h?u]?U0Q[k0_ijZp(O"A3PfL^R,UYU7($/6E&fATTKQTj\:F3GibrU:![>+$r7/])X(Z/L!WK!uneXJ[abqYHu\`Kj?7qb+F@AYYGWfEf,)f[cJFEMF;hk\">1=L[B3#.NI/no"H,F+Jad-rb%HAP[82Cf^i3d-Q8+.YDi,ZmS.C5T%J.`gK^0aKOW2Hh@RR'%E#SK1ip-)Y$TP5;_&98_LukDUD*B*5JG&Iia52+8A8c`X4p;p&u,18tEDrMR;4i0E_<.4STU?W\Qp-$r(?a&/Y:^6U3ZW<'?e[Hk!YPF_,YV=cCPP@&pB#QP/%a2+=TfK9sGHY*Itgm`"1Ge7,gmcOT^5qHff#b^4$oIOO5/L[QN$:]A0?TS/_o/O/K'^O\_Y[,a4GJ\sN\?LtmcuH+KEnln5]O9+@fT,PIPW7F8c2!(V5oC!%MD]:-Zao9?6ro;me6SY=5`PsuXf6TFpim6[#VR6uS`W5\i3"??LMB6#<*#Fd6ZSB>d@Uf_RS"jScRrqs(^\bVRI#hW`#^7O;3.J",_IJ/MPVtHr8MH=mW^JjbOgg^\C5G_!d)L>HLa`U7P6IB&rPO8I21)K\F,5QHi1@K?LWSrqm!glsX8^JAc2oa.WZ9A(8n&Mt?16B,6_6Z>rWC/r_-;i7sd<2_"1p2gV;JkaWr9QZ=6l9(;Nbi/&2ik?XW5c$:$1p0K.p=86J79cZ6o6*5=aQ\C,X?$hfqS7?t*?M1JFp#1a[pkP&BaGsgaYtqT'eTra2g=^u7%4%$@C0ZeT]EE(A).Id&<;3m(SD,pdD;-?q@\mY?DE^!3.(4\]E4kqDie9r910FeuGgN\Sj'%#[^s>)QA3VF^GVCil2nZZmR/==]tV!jTqN(6YR'+_no6dOWa@c5DL(o.(X6:d@.cj]Xgj#c8q#">>Y^QMhoIZ0;Mp.75*CONg]K(R<>^BYKkNIK%@10U=:r8M9d9.^O)R@+_2FG.Ym_h7c1j,1OomRS>?mE+F86Tl[1OJ3^!Cb;Q,&oEDRKMAk@;UMnZ%UI\!ogr3%arq#19Z(Ecg$D:_,9+j1;mW/E9!I9Zo4bWr31(1?Dq"is.(DSAS]gn(i^"]CJI?$is*h.7=6BiV]]+m?Ca'\\IbhXQ\ngTUeaBb*am$*j<:L5TV%a'Dbo$uY=raTf_=^NKI1,'V7slVnW2^,0Lt9ZW!r(O8&0mPr0&o'thNf06M#Q5ZP>TldN.NBMNZRpmN.iRT/GU34/7G_OJ=*.e%jFmQ%=YUoe8W\fi\e\\5..NVHJ1,_^BWr4_8<1#(km3cU@OYRLC$P1:bR9(*8MbS/HHf5c@/BrNq12TJ39^6j?kLG3OWUq3"uiCH?b?>STiV+."ZP(;WAD`!f*O0G6Uk)TM-d^-IobYXaE:?BfYq$:TYh4cU@g@CXa#m#JOf5HI./9jYBEh'"[L3RaH-,(kgYZ1_nh!YY>q;d]l7UX3`5k;gm4["+,S3N-leo6?74>Q9(=%ZMaLb[EVG+U%W8a9tdLZ(r)eWhjneKphe.p`qsThhsJ"t^a[[_2NoGZk@/io(A;kSn4kjT0JpQ6UgB:Q'9DP2%d'd:B2Ffl7u`Rt:i2kV'n<*2Vr91&67oMK9u?-r!>pYe,mn*lkq:8sQ1Ph92P_;%=m#cKsr.d9qbZW?c#p#m2/`YnRL'S_pt!"k&bOW`/I.:mK#[W2hMTiM'-f(!itNF/g%=+Y]#El?PERT&qan5CL/bh1]9G2p-QhWf?E>LFj(Ha>r\EUS3.$H*[%B4)`Il$XAb$RXQS%OjCiZ,5&k)6F?;^#4qUoeE/B%Mc'&al?+?&FT?_a'2O"6k\t/Dtu7"b$@e)>YdHGA;P91I%TTd'9Z5+1]uiE!tW*g/ZB_0P^Or(@rD6`BQrZWLkB`4FLf!cGe>4F#uQ(%):YmIFn2fEBfCK<`:%m%#qEg>O%LU,R;!hr*&PnUW\lH%K:1:2si?2_Hje?iro;!I`]p`R8A$ZZjeJ,6!.lEpTOVr&!'50bNYAX)TZW227dgM/=lCXSDVIBo?KDH@Dc=GW?1N@ZfJUl$b]IZ\Rej2d_9'e>Ou(rKjI>6M/7Vl2j34I4'R1"^W\dsn@KFC*L\[`l]jWJN?>q+8,mr6p,E!nendstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000573 00000 n -0000000740 00000 n -0000001017 00000 n -0000001152 00000 n -0000001434 00000 n -0000001539 00000 n -0000019421 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -19473 -%%EOF diff --git a/z3c/rml/tests/expected/tag-place.pdf b/z3c/rml/tests/expected/tag-place.pdf deleted file mode 100644 index 3dabab8d..00000000 --- a/z3c/rml/tests/expected/tag-place.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 467 >> -stream -GatU.9lGY<%)!nU++.U_QKF)^Oet^>[[qZ1RNKn@;IBU\!`T-u+HupJm9rp;i]%JGg!9e?]nlUk)8M/bfn'3tTXR0Gih52f9tO1!5YbE2&`\HNQt(u++>kJJ:WH$5oeoWI7?U0F.EjN%n$93"X6-jt&$$GV"8rQ&h?IS2FIg&TasB>O.L?tH-'7aRmsSp='0\]S8AFkhruLlDf3,]1_0(43(0%]7+L?SaAJf58"CoA1YHN6SPVt+\/LV1`1^2W67,U5^1;&$MK!7,)^n.k94+TP3,'XR'?!$R6.!APhLY\.^aa?L`bBuUD2O(=WfSX;:T&lp1&@P/-ro*;*t4saJX@),]>(+0Ch=$El'Q1iZu!*gKC&n(L6,.1/?gh~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000569 00000 n -0000000742 00000 n -0000001019 00000 n -0000001154 00000 n -0000001436 00000 n -0000001541 00000 n -0000002151 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -2203 -%%EOF diff --git a/z3c/rml/tests/expected/tag-plugInFlowable.pdf b/z3c/rml/tests/expected/tag-plugInFlowable.pdf deleted file mode 100644 index d73b4bf1..00000000 --- a/z3c/rml/tests/expected/tag-plugInFlowable.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 304 >> -stream -Garo;4\rsL&;KpMq%)q-O@XaoTWNka&7f69otoo.2[W/dE*WME*p8tk-r?I_QJ_RcNZb)/qeZSnCZH4]'_Dl7AgR'_*d*p!U^<$k$\_$[N9RF`$9C&$koEen-#V`c%=(NW7"9UtoYscWLB3,5_c&d#"l;[?NBYYI@W[.'M`_.FtZ.#kfeH1DOWp"0]s\j8~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000569 00000 n -0000000742 00000 n -0000001019 00000 n -0000001154 00000 n -0000001423 00000 n -0000001528 00000 n -0000001975 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -2027 -%%EOF diff --git a/z3c/rml/tests/expected/tag-plugInGraphic.pdf b/z3c/rml/tests/expected/tag-plugInGraphic.pdf deleted file mode 100644 index e312eb95..00000000 --- a/z3c/rml/tests/expected/tag-plugInGraphic.pdf +++ /dev/null @@ -1,107 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Times-Roman -<< /BaseFont /Times-Roman - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (anonymous) - /CreationDate (D:20121221012859+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 295 >> -stream -Gb"/"Yt>0S&F9MpLT)lVlt6!tBa#6i7_)9q'U=GLd)Os%a[nk+83M'N7/.=$g&h@P%)/Fq&I;!%(uEuTY()%5K5Bj!`"@ph^$3S$u$8j07Oendstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000553 00000 n -0000000830 00000 n -0000000964 00000 n -0000001246 00000 n -0000001351 00000 n -0000001788 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(L\331$\305\342q\311K\361H0\230\324\300o\201) (L\331$\305\342q\311K\361H0\230\324\300o\201)] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -1839 -%%EOF diff --git a/z3c/rml/tests/expected/tag-pre.pdf b/z3c/rml/tests/expected/tag-pre.pdf deleted file mode 100644 index 026cd0a7..00000000 --- a/z3c/rml/tests/expected/tag-pre.pdf +++ /dev/null @@ -1,140 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R - /F4 5 0 R - /F5 6 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F4': class PDFType1Font -5 0 obj -% Font Helvetica-Oblique -<< /BaseFont /Helvetica-Oblique - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F5': class PDFType1Font -6 0 obj -% Font Courier -<< /BaseFont /Courier - /Encoding /WinAnsiEncoding - /Name /F5 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -7 0 obj -% Page dictionary -<< /Contents 11 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 10 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R8': class PDFCatalog -8 0 obj -% Document Root -<< /Outlines 12 0 R - /PageMode /UseNone - /Pages 10 0 R - /Type /Catalog >> -endobj -% 'R9': class PDFInfo -9 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121219133528+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R10': class PDFPages -10 0 obj -% page tree -<< /Count 1 - /Kids [ 7 0 R ] - /Type /Pages >> -endobj -% 'R11': class PDFStream -11 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 327 >> -stream -Garo@9'&-\7Ec*e*K01:0K`ItlhE8@UsFERh9I$8%aldR3@cf$rmIcj69IS/=$HJmXH1_N^&mNFI>YYTMNH1mhB12>DJCL)3G7=Bpg1%FfUEiHS*.0$Y9-l!^iUEHVq=jS-!@-.[e%I>p[hj57'MPc>1B&*IuD*LkPhVrG8*2oHC?*T[6T59D;,*"=]R,ciNmL4;%%Njj:U8'+jmYA&ke(!e>[@^A3,T"H6ikJ;Ya]F/'fNsq^h<=D\6-Ol&Q#?c&L5KRLl:AmpJBpKuS:#LNIZ?_PZ4PL8^Y"P0C4;FZ`69`4JNWf2QeHh/~>endstream -endobj -% 'R12': class PDFOutlines -12 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 13 -0000000000 65535 f -0000000113 00000 n -0000000257 00000 n -0000000422 00000 n -0000000593 00000 n -0000000768 00000 n -0000000949 00000 n -0000001108 00000 n -0000001387 00000 n -0000001523 00000 n -0000001793 00000 n -0000001900 00000 n -0000002371 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\344l\301\320j\307\346\376\210=\215\256\246l\2546) (\344l\301\320j\307\346\376\210=\215\256\246l\2546)] - - /Info 9 0 R - /Root 8 0 R - /Size 13 >> -startxref -2423 -%%EOF diff --git a/z3c/rml/tests/expected/tag-pto.pdf b/z3c/rml/tests/expected/tag-pto.pdf deleted file mode 100644 index 4b273a3e..00000000 --- a/z3c/rml/tests/expected/tag-pto.pdf +++ /dev/null @@ -1,149 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 10 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 9 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page2': class PDFPage -6 0 obj -% Page dictionary -<< /Contents 11 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 9 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R7': class PDFCatalog -7 0 obj -% Document Root -<< /Outlines 12 0 R - /PageMode /UseNone - /Pages 9 0 R - /Type /Catalog >> -endobj -% 'R8': class PDFInfo -8 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R9': class PDFPages -9 0 obj -% page tree -<< /Count 2 - /Kids [ 5 0 R - 6 0 R ] - /Type /Pages >> -endobj -% 'R10': class PDFStream -10 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 459 >> -stream -Gb"/cbAMqd&4Q>Undfq9/(LnaGsn[DW7n?,73t+t2jf8U=2F.]mqYTG8t(Q1]8MVUn/W$PY/E"jZ^AG0$fEq[@`?,BU(g94J`m./d[JV"JQ(m7%rPdIMj=11l9oZF4&tp!FG['3arT#r]ai\"3j9&84.tXTV/;FM2D(X:`s*iM+nN?mDm=)O/$u]fBB^eNqU!SnWKFT%<10[S-$WI)eL8KoJPmh'lIiK"'GaRj4TE?\ao$*W-\nqJIM/'(E9m2JH~>endstream -endobj -% 'R11': class PDFStream -11 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 245 >> -stream -Gb"/_]*cD/(kq]LhVi9OLY+hX?<0?>*=@&mOXc6*;*4RJ``QH`MMl?u&-?50Ij^!_\j_)*'Yqq%\fd)fh1E#\YY31lB.)!'\Jn2[RRC\NEGmh[hPa+0l;6]lH,l3;1d+dX;'aPt%bj3X[]*_OuL-<=II"n`CAWg/kP#QoD'<."@:."dhKjLOUf)$)&I]WeQH$k&qpsIH,Q"_ZN-#%j=.SX)+'\7@=l_+src>IhE)bU~>endstream -endobj -% 'R12': class PDFOutlines -12 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 13 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000569 00000 n -0000000742 00000 n -0000001020 00000 n -0000001298 00000 n -0000001433 00000 n -0000001702 00000 n -0000001816 00000 n -0000002417 00000 n -0000002806 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 8 0 R - /Root 7 0 R - /Size 13 >> -startxref -2858 -%%EOF diff --git a/z3c/rml/tests/expected/tag-rectange.pdf b/z3c/rml/tests/expected/tag-rectange.pdf deleted file mode 100644 index 4697e7ca..00000000 --- a/z3c/rml/tests/expected/tag-rectange.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 339 >> -stream -Gar?-]1rJ`$q:%aq$5LcB)KfH>mVuAjpsp(MHpSg^VDCX',X.V77YYRobiA+&)G"@%H+P0j"g]jm-d2s$Mt2nm5]RrF2;%ZJsCqY]2'ka'c(J;RrkY!o`hT`RhM87;'Sp29.q<'3JhWE8Z2<4DVg[XucRLk>/R&-U%CfRN(hU8ooKPj0#^LIrX40[GV+0a_SE>I*;?O("B;6V^[LP'%=/ht`l85r,pt5L\mFUUa+Xb@q)u\KRkl~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001651 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1702 -%%EOF diff --git a/z3c/rml/tests/expected/tag-registerCidFont.pdf b/z3c/rml/tests/expected/tag-registerCidFont.pdf deleted file mode 100644 index c2813d80..00000000 --- a/z3c/rml/tests/expected/tag-registerCidFont.pdf +++ /dev/null @@ -1,344 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFDictionary -3 0 obj -<< /BaseFont /HeiseiMin-W3 - /DescendantFonts [ << /BaseFont /HeiseiMin-W3 - /CIDSystemInfo << /Ordering (Japan1) - /Registry (Adobe) - /Supplement 2 >> - /DW 1000 - /FontDescriptor << /Ascent 723 - /CapHeight 709 - /Descent -241 - /Flags 6 - /FontBBox [ -123 - -257 - 1001 - 910 ] - /FontName /HeiseiMin-W3 - /ItalicAngle 0 - /StemV 69 - /Type /FontDescriptor - /XHeight 450 >> - /Subtype /CIDFontType0 - /Type /Font - /W [ 1 - [ 250 - 333 - 408 - 500 ] - 5 - [ 500 - 833 - 778 - 180 - 333 ] - 10 - [ 333 - 500 - 564 - 250 - 333 - 250 - 278 - 500 ] - 18 - 26 - 500 - 27 - 28 - 278 - 29 - 31 - 564 - 32 - [ 444 - 921 - 722 - 667 ] - 36 - [ 667 - 722 - 611 - 556 - 722 ] - 41 - [ 722 - 333 - 389 - 722 - 611 - 889 - 722 ] - 48 - [ 722 - 556 - 722 - 667 - 556 - 611 - 722 ] - 55 - [ 722 - 944 - 722 ] - 58 - [ 722 - 611 - 333 - 500 - 333 - 469 - 500 - 333 - 444 - 500 - 444 - 500 - 444 - 333 - 500 ] - 73 - [ 500 - 278 ] - 75 - [ 278 - 500 - 278 - 778 - 500 ] - 80 - 82 - 500 - 83 - [ 333 - 389 - 278 - 500 ] - 87 - [ 500 - 722 - 500 ] - 90 - [ 500 - 444 - 480 - 200 - 480 - 333 ] - 97 - [ 278 ] - 99 - [ 200 ] - 101 - [ 333 - 500 ] - 103 - [ 500 - 167 ] - 107 - [ 500 ] - 109 - [ 500 - 333 ] - 111 - [ 333 - 556 ] - 113 - [ 556 - 500 ] - 117 - [ 250 ] - 119 - [ 350 - 333 - 444 ] - 123 - [ 500 ] - 126 - [ 444 - 333 ] - 128 - 137 - 333 - 138 - [ 1000 - 889 - 276 - 611 - 722 - 889 - 310 - 667 - 278 ] - 147 - [ 278 - 500 - 722 - 500 - 564 - 760 - 564 - 760 ] - 157 - 158 - 300 - 159 - [ 500 - 300 - 750 ] - 162 - 163 - 750 - 164 - 169 - 722 - 170 - [ 667 - 611 ] - 172 - 174 - 611 - 175 - 178 - 333 - 179 - 185 - 722 - 187 - 191 - 722 - 192 - [ 556 - 444 ] - 194 - 203 - 444 - 204 - 207 - 278 - 208 - 214 - 500 - 216 - 222 - 500 - 223 - [ 556 - 722 - 611 - 500 - 389 - 980 - 444 ] - 231 - [ 500 ] - 323 - [ 500 ] - 325 - [ 500 ] - 327 - 389 - 500 ] >> ] - /Encoding /UniJIS-UCS2-H - /Name /F2 - /Subtype /Type0 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121220004523+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 200 >> -stream -Gb!$=]a@(\$qBtXhr,MS[-":R]sFZ$M\$GnS*1%7,5V:k[>9J1!0Rmapi8>&Wl8hH7UTe0DAb"0$TNkHgL4UKh7_imendstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000387 00000 n -0000002359 00000 n -0000002636 00000 n -0000002770 00000 n -0000003039 00000 n -0000003144 00000 n -0000003486 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\(H\034\005*\356\310m\004\220\254\206\030\343%\225) (\(H\034\005*\356\310m\004\220\254\206\030\343%\225)] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -3537 -%%EOF diff --git a/z3c/rml/tests/expected/tag-registerTTFont.pdf b/z3c/rml/tests/expected/tag-registerTTFont.pdf deleted file mode 100644 index 063f6cc3..00000000 Binary files a/z3c/rml/tests/expected/tag-registerTTFont.pdf and /dev/null differ diff --git a/z3c/rml/tests/expected/tag-registerType1Face.pdf b/z3c/rml/tests/expected/tag-registerType1Face.pdf deleted file mode 100644 index 4812a5c1..00000000 Binary files a/z3c/rml/tests/expected/tag-registerType1Face.pdf and /dev/null differ diff --git a/z3c/rml/tests/expected/tag-rotate.pdf b/z3c/rml/tests/expected/tag-rotate.pdf deleted file mode 100644 index 5e5ad001..00000000 --- a/z3c/rml/tests/expected/tag-rotate.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 151 >> -stream -GapQh0E=F,0U\H3T\pNYT^QKk?tc>IP,;W#U1^23ihPEM_TN+I0SHG`Z8C)f;D9se;[CKFd-sTNaiRTicS*F4dF2&#a\iDl!c-/h1c)Nr1/lOU1:=>?ZrGC0J?`K;&3EaK[]faAHj2+jEWH0h"Xds~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001463 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1514 -%%EOF diff --git a/z3c/rml/tests/expected/tag-saveState-restoreState.pdf b/z3c/rml/tests/expected/tag-saveState-restoreState.pdf deleted file mode 100644 index a6bae564..00000000 --- a/z3c/rml/tests/expected/tag-saveState-restoreState.pdf +++ /dev/null @@ -1,107 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier -<< /BaseFont /Courier - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (anonymous) - /CreationDate (D:20121218173613+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 166 >> -stream -GapQh0E=F,0U\H3T\pNYT^QKk?tc>IP,;W#U1^23ihPEM_TN+JYQTk'kZK$b)a_e'2Zb0*KofOCNKDYI&r"Ol"cq0'ZIG&]j?s/E9neZ[Kb,i?VF%5,7bB:Z1=47`!l[Ffr6h=`e0:PLAFflM[@*JQ&`X?)?7l6./3>3~>endstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000545 00000 n -0000000822 00000 n -0000000956 00000 n -0000001238 00000 n -0000001343 00000 n -0000001651 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\316c\241g\023\031D\370\221\347\025\023a\366O-) (\316c\241g\023\031D\370\221\347\025\023a\366O-)] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -1702 -%%EOF diff --git a/z3c/rml/tests/expected/tag-scale.pdf b/z3c/rml/tests/expected/tag-scale.pdf deleted file mode 100644 index 3423ac8f..00000000 --- a/z3c/rml/tests/expected/tag-scale.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 129 >> -stream -GapQh0E=F,0U\H3T\pNYT^QKk?tc>IP,;W#U1^23ihPEM_TN+I0SHG`Z8C)f;D9se;[CKFd-sTNaiRTicS*F4dF2&#a\iDl!c*=deh`#KNPu/:@jAWU..D6X!37n"_#~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001441 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1492 -%%EOF diff --git a/z3c/rml/tests/expected/tag-setFont.pdf b/z3c/rml/tests/expected/tag-setFont.pdf deleted file mode 100644 index 8128ddb5..00000000 --- a/z3c/rml/tests/expected/tag-setFont.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121220092920+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 124 >> -stream -GapQh0E=F,0U\H3T\pNYT^QKk?tc>IP,;W#U1^23ihPEM_TN+JYQTk'kZK$b)a_e'2Zb0*KofOCNKDYI&r"Ol"cq0'ZIG&]j?s/E9neZ[Kb,i?-3[^.!"\K9_>~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001436 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\365G\001\260\342\204\015\353\335\265\372\325\214\360\256N) (\365G\001\260\342\204\015\353\335\265\372\325\214\360\256N)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1487 -%%EOF diff --git a/z3c/rml/tests/expected/tag-setFontSize.pdf b/z3c/rml/tests/expected/tag-setFontSize.pdf deleted file mode 100644 index 8fba3e58..00000000 --- a/z3c/rml/tests/expected/tag-setFontSize.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121220092920+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 142 >> -stream -GapQh0E=F,0U\H3T\pNYT^QKk?tc>IP,;W#U1^23ihPEM_TN+JYQTk'kZK$b)a_e'2Zb0*KofOCNKDYI&r"Ol"cq0'ZIG&]j?s/E9neZ[Kb,hH_m%jHA=BL.)%P+(NKB,ui8k"?5ZB=j~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001454 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\365G\001\260\342\204\015\353\335\265\372\325\214\360\256N) (\365G\001\260\342\204\015\353\335\265\372\325\214\360\256N)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1505 -%%EOF diff --git a/z3c/rml/tests/expected/tag-setNextFrame.pdf b/z3c/rml/tests/expected/tag-setNextFrame.pdf deleted file mode 100644 index edaefd35..00000000 --- a/z3c/rml/tests/expected/tag-setNextFrame.pdf +++ /dev/null @@ -1,107 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 266 >> -stream -Gatms_+I'L&4Q>Er52f@_.dMER3Z"QY1s`_"/<1G4Mgdl$^2]e6:!(I6T0"LHO_:m_t/=]JB*E3Nkp>@!D\m+T(1=CqgoN>acaJ4TZ@J"KsXC*)Hi?J=:]ZHmb9i&rV#k1ZVh(>p6$:!1U%q6l]$:Dk]KN'&9&Ke,,8IRU7> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000559 00000 n -0000000836 00000 n -0000000970 00000 n -0000001239 00000 n -0000001344 00000 n -0000001752 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -1803 -%%EOF diff --git a/z3c/rml/tests/expected/tag-setNextTemplate.pdf b/z3c/rml/tests/expected/tag-setNextTemplate.pdf deleted file mode 100644 index afa900a8..00000000 --- a/z3c/rml/tests/expected/tag-setNextTemplate.pdf +++ /dev/null @@ -1,169 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Contents 10 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 9 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page2': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 11 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 9 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'Page3': class PDFPage -6 0 obj -% Page dictionary -<< /Contents 12 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 9 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R7': class PDFCatalog -7 0 obj -% Document Root -<< /Outlines 13 0 R - /PageMode /UseNone - /Pages 9 0 R - /Type /Catalog >> -endobj -% 'R8': class PDFInfo -8 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R9': class PDFPages -9 0 obj -% page tree -<< /Count 3 - /Kids [ 4 0 R - 5 0 R - 6 0 R ] - /Type /Pages >> -endobj -% 'R10': class PDFStream -10 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 211 >> -stream -Garo:5mkIo$q9oEhVg+fE13T_b]GAfPoCk_&?V[/d+X2oGQ$`k(3c!Z*o^t)WO()tN)8"R[=O15%\k'<>nXITIjdKV0hp_VS1m\I5?XbTo5/lV$FbL?5Xqo`TdS&!kS!!MdV>/74mFOBSd-q,&G301>_^!m=+`d:\/VLN$Ti&HgZ/tbjOkKJHTNV~>endstream -endobj -% 'R11': class PDFStream -11 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 211 >> -stream -Garo:5mkIo$q9oEhVg+fE13T_b]GAfPoCk_&?V[/d+X2oGQ$`k(3c!Z*o^t)WO()tN)8"R[=O15%\k'<>nXITIjdKV0hp_VS1m\I5?XbTo5/lV$FbL?5Xqo`TdS&!kS!!MdV>/74mFOBSd-q,&G301>_^!m=+_i:\/VLN$Ti&HgZ/tbjOkKJ`&fC~>endstream -endobj -% 'R12': class PDFStream -12 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 199 >> -stream -Gar?*_$\%E$q0Q> -endobj -xref -0 14 -0000000000 65535 f -0000000113 00000 n -0000000221 00000 n -0000000386 00000 n -0000000559 00000 n -0000000837 00000 n -0000001115 00000 n -0000001393 00000 n -0000001528 00000 n -0000001797 00000 n -0000001919 00000 n -0000002272 00000 n -0000002625 00000 n -0000002968 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 8 0 R - /Root 7 0 R - /Size 14 >> -startxref -3020 -%%EOF diff --git a/z3c/rml/tests/expected/tag-skew.pdf b/z3c/rml/tests/expected/tag-skew.pdf deleted file mode 100644 index 3c0d5dd0..00000000 --- a/z3c/rml/tests/expected/tag-skew.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 145 >> -stream -GapQh0E=F,0U\H3T\pNYT^QKk?tc>IP,;W#U1^23ihPEM_TN+I0SHG`Z8C)f;D9se;[CKFd-sTNaiRTicS*F4dF2&#a\iDl!c'JhcndF5[kt?hcnhm[2mKT?gOa1-K`r=R1J34b$NSBC,`V~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001457 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1508 -%%EOF diff --git a/z3c/rml/tests/expected/tag-spacer.pdf b/z3c/rml/tests/expected/tag-spacer.pdf deleted file mode 100644 index b351c5cb..00000000 --- a/z3c/rml/tests/expected/tag-spacer.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 421 >> -stream -Gat=e;/:e<'SYEPr=A)=%;&>A[Y6Hgf_VtA6!j7%1hoK;cD20SrK:.7X_TAM";C5e\bYY"6"C5jhlI#g(hROb6GX"j,YZ#1n]%Gin*,K6g',G>=^&@sg(WOD`6)kW3">,0g0^.u;HI;8VBAN51\.:k&Nnp$I3HrhcU>8"5JaP0FZcT)`_3t%>5:.ia2=P/%d_*Z'>-:Cn](H$5cFkYSOU=l:DpB/C=m5MJO4P6T]I1I45O#s89!h=FM>6FIj.J1HK>a[@*]+![)]KmXp8lL_)qV=+Kl:]A!]VAP==q7gWA5U[q`Xg@+BXmhSf#ed18cOLa*4H,r?NOlit,e9dQ8a"LIo/A_UBFL)[,Y.Gig72t$((>1W(1\?*d!$Zi0g9IE'dcGEr~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000569 00000 n -0000000742 00000 n -0000001019 00000 n -0000001154 00000 n -0000001423 00000 n -0000001528 00000 n -0000002092 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -2144 -%%EOF diff --git a/z3c/rml/tests/expected/tag-spiderChart.pdf b/z3c/rml/tests/expected/tag-spiderChart.pdf deleted file mode 100644 index 6e6d9576..00000000 --- a/z3c/rml/tests/expected/tag-spiderChart.pdf +++ /dev/null @@ -1,118 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Times-Roman -<< /BaseFont /Times-Roman - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 1677 >> -stream -Gb"/'>Amb(&:Ru#s+;De;N5>Un`@/TO:XO=DRg&C&<`87g=):',p[q&A"Ve&I-f+TA5AX_6>;m!4J)B2im4q8U%f#Ds6#pacSjd@Y<`/Gc"d>L)R9*54Q!5AB`SCiZk+Ju$SWD`7-TXB0(I!KkCq]NValu#!'Rqo9SP4njb?KHUNHUo"YOMnp5`mTd]V&#_ebL%Jh^Xap#[f5d@A>G8/Y$Bkq[GSCh,Q@E($prhLd@q%I75Q,tE(D;]kq+q`K9,?7d9E;9RQuEIBok_hF:?G&n4'-!/[h0JPiOu?,O0T=ACb`eXVFCT=l-P$`4mJJ+LIEVOG^?`pf:Y%=0J6t="daY.H(_"E)PF%U3@uEEKgJB.fl0"@)tsB/Z2N?Vg?RAUc.-603P,gPZ]R].#!7sC,DA'BItf&+Poc>>#,A88d\TZcT1)co<*!cZHjlUAqA2^Dg@9Jr(W?<#S-E*!?JZ1!Dh.uF-a3M8Gdl5YXCU-'7tlMeU]V8J)l.Z2mgBDPUc0H?&*MLd/K5Pg\:.d;Y'l;W(G?#CEZe-'3^LC(JaJ;nXg<\>k&/XFoC0Ve7#?(ejk3EP$/2cQ><#+Dqc>)0c9IJ0c,Z[9In8uc$8F_/J$FM:Wd;Pc9+2mM:2aQ,QTfNM@mlG:#+4)^4HB#C;SoQo9@E&s=ZfLXPIOu91.^IL1+H!t2$bC@1,;[2S@!BL8'cU[?!2oEEhh&r#&7dI3#a$#>.uoU)fPIH':7=sDMtY3p(V%88K=I]F:Ur[\n85nU?B,YR0f].2Q!_LQo8P";\.kAs7W<`j3a)41U'Hq25]XUO3&6&URg;=>q'm#-@G2`rXe+Sdt3XE:MS?)S0\T]K(LO+.+D4+9%>!C`_jfoA[F=(18PqN]'qZ\)qClAe\l]+`]3?>T/=-IcnSN*N:gYH2E&"1&ClXMAWSSSSh&0,mh]`cR"F%%gc,W9?M@.[Kdki&e<@oZ=B;bfW@#Ue)>f6cH2k[CB<"('EP7)=X!c2%k"=,Bo(mp\jW7fE]'EPVgpT&ID$b,p@+MZ)3E;BK,[@ridKHHu]j`/h5O'g-Nb:MDO1/CLnoCR]OdB]DWlO$hc]!1.JpY!nk*%niir4.a;dk=[/J,e)QT;qtZHt+.!E&Qb@s8LE)ZodtdAqh`pphN>`uendstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 11 -0000000000 65535 f -0000000113 00000 n -0000000233 00000 n -0000000398 00000 n -0000000573 00000 n -0000000740 00000 n -0000001017 00000 n -0000001152 00000 n -0000001434 00000 n -0000001539 00000 n -0000003360 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 7 0 R - /Root 6 0 R - /Size 11 >> -startxref -3412 -%%EOF diff --git a/z3c/rml/tests/expected/tag-storyPlace.pdf b/z3c/rml/tests/expected/tag-storyPlace.pdf deleted file mode 100644 index 09d27a43..00000000 --- a/z3c/rml/tests/expected/tag-storyPlace.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121219004400+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 355 >> -stream -Gatn`]5GM/'F*LOP2G4?gCBIc`Se.%4*?Cs$R?3R>h(1/WS5BGTh1KBp(14H0%'bac6;],.$%(-4?5O<&4jTR6&I,$=$4+#kTML@W_sS-if(7ld*a[dK`RrHn=^`o_=ZHlnF@(^:tsfZ#iAP=\5Hqu@DsYM&~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001052 00000 n -0000001157 00000 n -0000001654 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(&13\274\234\221\2677ZWGo?c\206\231) (&13\274\234\221\2677ZWGo?c\206\231)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1705 -%%EOF diff --git a/z3c/rml/tests/expected/tag-stroke.pdf b/z3c/rml/tests/expected/tag-stroke.pdf deleted file mode 100644 index 036380be..00000000 --- a/z3c/rml/tests/expected/tag-stroke.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 179 >> -stream -GaqKg3sl'E$q,GpmP$"b,"o4cgP$nIWl-hu8@Q-Z)1R6@"CfAs,>3!X-,&aPYSCF2!f80s,*>A.DW"[0^'g$H1KL[-O8LFD"OEe#;HrhtG;(mT+DkV+"usc0+5_.m3hP0B9(#4l9N'2[*%Q!A,cSPQ~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001491 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1542 -%%EOF diff --git a/z3c/rml/tests/expected/tag-textAnnotation.pdf b/z3c/rml/tests/expected/tag-textAnnotation.pdf deleted file mode 100644 index 5279a9bf..00000000 --- a/z3c/rml/tests/expected/tag-textAnnotation.pdf +++ /dev/null @@ -1,114 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Annot.NUMBER1': class TextAnnotation -3 0 obj -<< /Contents (\376\377\000X\000:\000:\000P\000D\000F\000 -\000P\000X\000(\000S\000)\000 -\000M\000T\000(\000P\000I\000N\000K\000)) - /F 3 - /Rect [ 0 - , - 0 - , - 1 - , - 1 ] - /Subtype /Text - /Type /Annot >> -endobj -% 'Page1': class PDFPage -4 0 obj -% Page dictionary -<< /Annots [ 3 0 R ] - /Contents 8 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 7 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R5': class PDFCatalog -5 0 obj -% Document Root -<< /Outlines 9 0 R - /PageMode /UseNone - /Pages 7 0 R - /Type /Catalog >> -endobj -% 'R6': class PDFInfo -6 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R7': class PDFPages -7 0 obj -% page tree -<< /Count 1 - /Kids [ 4 0 R ] - /Type /Pages >> -endobj -% 'R8': class PDFStream -8 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 61 >> -stream -GapQh0E=F,0U\H3T\pNYT^QKk?tc>IP,;W#U1^23ihPEM_TSdkb67m]#7+K~>endstream -endobj -% 'R9': class PDFOutlines -9 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 10 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000387 00000 n -0000000641 00000 n -0000000938 00000 n -0000001072 00000 n -0000001354 00000 n -0000001459 00000 n -0000001661 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 6 0 R - /Root 5 0 R - /Size 10 >> -startxref -1712 -%%EOF diff --git a/z3c/rml/tests/expected/tag-textField.pdf b/z3c/rml/tests/expected/tag-textField.pdf deleted file mode 100644 index e3fb9ab3..00000000 --- a/z3c/rml/tests/expected/tag-textField.pdf +++ /dev/null @@ -1,268 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Annot.NUMBER1': class PDFPattern -3 0 obj -<< /DA (/Helv 12 Tf 0 0 0 rg) /DV () - /F 4 /FT /Tx/MK << /BC [ 0 0 0 ] >> /MaxLen 1000000 - /P 5 0 R - /Rect [99.2125984252 649.133858268 240.94488189 663.133858268 ]/Subtype /Widget /T (input1) - /Type /Annot /V () - /Ff 0 ->> -endobj -% 'Annot.NUMBER2': class PDFPattern -4 0 obj -<< /DA (/Helv 12 Tf 0 0 0 rg) /DV (Default Value) - /F 4 /FT /Tx/MK << /BC [ 0 0 0 ] >> /MaxLen 30 - /P 5 0 R - /Rect [99.2125984252 521.57480315 240.94488189 606.614173228 ]/Subtype /Widget /T (input2) - /Type /Annot /V (Default Value) - /Ff 4096 ->> -endobj -% 'Page1': class PDFPage -5 0 obj -% Page dictionary -<< /Annots [ 3 0 R - 4 0 R ] - /Contents 9 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 8 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R6': class PDFCatalog -6 0 obj -% Document Root -<< /AcroForm 11 0 R - /Outlines 10 0 R - /PageMode /UseNone - /Pages 8 0 R - /Type /Catalog >> -endobj -% 'R7': class PDFInfo -7 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R8': class PDFPages -8 0 obj -% page tree -<< /Count 1 - /Kids [ 5 0 R ] - /Type /Pages >> -endobj -% 'R9': class PDFStream -9 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 177 >> -stream -GasJHYmS?5&4HC\raA?o(2%f3H^D&Q%1&9s"/6T/4LI/bcSkt7[?6#SB&4c^6YPh7!g\^h7j*Q[+DWNMMm\ki0[T^?Q;#Q;Km-uEYmiNu;W[\th'lY?'m+Z<.]1r7HA9^o"lbIK*!f<\"P:dEfNdm+$sNR],`#k^mK;H%#\EN-bLeI>~>endstream -endobj -% 'R10': class PDFOutlines -10 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -% 'R11': class AcroForm -11 0 obj -<< - /NeedAppearances true - /DA (/Helv 0 Tf 0 g ) - /DR -12 0 R /Fields -[ 3 0 R - 4 0 R ]>> -endobj -% 'R12': class PDFPattern -12 0 obj -<< /Encoding 13 0 R - /Font 14 0 R ->> -endobj -% 'R13': class PDFPattern -13 0 obj -<< /PDFDocEncoding 15 0 R ->> -endobj -% 'R14': class PDFDictionary -14 0 obj -<< /CoBO 16 0 R - /CoBo 17 0 R - /CoOb 18 0 R - /Cour 19 0 R - /HeBO 20 0 R - /HeBo 21 0 R - /HeOb 22 0 R - /Helv 23 0 R - /TiBI 24 0 R - /TiBo 25 0 R - /TiIt 26 0 R - /Time 27 0 R - /ZaDb 28 0 R >> -endobj -% 'R15': class PDFPattern -15 0 obj -<< /Differences [ 24 /breve /caron /circumflex /dotaccent /hungarumlaut /ogonek /ring /tilde 39 /quotesingle 96 /grave 128 /bullet /dagger /daggerdbl /ellipsis /emdash /endash /florin /fraction /guilsinglleft /guilsinglright /minus /perthousand /quotedblbase /quotedblleft /quotedblright /quoteleft /quoteright /quotesinglbase /trademark /fi /fl /Lslash /OE /Scaron /Ydieresis /Zcaron /dotlessi /lslash /oe /scaron /zcaron 160 /Euro 164 /currency 166 /brokenbar 168 /dieresis /copyright /ordfeminine 172 /logicalnot /.notdef /registered /macron /degree /plusminus /twosuperior /threesuperior /acute /mu 183 /periodcentered /cedilla /onesuperior /ordmasculine 188 /onequarter /onehalf /threequarters 192 /Agrave /Aacute /Acircumflex /Atilde /Adieresis /Aring /AE /Ccedilla /Egrave /Eacute /Ecircumflex /Edieresis /Igrave /Iacute /Icircumflex /Idieresis /Eth /Ntilde /Ograve /Oacute /Ocircumflex /Otilde /Odieresis /multiply /Oslash /Ugrave /Uacute /Ucircumflex /Udieresis /Yacute /Thorn /germandbls /agrave /aacute /acircumflex /atilde /adieresis /aring /ae /ccedilla /egrave /eacute /ecircumflex /edieresis /igrave /iacute /icircumflex /idieresis /eth /ntilde /ograve /oacute /ocircumflex /otilde /odieresis /divide /oslash /ugrave /uacute /ucircumflex /udieresis /yacute /thorn /ydieresis ] /Type /Encoding>> -endobj -% 'R16': class PDFPattern -16 0 obj -<< /BaseFont /Courier-BoldOblique - /Encoding 15 0 R - /Name /CoBO - /Subtype /Type1 /Type /Font >> -endobj -% 'R17': class PDFPattern -17 0 obj -<< /BaseFont /Courier-Bold - /Encoding 15 0 R - /Name /CoBo - /Subtype /Type1 /Type /Font >> -endobj -% 'R18': class PDFPattern -18 0 obj -<< /BaseFont /Courier-Oblique - /Encoding 15 0 R - /Name /CoOb - /Subtype /Type1 /Type /Font >> -endobj -% 'R19': class PDFPattern -19 0 obj -<< /BaseFont /Courier - /Encoding 15 0 R - /Name /Cour - /Subtype /Type1 /Type /Font >> -endobj -% 'R20': class PDFPattern -20 0 obj -<< /BaseFont /Helvetica-BoldOblique - /Encoding 15 0 R - /Name /HeBO - /Subtype /Type1 /Type /Font >> -endobj -% 'R21': class PDFPattern -21 0 obj -<< /BaseFont /Helvetica-Bold - /Encoding 15 0 R - /Name /HeBo - /Subtype /Type1 /Type /Font >> -endobj -% 'R22': class PDFPattern -22 0 obj -<< /BaseFont /Helvetica-Oblique - /Encoding 15 0 R - /Name /HeOb - /Subtype /Type1 /Type /Font >> -endobj -% 'R23': class PDFPattern -23 0 obj -<< /BaseFont /Helvetica - /Encoding 15 0 R - /Name /Helv - /Subtype /Type1 /Type /Font >> -endobj -% 'R24': class PDFPattern -24 0 obj -<< /BaseFont /Times-BoldItalic - /Encoding 15 0 R - /Name /TiBI - /Subtype /Type1 /Type /Font >> -endobj -% 'R25': class PDFPattern -25 0 obj -<< /BaseFont /Times-Bold - /Encoding 15 0 R - /Name /TiBo - /Subtype /Type1 /Type /Font >> -endobj -% 'R26': class PDFPattern -26 0 obj -<< /BaseFont /Times-Italic - /Encoding 15 0 R - /Name /TiIt - /Subtype /Type1 /Type /Font >> -endobj -% 'R27': class PDFPattern -27 0 obj -<< /BaseFont /Times-Roman - /Encoding 15 0 R - /Name /Time - /Subtype /Type1 /Type /Font >> -endobj -% 'R28': class PDFPattern -28 0 obj - << /BaseFont /ZapfDingbats /Name /ZaDb /Subtype /Type1 /Type /Font>> -endobj -xref -0 29 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000383 00000 n -0000000675 00000 n -0000000979 00000 n -0000001284 00000 n -0000001438 00000 n -0000001720 00000 n -0000001825 00000 n -0000002145 00000 n -0000002223 00000 n -0000002367 00000 n -0000002453 00000 n -0000002533 00000 n -0000002779 00000 n -0000004142 00000 n -0000004292 00000 n -0000004435 00000 n -0000004581 00000 n -0000004719 00000 n -0000004871 00000 n -0000005016 00000 n -0000005164 00000 n -0000005304 00000 n -0000005451 00000 n -0000005592 00000 n -0000005735 00000 n -0000005877 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 7 0 R - /Root 6 0 R - /Size 29 >> -startxref -5978 -%%EOF diff --git a/z3c/rml/tests/expected/tag-transform.pdf b/z3c/rml/tests/expected/tag-transform.pdf deleted file mode 100644 index fa5b1c10..00000000 --- a/z3c/rml/tests/expected/tag-transform.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 145 >> -stream -GapQh0E=F,0U\H3T\pNYT^QKk?tc>IP,;W#U1^23ihPEM_TN+I0SHG`Z8C)f;D9se;[CKFd-sTNaiRTicS*F4dF2&#a\iDl!c'Jhcne_L2#sX5e,pV&!$Y*fG+]ab@0+CC$rZ$F!W[>o,O>~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001457 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1508 -%%EOF diff --git a/z3c/rml/tests/expected/tag-translate.pdf b/z3c/rml/tests/expected/tag-translate.pdf deleted file mode 100644 index d9b5d483..00000000 --- a/z3c/rml/tests/expected/tag-translate.pdf +++ /dev/null @@ -1,96 +0,0 @@ -%PDF-1.3 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -3 0 obj -% Page dictionary -<< /Contents 7 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 6 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R4': class PDFCatalog -4 0 obj -% Document Root -<< /Outlines 8 0 R - /PageMode /UseNone - /Pages 6 0 R - /Type /Catalog >> -endobj -% 'R5': class PDFInfo -5 0 obj -<< /Author (anonymous) - /CreationDate (D:20121217140300+05'00') - /Creator (ReportLab PDF Library - www.reportlab.com) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (unspecified) - /Title (untitled) >> -endobj -% 'R6': class PDFPages -6 0 obj -% page tree -<< /Count 1 - /Kids [ 3 0 R ] - /Type /Pages >> -endobj -% 'R7': class PDFStream -7 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 129 >> -stream -GapQh0E=F,0U\H3T\pNYT^QKk?tc>IP,;W#U1^23ihPEM_TN+I0SHG`Z8C)f;D9se;[CKFd-sTNaiRTicS*F4dF2&#a\iDl!c*=c2E([VNPu#6@jAW5..D6X!/oGQQN~>endstream -endobj -% 'R8': class PDFOutlines -8 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 9 -0000000000 65535 f -0000000113 00000 n -0000000209 00000 n -0000000372 00000 n -0000000649 00000 n -0000000783 00000 n -0000001065 00000 n -0000001170 00000 n -0000001441 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\232w\017\3421\263\325\354R\366\267\025H\343&\012) (\232w\017\3421\263\325\354R\366\267\025H\343&\012)] - - /Info 5 0 R - /Root 4 0 R - /Size 9 >> -startxref -1492 -%%EOF diff --git a/z3c/rml/tests/expected/tag-ul-ol-li.pdf b/z3c/rml/tests/expected/tag-ul-ol-li.pdf deleted file mode 100644 index e2d20dd0..00000000 --- a/z3c/rml/tests/expected/tag-ul-ol-li.pdf +++ /dev/null @@ -1,61 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -1 0 obj -<< /F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 5 0 R >> -endobj -2 0 obj -<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font >> -endobj -3 0 obj -<< /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font >> -endobj -4 0 obj -<< /BaseFont /ZapfDingbats /Encoding /ZapfDingbatsEncoding /Name /F3 /Subtype /Type1 /Type /Font >> -endobj -5 0 obj -<< /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F4 /Subtype /Type1 /Type /Font >> -endobj -6 0 obj -<< /Contents 10 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 9 0 R /Resources << /Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] >> /Rotate 0 /Trans << >> - /Type /Page >> -endobj -7 0 obj -<< /Outlines 11 0 R /PageMode /UseNone /Pages 9 0 R /Type /Catalog >> -endobj -8 0 obj -<< /Author (\(anonymous\)) /CreationDate (D:20140910121728+05'00') /Creator (\(unspecified\)) /Keywords () /Producer (ReportLab PDF Library - www.reportlab.com) /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -9 0 obj -<< /Count 1 /Kids [ 6 0 R ] /Type /Pages >> -endobj -10 0 obj -<< /Filter [ /ASCII85Decode /FlateDecode ] /Length 550 >> -stream -Gaua=9hWAh&;KY)r.d;0*o_WB2T\rq&1UR\nC!6';3@`ld,NqAh,^"]2pEU6V3#"qG2?loSRjgclGq.nOTSj&\@ge9"m?c\(aA/m>\i6on3)5V'hKfNTn57eTo;fKRD.:A)+KR_MM(k7^7$!2WB@S.;Bsb'VWl"U2QC-l_7WrA[^r=n.Ag!-OmMHpF/Mko`84f6*?+_Nbjcd%@P6>jR7L?c[%YU]ImbT\0QYfQKcoU4cnh>Ep2hjbgdIBfp;E./%&6aD_#]a=\cY$'op"!)>P=j'H9G_I[,snXF%BQC#:^)ppB="XN.h~>endstream -endobj -11 0 obj -<< /Count 0 /Type /Outlines >> -endobj -xref -0 12 -0000000000 65535 f -0000000075 00000 n -0000000139 00000 n -0000000249 00000 n -0000000361 00000 n -0000000479 00000 n -0000000594 00000 n -0000000802 00000 n -0000000890 00000 n -0000001126 00000 n -0000001188 00000 n -0000001834 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\300\352\353\016\212|\016\270\020\257\\@\240\037\354\() (\300\352\353\016\212|\016\270\020\257\\@\240\037\354\()] - /Info 8 0 R /Root 7 0 R /Size 12 >> -startxref -1884 -%%EOF diff --git a/z3c/rml/tests/expected/tag-xpre.pdf b/z3c/rml/tests/expected/tag-xpre.pdf deleted file mode 100644 index dc4aca5a..00000000 --- a/z3c/rml/tests/expected/tag-xpre.pdf +++ /dev/null @@ -1,140 +0,0 @@ -%PDF-1.4 -%“Œ‹ž ReportLab Generated PDF document http://www.reportlab.com -% 'BasicFonts': class PDFDictionary -1 0 obj -% The standard fonts dictionary -<< /F1 2 0 R - /F2 3 0 R - /F3 4 0 R - /F4 5 0 R - /F5 6 0 R >> -endobj -% 'F1': class PDFType1Font -2 0 obj -% Font Helvetica -<< /BaseFont /Helvetica - /Encoding /WinAnsiEncoding - /Name /F1 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F2': class PDFType1Font -3 0 obj -% Font Courier-Bold -<< /BaseFont /Courier-Bold - /Encoding /WinAnsiEncoding - /Name /F2 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F3': class PDFType1Font -4 0 obj -% Font Helvetica-Bold -<< /BaseFont /Helvetica-Bold - /Encoding /WinAnsiEncoding - /Name /F3 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F4': class PDFType1Font -5 0 obj -% Font Helvetica-Oblique -<< /BaseFont /Helvetica-Oblique - /Encoding /WinAnsiEncoding - /Name /F4 - /Subtype /Type1 - /Type /Font >> -endobj -% 'F5': class PDFType1Font -6 0 obj -% Font Courier -<< /BaseFont /Courier - /Encoding /WinAnsiEncoding - /Name /F5 - /Subtype /Type1 - /Type /Font >> -endobj -% 'Page1': class PDFPage -7 0 obj -% Page dictionary -<< /Contents 11 0 R - /MediaBox [ 0 - 0 - 595.2756 - 841.8898 ] - /Parent 10 0 R - /Resources << /Font 1 0 R - /ProcSet [ /PDF - /Text - /ImageB - /ImageC - /ImageI ] >> - /Rotate 0 - /Trans << >> - /Type /Page >> -endobj -% 'R8': class PDFCatalog -8 0 obj -% Document Root -<< /Outlines 12 0 R - /PageMode /UseNone - /Pages 10 0 R - /Type /Catalog >> -endobj -% 'R9': class PDFInfo -9 0 obj -<< /Author (\(anonymous\)) - /CreationDate (D:20121217140300+05'00') - /Creator (\(unspecified\)) - /Keywords () - /Producer (ReportLab PDF Library - www.reportlab.com) - /Subject (\(unspecified\)) - /Title (\(anonymous\)) >> -endobj -% 'R10': class PDFPages -10 0 obj -% page tree -<< /Count 1 - /Kids [ 7 0 R ] - /Type /Pages >> -endobj -% 'R11': class PDFStream -11 0 obj -% page stream -<< /Filter [ /ASCII85Decode - /FlateDecode ] - /Length 395 >> -stream -GarnRbAMqd&A07L+6H+V+P7hHQ)[I@,>t=DgA90seMrX+$8nX$kLVV88/#I=4Eb>gZNELp2DOre'"DQk0*hge>D"1u!qqR#2Y);d*jOK<`@ORqh.0Lh3AaV*;O,M$pkGeE[K<;:_g"I5;Va,e>A!ACYJNU9%%["UP.9f!8W+FWt]94)s\q':DhC1ipZK:8?3L\\NQjjK'k7o![A%B5"_r?-0N@bpC[]YOet0^S4!>M4D.MHD]s"TNPgRfju1EC3kYC(<\WGGYqGP`Yk"CWo&^L/$rdC>(Z)%A%-1D,@A'!alV-_533gid:!QX^HF-7R(op-bgoR,r=Pc*&-P%!?&o+@c68An7P:!?A2o()56"IsH%5$[VHs~>endstream -endobj -% 'R12': class PDFOutlines -12 0 obj -<< /Count 0 - /Type /Outlines >> -endobj -xref -0 13 -0000000000 65535 f -0000000113 00000 n -0000000257 00000 n -0000000422 00000 n -0000000593 00000 n -0000000768 00000 n -0000000949 00000 n -0000001108 00000 n -0000001387 00000 n -0000001523 00000 n -0000001793 00000 n -0000001900 00000 n -0000002439 00000 n -trailer -<< /ID - % ReportLab generated PDF document -- digest (http://www.reportlab.com) - [(\2514PW\375b\346M\037u\307 \354\014_\254) (\2514PW\375b\346M\037u\307 \354\014_\254)] - - /Info 9 0 R - /Root 8 0 R - /Size 13 >> -startxref -2491 -%%EOF diff --git a/z3c/rml/tests/flowable.py b/z3c/rml/tests/flowable.py deleted file mode 100644 index 8dc838ce..00000000 --- a/z3c/rml/tests/flowable.py +++ /dev/null @@ -1,31 +0,0 @@ -############################################################################## -# -# Copyright (c) 2007 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Style Related Element Processing -""" -import reportlab.platypus.flowables - - -class TestFlowable(reportlab.platypus.flowables.Flowable): - - def __init__(self, text): - self.text = text - - def wrap(self, *args): - return (400, 100) - - def draw(self): - self.canv.saveState() - self.canv.rect(0, 0, 400, 100) - self.canv.drawString(0, 50, self.text) - self.canv.restoreState() diff --git a/z3c/rml/tests/input/400x200.gif b/z3c/rml/tests/input/400x200.gif deleted file mode 100644 index d62f7820..00000000 Binary files a/z3c/rml/tests/input/400x200.gif and /dev/null differ diff --git a/z3c/rml/tests/input/VeraMono.ttf b/z3c/rml/tests/input/VeraMono.ttf deleted file mode 100644 index 42ea620b..00000000 Binary files a/z3c/rml/tests/input/VeraMono.ttf and /dev/null differ diff --git a/z3c/rml/tests/input/data/fw2.pdf b/z3c/rml/tests/input/data/fw2.pdf deleted file mode 100644 index 8093ddbe..00000000 Binary files a/z3c/rml/tests/input/data/fw2.pdf and /dev/null differ diff --git a/z3c/rml/tests/input/data/include-bookmarks1.pdf b/z3c/rml/tests/input/data/include-bookmarks1.pdf deleted file mode 100644 index b6dbbeb4..00000000 Binary files a/z3c/rml/tests/input/data/include-bookmarks1.pdf and /dev/null differ diff --git a/z3c/rml/tests/input/data/include-bookmarks2.pdf b/z3c/rml/tests/input/data/include-bookmarks2.pdf deleted file mode 100644 index 672f30bb..00000000 Binary files a/z3c/rml/tests/input/data/include-bookmarks2.pdf and /dev/null differ diff --git a/z3c/rml/tests/input/data/include1.pdf b/z3c/rml/tests/input/data/include1.pdf deleted file mode 100644 index 0e386971..00000000 Binary files a/z3c/rml/tests/input/data/include1.pdf and /dev/null differ diff --git a/z3c/rml/tests/input/data/include2.pdf b/z3c/rml/tests/input/data/include2.pdf deleted file mode 100644 index 4e800156..00000000 Binary files a/z3c/rml/tests/input/data/include2.pdf and /dev/null differ diff --git a/z3c/rml/tests/input/encoding-test-latin1.rml b/z3c/rml/tests/input/encoding-test-latin1.rml deleted file mode 100644 index 5abb3708..00000000 --- a/z3c/rml/tests/input/encoding-test-latin1.rml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - Test of Encoding: Latin 1 - - This following paragraph contains multiple European symbols. - - - - Das ist ein „Deutscher Text”: Er hat eine Länge von über einer - Zeile. Das ist aber nötig um alle Funktionen zu zeigen. Ach übrigens, - unsere Straße ist nicht für €200.000,00 erhältlich. - - - diff --git a/z3c/rml/tests/input/encoding-test-utf8.rml b/z3c/rml/tests/input/encoding-test-utf8.rml deleted file mode 100644 index 0b7f4e9e..00000000 --- a/z3c/rml/tests/input/encoding-test-utf8.rml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - Test of Encoding: UTF-8 - - This following paragraph contains multiple European symbols. - - - - Das ist ein „Deutscher Text”: Er hat eine Länge von über einer - Zeile. Das ist aber nötig um alle Funktionen zu zeigen. Ach übrigens, - unsere Straße ist nicht für €200.000,00 erhältlich. - - - diff --git a/z3c/rml/tests/input/images/cylinder.eps b/z3c/rml/tests/input/images/cylinder.eps deleted file mode 100644 index 3aa5a128..00000000 --- a/z3c/rml/tests/input/images/cylinder.eps +++ /dev/null @@ -1,187 +0,0 @@ -%!PS-Adobe-3.0 EPSF-3.0 -%%BoundingBox: 0 0 223 178 -%%Pages: 0 -%%Creator: Sun Microsystems, Inc. -%%Title: none -%%CreationDate: none -%%LanguageLevel: 2 -%%EndComments -%%BeginProlog -%%BeginResource: procset SDRes-Prolog 1.0 0 -/b4_inc_state save def -/dict_count countdictstack def -/op_count count 1 sub def -userdict begin -0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin 10 setmiterlimit[] 0 setdash newpath -/languagelevel where {pop languagelevel 1 ne {false setstrokeadjust false setoverprint} if} if -/bdef {bind def} bind def -/c {setgray} bdef -/l {neg lineto} bdef -/rl {neg rlineto} bdef -/lc {setlinecap} bdef -/lj {setlinejoin} bdef -/lw {setlinewidth} bdef -/ml {setmiterlimit} bdef -/ld {setdash} bdef -/m {neg moveto} bdef -/ct {6 2 roll neg 6 2 roll neg 6 2 roll neg curveto} bdef -/r {rotate} bdef -/t {neg translate} bdef -/s {scale} bdef -/sw {show} bdef -/gs {gsave} bdef -/gr {grestore} bdef -/f {findfont dup length dict begin -{1 index /FID ne {def} {pop pop} ifelse} forall /Encoding ISOLatin1Encoding def -currentdict end /NFont exch definefont pop /NFont findfont} bdef -/p {closepath} bdef -/sf {scalefont setfont} bdef -/ef {eofill}bdef -/pc {closepath stroke}bdef -/ps {stroke}bdef -/pum {matrix currentmatrix}bdef -/pom {setmatrix}bdef -/bs {/aString exch def /nXOfs exch def /nWidth exch def currentpoint nXOfs 0 rmoveto pum nWidth aString stringwidth pop div 1 scale aString show pom moveto} bdef -%%EndResource -%%EndProlog -%%BeginSetup -%%EndSetup -%%Page: 1 1 -%%BeginPageSetup -%%EndPageSetup -pum -0.02837 0.0283 s -0 -6288 t -/tm matrix currentmatrix def -gs -tm setmatrix --421 -635 t -1 1 s -421 635 m 8279 635 l 8279 6922 l 421 6922 l 421 635 l eoclip newpath -gs -421 635 m 8279 635 l 8279 6922 l 421 6922 l 421 635 l eoclip newpath -421 635 m 8280 635 l 8280 6923 l 421 6923 l 421 635 l eoclip newpath -0.000 c 7937 3937 m 7670 4026 l 7670 3848 l 7937 3937 l p ef -635 3937 m 7723 3937 l ps -6540 2095 m 6374 2323 l 6271 2178 l 6540 2095 l p ef -1651 5588 m 6366 2219 l ps -3948 1079 m 4037 1346 l 3859 1346 l 3948 1079 l p ef -3948 6032 m 3948 5981 l ps -3948 5930 m 3948 5879 l ps -3948 5828 m 3948 5777 l ps -3948 5726 m 3948 5675 l ps -3948 5624 m 3948 5573 l ps -3948 5522 m 3948 5471 l ps -3948 5420 m 3948 5369 l ps -3948 5318 m 3948 5267 l ps -3948 5216 m 3948 5165 l ps -3948 5114 m 3948 5063 l ps -3948 5012 m 3948 4961 l ps -3948 4910 m 3948 4859 l ps -3948 4808 m 3948 4757 l ps -3948 4706 m 3948 4655 l ps -3948 4604 m 3948 4553 l ps -3948 4502 m 3948 4451 l ps -3948 4400 m 3948 4349 l ps -3948 4298 m 3948 4247 l ps -3948 4196 m 3948 4145 l ps -3948 4094 m 3948 4043 l ps -3948 3992 m 3948 3941 l ps -3948 3890 m 3948 3839 l ps -3948 3788 m 3948 3737 l ps -3948 3686 m 3948 3635 l ps -3948 3584 m 3948 3533 l ps -3948 3482 m 3948 3431 l ps -3948 3380 m 3948 3329 l ps -3948 3278 m 3948 3227 l ps -3948 3176 m 3948 3125 l ps -3948 3074 m 3948 3023 l ps -3948 2972 m 3948 2921 l ps -3948 2870 m 3948 2819 l ps -3948 2768 m 3948 2717 l ps -3948 2666 m 3948 2615 l ps -3948 2564 m 3948 2513 l ps -3948 2462 m 3948 2411 l ps -3948 2360 m 3948 2309 l ps -3948 2258 m 3948 2207 l ps -3948 2156 m 3948 2105 l ps -3948 2054 m 3948 2003 l ps -3948 1952 m 3948 1901 l ps -3948 1850 m 3948 1799 l ps -3948 1748 m 3948 1697 l ps -3948 1646 m 3948 1595 l ps -3948 1544 m 3948 1493 l ps -3948 1442 m 3948 1391 l ps -3948 1340 m 3948 1293 l ps -gs -gs -pum -7843 4359 t -5 -157 m 5 -157 5 -157 5 -151 ct 18 -151 24 -148 41 -123 ct 41 -123 41 -123 71 -80 ct -71 -80 71 -80 38 -36 ct 20 -12 15 -7 6 -6 ct 6 -6 6 -6 6 0 ct 6 0 6 0 56 0 ct 56 0 56 0 56 -6 ct -46 -6 41 -12 41 -17 ct 41 -19 45 -25 53 -36 ct 53 -36 53 -36 77 -70 ct 77 -70 77 -70 100 -36 ct -107 -25 111 -19 111 -16 ct 111 -10 105 -6 96 -6 ct 96 -6 96 -6 96 0 ct 96 0 96 0 169 0 ct -169 0 169 0 169 -7 ct 156 -7 152 -8 133 -36 ct 133 -36 133 -36 94 -92 ct 94 -92 94 -92 115 -122 ct -133 -145 140 -151 152 -151 ct 152 -151 152 -151 152 -157 ct 152 -157 152 -157 100 -157 ct -100 -157 100 -157 100 -151 ct 109 -151 112 -147 112 -143 ct 112 -140 108 -133 100 -121 ct -100 -121 100 -121 87 -103 ct 87 -103 87 -103 76 -121 ct 66 -137 65 -139 65 -142 ct -65 -148 68 -151 77 -151 ct 77 -151 77 -151 77 -157 ct 77 -157 77 -157 5 -157 ct -p ef -pom -gr -gr -gs -gs -pum -6545 2355 t -2 -158 m 2 -158 2 -158 2 -152 ct 15 -149 21 -143 29 -126 ct 29 -126 29 -126 85 -7 ct -85 -7 85 -7 74 21 ct 66 41 58 47 51 47 ct 30 40 30 40 27 40 ct 17 40 10 47 10 56 ct -10 66 19 76 33 76 ct 51 76 73 60 85 29 ct 85 29 85 29 148 -128 ct 155 -146 159 -150 171 -152 ct -171 -152 171 -152 171 -158 ct 171 -158 171 -158 121 -158 ct 121 -158 121 -158 121 -152 ct -132 -152 136 -150 136 -143 ct 136 -138 135 -134 133 -129 ct 133 -129 133 -129 99 -42 ct -99 -42 99 -42 61 -121 ct 57 -129 55 -135 55 -140 ct 55 -150 64 -152 74 -152 ct -74 -152 74 -152 74 -158 ct 74 -158 74 -158 2 -158 ct p ef -pom -gr -gr -gs -gs -pum -3638 1254 t -145 -48 m 145 -48 145 -48 139 -48 ct 136 -17 131 -12 101 -12 ct 101 -12 101 -12 44 -12 ct -44 -12 44 -12 148 -151 ct 148 -151 148 -151 148 -157 ct 148 -157 148 -157 18 -157 ct -18 -157 18 -157 17 -113 ct 17 -113 17 -113 24 -113 ct 26 -144 37 -145 59 -145 ct -59 -145 59 -145 110 -145 ct 110 -145 110 -145 7 -6 ct 7 -6 7 -6 7 0 ct 7 0 7 0 144 0 ct -144 0 144 0 145 -48 ct p ef -pom -gr -gr -25 lw 1 lj 3962 2032 m 3314 2032 2787 1960 2787 1873 ct 2787 1786 3314 1714 3962 1714 ct -4610 1714 5137 1786 5137 1873 ct 5137 1960 4610 2032 3962 2032 ct pc -5137 2139 m 5087 2221 4581 2285 3966 2286 ct 3318 2286 2791 2214 2791 2127 ct -2791 2126 2791 2126 2791 2126 ct ps -3949 1905 m 3949 1270 l ps -3949 6506 m 3949 5871 l ps -2788 1841 m 2788 2159 l ps -5116 1841 m 5116 2159 l ps -5137 5839 m 5087 5921 4581 5985 3966 5986 ct 3318 5986 2791 5914 2791 5827 ct -2791 5826 2791 5826 2791 5826 ct ps -2788 5541 m 2788 5859 l ps -5116 5541 m 5116 5859 l ps -3659 2286 m 3659 5524 l ps -4259 2286 m 4259 5524 l ps -4291 5531 m 4272 5563 4137 5588 3976 5588 ct 3813 5588 3678 5562 3660 5531 ct -ps -4268 5399 m 4759 5418 5120 5480 5120 5552 ct 5120 5639 4593 5711 3945 5711 ct -3297 5711 2770 5639 2770 5552 ct 2770 5477 3151 5414 3664 5397 ct ps -gr -gs -421 635 m 8279 635 l 8279 6922 l 421 6922 l 421 635 l eoclip newpath -gr -gr -0 6288 t -pom -count op_count sub {pop} repeat countdictstack dict_count sub {end} repeat b4_inc_state restore -%%PageTrailer -%%Trailer -%%EOF diff --git a/z3c/rml/tests/input/images/cylinder.svg b/z3c/rml/tests/input/images/cylinder.svg deleted file mode 100644 index b559efd2..00000000 --- a/z3c/rml/tests/input/images/cylinder.svg +++ /dev/null @@ -1,2 +0,0 @@ - -image/svg+xml diff --git a/z3c/rml/tests/input/images/cylinder.svgz b/z3c/rml/tests/input/images/cylinder.svgz deleted file mode 100644 index fa000439..00000000 Binary files a/z3c/rml/tests/input/images/cylinder.svgz and /dev/null differ diff --git a/z3c/rml/tests/input/images/replogo.gif b/z3c/rml/tests/input/images/replogo.gif deleted file mode 100644 index 5b31c97b..00000000 Binary files a/z3c/rml/tests/input/images/replogo.gif and /dev/null differ diff --git a/z3c/rml/tests/input/logo_no_bar.png b/z3c/rml/tests/input/logo_no_bar.png deleted file mode 100644 index 80ad9d7c..00000000 Binary files a/z3c/rml/tests/input/logo_no_bar.png and /dev/null differ diff --git a/z3c/rml/tests/input/printScaling.rml b/z3c/rml/tests/input/printScaling.rml deleted file mode 100644 index ae3f8a94..00000000 --- a/z3c/rml/tests/input/printScaling.rml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - This document should print at actual size by default - - - diff --git a/z3c/rml/tests/input/rml-examples-000-simple.rml b/z3c/rml/tests/input/rml-examples-000-simple.rml deleted file mode 100644 index f2eb2a9e..00000000 --- a/z3c/rml/tests/input/rml-examples-000-simple.rml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - -Hello World. First Page Drawing - - - - -Hello World. Second Page Drawing - - - - diff --git a/z3c/rml/tests/input/rml-examples-001-cmbox.rml b/z3c/rml/tests/input/rml-examples-001-cmbox.rml deleted file mode 100644 index b487a1d6..00000000 --- a/z3c/rml/tests/input/rml-examples-001-cmbox.rml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - -RML (Report Markup Language) is ReportLab's own language for specifying the appearance of a printed page, which is converted into PDF by the utility rml2pdf. -


              -These RML samples showcase techniques and features for generating various types of ouput and are distributed within our commercial package as test cases. Each should be self explanatory and stand alone. - - - - - - Hello World. This is a normal paragraph. Blah IPO blah blah blah blah growth forecast blah -blah blah forecast blah.Blah blah blah blah blah blah blah blah blah blah blah profit blah blah blah blah blah -blah blah blah blah blah IPO.Blah blah blah blah blah blah blah reengineering blah growth blah blah blah -proactive direction strategic blah blah blah forward-thinking blah.Blah blah doubletalk blah blah blah blah -blah profit blah blah growth blah blah blah blah blah profit.Blah blah blah blah venture capital blah blah blah -blah blah forward-thinking blah. - - - - - diff --git a/z3c/rml/tests/input/rml-examples-001-hello.rml b/z3c/rml/tests/input/rml-examples-001-hello.rml deleted file mode 100644 index 19c30440..00000000 --- a/z3c/rml/tests/input/rml-examples-001-hello.rml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - - - - - Hello World. This is a normal paragraph. Blah IPO blah blah blah blah growth forecast blah -blah blah forecast blah.Blah blah blah blah blah blah blah blah blah blah blah profit blah blah blah blah blah -blah blah blah blah blah IPO.Blah blah blah blah blah blah blah reengineering blah growth blah blah blah -proactive direction strategic blah blah blah forward-thinking blah.Blah blah doubletalk blah blah blah blah -blah profit blah blah growth blah blah blah blah blah profit.Blah blah blah blah venture capital blah blah blah -blah blah forward-thinking blah. Here are some common characters &#x92; = ’ - - This is another normal paragraph. Blah IPO blah blah blah blah growth forecast blah -blah blah forecast blah.Blah blah blah blah blah blah blah blah blah blah blah profit blah blah blah blah blah -blah blah blah blah blah IPO.Blah blah blah blah blah blah blah reengineering blah growth blah blah blah -proactive direction strategic blah blah blah forward-thinking blah.Blah blah doubletalk blah blah blah blah -blah profit blah blah growth blah blah blah blah blah profit.Blah blah blah blah venture capital blah blah blah -blah blah forward-thinking blah. - - - I should NOT have a tiny leading space in front of me! - - This is spaced. There should be 12 points before and after. - Hello World. This is a normal paragraph. Blah IPO blah blah blah blah growth forecast blah -blah blah forecast blah.Blah blah blah blah blah blah blah blah blah blah blah profit blah blah blah blah blah -blah blah blah blah blah IPO.Blah blah blah blah blah blah blah reengineering blah growth blah blah blah -proactive direction strategic blah blah blah forward-thinking blah.Blah blah doubletalk blah blah blah blah -blah profit blah blah growth blah blah blah blah blah profit.Blah blah blah blah venture capital blah blah blah -blah blah forward-thinking blah. - - - - - diff --git a/z3c/rml/tests/input/rml-examples-002-paras.rml b/z3c/rml/tests/input/rml-examples-002-paras.rml deleted file mode 100644 index 64eb30d3..00000000 --- a/z3c/rml/tests/input/rml-examples-002-paras.rml +++ /dev/null @@ -1,395 +0,0 @@ - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This checks for all the possible quotes: &amp; = &, - &lt; = <, &gt; = >, &apos; = ', &quot; = ", - &pound; = £. - - - -Paragraph 1: About this page -This page tests out a number of attributes of the paraStyle tag. -This paragraph is in a style we have called "style1". It should be a normal paragraph, set in Courier 12 pt. -It should be a normal paragraph, set in Courier (not bold). -It should be a normal paragraph, set in Courier 12 pt. - -Paragraph 2: Indent Left -This paragraph is in a style we have called "style2". It should be indented on the left. -It should be indented on the left by 1 inch. -It should be indented on the left. - -Paragraph 3: Indent Right -This paragraph is in a style we have called "style3". It should be indented on the right. It should be indented on the right by 1 inch. It should be indented on the right. - -Paragraph 4: Space Before -This paragraph is in a style we have called "style4". It should be have a space before it. It should be have a space before it of 2 centimeters. It should be have a space before it. - -Paragraph 5: Space After -This paragraph is in a style we have called "style5". It should be have a space after it. It should be have a space after it of 2 centimeters. It should be have a space after it. - -Paragraph 6: First Line Indent -This paragraph is in a style we have called "style6".It should be have an indented first line. It should be have an first line indented by 2 centimeters. It should be have an indented first line. -Paragraph 7: Leading -This paragraph is in a style we have called "style7". It should be using leading. It should have a gap of 5 points between each line. It should be using leading. It should have a gap of 5 pt between each line. It should be using leading. The gap between lines should be half of the height of a line. This paragraph should look like it has a line spacing of "1.5 lines" - -Paragraphs 8-12: Simple Bullet Points -Parastyle name="style8" parent="style1" bulletFontName = "ZapfDingbats" bulletFontSize = "5" -These paragraphs are in a style we have called "style8" -These five lines should have bullet points. -The bullet font is ZapfDingbats. -The bullet size is 5 points -This is a long line to see how multi-line bullets look: These paragraphs are in a style we have called "style8". These four lines should have bullet points. The bullet font is ZapfDingbats. The bullet size is 5 points - -Paragraph 13-18: Indented Bullet Points -bulletFontName = "ZapfDingbats" bulletFontSize = "10" bulletIndent = "20" -These paragraphs are in a style we have called "style9" -These five lines should have indented bullet points. -Bullet points should look like a pointing hand. -Bullet font is still ZapfDingbats, and bullet size is 10 points. -The bullet indent is 20 points -This is a long line to see how multi-line bullets look: These paragraphs are in a style we have called "style9". These four lines should have indented bullet points. Bullet points should look like a pointing hand. Bullet font is still ZapfDingbats, and bullet size is 10 points. The bullet indent is 20 points - -Paragraph 19-24: Indented Bullet Points with a Left Indent for the Text -bulletFontName = "ZapfDingbats" bulletFontSize = "10" bulletIndent = "20" leftIndent = "35" -These paragraphs are in a style we have called "style10" -These four lines should have indented bullet points, with the text indented as well. -Bullet points should look like a pointing hand. -Bullet font is still ZapfDingbats, and bullet size is 10 points. -The bullet indent is 20 points, and the text indent is 35 points -This is a long line to see how multi-line bullets look: These paragraphs are in a style we have called "style10". These four lines should have indented bullet points, with the text indented as well. Bullet points should look like a pointing hand. Bullet font is still ZapfDingbats, and bullet size is 10 points. - -Paragraph 25: Left Justified Paragraphs -This paragraph is in a style we have called "style11". It should be left justified. It has an argument which states 'alignment = "left"'. It should be left justified. It should be aligned to the left. - -Paragraph 26: Right Justified Paragraphs -This paragraph is in a style we have called "style12". It should be right justified. It has an argument which states 'alignment = "right"'. It should be right justified. It should be aligned to the right. - -Paragraph 27: Centered Paragraphs -This paragraph is in a style we have called "style13".It should be center justified. It has an argument which states 'alignment = "center"'. It should be centered. It should be aligned to the center. - -Paragraph 28: Justified Paragraphs -This paragraph is in a style we have called "style14". It should be justified. It has an argument which states 'alignment = "justify"'. It should be justified. This paragraph doesn't contain any bold text though. -Paragraph 28.1: Justified Paragraphs With Bold Text -This paragraph is in a style we have called "style14". It should be justified. It has an argument which states 'alignment = "justify"'. It should be justified. This paragraph doesn't contain any bold text though. - -Paragraphs 29-32: Bullets using left align, right align, centered and justify. -bulletFontName = "ZapfDingbats" bulletFontSize = "5" bulletIndent = "20" leftIndent = "35" alignment = "left" -This is "style15", bullets with a left alignment. (The bullets in this style are based on "style10") -bulletFontName = "ZapfDingbats" bulletFontSize = "5" bulletIndent = "20" leftIndent = "35" alignment = "right" -This is "style16", bullets with a right alignment.(The bullets in this style are based on "style10") -bulletFontName = "ZapfDingbats" bulletFontSize = "5" bulletIndent = "20" leftIndent = "35" alignment = "center" -This is "style17", bullets with a center alignment.(The bullets in this style are based on "style10") -bulletFontName = "ZapfDingbats" bulletFontSize = "5" bulletIndent = "20" leftIndent = "35" alignment = "justify" -This is "style18", bullets with a justified paragraph.(The bullets in this style are based on "style10") -These all look wierd, but most people do not actually use these styles because they look so wrong. - -Paragraph 33-35: Using Colours by Colour Name -This text should be RED -This text should be GREEN -This text should be BLUE - - - - -You SHOULD be able to specify colours -by all the means available to reportlab.lib.colours. Currently, you -cannot use RGB or HEX values... - -Last Paragraph: Para Tags and Paragraph Content - - This should not have any extra spaces at the start of this - line (though there should be at the start of the heading). RML should ignore - additional whitespace, and you should be able to format the actual paragraphs - as you like. This should be underlined. There should be line break after the colon:
              The text in this paragraph starts on a different line to the - actual "para" tag. -
              - - -Quoting and escaping - - This checks for all the possible quotes: &amp; = &, - &lt; = <, &gt; = >, &apos; = ', &quot; = ", - &pound; = £. - - -If this is not italic, and this is not bold, even normal angle brackets are broken. - - - -Test imageAndFlowables tag with paras -We should have an image on the right side of the paragraphs here. The imageAndFlowables -tag can take an arbitrarary number of flowables and try to flow them round an image sepcified by attributes -imageName -imageWidth -imageHeight -imageMask; other attributes allow for padding and which side the image goes eg -imageTopPadding -imageBottomPadding -imageLeftPadding -imageRightPadding -imageSide. Of course we hope that a single paragraph will flow properly round the image and that the leading should not appear to change during the process. -On our assumptions, this selectionally introduced contextual feature is -unspecified with respect to irrelevant intervening contexts in -selectional rules. To characterize a linguistic level L, a -descriptively adequate grammar appears to correlate rather closely with -a descriptive fact. A consequence of the approach just outlined is that -a case of semigrammaticalness of a different sort suffices to account -for the system of base rules exclusive of the lexicon. A majority of -informed linguistic specialists agree that the speaker-hearer's -linguistic intuition raises serious doubts about the traditional -practice of grammarians. For one thing, the descriptive power of the -base component does not readily tolerate problems of phonemic and -morphological analysis. - - - -Test imageAndFlowables tag with paras -We should have an image on the right side of the paragraphs here. - - -Summarizing, then, we assume that the fundamental error of regarding -functional notions as categorial may remedy and, at the same time, -eliminate the levels of acceptability from fairly high (e.g. (99a)) to -virtual gibberish (e.g. (98d)). This suggests that the theory of -syntactic features developed earlier delimits a descriptive fact. We -have already seen that any associated supporting element is not quite -equivalent to the traditional practice of grammarians. From C1, it -follows that the theory of syntactic features developed earlier can be -defined in such a way as to impose irrelevant intervening contexts in -selectional rules. So far, a descriptively adequate grammar is rather -different from a general convention regarding the forms of the grammar. - - - - -Intra-paragraph <br/> - -And now for a break...
              -here we should be one line two.
              -Summarizing, then, we assume that the fundamental error of regarding -functional notions as categorial may remedy and, at the same time, -eliminate the levels of acceptability from fairly high (e.g. (99a)) to -virtual gibberish (e.g. (98d)). Now let's fake a bullet list: -
              - bullet 1 -
              - bullet 2 -
              - bullet 3 -
              - bullet 4 -
              - bullet 15 - -
              - - -
              - -
              diff --git a/z3c/rml/tests/input/rml-examples-003-frames.rml b/z3c/rml/tests/input/rml-examples-003-frames.rml deleted file mode 100644 index 7e3fb89e..00000000 --- a/z3c/rml/tests/input/rml-examples-003-frames.rml +++ /dev/null @@ -1,111 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - -This is frame 1 -This page tests to see that multiple frames display on one page. It also checks to see that the "nextFrame" tag works correctly to split the text in the story correctly between those frames. -This is the text for frame 1. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. This is the text for frame one.. This is the text for frame one. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. This is the text for frame one. This is the text for frame one. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. This is the text for frame one. - - - -This is frame 2 -This page tests to see that multiple frames display on one page. It also checks to see that the "nextFrame" tag works correctly to split the text in the story correctly between those frames. -This is the text for frame 2. This is the text for frame two. -This is the text for frame 2. This is the text for frame two. -This is the text for frame 2. This is the text for frame two. This is the text for frame two. -This is the text for frame 2. This is the text for frame two. This is the text for frame two. This is the text for frame two. This is the text for frame two. -This is the text for frame 2. This is the text for frame two. -This is the text for frame 2. This is the text for frame two. This is the text for frame two. -This is the text for frame 2. This is the text for frame two. This is the text for frame two. This is the text for frame two. This is the text for frame two. -This is the text for frame 2. This is the text for frame two. -This is the text for frame 2. This is the text for frame two. This is the text for frame two. - - - -This is frame 3 -This page tests to see that multiple frames display on one page. It also checks to see that the "nextFrame" tag works correctly to split the text in the story correctly between those frames. -This is the text for frame 3. This is the text for frame three. -This is the text for frame 3. This is the text for frame three. -This is the text for frame 3. This is the text for frame three. This is the text for frame three. -This is the text for frame 3. This is the text for frame three. This is the text for frame three. This is the text for frame three. This is the text for frame three. -This is the text for frame 3. This is the text for frame three. -This is the text for frame 3. This is the text for frame three. This is the text for frame three. -This is the text for frame 3. This is the text for frame three. This is the text for frame three. This is the text for frame three. This is the text for frame three. -This is the text for frame 3. This is the text for frame three. -This is the text for frame 3. This is the text for frame three. This is the text for frame three. - - - -This is frame 4 -This page tests to see that multiple frames display on one page. It also checks to see that the "nextFrame" tag works correctly to split the text in the story correctly between those frames. -This is the text for frame 4. This is the text for frame four. -This is the text for frame 4. This is the text for frame four. -This is the text for frame 4. This is the text for frame four. This is the text for frame four. -This is the text for frame 4. This is the text for frame four. This is the text for frame four. This is the text for frame four. This is the text for frame four. -This is the text for frame 4. This is the text for frame four. -This is the text for frame 4. This is the text for frame four. This is the text for frame four. -This is the text for frame 4. This is the text for frame four. This is the text for frame four. This is the text for frame four. This is the text for frame four. -This is the text for frame 4. This is the text for frame four. -This is the text for frame 4. This is the text for frame four. This is the text for frame four. - - - - - diff --git a/z3c/rml/tests/input/rml-examples-004-fpt-templates.rml b/z3c/rml/tests/input/rml-examples-004-fpt-templates.rml deleted file mode 100644 index 10f4b7d8..00000000 --- a/z3c/rml/tests/input/rml-examples-004-fpt-templates.rml +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - -This is page 1 - frame 1 -This test spans two pages (this should be on page 1). It checks to see that using two separate templates works OK. It also tests to see that the "setNextTemplate" tag correctly splits the pages and displays them with the correct template. -Description of page: This page should have a single frame at the bottom of the page displaying this text, a big teal-coloured number "1" above it, and some header information above that. -This is the text for frame 1. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. This is the text for frame one.. This is the text for frame one. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. This is the text for frame one. This is the text for frame one. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. This is the text for frame one. - - - - - -This is page2 - frame1 -This test spans two pages (this should be on page 2). It checks to see that using two separate templates works OK. It also tests to see that the "setNextTemplate" tag correctly splits the pages and displays them with the correct template. -Description of page: This page should have two different frames at the bottom of the page displaying text, a big deepskyblue-coloured number "2" above it, and some header information above that. -This is the text for frame 2. This is the text for frame two. -This is the text for frame 2. This is the text for frame two. -This is the text for frame 2. This is the text for frame two. This is the text for frame two. -This is the text for frame 2. This is the text for frame two. This is the text for frame two. This is the text for frame two. This is the text for frame two. -This is the text for frame 2. This is the text for frame two. -This is the text for frame 2. This is the text for frame two. -This is the text for frame 2. This is the text for frame two. This is the text for frame two. - - - -This is page2 - frame2 -This test spans two pages (this should be on page 2). It checks to see that using two separate templates works OK. It also tests to see that the "setNextTemplate" tag correctly splits the pages and displays them with the correct template. -Description of page: This page should have two different frames at the bottom of the page displaying text, a big deepskyblue-coloured number "2" above it, and some header information above that. -This is the text for frame 3. This is the text for frame three. -This is the text for frame 3. This is the text for frame three. -This is the text for frame 3. This is the text for frame three. This is the text for frame three. -This is the text for frame 3. This is the text for frame three. This is the text for frame three. This is the text for frame three. This is the text for frame three. -This is the text for frame 3. This is the text for frame three. -This is the text for frame 3. This is the text for frame three. This is the text for frame three. - - - - - diff --git a/z3c/rml/tests/input/rml-examples-004-templates.rml b/z3c/rml/tests/input/rml-examples-004-templates.rml deleted file mode 100644 index a3516ddf..00000000 --- a/z3c/rml/tests/input/rml-examples-004-templates.rml +++ /dev/null @@ -1,116 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - -This is page 1 - frame 1 -This test spans two pages (this should be on page 1). It checks to see that using two separate templates works OK. It also tests to see that the "setNextTemplate" tag correctly splits the pages and displays them with the correct template. -Description of page: This page should have a single frame at the bottom of the page displaying this text, a big teal-coloured number "1" above it, and some header information above that. -This is the text for frame 1. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. This is the text for frame one.. This is the text for frame one. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. This is the text for frame one. This is the text for frame one. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. -This is the text for frame 1. This is the text for frame one. This is the text for frame one. - - - - - - -This is page2 - frame1 -This test spans two pages (this should be on page 2). It checks to see that using two separate templates works OK. It also tests to see that the "setNextTemplate" tag correctly splits the pages and displays them with the correct template. -Description of page: This page should have two different frames at the bottom of the page displaying text, a big deepskyblue-coloured number "2" above it, and some header information above that. -This is the text for frame 2. This is the text for frame two. -This is the text for frame 2. This is the text for frame two. -This is the text for frame 2. This is the text for frame two. This is the text for frame two. -This is the text for frame 2. This is the text for frame two. This is the text for frame two. This is the text for frame two. This is the text for frame two. -This is the text for frame 2. This is the text for frame two. -This is the text for frame 2. This is the text for frame two. -This is the text for frame 2. This is the text for frame two. This is the text for frame two. - - - -This is page2 - frame2 -This test spans two pages (this should be on page 2). It checks to see that using two separate templates works OK. It also tests to see that the "setNextTemplate" tag correctly splits the pages and displays them with the correct template. -Description of page: This page should have two different frames at the bottom of the page displaying text, a big deepskyblue-coloured number "2" above it, and some header information above that. -This is the text for frame 3. This is the text for frame three. -This is the text for frame 3. This is the text for frame three. -This is the text for frame 3. This is the text for frame three. This is the text for frame three. -This is the text for frame 3. This is the text for frame three. This is the text for frame three. This is the text for frame three. This is the text for frame three. -This is the text for frame 3. This is the text for frame three. -This is the text for frame 3. This is the text for frame three. This is the text for frame three. - - - - - - diff --git a/z3c/rml/tests/input/rml-examples-005-fonts.rml b/z3c/rml/tests/input/rml-examples-005-fonts.rml deleted file mode 100644 index fbec698d..00000000 --- a/z3c/rml/tests/input/rml-examples-005-fonts.rml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - This paragraph is an ordinary font style, but switches font. - This is in a custom font - and this is in a custom TTF font. - - - - - This is a whole paragraph in the 'robot' style. - This is a whole paragraph in the 'Vera' style. - - - "DarkGardenMK" - - "Vera" - - This is drawn directly in an illustration - - - - This is Helvetica (plain). - This is Helvetica + italics. - This is Helvetica-Oblique. - This is Helvetica-Oblique + BOLD. - - - - This is plain text (no font face given) + italic. - - - - - diff --git a/z3c/rml/tests/input/rml-examples-006-barcodes.rml b/z3c/rml/tests/input/rml-examples-006-barcodes.rml deleted file mode 100644 index 21f4ccd3..00000000 --- a/z3c/rml/tests/input/rml-examples-006-barcodes.rml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - Various Barcodes as drawing ops. Original code contributed by Ty Sarnas. - - - - Code11 - - - - 01234545634563 - - - - Code128 - - AB-12345678 - - - - Code128 With settings - - AB-12345678 - - - barChartFlowable - - - - - - - diff --git a/z3c/rml/tests/input/rml-examples-008-tables.rml b/z3c/rml/tests/input/rml-examples-008-tables.rml deleted file mode 100644 index fc7e88b6..00000000 --- a/z3c/rml/tests/input/rml-examples-008-tables.rml +++ /dev/null @@ -1,994 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The email address should be a clickable mailto link built by creating a plugin within the cell. And Robin's job title - should be on a separate line to his name. In the third row, we use the newer and easier table cell properties "href" and "destination". - - - - Name - Email - - - Robin Becker -(chief propellerhead) - - ("mailto:robin@reportlab.com",) - - - - Internal link to back page - Hyperlink to www.reportlab.com - - - - - This should be a 5x5 table where some ranges span. Note that the grid and background - commands still work on the "underlying" grid; if you grid the whole table, it will show through - your 'spanned cells' - - - - - This should span the first 3 cells in the top row. It's ordinary left aligned - text but could be centred if you want. - - B - C - D - - This should span all five cells in the right column. We vertically centred the - text to make it look sensible using a separate stylesheet command. -
              - some more text - - - - A - B - C - DB - E - - - A - B - C - DB - E - - - A - B - C - DB - E - - - A - B - C - DB - E - -
              - - This should be a 5x5 table where some ranges span. The column widths have been set as - 3cm,10%,10%,10%,30%. The percentage refers to unallocated width only. - - - - - - This should span the first 3 cells in the top row. It's ordinary left aligned - text but could be centred if you want. - - B - C - D - - This should span all five cells in the right column. We vertically centred the - text to make it look sensible using a separate stylesheet command. -
              -
              -
              -
              -
              -
              - some more text - - - - A - B - C - DB - E - - - A - B - C - DB - E - - - A - B - C - DB - E - - - A - B - C - DB - E - -
              - - - - This shows some pointers on doing financial tables. It demonstrates the decimal alignment and - multiple lines. We also used a local <td color="red"> attribute for the negative cell; ideally one wants to make the data drive the colour, - so that generator apps don't need to make para tags in every cell if they want red negatives. - If we move to dynamic RML, then a number-and-cell-formatting function is possible, but static RML - sees everything as text. - - Note that when the value does not contain the decimal character but there are non-digit characters at the - end, it tries to align the rightmost digits with other rows. - - - - - - - - - - - - - - - - - - - - Corporate Assets - Amount - - - Fixed Assets - 1,234,567.89 - - - Legal Offense Fund - 86,000,000 - - - Company Vehicle - 1,234.8901 - - - Petty Cash - 42 - - - Intellectual Property - Questionable - - - Bank Overdraft - (13,029) - - - Goodwill - (742,078,231.56) - - - Flat Screen TV - 27 inches - - - Net Position - Doomed. Really! - - - - Individual <td> tags that contain pure strings can override the following attributes: - fontName, fontSize, fontColor, leading, leftPadding, rightPadding, - topPadding, bottomPadding, background, align, vAlign, - lineBelowThickness, lineBelowColor, lineBelowCap, lineBelowCount, lineBelowSpace, - lineAboveThickness, lineAboveColor, lineAboveCap, lineAboveCount, lineAboveSpace, - lineLeftThickness, lineLeftColor, lineLeftCap, lineLeftCount, lineLeftSpace, - lineRightThickness, lineRightColor, lineRightCap, lineRightCount, lineRightSpace -. - - - - fontName - Courier - - - fontName - Helvetica - - - fontSize - 8 - - - fontSize - 14 - - - fontColor - red - - - fontColor - blue - - - leading - leading -is -16 - - - leading - leading -is -12 - - - leftPadding - 10 - - - leftPadding - 16 - - - rightPadding - 10 - - - rightPadding - 24 - - - topPadding - 10 - - - topPadding - 24 - - - bottomPadding - 10 - - - bottomPadding - 24 - - - background - pink - - - background - lightblue - - - align - left - - - align - center - - - align - right - - - - -vAlign -- - top - - - - -vAlign -- - middle - - - - -vAlign -- - bottom - - - lineBelow - right - - - - This table is using <xpre> tags around the contents of the right hand column. - - - - fontName - - Courier - - - - fontName - - Helvetica - - - - fontSize - - 8 - - - - fontSize - - 14 - - - - fontColor - - red - - - - fontColor - - blue - - - - leading - - leading -is -16 - - - - leading - - leading -is -12 - - - - leftPadding - - 10 - - - - leftPadding - - 16 - - - - rightPadding - - 10 - - - - rightPadding - - 24 - - - - topPadding - - 10 - - - - topPadding - - 24 - - - - bottomPadding - - 10 - - - - bottomPadding - - 24 - - - - background - - pink - - - - background - - lightblue - - - - align - - left - - - - align - - center - - - - align - - right - - - - - -vAlign -- - - top - - - - - -vAlign -- - - middle - - - - - -vAlign -- - - bottom - - - - -

              Bulk Data Support

              - Very often one wants to get quite a lot of text or numeric data into a table - for - example from a database query or imported data file. Quoting all of this correctly as - XML and wrapping in in td and tr tags is time and memory consumuing, unquoting and parsing it - all back even more so. Therefore, instead of explicitly creating row and cell tags, you - can now use a new bulkData tag. This lets you specify a delimiter for fields (default - is comma) and for records (default is newline), and rml2pdf will break this up. - If you want to avoid having to quote ampersands, wrap this in a CDATA escape sequence. - Of course if you want per-cell formatting or to put arbitrary flowables in a cell, you - must use the other tags. - - - - - - You can specify a tab with fieldDelim="\t", but we generally advise against using any - whitespace character as a delimiter if you have a choice. You can also specify fine-grained - "stripping" control; the default behaviour - is to strip whitespace off the top and bottom of the overall data block, so blank lines are - excluded, and off the ends of each row so line endings and indentation don't matter, but not off each - cell. Note that the strings in the cells may contain spaces - and these spaces will be respected in formatting. You are also advised to use a CDATA - escape sequence around your data so that "&","<" and ">", characters don't - need special handling. -

              Excel Bulk Data Support

              - The excelData tag is very similar to the bulk data support, but reads the bulk - data from an Excel file instead of from delimited textual data. The range attribute is - optional. - -

              - Sorry Ecel Bulk Support is not yet here -

              - - -

              Colour cycles by rows and columns

              - It's sometimes nice to alternate colours by row (e.g. a pale color then - white) to visually break up a long table. The style lets you specify cycles as - well as single colours. Here we have created a style command which cycles through - pale green and white, like old stacks of fanfold paper... - - - - - - - - - - - - - - Date - Item - Debit - Credit - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Bottom row should be greem - 110 - - - - - - Try again by column, with three colors this time. Also ensure some row heights - vary to check accuracy of drawing. - - - - - - - - - - - - - - - Date - Item - Debit - Credit - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients -plus magnum of champagne - 400 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - 28-09-2004 - Expensive lunch with clients - 100 - - - - - And now by column (although this may be used less...) - - - - - - - - - - - - - - - Date - Item - Jan - Feb - Mar - Apr - May - Jun - Jul - Aug - Sep - Oct - Nov - Dec - Total - - - Expenses - Entertainment - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 1200 - - - Expenses - Entertainment - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 1200 - - - Expenses - Entertainment - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 1200 - - - Expenses - Entertainment - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 1200 - - - Expenses - Entertainment - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 100 - 1200 - - - - -

              Splitting over pages - top and bottom rows

              - Sometimes a table splits over a page and you don't have a grid, so the bottom part (and top of the - new page) have no line boxing them in. The splitfirst and splilast magic coordinates can be used to insert - a line drawing routine into the style for this. I used an ugly thick purple line! - - - - - - - - - - - - - - - - - - - DateItemDebitCredit - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100- - 28-09-2004Expensive lunch with clients100 - - - - - -
              -
              diff --git a/z3c/rml/tests/input/rml-examples-009-splitting.rml b/z3c/rml/tests/input/rml-examples-009-splitting.rml deleted file mode 100644 index fb619bad..00000000 --- a/z3c/rml/tests/input/rml-examples-009-splitting.rml +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -This page tests splitting - this PARAGRAPH in style 'style1' should -split between the two frames on this page. This page tests splitting - -this paragraph should split between the two frames on this page. This -page tests splitting - this paragraph should split between the two -frames on this page. This page tests splitting - this paragraph should -split between the two frames on this page. This page tests splitting - -this paragraph should split between the two frames on this page. - - - - - -
              This page tests splitting - this PRE in style
              -'style1' should split between the two frames on this page. These
              -frames should be ON PAGE TWO, otherwise this test has FAILED. This
              -page tests splitting - this preformatted paragraph should split between the
              -two -- (proves this is a pre)
              -frames on this page. This page tests splitting - this pre should
              -split between the two frames on this page. This page tests splitting -
              -this pre should split between the two frames on this page. This
              -page tests splitting - this pre should split between the two
              -frames on this page. 
              - - - - - - - This tests how a simple table - splits acrossframes - blah blahblah - - - - - - - - - - -
              - -
              diff --git a/z3c/rml/tests/input/rml-examples-010-linkURL.rml b/z3c/rml/tests/input/rml-examples-010-linkURL.rml deleted file mode 100644 index 5d2c81ca..00000000 --- a/z3c/rml/tests/input/rml-examples-010-linkURL.rml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - These should have links. - - - - - - - - - - NameEmail - - Robin - ("mailto:robin@reportlab.com",) - - - - diff --git a/z3c/rml/tests/input/rml-examples-011-keepwithnext.rml b/z3c/rml/tests/input/rml-examples-011-keepwithnext.rml deleted file mode 100644 index 194efb43..00000000 --- a/z3c/rml/tests/input/rml-examples-011-keepwithnext.rml +++ /dev/null @@ -1,190 +0,0 @@ - - - - - - - - - - - - - - - - - - There should be a table on this page - - - These should have links. - - - - - - - - - - - NameEmail - - Robin - ("mailto:robin@reportlab.com",) - - - xxx - - - - There should be a table on the next page - - - - These should have links. - - - - - - - - - - - NameEmail - - Robin - ("mailto:robin@reportlab.com",) - - - xxx - - - - - - - keepWithNext and paragraph splitting = #1. - - - This tests the ability to make headings 'stick to' the paragraphs after them. The heading style - used is supposed to be kept with the next paragraph, even if this involves flopping onto the - next page. We have sized this text so that there is enough space for the heading below to - fit into the top frame. However, its style has a keepWithNext attribute set to 1, so it - should flop down into the bottom half. Cross your fingers.... - - -This should be on the bottom half - - - To characterize a linguistic level L, - this selectionally introduced contextual - feature delimits the requirement that - branching is not tolerated within the - dominance scope of a complex - symbol. Notice, incidentally, that the - notion of level of grammaticalness - does not affect the structure of the - levels of acceptability from fairly high - (e.g. (99a)) to virtual gibberish (e.g. - (98d)). Suppose, for instance, that a - subset of English sentences interesting - on quite independent grounds appears - to correlate rather closely with an - important distinction in language use. - Presumably, this analysis of a - formative as a pair of sets of features is - not quite equivalent to the system of - base rules exclusive of the lexicon. We - have already seen that the appearance - of parasitic gaps in domains relatively - inaccessible to ordinary extraction - does not readily tolerate the strong - generative capacity of the theory. - - - - - - keepWithNext and paragraph splitting - #2. - - - This time the style has keepWithNext turned OFF. The paragraph below should - be in the top half. - - -This should be on the top half - - - To characterize a linguistic level L, - this selectionally introduced contextual - feature delimits the requirement that - branching is not tolerated within the - dominance scope of a complex - symbol. Notice, incidentally, that the - notion of level of grammaticalness - does not affect the structure of the - levels of acceptability from fairly high - (e.g. (99a)) to virtual gibberish (e.g. - (98d)). Suppose, for instance, that a - subset of English sentences interesting - on quite independent grounds appears - to correlate rather closely with an - important distinction in language use. - Presumably, this analysis of a - formative as a pair of sets of features is - not quite equivalent to the system of - base rules exclusive of the lexicon. We - have already seen that the appearance - of parasitic gaps in domains relatively - inaccessible to ordinary extraction - does not readily tolerate the strong - generative capacity of the theory. - - - - - - - - - - diff --git a/z3c/rml/tests/input/rml-examples-017-outlines.rml b/z3c/rml/tests/input/rml-examples-017-outlines.rml deleted file mode 100644 index c42befaf..00000000 --- a/z3c/rml/tests/input/rml-examples-017-outlines.rml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - - - - - -TOP Level -Top Level Outline - - - -Level 1 -Level 1 Outline - - - -Level 2 -Level 2 Outline - - - -Level 1 Again -Level 1 Again -Ampersand (&) and Japanese (ã¾ãŸã¯ã”希望ã®ãƒ›ãƒ†ãƒ«ã‚’1ã¤é¸æŠžã—ã¦ãã ã•ã„) Test -Check that the ampersand (&) appears correctly in the outline/bookmark list. - - - - diff --git a/z3c/rml/tests/input/rml-examples-022-paras-oas.rml b/z3c/rml/tests/input/rml-examples-022-paras-oas.rml deleted file mode 100644 index cd3736a7..00000000 --- a/z3c/rml/tests/input/rml-examples-022-paras-oas.rml +++ /dev/null @@ -1,316 +0,0 @@ - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Overlap Attached Space tests (define please!) -This page tests out a number of attributes of the paraStyle tag. -This paragraph is in a style we have called "style1". It should be a normal paragraph, set in Courier 12 pt. -It should be a normal paragraph, set in Courier (not bold). -It should be a normal paragraph, set in Courier 12 pt. - -Paragraph 2: Indent Left -This paragraph is in a style we have called "style2". It should be indented on the left. -It should be indented on the left by 1 inch. -It should be indented on the left. - -Paragraph 3: Indent Right -This paragraph is in a style we have called "style3". It should be indented on the right. It should be indented on the right by 1 inch. It should be indented on the right. - -Paragraph 4: Space Before -This paragraph is in a style we have called "style4". It should be have a space before it. It should be have a space before it of 2 centimeters. It should be have a space before it. - -Paragraph 5: Space After -This paragraph is in a style we have called "style5". It should be have a space after it. It should be have a space after it of 2 centimeters. It should be have a space after it. - -Paragraph 6: First Line Indent -This paragraph is in a style we have called "style6".It should be have an indented first line. It should be have an first line indented by 2 centimeters. It should be have an indented first line. -Paragraph 7: Leading -This paragraph is in a style we have called "style7". It should be using leading. It should have a gap of 5 points between each line. It should be using leading. It should have a gap of 5 pt between each line. It should be using leading. The gap between lines should be half of the height of a line. This paragraph should look like it has a line spacing of "1.5 lines" - -Paragraphs 8-12: Simple Bullet Points -Parastyle name="style8" parent="style1" bulletFontName = "ZapfDingbats" bulletFontSize = "5" -These paragraphs are in a style we have called "style8" -These five lines should have bullet points. -The bullet font is ZapfDingbats. -The bullet size is 5 points -This is a long line to see how multi-line bullets look: These paragraphs are in a style we have called "style8". These four lines should have bullet points. The bullet font is ZapfDingbats. The bullet size is 5 points - -Paragraph 13-18: Indented Bullet Points -bulletFontName = "ZapfDingbats" bulletFontSize = "10" bulletIndent = "20" -These paragraphs are in a style we have called "style9" -These five lines should have indented bullet points. -Bullet points should look like a pointing hand. -Bullet font is still ZapfDingbats, and bullet size is 10 points. -The bullet indent is 20 points -This is a long line to see how multi-line bullets look: These paragraphs are in a style we have called "style9". These four lines should have indented bullet points. Bullet points should look like a pointing hand. Bullet font is still ZapfDingbats, and bullet size is 10 points. The bullet indent is 20 points - -Paragraph 19-24: Indented Bullet Points with a Left Indent for the Text -bulletFontName = "ZapfDingbats" bulletFontSize = "10" bulletIndent = "20" leftIndent = "35" -These paragraphs are in a style we have called "style10" -These four lines should have indented bullet points, with the text indented as well. -Bullet points should look like a pointing hand. -Bullet font is still ZapfDingbats, and bullet size is 10 points. -The bullet indent is 20 points, and the text indent is 35 points -This is a long line to see how multi-line bullets look: These paragraphs are in a style we have called "style10". These four lines should have indented bullet points, with the text indented as well. Bullet points should look like a pointing hand. Bullet font is still ZapfDingbats, and bullet size is 10 points. - -Paragraph 25: Left Justified Paragraphs -This paragraph is in a style we have called "style11". It should be left justified. It has an argument which states 'alignment = "left"'. It should be left justified. It should be aligned to the left. - -Paragraph 26: Right Justified Paragraphs -This paragraph is in a style we have called "style12". It should be right justified. It has an argument which states 'alignment = "right"'. It should be right justified. It should be aligned to the right. - -Paragraph 27: Centered Paragraphs -This paragraph is in a style we have called "style13".It should be center justified. It has an argument which states 'alignment = "center"'. It should be centered. It should be aligned to the center. - -Paragraph 28: Justified Paragraphs -This paragraph is in a style we have called "style14". It should be justified. It has an argument which states 'alignment = "justify"'. It should be justified. - -Paragraphs 29-32: Bullets using left align, right align, centered and justify. -bulletFontName = "ZapfDingbats" bulletFontSize = "5" bulletIndent = "20" leftIndent = "35" alignment = "left" -This is "style15", bullets with a left alignment. (The bullets in this style are based on "style10") -bulletFontName = "ZapfDingbats" bulletFontSize = "5" bulletIndent = "20" leftIndent = "35" alignment = "right" -This is "style16", bullets with a right alignment.(The bullets in this style are based on "style10") -bulletFontName = "ZapfDingbats" bulletFontSize = "5" bulletIndent = "20" leftIndent = "35" alignment = "center" -This is "style17", bullets with a center alignment.(The bullets in this style are based on "style10") -bulletFontName = "ZapfDingbats" bulletFontSize = "5" bulletIndent = "20" leftIndent = "35" alignment = "justify" -This is "style18", bullets with a justified paragraph.(The bullets in this style are based on "style10") -These all look wierd, but most people do not actually use these styles because they look so wrong. - -Paragraph 33-35: Using Colours by Colour Name -This text should be RED -This text should be GREEN -This text should be BLUE - - - -Paragraph 36-38: Using Colours by Hex Value -This text should be RED -This text should be GREEN -This text should be BLUE - -Paragraph 39-41: Using Colours by RGB Value -This text should be RED -This text should be GREEN -This text should be BLUE - - -You SHOULD be able to specify colours -by all the means available to reportlab.lib.colors. Currently, you -cannot use RGB or HEX values... - -Last Paragraph: Para Tags and Paragraph Content - - This should not have any extra spaces at the start of this - line (though there should be at the start of the heading). RML should ignore - additional whitespace, and you should be able to format the actual paragraphs - as you like. The text in this paragraph starts on a different line to the - actual "para" tag. - - - -Quoting and escaping - - This checks for all the possible quotes: &amp; = &, - &lt; = <, &gt; = >, &apos; = ', &quot; = ", - &pound; = £. - - -If this is not italic, and this is not bold, even normal angle brackets are broken. - - - - - - diff --git a/z3c/rml/tests/input/rml-examples-029-keepinframe.rml b/z3c/rml/tests/input/rml-examples-029-keepinframe.rml deleted file mode 100644 index 8a62b8ba..00000000 --- a/z3c/rml/tests/input/rml-examples-029-keepinframe.rml +++ /dev/null @@ -1,577 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - First Try at a keepInFrame - - This will behave just like part of a story, as long as it all - fits. - - - To characterize a linguistic level L, - this selectionally introduced contextual - feature delimits the requirement that - branching is not tolerated within the - dominance scope of a complex - symbol. Notice, incidentally, that the - notion of level of grammaticalness - does not affect the structure of the - levels of acceptability from fairly high - (e.g. (99a)) to virtual gibberish (e.g. - (98d)). Suppose, for instance, that a - subset of English sentences interesting - on quite independent grounds appears - to correlate rather closely with an - important distinction in language use. - Presumably, this analysis of a - formative as a pair of sets of features is - not quite equivalent to the system of - base rules exclusive of the lexicon. We - have already seen that the appearance - of parasitic gaps in domains relatively - inaccessible to ordinary extraction - does not readily tolerate the strong - generative capacity of the theory. - - - - - keepInFrame with a table inside - - - - - - - alignmentalign -alignment - bulletColorbulletcolor -bcolor - bulletFontNamebfont -bulletfontname - bulletFontSizebfontsize -bulletfontsize - bulletIndentbindent -bulletindent - firstLineIndentfindent -firstlineindent - fontNameface -fontname -font - fontSizesize -fontsize - leadingleading - leftIndentleftindent -lindent - rightIndentrightindent -rindent - spaceAfterspaceafter -spacea - spaceBeforespacebefore -spaceb - textColorfg -textcolor -color - - - - - A long keepInFrame, shrinks - - To characterize a linguistic level L, - this selectionally introduced contextual - feature delimits the requirement that - branching is not tolerated within the - dominance scope of a complex - symbol. Notice, incidentally, that the - notion of level of grammaticalness - does not affect the structure of the - levels of acceptability from fairly high - (e.g. (99a)) to virtual gibberish (e.g. - (98d)). Suppose, for instance, that a - subset of English sentences interesting - on quite independent grounds appears - to correlate rather closely with an - important distinction in language use. - Presumably, this analysis of a - formative as a pair of sets of features is - not quite equivalent to the system of - base rules exclusive of the lexicon. We - have already seen that the appearance - of parasitic gaps in domains relatively - inaccessible to ordinary extraction - does not readily tolerate the strong - generative capacity of the theory. - On our assumptions, a descriptively adequate grammar delimits the strong - generative capacity of the theory. For one thing, the fundamental error - of regarding functional notions as categorial is to be regarded as a - corpus of utterance tokens upon which conformity has been defined by the - paired utterance test. A majority of informed linguistic specialists - agree that the appearance of parasitic gaps in domains relatively - inaccessible to ordinary extraction is necessary to impose an - interpretation on the requirement that branching is not tolerated within - the dominance scope of a complex symbol. It may be, then, that the - speaker-hearer's linguistic intuition appears to correlate rather - closely with the ultimate standard that determines the accuracy of any - proposed grammar. Analogously, the notion of level of grammaticalness - may remedy and, at the same time, eliminate a general convention - regarding the forms of the grammar. - - - - - 2 keepInFrame (inner split) - - To characterize a linguistic level L, - this selectionally introduced contextual - feature delimits the requirement that - branching is not tolerated within the - dominance scope of a complex - symbol. Notice, incidentally, that the - notion of level of grammaticalness - does not affect the structure of the - levels of acceptability from fairly high - (e.g. (99a)) to virtual gibberish (e.g. - (98d)). Suppose, for instance, that a - subset of English sentences interesting - on quite independent grounds appears - to correlate rather closely with an - important distinction in language use. - Presumably, this analysis of a - formative as a pair of sets of features is - not quite equivalent to the system of - base rules exclusive of the lexicon. We - have already seen that the appearance - of parasitic gaps in domains relatively - inaccessible to ordinary extraction - does not readily tolerate the strong - generative capacity of the theory. - - - Inner Starts - - On our assumptions, a descriptively adequate grammar delimits the strong - generative capacity of the theory. For one thing, the fundamental error - of regarding functional notions as categorial is to be regarded as a - corpus of utterance tokens upon which conformity has been defined by the - paired utterance test. A majority of informed linguistic specialists - agree that the appearance of parasitic gaps in domains relatively - inaccessible to ordinary extraction is necessary to impose an - interpretation on the requirement that branching is not tolerated within - the dominance scope of a complex symbol. It may be, then, that the - speaker-hearer's linguistic intuition appears to correlate rather - closely with the ultimate standard that determines the accuracy of any - proposed grammar. Analogously, the notion of level of grammaticalness - may remedy and, at the same time, eliminate a general convention - regarding the forms of the grammar. - - Inner Ends - - - We have already seen that the natural general principle that will - subsume this case cannot be arbitrary in the requirement that branching - is not tolerated within the dominance scope of a complex symbol. - Notice, incidentally, that the speaker-hearer's linguistic intuition is - to be regarded as the strong generative capacity of the theory. A - consequence of the approach just outlined is that the descriptive power - of the base component does not affect the structure of the levels of - acceptability from fairly high (e.g. (99a)) to virtual gibberish (e.g. - (98d)). By combining adjunctions and certain deformations, a - descriptively adequate grammar cannot be arbitrary in the strong - generative capacity of the theory. - - - - - - onOverflow = "overflow" in Frame F4 - - This will behave just like part of a story, as long as it all - fits. - - - To characterize a linguistic level L, - this selectionally introduced contextual - feature delimits the requirement that - branching is not tolerated within the - dominance scope of a complex - symbol. Notice, incidentally, that the - notion of level of grammaticalness - does not affect the structure of the - levels of acceptability from fairly high - (e.g. (99a)) to virtual gibberish (e.g. - (98d)). Suppose, for instance, that a - subset of English sentences interesting - on quite independent grounds appears - to correlate rather closely with an - important distinction in language use. - Presumably, this analysis of a - formative as a pair of sets of features is - not quite equivalent to the system of - base rules exclusive of the lexicon. We - have already seen that the appearance - of parasitic gaps in domains relatively - inaccessible to ordinary extraction - does not readily tolerate the strong - generative capacity of the theory. - - - - onOverflow = "truncate" in frame F1 - - This will behave just like part of a story, as long as it all - fits. - - - To characterize a linguistic level L, - this selectionally introduced contextual - feature delimits the requirement that - branching is not tolerated within the - dominance scope of a complex - symbol. Notice, incidentally, that the - notion of level of grammaticalness - does not affect the structure of the - levels of acceptability from fairly high - (e.g. (99a)) to virtual gibberish (e.g. - (98d)). Suppose, for instance, that a - subset of English sentences interesting - on quite independent grounds appears - to correlate rather closely with an - important distinction in language use. - Presumably, this analysis of a - formative as a pair of sets of features is - not quite equivalent to the system of - base rules exclusive of the lexicon. We - have already seen that the appearance - of parasitic gaps in domains relatively - inaccessible to ordinary extraction - does not readily tolerate the strong - generative capacity of the theory. - - - - - - - - - A new way to lay things out.... - - - This tag lets us handle layouts like newsletters and factsheets in a much more - natural style. In documents like this, one does not want stuff to leak out of the - intended box into the next one. You wrap your content in <keepInFrame> tags - and explicitly tell it where to go. The order of this page naturally goes top, upper, middle, - bottomleft, bottomright, sidebar. - - - - - I drew this stuff second, out of the natural order, putting it within a tag saying - <keepInFrame frame="sidebar" overflow="error">. - - - Havng done this, if I had too much content, there would an error warning me. I can put - an ID in to identify it if I want. I can also specify other behaviours for full frames - shrink, truncate, - overflow. - - - - - - I drew this stuff third, out of the natural order. This should be in the upper frame, below the top. - - - - - - this goes in the middle frame. - - - - - - this goes in the bottom right, and was drawn before the stuff on the left.. - - - - - - and finally the bottom left. - - - - - - The Nonsense Journal - - - We now overfill with rubbish etc etc and use onOverflow="shrink" - - - - - I drew this stuff second, out of the natural order, putting it within a tag saying - <keepInFrame frame="sidebar" overflow="shrink">. - - -Of course, this analysis of a formative as a pair of sets of features -can be defined in such a way as to impose an important distinction in -language use. Nevertheless, the speaker-hearer's linguistic intuition -may remedy and, at the same time, eliminate the levels of acceptability -from fairly high (e.g. (99a)) to virtual gibberish (e.g. (98d)). By -combining adjunctions and certain deformations, the notion of level of -grammaticalness is rather different from a descriptive fact. I -suggested that these results would follow from the assumption that the -speaker-hearer's linguistic intuition is to be regarded as the levels of -acceptability from fairly high (e.g. (99a)) to virtual gibberish (e.g. -(98d)). A consequence of the approach just outlined is that this -selectionally introduced contextual feature is not to be considered in -determining irrelevant intervening contexts in selectional rules. - - - -So far, the systematic use of complex symbols is necessary to impose an -interpretation on nondistinctness in the sense of distinctive feature -theory. It must be emphasized, once again, that most of the -methodological work in modern linguistics is rather different from the -requirement that branching is not tolerated within the dominance scope -of a complex symbol. Conversely, a descriptively adequate grammar can -be defined in such a way as to impose a stipulation to place the -constructions into these various categories. If the position of the -trace in (99c) were only relatively inaccessible to movement, relational -information does not affect the structure of the traditional practice of -grammarians. Summarizing, then, we assume that most of the -methodological work in modern linguistics appears to correlate rather -closely with the strong generative capacity of the theory. - - - - - -Suppose, for instance, that the natural general principle that will -subsume this case is to be regarded as the ultimate standard that -determines the accuracy of any proposed grammar. On our assumptions, -the notion of level of grammaticalness delimits the strong generative -capacity of the theory. Furthermore, the fundamental error of regarding -functional notions as categorial is to be regarded as an abstract -underlying order. I suggested that these results would follow from the -assumption that most of the methodological work in modern linguistics -raises serious doubts about the requirement that branching is not -tolerated within the dominance scope of a complex symbol. Let us -continue to suppose that the speaker-hearer's linguistic intuition does -not affect the structure of a corpus of utterance tokens upon which -conformity has been defined by the paired utterance test. - - - -It must be emphasized, once again, that the earlier discussion of -deviance raises serious doubts about a corpus of utterance tokens upon -which conformity has been defined by the paired utterance test. I -suggested that these results would follow from the assumption that the -systematic use of complex symbols does not affect the structure of the -strong generative capacity of the theory. To provide a constituent -structure for T(Z,K), most of the methodological work in modern -linguistics is not quite equivalent to the requirement that branching is -not tolerated within the dominance scope of a complex symbol. On our -assumptions, the fundamental error of regarding functional notions as -categorial is to be regarded as nondistinctness in the sense of -distinctive feature theory. A consequence of the approach just outlined -is that this analysis of a formative as a pair of sets of features -raises serious doubts about the system of base rules exclusive of the -lexicon. - - - - - -If the position of the trace in (99c) were only relatively inaccessible -to movement, the theory of syntactic features developed earlier delimits -a corpus of utterance tokens upon which conformity has been defined by -the paired utterance test. By combining adjunctions and certain -deformations, a case of semigrammaticalness of a different sort is not -subject to an important distinction in language use. Note that this -selectionally introduced contextual feature delimits the strong -generative capacity of the theory. Analogously, a subset of English -sentences interesting on quite independent grounds is not quite -equivalent to an important distinction in language use. To characterize -a linguistic level L, a case of semigrammaticalness of a different sort -is, apparently, determined by a descriptive fact. - - - - -Clearly, the descriptive power of the base component is necessary to -impose an interpretation on the levels of acceptability from fairly high -(e.g. (99a)) to virtual gibberish (e.g. (98d)). Thus most of the -methodological work in modern linguistics cannot be arbitrary in the -requirement that branching is not tolerated within the dominance scope -of a complex symbol. We will bring evidence in favor of the following -thesis: this analysis of a formative as a pair of sets of features is -unspecified with respect to nondistinctness in the sense of distinctive -feature theory. Nevertheless, this selectionally introduced contextual -feature can be defined in such a way as to impose the ultimate standard -that determines the accuracy of any proposed grammar. To provide a -constituent structure for T(Z,K), a case of semigrammaticalness of a -different sort is not quite equivalent to the system of base rules -exclusive of the lexicon. - - - - - -Clearly, the descriptive power of the base component is not subject to -the system of base rules exclusive of the lexicon. It appears that the -appearance of parasitic gaps in domains relatively inaccessible to -ordinary extraction does not readily tolerate the traditional practice -of grammarians. To provide a constituent structure for T(Z,K), a subset -of English sentences interesting on quite independent grounds is -necessary to impose an interpretation on an abstract underlying order. -Presumably, the notion of level of grammaticalness delimits a corpus of -utterance tokens upon which conformity has been defined by the paired -utterance test. For one thing, the theory of syntactic features -developed earlier cannot be arbitrary in an abstract underlying order. - - - -To provide a constituent structure for T(Z,K), the systematic use of -complex symbols does not readily tolerate nondistinctness in the sense -of distinctive feature theory. This suggests that the natural general -principle that will subsume this case is not quite equivalent to the -levels of acceptability from fairly high (e.g. (99a)) to virtual -gibberish (e.g. (98d)). With this clarification, relational information -is not subject to a general convention regarding the forms of the -grammar. In the discussion of resumptive pronouns following (81), the -speaker-hearer's linguistic intuition can be defined in such a way as to -impose nondistinctness in the sense of distinctive feature theory. On -the other hand, the appearance of parasitic gaps in domains relatively -inaccessible to ordinary extraction is not quite equivalent to a -stipulation to place the constructions into these various categories. - - - - - -Note that this selectionally introduced contextual feature can be -defined in such a way as to impose the ultimate standard that determines -the accuracy of any proposed grammar. To provide a constituent -structure for T(Z,K), the theory of syntactic features developed earlier -is rather different from an important distinction in language use. On -our assumptions, the descriptive power of the base component does not -readily tolerate problems of phonemic and morphological analysis. -Summarizing, then, we assume that most of the methodological work in -modern linguistics does not affect the structure of the ultimate -standard that determines the accuracy of any proposed grammar. It must -be emphasized, once again, that the systematic use of complex symbols -is, apparently, determined by the system of base rules exclusive of the -lexicon. - - - -A consequence of the approach just outlined is that the notion of level -of grammaticalness is not to be considered in determining the system of -base rules exclusive of the lexicon. If the position of the trace in -(99c) were only relatively inaccessible to movement, the systematic use -of complex symbols appears to correlate rather closely with -nondistinctness in the sense of distinctive feature theory. With this -clarification, the appearance of parasitic gaps in domains relatively -inaccessible to ordinary extraction is not subject to a parasitic gap -construction. Conversely, the systematic use of complex symbols is -unspecified with respect to a corpus of utterance tokens upon which -conformity has been defined by the paired utterance test. In the -discussion of resumptive pronouns following (81), the earlier discussion -of deviance does not affect the structure of problems of phonemic and -morphological analysis. - - - - - diff --git a/z3c/rml/tests/input/rml-examples-031-japanese.rml b/z3c/rml/tests/input/rml-examples-031-japanese.rml deleted file mode 100644 index 42128cdf..00000000 --- a/z3c/rml/tests/input/rml-examples-031-japanese.rml +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -Japanese Language Tests -This test tries to display Japanese characters in several realistic situations. We'll start with a paragraph: - -Basic output and text alignment - -says "Hilton Tokyo:" ヒルトンæ±äº¬ - -Gatwick Name: ヒルトン・ロンドン・ガトウィック・エアãƒãƒ¼ãƒˆ - - - - - -The words below the title at the top should be right-aligned with the frame border. -If not, we've got our string widths wrong. If too far into the page, likelihood is -we are counting bytes not characters. Similar things apply to the paragraph below -whose Japanese portion should be underlined and right-aligned; if the underline is different in length -and text does not run to edge, we goofed. - - -begin 日本語ã¯é›£ã—ã„ã§ã™ã­ end - - -Text wrapping - - -Gatwick Description: ガトウィック空港ã¨é€£çµ¡é€šè·¯ã§ç›´çµã•れã¦ã„る唯一ã®ãƒ›ãƒ†ãƒ«ã§ã‚る当ホテルã¯ã€è¡—ã®ä¸­å¿ƒéƒ¨ã‹ã‚‰30分ã®å ´æ‰€ã«ã”ã–ã„ã¾ã™ã€‚全客室ã«é«˜é€Ÿã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆç’°å¢ƒã‚’完備ã—ã¦ãŠã‚Šã¾ã™ã€‚ファミリールームã¯5åæ§˜ã¾ã§ãŠæ³Šã‚Šã„ãŸã ã‘ã¾ã™ã€‚ã¾ãŸã€ã‚¨ã‚°ã‚¼ã‚¯ãƒ†ã‚£ãƒ–ルームã®ãŠå®¢æ§˜ã¯ã€ã‚¨ã‚°ã‚¼ã‚¯ãƒ†ã‚£ãƒ–ラウンジをã”利用ã„ãŸã ã‘ã¾ã™ã€‚事å‰ã«ã”予約ã„ãŸã ã‘るタイムトゥフライ・パッケージã«ã¯ã€ç©ºæ¸¯ã®é§è»Šæ–™é‡‘ãŒå«ã¾ã‚Œã¦ãŠã‚Šã¾ã™ã€‚ - - -Other contexts - -There are some other non-paragraph contexts for text display - -drawing strings directly, and placing strings (not paragraphs) in table cells. The title -at the top should have a ® symbol at the right, and all three should appear in -the table below: - - - - - - - - Symbol NameDisplays - Copyright© - Registered® - Trademark™ - Tokyo (as entities)東京 - Tokyo (au naturelle)æ±äº¬ - - - -Charts -Drawing source should be Nikkei - - - HeiseiMin-W3 - source: æ—¥æœ¬çµŒæ¸ˆæ–°èž - - - -This should split over the page break onto page two - - -ガトウィック空港ã¨é€£çµ¡é€šè·¯ã§ç›´çµã•れã¦ã„る唯一ã®ãƒ›ãƒ†ãƒ«ã§ã‚る当ホテルã¯ã€è¡—ã®ä¸­å¿ƒéƒ¨ã‹ã‚‰30分ã®å ´æ‰€ã«ã”ã–ã„ã¾ã™ã€‚全客室ã«é«˜é€Ÿã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆç’°å¢ƒã‚’完備ã—ã¦ãŠã‚Šã¾ã™ã€‚ファミリールームã¯5åæ§˜ã¾ã§ãŠæ³Šã‚Šã„ãŸã ã‘ã¾ã™ã€‚ã¾ãŸã€ã‚¨ã‚°ã‚¼ã‚¯ãƒ†ã‚£ãƒ–ルームã®ãŠå®¢æ§˜ã¯ã€ã‚¨ã‚°ã‚¼ã‚¯ãƒ†ã‚£ãƒ–ラウンジをã”利用ã„ãŸã ã‘ã¾ã™ã€‚事å‰ã«ã”予約ã„ãŸã ã‘るタイムトゥフライ・パッケージã«ã¯ã€ç©ºæ¸¯ã®é§è»Šæ–™é‡‘ãŒå«ã¾ã‚Œã¦ãŠã‚Šã¾ã™ã€‚ - -Text After - - -Table - - - - - - - - - - diff --git a/z3c/rml/tests/input/rml-examples-032-images.rml b/z3c/rml/tests/input/rml-examples-032-images.rml deleted file mode 100644 index 75a8a1fc..00000000 --- a/z3c/rml/tests/input/rml-examples-032-images.rml +++ /dev/null @@ -1,106 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -Image Functionality -This tries out some new features of images. - -PDF files as images - - -PDF files (or their pagecatcherised pals, .data files) can be used just like images. Below -you should see a few little internet access icons; zoom in and you'll see they are vector. The original -PDF is 1296x1296, so the rubbish at top right of the page is the unscaled one being drawn in the illustration below at (0,0). - - - - - - - - - - - - - -The preserveAspectRatio flag lets you place your image in a box and it will be centered intelligently, -touching either the sides or the top depending on its own aspect ratio. - -The anchor attribute lets you determine which part of the image corresponds to the given x and y. -You can choose an anchor from the standard compass points. - - - nw43 43 47 47 43 47 47 43 - n43 43 47 47 43 47 47 43 - ne43 43 47 47 43 47 47 43 - - - w43 43 47 47 43 47 47 43 - c43 43 47 47 43 47 47 43 - e43 43 47 47 43 47 47 43 - - - sw43 43 47 47 43 47 47 43 - s43 43 47 47 43 47 47 43 - se43 43 47 47 43 47 47 43 - - - - - -First attempt to place an image which has an artbox. We have created a PDF with MediaBox (the usual size measure) approx 300x400 points, -and a 100x100 circle in top right corner, and instructed RML to draw it in a box of half size. This seems to work. - -Now we try to place it with the art box. The blue should leak out horribly to left and below, but the red circle should -end up elliptical within the box. (In real life, the art box defines the 'area of interest' and there would be no stuff outside it). This isn't working yet. Also, -we get an extraneous boundary box from drawPdfImage appearing at top right - shifted the wrong way. - - - - - - - - - - - diff --git a/z3c/rml/tests/input/rml-examples-034-cmyk.rml b/z3c/rml/tests/input/rml-examples-034-cmyk.rml deleted file mode 100644 index 19efd507..00000000 --- a/z3c/rml/tests/input/rml-examples-034-cmyk.rml +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - This is a test of CMYK support. - - The four swatches above should be in the CMYK primaries, and the paragraph carefully - declares the text color to be process black (k=1). - - - This is cmyk white text on cmyk black rectangle - - - - - - - Hello World - - - This is rgb white text on rgb black rectangle - - - - - - - Hello World - - - This is rgb white text on cmyk black rectangle - - - - - - - Hello World - - - This is cmyk white text on rgb black rectangle - - - - - - - Hello World - - - - diff --git a/z3c/rml/tests/input/rml-examples-035-numbering.rml b/z3c/rml/tests/input/rml-examples-035-numbering.rml deleted file mode 100644 index 5226f44e..00000000 --- a/z3c/rml/tests/input/rml-examples-035-numbering.rml +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - - - - -RML (Report Markup Language) is ReportLab's own language for specifying the appearance of a printed page, which is converted into PDF by the utility rml2pdf. -
              -These RML samples showcase techniques and features for generating various types of ouput and are distributed within our commercial package as test cases. Each should be self explanatory and stand alone. - - - - -
              - - - -Demo of sequencing tag for multi-level numbering - - This initial paragraph doesn't have any numbers, but I've hidden in it a command to -"chain" together three level identifiers, so that whenever the level_1 number is ncremented, -the ones below it reset to 1. This needs to be done early and should really be allowed in -the docinit tag, but isn't yet. The tag looks like <seqChain order= "level1 level2 level_3"/> - - - - - - Heading. Lorem ipsum dolor sit amet.... This contains a tag to "get" the current - value of the level_1 counter, and increments it after display. The tag looks like <seq id="level_1">. - - - - - . Heading. Lorem ipsum dolor sit amet... - - - - . Another heading. Duis bibendum -urna ac.... In the paragraphs below we use two seq tags; the level 2 one is as you would expect and increments, bt the level 1 tag has -<seq id="level_1" inc="no">, meaning "do not increment". You can also pass in an integer, to increment by 0, 1 or something else entirely; you could count -down if you wanted to. - - - - - . Yet another -heading. Morbi laoreet magna sit amet... - - - . Yet another -heading. Morbi laoreet magna sit amet... - - - . Yet another -heading. Morbi laoreet magna sit amet... - - - - - . Back to outer level. Duis bibendum -urna ac... - - - - . Just for the hell of it, - jump ahead 5 at the inner level using inc="5".... Morbi laoreet magna sit amet... - - - . Yet another -heading. Morbi laoreet magna sit amet... - - -
              - -
              diff --git a/z3c/rml/tests/input/rml-examples-036-numbering-contd.rml b/z3c/rml/tests/input/rml-examples-036-numbering-contd.rml deleted file mode 100644 index f5cc5f9e..00000000 --- a/z3c/rml/tests/input/rml-examples-036-numbering-contd.rml +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - - - - - - - - - - -RML (Report Markup Language) is ReportLab's own language for specifying the appearance of a printed page, which is converted into PDF by the utility rml2pdf. -
              -These RML samples showcase techniques and features for generating various types of ouput and are distributed within our commercial package as test cases. Each should be self explanatory and stand alone. - - - - -
              -Demo of sequencing tag for multi-level numbering - -This is to check we re-initialise the sequence at the start of each document. -If the numbers start 5,6,7... we're in trouble. - - - - Heading. Lorem ipsum dolor sit amet.... This contains a tag to "get" the current - value of the level_1 counter, and increments it after display. The tag looks like <seq id="level_1">. - - - - - . Heading. Lorem ipsum dolor sit amet... - - - - . Another heading. Duis bibendum -urna ac.... In the paragraphs below we use two seq tags; the level 2 one is as you would expect and increments, bt the level 1 tag has -<seq id="level_1" inc="no">, meaning "do not increment". You can also pass in an integer, to increment by 0, 1 or something else entirely; you could count -down if you wanted to. - - - - - . Yet another -heading. Morbi laoreet magna sit amet... - - - . Yet another -heading. Morbi laoreet magna sit amet... - - - . Yet another -heading. Morbi laoreet magna sit amet... - - - - - . Back to outer level. Duis bibendum -urna ac... - - - - . Just for the hell of it, - jump ahead 5 at the inner level using inc="5".... Morbi laoreet magna sit amet... - - - . Yet another -heading. Morbi laoreet magna sit amet... - - -
              - -
              diff --git a/z3c/rml/tests/input/rml-examples-037-plugingraphic.rml b/z3c/rml/tests/input/rml-examples-037-plugingraphic.rml deleted file mode 100644 index 4f95bb8b..00000000 --- a/z3c/rml/tests/input/rml-examples-037-plugingraphic.rml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - RML Example 38: Plugingraphic - - - -n=4,x="1in",y="7in",name="StarFive",dx="15pt",dy="0",size="10pt",fillColor="red",strokeColor="blue",strokeWidth="1.5pt" -n=5,x="2in",y="8in",name="StarFive",dx="20pt",dy="0",size="25pt",fillColor="blue",strokeColor="red",strokeWidth="0.5pt" -n=7,x="3in",y="9in",name="StarFive",dx="17",dy="0",size="12",fillColor="purple",strokeColor="none" - - diff --git a/z3c/rml/tests/input/rml-examples-038-rect-href.rml b/z3c/rml/tests/input/rml-examples-038-rect-href.rml deleted file mode 100644 index ac5bcb7e..00000000 --- a/z3c/rml/tests/input/rml-examples-038-rect-href.rml +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - -RML (Report Markup Language) is ReportLab's own language for specifying the appearance of a printed page, which is converted into PDF by the utility rml2pdf. -
              -These RML samples showcase techniques and features for generating various types of ouput and are distributed within our commercial package as test cases. Each should be self explanatory and stand alone. - - - - -
              - -Testing rectangles with links and destinations -This tests that rectangles with hyperlinks -and internal destinations. The top left of the page should have a blue link positioned in -absolute coordinates, and licking it should go to http://www.google.com/. The cyan rectangle -next to it should take you to page 3. - - - -The left one below should be pink, and should take you to http://www.yahoo.com/ . The red one should go to the back page. - - - - - - - - - Lots of tags now have href or destination attributes - rectangles, -table rows, table cells and so on. - - -We now fill the document with rubbish to take us forwards to the final page 3 - - -This is the last page. This is a destination for some of the buttons on page 1. - -
              - -
              diff --git a/z3c/rml/tests/input/rml-examples-039-doc-programming.rml b/z3c/rml/tests/input/rml-examples-039-doc-programming.rml deleted file mode 100644 index a640d760..00000000 --- a/z3c/rml/tests/input/rml-examples-039-doc-programming.rml +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - - - - - - - - - - -RML (Report Markup Language) is ReportLab's own language for specifying the appearance of a printed page, which is converted into PDF by the utility rml2pdf. -
              -These RML samples showcase techniques and features for generating various types of ouput and are distributed within our commercial package as test cases. Each should be self explanatory and stand alone. - - - - -
              - - Hello World. This is a normal paragraph. Blah IPO blah blah blah blah growth forecast blah -blah blah forecast blah.Blah blah blah blah blah blah blah blah blah blah blah profit blah blah blah blah blah -blah blah blah blah blah IPO.Blah blah blah blah blah blah blah reengineering blah growth blah blah blah -proactive direction strategic blah blah blah forward-thinking blah.Blah blah doubletalk blah blah blah blah -blah profit blah blah growth blah blah blah blah blah profit.Blah blah blah blah venture capital blah blah blah -blah blah forward-thinking blah. Here are some common characters &#x92; = ’ - - This is another normal paragraph. Blah IPO blah blah blah blah growth forecast blah -blah blah forecast blah.Blah blah blah blah blah blah blah blah blah blah blah profit blah blah blah blah blah -blah blah blah blah blah IPO.Blah blah blah blah blah blah blah reengineering blah growth blah blah blah -proactive direction strategic blah blah blah forward-thinking blah.Blah blah doubletalk blah blah blah blah -blah profit blah blah growth blah blah blah blah blah profit.Blah blah blah blah venture capital blah blah blah -blah blah forward-thinking blah. - - - I should NOT have a tiny leading space in front of me! - - This is spaced. There should be 12 points before and after. - Hello World. This is a normal paragraph. Blah IPO blah blah blah blah growth forecast blah -blah blah forecast blah.Blah blah blah blah blah blah blah blah blah blah blah profit blah blah blah blah blah -blah blah blah blah blah IPO.Blah blah blah blah blah blah blah reengineering blah growth blah blah blah -proactive direction strategic blah blah blah forward-thinking blah.Blah blah doubletalk blah blah blah blah -blah profit blah blah growth blah blah blah blah blah profit.Blah blah blah blah venture capital blah blah blah -blah blah forward-thinking blah. - - - - - - - - - The value of i is larger than 3 - - The value of i is not larger than to 3 - - - The value of i is equal to 3 - - The value of i is not equal to 3 - - - The value of i is less than 3 - - The value of i is not less than to 3 - - - - - - - - - - This is the thenPart - thenPart..... - - This is the elsePart - elsePart..... - - -Now we should be on page 3 - - -This should be on a template called autoNextTemplate - - -This should be on a template called autoFollow - - - -(2)This should be on a template called autoNextTemplate - - - -This should be on a template called main - - -
              - -
              diff --git a/z3c/rml/tests/input/rml-examples-040-colors.rml b/z3c/rml/tests/input/rml-examples-040-colors.rml deleted file mode 100644 index 976bc254..00000000 --- a/z3c/rml/tests/input/rml-examples-040-colors.rml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - - -RML (Report Markup Language) is ReportLab's own language for specifying the appearance of a printed page, which is converted into PDF by the utility rml2pdf. -
              -These RML samples showcase techniques and features for generating various types of ouput and are distributed within our commercial package as test cases. Each should be self explanatory and stand alone. - - - - -
              - This document briefly shows a few of the ways of declaring colors in RML. - This text should be red, declared with <font color="red"> - This text should be green, declared with <font color="#00ff00"> - This text should be blue, declared with <font color="(0.0,0.0,1.0)"> - -
              - -
              diff --git a/z3c/rml/tests/input/rml-examples-041-masking.rml b/z3c/rml/tests/input/rml-examples-041-masking.rml deleted file mode 100644 index 47c46903..00000000 --- a/z3c/rml/tests/input/rml-examples-041-masking.rml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - -RML (Report Markup Language) is ReportLab's own language for specifying the appearance of a printed page, which is converted into PDF by the utility rml2pdf. -
              -These RML samples showcase techniques and features for generating various types of ouput and are distributed within our commercial package as test cases. Each should be self explanatory and stand alone. - - - - -
              - - Hello World. This is a normal paragraph. Blah IPO blah blah blah blah growth forecast blah -blah blah forecast blah.Blah blah blah blah blah blah blah blah blah blah blah profit blah blah blah blah blah -blah blah blah blah blah IPO.Blah blah blah blah blah blah blah reengineering blah growth blah blah blah -proactive direction strategic blah blah blah forward-thinking blah.Blah blah doubletalk blah blah blah blah -blah profit blah blah growth blah blah blah blah blah profit.Blah blah blah blah venture capital blah blah blah -blah blah forward-thinking blah. - -
              - -
              diff --git a/z3c/rml/tests/input/rml-examples-042-longdoc.rml b/z3c/rml/tests/input/rml-examples-042-longdoc.rml deleted file mode 100644 index 21113fb9..00000000 --- a/z3c/rml/tests/input/rml-examples-042-longdoc.rml +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -RML (Report Markup Language) is ReportLab's own language for specifying the appearance of a printed page, which is converted into PDF by the utility rml2pdf. -
              -These RML samples showcase techniques and features for generating various types of ouput and are distributed within our commercial package as test cases. Each should be self explanatory and stand alone. - - - - -
              - - - -This test case is here to try out various features commonly found in a multi-chapter brochure of catalog. - - - - -This page has an undefined colour and chapter name. - - - -The Red Chapter -#FF0000 - -The red chapter -This is on page 3. The template should be red, but that's variable. - -More stuff in the red chapter. This should be indexed under 'red'. - - - - -The Green Chapter -#00FF00 - - -The green chapter -The template should be green, but that's variable. - -More stuff in the green chapter. - - -The Blue Chapter -#0000FF - - -The blue chapter -The template should be blue, but that's variable. - -More stuff in the blue chapter. - - - - - -
              -
              diff --git a/z3c/rml/tests/input/rml-examples-043-headings.rml b/z3c/rml/tests/input/rml-examples-043-headings.rml deleted file mode 100644 index cf06a979..00000000 --- a/z3c/rml/tests/input/rml-examples-043-headings.rml +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - -RML (Report Markup Language) is ReportLab's own language for specifying the appearance of a printed page, which is converted into PDF by the utility rml2pdf. -
              -These RML samples showcase techniques and features for generating various types of ouput and are distributed within our commercial package as test cases. Each should be self explanatory and stand alone. - - - - -
              - Headings test - You can customize heading styles like this: - - - - ]]> - -

              This is heading 1

              -

              This is heading 2

              -

              This is heading 3

              -

              This is heading 4

              -
              This is heading 5
              -
              This is heading 6
              - -

              This code is generated with folowing RML:

              - - This is heading 1]]> - This is heading 2]]> - This is heading 3]]> - This is heading 4]]> - This is heading 5]]> - This is heading 6]]> -
              -
              diff --git a/z3c/rml/tests/input/rml-examples-044-codesnippets.rml b/z3c/rml/tests/input/rml-examples-044-codesnippets.rml deleted file mode 100644 index f2949f63..00000000 --- a/z3c/rml/tests/input/rml-examples-044-codesnippets.rml +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - - - - - -RML (Report Markup Language) is ReportLab's own language for specifying the appearance of a printed page, which is converted into PDF by the utility rml2pdf. -
              -These RML samples showcase techniques and features for generating various types of ouput and are distributed within our commercial package as test cases. Each should be self explanatory and stand alone. - - - - -
              - Code snippets test - Python has a code-highlighting package named 'Pygments'. Pygments is installed, you can generate colorized code snippets. If the sample below is in colour, you have it installed; otherwise, you can obtain it from pypi.python.org, or from the python-pygments package in Ubuntu. Pygments supports many, many different lexers. - - Here is the code to insert a Python snippet... - - ...]]> - - ...and here is some sample outout... - - - - -class code(MapNode): - def evaluate(self, tagname, sdict, pcontent, extra, context): - stylename = "pre.defaultStyle" - if sdict.has_key("style"): - stylename = sdict["style"] - if sdict.has_key("syntax"): - lang = sdict["syntax"] - - - #clean up the block of code prior to display. - - src = ''.join(map(str, pcontent)) - #split line ends, strip trailing space - - - lines = map(lambda x: x.rstrip(), src.split('\n')) - #generally we trim off up to one leading and trailing blank lines - #that's probably from indenting the XML - if lines[0] == '': - lines = lines[1:] - if lines[-1] == '': - lines = lines[:-1] - - -Now we'll show colourised XML: - - Foo bar! - -]]> - - -If you don't specify a language parameter (or if pygments cannot be imported), it won't get colourised. - - Foo bar! - -]]> - -Because your XML might be indented, by default we remove an initial or final blank line, and we also 'dedent' to remove any whitespace on the left of your code block. However, the default paragraph style selected adds an indent on the left side. - - -The one below specifies a different paragraph style, defined in our document, to add a coloured backdrop... - - -def my_function(arg): - foo, bar = do_stuff_to(arg) - return [bar, foo[0]] - - -
              -
              diff --git a/z3c/rml/tests/input/rml-examples-045-cmyk.rml b/z3c/rml/tests/input/rml-examples-045-cmyk.rml deleted file mode 100644 index 2661d589..00000000 --- a/z3c/rml/tests/input/rml-examples-045-cmyk.rml +++ /dev/null @@ -1,105 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -RML (Report Markup Language) is ReportLab's own language for specifying the appearance of a printed page, which is converted into PDF by the utility rml2pdf. -
              -These RML samples showcase techniques and features for generating various types of ouput and are distributed within our commercial package as test cases. Each should be self explanatory and stand alone. - - - - -
              - - - Tests of colour separated PDF output.. - - On screen, you'll see various blacks and shades of blue. The on-screen - appearance depends on CMYK equivalents you supply. - - If you open this document in Illustrator, Quark, Acrobat etc and check the - separations, there should be plates for black and for Pantone 288. The black/greys should be converted into - cmyk automatically. - - - - - - - - - - - - - - - The swatches above should fade from black to grey - 100% down to 25%. - - - - - - - - - - - - - - - The swatches above should be tints of Pantone 288 - 100% down to 25%. - - - Now we'll check the colours in a table - - - - BlackBlue - - - - - We can now pass colours through into substrings in paragraphs even - though that's handled by a different parser. - - -
              - -
              diff --git a/z3c/rml/tests/input/rml-examples-046-lists.rml b/z3c/rml/tests/input/rml-examples-046-lists.rml deleted file mode 100644 index e6885eac..00000000 --- a/z3c/rml/tests/input/rml-examples-046-lists.rml +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - -RML (Report Markup Language) is ReportLab's own language for specifying the appearance of a printed page, which is converted into PDF by the utility rml2pdf. -
              -These RML samples showcase techniques and features for generating various types of ouput and are distributed within our commercial package as test cases. Each should be self explanatory and stand alone. - - - - -
              - - -
                -
              1. A table with 5 rows
              2. -
              3. - - 1 - 2xx blah - 3xx xx blah blah - 4xx xx xx blah blah blah - 5xx xx xx xx blah blah blah blah - -
              4. -
              5. - A sublist -
              6. -
              7. -
                  -
                1. Another table with 3 rows
                2. -
                3. - - 1 - 2xx blah - 3xx xx blah blah - -
                4. -
                5. We have already seen that the notion of level of grammaticalness is, -apparently, determined by a corpus of utterance tokens upon which -conformity has been defined by the paired utterance test. If the -position of the trace in (99c) were only relatively inaccessible to -movement, a descriptively adequate grammar suffices to account for the -traditional practice of grammarians. Notice, incidentally, that this -analysis of a formative as a pair of sets of features cannot be -arbitrary in the strong generative capacity of the theory. -
                6. -
                -
              8. -
              9. - An unordered sublist -
              10. -
              11. -
                  -
                • A table with 2 rows
                • -
                • - - 1zz zz zz duh duh duh - 2yy yy yy yy duh duh duh duh - -
                • -
                • In the discussion of resumptive pronouns following (81), this -selectionally introduced contextual feature is to be regarded as a -parasitic gap construction. With this clarification, the systematic use -of complex symbols is not to be considered in determining a descriptive -fact. On our assumptions, the notion of level of grammaticalness is -necessary to impose an interpretation on the strong generative capacity -of the theory. It appears that a descriptively adequate grammar is not -subject to the requirement that branching is not tolerated within the -dominance scope of a complex symbol. Comparing these examples with -their parasitic gap counterparts in (96) and (97), we see that this -selectionally introduced contextual feature is rather different from a -parasitic gap construction. -
                • -
                -
              12. -
              13. - Of course, the systematic use of complex symbols raises serious doubts -about a stipulation to place the constructions into these various -categories. By combining adjunctions and certain deformations, the -natural general principle that will subsume this case is to be regarded -as a descriptive fact. This suggests that this analysis of a formative -as a pair of sets of features suffices to account for the requirement -that branching is not tolerated within the dominance scope of a complex -symbol. -
              14. -
              -
                -
              1. item should be A
              2. -
              3. item should be B
              4. -
              -
                -
              1. item should be 1
              2. -
              3. item should be 2
              4. -
              -
                -
              1. item should be ia second paragraph
              2. -
              3. item should be ii
              4. -
              -
                -
              1. item should be I
              2. -
              3. item should be IIanother paragraph
              4. -
              - -
                -
              • para 1
              • -
              • para 2another paragraph
              • -
              • para 3
              • -
              -
              -
              diff --git a/z3c/rml/tests/input/rml-examples-047-condPageBreak.rml b/z3c/rml/tests/input/rml-examples-047-condPageBreak.rml deleted file mode 100644 index 74be2331..00000000 --- a/z3c/rml/tests/input/rml-examples-047-condPageBreak.rml +++ /dev/null @@ -1,319 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - -RML (Report Markup Language) is ReportLab's own language for specifying the appearance of a printed page, which is converted into PDF by the utility rml2pdf. -
              -These RML samples showcase techniques and features for generating various types of ouput and are distributed within our commercial package as test cases. Each should be self explanatory and stand alone. - - - - -
              - - - KeepWithNext - - The keepWithNext attribute for the - paraStyle tag tells the paragraph, whether it should - always be kept together with the next paragraph or not. This can be useful for - keeping headings together with the following paragraph. The default value is 0. - The code looks as follows: - - - ]]> - - An example with keepWithNext="0". There is a - spacer underneath. - - This is paragraph 1 with the - keepWithNext="0" attribute. - This is paragraph 2. - - - An example with keepWithNext="1". There is a - spacer underneath - - This is paragraph 1, whose style has the - keepWithNext="1" attribute. - This is paragraph 2. - - - condPageBreak - - The <condPageBreak/> tag will move to - the next page if there is not enough space on the page. The length required to - stay on the same page is give by the attribute height - which takes a length in the allowed measurements. - - Blah blah blah blah blah blah Lieutenant - Commander Data Harry Kim blah - blah blah blah blah blah blah blah blah blah blah blah blah. Blah cloaking device - blah blah Lieutenant Commander Data blah Dr. Pulaski blah blah blah USS Enterprise - blah blah blah emergency transponder. Blah blah Ferrengi blah blah blah blah blah - blah blah blah blah blah blah. Blah blah blah blah blah Tom Paris Archer IV blah blah - Archer IV blah blah Soyuz class science vessel blah Betazoid blah blah blah blah - warship blah blah blah blah blah. Blah blah blah Lieutenant Worf blah blah Lieutenant - Worf Vulcan blah blah blah. Blah blah blah blah blah blah blah Tom Paris blah William - Riker blah blah blah blah blah blah blah Klingon blah Admiral Nakamura blah blah blah - blah blah. Blah blah blah blah blah blah blah Romulan ale blah blah blah asteroid - field blah blah blah blah blah blah blah blah. Blah blah blah blah blah Memory Alpha - blah blah blah blah blah blah blah. Blah blah blah Captain Picard blah blah Romulan - blah blah blah blah blah Admiral Nakamura blah blah. Blah blah blah blah blah blah - blah Starfleet Academy blah blah USS Intrepid blah blah blah blah blah blah blah blah - holodeck blah blah blah blah. Blah blah blah blah blah ...with a phaser! blah blah - blah blah blah Romulan Vulcan blah blah blah. Blah blah quantum flux blah blah blah - blah quantum flux Chief O'Brian blah blah blah blah blah blah blah blah blah. Blah - Counsellor Troi blah blah blah blah blah blah USS Intrepid blah blah blah blah blah - Captain Janeway blah asteroid field blah IKV Pagh blah blah. Blah blah blah blah blah - blah Betazoid blah blah blah blah blah IKV Pagh blah blah Captain Janeway blah blah - IKV Pagh. Blah photon torpedo blah blah blah blah blah blah photon torpedo blah blah - blah blah blah blah blah blah blah Ferrengi blah blah blah blah blah. Blah blah blah - blah United Federation of Planets blah blah blah blah blah blah blah Deep Space Nine - blah blah blah blah blah blah blah blah blah. Blah blah "Intruder alert!" Romulan - blah blah blah blah blah blah blah blah blah. Blah blah blah shuttlecraft Ferrengi - Vulcan blah blah blah blah blah blah Galaxy class vessel blah blah blah blah blah - blah blah. Blah turbolift blah blah scout ship cruiser blah quantum flux blah blah - blah blah blah blah blah blah blah blah blah blah blah William Riker blah blah blah. - Blah blah blah blah blah battlecruiser blah blah blah blah blah blah blah blah Dr. - Pulaski Pacifica blah blah blah blah blah blah turbolift. Blah blah blah Benzite blah - Bajoran blah blah "Borg Invasion imminent!" blah blah blah blah blah blah blah blah - blood wine. Blah emergency transponder blah Starfleet blah blah blah blah blah blah - blah blah blah blah blah blah blah blah blah shuttle bay 2 blah blah blah. Blah blah - blah blah blah blah blah blah distress signal blah spacedock blah Irumodic Syndrome - blah Romulan ale blah blah blah blah blah "All hands abandon ship! This is not a - drill!" blah blah blah blah blah. - The conditional page break comes in here and - is set for 3 inches. - - This is on the next page since there was less than three inches - till the end of the page. - - Blah blah blah blah blah blah Lieutenant - Commander Data Harry Kim blah - blah blah blah blah blah blah blah blah blah blah blah blah. Blah cloaking device - blah blah Lieutenant Commander Data blah Dr. Pulaski blah blah blah USS Enterprise - blah blah blah emergency transponder. Blah blah Ferrengi blah blah blah blah blah - blah blah blah blah blah blah. Blah blah blah blah blah Tom Paris Archer IV blah blah - Archer IV blah blah Soyuz class science vessel blah Betazoid blah blah blah blah - warship blah blah blah blah blah. Blah blah blah Lieutenant Worf blah blah Lieutenant - Worf Vulcan blah blah blah. Blah blah blah blah blah blah blah Tom Paris blah William - Riker blah blah blah blah blah blah blah Klingon blah Admiral Nakamura blah blah blah - blah blah. Blah blah blah blah blah blah blah Romulan ale blah blah blah asteroid - field blah blah blah blah blah blah blah blah. Blah blah blah blah blah Memory Alpha - blah blah blah blah blah blah blah. Blah blah blah Captain Picard blah blah Romulan - blah blah blah blah blah Admiral Nakamura blah blah. Blah blah blah blah blah blah - blah Starfleet Academy blah blah USS Intrepid blah blah blah blah blah blah blah blah - holodeck blah blah blah blah. Blah blah blah blah blah ...with a phaser! blah blah - blah blah blah Romulan Vulcan blah blah blah. Blah blah quantum flux blah blah blah - blah quantum flux Chief O'Brian blah blah blah blah blah blah blah blah blah. Blah - Counsellor Troi blah blah blah blah blah blah USS Intrepid blah blah blah blah blah - Captain Janeway blah asteroid field blah IKV Pagh blah blah. Blah blah blah blah blah - blah Betazoid blah blah blah blah blah IKV Pagh blah blah Captain Janeway blah blah - IKV Pagh. Blah photon torpedo blah blah blah blah blah blah photon torpedo blah blah - blah blah blah blah blah blah blah Ferrengi blah blah blah blah blah. Blah blah blah - blah United Federation of Planets blah blah blah blah blah blah blah Deep Space Nine - blah blah blah blah blah blah blah blah blah. Blah blah "Intruder alert!" Romulan - blah blah blah blah blah blah blah blah blah. Blah blah blah shuttlecraft Ferrengi - Vulcan blah blah blah blah blah blah Galaxy class vessel blah blah blah blah blah - blah blah. Blah turbolift blah blah scout ship cruiser blah quantum flux blah blah - blah blah blah blah blah blah blah blah blah blah blah William Riker blah blah blah. - Blah blah blah blah blah battlecruiser blah blah blah blah blah blah blah blah Dr. - Pulaski Pacifica blah blah blah blah blah blah turbolift. Blah blah blah Benzite blah - Bajoran blah blah "Borg Invasion imminent!" blah blah blah blah blah blah blah blah - blood wine. Blah emergency transponder blah Starfleet blah blah blah blah blah blah - blah blah blah blah blah blah blah blah blah shuttle bay 2 blah blah blah. Blah blah - blah blah blah blah blah blah distress signal blah spacedock blah Irumodic Syndrome - blah Romulan ale blah blah blah blah blah "All hands abandon ship! This is not a - drill!" blah blah blah blah blah. - The conditional page break comes in here - and is set for 3 inches. - - - This is at the bottom of the page since there are more than 3in - remaining. - - - frameBreakBefore and pageBreakBefore - - The frameBreakBefore and pageBeforeBreak are both attributes of the <paraStyle> tag. - The frameBreakBefore attribute causes - the new paragraph to go into the next frame, even if there is still space in the - current frame. The default value is 0. - The pageBreakBefore attribute causes the - new paragraph to go into the next page, even if there is still space in the current - frame, or if there are other frames remaining on the page. The default value is 0. - - - This is an example of frameBreakBefore. - The next paragraph will be in a new frame. - - This paragraph is in a new frame, since its style has the attribute - frameBreakBefore="1" - - This is an example of pageBreakBefore. - The next paragraph will be on a new page. - - - This paragraph is on a new page. It missed out the frame in - the lower right corner of the last page, since its style has pageBreakBefore="1" - - - allowWidows - - The allowWidows attribute, for the <paraStyle> tag, allows the - paragraph to have a widow, a line of text, separated from the rest of the paragraph, - at the end. The default value for allowWidows is 1. - - This is an example of allowWidows="1" - Blah blah blah blah SQL blah blah blah blah pizza - blah blah blah blah TeX blah blah blah blah blah. Blah Intercal blah blah blah blah - blah blah TeX OS/2 TFT display blah Linux blah blah blah blah crash! blah blah Sun - Microsystems blah Logo blah blah. Blah blah blah blah blah blah blah blah blah blah - VB Tcl/Tk Fortran blah blah blah awk blah blah blah. Blah blah blah blah blah blah - blah blah blah blah blah blah PGP TCP/IP blah blah blah. Blah cgi Modula-3 SQL blah - blah blah Delphi blah LISP blah BETA mailing lists blah. Blah blah blah blah - pepperoni pizza blah blah blah blah blah blah blah blah blah blah blah blah blah blah - monitor blah. Blah blah blah blah blah blah blah blah blah parallel languages blah - blah blah blah blah blah blah blah BEER! blah blah. Blah blah beer blah blah OpenGL - monitor blah blah blah blah. Blah blah blah blah blah blah blah blah blah blah blah - blah "illiterate programming" blah blah C: drive. Blah blah blah. - This example has a widow (the line above). - - - This is an example of allowWidows="0" - Blah blah blah blah SQL blah blah blah blah - pizza - blah blah blah blah TeX blah blah blah blah blah. Blah Intercal blah blah blah blah - blah blah TeX OS/2 TFT display blah Linux blah blah blah blah crash! blah blah Sun - Microsystems blah Logo blah blah. Blah blah blah blah blah blah blah blah blah blah - VB Tcl/Tk Fortran blah blah blah awk blah blah blah. Blah blah blah blah blah blah - blah blah blah blah blah blah PGP TCP/IP blah blah blah. Blah cgi Modula-3 SQL blah - blah blah Delphi blah LISP blah BETA mailing lists blah. Blah blah blah blah - pepperoni pizza blah blah blah blah blah blah blah blah blah blah blah blah blah blah - monitor blah. Blah blah blah blah blah blah blah blah blah parallel languages blah - blah blah blah blah blah blah blah BEER! blah blah. Blah blah beer blah blah OpenGL - monitor blah blah blah blah. Blah blah blah blah blah blah blah blah blah blah blah - blah "illiterate programming" blah blah C: drive. Blah blah blah. - This example does not have a widow, since - another line has been brought with it. - - allowOrphans - - The allowOrphans attribute allows the - paragraph to have an orphan, a line of text, left in the original frame, separated - from the rest of the paragraph. The default value is for this attribute is 0. - - This is an example of allowOrphans="0" - - There is no orphan below. - Blah blah blah blah SQL blah blah blah blah pizza blah blah blah - blah TeX blah blah blah blah blah. Blah Intercal blah blah blah blah blah blah TeX - OS/2 TFT display blah Linux blah blah blah blah crash! blah blah Sun Microsystems - Logo blah blah. Blah blah blah blah blah blah blah blah blah blah VB Tcl/Tk Fortran - blah blah blah awk blah blah blah. Blah blah blah blah blah blah blah blah blah blah - blah blah PGP TCP/IP blah blah blah. Blah cgi Modula-3 SQL blah blah blah Delphi blah - LISP blah BETA mailing lists blah. Blah blah blah blah pepperoni pizza blah blah blah - blah blah blah blah blah blah blah blah blah blah blah monitor blah. Blah blah blah - blah blah blah blah blah blah parallel languages blah blah blah blah blah blah blah - blah BEER! blah blah. Blah blah beer blah blah OpenGL monitor blah blah blah blah. - Blah blah Phys blah blah blah blah blah blah blah blah blah "illiterate programming" - blah blah C: drive. - - This is an example of allowOrphans="1" - - There is an orphan below. - Blah blah blah blah SQL blah blah blah blah pizza blah blah blah blah - TeX blah blah blah blah blah. Blah Intercal blah blah blah blah blah blah TeX OS/2 - TFT display blah Linux blah blah blah blah crash! blah blah Sun Microsystems blah - Logo blah blah. Blah blah blah blah blah blah blah blah blah blah VB Tcl/Tk Fortran - blah blah blah awk blah blah blah. Blah blah blah blah blah blah blah blah blah blah - blah blah PGP TCP/IP blah blah blah. Blah cgi Modula-3 SQL blah blah blah Delphi blah - LISP blah BETA mailing lists blah. Blah blah blah blah pepperoni pizza blah blah blah - blah blah blah blah blah blah blah blah blah blah blah monitor blah. Blah blah blah - blah blah blah blah blah blah parallel languages blah blah blah blah blah blah blah - blah BEER! blah blah. Blah blah beer blah blah OpenGL monitor blah blah blah blah. - Blah blah Phys blah blah blah blah blah blah blah blah blah "illiterate programming" - blah blah C: drive. - - - endDots - - The endDots attribute fills in the rest of the last line of the - paragraph with the characters given for the attribute. - - This paragraph should have dots following it until the end of the line. - - This paragraph should have the characters "123" following it until the end of the - line. -
              -
              diff --git a/z3c/rml/tests/input/rml-examples-048-paragraph-flow-controls.rml b/z3c/rml/tests/input/rml-examples-048-paragraph-flow-controls.rml deleted file mode 100644 index 56430d3b..00000000 --- a/z3c/rml/tests/input/rml-examples-048-paragraph-flow-controls.rml +++ /dev/null @@ -1,209 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - -RML (Report Markup Language) is ReportLab's own language for specifying the appearance of a printed page, which is converted into PDF by the utility rml2pdf. -
              -These RML samples showcase techniques and features for generating various types of ouput and are distributed within our commercial package as test cases. Each should be self explanatory and stand alone. - - - - -
              - - - - -Paragraph flow controls -One of the most common uses of RML is the creation of dynamic documents from raw content. However, variable content lengths can cause problems around page and frame breaks. RML has a number of built in features to deal with these. -keepTogether -The keepTogether tag may be wrapped around flowables and indicates that everything within should remain on the same frame. See below a paragraph WITHOUT a keepTogether tag enclosing it. Notice that the paragraph is allowed to overflow into the next frame: -Etiam fringilla faucibus libero, at bibendum risus luctus ac. Aliquam erat volutpat. Curabitur at odio non erat tincidunt semper. Proin pulvinar volutpat dolor, viverra blandit neque blandit in. Ut augue quam, vehicula et iaculis vitae, vehicula eu ligula. Aliquam erat volutpat. Donec ultrices magna vel massa rhoncus sed laoreet nunc posuere. Sed sed auctor felis. Vivamus lacinia sem sed mi molestie at malesuada velit consequat. Vestibulum malesuada mauris vel libero tempor hendrerit. Vivamus vel quam sem, sit amet tincidunt metus. Phasellus nibh turpis, varius et feugiat ac, pharetra id leo. In laoreet gravida lorem, sit amet laoreet mi pretium nec. Integer ultricies est at odio tincidunt gravida. Maecenas convallis tellus nec nisl volutpat volutpat. Mauris vel quam nibh, vel posuere justo. Proin sit amet felis convallis velit laoreet semper ut id felis. -Now see the exact same paragraph with <keepTogether> tags used. Note the entire paragraph goes together onto the next frame. - -Etiam fringilla faucibus libero, at bibendum risus luctus ac. Aliquam erat volutpat. Curabitur at odio non erat tincidunt semper. Proin pulvinar volutpat dolor, viverra blandit neque blandit in. Ut augue quam, vehicula et iaculis vitae, vehicula eu ligula. Aliquam erat volutpat. Donec ultrices magna vel massa rhoncus sed laoreet nunc posuere. Sed sed auctor felis. Vivamus lacinia sem sed mi molestie at malesuada velit consequat. Vestibulum malesuada mauris vel libero tempor hendrerit. Vivamus vel quam sem, sit amet tincidunt metus. Phasellus nibh turpis, varius et feugiat ac, pharetra id leo. In laoreet gravida lorem, sit amet laoreet mi pretium nec. Integer ultricies est at odio tincidunt gravida. Maecenas convallis tellus nec nisl volutpat volutpat. Mauris vel quam nibh, vel posuere justo. Proin sit amet felis convallis velit laoreet semper ut id felis. - -Using the tag <nextPage/> will now break to the next page - -keepWithNext -The keepWithNext attribute is assigned to paragraph styles and tells them to stay in the same frame as the following content. If subsequent content overflows, keepWithNext will cause the preceding paragraph to overflow as well. -Below is a paragraph heading that does NOT have keepWithNext turned on. It's styles are defined as below: - - ]]> - - -Note how the following paragraph of text (using keep together) overflows onto the next page without bringing the heading with it: -Heading with no "keep with next" - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vel nunc a purus ullamcorper fermentum id nec felis. Sed suscipit, elit quis bibendum gravida, mauris tortor iaculis justo, id pharetra neque nisi ut turpis. Nulla sit amet risus tortor. Integer congue ullamcorper nisi vitae elementum. Pellentesque eget justo nec lacus porta placerat. Sed nunc ligula, tempus nec ultrices non, posuere nec magna. Quisque laoreet magna sed erat congue euismod. Phasellus libero nisi, volutpat vel sagittis vel, dapibus sed neque. - -Now see the same example using keepWithNext. Note that the heading goes to the next frame with the following paragraph. -Heading with "keep with next" - -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Duis vel nunc a purus ullamcorper fermentum id nec felis. Sed suscipit, elit quis bibendum gravida, mauris tortor iaculis justo, id pharetra neque nisi ut turpis. Nulla sit amet risus tortor. Integer congue ullamcorper nisi vitae elementum. Pellentesque eget justo nec lacus porta placerat. Sed nunc ligula, tempus nec ultrices non, posuere nec magna. Quisque laoreet magna sed erat congue euismod. Phasellus libero nisi, volutpat vel sagittis vel, dapibus sed neque. - -We will use the <nextFrame/> tag this time to move on. Note that because we are on the last frame of the page, this has the same effect as <nextFrame/>. - -pageBreakBefore and frameBreakBefore -Paragraphs can also be given the attribute of pageBreakBefore, which will enforce a page break before rendering the content. See a heading below without this attribute. -Heading without a page break -And now one below with pageBreakBefore set. Not surprisingly, it appears on the next page. -Heading with a page break -A similar attribute allows for automatic frame breaks. See a normal heading below: -Normal heading -And now one with frameBreakBefore set -Heading (in the next frame) -<nextPage/> again. - -Widow control -Widows are single lines of text which overflow into the next frame. A paragraph style, allowWidows, can be set to "0" in order to prevent this from happening. See a paragraph below which allows a widow: -Etiam fringilla faucibus libero, at bibendum risus luctus ac. Aliquam erat volutpat. Curabitur at odio non erat tincidunt semper. Proin pulvinar volutpat dolor, viverra blandit neque blandit in. Ut augue quam, vehicula et iaculis vitae, vehicula eu ligula. Aliquam erat volutpat. Donec ultrices magna vel massa rhoncus sed laoreet nunc posuere. Sed sed auctor felis. Vivamus lacinia sem sed mi molestie at malesuada velit consequat. Vestibulum malesuada mauris vel libero tempor hendrerit. Vivamus vel quam sem, sit amet tincidunt metus. Phasellus nibh turpis, varius et feugiat ac, pharetra id leo. In laoreet gravida lorem, sit amet laoreet mi pretium nec. Integer ultricies est at odio tincidunt gravida. Maecenas convallis tellus nec nisl volutpat volutpat. Mauris vel quam nibh, vel posuere justo. Proin sit amet felis convallis velit laoreet semper ut id felis. Phasellus nibh turpis, varius et feugiat ac, pharetra id leo. In laoreet gravida lorem, sit amet laoreet mi pretium nec. Integer ultricies est at odio tincidunt gravida. Maecenas convallis tellus nec nisl volutpat volutpat. Pellentesque quis urna id neque adipiscing ultricies. Integer sem mauris, venenatis eget ornare vel, varius eu sapien. -Isn't that single line above ugly? -Let's try again with a new paragraph style whose settings prevent widows: -Etiam fringilla faucibus libero, at bibendum risus luctus ac. Aliquam erat volutpat. Curabitur at odio non erat tincidunt semper. Proin pulvinar volutpat dolor, viverra blandit neque blandit in. Ut augue quam, vehicula et iaculis vitae, vehicula eu ligula. Aliquam erat volutpat. Donec ultrices magna vel massa rhoncus sed laoreet nunc posuere. Sed sed auctor felis. Vivamus lacinia sem sed mi molestie at malesuada velit consequat. Vestibulum malesuada mauris vel libero tempor hendrerit. Vivamus vel quam sem, sit amet tincidunt metus. Phasellus nibh turpis, varius et feugiat ac, pharetra id leo. In laoreet gravida lorem, sit amet laoreet mi pretium nec. Integer ultricies est at odio tincidunt gravida. Maecenas convallis tellus nec nisl volutpat volutpat. Mauris vel quam nibh, vel posuere justo. Proin sit amet felis convallis velit laoreet semper ut id felis. Phasellus nibh turpis, varius et feugiat ac, pharetra id leo. In laoreet gravida lorem, sit amet laoreet mi pretium nec. Integer ultricies est at odio tincidunt gravida. Maecenas convallis tellus nec nisl volutpat volutpat. Pellentesque quis urna id neque adipiscing ultricies. Integer sem mauris, venenatis eget ornare vel, varius eu sapien. -As shown, allowWidows="0" means that a second line of text will overflow as well. - -Orphan control -Orphas are single lines of text which remain at the end of a frame. Unlike widows, orphan control is on by default and the allowOrphans tag can be used to turn it off. Let's put in a some sample text to get near the end of the paragraph -Etiam fringilla faucibus libero, at bibendum risus luctus ac. Aliquam erat volutpat. Curabitur at odio non erat tincidunt semper. Proin pulvinar volutpat dolor, viverra blandit neque blandit in. Ut augue quam, vehicula et iaculis vitae, vehicula eu ligula. Aliquam erat volutpat. Donec ultrices magna vel massa rhoncus sed laoreet nunc posuere. Sed sed auctor felis. Vivamus lacinia sem sed mi molestie at malesuada velit consequat. Vestibulum malesuada mauris vel libero tempor hendrerit. Vivamus vel quam sem, sit amet tincidunt metus. Phasellus nibh turpis, varius et feugiat ac, pharetra id leo. In laoreet gravida lorem, sit amet laoreet mi pretium nec. Integer ultricies est at odio tincidunt gravida. Maecenas convallis tellus nec nisl volutpat volutpat. Mauris vel quam nibh, vel posuere justo. -And now show that, with the normal paragraph style, orphans are not possible: -Etiam fringilla faucibus libero, at bibendum risus luctus ac. Aliquam erat volutpat. Curabitur at odio non erat tincidunt semper. Proin pulvinar volutpat dolor, viverra blandit neque blandit in. Ut augue quam, vehicula et iaculis vitae, vehicula eu ligula. Aliquam erat volutpat. Donec ultrices magna vel massa rhoncus sed laoreet nunc posuere. Sed sed auctor felis. Vivamus lacinia sem sed mi molestie at malesuada velit consequat. Vestibulum malesuada mauris vel libero tempor hendrerit. Vivamus vel quam sem, sit amet tincidunt metus. Phasellus nibh turpis, varius et feugiat ac, pharetra id leo. In laoreet gravida lorem, sit amet laoreet mi pretium nec. Integer ultricies est at odio tincidunt gravida. Maecenas convallis tellus nec nisl volutpat volutpat. Mauris vel quam nibh, vel posuere justo. Proin sit amet felis convallis velit laoreet semper ut id felis. Phasellus nibh turpis, varius et feugiat ac, pharetra id leo. In laoreet gravida lorem, sit amet laoreet mi pretium nec. Integer ultricies est at odio tincidunt gravida. Maecenas convallis tellus nec nisl volutpat volutpat. Pellentesque quis urna id neque adipiscing ultricies. Integer sem mauris, venenatis eget ornare vel, varius eu sapien. -Now let's try that again, copying the last frame exactly, but with a paragraph style with orphans allowed - -Orphan control -Orphas are single lines of text which remain at the end of a frame. Unlike widows, orphan control is on by default and the allowOrphans tag can be used to turn it off. Let's put in a some sample text to get near the end of the paragraph -Etiam fringilla faucibus libero, at bibendum risus luctus ac. Aliquam erat volutpat. Curabitur at odio non erat tincidunt semper. Proin pulvinar volutpat dolor, viverra blandit neque blandit in. Ut augue quam, vehicula et iaculis vitae, vehicula eu ligula. Aliquam erat volutpat. Donec ultrices magna vel massa rhoncus sed laoreet nunc posuere. Sed sed auctor felis. Vivamus lacinia sem sed mi molestie at malesuada velit consequat. Vestibulum malesuada mauris vel libero tempor hendrerit. Vivamus vel quam sem, sit amet tincidunt metus. Phasellus nibh turpis, varius et feugiat ac, pharetra id leo. In laoreet gravida lorem, sit amet laoreet mi pretium nec. Integer ultricies est at odio tincidunt gravida. Maecenas convallis tellus nec nisl volutpat volutpat. Mauris vel quam nibh, vel posuere justo. -And now show that, with the new paragraph style, orphans ARE possible: -Etiam fringilla faucibus libero, at bibendum risus luctus ac. Aliquam erat volutpat. Curabitur at odio non erat tincidunt semper. Proin pulvinar volutpat dolor, viverra blandit neque blandit in. Ut augue quam, vehicula et iaculis vitae, vehicula eu ligula. Aliquam erat volutpat. Donec ultrices magna vel massa rhoncus sed laoreet nunc posuere. Sed sed auctor felis. Vivamus lacinia sem sed mi molestie at malesuada velit consequat. Vestibulum malesuada mauris vel libero tempor hendrerit. Vivamus vel quam sem, sit amet tincidunt metus. Phasellus nibh turpis, varius et feugiat ac, pharetra id leo. In laoreet gravida lorem, sit amet laoreet mi pretium nec. Integer ultricies est at odio tincidunt gravida. Maecenas convallis tellus nec nisl volutpat volutpat. Mauris vel quam nibh, vel posuere justo. Proin sit amet felis convallis velit laoreet semper ut id felis. Phasellus nibh turpis, varius et feugiat ac, pharetra id leo. In laoreet gravida lorem, sit amet laoreet mi pretium nec. Integer ultricies est at odio tincidunt gravida. Maecenas convallis tellus nec nisl volutpat volutpat. Pellentesque quis urna id neque adipiscing ultricies. Integer sem mauris, venenatis eget ornare vel, varius eu sapien. -
              -
              diff --git a/z3c/rml/tests/input/rml-examples-049-pre.rml b/z3c/rml/tests/input/rml-examples-049-pre.rml deleted file mode 100644 index 98fef131..00000000 --- a/z3c/rml/tests/input/rml-examples-049-pre.rml +++ /dev/null @@ -1,98 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - RML (Report Markup Language) is ReportLab's own language for specifying the appearance of a printed page, which is converted into PDF by the utility rml2pdf. -
              - These RML samples showcase techniques and features for generating various types of ouput and are distributed within our commercial package as test cases. Each should be self explanatory and stand alone. - - - - -
              - Preformatted text test - Our pre tag can be used for printing simple blocks -of code. It respects whitespace and newlines, and will not normally attempt -to wrap your code. However, if your individual lines are too long, this can -overflow the width of the column and even run off the page. Three optional -attributes - maximumLineLength, splitCharacters and newLineCharacter - -can be used to do simple wrapping. maximumLineLength will force the text to -wrap. - -Note that this simply counts characters - it takes no account of -actual width on the page. The examples below wrap lines above a certain length -and add a '> ' to the start of the following line. -
              -class placePara(MapNode):
              -    SUPER = LazyPlaceParagraph
              -    def evaluate(self, tagname, sdict, pcontent, extra, context):
              -        localdict = sdict.copy()
              -        stylename = "para.defaultStyle"
              -        if localdict.has_key("style"):
              -            stylename = localdict["style"]
              -            del localdict["style"]
              -        bulletText = None
              -        if localdict.has_key("bulletText"):
              -            bulletText = localdict["bulletText"]
              -            del localdict["bulletText"]
              -        extraAttrs = dict(
              -                        placeX = readLength(localdict.pop('x'),context),
              -                        placeY = readLength(localdict.pop('y'),context),
              -                        placeWidth = readLength(localdict.pop('width','0'),context),
              -                        placeOrigin = localdict.pop('origin','page'),
              -                        placeAnchor = localdict.pop('anchor','sw'),
              -                        placeContext = context,
              -                        )
              -        return DeferredInitializationEx(self.SUPER, extraAttrs, ('para',localdict,pcontent,context), context[stylename], bulletText=bulletText)
              -
              -    def MyProcessContent(self, content, controller, context, overrides):
              -        return content  #tuple tree parser now in place
              -Controller["placePara"] = placePara()
              -
              - -
              - -
              diff --git a/z3c/rml/tests/input/rml-guide-example-01.rml b/z3c/rml/tests/input/rml-guide-example-01.rml deleted file mode 100644 index 82449549..00000000 --- a/z3c/rml/tests/input/rml-guide-example-01.rml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - Hello World. - - - diff --git a/z3c/rml/tests/input/rml-guide-example-02.rml b/z3c/rml/tests/input/rml-guide-example-02.rml deleted file mode 100644 index 8acf8222..00000000 --- a/z3c/rml/tests/input/rml-guide-example-02.rml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - This is the "story". This is the part of the RML document where - your text is placed. - - - It should be enclosed in "para" and "/para" tags to turn it into - paragraphs. - - - diff --git a/z3c/rml/tests/input/rml-guide-example-03.rml b/z3c/rml/tests/input/rml-guide-example-03.rml deleted file mode 100644 index 4f7c1384..00000000 --- a/z3c/rml/tests/input/rml-guide-example-03.rml +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - diff --git a/z3c/rml/tests/input/rml-guide-example-04.rml b/z3c/rml/tests/input/rml-guide-example-04.rml deleted file mode 100644 index 203bdc65..00000000 --- a/z3c/rml/tests/input/rml-guide-example-04.rml +++ /dev/null @@ -1,229 +0,0 @@ - - - - - - - - - - diff --git a/z3c/rml/tests/input/rml-guide-example-05.rml b/z3c/rml/tests/input/rml-guide-example-05.rml deleted file mode 100644 index 9aa08e45..00000000 --- a/z3c/rml/tests/input/rml-guide-example-05.rml +++ /dev/null @@ -1,141 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - -

              - -

              - - This is the contents for column one. - - - It uses the default style for paragraph. - - - Does it come out OK? - - - There now follows some random text to see how these paragraphs - look with longer content: - - - Blah blah morale blah benchmark blah blah blah blah blah blah - communication blah blah blah blah blah blah blah blah blah - blah stretch the envelope blah blah blah. - - - Blah blah blah blah blah blah blah blah blah blah blah blah - architect blah inter active backward-compatible blah blah blah - blah blah. Blah blah blah blah value-added. - - - Blah blah blah blah blah blah blah blah blah re-factoring - phase blah knowledge management blah blah. Blah blah blah blah - interactive blah vision statement blah. - - - Blah blah blah blah blah blah conceptualize blah downsize blah - blah blah blah. Blah blah blah blah blah blah blah blah blah - blah blah blah synergy client-centered vision statement. - - - Blah blah dysfunctional blah blah blah blah blah blah blah - appropriate blah blah blah blah blah blah blah blah - re-factoring go the extra mile blah blah blah blah. - - - -

              - -

              - - This is the contents for column two. - - - It uses the paragraph style we have called "body". - - - Does it come out OK? - - - There now follows some random text to see how these paragraphs - look with longer content: - - - Blah OS/2 blah blah blah blah coffee blah blah blah blah - Windows blah blah blah blah blah blah blah. Blah blah blah - blah blah blah blah Modula-3 blah blah blah. Blah blah bug - report blah blah blah blah blah memory blah blah TeX TCP/IP - SMTP blah blah. - - - Blah blah blah blah blah Em blah letterform blah blah blah - blah blah blah blah blah blah letterform blah blah. Blah blah - blah blah leader blah blah blah blah. - - - Blah blah blah blah blah uppercase blah blah right justified - blah blah blah flush-right blah blah blah. Blah blah blah blah - blah blah spot-colour blah Em. - - - Blah dingbat blah blah blah blah blah blah blah blah blah blah - blah blah blah blah blah. Blah blah blah blah blah drop-cap - blah blah blah blah blah blah blah. - -
              -
              diff --git a/z3c/rml/tests/input/rml-guide-example-06.rml b/z3c/rml/tests/input/rml-guide-example-06.rml deleted file mode 100644 index d55826ce..00000000 --- a/z3c/rml/tests/input/rml-guide-example-06.rml +++ /dev/null @@ -1,131 +0,0 @@ - - - - - - - - - - -

              - seq in seq, seqDefault and seqReset -

              - - copied: , , . - Reset. , , - . - -

              - simple use of seq -

              - - First seq: - - - Second seq: - - - - - We have just done a <seqReset/> - - - - First seq after seqReset: - - - second seq after seqReset: - - - - If you are going to use multiple seq tags, you need to use the "id" - attribute. - - -

              - Better use of seq -

              - - - We have just done a <seqDefault id="test"/> - - - - We have just done a <seqReset id="test"/> - - - - First seq: - - - Second seq: - - - - - We have just done a <seqReset id="test"/> - - - - First seq after seqReset: - - - second seq after seqReset: - - -

              - Using two seqs independently -

              - - - We have just done a <seqReset id="testOne"/> - - - - We have just done a <seqReset id="testTwo"/> - - - - First seq for testOne: - - - Second seq for testOne: - - - - First seq for testTwo: - - - Second seq for testTwo: - - - - - We have just done a <seqReset id="testOne"/> - - - - First seq after seqReset for testOne: - - - second seq after seqReset for testOne: - - - - First seq after seqReset for testTwo: - - - second seq after seqReset for testTwo: - - - - Notice how resetting testOne doesn't affect testTwo at all. - -
              - -
              diff --git a/z3c/rml/tests/input/rml-guide-example-07.rml b/z3c/rml/tests/input/rml-guide-example-07.rml deleted file mode 100644 index 4c7601a7..00000000 --- a/z3c/rml/tests/input/rml-guide-example-07.rml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - diff --git a/z3c/rml/tests/input/rml-guide-example-08.rml b/z3c/rml/tests/input/rml-guide-example-08.rml deleted file mode 100644 index 31d7ca85..00000000 --- a/z3c/rml/tests/input/rml-guide-example-08.rml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - 247 172 - 147 172 - 147 272 - 247 272 - 247 372 - 347 372 - 347 372 - 347 272 - 447 272 - 447 172 - 347 172 - 347 72 - - 267 572 - - 277 612 - - 147 585 147 687 297 792 - 447 687 447 585 317 612 - - 327 572 - - - diff --git a/z3c/rml/tests/input/rml-guide-example-09.rml b/z3c/rml/tests/input/rml-guide-example-09.rml deleted file mode 100644 index 6f3e4846..00000000 --- a/z3c/rml/tests/input/rml-guide-example-09.rml +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - Example 9 - - This is a page which shows you how illustrations, grids and the place - tag work. - - - - - - This is an illustration - - - The red circle you can see is an illustration, not a - pageGraphic. - - - - - - - - - So is the teal colored one. - - - These are all flowables in the story. - - - - - diff --git a/z3c/rml/tests/input/rml-guide-example-10.rml b/z3c/rml/tests/input/rml-guide-example-10.rml deleted file mode 100644 index 50d34cb6..00000000 --- a/z3c/rml/tests/input/rml-guide-example-10.rml +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Example 10 - colors and fonts in tables - - - - Cell 0,0 - Cell 1,0 - Cell 2,0 - Cell 3,0 - - - Cell 0,1 - Cell 1,1 - Cell 2,1 - Cell 3,1 - - - Cell 0,2 - Cell 1,2 - Cell 2,2 - Cell 3,2 - - - Cell 0,3 - Cell 1,3 - Cell 2,3 - Cell 3,3 - - - Cell 0,4 - Cell 1,4 - Cell 2,4 - Cell 3,4 - - - Cell 0,5 - Cell 1,5 - Cell 2,5 - Cell 3,5 - - - Cell 0,6 - Cell 1,6 - Cell 2,6 - Cell 3,6 - - - - diff --git a/z3c/rml/tests/input/rml-guide-example-11.rml b/z3c/rml/tests/input/rml-guide-example-11.rml deleted file mode 100644 index 39469d27..00000000 --- a/z3c/rml/tests/input/rml-guide-example-11.rml +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Example 11 - lines and alignment in tables - - - - (a=LEFT)(VA=TOP) - (VA=TOP) - (VA="TOP") - (a=RIGHT)(VA=TOP) - - - (a=LEFT) - 1,1 - Cell 2,1 - (a=RIGHT) - - - (a=LEFT) - 1,2 - (VA=MIDDLE) - (a=RIGHT) - - - (a=LEFT) - 1,3 - (VA=MIDDLE) - (VA=MDL)(a=RIGHT) - - - (a=LEFT) - 1,4 - 2,4 - (a=RIGHT) - - - (a=LEFT) - 1,5 - 2,5 - (a=RIGHT) - - - (a=LEFT) - 1,6 - 2,6 - (a=RIGHT) - - - - - a=value for blockAlignment - VA=value for blockValign - MDLE=MIDDLE for VA in cells 3,2 and 3,3 - - - diff --git a/z3c/rml/tests/input/rml-guide-example-12.rml b/z3c/rml/tests/input/rml-guide-example-12.rml deleted file mode 100644 index 97714e18..00000000 --- a/z3c/rml/tests/input/rml-guide-example-12.rml +++ /dev/null @@ -1,238 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Example 12 - images and padding in tables - - - - - - - - - - 0 0 141 0 - 141 0 141 90 - 141 90 0 90 - 0 90 0 0 - - - - - - - - - 0 0 141 0 - 141 0 141 90 - 141 90 0 90 - 0 90 0 0 - - - - - - - - - 0 0 141 0 - 141 0 141 90 - 141 90 0 90 - 0 90 0 0 - - - - - - - - blockLeftPadding with blockBottomPadding - - - - - just blockBottomPadding - - - - - blockRightPadding with blockBottomPadding - - - - - - - - - - 0 0 141 0 - 141 0 141 90 - 141 90 0 90 - 0 90 0 0 - - - - - - - - - 0 0 141 0 - 141 0 141 90 - 141 90 0 90 - 0 90 0 0 - - - - - - - - - 0 0 141 0 - 141 0 141 90 - 141 90 0 90 - 0 90 0 0 - - - - - - - - blockLeftPadding with blockTopPadding - - - - - just blockTopPadding - - - - - blockRightPadding with blockTopPadding - - - - - - - - - - 0 0 141 0 - 141 0 141 90 - 141 90 0 90 - 0 90 0 0 - - - - - - - - - 0 0 141 0 - 141 0 141 90 - 141 90 0 90 - 0 90 0 0 - - - - - - - - - 0 0 141 0 - 141 0 141 90 - 141 90 0 90 - 0 90 0 0 - - - - - - - - blockLeftPadding with blockTopPadding - - - - - no padding - - - - - blockRightPadding with blockBottomPadding - - - - - - diff --git a/z3c/rml/tests/input/simple-layout.rml b/z3c/rml/tests/input/simple-layout.rml deleted file mode 100644 index 5c30fe46..00000000 --- a/z3c/rml/tests/input/simple-layout.rml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - Hello World! - - - diff --git a/z3c/rml/tests/input/special-text.rml b/z3c/rml/tests/input/special-text.rml deleted file mode 100644 index 80dd8d6e..00000000 --- a/z3c/rml/tests/input/special-text.rml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - Para thinks: Page number: , Total pages: , Added together: + - - - - No tags supported in plain td: , , 1 + 1, etc. - - - - - - Nothing else on this line: - - - 5 + 7 - - - Success: - - - - - This is just a page to push up the page number - - - - - diff --git a/z3c/rml/tests/input/strapline.png b/z3c/rml/tests/input/strapline.png deleted file mode 100644 index 606532b6..00000000 Binary files a/z3c/rml/tests/input/strapline.png and /dev/null differ diff --git a/z3c/rml/tests/input/symbols-set.rml b/z3c/rml/tests/input/symbols-set.rml deleted file mode 100644 index 34702a32..00000000 --- a/z3c/rml/tests/input/symbols-set.rml +++ /dev/null @@ -1,523 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - ZapfDingbats (and friends) Character Set - - - - Num - Char - Symb - - - 32 - - - - - 33 - ! - ! - - - 34 - " - " - - - 35 - # - # - - - 36 - $ - $ - - - 37 - % - % - - - 38 - & - & - - - 39 - ' - ' - - - 40 - ( - ( - - - 41 - ) - ) - - - 42 - * - * - - - 43 - + - + - - - 44 - , - , - - - 45 - - - - - - - 46 - . - . - - - 47 - / - / - - - 48 - 0 - 0 - - - 49 - 1 - 1 - - - 50 - 2 - 2 - - - 51 - 3 - 3 - - - 52 - 4 - 4 - - - 53 - 5 - 5 - - - 54 - 6 - 6 - - - 55 - 7 - 7 - - - 56 - 8 - 8 - - - 57 - 9 - 9 - - - 58 - : - : - - - 59 - ; - ; - - - 60 - < - < - - - 61 - = - = - - - 62 - > - > - - - 63 - ? - ? - - - 64 - @ - @ - - - 65 - A - A - - - 66 - B - B - - - 67 - C - C - - - 68 - D - D - - - 69 - E - E - - - 70 - F - F - - - 71 - G - G - - - 72 - H - H - - - 73 - I - I - - - 74 - J - J - - - 75 - K - K - - - 76 - L - L - - - 77 - M - M - - - 78 - N - N - - - 79 - O - O - - - 80 - P - P - - - 81 - Q - Q - - - 82 - R - R - - - 83 - S - S - - - 84 - T - T - - - 85 - U - U - - - 86 - V - V - - - 87 - W - W - - - 88 - X - X - - - 89 - Y - Y - - - 90 - Z - Z - - - 91 - [ - [ - - - 92 - \ - \ - - - 93 - ] - ] - - - 94 - ^ - ^ - - - 95 - _ - _ - - - 96 - ` - ` - - - 97 - a - a - - - 98 - b - b - - - 99 - c - c - - - 100 - d - d - - - 101 - e - e - - - 102 - f - f - - - 103 - g - g - - - 104 - h - h - - - 105 - i - i - - - 106 - j - j - - - 107 - k - k - - - 108 - l - l - - - 109 - m - m - - - 110 - n - n - - - 111 - o - o - - - 112 - p - p - - - 113 - q - q - - - 114 - r - r - - - 115 - s - s - - - 116 - t - t - - - 117 - u - u - - - 118 - v - v - - - 119 - w - w - - - 120 - x - x - - - 121 - y - y - - - 122 - z - z - - - 123 - { - { - - - 124 - | - | - - - 125 - } - } - - - 126 - ~ - ~ - - - - diff --git a/z3c/rml/tests/input/tag-addMapping.rml b/z3c/rml/tests/input/tag-addMapping.rml deleted file mode 100644 index 5a4a69c2..00000000 --- a/z3c/rml/tests/input/tag-addMapping.rml +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - By default, a document will use the font 'times', which is the font of - this sentence. - - - With 'addMapping' we map the bold form of 'times' to use the font - 'Vera'. So we get the next line: - - - This line should appear in font 'Vera' - - - - diff --git a/z3c/rml/tests/input/tag-alias.rml b/z3c/rml/tests/input/tag-alias.rml deleted file mode 100644 index 31e43b71..00000000 --- a/z3c/rml/tests/input/tag-alias.rml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - <font face="Courier"><alias></font> Tag Demo - Header 1 via Alias - - - diff --git a/z3c/rml/tests/input/tag-barChart.rml b/z3c/rml/tests/input/tag-barChart.rml deleted file mode 100644 index ed484ed4..00000000 --- a/z3c/rml/tests/input/tag-barChart.rml +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - - - - - Bar Chart Demo - - - - - - - - - - - Category 1 - Category 2 - Category 3 - Category 4 - - - - - - - 100 110 120 130 - 70 80 85 90 - - - - - - - - Category 1 - Category 2 - Category 3 - Category 4 - - - - - - - 100 110 120 130 - 70 80 85 90 - - - - - diff --git a/z3c/rml/tests/input/tag-barChart3d.rml b/z3c/rml/tests/input/tag-barChart3d.rml deleted file mode 100644 index f4c4b09e..00000000 --- a/z3c/rml/tests/input/tag-barChart3d.rml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - 3-D Bar Chart Demo - - - - - - - - - - - Category 1 - Category 2 - Category 3 - Category 4 - - - - - - - 100 110 120 130 - 70 80 85 90 - - - - - - - - Category 1 - Category 2 - Category 3 - Category 4 - - - - - - - 100 110 120 130 - 70 80 85 90 - - - - - diff --git a/z3c/rml/tests/input/tag-barCodeFlowable.rml b/z3c/rml/tests/input/tag-barCodeFlowable.rml deleted file mode 100644 index e7bff804..00000000 --- a/z3c/rml/tests/input/tag-barCodeFlowable.rml +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - - - - "barCodeFlowable" Tag Demo - - Code 128 - - - - - Code 128 with several options - - - - - Standard 93 - - - - - Standard 93 with several options - - - - - Extended 93 - - - - - Extended 93 with several options - - - - - Standard 39 - - - - - Standard 39 with several options - - - - - - Extended 39 - - - - - Extended 39 with several options - - - - - MSI - - - - - MSI with several options - - - - - Codabar - - - - - Codabar with several options - - - - - Code 11 - - - - - Code 11 with several options - - - - - - FIM - - - - - FIM with several options - - - - - Ean13 - - - - - Ean13 with several options - - - - - Ean8 - - - - - Ean8 with several options - - - - - - POSTNET - - - - - POSTNET with several options - - - - - QR - - - - - QR with several options - - - - - - diff --git a/z3c/rml/tests/input/tag-barcode.rml b/z3c/rml/tests/input/tag-barcode.rml deleted file mode 100644 index 9e491310..00000000 --- a/z3c/rml/tests/input/tag-barcode.rml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - barCode Tag Demo - - - - 23465092892 - - - - 217829804 - - - - 123456789012 - - - - diff --git a/z3c/rml/tests/input/tag-blockTable-1.rml b/z3c/rml/tests/input/tag-blockTable-1.rml deleted file mode 100644 index 8fa1520b..00000000 --- a/z3c/rml/tests/input/tag-blockTable-1.rml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - <font face="Courier"><blockTable></font> Tag Demo - - - This - is - - - a - blockTable. - - - - - diff --git a/z3c/rml/tests/input/tag-blockTable-10.rml b/z3c/rml/tests/input/tag-blockTable-10.rml deleted file mode 100644 index 8598a385..00000000 --- a/z3c/rml/tests/input/tag-blockTable-10.rml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - <font face="Courier"><blockTable></font> Tag Demo with Links - - - - Table on the next page. - - - - - - Google - TOP - - - - - diff --git a/z3c/rml/tests/input/tag-blockTable-2.rml b/z3c/rml/tests/input/tag-blockTable-2.rml deleted file mode 100644 index b7e66df7..00000000 --- a/z3c/rml/tests/input/tag-blockTable-2.rml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - <font face="Courier"><blockTable></font> Tag Demo - - - - - This is a more complex blocktable. - - - - - This is a more complex blocktable. - - - - - - - This is a more complex blockTable. - - - - - This is a more - complex blocktable. - - - - - - - diff --git a/z3c/rml/tests/input/tag-blockTable-3.rml b/z3c/rml/tests/input/tag-blockTable-3.rml deleted file mode 100644 index 24026add..00000000 --- a/z3c/rml/tests/input/tag-blockTable-3.rml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - <font face="Courier"><blockTable></font> Tag Demo - - - - - - This is a more complex blocktable. - - - - - This is a more complex blocktable. - - - - - - - This is a more complex blockTable. - - - - - This is a more - complex blocktable. - - - - - - - diff --git a/z3c/rml/tests/input/tag-blockTable-4.rml b/z3c/rml/tests/input/tag-blockTable-4.rml deleted file mode 100644 index 56c2fb58..00000000 --- a/z3c/rml/tests/input/tag-blockTable-4.rml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - <font face="Courier"><blockTable></font> Tag Demo - - - - 00 - 01 - 02 - 03 - 04 - - - 10 - 11 - 12 - 13 - 14 - - - 20 - 21 - 22 - 23 - 24 - - - 30 - 31 - 32 - 33 - 34 - - - - - diff --git a/z3c/rml/tests/input/tag-blockTable-5.rml b/z3c/rml/tests/input/tag-blockTable-5.rml deleted file mode 100644 index 2551afc7..00000000 --- a/z3c/rml/tests/input/tag-blockTable-5.rml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - <font face="Courier"><blockTable></font> Tag Demo - - - - 00 - 01 - 02 - 03 - 04 - - - 10 - 11 - 12 - 13 - 14 - - - 20 - 21 - 22 - 23 - 24 - - - 30 - 31 - 32 - 33 - 34 - - - - - diff --git a/z3c/rml/tests/input/tag-blockTable-6.rml b/z3c/rml/tests/input/tag-blockTable-6.rml deleted file mode 100644 index 7c52abba..00000000 --- a/z3c/rml/tests/input/tag-blockTable-6.rml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - <font face="Courier"><blockTable></font> Tag Demo - - - - 00 - 01 - 02 - 03 - 04 - - - 10 - 11 - 12 - 13 - 14 - - - 20 - 21 - 22 - 23 - 24 - - - 30 - 31 - 32 - 33 - 34 - - - - - diff --git a/z3c/rml/tests/input/tag-blockTable-7.rml b/z3c/rml/tests/input/tag-blockTable-7.rml deleted file mode 100644 index 5de2d4d6..00000000 --- a/z3c/rml/tests/input/tag-blockTable-7.rml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - <font face="Courier"><blockTable></font> Tag Demo - - - - Top -Left - - 02 - 03 - 04 - - - - - 12 - 13 - 14 - - - 20 - 21 - 22 - Bottom -Right - - - - 30 - 31 - 32 - - - - - - - diff --git a/z3c/rml/tests/input/tag-blockTable-8.rml b/z3c/rml/tests/input/tag-blockTable-8.rml deleted file mode 100644 index 0da98177..00000000 --- a/z3c/rml/tests/input/tag-blockTable-8.rml +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - <font face="Courier"><blockTable></font> Tag Demo - - This demo demonstrates setting styles via - <td> attributes. - - - - - 00 - 01 - 02 - 03 - 04 - - - 10 - 11 - 12 - 13 - 14 - - - 20 - 21 - 22 - 23 - 24 - - - 30 - 31 - 32 - 33 - 34 - - - - - diff --git a/z3c/rml/tests/input/tag-blockTable-9.rml b/z3c/rml/tests/input/tag-blockTable-9.rml deleted file mode 100644 index 4a064dbf..00000000 --- a/z3c/rml/tests/input/tag-blockTable-9.rml +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - <font face="Courier"><blockTable></font> Tag Demo - - - - 00 - 01 - 02 - 03 - 04 - - - 10 - 11 - 12 - 13 - 14 - - - 20 - 21 - 22 - 23 - 24 - - - 30 - 31 - 32 - 33 - 34 - - - - - - 00 - 01 - 02 - 03 - 04 - - - 10 - 11 - 12 - 13 - 14 - - - 20 - 21 - 22 - 23 - 24 - - - 30 - 31 - 32 - 33 - 34 - - - - - diff --git a/z3c/rml/tests/input/tag-blockTable-bulkData.rml b/z3c/rml/tests/input/tag-blockTable-bulkData.rml deleted file mode 100644 index cba89a52..00000000 --- a/z3c/rml/tests/input/tag-blockTable-bulkData.rml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - <font face="Courier"><bulkData></font> Tag Demo - - - - - - diff --git a/z3c/rml/tests/input/tag-blockTableStyle-2.rml b/z3c/rml/tests/input/tag-blockTableStyle-2.rml deleted file mode 100644 index 8744438b..00000000 --- a/z3c/rml/tests/input/tag-blockTableStyle-2.rml +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - <font face="Courier"><blockTableStyle></font> Tag Demo - - - This demo ensures that a table style can be applied multiple times. - - - - - 00 - 01 - 02 - 03 - 04 - 05 - - - 10 - 11 - 12 - 13 - 14 - 15 - - - 20 - 21 - 22 - 23 - 24 - 25 - - - 30 - 31 - 32 - 33 - 34 - 35 - - - 40 - 41 - 42 - 43 - 44 - 45 - - - - - - - - 00 - 01 - 02 - 03 - 04 - - - 10 - 11 - 12 - 13 - 14 - - - 20 - 21 - 22 - 23 - 24 - - - - - - diff --git a/z3c/rml/tests/input/tag-blockTableStyle-3.rml b/z3c/rml/tests/input/tag-blockTableStyle-3.rml deleted file mode 100644 index bfd54fbb..00000000 --- a/z3c/rml/tests/input/tag-blockTableStyle-3.rml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - Item1 - $1.00 - - - Item2 - $2.00 - - - - - Item3 - $3.00 - - - - - diff --git a/z3c/rml/tests/input/tag-blockTableStyle.rml b/z3c/rml/tests/input/tag-blockTableStyle.rml deleted file mode 100644 index 2fc7a220..00000000 --- a/z3c/rml/tests/input/tag-blockTableStyle.rml +++ /dev/null @@ -1,197 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - <font face="Courier"><blockTableStyle></font> Tag Demo - - - - 00 - 01 - 02 - 03 - 04 - - - 10 - 11 - 12 - 13 - 14 - - - 20 - 21 - 22 - 23 - 24 - - - 30 - 31 - 32 - 33 - 34 - - - - - - - - 00 - 01 - 02 - 03 - 04 - - - 10 - 11 - 12 - 13 - 14 - - - 20 - 21 - 22 - 23 - 24 - - - 30 - 31 - 32 - 33 - 34 - - - - - - - - 00 - 01 - 02 - 03 - 04 - - - 10 - 11 - 12 - 13 - 14 - - - 20 - 21 - 22 - 23 - 24 - - - 30 - 31 - 32 - 33 - 34 - - - - - - - - 00 - 01 - 02 - 03 - 04 - - - 10 - 11 - 12 - 13 - 14 - - - 20 - 21 - 22 - 23 - 24 - - - 30 - 31 - 32 - 33 - 34 - - - - - diff --git a/z3c/rml/tests/input/tag-bookmark.rml b/z3c/rml/tests/input/tag-bookmark.rml deleted file mode 100644 index dda50802..00000000 --- a/z3c/rml/tests/input/tag-bookmark.rml +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - <font face="Courier"><bookmark></font> - and - <font face="Courier"><link></font> - Tag Demo - - - - Go to page 1 now! - - - -

              This is page 1.

              - - - Go to title. - - - - Go to page 1. - - - - Link to ReporLab Web Site. - - -
              -
              diff --git a/z3c/rml/tests/input/tag-buttonField.rml b/z3c/rml/tests/input/tag-buttonField.rml deleted file mode 100644 index 1b00e502..00000000 --- a/z3c/rml/tests/input/tag-buttonField.rml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - "buttonField" Tag Demo - - - - Button 1: - - - - - diff --git a/z3c/rml/tests/input/tag-circle.rml b/z3c/rml/tests/input/tag-circle.rml deleted file mode 100644 index 571eafc6..00000000 --- a/z3c/rml/tests/input/tag-circle.rml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/z3c/rml/tests/input/tag-codesnippet.rml b/z3c/rml/tests/input/tag-codesnippet.rml deleted file mode 100644 index 98d3055d..00000000 --- a/z3c/rml/tests/input/tag-codesnippet.rml +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - - - - - - class HelloWorld(object): - - def render(self): - print 'Hello World!' - - HelloWorld().render() - - -
              - - - Hello World! - - ]]> - -
              -
              diff --git a/z3c/rml/tests/input/tag-color.rml b/z3c/rml/tests/input/tag-color.rml deleted file mode 100644 index 03cbdd9f..00000000 --- a/z3c/rml/tests/input/tag-color.rml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - This is my favorite color! - - - This is an important color. - - - diff --git a/z3c/rml/tests/input/tag-condPageBreak.rml b/z3c/rml/tests/input/tag-condPageBreak.rml deleted file mode 100644 index 18752907..00000000 --- a/z3c/rml/tests/input/tag-condPageBreak.rml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - -

              Text 1 - On page 1

              - -

              Text 2 - On page 2

              - -

              Text 3 - On page 2

              -
              -
              diff --git a/z3c/rml/tests/input/tag-cropMarks.rml b/z3c/rml/tests/input/tag-cropMarks.rml deleted file mode 100644 index 2e64174f..00000000 --- a/z3c/rml/tests/input/tag-cropMarks.rml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - Crop Marks Demo - - - diff --git a/z3c/rml/tests/input/tag-curves.rml b/z3c/rml/tests/input/tag-curves.rml deleted file mode 100644 index 151b317f..00000000 --- a/z3c/rml/tests/input/tag-curves.rml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - 1in 1in 2in 2in 2in 3in 1in 3in - 1in 2in 2in 3in 2in 4in 1in 4in - 1in 3in 2in 4in 2in 5in 1in 5in - - - - diff --git a/z3c/rml/tests/input/tag-doc.rml b/z3c/rml/tests/input/tag-doc.rml deleted file mode 100644 index 2c406efb..00000000 --- a/z3c/rml/tests/input/tag-doc.rml +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - Doc Programming Demo - - - - - - The value of i is larger than 3 - - The value of i is not larger than to 3 - - - - - Now the value of i is larger than 3 - - Now the value of i is not larger than to 3 - - - - - - - - - - diff --git a/z3c/rml/tests/input/tag-docinit-viewer-options.rml b/z3c/rml/tests/input/tag-docinit-viewer-options.rml deleted file mode 100644 index 2ed10e05..00000000 --- a/z3c/rml/tests/input/tag-docinit-viewer-options.rml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - -

              Hello RML users!

              -
              - -
              diff --git a/z3c/rml/tests/input/tag-document-annotations.rml b/z3c/rml/tests/input/tag-document-annotations.rml deleted file mode 100644 index 0fc15052..00000000 --- a/z3c/rml/tests/input/tag-document-annotations.rml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - See Document Properties. - - diff --git a/z3c/rml/tests/input/tag-document-pageDrawing.rml b/z3c/rml/tests/input/tag-document-pageDrawing.rml deleted file mode 100644 index c5e82f40..00000000 --- a/z3c/rml/tests/input/tag-document-pageDrawing.rml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - Hello World! - - diff --git a/z3c/rml/tests/input/tag-document-story.rml b/z3c/rml/tests/input/tag-document-story.rml deleted file mode 100644 index 36b69990..00000000 --- a/z3c/rml/tests/input/tag-document-story.rml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - Hello World! - - diff --git a/z3c/rml/tests/input/tag-drawAlignedString.rml b/z3c/rml/tests/input/tag-drawAlignedString.rml deleted file mode 100644 index 73cc9e6a..00000000 --- a/z3c/rml/tests/input/tag-drawAlignedString.rml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - $ 13.63 - - $ 121.01 - - - $ 7.13 - - - $ -97.45 - - - - 12,345.67 - - - 987.15 - - - 42 - - - -1,234.56 - - - (456.78) - - - (456) - - - 27 inches - - - 13cm - - - - a = 2b + 3 - - - a - 3 = 2b - - - (a - 3)/2 = b - - - - diff --git a/z3c/rml/tests/input/tag-drawCenteredString.rml b/z3c/rml/tests/input/tag-drawCenteredString.rml deleted file mode 100644 index 3c2d9de2..00000000 --- a/z3c/rml/tests/input/tag-drawCenteredString.rml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - Hello World. - - - diff --git a/z3c/rml/tests/input/tag-drawRightString.rml b/z3c/rml/tests/input/tag-drawRightString.rml deleted file mode 100644 index dfb8cff7..00000000 --- a/z3c/rml/tests/input/tag-drawRightString.rml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - Hello World. - - - diff --git a/z3c/rml/tests/input/tag-drawString.rml b/z3c/rml/tests/input/tag-drawString.rml deleted file mode 100644 index 857e2bee..00000000 --- a/z3c/rml/tests/input/tag-drawString.rml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - Hello World. - - - diff --git a/z3c/rml/tests/input/tag-ellipse.rml b/z3c/rml/tests/input/tag-ellipse.rml deleted file mode 100644 index ace3523a..00000000 --- a/z3c/rml/tests/input/tag-ellipse.rml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/z3c/rml/tests/input/tag-fill.rml b/z3c/rml/tests/input/tag-fill.rml deleted file mode 100644 index 123bbfdc..00000000 --- a/z3c/rml/tests/input/tag-fill.rml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - diff --git a/z3c/rml/tests/input/tag-fixedSize.rml b/z3c/rml/tests/input/tag-fixedSize.rml deleted file mode 100644 index e4588249..00000000 --- a/z3c/rml/tests/input/tag-fixedSize.rml +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - <font face="Courier"><fixedSize></font> Tag Demo - - This tag allows keeping a set of flowables in a confined space. Actually - I have no clue what this tag is supposed to dol I did not find any - documentation on it. - - - Lot's of text goes here. Lot's of text goes here. Lot's of text goes - here. Lot's of text goes here. Lot's of text goes here. Lot's of text - goes here. Lot's of text goes here. Lot's of text goes here. Lot's of - text goes here. Lot's of text goes here. Lot's of text goes here. Lot's - of text goes here. - - - - - <font face="Courier"><fixedSize></font> Tag Demo - - This tag allows keeping a set of flowables in a confined space. - - - Lot's of text goes here. Lot's of text goes here. Lot's of text goes - here. Lot's of text goes here. Lot's of text goes here. Lot's of text - goes here. Lot's of text goes here. Lot's of text goes here. Lot's of - text goes here. Lot's of text goes here. Lot's of text goes here. Lot's - of text goes here. - - - - diff --git a/z3c/rml/tests/input/tag-grid.rml b/z3c/rml/tests/input/tag-grid.rml deleted file mode 100644 index d823b921..00000000 --- a/z3c/rml/tests/input/tag-grid.rml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - diff --git a/z3c/rml/tests/input/tag-hr.rml b/z3c/rml/tests/input/tag-hr.rml deleted file mode 100644 index 7ca9cbc7..00000000 --- a/z3c/rml/tests/input/tag-hr.rml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - Some text. -
              - Some more text. -
              -
              diff --git a/z3c/rml/tests/input/tag-illustration.rml b/z3c/rml/tests/input/tag-illustration.rml deleted file mode 100644 index f9b3135e..00000000 --- a/z3c/rml/tests/input/tag-illustration.rml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - <font face="Courier"><illustration></font> Tag Demo - - Illustrations allow graphical elements to be located into a story. - - - - 0 0 0 3cm - 0 3cm 5cm 3cm - 5cm 3cm 5cm 0 - 5cm 0 0 0 - - - - - - Unfortunately, the height and width of the illustration are not honored. - - - - - - diff --git a/z3c/rml/tests/input/tag-image-1.rml b/z3c/rml/tests/input/tag-image-1.rml deleted file mode 100644 index 184c13bb..00000000 --- a/z3c/rml/tests/input/tag-image-1.rml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/z3c/rml/tests/input/tag-image-svg.rml b/z3c/rml/tests/input/tag-image-svg.rml deleted file mode 100644 index c52784b7..00000000 --- a/z3c/rml/tests/input/tag-image-svg.rml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/z3c/rml/tests/input/tag-image.rml b/z3c/rml/tests/input/tag-image.rml deleted file mode 100644 index 7b1e143c..00000000 --- a/z3c/rml/tests/input/tag-image.rml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/z3c/rml/tests/input/tag-imageAndFlowables-svg.rml b/z3c/rml/tests/input/tag-imageAndFlowables-svg.rml deleted file mode 100644 index 25345092..00000000 --- a/z3c/rml/tests/input/tag-imageAndFlowables-svg.rml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - <font face="Courier"><imageAndFlowables></font> Tag Demo - - - This tag sets and image an flowables around it. This paragraph clearly - still goes accross the entire frame width. We need some more text to - demonstrate that. - - -

              Wrap around

              - This text should wrap around the image. - - A lot more text goes here. A lot more text goes here. A lot more text - goes here. A lot more text goes here. A lot more text goes here. A lot - more text goes here. - - - A lot more text goes here. A lot more text goes here. A lot more text - goes here. A lot more text goes here. A lot more text goes here. A lot - more text goes here. A lot more text goes here. A lot more text goes - here. A lot more text goes here. A lot more text goes here. A lot more - text goes here. A lot more text goes here. - -
              - -

              Wrap around

              - This text should wrap around the image. -
              -
              -
              diff --git a/z3c/rml/tests/input/tag-imageAndFlowables.rml b/z3c/rml/tests/input/tag-imageAndFlowables.rml deleted file mode 100644 index ab0db57d..00000000 --- a/z3c/rml/tests/input/tag-imageAndFlowables.rml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - <font face="Courier"><imageAndFlowables></font> Tag Demo - - - This tag sets and image an flowables around it. This paragraph clearly - still goes accross the entire frame width. We need some more text to - demonstrate that. - - -

              Wrap around

              - This text should wrap around the image. - - A lot more text goes here. A lot more text goes here. A lot more text - goes here. A lot more text goes here. A lot more text goes here. A lot - more text goes here. - - - A lot more text goes here. A lot more text goes here. A lot more text - goes here. A lot more text goes here. A lot more text goes here. A lot - more text goes here. A lot more text goes here. A lot more text goes - here. A lot more text goes here. A lot more text goes here. A lot more - text goes here. A lot more text goes here. - -
              - -

              Wrap around

              - This text should wrap around the image. -
              -
              -
              diff --git a/z3c/rml/tests/input/tag-img.rml b/z3c/rml/tests/input/tag-img.rml deleted file mode 100644 index a05f5914..00000000 --- a/z3c/rml/tests/input/tag-img.rml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - <font face="Courier"><img></font> Tag Demo - - - - Align top-left of available space. - - - Preserve aspect ratio with width specified. - - - Preserve aspect ratio with height specified. - - - Preserve aspect ratio with both width and height specified. This - behaves like a bounding box. - - - - diff --git a/z3c/rml/tests/input/tag-includePdfPages.rml b/z3c/rml/tests/input/tag-includePdfPages.rml deleted file mode 100644 index a43d8330..00000000 --- a/z3c/rml/tests/input/tag-includePdfPages.rml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - Test Include PDF - - We will now include PDF - - - - - - - - - - And some more text - - - - diff --git a/z3c/rml/tests/input/tag-indent.rml b/z3c/rml/tests/input/tag-indent.rml deleted file mode 100644 index bfabc602..00000000 --- a/z3c/rml/tests/input/tag-indent.rml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - <font face="Courier"><indent></font> Tag Demo - - This tag allows you to indent a text as much as you like. This is - particularly interesting for block quotes and tree-like layouts. - - - - This is indented text. However, you can have other flowables as - well. - - - - This - is - - - a - table - - - - - Back from the indentation, everything is normal. You can also nest - indents of course: - - - Item 1-1 - - Item 2-1 - - Item 3-1 - Item 3-2 - - Item 2-2 - Item 2-3 - - Item 1-2 - - - diff --git a/z3c/rml/tests/input/tag-index.rml b/z3c/rml/tests/input/tag-index.rml deleted file mode 100644 index 4eef07d0..00000000 --- a/z3c/rml/tests/input/tag-index.rml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - Index Demo - - - This text is showing indexing. - - - - Here are some more words. - - - - This text is on page 3. - - -

              Index

              - - -
              - -
              diff --git a/z3c/rml/tests/input/tag-keepInFrame.rml b/z3c/rml/tests/input/tag-keepInFrame.rml deleted file mode 100644 index 86b077c9..00000000 --- a/z3c/rml/tests/input/tag-keepInFrame.rml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - <font face="Courier"><keepInFrame></font> Tag Demo - - This tag allows keeping a set of flowables in a confined space. - - - Lot's of text goes here. Lot's of text goes here. Lot's of text goes - here. Lot's of text goes here. Lot's of text goes here. Lot's of text - goes here. Lot's of text goes here. Lot's of text goes here. Lot's of - text goes here. Lot's of text goes here. Lot's of text goes here. Lot's - of text goes here. - - - - - <font face="Courier"><keepInFrame></font> Tag Demo - - This tag allows keeping a set of flowables in a confined space. - - - Lot's of text goes here. Lot's of text goes here. Lot's of text goes - here. Lot's of text goes here. Lot's of text goes here. Lot's of text - goes here. Lot's of text goes here. Lot's of text goes here. Lot's of - text goes here. Lot's of text goes here. Lot's of text goes here. Lot's - of text goes here. - - - - - - - - This tag allows keeping a set of flowables in a confined space. - - - - diff --git a/z3c/rml/tests/input/tag-keepTogether.rml b/z3c/rml/tests/input/tag-keepTogether.rml deleted file mode 100644 index 9ad0db0c..00000000 --- a/z3c/rml/tests/input/tag-keepTogether.rml +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - The <keepTogether> tag will keep a set of child flowables in - the same frame as much as possible. Unlike <keepInFrame>, it - will not shrink the contents to do this. It adds frame breaks when - necessary instead. - - - - In this example, we try to keep 3 paragraphs together. Since they - can not all fit into the same frame as this paragraph, they will - all appear in the next page together. - - - - - - - This is the 1st paragraph of 3 that we wish to keep together.
              - Some nonsense text to fill up the space. - Some nonsense text to fill up the space. - Some nonsense text to fill up the space. - Some nonsense text to fill up the space. - Some nonsense text to fill up the space. - Some nonsense text to fill up the space. -
              - - - This is the 2nd paragraph of 3 that we wish to keep together.
              - Some nonsense text to fill up the space. - Some nonsense text to fill up the space. - Some nonsense text to fill up the space. - Some nonsense text to fill up the space. - Some nonsense text to fill up the space. - Some nonsense text to fill up the space. -
              - - - This is the 3rd paragraph of 3 that we wish to keep together.
              - Some nonsense text to fill up the space. - Some nonsense text to fill up the space. - Some nonsense text to fill up the space. - Some nonsense text to fill up the space. - Some nonsense text to fill up the space. - Some nonsense text to fill up the space. -
              - -
              -
              - -
              diff --git a/z3c/rml/tests/input/tag-lineMode.rml b/z3c/rml/tests/input/tag-lineMode.rml deleted file mode 100644 index 46ca9363..00000000 --- a/z3c/rml/tests/input/tag-lineMode.rml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - diff --git a/z3c/rml/tests/input/tag-linePlot.rml b/z3c/rml/tests/input/tag-linePlot.rml deleted file mode 100644 index 86e0f9b2..00000000 --- a/z3c/rml/tests/input/tag-linePlot.rml +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - Line Plot Demo - - - - - - - - - - - - - - - - - 1 1 - 2 2 - 2.5 1 - 3 3 - 4 5 - - - 1 2 - 2 3 - 2.5 2 - 3.5 5 - 4 6 - - - - - - - - - - - - - - - - - - X-Axis Label - - - Y-Axis Label - - - - - 1 1 - 2 2 - 2.5 1 - 3 3 - 4 5 - - - 1 2 - 2 3 - 2.5 2 - 3.5 5 - 4 6 - - - - - - diff --git a/z3c/rml/tests/input/tag-linePlot3D.rml b/z3c/rml/tests/input/tag-linePlot3D.rml deleted file mode 100644 index 00b883bc..00000000 --- a/z3c/rml/tests/input/tag-linePlot3D.rml +++ /dev/null @@ -1,95 +0,0 @@ - - - - - - - - - - Line Plot Demo - - - - - - - - - - - - - - - - - 1 1 - 2 2 - 2.5 1 - 3 3 - 4 5 - - - 1 2 - 2 3 - 2.5 2 - 3.5 5 - 4 6 - - - - - - - - - - - - - - - - - - X-Axis Label - - - Y-Axis Label - - - - - 1 1 - 2 2 - 2.5 1 - 3 3 - 4 5 - - - 1 2 - 2 3 - 2.5 2 - 3.5 5 - 4 6 - - - - - - diff --git a/z3c/rml/tests/input/tag-lines.rml b/z3c/rml/tests/input/tag-lines.rml deleted file mode 100644 index 76f3fdd0..00000000 --- a/z3c/rml/tests/input/tag-lines.rml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - 1in 7in 6in 7in - 1in 5in 6in 4in - 1in 3in 1in 1in - - - - diff --git a/z3c/rml/tests/input/tag-log.rml b/z3c/rml/tests/input/tag-log.rml deleted file mode 100644 index 0e680ea2..00000000 --- a/z3c/rml/tests/input/tag-log.rml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - Logging Example - - Log message with level WARNING. - A DEBUG message - A INFO message - A WARNING message - A ERROR message - A CRITICAL message - - diff --git a/z3c/rml/tests/input/tag-mergePage.rml b/z3c/rml/tests/input/tag-mergePage.rml deleted file mode 100644 index 9f53aa92..00000000 --- a/z3c/rml/tests/input/tag-mergePage.rml +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - - - - - - - - - - 555-55-5555 - - - - - MA 123-9424-90 - - - - - Future Corporation - 1 Belltower Place - Maynard, MA 01754 - USA - - - - - CTRL-FC-2982 - - - - - Jonathan - - - Duddley - - - - - 10 Main Street - Maynard, MA 01754 - USA - - - - - 78,000 - - - - - 13,260 - - - - - MA - - - MA-FC-23410 - - - - 78,000 - - - 6,240 - - - - diff --git a/z3c/rml/tests/input/tag-name.rml b/z3c/rml/tests/input/tag-name.rml deleted file mode 100644 index b4b42f17..00000000 --- a/z3c/rml/tests/input/tag-name.rml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - <getName id="DocTitle" /> - - The Second Document Title - - <getName id="DocTitle" /> - - - diff --git a/z3c/rml/tests/input/tag-nextFrame.rml b/z3c/rml/tests/input/tag-nextFrame.rml deleted file mode 100644 index 408e4c1d..00000000 --- a/z3c/rml/tests/input/tag-nextFrame.rml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - Frame 1 - - Frame 2 - - diff --git a/z3c/rml/tests/input/tag-nextPage.rml b/z3c/rml/tests/input/tag-nextPage.rml deleted file mode 100644 index cbb3de88..00000000 --- a/z3c/rml/tests/input/tag-nextPage.rml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - Page 1, Frame 1 - - Page 2, Frame 1 - - diff --git a/z3c/rml/tests/input/tag-outlineAdd.rml b/z3c/rml/tests/input/tag-outlineAdd.rml deleted file mode 100644 index 176e2d7d..00000000 --- a/z3c/rml/tests/input/tag-outlineAdd.rml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - Top Level - Item 1-1 - Item 2-1 - Item 1-2 - - diff --git a/z3c/rml/tests/input/tag-pageGraphics.rml b/z3c/rml/tests/input/tag-pageGraphics.rml deleted file mode 100644 index ea5d0609..00000000 --- a/z3c/rml/tests/input/tag-pageGraphics.rml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - Story goes here. - - diff --git a/z3c/rml/tests/input/tag-pageInfo-2.rml b/z3c/rml/tests/input/tag-pageInfo-2.rml deleted file mode 100644 index e45999d8..00000000 --- a/z3c/rml/tests/input/tag-pageInfo-2.rml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - US Legal sized document. - - - diff --git a/z3c/rml/tests/input/tag-pageInfo.rml b/z3c/rml/tests/input/tag-pageInfo.rml deleted file mode 100644 index 10c10f94..00000000 --- a/z3c/rml/tests/input/tag-pageInfo.rml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - Hello World. - - - diff --git a/z3c/rml/tests/input/tag-para-border.rml b/z3c/rml/tests/input/tag-para-border.rml deleted file mode 100644 index bee3eb91..00000000 --- a/z3c/rml/tests/input/tag-para-border.rml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - Paragraph Borders - - - This is some important text. In this document all important text is - rendered in a red box. - - - - diff --git a/z3c/rml/tests/input/tag-para-wordWrap.rml b/z3c/rml/tests/input/tag-para-wordWrap.rml deleted file mode 100644 index 47780d4e..00000000 --- a/z3c/rml/tests/input/tag-para-wordWrap.rml +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - - - - A CJK word breaking algorithm will break a word between the letters, - since Chinese/Japanese/Korean languages do not use space to separate - words. The algorighm also makes sure that certain punctuations will - never appear at the beginning of a line. The 'wordWrap="CJK"' attribute - for 'para' tag will instruct reportlab to use 'CJK' word breaking style. - - - - With 'CJK' word breaking, the same text as above will appear as: - - - - A CJK word breaking algorithm will break a word between the letters, - since Chinese/Japanese/Korean languages do not use space to separate - words. The algorighm also makes sure that certain punctuations will - never appear at the beginning of a line. The 'wordWrap="CJK"' attribute - for 'para' tag will instruct reportlab to use 'CJK' word breaking style. - - - - diff --git a/z3c/rml/tests/input/tag-para.rml b/z3c/rml/tests/input/tag-para.rml deleted file mode 100644 index 19232369..00000000 --- a/z3c/rml/tests/input/tag-para.rml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - Title -

              Header 1

              -

              Header 2

              -

              Header 3

              -

              Header 4

              -
              Header 5
              -
              Header 6
              - Paragraph -
              Preformatted text only.
              - Preformatted with markup. - - Paragraph with a border and a padding.

              - Note: The padding only affects the position of the border, not - the paragraph text. -
              - Page number: -
              -
              diff --git a/z3c/rml/tests/input/tag-path.rml b/z3c/rml/tests/input/tag-path.rml deleted file mode 100644 index 28eca35a..00000000 --- a/z3c/rml/tests/input/tag-path.rml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - 6cm 26cm - 8cm 23cm - 4cm 23cm - - - - 14cm 26cm - 16cm 23cm - 12cm 23cm - - - - 4cm 22cm - - 6cm 22cm - - 7cm 20.5cm - - 8cm 19cm - - 6cm 19cm - - 4cm 19cm - - 3cm 20.5cm - - - - 8cm 15cm - - 10cm 15cm 10cm 12cm 8cm 12cm - - 2cm 12cm - - 2cm 15cm - - - - - - 10cm 12cm 10cm 9cm 8cm 9cm - - - - - diff --git a/z3c/rml/tests/input/tag-pieChart.rml b/z3c/rml/tests/input/tag-pieChart.rml deleted file mode 100644 index 0b80682d..00000000 --- a/z3c/rml/tests/input/tag-pieChart.rml +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - Pie Demo - - - - - - - - - - - - - - - - - - - - - - 10 20 30 40 50 60 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 10 20 30 40 50 60 - - - - - diff --git a/z3c/rml/tests/input/tag-pieChart3d.rml b/z3c/rml/tests/input/tag-pieChart3d.rml deleted file mode 100644 index f652b583..00000000 --- a/z3c/rml/tests/input/tag-pieChart3d.rml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - - - - 3-D Pie Chart Demo - - - - - - - - - - - - - - - - - - - - - - 10 20 30 40 50 60 - - - - - - - - - - - - - - - - - - - - - - - 10 20 30 40 50 60 - - - - - diff --git a/z3c/rml/tests/input/tag-place.rml b/z3c/rml/tests/input/tag-place.rml deleted file mode 100644 index 8858fb32..00000000 --- a/z3c/rml/tests/input/tag-place.rml +++ /dev/null @@ -1,57 +0,0 @@ - - - - - - - - - - - - This is a string drawn using ``drawString``. - - - - - 14cm 17cm - 14cm 23cm - 1cm 23cm - - - - <font face="Courier"><place></font> Tag Demo - - This is the first paragraph. - - - - - This - is - - - a - blockTable. - - - - - - This is a string drawn using ``drawString``. - - - - A paragraph within the place. - - - - diff --git a/z3c/rml/tests/input/tag-plugInFlowable.rml b/z3c/rml/tests/input/tag-plugInFlowable.rml deleted file mode 100644 index af3fa80a..00000000 --- a/z3c/rml/tests/input/tag-plugInFlowable.rml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - <font face="Courier"><pluginFlowable></font> Tag Demo - - You can also integrate arbitrary flowables. - - - - Some text. - - - - diff --git a/z3c/rml/tests/input/tag-plugInGraphic.rml b/z3c/rml/tests/input/tag-plugInGraphic.rml deleted file mode 100644 index 04ff6d67..00000000 --- a/z3c/rml/tests/input/tag-plugInGraphic.rml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - n=4,x="1in",y="7in",name="StarFive",dx="15pt",dy="0", - size="10pt",fillColor="red",strokeColor="blue", - strokeWidth="1.5pt" - - - diff --git a/z3c/rml/tests/input/tag-pre.rml b/z3c/rml/tests/input/tag-pre.rml deleted file mode 100644 index ca42b1ad..00000000 --- a/z3c/rml/tests/input/tag-pre.rml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - <font face="Courier"><pre></font> Tag Demo - - This allows preformatted text. - -
              -      
              -        This allows preformatted text.
              -      
              -    
              -
              -
              diff --git a/z3c/rml/tests/input/tag-pto.rml b/z3c/rml/tests/input/tag-pto.rml deleted file mode 100644 index 0296546e..00000000 --- a/z3c/rml/tests/input/tag-pto.rml +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - - - - - - - <font face="Courier"><pto></font> Tag Demo - - - ``pto`` allows us to specify text that is rendered before and after a - split of a frame ver pages. - - - - - ... let's go on - - - - ... please continue on the next page. - - - Main text. Main text. Main text. Main text. Main text. Main text. Main - text. Main text. Main text. Main text. Main text. Main text. Main - text. Main text. Main text. Main text. - - - - Main text. Main text. Main text. Main text. Main text. Main text. Main - text. Main text. Main text. Main text. Main text. Main text. Main - text. Main text. Main text. Main text. - - - - Main text. Main text. Main text. Main text. Main text. Main text. Main - text. Main text. Main text. Main text. Main text. Main text. Main - text. Main text. Main text. Main text. - - - - Main text. Main text. Main text. Main text. Main text. Main text. Main - text. Main text. Main text. Main text. Main text. Main text. Main - text. Main text. Main text. Main text. - - - - Main text. Main text. Main text. Main text. Main text. Main text. Main - text. Main text. Main text. Main text. Main text. Main text. Main - text. Main text. Main text. Main text. - - - - Main text. Main text. Main text. Main text. Main text. Main text. Main - text. Main text. Main text. Main text. Main text. Main text. Main - text. Main text. Main text. Main text. - - - - - - ... let's go on - - - - ... please continue on the next page. - - - Main text. Main text. Main text. Main text. Main text. Main text. Main - text. Main text. Main text. Main text. Main text. Main text. Main - text. Main text. Main text. Main text. - - - - diff --git a/z3c/rml/tests/input/tag-rectange.rml b/z3c/rml/tests/input/tag-rectange.rml deleted file mode 100644 index bd49e8fc..00000000 --- a/z3c/rml/tests/input/tag-rectange.rml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - diff --git a/z3c/rml/tests/input/tag-registerCidFont.rml b/z3c/rml/tests/input/tag-registerCidFont.rml deleted file mode 100644 index 05d8a1df..00000000 --- a/z3c/rml/tests/input/tag-registerCidFont.rml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - 日本語ã¯é›£ã—ã„ã§ã™ã­ï¼ - - - 日本語ã¯é›£ã—ã„ã§ã™ã­ï¼ - - - diff --git a/z3c/rml/tests/input/tag-registerTTFont.rml b/z3c/rml/tests/input/tag-registerTTFont.rml deleted file mode 100644 index 4acdde41..00000000 --- a/z3c/rml/tests/input/tag-registerTTFont.rml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - Hello World! - AAA - - - diff --git a/z3c/rml/tests/input/tag-registerType1Face.rml b/z3c/rml/tests/input/tag-registerType1Face.rml deleted file mode 100644 index 88212e87..00000000 --- a/z3c/rml/tests/input/tag-registerType1Face.rml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - Hello World! - - diff --git a/z3c/rml/tests/input/tag-rotate.rml b/z3c/rml/tests/input/tag-rotate.rml deleted file mode 100644 index c93dc094..00000000 --- a/z3c/rml/tests/input/tag-rotate.rml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - Hello World. - - - - - Hello World. - - - - diff --git a/z3c/rml/tests/input/tag-saveState-restoreState.rml b/z3c/rml/tests/input/tag-saveState-restoreState.rml deleted file mode 100644 index 13ea6035..00000000 --- a/z3c/rml/tests/input/tag-saveState-restoreState.rml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - Text in Helvetica 9 - - - Text in Courier 12 - - Text in Helvetica 9 - - - diff --git a/z3c/rml/tests/input/tag-scale.rml b/z3c/rml/tests/input/tag-scale.rml deleted file mode 100644 index 52371921..00000000 --- a/z3c/rml/tests/input/tag-scale.rml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - Hello World. - - - - - Hello World. - - - - diff --git a/z3c/rml/tests/input/tag-selectField.rml b/z3c/rml/tests/input/tag-selectField.rml deleted file mode 100644 index f9a46d2a..00000000 --- a/z3c/rml/tests/input/tag-selectField.rml +++ /dev/null @@ -1,37 +0,0 @@ - - - - - - - - "selectField" Tag Demo - - - - Select 1: - - - - - - - - - Select 2: - - - - - - - - - diff --git a/z3c/rml/tests/input/tag-setFont.rml b/z3c/rml/tests/input/tag-setFont.rml deleted file mode 100644 index 87b64eae..00000000 --- a/z3c/rml/tests/input/tag-setFont.rml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - Text in Helvetica 9 - - - diff --git a/z3c/rml/tests/input/tag-setFontSize.rml b/z3c/rml/tests/input/tag-setFontSize.rml deleted file mode 100644 index 3e2050b8..00000000 --- a/z3c/rml/tests/input/tag-setFontSize.rml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - Text in Helvetica 9 - - Text in Helvetica 12 - - - diff --git a/z3c/rml/tests/input/tag-setNextFrame.rml b/z3c/rml/tests/input/tag-setNextFrame.rml deleted file mode 100644 index 8acd51de..00000000 --- a/z3c/rml/tests/input/tag-setNextFrame.rml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - Frame 1 - - - - Frame 3 - - - - Frame 2 - - diff --git a/z3c/rml/tests/input/tag-setNextTemplate.rml b/z3c/rml/tests/input/tag-setNextTemplate.rml deleted file mode 100644 index 02f90036..00000000 --- a/z3c/rml/tests/input/tag-setNextTemplate.rml +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - First Text 1 - - - - First Text 2 - - - - Main Text - - diff --git a/z3c/rml/tests/input/tag-skew.rml b/z3c/rml/tests/input/tag-skew.rml deleted file mode 100644 index ae4ec433..00000000 --- a/z3c/rml/tests/input/tag-skew.rml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - Hello World. - - - - - Hello World. - - - - diff --git a/z3c/rml/tests/input/tag-spacer.rml b/z3c/rml/tests/input/tag-spacer.rml deleted file mode 100644 index 62219bfc..00000000 --- a/z3c/rml/tests/input/tag-spacer.rml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - <font face="Courier"><spacer></font> Tag Demo - - This is the first paragraph. - - - - This paragraph appears 1 inch lower. - - - You can also specify the width. - - - - As you can see the width does not do anything. The documentation says it - is not implemented yet. - - - diff --git a/z3c/rml/tests/input/tag-spiderChart.rml b/z3c/rml/tests/input/tag-spiderChart.rml deleted file mode 100644 index b0ea9f8f..00000000 --- a/z3c/rml/tests/input/tag-spiderChart.rml +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - - - Spider Chart Demo - - - - - - - - - - - - - - - - - - - 12 14 16 14 12 - 6 8 10 12 9 15 - 7 8 17 4 12 8 - - - - - - - - - - - - - - - - - - - - - - - - - - - 12 14 16 14 12 - 6 8 10 12 9 15 - 7 8 17 4 12 8 - - - - - diff --git a/z3c/rml/tests/input/tag-storyPlace.rml b/z3c/rml/tests/input/tag-storyPlace.rml deleted file mode 100644 index 5ffc62f4..00000000 --- a/z3c/rml/tests/input/tag-storyPlace.rml +++ /dev/null @@ -1,32 +0,0 @@ - - - - - - - - - This is at the bottom of the page - - - - - This is at the bottom of the frame. - - - - Some text inside the second frame. - - This is below the current cursor position. - - - - diff --git a/z3c/rml/tests/input/tag-stroke.rml b/z3c/rml/tests/input/tag-stroke.rml deleted file mode 100644 index da26f65f..00000000 --- a/z3c/rml/tests/input/tag-stroke.rml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - diff --git a/z3c/rml/tests/input/tag-textAnnotation.rml b/z3c/rml/tests/input/tag-textAnnotation.rml deleted file mode 100644 index f822f04b..00000000 --- a/z3c/rml/tests/input/tag-textAnnotation.rml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - 0,0,1,1 - 3 - 6 -X::PDF -PX(S) -MT(PINK) - - - diff --git a/z3c/rml/tests/input/tag-textField.rml b/z3c/rml/tests/input/tag-textField.rml deleted file mode 100644 index 081a2d8c..00000000 --- a/z3c/rml/tests/input/tag-textField.rml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - "textField" Tag Demo - - - - Input 1: - - - - - Input 2: - - - - - diff --git a/z3c/rml/tests/input/tag-transform.rml b/z3c/rml/tests/input/tag-transform.rml deleted file mode 100644 index 06b35a10..00000000 --- a/z3c/rml/tests/input/tag-transform.rml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - Hello World. - - - - 1.0 0.3 - -0.2 1.1 - 10.1 15.0 - - - Hello World. - - - - diff --git a/z3c/rml/tests/input/tag-translate.rml b/z3c/rml/tests/input/tag-translate.rml deleted file mode 100644 index 404a6f34..00000000 --- a/z3c/rml/tests/input/tag-translate.rml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - Hello World. - - - - - Hello World. - - - - diff --git a/z3c/rml/tests/input/tag-ul-ol-li.rml b/z3c/rml/tests/input/tag-ul-ol-li.rml deleted file mode 100644 index 3ac2eb77..00000000 --- a/z3c/rml/tests/input/tag-ul-ol-li.rml +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - -
                -
              1. - Welcome to RML 1 -
              2. -
              3. -
                  -
                • - unordered 1 -
                • -
                • - unordered 2 -
                • -
                • - unordered 3 -
                • -
                • - unordered 4 -
                • -
                -
              4. -
              - - - -
                -
              1. - Item 1 -
              2. -
              3. - Item 2 -
              4. -
              - - - -
                -
              • One
              • -
              • Two
              • -
              • Three
              • -
              - - - -
                -
              1. One
              2. -
              3. Two
              4. -
              5. Three
              6. -
              - -
              - -
              diff --git a/z3c/rml/tests/input/tag-xpre.rml b/z3c/rml/tests/input/tag-xpre.rml deleted file mode 100644 index 5047f01e..00000000 --- a/z3c/rml/tests/input/tag-xpre.rml +++ /dev/null @@ -1,34 +0,0 @@ - - - - - - - - - - <font face="Courier"><xpre></font> Tag Demo - - The X-preformatting supports paragraph-level formatting. - - - This allows preformatted text with markup. - - ASCII ART - - - *** *** - * * * - * * - * * - * * - * - - - - - diff --git a/z3c/rml/tests/input/zope3logo.gif b/z3c/rml/tests/input/zope3logo.gif deleted file mode 100644 index 04209fa8..00000000 Binary files a/z3c/rml/tests/input/zope3logo.gif and /dev/null differ diff --git a/z3c/rml/tests/module.py b/z3c/rml/tests/module.py deleted file mode 100644 index 077ab444..00000000 --- a/z3c/rml/tests/module.py +++ /dev/null @@ -1,78 +0,0 @@ -############################################################################## -# -# Copyright (c) 2007-2012 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTLAR PURPOSE. -# -############################################################################## -"""Testing all XML Locale functionality. -""" -import reportlab.platypus -import reportlab.lib.styles -import reportlab.graphics.widgets.markers -from reportlab.graphics import renderPDF, shapes -from reportlab.lib import colors -from z3c.rml import attr, interfaces, SampleStyleSheet - -def myPreformatted(params): - return reportlab.platypus.Preformatted(''' - Hey, this is a long text from a plugin. Hey, this is a long text from - a plugin. Hey, this is a long text from a plugin. Hey, this is a long - text from a plugin. Hey, this is a long text from a plugin. Hey, this - is a long text from a plugin. Hey, this is a long text from a - plugin. Hey, this is a long text from a plugin. Hey, this is a long - text from a plugin. Hey, this is a long text from a plugin. Hey, this - is a long text from a plugin. Hey, this is a long text from a - plugin. Hey, this is a long text from a plugin. Hey, this is a long - text from a plugin. Hey, this is a long text from a plugin. Hey, this - is a long text from a plugin.''', - SampleStyleSheet['Normal']) - -class LinkURL(reportlab.platypus.flowables.Flowable): - def __init__(self, link): - self.link = link - - def wrap(self, *args): - return (0, 0) - - def draw(self): - self.canv.linkURL(self.link, None) - - -def linkURL(params): - params = eval(params) - return ( - reportlab.platypus.Paragraph( - params[0], SampleStyleSheet['Normal']), - LinkURL(*params)) - -class IMarker(interfaces.IRMLDirectiveSignature): - x = attr.Measurement() - y = attr.Measurement() - dx = attr.Measurement() - dy = attr.Measurement() - size = attr.Measurement() - fillColor = attr.Color(acceptNone=True, required=False) - strokeColor = attr.Color(acceptNone=True, required=False) - strokeWidth = attr.Measurement(required=False) - arrowBarDx = attr.Measurement(required=False) - arrowHeight = attr.Measurement(required=False) - -def symbols(canvas, params): - args = eval('dict(%s)' %params) - name = args.pop('name') - n = args.pop('n') - for key, value in args.items(): - field = IMarker[key].bind(canvas.manager) - args[key] = field.fromUnicode(value) - m = reportlab.graphics.widgets.markers.makeMarker(name, **args) - drawing = shapes.Drawing() - drawing.add(m) - for idx in range(n): - drawing.drawOn(canvas, idx*args['dx'], idx*args['dy']) diff --git a/z3c/rml/tests/output/README.txt b/z3c/rml/tests/output/README.txt deleted file mode 100644 index 3cf0ef80..00000000 --- a/z3c/rml/tests/output/README.txt +++ /dev/null @@ -1 +0,0 @@ -This directory contains the PDF output of the tests. diff --git a/z3c/rml/tests/test_directive.py b/z3c/rml/tests/test_directive.py deleted file mode 100644 index 8c4c4201..00000000 --- a/z3c/rml/tests/test_directive.py +++ /dev/null @@ -1,52 +0,0 @@ -############################################################################### -# -# Copyright (c) 2012 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################### -"""Tests for the Book Documentation Module""" - -import doctest -import unittest - -bad_rml = '''\ - - - -''' - -def test_abort_on_invalid_tag(): - """ - - We can set a flag that aborts execution when a bad tag/directive is - encountered: - - >>> from z3c.rml import directive - >>> directive.ABORT_ON_INVALID_DIRECTIVE = True - - Let's now render a template: - - >>> from z3c.rml import rml2pdf - >>> rml2pdf.parseString(bad_rml, True, 'bad.rml') - Traceback (most recent call last): - ... - ValueError: Directive 'bad' could not be processed and was ignored. - (file bad.rml, line 2) - - Cleanup: - - >>> directive.ABORT_ON_INVALID_DIRECTIVE = False - - """ - -def test_suite(): - return doctest.DocTestSuite( - optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS) - diff --git a/z3c/rml/tests/test_dtd.py b/z3c/rml/tests/test_dtd.py deleted file mode 100644 index 8ad99e6b..00000000 --- a/z3c/rml/tests/test_dtd.py +++ /dev/null @@ -1,31 +0,0 @@ -############################################################################## -# -# Copyright (c) 2012 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTLAR PURPOSE. -# -############################################################################## -"""Test generating DTD -""" -import os -import unittest -from z3c.rml import dtd - -class DTDTestCase(unittest.TestCase): - - level = 2 - - def runTest(self): - path = os.path.join(os.path.dirname(dtd.__file__), 'rml.dtd') - with open(path, 'w') as file: - file.write(dtd.generate()) - - -def test_suite(): - return unittest.TestSuite([DTDTestCase()]) diff --git a/z3c/rml/tests/test_pagetemplate.py b/z3c/rml/tests/test_pagetemplate.py deleted file mode 100644 index f8f1e3b0..00000000 --- a/z3c/rml/tests/test_pagetemplate.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################### -# -# Copyright (c) 2005 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################### -"""Tests for the Book Documentation Module""" - -import doctest -import unittest - - -def test_suite(): - return doctest.DocFileSuite( - '../pagetemplate.txt', - optionflags=doctest.NORMALIZE_WHITESPACE|doctest.ELLIPSIS) - diff --git a/z3c/rml/tests/test_reference.py b/z3c/rml/tests/test_reference.py deleted file mode 100644 index 3bd0c887..00000000 --- a/z3c/rml/tests/test_reference.py +++ /dev/null @@ -1,31 +0,0 @@ -############################################################################## -# -# Copyright (c) 2012 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTLAR PURPOSE. -# -############################################################################## -"""Test generating reference. -""" -import os -import unittest -from z3c.rml import reference - -class ReferenceTestCase(unittest.TestCase): - - level = 3 - - def runTest(self): - reference.main( - os.path.join(os.path.dirname(reference.__file__), - 'rml-reference.pdf')) - - -def test_suite(): - return unittest.TestSuite([ReferenceTestCase()]) diff --git a/z3c/rml/tests/test_rml.py b/z3c/rml/tests/test_rml.py deleted file mode 100644 index b5eb3864..00000000 --- a/z3c/rml/tests/test_rml.py +++ /dev/null @@ -1,172 +0,0 @@ -############################################################################## -# -# Copyright (c) 2007 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTLAR PURPOSE. -# -############################################################################## -"""Testing all XML Locale functionality. -""" -import logging -import os -import subprocess -import unittest -import sys -import z3c.rml.tests -from z3c.rml import rml2pdf, attr - -try: - import Image -except ImportError: - from PIL import Image - -LOG_FILE = os.path.join(os.path.dirname(__file__), 'render.log') - -def gs_command(path): - return ('gs', '-q', '-sNOPAUSE', '-sDEVICE=png256', - '-sOutputFile=%s[Page-%%d].png' % path[:-4], - path, '-c', 'quit') - - -class RMLRenderingTestCase(unittest.TestCase): - - def __init__(self, inPath, outPath): - self._inPath = inPath - self._outPath = outPath - unittest.TestCase.__init__(self) - - def setUp(self): - # Switch file opener for Image attibute - self._fileOpen = attr.File.open - def testOpen(img, filename): - # cleanup win paths like: - # ....\\input\\file:///D:\\trunk\\... - if sys.platform[:3].lower() == "win": - if filename.startswith('file:///'): - filename = filename[len('file:///'):] - path = os.path.join(os.path.dirname(self._inPath), filename) - return open(path, 'rb') - attr.File.open = testOpen - import z3c.rml.tests.module - sys.modules['module'] = z3c.rml.tests.module - sys.modules['mymodule'] = z3c.rml.tests.module - - def tearDown(self): - attr.File.open = self._fileOpen - del sys.modules['module'] - del sys.modules['mymodule'] - - from z3c.rml.document import LOGGER_NAME - for handler in logging.getLogger(LOGGER_NAME).handlers: - if handler.baseFilename == LOG_FILE: - handler.close() - - if os.path.exists(LOG_FILE): - os.remove(LOG_FILE) - - def runTest(self): - rml2pdf.go(self._inPath, self._outPath) - - -class ComparePDFTestCase(unittest.TestCase): - - level = 2 - - def __init__(self, basePath, testPath): - self._basePath = basePath - self._testPath = testPath - unittest.TestCase.__init__(self) - - def assertSameImage(self, baseImage, testImage): - base = Image.open(baseImage).getdata() - test = Image.open(testImage).getdata() - for i in range(len(base)): - if (base[i] - test[i]) != 0: - self.fail( - 'Image is not the same: %s' % os.path.basename(baseImage) - ) - - def runTest(self): - # Convert the base PDF to image(s) - status = subprocess.Popen(gs_command(self._basePath)).wait() - if status: - return - # Convert the test PDF to image(s) - status = subprocess.Popen(gs_command(self._testPath)).wait() - if status: - return - # Go through all pages and ensure their equality - n = 1 - while True: - baseImage = self._basePath[:-4] + '[Page-%i].png' %n - testImage = self._testPath[:-4] + '[Page-%i].png' %n - if os.path.exists(baseImage) and os.path.exists(testImage): - self.assertSameImage(baseImage, testImage) - else: - break - n += 1 - - -class CompareFileTestCase(unittest.TestCase): - - def __init__(self, testPath, contains): - self._testPath = testPath - self._contains = contains - unittest.TestCase.__init__(self) - - def runTest(self): - f = open(self._testPath, 'rb') - try: - contents = f.read() - - if self._contains not in contents: - self.fail( - 'PDF file does not contain: %s' % self._contains - ) - finally: - f.close() - - -def test_suite(): - suite = unittest.TestSuite() - inputDir = os.path.join(os.path.dirname(z3c.rml.tests.__file__), 'input') - outputDir = os.path.join(os.path.dirname(z3c.rml.tests.__file__), 'output') - expectDir = os.path.join(os.path.dirname(z3c.rml.tests.__file__), 'expected') - for filename in os.listdir(inputDir): - if not filename.endswith(".rml"): - continue - - if sys.platform.startswith('win') and filename == 'rml-examples-032-images.rml': - # The Ghostscript command to convert EPS files in PIL doesn't work - # on Windows. It's easy to fix but requires modifying PIL. - continue - - inPath = os.path.join(inputDir, filename) - outPath = os.path.join(outputDir, filename[:-4] + '.pdf') - expectPath = os.path.join(expectDir, filename[:-4] + '.pdf') - - # ** Test RML to PDF rendering ** - # Create new type, so that we can get test matching - TestCase = type(filename[:-4], (RMLRenderingTestCase,), {}) - case = TestCase(inPath, outPath) - suite.addTest(case) - # ** Test PDF rendering correctness ** - TestCase = type('compare-'+filename[:-4], (ComparePDFTestCase,), {}) - case = TestCase(expectPath, outPath) - suite.addTest(case) - - if filename == 'printScaling.rml': - TestCase = type('compare-file-'+filename[:-4], (CompareFileTestCase,), {}) - case = TestCase(outPath, '<< /PrintScaling /None >>') - suite.addTest(case) - - return suite - -if __name__ == '__main__': - unittest.main(defaultTest='test_suite') diff --git a/z3c/rml/tests/test_subprocess.py b/z3c/rml/tests/test_subprocess.py deleted file mode 100644 index 38972e5a..00000000 --- a/z3c/rml/tests/test_subprocess.py +++ /dev/null @@ -1,57 +0,0 @@ -############################################################################## -# -# Copyright (c) 2007 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTLAR PURPOSE. -# -############################################################################## -"""Testing all XML Locale functionality. -""" -import os -import unittest -import z3c.rml.tests -from z3c.rml import rml2pdfscript -from z3c.rml.tests.test_rml import ComparePDFTestCase -from z3c.rml.tests.test_rml import RMLRenderingTestCase - - -class RMLRenderingTestCase(RMLRenderingTestCase): - - def runTest(self): - rml2pdfscript.goSubProcess(self._inPath, self._outPath, True) - - -def test_suite(): - suite = unittest.TestSuite() - return suite - inputDir = os.path.join(os.path.dirname(z3c.rml.tests.__file__), 'input') - outputDir = os.path.join(os.path.dirname(z3c.rml.tests.__file__), 'output') - expectDir = os.path.join(os.path.dirname(z3c.rml.tests.__file__), 'expected') - for filename in os.listdir(inputDir): - if not filename.endswith(".rml"): - continue - inPath = os.path.join(inputDir, filename) - outPath = os.path.join(outputDir, filename[:-4] + '.pdf') - expectPath = os.path.join(expectDir, filename[:-4] + '.pdf') - - # ** Test RML to PDF rendering ** - # Create new type, so that we can get test matching - TestCase = type(filename[:-4], (RMLRenderingTestCase,), {}) - case = TestCase(inPath, outPath) - suite.addTest(case) - - # ** Test PDF rendering correctness ** - TestCase = type('compare-'+filename[:-4], (ComparePDFTestCase,), {}) - case = TestCase(expectPath, outPath) - suite.addTest(case) - - return suite - -if __name__ == '__main__': - unittest.main(defaultTest='test_suite') diff --git a/zope/__init__.py b/zope/__init__.py deleted file mode 100644 index de40ea7c..00000000 --- a/zope/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__import__('pkg_resources').declare_namespace(__name__) diff --git a/zope/event/__init__.py b/zope/event/__init__.py deleted file mode 100644 index e3356966..00000000 --- a/zope/event/__init__.py +++ /dev/null @@ -1,31 +0,0 @@ -############################################################################## -# -# Copyright (c) 2004 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -""" Base event system implementation - -""" - -#: Applications may register for notification of events by appending a -#: callable to the ``subscribers`` list. -#: -#: Each subscriber takes a single argument, which is the event object -#: being published. -#: -#: Exceptions raised by subscribers will be propagated. -subscribers = [] - -def notify(event): - """ Notify all subscribers of ``event``. - """ - for subscriber in subscribers: - subscriber(event) diff --git a/zope/event/tests.py b/zope/event/tests.py deleted file mode 100644 index a7b045d8..00000000 --- a/zope/event/tests.py +++ /dev/null @@ -1,48 +0,0 @@ -############################################################################## -# -# Copyright (c) 2004 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -""" Test the event system -""" -import unittest - -class Test_notify(unittest.TestCase): - - def setUp(self): - from zope.event import subscribers - self._old_subscribers = subscribers[:] - subscribers[:] = [] - - def tearDown(self): - from zope.event import subscribers - subscribers[:] = self._old_subscribers - - def _callFUT(self, event): - from zope.event import notify - notify(event) - - def test_empty(self): - event = object() - self._callFUT(event) - - def test_not_empty(self): - from zope.event import subscribers - dummy = [] - subscribers.append(dummy.append) - event = object() - self._callFUT(event) - self.assertEqual(dummy, [event]) - -def test_suite(): - return unittest.TestSuite(( - unittest.makeSuite(Test_notify), - )) diff --git a/zope/interface/__init__.py b/zope/interface/__init__.py deleted file mode 100644 index ad0a7667..00000000 --- a/zope/interface/__init__.py +++ /dev/null @@ -1,89 +0,0 @@ -############################################################################## -# -# Copyright (c) 2001, 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Interfaces - -This package implements the Python "scarecrow" proposal. - -The package exports two objects, `Interface` and `Attribute` directly. It also -exports several helper methods. Interface is used to create an interface with -a class statement, as in: - - class IMyInterface(Interface): - '''Interface documentation - ''' - - def meth(arg1, arg2): - '''Documentation for meth - ''' - - # Note that there is no self argument - -To find out what you can do with interfaces, see the interface -interface, `IInterface` in the `interfaces` module. - -The package has several public modules: - - o `declarations` provides utilities to declare interfaces on objects. It - also provides a wide range of helpful utilities that aid in managing - declared interfaces. Most of its public names are however imported here. - - o `document` has a utility for documenting an interface as structured text. - - o `exceptions` has the interface-defined exceptions - - o `interfaces` contains a list of all public interfaces for this package. - - o `verify` has utilities for verifying implementations of interfaces. - -See the module doc strings for more information. -""" -__docformat__ = 'restructuredtext' - -from zope.interface.interface import Interface -from zope.interface.interface import _wire - -# Need to actually get the interface elements to implement the right interfaces -_wire() -del _wire - -from zope.interface.declarations import Declaration -from zope.interface.declarations import alsoProvides -from zope.interface.declarations import classImplements -from zope.interface.declarations import classImplementsOnly -from zope.interface.declarations import classProvides -from zope.interface.declarations import directlyProvidedBy -from zope.interface.declarations import directlyProvides -from zope.interface.declarations import implementedBy -from zope.interface.declarations import implementer -from zope.interface.declarations import implementer_only -from zope.interface.declarations import implements -from zope.interface.declarations import implementsOnly -from zope.interface.declarations import moduleProvides -from zope.interface.declarations import noLongerProvides -from zope.interface.declarations import providedBy -from zope.interface.declarations import provider -from zope.interface.exceptions import Invalid -from zope.interface.interface import Attribute -from zope.interface.interface import invariant -from zope.interface.interface import taggedValue - -# The following are to make spec pickles cleaner -from zope.interface.declarations import Provides - - -from zope.interface.interfaces import IInterfaceDeclaration - -moduleProvides(IInterfaceDeclaration) - -__all__ = ('Interface', 'Attribute') + tuple(IInterfaceDeclaration) diff --git a/zope/interface/_compat.py b/zope/interface/_compat.py deleted file mode 100644 index b1f02120..00000000 --- a/zope/interface/_compat.py +++ /dev/null @@ -1,69 +0,0 @@ -############################################################################## -# -# Copyright (c) 2006 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Basic components support -""" -import sys -import types - -if sys.version_info[0] < 3: #pragma NO COVER - - def _u(s): - return unicode(s, 'unicode_escape') - - def _normalize_name(name): - if isinstance(name, basestring): - return unicode(name) - raise TypeError("name must be a regular or unicode string") - - CLASS_TYPES = (type, types.ClassType) - STRING_TYPES = (basestring,) - - _BUILTINS = '__builtin__' - - PYTHON3 = False - PYTHON2 = True - -else: #pragma NO COVER - - def _u(s): - return s - - def _normalize_name(name): - if isinstance(name, bytes): - name = str(name, 'ascii') - if isinstance(name, str): - return name - raise TypeError("name must be a string or ASCII-only bytes") - - CLASS_TYPES = (type,) - STRING_TYPES = (str,) - - _BUILTINS = 'builtins' - - PYTHON3 = True - PYTHON2 = False - -def _skip_under_py3k(test_method): #pragma NO COVER - if sys.version_info[0] < 3: - return test_method - def _dummy(*args): - pass - return _dummy - -def _skip_under_py2(test_method): #pragma NO COVER - if sys.version_info[0] > 2: - return test_method - def _dummy(*args): - pass - return _dummy diff --git a/zope/interface/_flatten.py b/zope/interface/_flatten.py deleted file mode 100644 index a80c2de4..00000000 --- a/zope/interface/_flatten.py +++ /dev/null @@ -1,35 +0,0 @@ -############################################################################## -# -# Copyright (c) 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Adapter-style interface registry - -See Adapter class. -""" -from zope.interface import Declaration - -def _flatten(implements, include_None=0): - - try: - r = implements.flattened() - except AttributeError: - if implements is None: - r=() - else: - r = Declaration(implements).flattened() - - if not include_None: - return r - - r = list(r) - r.append(None) - return r diff --git a/zope/interface/_zope_interface_coptimizations.c b/zope/interface/_zope_interface_coptimizations.c deleted file mode 100644 index b2088ee6..00000000 --- a/zope/interface/_zope_interface_coptimizations.c +++ /dev/null @@ -1,1688 +0,0 @@ -/*########################################################################### - # - # Copyright (c) 2003 Zope Foundation and Contributors. - # All Rights Reserved. - # - # This software is subject to the provisions of the Zope Public License, - # Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. - # THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED - # WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED - # WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS - # FOR A PARTICULAR PURPOSE. - # - ############################################################################*/ - -#include "Python.h" -#include "structmember.h" - -#define TYPE(O) ((PyTypeObject*)(O)) -#define OBJECT(O) ((PyObject*)(O)) -#define CLASSIC(O) ((PyClassObject*)(O)) -#ifndef PyVarObject_HEAD_INIT -#define PyVarObject_HEAD_INIT(a, b) PyObject_HEAD_INIT(a) b, -#endif -#ifndef Py_TYPE -#define Py_TYPE(o) ((o)->ob_type) -#endif - -static PyObject *str__dict__, *str__implemented__, *strextends; -static PyObject *BuiltinImplementationSpecifications, *str__provides__; -static PyObject *str__class__, *str__providedBy__; -static PyObject *empty, *fallback, *str_implied, *str_cls, *str_implements; -static PyObject *str__conform__, *str_call_conform, *adapter_hooks; -static PyObject *str_uncached_lookup, *str_uncached_lookupAll; -static PyObject *str_uncached_subscriptions; -static PyObject *str_registry, *strro, *str_generation, *strchanged; - -static PyTypeObject *Implements; - -static int imported_declarations = 0; - -static int -import_declarations(void) -{ - PyObject *declarations, *i; - - declarations = PyImport_ImportModule("zope.interface.declarations"); - if (declarations == NULL) - return -1; - - BuiltinImplementationSpecifications = PyObject_GetAttrString( - declarations, "BuiltinImplementationSpecifications"); - if (BuiltinImplementationSpecifications == NULL) - return -1; - - empty = PyObject_GetAttrString(declarations, "_empty"); - if (empty == NULL) - return -1; - - fallback = PyObject_GetAttrString(declarations, "implementedByFallback"); - if (fallback == NULL) - return -1; - - - - i = PyObject_GetAttrString(declarations, "Implements"); - if (i == NULL) - return -1; - - if (! PyType_Check(i)) - { - PyErr_SetString(PyExc_TypeError, - "zope.interface.declarations.Implements is not a type"); - return -1; - } - - Implements = (PyTypeObject *)i; - - Py_DECREF(declarations); - - imported_declarations = 1; - return 0; -} - -static PyTypeObject SpecType; /* Forward */ - -static PyObject * -implementedByFallback(PyObject *cls) -{ - if (imported_declarations == 0 && import_declarations() < 0) - return NULL; - - return PyObject_CallFunctionObjArgs(fallback, cls, NULL); -} - -static PyObject * -implementedBy(PyObject *ignored, PyObject *cls) -{ - /* Fast retrieval of implements spec, if possible, to optimize - common case. Use fallback code if we get stuck. - */ - - PyObject *dict = NULL, *spec; - - if (PyType_Check(cls)) - { - dict = TYPE(cls)->tp_dict; - Py_XINCREF(dict); - } - - if (dict == NULL) - dict = PyObject_GetAttr(cls, str__dict__); - - if (dict == NULL) - { - /* Probably a security proxied class, use more expensive fallback code */ - PyErr_Clear(); - return implementedByFallback(cls); - } - - spec = PyObject_GetItem(dict, str__implemented__); - Py_DECREF(dict); - if (spec) - { - if (imported_declarations == 0 && import_declarations() < 0) - return NULL; - - if (PyObject_TypeCheck(spec, Implements)) - return spec; - - /* Old-style declaration, use more expensive fallback code */ - Py_DECREF(spec); - return implementedByFallback(cls); - } - - PyErr_Clear(); - - /* Maybe we have a builtin */ - if (imported_declarations == 0 && import_declarations() < 0) - return NULL; - - spec = PyDict_GetItem(BuiltinImplementationSpecifications, cls); - if (spec != NULL) - { - Py_INCREF(spec); - return spec; - } - - /* We're stuck, use fallback */ - return implementedByFallback(cls); -} - -static PyObject * -getObjectSpecification(PyObject *ignored, PyObject *ob) -{ - PyObject *cls, *result; - - result = PyObject_GetAttr(ob, str__provides__); - if (result != NULL && PyObject_TypeCheck(result, &SpecType)) - return result; - - PyErr_Clear(); - - /* We do a getattr here so as not to be defeated by proxies */ - cls = PyObject_GetAttr(ob, str__class__); - if (cls == NULL) - { - PyErr_Clear(); - if (imported_declarations == 0 && import_declarations() < 0) - return NULL; - Py_INCREF(empty); - return empty; - } - - result = implementedBy(NULL, cls); - Py_DECREF(cls); - - return result; -} - -static PyObject * -providedBy(PyObject *ignored, PyObject *ob) -{ - PyObject *result, *cls, *cp; - - result = PyObject_GetAttr(ob, str__providedBy__); - if (result == NULL) - { - PyErr_Clear(); - return getObjectSpecification(NULL, ob); - } - - - /* We want to make sure we have a spec. We can't do a type check - because we may have a proxy, so we'll just try to get the - only attribute. - */ - if (PyObject_TypeCheck(result, &SpecType) - || - PyObject_HasAttr(result, strextends) - ) - return result; - - /* - The object's class doesn't understand descriptors. - Sigh. We need to get an object descriptor, but we have to be - careful. We want to use the instance's __provides__,l if - there is one, but only if it didn't come from the class. - */ - Py_DECREF(result); - - cls = PyObject_GetAttr(ob, str__class__); - if (cls == NULL) - return NULL; - - result = PyObject_GetAttr(ob, str__provides__); - if (result == NULL) - { - /* No __provides__, so just fall back to implementedBy */ - PyErr_Clear(); - result = implementedBy(NULL, cls); - Py_DECREF(cls); - return result; - } - - cp = PyObject_GetAttr(cls, str__provides__); - if (cp == NULL) - { - /* The the class has no provides, assume we're done: */ - PyErr_Clear(); - Py_DECREF(cls); - return result; - } - - if (cp == result) - { - /* - Oops, we got the provides from the class. This means - the object doesn't have it's own. We should use implementedBy - */ - Py_DECREF(result); - result = implementedBy(NULL, cls); - } - - Py_DECREF(cls); - Py_DECREF(cp); - - return result; -} - -/* - Get an attribute from an inst dict. Return a borrowed reference. - - This has a number of advantages: - - - It avoids layers of Python api - - - It doesn't waste time looking for descriptors - - - It fails wo raising an exception, although that shouldn't really - matter. - -*/ -static PyObject * -inst_attr(PyObject *self, PyObject *name) -{ - PyObject **dictp, *v; - - dictp = _PyObject_GetDictPtr(self); - if (dictp && *dictp && (v = PyDict_GetItem(*dictp, name))) - return v; - PyErr_SetObject(PyExc_AttributeError, name); - return NULL; -} - - -static PyObject * -Spec_extends(PyObject *self, PyObject *other) -{ - PyObject *implied; - - implied = inst_attr(self, str_implied); - if (implied == NULL) - return NULL; - -#ifdef Py_True - if (PyDict_GetItem(implied, other) != NULL) - { - Py_INCREF(Py_True); - return Py_True; - } - Py_INCREF(Py_False); - return Py_False; -#else - return PyInt_FromLong(PyDict_GetItem(implied, other) != NULL); -#endif -} - -static char Spec_extends__doc__[] = -"Test whether a specification is or extends another" -; - -static char Spec_providedBy__doc__[] = -"Test whether an interface is implemented by the specification" -; - -static PyObject * -Spec_call(PyObject *self, PyObject *args, PyObject *kw) -{ - PyObject *spec; - - if (! PyArg_ParseTuple(args, "O", &spec)) - return NULL; - return Spec_extends(self, spec); -} - -static PyObject * -Spec_providedBy(PyObject *self, PyObject *ob) -{ - PyObject *decl, *item; - - decl = providedBy(NULL, ob); - if (decl == NULL) - return NULL; - - if (PyObject_TypeCheck(decl, &SpecType)) - item = Spec_extends(decl, self); - else - /* decl is probably a security proxy. We have to go the long way - around. - */ - item = PyObject_CallFunctionObjArgs(decl, self, NULL); - - Py_DECREF(decl); - return item; -} - - -static char Spec_implementedBy__doc__[] = -"Test whether the specification is implemented by a class or factory.\n" -"Raise TypeError if argument is neither a class nor a callable." -; - -static PyObject * -Spec_implementedBy(PyObject *self, PyObject *cls) -{ - PyObject *decl, *item; - - decl = implementedBy(NULL, cls); - if (decl == NULL) - return NULL; - - if (PyObject_TypeCheck(decl, &SpecType)) - item = Spec_extends(decl, self); - else - item = PyObject_CallFunctionObjArgs(decl, self, NULL); - - Py_DECREF(decl); - return item; -} - -static struct PyMethodDef Spec_methods[] = { - {"providedBy", - (PyCFunction)Spec_providedBy, METH_O, - Spec_providedBy__doc__}, - {"implementedBy", - (PyCFunction)Spec_implementedBy, METH_O, - Spec_implementedBy__doc__}, - {"isOrExtends", (PyCFunction)Spec_extends, METH_O, - Spec_extends__doc__}, - - {NULL, NULL} /* sentinel */ -}; - -static PyTypeObject SpecType = { - PyVarObject_HEAD_INIT(NULL, 0) - /* tp_name */ "_interface_coptimizations." - "SpecificationBase", - /* tp_basicsize */ 0, - /* tp_itemsize */ 0, - /* tp_dealloc */ (destructor)0, - /* tp_print */ (printfunc)0, - /* tp_getattr */ (getattrfunc)0, - /* tp_setattr */ (setattrfunc)0, - /* tp_compare */ 0, - /* tp_repr */ (reprfunc)0, - /* tp_as_number */ 0, - /* tp_as_sequence */ 0, - /* tp_as_mapping */ 0, - /* tp_hash */ (hashfunc)0, - /* tp_call */ (ternaryfunc)Spec_call, - /* tp_str */ (reprfunc)0, - /* tp_getattro */ (getattrofunc)0, - /* tp_setattro */ (setattrofunc)0, - /* tp_as_buffer */ 0, - /* tp_flags */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - "Base type for Specification objects", - /* tp_traverse */ (traverseproc)0, - /* tp_clear */ (inquiry)0, - /* tp_richcompare */ (richcmpfunc)0, - /* tp_weaklistoffset */ (long)0, - /* tp_iter */ (getiterfunc)0, - /* tp_iternext */ (iternextfunc)0, - /* tp_methods */ Spec_methods, -}; - -static PyObject * -OSD_descr_get(PyObject *self, PyObject *inst, PyObject *cls) -{ - PyObject *provides; - - if (inst == NULL) - return getObjectSpecification(NULL, cls); - - provides = PyObject_GetAttr(inst, str__provides__); - if (provides != NULL) - return provides; - PyErr_Clear(); - return implementedBy(NULL, cls); -} - -static PyTypeObject OSDType = { - PyVarObject_HEAD_INIT(NULL, 0) - /* tp_name */ "_interface_coptimizations." - "ObjectSpecificationDescriptor", - /* tp_basicsize */ 0, - /* tp_itemsize */ 0, - /* tp_dealloc */ (destructor)0, - /* tp_print */ (printfunc)0, - /* tp_getattr */ (getattrfunc)0, - /* tp_setattr */ (setattrfunc)0, - /* tp_compare */ 0, - /* tp_repr */ (reprfunc)0, - /* tp_as_number */ 0, - /* tp_as_sequence */ 0, - /* tp_as_mapping */ 0, - /* tp_hash */ (hashfunc)0, - /* tp_call */ (ternaryfunc)0, - /* tp_str */ (reprfunc)0, - /* tp_getattro */ (getattrofunc)0, - /* tp_setattro */ (setattrofunc)0, - /* tp_as_buffer */ 0, - /* tp_flags */ Py_TPFLAGS_DEFAULT - | Py_TPFLAGS_BASETYPE , - "Object Specification Descriptor", - /* tp_traverse */ (traverseproc)0, - /* tp_clear */ (inquiry)0, - /* tp_richcompare */ (richcmpfunc)0, - /* tp_weaklistoffset */ (long)0, - /* tp_iter */ (getiterfunc)0, - /* tp_iternext */ (iternextfunc)0, - /* tp_methods */ 0, - /* tp_members */ 0, - /* tp_getset */ 0, - /* tp_base */ 0, - /* tp_dict */ 0, /* internal use */ - /* tp_descr_get */ (descrgetfunc)OSD_descr_get, -}; - -static PyObject * -CPB_descr_get(PyObject *self, PyObject *inst, PyObject *cls) -{ - PyObject *mycls, *implements; - - mycls = inst_attr(self, str_cls); - if (mycls == NULL) - return NULL; - - if (cls == mycls) - { - if (inst == NULL) - { - Py_INCREF(self); - return OBJECT(self); - } - - implements = inst_attr(self, str_implements); - Py_XINCREF(implements); - return implements; - } - - PyErr_SetObject(PyExc_AttributeError, str__provides__); - return NULL; -} - -static PyTypeObject CPBType = { - PyVarObject_HEAD_INIT(NULL, 0) - /* tp_name */ "_interface_coptimizations." - "ClassProvidesBase", - /* tp_basicsize */ 0, - /* tp_itemsize */ 0, - /* tp_dealloc */ (destructor)0, - /* tp_print */ (printfunc)0, - /* tp_getattr */ (getattrfunc)0, - /* tp_setattr */ (setattrfunc)0, - /* tp_compare */ 0, - /* tp_repr */ (reprfunc)0, - /* tp_as_number */ 0, - /* tp_as_sequence */ 0, - /* tp_as_mapping */ 0, - /* tp_hash */ (hashfunc)0, - /* tp_call */ (ternaryfunc)0, - /* tp_str */ (reprfunc)0, - /* tp_getattro */ (getattrofunc)0, - /* tp_setattro */ (setattrofunc)0, - /* tp_as_buffer */ 0, - /* tp_flags */ Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, - "C Base class for ClassProvides", - /* tp_traverse */ (traverseproc)0, - /* tp_clear */ (inquiry)0, - /* tp_richcompare */ (richcmpfunc)0, - /* tp_weaklistoffset */ (long)0, - /* tp_iter */ (getiterfunc)0, - /* tp_iternext */ (iternextfunc)0, - /* tp_methods */ 0, - /* tp_members */ 0, - /* tp_getset */ 0, - /* tp_base */ &SpecType, - /* tp_dict */ 0, /* internal use */ - /* tp_descr_get */ (descrgetfunc)CPB_descr_get, -}; - -/* ==================================================================== */ -/* ========== Begin: __call__ and __adapt__ =========================== */ - -/* - def __adapt__(self, obj): - """Adapt an object to the reciever - """ - if self.providedBy(obj): - return obj - - for hook in adapter_hooks: - adapter = hook(self, obj) - if adapter is not None: - return adapter - - -*/ -static PyObject * -__adapt__(PyObject *self, PyObject *obj) -{ - PyObject *decl, *args, *adapter; - int implements, i, l; - - decl = providedBy(NULL, obj); - if (decl == NULL) - return NULL; - - if (PyObject_TypeCheck(decl, &SpecType)) - { - PyObject *implied; - - implied = inst_attr(decl, str_implied); - if (implied == NULL) - { - Py_DECREF(decl); - return NULL; - } - - implements = PyDict_GetItem(implied, self) != NULL; - Py_DECREF(decl); - } - else - { - /* decl is probably a security proxy. We have to go the long way - around. - */ - PyObject *r; - r = PyObject_CallFunctionObjArgs(decl, self, NULL); - Py_DECREF(decl); - if (r == NULL) - return NULL; - implements = PyObject_IsTrue(r); - Py_DECREF(r); - } - - if (implements) - { - Py_INCREF(obj); - return obj; - } - - l = PyList_GET_SIZE(adapter_hooks); - args = PyTuple_New(2); - if (args == NULL) - return NULL; - Py_INCREF(self); - PyTuple_SET_ITEM(args, 0, self); - Py_INCREF(obj); - PyTuple_SET_ITEM(args, 1, obj); - for (i = 0; i < l; i++) - { - adapter = PyObject_CallObject(PyList_GET_ITEM(adapter_hooks, i), args); - if (adapter == NULL || adapter != Py_None) - { - Py_DECREF(args); - return adapter; - } - Py_DECREF(adapter); - } - - Py_DECREF(args); - - Py_INCREF(Py_None); - return Py_None; -} - -static struct PyMethodDef ib_methods[] = { - {"__adapt__", (PyCFunction)__adapt__, METH_O, - "Adapt an object to the reciever"}, - {NULL, NULL} /* sentinel */ -}; - -/* - def __call__(self, obj, alternate=_marker): - conform = getattr(obj, '__conform__', None) - if conform is not None: - adapter = self._call_conform(conform) - if adapter is not None: - return adapter - - adapter = self.__adapt__(obj) - - if adapter is not None: - return adapter - elif alternate is not _marker: - return alternate - else: - raise TypeError("Could not adapt", obj, self) -*/ -static PyObject * -ib_call(PyObject *self, PyObject *args, PyObject *kwargs) -{ - PyObject *conform, *obj, *alternate=NULL, *adapter; - - static char *kwlist[] = {"obj", "alternate", NULL}; - - if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|O", kwlist, - &obj, &alternate)) - return NULL; - - conform = PyObject_GetAttr(obj, str__conform__); - if (conform != NULL) - { - adapter = PyObject_CallMethodObjArgs(self, str_call_conform, - conform, NULL); - Py_DECREF(conform); - if (adapter == NULL || adapter != Py_None) - return adapter; - Py_DECREF(adapter); - } - else - PyErr_Clear(); - - adapter = __adapt__(self, obj); - if (adapter == NULL || adapter != Py_None) - return adapter; - Py_DECREF(adapter); - - if (alternate != NULL) - { - Py_INCREF(alternate); - return alternate; - } - - adapter = Py_BuildValue("sOO", "Could not adapt", obj, self); - if (adapter != NULL) - { - PyErr_SetObject(PyExc_TypeError, adapter); - Py_DECREF(adapter); - } - return NULL; -} - -static PyTypeObject InterfaceBase = { - PyVarObject_HEAD_INIT(NULL, 0) - /* tp_name */ "_zope_interface_coptimizations." - "InterfaceBase", - /* tp_basicsize */ 0, - /* tp_itemsize */ 0, - /* tp_dealloc */ (destructor)0, - /* tp_print */ (printfunc)0, - /* tp_getattr */ (getattrfunc)0, - /* tp_setattr */ (setattrfunc)0, - /* tp_compare */ 0, - /* tp_repr */ (reprfunc)0, - /* tp_as_number */ 0, - /* tp_as_sequence */ 0, - /* tp_as_mapping */ 0, - /* tp_hash */ (hashfunc)0, - /* tp_call */ (ternaryfunc)ib_call, - /* tp_str */ (reprfunc)0, - /* tp_getattro */ (getattrofunc)0, - /* tp_setattro */ (setattrofunc)0, - /* tp_as_buffer */ 0, - /* tp_flags */ Py_TPFLAGS_DEFAULT - | Py_TPFLAGS_BASETYPE , - /* tp_doc */ "Interface base type providing __call__ and __adapt__", - /* tp_traverse */ (traverseproc)0, - /* tp_clear */ (inquiry)0, - /* tp_richcompare */ (richcmpfunc)0, - /* tp_weaklistoffset */ (long)0, - /* tp_iter */ (getiterfunc)0, - /* tp_iternext */ (iternextfunc)0, - /* tp_methods */ ib_methods, -}; - -/* =================== End: __call__ and __adapt__ ==================== */ -/* ==================================================================== */ - -/* ==================================================================== */ -/* ========================== Begin: Lookup Bases ===================== */ - -typedef struct { - PyObject_HEAD - PyObject *_cache; - PyObject *_mcache; - PyObject *_scache; -} lookup; - -typedef struct { - PyObject_HEAD - PyObject *_cache; - PyObject *_mcache; - PyObject *_scache; - PyObject *_verify_ro; - PyObject *_verify_generations; -} verify; - -static int -lookup_traverse(lookup *self, visitproc visit, void *arg) -{ - int vret; - - if (self->_cache) { - vret = visit(self->_cache, arg); - if (vret != 0) - return vret; - } - - if (self->_mcache) { - vret = visit(self->_mcache, arg); - if (vret != 0) - return vret; - } - - if (self->_scache) { - vret = visit(self->_scache, arg); - if (vret != 0) - return vret; - } - - return 0; -} - -static int -lookup_clear(lookup *self) -{ - Py_CLEAR(self->_cache); - Py_CLEAR(self->_mcache); - Py_CLEAR(self->_scache); - return 0; -} - -static void -lookup_dealloc(lookup *self) -{ - lookup_clear(self); - Py_TYPE(self)->tp_free((PyObject*)self); -} - -/* - def changed(self, ignored=None): - self._cache.clear() - self._mcache.clear() - self._scache.clear() -*/ -static PyObject * -lookup_changed(lookup *self, PyObject *ignored) -{ - lookup_clear(self); - Py_INCREF(Py_None); - return Py_None; -} - -#define ASSURE_DICT(N) if (N == NULL) { N = PyDict_New(); \ - if (N == NULL) return NULL; \ - } - -/* - def _getcache(self, provided, name): - cache = self._cache.get(provided) - if cache is None: - cache = {} - self._cache[provided] = cache - if name: - c = cache.get(name) - if c is None: - c = {} - cache[name] = c - cache = c - return cache -*/ -static PyObject * -_subcache(PyObject *cache, PyObject *key) -{ - PyObject *subcache; - - subcache = PyDict_GetItem(cache, key); - if (subcache == NULL) - { - int status; - - subcache = PyDict_New(); - if (subcache == NULL) - return NULL; - status = PyDict_SetItem(cache, key, subcache); - Py_DECREF(subcache); - if (status < 0) - return NULL; - } - - return subcache; -} -static PyObject * -_getcache(lookup *self, PyObject *provided, PyObject *name) -{ - PyObject *cache; - - ASSURE_DICT(self->_cache); - cache = _subcache(self->_cache, provided); - if (cache == NULL) - return NULL; - - if (name != NULL && PyObject_IsTrue(name)) - cache = _subcache(cache, name); - - return cache; -} - - -/* - def lookup(self, required, provided, name=u'', default=None): - cache = self._getcache(provided, name) - if len(required) == 1: - result = cache.get(required[0], _not_in_mapping) - else: - result = cache.get(tuple(required), _not_in_mapping) - - if result is _not_in_mapping: - result = self._uncached_lookup(required, provided, name) - if len(required) == 1: - cache[required[0]] = result - else: - cache[tuple(required)] = result - - if result is None: - return default - - return result -*/ -static PyObject * -tuplefy(PyObject *v) -{ - if (! PyTuple_Check(v)) - { - v = PyObject_CallFunctionObjArgs(OBJECT(&PyTuple_Type), v, NULL); - if (v == NULL) - return NULL; - } - else - Py_INCREF(v); - - return v; -} -static PyObject * -_lookup(lookup *self, - PyObject *required, PyObject *provided, PyObject *name, - PyObject *default_) -{ - PyObject *result, *key, *cache; - - cache = _getcache(self, provided, name); - if (cache == NULL) - return NULL; - - required = tuplefy(required); - if (required == NULL) - return NULL; - - if (PyTuple_GET_SIZE(required) == 1) - key = PyTuple_GET_ITEM(required, 0); - else - key = required; - - result = PyDict_GetItem(cache, key); - if (result == NULL) - { - int status; - - result = PyObject_CallMethodObjArgs(OBJECT(self), str_uncached_lookup, - required, provided, name, NULL); - if (result == NULL) - { - Py_DECREF(required); - return NULL; - } - status = PyDict_SetItem(cache, key, result); - Py_DECREF(required); - if (status < 0) - { - Py_DECREF(result); - return NULL; - } - } - else - { - Py_INCREF(result); - Py_DECREF(required); - } - - if (result == Py_None && default_ != NULL) - { - Py_DECREF(Py_None); - Py_INCREF(default_); - return default_; - } - - return result; -} -static PyObject * -lookup_lookup(lookup *self, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = {"required", "provided", "name", "default", NULL}; - PyObject *required, *provided, *name=NULL, *default_=NULL; - - if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist, - &required, &provided, &name, &default_)) - return NULL; - - return _lookup(self, required, provided, name, default_); -} - - -/* - def lookup1(self, required, provided, name=u'', default=None): - cache = self._getcache(provided, name) - result = cache.get(required, _not_in_mapping) - if result is _not_in_mapping: - return self.lookup((required, ), provided, name, default) - - if result is None: - return default - - return result -*/ -static PyObject * -_lookup1(lookup *self, - PyObject *required, PyObject *provided, PyObject *name, - PyObject *default_) -{ - PyObject *result, *cache; - - cache = _getcache(self, provided, name); - if (cache == NULL) - return NULL; - - result = PyDict_GetItem(cache, required); - if (result == NULL) - { - PyObject *tup; - - tup = PyTuple_New(1); - if (tup == NULL) - return NULL; - Py_INCREF(required); - PyTuple_SET_ITEM(tup, 0, required); - result = _lookup(self, tup, provided, name, default_); - Py_DECREF(tup); - } - else - { - if (result == Py_None && default_ != NULL) - { - result = default_; - } - Py_INCREF(result); - } - - return result; -} -static PyObject * -lookup_lookup1(lookup *self, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = {"required", "provided", "name", "default", NULL}; - PyObject *required, *provided, *name=NULL, *default_=NULL; - - if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist, - &required, &provided, &name, &default_)) - return NULL; - - return _lookup1(self, required, provided, name, default_); -} - -/* - def adapter_hook(self, provided, object, name=u'', default=None): - required = providedBy(object) - cache = self._getcache(provided, name) - factory = cache.get(required, _not_in_mapping) - if factory is _not_in_mapping: - factory = self.lookup((required, ), provided, name) - - if factory is not None: - result = factory(object) - if result is not None: - return result - - return default -*/ -static PyObject * -_adapter_hook(lookup *self, - PyObject *provided, PyObject *object, PyObject *name, - PyObject *default_) -{ - PyObject *required, *factory, *result; - - required = providedBy(NULL, object); - if (required == NULL) - return NULL; - - factory = _lookup1(self, required, provided, name, Py_None); - Py_DECREF(required); - if (factory == NULL) - return NULL; - - if (factory != Py_None) - { - result = PyObject_CallFunctionObjArgs(factory, object, NULL); - Py_DECREF(factory); - if (result == NULL || result != Py_None) - return result; - } - else - result = factory; /* None */ - - if (default_ == NULL || default_ == result) /* No default specified, */ - return result; /* Return None. result is owned None */ - - Py_DECREF(result); - Py_INCREF(default_); - - return default_; -} -static PyObject * -lookup_adapter_hook(lookup *self, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = {"provided", "object", "name", "default", NULL}; - PyObject *object, *provided, *name=NULL, *default_=NULL; - - if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist, - &provided, &object, &name, &default_)) - return NULL; - - return _adapter_hook(self, provided, object, name, default_); -} - -static PyObject * -lookup_queryAdapter(lookup *self, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = {"object", "provided", "name", "default", NULL}; - PyObject *object, *provided, *name=NULL, *default_=NULL; - - if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist, - &object, &provided, &name, &default_)) - return NULL; - - return _adapter_hook(self, provided, object, name, default_); -} - -/* - def lookupAll(self, required, provided): - cache = self._mcache.get(provided) - if cache is None: - cache = {} - self._mcache[provided] = cache - - required = tuple(required) - result = cache.get(required, _not_in_mapping) - if result is _not_in_mapping: - result = self._uncached_lookupAll(required, provided) - cache[required] = result - - return result -*/ -static PyObject * -_lookupAll(lookup *self, PyObject *required, PyObject *provided) -{ - PyObject *cache, *result; - - ASSURE_DICT(self->_mcache); - cache = _subcache(self->_mcache, provided); - if (cache == NULL) - return NULL; - - required = tuplefy(required); - if (required == NULL) - return NULL; - - result = PyDict_GetItem(cache, required); - if (result == NULL) - { - int status; - - result = PyObject_CallMethodObjArgs(OBJECT(self), str_uncached_lookupAll, - required, provided, NULL); - if (result == NULL) - { - Py_DECREF(required); - return NULL; - } - status = PyDict_SetItem(cache, required, result); - Py_DECREF(required); - if (status < 0) - { - Py_DECREF(result); - return NULL; - } - } - else - { - Py_INCREF(result); - Py_DECREF(required); - } - - return result; -} -static PyObject * -lookup_lookupAll(lookup *self, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = {"required", "provided", NULL}; - PyObject *required, *provided; - - if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO", kwlist, - &required, &provided)) - return NULL; - - return _lookupAll(self, required, provided); -} - -/* - def subscriptions(self, required, provided): - cache = self._scache.get(provided) - if cache is None: - cache = {} - self._scache[provided] = cache - - required = tuple(required) - result = cache.get(required, _not_in_mapping) - if result is _not_in_mapping: - result = self._uncached_subscriptions(required, provided) - cache[required] = result - - return result -*/ -static PyObject * -_subscriptions(lookup *self, PyObject *required, PyObject *provided) -{ - PyObject *cache, *result; - - ASSURE_DICT(self->_scache); - cache = _subcache(self->_scache, provided); - if (cache == NULL) - return NULL; - - required = tuplefy(required); - if (required == NULL) - return NULL; - - result = PyDict_GetItem(cache, required); - if (result == NULL) - { - int status; - - result = PyObject_CallMethodObjArgs( - OBJECT(self), str_uncached_subscriptions, - required, provided, NULL); - if (result == NULL) - { - Py_DECREF(required); - return NULL; - } - status = PyDict_SetItem(cache, required, result); - Py_DECREF(required); - if (status < 0) - { - Py_DECREF(result); - return NULL; - } - } - else - { - Py_INCREF(result); - Py_DECREF(required); - } - - return result; -} -static PyObject * -lookup_subscriptions(lookup *self, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = {"required", "provided", NULL}; - PyObject *required, *provided; - - if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO", kwlist, - &required, &provided)) - return NULL; - - return _subscriptions(self, required, provided); -} - -static struct PyMethodDef lookup_methods[] = { - {"changed", (PyCFunction)lookup_changed, METH_O, ""}, - {"lookup", (PyCFunction)lookup_lookup, METH_KEYWORDS, ""}, - {"lookup1", (PyCFunction)lookup_lookup1, METH_KEYWORDS, ""}, - {"queryAdapter", (PyCFunction)lookup_queryAdapter, METH_KEYWORDS, ""}, - {"adapter_hook", (PyCFunction)lookup_adapter_hook, METH_KEYWORDS, ""}, - {"lookupAll", (PyCFunction)lookup_lookupAll, METH_KEYWORDS, ""}, - {"subscriptions", (PyCFunction)lookup_subscriptions, METH_KEYWORDS, ""}, - {NULL, NULL} /* sentinel */ -}; - -static PyTypeObject LookupBase = { - PyVarObject_HEAD_INIT(NULL, 0) - /* tp_name */ "_zope_interface_coptimizations." - "LookupBase", - /* tp_basicsize */ sizeof(lookup), - /* tp_itemsize */ 0, - /* tp_dealloc */ (destructor)&lookup_dealloc, - /* tp_print */ (printfunc)0, - /* tp_getattr */ (getattrfunc)0, - /* tp_setattr */ (setattrfunc)0, - /* tp_compare */ 0, - /* tp_repr */ (reprfunc)0, - /* tp_as_number */ 0, - /* tp_as_sequence */ 0, - /* tp_as_mapping */ 0, - /* tp_hash */ (hashfunc)0, - /* tp_call */ (ternaryfunc)0, - /* tp_str */ (reprfunc)0, - /* tp_getattro */ (getattrofunc)0, - /* tp_setattro */ (setattrofunc)0, - /* tp_as_buffer */ 0, - /* tp_flags */ Py_TPFLAGS_DEFAULT - | Py_TPFLAGS_BASETYPE - | Py_TPFLAGS_HAVE_GC, - /* tp_doc */ "", - /* tp_traverse */ (traverseproc)lookup_traverse, - /* tp_clear */ (inquiry)lookup_clear, - /* tp_richcompare */ (richcmpfunc)0, - /* tp_weaklistoffset */ (long)0, - /* tp_iter */ (getiterfunc)0, - /* tp_iternext */ (iternextfunc)0, - /* tp_methods */ lookup_methods, -}; - -static int -verifying_traverse(verify *self, visitproc visit, void *arg) -{ - int vret; - - vret = lookup_traverse((lookup *)self, visit, arg); - if (vret != 0) - return vret; - - if (self->_verify_ro) { - vret = visit(self->_verify_ro, arg); - if (vret != 0) - return vret; - } - if (self->_verify_generations) { - vret = visit(self->_verify_generations, arg); - if (vret != 0) - return vret; - } - - return 0; -} - -static int -verifying_clear(verify *self) -{ - lookup_clear((lookup *)self); - Py_CLEAR(self->_verify_generations); - Py_CLEAR(self->_verify_ro); - return 0; -} - - -static void -verifying_dealloc(verify *self) -{ - verifying_clear(self); - Py_TYPE(self)->tp_free((PyObject*)self); -} - -/* - def changed(self, originally_changed): - super(VerifyingBasePy, self).changed(originally_changed) - self._verify_ro = self._registry.ro[1:] - self._verify_generations = [r._generation for r in self._verify_ro] -*/ -static PyObject * -_generations_tuple(PyObject *ro) -{ - int i, l; - PyObject *generations; - - l = PyTuple_GET_SIZE(ro); - generations = PyTuple_New(l); - for (i=0; i < l; i++) - { - PyObject *generation; - - generation = PyObject_GetAttr(PyTuple_GET_ITEM(ro, i), str_generation); - if (generation == NULL) - { - Py_DECREF(generations); - return NULL; - } - PyTuple_SET_ITEM(generations, i, generation); - } - - return generations; -} -static PyObject * -verifying_changed(verify *self, PyObject *ignored) -{ - PyObject *t, *ro; - - verifying_clear(self); - - t = PyObject_GetAttr(OBJECT(self), str_registry); - if (t == NULL) - return NULL; - ro = PyObject_GetAttr(t, strro); - Py_DECREF(t); - if (ro == NULL) - return NULL; - - t = PyObject_CallFunctionObjArgs(OBJECT(&PyTuple_Type), ro, NULL); - Py_DECREF(ro); - if (t == NULL) - return NULL; - - ro = PyTuple_GetSlice(t, 1, PyTuple_GET_SIZE(t)); - Py_DECREF(t); - if (ro == NULL) - return NULL; - - self->_verify_generations = _generations_tuple(ro); - if (self->_verify_generations == NULL) - { - Py_DECREF(ro); - return NULL; - } - - self->_verify_ro = ro; - - Py_INCREF(Py_None); - return Py_None; -} - -/* - def _verify(self): - if ([r._generation for r in self._verify_ro] - != self._verify_generations): - self.changed(None) -*/ -static int -_verify(verify *self) -{ - PyObject *changed_result; - - if (self->_verify_ro != NULL && self->_verify_generations != NULL) - { - PyObject *generations; - int changed; - - generations = _generations_tuple(self->_verify_ro); - if (generations == NULL) - return -1; - - changed = PyObject_RichCompareBool(self->_verify_generations, - generations, Py_NE); - Py_DECREF(generations); - if (changed == -1) - return -1; - - if (changed == 0) - return 0; - } - - changed_result = PyObject_CallMethodObjArgs(OBJECT(self), strchanged, - Py_None, NULL); - if (changed_result == NULL) - return -1; - - Py_DECREF(changed_result); - return 0; -} - -static PyObject * -verifying_lookup(verify *self, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = {"required", "provided", "name", "default", NULL}; - PyObject *required, *provided, *name=NULL, *default_=NULL; - - if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist, - &required, &provided, &name, &default_)) - return NULL; - - if (_verify(self) < 0) - return NULL; - - return _lookup((lookup *)self, required, provided, name, default_); -} - -static PyObject * -verifying_lookup1(verify *self, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = {"required", "provided", "name", "default", NULL}; - PyObject *required, *provided, *name=NULL, *default_=NULL; - - if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist, - &required, &provided, &name, &default_)) - return NULL; - - if (_verify(self) < 0) - return NULL; - - return _lookup1((lookup *)self, required, provided, name, default_); -} - -static PyObject * -verifying_adapter_hook(verify *self, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = {"provided", "object", "name", "default", NULL}; - PyObject *object, *provided, *name=NULL, *default_=NULL; - - if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist, - &provided, &object, &name, &default_)) - return NULL; - - if (_verify(self) < 0) - return NULL; - - return _adapter_hook((lookup *)self, provided, object, name, default_); -} - -static PyObject * -verifying_queryAdapter(verify *self, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = {"object", "provided", "name", "default", NULL}; - PyObject *object, *provided, *name=NULL, *default_=NULL; - - if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO|OO", kwlist, - &object, &provided, &name, &default_)) - return NULL; - - if (_verify(self) < 0) - return NULL; - - return _adapter_hook((lookup *)self, provided, object, name, default_); -} - -static PyObject * -verifying_lookupAll(verify *self, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = {"required", "provided", NULL}; - PyObject *required, *provided; - - if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO", kwlist, - &required, &provided)) - return NULL; - - if (_verify(self) < 0) - return NULL; - - return _lookupAll((lookup *)self, required, provided); -} - -static PyObject * -verifying_subscriptions(verify *self, PyObject *args, PyObject *kwds) -{ - static char *kwlist[] = {"required", "provided", NULL}; - PyObject *required, *provided; - - if (! PyArg_ParseTupleAndKeywords(args, kwds, "OO", kwlist, - &required, &provided)) - return NULL; - - if (_verify(self) < 0) - return NULL; - - return _subscriptions((lookup *)self, required, provided); -} - -static struct PyMethodDef verifying_methods[] = { - {"changed", (PyCFunction)verifying_changed, METH_O, ""}, - {"lookup", (PyCFunction)verifying_lookup, METH_KEYWORDS, ""}, - {"lookup1", (PyCFunction)verifying_lookup1, METH_KEYWORDS, ""}, - {"queryAdapter", (PyCFunction)verifying_queryAdapter, METH_KEYWORDS, ""}, - {"adapter_hook", (PyCFunction)verifying_adapter_hook, METH_KEYWORDS, ""}, - {"lookupAll", (PyCFunction)verifying_lookupAll, METH_KEYWORDS, ""}, - {"subscriptions", (PyCFunction)verifying_subscriptions, METH_KEYWORDS, ""}, - {NULL, NULL} /* sentinel */ -}; - -static PyTypeObject VerifyingBase = { - PyVarObject_HEAD_INIT(NULL, 0) - /* tp_name */ "_zope_interface_coptimizations." - "VerifyingBase", - /* tp_basicsize */ sizeof(verify), - /* tp_itemsize */ 0, - /* tp_dealloc */ (destructor)&verifying_dealloc, - /* tp_print */ (printfunc)0, - /* tp_getattr */ (getattrfunc)0, - /* tp_setattr */ (setattrfunc)0, - /* tp_compare */ 0, - /* tp_repr */ (reprfunc)0, - /* tp_as_number */ 0, - /* tp_as_sequence */ 0, - /* tp_as_mapping */ 0, - /* tp_hash */ (hashfunc)0, - /* tp_call */ (ternaryfunc)0, - /* tp_str */ (reprfunc)0, - /* tp_getattro */ (getattrofunc)0, - /* tp_setattro */ (setattrofunc)0, - /* tp_as_buffer */ 0, - /* tp_flags */ Py_TPFLAGS_DEFAULT - | Py_TPFLAGS_BASETYPE - | Py_TPFLAGS_HAVE_GC, - /* tp_doc */ "", - /* tp_traverse */ (traverseproc)verifying_traverse, - /* tp_clear */ (inquiry)verifying_clear, - /* tp_richcompare */ (richcmpfunc)0, - /* tp_weaklistoffset */ (long)0, - /* tp_iter */ (getiterfunc)0, - /* tp_iternext */ (iternextfunc)0, - /* tp_methods */ verifying_methods, - /* tp_members */ 0, - /* tp_getset */ 0, - /* tp_base */ &LookupBase, -}; - -/* ========================== End: Lookup Bases ======================= */ -/* ==================================================================== */ - - - -static struct PyMethodDef m_methods[] = { - {"implementedBy", (PyCFunction)implementedBy, METH_O, - "Interfaces implemented by a class or factory.\n" - "Raises TypeError if argument is neither a class nor a callable."}, - {"getObjectSpecification", (PyCFunction)getObjectSpecification, METH_O, - "Get an object's interfaces (internal api)"}, - {"providedBy", (PyCFunction)providedBy, METH_O, - "Get an object's interfaces"}, - - {NULL, (PyCFunction)NULL, 0, NULL} /* sentinel */ -}; - -#if PY_MAJOR_VERSION >= 3 -static char module_doc[] = "C optimizations for zope.interface\n\n"; - -static struct PyModuleDef _zic_module = { - PyModuleDef_HEAD_INIT, - "_zope_interface_coptimizations", - module_doc, - -1, - m_methods, - NULL, - NULL, - NULL, - NULL -}; -#endif - -static PyObject * -init(void) -{ - PyObject *m; - -#if PY_MAJOR_VERSION < 3 -#define DEFINE_STRING(S) \ - if(! (str ## S = PyString_FromString(# S))) return NULL -#else -#define DEFINE_STRING(S) \ - if(! (str ## S = PyUnicode_FromString(# S))) return NULL -#endif - - DEFINE_STRING(__dict__); - DEFINE_STRING(__implemented__); - DEFINE_STRING(__provides__); - DEFINE_STRING(__class__); - DEFINE_STRING(__providedBy__); - DEFINE_STRING(extends); - DEFINE_STRING(_implied); - DEFINE_STRING(_implements); - DEFINE_STRING(_cls); - DEFINE_STRING(__conform__); - DEFINE_STRING(_call_conform); - DEFINE_STRING(_uncached_lookup); - DEFINE_STRING(_uncached_lookupAll); - DEFINE_STRING(_uncached_subscriptions); - DEFINE_STRING(_registry); - DEFINE_STRING(_generation); - DEFINE_STRING(ro); - DEFINE_STRING(changed); -#undef DEFINE_STRING - adapter_hooks = PyList_New(0); - if (adapter_hooks == NULL) - return NULL; - - /* Initialize types: */ - SpecType.tp_new = PyBaseObject_Type.tp_new; - if (PyType_Ready(&SpecType) < 0) - return NULL; - OSDType.tp_new = PyBaseObject_Type.tp_new; - if (PyType_Ready(&OSDType) < 0) - return NULL; - CPBType.tp_new = PyBaseObject_Type.tp_new; - if (PyType_Ready(&CPBType) < 0) - return NULL; - - InterfaceBase.tp_new = PyBaseObject_Type.tp_new; - if (PyType_Ready(&InterfaceBase) < 0) - return NULL; - - LookupBase.tp_new = PyBaseObject_Type.tp_new; - if (PyType_Ready(&LookupBase) < 0) - return NULL; - - VerifyingBase.tp_new = PyBaseObject_Type.tp_new; - if (PyType_Ready(&VerifyingBase) < 0) - return NULL; - - #if PY_MAJOR_VERSION < 3 - /* Create the module and add the functions */ - m = Py_InitModule3("_zope_interface_coptimizations", m_methods, - "C optimizations for zope.interface\n\n"); - #else - m = PyModule_Create(&_zic_module); - #endif - if (m == NULL) - return NULL; - - /* Add types: */ - if (PyModule_AddObject(m, "SpecificationBase", OBJECT(&SpecType)) < 0) - return NULL; - if (PyModule_AddObject(m, "ObjectSpecificationDescriptor", - (PyObject *)&OSDType) < 0) - return NULL; - if (PyModule_AddObject(m, "ClassProvidesBase", OBJECT(&CPBType)) < 0) - return NULL; - if (PyModule_AddObject(m, "InterfaceBase", OBJECT(&InterfaceBase)) < 0) - return NULL; - if (PyModule_AddObject(m, "LookupBase", OBJECT(&LookupBase)) < 0) - return NULL; - if (PyModule_AddObject(m, "VerifyingBase", OBJECT(&VerifyingBase)) < 0) - return NULL; - if (PyModule_AddObject(m, "adapter_hooks", adapter_hooks) < 0) - return NULL; - return m; -} - -PyMODINIT_FUNC -#if PY_MAJOR_VERSION < 3 -init_zope_interface_coptimizations(void) -{ - init(); -} -#else -PyInit__zope_interface_coptimizations(void) -{ - return init(); -} -#endif diff --git a/zope/interface/adapter.py b/zope/interface/adapter.py deleted file mode 100644 index feee8d01..00000000 --- a/zope/interface/adapter.py +++ /dev/null @@ -1,704 +0,0 @@ -############################################################################## -# -# Copyright (c) 2004 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Adapter management -""" -import weakref - -from zope.interface import providedBy -from zope.interface import Interface -from zope.interface import ro -from zope.interface._compat import _u -from zope.interface._compat import _normalize_name - -_BLANK = _u('') - -class BaseAdapterRegistry(object): - - # List of methods copied from lookup sub-objects: - _delegated = ('lookup', 'queryMultiAdapter', 'lookup1', 'queryAdapter', - 'adapter_hook', 'lookupAll', 'names', - 'subscriptions', 'subscribers') - - # All registries maintain a generation that can be used by verifying - # registries - _generation = 0 - - def __init__(self, bases=()): - - # The comments here could be improved. Possibly this bit needs - # explaining in a separate document, as the comments here can - # be quite confusing. /regebro - - # {order -> {required -> {provided -> {name -> value}}}} - # Here "order" is actually an index in a list, "required" and - # "provided" are interfaces, and "required" is really a nested - # key. So, for example: - # for order == 0 (that is, self._adapters[0]), we have: - # {provided -> {name -> value}} - # but for order == 2 (that is, self._adapters[2]), we have: - # {r1 -> {r2 -> {provided -> {name -> value}}}} - # - self._adapters = [] - - # {order -> {required -> {provided -> {name -> [value]}}}} - # where the remarks about adapters above apply - self._subscribers = [] - - # Set, with a reference count, keeping track of the interfaces - # for which we have provided components: - self._provided = {} - - # Create ``_v_lookup`` object to perform lookup. We make this a - # separate object to to make it easier to implement just the - # lookup functionality in C. This object keeps track of cache - # invalidation data in two kinds of registries. - - # Invalidating registries have caches that are invalidated - # when they or their base registies change. An invalidating - # registry can only have invalidating registries as bases. - # See LookupBaseFallback below for the pertinent logic. - - # Verifying registies can't rely on getting invalidation messages, - # so have to check the generations of base registries to determine - # if their cache data are current. See VerifyingBasePy below - # for the pertinent object. - self._createLookup() - - # Setting the bases causes the registries described above - # to be initialized (self._setBases -> self.changed -> - # self._v_lookup.changed). - - self.__bases__ = bases - - def _setBases(self, bases): - self.__dict__['__bases__'] = bases - self.ro = ro.ro(self) - self.changed(self) - - __bases__ = property(lambda self: self.__dict__['__bases__'], - lambda self, bases: self._setBases(bases), - ) - - def _createLookup(self): - self._v_lookup = self.LookupClass(self) - for name in self._delegated: - self.__dict__[name] = getattr(self._v_lookup, name) - - def changed(self, originally_changed): - self._generation += 1 - self._v_lookup.changed(originally_changed) - - def register(self, required, provided, name, value): - if value is None: - self.unregister(required, provided, name, value) - return - - required = tuple(map(_convert_None_to_Interface, required)) - name = _normalize_name(name) - order = len(required) - byorder = self._adapters - while len(byorder) <= order: - byorder.append({}) - components = byorder[order] - key = required + (provided,) - - for k in key: - d = components.get(k) - if d is None: - d = {} - components[k] = d - components = d - - if components.get(name) is value: - return - - components[name] = value - - n = self._provided.get(provided, 0) + 1 - self._provided[provided] = n - if n == 1: - self._v_lookup.add_extendor(provided) - - self.changed(self) - - def registered(self, required, provided, name=_BLANK): - required = tuple(map(_convert_None_to_Interface, required)) - name = _normalize_name(name) - order = len(required) - byorder = self._adapters - if len(byorder) <= order: - return None - - components = byorder[order] - key = required + (provided,) - - for k in key: - d = components.get(k) - if d is None: - return None - components = d - - return components.get(name) - - def unregister(self, required, provided, name, value=None): - required = tuple(map(_convert_None_to_Interface, required)) - order = len(required) - byorder = self._adapters - if order >= len(byorder): - return False - components = byorder[order] - key = required + (provided,) - - # Keep track of how we got to `components`: - lookups = [] - # Keep track of how we got to `components`: - lookups = [] - for k in key: - d = components.get(k) - if d is None: - return - lookups.append((components, k)) - components = d - - old = components.get(name) - if old is None: - return - if (value is not None) and (old is not value): - return - - del components[name] - if not components: - # Clean out empty containers, since we don't want our keys - # to reference global objects (interfaces) unnecessarily. - # This is often a problem when an interface is slated for - # removal; a hold-over entry in the registry can make it - # difficult to remove such interfaces. - for comp, k in reversed(lookups): - d = comp[k] - if d: - break - else: - del comp[k] - while byorder and not byorder[-1]: - del byorder[-1] - n = self._provided[provided] - 1 - if n == 0: - del self._provided[provided] - self._v_lookup.remove_extendor(provided) - else: - self._provided[provided] = n - - self.changed(self) - - def subscribe(self, required, provided, value): - required = tuple(map(_convert_None_to_Interface, required)) - name = _BLANK - order = len(required) - byorder = self._subscribers - while len(byorder) <= order: - byorder.append({}) - components = byorder[order] - key = required + (provided,) - - for k in key: - d = components.get(k) - if d is None: - d = {} - components[k] = d - components = d - - components[name] = components.get(name, ()) + (value, ) - - if provided is not None: - n = self._provided.get(provided, 0) + 1 - self._provided[provided] = n - if n == 1: - self._v_lookup.add_extendor(provided) - - self.changed(self) - - def unsubscribe(self, required, provided, value=None): - required = tuple(map(_convert_None_to_Interface, required)) - order = len(required) - byorder = self._subscribers - if order >= len(byorder): - return - components = byorder[order] - key = required + (provided,) - - # Keep track of how we got to `components`: - lookups = [] - # Keep track of how we got to `components`: - lookups = [] - for k in key: - d = components.get(k) - if d is None: - return - lookups.append((components, k)) - components = d - - old = components.get(_BLANK) - if not old: - # this is belt-and-suspenders against the failure of cleanup below - return #pragma NO COVERAGE - - if value is None: - new = () - else: - new = tuple([v for v in old if v is not value]) - - if new == old: - return - - if new: - components[_BLANK] = new - else: - # Instead of setting components[_BLANK] = new, we clean out - # empty containers, since we don't want our keys to - # reference global objects (interfaces) unnecessarily. This - # is often a problem when an interface is slated for - # removal; a hold-over entry in the registry can make it - # difficult to remove such interfaces. - if _BLANK in components: - del components[_BLANK] - for comp, k in reversed(lookups): - d = comp[k] - if d: - break - else: - del comp[k] - while byorder and not byorder[-1]: - del byorder[-1] - - if provided is not None: - n = self._provided[provided] + len(new) - len(old) - if n == 0: - del self._provided[provided] - self._v_lookup.remove_extendor(provided) - - self.changed(self) - - # XXX hack to fake out twisted's use of a private api. We need to get them - # to use the new registed method. - def get(self, _): #pragma NO COVER - class XXXTwistedFakeOut: - selfImplied = {} - return XXXTwistedFakeOut - - -_not_in_mapping = object() -class LookupBaseFallback(object): - - def __init__(self): - self._cache = {} - self._mcache = {} - self._scache = {} - - def changed(self, ignored=None): - self._cache.clear() - self._mcache.clear() - self._scache.clear() - - def _getcache(self, provided, name): - cache = self._cache.get(provided) - if cache is None: - cache = {} - self._cache[provided] = cache - if name: - c = cache.get(name) - if c is None: - c = {} - cache[name] = c - cache = c - return cache - - def lookup(self, required, provided, name=_BLANK, default=None): - cache = self._getcache(provided, name) - required = tuple(required) - if len(required) == 1: - result = cache.get(required[0], _not_in_mapping) - else: - result = cache.get(tuple(required), _not_in_mapping) - - if result is _not_in_mapping: - result = self._uncached_lookup(required, provided, name) - if len(required) == 1: - cache[required[0]] = result - else: - cache[tuple(required)] = result - - if result is None: - return default - - return result - - def lookup1(self, required, provided, name=_BLANK, default=None): - cache = self._getcache(provided, name) - result = cache.get(required, _not_in_mapping) - if result is _not_in_mapping: - return self.lookup((required, ), provided, name, default) - - if result is None: - return default - - return result - - def queryAdapter(self, object, provided, name=_BLANK, default=None): - return self.adapter_hook(provided, object, name, default) - - def adapter_hook(self, provided, object, name=_BLANK, default=None): - required = providedBy(object) - cache = self._getcache(provided, name) - factory = cache.get(required, _not_in_mapping) - if factory is _not_in_mapping: - factory = self.lookup((required, ), provided, name) - - if factory is not None: - result = factory(object) - if result is not None: - return result - - return default - - def lookupAll(self, required, provided): - cache = self._mcache.get(provided) - if cache is None: - cache = {} - self._mcache[provided] = cache - - required = tuple(required) - result = cache.get(required, _not_in_mapping) - if result is _not_in_mapping: - result = self._uncached_lookupAll(required, provided) - cache[required] = result - - return result - - - def subscriptions(self, required, provided): - cache = self._scache.get(provided) - if cache is None: - cache = {} - self._scache[provided] = cache - - required = tuple(required) - result = cache.get(required, _not_in_mapping) - if result is _not_in_mapping: - result = self._uncached_subscriptions(required, provided) - cache[required] = result - - return result - -LookupBasePy = LookupBaseFallback # BBB - -try: - from _zope_interface_coptimizations import LookupBase -except ImportError: #pragma NO COVER - LookupBase = LookupBaseFallback - - -class VerifyingBaseFallback(LookupBaseFallback): - # Mixin for lookups against registries which "chain" upwards, and - # whose lookups invalidate their own caches whenever a parent registry - # bumps its own '_generation' counter. E.g., used by - # zope.component.persistentregistry - - def changed(self, originally_changed): - LookupBaseFallback.changed(self, originally_changed) - self._verify_ro = self._registry.ro[1:] - self._verify_generations = [r._generation for r in self._verify_ro] - - def _verify(self): - if ([r._generation for r in self._verify_ro] - != self._verify_generations): - self.changed(None) - - def _getcache(self, provided, name): - self._verify() - return LookupBaseFallback._getcache(self, provided, name) - - def lookupAll(self, required, provided): - self._verify() - return LookupBaseFallback.lookupAll(self, required, provided) - - def subscriptions(self, required, provided): - self._verify() - return LookupBaseFallback.subscriptions(self, required, provided) - -VerifyingBasePy = VerifyingBaseFallback #BBB - -try: - from _zope_interface_coptimizations import VerifyingBase -except ImportError: #pragma NO COVER - VerifyingBase = VerifyingBaseFallback - - -class AdapterLookupBase(object): - - def __init__(self, registry): - self._registry = registry - self._required = {} - self.init_extendors() - super(AdapterLookupBase, self).__init__() - - def changed(self, ignored=None): - super(AdapterLookupBase, self).changed(None) - for r in self._required.keys(): - r = r() - if r is not None: - r.unsubscribe(self) - self._required.clear() - - - # Extendors - # --------- - - # When given an target interface for an adapter lookup, we need to consider - # adapters for interfaces that extend the target interface. This is - # what the extendors dictionary is about. It tells us all of the - # interfaces that extend an interface for which there are adapters - # registered. - - # We could separate this by order and name, thus reducing the - # number of provided interfaces to search at run time. The tradeoff, - # however, is that we have to store more information. For example, - # is the same interface is provided for multiple names and if the - # interface extends many interfaces, we'll have to keep track of - # a fair bit of information for each name. It's better to - # be space efficient here and be time efficient in the cache - # implementation. - - # TODO: add invalidation when a provided interface changes, in case - # the interface's __iro__ has changed. This is unlikely enough that - # we'll take our chances for now. - - def init_extendors(self): - self._extendors = {} - for p in self._registry._provided: - self.add_extendor(p) - - def add_extendor(self, provided): - _extendors = self._extendors - for i in provided.__iro__: - extendors = _extendors.get(i, ()) - _extendors[i] = ( - [e for e in extendors if provided.isOrExtends(e)] - + - [provided] - + - [e for e in extendors if not provided.isOrExtends(e)] - ) - - def remove_extendor(self, provided): - _extendors = self._extendors - for i in provided.__iro__: - _extendors[i] = [e for e in _extendors.get(i, ()) - if e != provided] - - - def _subscribe(self, *required): - _refs = self._required - for r in required: - ref = r.weakref() - if ref not in _refs: - r.subscribe(self) - _refs[ref] = 1 - - def _uncached_lookup(self, required, provided, name=_BLANK): - required = tuple(required) - result = None - order = len(required) - for registry in self._registry.ro: - byorder = registry._adapters - if order >= len(byorder): - continue - - extendors = registry._v_lookup._extendors.get(provided) - if not extendors: - continue - - components = byorder[order] - result = _lookup(components, required, extendors, name, 0, - order) - if result is not None: - break - - self._subscribe(*required) - - return result - - def queryMultiAdapter(self, objects, provided, name=_BLANK, default=None): - factory = self.lookup(map(providedBy, objects), provided, name) - if factory is None: - return default - - result = factory(*objects) - if result is None: - return default - - return result - - def _uncached_lookupAll(self, required, provided): - required = tuple(required) - order = len(required) - result = {} - for registry in reversed(self._registry.ro): - byorder = registry._adapters - if order >= len(byorder): - continue - extendors = registry._v_lookup._extendors.get(provided) - if not extendors: - continue - components = byorder[order] - _lookupAll(components, required, extendors, result, 0, order) - - self._subscribe(*required) - - return tuple(result.items()) - - def names(self, required, provided): - return [c[0] for c in self.lookupAll(required, provided)] - - def _uncached_subscriptions(self, required, provided): - required = tuple(required) - order = len(required) - result = [] - for registry in reversed(self._registry.ro): - byorder = registry._subscribers - if order >= len(byorder): - continue - - if provided is None: - extendors = (provided, ) - else: - extendors = registry._v_lookup._extendors.get(provided) - if extendors is None: - continue - - _subscriptions(byorder[order], required, extendors, _BLANK, - result, 0, order) - - self._subscribe(*required) - - return result - - def subscribers(self, objects, provided): - subscriptions = self.subscriptions(map(providedBy, objects), provided) - if provided is None: - result = () - for subscription in subscriptions: - subscription(*objects) - else: - result = [] - for subscription in subscriptions: - subscriber = subscription(*objects) - if subscriber is not None: - result.append(subscriber) - return result - -class AdapterLookup(AdapterLookupBase, LookupBase): - pass - -class AdapterRegistry(BaseAdapterRegistry): - - LookupClass = AdapterLookup - - def __init__(self, bases=()): - # AdapterRegisties are invalidating registries, so - # we need to keep track of out invalidating subregistries. - self._v_subregistries = weakref.WeakKeyDictionary() - - super(AdapterRegistry, self).__init__(bases) - - def _addSubregistry(self, r): - self._v_subregistries[r] = 1 - - def _removeSubregistry(self, r): - if r in self._v_subregistries: - del self._v_subregistries[r] - - def _setBases(self, bases): - old = self.__dict__.get('__bases__', ()) - for r in old: - if r not in bases: - r._removeSubregistry(self) - for r in bases: - if r not in old: - r._addSubregistry(self) - - super(AdapterRegistry, self)._setBases(bases) - - def changed(self, originally_changed): - super(AdapterRegistry, self).changed(originally_changed) - - for sub in self._v_subregistries.keys(): - sub.changed(originally_changed) - - -class VerifyingAdapterLookup(AdapterLookupBase, VerifyingBase): - pass - -class VerifyingAdapterRegistry(BaseAdapterRegistry): - - LookupClass = VerifyingAdapterLookup - -def _convert_None_to_Interface(x): - if x is None: - return Interface - else: - return x - -def _lookup(components, specs, provided, name, i, l): - if i < l: - for spec in specs[i].__sro__: - comps = components.get(spec) - if comps: - r = _lookup(comps, specs, provided, name, i+1, l) - if r is not None: - return r - else: - for iface in provided: - comps = components.get(iface) - if comps: - r = comps.get(name) - if r is not None: - return r - - return None - -def _lookupAll(components, specs, provided, result, i, l): - if i < l: - for spec in reversed(specs[i].__sro__): - comps = components.get(spec) - if comps: - _lookupAll(comps, specs, provided, result, i+1, l) - else: - for iface in reversed(provided): - comps = components.get(iface) - if comps: - result.update(comps) - -def _subscriptions(components, specs, provided, name, result, i, l): - if i < l: - for spec in reversed(specs[i].__sro__): - comps = components.get(spec) - if comps: - _subscriptions(comps, specs, provided, name, result, i+1, l) - else: - for iface in reversed(provided): - comps = components.get(iface) - if comps: - comps = comps.get(name) - if comps: - result.extend(comps) diff --git a/zope/interface/advice.py b/zope/interface/advice.py deleted file mode 100644 index 788663f0..00000000 --- a/zope/interface/advice.py +++ /dev/null @@ -1,206 +0,0 @@ -############################################################################## -# -# Copyright (c) 2003 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Class advice. - -This module was adapted from 'protocols.advice', part of the Python -Enterprise Application Kit (PEAK). Please notify the PEAK authors -(pje@telecommunity.com and tsarna@sarna.org) if bugs are found or -Zope-specific changes are required, so that the PEAK version of this module -can be kept in sync. - -PEAK is a Python application framework that interoperates with (but does -not require) Zope 3 and Twisted. It provides tools for manipulating UML -models, object-relational persistence, aspect-oriented programming, and more. -Visit the PEAK home page at http://peak.telecommunity.com for more information. -""" - -from types import FunctionType -try: - from types import ClassType -except ImportError: #pragma NO COVER Python > 3.x - __python3 = True -else: #pragma NO COVER Python < 3.x - __python3 = False - -import sys - -def getFrameInfo(frame): - """Return (kind,module,locals,globals) for a frame - - 'kind' is one of "exec", "module", "class", "function call", or "unknown". - """ - - f_locals = frame.f_locals - f_globals = frame.f_globals - - sameNamespace = f_locals is f_globals - hasModule = '__module__' in f_locals - hasName = '__name__' in f_globals - - sameName = hasModule and hasName - sameName = sameName and f_globals['__name__']==f_locals['__module__'] - - module = hasName and sys.modules.get(f_globals['__name__']) or None - - namespaceIsModule = module and module.__dict__ is f_globals - - if not namespaceIsModule: - # some kind of funky exec - kind = "exec" - elif sameNamespace and not hasModule: - kind = "module" - elif sameName and not sameNamespace: - kind = "class" - elif not sameNamespace: - kind = "function call" - else: # pragma NO COVER - # How can you have f_locals is f_globals, and have '__module__' set? - # This is probably module-level code, but with a '__module__' variable. - kind = "unknown" - return kind, module, f_locals, f_globals - - -def addClassAdvisor(callback, depth=2): - """Set up 'callback' to be passed the containing class upon creation - - This function is designed to be called by an "advising" function executed - in a class suite. The "advising" function supplies a callback that it - wishes to have executed when the containing class is created. The - callback will be given one argument: the newly created containing class. - The return value of the callback will be used in place of the class, so - the callback should return the input if it does not wish to replace the - class. - - The optional 'depth' argument to this function determines the number of - frames between this function and the targeted class suite. 'depth' - defaults to 2, since this skips this function's frame and one calling - function frame. If you use this function from a function called directly - in the class suite, the default will be correct, otherwise you will need - to determine the correct depth yourself. - - This function works by installing a special class factory function in - place of the '__metaclass__' of the containing class. Therefore, only - callbacks *after* the last '__metaclass__' assignment in the containing - class will be executed. Be sure that classes using "advising" functions - declare any '__metaclass__' *first*, to ensure all callbacks are run.""" - # This entire approach is invalid under Py3K. Don't even try to fix - # the coverage for this block there. :( - if __python3: #pragma NO COVER - raise TypeError('Class advice impossible in Python3') - - frame = sys._getframe(depth) - kind, module, caller_locals, caller_globals = getFrameInfo(frame) - - # This causes a problem when zope interfaces are used from doctest. - # In these cases, kind == "exec". - # - #if kind != "class": - # raise SyntaxError( - # "Advice must be in the body of a class statement" - # ) - - previousMetaclass = caller_locals.get('__metaclass__') - if __python3: # pragma NO COVER - defaultMetaclass = caller_globals.get('__metaclass__', type) - else: - defaultMetaclass = caller_globals.get('__metaclass__', ClassType) - - - def advise(name, bases, cdict): - - if '__metaclass__' in cdict: - del cdict['__metaclass__'] - - if previousMetaclass is None: - if bases: - # find best metaclass or use global __metaclass__ if no bases - meta = determineMetaclass(bases) - else: - meta = defaultMetaclass - - elif isClassAdvisor(previousMetaclass): - # special case: we can't compute the "true" metaclass here, - # so we need to invoke the previous metaclass and let it - # figure it out for us (and apply its own advice in the process) - meta = previousMetaclass - - else: - meta = determineMetaclass(bases, previousMetaclass) - - newClass = meta(name,bases,cdict) - - # this lets the callback replace the class completely, if it wants to - return callback(newClass) - - # introspection data only, not used by inner function - advise.previousMetaclass = previousMetaclass - advise.callback = callback - - # install the advisor - caller_locals['__metaclass__'] = advise - - -def isClassAdvisor(ob): - """True if 'ob' is a class advisor function""" - return isinstance(ob,FunctionType) and hasattr(ob,'previousMetaclass') - - -def determineMetaclass(bases, explicit_mc=None): - """Determine metaclass from 1+ bases and optional explicit __metaclass__""" - - meta = [getattr(b,'__class__',type(b)) for b in bases] - - if explicit_mc is not None: - # The explicit metaclass needs to be verified for compatibility - # as well, and allowed to resolve the incompatible bases, if any - meta.append(explicit_mc) - - if len(meta)==1: - # easy case - return meta[0] - - candidates = minimalBases(meta) # minimal set of metaclasses - - if not candidates: #pragma NO COVER - # they're all "classic" classes - assert(not __python3) # This should not happen under Python 3 - return ClassType - - elif len(candidates)>1: - # We could auto-combine, but for now we won't... - raise TypeError("Incompatible metatypes",bases) - - # Just one, return it - return candidates[0] - - -def minimalBases(classes): - """Reduce a list of base classes to its ordered minimum equivalent""" - - if not __python3: #pragma NO COVER - classes = [c for c in classes if c is not ClassType] - candidates = [] - - for m in classes: - for n in classes: - if issubclass(n,m) and m is not n: - break - else: - # m has no subclasses in 'classes' - if m in candidates: - candidates.remove(m) # ensure that we're later in the list - candidates.append(m) - - return candidates - diff --git a/zope/interface/common/__init__.py b/zope/interface/common/__init__.py deleted file mode 100644 index b711d360..00000000 --- a/zope/interface/common/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# -# This file is necessary to make this directory a package. diff --git a/zope/interface/common/idatetime.py b/zope/interface/common/idatetime.py deleted file mode 100644 index e8700af9..00000000 --- a/zope/interface/common/idatetime.py +++ /dev/null @@ -1,575 +0,0 @@ -############################################################################## -# Copyright (c) 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -############################################################################## -"""Datetime interfaces. - -This module is called idatetime because if it were called datetime the import -of the real datetime would fail. -""" - -from zope.interface import Interface, Attribute -from zope.interface import classImplements - -from datetime import timedelta, date, datetime, time, tzinfo - - -class ITimeDeltaClass(Interface): - """This is the timedelta class interface.""" - - min = Attribute("The most negative timedelta object") - - max = Attribute("The most positive timedelta object") - - resolution = Attribute( - "The smallest difference between non-equal timedelta objects") - - -class ITimeDelta(ITimeDeltaClass): - """Represent the difference between two datetime objects. - - Supported operators: - - - add, subtract timedelta - - unary plus, minus, abs - - compare to timedelta - - multiply, divide by int/long - - In addition, datetime supports subtraction of two datetime objects - returning a timedelta, and addition or subtraction of a datetime - and a timedelta giving a datetime. - - Representation: (days, seconds, microseconds). - """ - - days = Attribute("Days between -999999999 and 999999999 inclusive") - - seconds = Attribute("Seconds between 0 and 86399 inclusive") - - microseconds = Attribute("Microseconds between 0 and 999999 inclusive") - - -class IDateClass(Interface): - """This is the date class interface.""" - - min = Attribute("The earliest representable date") - - max = Attribute("The latest representable date") - - resolution = Attribute( - "The smallest difference between non-equal date objects") - - def today(): - """Return the current local time. - - This is equivalent to date.fromtimestamp(time.time())""" - - def fromtimestamp(timestamp): - """Return the local date from a POSIX timestamp (like time.time()) - - This may raise ValueError, if the timestamp is out of the range of - values supported by the platform C localtime() function. It's common - for this to be restricted to years from 1970 through 2038. Note that - on non-POSIX systems that include leap seconds in their notion of a - timestamp, leap seconds are ignored by fromtimestamp(). - """ - - def fromordinal(ordinal): - """Return the date corresponding to the proleptic Gregorian ordinal. - - January 1 of year 1 has ordinal 1. ValueError is raised unless - 1 <= ordinal <= date.max.toordinal(). - For any date d, date.fromordinal(d.toordinal()) == d. - """ - - -class IDate(IDateClass): - """Represents a date (year, month and day) in an idealized calendar. - - Operators: - - __repr__, __str__ - __cmp__, __hash__ - __add__, __radd__, __sub__ (add/radd only with timedelta arg) - """ - - year = Attribute("Between MINYEAR and MAXYEAR inclusive.") - - month = Attribute("Between 1 and 12 inclusive") - - day = Attribute( - "Between 1 and the number of days in the given month of the given year.") - - def replace(year, month, day): - """Return a date with the same value. - - Except for those members given new values by whichever keyword - arguments are specified. For example, if d == date(2002, 12, 31), then - d.replace(day=26) == date(2000, 12, 26). - """ - - def timetuple(): - """Return a 9-element tuple of the form returned by time.localtime(). - - The hours, minutes and seconds are 0, and the DST flag is -1. - d.timetuple() is equivalent to - (d.year, d.month, d.day, 0, 0, 0, d.weekday(), d.toordinal() - - date(d.year, 1, 1).toordinal() + 1, -1) - """ - - def toordinal(): - """Return the proleptic Gregorian ordinal of the date - - January 1 of year 1 has ordinal 1. For any date object d, - date.fromordinal(d.toordinal()) == d. - """ - - def weekday(): - """Return the day of the week as an integer. - - Monday is 0 and Sunday is 6. For example, - date(2002, 12, 4).weekday() == 2, a Wednesday. - - See also isoweekday(). - """ - - def isoweekday(): - """Return the day of the week as an integer. - - Monday is 1 and Sunday is 7. For example, - date(2002, 12, 4).isoweekday() == 3, a Wednesday. - - See also weekday(), isocalendar(). - """ - - def isocalendar(): - """Return a 3-tuple, (ISO year, ISO week number, ISO weekday). - - The ISO calendar is a widely used variant of the Gregorian calendar. - See http://www.phys.uu.nl/~vgent/calendar/isocalendar.htm for a good - explanation. - - The ISO year consists of 52 or 53 full weeks, and where a week starts - on a Monday and ends on a Sunday. The first week of an ISO year is the - first (Gregorian) calendar week of a year containing a Thursday. This - is called week number 1, and the ISO year of that Thursday is the same - as its Gregorian year. - - For example, 2004 begins on a Thursday, so the first week of ISO year - 2004 begins on Monday, 29 Dec 2003 and ends on Sunday, 4 Jan 2004, so - that date(2003, 12, 29).isocalendar() == (2004, 1, 1) and - date(2004, 1, 4).isocalendar() == (2004, 1, 7). - """ - - def isoformat(): - """Return a string representing the date in ISO 8601 format. - - This is 'YYYY-MM-DD'. - For example, date(2002, 12, 4).isoformat() == '2002-12-04'. - """ - - def __str__(): - """For a date d, str(d) is equivalent to d.isoformat().""" - - def ctime(): - """Return a string representing the date. - - For example date(2002, 12, 4).ctime() == 'Wed Dec 4 00:00:00 2002'. - d.ctime() is equivalent to time.ctime(time.mktime(d.timetuple())) - on platforms where the native C ctime() function - (which time.ctime() invokes, but which date.ctime() does not invoke) - conforms to the C standard. - """ - - def strftime(format): - """Return a string representing the date. - - Controlled by an explicit format string. Format codes referring to - hours, minutes or seconds will see 0 values. - """ - - -class IDateTimeClass(Interface): - """This is the datetime class interface.""" - - min = Attribute("The earliest representable datetime") - - max = Attribute("The latest representable datetime") - - resolution = Attribute( - "The smallest possible difference between non-equal datetime objects") - - def today(): - """Return the current local datetime, with tzinfo None. - - This is equivalent to datetime.fromtimestamp(time.time()). - See also now(), fromtimestamp(). - """ - - def now(tz=None): - """Return the current local date and time. - - If optional argument tz is None or not specified, this is like today(), - but, if possible, supplies more precision than can be gotten from going - through a time.time() timestamp (for example, this may be possible on - platforms supplying the C gettimeofday() function). - - Else tz must be an instance of a class tzinfo subclass, and the current - date and time are converted to tz's time zone. In this case the result - is equivalent to tz.fromutc(datetime.utcnow().replace(tzinfo=tz)). - - See also today(), utcnow(). - """ - - def utcnow(): - """Return the current UTC date and time, with tzinfo None. - - This is like now(), but returns the current UTC date and time, as a - naive datetime object. - - See also now(). - """ - - def fromtimestamp(timestamp, tz=None): - """Return the local date and time corresponding to the POSIX timestamp. - - Same as is returned by time.time(). If optional argument tz is None or - not specified, the timestamp is converted to the platform's local date - and time, and the returned datetime object is naive. - - Else tz must be an instance of a class tzinfo subclass, and the - timestamp is converted to tz's time zone. In this case the result is - equivalent to - tz.fromutc(datetime.utcfromtimestamp(timestamp).replace(tzinfo=tz)). - - fromtimestamp() may raise ValueError, if the timestamp is out of the - range of values supported by the platform C localtime() or gmtime() - functions. It's common for this to be restricted to years in 1970 - through 2038. Note that on non-POSIX systems that include leap seconds - in their notion of a timestamp, leap seconds are ignored by - fromtimestamp(), and then it's possible to have two timestamps - differing by a second that yield identical datetime objects. - - See also utcfromtimestamp(). - """ - - def utcfromtimestamp(timestamp): - """Return the UTC datetime from the POSIX timestamp with tzinfo None. - - This may raise ValueError, if the timestamp is out of the range of - values supported by the platform C gmtime() function. It's common for - this to be restricted to years in 1970 through 2038. - - See also fromtimestamp(). - """ - - def fromordinal(ordinal): - """Return the datetime from the proleptic Gregorian ordinal. - - January 1 of year 1 has ordinal 1. ValueError is raised unless - 1 <= ordinal <= datetime.max.toordinal(). - The hour, minute, second and microsecond of the result are all 0, and - tzinfo is None. - """ - - def combine(date, time): - """Return a new datetime object. - - Its date members are equal to the given date object's, and whose time - and tzinfo members are equal to the given time object's. For any - datetime object d, d == datetime.combine(d.date(), d.timetz()). - If date is a datetime object, its time and tzinfo members are ignored. - """ - - -class IDateTime(IDate, IDateTimeClass): - """Object contains all the information from a date object and a time object. - """ - - year = Attribute("Year between MINYEAR and MAXYEAR inclusive") - - month = Attribute("Month between 1 and 12 inclusive") - - day = Attribute( - "Day between 1 and the number of days in the given month of the year") - - hour = Attribute("Hour in range(24)") - - minute = Attribute("Minute in range(60)") - - second = Attribute("Second in range(60)") - - microsecond = Attribute("Microsecond in range(1000000)") - - tzinfo = Attribute( - """The object passed as the tzinfo argument to the datetime constructor - or None if none was passed""") - - def date(): - """Return date object with same year, month and day.""" - - def time(): - """Return time object with same hour, minute, second, microsecond. - - tzinfo is None. See also method timetz(). - """ - - def timetz(): - """Return time object with same hour, minute, second, microsecond, - and tzinfo. - - See also method time(). - """ - - def replace(year, month, day, hour, minute, second, microsecond, tzinfo): - """Return a datetime with the same members, except for those members - given new values by whichever keyword arguments are specified. - - Note that tzinfo=None can be specified to create a naive datetime from - an aware datetime with no conversion of date and time members. - """ - - def astimezone(tz): - """Return a datetime object with new tzinfo member tz, adjusting the - date and time members so the result is the same UTC time as self, but - in tz's local time. - - tz must be an instance of a tzinfo subclass, and its utcoffset() and - dst() methods must not return None. self must be aware (self.tzinfo - must not be None, and self.utcoffset() must not return None). - - If self.tzinfo is tz, self.astimezone(tz) is equal to self: no - adjustment of date or time members is performed. Else the result is - local time in time zone tz, representing the same UTC time as self: - after astz = dt.astimezone(tz), astz - astz.utcoffset() - will usually have the same date and time members as dt - dt.utcoffset(). - The discussion of class tzinfo explains the cases at Daylight Saving - Time transition boundaries where this cannot be achieved (an issue only - if tz models both standard and daylight time). - - If you merely want to attach a time zone object tz to a datetime dt - without adjustment of date and time members, use dt.replace(tzinfo=tz). - If you merely want to remove the time zone object from an aware - datetime dt without conversion of date and time members, use - dt.replace(tzinfo=None). - - Note that the default tzinfo.fromutc() method can be overridden in a - tzinfo subclass to effect the result returned by astimezone(). - """ - - def utcoffset(): - """Return the timezone offset in minutes east of UTC (negative west of - UTC).""" - - def dst(): - """Return 0 if DST is not in effect, or the DST offset (in minutes - eastward) if DST is in effect. - """ - - def tzname(): - """Return the timezone name.""" - - def timetuple(): - """Return a 9-element tuple of the form returned by time.localtime().""" - - def utctimetuple(): - """Return UTC time tuple compatilble with time.gmtimr().""" - - def toordinal(): - """Return the proleptic Gregorian ordinal of the date. - - The same as self.date().toordinal(). - """ - - def weekday(): - """Return the day of the week as an integer. - - Monday is 0 and Sunday is 6. The same as self.date().weekday(). - See also isoweekday(). - """ - - def isoweekday(): - """Return the day of the week as an integer. - - Monday is 1 and Sunday is 7. The same as self.date().isoweekday. - See also weekday(), isocalendar(). - """ - - def isocalendar(): - """Return a 3-tuple, (ISO year, ISO week number, ISO weekday). - - The same as self.date().isocalendar(). - """ - - def isoformat(sep='T'): - """Return a string representing the date and time in ISO 8601 format. - - YYYY-MM-DDTHH:MM:SS.mmmmmm or YYYY-MM-DDTHH:MM:SS if microsecond is 0 - - If utcoffset() does not return None, a 6-character string is appended, - giving the UTC offset in (signed) hours and minutes: - - YYYY-MM-DDTHH:MM:SS.mmmmmm+HH:MM or YYYY-MM-DDTHH:MM:SS+HH:MM - if microsecond is 0. - - The optional argument sep (default 'T') is a one-character separator, - placed between the date and time portions of the result. - """ - - def __str__(): - """For a datetime instance d, str(d) is equivalent to d.isoformat(' '). - """ - - def ctime(): - """Return a string representing the date and time. - - datetime(2002, 12, 4, 20, 30, 40).ctime() == 'Wed Dec 4 20:30:40 2002'. - d.ctime() is equivalent to time.ctime(time.mktime(d.timetuple())) on - platforms where the native C ctime() function (which time.ctime() - invokes, but which datetime.ctime() does not invoke) conforms to the - C standard. - """ - - def strftime(format): - """Return a string representing the date and time. - - This is controlled by an explicit format string. - """ - - -class ITimeClass(Interface): - """This is the time class interface.""" - - min = Attribute("The earliest representable time") - - max = Attribute("The latest representable time") - - resolution = Attribute( - "The smallest possible difference between non-equal time objects") - - -class ITime(ITimeClass): - """Represent time with time zone. - - Operators: - - __repr__, __str__ - __cmp__, __hash__ - """ - - hour = Attribute("Hour in range(24)") - - minute = Attribute("Minute in range(60)") - - second = Attribute("Second in range(60)") - - microsecond = Attribute("Microsecond in range(1000000)") - - tzinfo = Attribute( - """The object passed as the tzinfo argument to the time constructor - or None if none was passed.""") - - def replace(hour, minute, second, microsecond, tzinfo): - """Return a time with the same value. - - Except for those members given new values by whichever keyword - arguments are specified. Note that tzinfo=None can be specified - to create a naive time from an aware time, without conversion of the - time members. - """ - - def isoformat(): - """Return a string representing the time in ISO 8601 format. - - That is HH:MM:SS.mmmmmm or, if self.microsecond is 0, HH:MM:SS - If utcoffset() does not return None, a 6-character string is appended, - giving the UTC offset in (signed) hours and minutes: - HH:MM:SS.mmmmmm+HH:MM or, if self.microsecond is 0, HH:MM:SS+HH:MM - """ - - def __str__(): - """For a time t, str(t) is equivalent to t.isoformat().""" - - def strftime(format): - """Return a string representing the time. - - This is controlled by an explicit format string. - """ - - def utcoffset(): - """Return the timezone offset in minutes east of UTC (negative west of - UTC). - - If tzinfo is None, returns None, else returns - self.tzinfo.utcoffset(None), and raises an exception if the latter - doesn't return None or a timedelta object representing a whole number - of minutes with magnitude less than one day. - """ - - def dst(): - """Return 0 if DST is not in effect, or the DST offset (in minutes - eastward) if DST is in effect. - - If tzinfo is None, returns None, else returns self.tzinfo.dst(None), - and raises an exception if the latter doesn't return None, or a - timedelta object representing a whole number of minutes with - magnitude less than one day. - """ - - def tzname(): - """Return the timezone name. - - If tzinfo is None, returns None, else returns self.tzinfo.tzname(None), - or raises an exception if the latter doesn't return None or a string - object. - """ - - -class ITZInfo(Interface): - """Time zone info class. - """ - - def utcoffset(dt): - """Return offset of local time from UTC, in minutes east of UTC. - - If local time is west of UTC, this should be negative. - Note that this is intended to be the total offset from UTC; - for example, if a tzinfo object represents both time zone and DST - adjustments, utcoffset() should return their sum. If the UTC offset - isn't known, return None. Else the value returned must be a timedelta - object specifying a whole number of minutes in the range -1439 to 1439 - inclusive (1440 = 24*60; the magnitude of the offset must be less - than one day). - """ - - def dst(dt): - """Return the daylight saving time (DST) adjustment, in minutes east - of UTC, or None if DST information isn't known. - """ - - def tzname(dt): - """Return the time zone name corresponding to the datetime object as - a string. - """ - - def fromutc(dt): - """Return an equivalent datetime in self's local time.""" - - -classImplements(timedelta, ITimeDelta) -classImplements(date, IDate) -classImplements(datetime, IDateTime) -classImplements(time, ITime) -classImplements(tzinfo, ITZInfo) - -## directlyProvides(timedelta, ITimeDeltaClass) -## directlyProvides(date, IDateClass) -## directlyProvides(datetime, IDateTimeClass) -## directlyProvides(time, ITimeClass) diff --git a/zope/interface/common/interfaces.py b/zope/interface/common/interfaces.py deleted file mode 100644 index 6274e6db..00000000 --- a/zope/interface/common/interfaces.py +++ /dev/null @@ -1,102 +0,0 @@ -############################################################################## -# -# Copyright (c) 2003 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Interfaces for standard python exceptions -""" -from zope.interface import Interface -from zope.interface import classImplements - -class IException(Interface): pass -class IStandardError(IException): pass -class IWarning(IException): pass -class ISyntaxError(IStandardError): pass -class ILookupError(IStandardError): pass -class IValueError(IStandardError): pass -class IRuntimeError(IStandardError): pass -class IArithmeticError(IStandardError): pass -class IAssertionError(IStandardError): pass -class IAttributeError(IStandardError): pass -class IDeprecationWarning(IWarning): pass -class IEOFError(IStandardError): pass -class IEnvironmentError(IStandardError): pass -class IFloatingPointError(IArithmeticError): pass -class IIOError(IEnvironmentError): pass -class IImportError(IStandardError): pass -class IIndentationError(ISyntaxError): pass -class IIndexError(ILookupError): pass -class IKeyError(ILookupError): pass -class IKeyboardInterrupt(IStandardError): pass -class IMemoryError(IStandardError): pass -class INameError(IStandardError): pass -class INotImplementedError(IRuntimeError): pass -class IOSError(IEnvironmentError): pass -class IOverflowError(IArithmeticError): pass -class IOverflowWarning(IWarning): pass -class IReferenceError(IStandardError): pass -class IRuntimeWarning(IWarning): pass -class IStopIteration(IException): pass -class ISyntaxWarning(IWarning): pass -class ISystemError(IStandardError): pass -class ISystemExit(IException): pass -class ITabError(IIndentationError): pass -class ITypeError(IStandardError): pass -class IUnboundLocalError(INameError): pass -class IUnicodeError(IValueError): pass -class IUserWarning(IWarning): pass -class IZeroDivisionError(IArithmeticError): pass - -classImplements(ArithmeticError, IArithmeticError) -classImplements(AssertionError, IAssertionError) -classImplements(AttributeError, IAttributeError) -classImplements(DeprecationWarning, IDeprecationWarning) -classImplements(EnvironmentError, IEnvironmentError) -classImplements(EOFError, IEOFError) -classImplements(Exception, IException) -classImplements(FloatingPointError, IFloatingPointError) -classImplements(ImportError, IImportError) -classImplements(IndentationError, IIndentationError) -classImplements(IndexError, IIndexError) -classImplements(IOError, IIOError) -classImplements(KeyboardInterrupt, IKeyboardInterrupt) -classImplements(KeyError, IKeyError) -classImplements(LookupError, ILookupError) -classImplements(MemoryError, IMemoryError) -classImplements(NameError, INameError) -classImplements(NotImplementedError, INotImplementedError) -classImplements(OSError, IOSError) -classImplements(OverflowError, IOverflowError) -try: - classImplements(OverflowWarning, IOverflowWarning) -except NameError: #pragma NO COVER - pass # OverflowWarning was removed in Python 2.5 -classImplements(ReferenceError, IReferenceError) -classImplements(RuntimeError, IRuntimeError) -classImplements(RuntimeWarning, IRuntimeWarning) -try: - classImplements(StandardError, IStandardError) -except NameError: #pragma NO COVER - pass # StandardError does not exist in Python 3 -classImplements(StopIteration, IStopIteration) -classImplements(SyntaxError, ISyntaxError) -classImplements(SyntaxWarning, ISyntaxWarning) -classImplements(SystemError, ISystemError) -classImplements(SystemExit, ISystemExit) -classImplements(TabError, ITabError) -classImplements(TypeError, ITypeError) -classImplements(UnboundLocalError, IUnboundLocalError) -classImplements(UnicodeError, IUnicodeError) -classImplements(UserWarning, IUserWarning) -classImplements(ValueError, IValueError) -classImplements(Warning, IWarning) -classImplements(ZeroDivisionError, IZeroDivisionError) - diff --git a/zope/interface/common/mapping.py b/zope/interface/common/mapping.py deleted file mode 100644 index 139715f2..00000000 --- a/zope/interface/common/mapping.py +++ /dev/null @@ -1,125 +0,0 @@ -############################################################################## -# -# Copyright (c) 2001, 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Mapping Interfaces -""" -from zope.interface import Interface - -class IItemMapping(Interface): - """Simplest readable mapping object - """ - - def __getitem__(key): - """Get a value for a key - - A KeyError is raised if there is no value for the key. - """ - - -class IReadMapping(IItemMapping): - """Basic mapping interface - """ - - def get(key, default=None): - """Get a value for a key - - The default is returned if there is no value for the key. - """ - - def __contains__(key): - """Tell if a key exists in the mapping.""" - - -class IWriteMapping(Interface): - """Mapping methods for changing data""" - - def __delitem__(key): - """Delete a value from the mapping using the key.""" - - def __setitem__(key, value): - """Set a new item in the mapping.""" - - -class IEnumerableMapping(IReadMapping): - """Mapping objects whose items can be enumerated. - """ - - def keys(): - """Return the keys of the mapping object. - """ - - def __iter__(): - """Return an iterator for the keys of the mapping object. - """ - - def values(): - """Return the values of the mapping object. - """ - - def items(): - """Return the items of the mapping object. - """ - - def __len__(): - """Return the number of items. - """ - -class IMapping(IWriteMapping, IEnumerableMapping): - ''' Simple mapping interface ''' - -class IIterableMapping(IEnumerableMapping): - - def iterkeys(): - "iterate over keys; equivalent to __iter__" - - def itervalues(): - "iterate over values" - - def iteritems(): - "iterate over items" - -class IClonableMapping(Interface): - - def copy(): - "return copy of dict" - -class IExtendedReadMapping(IIterableMapping): - - def has_key(key): - """Tell if a key exists in the mapping; equivalent to __contains__""" - -class IExtendedWriteMapping(IWriteMapping): - - def clear(): - "delete all items" - - def update(d): - " Update D from E: for k in E.keys(): D[k] = E[k]" - - def setdefault(key, default=None): - "D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D" - - def pop(k, *args): - """remove specified key and return the corresponding value - *args may contain a single default value, or may not be supplied. - If key is not found, default is returned if given, otherwise - KeyError is raised""" - - def popitem(): - """remove and return some (key, value) pair as a - 2-tuple; but raise KeyError if mapping is empty""" - -class IFullMapping( - IExtendedReadMapping, IExtendedWriteMapping, IClonableMapping, IMapping): - ''' Full mapping interface ''' # IMapping included so tests for IMapping - # succeed with IFullMapping diff --git a/zope/interface/common/sequence.py b/zope/interface/common/sequence.py deleted file mode 100644 index 223a94eb..00000000 --- a/zope/interface/common/sequence.py +++ /dev/null @@ -1,160 +0,0 @@ -############################################################################## -# -# Copyright (c) 2001, 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Sequence Interfaces -""" -__docformat__ = 'restructuredtext' -from zope import interface - -class IMinimalSequence(interface.Interface): - """Most basic sequence interface. - - All sequences are iterable. This requires at least one of the - following: - - - a `__getitem__()` method that takes a single argument; interger - values starting at 0 must be supported, and `IndexError` should - be raised for the first index for which there is no value, or - - - an `__iter__()` method that returns an iterator as defined in - the Python documentation (http://docs.python.org/lib/typeiter.html). - - """ - - def __getitem__(index): - """`x.__getitem__(index)` <==> `x[index]` - - Declaring this interface does not specify whether `__getitem__` - supports slice objects.""" - -class IFiniteSequence(IMinimalSequence): - - def __len__(): - """`x.__len__()` <==> `len(x)`""" - -class IReadSequence(IFiniteSequence): - """read interface shared by tuple and list""" - - def __contains__(item): - """`x.__contains__(item)` <==> `item in x`""" - - def __lt__(other): - """`x.__lt__(other)` <==> `x < other`""" - - def __le__(other): - """`x.__le__(other)` <==> `x <= other`""" - - def __eq__(other): - """`x.__eq__(other)` <==> `x == other`""" - - def __ne__(other): - """`x.__ne__(other)` <==> `x != other`""" - - def __gt__(other): - """`x.__gt__(other)` <==> `x > other`""" - - def __ge__(other): - """`x.__ge__(other)` <==> `x >= other`""" - - def __add__(other): - """`x.__add__(other)` <==> `x + other`""" - - def __mul__(n): - """`x.__mul__(n)` <==> `x * n`""" - - def __rmul__(n): - """`x.__rmul__(n)` <==> `n * x`""" - - def __getslice__(i, j): - """`x.__getslice__(i, j)` <==> `x[i:j]` - - Use of negative indices is not supported. - - Deprecated since Python 2.0 but still a part of `UserList`. - """ - -class IExtendedReadSequence(IReadSequence): - """Full read interface for lists""" - - def count(item): - """Return number of occurrences of value""" - - def index(item, *args): - """Return first index of value - - `L.index(value, [start, [stop]])` -> integer""" - -class IUniqueMemberWriteSequence(interface.Interface): - """The write contract for a sequence that may enforce unique members""" - - def __setitem__(index, item): - """`x.__setitem__(index, item)` <==> `x[index] = item` - - Declaring this interface does not specify whether `__setitem__` - supports slice objects. - """ - - def __delitem__(index): - """`x.__delitem__(index)` <==> `del x[index]` - - Declaring this interface does not specify whether `__delitem__` - supports slice objects. - """ - - def __setslice__(i, j, other): - """`x.__setslice__(i, j, other)` <==> `x[i:j]=other` - - Use of negative indices is not supported. - - Deprecated since Python 2.0 but still a part of `UserList`. - """ - - def __delslice__(i, j): - """`x.__delslice__(i, j)` <==> `del x[i:j]` - - Use of negative indices is not supported. - - Deprecated since Python 2.0 but still a part of `UserList`. - """ - def __iadd__(y): - """`x.__iadd__(y)` <==> `x += y`""" - - def append(item): - """Append item to end""" - - def insert(index, item): - """Insert item before index""" - - def pop(index=-1): - """Remove and return item at index (default last)""" - - def remove(item): - """Remove first occurrence of value""" - - def reverse(): - """Reverse *IN PLACE*""" - - def sort(cmpfunc=None): - """Stable sort *IN PLACE*; `cmpfunc(x, y)` -> -1, 0, 1""" - - def extend(iterable): - """Extend list by appending elements from the iterable""" - -class IWriteSequence(IUniqueMemberWriteSequence): - """Full write contract for sequences""" - - def __imul__(n): - """`x.__imul__(n)` <==> `x *= n`""" - -class ISequence(IReadSequence, IWriteSequence): - """Full sequence contract""" diff --git a/zope/interface/common/tests/__init__.py b/zope/interface/common/tests/__init__.py deleted file mode 100644 index b711d360..00000000 --- a/zope/interface/common/tests/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -# -# This file is necessary to make this directory a package. diff --git a/zope/interface/common/tests/basemapping.py b/zope/interface/common/tests/basemapping.py deleted file mode 100644 index 66f0ee43..00000000 --- a/zope/interface/common/tests/basemapping.py +++ /dev/null @@ -1,107 +0,0 @@ -############################################################################## -# -# Copyright (c) 2001, 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Base Mapping tests -""" -from operator import __getitem__ - -def testIReadMapping(self, inst, state, absent): - for key in state: - self.assertEqual(inst[key], state[key]) - self.assertEqual(inst.get(key, None), state[key]) - self.failUnless(key in inst) - - for key in absent: - self.assertEqual(inst.get(key, None), None) - self.assertEqual(inst.get(key), None) - self.assertEqual(inst.get(key, self), self) - self.assertRaises(KeyError, __getitem__, inst, key) - - -def test_keys(self, inst, state): - # Return the keys of the mapping object - inst_keys = list(inst.keys()); inst_keys.sort() - state_keys = list(state.keys()) ; state_keys.sort() - self.assertEqual(inst_keys, state_keys) - -def test_iter(self, inst, state): - # Return the keys of the mapping object - inst_keys = list(inst); inst_keys.sort() - state_keys = list(state.keys()) ; state_keys.sort() - self.assertEqual(inst_keys, state_keys) - -def test_values(self, inst, state): - # Return the values of the mapping object - inst_values = list(inst.values()); inst_values.sort() - state_values = list(state.values()) ; state_values.sort() - self.assertEqual(inst_values, state_values) - -def test_items(self, inst, state): - # Return the items of the mapping object - inst_items = list(inst.items()); inst_items.sort() - state_items = list(state.items()) ; state_items.sort() - self.assertEqual(inst_items, state_items) - -def test___len__(self, inst, state): - # Return the number of items - self.assertEqual(len(inst), len(state)) - -def testIEnumerableMapping(self, inst, state): - test_keys(self, inst, state) - test_items(self, inst, state) - test_values(self, inst, state) - test___len__(self, inst, state) - - -class BaseTestIReadMapping(object): - def testIReadMapping(self): - inst = self._IReadMapping__sample() - state = self._IReadMapping__stateDict() - absent = self._IReadMapping__absentKeys() - testIReadMapping(self, inst, state, absent) - - -class BaseTestIEnumerableMapping(BaseTestIReadMapping): - # Mapping objects whose items can be enumerated - def test_keys(self): - # Return the keys of the mapping object - inst = self._IEnumerableMapping__sample() - state = self._IEnumerableMapping__stateDict() - test_keys(self, inst, state) - - def test_values(self): - # Return the values of the mapping object - inst = self._IEnumerableMapping__sample() - state = self._IEnumerableMapping__stateDict() - test_values(self, inst, state) - - def test_items(self): - # Return the items of the mapping object - inst = self._IEnumerableMapping__sample() - state = self._IEnumerableMapping__stateDict() - test_items(self, inst, state) - - def test___len__(self): - # Return the number of items - inst = self._IEnumerableMapping__sample() - state = self._IEnumerableMapping__stateDict() - test___len__(self, inst, state) - - def _IReadMapping__stateDict(self): - return self._IEnumerableMapping__stateDict() - - def _IReadMapping__sample(self): - return self._IEnumerableMapping__sample() - - def _IReadMapping__absentKeys(self): - return self._IEnumerableMapping__absentKeys() diff --git a/zope/interface/common/tests/test_idatetime.py b/zope/interface/common/tests/test_idatetime.py deleted file mode 100644 index 60f377ea..00000000 --- a/zope/interface/common/tests/test_idatetime.py +++ /dev/null @@ -1,47 +0,0 @@ -############################################################################## -# -# Copyright (c) 2003 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Test for datetime interfaces -""" - -import unittest - -from zope.interface.verify import verifyObject, verifyClass -from zope.interface.common.idatetime import ITimeDelta, ITimeDeltaClass -from zope.interface.common.idatetime import IDate, IDateClass -from zope.interface.common.idatetime import IDateTime, IDateTimeClass -from zope.interface.common.idatetime import ITime, ITimeClass, ITZInfo -from datetime import timedelta, date, datetime, time, tzinfo - -class TestDateTimeInterfaces(unittest.TestCase): - - def test_interfaces(self): - verifyObject(ITimeDelta, timedelta(minutes=20)) - verifyObject(IDate, date(2000, 1, 2)) - verifyObject(IDateTime, datetime(2000, 1, 2, 10, 20)) - verifyObject(ITime, time(20, 30, 15, 1234)) - verifyObject(ITZInfo, tzinfo()) - verifyClass(ITimeDeltaClass, timedelta) - verifyClass(IDateClass, date) - verifyClass(IDateTimeClass, datetime) - verifyClass(ITimeClass, time) - - -def test_suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(TestDateTimeInterfaces)) - return suite - - -if __name__ == '__main__': - unittest.main() diff --git a/zope/interface/common/tests/test_import_interfaces.py b/zope/interface/common/tests/test_import_interfaces.py deleted file mode 100644 index 908f05dc..00000000 --- a/zope/interface/common/tests/test_import_interfaces.py +++ /dev/null @@ -1,29 +0,0 @@ -############################################################################## -# -# Copyright (c) 2006 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -import doctest -import unittest - -def test_interface_import(): - """ - >>> import zope.interface.common.interfaces - """ - -def test_suite(): - return unittest.TestSuite(( - doctest.DocTestSuite(), - )) - -if __name__ == '__main__': - unittest.main(defaultTest='test_suite') - diff --git a/zope/interface/declarations.py b/zope/interface/declarations.py deleted file mode 100644 index 0992adcd..00000000 --- a/zope/interface/declarations.py +++ /dev/null @@ -1,848 +0,0 @@ -############################################################################## -# Copyright (c) 2003 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -############################################################################## -"""Implementation of interface declarations - -There are three flavors of declarations: - - - Declarations are used to simply name declared interfaces. - - - ImplementsDeclarations are used to express the interfaces that a - class implements (that instances of the class provides). - - Implements specifications support inheriting interfaces. - - - ProvidesDeclarations are used to express interfaces directly - provided by objects. - -""" -__docformat__ = 'restructuredtext' - -import sys -from types import FunctionType -from types import MethodType -from types import ModuleType -import warnings -import weakref - -from zope.interface.advice import addClassAdvisor -from zope.interface.interface import InterfaceClass -from zope.interface.interface import SpecificationBase -from zope.interface.interface import Specification -from zope.interface._compat import CLASS_TYPES as DescriptorAwareMetaClasses -from zope.interface._compat import PYTHON3 - -# Registry of class-implementation specifications -BuiltinImplementationSpecifications = {} - -_ADVICE_ERROR = ('Class advice impossible in Python3. ' - 'Use the @%s class decorator instead.') - -_ADVICE_WARNING = ('The %s API is deprecated, and will not work in Python3 ' - 'Use the @%s class decorator instead.') - -class Declaration(Specification): - """Interface declarations""" - - def __init__(self, *interfaces): - Specification.__init__(self, _normalizeargs(interfaces)) - - def changed(self, originally_changed): - Specification.changed(self, originally_changed) - try: - del self._v_attrs - except AttributeError: - pass - - def __contains__(self, interface): - """Test whether an interface is in the specification - """ - - return self.extends(interface) and interface in self.interfaces() - - def __iter__(self): - """Return an iterator for the interfaces in the specification - """ - return self.interfaces() - - def flattened(self): - """Return an iterator of all included and extended interfaces - """ - return iter(self.__iro__) - - def __sub__(self, other): - """Remove interfaces from a specification - """ - return Declaration( - *[i for i in self.interfaces() - if not [j for j in other.interfaces() - if i.extends(j, 0)] - ] - ) - - def __add__(self, other): - """Add two specifications or a specification and an interface - """ - seen = {} - result = [] - for i in self.interfaces(): - if i not in seen: - seen[i] = 1 - result.append(i) - for i in other.interfaces(): - if i not in seen: - seen[i] = 1 - result.append(i) - - return Declaration(*result) - - __radd__ = __add__ - - -############################################################################## -# -# Implementation specifications -# -# These specify interfaces implemented by instances of classes - -class Implements(Declaration): - - # class whose specification should be used as additional base - inherit = None - - # interfaces actually declared for a class - declared = () - - __name__ = '?' - - def __repr__(self): - return '' % (self.__name__) - - def __reduce__(self): - return implementedBy, (self.inherit, ) - -def implementedByFallback(cls): - """Return the interfaces implemented for a class' instances - - The value returned is an IDeclaration. - """ - try: - spec = cls.__dict__.get('__implemented__') - except AttributeError: - - # we can't get the class dict. This is probably due to a - # security proxy. If this is the case, then probably no - # descriptor was installed for the class. - - # We don't want to depend directly on zope.security in - # zope.interface, but we'll try to make reasonable - # accommodations in an indirect way. - - # We'll check to see if there's an implements: - - spec = getattr(cls, '__implemented__', None) - if spec is None: - # There's no spec stred in the class. Maybe its a builtin: - spec = BuiltinImplementationSpecifications.get(cls) - if spec is not None: - return spec - return _empty - - if spec.__class__ == Implements: - # we defaulted to _empty or there was a spec. Good enough. - # Return it. - return spec - - # TODO: need old style __implements__ compatibility? - # Hm, there's an __implemented__, but it's not a spec. Must be - # an old-style declaration. Just compute a spec for it - return Declaration(*_normalizeargs((spec, ))) - - if isinstance(spec, Implements): - return spec - - if spec is None: - spec = BuiltinImplementationSpecifications.get(cls) - if spec is not None: - return spec - - # TODO: need old style __implements__ compatibility? - if spec is not None: - # old-style __implemented__ = foo declaration - spec = (spec, ) # tuplefy, as it might be just an int - spec = Implements(*_normalizeargs(spec)) - spec.inherit = None # old-style implies no inherit - del cls.__implemented__ # get rid of the old-style declaration - else: - try: - bases = cls.__bases__ - except AttributeError: - if not callable(cls): - raise TypeError("ImplementedBy called for non-factory", cls) - bases = () - - spec = Implements(*[implementedBy(c) for c in bases]) - spec.inherit = cls - - spec.__name__ = (getattr(cls, '__module__', '?') or '?') + \ - '.' + (getattr(cls, '__name__', '?') or '?') - - try: - cls.__implemented__ = spec - if not hasattr(cls, '__providedBy__'): - cls.__providedBy__ = objectSpecificationDescriptor - - if (isinstance(cls, DescriptorAwareMetaClasses) - and - '__provides__' not in cls.__dict__): - # Make sure we get a __provides__ descriptor - cls.__provides__ = ClassProvides( - cls, - getattr(cls, '__class__', type(cls)), - ) - - except TypeError: - if not isinstance(cls, type): - raise TypeError("ImplementedBy called for non-type", cls) - BuiltinImplementationSpecifications[cls] = spec - - return spec - -implementedBy = implementedByFallback - -def classImplementsOnly(cls, *interfaces): - """Declare the only interfaces implemented by instances of a class - - The arguments after the class are one or more interfaces or interface - specifications (``IDeclaration`` objects). - - The interfaces given (including the interfaces in the specifications) - replace any previous declarations. - """ - spec = implementedBy(cls) - spec.declared = () - spec.inherit = None - classImplements(cls, *interfaces) - -def classImplements(cls, *interfaces): - """Declare additional interfaces implemented for instances of a class - - The arguments after the class are one or more interfaces or - interface specifications (``IDeclaration`` objects). - - The interfaces given (including the interfaces in the specifications) - are added to any interfaces previously declared. - """ - spec = implementedBy(cls) - spec.declared += tuple(_normalizeargs(interfaces)) - - # compute the bases - bases = [] - seen = {} - for b in spec.declared: - if b not in seen: - seen[b] = 1 - bases.append(b) - - if spec.inherit is not None: - - for c in spec.inherit.__bases__: - b = implementedBy(c) - if b not in seen: - seen[b] = 1 - bases.append(b) - - spec.__bases__ = tuple(bases) - -def _implements_advice(cls): - interfaces, classImplements = cls.__dict__['__implements_advice_data__'] - del cls.__implements_advice_data__ - classImplements(cls, *interfaces) - return cls - - -class implementer: - """Declare the interfaces implemented by instances of a class. - - This function is called as a class decorator. - - The arguments are one or more interfaces or interface - specifications (IDeclaration objects). - - The interfaces given (including the interfaces in the - specifications) are added to any interfaces previously - declared. - - Previous declarations include declarations for base classes - unless implementsOnly was used. - - This function is provided for convenience. It provides a more - convenient way to call classImplements. For example:: - - @implementer(I1) - class C(object): - pass - - is equivalent to calling:: - - classImplements(C, I1) - - after the class has been created. - """ - - def __init__(self, *interfaces): - self.interfaces = interfaces - - def __call__(self, ob): - if isinstance(ob, DescriptorAwareMetaClasses): - classImplements(ob, *self.interfaces) - return ob - - spec = Implements(*self.interfaces) - try: - ob.__implemented__ = spec - except AttributeError: - raise TypeError("Can't declare implements", ob) - return ob - -class implementer_only: - """Declare the only interfaces implemented by instances of a class - - This function is called as a class decorator. - - The arguments are one or more interfaces or interface - specifications (IDeclaration objects). - - Previous declarations including declarations for base classes - are overridden. - - This function is provided for convenience. It provides a more - convenient way to call classImplementsOnly. For example:: - - @implementer_only(I1) - class C(object): pass - - is equivalent to calling:: - - classImplementsOnly(I1) - - after the class has been created. - """ - - def __init__(self, *interfaces): - self.interfaces = interfaces - - def __call__(self, ob): - if isinstance(ob, (FunctionType, MethodType)): - # XXX Does this decorator make sense for anything but classes? - # I don't think so. There can be no inheritance of interfaces - # on a method pr function.... - raise ValueError('The implementer_only decorator is not ' - 'supported for methods or functions.') - else: - # Assume it's a class: - classImplementsOnly(ob, *self.interfaces) - return ob - -def _implements(name, interfaces, classImplements): - # This entire approach is invalid under Py3K. Don't even try to fix - # the coverage for this block there. :( - if PYTHON3: #pragma NO COVER - raise TypeError('Class advice impossible in Python3') - frame = sys._getframe(2) - locals = frame.f_locals - - # Try to make sure we were called from a class def. In 2.2.0 we can't - # check for __module__ since it doesn't seem to be added to the locals - # until later on. - if locals is frame.f_globals or '__module__' not in locals: - raise TypeError(name+" can be used only from a class definition.") - - if '__implements_advice_data__' in locals: - raise TypeError(name+" can be used only once in a class definition.") - - locals['__implements_advice_data__'] = interfaces, classImplements - addClassAdvisor(_implements_advice, depth=3) - -def implements(*interfaces): - """Declare interfaces implemented by instances of a class - - This function is called in a class definition. - - The arguments are one or more interfaces or interface - specifications (IDeclaration objects). - - The interfaces given (including the interfaces in the - specifications) are added to any interfaces previously - declared. - - Previous declarations include declarations for base classes - unless implementsOnly was used. - - This function is provided for convenience. It provides a more - convenient way to call classImplements. For example:: - - implements(I1) - - is equivalent to calling:: - - classImplements(C, I1) - - after the class has been created. - """ - # This entire approach is invalid under Py3K. Don't even try to fix - # the coverage for this block there. :( - if PYTHON3: #pragma NO COVER - raise TypeError(_ADVICE_ERROR % 'implementer') - _implements("implements", interfaces, classImplements) - -def implementsOnly(*interfaces): - """Declare the only interfaces implemented by instances of a class - - This function is called in a class definition. - - The arguments are one or more interfaces or interface - specifications (IDeclaration objects). - - Previous declarations including declarations for base classes - are overridden. - - This function is provided for convenience. It provides a more - convenient way to call classImplementsOnly. For example:: - - implementsOnly(I1) - - is equivalent to calling:: - - classImplementsOnly(I1) - - after the class has been created. - """ - # This entire approach is invalid under Py3K. Don't even try to fix - # the coverage for this block there. :( - if PYTHON3: #pragma NO COVER - raise TypeError(_ADVICE_ERROR % 'implementer_only') - _implements("implementsOnly", interfaces, classImplementsOnly) - -############################################################################## -# -# Instance declarations - -class Provides(Declaration): # Really named ProvidesClass - """Implement __provides__, the instance-specific specification - - When an object is pickled, we pickle the interfaces that it implements. - """ - - def __init__(self, cls, *interfaces): - self.__args = (cls, ) + interfaces - self._cls = cls - Declaration.__init__(self, *(interfaces + (implementedBy(cls), ))) - - def __reduce__(self): - return Provides, self.__args - - __module__ = 'zope.interface' - - def __get__(self, inst, cls): - """Make sure that a class __provides__ doesn't leak to an instance - """ - if inst is None and cls is self._cls: - # We were accessed through a class, so we are the class' - # provides spec. Just return this object, but only if we are - # being called on the same class that we were defined for: - return self - - raise AttributeError('__provides__') - -ProvidesClass = Provides - -# Registry of instance declarations -# This is a memory optimization to allow objects to share specifications. -InstanceDeclarations = weakref.WeakValueDictionary() - -def Provides(*interfaces): - """Cache instance declarations - - Instance declarations are shared among instances that have the same - declaration. The declarations are cached in a weak value dictionary. - """ - spec = InstanceDeclarations.get(interfaces) - if spec is None: - spec = ProvidesClass(*interfaces) - InstanceDeclarations[interfaces] = spec - - return spec - -Provides.__safe_for_unpickling__ = True - - -def directlyProvides(object, *interfaces): - """Declare interfaces declared directly for an object - - The arguments after the object are one or more interfaces or interface - specifications (``IDeclaration`` objects). - - The interfaces given (including the interfaces in the specifications) - replace interfaces previously declared for the object. - """ - cls = getattr(object, '__class__', None) - if cls is not None and getattr(cls, '__class__', None) is cls: - # It's a meta class (well, at least it it could be an extension class) - # Note that we can't get here from Py3k tests: there is no normal - # class which isn't descriptor aware. - if not isinstance(object, - DescriptorAwareMetaClasses): #pragma NO COVER Py3k - raise TypeError("Attempt to make an interface declaration on a " - "non-descriptor-aware class") - - interfaces = _normalizeargs(interfaces) - if cls is None: - cls = type(object) - - issub = False - for damc in DescriptorAwareMetaClasses: - if issubclass(cls, damc): - issub = True - break - if issub: - # we have a class or type. We'll use a special descriptor - # that provides some extra caching - object.__provides__ = ClassProvides(object, cls, *interfaces) - else: - object.__provides__ = Provides(cls, *interfaces) - - -def alsoProvides(object, *interfaces): - """Declare interfaces declared directly for an object - - The arguments after the object are one or more interfaces or interface - specifications (``IDeclaration`` objects). - - The interfaces given (including the interfaces in the specifications) are - added to the interfaces previously declared for the object. - """ - directlyProvides(object, directlyProvidedBy(object), *interfaces) - -def noLongerProvides(object, interface): - """ Removes a directly provided interface from an object. - """ - directlyProvides(object, directlyProvidedBy(object) - interface) - if interface.providedBy(object): - raise ValueError("Can only remove directly provided interfaces.") - -class ClassProvidesBaseFallback(object): - - def __get__(self, inst, cls): - if cls is self._cls: - # We only work if called on the class we were defined for - - if inst is None: - # We were accessed through a class, so we are the class' - # provides spec. Just return this object as is: - return self - - return self._implements - - raise AttributeError('__provides__') - -ClassProvidesBasePy = ClassProvidesBaseFallback # BBB -ClassProvidesBase = ClassProvidesBaseFallback - -# Try to get C base: -try: - import _zope_interface_coptimizations -except ImportError: #pragma NO COVERAGE - pass -else: #pragma NO COVERAGE - from _zope_interface_coptimizations import ClassProvidesBase - - -class ClassProvides(Declaration, ClassProvidesBase): - """Special descriptor for class __provides__ - - The descriptor caches the implementedBy info, so that - we can get declarations for objects without instance-specific - interfaces a bit quicker. - """ - def __init__(self, cls, metacls, *interfaces): - self._cls = cls - self._implements = implementedBy(cls) - self.__args = (cls, metacls, ) + interfaces - Declaration.__init__(self, *(interfaces + (implementedBy(metacls), ))) - - def __reduce__(self): - return self.__class__, self.__args - - # Copy base-class method for speed - __get__ = ClassProvidesBase.__get__ - -def directlyProvidedBy(object): - """Return the interfaces directly provided by the given object - - The value returned is an ``IDeclaration``. - """ - provides = getattr(object, "__provides__", None) - if (provides is None # no spec - or - # We might have gotten the implements spec, as an - # optimization. If so, it's like having only one base, that we - # lop off to exclude class-supplied declarations: - isinstance(provides, Implements) - ): - return _empty - - # Strip off the class part of the spec: - return Declaration(provides.__bases__[:-1]) - -def classProvides(*interfaces): - """Declare interfaces provided directly by a class - - This function is called in a class definition. - - The arguments are one or more interfaces or interface specifications - (``IDeclaration`` objects). - - The given interfaces (including the interfaces in the specifications) - are used to create the class's direct-object interface specification. - An error will be raised if the module class has an direct interface - specification. In other words, it is an error to call this function more - than once in a class definition. - - Note that the given interfaces have nothing to do with the interfaces - implemented by instances of the class. - - This function is provided for convenience. It provides a more convenient - way to call directlyProvides for a class. For example:: - - classProvides(I1) - - is equivalent to calling:: - - directlyProvides(theclass, I1) - - after the class has been created. - """ - # This entire approach is invalid under Py3K. Don't even try to fix - # the coverage for this block there. :( - - if PYTHON3: #pragma NO COVER - raise TypeError(_ADVICE_ERROR % 'provider') - - frame = sys._getframe(1) - locals = frame.f_locals - - # Try to make sure we were called from a class def - if (locals is frame.f_globals) or ('__module__' not in locals): - raise TypeError("classProvides can be used only from a " - "class definition.") - - if '__provides__' in locals: - raise TypeError( - "classProvides can only be used once in a class definition.") - - locals["__provides__"] = _normalizeargs(interfaces) - - addClassAdvisor(_classProvides_advice, depth=2) - -def _classProvides_advice(cls): - # This entire approach is invalid under Py3K. Don't even try to fix - # the coverage for this block there. :( - interfaces = cls.__dict__['__provides__'] - del cls.__provides__ - directlyProvides(cls, *interfaces) - return cls - -class provider: - """Class decorator version of classProvides""" - - def __init__(self, *interfaces): - self.interfaces = interfaces - - def __call__(self, ob): - directlyProvides(ob, *self.interfaces) - return ob - -def moduleProvides(*interfaces): - """Declare interfaces provided by a module - - This function is used in a module definition. - - The arguments are one or more interfaces or interface specifications - (``IDeclaration`` objects). - - The given interfaces (including the interfaces in the specifications) are - used to create the module's direct-object interface specification. An - error will be raised if the module already has an interface specification. - In other words, it is an error to call this function more than once in a - module definition. - - This function is provided for convenience. It provides a more convenient - way to call directlyProvides. For example:: - - moduleImplements(I1) - - is equivalent to:: - - directlyProvides(sys.modules[__name__], I1) - """ - frame = sys._getframe(1) - locals = frame.f_locals - - # Try to make sure we were called from a class def - if (locals is not frame.f_globals) or ('__name__' not in locals): - raise TypeError( - "moduleProvides can only be used from a module definition.") - - if '__provides__' in locals: - raise TypeError( - "moduleProvides can only be used once in a module definition.") - - locals["__provides__"] = Provides(ModuleType, - *_normalizeargs(interfaces)) - -############################################################################## -# -# Declaration querying support - -# XXX: is this a fossil? Nobody calls it, no unit tests exercise it, no -# doctests import it, and the package __init__ doesn't import it. -def ObjectSpecification(direct, cls): - """Provide object specifications - - These combine information for the object and for it's classes. - """ - return Provides(cls, direct) #pragma NO COVER fossil - -def getObjectSpecificationFallback(ob): - - provides = getattr(ob, '__provides__', None) - if provides is not None: - if isinstance(provides, SpecificationBase): - return provides - - try: - cls = ob.__class__ - except AttributeError: - # We can't get the class, so just consider provides - return _empty - - return implementedBy(cls) - -getObjectSpecification = getObjectSpecificationFallback - -def providedByFallback(ob): - - # Here we have either a special object, an old-style declaration - # or a descriptor - - # Try to get __providedBy__ - try: - r = ob.__providedBy__ - except AttributeError: - # Not set yet. Fall back to lower-level thing that computes it - return getObjectSpecification(ob) - - try: - # We might have gotten a descriptor from an instance of a - # class (like an ExtensionClass) that doesn't support - # descriptors. We'll make sure we got one by trying to get - # the only attribute, which all specs have. - r.extends - - except AttributeError: - - # The object's class doesn't understand descriptors. - # Sigh. We need to get an object descriptor, but we have to be - # careful. We want to use the instance's __provides__, if - # there is one, but only if it didn't come from the class. - - try: - r = ob.__provides__ - except AttributeError: - # No __provides__, so just fall back to implementedBy - return implementedBy(ob.__class__) - - # We need to make sure we got the __provides__ from the - # instance. We'll do this by making sure we don't get the same - # thing from the class: - - try: - cp = ob.__class__.__provides__ - except AttributeError: - # The ob doesn't have a class or the class has no - # provides, assume we're done: - return r - - if r is cp: - # Oops, we got the provides from the class. This means - # the object doesn't have it's own. We should use implementedBy - return implementedBy(ob.__class__) - - return r -providedBy = providedByFallback - -class ObjectSpecificationDescriptorFallback(object): - """Implement the `__providedBy__` attribute - - The `__providedBy__` attribute computes the interfaces peovided by - an object. - """ - - def __get__(self, inst, cls): - """Get an object specification for an object - """ - if inst is None: - return getObjectSpecification(cls) - - provides = getattr(inst, '__provides__', None) - if provides is not None: - return provides - - return implementedBy(cls) - -ObjectSpecificationDescriptor = ObjectSpecificationDescriptorFallback - -############################################################################## - -def _normalizeargs(sequence, output = None): - """Normalize declaration arguments - - Normalization arguments might contain Declarions, tuples, or single - interfaces. - - Anything but individial interfaces or implements specs will be expanded. - """ - if output is None: - output = [] - - cls = sequence.__class__ - if InterfaceClass in cls.__mro__ or Implements in cls.__mro__: - output.append(sequence) - else: - for v in sequence: - _normalizeargs(v, output) - - return output - -_empty = Declaration() - -try: - import _zope_interface_coptimizations -except ImportError: #pragma NO COVER - pass -else: #pragma NO COVER PyPy - from _zope_interface_coptimizations import implementedBy - from _zope_interface_coptimizations import providedBy - from _zope_interface_coptimizations import getObjectSpecification - from _zope_interface_coptimizations import ObjectSpecificationDescriptor - -objectSpecificationDescriptor = ObjectSpecificationDescriptor() diff --git a/zope/interface/document.py b/zope/interface/document.py deleted file mode 100644 index 7dfeb5e6..00000000 --- a/zope/interface/document.py +++ /dev/null @@ -1,104 +0,0 @@ -############################################################################## -# -# Copyright (c) 2001, 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -""" Pretty-Print an Interface object as structured text (Yum) - -This module provides a function, asStructuredText, for rendering an -interface as structured text. -""" -import zope.interface - -def asStructuredText(I, munge=0): - """ Output structured text format. Note, this will whack any existing - 'structured' format of the text. """ - - r = [I.getName()] - outp = r.append - level = 1 - - if I.getDoc(): - outp(_justify_and_indent(_trim_doc_string(I.getDoc()), level)) - - bases = [base - for base in I.__bases__ - if base is not zope.interface.Interface - ] - if bases: - outp(_justify_and_indent("This interface extends:", level, munge)) - level += 1 - for b in bases: - item = "o %s" % b.getName() - outp(_justify_and_indent(_trim_doc_string(item), level, munge)) - level -= 1 - - namesAndDescriptions = sorted(I.namesAndDescriptions()) - - outp(_justify_and_indent("Attributes:", level, munge)) - level += 1 - for name, desc in namesAndDescriptions: - if not hasattr(desc, 'getSignatureString'): # ugh... - item = "%s -- %s" % (desc.getName(), - desc.getDoc() or 'no documentation') - outp(_justify_and_indent(_trim_doc_string(item), level, munge)) - level -= 1 - - outp(_justify_and_indent("Methods:", level, munge)) - level += 1 - for name, desc in namesAndDescriptions: - if hasattr(desc, 'getSignatureString'): # ugh... - item = "%s%s -- %s" % (desc.getName(), - desc.getSignatureString(), - desc.getDoc() or 'no documentation') - outp(_justify_and_indent(_trim_doc_string(item), level, munge)) - - return "\n\n".join(r) + "\n\n" - - -def _trim_doc_string(text): - """ Trims a doc string to make it format - correctly with structured text. """ - - lines = text.replace('\r\n', '\n').split('\n') - nlines = [lines.pop(0)] - if lines: - min_indent = min([len(line) - len(line.lstrip()) - for line in lines]) - for line in lines: - nlines.append(line[min_indent:]) - - return '\n'.join(nlines) - - -def _justify_and_indent(text, level, munge=0, width=72): - """ indent and justify text, rejustify (munge) if specified """ - - indent = " " * level - - if munge: - lines = [] - line = indent - text = text.split() - - for word in text: - line = ' '.join([line, word]) - if len(line) > width: - lines.append(line) - line = indent - else: - lines.append(line) - - return '\n'.join(lines) - - else: - return indent + \ - text.strip().replace("\r\n", "\n") .replace("\n", "\n" + indent) diff --git a/zope/interface/exceptions.py b/zope/interface/exceptions.py deleted file mode 100644 index e9a4788d..00000000 --- a/zope/interface/exceptions.py +++ /dev/null @@ -1,67 +0,0 @@ -############################################################################## -# -# Copyright (c) 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Interface-specific exceptions -""" - -class Invalid(Exception): - """A specification is violated - """ - -class DoesNotImplement(Invalid): - """ This object does not implement """ - def __init__(self, interface): - self.interface = interface - - def __str__(self): - return """An object does not implement interface %(interface)s - - """ % self.__dict__ - -class BrokenImplementation(Invalid): - """An attribute is not completely implemented. - """ - - def __init__(self, interface, name): - self.interface=interface - self.name=name - - def __str__(self): - return """An object has failed to implement interface %(interface)s - - The %(name)s attribute was not provided. - """ % self.__dict__ - -class BrokenMethodImplementation(Invalid): - """An method is not completely implemented. - """ - - def __init__(self, method, mess): - self.method=method - self.mess=mess - - def __str__(self): - return """The implementation of %(method)s violates its contract - because %(mess)s. - """ % self.__dict__ - -class InvalidInterface(Exception): - """The interface has invalid contents - """ - -class BadImplements(TypeError): - """An implementation assertion is invalid - - because it doesn't contain an interface or a sequence of valid - implementation assertions. - """ diff --git a/zope/interface/interface.py b/zope/interface/interface.py deleted file mode 100644 index b04108fa..00000000 --- a/zope/interface/interface.py +++ /dev/null @@ -1,712 +0,0 @@ -############################################################################## -# -# Copyright (c) 2001, 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Interface object implementation -""" -from __future__ import generators - -import sys -from types import MethodType -from types import FunctionType -import warnings -import weakref - -from zope.interface.exceptions import Invalid -from zope.interface.ro import ro - - -CO_VARARGS = 4 -CO_VARKEYWORDS = 8 -TAGGED_DATA = '__interface_tagged_values__' - -_decorator_non_return = object() - -def invariant(call): - f_locals = sys._getframe(1).f_locals - tags = f_locals.setdefault(TAGGED_DATA, {}) - invariants = tags.setdefault('invariants', []) - invariants.append(call) - return _decorator_non_return - - -def taggedValue(key, value): - """Attaches a tagged value to an interface at definition time.""" - f_locals = sys._getframe(1).f_locals - tagged_values = f_locals.setdefault(TAGGED_DATA, {}) - tagged_values[key] = value - return _decorator_non_return - - -class Element(object): - - # We can't say this yet because we don't have enough - # infrastructure in place. - # - #implements(IElement) - - def __init__(self, __name__, __doc__=''): - """Create an 'attribute' description - """ - if not __doc__ and __name__.find(' ') >= 0: - __doc__ = __name__ - __name__ = None - - self.__name__=__name__ - self.__doc__=__doc__ - self.__tagged_values = {} - - def getName(self): - """ Returns the name of the object. """ - return self.__name__ - - def getDoc(self): - """ Returns the documentation for the object. """ - return self.__doc__ - - def getTaggedValue(self, tag): - """ Returns the value associated with 'tag'. """ - return self.__tagged_values[tag] - - def queryTaggedValue(self, tag, default=None): - """ Returns the value associated with 'tag'. """ - return self.__tagged_values.get(tag, default) - - def getTaggedValueTags(self): - """ Returns a list of all tags. """ - return self.__tagged_values.keys() - - def setTaggedValue(self, tag, value): - """ Associates 'value' with 'key'. """ - self.__tagged_values[tag] = value - -class SpecificationBasePy(object): - - def providedBy(self, ob): - """Is the interface implemented by an object - """ - spec = providedBy(ob) - return self in spec._implied - - def implementedBy(self, cls): - """Test whether the specification is implemented by a class or factory. - - Raise TypeError if argument is neither a class nor a callable. - """ - spec = implementedBy(cls) - return self in spec._implied - - def isOrExtends(self, interface): - """Is the interface the same as or extend the given interface - """ - return interface in self._implied - - __call__ = isOrExtends - -SpecificationBase = SpecificationBasePy -try: - from _zope_interface_coptimizations import SpecificationBase -except ImportError: #pragma NO COVER - pass - -_marker = object() -class InterfaceBasePy(object): - """Base class that wants to be replaced with a C base :) - """ - - def __call__(self, obj, alternate=_marker): - """Adapt an object to the interface - """ - conform = getattr(obj, '__conform__', None) - if conform is not None: - adapter = self._call_conform(conform) - if adapter is not None: - return adapter - - adapter = self.__adapt__(obj) - - if adapter is not None: - return adapter - elif alternate is not _marker: - return alternate - else: - raise TypeError("Could not adapt", obj, self) - - def __adapt__(self, obj): - """Adapt an object to the reciever - """ - if self.providedBy(obj): - return obj - - for hook in adapter_hooks: - adapter = hook(self, obj) - if adapter is not None: - return adapter - - -InterfaceBase = InterfaceBasePy -try: - from _zope_interface_coptimizations import InterfaceBase -except ImportError: #pragma NO COVER - pass - - -adapter_hooks = [] -try: - from _zope_interface_coptimizations import adapter_hooks -except ImportError: #pragma NO COVER - pass - - -class Specification(SpecificationBase): - """Specifications - - An interface specification is used to track interface declarations - and component registrations. - - This class is a base class for both interfaces themselves and for - interface specifications (declarations). - - Specifications are mutable. If you reassign their bases, their - relations with other specifications are adjusted accordingly. - """ - - # Copy some base class methods for speed - isOrExtends = SpecificationBase.isOrExtends - providedBy = SpecificationBase.providedBy - - def __init__(self, bases=()): - self._implied = {} - self.dependents = weakref.WeakKeyDictionary() - self.__bases__ = tuple(bases) - - def subscribe(self, dependent): - self.dependents[dependent] = self.dependents.get(dependent, 0) + 1 - - def unsubscribe(self, dependent): - n = self.dependents.get(dependent, 0) - 1 - if not n: - del self.dependents[dependent] - elif n > 0: - self.dependents[dependent] = n - else: - raise KeyError(dependent) - - def __setBases(self, bases): - # Register ourselves as a dependent of our old bases - for b in self.__bases__: - b.unsubscribe(self) - - # Register ourselves as a dependent of our bases - self.__dict__['__bases__'] = bases - for b in bases: - b.subscribe(self) - - self.changed(self) - - __bases__ = property( - - lambda self: self.__dict__.get('__bases__', ()), - __setBases, - ) - - def changed(self, originally_changed): - """We, or something we depend on, have changed - """ - try: - del self._v_attrs - except AttributeError: - pass - - implied = self._implied - implied.clear() - - ancestors = ro(self) - - try: - if Interface not in ancestors: - ancestors.append(Interface) - except NameError: - pass # defining Interface itself - - self.__sro__ = tuple(ancestors) - self.__iro__ = tuple([ancestor for ancestor in ancestors - if isinstance(ancestor, InterfaceClass) - ]) - - for ancestor in ancestors: - # We directly imply our ancestors: - implied[ancestor] = () - - # Now, advise our dependents of change: - for dependent in tuple(self.dependents.keys()): - dependent.changed(originally_changed) - - - def interfaces(self): - """Return an iterator for the interfaces in the specification. - """ - seen = {} - for base in self.__bases__: - for interface in base.interfaces(): - if interface not in seen: - seen[interface] = 1 - yield interface - - - def extends(self, interface, strict=True): - """Does the specification extend the given interface? - - Test whether an interface in the specification extends the - given interface - """ - return ((interface in self._implied) - and - ((not strict) or (self != interface)) - ) - - def weakref(self, callback=None): - return weakref.ref(self, callback) - - def get(self, name, default=None): - """Query for an attribute description - """ - try: - attrs = self._v_attrs - except AttributeError: - attrs = self._v_attrs = {} - attr = attrs.get(name) - if attr is None: - for iface in self.__iro__: - attr = iface.direct(name) - if attr is not None: - attrs[name] = attr - break - - if attr is None: - return default - else: - return attr - -class InterfaceClass(Element, InterfaceBase, Specification): - """Prototype (scarecrow) Interfaces Implementation.""" - - # We can't say this yet because we don't have enough - # infrastructure in place. - # - #implements(IInterface) - - def __init__(self, name, bases=(), attrs=None, __doc__=None, - __module__=None): - - if attrs is None: - attrs = {} - - if __module__ is None: - __module__ = attrs.get('__module__') - if isinstance(__module__, str): - del attrs['__module__'] - else: - try: - # Figure out what module defined the interface. - # This is how cPython figures out the module of - # a class, but of course it does it in C. :-/ - __module__ = sys._getframe(1).f_globals['__name__'] - except (AttributeError, KeyError): #pragma NO COVERAGE - pass - - self.__module__ = __module__ - - d = attrs.get('__doc__') - if d is not None: - if not isinstance(d, Attribute): - if __doc__ is None: - __doc__ = d - del attrs['__doc__'] - - if __doc__ is None: - __doc__ = '' - - Element.__init__(self, name, __doc__) - - tagged_data = attrs.pop(TAGGED_DATA, None) - if tagged_data is not None: - for key, val in tagged_data.items(): - self.setTaggedValue(key, val) - - for base in bases: - if not isinstance(base, InterfaceClass): - raise TypeError('Expected base interfaces') - - Specification.__init__(self, bases) - - # Make sure that all recorded attributes (and methods) are of type - # `Attribute` and `Method` - for name, attr in list(attrs.items()): - if name in ('__locals__', '__qualname__'): - # __locals__: Python 3 sometimes adds this. - # __qualname__: PEP 3155 (Python 3.3+) - del attrs[name] - continue - if isinstance(attr, Attribute): - attr.interface = self - if not attr.__name__: - attr.__name__ = name - elif isinstance(attr, FunctionType): - attrs[name] = fromFunction(attr, self, name=name) - elif attr is _decorator_non_return: - del attrs[name] - else: - raise InvalidInterface("Concrete attribute, " + name) - - self.__attrs = attrs - - self.__identifier__ = "%s.%s" % (self.__module__, self.__name__) - - def interfaces(self): - """Return an iterator for the interfaces in the specification. - """ - yield self - - def getBases(self): - return self.__bases__ - - def isEqualOrExtendedBy(self, other): - """Same interface or extends?""" - return self == other or other.extends(self) - - def names(self, all=False): - """Return the attribute names defined by the interface.""" - if not all: - return self.__attrs.keys() - - r = self.__attrs.copy() - - for base in self.__bases__: - r.update(dict.fromkeys(base.names(all))) - - return r.keys() - - def __iter__(self): - return iter(self.names(all=True)) - - def namesAndDescriptions(self, all=False): - """Return attribute names and descriptions defined by interface.""" - if not all: - return self.__attrs.items() - - r = {} - for base in self.__bases__[::-1]: - r.update(dict(base.namesAndDescriptions(all))) - - r.update(self.__attrs) - - return r.items() - - def getDescriptionFor(self, name): - """Return the attribute description for the given name.""" - r = self.get(name) - if r is not None: - return r - - raise KeyError(name) - - __getitem__ = getDescriptionFor - - def __contains__(self, name): - return self.get(name) is not None - - def direct(self, name): - return self.__attrs.get(name) - - def queryDescriptionFor(self, name, default=None): - return self.get(name, default) - - def deferred(self): - """Return a defered class corresponding to the interface.""" - if hasattr(self, "_deferred"): return self._deferred - - klass={} - exec("class %s: pass" % self.__name__, klass) - klass=klass[self.__name__] - - self.__d(klass) - - self._deferred=klass - - return klass - - def validateInvariants(self, obj, errors=None): - """validate object to defined invariants.""" - for call in self.queryTaggedValue('invariants', []): - try: - call(obj) - except Invalid as e: - if errors is None: - raise - else: - errors.append(e) - for base in self.__bases__: - try: - base.validateInvariants(obj, errors) - except Invalid: - if errors is None: - raise - if errors: - raise Invalid(errors) - - #XXX I believe this is a fossil: nobody calls it anywhere. - #def _getInterface(self, ob, name): - # """Retrieve a named interface.""" - # return None - - def __d(self, klass): - for k, v in self.__attrs.items(): - if isinstance(v, Method) and not (k in klass.__dict__): - setattr(klass, k, v) - - for b in self.__bases__: - b.__d(klass) - - def __repr__(self): - try: - return self._v_repr - except AttributeError: - name = self.__name__ - m = self.__module__ - if m: - name = '%s.%s' % (m, name) - r = "<%s %s>" % (self.__class__.__name__, name) - self._v_repr = r - return r - - def _call_conform(self, conform): - try: - return conform(self) - except TypeError: #pragma NO COVER - # We got a TypeError. It might be an error raised by - # the __conform__ implementation, or *we* may have - # made the TypeError by calling an unbound method - # (object is a class). In the later case, we behave - # as though there is no __conform__ method. We can - # detect this case by checking whether there is more - # than one traceback object in the traceback chain: - if sys.exc_info()[2].tb_next is not None: - # There is more than one entry in the chain, so - # reraise the error: - raise - # This clever trick is from Phillip Eby - - return None #pragma NO COVER - - def __reduce__(self): - return self.__name__ - - def __cmp(self, other): - # Yes, I did mean to name this __cmp, rather than __cmp__. - # It is a private method used by __lt__ and __gt__. - # I don't want to override __eq__ because I want the default - # __eq__, which is really fast. - """Make interfaces sortable - - TODO: It would ne nice if: - - More specific interfaces should sort before less specific ones. - Otherwise, sort on name and module. - - But this is too complicated, and we're going to punt on it - for now. - - For now, sort on interface and module name. - - None is treated as a pseudo interface that implies the loosest - contact possible, no contract. For that reason, all interfaces - sort before None. - - """ - if other is None: - return -1 - - n1 = (getattr(self, '__name__', ''), getattr(self, '__module__', '')) - n2 = (getattr(other, '__name__', ''), getattr(other, '__module__', '')) - - # This spelling works under Python3, which doesn't have cmp(). - return (n1 > n2) - (n1 < n2) - - def __hash__(self): - d = self.__dict__ - if '__module__' not in d or '__name__' not in d: #pragma NO COVER - warnings.warn('Hashing uninitialized InterfaceClass instance') - return 1 - return hash((self.__name__, self.__module__)) - - def __eq__(self, other): - c = self.__cmp(other) - return c == 0 - - def __ne__(self, other): - c = self.__cmp(other) - return c != 0 - - def __lt__(self, other): - c = self.__cmp(other) - return c < 0 - - def __le__(self, other): - c = self.__cmp(other) - return c <= 0 - - def __gt__(self, other): - c = self.__cmp(other) - return c > 0 - - def __ge__(self, other): - c = self.__cmp(other) - return c >= 0 - - -Interface = InterfaceClass("Interface", __module__ = 'zope.interface') - -class Attribute(Element): - """Attribute descriptions - """ - - # We can't say this yet because we don't have enough - # infrastructure in place. - # - # implements(IAttribute) - - interface = None - - -class Method(Attribute): - """Method interfaces - - The idea here is that you have objects that describe methods. - This provides an opportunity for rich meta-data. - """ - - # We can't say this yet because we don't have enough - # infrastructure in place. - # - # implements(IMethod) - - positional = required = () - _optional = varargs = kwargs = None - def _get_optional(self): - if self._optional is None: - return {} - return self._optional - def _set_optional(self, opt): - self._optional = opt - def _del_optional(self): - self._optional = None - optional = property(_get_optional, _set_optional, _del_optional) - - def __call__(self, *args, **kw): - raise BrokenImplementation(self.interface, self.__name__) - - def getSignatureInfo(self): - return {'positional': self.positional, - 'required': self.required, - 'optional': self.optional, - 'varargs': self.varargs, - 'kwargs': self.kwargs, - } - - def getSignatureString(self): - sig = [] - for v in self.positional: - sig.append(v) - if v in self.optional.keys(): - sig[-1] += "=" + repr(self.optional[v]) - if self.varargs: - sig.append("*" + self.varargs) - if self.kwargs: - sig.append("**" + self.kwargs) - - return "(%s)" % ", ".join(sig) - -def fromFunction(func, interface=None, imlevel=0, name=None): - name = name or func.__name__ - method = Method(name, func.__doc__) - defaults = getattr(func, '__defaults__', None) or () - code = func.__code__ - # Number of positional arguments - na = code.co_argcount-imlevel - names = code.co_varnames[imlevel:] - opt = {} - # Number of required arguments - nr = na-len(defaults) - if nr < 0: - defaults=defaults[-nr:] - nr = 0 - - # Determine the optional arguments. - opt.update(dict(zip(names[nr:], defaults))) - - method.positional = names[:na] - method.required = names[:nr] - method.optional = opt - - argno = na - - # Determine the function's variable argument's name (i.e. *args) - if code.co_flags & CO_VARARGS: - method.varargs = names[argno] - argno = argno + 1 - else: - method.varargs = None - - # Determine the function's keyword argument's name (i.e. **kw) - if code.co_flags & CO_VARKEYWORDS: - method.kwargs = names[argno] - else: - method.kwargs = None - - method.interface = interface - - for key, value in func.__dict__.items(): - method.setTaggedValue(key, value) - - return method - - -def fromMethod(meth, interface=None, name=None): - if isinstance(meth, MethodType): - func = meth.__func__ - else: - func = meth - return fromFunction(func, interface, imlevel=1, name=name) - - -# Now we can create the interesting interfaces and wire them up: -def _wire(): - from zope.interface.declarations import classImplements - - from zope.interface.interfaces import IAttribute - classImplements(Attribute, IAttribute) - - from zope.interface.interfaces import IMethod - classImplements(Method, IMethod) - - from zope.interface.interfaces import IInterface - classImplements(InterfaceClass, IInterface) - - from zope.interface.interfaces import ISpecification - classImplements(Specification, ISpecification) - -# We import this here to deal with module dependencies. -from zope.interface.declarations import implementedBy -from zope.interface.declarations import providedBy -from zope.interface.exceptions import InvalidInterface -from zope.interface.exceptions import BrokenImplementation diff --git a/zope/interface/interfaces.py b/zope/interface/interfaces.py deleted file mode 100644 index b5551be4..00000000 --- a/zope/interface/interfaces.py +++ /dev/null @@ -1,1288 +0,0 @@ -############################################################################## -# -# Copyright (c) 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Interface Package Interfaces -""" -__docformat__ = 'restructuredtext' - -from zope.interface.interface import Attribute -from zope.interface.interface import Interface -from zope.interface.declarations import implementer -from zope.interface._compat import _u - -_BLANK = _u('') - -class IElement(Interface): - """Objects that have basic documentation and tagged values. - """ - - __name__ = Attribute('__name__', 'The object name') - __doc__ = Attribute('__doc__', 'The object doc string') - - def getTaggedValue(tag): - """Returns the value associated with `tag`. - - Raise a `KeyError` of the tag isn't set. - """ - - def queryTaggedValue(tag, default=None): - """Returns the value associated with `tag`. - - Return the default value of the tag isn't set. - """ - - def getTaggedValueTags(): - """Returns a list of all tags.""" - - def setTaggedValue(tag, value): - """Associates `value` with `key`.""" - - -class IAttribute(IElement): - """Attribute descriptors""" - - interface = Attribute('interface', - 'Stores the interface instance in which the ' - 'attribute is located.') - - -class IMethod(IAttribute): - """Method attributes""" - - def getSignatureInfo(): - """Returns the signature information. - - This method returns a dictionary with the following keys: - - o `positional` - All positional arguments. - - o `required` - A list of all required arguments. - - o `optional` - A list of all optional arguments. - - o `varargs` - The name of the varargs argument. - - o `kwargs` - The name of the kwargs argument. - """ - - def getSignatureString(): - """Return a signature string suitable for inclusion in documentation. - - This method returns the function signature string. For example, if you - have `func(a, b, c=1, d='f')`, then the signature string is `(a, b, - c=1, d='f')`. - """ - -class ISpecification(Interface): - """Object Behavioral specifications""" - - def providedBy(object): - """Test whether the interface is implemented by the object - - Return true of the object asserts that it implements the - interface, including asserting that it implements an extended - interface. - """ - - def implementedBy(class_): - """Test whether the interface is implemented by instances of the class - - Return true of the class asserts that its instances implement the - interface, including asserting that they implement an extended - interface. - """ - - def isOrExtends(other): - """Test whether the specification is or extends another - """ - - def extends(other, strict=True): - """Test whether a specification extends another - - The specification extends other if it has other as a base - interface or if one of it's bases extends other. - - If strict is false, then the specification extends itself. - """ - - def weakref(callback=None): - """Return a weakref to the specification - - This method is, regrettably, needed to allow weakrefs to be - computed to security-proxied specifications. While the - zope.interface package does not require zope.security or - zope.proxy, it has to be able to coexist with it. - - """ - - __bases__ = Attribute("""Base specifications - - A tuple if specifications from which this specification is - directly derived. - - """) - - __sro__ = Attribute("""Specification-resolution order - - A tuple of the specification and all of it's ancestor - specifications from most specific to least specific. - - (This is similar to the method-resolution order for new-style classes.) - """) - - __iro__ = Attribute("""Interface-resolution order - - A tuple of the of the specification's ancestor interfaces from - most specific to least specific. The specification itself is - included if it is an interface. - - (This is similar to the method-resolution order for new-style classes.) - """) - - def get(name, default=None): - """Look up the description for a name - - If the named attribute is not defined, the default is - returned. - """ - - -class IInterface(ISpecification, IElement): - """Interface objects - - Interface objects describe the behavior of an object by containing - useful information about the object. This information includes: - - o Prose documentation about the object. In Python terms, this - is called the "doc string" of the interface. In this element, - you describe how the object works in prose language and any - other useful information about the object. - - o Descriptions of attributes. Attribute descriptions include - the name of the attribute and prose documentation describing - the attributes usage. - - o Descriptions of methods. Method descriptions can include: - - - Prose "doc string" documentation about the method and its - usage. - - - A description of the methods arguments; how many arguments - are expected, optional arguments and their default values, - the position or arguments in the signature, whether the - method accepts arbitrary arguments and whether the method - accepts arbitrary keyword arguments. - - o Optional tagged data. Interface objects (and their attributes and - methods) can have optional, application specific tagged data - associated with them. Examples uses for this are examples, - security assertions, pre/post conditions, and other possible - information you may want to associate with an Interface or its - attributes. - - Not all of this information is mandatory. For example, you may - only want the methods of your interface to have prose - documentation and not describe the arguments of the method in - exact detail. Interface objects are flexible and let you give or - take any of these components. - - Interfaces are created with the Python class statement using - either Interface.Interface or another interface, as in:: - - from zope.interface import Interface - - class IMyInterface(Interface): - '''Interface documentation''' - - def meth(arg1, arg2): - '''Documentation for meth''' - - # Note that there is no self argument - - class IMySubInterface(IMyInterface): - '''Interface documentation''' - - def meth2(): - '''Documentation for meth2''' - - You use interfaces in two ways: - - o You assert that your object implement the interfaces. - - There are several ways that you can assert that an object - implements an interface: - - 1. Call zope.interface.implements in your class definition. - - 2. Call zope.interfaces.directlyProvides on your object. - - 3. Call 'zope.interface.classImplements' to assert that instances - of a class implement an interface. - - For example:: - - from zope.interface import classImplements - - classImplements(some_class, some_interface) - - This approach is useful when it is not an option to modify - the class source. Note that this doesn't affect what the - class itself implements, but only what its instances - implement. - - o You query interface meta-data. See the IInterface methods and - attributes for details. - - """ - - def names(all=False): - """Get the interface attribute names - - Return a sequence of the names of the attributes, including - methods, included in the interface definition. - - Normally, only directly defined attributes are included. If - a true positional or keyword argument is given, then - attributes defined by base classes will be included. - """ - - def namesAndDescriptions(all=False): - """Get the interface attribute names and descriptions - - Return a sequence of the names and descriptions of the - attributes, including methods, as name-value pairs, included - in the interface definition. - - Normally, only directly defined attributes are included. If - a true positional or keyword argument is given, then - attributes defined by base classes will be included. - """ - - def __getitem__(name): - """Get the description for a name - - If the named attribute is not defined, a KeyError is raised. - """ - - def direct(name): - """Get the description for the name if it was defined by the interface - - If the interface doesn't define the name, returns None. - """ - - def validateInvariants(obj, errors=None): - """Validate invariants - - Validate object to defined invariants. If errors is None, - raises first Invalid error; if errors is a list, appends all errors - to list, then raises Invalid with the errors as the first element - of the "args" tuple.""" - - def __contains__(name): - """Test whether the name is defined by the interface""" - - def __iter__(): - """Return an iterator over the names defined by the interface - - The names iterated include all of the names defined by the - interface directly and indirectly by base interfaces. - """ - - __module__ = Attribute("""The name of the module defining the interface""") - -class IDeclaration(ISpecification): - """Interface declaration - - Declarations are used to express the interfaces implemented by - classes or provided by objects. - """ - - def __contains__(interface): - """Test whether an interface is in the specification - - Return true if the given interface is one of the interfaces in - the specification and false otherwise. - """ - - def __iter__(): - """Return an iterator for the interfaces in the specification - """ - - def flattened(): - """Return an iterator of all included and extended interfaces - - An iterator is returned for all interfaces either included in - or extended by interfaces included in the specifications - without duplicates. The interfaces are in "interface - resolution order". The interface resolution order is such that - base interfaces are listed after interfaces that extend them - and, otherwise, interfaces are included in the order that they - were defined in the specification. - """ - - def __sub__(interfaces): - """Create an interface specification with some interfaces excluded - - The argument can be an interface or an interface - specifications. The interface or interfaces given in a - specification are subtracted from the interface specification. - - Removing an interface that is not in the specification does - not raise an error. Doing so has no effect. - - Removing an interface also removes sub-interfaces of the interface. - - """ - - def __add__(interfaces): - """Create an interface specification with some interfaces added - - The argument can be an interface or an interface - specifications. The interface or interfaces given in a - specification are added to the interface specification. - - Adding an interface that is already in the specification does - not raise an error. Doing so has no effect. - """ - - def __nonzero__(): - """Return a true value of the interface specification is non-empty - """ - -class IInterfaceDeclaration(Interface): - """Declare and check the interfaces of objects - - The functions defined in this interface are used to declare the - interfaces that objects provide and to query the interfaces that have - been declared. - - Interfaces can be declared for objects in two ways: - - - Interfaces are declared for instances of the object's class - - - Interfaces are declared for the object directly. - - The interfaces declared for an object are, therefore, the union of - interfaces declared for the object directly and the interfaces - declared for instances of the object's class. - - Note that we say that a class implements the interfaces provided - by it's instances. An instance can also provide interfaces - directly. The interfaces provided by an object are the union of - the interfaces provided directly and the interfaces implemented by - the class. - """ - - def providedBy(ob): - """Return the interfaces provided by an object - - This is the union of the interfaces directly provided by an - object and interfaces implemented by it's class. - - The value returned is an IDeclaration. - """ - - def implementedBy(class_): - """Return the interfaces implemented for a class' instances - - The value returned is an IDeclaration. - """ - - def classImplements(class_, *interfaces): - """Declare additional interfaces implemented for instances of a class - - The arguments after the class are one or more interfaces or - interface specifications (IDeclaration objects). - - The interfaces given (including the interfaces in the - specifications) are added to any interfaces previously - declared. - - Consider the following example:: - - class C(A, B): - ... - - classImplements(C, I1, I2) - - - Instances of ``C`` provide ``I1``, ``I2``, and whatever interfaces - instances of ``A`` and ``B`` provide. - """ - - def implementer(*interfaces): - """Create a decorator for declaring interfaces implemented by a facory - - A callable is returned that makes an implements declaration on - objects passed to it. - """ - - def classImplementsOnly(class_, *interfaces): - """Declare the only interfaces implemented by instances of a class - - The arguments after the class are one or more interfaces or - interface specifications (IDeclaration objects). - - The interfaces given (including the interfaces in the - specifications) replace any previous declarations. - - Consider the following example:: - - class C(A, B): - ... - - classImplements(C, IA, IB. IC) - classImplementsOnly(C. I1, I2) - - Instances of ``C`` provide only ``I1``, ``I2``, and regardless of - whatever interfaces instances of ``A`` and ``B`` implement. - """ - - def implementer_only(*interfaces): - """Create a decorator for declaring the only interfaces implemented - - A callable is returned that makes an implements declaration on - objects passed to it. - """ - - def directlyProvidedBy(object): - """Return the interfaces directly provided by the given object - - The value returned is an IDeclaration. - """ - - def directlyProvides(object, *interfaces): - """Declare interfaces declared directly for an object - - The arguments after the object are one or more interfaces or - interface specifications (IDeclaration objects). - - The interfaces given (including the interfaces in the - specifications) replace interfaces previously - declared for the object. - - Consider the following example:: - - class C(A, B): - ... - - ob = C() - directlyProvides(ob, I1, I2) - - The object, ``ob`` provides ``I1``, ``I2``, and whatever interfaces - instances have been declared for instances of ``C``. - - To remove directly provided interfaces, use ``directlyProvidedBy`` and - subtract the unwanted interfaces. For example:: - - directlyProvides(ob, directlyProvidedBy(ob)-I2) - - removes I2 from the interfaces directly provided by - ``ob``. The object, ``ob`` no longer directly provides ``I2``, - although it might still provide ``I2`` if it's class - implements ``I2``. - - To add directly provided interfaces, use ``directlyProvidedBy`` and - include additional interfaces. For example:: - - directlyProvides(ob, directlyProvidedBy(ob), I2) - - adds I2 to the interfaces directly provided by ob. - """ - - def alsoProvides(object, *interfaces): - """Declare additional interfaces directly for an object:: - - alsoProvides(ob, I1) - - is equivalent to:: - - directlyProvides(ob, directlyProvidedBy(ob), I1) - """ - - def noLongerProvides(object, interface): - """Remove an interface from the list of an object's directly - provided interfaces:: - - noLongerProvides(ob, I1) - - is equivalent to:: - - directlyProvides(ob, directlyProvidedBy(ob)-I1) - - with the exception that if ``I1`` is an interface that is - provided by ``ob`` through the class's implementation, - ValueError is raised. - """ - - def implements(*interfaces): - """Declare interfaces implemented by instances of a class - - This function is called in a class definition (Python 2.x only). - - The arguments are one or more interfaces or interface - specifications (IDeclaration objects). - - The interfaces given (including the interfaces in the - specifications) are added to any interfaces previously - declared. - - Previous declarations include declarations for base classes - unless implementsOnly was used. - - This function is provided for convenience. It provides a more - convenient way to call classImplements. For example:: - - implements(I1) - - is equivalent to calling:: - - classImplements(C, I1) - - after the class has been created. - - Consider the following example (Python 2.x only):: - - class C(A, B): - implements(I1, I2) - - - Instances of ``C`` implement ``I1``, ``I2``, and whatever interfaces - instances of ``A`` and ``B`` implement. - """ - - def implementsOnly(*interfaces): - """Declare the only interfaces implemented by instances of a class - - This function is called in a class definition (Python 2.x only). - - The arguments are one or more interfaces or interface - specifications (IDeclaration objects). - - Previous declarations including declarations for base classes - are overridden. - - This function is provided for convenience. It provides a more - convenient way to call classImplementsOnly. For example:: - - implementsOnly(I1) - - is equivalent to calling:: - - classImplementsOnly(I1) - - after the class has been created. - - Consider the following example (Python 2.x only):: - - class C(A, B): - implementsOnly(I1, I2) - - - Instances of ``C`` implement ``I1``, ``I2``, regardless of what - instances of ``A`` and ``B`` implement. - """ - - def classProvides(*interfaces): - """Declare interfaces provided directly by a class - - This function is called in a class definition. - - The arguments are one or more interfaces or interface - specifications (IDeclaration objects). - - The given interfaces (including the interfaces in the - specifications) are used to create the class's direct-object - interface specification. An error will be raised if the module - class has an direct interface specification. In other words, it is - an error to call this function more than once in a class - definition. - - Note that the given interfaces have nothing to do with the - interfaces implemented by instances of the class. - - This function is provided for convenience. It provides a more - convenient way to call directlyProvides for a class. For example:: - - classProvides(I1) - - is equivalent to calling:: - - directlyProvides(theclass, I1) - - after the class has been created. - """ - def provider(*interfaces): - """A class decorator version of classProvides""" - - def moduleProvides(*interfaces): - """Declare interfaces provided by a module - - This function is used in a module definition. - - The arguments are one or more interfaces or interface - specifications (IDeclaration objects). - - The given interfaces (including the interfaces in the - specifications) are used to create the module's direct-object - interface specification. An error will be raised if the module - already has an interface specification. In other words, it is - an error to call this function more than once in a module - definition. - - This function is provided for convenience. It provides a more - convenient way to call directlyProvides for a module. For example:: - - moduleImplements(I1) - - is equivalent to:: - - directlyProvides(sys.modules[__name__], I1) - """ - - def Declaration(*interfaces): - """Create an interface specification - - The arguments are one or more interfaces or interface - specifications (IDeclaration objects). - - A new interface specification (IDeclaration) with - the given interfaces is returned. - """ - -class IAdapterRegistry(Interface): - """Provide an interface-based registry for adapters - - This registry registers objects that are in some sense "from" a - sequence of specification to an interface and a name. - - No specific semantics are assumed for the registered objects, - however, the most common application will be to register factories - that adapt objects providing required specifications to a provided - interface. - """ - - def register(required, provided, name, value): - """Register a value - - A value is registered for a *sequence* of required specifications, a - provided interface, and a name. - """ - - def registered(required, provided, name=_BLANK): - """Return the component registered for the given interfaces and name - - Unlike the lookup method, this methods won't retrieve - components registered for more specific required interfaces or - less specific provided interfaces. - - If no component was registered exactly for the given - interfaces and name, then None is returned. - - """ - - def lookup(required, provided, name='', default=None): - """Lookup a value - - A value is looked up based on a *sequence* of required - specifications, a provided interface, and a name. - """ - - def queryMultiAdapter(objects, provided, name=_BLANK, default=None): - """Adapt a sequence of objects to a named, provided, interface - """ - - def lookup1(required, provided, name=_BLANK, default=None): - """Lookup a value using a single required interface - - A value is looked up based on a single required - specifications, a provided interface, and a name. - """ - - def queryAdapter(object, provided, name=_BLANK, default=None): - """Adapt an object using a registered adapter factory. - """ - - def adapter_hook(provided, object, name=_BLANK, default=None): - """Adapt an object using a registered adapter factory. - """ - - def lookupAll(required, provided): - """Find all adapters from the required to the provided interfaces - - An iterable object is returned that provides name-value two-tuples. - """ - - def names(required, provided): - """Return the names for which there are registered objects - """ - - def subscribe(required, provided, subscriber, name=_BLANK): - """Register a subscriber - - A subscriber is registered for a *sequence* of required - specifications, a provided interface, and a name. - - Multiple subscribers may be registered for the same (or - equivalent) interfaces. - """ - - def subscriptions(required, provided, name=_BLANK): - """Get a sequence of subscribers - - Subscribers for a *sequence* of required interfaces, and a provided - interface are returned. - """ - - def subscribers(objects, provided, name=_BLANK): - """Get a sequence of subscription adapters - """ - -# begin formerly in zope.component - -class ComponentLookupError(LookupError): - """A component could not be found.""" - -class Invalid(Exception): - """A component doesn't satisfy a promise.""" - -class IObjectEvent(Interface): - """An event related to an object. - - The object that generated this event is not necessarily the object - refered to by location. - """ - - object = Attribute("The subject of the event.") - - -@implementer(IObjectEvent) -class ObjectEvent(object): - - def __init__(self, object): - self.object = object - -class IComponentLookup(Interface): - """Component Manager for a Site - - This object manages the components registered at a particular site. The - definition of a site is intentionally vague. - """ - - adapters = Attribute( - "Adapter Registry to manage all registered adapters.") - - utilities = Attribute( - "Adapter Registry to manage all registered utilities.") - - def queryAdapter(object, interface, name=_BLANK, default=None): - """Look for a named adapter to an interface for an object - - If a matching adapter cannot be found, returns the default. - """ - - def getAdapter(object, interface, name=_BLANK): - """Look for a named adapter to an interface for an object - - If a matching adapter cannot be found, a ComponentLookupError - is raised. - """ - - def queryMultiAdapter(objects, interface, name=_BLANK, default=None): - """Look for a multi-adapter to an interface for multiple objects - - If a matching adapter cannot be found, returns the default. - """ - - def getMultiAdapter(objects, interface, name=_BLANK): - """Look for a multi-adapter to an interface for multiple objects - - If a matching adapter cannot be found, a ComponentLookupError - is raised. - """ - - def getAdapters(objects, provided): - """Look for all matching adapters to a provided interface for objects - - Return an iterable of name-adapter pairs for adapters that - provide the given interface. - """ - - def subscribers(objects, provided): - """Get subscribers - - Subscribers are returned that provide the provided interface - and that depend on and are comuted from the sequence of - required objects. - """ - - def handle(*objects): - """Call handlers for the given objects - - Handlers registered for the given objects are called. - """ - - def queryUtility(interface, name='', default=None): - """Look up a utility that provides an interface. - - If one is not found, returns default. - """ - - def getUtilitiesFor(interface): - """Look up the registered utilities that provide an interface. - - Returns an iterable of name-utility pairs. - """ - - def getAllUtilitiesRegisteredFor(interface): - """Return all registered utilities for an interface - - This includes overridden utilities. - - An iterable of utility instances is returned. No names are - returned. - """ - -class IRegistration(Interface): - """A registration-information object - """ - - registry = Attribute("The registry having the registration") - - name = Attribute("The registration name") - - info = Attribute("""Information about the registration - - This is information deemed useful to people browsing the - configuration of a system. It could, for example, include - commentary or information about the source of the configuration. - """) - -class IUtilityRegistration(IRegistration): - """Information about the registration of a utility - """ - - factory = Attribute("The factory used to create the utility. Optional.") - component = Attribute("The object registered") - provided = Attribute("The interface provided by the component") - -class _IBaseAdapterRegistration(IRegistration): - """Information about the registration of an adapter - """ - - factory = Attribute("The factory used to create adapters") - - required = Attribute("""The adapted interfaces - - This is a sequence of interfaces adapters by the registered - factory. The factory will be caled with a sequence of objects, as - positional arguments, that provide these interfaces. - """) - - provided = Attribute("""The interface provided by the adapters. - - This interface is implemented by the factory - """) - -class IAdapterRegistration(_IBaseAdapterRegistration): - """Information about the registration of an adapter - """ - -class ISubscriptionAdapterRegistration(_IBaseAdapterRegistration): - """Information about the registration of a subscription adapter - """ - -class IHandlerRegistration(IRegistration): - - handler = Attribute("An object called used to handle an event") - - required = Attribute("""The handled interfaces - - This is a sequence of interfaces handled by the registered - handler. The handler will be caled with a sequence of objects, as - positional arguments, that provide these interfaces. - """) - -class IRegistrationEvent(IObjectEvent): - """An event that involves a registration""" - - -@implementer(IRegistrationEvent) -class RegistrationEvent(ObjectEvent): - """There has been a change in a registration - """ - def __repr__(self): - return "%s event:\n%r" % (self.__class__.__name__, self.object) - -class IRegistered(IRegistrationEvent): - """A component or factory was registered - """ - -@implementer(IRegistered) -class Registered(RegistrationEvent): - pass - -class IUnregistered(IRegistrationEvent): - """A component or factory was unregistered - """ - -@implementer(IUnregistered) -class Unregistered(RegistrationEvent): - """A component or factory was unregistered - """ - pass - -class IComponentRegistry(Interface): - """Register components - """ - - def registerUtility(component=None, provided=None, name=_BLANK, - info=_BLANK, factory=None): - """Register a utility - - factory - Factory for the component to be registerd. - - component - The registered component - - provided - This is the interface provided by the utility. If the - component provides a single interface, then this - argument is optional and the component-implemented - interface will be used. - - name - The utility name. - - info - An object that can be converted to a string to provide - information about the registration. - - Only one of component and factory can be used. - A Registered event is generated with an IUtilityRegistration. - """ - - def unregisterUtility(component=None, provided=None, name=_BLANK, - factory=None): - """Unregister a utility - - A boolean is returned indicating whether the registry was - changed. If the given component is None and there is no - component registered, or if the given component is not - None and is not registered, then the function returns - False, otherwise it returns True. - - factory - Factory for the component to be unregisterd. - - component - The registered component The given component can be - None, in which case any component registered to provide - the given provided interface with the given name is - unregistered. - - provided - This is the interface provided by the utility. If the - component is not None and provides a single interface, - then this argument is optional and the - component-implemented interface will be used. - - name - The utility name. - - Only one of component and factory can be used. - An UnRegistered event is generated with an IUtilityRegistration. - """ - - def registeredUtilities(): - """Return an iterable of IUtilityRegistration instances. - - These registrations describe the current utility registrations - in the object. - """ - - def registerAdapter(factory, required=None, provided=None, name=_BLANK, - info=_BLANK): - """Register an adapter factory - - Parameters: - - factory - The object used to compute the adapter - - required - This is a sequence of specifications for objects to be - adapted. If omitted, then the value of the factory's - __component_adapts__ attribute will be used. The - __component_adapts__ attribute is usually attribute is - normally set in class definitions using adapts - function, or for callables using the adapter - decorator. If the factory doesn't have a - __component_adapts__ adapts attribute, then this - argument is required. - - provided - This is the interface provided by the adapter and - implemented by the factory. If the factory - implements a single interface, then this argument is - optional and the factory-implemented interface will be - used. - - name - The adapter name. - - info - An object that can be converted to a string to provide - information about the registration. - - A Registered event is generated with an IAdapterRegistration. - """ - - def unregisterAdapter(factory=None, required=None, - provided=None, name=_BLANK): - """Register an adapter factory - - A boolean is returned indicating whether the registry was - changed. If the given component is None and there is no - component registered, or if the given component is not - None and is not registered, then the function returns - False, otherwise it returns True. - - Parameters: - - factory - This is the object used to compute the adapter. The - factory can be None, in which case any factory - registered to implement the given provided interface - for the given required specifications with the given - name is unregistered. - - required - This is a sequence of specifications for objects to be - adapted. If the factory is not None and the required - arguments is omitted, then the value of the factory's - __component_adapts__ attribute will be used. The - __component_adapts__ attribute attribute is normally - set in class definitions using adapts function, or for - callables using the adapter decorator. If the factory - is None or doesn't have a __component_adapts__ adapts - attribute, then this argument is required. - - provided - This is the interface provided by the adapter and - implemented by the factory. If the factory is not - None and implements a single interface, then this - argument is optional and the factory-implemented - interface will be used. - - name - The adapter name. - - An Unregistered event is generated with an IAdapterRegistration. - """ - - def registeredAdapters(): - """Return an iterable of IAdapterRegistration instances. - - These registrations describe the current adapter registrations - in the object. - """ - - def registerSubscriptionAdapter(factory, required=None, provides=None, - name=_BLANK, info=''): - """Register a subscriber factory - - Parameters: - - factory - The object used to compute the adapter - - required - This is a sequence of specifications for objects to be - adapted. If omitted, then the value of the factory's - __component_adapts__ attribute will be used. The - __component_adapts__ attribute is usually attribute is - normally set in class definitions using adapts - function, or for callables using the adapter - decorator. If the factory doesn't have a - __component_adapts__ adapts attribute, then this - argument is required. - - provided - This is the interface provided by the adapter and - implemented by the factory. If the factory implements - a single interface, then this argument is optional and - the factory-implemented interface will be used. - - name - The adapter name. - - Currently, only the empty string is accepted. Other - strings will be accepted in the future when support for - named subscribers is added. - - info - An object that can be converted to a string to provide - information about the registration. - - A Registered event is generated with an - ISubscriptionAdapterRegistration. - """ - - def unregisterSubscriptionAdapter(factory=None, required=None, - provides=None, name=_BLANK): - """Unregister a subscriber factory. - - A boolean is returned indicating whether the registry was - changed. If the given component is None and there is no - component registered, or if the given component is not - None and is not registered, then the function returns - False, otherwise it returns True. - - Parameters: - - factory - This is the object used to compute the adapter. The - factory can be None, in which case any factories - registered to implement the given provided interface - for the given required specifications with the given - name are unregistered. - - required - This is a sequence of specifications for objects to be - adapted. If the factory is not None and the required - arguments is omitted, then the value of the factory's - __component_adapts__ attribute will be used. The - __component_adapts__ attribute attribute is normally - set in class definitions using adapts function, or for - callables using the adapter decorator. If the factory - is None or doesn't have a __component_adapts__ adapts - attribute, then this argument is required. - - provided - This is the interface provided by the adapter and - implemented by the factory. If the factory is not - None implements a single interface, then this argument - is optional and the factory-implemented interface will - be used. - - name - The adapter name. - - Currently, only the empty string is accepted. Other - strings will be accepted in the future when support for - named subscribers is added. - - An Unregistered event is generated with an - ISubscriptionAdapterRegistration. - """ - - def registeredSubscriptionAdapters(): - """Return an iterable of ISubscriptionAdapterRegistration instances. - - These registrations describe the current subscription adapter - registrations in the object. - """ - - def registerHandler(handler, required=None, name=_BLANK, info=''): - """Register a handler. - - A handler is a subscriber that doesn't compute an adapter - but performs some function when called. - - Parameters: - - handler - The object used to handle some event represented by - the objects passed to it. - - required - This is a sequence of specifications for objects to be - adapted. If omitted, then the value of the factory's - __component_adapts__ attribute will be used. The - __component_adapts__ attribute is usually attribute is - normally set in class definitions using adapts - function, or for callables using the adapter - decorator. If the factory doesn't have a - __component_adapts__ adapts attribute, then this - argument is required. - - name - The handler name. - - Currently, only the empty string is accepted. Other - strings will be accepted in the future when support for - named handlers is added. - - info - An object that can be converted to a string to provide - information about the registration. - - - A Registered event is generated with an IHandlerRegistration. - """ - - def unregisterHandler(handler=None, required=None, name=_BLANK): - """Unregister a handler. - - A handler is a subscriber that doesn't compute an adapter - but performs some function when called. - - A boolean is returned indicating whether the registry was - changed. - - Parameters: - - handler - This is the object used to handle some event - represented by the objects passed to it. The handler - can be None, in which case any handlers registered for - the given required specifications with the given are - unregistered. - - required - This is a sequence of specifications for objects to be - adapted. If omitted, then the value of the factory's - __component_adapts__ attribute will be used. The - __component_adapts__ attribute is usually attribute is - normally set in class definitions using adapts - function, or for callables using the adapter - decorator. If the factory doesn't have a - __component_adapts__ adapts attribute, then this - argument is required. - - name - The handler name. - - Currently, only the empty string is accepted. Other - strings will be accepted in the future when support for - named handlers is added. - - An Unregistered event is generated with an IHandlerRegistration. - """ - - def registeredHandlers(): - """Return an iterable of IHandlerRegistration instances. - - These registrations describe the current handler registrations - in the object. - """ - - -class IComponents(IComponentLookup, IComponentRegistry): - """Component registration and access - """ - - -# end formerly in zope.component diff --git a/zope/interface/registry.py b/zope/interface/registry.py deleted file mode 100644 index 1882e0da..00000000 --- a/zope/interface/registry.py +++ /dev/null @@ -1,530 +0,0 @@ -############################################################################## -# -# Copyright (c) 2006 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Basic components support -""" -try: - from zope.event import notify -except ImportError: #pragma NO COVER - def notify(*arg, **kw): pass - -from zope.interface.interfaces import ISpecification -from zope.interface.interfaces import ComponentLookupError -from zope.interface.interfaces import IAdapterRegistration -from zope.interface.interfaces import IComponents -from zope.interface.interfaces import IHandlerRegistration -from zope.interface.interfaces import ISubscriptionAdapterRegistration -from zope.interface.interfaces import IUtilityRegistration -from zope.interface.interfaces import Registered -from zope.interface.interfaces import Unregistered - -from zope.interface.interface import Interface -from zope.interface.declarations import implementedBy -from zope.interface.declarations import implementer -from zope.interface.declarations import implementer_only -from zope.interface.declarations import providedBy -from zope.interface.adapter import AdapterRegistry -from zope.interface._compat import _u -from zope.interface._compat import CLASS_TYPES -from zope.interface._compat import STRING_TYPES - - -@implementer(IComponents) -class Components(object): - - def __init__(self, name='', bases=()): - assert isinstance(name, STRING_TYPES) - self.__name__ = name - self._init_registries() - self._init_registrations() - self.__bases__ = tuple(bases) - - def __repr__(self): - return "<%s %s>" % (self.__class__.__name__, self.__name__) - - def _init_registries(self): - self.adapters = AdapterRegistry() - self.utilities = AdapterRegistry() - - def _init_registrations(self): - self._utility_registrations = {} - self._adapter_registrations = {} - self._subscription_registrations = [] - self._handler_registrations = [] - - def _getBases(self): - # Subclasses might override - return self.__dict__.get('__bases__', ()) - - def _setBases(self, bases): - # Subclasses might override - self.adapters.__bases__ = tuple([ - base.adapters for base in bases]) - self.utilities.__bases__ = tuple([ - base.utilities for base in bases]) - self.__dict__['__bases__'] = tuple(bases) - - __bases__ = property( - lambda self: self._getBases(), - lambda self, bases: self._setBases(bases), - ) - - def registerUtility(self, component=None, provided=None, name=_u(''), - info=_u(''), event=True, factory=None): - if factory: - if component: - raise TypeError("Can't specify factory and component.") - component = factory() - - if provided is None: - provided = _getUtilityProvided(component) - - reg = self._utility_registrations.get((provided, name)) - if reg is not None: - if reg[:2] == (component, info): - # already registered - return - self.unregisterUtility(reg[0], provided, name) - - subscribed = False - for ((p, _), data) in iter(self._utility_registrations.items()): - if p == provided and data[0] == component: - subscribed = True - break - - self._utility_registrations[(provided, name)] = component, info, factory - self.utilities.register((), provided, name, component) - - if not subscribed: - self.utilities.subscribe((), provided, component) - - if event: - notify(Registered( - UtilityRegistration(self, provided, name, component, info, - factory) - )) - - def unregisterUtility(self, component=None, provided=None, name=_u(''), - factory=None): - if factory: - if component: - raise TypeError("Can't specify factory and component.") - component = factory() - - if provided is None: - if component is None: - raise TypeError("Must specify one of component, factory and " - "provided") - provided = _getUtilityProvided(component) - - old = self._utility_registrations.get((provided, name)) - if (old is None) or ((component is not None) and - (component != old[0])): - return False - - if component is None: - component = old[0] - - # Note that component is now the old thing registered - - del self._utility_registrations[(provided, name)] - self.utilities.unregister((), provided, name) - - subscribed = False - for ((p, _), data) in iter(self._utility_registrations.items()): - if p == provided and data[0] == component: - subscribed = True - break - - if not subscribed: - self.utilities.unsubscribe((), provided, component) - - notify(Unregistered( - UtilityRegistration(self, provided, name, component, *old[1:]) - )) - - return True - - def registeredUtilities(self): - for ((provided, name), data - ) in iter(self._utility_registrations.items()): - yield UtilityRegistration(self, provided, name, *data) - - def queryUtility(self, provided, name=_u(''), default=None): - return self.utilities.lookup((), provided, name, default) - - def getUtility(self, provided, name=_u('')): - utility = self.utilities.lookup((), provided, name) - if utility is None: - raise ComponentLookupError(provided, name) - return utility - - def getUtilitiesFor(self, interface): - for name, utility in self.utilities.lookupAll((), interface): - yield name, utility - - def getAllUtilitiesRegisteredFor(self, interface): - return self.utilities.subscriptions((), interface) - - def registerAdapter(self, factory, required=None, provided=None, - name=_u(''), info=_u(''), event=True): - if provided is None: - provided = _getAdapterProvided(factory) - required = _getAdapterRequired(factory, required) - self._adapter_registrations[(required, provided, name) - ] = factory, info - self.adapters.register(required, provided, name, factory) - - if event: - notify(Registered( - AdapterRegistration(self, required, provided, name, - factory, info) - )) - - - def unregisterAdapter(self, factory=None, - required=None, provided=None, name=_u(''), - ): - if provided is None: - if factory is None: - raise TypeError("Must specify one of factory and provided") - provided = _getAdapterProvided(factory) - - if (required is None) and (factory is None): - raise TypeError("Must specify one of factory and required") - - required = _getAdapterRequired(factory, required) - old = self._adapter_registrations.get((required, provided, name)) - if (old is None) or ((factory is not None) and - (factory != old[0])): - return False - - del self._adapter_registrations[(required, provided, name)] - self.adapters.unregister(required, provided, name) - - notify(Unregistered( - AdapterRegistration(self, required, provided, name, - *old) - )) - - return True - - def registeredAdapters(self): - for ((required, provided, name), (component, info) - ) in iter(self._adapter_registrations.items()): - yield AdapterRegistration(self, required, provided, name, - component, info) - - def queryAdapter(self, object, interface, name=_u(''), default=None): - return self.adapters.queryAdapter(object, interface, name, default) - - def getAdapter(self, object, interface, name=_u('')): - adapter = self.adapters.queryAdapter(object, interface, name) - if adapter is None: - raise ComponentLookupError(object, interface, name) - return adapter - - def queryMultiAdapter(self, objects, interface, name=_u(''), - default=None): - return self.adapters.queryMultiAdapter( - objects, interface, name, default) - - def getMultiAdapter(self, objects, interface, name=_u('')): - adapter = self.adapters.queryMultiAdapter(objects, interface, name) - if adapter is None: - raise ComponentLookupError(objects, interface, name) - return adapter - - def getAdapters(self, objects, provided): - for name, factory in self.adapters.lookupAll( - list(map(providedBy, objects)), - provided): - adapter = factory(*objects) - if adapter is not None: - yield name, adapter - - def registerSubscriptionAdapter(self, - factory, required=None, provided=None, - name=_u(''), info=_u(''), - event=True): - if name: - raise TypeError("Named subscribers are not yet supported") - if provided is None: - provided = _getAdapterProvided(factory) - required = _getAdapterRequired(factory, required) - self._subscription_registrations.append( - (required, provided, name, factory, info) - ) - self.adapters.subscribe(required, provided, factory) - - if event: - notify(Registered( - SubscriptionRegistration(self, required, provided, name, - factory, info) - )) - - def registeredSubscriptionAdapters(self): - for data in self._subscription_registrations: - yield SubscriptionRegistration(self, *data) - - def unregisterSubscriptionAdapter(self, factory=None, - required=None, provided=None, name=_u(''), - ): - if name: - raise TypeError("Named subscribers are not yet supported") - if provided is None: - if factory is None: - raise TypeError("Must specify one of factory and provided") - provided = _getAdapterProvided(factory) - - if (required is None) and (factory is None): - raise TypeError("Must specify one of factory and required") - - required = _getAdapterRequired(factory, required) - - if factory is None: - new = [(r, p, n, f, i) - for (r, p, n, f, i) - in self._subscription_registrations - if not (r == required and p == provided) - ] - else: - new = [(r, p, n, f, i) - for (r, p, n, f, i) - in self._subscription_registrations - if not (r == required and p == provided and f == factory) - ] - - if len(new) == len(self._subscription_registrations): - return False - - - self._subscription_registrations[:] = new - self.adapters.unsubscribe(required, provided, factory) - - notify(Unregistered( - SubscriptionRegistration(self, required, provided, name, - factory, '') - )) - - return True - - def subscribers(self, objects, provided): - return self.adapters.subscribers(objects, provided) - - def registerHandler(self, - factory, required=None, - name=_u(''), info=_u(''), - event=True): - if name: - raise TypeError("Named handlers are not yet supported") - required = _getAdapterRequired(factory, required) - self._handler_registrations.append( - (required, name, factory, info) - ) - self.adapters.subscribe(required, None, factory) - - if event: - notify(Registered( - HandlerRegistration(self, required, name, factory, info) - )) - - def registeredHandlers(self): - for data in self._handler_registrations: - yield HandlerRegistration(self, *data) - - def unregisterHandler(self, factory=None, required=None, name=_u('')): - if name: - raise TypeError("Named subscribers are not yet supported") - - if (required is None) and (factory is None): - raise TypeError("Must specify one of factory and required") - - required = _getAdapterRequired(factory, required) - - if factory is None: - new = [(r, n, f, i) - for (r, n, f, i) - in self._handler_registrations - if r != required - ] - else: - new = [(r, n, f, i) - for (r, n, f, i) - in self._handler_registrations - if not (r == required and f == factory) - ] - - if len(new) == len(self._handler_registrations): - return False - - self._handler_registrations[:] = new - self.adapters.unsubscribe(required, None, factory) - - notify(Unregistered( - HandlerRegistration(self, required, name, factory, '') - )) - - return True - - def handle(self, *objects): - self.adapters.subscribers(objects, None) - - -def _getUtilityProvided(component): - provided = list(providedBy(component)) - if len(provided) == 1: - return provided[0] - raise TypeError( - "The utility doesn't provide a single interface " - "and no provided interface was specified.") - -def _getAdapterProvided(factory): - provided = list(implementedBy(factory)) - if len(provided) == 1: - return provided[0] - raise TypeError( - "The adapter factory doesn't implement a single interface " - "and no provided interface was specified.") - -def _getAdapterRequired(factory, required): - if required is None: - try: - required = factory.__component_adapts__ - except AttributeError: - raise TypeError( - "The adapter factory doesn't have a __component_adapts__ " - "attribute and no required specifications were specified" - ) - elif ISpecification.providedBy(required): - raise TypeError("the required argument should be a list of " - "interfaces, not a single interface") - - result = [] - for r in required: - if r is None: - r = Interface - elif not ISpecification.providedBy(r): - if isinstance(r, CLASS_TYPES): - r = implementedBy(r) - else: - raise TypeError("Required specification must be a " - "specification or class." - ) - result.append(r) - return tuple(result) - - -@implementer(IUtilityRegistration) -class UtilityRegistration(object): - - def __init__(self, registry, provided, name, component, doc, factory=None): - (self.registry, self.provided, self.name, self.component, self.info, - self.factory - ) = registry, provided, name, component, doc, factory - - def __repr__(self): - return '%s(%r, %s, %r, %s, %r, %r)' % ( - self.__class__.__name__, - self.registry, - getattr(self.provided, '__name__', None), self.name, - getattr(self.component, '__name__', repr(self.component)), - self.factory, self.info, - ) - - def __hash__(self): - return id(self) - - def __eq__(self, other): - return repr(self) == repr(other) - - def __ne__(self, other): - return repr(self) != repr(other) - - def __lt__(self, other): - return repr(self) < repr(other) - - def __le__(self, other): - return repr(self) <= repr(other) - - def __gt__(self, other): - return repr(self) > repr(other) - - def __ge__(self, other): - return repr(self) >= repr(other) - -@implementer(IAdapterRegistration) -class AdapterRegistration(object): - - def __init__(self, registry, required, provided, name, component, doc): - (self.registry, self.required, self.provided, self.name, - self.factory, self.info - ) = registry, required, provided, name, component, doc - - def __repr__(self): - return '%s(%r, %s, %s, %r, %s, %r)' % ( - self.__class__.__name__, - self.registry, - '[' + ", ".join([r.__name__ for r in self.required]) + ']', - getattr(self.provided, '__name__', None), self.name, - getattr(self.factory, '__name__', repr(self.factory)), self.info, - ) - - def __hash__(self): - return id(self) - - def __eq__(self, other): - return repr(self) == repr(other) - - def __ne__(self, other): - return repr(self) != repr(other) - - def __lt__(self, other): - return repr(self) < repr(other) - - def __le__(self, other): - return repr(self) <= repr(other) - - def __gt__(self, other): - return repr(self) > repr(other) - - def __ge__(self, other): - return repr(self) >= repr(other) - -@implementer_only(ISubscriptionAdapterRegistration) -class SubscriptionRegistration(AdapterRegistration): - pass - - -@implementer_only(IHandlerRegistration) -class HandlerRegistration(AdapterRegistration): - - def __init__(self, registry, required, name, handler, doc): - (self.registry, self.required, self.name, self.handler, self.info - ) = registry, required, name, handler, doc - - @property - def factory(self): - return self.handler - - provided = None - - def __repr__(self): - return '%s(%r, %s, %r, %s, %r)' % ( - self.__class__.__name__, - self.registry, - '[' + ", ".join([r.__name__ for r in self.required]) + ']', - self.name, - getattr(self.factory, '__name__', repr(self.factory)), self.info, - ) - diff --git a/zope/interface/ro.py b/zope/interface/ro.py deleted file mode 100644 index ab47a4c3..00000000 --- a/zope/interface/ro.py +++ /dev/null @@ -1,69 +0,0 @@ -############################################################################## -# -# Copyright (c) 2003 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Compute a resolution order for an object and its bases -""" -__docformat__ = 'restructuredtext' - - -def ro(object): - """Compute a "resolution order" for an object - """ - return mergeOrderings([_flatten(object)]) - -def mergeOrderings(orderings, seen=None): - """Merge multiple orderings so that within-ordering order is preserved - - Orderings are constrained in such a way that if an object appears - in two or more orderings, then the suffix that begins with the - object must be in both orderings. - - For example: - - >>> mergeOrderings([ - ... ['x', 'y', 'z'], - ... ['q', 'z'], - ... [1, 3, 5], - ... ['z'] - ... ]) - ['x', 'y', 'q', 1, 3, 5, 'z'] - - """ - - if seen is None: - seen = {} - result = [] - orderings.reverse() - for ordering in orderings: - ordering = list(ordering) - ordering.reverse() - for o in ordering: - if o not in seen: - seen[o] = 1 - result.append(o) - - result.reverse() - return result - -def _flatten(ob): - result = [ob] - i = 0 - for ob in iter(result): - i += 1 - # The recursive calls can be avoided by inserting the base classes - # into the dynamically growing list directly after the currently - # considered object; the iterator makes sure this will keep working - # in the future, since it cannot rely on the length of the list - # by definition. - result[i:i] = ob.__bases__ - return result diff --git a/zope/interface/tests/__init__.py b/zope/interface/tests/__init__.py deleted file mode 100644 index 1cf24e65..00000000 --- a/zope/interface/tests/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ -import os -import unittest - -def additional_tests(): - suites = unittest.TestSuite() - for file in os.listdir(os.path.dirname(__file__)): - if file.endswith('.py') and file!='__init__.py': - name = os.path.splitext(file)[0] - module = __import__('.'.join((__name__, name)), globals(), - locals(), [name]) - if hasattr(module, 'test_suite'): - suites.addTests(module.test_suite()) - return suites diff --git a/zope/interface/tests/advisory_testing.py b/zope/interface/tests/advisory_testing.py deleted file mode 100644 index f78a550c..00000000 --- a/zope/interface/tests/advisory_testing.py +++ /dev/null @@ -1,42 +0,0 @@ -############################################################################## -# -# Copyright (c) 2003 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -import sys - -from zope.interface.advice import addClassAdvisor -from zope.interface.advice import getFrameInfo - -my_globals = globals() - -def ping(log, value): - - def pong(klass): - log.append((value,klass)) - return [klass] - - addClassAdvisor(pong) - -try: - from types import ClassType - - class ClassicClass: - __metaclass__ = ClassType - classLevelFrameInfo = getFrameInfo(sys._getframe()) -except ImportError: - ClassicClass = None - -class NewStyleClass: - __metaclass__ = type - classLevelFrameInfo = getFrameInfo(sys._getframe()) - -moduleLevelFrameInfo = getFrameInfo(sys._getframe()) diff --git a/zope/interface/tests/dummy.py b/zope/interface/tests/dummy.py deleted file mode 100644 index 9057d735..00000000 --- a/zope/interface/tests/dummy.py +++ /dev/null @@ -1,23 +0,0 @@ -############################################################################## -# -# Copyright (c) 2001, 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -""" Dummy Module -""" -from zope.interface import moduleProvides -from zope.interface.tests.idummy import IDummyModule - -moduleProvides(IDummyModule) - -def bar(baz): - # Note: no 'self', because the module provides the interface directly. - pass diff --git a/zope/interface/tests/idummy.py b/zope/interface/tests/idummy.py deleted file mode 100644 index 1e34fe0f..00000000 --- a/zope/interface/tests/idummy.py +++ /dev/null @@ -1,23 +0,0 @@ -############################################################################## -# -# Copyright (c) 2001, 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -""" Interface describing API of zope.interface.tests.dummy test module -""" -from zope.interface import Interface - -class IDummyModule(Interface): - """ Dummy interface for unit tests. - """ - def bar(baz): - """ Just a note. - """ diff --git a/zope/interface/tests/ifoo.py b/zope/interface/tests/ifoo.py deleted file mode 100644 index 29a78779..00000000 --- a/zope/interface/tests/ifoo.py +++ /dev/null @@ -1,26 +0,0 @@ -############################################################################## -# -# Copyright (c) 2001, 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""IFoo test module -""" -from zope.interface import Interface - -class IFoo(Interface): - """ - Dummy interface for unit tests. - """ - - def bar(baz): - """ - Just a note. - """ diff --git a/zope/interface/tests/ifoo_other.py b/zope/interface/tests/ifoo_other.py deleted file mode 100644 index 29a78779..00000000 --- a/zope/interface/tests/ifoo_other.py +++ /dev/null @@ -1,26 +0,0 @@ -############################################################################## -# -# Copyright (c) 2001, 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""IFoo test module -""" -from zope.interface import Interface - -class IFoo(Interface): - """ - Dummy interface for unit tests. - """ - - def bar(baz): - """ - Just a note. - """ diff --git a/zope/interface/tests/m1.py b/zope/interface/tests/m1.py deleted file mode 100644 index d311fb40..00000000 --- a/zope/interface/tests/m1.py +++ /dev/null @@ -1,21 +0,0 @@ -############################################################################## -# -# Copyright (c) 2004 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Test module that declares an interface -""" -from zope.interface import Interface, moduleProvides - -class I1(Interface): pass -class I2(Interface): pass - -moduleProvides(I1, I2) diff --git a/zope/interface/tests/m2.py b/zope/interface/tests/m2.py deleted file mode 100644 index 511cd9ce..00000000 --- a/zope/interface/tests/m2.py +++ /dev/null @@ -1,15 +0,0 @@ -############################################################################## -# -# Copyright (c) 2004 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Test module that doesn't declare an interface -""" diff --git a/zope/interface/tests/odd.py b/zope/interface/tests/odd.py deleted file mode 100644 index 04ffa31f..00000000 --- a/zope/interface/tests/odd.py +++ /dev/null @@ -1,129 +0,0 @@ -############################################################################## -# -# Copyright (c) 2003 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Odd meta class that doesn't subclass type. - -This is used for testing support for ExtensionClass in new interfaces. - - >>> class A(object): - ... __metaclass__ = MetaClass - ... a = 1 - ... - >>> A.__name__ - 'A' - >>> A.__bases__ == (object,) - True - >>> class B(object): - ... __metaclass__ = MetaClass - ... b = 1 - ... - >>> class C(A, B): pass - ... - >>> C.__name__ - 'C' - >>> int(C.__bases__ == (A, B)) - 1 - >>> a = A() - >>> aa = A() - >>> a.a - 1 - >>> aa.a - 1 - >>> aa.a = 2 - >>> a.a - 1 - >>> aa.a - 2 - >>> c = C() - >>> c.a - 1 - >>> c.b - 1 - >>> c.b = 2 - >>> c.b - 2 - >>> C.c = 1 - >>> c.c - 1 - >>> import sys - >>> if sys.version[0] == '2': # This test only makes sense under Python 2.x - ... from types import ClassType - ... assert not isinstance(C, (type, ClassType)) - - >>> int(C.__class__.__class__ is C.__class__) - 1 -""" - -# class OddClass is an odd meta class - -class MetaMetaClass(type): - - def __getattribute__(self, name): - if name == '__class__': - return self - return type.__getattribute__(self, name) - - -class MetaClass(object): - """Odd classes - """ - __metaclass__ = MetaMetaClass - - def __init__(self, name, bases, dict): - self.__name__ = name - self.__bases__ = bases - self.__dict__.update(dict) - - def __call__(self): - return OddInstance(self) - - def __getattr__(self, name): - for b in self.__bases__: - v = getattr(b, name, self) - if v is not self: - return v - raise AttributeError(name) - - def __repr__(self): - return "" % (self.__name__, hex(id(self))) - -class OddInstance(object): - - def __init__(self, cls): - self.__dict__['__class__'] = cls - - def __getattribute__(self, name): - dict = object.__getattribute__(self, '__dict__') - if name == '__dict__': - return dict - v = dict.get(name, self) - if v is not self: - return v - return getattr(dict['__class__'], name) - - def __setattr__(self, name, v): - self.__dict__[name] = v - - def __delattr__(self, name): - del self.__dict__[name] - - def __repr__(self): - return "" % ( - self.__class__.__name__, hex(id(self))) - - - -# DocTest: -if __name__ == "__main__": - import doctest, __main__ - doctest.testmod(__main__, isprivate=lambda *a: False) diff --git a/zope/interface/tests/test_adapter.py b/zope/interface/tests/test_adapter.py deleted file mode 100644 index 0f82bccc..00000000 --- a/zope/interface/tests/test_adapter.py +++ /dev/null @@ -1,1285 +0,0 @@ -############################################################################## -# -# Copyright (c) 2003 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Adapter registry tests -""" -import unittest - -class _SilencePy3Deprecations(unittest.TestCase): - # silence deprecation warnings under py3 - - def failUnless(self, expr): - # St00pid speling. - return self.assertTrue(expr) - - def failIf(self, expr): - # St00pid speling. - return self.assertFalse(expr) - - -def _makeInterfaces(): - from zope.interface import Interface - - class IB0(Interface): pass - class IB1(IB0): pass - class IB2(IB0): pass - class IB3(IB2, IB1): pass - class IB4(IB1, IB2): pass - - class IF0(Interface): pass - class IF1(IF0): pass - - class IR0(Interface): pass - class IR1(IR0): pass - - return IB0, IB1, IB2, IB3, IB4, IF0, IF1, IR0, IR1 - - -class BaseAdapterRegistryTests(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.adapter import BaseAdapterRegistry - class _CUT(BaseAdapterRegistry): - class LookupClass(object): - _changed = _extendors = () - def __init__(self, reg): - pass - def changed(self, orig): - self._changed += (orig,) - def add_extendor(self, provided): - self._extendors += (provided,) - def remove_extendor(self, provided): - self._extendors = tuple([x for x in self._extendors - if x != provided]) - for name in BaseAdapterRegistry._delegated: - setattr(_CUT.LookupClass, name, object()) - return _CUT - - def _makeOne(self): - return self._getTargetClass()() - - def test_lookup_delegation(self): - CUT = self._getTargetClass() - registry = CUT() - for name in CUT._delegated: - self.failUnless( - getattr(registry, name) is getattr(registry._v_lookup, name)) - - def test__generation_on_first_creation(self): - registry = self._makeOne() - # Bumped to 1 in BaseAdapterRegistry.__init__ - self.assertEqual(registry._generation, 1) - - def test__generation_after_calling_changed(self): - registry = self._makeOne() - orig = object() - registry.changed(orig) - # Bumped to 1 in BaseAdapterRegistry.__init__ - self.assertEqual(registry._generation, 2) - self.assertEqual(registry._v_lookup._changed, (registry, orig,)) - - def test__generation_after_changing___bases__(self): - class _Base(object): pass - registry = self._makeOne() - registry.__bases__ = (_Base,) - self.assertEqual(registry._generation, 2) - - def test_register(self): - IB0, IB1, IB2, IB3, IB4, IF0, IF1, IR0, IR1 = _makeInterfaces() - registry = self._makeOne() - registry.register([IB0], IR0, '', 'A1') - self.assertEqual(registry.registered([IB0], IR0, ''), 'A1') - self.assertEqual(len(registry._adapters), 2) #order 0 and order 1 - self.assertEqual(registry._generation, 2) - - def test_register_with_value_None_unregisters(self): - IB0, IB1, IB2, IB3, IB4, IF0, IF1, IR0, IR1 = _makeInterfaces() - registry = self._makeOne() - registry.register([None], IR0, '', 'A1') - registry.register([None], IR0, '', None) - self.assertEqual(len(registry._adapters), 0) - - def test_register_with_same_value(self): - IB0, IB1, IB2, IB3, IB4, IF0, IF1, IR0, IR1 = _makeInterfaces() - registry = self._makeOne() - _value = object() - registry.register([None], IR0, '', _value) - _before = registry._generation - registry.register([None], IR0, '', _value) - self.assertEqual(registry._generation, _before) # skipped changed() - - def test_registered_empty(self): - registry = self._makeOne() - self.assertEqual(registry.registered([None], None, ''), None) - - def test_registered_non_empty_miss(self): - IB0, IB1, IB2, IB3, IB4, IF0, IF1, IR0, IR1 = _makeInterfaces() - registry = self._makeOne() - registry.register([IB1], None, '', 'A1') - self.assertEqual(registry.registered([IB2], None, ''), None) - - def test_registered_non_empty_hit(self): - registry = self._makeOne() - registry.register([None], None, '', 'A1') - self.assertEqual(registry.registered([None], None, ''), 'A1') - - def test_unregister_empty(self): - registry = self._makeOne() - registry.unregister([None], None, '') #doesn't raise - self.assertEqual(registry.registered([None], None, ''), None) - - def test_unregister_non_empty_miss_on_required(self): - IB0, IB1, IB2, IB3, IB4, IF0, IF1, IR0, IR1 = _makeInterfaces() - registry = self._makeOne() - registry.register([IB1], None, '', 'A1') - registry.unregister([IB2], None, '') #doesn't raise - self.assertEqual(registry.registered([IB1], None, ''), 'A1') - - def test_unregister_non_empty_miss_on_name(self): - IB0, IB1, IB2, IB3, IB4, IF0, IF1, IR0, IR1 = _makeInterfaces() - registry = self._makeOne() - registry.register([IB1], None, '', 'A1') - registry.unregister([IB1], None, 'nonesuch') #doesn't raise - self.assertEqual(registry.registered([IB1], None, ''), 'A1') - - def test_unregister_with_value_not_None_miss(self): - IB0, IB1, IB2, IB3, IB4, IF0, IF1, IR0, IR1 = _makeInterfaces() - registry = self._makeOne() - orig = object() - nomatch = object() - registry.register([IB1], None, '', orig) - registry.unregister([IB1], None, '', nomatch) #doesn't raise - self.failUnless(registry.registered([IB1], None, '') is orig) - - def test_unregister_hit_clears_empty_subcomponents(self): - IB0, IB1, IB2, IB3, IB4, IF0, IF1, IR0, IR1 = _makeInterfaces() - registry = self._makeOne() - one = object() - another = object() - registry.register([IB1, IB2], None, '', one) - registry.register([IB1, IB3], None, '', another) - self.failUnless(IB2 in registry._adapters[2][IB1]) - self.failUnless(IB3 in registry._adapters[2][IB1]) - registry.unregister([IB1, IB3], None, '', another) - self.failUnless(IB2 in registry._adapters[2][IB1]) - self.failIf(IB3 in registry._adapters[2][IB1]) - - def test_unsubscribe_empty(self): - registry = self._makeOne() - registry.unsubscribe([None], None, '') #doesn't raise - self.assertEqual(registry.registered([None], None, ''), None) - - def test_unsubscribe_hit(self): - IB0, IB1, IB2, IB3, IB4, IF0, IF1, IR0, IR1 = _makeInterfaces() - registry = self._makeOne() - orig = object() - registry.subscribe([IB1], None, orig) - registry.unsubscribe([IB1], None, orig) #doesn't raise - self.assertEqual(len(registry._subscribers), 0) - - def test_unsubscribe_after_multiple(self): - IB0, IB1, IB2, IB3, IB4, IF0, IF1, IR0, IR1 = _makeInterfaces() - registry = self._makeOne() - first = object() - second = object() - third = object() - registry.subscribe([IB1], None, first) - registry.subscribe([IB1], None, second) - registry.subscribe([IB1], IR0, third) - registry.unsubscribe([IB1], IR0, third) - registry.unsubscribe([IB1], None, second) - registry.unsubscribe([IB1], None, first) - self.assertEqual(len(registry._subscribers), 0) - - def test_unsubscribe_w_None_after_multiple(self): - IB0, IB1, IB2, IB3, IB4, IF0, IF1, IR0, IR1 = _makeInterfaces() - registry = self._makeOne() - first = object() - second = object() - third = object() - registry.subscribe([IB1], None, first) - registry.subscribe([IB1], None, second) - registry.unsubscribe([IB1], None) - self.assertEqual(len(registry._subscribers), 0) - - def test_unsubscribe_non_empty_miss_on_required(self): - IB0, IB1, IB2, IB3, IB4, IF0, IF1, IR0, IR1 = _makeInterfaces() - registry = self._makeOne() - registry.subscribe([IB1], None, 'A1') - self.assertEqual(len(registry._subscribers), 2) - registry.unsubscribe([IB2], None, '') #doesn't raise - self.assertEqual(len(registry._subscribers), 2) - - def test_unsubscribe_non_empty_miss_on_value(self): - IB0, IB1, IB2, IB3, IB4, IF0, IF1, IR0, IR1 = _makeInterfaces() - registry = self._makeOne() - registry.subscribe([IB1], None, 'A1') - self.assertEqual(len(registry._subscribers), 2) - registry.unsubscribe([IB1], None, 'A2') #doesn't raise - self.assertEqual(len(registry._subscribers), 2) - - def test_unsubscribe_with_value_not_None_miss(self): - IB0, IB1, IB2, IB3, IB4, IF0, IF1, IR0, IR1 = _makeInterfaces() - registry = self._makeOne() - orig = object() - nomatch = object() - registry.subscribe([IB1], None, orig) - registry.unsubscribe([IB1], None, nomatch) #doesn't raise - self.assertEqual(len(registry._subscribers), 2) - - -class LookupBaseFallbackTests(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.adapter import LookupBaseFallback - return LookupBaseFallback - - def _makeOne(self, uc_lookup=None, uc_lookupAll=None, - uc_subscriptions=None): - if uc_lookup is None: - def uc_lookup(self, required, provided, name): - pass - if uc_lookupAll is None: - def uc_lookupAll(self, required, provided): - pass - if uc_subscriptions is None: - def uc_subscriptions(self, required, provided): - pass - class Derived(self._getTargetClass()): - _uncached_lookup = uc_lookup - _uncached_lookupAll = uc_lookupAll - _uncached_subscriptions = uc_subscriptions - return Derived() - - def test_lookup_miss_no_default(self): - _called_with = [] - def _lookup(self, required, provided, name): - _called_with.append((required, provided, name)) - return None - lb = self._makeOne(uc_lookup=_lookup) - found = lb.lookup(('A',), 'B', 'C') - self.failUnless(found is None) - self.assertEqual(_called_with, [(('A',), 'B', 'C')]) - - def test_lookup_miss_w_default(self): - _called_with = [] - _default = object() - def _lookup(self, required, provided, name): - _called_with.append((required, provided, name)) - return None - lb = self._makeOne(uc_lookup=_lookup) - found = lb.lookup(('A',), 'B', 'C', _default) - self.failUnless(found is _default) - self.assertEqual(_called_with, [(('A',), 'B', 'C')]) - - def test_lookup_not_cached(self): - _called_with = [] - a, b, c = object(), object(), object() - _results = [a, b, c] - def _lookup(self, required, provided, name): - _called_with.append((required, provided, name)) - return _results.pop(0) - lb = self._makeOne(uc_lookup=_lookup) - found = lb.lookup(('A',), 'B', 'C') - self.failUnless(found is a) - self.assertEqual(_called_with, [(('A',), 'B', 'C')]) - self.assertEqual(_results, [b, c]) - - def test_lookup_cached(self): - _called_with = [] - a, b, c = object(), object(), object() - _results = [a, b, c] - def _lookup(self, required, provided, name): - _called_with.append((required, provided, name)) - return _results.pop(0) - lb = self._makeOne(uc_lookup=_lookup) - found = lb.lookup(('A',), 'B', 'C') - found = lb.lookup(('A',), 'B', 'C') - self.failUnless(found is a) - self.assertEqual(_called_with, [(('A',), 'B', 'C')]) - self.assertEqual(_results, [b, c]) - - def test_lookup_not_cached_multi_required(self): - _called_with = [] - a, b, c = object(), object(), object() - _results = [a, b, c] - def _lookup(self, required, provided, name): - _called_with.append((required, provided, name)) - return _results.pop(0) - lb = self._makeOne(uc_lookup=_lookup) - found = lb.lookup(('A', 'D'), 'B', 'C') - self.failUnless(found is a) - self.assertEqual(_called_with, [(('A', 'D'), 'B', 'C')]) - self.assertEqual(_results, [b, c]) - - def test_lookup_cached_multi_required(self): - _called_with = [] - a, b, c = object(), object(), object() - _results = [a, b, c] - def _lookup(self, required, provided, name): - _called_with.append((required, provided, name)) - return _results.pop(0) - lb = self._makeOne(uc_lookup=_lookup) - found = lb.lookup(('A', 'D'), 'B', 'C') - found = lb.lookup(('A', 'D'), 'B', 'C') - self.failUnless(found is a) - self.assertEqual(_called_with, [(('A', 'D'), 'B', 'C')]) - self.assertEqual(_results, [b, c]) - - def test_lookup_not_cached_after_changed(self): - _called_with = [] - a, b, c = object(), object(), object() - _results = [a, b, c] - def _lookup(self, required, provided, name): - _called_with.append((required, provided, name)) - return _results.pop(0) - lb = self._makeOne(uc_lookup=_lookup) - found = lb.lookup(('A',), 'B', 'C') - lb.changed(lb) - found = lb.lookup(('A',), 'B', 'C') - self.failUnless(found is b) - self.assertEqual(_called_with, - [(('A',), 'B', 'C'), (('A',), 'B', 'C')]) - self.assertEqual(_results, [c]) - - def test_lookup1_miss_no_default(self): - _called_with = [] - def _lookup(self, required, provided, name): - _called_with.append((required, provided, name)) - return None - lb = self._makeOne(uc_lookup=_lookup) - found = lb.lookup1('A', 'B', 'C') - self.failUnless(found is None) - self.assertEqual(_called_with, [(('A',), 'B', 'C')]) - - def test_lookup1_miss_w_default(self): - _called_with = [] - _default = object() - def _lookup(self, required, provided, name): - _called_with.append((required, provided, name)) - return None - lb = self._makeOne(uc_lookup=_lookup) - found = lb.lookup1('A', 'B', 'C', _default) - self.failUnless(found is _default) - self.assertEqual(_called_with, [(('A',), 'B', 'C')]) - - def test_lookup1_miss_w_default_negative_cache(self): - _called_with = [] - _default = object() - def _lookup(self, required, provided, name): - _called_with.append((required, provided, name)) - return None - lb = self._makeOne(uc_lookup=_lookup) - found = lb.lookup1('A', 'B', 'C', _default) - self.failUnless(found is _default) - found = lb.lookup1('A', 'B', 'C', _default) - self.failUnless(found is _default) - self.assertEqual(_called_with, [(('A',), 'B', 'C')]) - - def test_lookup1_not_cached(self): - _called_with = [] - a, b, c = object(), object(), object() - _results = [a, b, c] - def _lookup(self, required, provided, name): - _called_with.append((required, provided, name)) - return _results.pop(0) - lb = self._makeOne(uc_lookup=_lookup) - found = lb.lookup1('A', 'B', 'C') - self.failUnless(found is a) - self.assertEqual(_called_with, [(('A',), 'B', 'C')]) - self.assertEqual(_results, [b, c]) - - def test_lookup1_cached(self): - _called_with = [] - a, b, c = object(), object(), object() - _results = [a, b, c] - def _lookup(self, required, provided, name): - _called_with.append((required, provided, name)) - return _results.pop(0) - lb = self._makeOne(uc_lookup=_lookup) - found = lb.lookup1('A', 'B', 'C') - found = lb.lookup1('A', 'B', 'C') - self.failUnless(found is a) - self.assertEqual(_called_with, [(('A',), 'B', 'C')]) - self.assertEqual(_results, [b, c]) - - def test_lookup1_not_cached_after_changed(self): - _called_with = [] - a, b, c = object(), object(), object() - _results = [a, b, c] - def _lookup(self, required, provided, name): - _called_with.append((required, provided, name)) - return _results.pop(0) - lb = self._makeOne(uc_lookup=_lookup) - found = lb.lookup1('A', 'B', 'C') - lb.changed(lb) - found = lb.lookup1('A', 'B', 'C') - self.failUnless(found is b) - self.assertEqual(_called_with, - [(('A',), 'B', 'C'), (('A',), 'B', 'C')]) - self.assertEqual(_results, [c]) - - def test_adapter_hook_miss_no_default(self): - req, prv = object(), object() - lb = self._makeOne() - found = lb.adapter_hook(prv, req, '') - self.failUnless(found is None) - - def test_adapter_hook_miss_w_default(self): - req, prv, _default = object(), object(), object() - lb = self._makeOne() - found = lb.adapter_hook(prv, req, '', _default) - self.failUnless(found is _default) - - def test_adapter_hook_hit_factory_returns_None(self): - _f_called_with = [] - def _factory(context): - _f_called_with.append(context) - return None - def _lookup(self, required, provided, name): - return _factory - req, prv, _default = object(), object(), object() - lb = self._makeOne(uc_lookup=_lookup) - adapted = lb.adapter_hook(prv, req, 'C', _default) - self.failUnless(adapted is _default) - self.assertEqual(_f_called_with, [req]) - - def test_adapter_hook_hit_factory_returns_adapter(self): - _f_called_with = [] - _adapter = object() - def _factory(context): - _f_called_with.append(context) - return _adapter - def _lookup(self, required, provided, name): - return _factory - req, prv, _default = object(), object(), object() - lb = self._makeOne(uc_lookup=_lookup) - adapted = lb.adapter_hook(prv, req, 'C', _default) - self.failUnless(adapted is _adapter) - self.assertEqual(_f_called_with, [req]) - - def test_queryAdapter(self): - _f_called_with = [] - _adapter = object() - def _factory(context): - _f_called_with.append(context) - return _adapter - def _lookup(self, required, provided, name): - return _factory - req, prv, _default = object(), object(), object() - lb = self._makeOne(uc_lookup=_lookup) - adapted = lb.queryAdapter(req, prv, 'C', _default) - self.failUnless(adapted is _adapter) - self.assertEqual(_f_called_with, [req]) - - def test_lookupAll_uncached(self): - _called_with = [] - _results = [object(), object(), object()] - def _lookupAll(self, required, provided): - _called_with.append((required, provided)) - return tuple(_results) - lb = self._makeOne(uc_lookupAll=_lookupAll) - found = lb.lookupAll('A', 'B') - self.assertEqual(found, tuple(_results)) - self.assertEqual(_called_with, [(('A',), 'B')]) - - def test_lookupAll_cached(self): - _called_with = [] - _results = [object(), object(), object()] - def _lookupAll(self, required, provided): - _called_with.append((required, provided)) - return tuple(_results) - lb = self._makeOne(uc_lookupAll=_lookupAll) - found = lb.lookupAll('A', 'B') - found = lb.lookupAll('A', 'B') - self.assertEqual(found, tuple(_results)) - self.assertEqual(_called_with, [(('A',), 'B')]) - - def test_subscriptions_uncached(self): - _called_with = [] - _results = [object(), object(), object()] - def _subscriptions(self, required, provided): - _called_with.append((required, provided)) - return tuple(_results) - lb = self._makeOne(uc_subscriptions=_subscriptions) - found = lb.subscriptions('A', 'B') - self.assertEqual(found, tuple(_results)) - self.assertEqual(_called_with, [(('A',), 'B')]) - - def test_subscriptions_cached(self): - _called_with = [] - _results = [object(), object(), object()] - def _subscriptions(self, required, provided): - _called_with.append((required, provided)) - return tuple(_results) - lb = self._makeOne(uc_subscriptions=_subscriptions) - found = lb.subscriptions('A', 'B') - found = lb.subscriptions('A', 'B') - self.assertEqual(found, tuple(_results)) - self.assertEqual(_called_with, [(('A',), 'B')]) - - -class LookupBaseTests(LookupBaseFallbackTests): - - def _getTargetClass(self): - from zope.interface.adapter import LookupBase - return LookupBase - - -class VerifyingBaseFallbackTests(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.adapter import VerifyingBaseFallback - return VerifyingBaseFallback - - def _makeOne(self, registry, uc_lookup=None, uc_lookupAll=None, - uc_subscriptions=None): - if uc_lookup is None: - def uc_lookup(self, required, provided, name): - pass - if uc_lookupAll is None: - def uc_lookupAll(self, required, provided): - pass - if uc_subscriptions is None: - def uc_subscriptions(self, required, provided): - pass - class Derived(self._getTargetClass()): - _uncached_lookup = uc_lookup - _uncached_lookupAll = uc_lookupAll - _uncached_subscriptions = uc_subscriptions - def __init__(self, registry): - super(Derived, self).__init__() - self._registry = registry - derived = Derived(registry) - derived.changed(derived) # init. '_verify_ro' / '_verify_generations' - return derived - - def _makeRegistry(self, depth): - class WithGeneration(object): - _generation = 1 - class Registry: - def __init__(self, depth): - self.ro = [WithGeneration() for i in range(depth)] - return Registry(depth) - - def test_lookup(self): - _called_with = [] - a, b, c = object(), object(), object() - _results = [a, b, c] - def _lookup(self, required, provided, name): - _called_with.append((required, provided, name)) - return _results.pop(0) - reg = self._makeRegistry(3) - lb = self._makeOne(reg, uc_lookup=_lookup) - found = lb.lookup(('A',), 'B', 'C') - found = lb.lookup(('A',), 'B', 'C') - self.failUnless(found is a) - self.assertEqual(_called_with, [(('A',), 'B', 'C')]) - self.assertEqual(_results, [b, c]) - reg.ro[1]._generation += 1 - found = lb.lookup(('A',), 'B', 'C') - self.failUnless(found is b) - self.assertEqual(_called_with, - [(('A',), 'B', 'C'), (('A',), 'B', 'C')]) - self.assertEqual(_results, [c]) - - def test_lookup1(self): - _called_with = [] - a, b, c = object(), object(), object() - _results = [a, b, c] - def _lookup(self, required, provided, name): - _called_with.append((required, provided, name)) - return _results.pop(0) - reg = self._makeRegistry(3) - lb = self._makeOne(reg, uc_lookup=_lookup) - found = lb.lookup1('A', 'B', 'C') - found = lb.lookup1('A', 'B', 'C') - self.failUnless(found is a) - self.assertEqual(_called_with, [(('A',), 'B', 'C')]) - self.assertEqual(_results, [b, c]) - reg.ro[1]._generation += 1 - found = lb.lookup1('A', 'B', 'C') - self.failUnless(found is b) - self.assertEqual(_called_with, - [(('A',), 'B', 'C'), (('A',), 'B', 'C')]) - self.assertEqual(_results, [c]) - - def test_adapter_hook(self): - a, b, c = [object(), object(), object()] - def _factory1(context): - return a - def _factory2(context): - return b - def _factory3(context): - return c - _factories = [_factory1, _factory2, _factory3] - def _lookup(self, required, provided, name): - return _factories.pop(0) - req, prv, _default = object(), object(), object() - reg = self._makeRegistry(3) - lb = self._makeOne(reg, uc_lookup=_lookup) - adapted = lb.adapter_hook(prv, req, 'C', _default) - self.failUnless(adapted is a) - adapted = lb.adapter_hook(prv, req, 'C', _default) - self.failUnless(adapted is a) - reg.ro[1]._generation += 1 - adapted = lb.adapter_hook(prv, req, 'C', _default) - self.failUnless(adapted is b) - - def test_queryAdapter(self): - a, b, c = [object(), object(), object()] - def _factory1(context): - return a - def _factory2(context): - return b - def _factory3(context): - return c - _factories = [_factory1, _factory2, _factory3] - def _lookup(self, required, provided, name): - return _factories.pop(0) - req, prv, _default = object(), object(), object() - reg = self._makeRegistry(3) - lb = self._makeOne(reg, uc_lookup=_lookup) - adapted = lb.queryAdapter(req, prv, 'C', _default) - self.failUnless(adapted is a) - adapted = lb.queryAdapter(req, prv, 'C', _default) - self.failUnless(adapted is a) - reg.ro[1]._generation += 1 - adapted = lb.adapter_hook(prv, req, 'C', _default) - self.failUnless(adapted is b) - - def test_lookupAll(self): - _results_1 = [object(), object(), object()] - _results_2 = [object(), object(), object()] - _results = [_results_1, _results_2] - def _lookupAll(self, required, provided): - return tuple(_results.pop(0)) - reg = self._makeRegistry(3) - lb = self._makeOne(reg, uc_lookupAll=_lookupAll) - found = lb.lookupAll('A', 'B') - self.assertEqual(found, tuple(_results_1)) - found = lb.lookupAll('A', 'B') - self.assertEqual(found, tuple(_results_1)) - reg.ro[1]._generation += 1 - found = lb.lookupAll('A', 'B') - self.assertEqual(found, tuple(_results_2)) - - def test_subscriptions(self): - _results_1 = [object(), object(), object()] - _results_2 = [object(), object(), object()] - _results = [_results_1, _results_2] - def _subscriptions(self, required, provided): - return tuple(_results.pop(0)) - reg = self._makeRegistry(3) - lb = self._makeOne(reg, uc_subscriptions=_subscriptions) - found = lb.subscriptions('A', 'B') - self.assertEqual(found, tuple(_results_1)) - found = lb.subscriptions('A', 'B') - self.assertEqual(found, tuple(_results_1)) - reg.ro[1]._generation += 1 - found = lb.subscriptions('A', 'B') - self.assertEqual(found, tuple(_results_2)) - - -class VerifyingBaseTests(VerifyingBaseFallbackTests): - - def _getTargetClass(self): - from zope.interface.adapter import VerifyingBase - return VerifyingBase - - -class AdapterLookupBaseTests(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.adapter import AdapterLookupBase - return AdapterLookupBase - - def _makeOne(self, registry): - return self._getTargetClass()(registry) - - def _makeSubregistry(self, *provided): - class Subregistry: - def __init__(self): - self._adapters = [] - self._subscribers = [] - return Subregistry() - - def _makeRegistry(self, *provided): - class Registry: - def __init__(self, provided): - self._provided = provided - self.ro = [] - return Registry(provided) - - def test_ctor_empty_registry(self): - registry = self._makeRegistry() - alb = self._makeOne(registry) - self.assertEqual(alb._extendors, {}) - - def test_ctor_w_registry_provided(self): - from zope.interface import Interface - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - registry = self._makeRegistry(IFoo, IBar) - alb = self._makeOne(registry) - self.assertEqual(sorted(alb._extendors.keys()), - sorted([IBar, IFoo, Interface])) - self.assertEqual(alb._extendors[IFoo], [IFoo]) - self.assertEqual(alb._extendors[IBar], [IBar]) - self.assertEqual(sorted(alb._extendors[Interface]), - sorted([IFoo, IBar])) - - def test_changed_empty_required(self): - # ALB.changed expects to call a mixed in changed. - class Mixin(object): - def changed(self, *other): - pass - class Derived(self._getTargetClass(), Mixin): - pass - registry = self._makeRegistry() - alb = Derived(registry) - alb.changed(alb) - - def test_changed_w_required(self): - # ALB.changed expects to call a mixed in changed. - class Mixin(object): - def changed(self, *other): - pass - class Derived(self._getTargetClass(), Mixin): - pass - class FauxWeakref(object): - _unsub = None - def __init__(self, here): - self._here = here - def __call__(self): - if self._here: - return self - def unsubscribe(self, target): - self._unsub = target - gone = FauxWeakref(False) - here = FauxWeakref(True) - registry = self._makeRegistry() - alb = Derived(registry) - alb._required[gone] = 1 - alb._required[here] = 1 - alb.changed(alb) - self.assertEqual(len(alb._required), 0) - self.assertEqual(gone._unsub, None) - self.assertEqual(here._unsub, alb) - - def test_init_extendors_after_registry_update(self): - from zope.interface import Interface - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - registry = self._makeRegistry() - alb = self._makeOne(registry) - registry._provided = [IFoo, IBar] - alb.init_extendors() - self.assertEqual(sorted(alb._extendors.keys()), - sorted([IBar, IFoo, Interface])) - self.assertEqual(alb._extendors[IFoo], [IFoo]) - self.assertEqual(alb._extendors[IBar], [IBar]) - self.assertEqual(sorted(alb._extendors[Interface]), - sorted([IFoo, IBar])) - - def test_add_extendor(self): - from zope.interface import Interface - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - registry = self._makeRegistry() - alb = self._makeOne(registry) - alb.add_extendor(IFoo) - alb.add_extendor(IBar) - self.assertEqual(sorted(alb._extendors.keys()), - sorted([IBar, IFoo, Interface])) - self.assertEqual(alb._extendors[IFoo], [IFoo]) - self.assertEqual(alb._extendors[IBar], [IBar]) - self.assertEqual(sorted(alb._extendors[Interface]), - sorted([IFoo, IBar])) - - def test_remove_extendor(self): - from zope.interface import Interface - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - registry = self._makeRegistry(IFoo, IBar) - alb = self._makeOne(registry) - alb.remove_extendor(IFoo) - self.assertEqual(sorted(alb._extendors.keys()), - sorted([IFoo, IBar, Interface])) - self.assertEqual(alb._extendors[IFoo], []) - self.assertEqual(alb._extendors[IBar], [IBar]) - self.assertEqual(sorted(alb._extendors[Interface]), - sorted([IBar])) - - # test '_subscribe' via its callers, '_uncached_lookup', etc. - - def test__uncached_lookup_empty_ro(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - registry = self._makeRegistry() - alb = self._makeOne(registry) - result = alb._uncached_lookup((IFoo,), IBar) - self.assertEqual(result, None) - self.assertEqual(len(alb._required), 1) - self.failUnless(IFoo.weakref() in alb._required) - - def test__uncached_lookup_order_miss(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - registry = self._makeRegistry(IFoo, IBar) - subr = self._makeSubregistry() - registry.ro.append(subr) - alb = self._makeOne(registry) - result = alb._uncached_lookup((IFoo,), IBar) - self.assertEqual(result, None) - - def test__uncached_lookup_extendors_miss(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - registry = self._makeRegistry() - subr = self._makeSubregistry() - subr._adapters = [{}, {}] #utilities, single adapters - registry.ro.append(subr) - alb = self._makeOne(registry) - subr._v_lookup = alb - result = alb._uncached_lookup((IFoo,), IBar) - self.assertEqual(result, None) - - def test__uncached_lookup_components_miss(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - registry = self._makeRegistry(IFoo, IBar) - subr = self._makeSubregistry() - subr._adapters = [{}, {}] #utilities, single adapters - registry.ro.append(subr) - alb = self._makeOne(registry) - subr._v_lookup = alb - result = alb._uncached_lookup((IFoo,), IBar) - self.assertEqual(result, None) - - def test__uncached_lookup_simple_hit(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - registry = self._makeRegistry(IFoo, IBar) - subr = self._makeSubregistry() - _expected = object() - subr._adapters = [ #utilities, single adapters - {}, - {IFoo: {IBar: {'': _expected}}}, - ] - registry.ro.append(subr) - alb = self._makeOne(registry) - subr._v_lookup = alb - result = alb._uncached_lookup((IFoo,), IBar) - self.failUnless(result is _expected) - - def test_queryMultiAdaptor_lookup_miss(self): - from zope.interface.declarations import implementer - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - @implementer(IFoo) - class Foo(object): - pass - foo = Foo() - registry = self._makeRegistry() - subr = self._makeSubregistry() - subr._adapters = [ #utilities, single adapters - {}, - {}, - ] - registry.ro.append(subr) - alb = self._makeOne(registry) - alb.lookup = alb._uncached_lookup # provided by derived - subr._v_lookup = alb - _default = object() - result = alb.queryMultiAdapter((foo,), IBar, default=_default) - self.failUnless(result is _default) - - def test_queryMultiAdaptor_factory_miss(self): - from zope.interface.declarations import implementer - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - @implementer(IFoo) - class Foo(object): - pass - foo = Foo() - registry = self._makeRegistry(IFoo, IBar) - subr = self._makeSubregistry() - _expected = object() - _called_with = [] - def _factory(context): - _called_with.append(context) - return None - subr._adapters = [ #utilities, single adapters - {}, - {IFoo: {IBar: {'': _factory}}}, - ] - registry.ro.append(subr) - alb = self._makeOne(registry) - alb.lookup = alb._uncached_lookup # provided by derived - subr._v_lookup = alb - _default = object() - result = alb.queryMultiAdapter((foo,), IBar, default=_default) - self.failUnless(result is _default) - self.assertEqual(_called_with, [foo]) - - def test_queryMultiAdaptor_factory_hit(self): - from zope.interface.declarations import implementer - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - @implementer(IFoo) - class Foo(object): - pass - foo = Foo() - registry = self._makeRegistry(IFoo, IBar) - subr = self._makeSubregistry() - _expected = object() - _called_with = [] - def _factory(context): - _called_with.append(context) - return _expected - subr._adapters = [ #utilities, single adapters - {}, - {IFoo: {IBar: {'': _factory}}}, - ] - registry.ro.append(subr) - alb = self._makeOne(registry) - alb.lookup = alb._uncached_lookup # provided by derived - subr._v_lookup = alb - _default = object() - result = alb.queryMultiAdapter((foo,), IBar, default=_default) - self.failUnless(result is _expected) - self.assertEqual(_called_with, [foo]) - - def test__uncached_lookupAll_empty_ro(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - registry = self._makeRegistry() - alb = self._makeOne(registry) - result = alb._uncached_lookupAll((IFoo,), IBar) - self.assertEqual(result, ()) - self.assertEqual(len(alb._required), 1) - self.failUnless(IFoo.weakref() in alb._required) - - def test__uncached_lookupAll_order_miss(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - registry = self._makeRegistry(IFoo, IBar) - subr = self._makeSubregistry() - registry.ro.append(subr) - alb = self._makeOne(registry) - subr._v_lookup = alb - result = alb._uncached_lookupAll((IFoo,), IBar) - self.assertEqual(result, ()) - - def test__uncached_lookupAll_extendors_miss(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - registry = self._makeRegistry() - subr = self._makeSubregistry() - subr._adapters = [{}, {}] #utilities, single adapters - registry.ro.append(subr) - alb = self._makeOne(registry) - subr._v_lookup = alb - result = alb._uncached_lookupAll((IFoo,), IBar) - self.assertEqual(result, ()) - - def test__uncached_lookupAll_components_miss(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - registry = self._makeRegistry(IFoo, IBar) - subr = self._makeSubregistry() - subr._adapters = [{}, {}] #utilities, single adapters - registry.ro.append(subr) - alb = self._makeOne(registry) - subr._v_lookup = alb - result = alb._uncached_lookupAll((IFoo,), IBar) - self.assertEqual(result, ()) - - def test__uncached_lookupAll_simple_hit(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - registry = self._makeRegistry(IFoo, IBar) - subr = self._makeSubregistry() - _expected = object() - _named = object() - subr._adapters = [ #utilities, single adapters - {}, - {IFoo: {IBar: {'': _expected, 'named': _named}}}, - ] - registry.ro.append(subr) - alb = self._makeOne(registry) - subr._v_lookup = alb - result = alb._uncached_lookupAll((IFoo,), IBar) - self.assertEqual(sorted(result), [('', _expected), ('named', _named)]) - - def test_names(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - registry = self._makeRegistry(IFoo, IBar) - subr = self._makeSubregistry() - _expected = object() - _named = object() - subr._adapters = [ #utilities, single adapters - {}, - {IFoo: {IBar: {'': _expected, 'named': _named}}}, - ] - registry.ro.append(subr) - alb = self._makeOne(registry) - alb.lookupAll = alb._uncached_lookupAll - subr._v_lookup = alb - result = alb.names((IFoo,), IBar) - self.assertEqual(sorted(result), ['', 'named']) - - def test__uncached_subscriptions_empty_ro(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - registry = self._makeRegistry() - alb = self._makeOne(registry) - result = alb._uncached_subscriptions((IFoo,), IBar) - self.assertEqual(result, []) - self.assertEqual(len(alb._required), 1) - self.failUnless(IFoo.weakref() in alb._required) - - def test__uncached_subscriptions_order_miss(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - registry = self._makeRegistry(IFoo, IBar) - subr = self._makeSubregistry() - registry.ro.append(subr) - alb = self._makeOne(registry) - subr._v_lookup = alb - result = alb._uncached_subscriptions((IFoo,), IBar) - self.assertEqual(result, []) - - def test__uncached_subscriptions_extendors_miss(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - registry = self._makeRegistry() - subr = self._makeSubregistry() - subr._subscribers = [{}, {}] #utilities, single adapters - registry.ro.append(subr) - alb = self._makeOne(registry) - subr._v_lookup = alb - result = alb._uncached_subscriptions((IFoo,), IBar) - self.assertEqual(result, []) - - def test__uncached_subscriptions_components_miss(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - registry = self._makeRegistry(IFoo, IBar) - subr = self._makeSubregistry() - subr._subscribers = [{}, {}] #utilities, single adapters - registry.ro.append(subr) - alb = self._makeOne(registry) - subr._v_lookup = alb - result = alb._uncached_subscriptions((IFoo,), IBar) - self.assertEqual(result, []) - - def test__uncached_subscriptions_simple_hit(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - registry = self._makeRegistry(IFoo, IBar) - subr = self._makeSubregistry() - class Foo(object): - def __lt__(self, other): - return True - _exp1, _exp2 = Foo(), Foo() - subr._subscribers = [ #utilities, single adapters - {}, - {IFoo: {IBar: {'': (_exp1, _exp2)}}}, - ] - registry.ro.append(subr) - alb = self._makeOne(registry) - subr._v_lookup = alb - result = alb._uncached_subscriptions((IFoo,), IBar) - self.assertEqual(sorted(result), sorted([_exp1, _exp2])) - - def test_subscribers_wo_provided(self): - from zope.interface.declarations import implementer - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - @implementer(IFoo) - class Foo(object): - pass - foo = Foo() - registry = self._makeRegistry(IFoo, IBar) - registry = self._makeRegistry(IFoo, IBar) - subr = self._makeSubregistry() - _called = {} - def _factory1(context): - _called.setdefault('_factory1', []).append(context) - def _factory2(context): - _called.setdefault('_factory2', []).append(context) - subr._subscribers = [ #utilities, single adapters - {}, - {IFoo: {None: {'': (_factory1, _factory2)}}}, - ] - registry.ro.append(subr) - alb = self._makeOne(registry) - alb.subscriptions = alb._uncached_subscriptions - subr._v_lookup = alb - result = alb.subscribers((foo,), None) - self.assertEqual(result, ()) - self.assertEqual(_called, {'_factory1': [foo], '_factory2': [foo]}) - - def test_subscribers_w_provided(self): - from zope.interface.declarations import implementer - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', IFoo) - @implementer(IFoo) - class Foo(object): - pass - foo = Foo() - registry = self._makeRegistry(IFoo, IBar) - registry = self._makeRegistry(IFoo, IBar) - subr = self._makeSubregistry() - _called = {} - _exp1, _exp2 = object(), object() - def _factory1(context): - _called.setdefault('_factory1', []).append(context) - return _exp1 - def _factory2(context): - _called.setdefault('_factory2', []).append(context) - return _exp2 - subr._subscribers = [ #utilities, single adapters - {}, - {IFoo: {IBar: {'': (_factory1, _factory2)}}}, - ] - registry.ro.append(subr) - alb = self._makeOne(registry) - alb.subscriptions = alb._uncached_subscriptions - subr._v_lookup = alb - result = alb.subscribers((foo,), IBar) - self.assertEqual(result, [_exp1, _exp2]) - self.assertEqual(_called, {'_factory1': [foo], '_factory2': [foo]}) - - -class AdapterRegistryTests(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.adapter import AdapterRegistry - return AdapterRegistry - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_ctor_no_bases(self): - ar = self._makeOne() - self.assertEqual(len(ar._v_subregistries), 0) - - def test_ctor_w_bases(self): - base = self._makeOne() - sub = self._makeOne([base]) - self.assertEqual(len(sub._v_subregistries), 0) - self.assertEqual(len(base._v_subregistries), 1) - self.failUnless(sub in base._v_subregistries) - - # test _addSubregistry / _removeSubregistry via only caller, _setBases - - def test__setBases_removing_existing_subregistry(self): - before = self._makeOne() - after = self._makeOne() - sub = self._makeOne([before]) - sub.__bases__ = [after] - self.assertEqual(len(before._v_subregistries), 0) - self.assertEqual(len(after._v_subregistries), 1) - self.failUnless(sub in after._v_subregistries) - - def test_changed_w_subregistries(self): - base = self._makeOne() - class Derived(object): - _changed = None - def changed(self, originally_changed): - self._changed = originally_changed - derived1, derived2 = Derived(), Derived() - base._addSubregistry(derived1) - base._addSubregistry(derived2) - orig = object() - base.changed(orig) - self.failUnless(derived1._changed is orig) - self.failUnless(derived2._changed is orig) - - -class Test_utils(_SilencePy3Deprecations): - - def test__convert_None_to_Interface_w_None(self): - from zope.interface.adapter import _convert_None_to_Interface - from zope.interface.interface import Interface - self.failUnless(_convert_None_to_Interface(None) is Interface) - - def test__convert_None_to_Interface_w_other(self): - from zope.interface.adapter import _convert_None_to_Interface - other = object() - self.failUnless(_convert_None_to_Interface(other) is other) - - def test__normalize_name_str(self): - import sys - from zope.interface.adapter import _normalize_name - STR = b'str' - if sys.version_info[0] < 3: - self.assertEqual(_normalize_name(STR), unicode(STR)) - else: - self.assertEqual(_normalize_name(STR), str(STR, 'ascii')) - - def test__normalize_name_unicode(self): - from zope.interface.adapter import _normalize_name - from zope.interface._compat import _u - USTR = _u('ustr') - self.assertEqual(_normalize_name(USTR), USTR) - - def test__normalize_name_other(self): - from zope.interface.adapter import _normalize_name - for other in 1, 1.0, (), [], {}, object(): - self.assertRaises(TypeError, _normalize_name, other) - - # _lookup, _lookupAll, and _subscriptions tested via their callers - # (AdapterLookupBase.{lookup,lookupAll,subscriptions}). - - -def test_suite(): - return unittest.TestSuite(( - unittest.makeSuite(BaseAdapterRegistryTests), - unittest.makeSuite(LookupBaseFallbackTests), - unittest.makeSuite(LookupBaseTests), - unittest.makeSuite(VerifyingBaseFallbackTests), - unittest.makeSuite(VerifyingBaseTests), - unittest.makeSuite(AdapterLookupBaseTests), - unittest.makeSuite(AdapterRegistryTests), - unittest.makeSuite(Test_utils), - )) diff --git a/zope/interface/tests/test_advice.py b/zope/interface/tests/test_advice.py deleted file mode 100644 index e9875a75..00000000 --- a/zope/interface/tests/test_advice.py +++ /dev/null @@ -1,397 +0,0 @@ -############################################################################## -# -# Copyright (c) 2003 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Tests for advice - -This module was adapted from 'protocols.tests.advice', part of the Python -Enterprise Application Kit (PEAK). Please notify the PEAK authors -(pje@telecommunity.com and tsarna@sarna.org) if bugs are found or -Zope-specific changes are required, so that the PEAK version of this module -can be kept in sync. - -PEAK is a Python application framework that interoperates with (but does -not require) Zope 3 and Twisted. It provides tools for manipulating UML -models, object-relational persistence, aspect-oriented programming, and more. -Visit the PEAK home page at http://peak.telecommunity.com for more information. -""" - -import unittest -import sys - -from zope.interface._compat import _skip_under_py2 -from zope.interface._compat import _skip_under_py3k - - -class _SilencePy3Deprecations(unittest.TestCase): - # silence deprecation warnings under py3 - - def failUnless(self, expr): - # St00pid speling. - return self.assertTrue(expr) - - def failIf(self, expr): - # St00pid speling. - return self.assertFalse(expr) - - -class FrameInfoTest(_SilencePy3Deprecations): - - def test_w_module(self): - from zope.interface.tests import advisory_testing - (kind, module, - f_locals, f_globals) = advisory_testing.moduleLevelFrameInfo - self.assertEqual(kind, "module") - for d in module.__dict__, f_locals, f_globals: - self.failUnless(d is advisory_testing.my_globals) - - @_skip_under_py3k - def test_w_ClassicClass(self): - from zope.interface.tests import advisory_testing - if advisory_testing.ClassicClass is None: - return - (kind, - module, - f_locals, - f_globals) = advisory_testing.ClassicClass.classLevelFrameInfo - self.assertEqual(kind, "class") - - self.failUnless( - f_locals is advisory_testing.ClassicClass.__dict__) # ??? - for d in module.__dict__, f_globals: - self.failUnless(d is advisory_testing.my_globals) - - def test_w_NewStyleClass(self): - from zope.interface.tests import advisory_testing - (kind, - module, - f_locals, - f_globals) = advisory_testing.NewStyleClass.classLevelFrameInfo - self.assertEqual(kind, "class") - - for d in module.__dict__, f_globals: - self.failUnless(d is advisory_testing.my_globals) - - def test_inside_function_call(self): - from zope.interface.advice import getFrameInfo - kind, module, f_locals, f_globals = getFrameInfo(sys._getframe()) - self.assertEqual(kind, "function call") - self.failUnless(f_locals is locals()) # ??? - for d in module.__dict__, f_globals: - self.failUnless(d is globals()) - - def test_inside_exec(self): - from zope.interface.advice import getFrameInfo - _globals = {'getFrameInfo': getFrameInfo} - _locals = {} - exec(_FUNKY_EXEC, _globals, _locals) - self.assertEqual(_locals['kind'], "exec") - self.failUnless(_locals['f_locals'] is _locals) - self.failUnless(_locals['module'] is None) - self.failUnless(_locals['f_globals'] is _globals) - - -_FUNKY_EXEC = """\ -import sys -kind, module, f_locals, f_globals = getFrameInfo(sys._getframe()) -""" - -class AdviceTests(_SilencePy3Deprecations): - - @_skip_under_py3k - def test_order(self): - from zope.interface.tests.advisory_testing import ping - log = [] - class Foo(object): - ping(log, 1) - ping(log, 2) - ping(log, 3) - - # Strip the list nesting - for i in 1, 2, 3: - self.failUnless(isinstance(Foo, list)) - Foo, = Foo - - self.assertEqual(log, [(1, Foo), (2, [Foo]), (3, [[Foo]])]) - - def TODOtest_outside(self): - from zope.interface.tests.advisory_testing import ping - # Disabled because the check does not work with doctest tests. - try: - ping([], 1) - except SyntaxError: - pass - else: - raise AssertionError( - "Should have detected advice outside class body" - ) - - @_skip_under_py3k - def test_single_explicit_meta(self): - from zope.interface.tests.advisory_testing import ping - - class Metaclass(type): - pass - - class Concrete(Metaclass): - __metaclass__ = Metaclass - ping([],1) - - Concrete, = Concrete - self.failUnless(Concrete.__class__ is Metaclass) - - - @_skip_under_py3k - def test_mixed_metas(self): - from zope.interface.tests.advisory_testing import ping - - class Metaclass1(type): - pass - - class Metaclass2(type): - pass - - class Base1: - __metaclass__ = Metaclass1 - - class Base2: - __metaclass__ = Metaclass2 - - try: - class Derived(Base1, Base2): - ping([], 1) - - except TypeError: - pass - else: - raise AssertionError("Should have gotten incompatibility error") - - class Metaclass3(Metaclass1, Metaclass2): - pass - - class Derived(Base1, Base2): - __metaclass__ = Metaclass3 - ping([], 1) - - self.failUnless(isinstance(Derived, list)) - Derived, = Derived - self.failUnless(isinstance(Derived, Metaclass3)) - - @_skip_under_py3k - def test_meta_no_bases(self): - from zope.interface.tests.advisory_testing import ping - try: - from types import ClassType - except ImportError: - return - class Thing: - ping([], 1) - klass, = Thing # unpack list created by pong - self.assertEqual(type(klass), ClassType) - - -class Test_isClassAdvisor(_SilencePy3Deprecations): - - def _callFUT(self, *args, **kw): - from zope.interface.advice import isClassAdvisor - return isClassAdvisor(*args, **kw) - - def test_w_non_function(self): - self.assertEqual(self._callFUT(self), False) - - def test_w_normal_function(self): - def foo(): - pass - self.assertEqual(self._callFUT(foo), False) - - def test_w_advisor_function(self): - def bar(): - pass - bar.previousMetaclass = object() - self.assertEqual(self._callFUT(bar), True) - - -class Test_determineMetaclass(_SilencePy3Deprecations): - - def _callFUT(self, *args, **kw): - from zope.interface.advice import determineMetaclass - return determineMetaclass(*args, **kw) - - @_skip_under_py3k - def test_empty(self): - from types import ClassType - self.assertEqual(self._callFUT(()), ClassType) - - def test_empty_w_explicit_metatype(self): - class Meta(type): - pass - self.assertEqual(self._callFUT((), Meta), Meta) - - def test_single(self): - class Meta(type): - pass - self.assertEqual(self._callFUT((Meta,)), type) - - @_skip_under_py3k - def test_meta_of_class(self): - class Metameta(type): - pass - - class Meta(type): - __metaclass__ = Metameta - - self.assertEqual(self._callFUT((Meta, type)), Metameta) - - @_skip_under_py2 - def test_meta_of_class_py3k(self): - # Work around SyntaxError under Python2. - EXEC = '\n'.join([ - 'class Metameta(type):', - ' pass', - 'class Meta(type, metaclass=Metameta):', - ' pass', - ]) - globs = {} - exec(EXEC, globs) - Meta = globs['Meta'] - Metameta = globs['Metameta'] - - self.assertEqual(self._callFUT((Meta, type)), Metameta) - - @_skip_under_py3k - def test_multiple_in_hierarchy(self): - class Meta_A(type): - pass - class Meta_B(Meta_A): - pass - class A(type): - __metaclass__ = Meta_A - class B(type): - __metaclass__ = Meta_B - self.assertEqual(self._callFUT((A, B,)), Meta_B) - - @_skip_under_py2 - def test_multiple_in_hierarchy_py3k(self): - # Work around SyntaxError under Python2. - EXEC = '\n'.join([ - 'class Meta_A(type):', - ' pass', - 'class Meta_B(Meta_A):', - ' pass', - 'class A(type, metaclass=Meta_A):', - ' pass', - 'class B(type, metaclass=Meta_B):', - ' pass', - ]) - globs = {} - exec(EXEC, globs) - Meta_A = globs['Meta_A'] - Meta_B = globs['Meta_B'] - A = globs['A'] - B = globs['B'] - self.assertEqual(self._callFUT((A, B)), Meta_B) - - @_skip_under_py3k - def test_multiple_not_in_hierarchy(self): - class Meta_A(type): - pass - class Meta_B(type): - pass - class A(type): - __metaclass__ = Meta_A - class B(type): - __metaclass__ = Meta_B - self.assertRaises(TypeError, self._callFUT, (A, B,)) - - @_skip_under_py2 - def test_multiple_not_in_hierarchy_py3k(self): - # Work around SyntaxError under Python2. - EXEC = '\n'.join([ - 'class Meta_A(type):', - ' pass', - 'class Meta_B(type):', - ' pass', - 'class A(type, metaclass=Meta_A):', - ' pass', - 'class B(type, metaclass=Meta_B):', - ' pass', - ]) - globs = {} - exec(EXEC, globs) - Meta_A = globs['Meta_A'] - Meta_B = globs['Meta_B'] - A = globs['A'] - B = globs['B'] - self.assertRaises(TypeError, self._callFUT, (A, B)) - - -class Test_minimalBases(_SilencePy3Deprecations): - - def _callFUT(self, klasses): - from zope.interface.advice import minimalBases - return minimalBases(klasses) - - def test_empty(self): - self.assertEqual(self._callFUT([]), []) - - @_skip_under_py3k - def test_w_oldstyle_meta(self): - class C: - pass - self.assertEqual(self._callFUT([type(C)]), []) - - @_skip_under_py3k - def test_w_oldstyle_class(self): - class C: - pass - self.assertEqual(self._callFUT([C]), [C]) - - def test_w_newstyle_meta(self): - self.assertEqual(self._callFUT([type]), [type]) - - def test_w_newstyle_class(self): - class C(object): - pass - self.assertEqual(self._callFUT([C]), [C]) - - def test_simple_hierarchy_skips_implied(self): - class A(object): - pass - class B(A): - pass - class C(B): - pass - class D(object): - pass - self.assertEqual(self._callFUT([A, B, C]), [C]) - self.assertEqual(self._callFUT([A, C]), [C]) - self.assertEqual(self._callFUT([B, C]), [C]) - self.assertEqual(self._callFUT([A, B]), [B]) - self.assertEqual(self._callFUT([D, B, D]), [B, D]) - - def test_repeats_kicked_to_end_of_queue(self): - class A(object): - pass - class B(object): - pass - self.assertEqual(self._callFUT([A, B, A]), [B, A]) - - - -def test_suite(): - return unittest.TestSuite(( - unittest.makeSuite(FrameInfoTest), - unittest.makeSuite(AdviceTests), - unittest.makeSuite(Test_isClassAdvisor), - unittest.makeSuite(Test_determineMetaclass), - unittest.makeSuite(Test_minimalBases), - )) diff --git a/zope/interface/tests/test_declarations.py b/zope/interface/tests/test_declarations.py deleted file mode 100644 index 49991d0e..00000000 --- a/zope/interface/tests/test_declarations.py +++ /dev/null @@ -1,1576 +0,0 @@ -############################################################################## -# -# Copyright (c) 2003 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Test the new API for making and checking interface declarations -""" -import unittest - -from zope.interface._compat import _skip_under_py3k - - -class _SilencePy3Deprecations(unittest.TestCase): - # silence deprecation warnings under py3 - - def failUnless(self, expr): - # St00pid speling. - return self.assertTrue(expr) - - def failIf(self, expr): - # St00pid speling. - return self.assertFalse(expr) - - -class _Py3ClassAdvice(object): - - def _run_generated_code(self, code, globs, locs, - fails_under_py3k=True, - ): - import warnings - from zope.interface._compat import PYTHON3 - with warnings.catch_warnings(record=True) as log: - warnings.resetwarnings() - if not PYTHON3: - exec(code, globs, locs) - self.assertEqual(len(log), 0) # no longer warn - return True - else: - try: - exec(code, globs, locs) - except TypeError: - return False - else: - if fails_under_py3k: - self.fail("Didn't raise TypeError") - - -class DeclarationTests(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.declarations import Declaration - return Declaration - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_ctor_no_bases(self): - decl = self._makeOne() - self.assertEqual(list(decl.__bases__), []) - - def test_ctor_w_interface_in_bases(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - decl = self._makeOne(IFoo) - self.assertEqual(list(decl.__bases__), [IFoo]) - - def test_ctor_w_implements_in_bases(self): - from zope.interface.declarations import Implements - impl = Implements() - decl = self._makeOne(impl) - self.assertEqual(list(decl.__bases__), [impl]) - - def test_changed_wo_existing__v_attrs(self): - decl = self._makeOne() - decl.changed(decl) # doesn't raise - self.failIf('_v_attrs' in decl.__dict__) - - def test_changed_w_existing__v_attrs(self): - decl = self._makeOne() - decl._v_attrs = object() - decl.changed(decl) - self.failIf('_v_attrs' in decl.__dict__) - - def test___contains__w_self(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - decl = self._makeOne() - self.failIf(decl in decl) - - def test___contains__w_unrelated_iface(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - decl = self._makeOne() - self.failIf(IFoo in decl) - - def test___contains__w_base_interface(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - decl = self._makeOne(IFoo) - self.failUnless(IFoo in decl) - - def test___iter___empty(self): - decl = self._makeOne() - self.assertEqual(list(decl), []) - - def test___iter___single_base(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - decl = self._makeOne(IFoo) - self.assertEqual(list(decl), [IFoo]) - - def test___iter___multiple_bases(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar') - decl = self._makeOne(IFoo, IBar) - self.assertEqual(list(decl), [IFoo, IBar]) - - def test___iter___inheritance(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', (IFoo,)) - decl = self._makeOne(IBar) - self.assertEqual(list(decl), [IBar]) #IBar.interfaces() omits bases - - def test___iter___w_nested_sequence_overlap(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar') - decl = self._makeOne(IBar, (IFoo, IBar)) - self.assertEqual(list(decl), [IBar, IFoo]) - - def test_flattened_empty(self): - from zope.interface.interface import Interface - decl = self._makeOne() - self.assertEqual(list(decl.flattened()), [Interface]) - - def test_flattened_single_base(self): - from zope.interface.interface import Interface - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - decl = self._makeOne(IFoo) - self.assertEqual(list(decl.flattened()), [IFoo, Interface]) - - def test_flattened_multiple_bases(self): - from zope.interface.interface import Interface - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar') - decl = self._makeOne(IFoo, IBar) - self.assertEqual(list(decl.flattened()), [IFoo, IBar, Interface]) - - def test_flattened_inheritance(self): - from zope.interface.interface import Interface - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', (IFoo,)) - decl = self._makeOne(IBar) - self.assertEqual(list(decl.flattened()), [IBar, IFoo, Interface]) - - def test_flattened_w_nested_sequence_overlap(self): - from zope.interface.interface import Interface - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar') - decl = self._makeOne(IBar, (IFoo, IBar)) - # Note that decl.__iro__ has IFoo first. - self.assertEqual(list(decl.flattened()), [IFoo, IBar, Interface]) - - def test___sub___unrelated_interface(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar') - before = self._makeOne(IFoo) - after = before - IBar - self.failUnless(isinstance(after, self._getTargetClass())) - self.assertEqual(list(after), [IFoo]) - - def test___sub___related_interface(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - before = self._makeOne(IFoo) - after = before - IFoo - self.assertEqual(list(after), []) - - def test___sub___related_interface_by_inheritance(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar', (IFoo,)) - before = self._makeOne(IBar) - after = before - IBar - self.assertEqual(list(after), []) - - def test___add___unrelated_interface(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar') - before = self._makeOne(IFoo) - after = before + IBar - self.failUnless(isinstance(after, self._getTargetClass())) - self.assertEqual(list(after), [IFoo, IBar]) - - def test___add___related_interface(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar') - IBaz = InterfaceClass('IBaz') - before = self._makeOne(IFoo, IBar) - other = self._makeOne(IBar, IBaz) - after = before + other - self.assertEqual(list(after), [IFoo, IBar, IBaz]) - - -class ImplementsTests(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.declarations import Implements - return Implements - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_ctor_no_bases(self): - impl = self._makeOne() - self.assertEqual(impl.inherit, None) - self.assertEqual(impl.declared, ()) - self.assertEqual(impl.__name__, '?') - self.assertEqual(list(impl.__bases__), []) - - def test___repr__(self): - impl = self._makeOne() - impl.__name__ = 'Testing' - self.assertEqual(repr(impl), '') - - def test___reduce__(self): - from zope.interface.declarations import implementedBy - impl = self._makeOne() - self.assertEqual(impl.__reduce__(), (implementedBy, (None,))) - - -class Test_implementedByFallback(_SilencePy3Deprecations): - - def _callFUT(self, *args, **kw): - from zope.interface.declarations import implementedByFallback - return implementedByFallback(*args, **kw) - - def test_dictless_wo_existing_Implements_wo_registrations(self): - class Foo(object): - __slots__ = ('__implemented__',) - foo = Foo() - foo.__implemented__ = None - self.assertEqual(list(self._callFUT(foo)), []) - - def test_dictless_wo_existing_Implements_cant_assign___implemented__(self): - class Foo(object): - def _get_impl(self): return None - def _set_impl(self, val): raise TypeError - __implemented__ = property(_get_impl, _set_impl) - def __call__(self): pass #act like a factory - foo = Foo() - self.assertRaises(TypeError, self._callFUT, foo) - - def test_dictless_wo_existing_Implements_w_registrations(self): - from zope.interface import declarations - class Foo(object): - __slots__ = ('__implemented__',) - foo = Foo() - foo.__implemented__ = None - reg = object() - with _MonkeyDict(declarations, - 'BuiltinImplementationSpecifications') as specs: - specs[foo] = reg - self.failUnless(self._callFUT(foo) is reg) - - def test_dictless_w_existing_Implements(self): - from zope.interface.declarations import Implements - impl = Implements() - class Foo(object): - __slots__ = ('__implemented__',) - foo = Foo() - foo.__implemented__ = impl - self.failUnless(self._callFUT(foo) is impl) - - def test_dictless_w_existing_not_Implements(self): - from zope.interface.interface import InterfaceClass - class Foo(object): - __slots__ = ('__implemented__',) - foo = Foo() - IFoo = InterfaceClass('IFoo') - foo.__implemented__ = (IFoo,) - self.assertEqual(list(self._callFUT(foo)), [IFoo]) - - def test_w_existing_attr_as_Implements(self): - from zope.interface.declarations import Implements - impl = Implements() - class Foo(object): - __implemented__ = impl - self.failUnless(self._callFUT(Foo) is impl) - - def test_builtins_added_to_cache(self): - from zope.interface import declarations - from zope.interface.declarations import Implements - from zope.interface._compat import _BUILTINS - with _MonkeyDict(declarations, - 'BuiltinImplementationSpecifications') as specs: - self.assertEqual(list(self._callFUT(tuple)), []) - self.assertEqual(list(self._callFUT(list)), []) - self.assertEqual(list(self._callFUT(dict)), []) - for typ in (tuple, list, dict): - spec = specs[typ] - self.failUnless(isinstance(spec, Implements)) - self.assertEqual(repr(spec), - '' - % (_BUILTINS, typ.__name__)) - - def test_builtins_w_existing_cache(self): - from zope.interface import declarations - t_spec, l_spec, d_spec = object(), object(), object() - with _MonkeyDict(declarations, - 'BuiltinImplementationSpecifications') as specs: - specs[tuple] = t_spec - specs[list] = l_spec - specs[dict] = d_spec - self.failUnless(self._callFUT(tuple) is t_spec) - self.failUnless(self._callFUT(list) is l_spec) - self.failUnless(self._callFUT(dict) is d_spec) - - def test_oldstyle_class_no_assertions(self): - # TODO: Figure out P3 story - class Foo: - pass - self.assertEqual(list(self._callFUT(Foo)), []) - - def test_no_assertions(self): - # TODO: Figure out P3 story - class Foo(object): - pass - self.assertEqual(list(self._callFUT(Foo)), []) - - def test_w_None_no_bases_not_factory(self): - class Foo(object): - __implemented__ = None - foo = Foo() - self.assertRaises(TypeError, self._callFUT, foo) - - def test_w_None_no_bases_w_factory(self): - from zope.interface.declarations import objectSpecificationDescriptor - class Foo(object): - __implemented__ = None - def __call__(self): - pass - foo = Foo() - foo.__name__ = 'foo' - spec = self._callFUT(foo) - self.assertEqual(spec.__name__, - 'zope.interface.tests.test_declarations.foo') - self.failUnless(spec.inherit is foo) - self.failUnless(foo.__implemented__ is spec) - self.failUnless(foo.__providedBy__ is objectSpecificationDescriptor) - self.failIf('__provides__' in foo.__dict__) - - def test_w_None_no_bases_w_class(self): - from zope.interface.declarations import ClassProvides - class Foo(object): - __implemented__ = None - spec = self._callFUT(Foo) - self.assertEqual(spec.__name__, - 'zope.interface.tests.test_declarations.Foo') - self.failUnless(spec.inherit is Foo) - self.failUnless(Foo.__implemented__ is spec) - self.failUnless(isinstance(Foo.__providedBy__, ClassProvides)) - self.failUnless(isinstance(Foo.__provides__, ClassProvides)) - self.assertEqual(Foo.__provides__, Foo.__providedBy__) - - def test_w_existing_Implements(self): - from zope.interface.declarations import Implements - impl = Implements() - class Foo(object): - __implemented__ = impl - self.failUnless(self._callFUT(Foo) is impl) - - -class Test_implementedBy(Test_implementedByFallback): - # Repeat tests for C optimizations - - def _callFUT(self, *args, **kw): - from zope.interface.declarations import implementedBy - return implementedBy(*args, **kw) - - -class Test_classImplementsOnly(_SilencePy3Deprecations): - - def _callFUT(self, *args, **kw): - from zope.interface.declarations import classImplementsOnly - return classImplementsOnly(*args, **kw) - - def test_no_existing(self): - from zope.interface.declarations import ClassProvides - from zope.interface.interface import InterfaceClass - class Foo(object): - pass - ifoo = InterfaceClass('IFoo') - self._callFUT(Foo, ifoo) - spec = Foo.__implemented__ - self.assertEqual(spec.__name__, - 'zope.interface.tests.test_declarations.Foo') - self.failUnless(spec.inherit is None) - self.failUnless(Foo.__implemented__ is spec) - self.failUnless(isinstance(Foo.__providedBy__, ClassProvides)) - self.failUnless(isinstance(Foo.__provides__, ClassProvides)) - self.assertEqual(Foo.__provides__, Foo.__providedBy__) - - def test_w_existing_Implements(self): - from zope.interface.declarations import Implements - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar') - impl = Implements(IFoo) - impl.declared = (IFoo,) - class Foo(object): - __implemented__ = impl - impl.inherit = Foo - self._callFUT(Foo, IBar) - # Same spec, now different values - self.failUnless(Foo.__implemented__ is impl) - self.assertEqual(impl.inherit, None) - self.assertEqual(impl.declared, (IBar,)) - - -class Test_classImplements(_SilencePy3Deprecations): - - def _callFUT(self, *args, **kw): - from zope.interface.declarations import classImplements - return classImplements(*args, **kw) - - def test_no_existing(self): - from zope.interface.declarations import ClassProvides - from zope.interface.interface import InterfaceClass - class Foo(object): - pass - IFoo = InterfaceClass('IFoo') - self._callFUT(Foo, IFoo) - spec = Foo.__implemented__ - self.assertEqual(spec.__name__, - 'zope.interface.tests.test_declarations.Foo') - self.failUnless(spec.inherit is Foo) - self.failUnless(Foo.__implemented__ is spec) - self.failUnless(isinstance(Foo.__providedBy__, ClassProvides)) - self.failUnless(isinstance(Foo.__provides__, ClassProvides)) - self.assertEqual(Foo.__provides__, Foo.__providedBy__) - - def test_w_existing_Implements(self): - from zope.interface.declarations import Implements - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar') - impl = Implements(IFoo) - impl.declared = (IFoo,) - class Foo(object): - __implemented__ = impl - impl.inherit = Foo - self._callFUT(Foo, IBar) - # Same spec, now different values - self.failUnless(Foo.__implemented__ is impl) - self.assertEqual(impl.inherit, Foo) - self.assertEqual(impl.declared, (IFoo, IBar,)) - - def test_w_existing_Implements_w_bases(self): - from zope.interface.declarations import Implements - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar') - IBaz = InterfaceClass('IBar') - b_impl = Implements(IBaz) - impl = Implements(IFoo) - impl.declared = (IFoo,) - class Base(object): - __implemented__ = b_impl - class Foo(Base): - __implemented__ = impl - impl.inherit = Foo - self._callFUT(Foo, IBar) - # Same spec, now different values - self.failUnless(Foo.__implemented__ is impl) - self.assertEqual(impl.inherit, Foo) - self.assertEqual(impl.declared, (IFoo, IBar,)) - self.assertEqual(impl.__bases__, (IFoo, IBar, b_impl)) - - -class Test__implements_advice(_SilencePy3Deprecations): - - def _callFUT(self, *args, **kw): - from zope.interface.declarations import _implements_advice - return _implements_advice(*args, **kw) - - def test_no_existing_implements(self): - from zope.interface.declarations import classImplements - from zope.interface.declarations import Implements - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - class Foo(object): - __implements_advice_data__ = ((IFoo,), classImplements) - self._callFUT(Foo) - self.failIf('__implements_advice_data__' in Foo.__dict__) - self.failUnless(isinstance(Foo.__implemented__, Implements)) - self.assertEqual(list(Foo.__implemented__), [IFoo]) - - -class Test_implementer(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.declarations import implementer - return implementer - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_oldstyle_class(self): - # TODO Py3 story - from zope.interface.declarations import ClassProvides - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - class Foo: - pass - decorator = self._makeOne(IFoo) - returned = decorator(Foo) - self.failUnless(returned is Foo) - spec = Foo.__implemented__ - self.assertEqual(spec.__name__, - 'zope.interface.tests.test_declarations.Foo') - self.failUnless(spec.inherit is Foo) - self.failUnless(Foo.__implemented__ is spec) - self.failUnless(isinstance(Foo.__providedBy__, ClassProvides)) - self.failUnless(isinstance(Foo.__provides__, ClassProvides)) - self.assertEqual(Foo.__provides__, Foo.__providedBy__) - - def test_newstyle_class(self): - from zope.interface.declarations import ClassProvides - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - class Foo(object): - pass - decorator = self._makeOne(IFoo) - returned = decorator(Foo) - self.failUnless(returned is Foo) - spec = Foo.__implemented__ - self.assertEqual(spec.__name__, - 'zope.interface.tests.test_declarations.Foo') - self.failUnless(spec.inherit is Foo) - self.failUnless(Foo.__implemented__ is spec) - self.failUnless(isinstance(Foo.__providedBy__, ClassProvides)) - self.failUnless(isinstance(Foo.__provides__, ClassProvides)) - self.assertEqual(Foo.__provides__, Foo.__providedBy__) - - def test_nonclass_cannot_assign_attr(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - decorator = self._makeOne(IFoo) - self.assertRaises(TypeError, decorator, object()) - - def test_nonclass_can_assign_attr(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - class Foo(object): - pass - foo = Foo() - decorator = self._makeOne(IFoo) - returned = decorator(foo) - self.failUnless(returned is foo) - spec = foo.__implemented__ - self.assertEqual(spec.__name__, '?') - self.failUnless(spec.inherit is None) - self.failUnless(foo.__implemented__ is spec) - - -class Test_implementer_only(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.declarations import implementer_only - return implementer_only - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_function(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - decorator = self._makeOne(IFoo) - def _function(): pass - self.assertRaises(ValueError, decorator, _function) - - def test_method(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - decorator = self._makeOne(IFoo) - class Bar: - def _method(): pass - self.assertRaises(ValueError, decorator, Bar._method) - - def test_oldstyle_class(self): - # TODO Py3 story - from zope.interface.declarations import Implements - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar') - old_spec = Implements(IBar) - class Foo: - __implemented__ = old_spec - decorator = self._makeOne(IFoo) - returned = decorator(Foo) - self.failUnless(returned is Foo) - spec = Foo.__implemented__ - self.assertEqual(spec.__name__, '?') - self.failUnless(spec.inherit is None) - self.failUnless(Foo.__implemented__ is spec) - - def test_newstyle_class(self): - from zope.interface.declarations import Implements - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass('IFoo') - IBar = InterfaceClass('IBar') - old_spec = Implements(IBar) - class Foo(object): - __implemented__ = old_spec - decorator = self._makeOne(IFoo) - returned = decorator(Foo) - self.failUnless(returned is Foo) - spec = Foo.__implemented__ - self.assertEqual(spec.__name__, '?') - self.failUnless(spec.inherit is None) - self.failUnless(Foo.__implemented__ is spec) - - -# Test '_implements' by way of 'implements{,Only}', its only callers. - -class Test_implementsOnly(_SilencePy3Deprecations, _Py3ClassAdvice): - - def _getFUT(self): - from zope.interface.declarations import implementsOnly - return implementsOnly - - def test_simple(self): - import warnings - from zope.interface.declarations import implementsOnly - from zope.interface._compat import PYTHON3 - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - globs = {'implementsOnly': implementsOnly, - 'IFoo': IFoo, - } - locs = {} - CODE = "\n".join([ - 'class Foo(object):' - ' implementsOnly(IFoo)', - ]) - with warnings.catch_warnings(record=True) as log: - warnings.resetwarnings() - try: - exec(CODE, globs, locs) - except TypeError: - if not PYTHON3: - raise - else: - if PYTHON3: - self.fail("Didn't raise TypeError") - Foo = locs['Foo'] - spec = Foo.__implemented__ - self.assertEqual(list(spec), [IFoo]) - self.assertEqual(len(log), 0) # no longer warn - - def test_called_once_from_class_w_bases(self): - from zope.interface.declarations import implements - from zope.interface.declarations import implementsOnly - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - IBar = InterfaceClass("IBar") - globs = {'implements': implements, - 'implementsOnly': implementsOnly, - 'IFoo': IFoo, - 'IBar': IBar, - } - locs = {} - CODE = "\n".join([ - 'class Foo(object):', - ' implements(IFoo)', - 'class Bar(Foo):' - ' implementsOnly(IBar)', - ]) - if self._run_generated_code(CODE, globs, locs): - Bar = locs['Bar'] - spec = Bar.__implemented__ - self.assertEqual(list(spec), [IBar]) - - -class Test_implements(_SilencePy3Deprecations, _Py3ClassAdvice): - - def _getFUT(self): - from zope.interface.declarations import implements - return implements - - def test_called_from_function(self): - import warnings - from zope.interface.declarations import implements - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - globs = {'implements': implements, 'IFoo': IFoo} - locs = {} - CODE = "\n".join([ - 'def foo():', - ' implements(IFoo)' - ]) - if self._run_generated_code(CODE, globs, locs, False): - foo = locs['foo'] - with warnings.catch_warnings(record=True) as log: - warnings.resetwarnings() - self.assertRaises(TypeError, foo) - self.assertEqual(len(log), 0) # no longer warn - - def test_called_twice_from_class(self): - import warnings - from zope.interface.declarations import implements - from zope.interface.interface import InterfaceClass - from zope.interface._compat import PYTHON3 - IFoo = InterfaceClass("IFoo") - IBar = InterfaceClass("IBar") - globs = {'implements': implements, 'IFoo': IFoo, 'IBar': IBar} - locs = {} - CODE = "\n".join([ - 'class Foo(object):', - ' implements(IFoo)', - ' implements(IBar)', - ]) - with warnings.catch_warnings(record=True) as log: - warnings.resetwarnings() - try: - exec(CODE, globs, locs) - except TypeError: - if not PYTHON3: - self.assertEqual(len(log), 0) # no longer warn - else: - self.fail("Didn't raise TypeError") - - def test_called_once_from_class(self): - from zope.interface.declarations import implements - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - globs = {'implements': implements, 'IFoo': IFoo} - locs = {} - CODE = "\n".join([ - 'class Foo(object):', - ' implements(IFoo)', - ]) - if self._run_generated_code(CODE, globs, locs): - Foo = locs['Foo'] - spec = Foo.__implemented__ - self.assertEqual(list(spec), [IFoo]) - - -class ProvidesClassTests(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.declarations import ProvidesClass - return ProvidesClass - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_simple_class_one_interface(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - class Foo(object): - pass - spec = self._makeOne(Foo, IFoo) - self.assertEqual(list(spec), [IFoo]) - - def test___reduce__(self): - from zope.interface.declarations import Provides # the function - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - class Foo(object): - pass - spec = self._makeOne(Foo, IFoo) - klass, args = spec.__reduce__() - self.failUnless(klass is Provides) - self.assertEqual(args, (Foo, IFoo)) - - def test___get___class(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - class Foo(object): - pass - spec = self._makeOne(Foo, IFoo) - Foo.__provides__ = spec - self.failUnless(Foo.__provides__ is spec) - - def test___get___instance(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - class Foo(object): - pass - spec = self._makeOne(Foo, IFoo) - Foo.__provides__ = spec - def _test(): - foo = Foo() - return foo.__provides__ - self.assertRaises(AttributeError, _test) - - -class Test_Provides(_SilencePy3Deprecations): - - def _callFUT(self, *args, **kw): - from zope.interface.declarations import Provides - return Provides(*args, **kw) - - def test_no_cached_spec(self): - from zope.interface import declarations - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - cache = {} - class Foo(object): - pass - with _Monkey(declarations, InstanceDeclarations=cache): - spec = self._callFUT(Foo, IFoo) - self.assertEqual(list(spec), [IFoo]) - self.failUnless(cache[(Foo, IFoo)] is spec) - - def test_w_cached_spec(self): - from zope.interface import declarations - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - prior = object() - class Foo(object): - pass - cache = {(Foo, IFoo): prior} - with _Monkey(declarations, InstanceDeclarations=cache): - spec = self._callFUT(Foo, IFoo) - self.failUnless(spec is prior) - - -class Test_directlyProvides(_SilencePy3Deprecations): - - def _callFUT(self, *args, **kw): - from zope.interface.declarations import directlyProvides - return directlyProvides(*args, **kw) - - def test_w_normal_object(self): - from zope.interface.declarations import ProvidesClass - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - class Foo(object): - pass - obj = Foo() - self._callFUT(obj, IFoo) - self.failUnless(isinstance(obj.__provides__, ProvidesClass)) - self.assertEqual(list(obj.__provides__), [IFoo]) - - def test_w_class(self): - from zope.interface.declarations import ClassProvides - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - class Foo(object): - pass - self._callFUT(Foo, IFoo) - self.failUnless(isinstance(Foo.__provides__, ClassProvides)) - self.assertEqual(list(Foo.__provides__), [IFoo]) - - @_skip_under_py3k - def test_w_non_descriptor_aware_metaclass(self): - # There are no non-descriptor-aware types in Py3k - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - class MetaClass(type): - def __getattribute__(self, name): - # Emulate metaclass whose base is not the type object. - if name == '__class__': - return self - return type.__getattribute__(self, name) - class Foo(object): - __metaclass__ = MetaClass - obj = Foo() - self.assertRaises(TypeError, self._callFUT, obj, IFoo) - - def test_w_classless_object(self): - from zope.interface.declarations import ProvidesClass - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - the_dict = {} - class Foo(object): - def __getattribute__(self, name): - # Emulate object w/o any class - if name == '__class__': - return None - try: - return the_dict[name] - except KeyError: - raise AttributeError(name) - def __setattr__(self, name, value): - the_dict[name] = value - obj = Foo() - self._callFUT(obj, IFoo) - self.failUnless(isinstance(the_dict['__provides__'], ProvidesClass)) - self.assertEqual(list(the_dict['__provides__']), [IFoo]) - - -class Test_alsoProvides(_SilencePy3Deprecations): - - def _callFUT(self, *args, **kw): - from zope.interface.declarations import alsoProvides - return alsoProvides(*args, **kw) - - def test_wo_existing_provides(self): - from zope.interface.declarations import ProvidesClass - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - class Foo(object): - pass - obj = Foo() - self._callFUT(obj, IFoo) - self.failUnless(isinstance(obj.__provides__, ProvidesClass)) - self.assertEqual(list(obj.__provides__), [IFoo]) - - def test_w_existing_provides(self): - from zope.interface.declarations import directlyProvides - from zope.interface.declarations import ProvidesClass - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - IBar = InterfaceClass("IBar") - class Foo(object): - pass - obj = Foo() - directlyProvides(obj, IFoo) - self._callFUT(obj, IBar) - self.failUnless(isinstance(obj.__provides__, ProvidesClass)) - self.assertEqual(list(obj.__provides__), [IFoo, IBar]) - - -class Test_noLongerProvides(_SilencePy3Deprecations): - - def _callFUT(self, *args, **kw): - from zope.interface.declarations import noLongerProvides - return noLongerProvides(*args, **kw) - - def test_wo_existing_provides(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - class Foo(object): - pass - obj = Foo() - self._callFUT(obj, IFoo) - self.assertEqual(list(obj.__provides__), []) - - def test_w_existing_provides_hit(self): - from zope.interface.declarations import directlyProvides - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - class Foo(object): - pass - obj = Foo() - directlyProvides(obj, IFoo) - self._callFUT(obj, IFoo) - self.assertEqual(list(obj.__provides__), []) - - def test_w_existing_provides_miss(self): - from zope.interface.declarations import directlyProvides - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - IBar = InterfaceClass("IBar") - class Foo(object): - pass - obj = Foo() - directlyProvides(obj, IFoo) - self._callFUT(obj, IBar) - self.assertEqual(list(obj.__provides__), [IFoo]) - - def test_w_iface_implemented_by_class(self): - from zope.interface.declarations import implementer - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - @implementer(IFoo) - class Foo(object): - pass - obj = Foo() - self.assertRaises(ValueError, self._callFUT, obj, IFoo) - - -class ClassProvidesBaseFallbackTests(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.declarations import ClassProvidesBaseFallback - return ClassProvidesBaseFallback - - def _makeOne(self, klass, implements): - # Don't instantiate directly: the C version can't have attributes - # assigned. - class Derived(self._getTargetClass()): - def __init__(self, k, i): - self._cls = k - self._implements = i - return Derived(klass, implements) - - def test_w_same_class_via_class(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - class Foo(object): - pass - cpbp = Foo.__provides__ = self._makeOne(Foo, IFoo) - self.failUnless(Foo.__provides__ is cpbp) - - def test_w_same_class_via_instance(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - class Foo(object): - pass - foo = Foo() - cpbp = Foo.__provides__ = self._makeOne(Foo, IFoo) - self.failUnless(foo.__provides__ is IFoo) - - def test_w_different_class(self): - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - class Foo(object): - pass - class Bar(Foo): - pass - bar = Bar() - cpbp = Foo.__provides__ = self._makeOne(Foo, IFoo) - self.assertRaises(AttributeError, getattr, Bar, '__provides__') - self.assertRaises(AttributeError, getattr, bar, '__provides__') - - -class ClassProvidesBaseTests(ClassProvidesBaseFallbackTests): - # Repeat tests for C optimizations - - def _getTargetClass(self): - from zope.interface.declarations import ClassProvidesBase - return ClassProvidesBase - - -class ClassProvidesTests(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.declarations import ClassProvides - return ClassProvides - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_w_simple_metaclass(self): - from zope.interface.declarations import implementer - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - IBar = InterfaceClass("IBar") - @implementer(IFoo) - class Foo(object): - pass - cp = Foo.__provides__ = self._makeOne(Foo, type(Foo), IBar) - self.failUnless(Foo.__provides__ is cp) - self.assertEqual(list(Foo().__provides__), [IFoo]) - - def test___reduce__(self): - from zope.interface.declarations import implementer - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - IBar = InterfaceClass("IBar") - @implementer(IFoo) - class Foo(object): - pass - cp = Foo.__provides__ = self._makeOne(Foo, type(Foo), IBar) - self.assertEqual(cp.__reduce__(), - (self._getTargetClass(), (Foo, type(Foo), IBar))) - - -class Test_directlyProvidedBy(_SilencePy3Deprecations): - - def _callFUT(self, *args, **kw): - from zope.interface.declarations import directlyProvidedBy - return directlyProvidedBy(*args, **kw) - - def test_wo_declarations_in_class_or_instance(self): - class Foo(object): - pass - foo = Foo() - self.assertEqual(list(self._callFUT(foo)), []) - - def test_w_declarations_in_class_but_not_instance(self): - from zope.interface.declarations import implementer - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - @implementer(IFoo) - class Foo(object): - pass - foo = Foo() - self.assertEqual(list(self._callFUT(foo)), []) - - def test_w_declarations_in_instance_but_not_class(self): - from zope.interface.declarations import directlyProvides - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - class Foo(object): - pass - foo = Foo() - directlyProvides(foo, IFoo) - self.assertEqual(list(self._callFUT(foo)), [IFoo]) - - def test_w_declarations_in_instance_and_class(self): - from zope.interface.declarations import directlyProvides - from zope.interface.declarations import implementer - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - IBar = InterfaceClass("IBar") - @implementer(IFoo) - class Foo(object): - pass - foo = Foo() - directlyProvides(foo, IBar) - self.assertEqual(list(self._callFUT(foo)), [IBar]) - - -class Test_classProvides(_SilencePy3Deprecations, _Py3ClassAdvice): - - def _getFUT(self): - from zope.interface.declarations import classProvides - return classProvides - - def test_called_from_function(self): - import warnings - from zope.interface.declarations import classProvides - from zope.interface.interface import InterfaceClass - from zope.interface._compat import PYTHON3 - IFoo = InterfaceClass("IFoo") - globs = {'classProvides': classProvides, 'IFoo': IFoo} - locs = {} - CODE = "\n".join([ - 'def foo():', - ' classProvides(IFoo)' - ]) - exec(CODE, globs, locs) - foo = locs['foo'] - with warnings.catch_warnings(record=True) as log: - warnings.resetwarnings() - self.assertRaises(TypeError, foo) - if not PYTHON3: - self.assertEqual(len(log), 0) # no longer warn - - def test_called_twice_from_class(self): - import warnings - from zope.interface.declarations import classProvides - from zope.interface.interface import InterfaceClass - from zope.interface._compat import PYTHON3 - IFoo = InterfaceClass("IFoo") - IBar = InterfaceClass("IBar") - globs = {'classProvides': classProvides, 'IFoo': IFoo, 'IBar': IBar} - locs = {} - CODE = "\n".join([ - 'class Foo(object):', - ' classProvides(IFoo)', - ' classProvides(IBar)', - ]) - with warnings.catch_warnings(record=True) as log: - warnings.resetwarnings() - try: - exec(CODE, globs, locs) - except TypeError: - if not PYTHON3: - self.assertEqual(len(log), 0) # no longer warn - else: - self.fail("Didn't raise TypeError") - - def test_called_once_from_class(self): - from zope.interface.declarations import classProvides - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - globs = {'classProvides': classProvides, 'IFoo': IFoo} - locs = {} - CODE = "\n".join([ - 'class Foo(object):', - ' classProvides(IFoo)', - ]) - if self._run_generated_code(CODE, globs, locs): - Foo = locs['Foo'] - spec = Foo.__providedBy__ - self.assertEqual(list(spec), [IFoo]) - -# Test _classProvides_advice through classProvides, its only caller. - - -class Test_provider(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.declarations import provider - return provider - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_w_class(self): - from zope.interface.declarations import ClassProvides - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - @self._makeOne(IFoo) - class Foo(object): - pass - self.failUnless(isinstance(Foo.__provides__, ClassProvides)) - self.assertEqual(list(Foo.__provides__), [IFoo]) - - -class Test_moduleProvides(_SilencePy3Deprecations): - - def _getFUT(self): - from zope.interface.declarations import moduleProvides - return moduleProvides - - def test_called_from_function(self): - from zope.interface.declarations import moduleProvides - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - globs = {'__name__': 'zope.interface.tests.foo', - 'moduleProvides': moduleProvides, 'IFoo': IFoo} - locs = {} - CODE = "\n".join([ - 'def foo():', - ' moduleProvides(IFoo)' - ]) - exec(CODE, globs, locs) - foo = locs['foo'] - self.assertRaises(TypeError, foo) - - def test_called_from_class(self): - from zope.interface.declarations import moduleProvides - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - globs = {'__name__': 'zope.interface.tests.foo', - 'moduleProvides': moduleProvides, 'IFoo': IFoo} - locs = {} - CODE = "\n".join([ - 'class Foo(object):', - ' moduleProvides(IFoo)', - ]) - try: - exec(CODE, globs, locs) - except TypeError: - pass - else: - assert False, 'TypeError not raised' - - def test_called_once_from_module_scope(self): - from zope.interface.declarations import moduleProvides - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - globs = {'__name__': 'zope.interface.tests.foo', - 'moduleProvides': moduleProvides, 'IFoo': IFoo} - CODE = "\n".join([ - 'moduleProvides(IFoo)', - ]) - exec(CODE, globs) - spec = globs['__provides__'] - self.assertEqual(list(spec), [IFoo]) - - def test_called_twice_from_module_scope(self): - from zope.interface.declarations import moduleProvides - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - globs = {'__name__': 'zope.interface.tests.foo', - 'moduleProvides': moduleProvides, 'IFoo': IFoo} - locs = {} - CODE = "\n".join([ - 'moduleProvides(IFoo)', - 'moduleProvides(IFoo)', - ]) - try: - exec(CODE, globs) - except TypeError: - pass - else: - assert False, 'TypeError not raised' - - -class Test_getObjectSpecificationFallback(_SilencePy3Deprecations): - - def _callFUT(self, *args, **kw): - from zope.interface.declarations import getObjectSpecificationFallback - return getObjectSpecificationFallback(*args, **kw) - - def test_wo_existing_provides_classless(self): - the_dict = {} - class Foo(object): - def __getattribute__(self, name): - # Emulate object w/o any class - if name == '__class__': - raise AttributeError(name) - try: - return the_dict[name] - except KeyError: - raise AttributeError(name) - def __setattr__(self, name, value): - the_dict[name] = value - foo = Foo() - spec = self._callFUT(foo) - self.assertEqual(list(spec), []) - - def test_existing_provides_is_spec(self): - from zope.interface.declarations import directlyProvides - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - def foo(): - pass - directlyProvides(foo, IFoo) - spec = self._callFUT(foo) - self.failUnless(spec is foo.__provides__) - - def test_existing_provides_is_not_spec(self): - def foo(): - pass - foo.__provides__ = object() # not a valid spec - spec = self._callFUT(foo) - self.assertEqual(list(spec), []) - - def test_existing_provides(self): - from zope.interface.declarations import directlyProvides - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - class Foo(object): - pass - foo = Foo() - directlyProvides(foo, IFoo) - spec = self._callFUT(foo) - self.assertEqual(list(spec), [IFoo]) - - def test_wo_provides_on_class_w_implements(self): - from zope.interface.declarations import implementer - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - @implementer(IFoo) - class Foo(object): - pass - foo = Foo() - spec = self._callFUT(foo) - self.assertEqual(list(spec), [IFoo]) - - def test_wo_provides_on_class_wo_implements(self): - class Foo(object): - pass - foo = Foo() - spec = self._callFUT(foo) - self.assertEqual(list(spec), []) - - -class Test_getObjectSpecification(Test_getObjectSpecificationFallback): - # Repeat tests for C optimizations - - def _callFUT(self, *args, **kw): - from zope.interface.declarations import getObjectSpecification - return getObjectSpecification(*args, **kw) - - -class Test_providedByFallback(_SilencePy3Deprecations): - - def _callFUT(self, *args, **kw): - from zope.interface.declarations import providedByFallback - return providedByFallback(*args, **kw) - - def test_wo_providedBy_on_class_wo_implements(self): - class Foo(object): - pass - foo = Foo() - spec = self._callFUT(foo) - self.assertEqual(list(spec), []) - - def test_w_providedBy_valid_spec(self): - from zope.interface.declarations import Provides - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - class Foo(object): - pass - foo = Foo() - foo.__providedBy__ = Provides(Foo, IFoo) - spec = self._callFUT(foo) - self.assertEqual(list(spec), [IFoo]) - - def test_w_providedBy_invalid_spec(self): - class Foo(object): - pass - foo = Foo() - foo.__providedBy__ = object() - spec = self._callFUT(foo) - self.assertEqual(list(spec), []) - - def test_w_providedBy_invalid_spec_class_w_implements(self): - from zope.interface.declarations import implementer - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - @implementer(IFoo) - class Foo(object): - pass - foo = Foo() - foo.__providedBy__ = object() - spec = self._callFUT(foo) - self.assertEqual(list(spec), [IFoo]) - - def test_w_providedBy_invalid_spec_w_provides_no_provides_on_class(self): - class Foo(object): - pass - foo = Foo() - foo.__providedBy__ = object() - expected = foo.__provides__ = object() - spec = self._callFUT(foo) - self.failUnless(spec is expected) - - def test_w_providedBy_invalid_spec_w_provides_diff_provides_on_class(self): - class Foo(object): - pass - foo = Foo() - foo.__providedBy__ = object() - expected = foo.__provides__ = object() - Foo.__provides__ = object() - spec = self._callFUT(foo) - self.failUnless(spec is expected) - - def test_w_providedBy_invalid_spec_w_provides_same_provides_on_class(self): - from zope.interface.declarations import implementer - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - @implementer(IFoo) - class Foo(object): - pass - foo = Foo() - foo.__providedBy__ = object() - foo.__provides__ = Foo.__provides__ = object() - spec = self._callFUT(foo) - self.assertEqual(list(spec), [IFoo]) - - -class Test_providedBy(Test_providedByFallback): - # Repeat tests for C optimizations - - def _callFUT(self, *args, **kw): - from zope.interface.declarations import providedBy - return providedBy(*args, **kw) - - -class ObjectSpecificationDescriptorFallbackTests(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.declarations \ - import ObjectSpecificationDescriptorFallback - return ObjectSpecificationDescriptorFallback - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_accessed_via_class(self): - from zope.interface.declarations import Provides - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - class Foo(object): - pass - Foo.__provides__ = Provides(Foo, IFoo) - Foo.__providedBy__ = self._makeOne() - self.assertEqual(list(Foo.__providedBy__), [IFoo]) - - def test_accessed_via_inst_wo_provides(self): - from zope.interface.declarations import implementer - from zope.interface.declarations import Provides - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - IBar = InterfaceClass("IBar") - @implementer(IFoo) - class Foo(object): - pass - Foo.__provides__ = Provides(Foo, IBar) - Foo.__providedBy__ = self._makeOne() - foo = Foo() - self.assertEqual(list(foo.__providedBy__), [IFoo]) - - def test_accessed_via_inst_w_provides(self): - from zope.interface.declarations import directlyProvides - from zope.interface.declarations import implementer - from zope.interface.declarations import Provides - from zope.interface.interface import InterfaceClass - IFoo = InterfaceClass("IFoo") - IBar = InterfaceClass("IBar") - IBaz = InterfaceClass("IBaz") - @implementer(IFoo) - class Foo(object): - pass - Foo.__provides__ = Provides(Foo, IBar) - Foo.__providedBy__ = self._makeOne() - foo = Foo() - directlyProvides(foo, IBaz) - self.assertEqual(list(foo.__providedBy__), [IBaz, IFoo]) - - -class ObjectSpecificationDescriptorTests( - ObjectSpecificationDescriptorFallbackTests): - # Repeat tests for C optimizations - - def _getTargetClass(self): - from zope.interface.declarations import ObjectSpecificationDescriptor - return ObjectSpecificationDescriptor - - -# Test _normalizeargs through its callers. - - -class _Monkey(object): - # context-manager for replacing module names in the scope of a test. - def __init__(self, module, **kw): - self.module = module - self.to_restore = dict([(key, getattr(module, key)) for key in kw]) - for key, value in kw.items(): - setattr(module, key, value) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - for key, value in self.to_restore.items(): - setattr(self.module, key, value) - - -class _MonkeyDict(object): - # context-manager for restoring a dict w/in a module in the scope of a test. - def __init__(self, module, attrname, **kw): - self.module = module - self.target = getattr(module, attrname) - self.to_restore = self.target.copy() - self.target.clear() - self.target.update(kw) - - def __enter__(self): - return self.target - - def __exit__(self, exc_type, exc_val, exc_tb): - self.target.clear() - self.target.update(self.to_restore) - - -def test_suite(): - return unittest.TestSuite(( - unittest.makeSuite(DeclarationTests), - unittest.makeSuite(ImplementsTests), - unittest.makeSuite(Test_implementedByFallback), - unittest.makeSuite(Test_implementedBy), - unittest.makeSuite(Test_classImplementsOnly), - unittest.makeSuite(Test_classImplements), - unittest.makeSuite(Test__implements_advice), - unittest.makeSuite(Test_implementer), - unittest.makeSuite(Test_implementer_only), - unittest.makeSuite(Test_implements), - unittest.makeSuite(Test_implementsOnly), - unittest.makeSuite(ProvidesClassTests), - unittest.makeSuite(Test_Provides), - unittest.makeSuite(Test_directlyProvides), - unittest.makeSuite(Test_alsoProvides), - unittest.makeSuite(Test_noLongerProvides), - unittest.makeSuite(ClassProvidesBaseFallbackTests), - unittest.makeSuite(ClassProvidesTests), - unittest.makeSuite(Test_directlyProvidedBy), - unittest.makeSuite(Test_classProvides), - unittest.makeSuite(Test_provider), - unittest.makeSuite(Test_moduleProvides), - unittest.makeSuite(Test_getObjectSpecificationFallback), - unittest.makeSuite(Test_getObjectSpecification), - unittest.makeSuite(Test_providedByFallback), - unittest.makeSuite(Test_providedBy), - unittest.makeSuite(ObjectSpecificationDescriptorFallbackTests), - unittest.makeSuite(ObjectSpecificationDescriptorTests), - )) diff --git a/zope/interface/tests/test_document.py b/zope/interface/tests/test_document.py deleted file mode 100644 index 6a1b0b2b..00000000 --- a/zope/interface/tests/test_document.py +++ /dev/null @@ -1,286 +0,0 @@ -############################################################################## -# -# Copyright (c) 2001, 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Documentation tests. -""" -import unittest - - -class Test_asStructuredText(unittest.TestCase): - - def _callFUT(self, iface): - from zope.interface.document import asStructuredText - return asStructuredText(iface) - - def test_asStructuredText_no_docstring(self): - from zope.interface import Interface - EXPECTED = '\n\n'.join([ - "INoDocstring", - " Attributes:", - " Methods:", - "" - ]) - class INoDocstring(Interface): - pass - self.assertEqual(self._callFUT(INoDocstring), EXPECTED) - - def test_asStructuredText_empty_with_docstring(self): - from zope.interface import Interface - EXPECTED = '\n\n'.join([ - "IEmpty", - " This is an empty interface.", - " Attributes:", - " Methods:", - "" - ]) - class IEmpty(Interface): - """ This is an empty interface. - """ - self.assertEqual(self._callFUT(IEmpty), EXPECTED) - - def test_asStructuredText_empty_with_multiline_docstring(self): - from zope.interface import Interface - EXPECTED = '\n'.join([ - "IEmpty", - "", - " This is an empty interface.", - " ", - (" It can be used to annotate any class or object, " - "because it promises"), - " nothing.", - "", - " Attributes:", - "", - " Methods:", - "", - "" - ]) - class IEmpty(Interface): - """ This is an empty interface. - - It can be used to annotate any class or object, because it promises - nothing. - """ - self.assertEqual(self._callFUT(IEmpty), EXPECTED) - - def test_asStructuredText_with_attribute_no_docstring(self): - from zope.interface import Attribute - from zope.interface import Interface - EXPECTED = '\n\n'.join([ - "IHasAttribute", - " This interface has an attribute.", - " Attributes:", - " an_attribute -- no documentation", - " Methods:", - "" - ]) - class IHasAttribute(Interface): - """ This interface has an attribute. - """ - an_attribute = Attribute('an_attribute') - - self.assertEqual(self._callFUT(IHasAttribute), EXPECTED) - - def test_asStructuredText_with_attribute_with_docstring(self): - from zope.interface import Attribute - from zope.interface import Interface - EXPECTED = '\n\n'.join([ - "IHasAttribute", - " This interface has an attribute.", - " Attributes:", - " an_attribute -- This attribute is documented.", - " Methods:", - "" - ]) - class IHasAttribute(Interface): - """ This interface has an attribute. - """ - an_attribute = Attribute('an_attribute', - 'This attribute is documented.') - - self.assertEqual(self._callFUT(IHasAttribute), EXPECTED) - - def test_asStructuredText_with_method_no_args_no_docstring(self): - from zope.interface import Interface - EXPECTED = '\n\n'.join([ - "IHasMethod", - " This interface has a method.", - " Attributes:", - " Methods:", - " aMethod() -- no documentation", - "" - ]) - class IHasMethod(Interface): - """ This interface has a method. - """ - def aMethod(): - pass - - self.assertEqual(self._callFUT(IHasMethod), EXPECTED) - - def test_asStructuredText_with_method_positional_args_no_docstring(self): - from zope.interface import Interface - EXPECTED = '\n\n'.join([ - "IHasMethod", - " This interface has a method.", - " Attributes:", - " Methods:", - " aMethod(first, second) -- no documentation", - "" - ]) - class IHasMethod(Interface): - """ This interface has a method. - """ - def aMethod(first, second): - pass - - self.assertEqual(self._callFUT(IHasMethod), EXPECTED) - - def test_asStructuredText_with_method_starargs_no_docstring(self): - from zope.interface import Interface - EXPECTED = '\n\n'.join([ - "IHasMethod", - " This interface has a method.", - " Attributes:", - " Methods:", - " aMethod(first, second, *rest) -- no documentation", - "" - ]) - class IHasMethod(Interface): - """ This interface has a method. - """ - def aMethod(first, second, *rest): - pass - - self.assertEqual(self._callFUT(IHasMethod), EXPECTED) - - def test_asStructuredText_with_method_kwargs_no_docstring(self): - from zope.interface import Interface - EXPECTED = '\n\n'.join([ - "IHasMethod", - " This interface has a method.", - " Attributes:", - " Methods:", - " aMethod(first, second, **kw) -- no documentation", - "" - ]) - class IHasMethod(Interface): - """ This interface has a method. - """ - def aMethod(first, second, **kw): - pass - - self.assertEqual(self._callFUT(IHasMethod), EXPECTED) - - def test_asStructuredText_with_method_with_docstring(self): - from zope.interface import Interface - EXPECTED = '\n\n'.join([ - "IHasMethod", - " This interface has a method.", - " Attributes:", - " Methods:", - " aMethod() -- This method is documented.", - "" - ]) - class IHasMethod(Interface): - """ This interface has a method. - """ - def aMethod(): - """This method is documented. - """ - - self.assertEqual(self._callFUT(IHasMethod), EXPECTED) - - def test_asStructuredText_derived_ignores_base(self): - from zope.interface import Attribute - from zope.interface import Interface - EXPECTED = '\n\n'.join([ - "IDerived", - " IDerived doc", - " This interface extends:", - " o IBase", - " Attributes:", - " attr1 -- no documentation", - " attr2 -- attr2 doc", - " Methods:", - " method3() -- method3 doc", - " method4() -- no documentation", - " method5() -- method5 doc", - "", - ]) - - class IBase(Interface): - def method1(): - pass - def method2(): - pass - - class IDerived(IBase): - "IDerived doc" - attr1 = Attribute('attr1') - attr2 = Attribute('attr2', 'attr2 doc') - - def method3(): - "method3 doc" - def method4(): - pass - def method5(): - "method5 doc" - - self.assertEqual(self._callFUT(IDerived), EXPECTED) - -class Test__justify_and_indent(unittest.TestCase): - - def _callFUT(self, text, level, **kw): - from zope.interface.document import _justify_and_indent - return _justify_and_indent(text, level, **kw) - - def test_simple_level_0(self): - LINES = ['Three blind mice', 'See how they run'] - text = '\n'.join(LINES) - self.assertEqual(self._callFUT(text, 0), text) - - def test_simple_level_1(self): - LINES = ['Three blind mice', 'See how they run'] - text = '\n'.join(LINES) - self.assertEqual(self._callFUT(text, 1), - '\n'.join([' ' + line for line in LINES])) - - def test_simple_level_2(self): - LINES = ['Three blind mice', 'See how they run'] - text = '\n'.join(LINES) - self.assertEqual(self._callFUT(text, 1), - '\n'.join([' ' + line for line in LINES])) - - def test_simple_w_CRLF(self): - LINES = ['Three blind mice', 'See how they run'] - text = '\r\n'.join(LINES) - self.assertEqual(self._callFUT(text, 1), - '\n'.join([' ' + line for line in LINES])) - - def test_with_munge(self): - TEXT = ("This is a piece of text longer than 15 characters, \n" - "and split across multiple lines.") - EXPECTED = (" This is a piece\n" - " of text longer\n" - " than 15 characters,\n" - " and split across\n" - " multiple lines.\n" - " ") - self.assertEqual(self._callFUT(TEXT, 1, munge=1, width=15), EXPECTED) - -def test_suite(): - return unittest.TestSuite(( - unittest.makeSuite(Test_asStructuredText), - unittest.makeSuite(Test__justify_and_indent), - )) diff --git a/zope/interface/tests/test_element.py b/zope/interface/tests/test_element.py deleted file mode 100644 index 66724a67..00000000 --- a/zope/interface/tests/test_element.py +++ /dev/null @@ -1,41 +0,0 @@ -############################################################################## -# -# Copyright (c) 2003 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Test Element meta-class. -""" - -import unittest -from zope.interface.interface import Element - -class TestElement(unittest.TestCase): - - def test_taggedValues(self): - """Test that we can update tagged values of more than one element - """ - - e1 = Element("foo") - e2 = Element("bar") - e1.setTaggedValue("x", 1) - e2.setTaggedValue("x", 2) - self.assertEqual(e1.getTaggedValue("x"), 1) - self.assertEqual(e2.getTaggedValue("x"), 2) - - -def test_suite(): - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(TestElement)) - return suite - - -if __name__ == '__main__': - unittest.main(defaultTest='test_suite') diff --git a/zope/interface/tests/test_exceptions.py b/zope/interface/tests/test_exceptions.py deleted file mode 100644 index 94009f6f..00000000 --- a/zope/interface/tests/test_exceptions.py +++ /dev/null @@ -1,75 +0,0 @@ -############################################################################## -# -# Copyright (c) 2010 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -""" zope.interface.exceptions unit tests -""" -import unittest - -def _makeIface(): - from zope.interface import Interface - class IDummy(Interface): - pass - return IDummy - -class DoesNotImplementTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.interface.exceptions import DoesNotImplement - return DoesNotImplement - - def _makeOne(self, iface=None): - if iface is None: - iface = _makeIface() - return self._getTargetClass()(iface) - - def test___str__(self): - dni = self._makeOne() - # XXX The trailing newlines and blank spaces are a stupid artifact. - self.assertEqual(str(dni), - 'An object does not implement interface \n\n ') - -class BrokenImplementationTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.interface.exceptions import BrokenImplementation - return BrokenImplementation - - def _makeOne(self, iface=None, name='missing'): - if iface is None: - iface = _makeIface() - return self._getTargetClass()(iface, name) - - def test___str__(self): - dni = self._makeOne() - # XXX The trailing newlines and blank spaces are a stupid artifact. - self.assertEqual(str(dni), - 'An object has failed to implement interface \n\n' - ' The missing attribute was not provided.\n ') - -class BrokenMethodImplementationTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.interface.exceptions import BrokenMethodImplementation - return BrokenMethodImplementation - - def _makeOne(self, method='aMethod', mess='I said so'): - return self._getTargetClass()(method, mess) - - def test___str__(self): - dni = self._makeOne() - self.assertEqual(str(dni), - 'The implementation of aMethod violates its contract\n' - ' because I said so.\n ') - diff --git a/zope/interface/tests/test_interface.py b/zope/interface/tests/test_interface.py deleted file mode 100644 index 92cda82f..00000000 --- a/zope/interface/tests/test_interface.py +++ /dev/null @@ -1,2089 +0,0 @@ -############################################################################## -# -# Copyright (c) 2001, 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Test Interface implementation -""" -import unittest - -_marker = object() - -class _SilencePy3Deprecations(unittest.TestCase): - # silence deprecation warnings under py3 - - def failUnless(self, expr): - # St00pid speling. - return self.assertTrue(expr) - - def failIf(self, expr): - # St00pid speling. - return self.assertFalse(expr) - - -class Test_invariant(unittest.TestCase): - - def test_w_single(self): - from zope.interface.interface import invariant - from zope.interface.interface import TAGGED_DATA - - def _check(*args, **kw): - pass - - class Foo(object): - invariant(_check) - - self.assertEqual(getattr(Foo, TAGGED_DATA, None), - {'invariants': [_check]}) - - def test_w_multiple(self): - from zope.interface.interface import invariant - from zope.interface.interface import TAGGED_DATA - - def _check(*args, **kw): - pass - - def _another_check(*args, **kw): - pass - - class Foo(object): - invariant(_check) - invariant(_another_check) - - self.assertEqual(getattr(Foo, TAGGED_DATA, None), - {'invariants': [_check, _another_check]}) - - -class Test_taggedValue(unittest.TestCase): - - def test_w_single(self): - from zope.interface.interface import taggedValue - from zope.interface.interface import TAGGED_DATA - - class Foo(object): - taggedValue('bar', ['baz']) - - self.assertEqual(getattr(Foo, TAGGED_DATA, None), - {'bar': ['baz']}) - - def test_w_multiple(self): - from zope.interface.interface import taggedValue - from zope.interface.interface import TAGGED_DATA - - class Foo(object): - taggedValue('bar', ['baz']) - taggedValue('qux', 'spam') - - self.assertEqual(getattr(Foo, TAGGED_DATA, None), - {'bar': ['baz'], 'qux': 'spam'}) - - def test_w_multiple_overwriting(self): - from zope.interface.interface import taggedValue - from zope.interface.interface import TAGGED_DATA - - class Foo(object): - taggedValue('bar', ['baz']) - taggedValue('qux', 'spam') - taggedValue('bar', 'frob') - - self.assertEqual(getattr(Foo, TAGGED_DATA, None), - {'bar': 'frob', 'qux': 'spam'}) - - -class ElementTests(unittest.TestCase): - - DEFAULT_NAME = 'AnElement' - - def _getTargetClass(self): - from zope.interface.interface import Element - return Element - - def _makeOne(self, name=None, __doc__=_marker): - if name is None: - name = self.DEFAULT_NAME - if __doc__ is _marker: - return self._getTargetClass()(name) - return self._getTargetClass()(name, __doc__) - - def test_ctor_defaults(self): - element = self._makeOne() - self.assertEqual(element.__name__, self.DEFAULT_NAME) - self.assertEqual(element.getName(), self.DEFAULT_NAME) - self.assertEqual(element.__doc__, '') - self.assertEqual(element.getDoc(), '') - self.assertEqual(list(element.getTaggedValueTags()), []) - - def test_ctor_no_doc_space_in_name(self): - element = self._makeOne('An Element') - self.assertEqual(element.__name__, None) - self.assertEqual(element.__doc__, 'An Element') - - def test_getTaggedValue_miss(self): - element = self._makeOne() - self.assertRaises(KeyError, element.getTaggedValue, 'nonesuch') - - def test_queryTaggedValue_miss(self): - element = self._makeOne() - self.assertEqual(element.queryTaggedValue('nonesuch'), None) - - def test_queryTaggedValue_miss_w_default(self): - element = self._makeOne() - self.assertEqual(element.queryTaggedValue('nonesuch', 'bar'), 'bar') - - def test_setTaggedValue(self): - element = self._makeOne() - element.setTaggedValue('foo', 'bar') - self.assertEqual(list(element.getTaggedValueTags()), ['foo']) - self.assertEqual(element.getTaggedValue('foo'), 'bar') - self.assertEqual(element.queryTaggedValue('foo'), 'bar') - - -class SpecificationBasePyTests(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.interface import SpecificationBasePy - return SpecificationBasePy - - def _makeOne(self): - return self._getTargetClass()() - - def test_providedBy_miss(self): - from zope.interface import interface - from zope.interface.declarations import _empty - sb = self._makeOne() - def _providedBy(obj): - return _empty - with _Monkey(interface, providedBy=_providedBy): - self.failIf(sb.providedBy(object())) - - def test_providedBy_hit(self): - from zope.interface import interface - sb = self._makeOne() - class _Decl(object): - _implied = {sb: {},} - def _providedBy(obj): - return _Decl() - with _Monkey(interface, providedBy=_providedBy): - self.failUnless(sb.providedBy(object())) - - def test_implementedBy_miss(self): - from zope.interface import interface - from zope.interface.declarations import _empty - sb = self._makeOne() - def _implementedBy(obj): - return _empty - with _Monkey(interface, implementedBy=_implementedBy): - self.failIf(sb.implementedBy(object())) - - def test_implementedBy_hit(self): - from zope.interface import interface - sb = self._makeOne() - class _Decl(object): - _implied = {sb: {},} - def _implementedBy(obj): - return _Decl() - with _Monkey(interface, implementedBy=_implementedBy): - self.failUnless(sb.implementedBy(object())) - - def test_isOrExtends_miss(self): - sb = self._makeOne() - sb._implied = {} # not defined by SpecificationBasePy - self.failIf(sb.isOrExtends(object())) - - def test_isOrExtends_hit(self): - sb = self._makeOne() - testing = object() - sb._implied = {testing: {}} # not defined by SpecificationBasePy - self.failUnless(sb(testing)) - - def test___call___miss(self): - sb = self._makeOne() - sb._implied = {} # not defined by SpecificationBasePy - self.failIf(sb.isOrExtends(object())) - - def test___call___hit(self): - sb = self._makeOne() - testing = object() - sb._implied = {testing: {}} # not defined by SpecificationBasePy - self.failUnless(sb(testing)) - - -class InterfaceBasePyTests(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.interface import InterfaceBasePy - return InterfaceBasePy - - def _makeOne(self, object_should_provide): - class IB(self._getTargetClass()): - def _call_conform(self, conform): - return conform(self) - def providedBy(self, obj): - return object_should_provide - return IB() - - def test___call___w___conform___returning_value(self): - ib = self._makeOne(False) - conformed = object() - class _Adapted(object): - def __conform__(self, iface): - return conformed - self.failUnless(ib(_Adapted()) is conformed) - - def test___call___w___conform___miss_ob_provides(self): - ib = self._makeOne(True) - class _Adapted(object): - def __conform__(self, iface): - return None - adapted = _Adapted() - self.failUnless(ib(adapted) is adapted) - - def test___call___wo___conform___ob_no_provides_w_alternate(self): - ib = self._makeOne(False) - adapted = object() - alternate = object() - self.failUnless(ib(adapted, alternate) is alternate) - - def test___call___w___conform___ob_no_provides_wo_alternate(self): - ib = self._makeOne(False) - adapted = object() - self.assertRaises(TypeError, ib, adapted) - - def test___adapt___ob_provides(self): - ib = self._makeOne(True) - adapted = object() - self.failUnless(ib.__adapt__(adapted) is adapted) - - def test___adapt___ob_no_provides_uses_hooks(self): - from zope.interface import interface - ib = self._makeOne(False) - adapted = object() - _missed = [] - def _hook_miss(iface, obj): - _missed.append((iface, obj)) - return None - def _hook_hit(iface, obj): - return obj - with _Monkey(interface, adapter_hooks=[_hook_miss, _hook_hit]): - self.failUnless(ib.__adapt__(adapted) is adapted) - self.assertEqual(_missed, [(ib, adapted)]) - - -class SpecificationTests(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.interface import Specification - return Specification - - def _makeOne(self, bases=_marker): - if bases is _marker: - return self._getTargetClass()() - return self._getTargetClass()(bases) - - def test_ctor(self): - from zope.interface.interface import Interface - spec = self._makeOne() - self.assertEqual(spec.__bases__, ()) - self.assertEqual(len(spec._implied), 2) - self.failUnless(spec in spec._implied) - self.failUnless(Interface in spec._implied) - self.assertEqual(len(spec.dependents), 0) - - def test_subscribe_first_time(self): - spec = self._makeOne() - dep = DummyDependent() - spec.subscribe(dep) - self.assertEqual(len(spec.dependents), 1) - self.assertEqual(spec.dependents[dep], 1) - - def test_subscribe_again(self): - spec = self._makeOne() - dep = DummyDependent() - spec.subscribe(dep) - spec.subscribe(dep) - self.assertEqual(spec.dependents[dep], 2) - - def test_unsubscribe_miss(self): - spec = self._makeOne() - dep = DummyDependent() - self.assertRaises(KeyError, spec.unsubscribe, dep) - - def test_unsubscribe(self): - spec = self._makeOne() - dep = DummyDependent() - spec.subscribe(dep) - spec.subscribe(dep) - spec.unsubscribe(dep) - self.assertEqual(spec.dependents[dep], 1) - spec.unsubscribe(dep) - self.failIf(dep in spec.dependents) - - def test___setBases_subscribes_bases_and_notifies_dependents(self): - from zope.interface.interface import Interface - spec = self._makeOne() - dep = DummyDependent() - spec.subscribe(dep) - class I(Interface): - pass - class J(Interface): - pass - spec.__bases__ = (I,) - self.assertEqual(dep._changed, [spec]) - self.assertEqual(I.dependents[spec], 1) - spec.__bases__ = (J,) - self.assertEqual(I.dependents.get(spec), None) - self.assertEqual(J.dependents[spec], 1) - - def test_changed_clears_volatiles_and_implied(self): - from zope.interface.interface import Interface - class I(Interface): - pass - spec = self._makeOne() - spec._v_attrs = 'Foo' - spec._implied[I] = () - spec.changed(spec) - self.failUnless(getattr(spec, '_v_attrs', self) is self) - self.failIf(I in spec._implied) - - -class InterfaceClassTests(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.interface import InterfaceClass - return InterfaceClass - - def _makeOne(self, name='ITest', bases=(), attrs=None, __doc__=None, - __module__=None): - return self._getTargetClass()(name, bases, attrs, __doc__, __module__) - - def test_ctor_defaults(self): - klass = self._getTargetClass() - inst = klass('ITesting') - self.assertEqual(inst.__name__, 'ITesting') - self.assertEqual(inst.__doc__, '') - self.assertEqual(inst.__bases__, ()) - self.assertEqual(inst.getBases(), ()) - - def test_ctor_bad_bases(self): - klass = self._getTargetClass() - self.assertRaises(TypeError, klass, 'ITesting', (object(),)) - - def test_ctor_w_attrs_attrib_methods(self): - from zope.interface.interface import Attribute - from zope.interface.interface import fromFunction - def _bar(): - """DOCSTRING""" - ATTRS = {'foo': Attribute('Foo', ''), - 'bar': fromFunction(_bar), - } - klass = self._getTargetClass() - inst = klass('ITesting', attrs=ATTRS) - self.assertEqual(inst.__name__, 'ITesting') - self.assertEqual(inst.__doc__, '') - self.assertEqual(inst.__bases__, ()) - self.assertEqual(inst.names(), ATTRS.keys()) - - def test_ctor_attrs_w___locals__(self): - ATTRS = {'__locals__': {}} - klass = self._getTargetClass() - inst = klass('ITesting', attrs=ATTRS) - self.assertEqual(inst.__name__, 'ITesting') - self.assertEqual(inst.__doc__, '') - self.assertEqual(inst.__bases__, ()) - self.assertEqual(inst.names(), ATTRS.keys()) - - def test_ctor_attrs_w__decorator_non_return(self): - from zope.interface.interface import _decorator_non_return - ATTRS = {'dropme': _decorator_non_return} - klass = self._getTargetClass() - inst = klass('ITesting', attrs=ATTRS) - self.assertEqual(inst.__name__, 'ITesting') - self.assertEqual(inst.__doc__, '') - self.assertEqual(inst.__bases__, ()) - self.assertEqual(list(inst.names()), []) - - def test_ctor_attrs_w_invalide_attr_type(self): - from zope.interface.exceptions import InvalidInterface - ATTRS = {'invalid': object()} - klass = self._getTargetClass() - self.assertRaises(InvalidInterface, klass, 'ITesting', attrs=ATTRS) - - def test_interfaces(self): - iface = self._makeOne() - self.assertEqual(list(iface.interfaces()), [iface]) - - def test_getBases(self): - iface = self._makeOne() - sub = self._makeOne('ISub', bases=(iface,)) - self.assertEqual(sub.getBases(), (iface,)) - - def test_isEqualOrExtendedBy_identity(self): - iface = self._makeOne() - self.failUnless(iface.isEqualOrExtendedBy(iface)) - - def test_isEqualOrExtendedBy_subiface(self): - iface = self._makeOne() - sub = self._makeOne('ISub', bases=(iface,)) - self.failUnless(iface.isEqualOrExtendedBy(sub)) - self.failIf(sub.isEqualOrExtendedBy(iface)) - - def test_isEqualOrExtendedBy_unrelated(self): - one = self._makeOne('One') - another = self._makeOne('Another') - self.failIf(one.isEqualOrExtendedBy(another)) - self.failIf(another.isEqualOrExtendedBy(one)) - - def test_names_w_all_False_ignores_bases(self): - from zope.interface.interface import Attribute - from zope.interface.interface import fromFunction - def _bar(): - """DOCSTRING""" - BASE_ATTRS = {'foo': Attribute('Foo', ''), - 'bar': fromFunction(_bar), - } - DERIVED_ATTRS = {'baz': Attribute('Baz', ''), - } - base = self._makeOne('IBase', attrs=BASE_ATTRS) - derived = self._makeOne('IDerived', bases=(base,), attrs=DERIVED_ATTRS) - self.assertEqual(sorted(derived.names(all=False)), ['baz']) - - def test_names_w_all_True_no_bases(self): - from zope.interface.interface import Attribute - from zope.interface.interface import fromFunction - def _bar(): - """DOCSTRING""" - ATTRS = {'foo': Attribute('Foo', ''), - 'bar': fromFunction(_bar), - } - one = self._makeOne(attrs=ATTRS) - self.assertEqual(sorted(one.names(all=True)), ['bar', 'foo']) - - def test_names_w_all_True_w_bases_simple(self): - from zope.interface.interface import Attribute - from zope.interface.interface import fromFunction - def _bar(): - """DOCSTRING""" - BASE_ATTRS = {'foo': Attribute('Foo', ''), - 'bar': fromFunction(_bar), - } - DERIVED_ATTRS = {'baz': Attribute('Baz', ''), - } - base = self._makeOne('IBase', attrs=BASE_ATTRS) - derived = self._makeOne('IDerived', bases=(base,), attrs=DERIVED_ATTRS) - self.assertEqual(sorted(derived.names(all=True)), ['bar', 'baz', 'foo']) - - def test_names_w_all_True_bases_w_same_names(self): - from zope.interface.interface import Attribute - from zope.interface.interface import fromFunction - def _bar(): - """DOCSTRING""" - def _foo(): - """DOCSTRING""" - BASE_ATTRS = {'foo': Attribute('Foo', ''), - 'bar': fromFunction(_bar), - } - DERIVED_ATTRS = {'foo': fromFunction(_foo), - 'baz': Attribute('Baz', ''), - } - base = self._makeOne('IBase', attrs=BASE_ATTRS) - derived = self._makeOne('IDerived', bases=(base,), attrs=DERIVED_ATTRS) - self.assertEqual(sorted(derived.names(all=True)), ['bar', 'baz', 'foo']) - - def test___iter__(self): - from zope.interface.interface import Attribute - from zope.interface.interface import fromFunction - def _bar(): - """DOCSTRING""" - def _foo(): - """DOCSTRING""" - BASE_ATTRS = {'foo': Attribute('Foo', ''), - 'bar': fromFunction(_bar), - } - DERIVED_ATTRS = {'foo': fromFunction(_foo), - 'baz': Attribute('Baz', ''), - } - base = self._makeOne('IBase', attrs=BASE_ATTRS) - derived = self._makeOne('IDerived', bases=(base,), attrs=DERIVED_ATTRS) - self.assertEqual(sorted(derived), ['bar', 'baz', 'foo']) - - def test_namesAndDescriptions_w_all_False_ignores_bases(self): - from zope.interface.interface import Attribute - from zope.interface.interface import fromFunction - def _bar(): - """DOCSTRING""" - BASE_ATTRS = {'foo': Attribute('Foo', ''), - 'bar': fromFunction(_bar), - } - DERIVED_ATTRS = {'baz': Attribute('Baz', ''), - } - base = self._makeOne('IBase', attrs=BASE_ATTRS) - derived = self._makeOne('IDerived', bases=(base,), attrs=DERIVED_ATTRS) - self.assertEqual(sorted(derived.namesAndDescriptions(all=False)), - [('baz', DERIVED_ATTRS['baz']), - ]) - - def test_namesAndDescriptions_w_all_True_no_bases(self): - from zope.interface.interface import Attribute - from zope.interface.interface import fromFunction - def _bar(): - """DOCSTRING""" - ATTRS = {'foo': Attribute('Foo', ''), - 'bar': fromFunction(_bar), - } - one = self._makeOne(attrs=ATTRS) - self.assertEqual(sorted(one.namesAndDescriptions(all=False)), - [('bar', ATTRS['bar']), - ('foo', ATTRS['foo']), - ]) - - def test_namesAndDescriptions_w_all_True_simple(self): - from zope.interface.interface import Attribute - from zope.interface.interface import fromFunction - def _bar(): - """DOCSTRING""" - BASE_ATTRS = {'foo': Attribute('Foo', ''), - 'bar': fromFunction(_bar), - } - DERIVED_ATTRS = {'baz': Attribute('Baz', ''), - } - base = self._makeOne('IBase', attrs=BASE_ATTRS) - derived = self._makeOne('IDerived', bases=(base,), attrs=DERIVED_ATTRS) - self.assertEqual(sorted(derived.namesAndDescriptions(all=True)), - [('bar', BASE_ATTRS['bar']), - ('baz', DERIVED_ATTRS['baz']), - ('foo', BASE_ATTRS['foo']), - ]) - - def test_namesAndDescriptions_w_all_True_bases_w_same_names(self): - from zope.interface.interface import Attribute - from zope.interface.interface import fromFunction - def _bar(): - """DOCSTRING""" - def _foo(): - """DOCSTRING""" - BASE_ATTRS = {'foo': Attribute('Foo', ''), - 'bar': fromFunction(_bar), - } - DERIVED_ATTRS = {'foo': fromFunction(_foo), - 'baz': Attribute('Baz', ''), - } - base = self._makeOne('IBase', attrs=BASE_ATTRS) - derived = self._makeOne('IDerived', bases=(base,), attrs=DERIVED_ATTRS) - self.assertEqual(sorted(derived.namesAndDescriptions(all=True)), - [('bar', BASE_ATTRS['bar']), - ('baz', DERIVED_ATTRS['baz']), - ('foo', DERIVED_ATTRS['foo']), - ]) - - def test_getDescriptionFor_miss(self): - one = self._makeOne() - self.assertRaises(KeyError, one.getDescriptionFor, 'nonesuch') - - def test_getDescriptionFor_hit(self): - from zope.interface.interface import Attribute - from zope.interface.interface import fromFunction - def _bar(): - """DOCSTRING""" - ATTRS = {'foo': Attribute('Foo', ''), - 'bar': fromFunction(_bar), - } - one = self._makeOne(attrs=ATTRS) - self.assertEqual(one.getDescriptionFor('foo'), ATTRS['foo']) - self.assertEqual(one.getDescriptionFor('bar'), ATTRS['bar']) - - def test___getitem___miss(self): - one = self._makeOne() - def _test(): - return one['nonesuch'] - self.assertRaises(KeyError, _test) - - def test___getitem___hit(self): - from zope.interface.interface import Attribute - from zope.interface.interface import fromFunction - def _bar(): - """DOCSTRING""" - ATTRS = {'foo': Attribute('Foo', ''), - 'bar': fromFunction(_bar), - } - one = self._makeOne(attrs=ATTRS) - self.assertEqual(one['foo'], ATTRS['foo']) - self.assertEqual(one['bar'], ATTRS['bar']) - - def test___contains___miss(self): - one = self._makeOne() - self.failIf('nonesuch' in one) - - def test___contains___hit(self): - from zope.interface.interface import Attribute - from zope.interface.interface import fromFunction - def _bar(): - """DOCSTRING""" - ATTRS = {'foo': Attribute('Foo', ''), - 'bar': fromFunction(_bar), - } - one = self._makeOne(attrs=ATTRS) - self.failUnless('foo' in one) - self.failUnless('bar' in one) - - def test_direct_miss(self): - one = self._makeOne() - self.assertEqual(one.direct('nonesuch'), None) - - def test_direct_hit_local_miss_bases(self): - from zope.interface.interface import Attribute - from zope.interface.interface import fromFunction - def _bar(): - """DOCSTRING""" - def _foo(): - """DOCSTRING""" - BASE_ATTRS = {'foo': Attribute('Foo', ''), - 'bar': fromFunction(_bar), - } - DERIVED_ATTRS = {'foo': fromFunction(_foo), - 'baz': Attribute('Baz', ''), - } - base = self._makeOne('IBase', attrs=BASE_ATTRS) - derived = self._makeOne('IDerived', bases=(base,), attrs=DERIVED_ATTRS) - self.assertEqual(derived.direct('foo'), DERIVED_ATTRS['foo']) - self.assertEqual(derived.direct('baz'), DERIVED_ATTRS['baz']) - self.assertEqual(derived.direct('bar'), None) - - def test_queryDescriptionFor_miss(self): - iface = self._makeOne() - self.assertEqual(iface.queryDescriptionFor('nonesuch'), None) - - def test_queryDescriptionFor_hit(self): - from zope.interface import Attribute - ATTRS = {'attr': Attribute('Title', 'Description')} - iface = self._makeOne(attrs=ATTRS) - self.assertEqual(iface.queryDescriptionFor('attr'), ATTRS['attr']) - - - #TODO (or not: 'deferred' looks like a fossil to me. - #def test_deferred_cache_hit(self): - #def test_deferred_cache_miss(self): - #def test_deferred_cache_miss_w_bases(self): - - def test_validateInvariants_pass(self): - _called_with = [] - def _passable(*args, **kw): - _called_with.append((args, kw)) - return True - iface = self._makeOne() - obj = object() - iface.setTaggedValue('invariants', [_passable]) - self.assertEqual(iface.validateInvariants(obj), None) - self.assertEqual(_called_with, [((obj,), {})]) - - def test_validateInvariants_fail_wo_errors_passed(self): - from zope.interface.exceptions import Invalid - _passable_called_with = [] - def _passable(*args, **kw): - _passable_called_with.append((args, kw)) - return True - _fail_called_with = [] - def _fail(*args, **kw): - _fail_called_with.append((args, kw)) - raise Invalid - iface = self._makeOne() - obj = object() - iface.setTaggedValue('invariants', [_passable, _fail]) - self.assertRaises(Invalid, iface.validateInvariants, obj) - self.assertEqual(_passable_called_with, [((obj,), {})]) - self.assertEqual(_fail_called_with, [((obj,), {})]) - - def test_validateInvariants_fail_w_errors_passed(self): - from zope.interface.exceptions import Invalid - _errors = [] - _fail_called_with = [] - def _fail(*args, **kw): - _fail_called_with.append((args, kw)) - raise Invalid - iface = self._makeOne() - obj = object() - iface.setTaggedValue('invariants', [_fail]) - self.assertRaises(Invalid, iface.validateInvariants, obj, _errors) - self.assertEqual(_fail_called_with, [((obj,), {})]) - self.assertEqual(len(_errors), 1) - self.failUnless(isinstance(_errors[0], Invalid)) - - def test_validateInvariants_fail_in_base_wo_errors_passed(self): - from zope.interface.exceptions import Invalid - _passable_called_with = [] - def _passable(*args, **kw): - _passable_called_with.append((args, kw)) - return True - _fail_called_with = [] - def _fail(*args, **kw): - _fail_called_with.append((args, kw)) - raise Invalid - base = self._makeOne('IBase') - derived = self._makeOne('IDerived', (base,)) - obj = object() - base.setTaggedValue('invariants', [_fail]) - derived.setTaggedValue('invariants', [_passable]) - self.assertRaises(Invalid, derived.validateInvariants, obj) - self.assertEqual(_passable_called_with, [((obj,), {})]) - self.assertEqual(_fail_called_with, [((obj,), {})]) - - #TODO - def test_validateInvariants_fail_in_base_w_errors_passed(self): - from zope.interface.exceptions import Invalid - _errors = [] - _passable_called_with = [] - def _passable(*args, **kw): - _passable_called_with.append((args, kw)) - return True - _fail_called_with = [] - def _fail(*args, **kw): - _fail_called_with.append((args, kw)) - raise Invalid - base = self._makeOne('IBase') - derived = self._makeOne('IDerived', (base,)) - obj = object() - base.setTaggedValue('invariants', [_fail]) - derived.setTaggedValue('invariants', [_passable]) - self.assertRaises(Invalid, derived.validateInvariants, obj, _errors) - self.assertEqual(_passable_called_with, [((obj,), {})]) - self.assertEqual(_fail_called_with, [((obj,), {})]) - self.assertEqual(len(_errors), 1) - self.failUnless(isinstance(_errors[0], Invalid)) - - def test___reduce__(self): - iface = self._makeOne('PickleMe') - self.assertEqual(iface.__reduce__(), 'PickleMe') - - def test___hash___normal(self): - iface = self._makeOne('HashMe') - self.assertEqual(hash(iface), - hash((('HashMe', - 'zope.interface.tests.test_interface')))) - - def test___hash___missing_required_attrs(self): - import warnings - try: - from warnings import catch_warnings - except ImportError: # Python 2.5 - return - class Derived(self._getTargetClass()): - def __init__(self): - pass # Don't call base class. - derived = Derived() - with catch_warnings(record=True) as warned: - warnings.simplefilter('always') # see LP #825249 - self.assertEqual(hash(derived), 1) - self.assertEqual(len(warned), 1) - self.failUnless(warned[0].category is UserWarning) - self.assertEqual(str(warned[0].message), - 'Hashing uninitialized InterfaceClass instance') - - def test_comparison_with_None(self): - iface = self._makeOne() - self.failUnless(iface < None) - self.failUnless(iface <= None) - self.failIf(iface == None) - self.failUnless(iface != None) - self.failIf(iface >= None) - self.failIf(iface > None) - - self.failIf(None < iface) - self.failIf(None <= iface) - self.failIf(None == iface) - self.failUnless(None != iface) - self.failUnless(None >= iface) - self.failUnless(None > iface) - - def test_comparison_with_same_instance(self): - iface = self._makeOne() - - self.failIf(iface < iface) - self.failUnless(iface <= iface) - self.failUnless(iface == iface) - self.failIf(iface != iface) - self.failUnless(iface >= iface) - self.failIf(iface > iface) - - def test_comparison_with_same_named_instance_in_other_module(self): - - one = self._makeOne('IName', __module__='zope.interface.tests.one') - other = self._makeOne('IName', __module__='zope.interface.tests.other') - - self.failUnless(one < other) - self.failIf(other < one) - self.failUnless(one <= other) - self.failIf(other <= one) - self.failIf(one == other) - self.failIf(other == one) - self.failUnless(one != other) - self.failUnless(other != one) - self.failIf(one >= other) - self.failUnless(other >= one) - self.failIf(one > other) - self.failUnless(other > one) - - -class InterfaceTests(_SilencePy3Deprecations): - - def test_attributes_link_to_interface(self): - from zope.interface import Interface - from zope.interface import Attribute - - class I1(Interface): - attr = Attribute("My attr") - - self.failUnless(I1['attr'].interface is I1) - - def test_methods_link_to_interface(self): - from zope.interface import Interface - - class I1(Interface): - - def method(foo, bar, bingo): - pass - - self.failUnless(I1['method'].interface is I1) - - def test_classImplements_simple(self): - from zope.interface import Interface - from zope.interface import implementedBy - from zope.interface import providedBy - - class ICurrent(Interface): - def method1(a, b): - pass - def method2(a, b): - pass - - class IOther(Interface): - pass - - class Current(object): - __implemented__ = ICurrent - def method1(self, a, b): - return 1 - def method2(self, a, b): - return 2 - - current = Current() - - self.failUnless(ICurrent.implementedBy(Current)) - self.failIf(IOther.implementedBy(Current)) - self.failUnless(ICurrent in implementedBy(Current)) - self.failIf(IOther in implementedBy(Current)) - self.failUnless(ICurrent in providedBy(current)) - self.failIf(IOther in providedBy(current)) - - def test_classImplements_base_not_derived(self): - from zope.interface import Interface - from zope.interface import implementedBy - from zope.interface import providedBy - class IBase(Interface): - def method(): - pass - class IDerived(IBase): - pass - class Current(): - __implemented__ = IBase - def method(self): - pass - current = Current() - - self.failUnless(IBase.implementedBy(Current)) - self.failIf(IDerived.implementedBy(Current)) - self.failUnless(IBase in implementedBy(Current)) - self.failIf(IDerived in implementedBy(Current)) - self.failUnless(IBase in providedBy(current)) - self.failIf(IDerived in providedBy(current)) - - def test_classImplements_base_and_derived(self): - from zope.interface import Interface - from zope.interface import implementedBy - from zope.interface import providedBy - - class IBase(Interface): - def method(): - pass - - class IDerived(IBase): - pass - - class Current(object): - __implemented__ = IDerived - def method(self): - pass - - current = Current() - - self.failUnless(IBase.implementedBy(Current)) - self.failUnless(IDerived.implementedBy(Current)) - self.failIf(IBase in implementedBy(Current)) - self.failUnless(IBase in implementedBy(Current).flattened()) - self.failUnless(IDerived in implementedBy(Current)) - self.failIf(IBase in providedBy(current)) - self.failUnless(IBase in providedBy(current).flattened()) - self.failUnless(IDerived in providedBy(current)) - - def test_classImplements_multiple(self): - from zope.interface import Interface - from zope.interface import implementedBy - from zope.interface import providedBy - - class ILeft(Interface): - def method(): - pass - - class IRight(ILeft): - pass - - class Left(object): - __implemented__ = ILeft - - def method(self): - pass - - class Right(object): - __implemented__ = IRight - - class Ambi(Left, Right): - pass - - ambi = Ambi() - - self.failUnless(ILeft.implementedBy(Ambi)) - self.failUnless(IRight.implementedBy(Ambi)) - self.failUnless(ILeft in implementedBy(Ambi)) - self.failUnless(IRight in implementedBy(Ambi)) - self.failUnless(ILeft in providedBy(ambi)) - self.failUnless(IRight in providedBy(ambi)) - - def test_classImplements_multiple_w_explict_implements(self): - from zope.interface import Interface - from zope.interface import implementedBy - from zope.interface import providedBy - - class ILeft(Interface): - - def method(): - pass - - class IRight(ILeft): - pass - - class IOther(Interface): - pass - - class Left(): - __implemented__ = ILeft - - def method(self): - pass - - class Right(object): - __implemented__ = IRight - - class Other(object): - __implemented__ = IOther - - class Mixed(Left, Right): - __implemented__ = Left.__implemented__, Other.__implemented__ - - mixed = Mixed() - - self.failUnless(ILeft.implementedBy(Mixed)) - self.failIf(IRight.implementedBy(Mixed)) - self.failUnless(IOther.implementedBy(Mixed)) - self.failUnless(ILeft in implementedBy(Mixed)) - self.failIf(IRight in implementedBy(Mixed)) - self.failUnless(IOther in implementedBy(Mixed)) - self.failUnless(ILeft in providedBy(mixed)) - self.failIf(IRight in providedBy(mixed)) - self.failUnless(IOther in providedBy(mixed)) - - def test_interface_deferred_class_method_broken(self): - from zope.interface import Interface - from zope.interface.exceptions import BrokenImplementation - - class IDeferring(Interface): - def method(): - pass - - class Deferring(IDeferring.deferred()): - __implemented__ = IDeferring - - deferring = Deferring() - - self.assertRaises(BrokenImplementation, deferring.method) - - def testInterfaceExtendsInterface(self): - from zope.interface import Interface - - new = Interface.__class__ - FunInterface = new('FunInterface') - BarInterface = new('BarInterface', [FunInterface]) - BobInterface = new('BobInterface') - BazInterface = new('BazInterface', [BobInterface, BarInterface]) - - self.failUnless(BazInterface.extends(BobInterface)) - self.failUnless(BazInterface.extends(BarInterface)) - self.failUnless(BazInterface.extends(FunInterface)) - self.failIf(BobInterface.extends(FunInterface)) - self.failIf(BobInterface.extends(BarInterface)) - self.failUnless(BarInterface.extends(FunInterface)) - self.failIf(BarInterface.extends(BazInterface)) - - def test_verifyClass(self): - from zope.interface import Attribute - from zope.interface import Interface - from zope.interface.verify import verifyClass - from zope.interface._compat import _u - - class ICheckMe(Interface): - attr = Attribute(_u('My attr')) - - def method(): - pass - - class CheckMe(object): - __implemented__ = ICheckMe - attr = 'value' - - def method(self): - pass - - self.failUnless(verifyClass(ICheckMe, CheckMe)) - - def test_verifyObject(self): - from zope.interface import Attribute - from zope.interface import Interface - from zope.interface.verify import verifyObject - from zope.interface._compat import _u - - class ICheckMe(Interface): - attr = Attribute(_u('My attr')) - - def method(): - pass - - class CheckMe(object): - __implemented__ = ICheckMe - attr = 'value' - - def method(self): - pass - - check_me = CheckMe() - - self.failUnless(verifyObject(ICheckMe, check_me)) - - def test_interface_object_provides_Interface(self): - from zope.interface import Interface - - class AnInterface(Interface): - pass - - self.failUnless(Interface.providedBy(AnInterface)) - - def test_names_simple(self): - from zope.interface import Attribute - from zope.interface import Interface - from zope.interface._compat import _u - - class ISimple(Interface): - attr = Attribute(_u('My attr')) - - def method(): - pass - - self.assertEqual(sorted(ISimple.names()), ['attr', 'method']) - - def test_names_derived(self): - from zope.interface import Attribute - from zope.interface import Interface - from zope.interface._compat import _u - - class IBase(Interface): - attr = Attribute(_u('My attr')) - - def method(): - pass - - class IDerived(IBase): - attr2 = Attribute(_u('My attr2')) - - def method(): - pass - - def method2(): - pass - - self.assertEqual(sorted(IDerived.names()), - ['attr2', 'method', 'method2']) - self.assertEqual(sorted(IDerived.names(all=True)), - ['attr', 'attr2', 'method', 'method2']) - - def test_namesAndDescriptions_simple(self): - from zope.interface import Attribute - from zope.interface.interface import Method - from zope.interface import Interface - from zope.interface._compat import _u - - class ISimple(Interface): - attr = Attribute(_u('My attr')) - - def method(): - "My method" - - name_values = sorted(ISimple.namesAndDescriptions()) - - self.assertEqual(len(name_values), 2) - self.assertEqual(name_values[0][0], 'attr') - self.failUnless(isinstance(name_values[0][1], Attribute)) - self.assertEqual(name_values[0][1].__name__, 'attr') - self.assertEqual(name_values[0][1].__doc__, 'My attr') - self.assertEqual(name_values[1][0], 'method') - self.failUnless(isinstance(name_values[1][1], Method)) - self.assertEqual(name_values[1][1].__name__, 'method') - self.assertEqual(name_values[1][1].__doc__, 'My method') - - def test_namesAndDescriptions_derived(self): - from zope.interface import Attribute - from zope.interface import Interface - from zope.interface.interface import Method - from zope.interface._compat import _u - - class IBase(Interface): - attr = Attribute(_u('My attr')) - - def method(): - "My method" - - class IDerived(IBase): - attr2 = Attribute(_u('My attr2')) - - def method(): - "My method, overridden" - - def method2(): - "My method2" - - name_values = sorted(IDerived.namesAndDescriptions()) - - self.assertEqual(len(name_values), 3) - self.assertEqual(name_values[0][0], 'attr2') - self.failUnless(isinstance(name_values[0][1], Attribute)) - self.assertEqual(name_values[0][1].__name__, 'attr2') - self.assertEqual(name_values[0][1].__doc__, 'My attr2') - self.assertEqual(name_values[1][0], 'method') - self.failUnless(isinstance(name_values[1][1], Method)) - self.assertEqual(name_values[1][1].__name__, 'method') - self.assertEqual(name_values[1][1].__doc__, 'My method, overridden') - self.assertEqual(name_values[2][0], 'method2') - self.failUnless(isinstance(name_values[2][1], Method)) - self.assertEqual(name_values[2][1].__name__, 'method2') - self.assertEqual(name_values[2][1].__doc__, 'My method2') - - name_values = sorted(IDerived.namesAndDescriptions(all=True)) - - self.assertEqual(len(name_values), 4) - self.assertEqual(name_values[0][0], 'attr') - self.failUnless(isinstance(name_values[0][1], Attribute)) - self.assertEqual(name_values[0][1].__name__, 'attr') - self.assertEqual(name_values[0][1].__doc__, 'My attr') - self.assertEqual(name_values[1][0], 'attr2') - self.failUnless(isinstance(name_values[1][1], Attribute)) - self.assertEqual(name_values[1][1].__name__, 'attr2') - self.assertEqual(name_values[1][1].__doc__, 'My attr2') - self.assertEqual(name_values[2][0], 'method') - self.failUnless(isinstance(name_values[2][1], Method)) - self.assertEqual(name_values[2][1].__name__, 'method') - self.assertEqual(name_values[2][1].__doc__, 'My method, overridden') - self.assertEqual(name_values[3][0], 'method2') - self.failUnless(isinstance(name_values[3][1], Method)) - self.assertEqual(name_values[3][1].__name__, 'method2') - self.assertEqual(name_values[3][1].__doc__, 'My method2') - - def test_getDescriptionFor_nonesuch_no_default(self): - from zope.interface import Interface - - class IEmpty(Interface): - pass - - self.assertRaises(KeyError, IEmpty.getDescriptionFor, 'nonesuch') - - def test_getDescriptionFor_simple(self): - from zope.interface import Attribute - from zope.interface.interface import Method - from zope.interface import Interface - from zope.interface._compat import _u - - class ISimple(Interface): - attr = Attribute(_u('My attr')) - - def method(): - "My method" - - a_desc = ISimple.getDescriptionFor('attr') - self.failUnless(isinstance(a_desc, Attribute)) - self.assertEqual(a_desc.__name__, 'attr') - self.assertEqual(a_desc.__doc__, 'My attr') - - m_desc = ISimple.getDescriptionFor('method') - self.failUnless(isinstance(m_desc, Method)) - self.assertEqual(m_desc.__name__, 'method') - self.assertEqual(m_desc.__doc__, 'My method') - - def test_getDescriptionFor_derived(self): - from zope.interface import Attribute - from zope.interface.interface import Method - from zope.interface import Interface - from zope.interface._compat import _u - - class IBase(Interface): - attr = Attribute(_u('My attr')) - - def method(): - "My method" - - class IDerived(IBase): - attr2 = Attribute(_u('My attr2')) - - def method(): - "My method, overridden" - - def method2(): - "My method2" - - a_desc = IDerived.getDescriptionFor('attr') - self.failUnless(isinstance(a_desc, Attribute)) - self.assertEqual(a_desc.__name__, 'attr') - self.assertEqual(a_desc.__doc__, 'My attr') - - m_desc = IDerived.getDescriptionFor('method') - self.failUnless(isinstance(m_desc, Method)) - self.assertEqual(m_desc.__name__, 'method') - self.assertEqual(m_desc.__doc__, 'My method, overridden') - - a2_desc = IDerived.getDescriptionFor('attr2') - self.failUnless(isinstance(a2_desc, Attribute)) - self.assertEqual(a2_desc.__name__, 'attr2') - self.assertEqual(a2_desc.__doc__, 'My attr2') - - m2_desc = IDerived.getDescriptionFor('method2') - self.failUnless(isinstance(m2_desc, Method)) - self.assertEqual(m2_desc.__name__, 'method2') - self.assertEqual(m2_desc.__doc__, 'My method2') - - def test___getitem__nonesuch(self): - from zope.interface import Interface - - class IEmpty(Interface): - pass - - self.assertRaises(KeyError, IEmpty.__getitem__, 'nonesuch') - - def test___getitem__simple(self): - from zope.interface import Attribute - from zope.interface.interface import Method - from zope.interface import Interface - from zope.interface._compat import _u - - class ISimple(Interface): - attr = Attribute(_u('My attr')) - - def method(): - "My method" - - a_desc = ISimple['attr'] - self.failUnless(isinstance(a_desc, Attribute)) - self.assertEqual(a_desc.__name__, 'attr') - self.assertEqual(a_desc.__doc__, 'My attr') - - m_desc = ISimple['method'] - self.failUnless(isinstance(m_desc, Method)) - self.assertEqual(m_desc.__name__, 'method') - self.assertEqual(m_desc.__doc__, 'My method') - - def test___getitem___derived(self): - from zope.interface import Attribute - from zope.interface.interface import Method - from zope.interface import Interface - from zope.interface._compat import _u - - class IBase(Interface): - attr = Attribute(_u('My attr')) - - def method(): - "My method" - - class IDerived(IBase): - attr2 = Attribute(_u('My attr2')) - - def method(): - "My method, overridden" - - def method2(): - "My method2" - - a_desc = IDerived['attr'] - self.failUnless(isinstance(a_desc, Attribute)) - self.assertEqual(a_desc.__name__, 'attr') - self.assertEqual(a_desc.__doc__, 'My attr') - - m_desc = IDerived['method'] - self.failUnless(isinstance(m_desc, Method)) - self.assertEqual(m_desc.__name__, 'method') - self.assertEqual(m_desc.__doc__, 'My method, overridden') - - a2_desc = IDerived['attr2'] - self.failUnless(isinstance(a2_desc, Attribute)) - self.assertEqual(a2_desc.__name__, 'attr2') - self.assertEqual(a2_desc.__doc__, 'My attr2') - - m2_desc = IDerived['method2'] - self.failUnless(isinstance(m2_desc, Method)) - self.assertEqual(m2_desc.__name__, 'method2') - self.assertEqual(m2_desc.__doc__, 'My method2') - - def test___contains__nonesuch(self): - from zope.interface import Interface - - class IEmpty(Interface): - pass - - self.failIf('nonesuch' in IEmpty) - - def test___contains__simple(self): - from zope.interface import Attribute - from zope.interface import Interface - from zope.interface._compat import _u - - class ISimple(Interface): - attr = Attribute(_u('My attr')) - - def method(): - "My method" - - self.failUnless('attr' in ISimple) - self.failUnless('method' in ISimple) - - def test___contains__derived(self): - from zope.interface import Attribute - from zope.interface import Interface - from zope.interface._compat import _u - - class IBase(Interface): - attr = Attribute(_u('My attr')) - - def method(): - "My method" - - class IDerived(IBase): - attr2 = Attribute(_u('My attr2')) - - def method(): - "My method, overridden" - - def method2(): - "My method2" - - self.failUnless('attr' in IDerived) - self.failUnless('method' in IDerived) - self.failUnless('attr2' in IDerived) - self.failUnless('method2' in IDerived) - - def test___iter__empty(self): - from zope.interface import Interface - - class IEmpty(Interface): - pass - - self.assertEqual(list(IEmpty), []) - - def test___iter__simple(self): - from zope.interface import Attribute - from zope.interface import Interface - from zope.interface._compat import _u - - class ISimple(Interface): - attr = Attribute(_u('My attr')) - - def method(): - "My method" - - self.assertEqual(sorted(list(ISimple)), ['attr', 'method']) - - def test___iter__derived(self): - from zope.interface import Attribute - from zope.interface import Interface - from zope.interface._compat import _u - - class IBase(Interface): - attr = Attribute(_u('My attr')) - - def method(): - "My method" - - class IDerived(IBase): - attr2 = Attribute(_u('My attr2')) - - def method(): - "My method, overridden" - - def method2(): - "My method2" - - self.assertEqual(sorted(list(IDerived)), - ['attr', 'attr2', 'method', 'method2']) - - def test_function_attributes_become_tagged_values(self): - from zope.interface import Interface - - class ITagMe(Interface): - def method(): - pass - method.optional = 1 - - method = ITagMe['method'] - self.assertEqual(method.getTaggedValue('optional'), 1) - - def test___doc___non_element(self): - from zope.interface import Interface - - class IHaveADocString(Interface): - "xxx" - - self.assertEqual(IHaveADocString.__doc__, "xxx") - self.assertEqual(list(IHaveADocString), []) - - def test___doc___as_element(self): - from zope.interface import Attribute - from zope.interface import Interface - - class IHaveADocString(Interface): - "xxx" - __doc__ = Attribute('the doc') - - self.assertEqual(IHaveADocString.__doc__, "") - self.assertEqual(list(IHaveADocString), ['__doc__']) - - def _errorsEqual(self, has_invariant, error_len, error_msgs, iface): - from zope.interface.exceptions import Invalid - self.assertRaises(Invalid, iface.validateInvariants, has_invariant) - e = [] - try: - iface.validateInvariants(has_invariant, e) - except Invalid as error: - self.assertEqual(error.args[0], e) - else: - self._assert(0) # validateInvariants should always raise - # Invalid - self.assertEqual(len(e), error_len) - msgs = [error.args[0] for error in e] - msgs.sort() - for msg in msgs: - self.assertEqual(msg, error_msgs.pop(0)) - - def test_invariant_simple(self): - from zope.interface import Attribute - from zope.interface import Interface - from zope.interface import directlyProvides - from zope.interface import invariant - - class IInvariant(Interface): - foo = Attribute('foo') - bar = Attribute('bar; must eval to Boolean True if foo does') - invariant(_ifFooThenBar) - - class HasInvariant(object): - pass - - # set up - has_invariant = HasInvariant() - directlyProvides(has_invariant, IInvariant) - - # the tests - self.assertEqual(IInvariant.getTaggedValue('invariants'), - [_ifFooThenBar]) - self.assertEqual(IInvariant.validateInvariants(has_invariant), None) - has_invariant.bar = 27 - self.assertEqual(IInvariant.validateInvariants(has_invariant), None) - has_invariant.foo = 42 - self.assertEqual(IInvariant.validateInvariants(has_invariant), None) - del has_invariant.bar - self._errorsEqual(has_invariant, 1, ['If Foo, then Bar!'], - IInvariant) - - def test_invariant_nested(self): - from zope.interface import Attribute - from zope.interface import Interface - from zope.interface import directlyProvides - from zope.interface import invariant - - class IInvariant(Interface): - foo = Attribute('foo') - bar = Attribute('bar; must eval to Boolean True if foo does') - invariant(_ifFooThenBar) - - class ISubInvariant(IInvariant): - invariant(_barGreaterThanFoo) - - class HasInvariant(object): - pass - - # nested interfaces with invariants: - self.assertEqual(ISubInvariant.getTaggedValue('invariants'), - [_barGreaterThanFoo]) - has_invariant = HasInvariant() - directlyProvides(has_invariant, ISubInvariant) - has_invariant.foo = 42 - # even though the interface has changed, we should still only have one - # error. - self._errorsEqual(has_invariant, 1, ['If Foo, then Bar!'], - ISubInvariant) - # however, if we set foo to 0 (Boolean False) and bar to a negative - # number then we'll get the new error - has_invariant.foo = 2 - has_invariant.bar = 1 - self._errorsEqual(has_invariant, 1, - ['Please, Boo MUST be greater than Foo!'], - ISubInvariant) - # and if we set foo to a positive number and boo to 0, we'll - # get both errors! - has_invariant.foo = 1 - has_invariant.bar = 0 - self._errorsEqual(has_invariant, 2, - ['If Foo, then Bar!', - 'Please, Boo MUST be greater than Foo!'], - ISubInvariant) - # for a happy ending, we'll make the invariants happy - has_invariant.foo = 1 - has_invariant.bar = 2 - self.assertEqual(IInvariant.validateInvariants(has_invariant), None) - - def test_invariant_mutandis(self): - from zope.interface import Attribute - from zope.interface import Interface - from zope.interface import directlyProvides - from zope.interface import invariant - - class IInvariant(Interface): - foo = Attribute('foo') - bar = Attribute('bar; must eval to Boolean True if foo does') - invariant(_ifFooThenBar) - - class HasInvariant(object): - pass - - # now we'll do two invariants on the same interface, - # just to make sure that a small - # multi-invariant interface is at least minimally tested. - has_invariant = HasInvariant() - directlyProvides(has_invariant, IInvariant) - has_invariant.foo = 42 - - # if you really need to mutate, then this would be the way to do it. - # Probably a bad idea, though. :-) - old_invariants = IInvariant.getTaggedValue('invariants') - invariants = old_invariants[:] - invariants.append(_barGreaterThanFoo) - IInvariant.setTaggedValue('invariants', invariants) - - # even though the interface has changed, we should still only have one - # error. - self._errorsEqual(has_invariant, 1, ['If Foo, then Bar!'], - IInvariant) - # however, if we set foo to 0 (Boolean False) and bar to a negative - # number then we'll get the new error - has_invariant.foo = 2 - has_invariant.bar = 1 - self._errorsEqual(has_invariant, 1, - ['Please, Boo MUST be greater than Foo!'], IInvariant) - # and if we set foo to a positive number and boo to 0, we'll - # get both errors! - has_invariant.foo = 1 - has_invariant.bar = 0 - self._errorsEqual(has_invariant, 2, - ['If Foo, then Bar!', - 'Please, Boo MUST be greater than Foo!'], - IInvariant) - # for another happy ending, we'll make the invariants happy again - has_invariant.foo = 1 - has_invariant.bar = 2 - self.assertEqual(IInvariant.validateInvariants(has_invariant), None) - # clean up - IInvariant.setTaggedValue('invariants', old_invariants) - - def test___doc___element(self): - from zope.interface import Interface - from zope.interface import Attribute - class I(Interface): - "xxx" - - self.assertEqual(I.__doc__, "xxx") - self.assertEqual(list(I), []) - - class I(Interface): - "xxx" - - __doc__ = Attribute('the doc') - - self.assertEqual(I.__doc__, "") - self.assertEqual(list(I), ['__doc__']) - - def testIssue228(self): - # Test for http://collector.zope.org/Zope3-dev/228 - # Old style classes don't have a '__class__' attribute - import sys - if sys.version[0] < '3': - # No old style classes in Python 3, so the test becomes moot. - from zope.interface import Interface - - class I(Interface): - "xxx" - - class OldStyle: - __providedBy__ = None - - self.assertRaises(AttributeError, I.providedBy, OldStyle) - - def test_invariant_as_decorator(self): - from zope.interface import Interface - from zope.interface import Attribute - from zope.interface import implementer - from zope.interface import invariant - from zope.interface.exceptions import Invalid - - class IRange(Interface): - min = Attribute("Lower bound") - max = Attribute("Upper bound") - - @invariant - def range_invariant(ob): - if ob.max < ob.min: - raise Invalid('max < min') - - @implementer(IRange) - class Range(object): - - def __init__(self, min, max): - self.min, self.max = min, max - - IRange.validateInvariants(Range(1,2)) - IRange.validateInvariants(Range(1,1)) - try: - IRange.validateInvariants(Range(2,1)) - except Invalid as e: - self.assertEqual(str(e), 'max < min') - - def test_taggedValue(self): - from zope.interface import Attribute - from zope.interface import Interface - from zope.interface import taggedValue - - class ITagged(Interface): - foo = Attribute('foo') - bar = Attribute('bar; must eval to Boolean True if foo does') - taggedValue('qux', 'Spam') - - class HasInvariant(object): - pass - - self.assertEqual(ITagged.getTaggedValue('qux'), 'Spam') - self.failUnless('qux' in ITagged.getTaggedValueTags()) - - def test_description_cache_management(self): - # See https://bugs.launchpad.net/zope.interface/+bug/185974 - # There was a bug where the cache used by Specification.get() was not - # cleared when the bases were changed. - from zope.interface import Interface - from zope.interface import Attribute - - class I1(Interface): - a = Attribute('a') - - class I2(I1): - pass - - class I3(I2): - pass - - self.failUnless(I3.get('a') is I1.get('a')) - - I2.__bases__ = (Interface,) - self.failUnless(I3.get('a') is None) - - def test___call___defers_to___conform___(self): - from zope.interface import Interface - from zope.interface import implementer - - class I(Interface): - pass - - @implementer(I) - class C(object): - def __conform__(self, proto): - return 0 - - self.assertEqual(I(C()), 0) - - def test___call___object_implements(self): - from zope.interface import Interface - from zope.interface import implementer - - class I(Interface): - pass - - @implementer(I) - class C(object): - pass - - c = C() - self.failUnless(I(c) is c) - - def test___call___miss_wo_alternate(self): - from zope.interface import Interface - - class I(Interface): - pass - - class C(object): - pass - - c = C() - self.assertRaises(TypeError, I, c) - - def test___call___miss_w_alternate(self): - from zope.interface import Interface - - class I(Interface): - pass - - class C(object): - pass - - c = C() - self.failUnless(I(c, self) is self) - - def test___call___w_adapter_hook(self): - from zope.interface import Interface - from zope.interface.interface import adapter_hooks - old_hooks = adapter_hooks[:] - - def _miss(iface, obj): - pass - - def _hit(iface, obj): - return self - - class I(Interface): - pass - - class C(object): - pass - - c = C() - - old_adapter_hooks = adapter_hooks[:] - adapter_hooks[:] = [_miss, _hit] - try: - self.failUnless(I(c) is self) - finally: - adapter_hooks[:] = old_adapter_hooks - - -class AttributeTests(ElementTests): - - DEFAULT_NAME = 'TestAttribute' - - def _getTargetClass(self): - from zope.interface.interface import Attribute - return Attribute - - -class MethodTests(AttributeTests): - - DEFAULT_NAME = 'TestMethod' - - def _getTargetClass(self): - from zope.interface.interface import Method - return Method - - def test_optional_as_property(self): - method = self._makeOne() - self.assertEqual(method.optional, {}) - method.optional = {'foo': 'bar'} - self.assertEqual(method.optional, {'foo': 'bar'}) - del method.optional - self.assertEqual(method.optional, {}) - - def test___call___raises_BrokenImplementation(self): - from zope.interface.exceptions import BrokenImplementation - method = self._makeOne() - try: - method() - except BrokenImplementation as e: - self.assertEqual(e.interface, None) - self.assertEqual(e.name, self.DEFAULT_NAME) - else: - self.fail('__call__ should raise BrokenImplementation') - - def test_getSignatureInfo_bare(self): - method = self._makeOne() - info = method.getSignatureInfo() - self.assertEqual(list(info['positional']), []) - self.assertEqual(list(info['required']), []) - self.assertEqual(info['optional'], {}) - self.assertEqual(info['varargs'], None) - self.assertEqual(info['kwargs'], None) - - def test_getSignatureString_bare(self): - method = self._makeOne() - self.assertEqual(method.getSignatureString(), '()') - - def test_getSignatureString_w_only_required(self): - method = self._makeOne() - method.positional = method.required = ['foo'] - self.assertEqual(method.getSignatureString(), '(foo)') - - def test_getSignatureString_w_optional(self): - method = self._makeOne() - method.positional = method.required = ['foo'] - method.optional = {'foo': 'bar'} - self.assertEqual(method.getSignatureString(), "(foo='bar')") - - def test_getSignatureString_w_varargs(self): - method = self._makeOne() - method.varargs = 'args' - self.assertEqual(method.getSignatureString(), "(*args)") - - def test_getSignatureString_w_kwargs(self): - method = self._makeOne() - method.kwargs = 'kw' - self.assertEqual(method.getSignatureString(), "(**kw)") - - -class Test_fromFunction(unittest.TestCase): - - def _callFUT(self, *args, **kw): - from zope.interface.interface import fromFunction - return fromFunction(*args, **kw) - - def test_bare(self): - def _func(): - "DOCSTRING" - method = self._callFUT(_func) - self.assertEqual(method.getName(), '_func') - self.assertEqual(method.getDoc(), 'DOCSTRING') - self.assertEqual(method.interface, None) - self.assertEqual(list(method.getTaggedValueTags()), []) - info = method.getSignatureInfo() - self.assertEqual(list(info['positional']), []) - self.assertEqual(list(info['required']), []) - self.assertEqual(info['optional'], {}) - self.assertEqual(info['varargs'], None) - self.assertEqual(info['kwargs'], None) - - def test_w_interface(self): - from zope.interface.interface import InterfaceClass - class IFoo(InterfaceClass): - pass - def _func(): - "DOCSTRING" - method = self._callFUT(_func, interface=IFoo) - self.assertEqual(method.interface, IFoo) - - def test_w_name(self): - def _func(): - "DOCSTRING" - method = self._callFUT(_func, name='anotherName') - self.assertEqual(method.getName(), 'anotherName') - - def test_w_only_required(self): - def _func(foo): - "DOCSTRING" - method = self._callFUT(_func) - info = method.getSignatureInfo() - self.assertEqual(list(info['positional']), ['foo']) - self.assertEqual(list(info['required']), ['foo']) - self.assertEqual(info['optional'], {}) - self.assertEqual(info['varargs'], None) - self.assertEqual(info['kwargs'], None) - - def test_w_optional(self): - def _func(foo='bar'): - "DOCSTRING" - method = self._callFUT(_func) - info = method.getSignatureInfo() - self.assertEqual(list(info['positional']), ['foo']) - self.assertEqual(list(info['required']), []) - self.assertEqual(info['optional'], {'foo': 'bar'}) - self.assertEqual(info['varargs'], None) - self.assertEqual(info['kwargs'], None) - - def test_w_optional_self(self): - # XXX This is a weird case, trying to cover the following code in - # FUT:: - # - # nr = na-len(defaults) - # if nr < 0: - # defaults=defaults[-nr:] - # nr = 0 - def _func(self='bar'): - "DOCSTRING" - method = self._callFUT(_func, imlevel=1) - info = method.getSignatureInfo() - self.assertEqual(list(info['positional']), []) - self.assertEqual(list(info['required']), []) - self.assertEqual(info['optional'], {}) - self.assertEqual(info['varargs'], None) - self.assertEqual(info['kwargs'], None) - - def test_w_varargs(self): - def _func(*args): - "DOCSTRING" - method = self._callFUT(_func) - info = method.getSignatureInfo() - self.assertEqual(list(info['positional']), []) - self.assertEqual(list(info['required']), []) - self.assertEqual(info['optional'], {}) - self.assertEqual(info['varargs'], 'args') - self.assertEqual(info['kwargs'], None) - - def test_w_kwargs(self): - def _func(**kw): - "DOCSTRING" - method = self._callFUT(_func) - info = method.getSignatureInfo() - self.assertEqual(list(info['positional']), []) - self.assertEqual(list(info['required']), []) - self.assertEqual(info['optional'], {}) - self.assertEqual(info['varargs'], None) - self.assertEqual(info['kwargs'], 'kw') - - def test_full_spectrum(self): - def _func(foo, bar='baz', *args, **kw): - "DOCSTRING" - method = self._callFUT(_func) - info = method.getSignatureInfo() - self.assertEqual(list(info['positional']), ['foo', 'bar']) - self.assertEqual(list(info['required']), ['foo']) - self.assertEqual(info['optional'], {'bar': 'baz'}) - self.assertEqual(info['varargs'], 'args') - self.assertEqual(info['kwargs'], 'kw') - - -class Test_fromMethod(unittest.TestCase): - - def _callFUT(self, *args, **kw): - from zope.interface.interface import fromMethod - return fromMethod(*args, **kw) - - def test_no_args(self): - class Foo(object): - def bar(self): - "DOCSTRING" - method = self._callFUT(Foo.bar) - self.assertEqual(method.getName(), 'bar') - self.assertEqual(method.getDoc(), 'DOCSTRING') - self.assertEqual(method.interface, None) - self.assertEqual(list(method.getTaggedValueTags()), []) - info = method.getSignatureInfo() - self.assertEqual(list(info['positional']), []) - self.assertEqual(list(info['required']), []) - self.assertEqual(info['optional'], {}) - self.assertEqual(info['varargs'], None) - self.assertEqual(info['kwargs'], None) - - def test_full_spectrum(self): - class Foo(object): - def bar(self, foo, bar='baz', *args, **kw): - "DOCSTRING" - method = self._callFUT(Foo.bar) - info = method.getSignatureInfo() - self.assertEqual(list(info['positional']), ['foo', 'bar']) - self.assertEqual(list(info['required']), ['foo']) - self.assertEqual(info['optional'], {'bar': 'baz'}) - self.assertEqual(info['varargs'], 'args') - self.assertEqual(info['kwargs'], 'kw') - - def test_w_non_method(self): - def foo(): - "DOCSTRING" - method = self._callFUT(foo) - self.assertEqual(method.getName(), 'foo') - self.assertEqual(method.getDoc(), 'DOCSTRING') - self.assertEqual(method.interface, None) - self.assertEqual(list(method.getTaggedValueTags()), []) - info = method.getSignatureInfo() - self.assertEqual(list(info['positional']), []) - self.assertEqual(list(info['required']), []) - self.assertEqual(info['optional'], {}) - self.assertEqual(info['varargs'], None) - self.assertEqual(info['kwargs'], None) - -class DummyDependent(object): - - def __init__(self): - self._changed = [] - - def changed(self, originally_changed): - self._changed.append(originally_changed) - - -def _barGreaterThanFoo(obj): - from zope.interface.exceptions import Invalid - foo = getattr(obj, 'foo', None) - bar = getattr(obj, 'bar', None) - if foo is not None and isinstance(foo, type(bar)): - # type checking should be handled elsewhere (like, say, - # schema); these invariants should be intra-interface - # constraints. This is a hacky way to do it, maybe, but you - # get the idea - if not bar > foo: - raise Invalid('Please, Boo MUST be greater than Foo!') - -def _ifFooThenBar(obj): - from zope.interface.exceptions import Invalid - if getattr(obj, 'foo', None) and not getattr(obj, 'bar', None): - raise Invalid('If Foo, then Bar!') - - -class _Monkey(object): - # context-manager for replacing module names in the scope of a test. - def __init__(self, module, **kw): - self.module = module - self.to_restore = dict([(key, getattr(module, key)) for key in kw]) - for key, value in kw.items(): - setattr(module, key, value) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - for key, value in self.to_restore.items(): - setattr(self.module, key, value) - - -def test_suite(): - import doctest - return unittest.TestSuite(( - unittest.makeSuite(ElementTests), - unittest.makeSuite(SpecificationBasePyTests), - unittest.makeSuite(InterfaceBasePyTests), - unittest.makeSuite(SpecificationTests), - unittest.makeSuite(InterfaceTests), - unittest.makeSuite(AttributeTests), - unittest.makeSuite(MethodTests), - unittest.makeSuite(Test_fromFunction), - #unittest.makeSuite(Test_fromMethod), - doctest.DocTestSuite(), - doctest.DocTestSuite("zope.interface.interface"), - )) diff --git a/zope/interface/tests/test_interfaces.py b/zope/interface/tests/test_interfaces.py deleted file mode 100644 index 7bc58079..00000000 --- a/zope/interface/tests/test_interfaces.py +++ /dev/null @@ -1,115 +0,0 @@ -import unittest - -class _SilencePy3Deprecations(unittest.TestCase): - # silence deprecation warnings under py3 - - def failUnless(self, expr): - # St00pid speling. - return self.assertTrue(expr) - - def failIf(self, expr): - # St00pid speling. - return self.assertFalse(expr) - - -class _ConformsToIObjectEvent(object): - - def _makeOne(self, target=None): - if target is None: - target = object() - return self._getTargetClass()(target) - - def test_class_conforms_to_IObjectEvent(self): - from zope.interface.interfaces import IObjectEvent - from zope.interface.verify import verifyClass - verifyClass(IObjectEvent, self._getTargetClass()) - - def test_instance_conforms_to_IObjectEvent(self): - from zope.interface.interfaces import IObjectEvent - from zope.interface.verify import verifyObject - verifyObject(IObjectEvent, self._makeOne()) - - -class _ConformsToIRegistrationEvent(_ConformsToIObjectEvent): - - def test_class_conforms_to_IRegistrationEvent(self): - from zope.interface.interfaces import IRegistrationEvent - from zope.interface.verify import verifyClass - verifyClass(IRegistrationEvent, self._getTargetClass()) - - def test_instance_conforms_to_IRegistrationEvent(self): - from zope.interface.interfaces import IRegistrationEvent - from zope.interface.verify import verifyObject - verifyObject(IRegistrationEvent, self._makeOne()) - - -class ObjectEventTests(_SilencePy3Deprecations, _ConformsToIObjectEvent): - - def _getTargetClass(self): - from zope.interface.interfaces import ObjectEvent - return ObjectEvent - - def test_ctor(self): - target = object() - event = self._makeOne(target) - self.failUnless(event.object is target) - - -class RegistrationEventTests(_SilencePy3Deprecations, - _ConformsToIRegistrationEvent): - - def _getTargetClass(self): - from zope.interface.interfaces import RegistrationEvent - return RegistrationEvent - - def test___repr__(self): - target = object() - event = self._makeOne(target) - r = repr(event) - self.assertEqual(r.splitlines(), - ['RegistrationEvent event:', repr(target)]) - - -class RegisteredTests(_SilencePy3Deprecations, - _ConformsToIRegistrationEvent): - - def _getTargetClass(self): - from zope.interface.interfaces import Registered - return Registered - - def test_class_conforms_to_IRegistered(self): - from zope.interface.interfaces import IRegistered - from zope.interface.verify import verifyClass - verifyClass(IRegistered, self._getTargetClass()) - - def test_instance_conforms_to_IRegistered(self): - from zope.interface.interfaces import IRegistered - from zope.interface.verify import verifyObject - verifyObject(IRegistered, self._makeOne()) - - -class UnregisteredTests(_SilencePy3Deprecations, - _ConformsToIRegistrationEvent): - - def _getTargetClass(self): - from zope.interface.interfaces import Unregistered - return Unregistered - - def test_class_conforms_to_IUnregistered(self): - from zope.interface.interfaces import IUnregistered - from zope.interface.verify import verifyClass - verifyClass(IUnregistered, self._getTargetClass()) - - def test_instance_conforms_to_IUnregistered(self): - from zope.interface.interfaces import IUnregistered - from zope.interface.verify import verifyObject - verifyObject(IUnregistered, self._makeOne()) - - -def test_suite(): - return unittest.TestSuite(( - unittest.makeSuite(ObjectEventTests), - unittest.makeSuite(RegistrationEventTests), - unittest.makeSuite(RegisteredTests), - unittest.makeSuite(UnregisteredTests), - )) diff --git a/zope/interface/tests/test_odd_declarations.py b/zope/interface/tests/test_odd_declarations.py deleted file mode 100644 index 7314c7cc..00000000 --- a/zope/interface/tests/test_odd_declarations.py +++ /dev/null @@ -1,227 +0,0 @@ -############################################################################## -# -# Copyright (c) 2003 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Test interface declarations against ExtensionClass-like classes. - -These tests are to make sure we do something sane in the presence of -classic ExtensionClass classes and instances. -""" -import unittest - -from zope.interface.tests import odd -from zope.interface import Interface -from zope.interface import implementer -from zope.interface import directlyProvides -from zope.interface import providedBy -from zope.interface import directlyProvidedBy -from zope.interface import classImplements -from zope.interface import classImplementsOnly -from zope.interface import implementedBy -from zope.interface._compat import _skip_under_py3k - -class I1(Interface): pass -class I2(Interface): pass -class I3(Interface): pass -class I31(I3): pass -class I4(Interface): pass -class I5(Interface): pass - -class Odd(object): __metaclass__ = odd.MetaClass - -class B(Odd): __implemented__ = I2 - - -# TODO: We are going to need more magic to make classProvides work with odd -# classes. This will work in the next iteration. For now, we'll use -# a different mechanism. - -# from zope.interface import classProvides - -class A(Odd): - pass -classImplements(A, I1) - -class C(A, B): - pass -classImplements(C, I31) - - -class Test(unittest.TestCase): - - def failUnless(self, expr): # silence deprecation warnings under py3 - return self.assertTrue(expr) - - def failIf(self, expr): # silence deprecation warnings under py3 - return self.assertFalse(expr) - - def test_ObjectSpecification(self): - c = C() - directlyProvides(c, I4) - self.assertEqual([i.getName() for i in providedBy(c)], - ['I4', 'I31', 'I1', 'I2'] - ) - self.assertEqual([i.getName() for i in providedBy(c).flattened()], - ['I4', 'I31', 'I3', 'I1', 'I2', 'Interface'] - ) - self.failUnless(I1 in providedBy(c)) - self.failIf(I3 in providedBy(c)) - self.failUnless(providedBy(c).extends(I3)) - self.failUnless(providedBy(c).extends(I31)) - self.failIf(providedBy(c).extends(I5)) - - class COnly(A, B): - pass - classImplementsOnly(COnly, I31) - - class D(COnly): - pass - classImplements(D, I5) - - classImplements(D, I5) - - c = D() - directlyProvides(c, I4) - self.assertEqual([i.getName() for i in providedBy(c)], - ['I4', 'I5', 'I31']) - self.assertEqual([i.getName() for i in providedBy(c).flattened()], - ['I4', 'I5', 'I31', 'I3', 'Interface']) - self.failIf(I1 in providedBy(c)) - self.failIf(I3 in providedBy(c)) - self.failUnless(providedBy(c).extends(I3)) - self.failIf(providedBy(c).extends(I1)) - self.failUnless(providedBy(c).extends(I31)) - self.failUnless(providedBy(c).extends(I5)) - - class COnly(A, B): __implemented__ = I31 - class D(COnly): - pass - classImplements(D, I5) - - classImplements(D, I5) - c = D() - directlyProvides(c, I4) - self.assertEqual([i.getName() for i in providedBy(c)], - ['I4', 'I5', 'I31']) - self.assertEqual([i.getName() for i in providedBy(c).flattened()], - ['I4', 'I5', 'I31', 'I3', 'Interface']) - self.failIf(I1 in providedBy(c)) - self.failIf(I3 in providedBy(c)) - self.failUnless(providedBy(c).extends(I3)) - self.failIf(providedBy(c).extends(I1)) - self.failUnless(providedBy(c).extends(I31)) - self.failUnless(providedBy(c).extends(I5)) - - def test_classImplements(self): - - @implementer(I3) - class A(Odd): - pass - - @implementer(I4) - class B(Odd): - pass - - class C(A, B): - pass - classImplements(C, I1, I2) - self.assertEqual([i.getName() for i in implementedBy(C)], - ['I1', 'I2', 'I3', 'I4']) - classImplements(C, I5) - self.assertEqual([i.getName() for i in implementedBy(C)], - ['I1', 'I2', 'I5', 'I3', 'I4']) - - def test_classImplementsOnly(self): - @implementer(I3) - class A(Odd): - pass - - @implementer(I4) - class B(Odd): - pass - - class C(A, B): - pass - classImplementsOnly(C, I1, I2) - self.assertEqual([i.__name__ for i in implementedBy(C)], - ['I1', 'I2']) - - - def test_directlyProvides(self): - class IA1(Interface): pass - class IA2(Interface): pass - class IB(Interface): pass - class IC(Interface): pass - class A(Odd): - pass - classImplements(A, IA1, IA2) - - class B(Odd): - pass - classImplements(B, IB) - - class C(A, B): - pass - classImplements(C, IC) - - - ob = C() - directlyProvides(ob, I1, I2) - self.failUnless(I1 in providedBy(ob)) - self.failUnless(I2 in providedBy(ob)) - self.failUnless(IA1 in providedBy(ob)) - self.failUnless(IA2 in providedBy(ob)) - self.failUnless(IB in providedBy(ob)) - self.failUnless(IC in providedBy(ob)) - - directlyProvides(ob, directlyProvidedBy(ob)-I2) - self.failUnless(I1 in providedBy(ob)) - self.failIf(I2 in providedBy(ob)) - self.failIf(I2 in providedBy(ob)) - directlyProvides(ob, directlyProvidedBy(ob), I2) - self.failUnless(I2 in providedBy(ob)) - - @_skip_under_py3k - def test_directlyProvides_fails_for_odd_class(self): - self.assertRaises(TypeError, directlyProvides, C, I5) - - # see above - #def TODO_test_classProvides_fails_for_odd_class(self): - # try: - # class A(Odd): - # classProvides(I1) - # except TypeError: - # pass # Sucess - # self.assert_(False, - # "Shouldn't be able to use directlyProvides on odd class." - # ) - - def test_implementedBy(self): - class I2(I1): pass - - class C1(Odd): - pass - classImplements(C1, I2) - - class C2(C1): - pass - classImplements(C2, I3) - - self.assertEqual([i.getName() for i in implementedBy(C2)], - ['I3', 'I2']) - -def test_suite(): - import doctest - suite = unittest.TestSuite() - suite.addTest(unittest.makeSuite(Test)) - suite.addTest(doctest.DocTestSuite(odd)) - return suite diff --git a/zope/interface/tests/test_registry.py b/zope/interface/tests/test_registry.py deleted file mode 100644 index f717c597..00000000 --- a/zope/interface/tests/test_registry.py +++ /dev/null @@ -1,2454 +0,0 @@ -############################################################################## -# -# Copyright (c) 2001, 2002, 2009 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Component Registry Tests""" -import unittest - -class _SilencePy3Deprecations(unittest.TestCase): - # silence deprecation warnings under py3 - - def failUnless(self, expr): - # St00pid speling. - return self.assertTrue(expr) - - def failIf(self, expr): - # St00pid speling. - return self.assertFalse(expr) - -class ComponentsTests(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.registry import Components - return Components - - def _makeOne(self, name='test', *args, **kw): - return self._getTargetClass()(name, *args, **kw) - - def _wrapEvents(self): - from zope.interface import registry - _events = [] - def _notify(*args, **kw): - _events.append((args, kw)) - _monkey = _Monkey(registry, notify=_notify) - return _monkey, _events - - def test_ctor_no_bases(self): - from zope.interface.adapter import AdapterRegistry - comp = self._makeOne('testing') - self.assertEqual(comp.__name__, 'testing') - self.assertEqual(comp.__bases__, ()) - self.failUnless(isinstance(comp.adapters, AdapterRegistry)) - self.failUnless(isinstance(comp.utilities, AdapterRegistry)) - self.assertEqual(comp.adapters.__bases__, ()) - self.assertEqual(comp.utilities.__bases__, ()) - self.assertEqual(comp._utility_registrations, {}) - self.assertEqual(comp._adapter_registrations, {}) - self.assertEqual(comp._subscription_registrations, []) - self.assertEqual(comp._handler_registrations, []) - - def test_ctor_w_base(self): - base = self._makeOne('base') - comp = self._makeOne('testing', (base,)) - self.assertEqual(comp.__name__, 'testing') - self.assertEqual(comp.__bases__, (base,)) - self.assertEqual(comp.adapters.__bases__, (base.adapters,)) - self.assertEqual(comp.utilities.__bases__, (base.utilities,)) - - def test___repr__(self): - comp = self._makeOne('testing') - self.assertEqual(repr(comp), '') - - # test _init_registries / _init_registrations via only caller, __init__. - - def test_assign_to___bases__(self): - base1 = self._makeOne('base1') - base2 = self._makeOne('base2') - comp = self._makeOne() - comp.__bases__ = (base1, base2) - self.assertEqual(comp.__bases__, (base1, base2)) - self.assertEqual(comp.adapters.__bases__, - (base1.adapters, base2.adapters)) - self.assertEqual(comp.utilities.__bases__, - (base1.utilities, base2.utilities)) - - def test_registerUtility_both_factory_and_component(self): - def _factory(): - pass - _to_reg = object() - comp = self._makeOne() - self.assertRaises(TypeError, comp.registerUtility, - component=_to_reg, factory=_factory) - - def test_registerUtility_w_component(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Registered - from zope.interface.registry import UtilityRegistration - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _info = _u('info') - _name = _u('name') - _to_reg = object() - comp = self._makeOne() - _monkey, _events = self._wrapEvents() - with _monkey: - comp.registerUtility(_to_reg, ifoo, _name, _info) - self.failUnless(comp.utilities._adapters[0][ifoo][_name] is _to_reg) - self.assertEqual(comp._utility_registrations[ifoo, _name], - (_to_reg, _info, None)) - self.assertEqual(comp.utilities._subscribers[0][ifoo][''], (_to_reg,)) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Registered)) - self.failUnless(isinstance(event.object, UtilityRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.failUnless(event.object.name is _name) - self.failUnless(event.object.component is _to_reg) - self.failUnless(event.object.info is _info) - self.failUnless(event.object.factory is None) - - def test_registerUtility_w_factory(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Registered - from zope.interface.registry import UtilityRegistration - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _info = _u('info') - _name = _u('name') - _to_reg = object() - def _factory(): - return _to_reg - comp = self._makeOne() - _monkey, _events = self._wrapEvents() - with _monkey: - comp.registerUtility(None, ifoo, _name, _info, factory=_factory) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Registered)) - self.failUnless(isinstance(event.object, UtilityRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.failUnless(event.object.name is _name) - self.failUnless(event.object.component is _to_reg) - self.failUnless(event.object.info is _info) - self.failUnless(event.object.factory is _factory) - - def test_registerUtility_no_provided_available(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - class Foo(object): - pass - ifoo = IFoo('IFoo') - _info = _u('info') - _name = _u('name') - _to_reg = Foo() - comp = self._makeOne() - self.assertRaises(TypeError, - comp.registerUtility, _to_reg, None, _name, _info) - - def test_registerUtility_wo_provided(self): - from zope.interface.declarations import directlyProvides - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Registered - from zope.interface.registry import UtilityRegistration - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - class Foo(object): - pass - ifoo = IFoo('IFoo') - _info = _u('info') - _name = _u('name') - _to_reg = Foo() - directlyProvides(_to_reg, ifoo) - comp = self._makeOne() - _monkey, _events = self._wrapEvents() - with _monkey: - comp.registerUtility(_to_reg, None, _name, _info) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Registered)) - self.failUnless(isinstance(event.object, UtilityRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.failUnless(event.object.name is _name) - self.failUnless(event.object.component is _to_reg) - self.failUnless(event.object.info is _info) - self.failUnless(event.object.factory is None) - - def test_registerUtility_duplicates_existing_reg(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _info = _u('info') - _name = _u('name') - _to_reg = object() - comp = self._makeOne() - comp.registerUtility(_to_reg, ifoo, _name, _info) - _monkey, _events = self._wrapEvents() - with _monkey: - comp.registerUtility(_to_reg, ifoo, _name, _info) - self.assertEqual(len(_events), 0) - - def test_registerUtility_replaces_existing_reg(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Unregistered - from zope.interface.interfaces import Registered - from zope.interface.registry import UtilityRegistration - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _info = _u('info') - _name = _u('name') - _before, _after = object(), object() - comp = self._makeOne() - comp.registerUtility(_before, ifoo, _name, _info) - _monkey, _events = self._wrapEvents() - with _monkey: - comp.registerUtility(_after, ifoo, _name, _info) - self.assertEqual(len(_events), 2) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Unregistered)) - self.failUnless(isinstance(event.object, UtilityRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.failUnless(event.object.name is _name) - self.failUnless(event.object.component is _before) - self.failUnless(event.object.info is _info) - self.failUnless(event.object.factory is None) - args, kw = _events[1] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Registered)) - self.failUnless(isinstance(event.object, UtilityRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.failUnless(event.object.name is _name) - self.failUnless(event.object.component is _after) - self.failUnless(event.object.info is _info) - self.failUnless(event.object.factory is None) - - def test_registerUtility_w_existing_subscr(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _info = _u('info') - _name1 = _u('name1') - _name2 = _u('name2') - _to_reg = object() - comp = self._makeOne() - comp.registerUtility(_to_reg, ifoo, _name1, _info) - _monkey, _events = self._wrapEvents() - with _monkey: - comp.registerUtility(_to_reg, ifoo, _name2, _info) - self.assertEqual(comp.utilities._subscribers[0][ifoo][''], (_to_reg,)) - - def test_registerUtility_wo_event(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _info = _u('info') - _name = _u('name') - _to_reg = object() - comp = self._makeOne() - _monkey, _events = self._wrapEvents() - with _monkey: - comp.registerUtility(_to_reg, ifoo, _name, _info, False) - self.assertEqual(len(_events), 0) - - def test_unregisterUtility_neither_factory_nor_component_nor_provided(self): - comp = self._makeOne() - self.assertRaises(TypeError, comp.unregisterUtility, - component=None, provided=None, factory=None) - - def test_unregisterUtility_both_factory_and_component(self): - def _factory(): - pass - _to_reg = object() - comp = self._makeOne() - self.assertRaises(TypeError, comp.unregisterUtility, - component=_to_reg, factory=_factory) - - def test_unregisterUtility_w_component_miss(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _name = _u('name') - _to_reg = object() - comp = self._makeOne() - _monkey, _events = self._wrapEvents() - with _monkey: - unreg = comp.unregisterUtility(_to_reg, ifoo, _name) - self.failIf(unreg) - self.failIf(_events) - - def test_unregisterUtility_w_component(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Unregistered - from zope.interface.registry import UtilityRegistration - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _name = _u('name') - _to_reg = object() - comp = self._makeOne() - comp.registerUtility(_to_reg, ifoo, _name) - _monkey, _events = self._wrapEvents() - with _monkey: - unreg = comp.unregisterUtility(_to_reg, ifoo, _name) - self.failUnless(unreg) - self.failIf(comp.utilities._adapters) # all erased - self.failIf((ifoo, _name) in comp._utility_registrations) - self.failIf(comp.utilities._subscribers) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Unregistered)) - self.failUnless(isinstance(event.object, UtilityRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.failUnless(event.object.name is _name) - self.failUnless(event.object.component is _to_reg) - self.failUnless(event.object.factory is None) - - def test_unregisterUtility_w_factory(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Unregistered - from zope.interface.registry import UtilityRegistration - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _info = _u('info') - _name = _u('name') - _to_reg = object() - def _factory(): - return _to_reg - comp = self._makeOne() - comp.registerUtility(None, ifoo, _name, _info, factory=_factory) - _monkey, _events = self._wrapEvents() - with _monkey: - unreg = comp.unregisterUtility(None, ifoo, _name, factory=_factory) - self.failUnless(unreg) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Unregistered)) - self.failUnless(isinstance(event.object, UtilityRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.failUnless(event.object.name is _name) - self.failUnless(event.object.component is _to_reg) - self.failUnless(event.object.factory is _factory) - - def test_unregisterUtility_wo_explicit_provided(self): - from zope.interface.declarations import directlyProvides - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Unregistered - from zope.interface.registry import UtilityRegistration - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - class Foo(object): - pass - ifoo = IFoo('IFoo') - _info = _u('info') - _name = _u('name') - _to_reg = Foo() - directlyProvides(_to_reg, ifoo) - comp = self._makeOne() - comp.registerUtility(_to_reg, ifoo, _name, _info) - _monkey, _events = self._wrapEvents() - with _monkey: - unreg = comp.unregisterUtility(_to_reg, None, _name) - self.failUnless(unreg) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Unregistered)) - self.failUnless(isinstance(event.object, UtilityRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.failUnless(event.object.name is _name) - self.failUnless(event.object.component is _to_reg) - self.failUnless(event.object.info is _info) - self.failUnless(event.object.factory is None) - - def test_unregisterUtility_wo_component_or_factory(self): - from zope.interface.declarations import directlyProvides - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Unregistered - from zope.interface.registry import UtilityRegistration - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - class Foo(object): - pass - ifoo = IFoo('IFoo') - _info = _u('info') - _name = _u('name') - _to_reg = Foo() - directlyProvides(_to_reg, ifoo) - comp = self._makeOne() - comp.registerUtility(_to_reg, ifoo, _name, _info) - _monkey, _events = self._wrapEvents() - with _monkey: - # Just pass the interface / name - unreg = comp.unregisterUtility(provided=ifoo, name=_name) - self.failUnless(unreg) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Unregistered)) - self.failUnless(isinstance(event.object, UtilityRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.failUnless(event.object.name is _name) - self.failUnless(event.object.component is _to_reg) - self.failUnless(event.object.info is _info) - self.failUnless(event.object.factory is None) - - def test_unregisterUtility_w_existing_subscr(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _info = _u('info') - _name1 = _u('name1') - _name2 = _u('name2') - _to_reg = object() - comp = self._makeOne() - comp.registerUtility(_to_reg, ifoo, _name1, _info) - comp.registerUtility(_to_reg, ifoo, _name2, _info) - _monkey, _events = self._wrapEvents() - with _monkey: - comp.unregisterUtility(_to_reg, ifoo, _name2) - self.assertEqual(comp.utilities._subscribers[0][ifoo][''], (_to_reg,)) - - def test_registeredUtilities_empty(self): - comp = self._makeOne() - self.assertEqual(list(comp.registeredUtilities()), []) - - def test_registeredUtilities_notempty(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - from zope.interface.registry import UtilityRegistration - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _info = _u('info') - _name1 = _u('name1') - _name2 = _u('name2') - _to_reg = object() - comp = self._makeOne() - comp.registerUtility(_to_reg, ifoo, _name1, _info) - comp.registerUtility(_to_reg, ifoo, _name2, _info) - reg = sorted(comp.registeredUtilities(), key=lambda r: r.name) - self.assertEqual(len(reg), 2) - self.failUnless(isinstance(reg[0], UtilityRegistration)) - self.failUnless(reg[0].registry is comp) - self.failUnless(reg[0].provided is ifoo) - self.failUnless(reg[0].name is _name1) - self.failUnless(reg[0].component is _to_reg) - self.failUnless(reg[0].info is _info) - self.failUnless(reg[0].factory is None) - self.failUnless(isinstance(reg[1], UtilityRegistration)) - self.failUnless(reg[1].registry is comp) - self.failUnless(reg[1].provided is ifoo) - self.failUnless(reg[1].name is _name2) - self.failUnless(reg[1].component is _to_reg) - self.failUnless(reg[1].info is _info) - self.failUnless(reg[1].factory is None) - - def test_queryUtility_miss_no_default(self): - from zope.interface.declarations import InterfaceClass - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - comp = self._makeOne() - self.failUnless(comp.queryUtility(ifoo) is None) - - def test_queryUtility_miss_w_default(self): - from zope.interface.declarations import InterfaceClass - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - comp = self._makeOne() - _default = object() - self.failUnless(comp.queryUtility(ifoo, default=_default) is _default) - - def test_queryUtility_hit(self): - from zope.interface.declarations import InterfaceClass - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _to_reg = object() - comp = self._makeOne() - comp.registerUtility(_to_reg, ifoo) - self.failUnless(comp.queryUtility(ifoo) is _to_reg) - - def test_getUtility_miss(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import ComponentLookupError - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - comp = self._makeOne() - self.assertRaises(ComponentLookupError, comp.getUtility, ifoo) - - def test_getUtility_hit(self): - from zope.interface.declarations import InterfaceClass - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _to_reg = object() - comp = self._makeOne() - comp.registerUtility(_to_reg, ifoo) - self.failUnless(comp.getUtility(ifoo) is _to_reg) - - def test_getUtilitiesFor_miss(self): - from zope.interface.declarations import InterfaceClass - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - comp = self._makeOne() - self.assertEqual(list(comp.getUtilitiesFor(ifoo)), []) - - def test_getUtilitiesFor_hit(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _name1 = _u('name1') - _name2 = _u('name2') - _to_reg = object() - comp = self._makeOne() - comp.registerUtility(_to_reg, ifoo, name=_name1) - comp.registerUtility(_to_reg, ifoo, name=_name2) - self.assertEqual(sorted(comp.getUtilitiesFor(ifoo)), - [(_name1, _to_reg), (_name2, _to_reg)]) - - def test_getAllUtilitiesRegisteredFor_miss(self): - from zope.interface.declarations import InterfaceClass - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - comp = self._makeOne() - self.assertEqual(list(comp.getAllUtilitiesRegisteredFor(ifoo)), []) - - def test_getAllUtilitiesRegisteredFor_hit(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _name1 = _u('name1') - _name2 = _u('name2') - _to_reg = object() - comp = self._makeOne() - comp.registerUtility(_to_reg, ifoo, name=_name1) - comp.registerUtility(_to_reg, ifoo, name=_name2) - self.assertEqual(list(comp.getAllUtilitiesRegisteredFor(ifoo)), - [_to_reg]) - - def test_registerAdapter_w_explicit_provided_and_required(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Registered - from zope.interface.registry import AdapterRegistration - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - _info = _u('info') - _name = _u('name') - _to_reg = object() - def _factory(context): - return _to_reg - comp = self._makeOne() - _monkey, _events = self._wrapEvents() - with _monkey: - comp.registerAdapter(_factory, (ibar,), ifoo, _name, _info) - self.failUnless(comp.adapters._adapters[1][ibar][ifoo][_name] - is _factory) - self.assertEqual(comp._adapter_registrations[(ibar,), ifoo, _name], - (_factory, _info)) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Registered)) - self.failUnless(isinstance(event.object, AdapterRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.assertEqual(event.object.required, (ibar,)) - self.failUnless(event.object.name is _name) - self.failUnless(event.object.info is _info) - self.failUnless(event.object.factory is _factory) - - def test_registerAdapter_no_provided_available(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - _info = _u('info') - _name = _u('name') - _to_reg = object() - class _Factory(object): - def __init__(self, context): - self._context = context - comp = self._makeOne() - self.assertRaises(TypeError, comp.registerAdapter, _Factory, (ibar,), - name=_name, info=_info) - - def test_registerAdapter_wo_explicit_provided(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.declarations import implementer - from zope.interface.interfaces import Registered - from zope.interface.registry import AdapterRegistration - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - _info = _u('info') - _name = _u('name') - _to_reg = object() - @implementer(ifoo) - class _Factory(object): - def __init__(self, context): - self._context = context - comp = self._makeOne() - _monkey, _events = self._wrapEvents() - with _monkey: - comp.registerAdapter(_Factory, (ibar,), name=_name, info=_info) - self.failUnless(comp.adapters._adapters[1][ibar][ifoo][_name] - is _Factory) - self.assertEqual(comp._adapter_registrations[(ibar,), ifoo, _name], - (_Factory, _info)) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Registered)) - self.failUnless(isinstance(event.object, AdapterRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.assertEqual(event.object.required, (ibar,)) - self.failUnless(event.object.name is _name) - self.failUnless(event.object.info is _info) - self.failUnless(event.object.factory is _Factory) - - def test_registerAdapter_no_required_available(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - _info = _u('info') - _name = _u('name') - class _Factory(object): - def __init__(self, context): - self._context = context - comp = self._makeOne() - self.assertRaises(TypeError, comp.registerAdapter, _Factory, - provided=ifoo, name=_name, info=_info) - - def test_registerAdapter_w_invalid_required(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - _info = _u('info') - _name = _u('name') - class _Factory(object): - def __init__(self, context): - self._context = context - comp = self._makeOne() - self.assertRaises(TypeError, comp.registerAdapter, _Factory, - ibar, provided=ifoo, name=_name, info=_info) - - def test_registerAdapter_w_required_containing_None(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interface import Interface - from zope.interface.interfaces import Registered - from zope.interface.registry import AdapterRegistration - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _info = _u('info') - _name = _u('name') - class _Factory(object): - def __init__(self, context): - self._context = context - comp = self._makeOne() - _monkey, _events = self._wrapEvents() - with _monkey: - comp.registerAdapter(_Factory, [None], provided=ifoo, - name=_name, info=_info) - self.failUnless(comp.adapters._adapters[1][Interface][ifoo][_name] - is _Factory) - self.assertEqual(comp._adapter_registrations[(Interface,), ifoo, _name], - (_Factory, _info)) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Registered)) - self.failUnless(isinstance(event.object, AdapterRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.assertEqual(event.object.required, (Interface,)) - self.failUnless(event.object.name is _name) - self.failUnless(event.object.info is _info) - self.failUnless(event.object.factory is _Factory) - - def test_registerAdapter_w_required_containing_class(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.declarations import implementer - from zope.interface.declarations import implementedBy - from zope.interface.interfaces import Registered - from zope.interface.registry import AdapterRegistration - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - _info = _u('info') - _name = _u('name') - class _Factory(object): - def __init__(self, context): - self._context = context - @implementer(ibar) - class _Context(object): - pass - _ctx_impl = implementedBy(_Context) - comp = self._makeOne() - _monkey, _events = self._wrapEvents() - with _monkey: - comp.registerAdapter(_Factory, [_Context], provided=ifoo, - name=_name, info=_info) - self.failUnless(comp.adapters._adapters[1][_ctx_impl][ifoo][_name] - is _Factory) - self.assertEqual(comp._adapter_registrations[(_ctx_impl,), ifoo, _name], - (_Factory, _info)) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Registered)) - self.failUnless(isinstance(event.object, AdapterRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.assertEqual(event.object.required, (_ctx_impl,)) - self.failUnless(event.object.name is _name) - self.failUnless(event.object.info is _info) - self.failUnless(event.object.factory is _Factory) - - def test_registerAdapter_w_required_containing_junk(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - _info = _u('info') - _name = _u('name') - class _Factory(object): - def __init__(self, context): - self._context = context - comp = self._makeOne() - self.assertRaises(TypeError, comp.registerAdapter, _Factory, [object()], - provided=ifoo, name=_name, info=_info) - - def test_registerAdapter_wo_explicit_required(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Registered - from zope.interface.registry import AdapterRegistration - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - _info = _u('info') - _name = _u('name') - class _Factory(object): - __component_adapts__ = (ibar,) - def __init__(self, context): - self._context = context - comp = self._makeOne() - _monkey, _events = self._wrapEvents() - with _monkey: - comp.registerAdapter(_Factory, provided=ifoo, name=_name, - info=_info) - self.failUnless(comp.adapters._adapters[1][ibar][ifoo][_name] - is _Factory) - self.assertEqual(comp._adapter_registrations[(ibar,), ifoo, _name], - (_Factory, _info)) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Registered)) - self.failUnless(isinstance(event.object, AdapterRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.assertEqual(event.object.required, (ibar,)) - self.failUnless(event.object.name is _name) - self.failUnless(event.object.info is _info) - self.failUnless(event.object.factory is _Factory) - - def test_registerAdapter_wo_event(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - _info = _u('info') - _name = _u('name') - _to_reg = object() - def _factory(context): - return _to_reg - comp = self._makeOne() - _monkey, _events = self._wrapEvents() - with _monkey: - comp.registerAdapter(_factory, (ibar,), ifoo, _name, _info, - event=False) - self.assertEqual(len(_events), 0) - - def test_unregisterAdapter_neither_factory_nor_provided(self): - comp = self._makeOne() - self.assertRaises(TypeError, comp.unregisterAdapter, - factory=None, provided=None) - - def test_unregisterAdapter_neither_factory_nor_required(self): - from zope.interface.declarations import InterfaceClass - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - comp = self._makeOne() - self.assertRaises(TypeError, comp.unregisterAdapter, - factory=None, provided=ifoo, required=None) - - def test_unregisterAdapter_miss(self): - from zope.interface.declarations import InterfaceClass - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - class _Factory(object): - def __init__(self, context): - self._context = context - comp = self._makeOne() - _monkey, _events = self._wrapEvents() - with _monkey: - unreg = comp.unregisterAdapter(_Factory, (ibar,), ifoo) - self.failIf(unreg) - - def test_unregisterAdapter_hit_w_explicit_provided_and_required(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Unregistered - from zope.interface.registry import AdapterRegistration - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - class _Factory(object): - def __init__(self, context): - self._context = context - comp = self._makeOne() - comp.registerAdapter(_Factory, (ibar,), ifoo) - _monkey, _events = self._wrapEvents() - with _monkey: - unreg = comp.unregisterAdapter(_Factory, (ibar,), ifoo) - self.failUnless(unreg) - self.failIf(comp.adapters._adapters) - self.failIf(comp._adapter_registrations) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Unregistered)) - self.failUnless(isinstance(event.object, AdapterRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.assertEqual(event.object.required, (ibar,)) - self.assertEqual(event.object.name, '') - self.assertEqual(event.object.info, '') - self.failUnless(event.object.factory is _Factory) - - def test_unregisterAdapter_wo_explicit_provided(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.declarations import implementer - from zope.interface.interfaces import Unregistered - from zope.interface.registry import AdapterRegistration - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - @implementer(ifoo) - class _Factory(object): - def __init__(self, context): - self._context = context - comp = self._makeOne() - comp.registerAdapter(_Factory, (ibar,), ifoo) - _monkey, _events = self._wrapEvents() - with _monkey: - unreg = comp.unregisterAdapter(_Factory, (ibar,)) - self.failUnless(unreg) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Unregistered)) - self.failUnless(isinstance(event.object, AdapterRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.assertEqual(event.object.required, (ibar,)) - self.assertEqual(event.object.name, '') - self.assertEqual(event.object.info, '') - self.failUnless(event.object.factory is _Factory) - - def test_unregisterAdapter_wo_explicit_required(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Unregistered - from zope.interface.registry import AdapterRegistration - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - class _Factory(object): - __component_adapts__ = (ibar,) - def __init__(self, context): - self._context = context - comp = self._makeOne() - comp.registerAdapter(_Factory, (ibar,), ifoo) - _monkey, _events = self._wrapEvents() - with _monkey: - unreg = comp.unregisterAdapter(_Factory, provided=ifoo) - self.failUnless(unreg) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Unregistered)) - self.failUnless(isinstance(event.object, AdapterRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.assertEqual(event.object.required, (ibar,)) - self.assertEqual(event.object.name, '') - self.assertEqual(event.object.info, '') - self.failUnless(event.object.factory is _Factory) - - def test_registeredAdapters_empty(self): - comp = self._makeOne() - self.assertEqual(list(comp.registeredAdapters()), []) - - def test_registeredAdapters_notempty(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - from zope.interface.registry import AdapterRegistration - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IFoo') - _info = _u('info') - _name1 = _u('name1') - _name2 = _u('name2') - class _Factory(object): - def __init__(self, context): - pass - comp = self._makeOne() - comp.registerAdapter(_Factory, (ibar,), ifoo, _name1, _info) - comp.registerAdapter(_Factory, (ibar,), ifoo, _name2, _info) - reg = sorted(comp.registeredAdapters(), key=lambda r: r.name) - self.assertEqual(len(reg), 2) - self.failUnless(isinstance(reg[0], AdapterRegistration)) - self.failUnless(reg[0].registry is comp) - self.failUnless(reg[0].provided is ifoo) - self.assertEqual(reg[0].required, (ibar,)) - self.failUnless(reg[0].name is _name1) - self.failUnless(reg[0].info is _info) - self.failUnless(reg[0].factory is _Factory) - self.failUnless(isinstance(reg[1], AdapterRegistration)) - self.failUnless(reg[1].registry is comp) - self.failUnless(reg[1].provided is ifoo) - self.assertEqual(reg[1].required, (ibar,)) - self.failUnless(reg[1].name is _name2) - self.failUnless(reg[1].info is _info) - self.failUnless(reg[1].factory is _Factory) - - def test_queryAdapter_miss_no_default(self): - from zope.interface.declarations import InterfaceClass - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - comp = self._makeOne() - _context = object() - self.failUnless(comp.queryAdapter(_context, ifoo) is None) - - def test_queryAdapter_miss_w_default(self): - from zope.interface.declarations import InterfaceClass - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - comp = self._makeOne() - _context = object() - _default = object() - self.failUnless( - comp.queryAdapter(_context, ifoo, default=_default) is _default) - - def test_queryAdapter_hit(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.declarations import implementer - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - class _Factory(object): - def __init__(self, context): - self.context = context - @implementer(ibar) - class _Context(object): - pass - _context = _Context() - comp = self._makeOne() - comp.registerAdapter(_Factory, (ibar,), ifoo) - adapter = comp.queryAdapter(_context, ifoo) - self.failUnless(isinstance(adapter, _Factory)) - self.failUnless(adapter.context is _context) - - def test_getAdapter_miss(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.declarations import implementer - from zope.interface.interfaces import ComponentLookupError - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - @implementer(ibar) - class _Context(object): - pass - _context = _Context() - comp = self._makeOne() - self.assertRaises(ComponentLookupError, - comp.getAdapter, _context, ifoo) - - def test_getAdapter_hit(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.declarations import implementer - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - class _Factory(object): - def __init__(self, context): - self.context = context - @implementer(ibar) - class _Context(object): - pass - _context = _Context() - comp = self._makeOne() - comp.registerAdapter(_Factory, (ibar,), ifoo) - adapter = comp.getAdapter(_context, ifoo) - self.failUnless(isinstance(adapter, _Factory)) - self.failUnless(adapter.context is _context) - - def test_queryMultiAdapter_miss(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.declarations import implementer - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - ibaz = IFoo('IBaz') - @implementer(ibar) - class _Context1(object): - pass - @implementer(ibaz) - class _Context2(object): - pass - _context1 = _Context1() - _context2 = _Context2() - comp = self._makeOne() - self.assertEqual(comp.queryMultiAdapter((_context1, _context2), ifoo), - None) - - def test_queryMultiAdapter_miss_w_default(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.declarations import implementer - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - ibaz = IFoo('IBaz') - @implementer(ibar) - class _Context1(object): - pass - @implementer(ibaz) - class _Context2(object): - pass - _context1 = _Context1() - _context2 = _Context2() - _default = object() - comp = self._makeOne() - self.failUnless( - comp.queryMultiAdapter((_context1, _context2), ifoo, - default=_default) is _default) - - def test_queryMultiAdapter_hit(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.declarations import implementer - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - ibaz = IFoo('IBaz') - @implementer(ibar) - class _Context1(object): - pass - @implementer(ibaz) - class _Context2(object): - pass - _context1 = _Context1() - _context2 = _Context2() - class _Factory(object): - def __init__(self, context1, context2): - self.context = context1, context2 - comp = self._makeOne() - comp.registerAdapter(_Factory, (ibar, ibaz), ifoo) - adapter = comp.queryMultiAdapter((_context1, _context2), ifoo) - self.failUnless(isinstance(adapter, _Factory)) - self.assertEqual(adapter.context, (_context1, _context2)) - - def test_getMultiAdapter_miss(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.declarations import implementer - from zope.interface.interfaces import ComponentLookupError - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - ibaz = IFoo('IBaz') - @implementer(ibar) - class _Context1(object): - pass - @implementer(ibaz) - class _Context2(object): - pass - _context1 = _Context1() - _context2 = _Context2() - comp = self._makeOne() - self.assertRaises(ComponentLookupError, - comp.getMultiAdapter, (_context1, _context2), ifoo) - - def test_getMultiAdapter_hit(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.declarations import implementer - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - ibaz = IFoo('IBaz') - @implementer(ibar) - class _Context1(object): - pass - @implementer(ibaz) - class _Context2(object): - pass - _context1 = _Context1() - _context2 = _Context2() - class _Factory(object): - def __init__(self, context1, context2): - self.context = context1, context2 - comp = self._makeOne() - comp.registerAdapter(_Factory, (ibar, ibaz), ifoo) - adapter = comp.getMultiAdapter((_context1, _context2), ifoo) - self.failUnless(isinstance(adapter, _Factory)) - self.assertEqual(adapter.context, (_context1, _context2)) - - def test_getAdapters_empty(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.declarations import implementer - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - ibaz = IFoo('IBaz') - @implementer(ibar) - class _Context1(object): - pass - @implementer(ibaz) - class _Context2(object): - pass - _context1 = _Context1() - _context2 = _Context2() - comp = self._makeOne() - self.assertEqual( - list(comp.getAdapters((_context1, _context2), ifoo)), []) - - def test_getAdapters_non_empty(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.declarations import implementer - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - ibaz = IFoo('IBaz') - @implementer(ibar) - class _Context1(object): - pass - @implementer(ibaz) - class _Context2(object): - pass - _context1 = _Context1() - _context2 = _Context2() - class _Factory1(object): - def __init__(self, context1, context2): - self.context = context1, context2 - class _Factory2(object): - def __init__(self, context1, context2): - self.context = context1, context2 - _name1 = _u('name1') - _name2 = _u('name2') - comp = self._makeOne() - comp.registerAdapter(_Factory1, (ibar, ibaz), ifoo, name=_name1) - comp.registerAdapter(_Factory2, (ibar, ibaz), ifoo, name=_name2) - found = sorted(comp.getAdapters((_context1, _context2), ifoo)) - self.assertEqual(len(found), 2) - self.assertEqual(found[0][0], _name1) - self.failUnless(isinstance(found[0][1], _Factory1)) - self.assertEqual(found[1][0], _name2) - self.failUnless(isinstance(found[1][1], _Factory2)) - - def test_registerSubscriptionAdapter_w_nonblank_name(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - _name = _u('name') - _info = _u('info') - _to_reg = object() - def _factory(context): - return _to_reg - comp = self._makeOne() - self.assertRaises(TypeError, comp.registerSubscriptionAdapter, - _factory, (ibar,), ifoo, _name, _info) - - def test_registerSubscriptionAdapter_w_explicit_provided_and_required(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Registered - from zope.interface.registry import SubscriptionRegistration - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - _blank = _u('') - _info = _u('info') - _to_reg = object() - def _factory(context): - return _to_reg - comp = self._makeOne() - _monkey, _events = self._wrapEvents() - with _monkey: - comp.registerSubscriptionAdapter(_factory, (ibar,), ifoo, - info=_info) - reg = comp.adapters._subscribers[1][ibar][ifoo][_blank] - self.assertEqual(len(reg), 1) - self.failUnless(reg[0] is _factory) - self.assertEqual(comp._subscription_registrations, - [((ibar,), ifoo, _blank, _factory, _info)]) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Registered)) - self.failUnless(isinstance(event.object, SubscriptionRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.assertEqual(event.object.required, (ibar,)) - self.assertEqual(event.object.name, _blank) - self.failUnless(event.object.info is _info) - self.failUnless(event.object.factory is _factory) - - def test_registerSubscriptionAdapter_wo_explicit_provided(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.declarations import implementer - from zope.interface.interfaces import Registered - from zope.interface.registry import SubscriptionRegistration - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - _info = _u('info') - _blank = _u('') - _to_reg = object() - @implementer(ifoo) - class _Factory(object): - def __init__(self, context): - self._context = context - comp = self._makeOne() - _monkey, _events = self._wrapEvents() - with _monkey: - comp.registerSubscriptionAdapter(_Factory, (ibar,), info=_info) - reg = comp.adapters._subscribers[1][ibar][ifoo][_blank] - self.assertEqual(len(reg), 1) - self.failUnless(reg[0] is _Factory) - self.assertEqual(comp._subscription_registrations, - [((ibar,), ifoo, _blank, _Factory, _info)]) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Registered)) - self.failUnless(isinstance(event.object, SubscriptionRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.assertEqual(event.object.required, (ibar,)) - self.assertEqual(event.object.name, _blank) - self.failUnless(event.object.info is _info) - self.failUnless(event.object.factory is _Factory) - - def test_registerSubscriptionAdapter_wo_explicit_required(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Registered - from zope.interface.registry import SubscriptionRegistration - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - _info = _u('info') - _blank = _u('') - class _Factory(object): - __component_adapts__ = (ibar,) - def __init__(self, context): - self._context = context - comp = self._makeOne() - _monkey, _events = self._wrapEvents() - with _monkey: - comp.registerSubscriptionAdapter( - _Factory, provided=ifoo, info=_info) - reg = comp.adapters._subscribers[1][ibar][ifoo][_blank] - self.assertEqual(len(reg), 1) - self.failUnless(reg[0] is _Factory) - self.assertEqual(comp._subscription_registrations, - [((ibar,), ifoo, _blank, _Factory, _info)]) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Registered)) - self.failUnless(isinstance(event.object, SubscriptionRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.assertEqual(event.object.required, (ibar,)) - self.assertEqual(event.object.name, _blank) - self.failUnless(event.object.info is _info) - self.failUnless(event.object.factory is _Factory) - - def test_registerSubscriptionAdapter_wo_event(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - _blank = _u('') - _info = _u('info') - _to_reg = object() - def _factory(context): - return _to_reg - comp = self._makeOne() - _monkey, _events = self._wrapEvents() - with _monkey: - comp.registerSubscriptionAdapter(_factory, (ibar,), ifoo, - info=_info, event=False) - self.assertEqual(len(_events), 0) - - def test_registeredSubscriptionAdapters_empty(self): - comp = self._makeOne() - self.assertEqual(list(comp.registeredSubscriptionAdapters()), []) - - def test_registeredSubscriptionAdapters_notempty(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - from zope.interface.registry import SubscriptionRegistration - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IFoo') - _info = _u('info') - _blank = _u('') - class _Factory(object): - def __init__(self, context): - pass - comp = self._makeOne() - comp.registerSubscriptionAdapter(_Factory, (ibar,), ifoo, info=_info) - comp.registerSubscriptionAdapter(_Factory, (ibar,), ifoo, info=_info) - reg = list(comp.registeredSubscriptionAdapters()) - self.assertEqual(len(reg), 2) - self.failUnless(isinstance(reg[0], SubscriptionRegistration)) - self.failUnless(reg[0].registry is comp) - self.failUnless(reg[0].provided is ifoo) - self.assertEqual(reg[0].required, (ibar,)) - self.assertEqual(reg[0].name, _blank) - self.failUnless(reg[0].info is _info) - self.failUnless(reg[0].factory is _Factory) - self.failUnless(isinstance(reg[1], SubscriptionRegistration)) - self.failUnless(reg[1].registry is comp) - self.failUnless(reg[1].provided is ifoo) - self.assertEqual(reg[1].required, (ibar,)) - self.assertEqual(reg[1].name, _blank) - self.failUnless(reg[1].info is _info) - self.failUnless(reg[1].factory is _Factory) - - def test_unregisterSubscriptionAdapter_w_nonblank_name(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - _nonblank = _u('nonblank') - comp = self._makeOne() - self.assertRaises(TypeError, comp.unregisterSubscriptionAdapter, - required=ifoo, provided=ibar, name=_nonblank) - - def test_unregisterSubscriptionAdapter_neither_factory_nor_provided(self): - comp = self._makeOne() - self.assertRaises(TypeError, comp.unregisterSubscriptionAdapter, - factory=None, provided=None) - - def test_unregisterSubscriptionAdapter_neither_factory_nor_required(self): - from zope.interface.declarations import InterfaceClass - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - comp = self._makeOne() - self.assertRaises(TypeError, comp.unregisterSubscriptionAdapter, - factory=None, provided=ifoo, required=None) - - def test_unregisterSubscriptionAdapter_miss(self): - from zope.interface.declarations import InterfaceClass - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - class _Factory(object): - def __init__(self, context): - self._context = context - comp = self._makeOne() - _monkey, _events = self._wrapEvents() - with _monkey: - unreg = comp.unregisterSubscriptionAdapter(_Factory, (ibar,), ifoo) - self.failIf(unreg) - self.failIf(_events) - - def test_unregisterSubscriptionAdapter_hit_wo_factory(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Unregistered - from zope.interface.registry import SubscriptionRegistration - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - class _Factory(object): - def __init__(self, context): - self._context = context - comp = self._makeOne() - comp.registerSubscriptionAdapter(_Factory, (ibar,), ifoo) - _monkey, _events = self._wrapEvents() - with _monkey: - unreg = comp.unregisterSubscriptionAdapter(None, (ibar,), ifoo) - self.failUnless(unreg) - self.failIf(comp.adapters._subscribers) - self.failIf(comp._subscription_registrations) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Unregistered)) - self.failUnless(isinstance(event.object, SubscriptionRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.assertEqual(event.object.required, (ibar,)) - self.assertEqual(event.object.name, '') - self.assertEqual(event.object.info, '') - self.failUnless(event.object.factory is None) - - def test_unregisterSubscriptionAdapter_hit_w_factory(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Unregistered - from zope.interface.registry import SubscriptionRegistration - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - class _Factory(object): - def __init__(self, context): - self._context = context - comp = self._makeOne() - comp.registerSubscriptionAdapter(_Factory, (ibar,), ifoo) - _monkey, _events = self._wrapEvents() - with _monkey: - unreg = comp.unregisterSubscriptionAdapter(_Factory, (ibar,), ifoo) - self.failUnless(unreg) - self.failIf(comp.adapters._subscribers) - self.failIf(comp._subscription_registrations) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Unregistered)) - self.failUnless(isinstance(event.object, SubscriptionRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.assertEqual(event.object.required, (ibar,)) - self.assertEqual(event.object.name, '') - self.assertEqual(event.object.info, '') - self.failUnless(event.object.factory is _Factory) - - def test_unregisterSubscriptionAdapter_wo_explicit_provided(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.declarations import implementer - from zope.interface.interfaces import Unregistered - from zope.interface.registry import SubscriptionRegistration - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - @implementer(ifoo) - class _Factory(object): - def __init__(self, context): - self._context = context - comp = self._makeOne() - comp.registerSubscriptionAdapter(_Factory, (ibar,), ifoo) - _monkey, _events = self._wrapEvents() - with _monkey: - unreg = comp.unregisterSubscriptionAdapter(_Factory, (ibar,)) - self.failUnless(unreg) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Unregistered)) - self.failUnless(isinstance(event.object, SubscriptionRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.assertEqual(event.object.required, (ibar,)) - self.assertEqual(event.object.name, '') - self.assertEqual(event.object.info, '') - self.failUnless(event.object.factory is _Factory) - - def test_unregisterSubscriptionAdapter_wo_explicit_required(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Unregistered - from zope.interface.registry import SubscriptionRegistration - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - class _Factory(object): - __component_adapts__ = (ibar,) - def __init__(self, context): - self._context = context - comp = self._makeOne() - comp.registerSubscriptionAdapter(_Factory, (ibar,), ifoo) - _monkey, _events = self._wrapEvents() - with _monkey: - unreg = comp.unregisterSubscriptionAdapter(_Factory, provided=ifoo) - self.failUnless(unreg) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Unregistered)) - self.failUnless(isinstance(event.object, SubscriptionRegistration)) - self.failUnless(event.object.registry is comp) - self.failUnless(event.object.provided is ifoo) - self.assertEqual(event.object.required, (ibar,)) - self.assertEqual(event.object.name, '') - self.assertEqual(event.object.info, '') - self.failUnless(event.object.factory is _Factory) - - def test_subscribers_empty(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.declarations import implementer - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - comp = self._makeOne() - @implementer(ibar) - class Bar(object): - pass - bar = Bar() - self.assertEqual(list(comp.subscribers((bar,), ifoo)), []) - - def test_subscribers_non_empty(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.declarations import implementer - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - class _Factory(object): - __component_adapts__ = (ibar,) - def __init__(self, context): - self._context = context - class _Derived(_Factory): - pass - comp = self._makeOne() - comp.registerSubscriptionAdapter(_Factory, (ibar,), ifoo) - comp.registerSubscriptionAdapter(_Derived, (ibar,), ifoo) - @implementer(ibar) - class Bar(object): - pass - bar = Bar() - subscribers = comp.subscribers((bar,), ifoo) - def _klassname(x): - return x.__class__.__name__ - subscribers = sorted(subscribers, key=_klassname) - self.assertEqual(len(subscribers), 2) - self.failUnless(isinstance(subscribers[0], _Derived)) - self.failUnless(isinstance(subscribers[1], _Factory)) - - def test_registerHandler_w_nonblank_name(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _nonblank = _u('nonblank') - comp = self._makeOne() - def _factory(context): - pass - self.assertRaises(TypeError, comp.registerHandler, _factory, - required=ifoo, name=_nonblank) - - def test_registerHandler_w_explicit_required(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Registered - from zope.interface.registry import HandlerRegistration - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _blank = _u('') - _info = _u('info') - _to_reg = object() - def _factory(context): - return _to_reg - comp = self._makeOne() - _monkey, _events = self._wrapEvents() - with _monkey: - comp.registerHandler(_factory, (ifoo,), info=_info) - reg = comp.adapters._subscribers[1][ifoo][None][_blank] - self.assertEqual(len(reg), 1) - self.failUnless(reg[0] is _factory) - self.assertEqual(comp._handler_registrations, - [((ifoo,), _blank, _factory, _info)]) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Registered)) - self.failUnless(isinstance(event.object, HandlerRegistration)) - self.failUnless(event.object.registry is comp) - self.assertEqual(event.object.required, (ifoo,)) - self.assertEqual(event.object.name, _blank) - self.failUnless(event.object.info is _info) - self.failUnless(event.object.factory is _factory) - - def test_registerHandler_wo_explicit_required(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Registered - from zope.interface.registry import HandlerRegistration - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _info = _u('info') - _blank = _u('') - class _Factory(object): - __component_adapts__ = (ifoo,) - def __init__(self, context): - self._context = context - comp = self._makeOne() - _monkey, _events = self._wrapEvents() - with _monkey: - comp.registerHandler(_Factory, info=_info) - reg = comp.adapters._subscribers[1][ifoo][None][_blank] - self.assertEqual(len(reg), 1) - self.failUnless(reg[0] is _Factory) - self.assertEqual(comp._handler_registrations, - [((ifoo,), _blank, _Factory, _info)]) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Registered)) - self.failUnless(isinstance(event.object, HandlerRegistration)) - self.failUnless(event.object.registry is comp) - self.assertEqual(event.object.required, (ifoo,)) - self.assertEqual(event.object.name, _blank) - self.failUnless(event.object.info is _info) - self.failUnless(event.object.factory is _Factory) - - def test_registeredHandlers_empty(self): - from zope.interface.declarations import InterfaceClass - class IFoo(InterfaceClass): - pass - comp = self._makeOne() - self.failIf(list(comp.registeredHandlers())) - - def test_registeredHandlers_non_empty(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.registry import HandlerRegistration - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - def _factory1(context): - pass - def _factory2(context): - pass - comp = self._makeOne() - comp.registerHandler(_factory1, (ifoo,)) - comp.registerHandler(_factory2, (ifoo,)) - def _factory_name(x): - return x.factory.__code__.co_name - subscribers = sorted(comp.registeredHandlers(), key=_factory_name) - self.assertEqual(len(subscribers), 2) - self.failUnless(isinstance(subscribers[0], HandlerRegistration)) - self.assertEqual(subscribers[0].required, (ifoo,)) - self.assertEqual(subscribers[0].name, '') - self.assertEqual(subscribers[0].factory, _factory1) - self.assertEqual(subscribers[0].info, '') - self.failUnless(isinstance(subscribers[1], HandlerRegistration)) - self.assertEqual(subscribers[1].required, (ifoo,)) - self.assertEqual(subscribers[1].name, '') - self.assertEqual(subscribers[1].factory, _factory2) - self.assertEqual(subscribers[1].info, '') - - def test_unregisterHandler_w_nonblank_name(self): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _nonblank = _u('nonblank') - comp = self._makeOne() - self.assertRaises(TypeError, comp.unregisterHandler, - required=(ifoo,), name=_nonblank) - - def test_unregisterHandler_neither_factory_nor_required(self): - from zope.interface.declarations import InterfaceClass - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - comp = self._makeOne() - self.assertRaises(TypeError, comp.unregisterHandler) - - def test_unregisterHandler_miss(self): - from zope.interface.declarations import InterfaceClass - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - comp = self._makeOne() - unreg = comp.unregisterHandler(required=(ifoo,)) - self.failIf(unreg) - - def test_unregisterHandler_hit_w_factory_and_explicit_provided(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Unregistered - from zope.interface.registry import HandlerRegistration - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - comp = self._makeOne() - _to_reg = object() - def _factory(context): - return _to_reg - comp = self._makeOne() - comp.registerHandler(_factory, (ifoo,)) - _monkey, _events = self._wrapEvents() - with _monkey: - unreg = comp.unregisterHandler(_factory, (ifoo,)) - self.failUnless(unreg) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Unregistered)) - self.failUnless(isinstance(event.object, HandlerRegistration)) - self.failUnless(event.object.registry is comp) - self.assertEqual(event.object.required, (ifoo,)) - self.assertEqual(event.object.name, '') - self.failUnless(event.object.factory is _factory) - - def test_unregisterHandler_hit_w_only_explicit_provided(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Unregistered - from zope.interface.registry import HandlerRegistration - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - comp = self._makeOne() - _to_reg = object() - def _factory(context): - return _to_reg - comp = self._makeOne() - comp.registerHandler(_factory, (ifoo,)) - _monkey, _events = self._wrapEvents() - with _monkey: - unreg = comp.unregisterHandler(required=(ifoo,)) - self.failUnless(unreg) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Unregistered)) - self.failUnless(isinstance(event.object, HandlerRegistration)) - self.failUnless(event.object.registry is comp) - self.assertEqual(event.object.required, (ifoo,)) - self.assertEqual(event.object.name, '') - self.failUnless(event.object.factory is None) - - def test_unregisterHandler_wo_explicit_required(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.interfaces import Unregistered - from zope.interface.registry import HandlerRegistration - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - class _Factory(object): - __component_adapts__ = (ifoo,) - def __init__(self, context): - self._context = context - comp = self._makeOne() - comp.registerHandler(_Factory) - _monkey, _events = self._wrapEvents() - with _monkey: - unreg = comp.unregisterHandler(_Factory) - self.failUnless(unreg) - self.assertEqual(len(_events), 1) - args, kw = _events[0] - event, = args - self.assertEqual(kw, {}) - self.failUnless(isinstance(event, Unregistered)) - self.failUnless(isinstance(event.object, HandlerRegistration)) - self.failUnless(event.object.registry is comp) - self.assertEqual(event.object.required, (ifoo,)) - self.assertEqual(event.object.name, '') - self.assertEqual(event.object.info, '') - self.failUnless(event.object.factory is _Factory) - - def test_handle_empty(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.declarations import implementer - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - comp = self._makeOne() - @implementer(ifoo) - class Bar(object): - pass - bar = Bar() - comp.handle((bar,)) # doesn't raise - - def test_handle_non_empty(self): - from zope.interface.declarations import InterfaceClass - from zope.interface.declarations import implementer - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - _called_1 = [] - def _factory_1(context): - _called_1.append(context) - _called_2 = [] - def _factory_2(context): - _called_2.append(context) - comp = self._makeOne() - comp.registerHandler(_factory_1, (ifoo,)) - comp.registerHandler(_factory_2, (ifoo,)) - @implementer(ifoo) - class Bar(object): - pass - bar = Bar() - comp.handle(bar) - self.assertEqual(_called_1, [bar]) - self.assertEqual(_called_2, [bar]) - - -# Test _getUtilityProvided, _getAdapterProvided, _getAdapterRequired via their -# callers (Component.registerUtility, Component.registerAdapter). - - -class UtilityRegistrationTests(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.registry import UtilityRegistration - return UtilityRegistration - - def _makeOne(self, component=None, factory=None): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - class _Registry(object): - def __repr__(self): - return '_REGISTRY' - registry = _Registry() - name = _u('name') - doc = 'DOCSTRING' - klass = self._getTargetClass() - return (klass(registry, ifoo, name, component, doc, factory), - registry, - name, - ) - - def test_class_conforms_to_IUtilityRegistration(self): - from zope.interface.verify import verifyClass - from zope.interface.interfaces import IUtilityRegistration - verifyClass(IUtilityRegistration, self._getTargetClass()) - - def test_instance_conforms_to_IUtilityRegistration(self): - from zope.interface.verify import verifyObject - from zope.interface.interfaces import IUtilityRegistration - ur, _, _ = self._makeOne() - verifyObject(IUtilityRegistration, ur) - - def test___repr__(self): - class _Component(object): - __name__ = 'TEST' - _component = _Component() - ur, _registry, _name = self._makeOne(_component) - self.assertEqual(repr(ur), - "UtilityRegistration(_REGISTRY, IFoo, %r, TEST, None, 'DOCSTRING')" - % (_name)) - - def test___repr___provided_wo_name(self): - class _Component(object): - def __repr__(self): - return 'TEST' - _component = _Component() - ur, _registry, _name = self._makeOne(_component) - ur.provided = object() - self.assertEqual(repr(ur), - "UtilityRegistration(_REGISTRY, None, %r, TEST, None, 'DOCSTRING')" - % (_name)) - - def test___repr___component_wo_name(self): - class _Component(object): - def __repr__(self): - return 'TEST' - _component = _Component() - ur, _registry, _name = self._makeOne(_component) - ur.provided = object() - self.assertEqual(repr(ur), - "UtilityRegistration(_REGISTRY, None, %r, TEST, None, 'DOCSTRING')" - % (_name)) - - def test___hash__(self): - _component = object() - ur, _registry, _name = self._makeOne(_component) - self.assertEqual(ur.__hash__(), id(ur)) - - def test___eq___identity(self): - _component = object() - ur, _registry, _name = self._makeOne(_component) - self.failUnless(ur == ur) - - def test___eq___hit(self): - _component = object() - ur, _registry, _name = self._makeOne(_component) - ur2, _, _ = self._makeOne(_component) - self.failUnless(ur == ur2) - - def test___eq___miss(self): - _component = object() - _component2 = object() - ur, _registry, _name = self._makeOne(_component) - ur2, _, _ = self._makeOne(_component2) - self.failIf(ur == ur2) - - def test___ne___identity(self): - _component = object() - ur, _registry, _name = self._makeOne(_component) - self.failIf(ur != ur) - - def test___ne___hit(self): - _component = object() - ur, _registry, _name = self._makeOne(_component) - ur2, _, _ = self._makeOne(_component) - self.failIf(ur != ur2) - - def test___ne___miss(self): - _component = object() - _component2 = object() - ur, _registry, _name = self._makeOne(_component) - ur2, _, _ = self._makeOne(_component2) - self.failUnless(ur != ur2) - - def test___lt___identity(self): - _component = object() - ur, _registry, _name = self._makeOne(_component) - self.failIf(ur < ur) - - def test___lt___hit(self): - _component = object() - ur, _registry, _name = self._makeOne(_component) - ur2, _, _ = self._makeOne(_component) - self.failIf(ur < ur2) - - def test___lt___miss(self): - _component = object() - _component2 = object() - ur, _registry, _name = self._makeOne(_component) - ur2, _, _ = self._makeOne(_component2) - ur2.name = _name + '2' - self.failUnless(ur < ur2) - - def test___le___identity(self): - _component = object() - ur, _registry, _name = self._makeOne(_component) - self.failUnless(ur <= ur) - - def test___le___hit(self): - _component = object() - ur, _registry, _name = self._makeOne(_component) - ur2, _, _ = self._makeOne(_component) - self.failUnless(ur <= ur2) - - def test___le___miss(self): - _component = object() - _component2 = object() - ur, _registry, _name = self._makeOne(_component) - ur2, _, _ = self._makeOne(_component2) - ur2.name = _name + '2' - self.failUnless(ur <= ur2) - - def test___gt___identity(self): - _component = object() - ur, _registry, _name = self._makeOne(_component) - self.failIf(ur > ur) - - def test___gt___hit(self): - _component = object() - _component2 = object() - ur, _registry, _name = self._makeOne(_component) - ur2, _, _ = self._makeOne(_component2) - ur2.name = _name + '2' - self.failUnless(ur2 > ur) - - def test___gt___miss(self): - _component = object() - ur, _registry, _name = self._makeOne(_component) - ur2, _, _ = self._makeOne(_component) - self.failIf(ur2 > ur) - - def test___ge___identity(self): - _component = object() - ur, _registry, _name = self._makeOne(_component) - self.failUnless(ur >= ur) - - def test___ge___miss(self): - _component = object() - _component2 = object() - ur, _registry, _name = self._makeOne(_component) - ur2, _, _ = self._makeOne(_component2) - ur2.name = _name + '2' - self.failIf(ur >= ur2) - - def test___ge___hit(self): - _component = object() - ur, _registry, _name = self._makeOne(_component) - ur2, _, _ = self._makeOne(_component) - ur2.name = _name + '2' - self.failUnless(ur2 >= ur) - - -class AdapterRegistrationTests(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.registry import AdapterRegistration - return AdapterRegistration - - def _makeOne(self, component=None): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - class _Registry(object): - def __repr__(self): - return '_REGISTRY' - registry = _Registry() - name = _u('name') - doc = 'DOCSTRING' - klass = self._getTargetClass() - return (klass(registry, (ibar,), ifoo, name, component, doc), - registry, - name, - ) - - def test_class_conforms_to_IAdapterRegistration(self): - from zope.interface.verify import verifyClass - from zope.interface.interfaces import IAdapterRegistration - verifyClass(IAdapterRegistration, self._getTargetClass()) - - def test_instance_conforms_to_IAdapterRegistration(self): - from zope.interface.verify import verifyObject - from zope.interface.interfaces import IAdapterRegistration - ar, _, _ = self._makeOne() - verifyObject(IAdapterRegistration, ar) - - def test___repr__(self): - class _Component(object): - __name__ = 'TEST' - _component = _Component() - ar, _registry, _name = self._makeOne(_component) - self.assertEqual(repr(ar), - ("AdapterRegistration(_REGISTRY, [IBar], IFoo, %r, TEST, " - + "'DOCSTRING')") % (_name)) - - def test___repr___provided_wo_name(self): - class _Component(object): - def __repr__(self): - return 'TEST' - _component = _Component() - ar, _registry, _name = self._makeOne(_component) - ar.provided = object() - self.assertEqual(repr(ar), - ("AdapterRegistration(_REGISTRY, [IBar], None, %r, TEST, " - + "'DOCSTRING')") % (_name)) - - def test___repr___component_wo_name(self): - class _Component(object): - def __repr__(self): - return 'TEST' - _component = _Component() - ar, _registry, _name = self._makeOne(_component) - ar.provided = object() - self.assertEqual(repr(ar), - ("AdapterRegistration(_REGISTRY, [IBar], None, %r, TEST, " - + "'DOCSTRING')") % (_name)) - - def test___hash__(self): - _component = object() - ar, _registry, _name = self._makeOne(_component) - self.assertEqual(ar.__hash__(), id(ar)) - - def test___eq___identity(self): - _component = object() - ar, _registry, _name = self._makeOne(_component) - self.failUnless(ar == ar) - - def test___eq___hit(self): - _component = object() - ar, _registry, _name = self._makeOne(_component) - ar2, _, _ = self._makeOne(_component) - self.failUnless(ar == ar2) - - def test___eq___miss(self): - _component = object() - _component2 = object() - ar, _registry, _name = self._makeOne(_component) - ar2, _, _ = self._makeOne(_component2) - self.failIf(ar == ar2) - - def test___ne___identity(self): - _component = object() - ar, _registry, _name = self._makeOne(_component) - self.failIf(ar != ar) - - def test___ne___miss(self): - _component = object() - ar, _registry, _name = self._makeOne(_component) - ar2, _, _ = self._makeOne(_component) - self.failIf(ar != ar2) - - def test___ne___hit_component(self): - _component = object() - _component2 = object() - ar, _registry, _name = self._makeOne(_component) - ar2, _, _ = self._makeOne(_component2) - self.failUnless(ar != ar2) - - def test___ne___hit_provided(self): - from zope.interface.declarations import InterfaceClass - class IFoo(InterfaceClass): - pass - ibaz = IFoo('IBaz') - _component = object() - ar, _registry, _name = self._makeOne(_component) - ar2, _, _ = self._makeOne(_component) - ar2.provided = ibaz - self.failUnless(ar != ar2) - - def test___ne___hit_required(self): - from zope.interface.declarations import InterfaceClass - class IFoo(InterfaceClass): - pass - ibaz = IFoo('IBaz') - _component = object() - _component2 = object() - ar, _registry, _name = self._makeOne(_component) - ar2, _, _ = self._makeOne(_component2) - ar2.required = (ibaz,) - self.failUnless(ar != ar2) - - def test___lt___identity(self): - _component = object() - ar, _registry, _name = self._makeOne(_component) - self.failIf(ar < ar) - - def test___lt___hit(self): - _component = object() - ar, _registry, _name = self._makeOne(_component) - ar2, _, _ = self._makeOne(_component) - self.failIf(ar < ar2) - - def test___lt___miss(self): - _component = object() - _component2 = object() - ar, _registry, _name = self._makeOne(_component) - ar2, _, _ = self._makeOne(_component2) - ar2.name = _name + '2' - self.failUnless(ar < ar2) - - def test___le___identity(self): - _component = object() - ar, _registry, _name = self._makeOne(_component) - self.failUnless(ar <= ar) - - def test___le___hit(self): - _component = object() - ar, _registry, _name = self._makeOne(_component) - ar2, _, _ = self._makeOne(_component) - self.failUnless(ar <= ar2) - - def test___le___miss(self): - _component = object() - _component2 = object() - ar, _registry, _name = self._makeOne(_component) - ar2, _, _ = self._makeOne(_component2) - ar2.name = _name + '2' - self.failUnless(ar <= ar2) - - def test___gt___identity(self): - _component = object() - ar, _registry, _name = self._makeOne(_component) - self.failIf(ar > ar) - - def test___gt___hit(self): - _component = object() - _component2 = object() - ar, _registry, _name = self._makeOne(_component) - ar2, _, _ = self._makeOne(_component2) - ar2.name = _name + '2' - self.failUnless(ar2 > ar) - - def test___gt___miss(self): - _component = object() - ar, _registry, _name = self._makeOne(_component) - ar2, _, _ = self._makeOne(_component) - self.failIf(ar2 > ar) - - def test___ge___identity(self): - _component = object() - ar, _registry, _name = self._makeOne(_component) - self.failUnless(ar >= ar) - - def test___ge___miss(self): - _component = object() - _component2 = object() - ar, _registry, _name = self._makeOne(_component) - ar2, _, _ = self._makeOne(_component2) - ar2.name = _name + '2' - self.failIf(ar >= ar2) - - def test___ge___hit(self): - _component = object() - ar, _registry, _name = self._makeOne(_component) - ar2, _, _ = self._makeOne(_component) - ar2.name = _name + '2' - self.failUnless(ar2 >= ar) - - -class SubscriptionRegistrationTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.interface.registry import SubscriptionRegistration - return SubscriptionRegistration - - def _makeOne(self, component=None): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - ibar = IFoo('IBar') - class _Registry(object): - def __repr__(self): - return '_REGISTRY' - registry = _Registry() - name = _u('name') - doc = 'DOCSTRING' - klass = self._getTargetClass() - return (klass(registry, (ibar,), ifoo, name, component, doc), - registry, - name, - ) - - def test_class_conforms_to_ISubscriptionAdapterRegistration(self): - from zope.interface.verify import verifyClass - from zope.interface.interfaces import ISubscriptionAdapterRegistration - verifyClass(ISubscriptionAdapterRegistration, self._getTargetClass()) - - def test_instance_conforms_to_ISubscriptionAdapterRegistration(self): - from zope.interface.verify import verifyObject - from zope.interface.interfaces import ISubscriptionAdapterRegistration - sar, _, _ = self._makeOne() - verifyObject(ISubscriptionAdapterRegistration, sar) - - -class HandlerRegistrationTests(_SilencePy3Deprecations): - - def _getTargetClass(self): - from zope.interface.registry import HandlerRegistration - return HandlerRegistration - - def _makeOne(self, component=None): - from zope.interface.declarations import InterfaceClass - from zope.interface._compat import _u - class IFoo(InterfaceClass): - pass - ifoo = IFoo('IFoo') - class _Registry(object): - def __repr__(self): - return '_REGISTRY' - registry = _Registry() - name = _u('name') - doc = 'DOCSTRING' - klass = self._getTargetClass() - return (klass(registry, (ifoo,), name, component, doc), - registry, - name, - ) - - def test_class_conforms_to_IHandlerRegistration(self): - from zope.interface.verify import verifyClass - from zope.interface.interfaces import IHandlerRegistration - verifyClass(IHandlerRegistration, self._getTargetClass()) - - def test_instance_conforms_to_IHandlerRegistration(self): - from zope.interface.verify import verifyObject - from zope.interface.interfaces import IHandlerRegistration - hr, _, _ = self._makeOne() - verifyObject(IHandlerRegistration, hr) - - def test_properties(self): - def _factory(context): - pass - hr, _, _ = self._makeOne(_factory) - self.failUnless(hr.handler is _factory) - self.failUnless(hr.factory is hr.handler) - self.failUnless(hr.provided is None) - - def test___repr___factory_w_name(self): - class _Factory(object): - __name__ = 'TEST' - hr, _registry, _name = self._makeOne(_Factory()) - self.assertEqual(repr(hr), - ("HandlerRegistration(_REGISTRY, [IFoo], %r, TEST, " - + "'DOCSTRING')") % (_name)) - - def test___repr___factory_wo_name(self): - class _Factory(object): - def __repr__(self): - return 'TEST' - hr, _registry, _name = self._makeOne(_Factory()) - self.assertEqual(repr(hr), - ("HandlerRegistration(_REGISTRY, [IFoo], %r, TEST, " - + "'DOCSTRING')") % (_name)) - - -class _Monkey(object): - # context-manager for replacing module names in the scope of a test. - def __init__(self, module, **kw): - self.module = module - self.to_restore = dict([(key, getattr(module, key)) for key in kw]) - for key, value in kw.items(): - setattr(module, key, value) - - def __enter__(self): - return self - - def __exit__(self, exc_type, exc_val, exc_tb): - for key, value in self.to_restore.items(): - setattr(self.module, key, value) - -def test_suite(): - return unittest.TestSuite(( - unittest.makeSuite(ComponentsTests), - unittest.makeSuite(UtilityRegistrationTests), - unittest.makeSuite(AdapterRegistrationTests), - unittest.makeSuite(SubscriptionRegistrationTests), - unittest.makeSuite(AdapterRegistrationTests), - )) diff --git a/zope/interface/tests/test_sorting.py b/zope/interface/tests/test_sorting.py deleted file mode 100644 index af60f88b..00000000 --- a/zope/interface/tests/test_sorting.py +++ /dev/null @@ -1,55 +0,0 @@ -############################################################################## -# -# Copyright (c) 2001, 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Test interface sorting -""" - -from unittest import TestCase, TestSuite, main, makeSuite - -from zope.interface import Interface - -class I1(Interface): pass -class I2(I1): pass -class I3(I1): pass -class I4(Interface): pass -class I5(I4): pass -class I6(I2): pass - - -class Test(TestCase): - - def test(self): - l = [I1, I3, I5, I6, I4, I2] - l.sort() - self.assertEqual(l, [I1, I2, I3, I4, I5, I6]) - - def test_w_None(self): - l = [I1, None, I3, I5, I6, I4, I2] - l.sort() - self.assertEqual(l, [I1, I2, I3, I4, I5, I6, None]) - - def test_w_equal_names(self): - # interfaces with equal names but different modules should sort by - # module name - from zope.interface.tests.m1 import I1 as m1_I1 - l = [I1, m1_I1] - l.sort() - self.assertEqual(l, [m1_I1, I1]) - -def test_suite(): - return TestSuite(( - makeSuite(Test), - )) - -if __name__=='__main__': - main(defaultTest='test_suite') diff --git a/zope/interface/tests/test_verify.py b/zope/interface/tests/test_verify.py deleted file mode 100644 index d9c18d24..00000000 --- a/zope/interface/tests/test_verify.py +++ /dev/null @@ -1,571 +0,0 @@ -############################################################################## -# -# Copyright (c) 2001, 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -""" zope.interface.verify unit tests -""" -import unittest - - -class Test_verifyClass(unittest.TestCase): - - def _callFUT(self, iface, klass): - from zope.interface.verify import verifyClass - return verifyClass(iface, klass) - - def test_class_doesnt_implement(self): - from zope.interface import Interface - from zope.interface.exceptions import DoesNotImplement - - class ICurrent(Interface): - pass - - class Current(object): - pass - - self.assertRaises(DoesNotImplement, self._callFUT, ICurrent, Current) - - def test_class_doesnt_implement_but_classImplements_later(self): - from zope.interface import Interface - from zope.interface import classImplements - - class ICurrent(Interface): - pass - - class Current(object): - pass - - classImplements(Current, ICurrent) - - self._callFUT(ICurrent, Current) - - def test_class_doesnt_have_required_method_simple(self): - from zope.interface import Interface - from zope.interface import implementer - from zope.interface.exceptions import BrokenImplementation - - class ICurrent(Interface): - def method(): pass - - @implementer(ICurrent) - class Current(object): - pass - - self.assertRaises(BrokenImplementation, - self._callFUT, ICurrent, Current) - - def test_class_has_required_method_simple(self): - from zope.interface import Interface - from zope.interface import implementer - - class ICurrent(Interface): - def method(): pass - - @implementer(ICurrent) - class Current(object): - - def method(self): - pass - - self._callFUT(ICurrent, Current) - - def test_class_doesnt_have_required_method_derived(self): - from zope.interface import Interface - from zope.interface import implementer - from zope.interface.exceptions import BrokenImplementation - - class IBase(Interface): - def method(): - pass - - class IDerived(IBase): - pass - - @implementer(IDerived) - class Current(object): - pass - - self.assertRaises(BrokenImplementation, - self._callFUT, IDerived, Current) - - def test_class_has_required_method_derived(self): - from zope.interface import Interface - from zope.interface import implementer - - class IBase(Interface): - def method(): - pass - - class IDerived(IBase): - pass - - @implementer(IDerived) - class Current(object): - - def method(self): - pass - - self._callFUT(IDerived, Current) - - def test_method_takes_wrong_arg_names_but_OK(self): - # We no longer require names to match. - from zope.interface import Interface - from zope.interface import implementer - - class ICurrent(Interface): - - def method(a): - pass - - @implementer(ICurrent) - class Current(object): - - def method(self, b): - pass - - self._callFUT(ICurrent, Current) - - def test_method_takes_not_enough_args(self): - from zope.interface import Interface - from zope.interface import implementer - from zope.interface.exceptions import BrokenMethodImplementation - - class ICurrent(Interface): - - def method(a): - pass - - @implementer(ICurrent) - class Current(object): - - def method(self): - pass - - self.assertRaises(BrokenMethodImplementation, - self._callFUT, ICurrent, Current) - - def test_method_doesnt_take_required_starargs(self): - from zope.interface import Interface - from zope.interface import implementer - from zope.interface.exceptions import BrokenMethodImplementation - - class ICurrent(Interface): - - def method(*args): - pass - - @implementer(ICurrent) - class Current(object): - - def method(self): - pass - - self.assertRaises(BrokenMethodImplementation, - self._callFUT, ICurrent, Current) - - def test_method_doesnt_take_required_only_kwargs(self): - from zope.interface import Interface - from zope.interface import implementer - from zope.interface.exceptions import BrokenMethodImplementation - - class ICurrent(Interface): - - def method(**kw): - pass - - @implementer(ICurrent) - class Current(object): - - def method(self): - pass - - self.assertRaises(BrokenMethodImplementation, - self._callFUT, ICurrent, Current) - - def test_method_takes_extra_arg(self): - from zope.interface import Interface - from zope.interface import implementer - from zope.interface.exceptions import BrokenMethodImplementation - - class ICurrent(Interface): - - def method(a): - pass - - @implementer(ICurrent) - class Current(object): - - def method(self, a, b): - pass - - self.assertRaises(BrokenMethodImplementation, - self._callFUT, ICurrent, Current) - - def test_method_takes_extra_arg_with_default(self): - from zope.interface import Interface - from zope.interface import implementer - - class ICurrent(Interface): - - def method(a): - pass - - @implementer(ICurrent) - class Current(object): - - def method(self, a, b=None): - pass - - self._callFUT(ICurrent, Current) - - def test_method_takes_only_positional_args(self): - from zope.interface import Interface - from zope.interface import implementer - - class ICurrent(Interface): - - def method(a): - pass - - @implementer(ICurrent) - class Current(object): - - def method(self, *args): - pass - - self._callFUT(ICurrent, Current) - - def test_method_takes_only_kwargs(self): - from zope.interface import Interface - from zope.interface import implementer - from zope.interface.exceptions import BrokenMethodImplementation - - class ICurrent(Interface): - - def method(a): - pass - - @implementer(ICurrent) - class Current(object): - - def method(self, **kw): - pass - - self.assertRaises(BrokenMethodImplementation, - self._callFUT, ICurrent, Current) - - def test_method_takes_extra_starargs(self): - from zope.interface import Interface - from zope.interface import implementer - - class ICurrent(Interface): - - def method(a): - pass - - @implementer(ICurrent) - class Current(object): - - def method(self, a, *args): - pass - - self._callFUT(ICurrent, Current) - - def test_method_takes_extra_starargs_and_kwargs(self): - from zope.interface import Interface - from zope.interface import implementer - - class ICurrent(Interface): - - def method(a): - pass - - @implementer(ICurrent) - class Current(object): - - def method(self, a, *args, **kw): - pass - - self._callFUT(ICurrent, Current) - - def test_method_doesnt_take_required_positional_and_starargs(self): - from zope.interface import Interface - from zope.interface import implementer - from zope.interface.exceptions import BrokenMethodImplementation - - class ICurrent(Interface): - - def method(a, *args): - pass - - @implementer(ICurrent) - class Current(object): - - def method(self, a): - pass - - self.assertRaises(BrokenMethodImplementation, - self._callFUT, ICurrent, Current) - - def test_method_takes_required_positional_and_starargs(self): - from zope.interface import Interface - from zope.interface import implementer - - class ICurrent(Interface): - - def method(a, *args): - pass - - @implementer(ICurrent) - class Current(object): - - def method(self, a, *args): - pass - - self._callFUT(ICurrent, Current) - - def test_method_takes_only_starargs(self): - from zope.interface import Interface - from zope.interface import implementer - - class ICurrent(Interface): - - def method(a, *args): - pass - - @implementer(ICurrent) - class Current(object): - - def method(self, *args): - pass - - self._callFUT(ICurrent, Current) - - def test_method_takes_required_kwargs(self): - from zope.interface import Interface - from zope.interface import implementer - - class ICurrent(Interface): - - def method(**kwargs): - pass - - @implementer(ICurrent) - class Current(object): - - def method(self, **kw): - pass - - self._callFUT(ICurrent, Current) - - def test_method_takes_positional_plus_required_starargs(self): - from zope.interface import Interface - from zope.interface import implementer - from zope.interface.exceptions import BrokenMethodImplementation - - class ICurrent(Interface): - - def method(*args): - pass - - @implementer(ICurrent) - class Current(object): - - def method(self, a, *args): - pass - - self.assertRaises(BrokenMethodImplementation, - self._callFUT, ICurrent, Current) - - - def test_method_doesnt_take_required_kwargs(self): - from zope.interface import Interface - from zope.interface import implementer - from zope.interface.exceptions import BrokenMethodImplementation - - class ICurrent(Interface): - - def method(**kwargs): - pass - - @implementer(ICurrent) - class Current(object): - - def method(self, a): - pass - - self.assertRaises(BrokenMethodImplementation, - self._callFUT, ICurrent, Current) - - - def test_class_has_method_for_iface_attr(self): - from zope.interface import Attribute - from zope.interface import Interface - from zope.interface import implementer - - class ICurrent(Interface): - attr = Attribute("The foo Attribute") - - @implementer(ICurrent) - class Current: - - def attr(self): - pass - - self._callFUT(ICurrent, Current) - - def test_class_has_nonmethod_for_method(self): - from zope.interface import Interface - from zope.interface import implementer - from zope.interface.exceptions import BrokenMethodImplementation - - class ICurrent(Interface): - def method(): - pass - - @implementer(ICurrent) - class Current: - method = 1 - - self.assertRaises(BrokenMethodImplementation, - self._callFUT, ICurrent, Current) - - def test_class_has_attribute_for_attribute(self): - from zope.interface import Attribute - from zope.interface import Interface - from zope.interface import implementer - - class ICurrent(Interface): - attr = Attribute("The foo Attribute") - - @implementer(ICurrent) - class Current: - - attr = 1 - - self._callFUT(ICurrent, Current) - - def test_class_misses_attribute_for_attribute(self): - # This check *passes* for verifyClass - from zope.interface import Attribute - from zope.interface import Interface - from zope.interface import implementer - - class ICurrent(Interface): - attr = Attribute("The foo Attribute") - - @implementer(ICurrent) - class Current: - pass - - self._callFUT(ICurrent, Current) - - def test_w_callable_non_func_method(self): - from zope.interface.interface import Method - from zope.interface import Interface - from zope.interface import implementer - - class QuasiMethod(Method): - def __call__(self, *args, **kw): - pass - - class QuasiCallable(object): - def __call__(self, *args, **kw): - pass - - class ICurrent(Interface): - attr = QuasiMethod('This is callable') - - @implementer(ICurrent) - class Current: - attr = QuasiCallable() - - self._callFUT(ICurrent, Current) - - - def test_w_decorated_method(self): - from zope.interface import Interface - from zope.interface import implementer - - def decorator(func): - # this is, in fact, zope.proxy.non_overridable - return property(lambda self: func.__get__(self)) - - class ICurrent(Interface): - - def method(a): - pass - - @implementer(ICurrent) - class Current(object): - - @decorator - def method(self, a): - pass - - self._callFUT(ICurrent, Current) - -class Test_verifyObject(Test_verifyClass): - - def _callFUT(self, iface, target): - from zope.interface.verify import verifyObject - if isinstance(target, (type, type(OldSkool))): - target = target() - return verifyObject(iface, target) - - def test_class_misses_attribute_for_attribute(self): - # This check *fails* for verifyObject - from zope.interface import Attribute - from zope.interface import Interface - from zope.interface import implementer - from zope.interface.exceptions import BrokenImplementation - - class ICurrent(Interface): - attr = Attribute("The foo Attribute") - - @implementer(ICurrent) - class Current: - pass - - self.assertRaises(BrokenImplementation, - self._callFUT, ICurrent, Current) - - def test_module_hit(self): - from zope.interface.tests.idummy import IDummyModule - from zope.interface.tests import dummy - - self._callFUT(IDummyModule, dummy) - - def test_module_miss(self): - from zope.interface import Interface - from zope.interface.tests import dummy - from zope.interface.exceptions import DoesNotImplement - - # same name, different object - class IDummyModule(Interface): - pass - - self.assertRaises(DoesNotImplement, - self._callFUT, IDummyModule, dummy) - -class OldSkool: - pass - -def test_suite(): - #import doctest - return unittest.TestSuite(( - unittest.makeSuite(Test_verifyClass), - unittest.makeSuite(Test_verifyObject), - # This one needs to turn into just docs. - #doctest.DocFileSuite('../verify.txt', - # optionflags=doctest.NORMALIZE_WHITESPACE), - )) diff --git a/zope/interface/verify.py b/zope/interface/verify.py deleted file mode 100644 index af80116d..00000000 --- a/zope/interface/verify.py +++ /dev/null @@ -1,120 +0,0 @@ -############################################################################## -# -# Copyright (c) 2001, 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Verify interface implementations -""" -from zope.interface.exceptions import BrokenImplementation, DoesNotImplement -from zope.interface.exceptions import BrokenMethodImplementation -from types import FunctionType, MethodType -from zope.interface.interface import fromMethod, fromFunction, Method -import sys - -# This will be monkey-patched when running under Zope 2, so leave this -# here: -MethodTypes = (MethodType, ) - - -def _verify(iface, candidate, tentative=0, vtype=None): - """Verify that 'candidate' might correctly implements 'iface'. - - This involves: - - o Making sure the candidate defines all the necessary methods - - o Making sure the methods have the correct signature - - o Making sure the candidate asserts that it implements the interface - - Note that this isn't the same as verifying that the class does - implement the interface. - - If optional tentative is true, suppress the "is implemented by" test. - """ - - if vtype == 'c': - tester = iface.implementedBy - else: - tester = iface.providedBy - - if not tentative and not tester(candidate): - raise DoesNotImplement(iface) - - # Here the `desc` is either an `Attribute` or `Method` instance - for name, desc in iface.namesAndDescriptions(1): - try: - attr = getattr(candidate, name) - except AttributeError: - if (not isinstance(desc, Method)) and vtype == 'c': - # We can't verify non-methods on classes, since the - # class may provide attrs in it's __init__. - continue - - raise BrokenImplementation(iface, name) - - if not isinstance(desc, Method): - # If it's not a method, there's nothing else we can test - continue - - if isinstance(attr, FunctionType): - if sys.version[0] == '3' and isinstance(candidate, type): - # This is an "unbound method" in Python 3. - meth = fromFunction(attr, iface, name=name, - imlevel=1) #pragma NO COVERAGE - else: - # Nope, just a normal function - meth = fromFunction(attr, iface, name=name) - elif (isinstance(attr, MethodTypes) - and type(attr.__func__) is FunctionType): - meth = fromMethod(attr, iface, name) - elif isinstance(attr, property) and vtype == 'c': - # We without an instance we cannot be sure it's not a - # callable. - continue - else: - if not callable(attr): - raise BrokenMethodImplementation(name, "Not a method") - # sigh, it's callable, but we don't know how to introspect it, so - # we have to give it a pass. - continue #pragma NO COVERAGE - - # Make sure that the required and implemented method signatures are - # the same. - desc = desc.getSignatureInfo() - meth = meth.getSignatureInfo() - - mess = _incompat(desc, meth) - if mess: - raise BrokenMethodImplementation(name, mess) - - return True - -def verifyClass(iface, candidate, tentative=0): - return _verify(iface, candidate, tentative, vtype='c') - -def verifyObject(iface, candidate, tentative=0): - return _verify(iface, candidate, tentative, vtype='o') - -def _incompat(required, implemented): - #if (required['positional'] != - # implemented['positional'][:len(required['positional'])] - # and implemented['kwargs'] is None): - # return 'imlementation has different argument names' - if len(implemented['required']) > len(required['required']): - return 'implementation requires too many arguments' - if ((len(implemented['positional']) < len(required['positional'])) - and not implemented['varargs']): - return "implementation doesn't allow enough arguments" - if required['kwargs'] and not implemented['kwargs']: - return "implementation doesn't support keyword arguments" - if required['varargs'] and not implemented['varargs']: - return "implementation doesn't support variable arguments" diff --git a/zope/schema/__init__.py b/zope/schema/__init__.py deleted file mode 100644 index f8507248..00000000 --- a/zope/schema/__init__.py +++ /dev/null @@ -1,77 +0,0 @@ -############################################################################## -# -# Copyright (c) 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Schema package constructor -""" -# Field APIs -from zope.schema._field import ASCII -from zope.schema._field import ASCIILine -from zope.schema._field import Bool -from zope.schema._field import Bytes -from zope.schema._field import BytesLine -from zope.schema._field import Choice -from zope.schema._field import Container -from zope.schema._field import Date -from zope.schema._field import Datetime -from zope.schema._field import Decimal -from zope.schema._field import Dict -from zope.schema._field import DottedName -from zope.schema._field import Field -from zope.schema._field import Float -from zope.schema._field import FrozenSet -from zope.schema._field import Id -from zope.schema._field import Int -from zope.schema._field import InterfaceField -from zope.schema._field import Iterable -from zope.schema._field import List -from zope.schema._field import MinMaxLen -from zope.schema._field import NativeString -from zope.schema._field import NativeStringLine -from zope.schema._field import Object -from zope.schema._field import Orderable -from zope.schema._field import Password -from zope.schema._field import Set -from zope.schema._field import SourceText -from zope.schema._field import Text -from zope.schema._field import TextLine -from zope.schema._field import Time -from zope.schema._field import Timedelta -from zope.schema._field import Tuple -from zope.schema._field import URI - -# Schema APIs -from zope.schema._schema import getFields -from zope.schema._schema import getFieldsInOrder -from zope.schema._schema import getFieldNames -from zope.schema._schema import getFieldNamesInOrder -from zope.schema._schema import getValidationErrors -from zope.schema._schema import getSchemaValidationErrors - -# Acessor API -from zope.schema.accessors import accessors - -# Error API -from zope.schema.interfaces import ValidationError -from zope.schema._bootstrapinterfaces import NO_VALUE - - -# pep 8 friendlyness -ASCII, ASCIILine, Bool, Bytes, BytesLine, Choice, Container, Date, Datetime -Decimal, Dict, DottedName, Field, Float, FrozenSet, Id, Int, InterfaceField -Iterable, List, MinMaxLen, NativeString, NativeStringLine, Object, Orderable -Password, Set, SourceText, Text, TextLine, Time, Timedelta, Tuple, URI -getFields, getFieldsInOrder, getFieldNames, getFieldNamesInOrder, -getValidationErrors, getSchemaValidationErrors -accessors -ValidationError -NO_VALUE diff --git a/zope/schema/_bootstrapfields.py b/zope/schema/_bootstrapfields.py deleted file mode 100644 index ebc42700..00000000 --- a/zope/schema/_bootstrapfields.py +++ /dev/null @@ -1,441 +0,0 @@ -############################################################################## -# -# Copyright (c) 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Bootstrapping fields -""" -__docformat__ = 'restructuredtext' - -from zope.interface import Attribute -from zope.interface import providedBy -from zope.interface import implementer - -from zope.schema._bootstrapinterfaces import ConstraintNotSatisfied -from zope.schema._bootstrapinterfaces import IContextAwareDefaultFactory -from zope.schema._bootstrapinterfaces import IFromUnicode -from zope.schema._bootstrapinterfaces import NotAContainer -from zope.schema._bootstrapinterfaces import NotAnIterator -from zope.schema._bootstrapinterfaces import RequiredMissing -from zope.schema._bootstrapinterfaces import StopValidation -from zope.schema._bootstrapinterfaces import TooBig -from zope.schema._bootstrapinterfaces import TooLong -from zope.schema._bootstrapinterfaces import TooShort -from zope.schema._bootstrapinterfaces import TooSmall -from zope.schema._bootstrapinterfaces import WrongType -from zope.schema._compat import u -from zope.schema._compat import text_type -from zope.schema._compat import integer_types - -from zope.schema._schema import getFields - - -class ValidatedProperty(object): - - def __init__(self, name, check=None): - self._info = name, check - - def __set__(self, inst, value): - name, check = self._info - if value != inst.missing_value: - if check is not None: - check(inst, value) - else: - inst.validate(value) - inst.__dict__[name] = value - - def __get__(self, inst, owner): - name, check = self._info - return inst.__dict__[name] - - -class DefaultProperty(ValidatedProperty): - - def __get__(self, inst, owner): - name, check = self._info - defaultFactory = inst.__dict__.get('defaultFactory') - # If there is no default factory, simply return the default. - if defaultFactory is None: - return inst.__dict__[name] - # Get the default value by calling the factory. Some factories might - # require a context to produce a value. - if IContextAwareDefaultFactory.providedBy(defaultFactory): - value = defaultFactory(inst.context) - else: - value = defaultFactory() - # Check that the created value is valid. - if check is not None: - check(inst, value) - elif value != inst.missing_value: - inst.validate(value) - return value - - -class Field(Attribute): - - # Type restrictions, if any - _type = None - context = None - - # If a field has no assigned value, it will be set to missing_value. - missing_value = None - - # This is the default value for the missing_value argument to the - # Field constructor. A marker is helpful since we don't want to - # overwrite missing_value if it is set differently on a Field - # subclass and isn't specified via the constructor. - __missing_value_marker = object() - - # Note that the "order" field has a dual existance: - # 1. The class variable Field.order is used as a source for the - # monotonically increasing values used to provide... - # 2. The instance variable self.order which provides a - # monotonically increasing value that tracks the creation order - # of Field (including Field subclass) instances. - order = 0 - - default = DefaultProperty('default') - - # These were declared as slots in zope.interface, we override them here to - # get rid of the dedcriptors so they don't break .bind() - __name__ = None - interface = None - _Element__tagged_values = None - - def __init__(self, title=u(''), description=u(''), __name__='', - required=True, readonly=False, constraint=None, default=None, - defaultFactory=None, missing_value=__missing_value_marker): - """Pass in field values as keyword parameters. - - - Generally, you want to pass either a title and description, or - a doc string. If you pass no doc string, it will be computed - from the title and description. If you pass a doc string that - follows the Python coding style (title line separated from the - body by a blank line), the title and description will be - computed from the doc string. Unfortunately, the doc string - must be passed as a positional argument. - - Here are some examples: - - >>> from zope.schema._compat import u - >>> f = Field() - >>> f.__doc__, f.title, f.description - ('', u'', u'') - - >>> f = Field(title=u('sample')) - >>> f.__doc__, f.title, f.description - (u'sample', u'sample', u'') - - >>> f = Field(title=u('sample'), description=u('blah blah\\nblah')) - >>> f.__doc__, f.title, f.description - (u'sample\\n\\nblah blah\\nblah', u'sample', u'blah blah\\nblah') - """ - __doc__ = '' - if title: - if description: - __doc__ = "%s\n\n%s" % (title, description) - else: - __doc__ = title - elif description: - __doc__ = description - - super(Field, self).__init__(__name__, __doc__) - self.title = title - self.description = description - self.required = required - self.readonly = readonly - if constraint is not None: - self.constraint = constraint - self.default = default - self.defaultFactory = defaultFactory - - # Keep track of the order of field definitions - Field.order += 1 - self.order = Field.order - - if missing_value is not self.__missing_value_marker: - self.missing_value = missing_value - - def constraint(self, value): - return True - - def bind(self, object): - clone = self.__class__.__new__(self.__class__) - clone.__dict__.update(self.__dict__) - clone.context = object - return clone - - def validate(self, value): - if value == self.missing_value: - if self.required: - raise RequiredMissing(self.__name__) - else: - try: - self._validate(value) - except StopValidation: - pass - - def __eq__(self, other): - # should be the same type - if type(self) != type(other): - return False - - # should have the same properties - names = {} # used as set of property names, ignoring values - for interface in providedBy(self): - names.update(getFields(interface)) - - # order will be different always, don't compare it - if 'order' in names: - del names['order'] - for name in names: - if getattr(self, name) != getattr(other, name): - return False - return True - - def __ne__(self, other): - return not self.__eq__(other) - - def _validate(self, value): - if self._type is not None and not isinstance(value, self._type): - raise WrongType(value, self._type, self.__name__) - - if not self.constraint(value): - raise ConstraintNotSatisfied(value, self.__name__) - - def get(self, object): - return getattr(object, self.__name__) - - def query(self, object, default=None): - return getattr(object, self.__name__, default) - - def set(self, object, value): - if self.readonly: - raise TypeError("Can't set values on read-only fields " - "(name=%s, class=%s.%s)" - % (self.__name__, - object.__class__.__module__, - object.__class__.__name__)) - setattr(object, self.__name__, value) - - -class Container(Field): - - def _validate(self, value): - super(Container, self)._validate(value) - - if not hasattr(value, '__contains__'): - try: - iter(value) - except TypeError: - raise NotAContainer(value) - - -# XXX This class violates the Liskov Substituability Principle: it -# is derived from Container, but cannot be used everywhere an instance -# of Container could be, because it's '_validate' is more restrictive. -class Iterable(Container): - - def _validate(self, value): - super(Iterable, self)._validate(value) - - # See if we can get an iterator for it - try: - iter(value) - except TypeError: - raise NotAnIterator(value) - - -class Orderable(object): - """Values of ordered fields can be sorted. - - They can be restricted to a range of values. - - Orderable is a mixin used in combination with Field. - """ - - min = ValidatedProperty('min') - max = ValidatedProperty('max') - - def __init__(self, min=None, max=None, default=None, **kw): - - # Set min and max to None so that we can validate if - # one of the super methods invoke validation. - self.min = None - self.max = None - - super(Orderable, self).__init__(**kw) - - # Now really set min and max - self.min = min - self.max = max - - # We've taken over setting default so it can be limited by min - # and max. - self.default = default - - def _validate(self, value): - super(Orderable, self)._validate(value) - - if self.min is not None and value < self.min: - raise TooSmall(value, self.min) - - if self.max is not None and value > self.max: - raise TooBig(value, self.max) - - -class MinMaxLen(object): - """Expresses constraints on the length of a field. - - MinMaxLen is a mixin used in combination with Field. - """ - min_length = 0 - max_length = None - - def __init__(self, min_length=0, max_length=None, **kw): - self.min_length = min_length - self.max_length = max_length - super(MinMaxLen, self).__init__(**kw) - - def _validate(self, value): - super(MinMaxLen, self)._validate(value) - - if self.min_length is not None and len(value) < self.min_length: - raise TooShort(value, self.min_length) - - if self.max_length is not None and len(value) > self.max_length: - raise TooLong(value, self.max_length) - - -@implementer(IFromUnicode) -class Text(MinMaxLen, Field): - """A field containing text used for human discourse.""" - _type = text_type - - def __init__(self, *args, **kw): - super(Text, self).__init__(*args, **kw) - - def fromUnicode(self, str): - """ - >>> from zope.schema._compat import u - >>> from zope.schema._compat import b - >>> t = Text(constraint=lambda v: 'x' in v) - >>> t.fromUnicode(b("foo x spam")) - Traceback (most recent call last): - ... - WrongType: ('foo x spam', , '') - >>> t.fromUnicode(u("foo x spam")) - u'foo x spam' - >>> t.fromUnicode(u("foo spam")) - Traceback (most recent call last): - ... - ConstraintNotSatisfied: (u'foo spam', '') - """ - self.validate(str) - return str - - -class TextLine(Text): - """A text field with no newlines.""" - - def constraint(self, value): - return '\n' not in value and '\r' not in value - - -class Password(TextLine): - """A text field containing a text used as a password.""" - - UNCHANGED_PASSWORD = object() - - def set(self, context, value): - """Update the password. - - We use a special marker value that a widget can use - to tell us that the password didn't change. This is - needed to support edit forms that don't display the - existing password and want to work together with - encryption. - - """ - if value is self.UNCHANGED_PASSWORD: - return - super(Password, self).set(context, value) - - def validate(self, value): - try: - existing = bool(self.get(self.context)) - except AttributeError: - existing = False - if value is self.UNCHANGED_PASSWORD and existing: - # Allow the UNCHANGED_PASSWORD value, if a password is set already - return - return super(Password, self).validate(value) - - -class Bool(Field): - """A field representing a Bool.""" - - _type = bool - - def _validate(self, value): - # Convert integers to bools to they don't get mis-flagged - # by the type check later. - if isinstance(value, int): - value = bool(value) - Field._validate(self, value) - - def set(self, object, value): - if isinstance(value, int): - value = bool(value) - Field.set(self, object, value) - - def fromUnicode(self, str): - """ - >>> from zope.schema._compat import b - >>> b = Bool() - >>> IFromUnicode.providedBy(b) - True - >>> b.fromUnicode('True') - True - >>> b.fromUnicode('') - False - >>> b.fromUnicode('true') - True - >>> b.fromUnicode('false') or b.fromUnicode('False') - False - """ - v = str == 'True' or str == 'true' - self.validate(v) - return v - - -@implementer(IFromUnicode) -class Int(Orderable, Field): - """A field representing an Integer.""" - _type = integer_types - - def __init__(self, *args, **kw): - super(Int, self).__init__(*args, **kw) - - def fromUnicode(self, str): - """ - >>> f = Int() - >>> f.fromUnicode("125") - 125 - >>> f.fromUnicode("125.6") #doctest: +IGNORE_EXCEPTION_DETAIL - Traceback (most recent call last): - ... - ValueError: invalid literal for int(): 125.6 - """ - v = int(str) - self.validate(v) - return v diff --git a/zope/schema/_bootstrapinterfaces.py b/zope/schema/_bootstrapinterfaces.py deleted file mode 100644 index da423fb9..00000000 --- a/zope/schema/_bootstrapinterfaces.py +++ /dev/null @@ -1,120 +0,0 @@ -############################################################################## -# -# Copyright (c) 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Bootstrap schema interfaces and exceptions -""" -import zope.interface - -from zope.schema._messageid import _ - - -class StopValidation(Exception): - """Raised if the validation is completed early. - - Note that this exception should be always caught, since it is just - a way for the validator to save time. - """ - - -class ValidationError(zope.interface.Invalid): - """Raised if the Validation process fails.""" - - def doc(self): - return self.__class__.__doc__ - - def __cmp__(self, other): - if not hasattr(other, 'args'): - return -1 - return cmp(self.args, other.args) - - def __eq__(self, other): - if not hasattr(other, 'args'): - return False - return self.args == other.args - - __hash__ = zope.interface.Invalid.__hash__ # python3 - - def __repr__(self): # pragma: no cover - return '%s(%s)' % (self.__class__.__name__, - ', '.join(repr(arg) for arg in self.args)) - - -class RequiredMissing(ValidationError): - __doc__ = _("""Required input is missing.""") - - -class WrongType(ValidationError): - __doc__ = _("""Object is of wrong type.""") - - -class TooBig(ValidationError): - __doc__ = _("""Value is too big""") - - -class TooSmall(ValidationError): - __doc__ = _("""Value is too small""") - - -class TooLong(ValidationError): - __doc__ = _("""Value is too long""") - - -class TooShort(ValidationError): - __doc__ = _("""Value is too short""") - - -class InvalidValue(ValidationError): - __doc__ = _("""Invalid value""") - - -class ConstraintNotSatisfied(ValidationError): - __doc__ = _("""Constraint not satisfied""") - - -class NotAContainer(ValidationError): - __doc__ = _("""Not a container""") - - -class NotAnIterator(ValidationError): - __doc__ = _("""Not an iterator""") - - -class IFromUnicode(zope.interface.Interface): - """Parse a unicode string to a value - - We will often adapt fields to this interface to support views and - other applications that need to conver raw data as unicode - values. - """ - - def fromUnicode(str): - """Convert a unicode string to a value. - """ - - -class IContextAwareDefaultFactory(zope.interface.Interface): - """A default factory that requires a context. - - The context is the field context. If the field is not bound, context may - be ``None``. - """ - - def __call__(context): - """Returns a default value for the field.""" - - -class NO_VALUE(object): - def __repr__(self): - return '' - -NO_VALUE = NO_VALUE() diff --git a/zope/schema/_compat.py b/zope/schema/_compat.py deleted file mode 100644 index dc45ca9e..00000000 --- a/zope/schema/_compat.py +++ /dev/null @@ -1,58 +0,0 @@ -import sys - -PY3 = sys.version_info[0] >= 3 - -try: - from collections import OrderedDict -except ImportError: # pragma: no cover - from ordereddict import OrderedDict - -# pep 8 friendlyness -OrderedDict - - -if PY3: # pragma: no cover - - def b(s): - return s.encode("latin-1") - - def u(s): - return s - - string_types = str, - text_type = str - binary_type = bytes - integer_types = int, - - def non_native_string(x): - if isinstance(x, bytes): - return x - return bytes(x, 'unicode_escape') - - def make_binary(x): - if isinstance(x, bytes): - return x - return x.encode('ascii') - -else: # pragma: no cover - - def b(s): - return s - - def u(s): - return unicode(s, "unicode_escape") - - string_types = basestring, - text_type = unicode - binary_type = str - integer_types = (int, long) - - def non_native_string(x): - if isinstance(x, unicode): - return x - return unicode(x, 'unicode_escape') - - def make_binary(x): - if isinstance(x, str): - return x - return x.encode('ascii') diff --git a/zope/schema/_field.py b/zope/schema/_field.py deleted file mode 100644 index 75c8d432..00000000 --- a/zope/schema/_field.py +++ /dev/null @@ -1,701 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# Copyright (c) 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Schema Fields -""" -__docformat__ = 'restructuredtext' - -from datetime import datetime -from datetime import date -from datetime import timedelta -from datetime import time -import decimal -import re -import threading - -from zope.event import notify -from zope.interface import classImplements -from zope.interface import implementer -from zope.interface import Interface -from zope.interface.interfaces import IInterface -from zope.interface.interfaces import IMethod - -from zope.schema.interfaces import IASCII -from zope.schema.interfaces import IASCIILine -from zope.schema.interfaces import IBaseVocabulary -from zope.schema.interfaces import IBeforeObjectAssignedEvent -from zope.schema.interfaces import IBool -from zope.schema.interfaces import IBytes -from zope.schema.interfaces import IBytesLine -from zope.schema.interfaces import IChoice -from zope.schema.interfaces import IContextSourceBinder -from zope.schema.interfaces import IDate -from zope.schema.interfaces import IDatetime -from zope.schema.interfaces import IDecimal -from zope.schema.interfaces import IDict -from zope.schema.interfaces import IDottedName -from zope.schema.interfaces import IField -from zope.schema.interfaces import IFloat -from zope.schema.interfaces import IFromUnicode -from zope.schema.interfaces import IFrozenSet -from zope.schema.interfaces import IId -from zope.schema.interfaces import IInt -from zope.schema.interfaces import IInterfaceField -from zope.schema.interfaces import IList -from zope.schema.interfaces import IMinMaxLen -from zope.schema.interfaces import IObject -from zope.schema.interfaces import IPassword -from zope.schema.interfaces import ISet -from zope.schema.interfaces import ISource -from zope.schema.interfaces import ISourceText -from zope.schema.interfaces import IText -from zope.schema.interfaces import ITextLine -from zope.schema.interfaces import ITime -from zope.schema.interfaces import ITimedelta -from zope.schema.interfaces import ITuple -from zope.schema.interfaces import IURI - -from zope.schema.interfaces import ValidationError -from zope.schema.interfaces import InvalidValue -from zope.schema.interfaces import WrongType -from zope.schema.interfaces import WrongContainedType -from zope.schema.interfaces import NotUnique -from zope.schema.interfaces import SchemaNotProvided -from zope.schema.interfaces import SchemaNotFullyImplemented -from zope.schema.interfaces import InvalidURI -from zope.schema.interfaces import InvalidId -from zope.schema.interfaces import InvalidDottedName -from zope.schema.interfaces import ConstraintNotSatisfied - -from zope.schema._bootstrapfields import Field -from zope.schema._bootstrapfields import Container # API import for __init__ -from zope.schema._bootstrapfields import Iterable -from zope.schema._bootstrapfields import Orderable -from zope.schema._bootstrapfields import Text -from zope.schema._bootstrapfields import TextLine -from zope.schema._bootstrapfields import Bool -from zope.schema._bootstrapfields import Int -from zope.schema._bootstrapfields import Password -from zope.schema._bootstrapfields import MinMaxLen -from zope.schema.fieldproperty import FieldProperty -from zope.schema.vocabulary import getVocabularyRegistry -from zope.schema.vocabulary import VocabularyRegistryError -from zope.schema.vocabulary import SimpleVocabulary - -from zope.schema._compat import b -from zope.schema._compat import text_type -from zope.schema._compat import string_types -from zope.schema._compat import binary_type -from zope.schema._compat import PY3 -from zope.schema._compat import make_binary - -# pep 8 friendlyness -Container - -# Fix up bootstrap field types -Field.title = FieldProperty(IField['title']) -Field.description = FieldProperty(IField['description']) -Field.required = FieldProperty(IField['required']) -Field.readonly = FieldProperty(IField['readonly']) -# Default is already taken care of -classImplements(Field, IField) - -MinMaxLen.min_length = FieldProperty(IMinMaxLen['min_length']) -MinMaxLen.max_length = FieldProperty(IMinMaxLen['max_length']) - -classImplements(Text, IText) -classImplements(TextLine, ITextLine) -classImplements(Password, IPassword) -classImplements(Bool, IBool) -classImplements(Bool, IFromUnicode) -classImplements(Int, IInt) - - -@implementer(ISourceText) -class SourceText(Text): - __doc__ = ISourceText.__doc__ - _type = text_type - - -@implementer(IBytes, IFromUnicode) -class Bytes(MinMaxLen, Field): - __doc__ = IBytes.__doc__ - - _type = binary_type - - def fromUnicode(self, uc): - """ See IFromUnicode. - """ - v = make_binary(uc) - self.validate(v) - return v - -# for things which are of the str type on both Python 2 and 3 -if PY3: # pragma: no cover - NativeString = Text -else: # pragma: no cover - NativeString = Bytes - - -@implementer(IASCII) -class ASCII(NativeString): - __doc__ = IASCII.__doc__ - - def _validate(self, value): - super(ASCII, self)._validate(value) - if not value: - return - if not max(map(ord, value)) < 128: - raise InvalidValue - - -@implementer(IBytesLine) -class BytesLine(Bytes): - """A Text field with no newlines.""" - - def constraint(self, value): - # TODO: we should probably use a more general definition of newlines - return b('\n') not in value - -# for things which are of the str type on both Python 2 and 3 -if PY3: # pragma: no cover - NativeStringLine = TextLine -else: # pragma: no cover - NativeStringLine = BytesLine - - -@implementer(IASCIILine) -class ASCIILine(ASCII): - __doc__ = IASCIILine.__doc__ - - def constraint(self, value): - # TODO: we should probably use a more general definition of newlines - return '\n' not in value - - -@implementer(IFloat, IFromUnicode) -class Float(Orderable, Field): - __doc__ = IFloat.__doc__ - _type = float - - def __init__(self, *args, **kw): - super(Float, self).__init__(*args, **kw) - - def fromUnicode(self, uc): - """ See IFromUnicode. - """ - v = float(uc) - self.validate(v) - return v - - -@implementer(IDecimal, IFromUnicode) -class Decimal(Orderable, Field): - __doc__ = IDecimal.__doc__ - _type = decimal.Decimal - - def __init__(self, *args, **kw): - super(Decimal, self).__init__(*args, **kw) - - def fromUnicode(self, uc): - """ See IFromUnicode. - """ - try: - v = decimal.Decimal(uc) - except decimal.InvalidOperation: - raise ValueError('invalid literal for Decimal(): %s' % uc) - self.validate(v) - return v - - -@implementer(IDatetime) -class Datetime(Orderable, Field): - __doc__ = IDatetime.__doc__ - _type = datetime - - def __init__(self, *args, **kw): - super(Datetime, self).__init__(*args, **kw) - - -@implementer(IDate) -class Date(Orderable, Field): - __doc__ = IDate.__doc__ - _type = date - - def _validate(self, value): - super(Date, self)._validate(value) - if isinstance(value, datetime): - raise WrongType(value, self._type, self.__name__) - - -@implementer(ITimedelta) -class Timedelta(Orderable, Field): - __doc__ = ITimedelta.__doc__ - _type = timedelta - - -@implementer(ITime) -class Time(Orderable, Field): - __doc__ = ITime.__doc__ - _type = time - - -@implementer(IChoice, IFromUnicode) -class Choice(Field): - """Choice fields can have a value found in a constant or dynamic set of - values given by the field definition. - """ - - def __init__(self, values=None, vocabulary=None, source=None, **kw): - """Initialize object.""" - if vocabulary is not None: - if (not isinstance(vocabulary, string_types) - and not IBaseVocabulary.providedBy(vocabulary)): - raise ValueError('vocabulary must be a string or implement ' - 'IBaseVocabulary') - if source is not None: - raise ValueError( - "You cannot specify both source and vocabulary.") - elif source is not None: - vocabulary = source - - if (values is None and vocabulary is None): - raise ValueError( - "You must specify either values or vocabulary." - ) - if values is not None and vocabulary is not None: - raise ValueError( - "You cannot specify both values and vocabulary." - ) - - self.vocabulary = None - self.vocabularyName = None - if values is not None: - self.vocabulary = SimpleVocabulary.fromValues(values) - elif isinstance(vocabulary, string_types): - self.vocabularyName = vocabulary - else: - if (not ISource.providedBy(vocabulary) - and not IContextSourceBinder.providedBy(vocabulary)): - raise ValueError('Invalid vocabulary') - self.vocabulary = vocabulary - # Before a default value is checked, it is validated. However, a - # named vocabulary is usually not complete when these fields are - # initialized. Therefore signal the validation method to ignore - # default value checks during initialization of a Choice tied to a - # registered vocabulary. - self._init_field = (bool(self.vocabularyName) or - IContextSourceBinder.providedBy(self.vocabulary)) - super(Choice, self).__init__(**kw) - self._init_field = False - - source = property(lambda self: self.vocabulary) - - def bind(self, object): - """See zope.schema._bootstrapinterfaces.IField.""" - clone = super(Choice, self).bind(object) - # get registered vocabulary if needed: - if IContextSourceBinder.providedBy(self.vocabulary): - clone.vocabulary = self.vocabulary(object) - elif clone.vocabulary is None and self.vocabularyName is not None: - vr = getVocabularyRegistry() - clone.vocabulary = vr.get(object, self.vocabularyName) - - if not ISource.providedBy(clone.vocabulary): - raise ValueError('Invalid clone vocabulary') - - return clone - - def fromUnicode(self, str): - """ See IFromUnicode. - """ - self.validate(str) - return str - - def _validate(self, value): - # Pass all validations during initialization - if self._init_field: - return - super(Choice, self)._validate(value) - vocabulary = self.vocabulary - if vocabulary is None: - vr = getVocabularyRegistry() - try: - vocabulary = vr.get(None, self.vocabularyName) - except VocabularyRegistryError: - raise ValueError("Can't validate value without vocabulary") - if value not in vocabulary: - raise ConstraintNotSatisfied(value, self.__name__) - - -_isuri = r"[a-zA-z0-9+.-]+:" # scheme -_isuri += r"\S*$" # non space (should be pickier) -_isuri = re.compile(_isuri).match - - -@implementer(IURI, IFromUnicode) -class URI(NativeStringLine): - """URI schema field - """ - - def _validate(self, value): - super(URI, self)._validate(value) - if _isuri(value): - return - - raise InvalidURI(value) - - def fromUnicode(self, value): - """ See IFromUnicode. - """ - v = str(value.strip()) - self.validate(v) - return v - - -_isdotted = re.compile( - r"([a-zA-Z][a-zA-Z0-9_]*)" - r"([.][a-zA-Z][a-zA-Z0-9_]*)*" - # use the whole line - r"$").match - - -@implementer(IDottedName) -class DottedName(NativeStringLine): - """Dotted name field. - - Values of DottedName fields must be Python-style dotted names. - """ - - def __init__(self, *args, **kw): - self.min_dots = int(kw.pop("min_dots", 0)) - if self.min_dots < 0: - raise ValueError("min_dots cannot be less than zero") - self.max_dots = kw.pop("max_dots", None) - if self.max_dots is not None: - self.max_dots = int(self.max_dots) - if self.max_dots < self.min_dots: - raise ValueError("max_dots cannot be less than min_dots") - super(DottedName, self).__init__(*args, **kw) - - def _validate(self, value): - """ - - """ - super(DottedName, self)._validate(value) - if not _isdotted(value): - raise InvalidDottedName(value) - dots = value.count(".") - if dots < self.min_dots: - raise InvalidDottedName( - "too few dots; %d required" % self.min_dots, value - ) - if self.max_dots is not None and dots > self.max_dots: - raise InvalidDottedName("too many dots; no more than %d allowed" % - self.max_dots, value) - - def fromUnicode(self, value): - v = value.strip() - if not isinstance(v, self._type): - v = v.encode('ascii') - self.validate(v) - return v - - -@implementer(IId, IFromUnicode) -class Id(NativeStringLine): - """Id field - - Values of id fields must be either uris or dotted names. - """ - - def _validate(self, value): - super(Id, self)._validate(value) - if _isuri(value): - return - if _isdotted(value) and "." in value: - return - - raise InvalidId(value) - - def fromUnicode(self, value): - """ See IFromUnicode. - """ - v = value.strip() - if not isinstance(v, self._type): - v = v.encode('ascii') - self.validate(v) - return v - - -@implementer(IInterfaceField) -class InterfaceField(Field): - __doc__ = IInterfaceField.__doc__ - - def _validate(self, value): - super(InterfaceField, self)._validate(value) - if not IInterface.providedBy(value): - raise WrongType("An interface is required", value, self.__name__) - - -def _validate_sequence(value_type, value, errors=None): - """Validates a sequence value. - - Returns a list of validation errors generated during the validation. If - no errors are generated, returns an empty list. - - value_type is a field. value is the sequence being validated. errors is - an optional list of errors that will be prepended to the return value. - - To illustrate, we'll use a text value type. All values must be unicode. - - >>> from zope.schema._compat import u - >>> from zope.schema._compat import b - >>> field = TextLine(required=True) - - To validate a sequence of various values: - - >>> errors = _validate_sequence(field, (b('foo'), u('bar'), 1)) - >>> errors # XXX assumes Python2 reprs - [WrongType('foo', , ''), WrongType(1, , '')] - - The only valid value in the sequence is the second item. The others - generated errors. - - We can use the optional errors argument to collect additional errors - for a new sequence: - - >>> errors = _validate_sequence(field, (2, u('baz')), errors) - >>> errors # XXX assumes Python2 reprs - [WrongType('foo', , ''), WrongType(1, , ''), WrongType(2, , '')] - - """ - if errors is None: - errors = [] - if value_type is None: - return errors - for item in value: - try: - value_type.validate(item) - except ValidationError as error: - errors.append(error) - return errors - - -def _validate_uniqueness(value): - temp_values = [] - for item in value: - if item in temp_values: - raise NotUnique(item) - - temp_values.append(item) - - -class AbstractCollection(MinMaxLen, Iterable): - value_type = None - unique = False - - def __init__(self, value_type=None, unique=False, **kw): - super(AbstractCollection, self).__init__(**kw) - # whine if value_type is not a field - if value_type is not None and not IField.providedBy(value_type): - raise ValueError("'value_type' must be field instance.") - self.value_type = value_type - self.unique = unique - - def bind(self, object): - """See zope.schema._bootstrapinterfaces.IField.""" - clone = super(AbstractCollection, self).bind(object) - # binding value_type is necessary for choices with named vocabularies, - # and possibly also for other fields. - if clone.value_type is not None: - clone.value_type = clone.value_type.bind(object) - return clone - - def _validate(self, value): - super(AbstractCollection, self)._validate(value) - errors = _validate_sequence(self.value_type, value) - if errors: - raise WrongContainedType(errors, self.__name__) - if self.unique: - _validate_uniqueness(value) - - -@implementer(ITuple) -class Tuple(AbstractCollection): - """A field representing a Tuple.""" - _type = tuple - - -@implementer(IList) -class List(AbstractCollection): - """A field representing a List.""" - _type = list - - -@implementer(ISet) -class Set(AbstractCollection): - """A field representing a set.""" - _type = set - - def __init__(self, **kw): - if 'unique' in kw: # set members are always unique - raise TypeError( - "__init__() got an unexpected keyword argument 'unique'") - super(Set, self).__init__(unique=True, **kw) - - -@implementer(IFrozenSet) -class FrozenSet(AbstractCollection): - _type = frozenset - - def __init__(self, **kw): - if 'unique' in kw: # set members are always unique - raise TypeError( - "__init__() got an unexpected keyword argument 'unique'") - super(FrozenSet, self).__init__(unique=True, **kw) - - -VALIDATED_VALUES = threading.local() - - -def _validate_fields(schema, value, errors=None): - if errors is None: - errors = [] - # Interface can be used as schema property for Object fields that plan to - # hold values of any type. - # Because Interface does not include any Attribute, it is obviously not - # worth looping on its methods and filter them all out. - if schema is Interface: - return errors - # if `value` is part of a cyclic graph, we need to break the cycle to avoid - # infinite recursion. Collect validated objects in a thread local dict by - # it's python represenation. A previous version was setting a volatile - # attribute which didn't work with security proxy - if id(value) in VALIDATED_VALUES.__dict__: - return errors - VALIDATED_VALUES.__dict__[id(value)] = True - # (If we have gotten here, we know that `value` provides an interface - # other than zope.interface.Interface; - # iow, we can rely on the fact that it is an instance - # that supports attribute assignment.) - try: - for name in schema.names(all=True): - if not IMethod.providedBy(schema[name]): - try: - attribute = schema[name] - if IChoice.providedBy(attribute): - # Choice must be bound before validation otherwise - # IContextSourceBinder is not iterable in validation - bound = attribute.bind(value) - bound.validate(getattr(value, name)) - elif IField.providedBy(attribute): - # validate attributes that are fields - attribute.validate(getattr(value, name)) - except ValidationError as error: - errors.append(error) - except AttributeError as error: - # property for the given name is not implemented - errors.append(SchemaNotFullyImplemented(error)) - finally: - del VALIDATED_VALUES.__dict__[id(value)] - return errors - - -@implementer(IObject) -class Object(Field): - __doc__ = IObject.__doc__ - - def __init__(self, schema, **kw): - if not IInterface.providedBy(schema): - raise WrongType - - self.schema = schema - super(Object, self).__init__(**kw) - - def _validate(self, value): - super(Object, self)._validate(value) - - # schema has to be provided by value - if not self.schema.providedBy(value): - raise SchemaNotProvided - - # check the value against schema - errors = _validate_fields(self.schema, value) - if errors: - raise WrongContainedType(errors, self.__name__) - - def set(self, object, value): - # Announce that we're going to assign the value to the object. - # Motivation: Widgets typically like to take care of policy-specific - # actions, like establishing location. - event = BeforeObjectAssignedEvent(value, self.__name__, object) - notify(event) - # The event subscribers are allowed to replace the object, thus we need - # to replace our previous value. - value = event.object - super(Object, self).set(object, value) - - -@implementer(IBeforeObjectAssignedEvent) -class BeforeObjectAssignedEvent(object): - """An object is going to be assigned to an attribute on another object.""" - - def __init__(self, object, name, context): - self.object = object - self.name = name - self.context = context - - -@implementer(IDict) -class Dict(MinMaxLen, Iterable): - """A field representing a Dict.""" - _type = dict - key_type = None - value_type = None - - def __init__(self, key_type=None, value_type=None, **kw): - super(Dict, self).__init__(**kw) - # whine if key_type or value_type is not a field - if key_type is not None and not IField.providedBy(key_type): - raise ValueError("'key_type' must be field instance.") - if value_type is not None and not IField.providedBy(value_type): - raise ValueError("'value_type' must be field instance.") - self.key_type = key_type - self.value_type = value_type - - def _validate(self, value): - super(Dict, self)._validate(value) - errors = [] - try: - if self.value_type: - errors = _validate_sequence(self.value_type, value.values(), - errors) - errors = _validate_sequence(self.key_type, value, errors) - - if errors: - raise WrongContainedType(errors, self.__name__) - - finally: - errors = None - - def bind(self, object): - """See zope.schema._bootstrapinterfaces.IField.""" - clone = super(Dict, self).bind(object) - # binding value_type is necessary for choices with named vocabularies, - # and possibly also for other fields. - if clone.key_type is not None: - clone.key_type = clone.key_type.bind(object) - if clone.value_type is not None: - clone.value_type = clone.value_type.bind(object) - return clone diff --git a/zope/schema/_messageid.py b/zope/schema/_messageid.py deleted file mode 100644 index ce3494de..00000000 --- a/zope/schema/_messageid.py +++ /dev/null @@ -1,20 +0,0 @@ -############################################################################## -# -# Copyright (c) 2000 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## - -try: - from zope.i18nmessageid import MessageFactory -except ImportError: # pragma: no cover - from zope.schema._compat import text_type as _ -else: # pragma: no cover - _ = MessageFactory("zope") diff --git a/zope/schema/_schema.py b/zope/schema/_schema.py deleted file mode 100644 index 413f5d08..00000000 --- a/zope/schema/_schema.py +++ /dev/null @@ -1,90 +0,0 @@ -############################################################################## -# -# Copyright (c) 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Schema convenience functions -""" - -import zope.interface.verify - - -def getFieldNames(schema): - """Return a list of all the Field names in a schema. - """ - from zope.schema.interfaces import IField - return [name for name in schema if IField.providedBy(schema[name])] - - -def getFields(schema): - """Return a dictionary containing all the Fields in a schema. - """ - from zope.schema.interfaces import IField - fields = {} - for name in schema: - attr = schema[name] - if IField.providedBy(attr): - fields[name] = attr - return fields - - -def getFieldsInOrder(schema, _field_key=lambda x: x[1].order): - """Return a list of (name, value) tuples in native schema order. - """ - return sorted(getFields(schema).items(), key=_field_key) - - -def getFieldNamesInOrder(schema): - """Return a list of all the Field names in a schema in schema order. - """ - return [name for name, field in getFieldsInOrder(schema)] - - -def getValidationErrors(schema, object): - """Return a list of all validation errors. - """ - errors = getSchemaValidationErrors(schema, object) - if errors: - return errors - - # Only validate invariants if there were no previous errors. Previous - # errors could be missing attributes which would most likely make an - # invariant raise an AttributeError. - invariant_errors = [] - try: - schema.validateInvariants(object, invariant_errors) - except zope.interface.exceptions.Invalid: - # Just collect errors - pass - errors = [(None, e) for e in invariant_errors] - return errors - - -def getSchemaValidationErrors(schema, object): - errors = [] - for name in schema.names(all=True): - if zope.interface.interfaces.IMethod.providedBy(schema[name]): - continue - attribute = schema[name] - if not zope.schema.interfaces.IField.providedBy(attribute): - continue - try: - value = getattr(object, name) - except AttributeError as error: - # property for the given name is not implemented - errors.append(( - name, zope.schema.interfaces.SchemaNotFullyImplemented(error))) - else: - try: - attribute.bind(object).validate(value) - except zope.schema.ValidationError as e: - errors.append((name, e)) - return errors diff --git a/zope/schema/accessors.py b/zope/schema/accessors.py deleted file mode 100644 index 983c1cd6..00000000 --- a/zope/schema/accessors.py +++ /dev/null @@ -1,120 +0,0 @@ -############################################################################## -# -# Copyright (c) 2003 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -""" -Field accessors -=============== - -Accessors are used to model methods used to access data defined by fields. -Accessors are fields that work by decorating existing fields. - -To define accessors in an interface, use the accessors function:: - - class IMyInterface(Interface): - - getFoo, setFoo = accessors(Text(title=u'Foo', ...)) - - getBar = accessors(TextLine(title=u'Foo', readonly=True, ...) - - -Normally a read accessor and a write accessor are defined. Only a -read accessor is defined for read-only fields. - -Read accessors function as access method specifications and as field -specifications. Write accessors are solely method specifications. -""" - -from zope.interface import providedBy, implementedBy -from zope.interface.interface import Method - - -class FieldReadAccessor(Method): - """Field read accessor - """ - - # A read field accessor is a method and a field. - # A read accessor is a decorator of a field, using the given - # fields properties to provide meta data. - - def __provides__(self): - return providedBy(self.field) + implementedBy(FieldReadAccessor) - __provides__ = property(__provides__) - - def __init__(self, field): - self.field = field - Method.__init__(self, '') - self.__doc__ = 'get %s' % field.__doc__ - - def getSignatureString(self): - return '()' - - def getSignatureInfo(self): - return {'positional': (), - 'required': (), - 'optional': (), - 'varargs': None, - 'kwargs': None, - } - - def get(self, object): - return getattr(object, self.__name__)() - - def query(self, object, default=None): - try: - f = getattr(object, self.__name__) - except AttributeError: - return default - else: - return f() - - def set(self, object, value): - if self.readonly: - raise TypeError("Can't set values on read-only fields") - getattr(object, self.writer.__name__)(value) - - def __getattr__(self, name): - return getattr(self.field, name) - - def bind(self, object): - clone = self.__class__.__new__(self.__class__) - clone.__dict__.update(self.__dict__) - clone.field = self.field.bind(object) - return clone - - -class FieldWriteAccessor(Method): - - def __init__(self, field): - Method.__init__(self, '') - self.field = field - self.__doc__ = 'set %s' % field.__doc__ - - def getSignatureString(self): - return '(newvalue)' - - def getSignatureInfo(self): - return {'positional': ('newvalue',), - 'required': ('newvalue',), - 'optional': (), - 'varargs': None, - 'kwargs': None, - } - - -def accessors(field): - reader = FieldReadAccessor(field) - yield reader - if not field.readonly: - writer = FieldWriteAccessor(field) - reader.writer = writer - yield writer diff --git a/zope/schema/fieldproperty.py b/zope/schema/fieldproperty.py deleted file mode 100644 index 3de5003f..00000000 --- a/zope/schema/fieldproperty.py +++ /dev/null @@ -1,150 +0,0 @@ -############################################################################## -# -# Copyright (c) 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Computed attributes based on schema fields -""" - -from copy import copy -import sys -import zope.schema -from zope import interface -from zope import event -from zope.schema import interfaces -from zope.schema._bootstrapinterfaces import NO_VALUE - -_marker = object() - - -@interface.implementer(interfaces.IFieldUpdatedEvent) -class FieldUpdatedEvent(object): - - def __init__(self, inst, field, old_value, new_value): - self.inst = inst - self.field = field - self.old_value = old_value - self.new_value = new_value - - -class FieldProperty(object): - """Computed attributes based on schema fields - - Field properties provide default values, data validation and error messages - based on data found in field meta-data. - - Note that FieldProperties cannot be used with slots. They can only - be used for attributes stored in instance dictionaries. - """ - - def __init__(self, field, name=None): - if name is None: - name = field.__name__ - - self.__field = field - self.__name = name - - def __get__(self, inst, klass): - if inst is None: - return self - - value = inst.__dict__.get(self.__name, _marker) - if value is _marker: - field = self.__field.bind(inst) - value = getattr(field, 'default', _marker) - if value is _marker: - raise AttributeError(self.__name) - - return value - - def queryValue(self, inst, default): - value = inst.__dict__.get(self.__name, default) - if value is default: - field = self.__field.bind(inst) - value = getattr(field, 'default', default) - return value - - def __set__(self, inst, value): - field = self.__field.bind(inst) - field.validate(value) - if field.readonly and self.__name in inst.__dict__: - raise ValueError(self.__name, 'field is readonly') - oldvalue = self.queryValue(inst, NO_VALUE) - inst.__dict__[self.__name] = value - event.notify(FieldUpdatedEvent(inst, field, oldvalue, value)) - - def __getattr__(self, name): - return getattr(self.__field, name) - - -def createFieldProperties(schema, omit=[]): - """Creates a FieldProperty fields in `schema` on the class it is called on. - - schema ... interface those fields should be added to class - omit ... list of field names to be omitted in creation - - """ - frame = sys._getframe(1) - for name in zope.schema.getFieldNamesInOrder(schema): - if name in omit: - continue - frame.f_locals[name] = FieldProperty(schema[name]) - - -class FieldPropertyStoredThroughField(object): - - def __init__(self, field, name=None): - if name is None: - name = field.__name__ - - self.field = copy(field) - self.field.__name__ = "__st_%s_st" % self.field.__name__ - self.__name = name - - def setValue(self, inst, field, value): - field.set(inst, value) - - def getValue(self, inst, field): - return field.query(inst, _marker) - - def queryValue(self, inst, field, default): - return field.query(inst, default) - - def __getattr__(self, name): - return getattr(self.field, name) - - def __get__(self, inst, klass): - if inst is None: - return self - - field = self.field.bind(inst) - value = self.getValue(inst, field) - if value is _marker: - value = getattr(field, 'default', _marker) - if value is _marker: - raise AttributeError(self.__name) - - return value - - def __set__(self, inst, value): - field = self.field.bind(inst) - field.validate(value) - if field.readonly: - if self.queryValue(inst, field, _marker) is _marker: - field.readonly = False - self.setValue(inst, field, value) - field.readonly = True - return - else: - raise ValueError(self.__name, 'field is readonly') - oldvalue = self.queryValue(inst, field, NO_VALUE) - self.setValue(inst, field, value) - event.notify(FieldUpdatedEvent(inst, self.field, oldvalue, value)) diff --git a/zope/schema/interfaces.py b/zope/schema/interfaces.py deleted file mode 100644 index b9dc8a70..00000000 --- a/zope/schema/interfaces.py +++ /dev/null @@ -1,764 +0,0 @@ -############################################################################## -# -# Copyright (c) 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Schema interfaces and exceptions -""" -__docformat__ = "reStructuredText" - -from zope.interface import Interface, Attribute -from zope.interface.common.mapping import IEnumerableMapping - - -# Import from _bootstrapinterfaces only because other packages will expect -# to find these interfaces here. -from zope.schema._bootstrapfields import Field -from zope.schema._bootstrapfields import Text -from zope.schema._bootstrapfields import TextLine -from zope.schema._bootstrapfields import Bool -from zope.schema._bootstrapfields import Int -from zope.schema._bootstrapinterfaces import StopValidation -from zope.schema._bootstrapinterfaces import ValidationError -from zope.schema._bootstrapinterfaces import IFromUnicode -from zope.schema._bootstrapinterfaces import RequiredMissing -from zope.schema._bootstrapinterfaces import WrongType -from zope.schema._bootstrapinterfaces import ConstraintNotSatisfied -from zope.schema._bootstrapinterfaces import NotAContainer -from zope.schema._bootstrapinterfaces import NotAnIterator -from zope.schema._bootstrapinterfaces import TooSmall -from zope.schema._bootstrapinterfaces import TooBig -from zope.schema._bootstrapinterfaces import TooLong -from zope.schema._bootstrapinterfaces import TooShort -from zope.schema._bootstrapinterfaces import InvalidValue -from zope.schema._bootstrapinterfaces import IContextAwareDefaultFactory - -from zope.schema._compat import PY3 -from zope.schema._compat import u -from zope.schema._messageid import _ - - -# pep 8 friendlyness -StopValidation, ValidationError, IFromUnicode, RequiredMissing, WrongType -ConstraintNotSatisfied, NotAContainer, NotAnIterator -TooSmall, TooBig, TooLong, TooShort, InvalidValue, IContextAwareDefaultFactory - - -class WrongContainedType(ValidationError): - __doc__ = _("""Wrong contained type""") - - -class NotUnique(ValidationError): - __doc__ = _("""One or more entries of sequence are not unique.""") - - -class SchemaNotFullyImplemented(ValidationError): - __doc__ = _("""Schema not fully implemented""") - - -class SchemaNotProvided(ValidationError): - __doc__ = _("""Schema not provided""") - - -class InvalidURI(ValidationError): - __doc__ = _("""The specified URI is not valid.""") - - -class InvalidId(ValidationError): - __doc__ = _("""The specified id is not valid.""") - - -class InvalidDottedName(ValidationError): - __doc__ = _("""The specified dotted name is not valid.""") - - -class Unbound(Exception): - __doc__ = _("""The field is not bound.""") - - -class IField(Interface): - """Basic Schema Field Interface. - - Fields are used for Interface specifications. They at least provide - a title, description and a default value. You can also - specify if they are required and/or readonly. - - The Field Interface is also used for validation and specifying - constraints. - - We want to make it possible for a IField to not only work - on its value but also on the object this value is bound to. - This enables a Field implementation to perform validation - against an object which also marks a certain place. - - Note that many fields need information about the object - containing a field. For example, when validating a value to be - set as an object attribute, it may be necessary for the field to - introspect the object's state. This means that the field needs to - have access to the object when performing validation:: - - bound = field.bind(object) - bound.validate(value) - - """ - - def bind(object): - """Return a copy of this field which is bound to context. - - The copy of the Field will have the 'context' attribute set - to 'object'. This way a Field can implement more complex - checks involving the object's location/environment. - - Many fields don't need to be bound. Only fields that condition - validation or properties on an object containing the field - need to be bound. - """ - - title = TextLine( - title=_("Title"), - description=_("A short summary or label"), - default=u(""), - required=False, - ) - - description = Text( - title=_("Description"), - description=_("A description of the field"), - default=u(""), - required=False, - ) - - required = Bool( - title=_("Required"), - description=(_("Tells whether a field requires its value to exist.")), - default=True) - - readonly = Bool( - title=_("Read Only"), - description=_("If true, the field's value cannot be changed."), - required=False, - default=False) - - default = Field( - title=_("Default Value"), - description=_("""The field default value may be None or a legal - field value""") - ) - - missing_value = Field( - title=_("Missing Value"), - description=_("""If input for this Field is missing, and that's ok, - then this is the value to use""") - ) - - order = Int( - title=_("Field Order"), - description=_(""" - The order attribute can be used to determine the order in - which fields in a schema were defined. If one field is created - after another (in the same thread), its order will be - greater. - - (Fields in separate threads could have the same order.) - """), - required=True, - readonly=True, - ) - - def constraint(value): - """Check a customized constraint on the value. - - You can implement this method with your Field to - require a certain constraint. This relaxes the need - to inherit/subclass a Field you to add a simple constraint. - Returns true if the given value is within the Field's constraint. - """ - - def validate(value): - """Validate that the given value is a valid field value. - - Returns nothing but raises an error if the value is invalid. - It checks everything specific to a Field and also checks - with the additional constraint. - """ - - def get(object): - """Get the value of the field for the given object.""" - - def query(object, default=None): - """Query the value of the field for the given object. - - Return the default if the value hasn't been set. - """ - - def set(object, value): - """Set the value of the field for the object - - Raises a type error if the field is a read-only field. - """ - - -class IIterable(IField): - """Fields with a value that can be iterated over. - - The value needs to support iteration; the implementation mechanism - is not constrained. (Either `__iter__()` or `__getitem__()` may be - used.) - """ - - -class IContainer(IField): - """Fields whose value allows an ``x in value`` check. - - The value needs to support the `in` operator, but is not - constrained in how it does so (whether it defines `__contains__()` - or `__getitem__()` is immaterial). - """ - - -class IOrderable(IField): - """Field requiring its value to be orderable. - - The set of value needs support a complete ordering; the - implementation mechanism is not constrained. Either `__cmp__()` or - 'rich comparison' methods may be used. - """ - - -class ILen(IField): - """A Field requiring its value to have a length. - - The value needs to have a conventional __len__ method. - """ - - -class IMinMax(IOrderable): - """Field requiring its value to be between min and max. - - This implies that the value needs to support the IOrderable interface. - """ - - min = Field( - title=_("Start of the range"), - required=False, - default=None - ) - - max = Field( - title=_("End of the range (including the value itself)"), - required=False, - default=None - ) - - -class IMinMaxLen(ILen): - """Field requiring the length of its value to be within a range""" - - min_length = Int( - title=_("Minimum length"), - description=_(""" - Value after whitespace processing cannot have less than - `min_length` characters (if a string type) or elements (if - another sequence type). If `min_length` is ``None``, there is - no minimum. - """), - required=False, - min=0, # needs to be a positive number - default=0) - - max_length = Int( - title=_("Maximum length"), - description=_(""" - Value after whitespace processing cannot have greater - or equal than `max_length` characters (if a string type) or - elements (if another sequence type). If `max_length` is - ``None``, there is no maximum."""), - required=False, - min=0, # needs to be a positive number - default=None) - - -class IInterfaceField(IField): - """Fields with a value that is an interface (implementing - zope.interface.Interface).""" - - -class IBool(IField): - """Boolean Field.""" - - default = Bool( - title=_("Default Value"), - description=_("""The field default value may be None or a legal - field value""") - ) - - -class IBytes(IMinMaxLen, IIterable, IField): - """Field containing a byte string (like the python str). - - The value might be constrained to be with length limits. - """ - - -class IText(IMinMaxLen, IIterable, IField): - """Field containing a unicode string.""" - - -# for things which are of the str type on both Python 2 and 3 -if PY3: # pragma: no cover - INativeString = IText -else: # pragma: no cover - INativeString = IBytes - - -class IASCII(INativeString): - """Field containing a 7-bit ASCII string. No characters > DEL - (chr(127)) are allowed - - The value might be constrained to be with length limits. - """ - - -class IBytesLine(IBytes): - """Field containing a byte string without newlines.""" - - -class IASCIILine(IASCII): - """Field containing a 7-bit ASCII string without newlines.""" - - -class ISourceText(IText): - """Field for source text of object.""" - - -class ITextLine(IText): - """Field containing a unicode string without newlines.""" - - -if PY3: # pragma: no cover - INativeStringLine = ITextLine -else: # pragma: no cover - INativeStringLine = IBytesLine - - -class IPassword(ITextLine): - "Field containing a unicode string without newlines that is a password." - - -class IInt(IMinMax, IField): - """Field containing an Integer Value.""" - - min = Int( - title=_("Start of the range"), - required=False, - default=None - ) - - max = Int( - title=_("End of the range (excluding the value itself)"), - required=False, - default=None - ) - - default = Int( - title=_("Default Value"), - description=_("""The field default value may be None or a legal - field value""") - ) - - -class IFloat(IMinMax, IField): - """Field containing a Float.""" - - -class IDecimal(IMinMax, IField): - """Field containing a Decimal.""" - - -class IDatetime(IMinMax, IField): - """Field containing a DateTime.""" - - -class IDate(IMinMax, IField): - """Field containing a date.""" - - -class ITimedelta(IMinMax, IField): - """Field containing a timedelta.""" - - -class ITime(IMinMax, IField): - """Field containing a time.""" - - -def _is_field(value): - if not IField.providedBy(value): - return False - return True - - -def _fields(values): - for value in values: - if not _is_field(value): - return False - return True - - -class IURI(INativeStringLine): - """A field containing an absolute URI - """ - - -class IId(INativeStringLine): - """A field containing a unique identifier - - A unique identifier is either an absolute URI or a dotted name. - If it's a dotted name, it should have a module/package name as a prefix. - """ - - -class IDottedName(INativeStringLine): - """Dotted name field. - - Values of DottedName fields must be Python-style dotted names. - """ - - min_dots = Int( - title=_("Minimum number of dots"), - required=True, - min=0, - default=0 - ) - - max_dots = Int( - title=_("Maximum number of dots (should not be less than min_dots)"), - required=False, - default=None - ) - - -class IChoice(IField): - """Field whose value is contained in a predefined set - - Only one, values or vocabulary, may be specified for a given choice. - """ - vocabulary = Field( - title=_("Vocabulary or source providing values"), - description=_("The ISource, IContextSourceBinder or IBaseVocabulary " - "object that provides values for this field."), - required=False, - default=None - ) - - vocabularyName = TextLine( - title=_("Vocabulary name"), - description=_("Vocabulary name to lookup in the vocabulary registry"), - required=False, - default=None - ) - -# Collections: - -# Abstract - - -class ICollection(IMinMaxLen, IIterable, IContainer): - """Abstract interface containing a collection value. - - The Value must be iterable and may have a min_length/max_length. - """ - - value_type = Field( - title=_("Value Type"), - description=_("Field value items must conform to the given type, " - "expressed via a Field.")) - - unique = Bool( - title=_('Unique Members'), - description=_('Specifies whether the members of the collection ' - 'must be unique.'), - default=False) - - -class ISequence(ICollection): - """Abstract interface specifying that the value is ordered""" - - -class IUnorderedCollection(ICollection): - """Abstract interface specifying that the value cannot be ordered""" - - -class IAbstractSet(IUnorderedCollection): - """An unordered collection of unique values.""" - - unique = Attribute("This ICollection interface attribute must be True") - - -class IAbstractBag(IUnorderedCollection): - """An unordered collection of values, with no limitations on whether - members are unique""" - - unique = Attribute("This ICollection interface attribute must be False") - - -# Concrete - - -class ITuple(ISequence): - """Field containing a value that implements the API of a conventional - Python tuple.""" - - -class IList(ISequence): - """Field containing a value that implements the API of a conventional - Python list.""" - - -class ISet(IAbstractSet): - """Field containing a value that implements the API of a Python2.4+ set. - """ - - -class IFrozenSet(IAbstractSet): - """Field containing a value that implements the API of a conventional - Python 2.4+ frozenset.""" - -# (end Collections) - - -class IObject(IField): - """Field containing an Object value.""" - - schema = Attribute( - "schema", - _("The Interface that defines the Fields comprising the Object.") - ) - - -class IBeforeObjectAssignedEvent(Interface): - """An object is going to be assigned to an attribute on another object. - - Subscribers to this event can change the object on this event to change - what object is going to be assigned. This is useful, e.g. for wrapping - or replacing objects before they get assigned to conform to application - policy. - """ - - object = Attribute("The object that is going to be assigned.") - - name = Attribute("The name of the attribute under which the object " - "will be assigned.") - - context = Attribute("The context object where the object will be " - "assigned to.") - - -class IDict(IMinMaxLen, IIterable, IContainer): - """Field containing a conventional dict. - - The key_type and value_type fields allow specification - of restrictions for keys and values contained in the dict. - """ - - key_type = Attribute( - "key_type", - _("Field keys must conform to the given type, expressed via a Field.") - ) - - value_type = Attribute( - "value_type", - _("Field values must conform to the given type, expressed " - "via a Field.") - ) - - -class ITerm(Interface): - """Object representing a single value in a vocabulary.""" - - value = Attribute( - "value", "The value used to represent vocabulary term in a field.") - - -class ITokenizedTerm(ITerm): - """Object representing a single value in a tokenized vocabulary. - """ - - # Should be a ``zope.schema.ASCIILine``, but `ASCIILine` is not a bootstrap - # field. - token = Attribute( - "token", - """Token which can be used to represent the value on a stream. - - The value of this attribute must be a non-empty 7-bit string. - Control characters are not allowed. - """) - - -class ITitledTokenizedTerm(ITokenizedTerm): - """A tokenized term that includes a title.""" - - title = TextLine(title=_("Title")) - - -class ISource(Interface): - """A set of values from which to choose - - Sources represent sets of values. They are used to specify the - source for choice fields. - - Sources can be large (even infinite), in which case, they need to - be queried to find out what their values are. - """ - - def __contains__(value): - """Return whether the value is available in this source - """ - - -class ISourceQueriables(Interface): - """A collection of objects for querying sources - """ - - def getQueriables(): - """Return an iterable of objects that can be queried - - The returned obects should be two-tuples with: - - - A unicode id - - The id must uniquely identify the queriable object within - the set of queriable objects. Furthermore, in subsequent - calls, the same id should be used for a given queriable - object. - - - A queriable object - - This is an object for which there is a view provided for - searching for items. - - """ - - -class IContextSourceBinder(Interface): - def __call__(context): - """Return a context-bound instance that implements ISource. - """ - - -class IBaseVocabulary(ISource): - """Representation of a vocabulary. - - At this most basic level, a vocabulary only need to support a test - for containment. This can be implemented either by __contains__() - or by sequence __getitem__() (the later only being useful for - vocabularies which are intrinsically ordered). - """ - - def getTerm(value): - """Return the ITerm object for the term 'value'. - - If 'value' is not a valid term, this method raises LookupError. - """ - - -class IIterableSource(ISource): - """Source which supports iteration over allowed values. - - The objects iteration provides must be values from the source. - """ - - def __iter__(): - """Return an iterator which provides the values from the source.""" - - def __len__(): - """Return the number of valid values, or sys.maxint.""" - - -# BBB vocabularies are pending deprecation, hopefully in 3.3 -class IIterableVocabulary(Interface): - """Vocabulary which supports iteration over allowed values. - - The objects iteration provides must conform to the ITerm - interface. - """ - - def __iter__(): - """Return an iterator which provides the terms from the vocabulary.""" - - def __len__(): - """Return the number of valid terms, or sys.maxint.""" - - -class IVocabulary(IIterableVocabulary, IBaseVocabulary): - """Vocabulary which is iterable.""" - - -class IVocabularyTokenized(IVocabulary): - """Vocabulary that provides support for tokenized representation. - - Terms returned from getTerm() and provided by iteration must - conform to ITokenizedTerm. - """ - - def getTermByToken(token): - """Return an ITokenizedTerm for the passed-in token. - - If `token` is not represented in the vocabulary, `LookupError` - is raised. - """ - - -class ITreeVocabulary(IVocabularyTokenized, IEnumerableMapping): - """A tokenized vocabulary with a tree-like structure. - - The tree is implemented as dictionary, with keys being ITokenizedTerm - terms and the values being similar dictionaries. Leaf values are empty - dictionaries. - """ - - -class IVocabularyRegistry(Interface): - """Registry that provides IBaseVocabulary objects for specific fields. - """ - - def get(object, name): - """Return the vocabulary named 'name' for the content object - 'object'. - - When the vocabulary cannot be found, LookupError is raised. - """ - - -class IVocabularyFactory(Interface): - """Can create vocabularies.""" - - def __call__(context): - """The context provides a location that the vocabulary can make use of. - """ - - -class IFieldEvent(Interface): - - field = Attribute("The field that has been changed") - - object = Attribute("The object containing the field") - - -class IFieldUpdatedEvent(IFieldEvent): - """ - A field has been modified - - Subscribers will get the old and the new value together with the field - """ - - old_value = Attribute("The value of the field before modification") - - new_value = Attribute("The value of the field after modification") diff --git a/zope/schema/tests/__init__.py b/zope/schema/tests/__init__.py deleted file mode 100644 index 58ecb2cb..00000000 --- a/zope/schema/tests/__init__.py +++ /dev/null @@ -1,49 +0,0 @@ -# -# This file is necessary to make this directory a package. - -import re - -from zope.schema._compat import PY3 -from zope.testing import renormalizing - -if PY3: - py3_checker = renormalizing.RENormalizing([ - (re.compile(r"u'([^']*)'"), - r"'\1'"), - (re.compile(r"^b'([^']*)'"), - r"'\1'"), - (re.compile(r"([^'])b'([^']*)'"), - r"\1'\2'"), - (re.compile(r""), - r""), - (re.compile(r""), - r""), - (re.compile(r"zope.schema._bootstrapinterfaces.InvalidValue"), - r"InvalidValue"), - (re.compile(r"zope.schema.interfaces.InvalidId: '([^']*)'"), - r"InvalidId: \1"), - (re.compile(r"zope.schema.interfaces.InvalidId:"), - r"InvalidId:"), - (re.compile(r"zope.schema.interfaces.InvalidURI: '([^']*)'"), - r"InvalidURI: \1"), - (re.compile(r"zope.schema.interfaces.InvalidURI:"), - r"InvalidURI:"), - (re.compile(r"zope.schema.interfaces.InvalidDottedName: '([^']*)'"), - r"InvalidDottedName: \1"), - (re.compile(r"zope.schema.interfaces.InvalidDottedName:"), - r"InvalidDottedName:"), - (re.compile( - r"zope.schema._bootstrapinterfaces.ConstraintNotSatisfied: '([^']*)'" - ), - r"ConstraintNotSatisfied: \1"), - (re.compile( - r"zope.schema._bootstrapinterfaces.ConstraintNotSatisfied:"), - r"ConstraintNotSatisfied:"), - (re.compile(r"zope.schema._bootstrapinterfaces.WrongType:"), - r"WrongType:"), - ]) -else: - py3_checker = renormalizing.RENormalizing([ - (re.compile(r"([^'])b'([^']*)'"), - r"\1'\2'"), - ]) diff --git a/zope/schema/tests/states.py b/zope/schema/tests/states.py deleted file mode 100644 index 9c0c459b..00000000 --- a/zope/schema/tests/states.py +++ /dev/null @@ -1,130 +0,0 @@ -############################################################################## -# -# Copyright (c) 2003 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Sample vocabulary supporting state abbreviations. -""" -from zope.schema._compat import u -from zope.interface import implementer -from zope.schema import interfaces -from zope.schema import Choice - -# This table is based on information from the United States Postal Service: -# http://www.usps.com/ncsc/lookups/abbreviations.html#states -_states = { - 'AL': u('Alabama'), - 'AK': u('Alaska'), - 'AS': u('American Samoa'), - 'AZ': u('Arizona'), - 'AR': u('Arkansas'), - 'CA': u('California'), - 'CO': u('Colorado'), - 'CT': u('Connecticut'), - 'DE': u('Delaware'), - 'DC': u('District of Columbia'), - 'FM': u('Federated States of Micronesia'), - 'FL': u('Florida'), - 'GA': u('Georgia'), - 'GU': u('Guam'), - 'HI': u('Hawaii'), - 'ID': u('Idaho'), - 'IL': u('Illinois'), - 'IN': u('Indiana'), - 'IA': u('Iowa'), - 'KS': u('Kansas'), - 'KY': u('Kentucky'), - 'LA': u('Louisiana'), - 'ME': u('Maine'), - 'MH': u('Marshall Islands'), - 'MD': u('Maryland'), - 'MA': u('Massachusetts'), - 'MI': u('Michigan'), - 'MN': u('Minnesota'), - 'MS': u('Mississippi'), - 'MO': u('Missouri'), - 'MT': u('Montana'), - 'NE': u('Nebraska'), - 'NV': u('Nevada'), - 'NH': u('New Hampshire'), - 'NJ': u('New Jersey'), - 'NM': u('New Mexico'), - 'NY': u('New York'), - 'NC': u('North Carolina'), - 'ND': u('North Dakota'), - 'MP': u('Northern Mariana Islands'), - 'OH': u('Ohio'), - 'OK': u('Oklahoma'), - 'OR': u('Oregon'), - 'PW': u('Palau'), - 'PA': u('Pennsylvania'), - 'PR': u('Puerto Rico'), - 'RI': u('Rhode Island'), - 'SC': u('South Carolina'), - 'SD': u('South Dakota'), - 'TN': u('Tennessee'), - 'TX': u('Texas'), - 'UT': u('Utah'), - 'VT': u('Vermont'), - 'VI': u('Virgin Islands'), - 'VA': u('Virginia'), - 'WA': u('Washington'), - 'WV': u('West Virginia'), - 'WI': u('Wisconsin'), - 'WY': u('Wyoming'), - } - - -@implementer(interfaces.ITerm) -class State(object): - __slots__ = 'value', 'title' - - def __init__(self, value, title): - self.value = value - self.title = title - -for v, p in _states.items(): - _states[v] = State(v, p) - - -class IStateVocabulary(interfaces.IVocabulary): - """Vocabularies that support the states database conform to this.""" - - -@implementer(IStateVocabulary) -class StateVocabulary(object): - __slots__ = () - - def __init__(self, object=None): - pass - - def __contains__(self, value): - return value in _states - - def __iter__(self): - return iter(_states.values()) - - def __len__(self): - return len(_states) - - def getTerm(self, value): - return _states[value] - - -class StateSelectionField(Choice): - - vocabulary = StateVocabulary() - - def __init__(self, **kw): - super(StateSelectionField, self).__init__( - vocabulary=StateSelectionField.vocabulary, - **kw) - self.vocabularyName = "states" diff --git a/zope/schema/tests/test__bootstrapfields.py b/zope/schema/tests/test__bootstrapfields.py deleted file mode 100644 index 61c76465..00000000 --- a/zope/schema/tests/test__bootstrapfields.py +++ /dev/null @@ -1,822 +0,0 @@ -############################################################################## -# -# Copyright (c) 2012 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -import unittest - - -class ValidatedPropertyTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._bootstrapfields import ValidatedProperty - return ValidatedProperty - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test___set___not_missing_w_check(self): - _checked = [] - - def _check(inst, value): - _checked.append((inst, value)) - - class Test(DummyInst): - _prop = None - prop = self._makeOne('_prop', _check) - inst = Test() - inst.prop = 'PROP' - self.assertEqual(inst._prop, 'PROP') - self.assertEqual(_checked, [(inst, 'PROP')]) - - def test___set___not_missing_wo_check(self): - class Test(DummyInst): - _prop = None - prop = self._makeOne('_prop') - inst = Test(ValueError) - - def _provoke(inst): - inst.prop = 'PROP' - self.assertRaises(ValueError, _provoke, inst) - self.assertEqual(inst._prop, None) - - def test___set___w_missing_wo_check(self): - class Test(DummyInst): - _prop = None - prop = self._makeOne('_prop') - inst = Test(ValueError) - inst.prop = DummyInst.missing_value - self.assertEqual(inst._prop, DummyInst.missing_value) - - def test___get__(self): - class Test(DummyInst): - _prop = None - prop = self._makeOne('_prop') - inst = Test() - inst._prop = 'PROP' - self.assertEqual(inst.prop, 'PROP') - - -class DefaultPropertyTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._bootstrapfields import DefaultProperty - return DefaultProperty - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test___get___wo_defaultFactory_miss(self): - class Test(DummyInst): - _prop = None - prop = self._makeOne('_prop') - inst = Test() - inst.defaultFactory = None - - def _provoke(inst): - return inst.prop - self.assertRaises(KeyError, _provoke, inst) - - def test___get___wo_defaultFactory_hit(self): - class Test(DummyInst): - _prop = None - prop = self._makeOne('_prop') - inst = Test() - inst.defaultFactory = None - inst._prop = 'PROP' - self.assertEqual(inst.prop, 'PROP') - - def test__get___wo_defaultFactory_in_dict(self): - class Test(DummyInst): - _prop = None - prop = self._makeOne('_prop') - inst = Test() - inst._prop = 'PROP' - self.assertEqual(inst.prop, 'PROP') - - def test___get___w_defaultFactory_not_ICAF_no_check(self): - class Test(DummyInst): - _prop = None - prop = self._makeOne('_prop') - inst = Test(ValueError) - - def _factory(): - return 'PROP' - inst.defaultFactory = _factory - - def _provoke(inst): - return inst.prop - self.assertRaises(ValueError, _provoke, inst) - - def test___get___w_defaultFactory_w_ICAF_w_check(self): - from zope.interface import directlyProvides - from zope.schema._bootstrapinterfaces \ - import IContextAwareDefaultFactory - _checked = [] - - def _check(inst, value): - _checked.append((inst, value)) - - class Test(DummyInst): - _prop = None - prop = self._makeOne('_prop', _check) - inst = Test(ValueError) - inst.context = object() - _called_with = [] - - def _factory(context): - _called_with.append(context) - return 'PROP' - directlyProvides(_factory, IContextAwareDefaultFactory) - inst.defaultFactory = _factory - self.assertEqual(inst.prop, 'PROP') - self.assertEqual(_checked, [(inst, 'PROP')]) - self.assertEqual(_called_with, [inst.context]) - - -class FieldTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._bootstrapfields import Field - return Field - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_ctor_defaults(self): - from zope.schema._compat import u - field = self._makeOne() - self.assertEqual(field.__name__, u('')) - self.assertEqual(field.__doc__, u('')) - self.assertEqual(field.title, u('')) - self.assertEqual(field.description, u('')) - self.assertEqual(field.required, True) - self.assertEqual(field.readonly, False) - self.assertEqual(field.constraint(object()), True) - self.assertEqual(field.default, None) - self.assertEqual(field.defaultFactory, None) - self.assertEqual(field.missing_value, None) - self.assertEqual(field.context, None) - - def test_ctor_w_title_wo_description(self): - from zope.schema._compat import u - field = self._makeOne(u('TITLE')) - self.assertEqual(field.__name__, u('')) - self.assertEqual(field.__doc__, u('TITLE')) - self.assertEqual(field.title, u('TITLE')) - self.assertEqual(field.description, u('')) - - def test_ctor_wo_title_w_description(self): - from zope.schema._compat import u - field = self._makeOne(description=u('DESC')) - self.assertEqual(field.__name__, u('')) - self.assertEqual(field.__doc__, u('DESC')) - self.assertEqual(field.title, u('')) - self.assertEqual(field.description, u('DESC')) - - def test_ctor_w_both_title_and_description(self): - from zope.schema._compat import u - field = self._makeOne(u('TITLE'), u('DESC'), u('NAME')) - self.assertEqual(field.__name__, u('NAME')) - self.assertEqual(field.__doc__, u('TITLE\n\nDESC')) - self.assertEqual(field.title, u('TITLE')) - self.assertEqual(field.description, u('DESC')) - - def test_ctor_order_madness(self): - klass = self._getTargetClass() - order_before = klass.order - field = self._makeOne() - order_after = klass.order - self.assertEqual(order_after, order_before + 1) - self.assertEqual(field.order, order_after) - - def test_explicit_required_readonly_missingValue(self): - obj = object() - field = self._makeOne(required=False, readonly=True, missing_value=obj) - self.assertEqual(field.required, False) - self.assertEqual(field.readonly, True) - self.assertEqual(field.missing_value, obj) - - def test_explicit_constraint_default(self): - _called_with = [] - obj = object() - - def _constraint(value): - _called_with.append(value) - return value is obj - field = self._makeOne( - required=False, readonly=True, constraint=_constraint, default=obj - ) - self.assertEqual(field.required, False) - self.assertEqual(field.readonly, True) - self.assertEqual(_called_with, [obj]) - self.assertEqual(field.constraint(self), False) - self.assertEqual(_called_with, [obj, self]) - self.assertEqual(field.default, obj) - - def test_explicit_defaultFactory(self): - _called_with = [] - obj = object() - - def _constraint(value): - _called_with.append(value) - return value is obj - - def _factory(): - return obj - field = self._makeOne( - required=False, - readonly=True, - constraint=_constraint, - defaultFactory=_factory, - ) - self.assertEqual(field.required, False) - self.assertEqual(field.readonly, True) - self.assertEqual(field.constraint(self), False) - self.assertEqual(_called_with, [self]) - self.assertEqual(field.default, obj) - self.assertEqual(_called_with, [self, obj]) - self.assertEqual(field.defaultFactory, _factory) - - def test_explicit_defaultFactory_returning_missing_value(self): - def _factory(): - return None - field = self._makeOne(required=True, - defaultFactory=_factory) - self.assertEqual(field.default, None) - - def test_bind(self): - obj = object() - field = self._makeOne() - bound = field.bind(obj) - self.assertEqual(bound.context, obj) - expected = dict(field.__dict__) - found = dict(bound.__dict__) - found.pop('context') - self.assertEqual(found, expected) - self.assertEqual(bound.__class__, field.__class__) - - def test_validate_missing_not_required(self): - missing = object() - - def _fail(value): - return False - field = self._makeOne( - required=False, missing_value=missing, constraint=_fail, - ) - self.assertEqual(field.validate(missing), None) # doesn't raise - - def test_validate_missing_and_required(self): - from zope.schema._bootstrapinterfaces import RequiredMissing - missing = object() - - def _fail(value): - return False - field = self._makeOne( - required=True, missing_value=missing, constraint=_fail, - ) - self.assertRaises(RequiredMissing, field.validate, missing) - - def test_validate_wrong_type(self): - from zope.schema._bootstrapinterfaces import WrongType - - def _fail(value): - return False - field = self._makeOne(required=True, constraint=_fail) - field._type = str - self.assertRaises(WrongType, field.validate, 1) - - def test_validate_constraint_fails(self): - from zope.schema._bootstrapinterfaces import ConstraintNotSatisfied - - def _fail(value): - return False - field = self._makeOne(required=True, constraint=_fail) - field._type = int - self.assertRaises(ConstraintNotSatisfied, field.validate, 1) - - def test_validate_constraint_raises_StopValidation(self): - from zope.schema._bootstrapinterfaces import StopValidation - - def _fail(value): - raise StopValidation - field = self._makeOne(required=True, constraint=_fail) - field._type = int - field.validate(1) # doesn't raise - - def test___eq___different_type(self): - left = self._makeOne() - - class Derived(self._getTargetClass()): - pass - right = Derived() - self.assertEqual(left == right, False) - self.assertEqual(left != right, True) - - def test___eq___same_type_different_attrs(self): - left = self._makeOne(required=True) - right = self._makeOne(required=False) - self.assertEqual(left == right, False) - self.assertEqual(left != right, True) - - def test___eq___same_type_same_attrs(self): - left = self._makeOne() - right = self._makeOne() - self.assertEqual(left == right, True) - self.assertEqual(left != right, False) - - def test_get_miss(self): - field = self._makeOne(__name__='nonesuch') - inst = DummyInst() - self.assertRaises(AttributeError, field.get, inst) - - def test_get_hit(self): - field = self._makeOne(__name__='extant') - inst = DummyInst() - inst.extant = 'EXTANT' - self.assertEqual(field.get(inst), 'EXTANT') - - def test_query_miss_no_default(self): - field = self._makeOne(__name__='nonesuch') - inst = DummyInst() - self.assertEqual(field.query(inst), None) - - def test_query_miss_w_default(self): - field = self._makeOne(__name__='nonesuch') - inst = DummyInst() - self.assertEqual(field.query(inst, 'DEFAULT'), 'DEFAULT') - - def test_query_hit(self): - field = self._makeOne(__name__='extant') - inst = DummyInst() - inst.extant = 'EXTANT' - self.assertEqual(field.query(inst), 'EXTANT') - - def test_set_readonly(self): - field = self._makeOne(__name__='lirame', readonly=True) - inst = DummyInst() - self.assertRaises(TypeError, field.set, inst, 'VALUE') - - def test_set_hit(self): - field = self._makeOne(__name__='extant') - inst = DummyInst() - inst.extant = 'BEFORE' - field.set(inst, 'AFTER') - self.assertEqual(inst.extant, 'AFTER') - - -class ContainerTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._bootstrapfields import Container - return Container - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_validate_not_required(self): - field = self._makeOne(required=False) - field.validate(None) - - def test_validate_required(self): - from zope.schema.interfaces import RequiredMissing - field = self._makeOne() - self.assertRaises(RequiredMissing, field.validate, None) - - def test__validate_not_collection_not_iterable(self): - from zope.schema._bootstrapinterfaces import NotAContainer - cont = self._makeOne() - self.assertRaises(NotAContainer, cont._validate, object()) - - def test__validate_collection_but_not_iterable(self): - cont = self._makeOne() - - class Dummy(object): - def __contains__(self, item): - return False - cont._validate(Dummy()) # doesn't raise - - def test__validate_not_collection_but_iterable(self): - cont = self._makeOne() - - class Dummy(object): - def __iter__(self): - return iter(()) - cont._validate(Dummy()) # doesn't raise - - def test__validate_w_collections(self): - cont = self._makeOne() - cont._validate(()) # doesn't raise - cont._validate([]) # doesn't raise - cont._validate('') # doesn't raise - cont._validate({}) # doesn't raise - - -class IterableTests(ContainerTests): - - def _getTargetClass(self): - from zope.schema._bootstrapfields import Iterable - return Iterable - - def test__validate_collection_but_not_iterable(self): - from zope.schema._bootstrapinterfaces import NotAnIterator - itr = self._makeOne() - - class Dummy(object): - def __contains__(self, item): - return False - self.assertRaises(NotAnIterator, itr._validate, Dummy()) - - -class OrderableTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._bootstrapfields import Orderable - return Orderable - - def _makeOne(self, *args, **kw): - # Orderable is a mixin for a type derived from Field - from zope.schema._bootstrapfields import Field - - class Mixed(self._getTargetClass(), Field): - pass - return Mixed(*args, **kw) - - def test_ctor_defaults(self): - ordb = self._makeOne() - self.assertEqual(ordb.min, None) - self.assertEqual(ordb.max, None) - self.assertEqual(ordb.default, None) - - def test_ctor_default_too_small(self): - # This test exercises _validate, too - from zope.schema._bootstrapinterfaces import TooSmall - self.assertRaises(TooSmall, self._makeOne, min=0, default=-1) - - def test_ctor_default_too_large(self): - # This test exercises _validate, too - from zope.schema._bootstrapinterfaces import TooBig - self.assertRaises(TooBig, self._makeOne, max=10, default=11) - - -class MinMaxLenTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._bootstrapfields import MinMaxLen - return MinMaxLen - - def _makeOne(self, *args, **kw): - # MinMaxLen is a mixin for a type derived from Field - from zope.schema._bootstrapfields import Field - - class Mixed(self._getTargetClass(), Field): - pass - return Mixed(*args, **kw) - - def test_ctor_defaults(self): - mml = self._makeOne() - self.assertEqual(mml.min_length, 0) - self.assertEqual(mml.max_length, None) - - def test_validate_too_short(self): - from zope.schema._bootstrapinterfaces import TooShort - mml = self._makeOne(min_length=1) - self.assertRaises(TooShort, mml._validate, ()) - - def test_validate_too_long(self): - from zope.schema._bootstrapinterfaces import TooLong - mml = self._makeOne(max_length=2) - self.assertRaises(TooLong, mml._validate, (0, 1, 2)) - - -class TextTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._bootstrapfields import Text - return Text - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_ctor_defaults(self): - from zope.schema._compat import text_type - txt = self._makeOne() - self.assertEqual(txt._type, text_type) - - def test_validate_wrong_types(self): - from zope.schema.interfaces import WrongType - from zope.schema._compat import b - field = self._makeOne() - self.assertRaises(WrongType, field.validate, b('')) - self.assertRaises(WrongType, field.validate, 1) - self.assertRaises(WrongType, field.validate, 1.0) - self.assertRaises(WrongType, field.validate, ()) - self.assertRaises(WrongType, field.validate, []) - self.assertRaises(WrongType, field.validate, {}) - self.assertRaises(WrongType, field.validate, set()) - self.assertRaises(WrongType, field.validate, frozenset()) - self.assertRaises(WrongType, field.validate, object()) - - def test_validate_w_invalid_default(self): - from zope.schema._compat import b - from zope.schema.interfaces import ValidationError - self.assertRaises(ValidationError, self._makeOne, default=b('')) - - def test_validate_not_required(self): - from zope.schema._compat import u - field = self._makeOne(required=False) - field.validate(u('')) - field.validate(u('abc')) - field.validate(u('abc\ndef')) - field.validate(None) - - def test_validate_required(self): - from zope.schema.interfaces import RequiredMissing - from zope.schema._compat import u - field = self._makeOne() - field.validate(u('')) - field.validate(u('abc')) - field.validate(u('abc\ndef')) - self.assertRaises(RequiredMissing, field.validate, None) - - def test_fromUnicode_miss(self): - from zope.schema._bootstrapinterfaces import WrongType - from zope.schema._compat import b - deadbeef = b('DEADBEEF') - txt = self._makeOne() - self.assertRaises(WrongType, txt.fromUnicode, deadbeef) - - def test_fromUnicode_hit(self): - from zope.schema._compat import u - deadbeef = u('DEADBEEF') - txt = self._makeOne() - self.assertEqual(txt.fromUnicode(deadbeef), deadbeef) - - -class TextLineTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import TextLine - return TextLine - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_ITextLine(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import ITextLine - verifyClass(ITextLine, self._getTargetClass()) - - def test_instance_conforms_to_ITextLine(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import ITextLine - verifyObject(ITextLine, self._makeOne()) - - def test_validate_wrong_types(self): - from zope.schema.interfaces import WrongType - from zope.schema._compat import b - field = self._makeOne() - self.assertRaises(WrongType, field.validate, b('')) - self.assertRaises(WrongType, field.validate, 1) - self.assertRaises(WrongType, field.validate, 1.0) - self.assertRaises(WrongType, field.validate, ()) - self.assertRaises(WrongType, field.validate, []) - self.assertRaises(WrongType, field.validate, {}) - self.assertRaises(WrongType, field.validate, set()) - self.assertRaises(WrongType, field.validate, frozenset()) - self.assertRaises(WrongType, field.validate, object()) - - def test_validate_not_required(self): - from zope.schema._compat import u - field = self._makeOne(required=False) - field.validate(u('')) - field.validate(u('abc')) - field.validate(None) - - def test_validate_required(self): - from zope.schema.interfaces import RequiredMissing - from zope.schema._compat import u - field = self._makeOne() - field.validate(u('')) - field.validate(u('abc')) - self.assertRaises(RequiredMissing, field.validate, None) - - def test_constraint(self): - from zope.schema._compat import u - field = self._makeOne() - self.assertEqual(field.constraint(u('')), True) - self.assertEqual(field.constraint(u('abc')), True) - self.assertEqual(field.constraint(u('abc\ndef')), False) - - -class PasswordTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._bootstrapfields import Password - return Password - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_set_unchanged(self): - klass = self._getTargetClass() - pw = self._makeOne() - inst = DummyInst() - before = dict(inst.__dict__) - pw.set(inst, klass.UNCHANGED_PASSWORD) # doesn't raise, doesn't write - after = dict(inst.__dict__) - self.assertEqual(after, before) - - def test_set_normal(self): - pw = self._makeOne(__name__='password') - inst = DummyInst() - pw.set(inst, 'PASSWORD') - self.assertEqual(inst.password, 'PASSWORD') - - def test_validate_not_required(self): - from zope.schema._compat import u - field = self._makeOne(required=False) - field.validate(u('')) - field.validate(u('abc')) - field.validate(None) - - def test_validate_required(self): - from zope.schema.interfaces import RequiredMissing - from zope.schema._compat import u - field = self._makeOne() - field.validate(u('')) - field.validate(u('abc')) - self.assertRaises(RequiredMissing, field.validate, None) - - def test_validate_unchanged_not_already_set(self): - from zope.schema._bootstrapinterfaces import WrongType - klass = self._getTargetClass() - inst = DummyInst() - pw = self._makeOne(__name__='password').bind(inst) - self.assertRaises(WrongType, - pw.validate, klass.UNCHANGED_PASSWORD) - - def test_validate_unchanged_already_set(self): - klass = self._getTargetClass() - inst = DummyInst() - inst.password = 'foobar' - pw = self._makeOne(__name__='password').bind(inst) - pw.validate(klass.UNCHANGED_PASSWORD) # doesn't raise - - def test_constraint(self): - from zope.schema._compat import u - field = self._makeOne() - self.assertEqual(field.constraint(u('')), True) - self.assertEqual(field.constraint(u('abc')), True) - self.assertEqual(field.constraint(u('abc\ndef')), False) - - -class BoolTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._bootstrapfields import Bool - return Bool - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_ctor_defaults(self): - txt = self._makeOne() - self.assertEqual(txt._type, bool) - - def test__validate_w_int(self): - boo = self._makeOne() - boo._validate(0) # doesn't raise - boo._validate(1) # doesn't raise - - def test_set_w_int(self): - boo = self._makeOne(__name__='boo') - inst = DummyInst() - boo.set(inst, 0) - self.assertEqual(inst.boo, False) - boo.set(inst, 1) - self.assertEqual(inst.boo, True) - - def test_fromUnicode_miss(self): - from zope.schema._compat import u - txt = self._makeOne() - self.assertEqual(txt.fromUnicode(u('')), False) - self.assertEqual(txt.fromUnicode(u('0')), False) - self.assertEqual(txt.fromUnicode(u('1')), False) - self.assertEqual(txt.fromUnicode(u('False')), False) - self.assertEqual(txt.fromUnicode(u('false')), False) - - def test_fromUnicode_hit(self): - from zope.schema._compat import u - txt = self._makeOne() - self.assertEqual(txt.fromUnicode(u('True')), True) - self.assertEqual(txt.fromUnicode(u('true')), True) - - -class IntTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._bootstrapfields import Int - return Int - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_ctor_defaults(self): - from zope.schema._compat import integer_types - txt = self._makeOne() - self.assertEqual(txt._type, integer_types) - - def test_validate_not_required(self): - field = self._makeOne(required=False) - field.validate(None) - field.validate(10) - field.validate(0) - field.validate(-1) - - def test_validate_required(self): - from zope.schema.interfaces import RequiredMissing - field = self._makeOne() - field.validate(10) - field.validate(0) - field.validate(-1) - self.assertRaises(RequiredMissing, field.validate, None) - - def test_validate_min(self): - from zope.schema.interfaces import TooSmall - field = self._makeOne(min=10) - field.validate(10) - field.validate(20) - self.assertRaises(TooSmall, field.validate, 9) - self.assertRaises(TooSmall, field.validate, -10) - - def test_validate_max(self): - from zope.schema.interfaces import TooBig - field = self._makeOne(max=10) - field.validate(5) - field.validate(9) - field.validate(10) - self.assertRaises(TooBig, field.validate, 11) - self.assertRaises(TooBig, field.validate, 20) - - def test_validate_min_and_max(self): - from zope.schema.interfaces import TooBig - from zope.schema.interfaces import TooSmall - field = self._makeOne(min=0, max=10) - field.validate(0) - field.validate(5) - field.validate(10) - self.assertRaises(TooSmall, field.validate, -10) - self.assertRaises(TooSmall, field.validate, -1) - self.assertRaises(TooBig, field.validate, 11) - self.assertRaises(TooBig, field.validate, 20) - - def test_fromUnicode_miss(self): - from zope.schema._compat import u - txt = self._makeOne() - self.assertRaises(ValueError, txt.fromUnicode, u('')) - self.assertRaises(ValueError, txt.fromUnicode, u('False')) - self.assertRaises(ValueError, txt.fromUnicode, u('True')) - - def test_fromUnicode_hit(self): - from zope.schema._compat import u - txt = self._makeOne() - self.assertEqual(txt.fromUnicode(u('0')), 0) - self.assertEqual(txt.fromUnicode(u('1')), 1) - self.assertEqual(txt.fromUnicode(u('-1')), -1) - - -class DummyInst(object): - missing_value = object() - - def __init__(self, exc=None): - self._exc = exc - - def validate(self, value): - if self._exc is not None: - raise self._exc() - - -def test_suite(): - return unittest.TestSuite(( - unittest.makeSuite(ValidatedPropertyTests), - unittest.makeSuite(DefaultPropertyTests), - unittest.makeSuite(FieldTests), - unittest.makeSuite(ContainerTests), - unittest.makeSuite(IterableTests), - unittest.makeSuite(OrderableTests), - unittest.makeSuite(MinMaxLenTests), - unittest.makeSuite(TextTests), - unittest.makeSuite(TextLineTests), - unittest.makeSuite(PasswordTests), - unittest.makeSuite(BoolTests), - unittest.makeSuite(IntTests), - )) diff --git a/zope/schema/tests/test__bootstrapinterfaces.py b/zope/schema/tests/test__bootstrapinterfaces.py deleted file mode 100644 index 7df3c4fc..00000000 --- a/zope/schema/tests/test__bootstrapinterfaces.py +++ /dev/null @@ -1,68 +0,0 @@ -############################################################################## -# -# Copyright (c) 2012 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -import unittest - - -def _skip_under_py3(testcase): - from zope.schema._compat import PY3 - if not PY3: - return testcase - - -class ValidationErrorTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._bootstrapinterfaces import ValidationError - return ValidationError - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_doc(self): - class Derived(self._getTargetClass()): - """DERIVED""" - inst = Derived() - self.assertEqual(inst.doc(), 'DERIVED') - - @_skip_under_py3 - def test___cmp___no_args(self): - # Py3k?? - ve = self._makeOne() - self.assertEqual(cmp(ve, object()), -1) - - @_skip_under_py3 - def test___cmp___hit(self): - # Py3k?? - left = self._makeOne('abc') - right = self._makeOne('def') - self.assertEqual(cmp(left, right), -1) - self.assertEqual(cmp(left, left), 0) - self.assertEqual(cmp(right, left), 1) - - def test___eq___no_args(self): - ve = self._makeOne() - self.assertEqual(ve == object(), False) - - def test___eq___w_args(self): - left = self._makeOne('abc') - right = self._makeOne('def') - self.assertEqual(left == right, False) - self.assertEqual(left == left, True) - self.assertEqual(right == right, True) - - -def test_suite(): - return unittest.TestSuite(( - unittest.makeSuite(ValidationErrorTests), - )) diff --git a/zope/schema/tests/test__field.py b/zope/schema/tests/test__field.py deleted file mode 100644 index 5a0ccdd3..00000000 --- a/zope/schema/tests/test__field.py +++ /dev/null @@ -1,2122 +0,0 @@ -############################################################################## -# -# Copyright (c) 2012 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -import unittest - - -class BytesTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import Bytes - return Bytes - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_IBytes(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import IBytes - verifyClass(IBytes, self._getTargetClass()) - - def test_instance_conforms_to_IBytes(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IBytes - verifyObject(IBytes, self._makeOne()) - - def test_validate_wrong_types(self): - from zope.schema.interfaces import WrongType - from zope.schema._compat import u - field = self._makeOne() - self.assertRaises(WrongType, field.validate, u('')) - self.assertRaises(WrongType, field.validate, 1) - self.assertRaises(WrongType, field.validate, 1.0) - self.assertRaises(WrongType, field.validate, ()) - self.assertRaises(WrongType, field.validate, []) - self.assertRaises(WrongType, field.validate, {}) - self.assertRaises(WrongType, field.validate, set()) - self.assertRaises(WrongType, field.validate, frozenset()) - self.assertRaises(WrongType, field.validate, object()) - - def test_validate_w_invalid_default(self): - from zope.schema._compat import u - from zope.schema.interfaces import ValidationError - self.assertRaises(ValidationError, self._makeOne, default=u('')) - - def test_validate_not_required(self): - from zope.schema._compat import b - field = self._makeOne(required=False) - field.validate(b('')) - field.validate(b('abc')) - field.validate(b('abc\ndef')) - field.validate(None) - - def test_validate_required(self): - from zope.schema.interfaces import RequiredMissing - from zope.schema._compat import b - field = self._makeOne() - field.validate(b('')) - field.validate(b('abc')) - field.validate(b('abc\ndef')) - self.assertRaises(RequiredMissing, field.validate, None) - - def test_fromUnicode_miss(self): - from zope.schema._compat import u - byt = self._makeOne() - self.assertRaises(UnicodeEncodeError, byt.fromUnicode, u(chr(129))) - - def test_fromUnicode_hit(self): - from zope.schema._compat import u - from zope.schema._compat import b - byt = self._makeOne() - self.assertEqual(byt.fromUnicode(u('')), b('')) - self.assertEqual(byt.fromUnicode(u('DEADBEEF')), b('DEADBEEF')) - - -class ASCIITests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import ASCII - return ASCII - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_IASCII(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import IASCII - verifyClass(IASCII, self._getTargetClass()) - - def test_instance_conforms_to_IASCII(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IASCII - verifyObject(IASCII, self._makeOne()) - - def test_validate_wrong_types(self): - from zope.schema.interfaces import WrongType - from zope.schema._compat import non_native_string - field = self._makeOne() - self.assertRaises(WrongType, field.validate, non_native_string('')) - self.assertRaises(WrongType, field.validate, 1) - self.assertRaises(WrongType, field.validate, 1.0) - self.assertRaises(WrongType, field.validate, ()) - self.assertRaises(WrongType, field.validate, []) - self.assertRaises(WrongType, field.validate, {}) - self.assertRaises(WrongType, field.validate, set()) - self.assertRaises(WrongType, field.validate, frozenset()) - self.assertRaises(WrongType, field.validate, object()) - - def test__validate_empty(self): - asc = self._makeOne() - asc._validate('') # no error - - def test__validate_non_empty_miss(self): - from zope.schema.interfaces import InvalidValue - asc = self._makeOne() - self.assertRaises(InvalidValue, asc._validate, chr(129)) - - def test__validate_non_empty_hit(self): - asc = self._makeOne() - for i in range(128): - asc._validate(chr(i)) # doesn't raise - - -class BytesLineTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import BytesLine - return BytesLine - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_IBytesLine(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import IBytesLine - verifyClass(IBytesLine, self._getTargetClass()) - - def test_instance_conforms_to_IBytesLine(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IBytesLine - verifyObject(IBytesLine, self._makeOne()) - - def test_validate_wrong_types(self): - from zope.schema.interfaces import WrongType - from zope.schema._compat import u - field = self._makeOne() - self.assertRaises(WrongType, field.validate, u('')) - self.assertRaises(WrongType, field.validate, 1) - self.assertRaises(WrongType, field.validate, 1.0) - self.assertRaises(WrongType, field.validate, ()) - self.assertRaises(WrongType, field.validate, []) - self.assertRaises(WrongType, field.validate, {}) - self.assertRaises(WrongType, field.validate, set()) - self.assertRaises(WrongType, field.validate, frozenset()) - self.assertRaises(WrongType, field.validate, object()) - - def test_validate_not_required(self): - from zope.schema._compat import b - field = self._makeOne(required=False) - field.validate(None) - field.validate(b('')) - field.validate(b('abc')) - field.validate(b('\xab\xde')) - - def test_validate_required(self): - from zope.schema.interfaces import RequiredMissing - from zope.schema._compat import b - field = self._makeOne() - field.validate(b('')) - field.validate(b('abc')) - field.validate(b('\xab\xde')) - self.assertRaises(RequiredMissing, field.validate, None) - - def test_constraint(self): - from zope.schema._compat import b - field = self._makeOne() - self.assertEqual(field.constraint(b('')), True) - self.assertEqual(field.constraint(b('abc')), True) - self.assertEqual(field.constraint(b('abc')), True) - self.assertEqual(field.constraint(b('\xab\xde')), True) - self.assertEqual(field.constraint(b('abc\ndef')), False) - - -class ASCIILineTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import ASCIILine - return ASCIILine - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_IASCIILine(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import IASCIILine - verifyClass(IASCIILine, self._getTargetClass()) - - def test_instance_conforms_to_IASCIILine(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IASCIILine - verifyObject(IASCIILine, self._makeOne()) - - def test_validate_wrong_types(self): - from zope.schema.interfaces import WrongType - from zope.schema._compat import non_native_string - field = self._makeOne() - self.assertRaises(WrongType, field.validate, non_native_string('')) - self.assertRaises(WrongType, field.validate, 1) - self.assertRaises(WrongType, field.validate, 1.0) - self.assertRaises(WrongType, field.validate, ()) - self.assertRaises(WrongType, field.validate, []) - self.assertRaises(WrongType, field.validate, {}) - self.assertRaises(WrongType, field.validate, set()) - self.assertRaises(WrongType, field.validate, frozenset()) - self.assertRaises(WrongType, field.validate, object()) - - def test_validate_not_required(self): - from zope.schema.interfaces import InvalidValue - field = self._makeOne(required=False) - field.validate(None) - field.validate('') - field.validate('abc') - self.assertRaises(InvalidValue, field.validate, '\xab\xde') - - def test_validate_required(self): - from zope.schema.interfaces import InvalidValue - from zope.schema.interfaces import RequiredMissing - field = self._makeOne() - field.validate('') - field.validate('abc') - self.assertRaises(InvalidValue, field.validate, '\xab\xde') - self.assertRaises(RequiredMissing, field.validate, None) - - def test_constraint(self): - field = self._makeOne() - self.assertEqual(field.constraint(''), True) - self.assertEqual(field.constraint('abc'), True) - self.assertEqual(field.constraint('abc'), True) - # Non-ASCII byltes get checked in '_validate'. - self.assertEqual(field.constraint('\xab\xde'), True) - self.assertEqual(field.constraint('abc\ndef'), False) - - -class FloatTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import Float - return Float - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_IFloat(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import IFloat - verifyClass(IFloat, self._getTargetClass()) - - def test_instance_conforms_to_IFloat(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IFloat - verifyObject(IFloat, self._makeOne()) - - def test_validate_not_required(self): - field = self._makeOne(required=False) - field.validate(None) - field.validate(10.0) - field.validate(0.93) - field.validate(1000.0003) - - def test_validate_required(self): - from zope.schema.interfaces import RequiredMissing - field = self._makeOne() - field.validate(10.0) - field.validate(0.93) - field.validate(1000.0003) - self.assertRaises(RequiredMissing, field.validate, None) - - def test_validate_min(self): - from zope.schema.interfaces import TooSmall - field = self._makeOne(min=10.5) - field.validate(10.6) - field.validate(20.2) - self.assertRaises(TooSmall, field.validate, -9.0) - self.assertRaises(TooSmall, field.validate, 10.4) - - def test_validate_max(self): - from zope.schema.interfaces import TooBig - field = self._makeOne(max=10.5) - field.validate(5.3) - field.validate(-9.1) - self.assertRaises(TooBig, field.validate, 10.51) - self.assertRaises(TooBig, field.validate, 20.7) - - def test_validate_min_and_max(self): - from zope.schema.interfaces import TooBig - from zope.schema.interfaces import TooSmall - field = self._makeOne(min=-0.6, max=10.1) - field.validate(0.0) - field.validate(-0.03) - field.validate(10.0001) - self.assertRaises(TooSmall, field.validate, -10.0) - self.assertRaises(TooSmall, field.validate, -1.6) - self.assertRaises(TooBig, field.validate, 11.45) - self.assertRaises(TooBig, field.validate, 20.02) - - def test_fromUnicode_miss(self): - from zope.schema._compat import u - flt = self._makeOne() - self.assertRaises(ValueError, flt.fromUnicode, u('')) - self.assertRaises(ValueError, flt.fromUnicode, u('abc')) - self.assertRaises(ValueError, flt.fromUnicode, u('14.G')) - - def test_fromUnicode_hit(self): - from zope.schema._compat import u - flt = self._makeOne() - self.assertEqual(flt.fromUnicode(u('0')), 0.0) - self.assertEqual(flt.fromUnicode(u('1.23')), 1.23) - self.assertEqual(flt.fromUnicode(u('1.23e6')), 1230000.0) - - -class DecimalTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import Decimal - return Decimal - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_IDecimal(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import IDecimal - verifyClass(IDecimal, self._getTargetClass()) - - def test_instance_conforms_to_IDecimal(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IDecimal - verifyObject(IDecimal, self._makeOne()) - - def test_validate_not_required(self): - import decimal - field = self._makeOne(required=False) - field.validate(decimal.Decimal("10.0")) - field.validate(decimal.Decimal("0.93")) - field.validate(decimal.Decimal("1000.0003")) - field.validate(None) - - def test_validate_required(self): - import decimal - from zope.schema.interfaces import RequiredMissing - field = self._makeOne() - field.validate(decimal.Decimal("10.0")) - field.validate(decimal.Decimal("0.93")) - field.validate(decimal.Decimal("1000.0003")) - self.assertRaises(RequiredMissing, field.validate, None) - - def test_validate_min(self): - import decimal - from zope.schema.interfaces import TooSmall - field = self._makeOne(min=decimal.Decimal("10.5")) - field.validate(decimal.Decimal("10.6")) - field.validate(decimal.Decimal("20.2")) - self.assertRaises(TooSmall, field.validate, decimal.Decimal("-9.0")) - self.assertRaises(TooSmall, field.validate, decimal.Decimal("10.4")) - - def test_validate_max(self): - import decimal - from zope.schema.interfaces import TooBig - field = self._makeOne(max=decimal.Decimal("10.5")) - field.validate(decimal.Decimal("5.3")) - field.validate(decimal.Decimal("-9.1")) - self.assertRaises(TooBig, field.validate, decimal.Decimal("10.51")) - self.assertRaises(TooBig, field.validate, decimal.Decimal("20.7")) - - def test_validate_min_and_max(self): - import decimal - from zope.schema.interfaces import TooBig - from zope.schema.interfaces import TooSmall - field = self._makeOne(min=decimal.Decimal("-0.6"), - max=decimal.Decimal("10.1")) - field.validate(decimal.Decimal("0.0")) - field.validate(decimal.Decimal("-0.03")) - field.validate(decimal.Decimal("10.0001")) - self.assertRaises(TooSmall, field.validate, decimal.Decimal("-10.0")) - self.assertRaises(TooSmall, field.validate, decimal.Decimal("-1.6")) - self.assertRaises(TooBig, field.validate, decimal.Decimal("11.45")) - self.assertRaises(TooBig, field.validate, decimal.Decimal("20.02")) - - def test_fromUnicode_miss(self): - from zope.schema._compat import u - flt = self._makeOne() - self.assertRaises(ValueError, flt.fromUnicode, u('')) - self.assertRaises(ValueError, flt.fromUnicode, u('abc')) - self.assertRaises(ValueError, flt.fromUnicode, u('1.4G')) - - def test_fromUnicode_hit(self): - from decimal import Decimal - from zope.schema._compat import u - flt = self._makeOne() - self.assertEqual(flt.fromUnicode(u('0')), Decimal('0.0')) - self.assertEqual(flt.fromUnicode(u('1.23')), Decimal('1.23')) - self.assertEqual(flt.fromUnicode(u('12345.6')), Decimal('12345.6')) - - -class DatetimeTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import Datetime - return Datetime - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_IDatetime(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import IDatetime - verifyClass(IDatetime, self._getTargetClass()) - - def test_instance_conforms_to_IDatetime(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IDatetime - verifyObject(IDatetime, self._makeOne()) - - def test_validate_wrong_types(self): - from datetime import date - from zope.schema.interfaces import WrongType - from zope.schema._compat import u - from zope.schema._compat import b - field = self._makeOne() - self.assertRaises(WrongType, field.validate, u('')) - self.assertRaises(WrongType, field.validate, b('')) - self.assertRaises(WrongType, field.validate, 1) - self.assertRaises(WrongType, field.validate, 1.0) - self.assertRaises(WrongType, field.validate, ()) - self.assertRaises(WrongType, field.validate, []) - self.assertRaises(WrongType, field.validate, {}) - self.assertRaises(WrongType, field.validate, set()) - self.assertRaises(WrongType, field.validate, frozenset()) - self.assertRaises(WrongType, field.validate, object()) - self.assertRaises(WrongType, field.validate, date.today()) - - def test_validate_not_required(self): - from datetime import datetime - field = self._makeOne(required=False) - field.validate(None) # doesn't raise - field.validate(datetime.now()) # doesn't raise - - def test_validate_required(self): - from zope.schema.interfaces import RequiredMissing - field = self._makeOne(required=True) - self.assertRaises(RequiredMissing, field.validate, None) - - def test_validate_w_min(self): - from datetime import datetime - from zope.schema.interfaces import TooSmall - d1 = datetime(2000, 10, 1) - d2 = datetime(2000, 10, 2) - field = self._makeOne(min=d1) - field.validate(d1) # doesn't raise - field.validate(d2) # doesn't raise - self.assertRaises(TooSmall, field.validate, datetime(2000, 9, 30)) - - def test_validate_w_max(self): - from datetime import datetime - from zope.schema.interfaces import TooBig - d1 = datetime(2000, 10, 1) - d2 = datetime(2000, 10, 2) - d3 = datetime(2000, 10, 3) - field = self._makeOne(max=d2) - field.validate(d1) # doesn't raise - field.validate(d2) # doesn't raise - self.assertRaises(TooBig, field.validate, d3) - - def test_validate_w_min_and_max(self): - from datetime import datetime - from zope.schema.interfaces import TooBig - from zope.schema.interfaces import TooSmall - d1 = datetime(2000, 10, 1) - d2 = datetime(2000, 10, 2) - d3 = datetime(2000, 10, 3) - d4 = datetime(2000, 10, 4) - d5 = datetime(2000, 10, 5) - field = self._makeOne(min=d2, max=d4) - field.validate(d2) # doesn't raise - field.validate(d3) # doesn't raise - field.validate(d4) # doesn't raise - self.assertRaises(TooSmall, field.validate, d1) - self.assertRaises(TooBig, field.validate, d5) - - -class DateTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import Date - return Date - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_IDate(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import IDate - verifyClass(IDate, self._getTargetClass()) - - def test_instance_conforms_to_IDate(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IDate - verifyObject(IDate, self._makeOne()) - - def test_validate_wrong_types(self): - from datetime import datetime - from zope.schema.interfaces import WrongType - from zope.schema._compat import u - from zope.schema._compat import b - field = self._makeOne() - self.assertRaises(WrongType, field.validate, u('')) - self.assertRaises(WrongType, field.validate, b('')) - self.assertRaises(WrongType, field.validate, 1) - self.assertRaises(WrongType, field.validate, 1.0) - self.assertRaises(WrongType, field.validate, ()) - self.assertRaises(WrongType, field.validate, []) - self.assertRaises(WrongType, field.validate, {}) - self.assertRaises(WrongType, field.validate, set()) - self.assertRaises(WrongType, field.validate, frozenset()) - self.assertRaises(WrongType, field.validate, object()) - self.assertRaises(WrongType, field.validate, datetime.now()) - - def test_validate_not_required(self): - from datetime import date - field = self._makeOne(required=False) - field.validate(None) - field.validate(date.today()) - - def test_validate_required(self): - from datetime import datetime - from zope.schema.interfaces import RequiredMissing - field = self._makeOne() - field.validate(datetime.now().date()) - self.assertRaises(RequiredMissing, field.validate, None) - - def test_validate_w_min(self): - from datetime import date - from datetime import datetime - from zope.schema.interfaces import TooSmall - d1 = date(2000, 10, 1) - d2 = date(2000, 10, 2) - field = self._makeOne(min=d1) - field.validate(d1) - field.validate(d2) - field.validate(datetime.now().date()) - self.assertRaises(TooSmall, field.validate, date(2000, 9, 30)) - - def test_validate_w_max(self): - from datetime import date - from zope.schema.interfaces import TooBig - d1 = date(2000, 10, 1) - d2 = date(2000, 10, 2) - d3 = date(2000, 10, 3) - field = self._makeOne(max=d2) - field.validate(d1) - field.validate(d2) - self.assertRaises(TooBig, field.validate, d3) - - def test_validate_w_min_and_max(self): - from datetime import date - from zope.schema.interfaces import TooBig - from zope.schema.interfaces import TooSmall - d1 = date(2000, 10, 1) - d2 = date(2000, 10, 2) - d3 = date(2000, 10, 3) - d4 = date(2000, 10, 4) - d5 = date(2000, 10, 5) - field = self._makeOne(min=d2, max=d4) - field.validate(d2) - field.validate(d3) - field.validate(d4) - self.assertRaises(TooSmall, field.validate, d1) - self.assertRaises(TooBig, field.validate, d5) - - -class TimedeltaTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import Timedelta - return Timedelta - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_ITimedelta(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import ITimedelta - verifyClass(ITimedelta, self._getTargetClass()) - - def test_instance_conforms_to_ITimedelta(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import ITimedelta - verifyObject(ITimedelta, self._makeOne()) - - def test_validate_not_required(self): - from datetime import timedelta - field = self._makeOne(required=False) - field.validate(None) - field.validate(timedelta(minutes=15)) - - def test_validate_required(self): - from datetime import timedelta - from zope.schema.interfaces import RequiredMissing - field = self._makeOne() - field.validate(timedelta(minutes=15)) - self.assertRaises(RequiredMissing, field.validate, None) - - def test_validate_min(self): - from datetime import timedelta - from zope.schema.interfaces import TooSmall - t1 = timedelta(hours=2) - t2 = timedelta(hours=3) - field = self._makeOne(min=t1) - field.validate(t1) - field.validate(t2) - self.assertRaises(TooSmall, field.validate, timedelta(hours=1)) - - def test_validate_max(self): - from datetime import timedelta - from zope.schema.interfaces import TooBig - t1 = timedelta(minutes=1) - t2 = timedelta(minutes=2) - t3 = timedelta(minutes=3) - field = self._makeOne(max=t2) - field.validate(t1) - field.validate(t2) - self.assertRaises(TooBig, field.validate, t3) - - def test_validate_min_and_max(self): - from datetime import timedelta - from zope.schema.interfaces import TooBig - from zope.schema.interfaces import TooSmall - t1 = timedelta(days=1) - t2 = timedelta(days=2) - t3 = timedelta(days=3) - t4 = timedelta(days=4) - t5 = timedelta(days=5) - field = self._makeOne(min=t2, max=t4) - field.validate(t2) - field.validate(t3) - field.validate(t4) - self.assertRaises(TooSmall, field.validate, t1) - self.assertRaises(TooBig, field.validate, t5) - - -class TimeTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import Time - return Time - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_ITime(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import ITime - verifyClass(ITime, self._getTargetClass()) - - def test_instance_conforms_to_ITime(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import ITime - verifyObject(ITime, self._makeOne()) - - def test_validate_not_required(self): - from datetime import time - field = self._makeOne(required=False) - field.validate(None) - field.validate(time(12, 15, 37)) - - def test_validate_required(self): - from datetime import time - from zope.schema.interfaces import RequiredMissing - field = self._makeOne() - field.validate(time(12, 15, 37)) - self.assertRaises(RequiredMissing, field.validate, None) - - def test_validate_min(self): - from datetime import time - from zope.schema.interfaces import TooSmall - t1 = time(12, 15, 37) - t2 = time(12, 25, 18) - t3 = time(12, 42, 43) - field = self._makeOne(min=t2) - field.validate(t2) - field.validate(t3) - self.assertRaises(TooSmall, field.validate, t1) - - def test_validate_max(self): - from datetime import time - from zope.schema.interfaces import TooBig - t1 = time(12, 15, 37) - t2 = time(12, 25, 18) - t3 = time(12, 42, 43) - field = self._makeOne(max=t2) - field.validate(t1) - field.validate(t2) - self.assertRaises(TooBig, field.validate, t3) - - def test_validate_min_and_max(self): - from datetime import time - from zope.schema.interfaces import TooBig - from zope.schema.interfaces import TooSmall - t1 = time(12, 15, 37) - t2 = time(12, 25, 18) - t3 = time(12, 42, 43) - t4 = time(13, 7, 12) - t5 = time(14, 22, 9) - field = self._makeOne(min=t2, max=t4) - field.validate(t2) - field.validate(t3) - field.validate(t4) - self.assertRaises(TooSmall, field.validate, t1) - self.assertRaises(TooBig, field.validate, t5) - - -class ChoiceTests(unittest.TestCase): - - def setUp(self): - from zope.schema.vocabulary import _clear - _clear() - - def tearDown(self): - from zope.schema.vocabulary import _clear - _clear() - - def _getTargetClass(self): - from zope.schema._field import Choice - return Choice - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_IChoice(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import IChoice - verifyClass(IChoice, self._getTargetClass()) - - def test_instance_conforms_to_IChoice(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IChoice - verifyObject(IChoice, self._makeOne(values=[1, 2, 3])) - - def test_ctor_wo_values_vocabulary_or_source(self): - self.assertRaises(ValueError, self._makeOne) - - def test_ctor_invalid_vocabulary(self): - self.assertRaises(ValueError, self._makeOne, vocabulary=object()) - - def test_ctor_invalid_source(self): - self.assertRaises(ValueError, self._makeOne, source=object()) - - def test_ctor_both_vocabulary_and_source(self): - self.assertRaises( - ValueError, - self._makeOne, vocabulary='voc.name', source=object() - ) - - def test_ctor_both_vocabulary_and_values(self): - self.assertRaises(ValueError, - self._makeOne, vocabulary='voc.name', values=[1, 2]) - - def test_ctor_w_values(self): - from zope.schema.vocabulary import SimpleVocabulary - choose = self._makeOne(values=[1, 2]) - self.assertTrue(isinstance(choose.vocabulary, SimpleVocabulary)) - self.assertEqual(sorted(choose.vocabulary.by_value.keys()), [1, 2]) - self.assertEqual(sorted(choose.source.by_value.keys()), [1, 2]) - - def test_ctor_w_named_vocabulary(self): - choose = self._makeOne(vocabulary="vocab") - self.assertEqual(choose.vocabularyName, 'vocab') - - def test_ctor_w_preconstructed_vocabulary(self): - v = _makeSampleVocabulary() - choose = self._makeOne(vocabulary=v) - self.assertTrue(choose.vocabulary is v) - self.assertTrue(choose.vocabularyName is None) - - def test_bind_w_preconstructed_vocabulary(self): - from zope.schema.interfaces import ValidationError - from zope.schema.vocabulary import setVocabularyRegistry - v = _makeSampleVocabulary() - setVocabularyRegistry(_makeDummyRegistry(v)) - choose = self._makeOne(vocabulary='vocab') - bound = choose.bind(None) - self.assertEqual(bound.vocabulary, v) - self.assertEqual(bound.vocabularyName, 'vocab') - bound.default = 1 - self.assertEqual(bound.default, 1) - - def _provoke(bound): - bound.default = 42 - - self.assertRaises(ValidationError, _provoke, bound) - - def test_bind_w_voc_not_ICSB(self): - from zope.interface import implementer - from zope.schema.interfaces import ISource - from zope.schema.interfaces import IBaseVocabulary - - @implementer(IBaseVocabulary) - @implementer(ISource) - class Vocab(object): - def __init__(self): - pass - - source = self._makeOne(vocabulary=Vocab()) - instance = DummyInstance() - target = source.bind(instance) - self.assertTrue(target.vocabulary is source.vocabulary) - - def test_bind_w_voc_is_ICSB(self): - from zope.interface import implementer - from zope.schema.interfaces import IContextSourceBinder - from zope.schema.interfaces import ISource - - @implementer(IContextSourceBinder) - @implementer(ISource) - class Vocab(object): - def __init__(self, context): - self.context = context - - def __call__(self, context): - return self.__class__(context) - - # Chicken-egg - source = self._makeOne(vocabulary='temp') - source.vocabulary = Vocab(source) - source.vocabularyName = None - instance = DummyInstance() - target = source.bind(instance) - self.assertEqual(target.vocabulary.context, instance) - - def test_bind_w_voc_is_ICSB_but_not_ISource(self): - from zope.interface import implementer - from zope.schema.interfaces import IContextSourceBinder - - @implementer(IContextSourceBinder) - class Vocab(object): - def __init__(self, context): - self.context = context - - def __call__(self, context): - return self.__class__(context) - - # Chicken-egg - source = self._makeOne(vocabulary='temp') - source.vocabulary = Vocab(source) - source.vocabularyName = None - instance = DummyInstance() - self.assertRaises(ValueError, source.bind, instance) - - def test_fromUnicode_miss(self): - from zope.schema.interfaces import ConstraintNotSatisfied - from zope.schema._compat import u - flt = self._makeOne(values=(u('foo'), u('bar'), u('baz'))) - self.assertRaises(ConstraintNotSatisfied, flt.fromUnicode, u('')) - self.assertRaises(ConstraintNotSatisfied, flt.fromUnicode, u('abc')) - self.assertRaises(ConstraintNotSatisfied, flt.fromUnicode, u('1.4G')) - - def test_fromUnicode_hit(self): - from zope.schema._compat import u - flt = self._makeOne(values=(u('foo'), u('bar'), u('baz'))) - self.assertEqual(flt.fromUnicode(u('foo')), u('foo')) - self.assertEqual(flt.fromUnicode(u('bar')), u('bar')) - self.assertEqual(flt.fromUnicode(u('baz')), u('baz')) - - def test__validate_int(self): - from zope.schema.interfaces import ConstraintNotSatisfied - choice = self._makeOne(values=[1, 3]) - choice._validate(1) # doesn't raise - choice._validate(3) # doesn't raise - self.assertRaises(ConstraintNotSatisfied, choice._validate, 4) - - def test__validate_string(self): - from zope.schema._compat import u - from zope.schema.interfaces import ConstraintNotSatisfied - choice = self._makeOne(values=['a', 'c']) - choice._validate('a') # doesn't raise - choice._validate('c') # doesn't raise - choice._validate(u('c')) # doesn't raise - self.assertRaises(ConstraintNotSatisfied, choice._validate, 'd') - - def test__validate_tuple(self): - from zope.schema.interfaces import ConstraintNotSatisfied - choice = self._makeOne(values=[(1, 2), (5, 6)]) - choice._validate((1, 2)) # doesn't raise - choice._validate((5, 6)) # doesn't raise - self.assertRaises(ConstraintNotSatisfied, choice._validate, [5, 6]) - self.assertRaises(ConstraintNotSatisfied, choice._validate, ()) - - def test__validate_mixed(self): - from zope.schema.interfaces import ConstraintNotSatisfied - choice = self._makeOne(values=[1, 'b', (0.2,)]) - choice._validate(1) # doesn't raise - choice._validate('b') # doesn't raise - choice._validate((0.2,)) # doesn't raise - self.assertRaises(ConstraintNotSatisfied, choice._validate, '1') - self.assertRaises(ConstraintNotSatisfied, choice._validate, 0.2) - - def test__validate_w_named_vocabulary_invalid(self): - choose = self._makeOne(vocabulary='vocab') - self.assertRaises(ValueError, choose._validate, 42) - - def test__validate_w_named_vocabulary(self): - from zope.schema.interfaces import ConstraintNotSatisfied - from zope.schema.vocabulary import setVocabularyRegistry - v = _makeSampleVocabulary() - setVocabularyRegistry(_makeDummyRegistry(v)) - choose = self._makeOne(vocabulary='vocab') - choose._validate(1) - choose._validate(3) - self.assertRaises(ConstraintNotSatisfied, choose._validate, 42) - - def test__validate_source_is_ICSB_unbound(self): - from zope.interface import implementer - from zope.schema.interfaces import IContextSourceBinder - - @implementer(IContextSourceBinder) - class SampleContextSourceBinder(object): - def __call__(self, context): - pass - - choice = self._makeOne(source=SampleContextSourceBinder()) - self.assertRaises(TypeError, choice.validate, 1) - - def test__validate_source_is_ICSB_bound(self): - from zope.interface import implementer - from zope.schema.interfaces import IContextSourceBinder - from zope.schema.interfaces import ConstraintNotSatisfied - from zope.schema.tests.test_vocabulary import _makeSampleVocabulary - - @implementer(IContextSourceBinder) - class SampleContextSourceBinder(object): - def __call__(self, context): - return _makeSampleVocabulary() - - s = SampleContextSourceBinder() - choice = self._makeOne(source=s) - # raises not iterable with unbound field - self.assertRaises(TypeError, choice.validate, 1) - o = object() - clone = choice.bind(o) - clone._validate(1) - clone._validate(3) - self.assertRaises(ConstraintNotSatisfied, clone._validate, 42) - - -class URITests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import URI - return URI - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_IURI(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import IURI - verifyClass(IURI, self._getTargetClass()) - - def test_instance_conforms_to_IURI(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IURI - verifyObject(IURI, self._makeOne()) - - def test_validate_wrong_types(self): - from zope.schema.interfaces import WrongType - from zope.schema._compat import non_native_string - field = self._makeOne() - self.assertRaises(WrongType, field.validate, non_native_string('')) - self.assertRaises(WrongType, field.validate, 1) - self.assertRaises(WrongType, field.validate, 1.0) - self.assertRaises(WrongType, field.validate, ()) - self.assertRaises(WrongType, field.validate, []) - self.assertRaises(WrongType, field.validate, {}) - self.assertRaises(WrongType, field.validate, set()) - self.assertRaises(WrongType, field.validate, frozenset()) - self.assertRaises(WrongType, field.validate, object()) - - def test_validate_not_required(self): - field = self._makeOne(required=False) - field.validate('http://example.com/') - field.validate(None) - - def test_validate_required(self): - from zope.schema.interfaces import RequiredMissing - field = self._makeOne() - field.validate('http://example.com/') - self.assertRaises(RequiredMissing, field.validate, None) - - def test_validate_not_a_uri(self): - from zope.schema.interfaces import ConstraintNotSatisfied - from zope.schema.interfaces import InvalidURI - field = self._makeOne() - self.assertRaises(InvalidURI, field.validate, '') - self.assertRaises(InvalidURI, field.validate, 'abc') - self.assertRaises(InvalidURI, field.validate, '\xab\xde') - self.assertRaises(ConstraintNotSatisfied, - field.validate, 'http://example.com/\nDAV:') - - def test_fromUnicode_ok(self): - from zope.schema._compat import u - field = self._makeOne() - self.assertEqual(field.fromUnicode(u('http://example.com/')), - 'http://example.com/') - - def test_fromUnicode_invalid(self): - from zope.schema.interfaces import ConstraintNotSatisfied - from zope.schema.interfaces import InvalidURI - from zope.schema._compat import u - field = self._makeOne() - self.assertRaises(InvalidURI, field.fromUnicode, u('')) - self.assertRaises(InvalidURI, field.fromUnicode, u('abc')) - self.assertRaises(ConstraintNotSatisfied, - field.fromUnicode, u('http://example.com/\nDAV:')) - - -class DottedNameTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import DottedName - return DottedName - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_IDottedName(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import IDottedName - verifyClass(IDottedName, self._getTargetClass()) - - def test_instance_conforms_to_IDottedName(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IDottedName - verifyObject(IDottedName, self._makeOne()) - - def test_ctor_defaults(self): - dotted = self._makeOne() - self.assertEqual(dotted.min_dots, 0) - self.assertEqual(dotted.max_dots, None) - - def test_ctor_min_dots_invalid(self): - self.assertRaises(ValueError, self._makeOne, min_dots=-1) - - def test_ctor_min_dots_valid(self): - dotted = self._makeOne(min_dots=1) - self.assertEqual(dotted.min_dots, 1) - - def test_ctor_max_dots_invalid(self): - self.assertRaises(ValueError, self._makeOne, min_dots=2, max_dots=1) - - def test_ctor_max_dots_valid(self): - dotted = self._makeOne(max_dots=2) - self.assertEqual(dotted.max_dots, 2) - - def test_validate_wrong_types(self): - from zope.schema.interfaces import WrongType - from zope.schema._compat import non_native_string - field = self._makeOne() - self.assertRaises(WrongType, field.validate, non_native_string('')) - self.assertRaises(WrongType, field.validate, 1) - self.assertRaises(WrongType, field.validate, 1.0) - self.assertRaises(WrongType, field.validate, ()) - self.assertRaises(WrongType, field.validate, []) - self.assertRaises(WrongType, field.validate, {}) - self.assertRaises(WrongType, field.validate, set()) - self.assertRaises(WrongType, field.validate, frozenset()) - self.assertRaises(WrongType, field.validate, object()) - - def test_validate_not_required(self): - field = self._makeOne(required=False) - field.validate('name') - field.validate('dotted.name') - field.validate(None) - - def test_validate_required(self): - from zope.schema.interfaces import RequiredMissing - field = self._makeOne() - field.validate('name') - field.validate('dotted.name') - self.assertRaises(RequiredMissing, field.validate, None) - - def test_validate_w_min_dots(self): - from zope.schema.interfaces import InvalidDottedName - field = self._makeOne(min_dots=1) - self.assertRaises(InvalidDottedName, field.validate, 'name') - field.validate('dotted.name') - field.validate('moar.dotted.name') - - def test_validate_w_max_dots(self): - from zope.schema.interfaces import InvalidDottedName - field = self._makeOne(max_dots=1) - field.validate('name') - field.validate('dotted.name') - self.assertRaises(InvalidDottedName, - field.validate, 'moar.dotted.name') - - def test_validate_not_a_dotted_name(self): - from zope.schema.interfaces import ConstraintNotSatisfied - from zope.schema.interfaces import InvalidDottedName - field = self._makeOne() - self.assertRaises(InvalidDottedName, field.validate, '') - self.assertRaises(InvalidDottedName, field.validate, '\xab\xde') - self.assertRaises(ConstraintNotSatisfied, - field.validate, 'http://example.com/\nDAV:') - - def test_fromUnicode_dotted_name_ok(self): - from zope.schema._compat import u - field = self._makeOne() - self.assertEqual(field.fromUnicode(u('dotted.name')), 'dotted.name') - - def test_fromUnicode_invalid(self): - from zope.schema.interfaces import ConstraintNotSatisfied - from zope.schema.interfaces import InvalidDottedName - from zope.schema._compat import u - field = self._makeOne() - self.assertRaises(InvalidDottedName, field.fromUnicode, u('')) - self.assertRaises(ConstraintNotSatisfied, - field.fromUnicode, u('http://example.com/\nDAV:')) - - -class IdTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import Id - return Id - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_IId(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import IId - verifyClass(IId, self._getTargetClass()) - - def test_instance_conforms_to_IId(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IId - verifyObject(IId, self._makeOne()) - - def test_validate_wrong_types(self): - from zope.schema.interfaces import WrongType - from zope.schema._compat import non_native_string - field = self._makeOne() - self.assertRaises(WrongType, field.validate, non_native_string('')) - self.assertRaises(WrongType, field.validate, 1) - self.assertRaises(WrongType, field.validate, 1.0) - self.assertRaises(WrongType, field.validate, ()) - self.assertRaises(WrongType, field.validate, []) - self.assertRaises(WrongType, field.validate, {}) - self.assertRaises(WrongType, field.validate, set()) - self.assertRaises(WrongType, field.validate, frozenset()) - self.assertRaises(WrongType, field.validate, object()) - - def test_validate_not_required(self): - field = self._makeOne(required=False) - field.validate('http://example.com/') - field.validate('dotted.name') - field.validate(None) - - def test_validate_required(self): - from zope.schema.interfaces import RequiredMissing - field = self._makeOne() - field.validate('http://example.com/') - field.validate('dotted.name') - self.assertRaises(RequiredMissing, field.validate, None) - - def test_validate_not_a_uri(self): - from zope.schema.interfaces import ConstraintNotSatisfied - from zope.schema.interfaces import InvalidId - field = self._makeOne() - self.assertRaises(InvalidId, field.validate, '') - self.assertRaises(InvalidId, field.validate, 'abc') - self.assertRaises(InvalidId, field.validate, '\xab\xde') - self.assertRaises(ConstraintNotSatisfied, - field.validate, 'http://example.com/\nDAV:') - - def test_fromUnicode_url_ok(self): - from zope.schema._compat import u - field = self._makeOne() - self.assertEqual(field.fromUnicode(u('http://example.com/')), - 'http://example.com/') - - def test_fromUnicode_dotted_name_ok(self): - from zope.schema._compat import u - field = self._makeOne() - self.assertEqual(field.fromUnicode(u('dotted.name')), 'dotted.name') - - def test_fromUnicode_invalid(self): - from zope.schema.interfaces import ConstraintNotSatisfied - from zope.schema.interfaces import InvalidId - from zope.schema._compat import u - field = self._makeOne() - self.assertRaises(InvalidId, field.fromUnicode, u('')) - self.assertRaises(InvalidId, field.fromUnicode, u('abc')) - self.assertRaises(ConstraintNotSatisfied, - field.fromUnicode, u('http://example.com/\nDAV:')) - - -class InterfaceFieldTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import InterfaceField - return InterfaceField - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_IInterfaceField(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import IInterfaceField - verifyClass(IInterfaceField, self._getTargetClass()) - - def test_instance_conforms_to_IInterfaceField(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IInterfaceField - verifyObject(IInterfaceField, self._makeOne()) - - def test_validate_wrong_types(self): - from datetime import date - from zope.schema.interfaces import WrongType - from zope.schema._compat import u - from zope.schema._compat import b - field = self._makeOne() - self.assertRaises(WrongType, field.validate, u('')) - self.assertRaises(WrongType, field.validate, b('')) - self.assertRaises(WrongType, field.validate, 1) - self.assertRaises(WrongType, field.validate, 1.0) - self.assertRaises(WrongType, field.validate, ()) - self.assertRaises(WrongType, field.validate, []) - self.assertRaises(WrongType, field.validate, {}) - self.assertRaises(WrongType, field.validate, set()) - self.assertRaises(WrongType, field.validate, frozenset()) - self.assertRaises(WrongType, field.validate, object()) - self.assertRaises(WrongType, field.validate, date.today()) - - def test_validate_not_required(self): - from zope.interface import Interface - - class DummyInterface(Interface): - pass - - field = self._makeOne(required=False) - field.validate(DummyInterface) - field.validate(None) - - def test_validate_required(self): - from zope.interface import Interface - from zope.schema.interfaces import RequiredMissing - - class DummyInterface(Interface): - pass - - field = self._makeOne(required=True) - field.validate(DummyInterface) - self.assertRaises(RequiredMissing, field.validate, None) - - -class AbstractCollectionTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import AbstractCollection - return AbstractCollection - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_ctor_defaults(self): - absc = self._makeOne() - self.assertEqual(absc.value_type, None) - self.assertEqual(absc.unique, False) - - def test_ctor_explicit(self): - from zope.schema._bootstrapfields import Text - text = Text() - absc = self._makeOne(text, True) - self.assertEqual(absc.value_type, text) - self.assertEqual(absc.unique, True) - - def test_ctor_w_non_field_value_type(self): - class NotAField(object): - pass - self.assertRaises(ValueError, self._makeOne, NotAField) - - def test_bind_wo_value_Type(self): - absc = self._makeOne() - context = object() - bound = absc.bind(context) - self.assertEqual(bound.context, context) - self.assertEqual(bound.value_type, None) - self.assertEqual(bound.unique, False) - - def test_bind_w_value_Type(self): - from zope.schema._bootstrapfields import Text - text = Text() - absc = self._makeOne(text, True) - context = object() - bound = absc.bind(context) - self.assertEqual(bound.context, context) - self.assertEqual(isinstance(bound.value_type, Text), True) - self.assertEqual(bound.value_type.context, context) - self.assertEqual(bound.unique, True) - - def test__validate_wrong_contained_type(self): - from zope.schema.interfaces import WrongContainedType - from zope.schema._bootstrapfields import Text - text = Text() - absc = self._makeOne(text) - self.assertRaises(WrongContainedType, absc.validate, [1]) - - def test__validate_miss_uniqueness(self): - from zope.schema.interfaces import NotUnique - from zope.schema._bootstrapfields import Text - from zope.schema._compat import u - text = Text() - absc = self._makeOne(text, True) - self.assertRaises(NotUnique, absc.validate, [u('a'), u('a')]) - - -class TupleTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import Tuple - return Tuple - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_ITuple(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import ITuple - verifyClass(ITuple, self._getTargetClass()) - - def test_instance_conforms_to_ITuple(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import ITuple - verifyObject(ITuple, self._makeOne()) - - def test_validate_wrong_types(self): - from zope.schema.interfaces import WrongType - from zope.schema._compat import u - from zope.schema._compat import b - field = self._makeOne() - self.assertRaises(WrongType, field.validate, u('')) - self.assertRaises(WrongType, field.validate, b('')) - self.assertRaises(WrongType, field.validate, 1) - self.assertRaises(WrongType, field.validate, 1.0) - self.assertRaises(WrongType, field.validate, []) - self.assertRaises(WrongType, field.validate, {}) - self.assertRaises(WrongType, field.validate, set()) - self.assertRaises(WrongType, field.validate, frozenset()) - self.assertRaises(WrongType, field.validate, object()) - - def test_validate_not_required(self): - field = self._makeOne(required=False) - field.validate(()) - field.validate((1, 2)) - field.validate((3,)) - field.validate(None) - - def test_validate_required(self): - from zope.schema.interfaces import RequiredMissing - field = self._makeOne() - field.validate(()) - field.validate((1, 2)) - field.validate((3,)) - self.assertRaises(RequiredMissing, field.validate, None) - - def test_validate_min_length(self): - from zope.schema.interfaces import TooShort - field = self._makeOne(min_length=2) - field.validate((1, 2)) - field.validate((1, 2, 3)) - self.assertRaises(TooShort, field.validate, ()) - self.assertRaises(TooShort, field.validate, (1,)) - - def test_validate_max_length(self): - from zope.schema.interfaces import TooLong - field = self._makeOne(max_length=2) - field.validate(()) - field.validate((1, 2)) - self.assertRaises(TooLong, field.validate, (1, 2, 3, 4)) - self.assertRaises(TooLong, field.validate, (1, 2, 3)) - - def test_validate_min_length_and_max_length(self): - from zope.schema.interfaces import TooLong - from zope.schema.interfaces import TooShort - field = self._makeOne(min_length=1, max_length=2) - field.validate((1, )) - field.validate((1, 2)) - self.assertRaises(TooShort, field.validate, ()) - self.assertRaises(TooLong, field.validate, (1, 2, 3)) - - -class ListTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import List - return List - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_IList(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import IList - verifyClass(IList, self._getTargetClass()) - - def test_instance_conforms_to_IList(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IList - verifyObject(IList, self._makeOne()) - - def test_validate_wrong_types(self): - from zope.schema.interfaces import WrongType - from zope.schema._compat import u - from zope.schema._compat import b - field = self._makeOne() - self.assertRaises(WrongType, field.validate, u('')) - self.assertRaises(WrongType, field.validate, b('')) - self.assertRaises(WrongType, field.validate, 1) - self.assertRaises(WrongType, field.validate, 1.0) - self.assertRaises(WrongType, field.validate, ()) - self.assertRaises(WrongType, field.validate, {}) - self.assertRaises(WrongType, field.validate, set()) - self.assertRaises(WrongType, field.validate, frozenset()) - self.assertRaises(WrongType, field.validate, object()) - - def test_validate_not_required(self): - field = self._makeOne(required=False) - field.validate([]) - field.validate([1, 2]) - field.validate([3]) - field.validate(None) - - def test_validate_required(self): - from zope.schema.interfaces import RequiredMissing - field = self._makeOne() - field.validate([]) - field.validate([1, 2]) - field.validate([3]) - self.assertRaises(RequiredMissing, field.validate, None) - - def test_validate_min_length(self): - from zope.schema.interfaces import TooShort - field = self._makeOne(min_length=2) - field.validate([1, 2]) - field.validate([1, 2, 3]) - self.assertRaises(TooShort, field.validate, []) - self.assertRaises(TooShort, field.validate, [1, ]) - - def test_validate_max_length(self): - from zope.schema.interfaces import TooLong - field = self._makeOne(max_length=2) - field.validate([]) - field.validate([1]) - field.validate([1, 2]) - self.assertRaises(TooLong, field.validate, [1, 2, 3, 4]) - self.assertRaises(TooLong, field.validate, [1, 2, 3]) - - def test_validate_min_length_and_max_length(self): - from zope.schema.interfaces import TooLong - from zope.schema.interfaces import TooShort - field = self._makeOne(min_length=1, max_length=2) - field.validate([1]) - field.validate([1, 2]) - self.assertRaises(TooShort, field.validate, []) - self.assertRaises(TooLong, field.validate, [1, 2, 3]) - - -class SetTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import Set - return Set - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_ISet(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import ISet - verifyClass(ISet, self._getTargetClass()) - - def test_instance_conforms_to_ISet(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import ISet - verifyObject(ISet, self._makeOne()) - - def test_ctor_disallows_unique(self): - self.assertRaises(TypeError, self._makeOne, unique=False) - self.assertRaises(TypeError, self._makeOne, unique=True) - self.assertTrue(self._makeOne().unique) - - def test_validate_wrong_types(self): - from zope.schema.interfaces import WrongType - from zope.schema._compat import u - from zope.schema._compat import b - field = self._makeOne() - self.assertRaises(WrongType, field.validate, u('')) - self.assertRaises(WrongType, field.validate, b('')) - self.assertRaises(WrongType, field.validate, 1) - self.assertRaises(WrongType, field.validate, 1.0) - self.assertRaises(WrongType, field.validate, ()) - self.assertRaises(WrongType, field.validate, []) - self.assertRaises(WrongType, field.validate, {}) - self.assertRaises(WrongType, field.validate, frozenset()) - self.assertRaises(WrongType, field.validate, object()) - - def test_validate_not_required(self): - field = self._makeOne(required=False) - field.validate(set()) - field.validate(set((1, 2))) - field.validate(set((3,))) - field.validate(None) - - def test_validate_required(self): - from zope.schema.interfaces import RequiredMissing - field = self._makeOne() - field.validate(set()) - field.validate(set((1, 2))) - field.validate(set((3,))) - field.validate(set()) - field.validate(set((1, 2))) - field.validate(set((3,))) - self.assertRaises(RequiredMissing, field.validate, None) - - def test_validate_min_length(self): - from zope.schema.interfaces import TooShort - field = self._makeOne(min_length=2) - field.validate(set((1, 2))) - field.validate(set((1, 2, 3))) - self.assertRaises(TooShort, field.validate, set()) - self.assertRaises(TooShort, field.validate, set((1,))) - - def test_validate_max_length(self): - from zope.schema.interfaces import TooLong - field = self._makeOne(max_length=2) - field.validate(set()) - field.validate(set((1,))) - field.validate(set((1, 2))) - self.assertRaises(TooLong, field.validate, set((1, 2, 3, 4))) - self.assertRaises(TooLong, field.validate, set((1, 2, 3))) - - def test_validate_min_length_and_max_length(self): - from zope.schema.interfaces import TooLong - from zope.schema.interfaces import TooShort - field = self._makeOne(min_length=1, max_length=2) - field.validate(set((1,))) - field.validate(set((1, 2))) - self.assertRaises(TooShort, field.validate, set()) - self.assertRaises(TooLong, field.validate, set((1, 2, 3))) - - -class FrozenSetTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import FrozenSet - return FrozenSet - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_IFrozenSet(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import IFrozenSet - verifyClass(IFrozenSet, self._getTargetClass()) - - def test_instance_conforms_to_IFrozenSet(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IFrozenSet - verifyObject(IFrozenSet, self._makeOne()) - - def test_ctor_disallows_unique(self): - self.assertRaises(TypeError, self._makeOne, unique=False) - self.assertRaises(TypeError, self._makeOne, unique=True) - self.assertTrue(self._makeOne().unique) - - def test_validate_wrong_types(self): - from zope.schema.interfaces import WrongType - from zope.schema._compat import u - from zope.schema._compat import b - field = self._makeOne() - self.assertRaises(WrongType, field.validate, u('')) - self.assertRaises(WrongType, field.validate, b('')) - self.assertRaises(WrongType, field.validate, 1) - self.assertRaises(WrongType, field.validate, 1.0) - self.assertRaises(WrongType, field.validate, ()) - self.assertRaises(WrongType, field.validate, []) - self.assertRaises(WrongType, field.validate, {}) - self.assertRaises(WrongType, field.validate, set()) - self.assertRaises(WrongType, field.validate, object()) - - def test_validate_not_required(self): - field = self._makeOne(required=False) - field.validate(frozenset()) - field.validate(frozenset((1, 2))) - field.validate(frozenset((3,))) - field.validate(None) - - def test_validate_required(self): - from zope.schema.interfaces import RequiredMissing - field = self._makeOne() - field.validate(frozenset()) - field.validate(frozenset((1, 2))) - field.validate(frozenset((3,))) - self.assertRaises(RequiredMissing, field.validate, None) - - def test_validate_min_length(self): - from zope.schema.interfaces import TooShort - field = self._makeOne(min_length=2) - field.validate(frozenset((1, 2))) - field.validate(frozenset((1, 2, 3))) - self.assertRaises(TooShort, field.validate, frozenset()) - self.assertRaises(TooShort, field.validate, frozenset((1,))) - - def test_validate_max_length(self): - from zope.schema.interfaces import TooLong - field = self._makeOne(max_length=2) - field.validate(frozenset()) - field.validate(frozenset((1,))) - field.validate(frozenset((1, 2))) - self.assertRaises(TooLong, field.validate, frozenset((1, 2, 3, 4))) - self.assertRaises(TooLong, field.validate, frozenset((1, 2, 3))) - - def test_validate_min_length_and_max_length(self): - from zope.schema.interfaces import TooLong - from zope.schema.interfaces import TooShort - field = self._makeOne(min_length=1, max_length=2) - field.validate(frozenset((1,))) - field.validate(frozenset((1, 2))) - self.assertRaises(TooShort, field.validate, frozenset()) - self.assertRaises(TooLong, field.validate, frozenset((1, 2, 3))) - - -class ObjectTests(unittest.TestCase): - - def setUp(self): - from zope.event import subscribers - self._before = subscribers[:] - - def tearDown(self): - from zope.event import subscribers - subscribers[:] = self._before - - def _getTargetClass(self): - from zope.schema._field import Object - return Object - - def _makeOne(self, schema=None, *args, **kw): - if schema is None: - schema = self._makeSchema() - return self._getTargetClass()(schema, *args, **kw) - - def _makeSchema(self, **kw): - from zope.interface import Interface - from zope.interface.interface import InterfaceClass - return InterfaceClass('ISchema', (Interface,), kw) - - def _getErrors(self, f, *args, **kw): - from zope.schema.interfaces import WrongContainedType - try: - f(*args, **kw) - except WrongContainedType as e: - try: - return e.args[0] - except: - return [] - self.fail('Expected WrongContainedType Error') - - def _makeCycles(self): - from zope.interface import Interface - from zope.interface import implementer - from zope.schema import Object - from zope.schema import List - from zope.schema._messageid import _ - - class IUnit(Interface): - """A schema that participate to a cycle""" - boss = Object( - schema=Interface, - title=_("Boss"), - description=_("Boss description"), - required=False, - ) - members = List( - value_type=Object(schema=Interface), - title=_("Member List"), - description=_("Member list description"), - required=False, - ) - - class IPerson(Interface): - """A schema that participate to a cycle""" - unit = Object( - schema=IUnit, - title=_("Unit"), - description=_("Unit description"), - required=False, - ) - - IUnit['boss'].schema = IPerson - IUnit['members'].value_type.schema = IPerson - - @implementer(IUnit) - class Unit(object): - def __init__(self, person, person_list): - self.boss = person - self.members = person_list - - @implementer(IPerson) - class Person(object): - def __init__(self, unit): - self.unit = unit - - return IUnit, Person, Unit - - def test_class_conforms_to_IObject(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import IObject - verifyClass(IObject, self._getTargetClass()) - - def test_instance_conforms_to_IObject(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IObject - verifyObject(IObject, self._makeOne()) - - def test_ctor_w_bad_schema(self): - from zope.schema.interfaces import WrongType - self.assertRaises(WrongType, self._makeOne, object()) - - def test_validate_not_required(self): - schema = self._makeSchema() - objf = self._makeOne(schema, required=False) - objf.validate(None) # doesn't raise - - def test_validate_required(self): - from zope.schema.interfaces import RequiredMissing - field = self._makeOne(required=True) - self.assertRaises(RequiredMissing, field.validate, None) - - def test__validate_w_empty_schema(self): - from zope.interface import Interface - objf = self._makeOne(Interface) - objf.validate(object()) # doesn't raise - - def test__validate_w_value_not_providing_schema(self): - from zope.schema.interfaces import SchemaNotProvided - from zope.schema._bootstrapfields import Text - schema = self._makeSchema(foo=Text(), bar=Text()) - objf = self._makeOne(schema) - self.assertRaises(SchemaNotProvided, objf.validate, object()) - - def test__validate_w_value_providing_schema_but_missing_fields(self): - from zope.interface import implementer - from zope.schema.interfaces import SchemaNotFullyImplemented - from zope.schema.interfaces import WrongContainedType - from zope.schema._bootstrapfields import Text - schema = self._makeSchema(foo=Text(), bar=Text()) - - @implementer(schema) - class Broken(object): - pass - - objf = self._makeOne(schema) - self.assertRaises(WrongContainedType, objf.validate, Broken()) - errors = self._getErrors(objf.validate, Broken()) - self.assertEqual(len(errors), 2) - errors = sorted(errors, - key=lambda x: (type(x).__name__, str(x.args[0]))) - err = errors[0] - self.assertTrue(isinstance(err, SchemaNotFullyImplemented)) - nested = err.args[0] - self.assertTrue(isinstance(nested, AttributeError)) - self.assertTrue("'bar'" in str(nested)) - err = errors[1] - self.assertTrue(isinstance(err, SchemaNotFullyImplemented)) - nested = err.args[0] - self.assertTrue(isinstance(nested, AttributeError)) - self.assertTrue("'foo'" in str(nested)) - - def test__validate_w_value_providing_schema_but_invalid_fields(self): - from zope.interface import implementer - from zope.schema.interfaces import WrongContainedType - from zope.schema.interfaces import RequiredMissing - from zope.schema.interfaces import WrongType - from zope.schema._bootstrapfields import Text - from zope.schema._compat import text_type - schema = self._makeSchema(foo=Text(), bar=Text()) - - @implementer(schema) - class Broken(object): - foo = None - bar = 1 - - objf = self._makeOne(schema) - self.assertRaises(WrongContainedType, objf.validate, Broken()) - errors = self._getErrors(objf.validate, Broken()) - self.assertEqual(len(errors), 2) - errors = sorted(errors, key=lambda x: type(x).__name__) - err = errors[0] - self.assertTrue(isinstance(err, RequiredMissing)) - self.assertEqual(err.args, ('foo',)) - err = errors[1] - self.assertTrue(isinstance(err, WrongType)) - self.assertEqual(err.args, (1, text_type, 'bar')) - - def test__validate_w_value_providing_schema(self): - from zope.interface import implementer - from zope.schema._bootstrapfields import Text - from zope.schema._field import Choice - from zope.schema._compat import u - schema = self._makeSchema( - foo=Text(), - bar=Text(), - baz=Choice(values=[1, 2, 3]), - ) - - @implementer(schema) - class OK(object): - foo = u('Foo') - bar = u('Bar') - baz = 2 - objf = self._makeOne(schema) - objf.validate(OK()) # doesn't raise - - def test_validate_w_cycles(self): - IUnit, Person, Unit = self._makeCycles() - field = self._makeOne(schema=IUnit) - person1 = Person(None) - person2 = Person(None) - unit = Unit(person1, [person1, person2]) - person1.unit = unit - person2.unit = unit - field.validate(unit) # doesn't raise - - def test_validate_w_cycles_object_not_valid(self): - from zope.schema.interfaces import WrongContainedType - IUnit, Person, Unit = self._makeCycles() - field = self._makeOne(schema=IUnit) - person1 = Person(None) - person2 = Person(None) - person3 = Person(DummyInstance()) - unit = Unit(person3, [person1, person2]) - person1.unit = unit - person2.unit = unit - self.assertRaises(WrongContainedType, field.validate, unit) - - def test_validate_w_cycles_collection_not_valid(self): - from zope.schema.interfaces import WrongContainedType - IUnit, Person, Unit = self._makeCycles() - field = self._makeOne(schema=IUnit) - person1 = Person(None) - person2 = Person(None) - person3 = Person(DummyInstance()) - unit = Unit(person1, [person2, person3]) - person1.unit = unit - person2.unit = unit - self.assertRaises(WrongContainedType, field.validate, unit) - - def test_set_emits_IBOAE(self): - from zope.event import subscribers - from zope.interface import implementer - from zope.schema.interfaces import IBeforeObjectAssignedEvent - from zope.schema._bootstrapfields import Text - from zope.schema._field import Choice - from zope.schema._compat import u - schema = self._makeSchema( - foo=Text(), - bar=Text(), - baz=Choice(values=[1, 2, 3]), - ) - - @implementer(schema) - class OK(object): - foo = u('Foo') - bar = u('Bar') - baz = 2 - log = [] - subscribers.append(log.append) - objf = self._makeOne(schema, __name__='field') - inst = DummyInstance() - value = OK() - objf.set(inst, value) - self.assertEqual(inst.field is value, True) - self.assertEqual(len(log), 5) - self.assertEqual(IBeforeObjectAssignedEvent.providedBy(log[-1]), True) - self.assertEqual(log[-1].object, value) - self.assertEqual(log[-1].name, 'field') - self.assertEqual(log[-1].context, inst) - - def test_set_allows_IBOAE_subscr_to_replace_value(self): - from zope.event import subscribers - from zope.interface import implementer - from zope.schema._bootstrapfields import Text - from zope.schema._field import Choice - from zope.schema._compat import u - schema = self._makeSchema( - foo=Text(), - bar=Text(), - baz=Choice(values=[1, 2, 3]), - ) - - @implementer(schema) - class OK(object): - def __init__(self, foo=u('Foo'), bar=u('Bar'), baz=2): - self.foo = foo - self.bar = bar - self.baz = baz - ok1 = OK() - ok2 = OK(u('Foo2'), u('Bar2'), 3) - log = [] - subscribers.append(log.append) - - def _replace(event): - event.object = ok2 - subscribers.append(_replace) - objf = self._makeOne(schema, __name__='field') - inst = DummyInstance() - self.assertEqual(len(log), 4) - objf.set(inst, ok1) - self.assertEqual(inst.field is ok2, True) - self.assertEqual(len(log), 5) - self.assertEqual(log[-1].object, ok2) - self.assertEqual(log[-1].name, 'field') - self.assertEqual(log[-1].context, inst) - - -class DictTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema._field import Dict - return Dict - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_IDict(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import IDict - verifyClass(IDict, self._getTargetClass()) - - def test_instance_conforms_to_IDict(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IDict - verifyObject(IDict, self._makeOne()) - - def test_ctor_key_type_not_IField(self): - self.assertRaises(ValueError, self._makeOne, key_type=object()) - - def test_ctor_value_type_not_IField(self): - self.assertRaises(ValueError, self._makeOne, value_type=object()) - - def test_validate_wrong_types(self): - from zope.schema.interfaces import WrongType - from zope.schema._compat import u - from zope.schema._compat import b - field = self._makeOne() - self.assertRaises(WrongType, field.validate, u('')) - self.assertRaises(WrongType, field.validate, b('')) - self.assertRaises(WrongType, field.validate, 1) - self.assertRaises(WrongType, field.validate, 1.0) - self.assertRaises(WrongType, field.validate, ()) - self.assertRaises(WrongType, field.validate, []) - self.assertRaises(WrongType, field.validate, set()) - self.assertRaises(WrongType, field.validate, frozenset()) - self.assertRaises(WrongType, field.validate, object()) - - def test_validate_not_required(self): - field = self._makeOne(required=False) - field.validate({}) - field.validate({1: 'b', 2: 'd'}) - field.validate({3: 'a'}) - field.validate(None) - - def test_validate_required(self): - from zope.schema.interfaces import RequiredMissing - field = self._makeOne() - field.validate({}) - field.validate({1: 'b', 2: 'd'}) - field.validate({3: 'a'}) - self.assertRaises(RequiredMissing, field.validate, None) - - def test_validate_invalid_key_type(self): - from zope.schema.interfaces import WrongContainedType - from zope.schema._bootstrapfields import Int - field = self._makeOne(key_type=Int()) - field.validate({}) - field.validate({1: 'b', 2: 'd'}) - field.validate({3: 'a'}) - self.assertRaises(WrongContainedType, field.validate, {'a': 1}) - - def test_validate_invalid_value_type(self): - from zope.schema.interfaces import WrongContainedType - from zope.schema._bootstrapfields import Int - field = self._makeOne(value_type=Int()) - field.validate({}) - field.validate({'b': 1, 'd': 2}) - field.validate({'a': 3}) - self.assertRaises(WrongContainedType, field.validate, {1: 'a'}) - - def test_validate_min_length(self): - from zope.schema.interfaces import TooShort - field = self._makeOne(min_length=1) - field.validate({1: 'a'}) - field.validate({1: 'a', 2: 'b'}) - self.assertRaises(TooShort, field.validate, {}) - - def test_validate_max_length(self): - from zope.schema.interfaces import TooLong - field = self._makeOne(max_length=1) - field.validate({}) - field.validate({1: 'a'}) - self.assertRaises(TooLong, field.validate, {1: 'a', 2: 'b'}) - self.assertRaises(TooLong, field.validate, {1: 'a', 2: 'b', 3: 'c'}) - - def test_validate_min_length_and_max_length(self): - from zope.schema.interfaces import TooLong - from zope.schema.interfaces import TooShort - field = self._makeOne(min_length=1, max_length=2) - field.validate({1: 'a'}) - field.validate({1: 'a', 2: 'b'}) - self.assertRaises(TooShort, field.validate, {}) - self.assertRaises(TooLong, field.validate, {1: 'a', 2: 'b', 3: 'c'}) - - def test_bind_binds_key_and_value_types(self): - from zope.schema import Int - field = self._makeOne(key_type=Int(), value_type=Int()) - context = DummyInstance() - field2 = field.bind(context) - self.assertEqual(field2.key_type.context, context) - self.assertEqual(field2.value_type.context, context) - - -class DummyInstance(object): - pass - - -def _makeSampleVocabulary(): - from zope.interface import implementer - from zope.schema.interfaces import IVocabulary - - class SampleTerm(object): - pass - - @implementer(IVocabulary) - class SampleVocabulary(object): - - def __iter__(self): - return iter([self.getTerm(x) for x in range(0, 10)]) - - def __contains__(self, value): - return 0 <= value < 10 - - def __len__(self): - return 10 - - def getTerm(self, value): - if value in self: - t = SampleTerm() - t.value = value - t.double = 2 * value - return t - raise LookupError("no such value: %r" % value) - - return SampleVocabulary() - - -def _makeDummyRegistry(v): - from zope.schema.vocabulary import VocabularyRegistry - - class DummyRegistry(VocabularyRegistry): - def __init__(self, vocabulary): - self._vocabulary = vocabulary - - def get(self, object, name): - return self._vocabulary - return DummyRegistry(v) - - -def test_suite(): - return unittest.TestSuite(( - unittest.makeSuite(BytesTests), - unittest.makeSuite(ASCIITests), - unittest.makeSuite(BytesLineTests), - unittest.makeSuite(ASCIILineTests), - unittest.makeSuite(FloatTests), - unittest.makeSuite(DecimalTests), - unittest.makeSuite(DatetimeTests), - unittest.makeSuite(DateTests), - unittest.makeSuite(TimedeltaTests), - unittest.makeSuite(TimeTests), - unittest.makeSuite(ChoiceTests), - unittest.makeSuite(InterfaceFieldTests), - unittest.makeSuite(AbstractCollectionTests), - unittest.makeSuite(TupleTests), - unittest.makeSuite(ListTests), - unittest.makeSuite(SetTests), - unittest.makeSuite(FrozenSetTests), - unittest.makeSuite(ObjectTests), - unittest.makeSuite(DictTests), - unittest.makeSuite(URITests), - unittest.makeSuite(IdTests), - unittest.makeSuite(DottedNameTests), - )) diff --git a/zope/schema/tests/test_accessors.py b/zope/schema/tests/test_accessors.py deleted file mode 100644 index bfd72a16..00000000 --- a/zope/schema/tests/test_accessors.py +++ /dev/null @@ -1,315 +0,0 @@ -############################################################################## -# -# Copyright (c) 2003 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Test Interface accessor methods. -""" -import unittest - - -class FieldReadAccessorTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema.accessors import FieldReadAccessor - return FieldReadAccessor - - def _makeOne(self, field=None): - from zope.schema import Text - if field is None: - field = Text(__name__='testing') - return self._getTargetClass()(field) - - def test_ctor_not_created_inside_interface(self): - from zope.schema import Text - from zope.schema._compat import u - field = Text(title=u('Hmm')) - wrapped = self._makeOne(field) - self.assertTrue(wrapped.field is field) - self.assertEqual(wrapped.__name__, '') # __name__ set when in iface - self.assertEqual(wrapped.__doc__, 'get Hmm') - - def test_ctor_created_inside_interface(self): - from zope.interface import Interface - from zope.schema import Text - from zope.schema._compat import u - field = Text(title=u('Hmm')) - - class IFoo(Interface): - getter = self._makeOne(field) - getter = IFoo['getter'] - self.assertEqual(getter.__name__, 'getter') - self.assertEqual(getter.__doc__, 'get Hmm') - - def test___provides___w_field_no_provides(self): - from zope.interface import implementedBy - from zope.interface import providedBy - wrapped = self._makeOne(object()) - self.assertEqual(list(providedBy(wrapped)), - list(implementedBy(self._getTargetClass()))) - - def test___provides___w_field_w_provides(self): - from zope.interface import implementedBy - from zope.interface import providedBy - from zope.schema import Text - field = Text() - field_provides = list(providedBy(field)) - wrapped = self._makeOne(field) - wrapped_provides = list(providedBy(wrapped)) - self.assertEqual(wrapped_provides[:len(field_provides)], - list(providedBy(field))) - for iface in list(implementedBy(self._getTargetClass())): - self.assertTrue(iface in wrapped_provides) - - def test_getSignatureString(self): - wrapped = self._makeOne() - self.assertEqual(wrapped.getSignatureString(), '()') - - def test_getSignatureInfo(self): - wrapped = self._makeOne() - info = wrapped.getSignatureInfo() - self.assertEqual(info['positional'], ()) - self.assertEqual(info['required'], ()) - self.assertEqual(info['optional'], ()) - self.assertEqual(info['varargs'], None) - self.assertEqual(info['kwargs'], None) - - def test_get_miss(self): - from zope.interface import Interface - - class IFoo(Interface): - getter = self._makeOne() - getter = IFoo['getter'] - - class Foo(object): - pass - self.assertRaises(AttributeError, getter.get, Foo()) - - def test_get_hit(self): - from zope.interface import Interface - - class IFoo(Interface): - getter = self._makeOne() - getter = IFoo['getter'] - - class Foo(object): - def getter(self): - return '123' - self.assertEqual(getter.get(Foo()), '123') - - def test_query_miss_implicit_default(self): - from zope.interface import Interface - - class IFoo(Interface): - getter = self._makeOne() - getter = IFoo['getter'] - - class Foo(object): - pass - self.assertEqual(getter.query(Foo()), None) - - def test_query_miss_explicit_default(self): - from zope.interface import Interface - - class IFoo(Interface): - getter = self._makeOne() - getter = IFoo['getter'] - - class Foo(object): - pass - self.assertEqual(getter.query(Foo(), 234), 234) - - def test_query_hit(self): - from zope.interface import Interface - - class IFoo(Interface): - getter = self._makeOne() - getter = IFoo['getter'] - - class Foo(object): - def getter(self): - return '123' - - self.assertEqual(getter.query(Foo()), '123') - - def test_set_readonly(self): - from zope.interface import Interface - from zope.schema import Text - field = Text(readonly=True) - - class IFoo(Interface): - getter = self._makeOne(field) - getter = IFoo['getter'] - - class Foo(object): - def getter(self): - return '123' - self.assertRaises(TypeError, getter.set, Foo(), '456') - - def test_set_no_writer(self): - from zope.interface import Interface - - class IFoo(Interface): - getter = self._makeOne() - getter = IFoo['getter'] - - class Foo(object): - def getter(self): - return '123' - - self.assertRaises(AttributeError, getter.set, Foo(), '456') - - def test_set_w_writer(self): - from zope.interface import Interface - - class IFoo(Interface): - getter = self._makeOne() - - getter = IFoo['getter'] - _called_with = [] - - class Writer(object): - pass - - writer = Writer() - writer.__name__ = 'setMe' - getter.writer = writer - - class Foo(object): - def setMe(self, value): - _called_with.append(value) - - getter.set(Foo(), '456') - self.assertEqual(_called_with, ['456']) - - def test_bind(self): - from zope.interface import Interface - - class IFoo(Interface): - getter = self._makeOne() - - getter = IFoo['getter'] - context = object() - bound = getter.bind(context) - self.assertEqual(bound.__name__, 'getter') - self.assertTrue(isinstance(bound.field, getter.field.__class__)) - self.assertTrue(bound.field.context is context) - - -class FieldWriteAccessorTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema.accessors import FieldWriteAccessor - return FieldWriteAccessor - - def _makeOne(self, field=None): - from zope.schema import Text - if field is None: - field = Text(__name__='testing') - return self._getTargetClass()(field) - - def test_ctor_not_created_inside_interface(self): - from zope.schema import Text - from zope.schema._compat import u - field = Text(title=u('Hmm')) - wrapped = self._makeOne(field) - self.assertTrue(wrapped.field is field) - self.assertEqual(wrapped.__name__, '') # __name__ set when in iface - self.assertEqual(wrapped.__doc__, 'set Hmm') - - def test_ctor_created_inside_interface(self): - from zope.interface import Interface - from zope.schema import Text - from zope.schema._compat import u - field = Text(title=u('Hmm')) - - class IFoo(Interface): - setter = self._makeOne(field) - - setter = IFoo['setter'] - self.assertEqual(setter.__name__, 'setter') - self.assertEqual(setter.__doc__, 'set Hmm') - - def test_getSignatureString(self): - wrapped = self._makeOne() - self.assertEqual(wrapped.getSignatureString(), '(newvalue)') - - def test_getSignatureInfo(self): - wrapped = self._makeOne() - info = wrapped.getSignatureInfo() - self.assertEqual(info['positional'], ('newvalue',)) - self.assertEqual(info['required'], ('newvalue',)) - self.assertEqual(info['optional'], ()) - self.assertEqual(info['varargs'], None) - self.assertEqual(info['kwargs'], None) - - -class Test_accessors(unittest.TestCase): - - def _callFUT(self, *args, **kw): - from zope.schema.accessors import accessors - return accessors(*args, **kw) - - def test_w_only_read_accessor(self): - from zope.interface import Interface - from zope.schema import Text - from zope.schema._compat import u - field = Text(title=u('Hmm'), readonly=True) - - class IFoo(Interface): - getter, = self._callFUT(field) - - getter = IFoo['getter'] - self.assertEqual(getter.__name__, 'getter') - self.assertEqual(getter.__doc__, 'get Hmm') - self.assertEqual(getter.getSignatureString(), '()') - info = getter.getSignatureInfo() - self.assertEqual(info['positional'], ()) - self.assertEqual(info['required'], ()) - self.assertEqual(info['optional'], ()) - self.assertEqual(info['varargs'], None) - self.assertEqual(info['kwargs'], None) - - def test_w_read_and_write_accessors(self): - from zope.interface import Interface - from zope.schema import Text - from zope.schema._compat import u - field = Text(title=u('Hmm')) - - class IFoo(Interface): - getter, setter = self._callFUT(field) - - getter = IFoo['getter'] - self.assertEqual(getter.__name__, 'getter') - self.assertEqual(getter.getSignatureString(), '()') - info = getter.getSignatureInfo() - self.assertEqual(info['positional'], ()) - self.assertEqual(info['required'], ()) - self.assertEqual(info['optional'], ()) - self.assertEqual(info['varargs'], None) - self.assertEqual(info['kwargs'], None) - setter = IFoo['setter'] - self.assertEqual(setter.__name__, 'setter') - self.assertEqual(setter.getSignatureString(), '(newvalue)') - info = setter.getSignatureInfo() - self.assertEqual(info['positional'], ('newvalue',)) - self.assertEqual(info['required'], ('newvalue',)) - self.assertEqual(info['optional'], ()) - self.assertEqual(info['varargs'], None) - self.assertEqual(info['kwargs'], None) - - -def test_suite(): - return unittest.TestSuite(( - unittest.makeSuite(FieldReadAccessorTests), - unittest.makeSuite(FieldWriteAccessorTests), - unittest.makeSuite(Test_accessors), - )) diff --git a/zope/schema/tests/test_equality.py b/zope/schema/tests/test_equality.py deleted file mode 100644 index 23663e88..00000000 --- a/zope/schema/tests/test_equality.py +++ /dev/null @@ -1,41 +0,0 @@ -############################################################################## -# -# Copyright (c) 2001, 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Field equality tests -""" -import unittest - - -class FieldEqualityTests(unittest.TestCase): - - def test_equality(self): - - from zope.schema._compat import u - from zope.schema import Int - from zope.schema import Text - - # pep 8 friendlyness - u, Int, Text - - equality = [ - 'Text(title=u("Foo"), description=u("Bar"))', - 'Int(title=u("Foo"), description=u("Bar"))', - ] - for text in equality: - self.assertEqual(eval(text), eval(text)) - - -def test_suite(): - return unittest.TestSuite(( - unittest.makeSuite(FieldEqualityTests), - )) diff --git a/zope/schema/tests/test_fieldproperty.py b/zope/schema/tests/test_fieldproperty.py deleted file mode 100644 index 2b8ab219..00000000 --- a/zope/schema/tests/test_fieldproperty.py +++ /dev/null @@ -1,669 +0,0 @@ -############################################################################## -# -# Copyright (c) 2001, 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Field Properties tests -""" - -import unittest - - -class _Base(unittest.TestCase): - - def _makeOne(self, field=None, name=None): - from zope.schema import Text - if field is None: - field = Text(__name__='testing') - if name is None: - return self._getTargetClass()(field) - return self._getTargetClass()(field, name) - - -class _Integration(object): - - def _makeImplementer(self): - schema = _getSchema() - - class _Implementer(object): - title = self._makeOne(schema['title']) - weight = self._makeOne(schema['weight']) - code = self._makeOne(schema['code']) - date = self._makeOne(schema['date']) - - return _Implementer() - - def test_basic(self): - from zope.schema._compat import b - from zope.schema._compat import u - from zope.schema.interfaces import ValidationError - c = self._makeImplementer() - self.assertEqual(c.title, u('say something')) - self.assertEqual(c.weight, None) - self.assertEqual(c.code, b('xxxxxx')) - self.assertRaises(ValidationError, setattr, c, 'title', b('foo')) - self.assertRaises(ValidationError, setattr, c, 'weight', b('foo')) - self.assertRaises(ValidationError, setattr, c, 'weight', -1.0) - self.assertRaises(ValidationError, setattr, c, 'weight', 2) - self.assertRaises(ValidationError, setattr, c, 'code', -1) - self.assertRaises(ValidationError, setattr, c, 'code', b('xxxx')) - self.assertRaises(ValidationError, setattr, c, 'code', u('xxxxxx')) - - c.title = u('c is good') - c.weight = 10.0 - c.code = b('abcdef') - - self.assertEqual(c.title, u('c is good')) - self.assertEqual(c.weight, 10) - self.assertEqual(c.code, b('abcdef')) - - def test_readonly(self): - c = self._makeImplementer() - # The date should be only settable once - c.date = 0.0 - # Setting the value a second time should fail. - self.assertRaises(ValueError, setattr, c, 'date', 1.0) - - -class FieldPropertyTests(_Base, _Integration): - - def _getTargetClass(self): - from zope.schema.fieldproperty import FieldProperty - return FieldProperty - - def test_ctor_defaults(self): - from zope.schema import Text - field = Text(__name__='testing') - cname = self._getTargetClass().__name__ - prop = self._makeOne(field) - self.assertTrue(getattr(prop, '_%s__field' % cname) is field) - self.assertEqual(getattr(prop, '_%s__name' % cname), 'testing') - self.assertEqual(prop.__name__, 'testing') - self.assertEqual(prop.description, field.description) - self.assertEqual(prop.default, field.default) - self.assertEqual(prop.readonly, field.readonly) - self.assertEqual(prop.required, field.required) - - def test_ctor_explicit(self): - from zope.schema import Text - from zope.schema._compat import u - field = Text( - __name__='testing', - description=u('DESCRIPTION'), - default=u('DEFAULT'), - readonly=True, - required=True, - ) - cname = self._getTargetClass().__name__ - prop = self._makeOne(field, name='override') - self.assertTrue(getattr(prop, '_%s__field' % cname) is field) - self.assertEqual(getattr(prop, '_%s__name' % cname), 'override') - self.assertEqual(prop.description, field.description) - self.assertEqual(prop.default, field.default) - self.assertEqual(prop.readonly, field.readonly) - self.assertEqual(prop.required, field.required) - - def test_query_value_with_default(self): - from zope.schema import Text - from zope.schema._compat import u - field = Text( - __name__='testing', - description=u('DESCRIPTION'), - default=u('DEFAULT'), - readonly=True, - required=True, - ) - - prop = self._makeOne(field=field) - - class Foo(object): - testing = prop - foo = Foo() - self.assertEqual(prop.queryValue(foo, 'test'), u('DEFAULT')) - foo.testing = u('NO') - self.assertEqual(prop.queryValue(foo, 'test'), u('NO')) - - def test_query_value_without_default(self): - from zope.schema import Text - from zope.schema._compat import u - field = Text( - __name__='testing', - description=u('DESCRIPTION'), - readonly=True, - required=True, - ) - - prop = self._makeOne(field=field) - - class Foo(object): - testing = prop - foo = Foo() - # field initialize its default to None if it hasn't any default - # it should be zope.schema.NO_VALUE as 'None' has another semantic - self.assertEqual(prop.queryValue(foo, 'test'), None) - - def test___get___from_class(self): - prop = self._makeOne() - - class Foo(object): - testing = prop - - self.assertTrue(Foo.testing is prop) - - def test___get___from_instance_pseudo_field_wo_default(self): - class _Faux(object): - def bind(self, other): - return self - prop = self._makeOne(_Faux(), 'nonesuch') - - class Foo(object): - testing = prop - - foo = Foo() - self.assertRaises(AttributeError, getattr, foo, 'testing') - - def test___get___from_instance_miss_uses_field_default(self): - prop = self._makeOne() - - class Foo(object): - testing = prop - - foo = Foo() - self.assertEqual(foo.testing, None) - - def test___get___from_instance_hit(self): - prop = self._makeOne(name='other') - - class Foo(object): - testing = prop - - foo = Foo() - foo.other = '123' - self.assertEqual(foo.testing, '123') - - def test___get___from_instance_hit_after_bind(self): - class _Faux(object): - default = '456' - - def bind(self, other): - return self - - prop = self._makeOne(_Faux(), 'testing') - - class Foo(object): - testing = prop - - foo = Foo() - self.assertEqual(foo.testing, '456') - - def test___set___not_readonly(self): - class _Faux(object): - readonly = False - default = '456' - - def bind(self, other): - return self - - faux = _Faux() - _validated = [] - faux.validate = _validated.append - prop = self._makeOne(faux, 'testing') - - class Foo(object): - testing = prop - - foo = Foo() - foo.testing = '123' - self.assertEqual(foo.__dict__['testing'], '123') - - def test___set___w_readonly_not_already_set(self): - class _Faux(object): - readonly = True - default = '456' - - def bind(self, other): - return self - - faux = _Faux() - _validated = [] - faux.validate = _validated.append - prop = self._makeOne(faux, 'testing') - - class Foo(object): - testing = prop - - foo = Foo() - foo.testing = '123' - self.assertEqual(foo.__dict__['testing'], '123') - self.assertEqual(_validated, ['123']) - - def test___set___w_readonly_and_already_set(self): - class _Faux(object): - readonly = True - default = '456' - - def bind(self, other): - return self - - faux = _Faux() - _validated = [] - faux.validate = _validated.append - prop = self._makeOne(faux, 'testing') - - class Foo(object): - testing = prop - - foo = Foo() - foo.__dict__['testing'] = '789' - self.assertRaises(ValueError, setattr, foo, 'testing', '123') - self.assertEqual(_validated, ['123']) - - def test_field_event(self): - from zope.schema import Text - from zope.schema._compat import u - from zope.event import subscribers - from zope.schema.fieldproperty import FieldUpdatedEvent - log = [] - subscribers.append(log.append) - self.assertEqual(log, []) - field = Text( - __name__='testing', - description=u('DESCRIPTION'), - default=u('DEFAULT'), - readonly=True, - required=True, - ) - self.assertEqual(len(log), 6) - event = log[0] - self.assertTrue(isinstance(event, FieldUpdatedEvent)) - self.assertEqual(event.inst, field) - self.assertEqual(event.old_value, 0) - self.assertEqual(event.new_value, 0) - self.assertEqual( - [ev.field.__name__ for ev in log], - ['min_length', 'max_length', 'title', 'description', 'required', 'readonly']) - - def test_field_event_update(self): - from zope.schema import Text - from zope.schema._compat import u - from zope.event import subscribers - from zope.schema.fieldproperty import FieldUpdatedEvent - field = Text( - __name__='testing', - description=u('DESCRIPTION'), - default=u('DEFAULT'), - required=True, - ) - prop = self._makeOne(field=field) - - class Foo(object): - testing = prop - foo = Foo() - - log = [] - subscribers.append(log.append) - foo.testing = u('Bar') - foo.testing = u('Foo') - self.assertEqual(len(log), 2) - event = log[1] - self.assertTrue(isinstance(event, FieldUpdatedEvent)) - self.assertEqual(event.inst, foo) - self.assertEqual(event.field, field) - self.assertEqual(event.old_value, u('Bar')) - self.assertEqual(event.new_value, u('Foo')) - - -class FieldPropertyStoredThroughFieldTests(_Base, _Integration): - - def _getTargetClass(self): - from zope.schema.fieldproperty import FieldPropertyStoredThroughField - return FieldPropertyStoredThroughField - - def test_ctor_defaults(self): - from zope.schema import Text - field = Text(__name__='testing') - cname = self._getTargetClass().__name__ - prop = self._makeOne(field) - self.assertTrue(isinstance(prop.field, field.__class__)) - self.assertFalse(prop.field is field) - self.assertEqual(prop.field.__name__, '__st_testing_st') - self.assertEqual(prop.__name__, '__st_testing_st') - self.assertEqual(getattr(prop, '_%s__name' % cname), 'testing') - self.assertEqual(prop.description, field.description) - self.assertEqual(prop.default, field.default) - self.assertEqual(prop.readonly, field.readonly) - self.assertEqual(prop.required, field.required) - - def test_ctor_explicit(self): - from zope.schema import Text - from zope.schema._compat import u - field = Text( - __name__='testing', - description=u('DESCRIPTION'), - default=u('DEFAULT'), - readonly=True, - required=True, - ) - cname = self._getTargetClass().__name__ - prop = self._makeOne(field, name='override') - self.assertTrue(isinstance(prop.field, field.__class__)) - self.assertFalse(prop.field is field) - self.assertEqual(prop.field.__name__, '__st_testing_st') - self.assertEqual(prop.__name__, '__st_testing_st') - self.assertEqual(getattr(prop, '_%s__name' % cname), 'override') - self.assertEqual(prop.description, field.description) - self.assertEqual(prop.default, field.default) - self.assertEqual(prop.readonly, field.readonly) - self.assertEqual(prop.required, field.required) - - def test_setValue(self): - from zope.schema import Text - - class Foo(object): - pass - - foo = Foo() - prop = self._makeOne() - field = Text(__name__='testing') - prop.setValue(foo, field, '123') - self.assertEqual(foo.testing, '123') - - def test_getValue_miss(self): - from zope.schema import Text - from zope.schema.fieldproperty import _marker - - class Foo(object): - pass - - foo = Foo() - prop = self._makeOne() - field = Text(__name__='testing') - value = prop.getValue(foo, field) - self.assertTrue(value is _marker) - - def test_getValue_hit(self): - from zope.schema import Text - - class Foo(object): - pass - - foo = Foo() - foo.testing = '123' - prop = self._makeOne() - field = Text(__name__='testing') - value = prop.getValue(foo, field) - self.assertEqual(value, '123') - - def test_queryValue_miss(self): - from zope.schema import Text - - class Foo(object): - pass - - foo = Foo() - prop = self._makeOne() - field = Text(__name__='testing') - default = object() - value = prop.queryValue(foo, field, default) - self.assertTrue(value is default) - - def test_queryValue_hit(self): - from zope.schema import Text - - class Foo(object): - pass - - foo = Foo() - foo.testing = '123' - prop = self._makeOne() - field = Text(__name__='testing') - default = object() - value = prop.queryValue(foo, field, default) - self.assertEqual(value, '123') - - def test___get___from_class(self): - prop = self._makeOne() - - class Foo(object): - testing = prop - - self.assertTrue(Foo.testing is prop) - - def test___get___from_instance_pseudo_field_wo_default(self): - class _Faux(object): - __name__ = 'Faux' - - def bind(self, other): - return self - - def query(self, inst, default): - return default - - prop = self._makeOne(_Faux(), 'nonesuch') - - class Foo(object): - testing = prop - - foo = Foo() - self.assertRaises(AttributeError, getattr, foo, 'testing') - - def test___get___from_instance_miss_uses_field_default(self): - prop = self._makeOne() - - class Foo(object): - testing = prop - - foo = Foo() - self.assertEqual(foo.testing, None) - - def test___get___from_instance_hit(self): - from zope.schema import Text - field = Text(__name__='testing') - prop = self._makeOne(field, name='other') - - class Foo(object): - testing = prop - - foo = Foo() - foo.__dict__['__st_testing_st'] = '456' - foo.other = '123' - self.assertEqual(foo.testing, '456') - - def test___set___not_readonly(self): - class _Faux(object): - __name__ = 'Faux' - readonly = False - default = '456' - - def query(self, inst, default): - return default - - def bind(self, other): - return self - - def set(self, inst, value): - setattr(inst, 'faux', value) - - faux = _Faux() - _validated = [] - faux.validate = _validated.append - prop = self._makeOne(faux, 'testing') - - class Foo(object): - testing = prop - - foo = Foo() - foo.testing = '123' - self.assertEqual(foo.__dict__['faux'], '123') - self.assertEqual(_validated, ['123']) - - def test___set___w_readonly_not_already_set(self): - class _Faux(object): - __name__ = 'Faux' - readonly = True - default = '456' - - def bind(self, other): - return self - - def query(self, inst, default): - return default - - def set(self, inst, value): - if self.readonly: - raise ValueError - setattr(inst, 'faux', value) - - faux = _Faux() - _validated = [] - faux.validate = _validated.append - prop = self._makeOne(faux, 'testing') - - class Foo(object): - testing = prop - - foo = Foo() - foo.testing = '123' - self.assertEqual(foo.__dict__['faux'], '123') - self.assertEqual(_validated, ['123']) - - def test___set___w_readonly_and_already_set(self): - class _Faux(object): - __name__ = 'Faux' - readonly = True - default = '456' - - def bind(self, other): - return self - - def query(self, inst, default): - return '789' - - faux = _Faux() - _validated = [] - faux.validate = _validated.append - prop = self._makeOne(faux, 'testing') - - class Foo(object): - testing = prop - - foo = Foo() - foo.__dict__['testing'] = '789' - self.assertRaises(ValueError, setattr, foo, 'testing', '123') - - def test_field_event_update(self): - from zope.schema import Text - from zope.schema._compat import u - from zope.event import subscribers - from zope.schema.fieldproperty import FieldUpdatedEvent - field = Text( - __name__='testing', - description=u('DESCRIPTION'), - default=u('DEFAULT'), - required=True, - ) - prop = self._makeOne(field=field) - - class Foo(object): - testing = prop - foo = Foo() - - log = [] - subscribers.append(log.append) - foo.testing = u('Bar') - foo.testing = u('Foo') - self.assertEqual(len(log), 2) - event = log[1] - self.assertTrue(isinstance(event, FieldUpdatedEvent)) - self.assertEqual(event.inst, foo) - self.assertEqual(event.field, field) - self.assertEqual(event.old_value, u('Bar')) - self.assertEqual(event.new_value, u('Foo')) - - def test_field_event(self): - # fieldproperties are everywhere including in field themselfs - # so event are triggered - from zope.schema import Text - from zope.schema._compat import u - from zope.event import subscribers - from zope.schema.fieldproperty import FieldUpdatedEvent - log = [] - subscribers.append(log.append) - self.assertEqual(log, []) - field = Text( - __name__='testing', - description=u('DESCRIPTION'), - default=u('DEFAULT'), - readonly=True, - required=True, - ) - self.assertEqual(len(log), 6) - # these are fieldproperties in the field - self.assertEqual( - [ev.field.__name__ for ev in log], - ['min_length', 'max_length', 'title', 'description', 'required', 'readonly']) - event = log[0] - self.assertTrue(isinstance(event, FieldUpdatedEvent)) - self.assertEqual(event.inst, field) - self.assertEqual(event.old_value, 0) - self.assertEqual(event.new_value, 0) - - -def _getSchema(): - from zope.interface import Interface - from zope.schema import Bytes - from zope.schema import Float - from zope.schema import Text - from zope.schema._compat import b - from zope.schema._compat import u - - class Schema(Interface): - title = Text(description=u("Short summary"), - default=u('say something')) - weight = Float(min=0.0) - code = Bytes(min_length=6, max_length=6, default=b('xxxxxx')) - date = Float(title=u('Date'), readonly=True) - - return Schema - - -class CreateFieldPropertiesTests(unittest.TestCase): - """Testing ..fieldproperty.createFieldProperties.""" - - def test_creates_fieldproperties_on_class(self): - from zope.schema.fieldproperty import createFieldProperties - from zope.schema.fieldproperty import FieldProperty - schema = _getSchema() - - class Dummy(object): - createFieldProperties(schema) - - self.assertTrue(isinstance(Dummy.title, FieldProperty)) - self.assertTrue(isinstance(Dummy.date, FieldProperty)) - self.assertTrue(Dummy.date._FieldProperty__field is schema['date']) - - def test_fields_in_omit_are_not_created_on_class(self): - from zope.schema.fieldproperty import createFieldProperties - - class Dummy(object): - createFieldProperties(_getSchema(), omit=['date', 'code']) - - self.assertFalse(hasattr(Dummy, 'date')) - self.assertFalse(hasattr(Dummy, 'code')) - self.assertTrue(hasattr(Dummy, 'title')) - - -def test_suite(): - return unittest.TestSuite(( - unittest.makeSuite(FieldPropertyTests), - unittest.makeSuite(FieldPropertyStoredThroughFieldTests), - unittest.makeSuite(CreateFieldPropertiesTests), - )) diff --git a/zope/schema/tests/test_interfaces.py b/zope/schema/tests/test_interfaces.py deleted file mode 100644 index dc3e7f6c..00000000 --- a/zope/schema/tests/test_interfaces.py +++ /dev/null @@ -1,99 +0,0 @@ -import unittest - - -class Test__is_field(unittest.TestCase): - - def _callFUT(self, value): - from zope.schema.interfaces import _is_field - return _is_field(value) - - def test_non_fields(self): - from zope.schema._compat import b - from zope.schema._compat import u - self.assertEqual(self._callFUT(None), False) - self.assertEqual(self._callFUT(0), False) - self.assertEqual(self._callFUT(0.0), False) - self.assertEqual(self._callFUT(True), False) - self.assertEqual(self._callFUT(b('')), False) - self.assertEqual(self._callFUT(u('')), False) - self.assertEqual(self._callFUT(()), False) - self.assertEqual(self._callFUT([]), False) - self.assertEqual(self._callFUT({}), False) - self.assertEqual(self._callFUT(set()), False) - self.assertEqual(self._callFUT(frozenset()), False) - self.assertEqual(self._callFUT(object()), False) - - def test_w_normal_fields(self): - from zope.schema import Text - from zope.schema import Bytes - from zope.schema import Int - from zope.schema import Float - from zope.schema import Decimal - self.assertEqual(self._callFUT(Text()), True) - self.assertEqual(self._callFUT(Bytes()), True) - self.assertEqual(self._callFUT(Int()), True) - self.assertEqual(self._callFUT(Float()), True) - self.assertEqual(self._callFUT(Decimal()), True) - - def test_w_explicitly_provided(self): - from zope.interface import directlyProvides - from zope.schema.interfaces import IField - - class Foo(object): - pass - - foo = Foo() - self.assertEqual(self._callFUT(foo), False) - directlyProvides(foo, IField) - self.assertEqual(self._callFUT(foo), True) - - -class Test__fields(unittest.TestCase): - - def _callFUT(self, values): - from zope.schema.interfaces import _fields - return _fields(values) - - def test_empty_containers(self): - self.assertEqual(self._callFUT(()), True) - self.assertEqual(self._callFUT([]), True) - - def test_w_non_fields(self): - self.assertEqual(self._callFUT([None]), False) - self.assertEqual(self._callFUT(['']), False) - self.assertEqual(self._callFUT([object()]), False) - - def test_w_fields(self): - from zope.schema import Text - from zope.schema import Bytes - from zope.schema import Int - from zope.schema import Float - from zope.schema import Decimal - self.assertEqual(self._callFUT([Text()]), True) - self.assertEqual(self._callFUT([Bytes()]), True) - self.assertEqual(self._callFUT([Int()]), True) - self.assertEqual(self._callFUT([Float()]), True) - self.assertEqual(self._callFUT([Decimal()]), True) - self.assertEqual( - self._callFUT([Text(), Bytes(), Int(), Float(), Decimal()]), - True - ) - - def test_w_mixed(self): - from zope.schema import Text - from zope.schema import Bytes - from zope.schema import Int - from zope.schema import Float - from zope.schema import Decimal - self.assertEqual(self._callFUT([Text(), 0]), False) - self.assertEqual( - self._callFUT([Text(), Bytes(), Int(), Float(), Decimal(), 0]), - False - ) - - -def test_suite(): - return unittest.TestSuite(( - unittest.makeSuite(Test__is_field), - unittest.makeSuite(Test__fields), - )) diff --git a/zope/schema/tests/test_schema.py b/zope/schema/tests/test_schema.py deleted file mode 100644 index 01ba5e78..00000000 --- a/zope/schema/tests/test_schema.py +++ /dev/null @@ -1,276 +0,0 @@ -############################################################################## -# -# Copyright (c) 2001, 2002 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Schema field tests -""" -import unittest - - -def _makeSchema(): - from zope.schema._compat import b - from zope.schema._compat import u - from zope.interface import Interface - from zope.schema import Bytes - - class ISchemaTest(Interface): - title = Bytes( - title=u("Title"), - description=u("Title"), - default=b(""), - required=True) - description = Bytes( - title=u("Description"), - description=u("Description"), - default=b(""), - required=True) - spam = Bytes( - title=u("Spam"), - description=u("Spam"), - default=b(""), - required=True) - return ISchemaTest - - -def _makeDerivedSchema(base=None): - from zope.schema._compat import b - from zope.schema._compat import u - from zope.schema import Bytes - if base is None: - base = _makeSchema() - - class ISchemaTestSubclass(base): - foo = Bytes( - title=u('Foo'), - description=u('Fooness'), - default=b(""), - required=False) - return ISchemaTestSubclass - - -class Test_getFields(unittest.TestCase): - - def _callFUT(self, schema): - from zope.schema import getFields - return getFields(schema) - - def test_simple(self): - fields = self._callFUT(_makeSchema()) - - self.assertTrue('title' in fields) - self.assertTrue('description' in fields) - self.assertTrue('spam' in fields) - - # test whether getName() has the right value - for key, value in fields.items(): - self.assertEqual(key, value.getName()) - - def test_derived(self): - fields = self._callFUT(_makeDerivedSchema()) - - self.assertTrue('title' in fields) - self.assertTrue('description' in fields) - self.assertTrue('spam' in fields) - self.assertTrue('foo' in fields) - - # test whether getName() has the right value - for key, value in fields.items(): - self.assertEqual(key, value.getName()) - - -class Test_getFieldsInOrder(unittest.TestCase): - - def _callFUT(self, schema): - from zope.schema import getFieldsInOrder - return getFieldsInOrder(schema) - - def test_simple(self): - fields = self._callFUT(_makeSchema()) - field_names = [name for name, field in fields] - self.assertEqual(field_names, ['title', 'description', 'spam']) - for key, value in fields: - self.assertEqual(key, value.getName()) - - def test_derived(self): - fields = self._callFUT(_makeDerivedSchema()) - field_names = [name for name, field in fields] - self.assertEqual(field_names, ['title', 'description', 'spam', 'foo']) - for key, value in fields: - self.assertEqual(key, value.getName()) - - -class Test_getFieldNames(unittest.TestCase): - - def _callFUT(self, schema): - from zope.schema import getFieldNames - return getFieldNames(schema) - - def test_simple(self): - names = self._callFUT(_makeSchema()) - self.assertEqual(len(names), 3) - self.assertTrue('title' in names) - self.assertTrue('description' in names) - self.assertTrue('spam' in names) - - def test_derived(self): - names = self._callFUT(_makeDerivedSchema()) - self.assertEqual(len(names), 4) - self.assertTrue('title' in names) - self.assertTrue('description' in names) - self.assertTrue('spam' in names) - self.assertTrue('foo' in names) - - -class Test_getFieldNamesInOrder(unittest.TestCase): - - def _callFUT(self, schema): - from zope.schema import getFieldNamesInOrder - return getFieldNamesInOrder(schema) - - def test_simple(self): - names = self._callFUT(_makeSchema()) - self.assertEqual(names, ['title', 'description', 'spam']) - - def test_derived(self): - names = self._callFUT(_makeDerivedSchema()) - self.assertEqual(names, ['title', 'description', 'spam', 'foo']) - - -class Test_getValidationErrors(unittest.TestCase): - - def _callFUT(self, schema, object): - from zope.schema import getValidationErrors - return getValidationErrors(schema, object) - - def test_schema(self): - from zope.interface import Interface - - class IEmpty(Interface): - pass - - errors = self._callFUT(IEmpty, object()) - self.assertEqual(len(errors), 0) - - def test_schema_with_field_errors(self): - from zope.interface import Interface - from zope.schema import Text - from zope.schema.interfaces import SchemaNotFullyImplemented - - class IWithRequired(Interface): - must = Text(required=True) - - errors = self._callFUT(IWithRequired, object()) - self.assertEqual(len(errors), 1) - self.assertEqual(errors[0][0], 'must') - self.assertEqual(errors[0][1].__class__, SchemaNotFullyImplemented) - - def test_schema_with_invariant_errors(self): - from zope.interface import Interface - from zope.interface import invariant - from zope.interface.exceptions import Invalid - - class IWithFailingInvariant(Interface): - @invariant - def _epic_fail(obj): - raise Invalid('testing') - - errors = self._callFUT(IWithFailingInvariant, object()) - self.assertEqual(len(errors), 1) - self.assertEqual(errors[0][0], None) - self.assertEqual(errors[0][1].__class__, Invalid) - - def test_schema_with_invariant_ok(self): - from zope.interface import Interface - from zope.interface import invariant - - class IWithPassingInvariant(Interface): - @invariant - def _hall_pass(obj): - pass - - errors = self._callFUT(IWithPassingInvariant, object()) - self.assertEqual(len(errors), 0) - - -class Test_getSchemaValidationErrors(unittest.TestCase): - - def _callFUT(self, schema, object): - from zope.schema import getSchemaValidationErrors - return getSchemaValidationErrors(schema, object) - - def test_schema_wo_fields(self): - from zope.interface import Interface - from zope.interface import Attribute - - class INoFields(Interface): - def method(): - pass - attr = Attribute('ignoreme') - - errors = self._callFUT(INoFields, object()) - self.assertEqual(len(errors), 0) - - def test_schema_with_fields_ok(self): - from zope.interface import Interface - from zope.schema import Text - from zope.schema._compat import u - - class IWithFields(Interface): - foo = Text() - bar = Text() - - class Obj(object): - foo = u('Foo') - bar = u('Bar') - - errors = self._callFUT(IWithFields, Obj()) - self.assertEqual(len(errors), 0) - - def test_schema_with_missing_field(self): - from zope.interface import Interface - from zope.schema import Text - from zope.schema.interfaces import SchemaNotFullyImplemented - - class IWithRequired(Interface): - must = Text(required=True) - - errors = self._callFUT(IWithRequired, object()) - self.assertEqual(len(errors), 1) - self.assertEqual(errors[0][0], 'must') - self.assertEqual(errors[0][1].__class__, SchemaNotFullyImplemented) - - def test_schema_with_invalid_field(self): - from zope.interface import Interface - from zope.schema import Int - from zope.schema.interfaces import TooSmall - - class IWithMinium(Interface): - value = Int(required=True, min=0) - - class Obj(object): - value = -1 - - errors = self._callFUT(IWithMinium, Obj()) - self.assertEqual(len(errors), 1) - self.assertEqual(errors[0][0], 'value') - self.assertEqual(errors[0][1].__class__, TooSmall) - - -def test_suite(): - return unittest.TestSuite(( - unittest.makeSuite(Test_getFields), - unittest.makeSuite(Test_getFieldsInOrder), - unittest.makeSuite(Test_getFieldNames), - unittest.makeSuite(Test_getFieldNamesInOrder), - unittest.makeSuite(Test_getValidationErrors), - unittest.makeSuite(Test_getSchemaValidationErrors), - )) diff --git a/zope/schema/tests/test_states.py b/zope/schema/tests/test_states.py deleted file mode 100644 index 0bdbc85c..00000000 --- a/zope/schema/tests/test_states.py +++ /dev/null @@ -1,106 +0,0 @@ -############################################################################## -# -# Copyright (c) 2003 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Tests of the states example. -""" -import unittest - - -class StateSelectionTest(unittest.TestCase): - - def setUp(self): - from zope.schema.vocabulary import _clear - from zope.schema.vocabulary import getVocabularyRegistry - from zope.schema.tests.states import StateVocabulary - _clear() - vr = getVocabularyRegistry() - vr.register("states", StateVocabulary) - - def tearDown(self): - from zope.schema.vocabulary import _clear - _clear() - - def _makeSchema(self): - from zope.schema._compat import u - from zope.interface import Interface - from zope.schema import Choice - from zope.schema.tests.states import StateVocabulary - - class IBirthInfo(Interface): - state1 = Choice( - title=u('State of Birth'), - description=u('The state in which you were born.'), - vocabulary="states", - default="AL", - ) - state2 = Choice( - title=u('State of Birth'), - description=u('The state in which you were born.'), - vocabulary="states", - default="AL", - ) - state3 = Choice( - title=u('Favorite State'), - description=u('The state you like the most.'), - vocabulary=StateVocabulary(), - ) - state4 = Choice( - title=u("Name"), - description=u("The name of your new state"), - vocabulary="states", - ) - return IBirthInfo - - def test_default_presentation(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IVocabulary - schema = self._makeSchema() - field = schema.getDescriptionFor("state1") - bound = field.bind(object()) - self.assertTrue(verifyObject(IVocabulary, bound.vocabulary)) - self.assertEqual(bound.vocabulary.getTerm("VA").title, "Virginia") - - def test_contains(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IVocabulary - from zope.schema.tests.states import StateVocabulary - vocab = StateVocabulary() - self.assertTrue(verifyObject(IVocabulary, vocab)) - count = 0 - L = list(vocab) - for term in L: - count += 1 - self.assertTrue(term.value in vocab) - self.assertEqual(count, len(vocab)) - # make sure we get the same values the second time around: - L = [term.value for term in L] - L.sort() - L2 = [term.value for term in vocab] - L2.sort() - self.assertEqual(L, L2) - - def test_prebound_vocabulary(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IVocabulary - schema = self._makeSchema() - field = schema.getDescriptionFor("state3") - bound = field.bind(None) - self.assertTrue(bound.vocabularyName is None) - self.assertTrue(verifyObject(IVocabulary, bound.vocabulary)) - self.assertTrue("AL" in bound.vocabulary) - - -def test_suite(): - return unittest.TestSuite(( - unittest.makeSuite(StateSelectionTest), - )) diff --git a/zope/schema/tests/test_vocabulary.py b/zope/schema/tests/test_vocabulary.py deleted file mode 100644 index 6ee5a921..00000000 --- a/zope/schema/tests/test_vocabulary.py +++ /dev/null @@ -1,642 +0,0 @@ -############################################################################## -# -# Copyright (c) 2003 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Test of the Vocabulary and related support APIs. -""" -import unittest - - -class SimpleTermTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema.vocabulary import SimpleTerm - return SimpleTerm - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_ITokenizedTerm(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import ITokenizedTerm - verifyClass(ITokenizedTerm, self._getTargetClass()) - - def test_instance_conforms_to_ITokenizedTerm(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import ITokenizedTerm - verifyObject(ITokenizedTerm, self._makeOne('VALUE')) - - def test_ctor_defaults(self): - from zope.schema.interfaces import ITitledTokenizedTerm - term = self._makeOne('VALUE') - self.assertEqual(term.value, 'VALUE') - self.assertEqual(term.token, 'VALUE') - self.assertEqual(term.title, None) - self.assertFalse(ITitledTokenizedTerm.providedBy(term)) - - def test_ctor_explicit(self): - from zope.schema.interfaces import ITitledTokenizedTerm - term = self._makeOne('TERM', 'TOKEN', 'TITLE') - self.assertEqual(term.value, 'TERM') - self.assertEqual(term.token, 'TOKEN') - self.assertEqual(term.title, 'TITLE') - self.assertTrue(ITitledTokenizedTerm.providedBy(term)) - - def test_bytes_value(self): - from zope.schema.interfaces import ITitledTokenizedTerm - term = self._makeOne(b'term') - self.assertEqual(term.value, b'term') - self.assertEqual(term.token, 'term') - self.assertFalse(ITitledTokenizedTerm.providedBy(term)) - - -class SimpleVocabularyTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema.vocabulary import SimpleVocabulary - return SimpleVocabulary - - def _makeOne(self, *args, **kw): - return self._getTargetClass()(*args, **kw) - - def test_class_conforms_to_IVocabularyTokenized(self): - from zope.interface.verify import verifyClass - from zope.schema.interfaces import IVocabularyTokenized - verifyClass(IVocabularyTokenized, self._getTargetClass()) - - def test_instance_conforms_to_IVocabularyTokenized(self): - from zope.interface.verify import verifyObject - from zope.schema.interfaces import IVocabularyTokenized - verifyObject(IVocabularyTokenized, self._makeOne(())) - - def test_ctor_additional_interfaces(self): - from zope.interface import Interface - from zope.schema.vocabulary import SimpleTerm - - class IStupid(Interface): - pass - - VALUES = [1, 4, 2, 9] - vocabulary = self._makeOne([SimpleTerm(x) for x in VALUES], IStupid) - self.assertTrue(IStupid.providedBy(vocabulary)) - self.assertEqual(len(vocabulary), len(VALUES)) - for value, term in zip(VALUES, vocabulary): - self.assertEqual(term.value, value) - for value in VALUES: - self.assertTrue(value in vocabulary) - self.assertFalse('ABC' in vocabulary) - for term in vocabulary: - self.assertTrue(vocabulary.getTerm(term.value) is term) - self.assertTrue(vocabulary.getTermByToken(term.token) is term) - - def test_fromValues(self): - from zope.interface import Interface - from zope.schema.interfaces import ITokenizedTerm - - class IStupid(Interface): - pass - - VALUES = [1, 4, 2, 9] - vocabulary = self._getTargetClass().fromValues(VALUES) - self.assertEqual(len(vocabulary), len(VALUES)) - for value, term in zip(VALUES, vocabulary): - self.assertTrue(ITokenizedTerm.providedBy(term)) - self.assertEqual(term.value, value) - for value in VALUES: - self.assertTrue(value in vocabulary) - - def test_fromItems(self): - from zope.interface import Interface - from zope.schema.interfaces import ITokenizedTerm - - class IStupid(Interface): - pass - - ITEMS = [('one', 1), ('two', 2), ('three', 3), ('fore!', 4)] - vocabulary = self._getTargetClass().fromItems(ITEMS) - self.assertEqual(len(vocabulary), len(ITEMS)) - for item, term in zip(ITEMS, vocabulary): - self.assertTrue(ITokenizedTerm.providedBy(term)) - self.assertEqual(term.token, item[0]) - self.assertEqual(term.value, item[1]) - for item in ITEMS: - self.assertTrue(item[1] in vocabulary) - - def test_createTerm(self): - from zope.schema.vocabulary import SimpleTerm - VALUES = [1, 4, 2, 9] - for value in VALUES: - term = self._getTargetClass().createTerm(value) - self.assertTrue(isinstance(term, SimpleTerm)) - self.assertEqual(term.value, value) - self.assertEqual(term.token, str(value)) - - def test_getTerm_miss(self): - vocabulary = self._makeOne(()) - self.assertRaises(LookupError, vocabulary.getTerm, 'nonesuch') - - def test_getTermByToken_miss(self): - vocabulary = self._makeOne(()) - self.assertRaises(LookupError, vocabulary.getTermByToken, 'nonesuch') - - def test_nonunique_tokens(self): - klass = self._getTargetClass() - self.assertRaises(ValueError, klass.fromValues, [2, '2']) - self.assertRaises( - ValueError, - klass.fromItems, - [(1, 'one'), ('1', 'another one')] - ) - self.assertRaises( - ValueError, - klass.fromItems, - [(0, 'one'), (1, 'one')] - ) - - def test_nonunique_tokens_swallow(self): - klass = self._getTargetClass() - items = [(0, 'one'), (1, 'one')] - terms = [klass.createTerm(value, token) for (token, value) in items] - vocab = self._getTargetClass()(terms, swallow_duplicates=True) - self.assertEqual(vocab.getTerm('one').token, '1') - - def test_nonunique_token_message(self): - try: - self._getTargetClass().fromValues([2, '2']) - except ValueError as e: - self.assertEqual(str(e), "term tokens must be unique: '2'") - - def test_nonunique_token_messages(self): - try: - self._getTargetClass().fromItems([(0, 'one'), (1, 'one')]) - except ValueError as e: - self.assertEqual(str(e), "term values must be unique: 'one'") - - def test_overriding_createTerm(self): - class MyTerm(object): - def __init__(self, value): - self.value = value - self.token = repr(value) - self.nextvalue = value + 1 - - class MyVocabulary(self._getTargetClass()): - def createTerm(cls, value): - return MyTerm(value) - createTerm = classmethod(createTerm) - - vocab = MyVocabulary.fromValues([1, 2, 3]) - for term in vocab: - self.assertEqual(term.value + 1, term.nextvalue) - - -# Test _createTermTree via TreeVocabulary.fromDict - - -class TreeVocabularyTests(unittest.TestCase): - - def _getTargetClass(self): - from zope.schema.vocabulary import TreeVocabulary - return TreeVocabulary - - def tree_vocab_2(self): - region_tree = { - ('regions', 'Regions'): { - ('aut', 'Austria'): { - ('tyr', 'Tyrol'): { - ('auss', 'Ausserfern'): {}, - } - }, - ('ger', 'Germany'): { - ('bav', 'Bavaria'): {} - }, - } - } - return self._getTargetClass().fromDict(region_tree) - - def business_tree(self): - return { - ('services', 'services', 'Services'): { - ('reservations', 'reservations', 'Reservations'): { - ('res_host', 'res_host', 'Res Host'): {}, - ('res_gui', 'res_gui', 'Res GUI'): {}, - }, - ('check_in', 'check_in', 'Check-in'): { - ('dcs_host', 'dcs_host', 'DCS Host'): {}, - }, - }, - ('infrastructure', 'infrastructure', 'Infrastructure'): { - ('communication_network', 'communication_network', - 'Communication/Network'): { - ('messaging', 'messaging', 'Messaging'): {}, - }, - ('data_transaction', 'data_transaction', - 'Data/Transaction'): { - ('database', 'database', 'Database'): {}, - }, - ('security', 'security', 'Security'): {}, - }, - } - - def tree_vocab_3(self): - return self._getTargetClass().fromDict(self.business_tree()) - - def test_implementation(self): - from zope.interface.verify import verifyObject - from zope.interface.common.mapping import IEnumerableMapping - from zope.schema.interfaces import ITreeVocabulary - from zope.schema.interfaces import IVocabulary - from zope.schema.interfaces import IVocabularyTokenized - for v in [self.tree_vocab_2(), self.tree_vocab_3()]: - self.assertTrue(verifyObject(IEnumerableMapping, v)) - self.assertTrue(verifyObject(IVocabulary, v)) - self.assertTrue(verifyObject(IVocabularyTokenized, v)) - self.assertTrue(verifyObject(ITreeVocabulary, v)) - - def test_additional_interfaces(self): - from zope.interface import Interface - - class IStupid(Interface): - pass - - v = self._getTargetClass().fromDict({('one', '1'): {}}, IStupid) - self.assertTrue(IStupid.providedBy(v)) - - def test_ordering(self): - #The TreeVocabulary makes use of an OrderedDict to store it's - #internal tree representation. - # - #Check that they keys are indeed oredered. - from zope.schema._compat import OrderedDict - - d = { - (1, 'new_york', 'New York'): { - (2, 'ny_albany', 'Albany'): {}, - (3, 'ny_new_york', 'New York'): {}, - }, - (4, 'california', 'California'): { - (5, 'ca_los_angeles', 'Los Angeles'): {}, - (6, 'ca_san_francisco', 'San Francisco'): {}, - }, - (7, 'texas', 'Texas'): {}, - (8, 'florida', 'Florida'): {}, - (9, 'utah', 'Utah'): {}, - } - dict_ = OrderedDict(sorted(d.items(), key=lambda t: t[0])) - vocab = self._getTargetClass().fromDict(dict_) - # Test keys - self.assertEqual( - [k.token for k in vocab.keys()], - ['1', '4', '7', '8', '9'] - ) - # Test __iter__ - self.assertEqual( - [k.token for k in vocab], - ['1', '4', '7', '8', '9'] - ) - - self.assertEqual( - [k.token for k in vocab[[k for k in vocab.keys()][0]].keys()], - ['2', '3'] - ) - self.assertEqual( - [k.token for k in vocab[[k for k in vocab.keys()][1]].keys()], - ['5', '6'] - ) - - def test_indexes(self): - # TreeVocabulary creates three indexes for quick lookups, - # term_by_value, term_by_value and path_by_value. - tv2 = self.tree_vocab_2() - self.assertEqual( - [k for k in sorted(tv2.term_by_value.keys())], - ['Ausserfern', 'Austria', 'Bavaria', 'Germany', 'Regions', 'Tyrol'] - ) - - self.assertEqual( - [k for k in sorted(tv2.term_by_token.keys())], - ['auss', 'aut', 'bav', 'ger', 'regions', 'tyr'] - ) - - self.assertEqual( - [k for k in sorted(tv2.path_by_value.keys())], - ['Ausserfern', 'Austria', 'Bavaria', 'Germany', 'Regions', 'Tyrol'] - ) - - self.assertEqual( - [k for k in sorted(tv2.path_by_value.values())], - [ - ['Regions'], - ['Regions', 'Austria'], - ['Regions', 'Austria', 'Tyrol'], - ['Regions', 'Austria', 'Tyrol', 'Ausserfern'], - ['Regions', 'Germany'], - ['Regions', 'Germany', 'Bavaria'], - ] - ) - - self.assertEqual( - [k for k in sorted(self.tree_vocab_3().term_by_value.keys())], - [ - 'check_in', - 'communication_network', - 'data_transaction', - 'database', - 'dcs_host', - 'infrastructure', - 'messaging', - 'res_gui', - 'res_host', - 'reservations', - 'security', - 'services', - ] - ) - - self.assertEqual( - [k for k in sorted(self.tree_vocab_3().term_by_token.keys())], - [ - 'check_in', - 'communication_network', - 'data_transaction', - 'database', - 'dcs_host', - 'infrastructure', - 'messaging', - 'res_gui', - 'res_host', - 'reservations', - 'security', - 'services', - ] - ) - - self.assertEqual( - [k for k in sorted(self.tree_vocab_3().path_by_value.values())], - [ - ['infrastructure'], - ['infrastructure', 'communication_network'], - ['infrastructure', 'communication_network', 'messaging'], - ['infrastructure', 'data_transaction'], - ['infrastructure', 'data_transaction', 'database'], - ['infrastructure', 'security'], - ['services'], - ['services', 'check_in'], - ['services', 'check_in', 'dcs_host'], - ['services', 'reservations'], - ['services', 'reservations', 'res_gui'], - ['services', 'reservations', 'res_host'], - ] - ) - - def test_termpath(self): - tv2 = self.tree_vocab_2() - tv3 = self.tree_vocab_3() - self.assertEqual( - tv2.getTermPath('Bavaria'), - ['Regions', 'Germany', 'Bavaria'] - ) - self.assertEqual( - tv2.getTermPath('Austria'), - ['Regions', 'Austria'] - ) - self.assertEqual( - tv2.getTermPath('Ausserfern'), - ['Regions', 'Austria', 'Tyrol', 'Ausserfern'] - ) - self.assertEqual( - tv2.getTermPath('Non-existent'), - [] - ) - self.assertEqual( - tv3.getTermPath('database'), - ["infrastructure", "data_transaction", "database"] - ) - - def test_len(self): - # len returns the number of all nodes in the dict - self.assertEqual(len(self.tree_vocab_2()), 1) - self.assertEqual(len(self.tree_vocab_3()), 2) - - def test_contains(self): - tv2 = self.tree_vocab_2() - self.assertTrue('Regions' in tv2 and - 'Austria' in tv2 and - 'Bavaria' in tv2) - - self.assertTrue('bav' not in tv2) - self.assertTrue('foo' not in tv2) - self.assertTrue({} not in tv2) # not hashable - - tv3 = self.tree_vocab_3() - self.assertTrue('database' in tv3 and - 'security' in tv3 and - 'services' in tv3) - - self.assertTrue('Services' not in tv3) - self.assertTrue('Database' not in tv3) - self.assertTrue({} not in tv3) # not hashable - - def test_values_and_items(self): - for v in (self.tree_vocab_2(), self.tree_vocab_3()): - for term in v: - self.assertEqual([i for i in v.values()], - [i for i in v._terms.values()]) - self.assertEqual([i for i in v.items()], - [i for i in v._terms.items()]) - - def test_get(self): - for v in [self.tree_vocab_2(), self.tree_vocab_3()]: - for key, value in v.items(): - self.assertEqual(v.get(key), value) - self.assertEqual(v[key], value) - - def test_get_term(self): - for v in (self.tree_vocab_2(), self.tree_vocab_3()): - for term in v: - self.assertTrue(v.getTerm(term.value) is term) - self.assertTrue(v.getTermByToken(term.token) is term) - self.assertRaises(LookupError, v.getTerm, 'non-present-value') - self.assertRaises(LookupError, - v.getTermByToken, 'non-present-token') - - def test_nonunique_values_and_tokens(self): - # Since we do term and value lookups, all terms' values and tokens - # must be unique. This rule applies recursively. - self.assertRaises( - ValueError, self._getTargetClass().fromDict, - { - ('one', '1'): {}, - ('two', '1'): {}, - }) - self.assertRaises( - ValueError, self._getTargetClass().fromDict, - { - ('one', '1'): {}, - ('one', '2'): {}, - }) - # Even nested tokens must be unique. - self.assertRaises( - ValueError, self._getTargetClass().fromDict, - { - ('new_york', 'New York'): { - ('albany', 'Albany'): {}, - ('new_york', 'New York'): {}, - }, - }) - # The same applies to nested values. - self.assertRaises( - ValueError, self._getTargetClass().fromDict, - { - ('1', 'new_york'): { - ('2', 'albany'): {}, - ('3', 'new_york'): {}, - }, - }) - # The title attribute does however not have to be unique. - self._getTargetClass().fromDict({ - ('1', 'new_york', 'New York'): { - ('2', 'ny_albany', 'Albany'): {}, - ('3', 'ny_new_york', 'New York'): {}, - }, - }) - self._getTargetClass().fromDict({ - ('one', '1', 'One'): {}, - ('two', '2', 'One'): {}, - }) - - def test_nonunique_value_message(self): - try: - self._getTargetClass().fromDict({ - ('one', '1'): {}, - ('two', '1'): {}, - }) - except ValueError as e: - self.assertEqual(str(e), "Term values must be unique: '1'") - - def test_nonunique_token_message(self): - try: - self._getTargetClass().fromDict({ - ('one', '1'): {}, - ('one', '2'): {}, - }) - except ValueError as e: - self.assertEqual(str(e), "Term tokens must be unique: 'one'") - - def test_recursive_methods(self): - #Test the _createTermTree and _getPathToTreeNode methods - from zope.schema.vocabulary import _createTermTree - tree = _createTermTree({}, self.business_tree()) - vocab = self._getTargetClass().fromDict(self.business_tree()) - - term_path = vocab._getPathToTreeNode(tree, "infrastructure") - vocab_path = vocab._getPathToTreeNode(vocab, "infrastructure") - self.assertEqual(term_path, vocab_path) - self.assertEqual(term_path, ["infrastructure"]) - - term_path = vocab._getPathToTreeNode(tree, "security") - vocab_path = vocab._getPathToTreeNode(vocab, "security") - self.assertEqual(term_path, vocab_path) - self.assertEqual(term_path, ["infrastructure", "security"]) - - term_path = vocab._getPathToTreeNode(tree, "database") - vocab_path = vocab._getPathToTreeNode(vocab, "database") - self.assertEqual(term_path, vocab_path) - self.assertEqual(term_path, - ["infrastructure", "data_transaction", "database"]) - - term_path = vocab._getPathToTreeNode(tree, "dcs_host") - vocab_path = vocab._getPathToTreeNode(vocab, "dcs_host") - self.assertEqual(term_path, vocab_path) - self.assertEqual(term_path, ["services", "check_in", "dcs_host"]) - - term_path = vocab._getPathToTreeNode(tree, "dummy") - vocab_path = vocab._getPathToTreeNode(vocab, "dummy") - self.assertEqual(term_path, vocab_path) - self.assertEqual(term_path, []) - - -class RegistryTests(unittest.TestCase): - #Tests of the simple vocabulary and presentation registries. - - def setUp(self): - from zope.schema.vocabulary import _clear - _clear() - - def tearDown(self): - from zope.schema.vocabulary import _clear - _clear() - - def test_setVocabularyRegistry(self): - from zope.schema.vocabulary import setVocabularyRegistry - from zope.schema.vocabulary import getVocabularyRegistry - r = _makeDummyRegistry() - setVocabularyRegistry(r) - self.assertTrue(getVocabularyRegistry() is r) - - def test_getVocabularyRegistry(self): - from zope.schema.interfaces import IVocabularyRegistry - from zope.schema.vocabulary import getVocabularyRegistry - r = getVocabularyRegistry() - self.assertTrue(IVocabularyRegistry.providedBy(r)) - - # TODO: still need to test the default implementation - - -def _makeSampleVocabulary(): - from zope.interface import implementer - from zope.schema.interfaces import IVocabulary - - class SampleTerm(object): - pass - - @implementer(IVocabulary) - class SampleVocabulary(object): - - def __iter__(self): - return iter([self.getTerm(x) for x in range(0, 10)]) - - def __contains__(self, value): - return 0 <= value < 10 - - def __len__(self): - return 10 - - def getTerm(self, value): - if value in self: - t = SampleTerm() - t.value = value - t.double = 2 * value - return t - raise LookupError("no such value: %r" % value) - - return SampleVocabulary() - - -def _makeDummyRegistry(): - from zope.schema.vocabulary import VocabularyRegistry - - class DummyRegistry(VocabularyRegistry): - def get(self, object, name): - v = _makeSampleVocabulary() - v.object = object - v.name = name - return v - return DummyRegistry() - - -def test_suite(): - return unittest.TestSuite(( - unittest.makeSuite(SimpleTermTests), - unittest.makeSuite(SimpleVocabularyTests), - unittest.makeSuite(TreeVocabularyTests), - unittest.makeSuite(RegistryTests), - )) diff --git a/zope/schema/vocabulary.py b/zope/schema/vocabulary.py deleted file mode 100644 index 8e12a1ae..00000000 --- a/zope/schema/vocabulary.py +++ /dev/null @@ -1,409 +0,0 @@ -############################################################################## -# -# Copyright (c) 2003 Zope Foundation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Vocabulary support for schema. -""" - -from zope.interface import directlyProvides -from zope.interface import implementer -from zope.schema.interfaces import ITitledTokenizedTerm -from zope.schema.interfaces import ITokenizedTerm -from zope.schema.interfaces import ITreeVocabulary -from zope.schema.interfaces import IVocabularyRegistry -from zope.schema.interfaces import IVocabularyTokenized -from zope.schema._compat import OrderedDict - -# simple vocabularies performing enumerated-like tasks -_marker = object() - - -@implementer(ITokenizedTerm) -class SimpleTerm(object): - """Simple tokenized term used by SimpleVocabulary.""" - - def __init__(self, value, token=None, title=None): - """Create a term for value and token. If token is omitted, - str(value) is used for the token. If title is provided, - term implements ITitledTokenizedTerm. - """ - self.value = value - if token is None: - token = value - # In Python 3 str(bytes) returns str(repr(bytes)), which is not what - # we want here. On the other hand, we want to try to keep the token as - # readable as possible. - self.token = str(token) \ - if not isinstance(token, bytes) \ - else str(token.decode('ascii', 'ignore')) - self.title = title - if title is not None: - directlyProvides(self, ITitledTokenizedTerm) - - -@implementer(IVocabularyTokenized) -class SimpleVocabulary(object): - """Vocabulary that works from a sequence of terms.""" - - def __init__(self, terms, *interfaces, **kwargs): - """Initialize the vocabulary given a list of terms. - - The vocabulary keeps a reference to the list of terms passed - in; it should never be modified while the vocabulary is used. - - One or more interfaces may also be provided so that alternate - widgets may be bound without subclassing. - - By default, ValueErrors are thrown if duplicate values or tokens - are passed in. If you want to swallow these exceptions, pass - in swallow_duplicates=True. In this case, the values will - override themselves. - """ - self.by_value = {} - self.by_token = {} - self._terms = terms - for term in self._terms: - swallow_dupes = kwargs.get('swallow_duplicates', False) - if not swallow_dupes: - if term.value in self.by_value: - raise ValueError( - 'term values must be unique: %s' % repr(term.value)) - if term.token in self.by_token: - raise ValueError( - 'term tokens must be unique: %s' % repr(term.token)) - self.by_value[term.value] = term - self.by_token[term.token] = term - if interfaces: - directlyProvides(self, *interfaces) - - @classmethod - def fromItems(cls, items, *interfaces): - """Construct a vocabulary from a list of (token, value) pairs. - - The order of the items is preserved as the order of the terms - in the vocabulary. Terms are created by calling the class - method createTerm() with the pair (value, token). - - One or more interfaces may also be provided so that alternate - widgets may be bound without subclassing. - """ - terms = [cls.createTerm(value, token) for (token, value) in items] - return cls(terms, *interfaces) - - @classmethod - def fromValues(cls, values, *interfaces): - """Construct a vocabulary from a simple list. - - Values of the list become both the tokens and values of the - terms in the vocabulary. The order of the values is preserved - as the order of the terms in the vocabulary. Tokens are - created by calling the class method createTerm() with the - value as the only parameter. - - One or more interfaces may also be provided so that alternate - widgets may be bound without subclassing. - """ - terms = [cls.createTerm(value) for value in values] - return cls(terms, *interfaces) - - @classmethod - def createTerm(cls, *args): - """Create a single term from data. - - Subclasses may override this with a class method that creates - a term of the appropriate type from the arguments. - """ - return SimpleTerm(*args) - - def __contains__(self, value): - """See zope.schema.interfaces.IBaseVocabulary""" - try: - return value in self.by_value - except TypeError: - # sometimes values are not hashable - return False - - def getTerm(self, value): - """See zope.schema.interfaces.IBaseVocabulary""" - try: - return self.by_value[value] - except KeyError: - raise LookupError(value) - - def getTermByToken(self, token): - """See zope.schema.interfaces.IVocabularyTokenized""" - try: - return self.by_token[token] - except KeyError: - raise LookupError(token) - - def __iter__(self): - """See zope.schema.interfaces.IIterableVocabulary""" - return iter(self._terms) - - def __len__(self): - """See zope.schema.interfaces.IIterableVocabulary""" - return len(self.by_value) - - -def _createTermTree(ttree, dict_): - """ Helper method that creates a tree-like dict with ITokenizedTerm - objects as keys from a similar tree with tuples as keys. - - See fromDict for more details. - """ - for key in sorted(dict_.keys()): - term = SimpleTerm(key[1], key[0], key[-1]) - ttree[term] = TreeVocabulary.terms_factory() - _createTermTree(ttree[term], dict_[key]) - return ttree - - -@implementer(ITreeVocabulary) -class TreeVocabulary(object): - """ Vocabulary that relies on a tree (i.e nested) structure. - """ - # The default implementation uses a dict to create the tree structure. This - # can however be overridden in a subclass by any other IEnumerableMapping - # compliant object type. Python 2.7's OrderedDict for example. - terms_factory = OrderedDict - - def __init__(self, terms, *interfaces): - """Initialize the vocabulary given a recursive dict (i.e a tree) with - ITokenizedTerm objects for keys and self-similar dicts representing the - branches for values. - - Refer to the method fromDict for more details. - - Concerning the ITokenizedTerm keys, the 'value' and 'token' attributes - of each key (including nested ones) must be unique. - - One or more interfaces may also be provided so that alternate - widgets may be bound without subclassing. - """ - self._terms = self.terms_factory() - self._terms.update(terms) - - self.path_by_value = {} - self.term_by_value = {} - self.term_by_token = {} - self._populateIndexes(terms) - - if interfaces: - directlyProvides(self, *interfaces) - - def __contains__(self, value): - """ See zope.schema.interfaces.IBaseVocabulary - - D.__contains__(k) -> True if D has a key k, else False - """ - try: - return value in self.term_by_value - except TypeError: - # sometimes values are not hashable - return False - - def __getitem__(self, key): - """x.__getitem__(y) <==> x[y] - """ - return self._terms.__getitem__(key) - - def __iter__(self): - """See zope.schema.interfaces.IIterableVocabulary - - x.__iter__() <==> iter(x) - """ - return self._terms.__iter__() - - def __len__(self): - """x.__len__() <==> len(x) - """ - return self._terms.__len__() - - def get(self, key, default=None): - """Get a value for a key - - The default is returned if there is no value for the key. - """ - return self._terms.get(key, default) - - def keys(self): - """Return the keys of the mapping object. - """ - return self._terms.keys() - - def values(self): - """Return the values of the mapping object. - """ - return self._terms.values() - - def items(self): - """Return the items of the mapping object. - """ - return self._terms.items() - - @classmethod - def fromDict(cls, dict_, *interfaces): - """Constructs a vocabulary from a dictionary-like object (like dict or - OrderedDict), that has tuples for keys. - - The tuples should have either 2 or 3 values, i.e: - (token, value, title) or (token, value) - - For example, a dict with 2-valued tuples: - - dict_ = { - ('exampleregions', 'Regions used in ATVocabExample'): { - ('aut', 'Austria'): { - ('tyr', 'Tyrol'): { - ('auss', 'Ausserfern'): {}, - } - }, - ('ger', 'Germany'): { - ('bav', 'Bavaria'):{} - }, - } - } - One or more interfaces may also be provided so that alternate - widgets may be bound without subclassing. - """ - return cls(_createTermTree(cls.terms_factory(), dict_), *interfaces) - - def _populateIndexes(self, tree): - """ The TreeVocabulary contains three helper indexes for quick lookups. - They are: term_by_value, term_by_token and path_by_value - - This method recurses through the tree and populates these indexes. - - tree: The tree (a nested/recursive dictionary). - """ - for term in tree.keys(): - value = getattr(term, 'value') - token = getattr(term, 'token') - - if value in self.term_by_value: - raise ValueError( - "Term values must be unique: '%s'" % value) - - if token in self.term_by_token: - raise ValueError( - "Term tokens must be unique: '%s'" % token) - - self.term_by_value[value] = term - self.term_by_token[token] = term - - if value not in self.path_by_value: - self.path_by_value[value] = self._getPathToTreeNode(self, - value) - self._populateIndexes(tree[term]) - - def getTerm(self, value): - """See zope.schema.interfaces.IBaseVocabulary""" - try: - return self.term_by_value[value] - except KeyError: - raise LookupError(value) - - def getTermByToken(self, token): - """See zope.schema.interfaces.IVocabularyTokenized""" - try: - return self.term_by_token[token] - except KeyError: - raise LookupError(token) - - def _getPathToTreeNode(self, tree, node): - """Helper method that computes the path in the tree from the root - to the given node. - - The tree must be a recursive IEnumerableMapping object. - """ - path = [] - for parent, child in tree.items(): - if node == parent.value: - return [node] - path = self._getPathToTreeNode(child, node) - if path: - path.insert(0, parent.value) - break - return path - - def getTermPath(self, value): - """Returns a list of strings representing the path from the root node - to the node with the given value in the tree. - - Returns an empty string if no node has that value. - """ - return self.path_by_value.get(value, []) - - -# registry code -class VocabularyRegistryError(LookupError): - def __init__(self, name): - self.name = name - Exception.__init__(self, str(self)) - - def __str__(self): - return "unknown vocabulary: %r" % self.name - - -@implementer(IVocabularyRegistry) -class VocabularyRegistry(object): - __slots__ = '_map', - - def __init__(self): - self._map = {} - - def get(self, object, name): - """See zope.schema.interfaces.IVocabularyRegistry""" - try: - vtype = self._map[name] - except KeyError: - raise VocabularyRegistryError(name) - return vtype(object) - - def register(self, name, factory): - self._map[name] = factory - -_vocabularies = None - - -def getVocabularyRegistry(): - """Return the vocabulary registry. - - If the registry has not been created yet, an instance of - VocabularyRegistry will be installed and used. - """ - if _vocabularies is None: - setVocabularyRegistry(VocabularyRegistry()) - return _vocabularies - - -def setVocabularyRegistry(registry): - """Set the vocabulary registry.""" - global _vocabularies - _vocabularies = registry - - -def _clear(): - """Remove the registries (for use by tests).""" - global _vocabularies - _vocabularies = None - - -try: - from zope.testing.cleanup import addCleanUp -except ImportError: # pragma: no cover - # don't have that part of Zope - pass -else: # pragma: no cover - addCleanUp(_clear) - del addCleanUp